8548{
8550 {
8551 return true;
8552 }
8553};
8554
8556{
8557
8558};
8559
8560
8561
8563{
8567
8569
8572
8573
8574
8575
8576
8585
8591
8596
8601
8622 protected bool m_IsResultOfSplit
8623
8625
8630
8631
8632
8634
8638
8639
8640
8642
8645
8646
8647
8653
8654
8662
8665
8666
8668
8669
8671
8672
8677
8678
8683
8685
8686
8688
8689
8691 {
8696
8697 if (!
g_Game.IsDedicatedServer())
8698 {
8700 {
8702
8704 {
8706 }
8707 }
8708
8711 }
8712
8713 m_OldLocation = null;
8714
8716 {
8718 }
8719
8720 if (ConfigIsExisting("headSelectionsToHide"))
8721 {
8724 }
8725
8727 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8728 {
8730 }
8731
8733
8734 m_IsResultOfSplit = false;
8735
8737 }
8738
8740 {
8741 super.InitItemVariables();
8742
8748 m_Count = ConfigGetInt(
"count");
8749
8752
8757
8760
8765
8777
8781
8782
8785 if (ConfigIsExisting("canBeSplit"))
8786 {
8789 }
8790
8792 if (ConfigIsExisting("itemBehaviour"))
8794
8795
8798 RegisterNetSyncVariableInt("m_VarLiquidType");
8799 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8800
8801 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8802 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8803 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8804
8805 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8806 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8807 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8808 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8809
8810 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8811 RegisterNetSyncVariableBool("m_IsTakeable");
8812 RegisterNetSyncVariableBool("m_IsHologram");
8813
8816 {
8819 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8820 }
8821
8823
8825 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8827
8829 }
8830
8832 {
8834 }
8835
8837 {
8840 {
8845 }
8846 }
8847
8848 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8849 {
8851 {
8854 }
8855
8857 }
8858
8860 {
8866 }
8867
8869
8871 {
8873
8874 if (!action)
8875 {
8876 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8877 return;
8878 }
8879
8881 if (!ai)
8882 {
8884 return;
8885 }
8886
8888 if (!action_array)
8889 {
8890 action_array = new array<ActionBase_Basic>;
8892 }
8893 if (LogManager.IsActionLogEnable())
8894 {
8895 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8896 }
8897
8898 if (action_array.Find(action) != -1)
8899 {
8900 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8901 }
8902 else
8903 {
8904 action_array.Insert(action);
8905 }
8906 }
8907
8909 {
8910 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8911 ActionBase action = player.GetActionManager().GetAction(actionName);
8914
8915 if (action_array)
8916 {
8917 action_array.RemoveItem(action);
8918 }
8919 }
8920
8921
8922
8924 {
8925 ActionOverrideData overrideData = new ActionOverrideData();
8929
8931 if (!actionMap)
8932 {
8935 }
8936
8937 actionMap.Insert(this.
Type(), overrideData);
8938
8939 }
8940
8942
8944
8945
8947 {
8950
8953
8954 string config_to_search = "CfgVehicles";
8955 string muzzle_owner_config;
8956
8958 {
8959 if (IsInherited(Weapon))
8960 config_to_search = "CfgWeapons";
8961
8962 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8963
8964 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8965
8966 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8967
8968 if (config_OnFire_subclass_count > 0)
8969 {
8970 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8971
8972 for (int i = 0; i < config_OnFire_subclass_count; i++)
8973 {
8974 string particle_class = "";
8975 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8976 string config_OnFire_entry = config_OnFire_class + particle_class;
8977 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8978 WPOF_array.Insert(WPOF);
8979 }
8980
8981
8983 }
8984 }
8985
8987 {
8988 config_to_search = "CfgWeapons";
8989 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8990
8991 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8992
8993 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8994
8995 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8996 {
8997 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8998
8999 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9000 {
9001 string particle_class2 = "";
9002 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9003 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9004 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9005 WPOBE_array.Insert(WPOBE);
9006 }
9007
9008
9010 }
9011 }
9012 }
9013
9014
9016 {
9019
9021 {
9022 string config_to_search = "CfgVehicles";
9023
9024 if (IsInherited(Weapon))
9025 config_to_search = "CfgWeapons";
9026
9027 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9028 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9029
9030 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9031 {
9032
9034
9036 {
9038 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9040 return;
9041 }
9042
9045
9046
9047
9048 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9049 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9050
9051 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9052 {
9053 string particle_class = "";
9054 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9055 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9056 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9057
9058 if (entry_type == CT_CLASS)
9059 {
9060 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9061 WPOOH_array.Insert(WPOF);
9062 }
9063 }
9064
9065
9067 }
9068 }
9069 }
9070
9072 {
9074 }
9075
9077 {
9079 {
9081
9084
9087
9088 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9089 }
9090 }
9091
9093 {
9095 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9096
9098 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9099
9101 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9102
9104 {
9106 }
9107 }
9108
9110 {
9112 }
9113
9115 {
9118 else
9120
9122 {
9125 }
9126 else
9127 {
9130
9133 }
9134
9136 }
9137
9139 {
9141 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9142 }
9143
9145 {
9147 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9149 }
9150
9152 {
9154 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9155 }
9156
9158 {
9161
9162 OverheatingParticle OP = new OverheatingParticle();
9167
9169 }
9170
9172 {
9175
9176 return -1;
9177 }
9178
9180 {
9182 {
9185
9186 for (int i = count; i > 0; --i)
9187 {
9188 int id = i - 1;
9191
9194
9195 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9196 {
9197 if (p)
9198 {
9201 }
9202 }
9203 }
9204 }
9205 }
9206
9208 {
9210 {
9212 {
9213 int id = i - 1;
9215
9216 if (OP)
9217 {
9219
9220 if (p)
9221 {
9223 }
9224
9225 delete OP;
9226 }
9227 }
9228
9231 }
9232 }
9233
9236 {
9237 return 0.0;
9238 }
9239
9240
9242 {
9243 return 250;
9244 }
9245
9247 {
9248 return 0;
9249 }
9250
9253 {
9255 return true;
9256
9257 return false;
9258 }
9259
9262 {
9265
9267 {
9269 }
9270 else
9271 {
9272
9274 }
9275
9277 }
9278
9285 {
9286 return -1;
9287 }
9288
9289
9290
9291
9293 {
9295 {
9296 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9297 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9298
9299 if (r_index >= 0)
9300 {
9301 InventoryLocation r_il = new InventoryLocation;
9302 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9303
9304 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9307 {
9308 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9309 }
9311 {
9312 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9313 }
9314
9315 }
9316
9317 player.GetHumanInventory().ClearUserReservedLocation(this);
9318 }
9319
9322 }
9323
9324
9325
9326
9328 {
9329 return ItemBase.m_DebugActionsMask;
9330 }
9331
9333 {
9334 return ItemBase.m_DebugActionsMask & mask;
9335 }
9336
9338 {
9339 ItemBase.m_DebugActionsMask = mask;
9340 }
9341
9343 {
9344 ItemBase.m_DebugActionsMask |= mask;
9345 }
9346
9348 {
9349 ItemBase.m_DebugActionsMask &= ~mask;
9350 }
9351
9353 {
9355 {
9357 }
9358 else
9359 {
9361 }
9362 }
9363
9364
9366 {
9367 if (GetEconomyProfile())
9368 {
9369 float q_max = GetEconomyProfile().GetQuantityMax();
9370 if (q_max > 0)
9371 {
9372 float q_min = GetEconomyProfile().GetQuantityMin();
9373 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9374
9376 {
9377 ComponentEnergyManager comp = GetCompEM();
9379 {
9381 }
9382 }
9384 {
9386
9387 }
9388
9389 }
9390 }
9391 }
9392
9395 {
9396 EntityAI parent = GetHierarchyParent();
9397
9398 if (parent)
9399 {
9400 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9401 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9402 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9403 }
9404 }
9405
9408 {
9409 EntityAI parent = GetHierarchyParent();
9410
9411 if (parent)
9412 {
9413 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9414 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9415 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9416 }
9417 }
9418
9420 {
9421
9422
9423
9424
9426
9428 {
9429 if (ScriptInputUserData.CanStoreInputUserData())
9430 {
9431 ScriptInputUserData ctx = new ScriptInputUserData;
9437 ctx.
Write(use_stack_max);
9440
9442 {
9443 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9444 }
9445 }
9446 }
9447 else if (!
g_Game.IsMultiplayer())
9448 {
9450 }
9451 }
9452
9454 {
9456 }
9457
9459 {
9461 }
9462
9464 {
9466 }
9467
9469 {
9470
9471 return false;
9472 }
9473
9475 {
9476 return false;
9477 }
9478
9482 {
9483 return false;
9484 }
9485
9487 {
9488 return "";
9489 }
9490
9492
9494 {
9495 return false;
9496 }
9497
9499 {
9500 return true;
9501 }
9502
9503
9504
9506 {
9507 return true;
9508 }
9509
9511 {
9512 return true;
9513 }
9514
9516 {
9517 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9519 }
9520
9522 {
9524 }
9525
9527 {
9529 if (!is_being_placed)
9531 SetSynchDirty();
9532 }
9533
9534
9536
9538 {
9540 }
9541
9543 {
9545 }
9546
9548 {
9549 return 1;
9550 }
9551
9553 {
9554 return false;
9555 }
9556
9558 {
9560 SetSynchDirty();
9561 }
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9598 {
9599 super.OnMovedInsideCargo(container);
9600
9601 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9602 }
9603
9604 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9605 {
9606 super.EEItemLocationChanged(oldLoc, newLoc);
9607
9608 PlayerBase newPlayer = null;
9609 PlayerBase oldPlayer = null;
9610
9611 if (newLoc.GetParent())
9612 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9613
9614 if (oldLoc.GetParent())
9615 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9616
9618 {
9619 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9620
9621 if (rIndex >= 0)
9622 {
9623 InventoryLocation rIl = new InventoryLocation;
9624 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9625
9626 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9629 {
9630 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9631 }
9633 {
9635 }
9636
9637 }
9638 }
9639
9641 {
9642 if (newPlayer)
9643 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9644
9645 if (newPlayer == oldPlayer)
9646 {
9647 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9648 {
9650 {
9651 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9652 {
9653 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9654 }
9655 }
9656 else
9657 {
9658 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9659 }
9660 }
9661
9662 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9663 {
9664 int type = oldLoc.GetType();
9666 {
9667 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9668 }
9670 {
9671 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9672 }
9673 }
9674 if (!m_OldLocation)
9675 {
9676 m_OldLocation = new InventoryLocation;
9677 }
9678 m_OldLocation.Copy(oldLoc);
9679 }
9680 else
9681 {
9682 if (m_OldLocation)
9683 {
9684 m_OldLocation.Reset();
9685 }
9686 }
9687
9688 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9689 }
9690 else
9691 {
9692 if (newPlayer)
9693 {
9694 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9695 if (resIndex >= 0)
9696 {
9697 InventoryLocation il = new InventoryLocation;
9698 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9700 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9703 {
9704 il.
GetParent().GetOnReleaseLock().Invoke(it);
9705 }
9707 {
9709 }
9710
9711 }
9712 }
9714 {
9715
9717 }
9718
9719 if (m_OldLocation)
9720 {
9721 m_OldLocation.Reset();
9722 }
9723 }
9724
9726 {
9727 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9728 }
9729
9731 {
9732 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9733 }
9734 }
9735
9736 override void EOnContact(IEntity other, Contact extra)
9737 {
9739 {
9740 int liquidType = -1;
9742 if (impactSpeed > 0.0)
9743 {
9745 #ifndef SERVER
9747 #else
9749 SetSynchDirty();
9750 #endif
9752 }
9753 }
9754
9755 #ifdef SERVER
9756 if (GetCompEM() && GetCompEM().IsPlugged())
9757 {
9758 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9759 GetCompEM().UnplugThis();
9760 }
9761 #endif
9762 }
9763
9765
9767 {
9769 }
9770
9772 {
9773
9774 }
9775
9777 {
9778 super.OnItemLocationChanged(old_owner, new_owner);
9779
9780 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9781 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9782
9783 if (!relatedPlayer && playerNew)
9784 relatedPlayer = playerNew;
9785
9786 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9787 {
9789 if (actionMgr)
9790 {
9791 ActionBase currentAction = actionMgr.GetRunningAction();
9792 if (currentAction)
9794 }
9795 }
9796
9797 Man ownerPlayerOld = null;
9798 Man ownerPlayerNew = null;
9799
9800 if (old_owner)
9801 {
9802 if (old_owner.
IsMan())
9803 {
9804 ownerPlayerOld = Man.Cast(old_owner);
9805 }
9806 else
9807 {
9808 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9809 }
9810 }
9811 else
9812 {
9814 {
9816
9817 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9818 {
9819 GetCompEM().UnplugThis();
9820 }
9821 }
9822 }
9823
9824 if (new_owner)
9825 {
9826 if (new_owner.
IsMan())
9827 {
9828 ownerPlayerNew = Man.Cast(new_owner);
9829 }
9830 else
9831 {
9832 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9833 }
9834 }
9835
9836 if (ownerPlayerOld != ownerPlayerNew)
9837 {
9838 if (ownerPlayerOld)
9839 {
9840 array<EntityAI> subItemsExit = new array<EntityAI>;
9842 for (int i = 0; i < subItemsExit.Count(); i++)
9843 {
9846 }
9847 }
9848
9849 if (ownerPlayerNew)
9850 {
9851 array<EntityAI> subItemsEnter = new array<EntityAI>;
9853 for (int j = 0; j < subItemsEnter.Count(); j++)
9854 {
9857 }
9858 }
9859 }
9860 else if (ownerPlayerNew != null)
9861 {
9862 PlayerBase nplayer;
9863 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9864 {
9865 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9867 for (int k = 0; k < subItemsUpdate.Count(); k++)
9868 {
9870 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9871 }
9872 }
9873 }
9874
9875 if (old_owner)
9876 old_owner.OnChildItemRemoved(this);
9877 if (new_owner)
9878 new_owner.OnChildItemReceived(this);
9879 }
9880
9881
9883 {
9884 super.EEDelete(parent);
9885 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9886 if (player)
9887 {
9889
9890 if (player.IsAlive())
9891 {
9892 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9893 if (r_index >= 0)
9894 {
9895 InventoryLocation r_il = new InventoryLocation;
9896 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9897
9898 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9901 {
9902 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9903 }
9905 {
9906 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9907 }
9908
9909 }
9910
9911 player.RemoveQuickBarEntityShortcut(this);
9912 }
9913 }
9914 }
9915
9917 {
9918 super.EEKilled(killer);
9919
9922 {
9923 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9924 {
9925 if (IsMagazine())
9926 {
9927 if (Magazine.Cast(this).GetAmmoCount() > 0)
9928 {
9930 }
9931 }
9932 else
9933 {
9935 }
9936 }
9937 }
9938 }
9939
9941 {
9942 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9943
9944 super.OnWasAttached(parent, slot_id);
9945
9948
9951 }
9952
9954 {
9955 super.OnWasDetached(parent, slot_id);
9956
9959
9962 }
9963
9965 {
9966 int idx;
9969
9970 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9971 if (inventory_slots.Count() < 1)
9972 {
9973 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9974 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9975 }
9976 else
9977 {
9978 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9979 }
9980
9981 idx = inventory_slots.Find(slot);
9982 if (idx < 0)
9983 return "";
9984
9985 return attach_types.Get(idx);
9986 }
9987
9989 {
9990 int idx = -1;
9991 string slot;
9992
9995
9996 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9997 if (inventory_slots.Count() < 1)
9998 {
9999 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10000 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10001 }
10002 else
10003 {
10004 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10005 if (detach_types.Count() < 1)
10006 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10007 }
10008
10009 for (int i = 0; i < inventory_slots.Count(); i++)
10010 {
10011 slot = inventory_slots.Get(i);
10012 }
10013
10014 if (slot != "")
10015 {
10016 if (detach_types.Count() == 1)
10017 idx = 0;
10018 else
10019 idx = inventory_slots.Find(slot);
10020 }
10021 if (idx < 0)
10022 return "";
10023
10024 return detach_types.Get(idx);
10025 }
10026
10028 {
10029
10031
10032
10033 float min_time = 1;
10034 float max_time = 3;
10035 float delay = Math.RandomFloat(min_time, max_time);
10036
10037 explode_timer.Run(delay, this, "DoAmmoExplosion");
10038 }
10039
10041 {
10042 Magazine magazine = Magazine.Cast(this);
10043 int pop_sounds_count = 6;
10044 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10045
10046
10047 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10048 string sound_name = pop_sounds[ sound_idx ];
10049 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10050
10051
10052 magazine.ServerAddAmmoCount(-1);
10053
10054
10055 float min_temp_to_explode = 100;
10056
10057 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10058 {
10060 }
10061 }
10062
10063
10064 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10065 {
10066 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10067
10068 const int CHANCE_DAMAGE_CARGO = 4;
10069 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10070 const int CHANCE_DAMAGE_NOTHING = 2;
10071
10073 {
10074 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10075 int chances;
10076 int rnd;
10077
10078 if (GetInventory().GetCargo())
10079 {
10080 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10081 rnd = Math.RandomInt(0,chances);
10082
10083 if (rnd < CHANCE_DAMAGE_CARGO)
10084 {
10086 }
10087 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10088 {
10090 }
10091 }
10092 else
10093 {
10094 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10095 rnd = Math.RandomInt(0,chances);
10096
10097 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10098 {
10100 }
10101 }
10102 }
10103 }
10104
10106 {
10107 CargoBase cargo = GetInventory().GetCargo();
10108 if (cargo)
10109 {
10111 if (item_count > 0)
10112 {
10113 int random_pick = Math.RandomInt(0, item_count);
10115 if (!item.IsExplosive())
10116 {
10117 item.AddHealth("","",damage);
10118 return true;
10119 }
10120 }
10121 }
10122 return false;
10123 }
10124
10126 {
10127 GameInventory inventory = GetInventory();
10129 if (attachment_count > 0)
10130 {
10131 int random_pick = Math.RandomInt(0, attachment_count);
10133 if (!attachment.IsExplosive())
10134 {
10135 attachment.AddHealth("","",damage);
10136 return true;
10137 }
10138 }
10139 return false;
10140 }
10141
10143 {
10145 }
10146
10148 {
10150 return GetInventory().CanRemoveEntity();
10151
10152 return false;
10153 }
10154
10156 {
10157
10159 return false;
10160
10161
10163 return false;
10164
10165
10166
10168 if (delta == 0)
10169 return false;
10170
10171
10172 return true;
10173 }
10174
10176 {
10178 {
10179 if (ScriptInputUserData.CanStoreInputUserData())
10180 {
10181 ScriptInputUserData ctx = new ScriptInputUserData;
10186 ctx.
Write(destination_entity);
10188 ctx.
Write(slot_id);
10190 }
10191 }
10192 else if (!
g_Game.IsMultiplayer())
10193 {
10195 }
10196 }
10197
10199 {
10200 float split_quantity_new;
10204 InventoryLocation loc = new InventoryLocation;
10205
10206 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10207 {
10209 split_quantity_new = stack_max;
10210 else
10212
10214 {
10215 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10216 if (new_item)
10217 {
10218 new_item.SetResultOfSplit(true);
10219 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10221 new_item.
SetQuantity(split_quantity_new,
false,
true);
10222 }
10223 }
10224 }
10225 else if (destination_entity && slot_id == -1)
10226 {
10227 if (quantity > stack_max)
10228 split_quantity_new = stack_max;
10229 else
10230 split_quantity_new = quantity;
10231
10233 {
10234 GameInventory destinationInventory = destination_entity.GetInventory();
10236 {
10239 }
10240
10241 if (new_item)
10242 {
10243 new_item.SetResultOfSplit(true);
10244 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10246 new_item.
SetQuantity(split_quantity_new,
false,
true);
10247 }
10248 }
10249 }
10250 else
10251 {
10252 if (stack_max != 0)
10253 {
10255 {
10257 }
10258
10259 if (split_quantity_new == 0)
10260 {
10261 if (!
g_Game.IsMultiplayer())
10262 player.PhysicalPredictiveDropItem(this);
10263 else
10264 player.ServerDropEntity(this);
10265 return;
10266 }
10267
10269 {
10271
10272 if (new_item)
10273 {
10274 new_item.SetResultOfSplit(true);
10275 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10278 new_item.PlaceOnSurface();
10279 }
10280 }
10281 }
10282 }
10283 }
10284
10286 {
10287 float split_quantity_new;
10291 InventoryLocation loc = new InventoryLocation;
10292
10293 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10294 {
10296 split_quantity_new = stack_max;
10297 else
10299
10301 {
10302 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10303 if (new_item)
10304 {
10305 new_item.SetResultOfSplit(true);
10306 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10308 new_item.
SetQuantity(split_quantity_new,
false,
true);
10309 }
10310 }
10311 }
10312 else if (destination_entity && slot_id == -1)
10313 {
10314 if (quantity > stack_max)
10315 split_quantity_new = stack_max;
10316 else
10317 split_quantity_new = quantity;
10318
10320 {
10321 GameInventory destinationInventory = destination_entity.GetInventory();
10323 {
10326 }
10327
10328 if (new_item)
10329 {
10330 new_item.SetResultOfSplit(true);
10331 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10333 new_item.
SetQuantity(split_quantity_new,
false,
true);
10334 }
10335 }
10336 }
10337 else
10338 {
10339 if (stack_max != 0)
10340 {
10342 {
10344 }
10345
10347 {
10349
10350 if (new_item)
10351 {
10352 new_item.SetResultOfSplit(true);
10353 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10356 new_item.PlaceOnSurface();
10357 }
10358 }
10359 }
10360 }
10361 }
10362
10364 {
10366 {
10367 if (ScriptInputUserData.CanStoreInputUserData())
10368 {
10369 ScriptInputUserData ctx = new ScriptInputUserData;
10374 dst.WriteToContext(ctx);
10376 }
10377 }
10378 else if (!
g_Game.IsMultiplayer())
10379 {
10381 }
10382 }
10383
10385 {
10387 {
10388 if (ScriptInputUserData.CanStoreInputUserData())
10389 {
10390 ScriptInputUserData ctx = new ScriptInputUserData;
10395 ctx.
Write(destination_entity);
10401 }
10402 }
10403 else if (!
g_Game.IsMultiplayer())
10404 {
10406 }
10407 }
10408
10410 {
10412 }
10413
10415 {
10417 float split_quantity_new;
10419 if (dst.IsValid())
10420 {
10421 int slot_id = dst.GetSlot();
10423
10424 if (quantity > stack_max)
10425 split_quantity_new = stack_max;
10426 else
10427 split_quantity_new = quantity;
10428
10430 {
10432
10433 if (new_item)
10434 {
10435 new_item.SetResultOfSplit(true);
10436 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10438 new_item.
SetQuantity(split_quantity_new,
false,
true);
10439 }
10440
10441 return new_item;
10442 }
10443 }
10444
10445 return null;
10446 }
10447
10449 {
10451 float split_quantity_new;
10453 if (destination_entity)
10454 {
10456 if (quantity > stackable)
10457 split_quantity_new = stackable;
10458 else
10459 split_quantity_new = quantity;
10460
10462 {
10463 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10464 if (new_item)
10465 {
10466 new_item.SetResultOfSplit(true);
10467 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10469 new_item.
SetQuantity(split_quantity_new,
false,
true);
10470 }
10471 }
10472 }
10473 }
10474
10476 {
10478 {
10479 if (ScriptInputUserData.CanStoreInputUserData())
10480 {
10481 ScriptInputUserData ctx = new ScriptInputUserData;
10486 ItemBase destination_entity =
this;
10487 ctx.
Write(destination_entity);
10491 }
10492 }
10493 else if (!
g_Game.IsMultiplayer())
10494 {
10496 }
10497 }
10498
10500 {
10502 float split_quantity_new;
10504 if (player)
10505 {
10507 if (quantity > stackable)
10508 split_quantity_new = stackable;
10509 else
10510 split_quantity_new = quantity;
10511
10513 {
10514 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10515 new_item =
ItemBase.Cast(in_hands);
10516 if (new_item)
10517 {
10518 new_item.SetResultOfSplit(true);
10519 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10521 new_item.SetQuantity(split_quantity_new, false, true);
10522 }
10523 }
10524 }
10525 }
10526
10528 {
10530 float split_quantity_new = Math.Floor(quantity * 0.5);
10531
10533 return;
10534
10536
10537 if (new_item)
10538 {
10539 if (new_item.GetQuantityMax() < split_quantity_new)
10540 {
10541 split_quantity_new = new_item.GetQuantityMax();
10542 }
10543
10544 new_item.SetResultOfSplit(true);
10545 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10546
10548 {
10551 }
10552 else
10553 {
10555 new_item.
SetQuantity(split_quantity_new,
false,
true);
10556 }
10557 }
10558 }
10559
10561 {
10563 float split_quantity_new = Math.Floor(quantity / 2);
10564
10566 return;
10567
10568 InventoryLocation invloc = new InventoryLocation;
10570
10572 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10573
10574 if (new_item)
10575 {
10576 if (new_item.GetQuantityMax() < split_quantity_new)
10577 {
10578 split_quantity_new = new_item.GetQuantityMax();
10579 }
10581 {
10584 }
10585 else if (split_quantity_new > 1)
10586 {
10588 new_item.
SetQuantity(split_quantity_new,
false,
true);
10589 }
10590 }
10591 }
10592
10595 {
10596 SetWeightDirty();
10598
10599 if (parent)
10600 parent.OnAttachmentQuantityChangedEx(this, delta);
10601
10603 {
10605 {
10607 }
10609 {
10610 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10612 }
10613 }
10614 }
10615
10618 {
10619
10620 }
10621
10624 {
10626 }
10627
10629 {
10630 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10631
10633 {
10634 if (newLevel == GameConstants.STATE_RUINED)
10635 {
10637 EntityAI parent = GetHierarchyParent();
10638 if (parent && parent.IsFireplace())
10639 {
10640 CargoBase cargo = GetInventory().GetCargo();
10641 if (cargo)
10642 {
10644 {
10646 }
10647 }
10648 }
10649 }
10650
10652 {
10653
10655 return;
10656 }
10657
10658 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10659 {
10661 }
10662 }
10663 }
10664
10665
10667 {
10668 super.OnRightClick();
10669
10671 {
10673 {
10674 if (ScriptInputUserData.CanStoreInputUserData())
10675 {
10676 EntityAI root = GetHierarchyRoot();
10677 Man playerOwner = GetHierarchyRootPlayer();
10678 InventoryLocation dst = new InventoryLocation;
10679
10680
10681 if (!playerOwner && root && root == this)
10682 {
10684 }
10685 else
10686 {
10687
10688 GetInventory().GetCurrentInventoryLocation(dst);
10690 {
10691 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10693 {
10695 }
10696 else
10697 {
10699
10700
10701 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10702 {
10704 }
10705 else
10706 {
10707 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10708 }
10709 }
10710 }
10711 }
10712
10713 ScriptInputUserData ctx = new ScriptInputUserData;
10721 }
10722 }
10723 else if (!
g_Game.IsMultiplayer())
10724 {
10726 }
10727 }
10728 }
10729
10731 {
10732 if (root)
10733 {
10734 vector m4[4];
10735 root.GetTransform(m4);
10736 dst.SetGround(this, m4);
10737 }
10738 else
10739 {
10740 GetInventory().GetCurrentInventoryLocation(dst);
10741 }
10742 }
10743
10744 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10745 {
10746
10747 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10748 return false;
10749
10750 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10751 return false;
10752
10753
10755 return false;
10756
10757
10758 Magazine mag = Magazine.Cast(this);
10759 if (mag)
10760 {
10761 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10762 return false;
10763
10764 if (stack_max_limit)
10765 {
10766 Magazine other_mag = Magazine.Cast(other_item);
10767 if (other_item)
10768 {
10769 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10770 return false;
10771 }
10772
10773 }
10774 }
10775 else
10776 {
10777
10779 return false;
10780
10782 return false;
10783 }
10784
10785 PlayerBase player = null;
10786 if (CastTo(player, GetHierarchyRootPlayer()))
10787 {
10788 if (player.GetInventory().HasAttachment(this))
10789 return false;
10790
10791 if (player.IsItemsToDelete())
10792 return false;
10793 }
10794
10795 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10796 return false;
10797
10798 int slotID;
10800 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10801 return false;
10802
10803 return true;
10804 }
10805
10807 {
10809 }
10810
10812 {
10813 return m_IsResultOfSplit;
10814 }
10815
10817 {
10818 m_IsResultOfSplit = value;
10819 }
10820
10822 {
10824 }
10825
10827 {
10828 float other_item_quantity = other_item.GetQuantity();
10829 float this_free_space;
10830
10832
10834
10835 if (other_item_quantity > this_free_space)
10836 {
10837 return this_free_space;
10838 }
10839 else
10840 {
10841 return other_item_quantity;
10842 }
10843 }
10844
10846 {
10848 }
10849
10851 {
10853 return;
10854
10855 if (!IsMagazine() && other_item)
10856 {
10858 if (quantity_used != 0)
10859 {
10860 float hp1 = GetHealth01("","");
10861 float hp2 = other_item.GetHealth01("","");
10862 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10863 hpResult = hpResult / (
GetQuantity() + quantity_used);
10864
10865 hpResult *= GetMaxHealth();
10866 Math.Round(hpResult);
10867 SetHealth("", "Health", hpResult);
10868
10870 other_item.AddQuantity(-quantity_used);
10871 }
10872 }
10874 }
10875
10877 {
10878 #ifdef SERVER
10879 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10880 GetHierarchyParent().IncreaseLifetimeUp();
10881 #endif
10882 };
10883
10885 {
10886 PlayerBase p = PlayerBase.Cast(player);
10887
10888 array<int> recipesIds = p.m_Recipes;
10889 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10890 if (moduleRecipesManager)
10891 {
10892 EntityAI itemInHands = player.GetEntityInHands();
10893 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10894 }
10895
10896 for (int i = 0;i < recipesIds.Count(); i++)
10897 {
10898 int key = recipesIds.Get(i);
10899 string recipeName = moduleRecipesManager.GetRecipeName(key);
10901 }
10902 }
10903
10904
10905 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10906 {
10907 super.GetDebugActions(outputList);
10908
10909
10915
10916
10921
10926
10927
10931
10932
10934 {
10938 }
10939
10942
10943
10947
10949
10950 InventoryLocation loc = new InventoryLocation();
10951 GetInventory().GetCurrentInventoryLocation(loc);
10953 {
10954 if (Gizmo_IsSupported())
10957 }
10958
10960 }
10961
10962
10963
10964
10966 {
10967 super.OnAction(action_id, player, ctx);
10968
10970 {
10971 switch (action_id)
10972 {
10976 return true;
10980 return true;
10981 }
10982 }
10983
10985 {
10986 switch (action_id)
10987 {
10989 Delete();
10990 return true;
10991 }
10992 }
10993
10994 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10995 {
10996 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10997 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10998 PlayerBase p = PlayerBase.Cast(player);
10999 if (
EActions.RECIPES_RANGE_START < 1000)
11000 {
11001 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11002 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11003 }
11004 }
11005 #ifndef SERVER
11006 else if (action_id ==
EActions.WATCH_PLAYER)
11007 {
11008 PluginDeveloper.SetDeveloperItemClientEx(player);
11009 }
11010 #endif
11012 {
11013 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11014 {
11015 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11016 OnDebugButtonPressServer(id + 1);
11017 }
11018
11019 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11020 {
11021 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11023 }
11024
11025 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11026 {
11027 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11029 }
11030
11031 else if (action_id ==
EActions.ADD_QUANTITY)
11032 {
11033 if (IsMagazine())
11034 {
11035 Magazine mag = Magazine.Cast(this);
11036 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11037 }
11038 else
11039 {
11041 }
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.REMOVE_QUANTITY)
11051 {
11052 if (IsMagazine())
11053 {
11054 Magazine mag2 = Magazine.Cast(this);
11055 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11056 }
11057 else
11058 {
11060 }
11061 if (m_EM)
11062 {
11063 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11064 }
11065
11066 }
11067
11068 else if (action_id ==
EActions.SET_QUANTITY_0)
11069 {
11071
11072 if (m_EM)
11073 {
11074 m_EM.SetEnergy(0);
11075 }
11076 }
11077
11078 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11079 {
11081
11082 if (m_EM)
11083 {
11084 m_EM.SetEnergy(m_EM.GetEnergyMax());
11085 }
11086 }
11087
11088 else if (action_id ==
EActions.ADD_HEALTH)
11089 {
11090 AddHealth("","",GetMaxHealth("","Health")/5);
11091 }
11092 else if (action_id ==
EActions.REMOVE_HEALTH)
11093 {
11094 AddHealth("","",-GetMaxHealth("","Health")/5);
11095 }
11096 else if (action_id ==
EActions.DESTROY_HEALTH)
11097 {
11098 SetHealth01("","",0);
11099 }
11100 else if (action_id ==
EActions.WATCH_ITEM)
11101 {
11103 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11104 #ifdef DEVELOPER
11105 SetDebugDeveloper_item(this);
11106 #endif
11107 }
11108
11109 else if (action_id ==
EActions.ADD_TEMPERATURE)
11110 {
11111 AddTemperature(20);
11112
11113 }
11114
11115 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11116 {
11117 AddTemperature(-20);
11118
11119 }
11120
11121 else if (action_id ==
EActions.FLIP_FROZEN)
11122 {
11123 SetFrozen(!GetIsFrozen());
11124
11125 }
11126
11127 else if (action_id ==
EActions.ADD_WETNESS)
11128 {
11130
11131 }
11132
11133 else if (action_id ==
EActions.REMOVE_WETNESS)
11134 {
11136
11137 }
11138
11139 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11140 {
11143
11144
11145 }
11146
11147 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11148 {
11151 }
11152
11153 else if (action_id ==
EActions.MAKE_SPECIAL)
11154 {
11155 auto debugParams = DebugSpawnParams.WithPlayer(player);
11156 OnDebugSpawnEx(debugParams);
11157 }
11158
11159 }
11160
11161
11162 return false;
11163 }
11164
11165
11166
11167
11171
11174
11175
11176
11178 {
11179 return false;
11180 }
11181
11182
11184 {
11185 return true;
11186 }
11187
11188
11190 {
11191 return true;
11192 }
11193
11194
11195
11197 {
11198 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11199 return g_Game.ConfigIsExisting(config_path);
11200 }
11201
11204 {
11205 return null;
11206 }
11207
11209 {
11210 return false;
11211 }
11212
11214 {
11215 return false;
11216 }
11217
11221
11222
11224 {
11225 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11226 return module_repairing.CanRepair(this, item_repair_kit);
11227 }
11228
11229
11230 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11231 {
11232 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11233 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11234 }
11235
11236
11238 {
11239
11240
11241
11242
11243
11244
11245
11246
11247 return 1;
11248 }
11249
11250
11251
11253 {
11255 }
11256
11257
11258
11260 {
11262 }
11263
11264
11273 {
11274 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11275
11276 if (player)
11277 {
11278 player.MessageStatus(text);
11279 }
11280 }
11281
11282
11291 {
11292 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11293
11294 if (player)
11295 {
11296 player.MessageAction(text);
11297 }
11298 }
11299
11300
11309 {
11310 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11311
11312 if (player)
11313 {
11314 player.MessageFriendly(text);
11315 }
11316 }
11317
11318
11327 {
11328 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11329
11330 if (player)
11331 {
11332 player.MessageImportant(text);
11333 }
11334 }
11335
11337 {
11338 return true;
11339 }
11340
11341
11342 override bool KindOf(
string tag)
11343 {
11344 bool found = false;
11345 string item_name = this.
GetType();
11347 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11348
11349 int array_size = item_tag_array.Count();
11350 for (int i = 0; i < array_size; i++)
11351 {
11352 if (item_tag_array.Get(i) == tag)
11353 {
11354 found = true;
11355 break;
11356 }
11357 }
11358 return found;
11359 }
11360
11361
11363 {
11364
11365 super.OnRPC(sender, rpc_type,ctx);
11366
11367
11368 switch (rpc_type)
11369 {
11370 #ifndef SERVER
11371 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11372 Param2<bool, string> p = new Param2<bool, string>(false, "");
11373
11375 return;
11376
11377 bool play = p.param1;
11378 string soundSet = p.param2;
11379
11380 if (play)
11381 {
11383 {
11385 {
11387 }
11388 }
11389 else
11390 {
11392 }
11393 }
11394 else
11395 {
11397 }
11398
11399 break;
11400 #endif
11401
11402 }
11403
11405 {
11407 }
11408 }
11409
11410
11411
11412
11414 {
11415 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11416 return plugin.GetID(
name);
11417 }
11418
11420 {
11421 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11422 return plugin.GetName(id);
11423 }
11424
11427 {
11428
11429
11430 int varFlags;
11431 if (!ctx.
Read(varFlags))
11432 return;
11433
11434 if (varFlags & ItemVariableFlags.FLOAT)
11435 {
11437 }
11438 }
11439
11441 {
11442
11443 super.SerializeNumericalVars(floats_out);
11444
11445
11446
11448 {
11450 }
11451
11453 {
11455 }
11456
11458 {
11460 }
11461
11463 {
11468 }
11469
11471 {
11473 }
11474 }
11475
11477 {
11478
11479 super.DeSerializeNumericalVars(floats);
11480
11481
11482 int index = 0;
11483 int mask = Math.Round(floats.Get(index));
11484
11485 index++;
11486
11488 {
11490 {
11492 }
11493 else
11494 {
11495 float quantity = floats.Get(index);
11496 SetQuantity(quantity,
true,
false,
false,
false);
11497 }
11498 index++;
11499 }
11500
11502 {
11503 float wet = floats.Get(index);
11505 index++;
11506 }
11507
11509 {
11510 int liquidtype = Math.Round(floats.Get(index));
11512 index++;
11513 }
11514
11516 {
11518 index++;
11520 index++;
11522 index++;
11524 index++;
11525 }
11526
11528 {
11529 int cleanness = Math.Round(floats.Get(index));
11531 index++;
11532 }
11533 }
11534
11536 {
11537 super.WriteVarsToCTX(ctx);
11538
11539
11541 {
11543 }
11544
11546 {
11548 }
11549
11551 {
11553 }
11554
11556 {
11557 int r,g,b,a;
11563 }
11564
11566 {
11568 }
11569 }
11570
11572 {
11573 if (!super.ReadVarsFromCTX(ctx,version))
11574 return false;
11575
11576 int intValue;
11577 float value;
11578
11579 if (version < 140)
11580 {
11581 if (!ctx.
Read(intValue))
11582 return false;
11583
11584 m_VariablesMask = intValue;
11585 }
11586
11588 {
11589 if (!ctx.
Read(value))
11590 return false;
11591
11593 {
11595 }
11596 else
11597 {
11599 }
11600 }
11601
11602 if (version < 140)
11603 {
11605 {
11606 if (!ctx.
Read(value))
11607 return false;
11608 SetTemperatureDirect(value);
11609 }
11610 }
11611
11613 {
11614 if (!ctx.
Read(value))
11615 return false;
11617 }
11618
11620 {
11621 if (!ctx.
Read(intValue))
11622 return false;
11624 }
11625
11627 {
11628 int r,g,b,a;
11630 return false;
11632 return false;
11634 return false;
11636 return false;
11637
11639 }
11640
11642 {
11643 if (!ctx.
Read(intValue))
11644 return false;
11646 }
11647
11648 if (version >= 138 && version < 140)
11649 {
11651 {
11652 if (!ctx.
Read(intValue))
11653 return false;
11654 SetFrozen(intValue);
11655 }
11656 }
11657
11658 return true;
11659 }
11660
11661
11663 {
11666 {
11668 }
11669
11670 if (!super.OnStoreLoad(ctx, version))
11671 {
11673 return false;
11674 }
11675
11676 if (version >= 114)
11677 {
11678 bool hasQuickBarIndexSaved;
11679
11680 if (!ctx.
Read(hasQuickBarIndexSaved))
11681 {
11683 return false;
11684 }
11685
11686 if (hasQuickBarIndexSaved)
11687 {
11688 int itmQBIndex;
11689
11690
11691 if (!ctx.
Read(itmQBIndex))
11692 {
11694 return false;
11695 }
11696
11697 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11698 if (itmQBIndex != -1 && parentPlayer)
11699 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11700 }
11701 }
11702 else
11703 {
11704
11705 PlayerBase player;
11706 int itemQBIndex;
11707 if (version ==
int.
MAX)
11708 {
11709 if (!ctx.
Read(itemQBIndex))
11710 {
11712 return false;
11713 }
11714 }
11715 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11716 {
11717
11718 if (!ctx.
Read(itemQBIndex))
11719 {
11721 return false;
11722 }
11723 if (itemQBIndex != -1 && player)
11724 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11725 }
11726 }
11727
11728 if (version < 140)
11729 {
11730
11731 if (!LoadVariables(ctx, version))
11732 {
11734 return false;
11735 }
11736 }
11737
11738
11740 {
11742 return false;
11743 }
11744 if (version >= 132)
11745 {
11747 if (raib)
11748 {
11750 {
11752 return false;
11753 }
11754 }
11755 }
11756
11758 return true;
11759 }
11760
11761
11762
11764 {
11765 super.OnStoreSave(ctx);
11766
11767 PlayerBase player;
11768 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11769 {
11771
11772 int itemQBIndex = -1;
11773 itemQBIndex = player.FindQuickBarEntityIndex(this);
11774 ctx.
Write(itemQBIndex);
11775 }
11776 else
11777 {
11779 }
11780
11782
11784 if (raib)
11785 {
11787 }
11788 }
11789
11790
11792 {
11793 super.AfterStoreLoad();
11794
11796 {
11798 }
11799
11801 {
11804 }
11805 }
11806
11808 {
11809 super.EEOnAfterLoad();
11810
11812 {
11814 }
11815
11818 }
11819
11821 {
11822 return false;
11823 }
11824
11825
11826
11828 {
11830 {
11831 #ifdef PLATFORM_CONSOLE
11832
11834 {
11836 if (menu)
11837 {
11839 }
11840 }
11841 #endif
11842 }
11843
11845 {
11848 }
11849
11851 {
11852 SetWeightDirty();
11854 }
11856 {
11859 }
11860
11862 {
11865
11868 }
11870 {
11874 }
11875
11876 super.OnVariablesSynchronized();
11877 }
11878
11879
11880
11882 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11883 {
11884 if (!IsServerCheck(allow_client))
11885 return false;
11886
11888 return false;
11889
11892
11893 if (value <= (min + 0.001))
11894 value = min;
11895
11896 if (value == min)
11897 {
11898 if (destroy_config)
11899 {
11900 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11901 if (dstr)
11902 {
11904 this.Delete();
11905 return true;
11906 }
11907 }
11908 else if (destroy_forced)
11909 {
11911 this.Delete();
11912 return true;
11913 }
11914
11916 }
11917
11920
11922 {
11923 EntityAI parent = GetHierarchyRoot();
11924 InventoryLocation iLoc = new InventoryLocation();
11925 GetInventory().GetCurrentInventoryLocation(iLoc);
11927 {
11928 int iLocSlot = iLoc.
GetSlot();
11930 {
11932 }
11934 {
11936 }
11937 }
11938 }
11939
11941 {
11943
11944 if (delta)
11946 }
11947
11949
11950 return false;
11951 }
11952
11953
11955 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11956 {
11958 }
11959
11961 {
11964 }
11965
11967 {
11970 }
11971
11973 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11974 {
11975 float value_clamped = Math.Clamp(value, 0, 1);
11977 SetQuantity(result, destroy_config, destroy_forced);
11978 }
11979
11980
11983 {
11985 }
11986
11988 {
11990 }
11991
11992
11993
11994
11995
11996
11997
11998
11999
12000
12002 {
12003 int slot = -1;
12004 GameInventory inventory = GetInventory();
12005 if (inventory)
12006 {
12007 InventoryLocation il = new InventoryLocation;
12010 }
12011
12013 }
12014
12016 {
12017 float quantity_max = 0;
12018
12020 {
12021 if (attSlotID != -1)
12022 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12023
12024 if (quantity_max <= 0)
12026 }
12027
12028 if (quantity_max <= 0)
12030
12031 return quantity_max;
12032 }
12033
12035 {
12037 }
12038
12040 {
12042 }
12043
12044
12046 {
12048 }
12049
12051 {
12053 }
12054
12056 {
12058 }
12059
12060
12062 {
12063
12064 float weightEx = GetWeightEx();
12065 float special = GetInventoryAndCargoWeight();
12066 return weightEx - special;
12067 }
12068
12069
12071 {
12073 }
12074
12076 {
12078 {
12079 #ifdef DEVELOPER
12080 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12081 {
12082 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12084 }
12085 #endif
12086
12087 return GetQuantity() * GetConfigWeightModified();
12088 }
12089 else if (HasEnergyManager())
12090 {
12091 #ifdef DEVELOPER
12092 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12093 {
12094 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12095 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12096 }
12097 #endif
12098 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12099 }
12100 else
12101 {
12102 #ifdef DEVELOPER
12103 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12104 {
12105 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12106 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12107 }
12108 #endif
12109 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12110 }
12111 }
12112
12115 {
12116 int item_count = 0;
12118
12119 GameInventory inventory = GetInventory();
12120 CargoBase cargo = inventory.
GetCargo();
12121 if (cargo != NULL)
12122 {
12124 }
12125
12127 for (int i = 0; i < nAttachments; ++i)
12128 {
12130 if (item)
12131 item_count += item.GetNumberOfItems();
12132 }
12133 return item_count;
12134 }
12135
12138 {
12139 float weight = 0;
12140 float wetness = 1;
12141 if (include_wetness)
12144 {
12145 weight = wetness * m_ConfigWeight;
12146 }
12148 {
12149 weight = 1;
12150 }
12151 return weight;
12152 }
12153
12154
12155
12157 {
12158 GameInventory inventory = GetInventory();
12159 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12160 {
12161 array<EntityAI> items = new array<EntityAI>;
12163 for (int i = 0; i < items.Count(); ++i)
12164 {
12166 if (item)
12167 {
12168 g_Game.ObjectDelete(item);
12169 }
12170 }
12171 }
12172 }
12173
12174
12175
12176
12178 {
12179 float energy = 0;
12180 if (HasEnergyManager())
12181 {
12182 energy = GetCompEM().GetEnergy();
12183 }
12184 return energy;
12185 }
12186
12187
12189 {
12190 super.OnEnergyConsumed();
12191
12193 }
12194
12196 {
12197 super.OnEnergyAdded();
12198
12200 }
12201
12202
12204 {
12205 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12206 {
12208 {
12209 float energy_0to1 = GetCompEM().GetEnergy0To1();
12211 }
12212 }
12213 }
12214
12215
12217 {
12218 return ConfigGetFloat("heatIsolation");
12219 }
12220
12222 {
12224 }
12225
12227 {
12228 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12229 if (
g_Game.ConfigIsExisting(paramPath))
12230 return g_Game.ConfigGetFloat(paramPath);
12231
12232 return 0.0;
12233 }
12234
12236 {
12237 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12238 if (
g_Game.ConfigIsExisting(paramPath))
12239 return g_Game.ConfigGetFloat(paramPath);
12240
12241 return 0.0;
12242 }
12243
12244 override void SetWet(
float value,
bool allow_client =
false)
12245 {
12246 if (!IsServerCheck(allow_client))
12247 return;
12248
12251
12253
12254 m_VarWet = Math.Clamp(value, min, max);
12255
12257 {
12260 }
12261 }
12262
12263 override void AddWet(
float value)
12264 {
12266 }
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12279 {
12281 }
12282
12284 {
12286 }
12287
12289 {
12291 }
12292
12293 override void OnWetChanged(
float newVal,
float oldVal)
12294 {
12297 if (newLevel != oldLevel)
12298 {
12300 }
12301 }
12302
12304 {
12305 SetWeightDirty();
12306 }
12307
12309 {
12310 return GetWetLevelInternal(
m_VarWet);
12311 }
12312
12313
12314
12316 {
12318 }
12319
12321 {
12323 }
12324
12326 {
12328 }
12329
12331 {
12333 }
12334
12335
12336
12338 {
12339 if (ConfigIsExisting("itemModelLength"))
12340 {
12341 return ConfigGetFloat("itemModelLength");
12342 }
12343 return 0;
12344 }
12345
12347 {
12348 if (ConfigIsExisting("itemAttachOffset"))
12349 {
12350 return ConfigGetFloat("itemAttachOffset");
12351 }
12352 return 0;
12353 }
12354
12355 override void SetCleanness(
int value,
bool allow_client =
false)
12356 {
12357 if (!IsServerCheck(allow_client))
12358 return;
12359
12361
12363
12366 }
12367
12369 {
12371 }
12372
12374 {
12375 return true;
12376 }
12377
12378
12379
12380
12382 {
12384 }
12385
12387 {
12389 }
12390
12391
12392
12393
12394 override void SetColor(
int r,
int g,
int b,
int a)
12395 {
12401 }
12403 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12404 {
12409 }
12410
12412 {
12414 }
12415
12418 {
12419 int r,g,b,a;
12421 r = r/255;
12422 g = g/255;
12423 b = b/255;
12424 a = a/255;
12425 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12426 }
12427
12428
12429
12430 override void SetLiquidType(
int value,
bool allow_client =
false)
12431 {
12432 if (!IsServerCheck(allow_client))
12433 return;
12434
12439 }
12440
12442 {
12443 return ConfigGetInt("varLiquidTypeInit");
12444 }
12445
12447 {
12449 }
12450
12452 {
12454 SetFrozen(false);
12455 }
12456
12459 {
12460 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12461 }
12462
12463
12466 {
12467 PlayerBase nplayer;
12468 if (PlayerBase.CastTo(nplayer, player))
12469 {
12471 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12472 }
12473 }
12474
12475
12478 {
12479 PlayerBase nplayer;
12480 if (PlayerBase.CastTo(nplayer,player))
12481 {
12482 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12483 }
12484
12485 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12486
12487 if (HasEnergyManager())
12488 {
12489 GetCompEM().UpdatePlugState();
12490 }
12491 }
12492
12493
12495 {
12496 super.OnPlacementStarted(player);
12497
12499 }
12500
12501 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12502 {
12504 {
12505 m_AdminLog.OnPlacementComplete(player,
this);
12506 }
12507
12508 super.OnPlacementComplete(player, position, orientation);
12509 }
12510
12511
12512
12513
12514
12516 {
12518 {
12519 return true;
12520 }
12521 else
12522 {
12523 return false;
12524 }
12525 }
12526
12527
12529 {
12531 {
12533 }
12534 }
12535
12536
12538 {
12540 }
12541
12543 {
12545 }
12546
12547 override void InsertAgent(
int agent,
float count = 1)
12548 {
12549 if (count < 1)
12550 return;
12551
12553 }
12554
12557 {
12559 }
12560
12561
12563 {
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
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12609 {
12611 return false;
12612 return true;
12613 }
12614
12616 {
12617
12619 }
12620
12621
12624 {
12625 super.CheckForRoofLimited(timeTresholdMS);
12626
12627 float time =
g_Game.GetTime();
12628 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12629 {
12630 m_PreviousRoofTestTime = time;
12631 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12632 }
12633 }
12634
12635
12637 {
12639 {
12640 return 0;
12641 }
12642
12643 if (GetInventory().GetAttachmentSlotsCount() != 0)
12644 {
12645 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12646 if (filter)
12647 return filter.GetProtectionLevel(type, false, system);
12648 else
12649 return 0;
12650 }
12651
12652 string subclassPath, entryName;
12653
12654 switch (type)
12655 {
12657 entryName = "biological";
12658 break;
12660 entryName = "chemical";
12661 break;
12662 default:
12663 entryName = "biological";
12664 break;
12665 }
12666
12667 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12668
12669 return g_Game.ConfigGetFloat(subclassPath + entryName);
12670 }
12671
12672
12673
12676 {
12677 if (!IsMagazine())
12679
12681 }
12682
12683
12684
12685
12686
12691 {
12692 return true;
12693 }
12694
12696 {
12698 }
12699
12700
12701
12702
12703
12705 {
12706 if (parent)
12707 {
12708 if (parent.IsInherited(DayZInfected))
12709 return true;
12710
12711 if (!parent.IsRuined())
12712 return true;
12713 }
12714
12715 return true;
12716 }
12717
12719 {
12720 if (!super.CanPutAsAttachment(parent))
12721 {
12722 return false;
12723 }
12724
12725 if (!IsRuined() && !parent.IsRuined())
12726 {
12727 return true;
12728 }
12729
12730 return false;
12731 }
12732
12734 {
12735
12736
12737
12738
12739 return super.CanReceiveItemIntoCargo(item);
12740 }
12741
12743 {
12744
12745
12746
12747
12748 GameInventory attachmentInv = attachment.GetInventory();
12750 {
12751 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12752 return false;
12753 }
12754
12755 InventoryLocation loc = new InventoryLocation();
12756 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12757 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12758 return false;
12759
12760 return super.CanReceiveAttachment(attachment, slotId);
12761 }
12762
12764 {
12765 if (!super.CanReleaseAttachment(attachment))
12766 return false;
12767
12768 return GetInventory().AreChildrenAccessible();
12769 }
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12792 {
12793 int id = muzzle_owner.GetMuzzleID();
12794 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12795
12796 if (WPOF_array)
12797 {
12798 for (int i = 0; i < WPOF_array.Count(); i++)
12799 {
12800 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12801
12802 if (WPOF)
12803 {
12804 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12805 }
12806 }
12807 }
12808 }
12809
12810
12812 {
12813 int id = muzzle_owner.GetMuzzleID();
12815
12816 if (WPOBE_array)
12817 {
12818 for (int i = 0; i < WPOBE_array.Count(); i++)
12819 {
12820 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12821
12822 if (WPOBE)
12823 {
12824 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12825 }
12826 }
12827 }
12828 }
12829
12830
12832 {
12833 int id = muzzle_owner.GetMuzzleID();
12834 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12835
12836 if (WPOOH_array)
12837 {
12838 for (int i = 0; i < WPOOH_array.Count(); i++)
12839 {
12840 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12841
12842 if (WPOOH)
12843 {
12844 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12845 }
12846 }
12847 }
12848 }
12849
12850
12852 {
12853 int id = muzzle_owner.GetMuzzleID();
12854 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12855
12856 if (WPOOH_array)
12857 {
12858 for (int i = 0; i < WPOOH_array.Count(); i++)
12859 {
12860 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12861
12862 if (WPOOH)
12863 {
12864 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12865 }
12866 }
12867 }
12868 }
12869
12870
12872 {
12873 int id = muzzle_owner.GetMuzzleID();
12874 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12875
12876 if (WPOOH_array)
12877 {
12878 for (int i = 0; i < WPOOH_array.Count(); i++)
12879 {
12880 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12881
12882 if (WPOOH)
12883 {
12884 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12885 }
12886 }
12887 }
12888 }
12889
12890
12891
12893 {
12895 {
12896 return true;
12897 }
12898
12899 return false;
12900 }
12901
12903 {
12905 {
12906 return true;
12907 }
12908
12909 return false;
12910 }
12911
12913 {
12915 {
12916 return true;
12917 }
12918
12919 return false;
12920 }
12921
12923 {
12924 return false;
12925 }
12926
12929 {
12930 return UATimeSpent.DEFAULT_DEPLOY;
12931 }
12932
12933
12934
12935
12937 {
12939 SetSynchDirty();
12940 }
12941
12943 {
12945 }
12946
12947
12949 {
12950 return false;
12951 }
12952
12955 {
12956 string att_type = "None";
12957
12958 if (ConfigIsExisting("soundAttType"))
12959 {
12960 att_type = ConfigGetString("soundAttType");
12961 }
12962
12964 }
12965
12967 {
12969 }
12970
12971
12972
12973
12974
12980
12982 {
12985
12987 }
12988
12989
12991 {
12993 return;
12994
12996
12999
13002
13003 SoundParameters params = new SoundParameters();
13007 }
13008
13009
13011 {
13013 {
13016
13017 SetSynchDirty();
13018
13021 }
13022 }
13023
13025 {
13027 }
13028
13029
13031 {
13033 return;
13034
13036 SetSynchDirty();
13037
13040 }
13041
13043 {
13046 }
13047
13049 {
13051 }
13052
13053 void OnApply(PlayerBase player);
13054
13056 {
13057 return 1.0;
13058 };
13059
13061 {
13063 }
13064
13066 {
13068 }
13069
13071
13073 {
13074 SetDynamicPhysicsLifeTime(0.01);
13076 }
13077
13079 {
13080 array<string> zone_names = new array<string>;
13081 GetDamageZones(zone_names);
13082 for (int i = 0; i < zone_names.Count(); i++)
13083 {
13084 SetHealthMax(zone_names.Get(i),"Health");
13085 }
13086 SetHealthMax("","Health");
13087 }
13088
13091 {
13092 float global_health = GetHealth01("","Health");
13093 array<string> zones = new array<string>;
13094 GetDamageZones(zones);
13095
13096 for (int i = 0; i < zones.Count(); i++)
13097 {
13098 SetHealth01(zones.Get(i),"Health",global_health);
13099 }
13100 }
13101
13104 {
13105 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13106 }
13107
13109 {
13110 if (!hasRootAsPlayer)
13111 {
13112 if (refParentIB)
13113 {
13114
13115 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13116 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13117
13118 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13119 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13120
13123 }
13124 else
13125 {
13126
13129 }
13130 }
13131 }
13132
13134 {
13136 {
13137 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13138 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13139 {
13140 float heatPermCoef = 1.0;
13142 while (ent)
13143 {
13144 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13145 ent = ent.GetHierarchyParent();
13146 }
13147
13148 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13149 }
13150 }
13151 }
13152
13154 {
13155
13156 EntityAI parent = GetHierarchyParent();
13157 if (!parent)
13158 {
13159 hasParent = false;
13160 hasRootAsPlayer = false;
13161 }
13162 else
13163 {
13164 hasParent = true;
13165 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13166 refParentIB =
ItemBase.Cast(parent);
13167 }
13168 }
13169
13170 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13171 {
13172
13173 }
13174
13176 {
13177
13178 return false;
13179 }
13180
13182 {
13183
13184
13185 return false;
13186 }
13187
13189 {
13190
13191 return false;
13192 }
13193
13196 {
13197 return !GetIsFrozen() &&
IsOpen();
13198 }
13199
13201 {
13202 bool hasParent = false, hasRootAsPlayer = false;
13204
13205 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13206 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13207
13208 if (wwtu || foodDecay)
13209 {
13213
13214 if (processWetness || processTemperature || processDecay)
13215 {
13217
13218 if (processWetness)
13219 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13220
13221 if (processTemperature)
13223
13224 if (processDecay)
13225 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13226 }
13227 }
13228 }
13229
13232 {
13234 }
13235
13237 {
13240
13241 return super.GetTemperatureFreezeThreshold();
13242 }
13243
13245 {
13248
13249 return super.GetTemperatureThawThreshold();
13250 }
13251
13253 {
13256
13257 return super.GetItemOverheatThreshold();
13258 }
13259
13261 {
13263 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13264
13265 return super.GetTemperatureFreezeTime();
13266 }
13267
13269 {
13271 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13272
13273 return super.GetTemperatureThawTime();
13274 }
13275
13280
13282 {
13283 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13284 }
13285
13287 {
13288 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13289 }
13290
13293 {
13295 }
13296
13298 {
13300 }
13301
13303 {
13305 }
13306
13309 {
13310 return null;
13311 }
13312
13315 {
13316 return false;
13317 }
13318
13320 {
13322 {
13325 if (!trg)
13326 {
13328 explosive = this;
13329 }
13330
13331 explosive.PairRemote(trg);
13333
13334 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13335 trg.SetPersistentPairID(persistentID);
13336 explosive.SetPersistentPairID(persistentID);
13337
13338 return true;
13339 }
13340 return false;
13341 }
13342
13345 {
13346 float ret = 1.0;
13349 ret *= GetHealth01();
13350
13351 return ret;
13352 }
13353
13354 #ifdef DEVELOPER
13355 override void SetDebugItem()
13356 {
13357 super.SetDebugItem();
13358 _itemBase = this;
13359 }
13360
13362 {
13363 string text = super.GetDebugText();
13364
13366 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13367
13368 return text;
13369 }
13370 #endif
13371
13373 {
13374 return true;
13375 }
13376
13378
13380
13382 {
13385 }
13386
13387
13395
13411
13412 [
Obsolete(
"Use ItemSoundHandler instead")]
13415 {
13416 if (!
g_Game.IsDedicatedServer())
13417 {
13418 if (ConfigIsExisting("attachSoundSet"))
13419 {
13420 string cfg_path = "";
13421 string soundset = "";
13422 string type_name =
GetType();
13423
13426 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13427 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13428
13429 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13430 {
13431 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13432 {
13433 if (cfg_slot_array[i] == slot_type)
13434 {
13435 soundset = cfg_soundset_array[i];
13436 break;
13437 }
13438 }
13439 }
13440
13441 if (soundset != "")
13442 {
13443 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13445 }
13446 }
13447 }
13448 }
13449
13451}
13452
13454{
13456 if (entity)
13457 {
13458 bool is_item = entity.IsInherited(
ItemBase);
13459 if (is_item && full_quantity)
13460 {
13463 }
13464 }
13465 else
13466 {
13468 return NULL;
13469 }
13470 return entity;
13471}
13472
13474{
13475 if (item)
13476 {
13477 if (health > 0)
13478 item.SetHealth("", "", health);
13479
13480 if (item.CanHaveTemperature())
13481 {
13483 if (item.CanFreeze())
13484 item.SetFrozen(false);
13485 }
13486
13487 if (item.HasEnergyManager())
13488 {
13489 if (quantity >= 0)
13490 {
13491 item.GetCompEM().SetEnergy0To1(quantity);
13492 }
13493 else
13494 {
13496 }
13497 }
13498 else if (item.IsMagazine())
13499 {
13500 Magazine mag = Magazine.Cast(item);
13501 if (quantity >= 0)
13502 {
13503 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13504 }
13505 else
13506 {
13508 }
13509
13510 }
13511 else
13512 {
13513 if (quantity >= 0)
13514 {
13515 item.SetQuantityNormalized(quantity, false);
13516 }
13517 else
13518 {
13520 }
13521
13522 }
13523 }
13524}
13525
13526#ifdef DEVELOPER
13528#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.