8490{
8492 {
8493 return true;
8494 }
8495};
8496
8498{
8499
8500};
8501
8502
8503
8505{
8509
8511
8514
8515
8516
8517
8518
8527
8533
8538
8543
8564 protected bool m_IsResultOfSplit
8565
8567
8572
8573
8574
8576
8580
8581
8582
8584
8587
8588
8589
8595
8596
8604
8607
8608
8610
8611
8613
8614
8619
8620
8625
8627
8628
8630
8631
8633 {
8638
8639 if (!
g_Game.IsDedicatedServer())
8640 {
8642 {
8644
8646 {
8648 }
8649 }
8650
8653 }
8654
8655 m_OldLocation = null;
8656
8658 {
8660 }
8661
8662 if (ConfigIsExisting("headSelectionsToHide"))
8663 {
8666 }
8667
8669 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8670 {
8672 }
8673
8675
8676 m_IsResultOfSplit = false;
8677
8679 }
8680
8682 {
8683 super.InitItemVariables();
8684
8690 m_Count = ConfigGetInt(
"count");
8691
8694
8699
8702
8707
8719
8723
8724
8727 if (ConfigIsExisting("canBeSplit"))
8728 {
8731 }
8732
8734 if (ConfigIsExisting("itemBehaviour"))
8736
8737
8740 RegisterNetSyncVariableInt("m_VarLiquidType");
8741 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8742
8743 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8744 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8745 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8746
8747 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8748 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8749 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8750 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8751
8752 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8753 RegisterNetSyncVariableBool("m_IsTakeable");
8754 RegisterNetSyncVariableBool("m_IsHologram");
8755
8758 {
8761 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8762 }
8763
8765
8767 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8769
8771 }
8772
8774 {
8776 }
8777
8779 {
8782 {
8787 }
8788 }
8789
8790 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8791 {
8793 {
8796 }
8797
8799 }
8800
8802 {
8808 }
8809
8811
8813 {
8815
8816 if (!action)
8817 {
8818 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8819 return;
8820 }
8821
8823 if (!ai)
8824 {
8826 return;
8827 }
8828
8830 if (!action_array)
8831 {
8832 action_array = new array<ActionBase_Basic>;
8834 }
8835 if (LogManager.IsActionLogEnable())
8836 {
8837 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8838 }
8839
8840 if (action_array.Find(action) != -1)
8841 {
8842 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8843 }
8844 else
8845 {
8846 action_array.Insert(action);
8847 }
8848 }
8849
8851 {
8852 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8853 ActionBase action = player.GetActionManager().GetAction(actionName);
8856
8857 if (action_array)
8858 {
8859 action_array.RemoveItem(action);
8860 }
8861 }
8862
8863
8864
8866 {
8867 ActionOverrideData overrideData = new ActionOverrideData();
8871
8873 if (!actionMap)
8874 {
8877 }
8878
8879 actionMap.Insert(this.
Type(), overrideData);
8880
8881 }
8882
8884
8886
8887
8889 {
8892
8895
8896 string config_to_search = "CfgVehicles";
8897 string muzzle_owner_config;
8898
8900 {
8901 if (IsInherited(Weapon))
8902 config_to_search = "CfgWeapons";
8903
8904 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8905
8906 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8907
8908 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8909
8910 if (config_OnFire_subclass_count > 0)
8911 {
8912 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8913
8914 for (int i = 0; i < config_OnFire_subclass_count; i++)
8915 {
8916 string particle_class = "";
8917 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8918 string config_OnFire_entry = config_OnFire_class + particle_class;
8919 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8920 WPOF_array.Insert(WPOF);
8921 }
8922
8923
8925 }
8926 }
8927
8929 {
8930 config_to_search = "CfgWeapons";
8931 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8932
8933 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8934
8935 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8936
8937 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8938 {
8939 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8940
8941 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8942 {
8943 string particle_class2 = "";
8944 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8945 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8946 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8947 WPOBE_array.Insert(WPOBE);
8948 }
8949
8950
8952 }
8953 }
8954 }
8955
8956
8958 {
8961
8963 {
8964 string config_to_search = "CfgVehicles";
8965
8966 if (IsInherited(Weapon))
8967 config_to_search = "CfgWeapons";
8968
8969 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8970 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8971
8972 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8973 {
8974
8976
8978 {
8980 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8982 return;
8983 }
8984
8987
8988
8989
8990 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8991 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8992
8993 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8994 {
8995 string particle_class = "";
8996 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8997 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8998 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8999
9000 if (entry_type == CT_CLASS)
9001 {
9002 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9003 WPOOH_array.Insert(WPOF);
9004 }
9005 }
9006
9007
9009 }
9010 }
9011 }
9012
9014 {
9016 }
9017
9019 {
9021 {
9023
9026
9029
9030 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9031 }
9032 }
9033
9035 {
9037 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9038
9040 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9041
9043 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9044
9046 {
9048 }
9049 }
9050
9052 {
9054 }
9055
9057 {
9060 else
9062
9064 {
9067 }
9068 else
9069 {
9072
9075 }
9076
9078 }
9079
9081 {
9083 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9084 }
9085
9087 {
9089 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9091 }
9092
9094 {
9096 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9097 }
9098
9100 {
9103
9104 OverheatingParticle OP = new OverheatingParticle();
9109
9111 }
9112
9114 {
9117
9118 return -1;
9119 }
9120
9122 {
9124 {
9127
9128 for (int i = count; i > 0; --i)
9129 {
9130 int id = i - 1;
9133
9136
9137 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9138 {
9139 if (p)
9140 {
9143 }
9144 }
9145 }
9146 }
9147 }
9148
9150 {
9152 {
9154 {
9155 int id = i - 1;
9157
9158 if (OP)
9159 {
9161
9162 if (p)
9163 {
9165 }
9166
9167 delete OP;
9168 }
9169 }
9170
9173 }
9174 }
9175
9178 {
9179 return 0.0;
9180 }
9181
9182
9184 {
9185 return 250;
9186 }
9187
9189 {
9190 return 0;
9191 }
9192
9195 {
9197 return true;
9198
9199 return false;
9200 }
9201
9204 {
9207
9209 {
9211 }
9212 else
9213 {
9214
9216 }
9217
9219 }
9220
9227 {
9228 return -1;
9229 }
9230
9231
9232
9233
9235 {
9237 {
9238 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9239 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9240
9241 if (r_index >= 0)
9242 {
9243 InventoryLocation r_il = new InventoryLocation;
9244 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9245
9246 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9249 {
9250 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9251 }
9253 {
9254 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9255 }
9256
9257 }
9258
9259 player.GetHumanInventory().ClearUserReservedLocation(this);
9260 }
9261
9264 }
9265
9266
9267
9268
9270 {
9271 return ItemBase.m_DebugActionsMask;
9272 }
9273
9275 {
9276 return ItemBase.m_DebugActionsMask & mask;
9277 }
9278
9280 {
9281 ItemBase.m_DebugActionsMask = mask;
9282 }
9283
9285 {
9286 ItemBase.m_DebugActionsMask |= mask;
9287 }
9288
9290 {
9291 ItemBase.m_DebugActionsMask &= ~mask;
9292 }
9293
9295 {
9297 {
9299 }
9300 else
9301 {
9303 }
9304 }
9305
9306
9308 {
9309 if (GetEconomyProfile())
9310 {
9311 float q_max = GetEconomyProfile().GetQuantityMax();
9312 if (q_max > 0)
9313 {
9314 float q_min = GetEconomyProfile().GetQuantityMin();
9315 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9316
9318 {
9319 ComponentEnergyManager comp = GetCompEM();
9321 {
9323 }
9324 }
9326 {
9328
9329 }
9330
9331 }
9332 }
9333 }
9334
9337 {
9338 EntityAI parent = GetHierarchyParent();
9339
9340 if (parent)
9341 {
9342 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9343 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9344 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9345 }
9346 }
9347
9350 {
9351 EntityAI parent = GetHierarchyParent();
9352
9353 if (parent)
9354 {
9355 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9356 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9357 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9358 }
9359 }
9360
9362 {
9363
9364
9365
9366
9368
9370 {
9371 if (ScriptInputUserData.CanStoreInputUserData())
9372 {
9373 ScriptInputUserData ctx = new ScriptInputUserData;
9379 ctx.
Write(use_stack_max);
9382
9384 {
9385 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9386 }
9387 }
9388 }
9389 else if (!
g_Game.IsMultiplayer())
9390 {
9392 }
9393 }
9394
9396 {
9398 }
9399
9401 {
9403 }
9404
9406 {
9408 }
9409
9411 {
9412
9413 return false;
9414 }
9415
9417 {
9418 return false;
9419 }
9420
9424 {
9425 return false;
9426 }
9427
9429 {
9430 return "";
9431 }
9432
9434
9436 {
9437 return false;
9438 }
9439
9441 {
9442 return true;
9443 }
9444
9445
9446
9448 {
9449 return true;
9450 }
9451
9453 {
9454 return true;
9455 }
9456
9458 {
9459 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9461 }
9462
9464 {
9466 }
9467
9469 {
9471 if (!is_being_placed)
9473 SetSynchDirty();
9474 }
9475
9476
9478
9480 {
9482 }
9483
9485 {
9487 }
9488
9490 {
9491 return 1;
9492 }
9493
9495 {
9496 return false;
9497 }
9498
9500 {
9502 SetSynchDirty();
9503 }
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9540 {
9541 super.OnMovedInsideCargo(container);
9542
9543 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9544 }
9545
9546 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9547 {
9548 super.EEItemLocationChanged(oldLoc, newLoc);
9549
9550 PlayerBase newPlayer = null;
9551 PlayerBase oldPlayer = null;
9552
9553 if (newLoc.GetParent())
9554 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9555
9556 if (oldLoc.GetParent())
9557 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9558
9560 {
9561 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9562
9563 if (rIndex >= 0)
9564 {
9565 InventoryLocation rIl = new InventoryLocation;
9566 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9567
9568 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9571 {
9572 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9573 }
9575 {
9577 }
9578
9579 }
9580 }
9581
9583 {
9584 if (newPlayer)
9585 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9586
9587 if (newPlayer == oldPlayer)
9588 {
9589 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9590 {
9592 {
9593 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9594 {
9595 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9596 }
9597 }
9598 else
9599 {
9600 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9601 }
9602 }
9603
9604 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9605 {
9606 int type = oldLoc.GetType();
9608 {
9609 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9610 }
9612 {
9613 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9614 }
9615 }
9616 if (!m_OldLocation)
9617 {
9618 m_OldLocation = new InventoryLocation;
9619 }
9620 m_OldLocation.Copy(oldLoc);
9621 }
9622 else
9623 {
9624 if (m_OldLocation)
9625 {
9626 m_OldLocation.Reset();
9627 }
9628 }
9629
9630 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9631 }
9632 else
9633 {
9634 if (newPlayer)
9635 {
9636 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9637 if (resIndex >= 0)
9638 {
9639 InventoryLocation il = new InventoryLocation;
9640 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9642 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9645 {
9646 il.
GetParent().GetOnReleaseLock().Invoke(it);
9647 }
9649 {
9651 }
9652
9653 }
9654 }
9656 {
9657
9659 }
9660
9661 if (m_OldLocation)
9662 {
9663 m_OldLocation.Reset();
9664 }
9665 }
9666
9668 {
9669 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9670 }
9671
9673 {
9674 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9675 }
9676 }
9677
9678 override void EOnContact(IEntity other, Contact extra)
9679 {
9681 {
9682 int liquidType = -1;
9684 if (impactSpeed > 0.0)
9685 {
9687 #ifndef SERVER
9689 #else
9691 SetSynchDirty();
9692 #endif
9694 }
9695 }
9696
9697 #ifdef SERVER
9698 if (GetCompEM() && GetCompEM().IsPlugged())
9699 {
9700 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9701 GetCompEM().UnplugThis();
9702 }
9703 #endif
9704 }
9705
9707
9709 {
9711 }
9712
9714 {
9715
9716 }
9717
9719 {
9720 super.OnItemLocationChanged(old_owner, new_owner);
9721
9722 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9723 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9724
9725 if (!relatedPlayer && playerNew)
9726 relatedPlayer = playerNew;
9727
9728 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9729 {
9731 if (actionMgr)
9732 {
9733 ActionBase currentAction = actionMgr.GetRunningAction();
9734 if (currentAction)
9736 }
9737 }
9738
9739 Man ownerPlayerOld = null;
9740 Man ownerPlayerNew = null;
9741
9742 if (old_owner)
9743 {
9744 if (old_owner.
IsMan())
9745 {
9746 ownerPlayerOld = Man.Cast(old_owner);
9747 }
9748 else
9749 {
9750 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9751 }
9752 }
9753 else
9754 {
9756 {
9758
9759 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9760 {
9761 GetCompEM().UnplugThis();
9762 }
9763 }
9764 }
9765
9766 if (new_owner)
9767 {
9768 if (new_owner.
IsMan())
9769 {
9770 ownerPlayerNew = Man.Cast(new_owner);
9771 }
9772 else
9773 {
9774 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9775 }
9776 }
9777
9778 if (ownerPlayerOld != ownerPlayerNew)
9779 {
9780 if (ownerPlayerOld)
9781 {
9782 array<EntityAI> subItemsExit = new array<EntityAI>;
9784 for (int i = 0; i < subItemsExit.Count(); i++)
9785 {
9788 }
9789 }
9790
9791 if (ownerPlayerNew)
9792 {
9793 array<EntityAI> subItemsEnter = new array<EntityAI>;
9795 for (int j = 0; j < subItemsEnter.Count(); j++)
9796 {
9799 }
9800 }
9801 }
9802 else if (ownerPlayerNew != null)
9803 {
9804 PlayerBase nplayer;
9805 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9806 {
9807 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9809 for (int k = 0; k < subItemsUpdate.Count(); k++)
9810 {
9812 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9813 }
9814 }
9815 }
9816
9817 if (old_owner)
9818 old_owner.OnChildItemRemoved(this);
9819 if (new_owner)
9820 new_owner.OnChildItemReceived(this);
9821 }
9822
9823
9825 {
9826 super.EEDelete(parent);
9827 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9828 if (player)
9829 {
9831
9832 if (player.IsAlive())
9833 {
9834 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9835 if (r_index >= 0)
9836 {
9837 InventoryLocation r_il = new InventoryLocation;
9838 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9839
9840 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9843 {
9844 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9845 }
9847 {
9848 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9849 }
9850
9851 }
9852
9853 player.RemoveQuickBarEntityShortcut(this);
9854 }
9855 }
9856 }
9857
9859 {
9860 super.EEKilled(killer);
9861
9864 {
9865 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9866 {
9867 if (IsMagazine())
9868 {
9869 if (Magazine.Cast(this).GetAmmoCount() > 0)
9870 {
9872 }
9873 }
9874 else
9875 {
9877 }
9878 }
9879 }
9880 }
9881
9883 {
9884 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9885
9886 super.OnWasAttached(parent, slot_id);
9887
9890
9893 }
9894
9896 {
9897 super.OnWasDetached(parent, slot_id);
9898
9901
9904 }
9905
9907 {
9908 int idx;
9911
9912 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9913 if (inventory_slots.Count() < 1)
9914 {
9915 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9916 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9917 }
9918 else
9919 {
9920 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9921 }
9922
9923 idx = inventory_slots.Find(slot);
9924 if (idx < 0)
9925 return "";
9926
9927 return attach_types.Get(idx);
9928 }
9929
9931 {
9932 int idx = -1;
9933 string slot;
9934
9937
9938 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9939 if (inventory_slots.Count() < 1)
9940 {
9941 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9942 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9943 }
9944 else
9945 {
9946 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9947 if (detach_types.Count() < 1)
9948 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9949 }
9950
9951 for (int i = 0; i < inventory_slots.Count(); i++)
9952 {
9953 slot = inventory_slots.Get(i);
9954 }
9955
9956 if (slot != "")
9957 {
9958 if (detach_types.Count() == 1)
9959 idx = 0;
9960 else
9961 idx = inventory_slots.Find(slot);
9962 }
9963 if (idx < 0)
9964 return "";
9965
9966 return detach_types.Get(idx);
9967 }
9968
9970 {
9971
9973
9974
9975 float min_time = 1;
9976 float max_time = 3;
9977 float delay = Math.RandomFloat(min_time, max_time);
9978
9979 explode_timer.Run(delay, this, "DoAmmoExplosion");
9980 }
9981
9983 {
9984 Magazine magazine = Magazine.Cast(this);
9985 int pop_sounds_count = 6;
9986 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9987
9988
9989 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9990 string sound_name = pop_sounds[ sound_idx ];
9991 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9992
9993
9994 magazine.ServerAddAmmoCount(-1);
9995
9996
9997 float min_temp_to_explode = 100;
9998
9999 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10000 {
10002 }
10003 }
10004
10005
10006 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10007 {
10008 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10009
10010 const int CHANCE_DAMAGE_CARGO = 4;
10011 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10012 const int CHANCE_DAMAGE_NOTHING = 2;
10013
10015 {
10016 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10017 int chances;
10018 int rnd;
10019
10020 if (GetInventory().GetCargo())
10021 {
10022 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10023 rnd = Math.RandomInt(0,chances);
10024
10025 if (rnd < CHANCE_DAMAGE_CARGO)
10026 {
10028 }
10029 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10030 {
10032 }
10033 }
10034 else
10035 {
10036 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10037 rnd = Math.RandomInt(0,chances);
10038
10039 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10040 {
10042 }
10043 }
10044 }
10045 }
10046
10048 {
10049 CargoBase cargo = GetInventory().GetCargo();
10050 if (cargo)
10051 {
10053 if (item_count > 0)
10054 {
10055 int random_pick = Math.RandomInt(0, item_count);
10057 if (!item.IsExplosive())
10058 {
10059 item.AddHealth("","",damage);
10060 return true;
10061 }
10062 }
10063 }
10064 return false;
10065 }
10066
10068 {
10069 GameInventory inventory = GetInventory();
10071 if (attachment_count > 0)
10072 {
10073 int random_pick = Math.RandomInt(0, attachment_count);
10075 if (!attachment.IsExplosive())
10076 {
10077 attachment.AddHealth("","",damage);
10078 return true;
10079 }
10080 }
10081 return false;
10082 }
10083
10085 {
10087 }
10088
10090 {
10092 return GetInventory().CanRemoveEntity();
10093
10094 return false;
10095 }
10096
10098 {
10099
10101 return false;
10102
10103
10105 return false;
10106
10107
10108
10110 if (delta == 0)
10111 return false;
10112
10113
10114 return true;
10115 }
10116
10118 {
10120 {
10121 if (ScriptInputUserData.CanStoreInputUserData())
10122 {
10123 ScriptInputUserData ctx = new ScriptInputUserData;
10128 ctx.
Write(destination_entity);
10130 ctx.
Write(slot_id);
10132 }
10133 }
10134 else if (!
g_Game.IsMultiplayer())
10135 {
10137 }
10138 }
10139
10141 {
10142 float split_quantity_new;
10146 InventoryLocation loc = new InventoryLocation;
10147
10148 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10149 {
10151 split_quantity_new = stack_max;
10152 else
10154
10156 {
10157 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10158 if (new_item)
10159 {
10160 new_item.SetResultOfSplit(true);
10161 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10163 new_item.
SetQuantity(split_quantity_new,
false,
true);
10164 }
10165 }
10166 }
10167 else if (destination_entity && slot_id == -1)
10168 {
10169 if (quantity > stack_max)
10170 split_quantity_new = stack_max;
10171 else
10172 split_quantity_new = quantity;
10173
10175 {
10176 GameInventory destinationInventory = destination_entity.GetInventory();
10178 {
10181 }
10182
10183 if (new_item)
10184 {
10185 new_item.SetResultOfSplit(true);
10186 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10188 new_item.
SetQuantity(split_quantity_new,
false,
true);
10189 }
10190 }
10191 }
10192 else
10193 {
10194 if (stack_max != 0)
10195 {
10197 {
10199 }
10200
10201 if (split_quantity_new == 0)
10202 {
10203 if (!
g_Game.IsMultiplayer())
10204 player.PhysicalPredictiveDropItem(this);
10205 else
10206 player.ServerDropEntity(this);
10207 return;
10208 }
10209
10211 {
10213
10214 if (new_item)
10215 {
10216 new_item.SetResultOfSplit(true);
10217 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10220 new_item.PlaceOnSurface();
10221 }
10222 }
10223 }
10224 }
10225 }
10226
10228 {
10229 float split_quantity_new;
10233 InventoryLocation loc = new InventoryLocation;
10234
10235 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10236 {
10238 split_quantity_new = stack_max;
10239 else
10241
10243 {
10244 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10245 if (new_item)
10246 {
10247 new_item.SetResultOfSplit(true);
10248 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10250 new_item.
SetQuantity(split_quantity_new,
false,
true);
10251 }
10252 }
10253 }
10254 else if (destination_entity && slot_id == -1)
10255 {
10256 if (quantity > stack_max)
10257 split_quantity_new = stack_max;
10258 else
10259 split_quantity_new = quantity;
10260
10262 {
10263 GameInventory destinationInventory = destination_entity.GetInventory();
10265 {
10268 }
10269
10270 if (new_item)
10271 {
10272 new_item.SetResultOfSplit(true);
10273 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10275 new_item.
SetQuantity(split_quantity_new,
false,
true);
10276 }
10277 }
10278 }
10279 else
10280 {
10281 if (stack_max != 0)
10282 {
10284 {
10286 }
10287
10289 {
10291
10292 if (new_item)
10293 {
10294 new_item.SetResultOfSplit(true);
10295 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10298 new_item.PlaceOnSurface();
10299 }
10300 }
10301 }
10302 }
10303 }
10304
10306 {
10308 {
10309 if (ScriptInputUserData.CanStoreInputUserData())
10310 {
10311 ScriptInputUserData ctx = new ScriptInputUserData;
10316 dst.WriteToContext(ctx);
10318 }
10319 }
10320 else if (!
g_Game.IsMultiplayer())
10321 {
10323 }
10324 }
10325
10327 {
10329 {
10330 if (ScriptInputUserData.CanStoreInputUserData())
10331 {
10332 ScriptInputUserData ctx = new ScriptInputUserData;
10337 ctx.
Write(destination_entity);
10343 }
10344 }
10345 else if (!
g_Game.IsMultiplayer())
10346 {
10348 }
10349 }
10350
10352 {
10354 }
10355
10357 {
10359 float split_quantity_new;
10361 if (dst.IsValid())
10362 {
10363 int slot_id = dst.GetSlot();
10365
10366 if (quantity > stack_max)
10367 split_quantity_new = stack_max;
10368 else
10369 split_quantity_new = quantity;
10370
10372 {
10374
10375 if (new_item)
10376 {
10377 new_item.SetResultOfSplit(true);
10378 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10380 new_item.
SetQuantity(split_quantity_new,
false,
true);
10381 }
10382
10383 return new_item;
10384 }
10385 }
10386
10387 return null;
10388 }
10389
10391 {
10393 float split_quantity_new;
10395 if (destination_entity)
10396 {
10398 if (quantity > stackable)
10399 split_quantity_new = stackable;
10400 else
10401 split_quantity_new = quantity;
10402
10404 {
10405 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10406 if (new_item)
10407 {
10408 new_item.SetResultOfSplit(true);
10409 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10411 new_item.
SetQuantity(split_quantity_new,
false,
true);
10412 }
10413 }
10414 }
10415 }
10416
10418 {
10420 {
10421 if (ScriptInputUserData.CanStoreInputUserData())
10422 {
10423 ScriptInputUserData ctx = new ScriptInputUserData;
10428 ItemBase destination_entity =
this;
10429 ctx.
Write(destination_entity);
10433 }
10434 }
10435 else if (!
g_Game.IsMultiplayer())
10436 {
10438 }
10439 }
10440
10442 {
10444 float split_quantity_new;
10446 if (player)
10447 {
10449 if (quantity > stackable)
10450 split_quantity_new = stackable;
10451 else
10452 split_quantity_new = quantity;
10453
10455 {
10456 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10457 new_item =
ItemBase.Cast(in_hands);
10458 if (new_item)
10459 {
10460 new_item.SetResultOfSplit(true);
10461 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10463 new_item.SetQuantity(split_quantity_new, false, true);
10464 }
10465 }
10466 }
10467 }
10468
10470 {
10472 float split_quantity_new = Math.Floor(quantity * 0.5);
10473
10475 return;
10476
10478
10479 if (new_item)
10480 {
10481 if (new_item.GetQuantityMax() < split_quantity_new)
10482 {
10483 split_quantity_new = new_item.GetQuantityMax();
10484 }
10485
10486 new_item.SetResultOfSplit(true);
10487 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10488
10490 {
10493 }
10494 else
10495 {
10497 new_item.
SetQuantity(split_quantity_new,
false,
true);
10498 }
10499 }
10500 }
10501
10503 {
10505 float split_quantity_new = Math.Floor(quantity / 2);
10506
10508 return;
10509
10510 InventoryLocation invloc = new InventoryLocation;
10512
10514 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10515
10516 if (new_item)
10517 {
10518 if (new_item.GetQuantityMax() < split_quantity_new)
10519 {
10520 split_quantity_new = new_item.GetQuantityMax();
10521 }
10523 {
10526 }
10527 else if (split_quantity_new > 1)
10528 {
10530 new_item.
SetQuantity(split_quantity_new,
false,
true);
10531 }
10532 }
10533 }
10534
10537 {
10538 SetWeightDirty();
10540
10541 if (parent)
10542 parent.OnAttachmentQuantityChangedEx(this, delta);
10543
10545 {
10547 {
10549 }
10551 {
10552 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10554 }
10555 }
10556 }
10557
10560 {
10561
10562 }
10563
10566 {
10568 }
10569
10571 {
10572 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10573
10575 {
10576 if (newLevel == GameConstants.STATE_RUINED)
10577 {
10579 EntityAI parent = GetHierarchyParent();
10580 if (parent && parent.IsFireplace())
10581 {
10582 CargoBase cargo = GetInventory().GetCargo();
10583 if (cargo)
10584 {
10586 {
10588 }
10589 }
10590 }
10591 }
10592
10594 {
10595
10597 return;
10598 }
10599
10600 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10601 {
10603 }
10604 }
10605 }
10606
10607
10609 {
10610 super.OnRightClick();
10611
10613 {
10615 {
10616 if (ScriptInputUserData.CanStoreInputUserData())
10617 {
10618 EntityAI root = GetHierarchyRoot();
10619 Man playerOwner = GetHierarchyRootPlayer();
10620 InventoryLocation dst = new InventoryLocation;
10621
10622
10623 if (!playerOwner && root && root == this)
10624 {
10626 }
10627 else
10628 {
10629
10630 GetInventory().GetCurrentInventoryLocation(dst);
10632 {
10633 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10635 {
10637 }
10638 else
10639 {
10641
10642
10643 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10644 {
10646 }
10647 else
10648 {
10649 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10650 }
10651 }
10652 }
10653 }
10654
10655 ScriptInputUserData ctx = new ScriptInputUserData;
10663 }
10664 }
10665 else if (!
g_Game.IsMultiplayer())
10666 {
10668 }
10669 }
10670 }
10671
10673 {
10674 if (root)
10675 {
10676 vector m4[4];
10677 root.GetTransform(m4);
10678 dst.SetGround(this, m4);
10679 }
10680 else
10681 {
10682 GetInventory().GetCurrentInventoryLocation(dst);
10683 }
10684 }
10685
10686 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10687 {
10688
10689 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10690 return false;
10691
10692 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10693 return false;
10694
10695
10697 return false;
10698
10699
10700 Magazine mag = Magazine.Cast(this);
10701 if (mag)
10702 {
10703 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10704 return false;
10705
10706 if (stack_max_limit)
10707 {
10708 Magazine other_mag = Magazine.Cast(other_item);
10709 if (other_item)
10710 {
10711 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10712 return false;
10713 }
10714
10715 }
10716 }
10717 else
10718 {
10719
10721 return false;
10722
10724 return false;
10725 }
10726
10727 PlayerBase player = null;
10728 if (CastTo(player, GetHierarchyRootPlayer()))
10729 {
10730 if (player.GetInventory().HasAttachment(this))
10731 return false;
10732
10733 if (player.IsItemsToDelete())
10734 return false;
10735 }
10736
10737 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10738 return false;
10739
10740 int slotID;
10742 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10743 return false;
10744
10745 return true;
10746 }
10747
10749 {
10751 }
10752
10754 {
10755 return m_IsResultOfSplit;
10756 }
10757
10759 {
10760 m_IsResultOfSplit = value;
10761 }
10762
10764 {
10766 }
10767
10769 {
10770 float other_item_quantity = other_item.GetQuantity();
10771 float this_free_space;
10772
10774
10776
10777 if (other_item_quantity > this_free_space)
10778 {
10779 return this_free_space;
10780 }
10781 else
10782 {
10783 return other_item_quantity;
10784 }
10785 }
10786
10788 {
10790 }
10791
10793 {
10795 return;
10796
10797 if (!IsMagazine() && other_item)
10798 {
10800 if (quantity_used != 0)
10801 {
10802 float hp1 = GetHealth01("","");
10803 float hp2 = other_item.GetHealth01("","");
10804 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10805 hpResult = hpResult / (
GetQuantity() + quantity_used);
10806
10807 hpResult *= GetMaxHealth();
10808 Math.Round(hpResult);
10809 SetHealth("", "Health", hpResult);
10810
10812 other_item.AddQuantity(-quantity_used);
10813 }
10814 }
10816 }
10817
10819 {
10820 #ifdef SERVER
10821 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10822 GetHierarchyParent().IncreaseLifetimeUp();
10823 #endif
10824 };
10825
10827 {
10828 PlayerBase p = PlayerBase.Cast(player);
10829
10830 array<int> recipesIds = p.m_Recipes;
10831 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10832 if (moduleRecipesManager)
10833 {
10834 EntityAI itemInHands = player.GetEntityInHands();
10835 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10836 }
10837
10838 for (int i = 0;i < recipesIds.Count(); i++)
10839 {
10840 int key = recipesIds.Get(i);
10841 string recipeName = moduleRecipesManager.GetRecipeName(key);
10843 }
10844 }
10845
10846
10847 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10848 {
10849 super.GetDebugActions(outputList);
10850
10851
10857
10858
10863
10868
10869
10873
10874
10876 {
10880 }
10881
10884
10885
10889
10891
10892 InventoryLocation loc = new InventoryLocation();
10893 GetInventory().GetCurrentInventoryLocation(loc);
10895 {
10896 if (Gizmo_IsSupported())
10899 }
10900
10902 }
10903
10904
10905
10906
10908 {
10909 super.OnAction(action_id, player, ctx);
10910
10912 {
10913 switch (action_id)
10914 {
10918 return true;
10922 return true;
10923 }
10924 }
10925
10927 {
10928 switch (action_id)
10929 {
10931 Delete();
10932 return true;
10933 }
10934 }
10935
10936 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10937 {
10938 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10939 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10940 PlayerBase p = PlayerBase.Cast(player);
10941 if (
EActions.RECIPES_RANGE_START < 1000)
10942 {
10943 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10944 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10945 }
10946 }
10947 #ifndef SERVER
10948 else if (action_id ==
EActions.WATCH_PLAYER)
10949 {
10950 PluginDeveloper.SetDeveloperItemClientEx(player);
10951 }
10952 #endif
10954 {
10955 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10956 {
10957 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10958 OnDebugButtonPressServer(id + 1);
10959 }
10960
10961 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10962 {
10963 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10965 }
10966
10967 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10968 {
10969 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10971 }
10972
10973 else if (action_id ==
EActions.ADD_QUANTITY)
10974 {
10975 if (IsMagazine())
10976 {
10977 Magazine mag = Magazine.Cast(this);
10978 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10979 }
10980 else
10981 {
10983 }
10984
10985 if (m_EM)
10986 {
10987 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10988 }
10989
10990 }
10991
10992 else if (action_id ==
EActions.REMOVE_QUANTITY)
10993 {
10994 if (IsMagazine())
10995 {
10996 Magazine mag2 = Magazine.Cast(this);
10997 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10998 }
10999 else
11000 {
11002 }
11003 if (m_EM)
11004 {
11005 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11006 }
11007
11008 }
11009
11010 else if (action_id ==
EActions.SET_QUANTITY_0)
11011 {
11013
11014 if (m_EM)
11015 {
11016 m_EM.SetEnergy(0);
11017 }
11018 }
11019
11020 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11021 {
11023
11024 if (m_EM)
11025 {
11026 m_EM.SetEnergy(m_EM.GetEnergyMax());
11027 }
11028 }
11029
11030 else if (action_id ==
EActions.ADD_HEALTH)
11031 {
11032 AddHealth("","",GetMaxHealth("","Health")/5);
11033 }
11034 else if (action_id ==
EActions.REMOVE_HEALTH)
11035 {
11036 AddHealth("","",-GetMaxHealth("","Health")/5);
11037 }
11038 else if (action_id ==
EActions.DESTROY_HEALTH)
11039 {
11040 SetHealth01("","",0);
11041 }
11042 else if (action_id ==
EActions.WATCH_ITEM)
11043 {
11045 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11046 #ifdef DEVELOPER
11047 SetDebugDeveloper_item(this);
11048 #endif
11049 }
11050
11051 else if (action_id ==
EActions.ADD_TEMPERATURE)
11052 {
11053 AddTemperature(20);
11054
11055 }
11056
11057 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11058 {
11059 AddTemperature(-20);
11060
11061 }
11062
11063 else if (action_id ==
EActions.FLIP_FROZEN)
11064 {
11065 SetFrozen(!GetIsFrozen());
11066
11067 }
11068
11069 else if (action_id ==
EActions.ADD_WETNESS)
11070 {
11072
11073 }
11074
11075 else if (action_id ==
EActions.REMOVE_WETNESS)
11076 {
11078
11079 }
11080
11081 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11082 {
11085
11086
11087 }
11088
11089 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11090 {
11093 }
11094
11095 else if (action_id ==
EActions.MAKE_SPECIAL)
11096 {
11097 auto debugParams = DebugSpawnParams.WithPlayer(player);
11098 OnDebugSpawnEx(debugParams);
11099 }
11100
11101 }
11102
11103
11104 return false;
11105 }
11106
11107
11108
11109
11113
11116
11117
11118
11120 {
11121 return false;
11122 }
11123
11124
11126 {
11127 return true;
11128 }
11129
11130
11132 {
11133 return true;
11134 }
11135
11136
11137
11139 {
11140 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11141 return g_Game.ConfigIsExisting(config_path);
11142 }
11143
11146 {
11147 return null;
11148 }
11149
11151 {
11152 return false;
11153 }
11154
11156 {
11157 return false;
11158 }
11159
11163
11164
11166 {
11167 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11168 return module_repairing.CanRepair(this, item_repair_kit);
11169 }
11170
11171
11172 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11173 {
11174 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11175 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11176 }
11177
11178
11180 {
11181
11182
11183
11184
11185
11186
11187
11188
11189 return 1;
11190 }
11191
11192
11193
11195 {
11197 }
11198
11199
11200
11202 {
11204 }
11205
11206
11215 {
11216 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11217
11218 if (player)
11219 {
11220 player.MessageStatus(text);
11221 }
11222 }
11223
11224
11233 {
11234 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11235
11236 if (player)
11237 {
11238 player.MessageAction(text);
11239 }
11240 }
11241
11242
11251 {
11252 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11253
11254 if (player)
11255 {
11256 player.MessageFriendly(text);
11257 }
11258 }
11259
11260
11269 {
11270 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11271
11272 if (player)
11273 {
11274 player.MessageImportant(text);
11275 }
11276 }
11277
11279 {
11280 return true;
11281 }
11282
11283
11284 override bool KindOf(
string tag)
11285 {
11286 bool found = false;
11287 string item_name = this.
GetType();
11289 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11290
11291 int array_size = item_tag_array.Count();
11292 for (int i = 0; i < array_size; i++)
11293 {
11294 if (item_tag_array.Get(i) == tag)
11295 {
11296 found = true;
11297 break;
11298 }
11299 }
11300 return found;
11301 }
11302
11303
11305 {
11306
11307 super.OnRPC(sender, rpc_type,ctx);
11308
11309
11310 switch (rpc_type)
11311 {
11312 #ifndef SERVER
11313 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11314 Param2<bool, string> p = new Param2<bool, string>(false, "");
11315
11317 return;
11318
11319 bool play = p.param1;
11320 string soundSet = p.param2;
11321
11322 if (play)
11323 {
11325 {
11327 {
11329 }
11330 }
11331 else
11332 {
11334 }
11335 }
11336 else
11337 {
11339 }
11340
11341 break;
11342 #endif
11343
11344 }
11345
11347 {
11349 }
11350 }
11351
11352
11353
11354
11356 {
11357 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11358 return plugin.GetID(
name);
11359 }
11360
11362 {
11363 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11364 return plugin.GetName(id);
11365 }
11366
11369 {
11370
11371
11372 int varFlags;
11373 if (!ctx.
Read(varFlags))
11374 return;
11375
11376 if (varFlags & ItemVariableFlags.FLOAT)
11377 {
11379 }
11380 }
11381
11383 {
11384
11385 super.SerializeNumericalVars(floats_out);
11386
11387
11388
11390 {
11392 }
11393
11395 {
11397 }
11398
11400 {
11402 }
11403
11405 {
11410 }
11411
11413 {
11415 }
11416 }
11417
11419 {
11420
11421 super.DeSerializeNumericalVars(floats);
11422
11423
11424 int index = 0;
11425 int mask = Math.Round(floats.Get(index));
11426
11427 index++;
11428
11430 {
11432 {
11434 }
11435 else
11436 {
11437 float quantity = floats.Get(index);
11438 SetQuantity(quantity,
true,
false,
false,
false);
11439 }
11440 index++;
11441 }
11442
11444 {
11445 float wet = floats.Get(index);
11447 index++;
11448 }
11449
11451 {
11452 int liquidtype = Math.Round(floats.Get(index));
11454 index++;
11455 }
11456
11458 {
11460 index++;
11462 index++;
11464 index++;
11466 index++;
11467 }
11468
11470 {
11471 int cleanness = Math.Round(floats.Get(index));
11473 index++;
11474 }
11475 }
11476
11478 {
11479 super.WriteVarsToCTX(ctx);
11480
11481
11483 {
11485 }
11486
11488 {
11490 }
11491
11493 {
11495 }
11496
11498 {
11499 int r,g,b,a;
11505 }
11506
11508 {
11510 }
11511 }
11512
11514 {
11515 if (!super.ReadVarsFromCTX(ctx,version))
11516 return false;
11517
11518 int intValue;
11519 float value;
11520
11521 if (version < 140)
11522 {
11523 if (!ctx.
Read(intValue))
11524 return false;
11525
11526 m_VariablesMask = intValue;
11527 }
11528
11530 {
11531 if (!ctx.
Read(value))
11532 return false;
11533
11535 {
11537 }
11538 else
11539 {
11541 }
11542 }
11543
11544 if (version < 140)
11545 {
11547 {
11548 if (!ctx.
Read(value))
11549 return false;
11550 SetTemperatureDirect(value);
11551 }
11552 }
11553
11555 {
11556 if (!ctx.
Read(value))
11557 return false;
11559 }
11560
11562 {
11563 if (!ctx.
Read(intValue))
11564 return false;
11566 }
11567
11569 {
11570 int r,g,b,a;
11572 return false;
11574 return false;
11576 return false;
11578 return false;
11579
11581 }
11582
11584 {
11585 if (!ctx.
Read(intValue))
11586 return false;
11588 }
11589
11590 if (version >= 138 && version < 140)
11591 {
11593 {
11594 if (!ctx.
Read(intValue))
11595 return false;
11596 SetFrozen(intValue);
11597 }
11598 }
11599
11600 return true;
11601 }
11602
11603
11605 {
11608 {
11610 }
11611
11612 if (!super.OnStoreLoad(ctx, version))
11613 {
11615 return false;
11616 }
11617
11618 if (version >= 114)
11619 {
11620 bool hasQuickBarIndexSaved;
11621
11622 if (!ctx.
Read(hasQuickBarIndexSaved))
11623 {
11625 return false;
11626 }
11627
11628 if (hasQuickBarIndexSaved)
11629 {
11630 int itmQBIndex;
11631
11632
11633 if (!ctx.
Read(itmQBIndex))
11634 {
11636 return false;
11637 }
11638
11639 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11640 if (itmQBIndex != -1 && parentPlayer)
11641 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11642 }
11643 }
11644 else
11645 {
11646
11647 PlayerBase player;
11648 int itemQBIndex;
11649 if (version ==
int.
MAX)
11650 {
11651 if (!ctx.
Read(itemQBIndex))
11652 {
11654 return false;
11655 }
11656 }
11657 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11658 {
11659
11660 if (!ctx.
Read(itemQBIndex))
11661 {
11663 return false;
11664 }
11665 if (itemQBIndex != -1 && player)
11666 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11667 }
11668 }
11669
11670 if (version < 140)
11671 {
11672
11673 if (!LoadVariables(ctx, version))
11674 {
11676 return false;
11677 }
11678 }
11679
11680
11682 {
11684 return false;
11685 }
11686 if (version >= 132)
11687 {
11689 if (raib)
11690 {
11692 {
11694 return false;
11695 }
11696 }
11697 }
11698
11700 return true;
11701 }
11702
11703
11704
11706 {
11707 super.OnStoreSave(ctx);
11708
11709 PlayerBase player;
11710 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11711 {
11713
11714 int itemQBIndex = -1;
11715 itemQBIndex = player.FindQuickBarEntityIndex(this);
11716 ctx.
Write(itemQBIndex);
11717 }
11718 else
11719 {
11721 }
11722
11724
11726 if (raib)
11727 {
11729 }
11730 }
11731
11732
11734 {
11735 super.AfterStoreLoad();
11736
11738 {
11740 }
11741
11743 {
11746 }
11747 }
11748
11750 {
11751 super.EEOnAfterLoad();
11752
11754 {
11756 }
11757
11760 }
11761
11763 {
11764 return false;
11765 }
11766
11767
11768
11770 {
11772 {
11773 #ifdef PLATFORM_CONSOLE
11774
11776 {
11778 if (menu)
11779 {
11781 }
11782 }
11783 #endif
11784 }
11785
11787 {
11790 }
11791
11793 {
11794 SetWeightDirty();
11796 }
11798 {
11801 }
11802
11804 {
11807
11810 }
11812 {
11816 }
11817
11818 super.OnVariablesSynchronized();
11819 }
11820
11821
11822
11824 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11825 {
11826 if (!IsServerCheck(allow_client))
11827 return false;
11828
11830 return false;
11831
11834
11835 if (value <= (min + 0.001))
11836 value = min;
11837
11838 if (value == min)
11839 {
11840 if (destroy_config)
11841 {
11842 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11843 if (dstr)
11844 {
11846 this.Delete();
11847 return true;
11848 }
11849 }
11850 else if (destroy_forced)
11851 {
11853 this.Delete();
11854 return true;
11855 }
11856
11858 }
11859
11862
11864 {
11865 EntityAI parent = GetHierarchyRoot();
11866 InventoryLocation iLoc = new InventoryLocation();
11867 GetInventory().GetCurrentInventoryLocation(iLoc);
11869 {
11870 int iLocSlot = iLoc.
GetSlot();
11872 {
11874 }
11876 {
11878 }
11879 }
11880 }
11881
11883 {
11885
11886 if (delta)
11888 }
11889
11891
11892 return false;
11893 }
11894
11895
11897 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11898 {
11900 }
11901
11903 {
11906 }
11907
11909 {
11912 }
11913
11915 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11916 {
11917 float value_clamped = Math.Clamp(value, 0, 1);
11919 SetQuantity(result, destroy_config, destroy_forced);
11920 }
11921
11922
11925 {
11927 }
11928
11930 {
11932 }
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11944 {
11945 int slot = -1;
11946 GameInventory inventory = GetInventory();
11947 if (inventory)
11948 {
11949 InventoryLocation il = new InventoryLocation;
11952 }
11953
11955 }
11956
11958 {
11959 float quantity_max = 0;
11960
11962 {
11963 if (attSlotID != -1)
11964 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11965
11966 if (quantity_max <= 0)
11968 }
11969
11970 if (quantity_max <= 0)
11972
11973 return quantity_max;
11974 }
11975
11977 {
11979 }
11980
11982 {
11984 }
11985
11986
11988 {
11990 }
11991
11993 {
11995 }
11996
11998 {
12000 }
12001
12002
12004 {
12005
12006 float weightEx = GetWeightEx();
12007 float special = GetInventoryAndCargoWeight();
12008 return weightEx - special;
12009 }
12010
12011
12013 {
12015 }
12016
12018 {
12020 {
12021 #ifdef DEVELOPER
12022 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12023 {
12024 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12026 }
12027 #endif
12028
12029 return GetQuantity() * GetConfigWeightModified();
12030 }
12031 else if (HasEnergyManager())
12032 {
12033 #ifdef DEVELOPER
12034 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12035 {
12036 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12037 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12038 }
12039 #endif
12040 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12041 }
12042 else
12043 {
12044 #ifdef DEVELOPER
12045 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12046 {
12047 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12048 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12049 }
12050 #endif
12051 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12052 }
12053 }
12054
12057 {
12058 int item_count = 0;
12060
12061 GameInventory inventory = GetInventory();
12062 CargoBase cargo = inventory.
GetCargo();
12063 if (cargo != NULL)
12064 {
12066 }
12067
12069 for (int i = 0; i < nAttachments; ++i)
12070 {
12072 if (item)
12073 item_count += item.GetNumberOfItems();
12074 }
12075 return item_count;
12076 }
12077
12080 {
12081 float weight = 0;
12082 float wetness = 1;
12083 if (include_wetness)
12086 {
12087 weight = wetness * m_ConfigWeight;
12088 }
12090 {
12091 weight = 1;
12092 }
12093 return weight;
12094 }
12095
12096
12097
12099 {
12100 GameInventory inventory = GetInventory();
12101 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12102 {
12103 array<EntityAI> items = new array<EntityAI>;
12105 for (int i = 0; i < items.Count(); ++i)
12106 {
12108 if (item)
12109 {
12110 g_Game.ObjectDelete(item);
12111 }
12112 }
12113 }
12114 }
12115
12116
12117
12118
12120 {
12121 float energy = 0;
12122 if (HasEnergyManager())
12123 {
12124 energy = GetCompEM().GetEnergy();
12125 }
12126 return energy;
12127 }
12128
12129
12131 {
12132 super.OnEnergyConsumed();
12133
12135 }
12136
12138 {
12139 super.OnEnergyAdded();
12140
12142 }
12143
12144
12146 {
12147 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12148 {
12150 {
12151 float energy_0to1 = GetCompEM().GetEnergy0To1();
12153 }
12154 }
12155 }
12156
12157
12159 {
12160 return ConfigGetFloat("heatIsolation");
12161 }
12162
12164 {
12166 }
12167
12169 {
12170 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12171 if (
g_Game.ConfigIsExisting(paramPath))
12172 return g_Game.ConfigGetFloat(paramPath);
12173
12174 return 0.0;
12175 }
12176
12178 {
12179 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12180 if (
g_Game.ConfigIsExisting(paramPath))
12181 return g_Game.ConfigGetFloat(paramPath);
12182
12183 return 0.0;
12184 }
12185
12186 override void SetWet(
float value,
bool allow_client =
false)
12187 {
12188 if (!IsServerCheck(allow_client))
12189 return;
12190
12193
12195
12196 m_VarWet = Math.Clamp(value, min, max);
12197
12199 {
12202 }
12203 }
12204
12205 override void AddWet(
float value)
12206 {
12208 }
12209
12211 {
12213 }
12214
12216 {
12218 }
12219
12221 {
12223 }
12224
12226 {
12228 }
12229
12231 {
12233 }
12234
12235 override void OnWetChanged(
float newVal,
float oldVal)
12236 {
12239 if (newLevel != oldLevel)
12240 {
12242 }
12243 }
12244
12246 {
12247 SetWeightDirty();
12248 }
12249
12251 {
12252 return GetWetLevelInternal(
m_VarWet);
12253 }
12254
12255
12256
12258 {
12260 }
12261
12263 {
12265 }
12266
12268 {
12270 }
12271
12273 {
12275 }
12276
12277
12278
12280 {
12281 if (ConfigIsExisting("itemModelLength"))
12282 {
12283 return ConfigGetFloat("itemModelLength");
12284 }
12285 return 0;
12286 }
12287
12289 {
12290 if (ConfigIsExisting("itemAttachOffset"))
12291 {
12292 return ConfigGetFloat("itemAttachOffset");
12293 }
12294 return 0;
12295 }
12296
12297 override void SetCleanness(
int value,
bool allow_client =
false)
12298 {
12299 if (!IsServerCheck(allow_client))
12300 return;
12301
12303
12305
12308 }
12309
12311 {
12313 }
12314
12316 {
12317 return true;
12318 }
12319
12320
12321
12322
12324 {
12326 }
12327
12329 {
12331 }
12332
12333
12334
12335
12336 override void SetColor(
int r,
int g,
int b,
int a)
12337 {
12343 }
12345 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12346 {
12351 }
12352
12354 {
12356 }
12357
12360 {
12361 int r,g,b,a;
12363 r = r/255;
12364 g = g/255;
12365 b = b/255;
12366 a = a/255;
12367 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12368 }
12369
12370
12371
12372 override void SetLiquidType(
int value,
bool allow_client =
false)
12373 {
12374 if (!IsServerCheck(allow_client))
12375 return;
12376
12381 }
12382
12384 {
12385 return ConfigGetInt("varLiquidTypeInit");
12386 }
12387
12389 {
12391 }
12392
12394 {
12396 SetFrozen(false);
12397 }
12398
12401 {
12402 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12403 }
12404
12405
12408 {
12409 PlayerBase nplayer;
12410 if (PlayerBase.CastTo(nplayer, player))
12411 {
12413 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12414 }
12415 }
12416
12417
12420 {
12421 PlayerBase nplayer;
12422 if (PlayerBase.CastTo(nplayer,player))
12423 {
12424 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12425 }
12426
12427 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12428
12429 if (HasEnergyManager())
12430 {
12431 GetCompEM().UpdatePlugState();
12432 }
12433 }
12434
12435
12437 {
12438 super.OnPlacementStarted(player);
12439
12441 }
12442
12443 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12444 {
12446 {
12447 m_AdminLog.OnPlacementComplete(player,
this);
12448 }
12449
12450 super.OnPlacementComplete(player, position, orientation);
12451 }
12452
12453
12454
12455
12456
12458 {
12460 {
12461 return true;
12462 }
12463 else
12464 {
12465 return false;
12466 }
12467 }
12468
12469
12471 {
12473 {
12475 }
12476 }
12477
12478
12480 {
12482 }
12483
12485 {
12487 }
12488
12489 override void InsertAgent(
int agent,
float count = 1)
12490 {
12491 if (count < 1)
12492 return;
12493
12495 }
12496
12499 {
12501 }
12502
12503
12505 {
12507 }
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12551 {
12553 return false;
12554 return true;
12555 }
12556
12558 {
12559
12561 }
12562
12563
12566 {
12567 super.CheckForRoofLimited(timeTresholdMS);
12568
12569 float time =
g_Game.GetTime();
12570 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12571 {
12572 m_PreviousRoofTestTime = time;
12573 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12574 }
12575 }
12576
12577
12579 {
12581 {
12582 return 0;
12583 }
12584
12585 if (GetInventory().GetAttachmentSlotsCount() != 0)
12586 {
12587 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12588 if (filter)
12589 return filter.GetProtectionLevel(type, false, system);
12590 else
12591 return 0;
12592 }
12593
12594 string subclassPath, entryName;
12595
12596 switch (type)
12597 {
12599 entryName = "biological";
12600 break;
12602 entryName = "chemical";
12603 break;
12604 default:
12605 entryName = "biological";
12606 break;
12607 }
12608
12609 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12610
12611 return g_Game.ConfigGetFloat(subclassPath + entryName);
12612 }
12613
12614
12615
12618 {
12619 if (!IsMagazine())
12621
12623 }
12624
12625
12626
12627
12628
12633 {
12634 return true;
12635 }
12636
12638 {
12640 }
12641
12642
12643
12644
12645
12647 {
12648 if (parent)
12649 {
12650 if (parent.IsInherited(DayZInfected))
12651 return true;
12652
12653 if (!parent.IsRuined())
12654 return true;
12655 }
12656
12657 return true;
12658 }
12659
12661 {
12662 if (!super.CanPutAsAttachment(parent))
12663 {
12664 return false;
12665 }
12666
12667 if (!IsRuined() && !parent.IsRuined())
12668 {
12669 return true;
12670 }
12671
12672 return false;
12673 }
12674
12676 {
12677
12678
12679
12680
12681 return super.CanReceiveItemIntoCargo(item);
12682 }
12683
12685 {
12686
12687
12688
12689
12690 GameInventory attachmentInv = attachment.GetInventory();
12692 {
12693 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12694 return false;
12695 }
12696
12697 InventoryLocation loc = new InventoryLocation();
12698 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12699 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12700 return false;
12701
12702 return super.CanReceiveAttachment(attachment, slotId);
12703 }
12704
12706 {
12707 if (!super.CanReleaseAttachment(attachment))
12708 return false;
12709
12710 return GetInventory().AreChildrenAccessible();
12711 }
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12734 {
12735 int id = muzzle_owner.GetMuzzleID();
12736 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12737
12738 if (WPOF_array)
12739 {
12740 for (int i = 0; i < WPOF_array.Count(); i++)
12741 {
12742 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12743
12744 if (WPOF)
12745 {
12746 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12747 }
12748 }
12749 }
12750 }
12751
12752
12754 {
12755 int id = muzzle_owner.GetMuzzleID();
12757
12758 if (WPOBE_array)
12759 {
12760 for (int i = 0; i < WPOBE_array.Count(); i++)
12761 {
12762 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12763
12764 if (WPOBE)
12765 {
12766 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12767 }
12768 }
12769 }
12770 }
12771
12772
12774 {
12775 int id = muzzle_owner.GetMuzzleID();
12776 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12777
12778 if (WPOOH_array)
12779 {
12780 for (int i = 0; i < WPOOH_array.Count(); i++)
12781 {
12782 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12783
12784 if (WPOOH)
12785 {
12786 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12787 }
12788 }
12789 }
12790 }
12791
12792
12794 {
12795 int id = muzzle_owner.GetMuzzleID();
12796 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12797
12798 if (WPOOH_array)
12799 {
12800 for (int i = 0; i < WPOOH_array.Count(); i++)
12801 {
12802 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12803
12804 if (WPOOH)
12805 {
12806 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12807 }
12808 }
12809 }
12810 }
12811
12812
12814 {
12815 int id = muzzle_owner.GetMuzzleID();
12816 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12817
12818 if (WPOOH_array)
12819 {
12820 for (int i = 0; i < WPOOH_array.Count(); i++)
12821 {
12822 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12823
12824 if (WPOOH)
12825 {
12826 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12827 }
12828 }
12829 }
12830 }
12831
12832
12833
12835 {
12837 {
12838 return true;
12839 }
12840
12841 return false;
12842 }
12843
12845 {
12847 {
12848 return true;
12849 }
12850
12851 return false;
12852 }
12853
12855 {
12857 {
12858 return true;
12859 }
12860
12861 return false;
12862 }
12863
12865 {
12866 return false;
12867 }
12868
12871 {
12872 return UATimeSpent.DEFAULT_DEPLOY;
12873 }
12874
12875
12876
12877
12879 {
12881 SetSynchDirty();
12882 }
12883
12885 {
12887 }
12888
12889
12891 {
12892 return false;
12893 }
12894
12897 {
12898 string att_type = "None";
12899
12900 if (ConfigIsExisting("soundAttType"))
12901 {
12902 att_type = ConfigGetString("soundAttType");
12903 }
12904
12906 }
12907
12909 {
12911 }
12912
12913
12914
12915
12916
12922
12924 {
12927
12929 }
12930
12931
12933 {
12935 return;
12936
12938
12941
12944
12945 SoundParameters params = new SoundParameters();
12949 }
12950
12951
12953 {
12955 {
12958
12959 SetSynchDirty();
12960
12963 }
12964 }
12965
12967 {
12969 }
12970
12971
12973 {
12975 return;
12976
12978 SetSynchDirty();
12979
12982 }
12983
12985 {
12988 }
12989
12991 {
12993 }
12994
12995 void OnApply(PlayerBase player);
12996
12998 {
12999 return 1.0;
13000 };
13001
13003 {
13005 }
13006
13008 {
13010 }
13011
13013
13015 {
13016 SetDynamicPhysicsLifeTime(0.01);
13018 }
13019
13021 {
13022 array<string> zone_names = new array<string>;
13023 GetDamageZones(zone_names);
13024 for (int i = 0; i < zone_names.Count(); i++)
13025 {
13026 SetHealthMax(zone_names.Get(i),"Health");
13027 }
13028 SetHealthMax("","Health");
13029 }
13030
13033 {
13034 float global_health = GetHealth01("","Health");
13035 array<string> zones = new array<string>;
13036 GetDamageZones(zones);
13037
13038 for (int i = 0; i < zones.Count(); i++)
13039 {
13040 SetHealth01(zones.Get(i),"Health",global_health);
13041 }
13042 }
13043
13046 {
13047 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13048 }
13049
13051 {
13052 if (!hasRootAsPlayer)
13053 {
13054 if (refParentIB)
13055 {
13056
13057 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13058 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13059
13060 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13061 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13062
13065 }
13066 else
13067 {
13068
13071 }
13072 }
13073 }
13074
13076 {
13078 {
13079 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13080 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13081 {
13082 float heatPermCoef = 1.0;
13084 while (ent)
13085 {
13086 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13087 ent = ent.GetHierarchyParent();
13088 }
13089
13090 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13091 }
13092 }
13093 }
13094
13096 {
13097
13098 EntityAI parent = GetHierarchyParent();
13099 if (!parent)
13100 {
13101 hasParent = false;
13102 hasRootAsPlayer = false;
13103 }
13104 else
13105 {
13106 hasParent = true;
13107 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13108 refParentIB =
ItemBase.Cast(parent);
13109 }
13110 }
13111
13112 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13113 {
13114
13115 }
13116
13118 {
13119
13120 return false;
13121 }
13122
13124 {
13125
13126
13127 return false;
13128 }
13129
13131 {
13132
13133 return false;
13134 }
13135
13138 {
13139 return !GetIsFrozen() &&
IsOpen();
13140 }
13141
13143 {
13144 bool hasParent = false, hasRootAsPlayer = false;
13146
13147 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13148 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13149
13150 if (wwtu || foodDecay)
13151 {
13155
13156 if (processWetness || processTemperature || processDecay)
13157 {
13159
13160 if (processWetness)
13161 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13162
13163 if (processTemperature)
13165
13166 if (processDecay)
13167 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13168 }
13169 }
13170 }
13171
13174 {
13176 }
13177
13179 {
13182
13183 return super.GetTemperatureFreezeThreshold();
13184 }
13185
13187 {
13190
13191 return super.GetTemperatureThawThreshold();
13192 }
13193
13195 {
13198
13199 return super.GetItemOverheatThreshold();
13200 }
13201
13203 {
13205 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13206
13207 return super.GetTemperatureFreezeTime();
13208 }
13209
13211 {
13213 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13214
13215 return super.GetTemperatureThawTime();
13216 }
13217
13222
13224 {
13225 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13226 }
13227
13229 {
13230 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13231 }
13232
13235 {
13237 }
13238
13240 {
13242 }
13243
13245 {
13247 }
13248
13251 {
13252 return null;
13253 }
13254
13257 {
13258 return false;
13259 }
13260
13262 {
13264 {
13267 if (!trg)
13268 {
13270 explosive = this;
13271 }
13272
13273 explosive.PairRemote(trg);
13275
13276 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13277 trg.SetPersistentPairID(persistentID);
13278 explosive.SetPersistentPairID(persistentID);
13279
13280 return true;
13281 }
13282 return false;
13283 }
13284
13287 {
13288 float ret = 1.0;
13291 ret *= GetHealth01();
13292
13293 return ret;
13294 }
13295
13296 #ifdef DEVELOPER
13297 override void SetDebugItem()
13298 {
13299 super.SetDebugItem();
13300 _itemBase = this;
13301 }
13302
13304 {
13305 string text = super.GetDebugText();
13306
13308 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13309
13310 return text;
13311 }
13312 #endif
13313
13315 {
13316 return true;
13317 }
13318
13320
13322
13324 {
13327 }
13328
13329
13337
13353
13354 [
Obsolete(
"Use ItemSoundHandler instead")]
13357 {
13358 if (!
g_Game.IsDedicatedServer())
13359 {
13360 if (ConfigIsExisting("attachSoundSet"))
13361 {
13362 string cfg_path = "";
13363 string soundset = "";
13364 string type_name =
GetType();
13365
13368 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13369 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13370
13371 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13372 {
13373 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13374 {
13375 if (cfg_slot_array[i] == slot_type)
13376 {
13377 soundset = cfg_soundset_array[i];
13378 break;
13379 }
13380 }
13381 }
13382
13383 if (soundset != "")
13384 {
13385 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13387 }
13388 }
13389 }
13390 }
13391
13393}
13394
13396{
13398 if (entity)
13399 {
13400 bool is_item = entity.IsInherited(
ItemBase);
13401 if (is_item && full_quantity)
13402 {
13405 }
13406 }
13407 else
13408 {
13410 return NULL;
13411 }
13412 return entity;
13413}
13414
13416{
13417 if (item)
13418 {
13419 if (health > 0)
13420 item.SetHealth("", "", health);
13421
13422 if (item.CanHaveTemperature())
13423 {
13425 if (item.CanFreeze())
13426 item.SetFrozen(false);
13427 }
13428
13429 if (item.HasEnergyManager())
13430 {
13431 if (quantity >= 0)
13432 {
13433 item.GetCompEM().SetEnergy0To1(quantity);
13434 }
13435 else
13436 {
13438 }
13439 }
13440 else if (item.IsMagazine())
13441 {
13442 Magazine mag = Magazine.Cast(item);
13443 if (quantity >= 0)
13444 {
13445 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13446 }
13447 else
13448 {
13450 }
13451
13452 }
13453 else
13454 {
13455 if (quantity >= 0)
13456 {
13457 item.SetQuantityNormalized(quantity, false);
13458 }
13459 else
13460 {
13462 }
13463
13464 }
13465 }
13466}
13467
13468#ifdef DEVELOPER
13470#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.