8530{
8532 {
8533 return true;
8534 }
8535};
8536
8538{
8539
8540};
8541
8542
8543
8545{
8549
8551
8554
8555
8556
8557
8558
8567
8573
8578
8583
8604 protected bool m_IsResultOfSplit
8605
8607
8612
8613
8614
8616
8620
8621
8622
8624
8627
8628
8629
8635
8636
8644
8647
8648
8650
8651
8653
8654
8659
8660
8665
8667
8668
8670
8671
8673 {
8678
8679 if (!
g_Game.IsDedicatedServer())
8680 {
8682 {
8684
8686 {
8688 }
8689 }
8690
8693 }
8694
8695 m_OldLocation = null;
8696
8698 {
8700 }
8701
8702 if (ConfigIsExisting("headSelectionsToHide"))
8703 {
8706 }
8707
8709 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8710 {
8712 }
8713
8715
8716 m_IsResultOfSplit = false;
8717
8719 }
8720
8722 {
8723 super.InitItemVariables();
8724
8730 m_Count = ConfigGetInt(
"count");
8731
8734
8739
8742
8747
8759
8763
8764
8767 if (ConfigIsExisting("canBeSplit"))
8768 {
8771 }
8772
8774 if (ConfigIsExisting("itemBehaviour"))
8776
8777
8780 RegisterNetSyncVariableInt("m_VarLiquidType");
8781 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8782
8783 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8784 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8785 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8786
8787 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8788 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8789 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8790 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8791
8792 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8793 RegisterNetSyncVariableBool("m_IsTakeable");
8794 RegisterNetSyncVariableBool("m_IsHologram");
8795
8798 {
8801 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8802 }
8803
8805
8807 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8809
8811 }
8812
8814 {
8816 }
8817
8819 {
8822 {
8827 }
8828 }
8829
8830 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8831 {
8833 {
8836 }
8837
8839 }
8840
8842 {
8848 }
8849
8851
8853 {
8855
8856 if (!action)
8857 {
8858 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8859 return;
8860 }
8861
8863 if (!ai)
8864 {
8866 return;
8867 }
8868
8870 if (!action_array)
8871 {
8872 action_array = new array<ActionBase_Basic>;
8874 }
8875 if (LogManager.IsActionLogEnable())
8876 {
8877 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8878 }
8879
8880 if (action_array.Find(action) != -1)
8881 {
8882 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8883 }
8884 else
8885 {
8886 action_array.Insert(action);
8887 }
8888 }
8889
8891 {
8892 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8893 ActionBase action = player.GetActionManager().GetAction(actionName);
8896
8897 if (action_array)
8898 {
8899 action_array.RemoveItem(action);
8900 }
8901 }
8902
8903
8904
8906 {
8907 ActionOverrideData overrideData = new ActionOverrideData();
8911
8913 if (!actionMap)
8914 {
8917 }
8918
8919 actionMap.Insert(this.
Type(), overrideData);
8920
8921 }
8922
8924
8926
8927
8929 {
8932
8935
8936 string config_to_search = "CfgVehicles";
8937 string muzzle_owner_config;
8938
8940 {
8941 if (IsInherited(Weapon))
8942 config_to_search = "CfgWeapons";
8943
8944 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8945
8946 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8947
8948 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8949
8950 if (config_OnFire_subclass_count > 0)
8951 {
8952 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8953
8954 for (int i = 0; i < config_OnFire_subclass_count; i++)
8955 {
8956 string particle_class = "";
8957 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8958 string config_OnFire_entry = config_OnFire_class + particle_class;
8959 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8960 WPOF_array.Insert(WPOF);
8961 }
8962
8963
8965 }
8966 }
8967
8969 {
8970 config_to_search = "CfgWeapons";
8971 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8972
8973 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8974
8975 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8976
8977 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8978 {
8979 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8980
8981 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8982 {
8983 string particle_class2 = "";
8984 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8985 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8986 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8987 WPOBE_array.Insert(WPOBE);
8988 }
8989
8990
8992 }
8993 }
8994 }
8995
8996
8998 {
9001
9003 {
9004 string config_to_search = "CfgVehicles";
9005
9006 if (IsInherited(Weapon))
9007 config_to_search = "CfgWeapons";
9008
9009 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9010 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9011
9012 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9013 {
9014
9016
9018 {
9020 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9022 return;
9023 }
9024
9027
9028
9029
9030 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9031 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9032
9033 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9034 {
9035 string particle_class = "";
9036 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9037 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9038 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9039
9040 if (entry_type == CT_CLASS)
9041 {
9042 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9043 WPOOH_array.Insert(WPOF);
9044 }
9045 }
9046
9047
9049 }
9050 }
9051 }
9052
9054 {
9056 }
9057
9059 {
9061 {
9063
9066
9069
9070 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9071 }
9072 }
9073
9075 {
9077 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9078
9080 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9081
9083 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9084
9086 {
9088 }
9089 }
9090
9092 {
9094 }
9095
9097 {
9100 else
9102
9104 {
9107 }
9108 else
9109 {
9112
9115 }
9116
9118 }
9119
9121 {
9123 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9124 }
9125
9127 {
9129 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9131 }
9132
9134 {
9136 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9137 }
9138
9140 {
9143
9144 OverheatingParticle OP = new OverheatingParticle();
9149
9151 }
9152
9154 {
9157
9158 return -1;
9159 }
9160
9162 {
9164 {
9167
9168 for (int i = count; i > 0; --i)
9169 {
9170 int id = i - 1;
9173
9176
9177 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9178 {
9179 if (p)
9180 {
9183 }
9184 }
9185 }
9186 }
9187 }
9188
9190 {
9192 {
9194 {
9195 int id = i - 1;
9197
9198 if (OP)
9199 {
9201
9202 if (p)
9203 {
9205 }
9206
9207 delete OP;
9208 }
9209 }
9210
9213 }
9214 }
9215
9218 {
9219 return 0.0;
9220 }
9221
9222
9224 {
9225 return 250;
9226 }
9227
9229 {
9230 return 0;
9231 }
9232
9235 {
9237 return true;
9238
9239 return false;
9240 }
9241
9244 {
9247
9249 {
9251 }
9252 else
9253 {
9254
9256 }
9257
9259 }
9260
9267 {
9268 return -1;
9269 }
9270
9271
9272
9273
9275 {
9277 {
9278 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9279 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9280
9281 if (r_index >= 0)
9282 {
9283 InventoryLocation r_il = new InventoryLocation;
9284 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9285
9286 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9289 {
9290 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9291 }
9293 {
9294 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9295 }
9296
9297 }
9298
9299 player.GetHumanInventory().ClearUserReservedLocation(this);
9300 }
9301
9304 }
9305
9306
9307
9308
9310 {
9311 return ItemBase.m_DebugActionsMask;
9312 }
9313
9315 {
9316 return ItemBase.m_DebugActionsMask & mask;
9317 }
9318
9320 {
9321 ItemBase.m_DebugActionsMask = mask;
9322 }
9323
9325 {
9326 ItemBase.m_DebugActionsMask |= mask;
9327 }
9328
9330 {
9331 ItemBase.m_DebugActionsMask &= ~mask;
9332 }
9333
9335 {
9337 {
9339 }
9340 else
9341 {
9343 }
9344 }
9345
9346
9348 {
9349 if (GetEconomyProfile())
9350 {
9351 float q_max = GetEconomyProfile().GetQuantityMax();
9352 if (q_max > 0)
9353 {
9354 float q_min = GetEconomyProfile().GetQuantityMin();
9355 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9356
9358 {
9359 ComponentEnergyManager comp = GetCompEM();
9361 {
9363 }
9364 }
9366 {
9368
9369 }
9370
9371 }
9372 }
9373 }
9374
9377 {
9378 EntityAI parent = GetHierarchyParent();
9379
9380 if (parent)
9381 {
9382 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9383 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9384 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9385 }
9386 }
9387
9390 {
9391 EntityAI parent = GetHierarchyParent();
9392
9393 if (parent)
9394 {
9395 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9396 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9397 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9398 }
9399 }
9400
9402 {
9403
9404
9405
9406
9408
9410 {
9411 if (ScriptInputUserData.CanStoreInputUserData())
9412 {
9413 ScriptInputUserData ctx = new ScriptInputUserData;
9419 ctx.
Write(use_stack_max);
9422
9424 {
9425 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9426 }
9427 }
9428 }
9429 else if (!
g_Game.IsMultiplayer())
9430 {
9432 }
9433 }
9434
9436 {
9438 }
9439
9441 {
9443 }
9444
9446 {
9448 }
9449
9451 {
9452
9453 return false;
9454 }
9455
9457 {
9458 return false;
9459 }
9460
9464 {
9465 return false;
9466 }
9467
9469 {
9470 return "";
9471 }
9472
9474
9476 {
9477 return false;
9478 }
9479
9481 {
9482 return true;
9483 }
9484
9485
9486
9488 {
9489 return true;
9490 }
9491
9493 {
9494 return true;
9495 }
9496
9498 {
9499 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9501 }
9502
9504 {
9506 }
9507
9509 {
9511 if (!is_being_placed)
9513 SetSynchDirty();
9514 }
9515
9516
9518
9520 {
9522 }
9523
9525 {
9527 }
9528
9530 {
9531 return 1;
9532 }
9533
9535 {
9536 return false;
9537 }
9538
9540 {
9542 SetSynchDirty();
9543 }
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9580 {
9581 super.OnMovedInsideCargo(container);
9582
9583 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9584 }
9585
9586 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9587 {
9588 super.EEItemLocationChanged(oldLoc, newLoc);
9589
9590 PlayerBase newPlayer = null;
9591 PlayerBase oldPlayer = null;
9592
9593 if (newLoc.GetParent())
9594 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9595
9596 if (oldLoc.GetParent())
9597 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9598
9600 {
9601 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9602
9603 if (rIndex >= 0)
9604 {
9605 InventoryLocation rIl = new InventoryLocation;
9606 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9607
9608 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9611 {
9612 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9613 }
9615 {
9617 }
9618
9619 }
9620 }
9621
9623 {
9624 if (newPlayer)
9625 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9626
9627 if (newPlayer == oldPlayer)
9628 {
9629 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9630 {
9632 {
9633 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9634 {
9635 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9636 }
9637 }
9638 else
9639 {
9640 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9641 }
9642 }
9643
9644 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9645 {
9646 int type = oldLoc.GetType();
9648 {
9649 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9650 }
9652 {
9653 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9654 }
9655 }
9656 if (!m_OldLocation)
9657 {
9658 m_OldLocation = new InventoryLocation;
9659 }
9660 m_OldLocation.Copy(oldLoc);
9661 }
9662 else
9663 {
9664 if (m_OldLocation)
9665 {
9666 m_OldLocation.Reset();
9667 }
9668 }
9669
9670 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9671 }
9672 else
9673 {
9674 if (newPlayer)
9675 {
9676 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9677 if (resIndex >= 0)
9678 {
9679 InventoryLocation il = new InventoryLocation;
9680 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9682 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9685 {
9686 il.
GetParent().GetOnReleaseLock().Invoke(it);
9687 }
9689 {
9691 }
9692
9693 }
9694 }
9696 {
9697
9699 }
9700
9701 if (m_OldLocation)
9702 {
9703 m_OldLocation.Reset();
9704 }
9705 }
9706
9708 {
9709 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9710 }
9711
9713 {
9714 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9715 }
9716 }
9717
9718 override void EOnContact(IEntity other, Contact extra)
9719 {
9721 {
9722 int liquidType = -1;
9724 if (impactSpeed > 0.0)
9725 {
9727 #ifndef SERVER
9729 #else
9731 SetSynchDirty();
9732 #endif
9734 }
9735 }
9736
9737 #ifdef SERVER
9738 if (GetCompEM() && GetCompEM().IsPlugged())
9739 {
9740 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9741 GetCompEM().UnplugThis();
9742 }
9743 #endif
9744 }
9745
9747
9749 {
9751 }
9752
9754 {
9755
9756 }
9757
9759 {
9760 super.OnItemLocationChanged(old_owner, new_owner);
9761
9762 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9763 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9764
9765 if (!relatedPlayer && playerNew)
9766 relatedPlayer = playerNew;
9767
9768 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9769 {
9771 if (actionMgr)
9772 {
9773 ActionBase currentAction = actionMgr.GetRunningAction();
9774 if (currentAction)
9776 }
9777 }
9778
9779 Man ownerPlayerOld = null;
9780 Man ownerPlayerNew = null;
9781
9782 if (old_owner)
9783 {
9784 if (old_owner.
IsMan())
9785 {
9786 ownerPlayerOld = Man.Cast(old_owner);
9787 }
9788 else
9789 {
9790 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9791 }
9792 }
9793 else
9794 {
9796 {
9798
9799 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9800 {
9801 GetCompEM().UnplugThis();
9802 }
9803 }
9804 }
9805
9806 if (new_owner)
9807 {
9808 if (new_owner.
IsMan())
9809 {
9810 ownerPlayerNew = Man.Cast(new_owner);
9811 }
9812 else
9813 {
9814 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9815 }
9816 }
9817
9818 if (ownerPlayerOld != ownerPlayerNew)
9819 {
9820 if (ownerPlayerOld)
9821 {
9822 array<EntityAI> subItemsExit = new array<EntityAI>;
9824 for (int i = 0; i < subItemsExit.Count(); i++)
9825 {
9828 }
9829 }
9830
9831 if (ownerPlayerNew)
9832 {
9833 array<EntityAI> subItemsEnter = new array<EntityAI>;
9835 for (int j = 0; j < subItemsEnter.Count(); j++)
9836 {
9839 }
9840 }
9841 }
9842 else if (ownerPlayerNew != null)
9843 {
9844 PlayerBase nplayer;
9845 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9846 {
9847 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9849 for (int k = 0; k < subItemsUpdate.Count(); k++)
9850 {
9852 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9853 }
9854 }
9855 }
9856
9857 if (old_owner)
9858 old_owner.OnChildItemRemoved(this);
9859 if (new_owner)
9860 new_owner.OnChildItemReceived(this);
9861 }
9862
9863
9865 {
9866 super.EEDelete(parent);
9867 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9868 if (player)
9869 {
9871
9872 if (player.IsAlive())
9873 {
9874 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9875 if (r_index >= 0)
9876 {
9877 InventoryLocation r_il = new InventoryLocation;
9878 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9879
9880 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9883 {
9884 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9885 }
9887 {
9888 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9889 }
9890
9891 }
9892
9893 player.RemoveQuickBarEntityShortcut(this);
9894 }
9895 }
9896 }
9897
9899 {
9900 super.EEKilled(killer);
9901
9904 {
9905 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9906 {
9907 if (IsMagazine())
9908 {
9909 if (Magazine.Cast(this).GetAmmoCount() > 0)
9910 {
9912 }
9913 }
9914 else
9915 {
9917 }
9918 }
9919 }
9920 }
9921
9923 {
9924 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9925
9926 super.OnWasAttached(parent, slot_id);
9927
9930
9933 }
9934
9936 {
9937 super.OnWasDetached(parent, slot_id);
9938
9941
9944 }
9945
9947 {
9948 int idx;
9951
9952 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9953 if (inventory_slots.Count() < 1)
9954 {
9955 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9956 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9957 }
9958 else
9959 {
9960 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9961 }
9962
9963 idx = inventory_slots.Find(slot);
9964 if (idx < 0)
9965 return "";
9966
9967 return attach_types.Get(idx);
9968 }
9969
9971 {
9972 int idx = -1;
9973 string slot;
9974
9977
9978 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9979 if (inventory_slots.Count() < 1)
9980 {
9981 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9982 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9983 }
9984 else
9985 {
9986 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9987 if (detach_types.Count() < 1)
9988 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9989 }
9990
9991 for (int i = 0; i < inventory_slots.Count(); i++)
9992 {
9993 slot = inventory_slots.Get(i);
9994 }
9995
9996 if (slot != "")
9997 {
9998 if (detach_types.Count() == 1)
9999 idx = 0;
10000 else
10001 idx = inventory_slots.Find(slot);
10002 }
10003 if (idx < 0)
10004 return "";
10005
10006 return detach_types.Get(idx);
10007 }
10008
10010 {
10011
10013
10014
10015 float min_time = 1;
10016 float max_time = 3;
10017 float delay = Math.RandomFloat(min_time, max_time);
10018
10019 explode_timer.Run(delay, this, "DoAmmoExplosion");
10020 }
10021
10023 {
10024 Magazine magazine = Magazine.Cast(this);
10025 int pop_sounds_count = 6;
10026 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10027
10028
10029 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10030 string sound_name = pop_sounds[ sound_idx ];
10031 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10032
10033
10034 magazine.ServerAddAmmoCount(-1);
10035
10036
10037 float min_temp_to_explode = 100;
10038
10039 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10040 {
10042 }
10043 }
10044
10045
10046 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10047 {
10048 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10049
10050 const int CHANCE_DAMAGE_CARGO = 4;
10051 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10052 const int CHANCE_DAMAGE_NOTHING = 2;
10053
10055 {
10056 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10057 int chances;
10058 int rnd;
10059
10060 if (GetInventory().GetCargo())
10061 {
10062 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10063 rnd = Math.RandomInt(0,chances);
10064
10065 if (rnd < CHANCE_DAMAGE_CARGO)
10066 {
10068 }
10069 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10070 {
10072 }
10073 }
10074 else
10075 {
10076 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10077 rnd = Math.RandomInt(0,chances);
10078
10079 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10080 {
10082 }
10083 }
10084 }
10085 }
10086
10088 {
10089 CargoBase cargo = GetInventory().GetCargo();
10090 if (cargo)
10091 {
10093 if (item_count > 0)
10094 {
10095 int random_pick = Math.RandomInt(0, item_count);
10097 if (!item.IsExplosive())
10098 {
10099 item.AddHealth("","",damage);
10100 return true;
10101 }
10102 }
10103 }
10104 return false;
10105 }
10106
10108 {
10109 GameInventory inventory = GetInventory();
10111 if (attachment_count > 0)
10112 {
10113 int random_pick = Math.RandomInt(0, attachment_count);
10115 if (!attachment.IsExplosive())
10116 {
10117 attachment.AddHealth("","",damage);
10118 return true;
10119 }
10120 }
10121 return false;
10122 }
10123
10125 {
10127 }
10128
10130 {
10132 return GetInventory().CanRemoveEntity();
10133
10134 return false;
10135 }
10136
10138 {
10139
10141 return false;
10142
10143
10145 return false;
10146
10147
10148
10150 if (delta == 0)
10151 return false;
10152
10153
10154 return true;
10155 }
10156
10158 {
10160 {
10161 if (ScriptInputUserData.CanStoreInputUserData())
10162 {
10163 ScriptInputUserData ctx = new ScriptInputUserData;
10168 ctx.
Write(destination_entity);
10170 ctx.
Write(slot_id);
10172 }
10173 }
10174 else if (!
g_Game.IsMultiplayer())
10175 {
10177 }
10178 }
10179
10181 {
10182 float split_quantity_new;
10186 InventoryLocation loc = new InventoryLocation;
10187
10188 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10189 {
10191 split_quantity_new = stack_max;
10192 else
10194
10196 {
10197 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10198 if (new_item)
10199 {
10200 new_item.SetResultOfSplit(true);
10201 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10203 new_item.
SetQuantity(split_quantity_new,
false,
true);
10204 }
10205 }
10206 }
10207 else if (destination_entity && slot_id == -1)
10208 {
10209 if (quantity > stack_max)
10210 split_quantity_new = stack_max;
10211 else
10212 split_quantity_new = quantity;
10213
10215 {
10216 GameInventory destinationInventory = destination_entity.GetInventory();
10218 {
10221 }
10222
10223 if (new_item)
10224 {
10225 new_item.SetResultOfSplit(true);
10226 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10228 new_item.
SetQuantity(split_quantity_new,
false,
true);
10229 }
10230 }
10231 }
10232 else
10233 {
10234 if (stack_max != 0)
10235 {
10237 {
10239 }
10240
10241 if (split_quantity_new == 0)
10242 {
10243 if (!
g_Game.IsMultiplayer())
10244 player.PhysicalPredictiveDropItem(this);
10245 else
10246 player.ServerDropEntity(this);
10247 return;
10248 }
10249
10251 {
10253
10254 if (new_item)
10255 {
10256 new_item.SetResultOfSplit(true);
10257 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10260 new_item.PlaceOnSurface();
10261 }
10262 }
10263 }
10264 }
10265 }
10266
10268 {
10269 float split_quantity_new;
10273 InventoryLocation loc = new InventoryLocation;
10274
10275 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10276 {
10278 split_quantity_new = stack_max;
10279 else
10281
10283 {
10284 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10285 if (new_item)
10286 {
10287 new_item.SetResultOfSplit(true);
10288 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10290 new_item.
SetQuantity(split_quantity_new,
false,
true);
10291 }
10292 }
10293 }
10294 else if (destination_entity && slot_id == -1)
10295 {
10296 if (quantity > stack_max)
10297 split_quantity_new = stack_max;
10298 else
10299 split_quantity_new = quantity;
10300
10302 {
10303 GameInventory destinationInventory = destination_entity.GetInventory();
10305 {
10308 }
10309
10310 if (new_item)
10311 {
10312 new_item.SetResultOfSplit(true);
10313 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10315 new_item.
SetQuantity(split_quantity_new,
false,
true);
10316 }
10317 }
10318 }
10319 else
10320 {
10321 if (stack_max != 0)
10322 {
10324 {
10326 }
10327
10329 {
10331
10332 if (new_item)
10333 {
10334 new_item.SetResultOfSplit(true);
10335 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10338 new_item.PlaceOnSurface();
10339 }
10340 }
10341 }
10342 }
10343 }
10344
10346 {
10348 {
10349 if (ScriptInputUserData.CanStoreInputUserData())
10350 {
10351 ScriptInputUserData ctx = new ScriptInputUserData;
10356 dst.WriteToContext(ctx);
10358 }
10359 }
10360 else if (!
g_Game.IsMultiplayer())
10361 {
10363 }
10364 }
10365
10367 {
10369 {
10370 if (ScriptInputUserData.CanStoreInputUserData())
10371 {
10372 ScriptInputUserData ctx = new ScriptInputUserData;
10377 ctx.
Write(destination_entity);
10383 }
10384 }
10385 else if (!
g_Game.IsMultiplayer())
10386 {
10388 }
10389 }
10390
10392 {
10394 }
10395
10397 {
10399 float split_quantity_new;
10401 if (dst.IsValid())
10402 {
10403 int slot_id = dst.GetSlot();
10405
10406 if (quantity > stack_max)
10407 split_quantity_new = stack_max;
10408 else
10409 split_quantity_new = quantity;
10410
10412 {
10414
10415 if (new_item)
10416 {
10417 new_item.SetResultOfSplit(true);
10418 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10420 new_item.
SetQuantity(split_quantity_new,
false,
true);
10421 }
10422
10423 return new_item;
10424 }
10425 }
10426
10427 return null;
10428 }
10429
10431 {
10433 float split_quantity_new;
10435 if (destination_entity)
10436 {
10438 if (quantity > stackable)
10439 split_quantity_new = stackable;
10440 else
10441 split_quantity_new = quantity;
10442
10444 {
10445 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10446 if (new_item)
10447 {
10448 new_item.SetResultOfSplit(true);
10449 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10451 new_item.
SetQuantity(split_quantity_new,
false,
true);
10452 }
10453 }
10454 }
10455 }
10456
10458 {
10460 {
10461 if (ScriptInputUserData.CanStoreInputUserData())
10462 {
10463 ScriptInputUserData ctx = new ScriptInputUserData;
10468 ItemBase destination_entity =
this;
10469 ctx.
Write(destination_entity);
10473 }
10474 }
10475 else if (!
g_Game.IsMultiplayer())
10476 {
10478 }
10479 }
10480
10482 {
10484 float split_quantity_new;
10486 if (player)
10487 {
10489 if (quantity > stackable)
10490 split_quantity_new = stackable;
10491 else
10492 split_quantity_new = quantity;
10493
10495 {
10496 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10497 new_item =
ItemBase.Cast(in_hands);
10498 if (new_item)
10499 {
10500 new_item.SetResultOfSplit(true);
10501 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10503 new_item.SetQuantity(split_quantity_new, false, true);
10504 }
10505 }
10506 }
10507 }
10508
10510 {
10512 float split_quantity_new = Math.Floor(quantity * 0.5);
10513
10515 return;
10516
10518
10519 if (new_item)
10520 {
10521 if (new_item.GetQuantityMax() < split_quantity_new)
10522 {
10523 split_quantity_new = new_item.GetQuantityMax();
10524 }
10525
10526 new_item.SetResultOfSplit(true);
10527 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10528
10530 {
10533 }
10534 else
10535 {
10537 new_item.
SetQuantity(split_quantity_new,
false,
true);
10538 }
10539 }
10540 }
10541
10543 {
10545 float split_quantity_new = Math.Floor(quantity / 2);
10546
10548 return;
10549
10550 InventoryLocation invloc = new InventoryLocation;
10552
10554 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10555
10556 if (new_item)
10557 {
10558 if (new_item.GetQuantityMax() < split_quantity_new)
10559 {
10560 split_quantity_new = new_item.GetQuantityMax();
10561 }
10563 {
10566 }
10567 else if (split_quantity_new > 1)
10568 {
10570 new_item.
SetQuantity(split_quantity_new,
false,
true);
10571 }
10572 }
10573 }
10574
10577 {
10578 SetWeightDirty();
10580
10581 if (parent)
10582 parent.OnAttachmentQuantityChangedEx(this, delta);
10583
10585 {
10587 {
10589 }
10591 {
10592 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10594 }
10595 }
10596 }
10597
10600 {
10601
10602 }
10603
10606 {
10608 }
10609
10611 {
10612 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10613
10615 {
10616 if (newLevel == GameConstants.STATE_RUINED)
10617 {
10619 EntityAI parent = GetHierarchyParent();
10620 if (parent && parent.IsFireplace())
10621 {
10622 CargoBase cargo = GetInventory().GetCargo();
10623 if (cargo)
10624 {
10626 {
10628 }
10629 }
10630 }
10631 }
10632
10634 {
10635
10637 return;
10638 }
10639
10640 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10641 {
10643 }
10644 }
10645 }
10646
10647
10649 {
10650 super.OnRightClick();
10651
10653 {
10655 {
10656 if (ScriptInputUserData.CanStoreInputUserData())
10657 {
10658 EntityAI root = GetHierarchyRoot();
10659 Man playerOwner = GetHierarchyRootPlayer();
10660 InventoryLocation dst = new InventoryLocation;
10661
10662
10663 if (!playerOwner && root && root == this)
10664 {
10666 }
10667 else
10668 {
10669
10670 GetInventory().GetCurrentInventoryLocation(dst);
10672 {
10673 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10675 {
10677 }
10678 else
10679 {
10681
10682
10683 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10684 {
10686 }
10687 else
10688 {
10689 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10690 }
10691 }
10692 }
10693 }
10694
10695 ScriptInputUserData ctx = new ScriptInputUserData;
10703 }
10704 }
10705 else if (!
g_Game.IsMultiplayer())
10706 {
10708 }
10709 }
10710 }
10711
10713 {
10714 if (root)
10715 {
10716 vector m4[4];
10717 root.GetTransform(m4);
10718 dst.SetGround(this, m4);
10719 }
10720 else
10721 {
10722 GetInventory().GetCurrentInventoryLocation(dst);
10723 }
10724 }
10725
10726 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10727 {
10728
10729 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10730 return false;
10731
10732 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10733 return false;
10734
10735
10737 return false;
10738
10739
10740 Magazine mag = Magazine.Cast(this);
10741 if (mag)
10742 {
10743 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10744 return false;
10745
10746 if (stack_max_limit)
10747 {
10748 Magazine other_mag = Magazine.Cast(other_item);
10749 if (other_item)
10750 {
10751 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10752 return false;
10753 }
10754
10755 }
10756 }
10757 else
10758 {
10759
10761 return false;
10762
10764 return false;
10765 }
10766
10767 PlayerBase player = null;
10768 if (CastTo(player, GetHierarchyRootPlayer()))
10769 {
10770 if (player.GetInventory().HasAttachment(this))
10771 return false;
10772
10773 if (player.IsItemsToDelete())
10774 return false;
10775 }
10776
10777 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10778 return false;
10779
10780 int slotID;
10782 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10783 return false;
10784
10785 return true;
10786 }
10787
10789 {
10791 }
10792
10794 {
10795 return m_IsResultOfSplit;
10796 }
10797
10799 {
10800 m_IsResultOfSplit = value;
10801 }
10802
10804 {
10806 }
10807
10809 {
10810 float other_item_quantity = other_item.GetQuantity();
10811 float this_free_space;
10812
10814
10816
10817 if (other_item_quantity > this_free_space)
10818 {
10819 return this_free_space;
10820 }
10821 else
10822 {
10823 return other_item_quantity;
10824 }
10825 }
10826
10828 {
10830 }
10831
10833 {
10835 return;
10836
10837 if (!IsMagazine() && other_item)
10838 {
10840 if (quantity_used != 0)
10841 {
10842 float hp1 = GetHealth01("","");
10843 float hp2 = other_item.GetHealth01("","");
10844 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10845 hpResult = hpResult / (
GetQuantity() + quantity_used);
10846
10847 hpResult *= GetMaxHealth();
10848 Math.Round(hpResult);
10849 SetHealth("", "Health", hpResult);
10850
10852 other_item.AddQuantity(-quantity_used);
10853 }
10854 }
10856 }
10857
10859 {
10860 #ifdef SERVER
10861 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10862 GetHierarchyParent().IncreaseLifetimeUp();
10863 #endif
10864 };
10865
10867 {
10868 PlayerBase p = PlayerBase.Cast(player);
10869
10870 array<int> recipesIds = p.m_Recipes;
10871 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10872 if (moduleRecipesManager)
10873 {
10874 EntityAI itemInHands = player.GetEntityInHands();
10875 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10876 }
10877
10878 for (int i = 0;i < recipesIds.Count(); i++)
10879 {
10880 int key = recipesIds.Get(i);
10881 string recipeName = moduleRecipesManager.GetRecipeName(key);
10883 }
10884 }
10885
10886
10887 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10888 {
10889 super.GetDebugActions(outputList);
10890
10891
10897
10898
10903
10908
10909
10913
10914
10916 {
10920 }
10921
10924
10925
10929
10931
10932 InventoryLocation loc = new InventoryLocation();
10933 GetInventory().GetCurrentInventoryLocation(loc);
10935 {
10936 if (Gizmo_IsSupported())
10939 }
10940
10942 }
10943
10944
10945
10946
10948 {
10949 super.OnAction(action_id, player, ctx);
10950
10952 {
10953 switch (action_id)
10954 {
10958 return true;
10962 return true;
10963 }
10964 }
10965
10967 {
10968 switch (action_id)
10969 {
10971 Delete();
10972 return true;
10973 }
10974 }
10975
10976 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10977 {
10978 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10979 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10980 PlayerBase p = PlayerBase.Cast(player);
10981 if (
EActions.RECIPES_RANGE_START < 1000)
10982 {
10983 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10984 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10985 }
10986 }
10987 #ifndef SERVER
10988 else if (action_id ==
EActions.WATCH_PLAYER)
10989 {
10990 PluginDeveloper.SetDeveloperItemClientEx(player);
10991 }
10992 #endif
10994 {
10995 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10996 {
10997 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10998 OnDebugButtonPressServer(id + 1);
10999 }
11000
11001 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11002 {
11003 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11005 }
11006
11007 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11008 {
11009 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11011 }
11012
11013 else if (action_id ==
EActions.ADD_QUANTITY)
11014 {
11015 if (IsMagazine())
11016 {
11017 Magazine mag = Magazine.Cast(this);
11018 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11019 }
11020 else
11021 {
11023 }
11024
11025 if (m_EM)
11026 {
11027 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11028 }
11029
11030 }
11031
11032 else if (action_id ==
EActions.REMOVE_QUANTITY)
11033 {
11034 if (IsMagazine())
11035 {
11036 Magazine mag2 = Magazine.Cast(this);
11037 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11038 }
11039 else
11040 {
11042 }
11043 if (m_EM)
11044 {
11045 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11046 }
11047
11048 }
11049
11050 else if (action_id ==
EActions.SET_QUANTITY_0)
11051 {
11053
11054 if (m_EM)
11055 {
11056 m_EM.SetEnergy(0);
11057 }
11058 }
11059
11060 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11061 {
11063
11064 if (m_EM)
11065 {
11066 m_EM.SetEnergy(m_EM.GetEnergyMax());
11067 }
11068 }
11069
11070 else if (action_id ==
EActions.ADD_HEALTH)
11071 {
11072 AddHealth("","",GetMaxHealth("","Health")/5);
11073 }
11074 else if (action_id ==
EActions.REMOVE_HEALTH)
11075 {
11076 AddHealth("","",-GetMaxHealth("","Health")/5);
11077 }
11078 else if (action_id ==
EActions.DESTROY_HEALTH)
11079 {
11080 SetHealth01("","",0);
11081 }
11082 else if (action_id ==
EActions.WATCH_ITEM)
11083 {
11085 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11086 #ifdef DEVELOPER
11087 SetDebugDeveloper_item(this);
11088 #endif
11089 }
11090
11091 else if (action_id ==
EActions.ADD_TEMPERATURE)
11092 {
11093 AddTemperature(20);
11094
11095 }
11096
11097 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11098 {
11099 AddTemperature(-20);
11100
11101 }
11102
11103 else if (action_id ==
EActions.FLIP_FROZEN)
11104 {
11105 SetFrozen(!GetIsFrozen());
11106
11107 }
11108
11109 else if (action_id ==
EActions.ADD_WETNESS)
11110 {
11112
11113 }
11114
11115 else if (action_id ==
EActions.REMOVE_WETNESS)
11116 {
11118
11119 }
11120
11121 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11122 {
11125
11126
11127 }
11128
11129 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11130 {
11133 }
11134
11135 else if (action_id ==
EActions.MAKE_SPECIAL)
11136 {
11137 auto debugParams = DebugSpawnParams.WithPlayer(player);
11138 OnDebugSpawnEx(debugParams);
11139 }
11140
11141 }
11142
11143
11144 return false;
11145 }
11146
11147
11148
11149
11153
11156
11157
11158
11160 {
11161 return false;
11162 }
11163
11164
11166 {
11167 return true;
11168 }
11169
11170
11172 {
11173 return true;
11174 }
11175
11176
11177
11179 {
11180 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11181 return g_Game.ConfigIsExisting(config_path);
11182 }
11183
11186 {
11187 return null;
11188 }
11189
11191 {
11192 return false;
11193 }
11194
11196 {
11197 return false;
11198 }
11199
11203
11204
11206 {
11207 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11208 return module_repairing.CanRepair(this, item_repair_kit);
11209 }
11210
11211
11212 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11213 {
11214 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11215 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11216 }
11217
11218
11220 {
11221
11222
11223
11224
11225
11226
11227
11228
11229 return 1;
11230 }
11231
11232
11233
11235 {
11237 }
11238
11239
11240
11242 {
11244 }
11245
11246
11255 {
11256 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11257
11258 if (player)
11259 {
11260 player.MessageStatus(text);
11261 }
11262 }
11263
11264
11273 {
11274 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11275
11276 if (player)
11277 {
11278 player.MessageAction(text);
11279 }
11280 }
11281
11282
11291 {
11292 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11293
11294 if (player)
11295 {
11296 player.MessageFriendly(text);
11297 }
11298 }
11299
11300
11309 {
11310 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11311
11312 if (player)
11313 {
11314 player.MessageImportant(text);
11315 }
11316 }
11317
11319 {
11320 return true;
11321 }
11322
11323
11324 override bool KindOf(
string tag)
11325 {
11326 bool found = false;
11327 string item_name = this.
GetType();
11329 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11330
11331 int array_size = item_tag_array.Count();
11332 for (int i = 0; i < array_size; i++)
11333 {
11334 if (item_tag_array.Get(i) == tag)
11335 {
11336 found = true;
11337 break;
11338 }
11339 }
11340 return found;
11341 }
11342
11343
11345 {
11346
11347 super.OnRPC(sender, rpc_type,ctx);
11348
11349
11350 switch (rpc_type)
11351 {
11352 #ifndef SERVER
11353 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11354 Param2<bool, string> p = new Param2<bool, string>(false, "");
11355
11357 return;
11358
11359 bool play = p.param1;
11360 string soundSet = p.param2;
11361
11362 if (play)
11363 {
11365 {
11367 {
11369 }
11370 }
11371 else
11372 {
11374 }
11375 }
11376 else
11377 {
11379 }
11380
11381 break;
11382 #endif
11383
11384 }
11385
11387 {
11389 }
11390 }
11391
11392
11393
11394
11396 {
11397 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11398 return plugin.GetID(
name);
11399 }
11400
11402 {
11403 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11404 return plugin.GetName(id);
11405 }
11406
11409 {
11410
11411
11412 int varFlags;
11413 if (!ctx.
Read(varFlags))
11414 return;
11415
11416 if (varFlags & ItemVariableFlags.FLOAT)
11417 {
11419 }
11420 }
11421
11423 {
11424
11425 super.SerializeNumericalVars(floats_out);
11426
11427
11428
11430 {
11432 }
11433
11435 {
11437 }
11438
11440 {
11442 }
11443
11445 {
11450 }
11451
11453 {
11455 }
11456 }
11457
11459 {
11460
11461 super.DeSerializeNumericalVars(floats);
11462
11463
11464 int index = 0;
11465 int mask = Math.Round(floats.Get(index));
11466
11467 index++;
11468
11470 {
11472 {
11474 }
11475 else
11476 {
11477 float quantity = floats.Get(index);
11478 SetQuantity(quantity,
true,
false,
false,
false);
11479 }
11480 index++;
11481 }
11482
11484 {
11485 float wet = floats.Get(index);
11487 index++;
11488 }
11489
11491 {
11492 int liquidtype = Math.Round(floats.Get(index));
11494 index++;
11495 }
11496
11498 {
11500 index++;
11502 index++;
11504 index++;
11506 index++;
11507 }
11508
11510 {
11511 int cleanness = Math.Round(floats.Get(index));
11513 index++;
11514 }
11515 }
11516
11518 {
11519 super.WriteVarsToCTX(ctx);
11520
11521
11523 {
11525 }
11526
11528 {
11530 }
11531
11533 {
11535 }
11536
11538 {
11539 int r,g,b,a;
11545 }
11546
11548 {
11550 }
11551 }
11552
11554 {
11555 if (!super.ReadVarsFromCTX(ctx,version))
11556 return false;
11557
11558 int intValue;
11559 float value;
11560
11561 if (version < 140)
11562 {
11563 if (!ctx.
Read(intValue))
11564 return false;
11565
11566 m_VariablesMask = intValue;
11567 }
11568
11570 {
11571 if (!ctx.
Read(value))
11572 return false;
11573
11575 {
11577 }
11578 else
11579 {
11581 }
11582 }
11583
11584 if (version < 140)
11585 {
11587 {
11588 if (!ctx.
Read(value))
11589 return false;
11590 SetTemperatureDirect(value);
11591 }
11592 }
11593
11595 {
11596 if (!ctx.
Read(value))
11597 return false;
11599 }
11600
11602 {
11603 if (!ctx.
Read(intValue))
11604 return false;
11606 }
11607
11609 {
11610 int r,g,b,a;
11612 return false;
11614 return false;
11616 return false;
11618 return false;
11619
11621 }
11622
11624 {
11625 if (!ctx.
Read(intValue))
11626 return false;
11628 }
11629
11630 if (version >= 138 && version < 140)
11631 {
11633 {
11634 if (!ctx.
Read(intValue))
11635 return false;
11636 SetFrozen(intValue);
11637 }
11638 }
11639
11640 return true;
11641 }
11642
11643
11645 {
11648 {
11650 }
11651
11652 if (!super.OnStoreLoad(ctx, version))
11653 {
11655 return false;
11656 }
11657
11658 if (version >= 114)
11659 {
11660 bool hasQuickBarIndexSaved;
11661
11662 if (!ctx.
Read(hasQuickBarIndexSaved))
11663 {
11665 return false;
11666 }
11667
11668 if (hasQuickBarIndexSaved)
11669 {
11670 int itmQBIndex;
11671
11672
11673 if (!ctx.
Read(itmQBIndex))
11674 {
11676 return false;
11677 }
11678
11679 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11680 if (itmQBIndex != -1 && parentPlayer)
11681 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11682 }
11683 }
11684 else
11685 {
11686
11687 PlayerBase player;
11688 int itemQBIndex;
11689 if (version ==
int.
MAX)
11690 {
11691 if (!ctx.
Read(itemQBIndex))
11692 {
11694 return false;
11695 }
11696 }
11697 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11698 {
11699
11700 if (!ctx.
Read(itemQBIndex))
11701 {
11703 return false;
11704 }
11705 if (itemQBIndex != -1 && player)
11706 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11707 }
11708 }
11709
11710 if (version < 140)
11711 {
11712
11713 if (!LoadVariables(ctx, version))
11714 {
11716 return false;
11717 }
11718 }
11719
11720
11722 {
11724 return false;
11725 }
11726 if (version >= 132)
11727 {
11729 if (raib)
11730 {
11732 {
11734 return false;
11735 }
11736 }
11737 }
11738
11740 return true;
11741 }
11742
11743
11744
11746 {
11747 super.OnStoreSave(ctx);
11748
11749 PlayerBase player;
11750 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11751 {
11753
11754 int itemQBIndex = -1;
11755 itemQBIndex = player.FindQuickBarEntityIndex(this);
11756 ctx.
Write(itemQBIndex);
11757 }
11758 else
11759 {
11761 }
11762
11764
11766 if (raib)
11767 {
11769 }
11770 }
11771
11772
11774 {
11775 super.AfterStoreLoad();
11776
11778 {
11780 }
11781
11783 {
11786 }
11787 }
11788
11790 {
11791 super.EEOnAfterLoad();
11792
11794 {
11796 }
11797
11800 }
11801
11803 {
11804 return false;
11805 }
11806
11807
11808
11810 {
11812 {
11813 #ifdef PLATFORM_CONSOLE
11814
11816 {
11818 if (menu)
11819 {
11821 }
11822 }
11823 #endif
11824 }
11825
11827 {
11830 }
11831
11833 {
11834 SetWeightDirty();
11836 }
11838 {
11841 }
11842
11844 {
11847
11850 }
11852 {
11856 }
11857
11858 super.OnVariablesSynchronized();
11859 }
11860
11861
11862
11864 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11865 {
11866 if (!IsServerCheck(allow_client))
11867 return false;
11868
11870 return false;
11871
11874
11875 if (value <= (min + 0.001))
11876 value = min;
11877
11878 if (value == min)
11879 {
11880 if (destroy_config)
11881 {
11882 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11883 if (dstr)
11884 {
11886 this.Delete();
11887 return true;
11888 }
11889 }
11890 else if (destroy_forced)
11891 {
11893 this.Delete();
11894 return true;
11895 }
11896
11898 }
11899
11902
11904 {
11905 EntityAI parent = GetHierarchyRoot();
11906 InventoryLocation iLoc = new InventoryLocation();
11907 GetInventory().GetCurrentInventoryLocation(iLoc);
11909 {
11910 int iLocSlot = iLoc.
GetSlot();
11912 {
11914 }
11916 {
11918 }
11919 }
11920 }
11921
11923 {
11925
11926 if (delta)
11928 }
11929
11931
11932 return false;
11933 }
11934
11935
11937 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11938 {
11940 }
11941
11943 {
11946 }
11947
11949 {
11952 }
11953
11955 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11956 {
11957 float value_clamped = Math.Clamp(value, 0, 1);
11959 SetQuantity(result, destroy_config, destroy_forced);
11960 }
11961
11962
11965 {
11967 }
11968
11970 {
11972 }
11973
11974
11975
11976
11977
11978
11979
11980
11981
11982
11984 {
11985 int slot = -1;
11986 GameInventory inventory = GetInventory();
11987 if (inventory)
11988 {
11989 InventoryLocation il = new InventoryLocation;
11992 }
11993
11995 }
11996
11998 {
11999 float quantity_max = 0;
12000
12002 {
12003 if (attSlotID != -1)
12004 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12005
12006 if (quantity_max <= 0)
12008 }
12009
12010 if (quantity_max <= 0)
12012
12013 return quantity_max;
12014 }
12015
12017 {
12019 }
12020
12022 {
12024 }
12025
12026
12028 {
12030 }
12031
12033 {
12035 }
12036
12038 {
12040 }
12041
12042
12044 {
12045
12046 float weightEx = GetWeightEx();
12047 float special = GetInventoryAndCargoWeight();
12048 return weightEx - special;
12049 }
12050
12051
12053 {
12055 }
12056
12058 {
12060 {
12061 #ifdef DEVELOPER
12062 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12063 {
12064 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12066 }
12067 #endif
12068
12069 return GetQuantity() * GetConfigWeightModified();
12070 }
12071 else if (HasEnergyManager())
12072 {
12073 #ifdef DEVELOPER
12074 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12075 {
12076 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12077 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12078 }
12079 #endif
12080 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12081 }
12082 else
12083 {
12084 #ifdef DEVELOPER
12085 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12086 {
12087 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12088 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12089 }
12090 #endif
12091 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12092 }
12093 }
12094
12097 {
12098 int item_count = 0;
12100
12101 GameInventory inventory = GetInventory();
12102 CargoBase cargo = inventory.
GetCargo();
12103 if (cargo != NULL)
12104 {
12106 }
12107
12109 for (int i = 0; i < nAttachments; ++i)
12110 {
12112 if (item)
12113 item_count += item.GetNumberOfItems();
12114 }
12115 return item_count;
12116 }
12117
12120 {
12121 float weight = 0;
12122 float wetness = 1;
12123 if (include_wetness)
12126 {
12127 weight = wetness * m_ConfigWeight;
12128 }
12130 {
12131 weight = 1;
12132 }
12133 return weight;
12134 }
12135
12136
12137
12139 {
12140 GameInventory inventory = GetInventory();
12141 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12142 {
12143 array<EntityAI> items = new array<EntityAI>;
12145 for (int i = 0; i < items.Count(); ++i)
12146 {
12148 if (item)
12149 {
12150 g_Game.ObjectDelete(item);
12151 }
12152 }
12153 }
12154 }
12155
12156
12157
12158
12160 {
12161 float energy = 0;
12162 if (HasEnergyManager())
12163 {
12164 energy = GetCompEM().GetEnergy();
12165 }
12166 return energy;
12167 }
12168
12169
12171 {
12172 super.OnEnergyConsumed();
12173
12175 }
12176
12178 {
12179 super.OnEnergyAdded();
12180
12182 }
12183
12184
12186 {
12187 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12188 {
12190 {
12191 float energy_0to1 = GetCompEM().GetEnergy0To1();
12193 }
12194 }
12195 }
12196
12197
12199 {
12200 return ConfigGetFloat("heatIsolation");
12201 }
12202
12204 {
12206 }
12207
12209 {
12210 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12211 if (
g_Game.ConfigIsExisting(paramPath))
12212 return g_Game.ConfigGetFloat(paramPath);
12213
12214 return 0.0;
12215 }
12216
12218 {
12219 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12220 if (
g_Game.ConfigIsExisting(paramPath))
12221 return g_Game.ConfigGetFloat(paramPath);
12222
12223 return 0.0;
12224 }
12225
12226 override void SetWet(
float value,
bool allow_client =
false)
12227 {
12228 if (!IsServerCheck(allow_client))
12229 return;
12230
12233
12235
12236 m_VarWet = Math.Clamp(value, min, max);
12237
12239 {
12242 }
12243 }
12244
12245 override void AddWet(
float value)
12246 {
12248 }
12249
12251 {
12253 }
12254
12256 {
12258 }
12259
12261 {
12263 }
12264
12266 {
12268 }
12269
12271 {
12273 }
12274
12275 override void OnWetChanged(
float newVal,
float oldVal)
12276 {
12279 if (newLevel != oldLevel)
12280 {
12282 }
12283 }
12284
12286 {
12287 SetWeightDirty();
12288 }
12289
12291 {
12292 return GetWetLevelInternal(
m_VarWet);
12293 }
12294
12295
12296
12298 {
12300 }
12301
12303 {
12305 }
12306
12308 {
12310 }
12311
12313 {
12315 }
12316
12317
12318
12320 {
12321 if (ConfigIsExisting("itemModelLength"))
12322 {
12323 return ConfigGetFloat("itemModelLength");
12324 }
12325 return 0;
12326 }
12327
12329 {
12330 if (ConfigIsExisting("itemAttachOffset"))
12331 {
12332 return ConfigGetFloat("itemAttachOffset");
12333 }
12334 return 0;
12335 }
12336
12337 override void SetCleanness(
int value,
bool allow_client =
false)
12338 {
12339 if (!IsServerCheck(allow_client))
12340 return;
12341
12343
12345
12348 }
12349
12351 {
12353 }
12354
12356 {
12357 return true;
12358 }
12359
12360
12361
12362
12364 {
12366 }
12367
12369 {
12371 }
12372
12373
12374
12375
12376 override void SetColor(
int r,
int g,
int b,
int a)
12377 {
12383 }
12385 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12386 {
12391 }
12392
12394 {
12396 }
12397
12400 {
12401 int r,g,b,a;
12403 r = r/255;
12404 g = g/255;
12405 b = b/255;
12406 a = a/255;
12407 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12408 }
12409
12410
12411
12412 override void SetLiquidType(
int value,
bool allow_client =
false)
12413 {
12414 if (!IsServerCheck(allow_client))
12415 return;
12416
12421 }
12422
12424 {
12425 return ConfigGetInt("varLiquidTypeInit");
12426 }
12427
12429 {
12431 }
12432
12434 {
12436 SetFrozen(false);
12437 }
12438
12441 {
12442 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12443 }
12444
12445
12448 {
12449 PlayerBase nplayer;
12450 if (PlayerBase.CastTo(nplayer, player))
12451 {
12453 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12454 }
12455 }
12456
12457
12460 {
12461 PlayerBase nplayer;
12462 if (PlayerBase.CastTo(nplayer,player))
12463 {
12464 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12465 }
12466
12467 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12468
12469 if (HasEnergyManager())
12470 {
12471 GetCompEM().UpdatePlugState();
12472 }
12473 }
12474
12475
12477 {
12478 super.OnPlacementStarted(player);
12479
12481 }
12482
12483 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12484 {
12486 {
12487 m_AdminLog.OnPlacementComplete(player,
this);
12488 }
12489
12490 super.OnPlacementComplete(player, position, orientation);
12491 }
12492
12493
12494
12495
12496
12498 {
12500 {
12501 return true;
12502 }
12503 else
12504 {
12505 return false;
12506 }
12507 }
12508
12509
12511 {
12513 {
12515 }
12516 }
12517
12518
12520 {
12522 }
12523
12525 {
12527 }
12528
12529 override void InsertAgent(
int agent,
float count = 1)
12530 {
12531 if (count < 1)
12532 return;
12533
12535 }
12536
12539 {
12541 }
12542
12543
12545 {
12547 }
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12588
12589
12591 {
12593 return false;
12594 return true;
12595 }
12596
12598 {
12599
12601 }
12602
12603
12606 {
12607 super.CheckForRoofLimited(timeTresholdMS);
12608
12609 float time =
g_Game.GetTime();
12610 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12611 {
12612 m_PreviousRoofTestTime = time;
12613 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12614 }
12615 }
12616
12617
12619 {
12621 {
12622 return 0;
12623 }
12624
12625 if (GetInventory().GetAttachmentSlotsCount() != 0)
12626 {
12627 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12628 if (filter)
12629 return filter.GetProtectionLevel(type, false, system);
12630 else
12631 return 0;
12632 }
12633
12634 string subclassPath, entryName;
12635
12636 switch (type)
12637 {
12639 entryName = "biological";
12640 break;
12642 entryName = "chemical";
12643 break;
12644 default:
12645 entryName = "biological";
12646 break;
12647 }
12648
12649 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12650
12651 return g_Game.ConfigGetFloat(subclassPath + entryName);
12652 }
12653
12654
12655
12658 {
12659 if (!IsMagazine())
12661
12663 }
12664
12665
12666
12667
12668
12673 {
12674 return true;
12675 }
12676
12678 {
12680 }
12681
12682
12683
12684
12685
12687 {
12688 if (parent)
12689 {
12690 if (parent.IsInherited(DayZInfected))
12691 return true;
12692
12693 if (!parent.IsRuined())
12694 return true;
12695 }
12696
12697 return true;
12698 }
12699
12701 {
12702 if (!super.CanPutAsAttachment(parent))
12703 {
12704 return false;
12705 }
12706
12707 if (!IsRuined() && !parent.IsRuined())
12708 {
12709 return true;
12710 }
12711
12712 return false;
12713 }
12714
12716 {
12717
12718
12719
12720
12721 return super.CanReceiveItemIntoCargo(item);
12722 }
12723
12725 {
12726
12727
12728
12729
12730 GameInventory attachmentInv = attachment.GetInventory();
12732 {
12733 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12734 return false;
12735 }
12736
12737 InventoryLocation loc = new InventoryLocation();
12738 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12739 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12740 return false;
12741
12742 return super.CanReceiveAttachment(attachment, slotId);
12743 }
12744
12746 {
12747 if (!super.CanReleaseAttachment(attachment))
12748 return false;
12749
12750 return GetInventory().AreChildrenAccessible();
12751 }
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12771
12772
12774 {
12775 int id = muzzle_owner.GetMuzzleID();
12776 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12777
12778 if (WPOF_array)
12779 {
12780 for (int i = 0; i < WPOF_array.Count(); i++)
12781 {
12782 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12783
12784 if (WPOF)
12785 {
12786 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12787 }
12788 }
12789 }
12790 }
12791
12792
12794 {
12795 int id = muzzle_owner.GetMuzzleID();
12797
12798 if (WPOBE_array)
12799 {
12800 for (int i = 0; i < WPOBE_array.Count(); i++)
12801 {
12802 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12803
12804 if (WPOBE)
12805 {
12806 WPOBE.OnActivate(weapon, 0, 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.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12827 }
12828 }
12829 }
12830 }
12831
12832
12834 {
12835 int id = muzzle_owner.GetMuzzleID();
12836 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12837
12838 if (WPOOH_array)
12839 {
12840 for (int i = 0; i < WPOOH_array.Count(); i++)
12841 {
12842 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12843
12844 if (WPOOH)
12845 {
12846 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12847 }
12848 }
12849 }
12850 }
12851
12852
12854 {
12855 int id = muzzle_owner.GetMuzzleID();
12856 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12857
12858 if (WPOOH_array)
12859 {
12860 for (int i = 0; i < WPOOH_array.Count(); i++)
12861 {
12862 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12863
12864 if (WPOOH)
12865 {
12866 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12867 }
12868 }
12869 }
12870 }
12871
12872
12873
12875 {
12877 {
12878 return true;
12879 }
12880
12881 return false;
12882 }
12883
12885 {
12887 {
12888 return true;
12889 }
12890
12891 return false;
12892 }
12893
12895 {
12897 {
12898 return true;
12899 }
12900
12901 return false;
12902 }
12903
12905 {
12906 return false;
12907 }
12908
12911 {
12912 return UATimeSpent.DEFAULT_DEPLOY;
12913 }
12914
12915
12916
12917
12919 {
12921 SetSynchDirty();
12922 }
12923
12925 {
12927 }
12928
12929
12931 {
12932 return false;
12933 }
12934
12937 {
12938 string att_type = "None";
12939
12940 if (ConfigIsExisting("soundAttType"))
12941 {
12942 att_type = ConfigGetString("soundAttType");
12943 }
12944
12946 }
12947
12949 {
12951 }
12952
12953
12954
12955
12956
12962
12964 {
12967
12969 }
12970
12971
12973 {
12975 return;
12976
12978
12981
12984
12985 SoundParameters params = new SoundParameters();
12989 }
12990
12991
12993 {
12995 {
12998
12999 SetSynchDirty();
13000
13003 }
13004 }
13005
13007 {
13009 }
13010
13011
13013 {
13015 return;
13016
13018 SetSynchDirty();
13019
13022 }
13023
13025 {
13028 }
13029
13031 {
13033 }
13034
13035 void OnApply(PlayerBase player);
13036
13038 {
13039 return 1.0;
13040 };
13041
13043 {
13045 }
13046
13048 {
13050 }
13051
13053
13055 {
13056 SetDynamicPhysicsLifeTime(0.01);
13058 }
13059
13061 {
13062 array<string> zone_names = new array<string>;
13063 GetDamageZones(zone_names);
13064 for (int i = 0; i < zone_names.Count(); i++)
13065 {
13066 SetHealthMax(zone_names.Get(i),"Health");
13067 }
13068 SetHealthMax("","Health");
13069 }
13070
13073 {
13074 float global_health = GetHealth01("","Health");
13075 array<string> zones = new array<string>;
13076 GetDamageZones(zones);
13077
13078 for (int i = 0; i < zones.Count(); i++)
13079 {
13080 SetHealth01(zones.Get(i),"Health",global_health);
13081 }
13082 }
13083
13086 {
13087 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13088 }
13089
13091 {
13092 if (!hasRootAsPlayer)
13093 {
13094 if (refParentIB)
13095 {
13096
13097 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13098 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13099
13100 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13101 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13102
13105 }
13106 else
13107 {
13108
13111 }
13112 }
13113 }
13114
13116 {
13118 {
13119 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13120 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13121 {
13122 float heatPermCoef = 1.0;
13124 while (ent)
13125 {
13126 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13127 ent = ent.GetHierarchyParent();
13128 }
13129
13130 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13131 }
13132 }
13133 }
13134
13136 {
13137
13138 EntityAI parent = GetHierarchyParent();
13139 if (!parent)
13140 {
13141 hasParent = false;
13142 hasRootAsPlayer = false;
13143 }
13144 else
13145 {
13146 hasParent = true;
13147 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13148 refParentIB =
ItemBase.Cast(parent);
13149 }
13150 }
13151
13152 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13153 {
13154
13155 }
13156
13158 {
13159
13160 return false;
13161 }
13162
13164 {
13165
13166
13167 return false;
13168 }
13169
13171 {
13172
13173 return false;
13174 }
13175
13178 {
13179 return !GetIsFrozen() &&
IsOpen();
13180 }
13181
13183 {
13184 bool hasParent = false, hasRootAsPlayer = false;
13186
13187 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13188 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13189
13190 if (wwtu || foodDecay)
13191 {
13195
13196 if (processWetness || processTemperature || processDecay)
13197 {
13199
13200 if (processWetness)
13201 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13202
13203 if (processTemperature)
13205
13206 if (processDecay)
13207 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13208 }
13209 }
13210 }
13211
13214 {
13216 }
13217
13219 {
13222
13223 return super.GetTemperatureFreezeThreshold();
13224 }
13225
13227 {
13230
13231 return super.GetTemperatureThawThreshold();
13232 }
13233
13235 {
13238
13239 return super.GetItemOverheatThreshold();
13240 }
13241
13243 {
13245 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13246
13247 return super.GetTemperatureFreezeTime();
13248 }
13249
13251 {
13253 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13254
13255 return super.GetTemperatureThawTime();
13256 }
13257
13262
13264 {
13265 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13266 }
13267
13269 {
13270 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13271 }
13272
13275 {
13277 }
13278
13280 {
13282 }
13283
13285 {
13287 }
13288
13291 {
13292 return null;
13293 }
13294
13297 {
13298 return false;
13299 }
13300
13302 {
13304 {
13307 if (!trg)
13308 {
13310 explosive = this;
13311 }
13312
13313 explosive.PairRemote(trg);
13315
13316 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13317 trg.SetPersistentPairID(persistentID);
13318 explosive.SetPersistentPairID(persistentID);
13319
13320 return true;
13321 }
13322 return false;
13323 }
13324
13327 {
13328 float ret = 1.0;
13331 ret *= GetHealth01();
13332
13333 return ret;
13334 }
13335
13336 #ifdef DEVELOPER
13337 override void SetDebugItem()
13338 {
13339 super.SetDebugItem();
13340 _itemBase = this;
13341 }
13342
13344 {
13345 string text = super.GetDebugText();
13346
13348 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13349
13350 return text;
13351 }
13352 #endif
13353
13355 {
13356 return true;
13357 }
13358
13360
13362
13364 {
13367 }
13368
13369
13377
13393
13394 [
Obsolete(
"Use ItemSoundHandler instead")]
13397 {
13398 if (!
g_Game.IsDedicatedServer())
13399 {
13400 if (ConfigIsExisting("attachSoundSet"))
13401 {
13402 string cfg_path = "";
13403 string soundset = "";
13404 string type_name =
GetType();
13405
13408 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13409 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13410
13411 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13412 {
13413 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13414 {
13415 if (cfg_slot_array[i] == slot_type)
13416 {
13417 soundset = cfg_soundset_array[i];
13418 break;
13419 }
13420 }
13421 }
13422
13423 if (soundset != "")
13424 {
13425 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13427 }
13428 }
13429 }
13430 }
13431
13433}
13434
13436{
13438 if (entity)
13439 {
13440 bool is_item = entity.IsInherited(
ItemBase);
13441 if (is_item && full_quantity)
13442 {
13445 }
13446 }
13447 else
13448 {
13450 return NULL;
13451 }
13452 return entity;
13453}
13454
13456{
13457 if (item)
13458 {
13459 if (health > 0)
13460 item.SetHealth("", "", health);
13461
13462 if (item.CanHaveTemperature())
13463 {
13465 if (item.CanFreeze())
13466 item.SetFrozen(false);
13467 }
13468
13469 if (item.HasEnergyManager())
13470 {
13471 if (quantity >= 0)
13472 {
13473 item.GetCompEM().SetEnergy0To1(quantity);
13474 }
13475 else
13476 {
13478 }
13479 }
13480 else if (item.IsMagazine())
13481 {
13482 Magazine mag = Magazine.Cast(item);
13483 if (quantity >= 0)
13484 {
13485 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13486 }
13487 else
13488 {
13490 }
13491
13492 }
13493 else
13494 {
13495 if (quantity >= 0)
13496 {
13497 item.SetQuantityNormalized(quantity, false);
13498 }
13499 else
13500 {
13502 }
13503
13504 }
13505 }
13506}
13507
13508#ifdef DEVELOPER
13510#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.