DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ GetNumberOfItems()

int SpawnItemOnLocation::GetNumberOfItems ( )
protected

Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.

См. определение в файле ItemBase.c строка 8462

8467{
8468 override bool CanPutAsAttachment(EntityAI parent)
8469 {
8470 return true;
8471 }
8472};
8473
8475{
8476
8477};
8478
8479//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8480
8481class ItemBase extends InventoryItem
8482{
8486
8488
8489 static int m_DebugActionsMask;
8491 // ============================================
8492 // Variable Manipulation System
8493 // ============================================
8494 // Quantity
8495
8496 float m_VarQuantity;
8497 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8499 int m_VarQuantityMin;
8500 int m_VarQuantityMax;
8501 int m_Count;
8502 float m_VarStackMax;
8503 float m_StoreLoadedQuantity = float.LOWEST;
8504 // Wet
8505 float m_VarWet;
8506 float m_VarWetPrev;//for client to know wetness changed during synchronization
8507 float m_VarWetInit;
8508 float m_VarWetMin;
8509 float m_VarWetMax;
8510 // Cleanness
8511 int m_Cleanness;
8512 int m_CleannessInit;
8513 int m_CleannessMin;
8514 int m_CleannessMax;
8515 // impact sounds
8517 bool m_CanPlayImpactSound = true;
8518 float m_ImpactSpeed;
8520 //
8521 float m_HeatIsolation;
8522 float m_ItemModelLength;
8523 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8525 int m_VarLiquidType;
8526 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8527 int m_QuickBarBonus;
8528 bool m_IsBeingPlaced;
8529 bool m_IsHologram;
8530 bool m_IsTakeable;
8531 bool m_ThrowItemOnDrop;
8534 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8535 bool can_this_be_combined; //Check if item can be combined
8536 bool m_CanThisBeSplit; //Check if item can be split
8537 bool m_IsStoreLoad = false;
8538 bool m_CanShowQuantity;
8539 bool m_HasQuantityBar;
8540 protected bool m_CanBeDigged;
8541 protected bool m_IsResultOfSplit
8542
8543 string m_SoundAttType;
8544 // items color variables
8549 //-------------------------------------------------------
8550
8551 // light source managing
8553
8557
8558 //==============================================
8559 // agent system
8560 private int m_AttachedAgents;
8561
8563 void TransferModifiers(PlayerBase reciever);
8564
8565
8566 // Weapons & suppressors particle effects
8570 ref static map<string, int> m_WeaponTypeToID;
8571 static int m_LastRegisteredWeaponID = 0;
8572
8573 // Overheating effects
8575 float m_OverheatingShots;
8576 ref Timer m_CheckOverheating;
8577 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8578 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8579 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8580 ref array <ref OverheatingParticle> m_OverheatingParticles;
8581
8583 protected bool m_HideSelectionsBySlot;
8584
8585 // Admin Log
8586 PluginAdminLog m_AdminLog;
8587
8588 // misc
8589 ref Timer m_PhysDropTimer;
8590
8591 // Attachment Locking variables
8592 ref array<int> m_CompatibleLocks;
8593 protected int m_LockType;
8594 protected ref EffectSound m_LockingSound;
8595 protected string m_LockSoundSet;
8596
8597 // ItemSoundHandler variables
8598 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8599 protected int m_SoundSyncPlay; // id for sound to play
8600 protected int m_SoundSyncStop; // id for sound to stop
8601 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
8602
8604
8605 //temperature
8606 private float m_TemperaturePerQuantityWeight;
8607
8608 // -------------------------------------------------------------------------
8609 void ItemBase()
8610 {
8611 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8615
8616 if (!g_Game.IsDedicatedServer())
8617 {
8618 if (HasMuzzle())
8619 {
8621
8623 {
8625 }
8626 }
8627
8629 m_ActionsInitialize = false;
8630 }
8631
8632 m_OldLocation = null;
8633
8634 if (g_Game.IsServer())
8635 {
8636 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8637 }
8638
8639 if (ConfigIsExisting("headSelectionsToHide"))
8640 {
8642 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8643 }
8644
8645 m_HideSelectionsBySlot = false;
8646 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8647 {
8648 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8649 }
8650
8651 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8652
8653 m_IsResultOfSplit = false;
8654
8656 }
8657
8658 override void InitItemVariables()
8659 {
8660 super.InitItemVariables();
8661
8662 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8663 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8664 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8665 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8666 m_VarStackMax = ConfigGetFloat("varStackMax");
8667 m_Count = ConfigGetInt("count");
8668
8669 m_CanShowQuantity = ConfigGetBool("quantityShow");
8670 m_HasQuantityBar = ConfigGetBool("quantityBar");
8671
8672 m_CleannessInit = ConfigGetInt("varCleannessInit");
8674 m_CleannessMin = ConfigGetInt("varCleannessMin");
8675 m_CleannessMax = ConfigGetInt("varCleannessMax");
8676
8677 m_WantPlayImpactSound = false;
8678 m_ImpactSpeed = 0.0;
8679
8680 m_VarWetInit = ConfigGetFloat("varWetInit");
8682 m_VarWetMin = ConfigGetFloat("varWetMin");
8683 m_VarWetMax = ConfigGetFloat("varWetMax");
8684
8685 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8686 if (IsLiquidContainer() && GetQuantity() != 0)
8688 m_IsBeingPlaced = false;
8689 m_IsHologram = false;
8690 m_IsTakeable = true;
8691 m_CanBeMovedOverride = false;
8695 m_CanBeDigged = ConfigGetBool("canBeDigged");
8696
8697 m_CompatibleLocks = new array<int>();
8698 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8699 m_LockType = ConfigGetInt("lockType");
8700
8701 //Define if item can be split and set ability to be combined accordingly
8702 m_CanThisBeSplit = false;
8703 can_this_be_combined = false;
8704 if (ConfigIsExisting("canBeSplit"))
8705 {
8706 can_this_be_combined = ConfigGetBool("canBeSplit");
8708 }
8709
8710 m_ItemBehaviour = -1;
8711 if (ConfigIsExisting("itemBehaviour"))
8712 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8713
8714 //RegisterNetSyncVariableInt("m_VariablesMask");
8715 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8716 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8717 RegisterNetSyncVariableInt("m_VarLiquidType");
8718 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8719
8720 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8721 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8722 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8723
8724 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8725 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8726 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8727 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8728
8729 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8730 RegisterNetSyncVariableBool("m_IsTakeable");
8731 RegisterNetSyncVariableBool("m_IsHologram");
8732
8735 {
8736 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8737 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8738 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
8739 }
8740
8741 m_LockSoundSet = ConfigGetString("lockSoundSet");
8742
8744 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8745 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8746
8747 m_SoundSyncSlotID = -1;
8748 }
8749
8750 override int GetQuickBarBonus()
8751 {
8752 return m_QuickBarBonus;
8753 }
8754
8755 void InitializeActions()
8756 {
8758 if (!m_InputActionMap)
8759 {
8761 m_InputActionMap = iam;
8762 SetActions();
8764 }
8765 }
8766
8767 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8768 {
8770 {
8771 m_ActionsInitialize = true;
8773 }
8774
8775 actions = m_InputActionMap.Get(action_input_type);
8776 }
8777
8778 void SetActions()
8779 {
8780 AddAction(ActionTakeItem);
8781 AddAction(ActionTakeItemToHands);
8782 AddAction(ActionWorldCraft);
8784 AddAction(ActionAttachWithSwitch);
8785 }
8786
8787 void SetActionAnimOverrides(); // Override action animation for specific item
8788
8789 void AddAction(typename actionName)
8790 {
8791 ActionBase action = ActionManagerBase.GetAction(actionName);
8792
8793 if (!action)
8794 {
8795 Debug.LogError("Action " + actionName + " dosn't exist!");
8796 return;
8797 }
8798
8799 typename ai = action.GetInputType();
8800 if (!ai)
8801 {
8802 m_ActionsInitialize = false;
8803 return;
8804 }
8805
8806 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8807 if (!action_array)
8808 {
8809 action_array = new array<ActionBase_Basic>;
8810 m_InputActionMap.Insert(ai, action_array);
8811 }
8812 if (LogManager.IsActionLogEnable())
8813 {
8814 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8815 }
8816
8817 if (action_array.Find(action) != -1)
8818 {
8819 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8820 }
8821 else
8822 {
8823 action_array.Insert(action);
8824 }
8825 }
8826
8827 void RemoveAction(typename actionName)
8828 {
8829 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8830 ActionBase action = player.GetActionManager().GetAction(actionName);
8831 typename ai = action.GetInputType();
8832 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8833
8834 if (action_array)
8835 {
8836 action_array.RemoveItem(action);
8837 }
8838 }
8839
8840 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
8841 // Set -1 for params which should stay in default state
8842 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
8843 {
8844 ActionOverrideData overrideData = new ActionOverrideData();
8845 overrideData.m_CommandUID = commandUID;
8846 overrideData.m_CommandUIDProne = commandUIDProne;
8847 overrideData.m_StanceMask = stanceMask;
8848
8849 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
8850 if (!actionMap) // create new map of action > overidables map
8851 {
8852 actionMap = new TActionAnimOverrideMap();
8853 m_ItemActionOverrides.Insert(action, actionMap);
8854 }
8855
8856 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
8857
8858 }
8859
8860 void OnItemInHandsPlayerSwimStart(PlayerBase player);
8861
8862 ScriptedLightBase GetLight();
8863
8864 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8865 void LoadParticleConfigOnFire(int id)
8866 {
8867 if (!m_OnFireEffect)
8869
8872
8873 string config_to_search = "CfgVehicles";
8874 string muzzle_owner_config;
8875
8876 if (!m_OnFireEffect.Contains(id))
8877 {
8878 if (IsInherited(Weapon))
8879 config_to_search = "CfgWeapons";
8880
8881 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8882
8883 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8884
8885 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
8886
8887 if (config_OnFire_subclass_count > 0)
8888 {
8889 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8890
8891 for (int i = 0; i < config_OnFire_subclass_count; i++)
8892 {
8893 string particle_class = "";
8894 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8895 string config_OnFire_entry = config_OnFire_class + particle_class;
8896 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8897 WPOF_array.Insert(WPOF);
8898 }
8899
8900
8901 m_OnFireEffect.Insert(id, WPOF_array);
8902 }
8903 }
8904
8905 if (!m_OnBulletCasingEjectEffect.Contains(id))
8906 {
8907 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8908 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8909
8910 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8911
8912 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8913
8914 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8915 {
8916 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8917
8918 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8919 {
8920 string particle_class2 = "";
8921 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8922 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8923 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8924 WPOBE_array.Insert(WPOBE);
8925 }
8926
8927
8928 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8929 }
8930 }
8931 }
8932
8933 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8935 {
8938
8939 if (!m_OnOverheatingEffect.Contains(id))
8940 {
8941 string config_to_search = "CfgVehicles";
8942
8943 if (IsInherited(Weapon))
8944 config_to_search = "CfgWeapons";
8945
8946 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8947 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8948
8949 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
8950 {
8951
8952 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8953
8955 {
8956 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8957 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8958 Error(error);
8959 return;
8960 }
8961
8962 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8963 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8964
8965
8966
8967 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8968 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8969
8970 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8971 {
8972 string particle_class = "";
8973 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8974 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8975 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
8976
8977 if (entry_type == CT_CLASS)
8978 {
8979 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8980 WPOOH_array.Insert(WPOF);
8981 }
8982 }
8983
8984
8985 m_OnOverheatingEffect.Insert(id, WPOOH_array);
8986 }
8987 }
8988 }
8989
8990 float GetOverheatingValue()
8991 {
8992 return m_OverheatingShots;
8993 }
8994
8995 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
8996 {
8997 if (m_MaxOverheatingValue > 0)
8998 {
9000
9001 if (!m_CheckOverheating)
9003
9005 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9006
9007 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9008 }
9009 }
9010
9011 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9012 {
9014 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9015
9017 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9018
9020 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9021
9023 {
9025 }
9026 }
9027
9029 {
9031 }
9032
9033 void OnOverheatingDecay()
9034 {
9035 if (m_MaxOverheatingValue > 0)
9036 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9037 else
9039
9040 if (m_OverheatingShots <= 0)
9041 {
9044 }
9045 else
9046 {
9047 if (!m_CheckOverheating)
9049
9051 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9052 }
9053
9054 CheckOverheating(this, "", this);
9055 }
9056
9057 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9058 {
9060 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9061 }
9062
9063 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9064 {
9066 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9068 }
9069
9070 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9071 {
9073 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9074 }
9075
9076 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9077 {
9079 m_OverheatingParticles = new array<ref OverheatingParticle>;
9080
9081 OverheatingParticle OP = new OverheatingParticle();
9082 OP.RegisterParticle(p);
9083 OP.SetOverheatingLimitMin(min_heat_coef);
9084 OP.SetOverheatingLimitMax(max_heat_coef);
9085 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9086
9087 m_OverheatingParticles.Insert(OP);
9088 }
9089
9090 float GetOverheatingCoef()
9091 {
9092 if (m_MaxOverheatingValue > 0)
9094
9095 return -1;
9096 }
9097
9099 {
9101 {
9102 float overheat_coef = GetOverheatingCoef();
9103 int count = m_OverheatingParticles.Count();
9104
9105 for (int i = count; i > 0; --i)
9106 {
9107 int id = i - 1;
9108 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9109 Particle p = OP.GetParticle();
9110
9111 float overheat_min = OP.GetOverheatingLimitMin();
9112 float overheat_max = OP.GetOverheatingLimitMax();
9113
9114 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9115 {
9116 if (p)
9117 {
9118 p.Stop();
9119 OP.RegisterParticle(null);
9120 }
9121 }
9122 }
9123 }
9124 }
9125
9127 {
9129 {
9130 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9131 {
9132 int id = i - 1;
9133 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9134
9135 if (OP)
9136 {
9137 Particle p = OP.GetParticle();
9138
9139 if (p)
9140 {
9141 p.Stop();
9142 }
9143
9144 delete OP;
9145 }
9146 }
9147
9148 m_OverheatingParticles.Clear();
9150 }
9151 }
9152
9154 float GetInfectionChance(int system = 0, Param param = null)
9155 {
9156 return 0.0;
9157 }
9158
9159
9160 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9161 {
9162 return 250;//default value
9163 }
9164
9165 float GetFilterDamageRatio()
9166 {
9167 return 0;
9168 }
9169
9171 bool HasMuzzle()
9172 {
9173 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9174 return true;
9175
9176 return false;
9177 }
9178
9180 int GetMuzzleID()
9181 {
9182 if (!m_WeaponTypeToID)
9183 m_WeaponTypeToID = new map<string, int>;
9184
9185 if (m_WeaponTypeToID.Contains(GetType()))
9186 {
9187 return m_WeaponTypeToID.Get(GetType());
9188 }
9189 else
9190 {
9191 // Register new weapon ID
9193 }
9194
9196 }
9197
9204 {
9205 return -1;
9206 }
9207
9208
9209
9210 // -------------------------------------------------------------------------
9211 void ~ItemBase()
9212 {
9213 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
9214 {
9215 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9216 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9217
9218 if (r_index >= 0)
9219 {
9220 InventoryLocation r_il = new InventoryLocation;
9221 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9222
9223 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9224 int r_type = r_il.GetType();
9225 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9226 {
9227 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9228 }
9229 else if (r_type == InventoryLocationType.ATTACHMENT)
9230 {
9231 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9232 }
9233
9234 }
9235
9236 player.GetHumanInventory().ClearUserReservedLocation(this);
9237 }
9238
9239 if (m_LockingSound)
9240 SEffectManager.DestroyEffect(m_LockingSound);
9241 }
9242
9243
9244
9245 // -------------------------------------------------------------------------
9246 static int GetDebugActionsMask()
9247 {
9248 return ItemBase.m_DebugActionsMask;
9249 }
9250
9251 static bool HasDebugActionsMask(int mask)
9252 {
9253 return ItemBase.m_DebugActionsMask & mask;
9254 }
9255
9256 static void SetDebugActionsMask(int mask)
9257 {
9258 ItemBase.m_DebugActionsMask = mask;
9259 }
9260
9261 static void AddDebugActionsMask(int mask)
9262 {
9263 ItemBase.m_DebugActionsMask |= mask;
9264 }
9265
9266 static void RemoveDebugActionsMask(int mask)
9267 {
9268 ItemBase.m_DebugActionsMask &= ~mask;
9269 }
9270
9271 static void ToggleDebugActionsMask(int mask)
9272 {
9273 if (HasDebugActionsMask(mask))
9274 {
9276 }
9277 else
9278 {
9279 AddDebugActionsMask(mask);
9280 }
9281 }
9282
9283 // -------------------------------------------------------------------------
9284 void SetCEBasedQuantity()
9285 {
9286 if (GetEconomyProfile())
9287 {
9288 float q_max = GetEconomyProfile().GetQuantityMax();
9289 if (q_max > 0)
9290 {
9291 float q_min = GetEconomyProfile().GetQuantityMin();
9292 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9293
9294 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9295 {
9296 ComponentEnergyManager comp = GetCompEM();
9297 if (comp && (comp.GetEnergyMaxPristine() || comp.GetEnergyAtSpawn()))//checking for a potential for energy, we need to check both values, as both are optional, only when both are set to 0, we know the item can't have energy
9298 {
9299 comp.SetEnergy0To1(quantity_randomized);
9300 }
9301 }
9302 else if (HasQuantity())
9303 {
9304 SetQuantityNormalized(quantity_randomized, false);
9305 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9306 }
9307
9308 }
9309 }
9310 }
9311
9313 void LockToParent()
9314 {
9315 EntityAI parent = GetHierarchyParent();
9316
9317 if (parent)
9318 {
9319 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9320 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9321 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9322 }
9323 }
9324
9326 void UnlockFromParent()
9327 {
9328 EntityAI parent = GetHierarchyParent();
9329
9330 if (parent)
9331 {
9332 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9333 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9334 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9335 }
9336 }
9337
9338 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9339 {
9340 /*
9341 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9342 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
9343 */
9344 ItemBase item2 = ItemBase.Cast(entity2);
9345
9346 if (g_Game.IsClient())
9347 {
9348 if (ScriptInputUserData.CanStoreInputUserData())
9349 {
9350 ScriptInputUserData ctx = new ScriptInputUserData;
9352 ctx.Write(-1);
9353 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9354 ctx.Write(i1);
9355 ctx.Write(item2);
9356 ctx.Write(use_stack_max);
9357 ctx.Write(-1);
9358 ctx.Send();
9359
9360 if (IsCombineAll(item2, use_stack_max))
9361 {
9362 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9363 }
9364 }
9365 }
9366 else if (!g_Game.IsMultiplayer())
9367 {
9368 CombineItems(item2, use_stack_max);
9369 }
9370 }
9371
9372 bool IsLiquidPresent()
9373 {
9374 return (GetLiquidType() != 0 && HasQuantity());
9375 }
9376
9377 bool IsLiquidContainer()
9378 {
9379 return m_LiquidContainerMask != 0;
9380 }
9381
9383 {
9384 return m_LiquidContainerMask;
9385 }
9386
9387 bool IsBloodContainer()
9388 {
9389 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9390 return false;
9391 }
9392
9393 bool IsNVG()
9394 {
9395 return false;
9396 }
9397
9400 bool IsExplosive()
9401 {
9402 return false;
9403 }
9404
9406 {
9407 return "";
9408 }
9409
9411
9412 bool IsLightSource()
9413 {
9414 return false;
9415 }
9416
9418 {
9419 return true;
9420 }
9421
9422 //--- ACTION CONDITIONS
9423 //direction
9424 bool IsFacingPlayer(PlayerBase player, string selection)
9425 {
9426 return true;
9427 }
9428
9429 bool IsPlayerInside(PlayerBase player, string selection)
9430 {
9431 return true;
9432 }
9433
9434 override bool CanObstruct()
9435 {
9436 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9437 return !player || !IsPlayerInside(player, "");
9438 }
9439
9440 override bool IsBeingPlaced()
9441 {
9442 return m_IsBeingPlaced;
9443 }
9444
9445 void SetIsBeingPlaced(bool is_being_placed)
9446 {
9447 m_IsBeingPlaced = is_being_placed;
9448 if (!is_being_placed)
9450 SetSynchDirty();
9451 }
9452
9453 //server-side
9454 void OnEndPlacement() {}
9455
9456 override bool IsHologram()
9457 {
9458 return m_IsHologram;
9459 }
9460
9461 bool CanBeDigged()
9462 {
9463 return m_CanBeDigged;
9464 }
9465
9467 {
9468 return 1;
9469 }
9470
9471 bool CanMakeGardenplot()
9472 {
9473 return false;
9474 }
9475
9476 void SetIsHologram(bool is_hologram)
9477 {
9478 m_IsHologram = is_hologram;
9479 SetSynchDirty();
9480 }
9481 /*
9482 protected float GetNutritionalEnergy()
9483 {
9484 Edible_Base edible = Edible_Base.Cast(this);
9485 return edible.GetFoodEnergy();
9486 }
9487
9488 protected float GetNutritionalWaterContent()
9489 {
9490 Edible_Base edible = Edible_Base.Cast(this);
9491 return edible.GetFoodWater();
9492 }
9493
9494 protected float GetNutritionalIndex()
9495 {
9496 Edible_Base edible = Edible_Base.Cast(this);
9497 return edible.GetFoodNutritionalIndex();
9498 }
9499
9500 protected float GetNutritionalFullnessIndex()
9501 {
9502 Edible_Base edible = Edible_Base.Cast(this);
9503 return edible.GetFoodTotalVolume();
9504 }
9505
9506 protected float GetNutritionalToxicity()
9507 {
9508 Edible_Base edible = Edible_Base.Cast(this);
9509 return edible.GetFoodToxicity();
9510
9511 }
9512 */
9513
9514
9515 // -------------------------------------------------------------------------
9516 override void OnMovedInsideCargo(EntityAI container)
9517 {
9518 super.OnMovedInsideCargo(container);
9519
9520 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9521 }
9522
9523 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9524 {
9525 super.EEItemLocationChanged(oldLoc, newLoc);
9526
9527 PlayerBase newPlayer = null;
9528 PlayerBase oldPlayer = null;
9529
9530 if (newLoc.GetParent())
9531 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9532
9533 if (oldLoc.GetParent())
9534 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9535
9536 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
9537 {
9538 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9539
9540 if (rIndex >= 0)
9541 {
9542 InventoryLocation rIl = new InventoryLocation;
9543 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9544
9545 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9546 int rType = rIl.GetType();
9547 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
9548 {
9549 rIl.GetParent().GetOnReleaseLock().Invoke(this);
9550 }
9551 else if (rType == InventoryLocationType.ATTACHMENT)
9552 {
9553 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
9554 }
9555
9556 }
9557 }
9558
9559 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
9560 {
9561 if (newPlayer)
9562 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9563
9564 if (newPlayer == oldPlayer)
9565 {
9566 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9567 {
9568 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9569 {
9570 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9571 {
9572 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9573 }
9574 }
9575 else
9576 {
9577 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9578 }
9579 }
9580
9581 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9582 {
9583 int type = oldLoc.GetType();
9584 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9585 {
9586 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9587 }
9588 else if (type == InventoryLocationType.ATTACHMENT)
9589 {
9590 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9591 }
9592 }
9593 if (!m_OldLocation)
9594 {
9595 m_OldLocation = new InventoryLocation;
9596 }
9597 m_OldLocation.Copy(oldLoc);
9598 }
9599 else
9600 {
9601 if (m_OldLocation)
9602 {
9603 m_OldLocation.Reset();
9604 }
9605 }
9606
9607 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
9608 }
9609 else
9610 {
9611 if (newPlayer)
9612 {
9613 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9614 if (resIndex >= 0)
9615 {
9616 InventoryLocation il = new InventoryLocation;
9617 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9618 ItemBase it = ItemBase.Cast(il.GetItem());
9619 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9620 int rel_type = il.GetType();
9621 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9622 {
9623 il.GetParent().GetOnReleaseLock().Invoke(it);
9624 }
9625 else if (rel_type == InventoryLocationType.ATTACHMENT)
9626 {
9627 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9628 }
9629 //it.GetOnReleaseLock().Invoke(it);
9630 }
9631 }
9632 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9633 {
9634 //ThrowPhysically(oldPlayer, vector.Zero);
9635 m_ThrowItemOnDrop = false;
9636 }
9637
9638 if (m_OldLocation)
9639 {
9640 m_OldLocation.Reset();
9641 }
9642 }
9643
9644 if (oldLoc.GetType() == InventoryLocationType.TEMP)
9645 {
9646 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9647 }
9648
9649 if (newLoc.GetType() == InventoryLocationType.TEMP)
9650 {
9651 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9652 }
9653 }
9654
9655 override void EOnContact(IEntity other, Contact extra)
9656 {
9658 {
9659 int liquidType = -1;
9660 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9661 if (impactSpeed > 0.0)
9662 {
9663 m_ImpactSpeed = impactSpeed;
9664 #ifndef SERVER
9665 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9666 #else
9667 m_WantPlayImpactSound = true;
9668 SetSynchDirty();
9669 #endif
9670 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9671 }
9672 }
9673
9674 #ifdef SERVER
9675 if (GetCompEM() && GetCompEM().IsPlugged())
9676 {
9677 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9678 GetCompEM().UnplugThis();
9679 }
9680 #endif
9681 }
9682
9683 void RefreshPhysics();
9684
9685 override void OnCreatePhysics()
9686 {
9688 }
9689
9690 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9691 {
9692
9693 }
9694 // -------------------------------------------------------------------------
9695 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9696 {
9697 super.OnItemLocationChanged(old_owner, new_owner);
9698
9699 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9700 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9701
9702 if (!relatedPlayer && playerNew)
9703 relatedPlayer = playerNew;
9704
9705 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9706 {
9707 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9708 if (actionMgr)
9709 {
9710 ActionBase currentAction = actionMgr.GetRunningAction();
9711 if (currentAction)
9712 currentAction.OnItemLocationChanged(this);
9713 }
9714 }
9715
9716 Man ownerPlayerOld = null;
9717 Man ownerPlayerNew = null;
9718
9719 if (old_owner)
9720 {
9721 if (old_owner.IsMan())
9722 {
9723 ownerPlayerOld = Man.Cast(old_owner);
9724 }
9725 else
9726 {
9727 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9728 }
9729 }
9730 else
9731 {
9732 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9733 {
9734 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9735
9736 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9737 {
9738 GetCompEM().UnplugThis();
9739 }
9740 }
9741 }
9742
9743 if (new_owner)
9744 {
9745 if (new_owner.IsMan())
9746 {
9747 ownerPlayerNew = Man.Cast(new_owner);
9748 }
9749 else
9750 {
9751 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9752 }
9753 }
9754
9755 if (ownerPlayerOld != ownerPlayerNew)
9756 {
9757 if (ownerPlayerOld)
9758 {
9759 array<EntityAI> subItemsExit = new array<EntityAI>;
9760 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9761 for (int i = 0; i < subItemsExit.Count(); i++)
9762 {
9763 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9764 itemExit.OnInventoryExit(ownerPlayerOld);
9765 }
9766 }
9767
9768 if (ownerPlayerNew)
9769 {
9770 array<EntityAI> subItemsEnter = new array<EntityAI>;
9771 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9772 for (int j = 0; j < subItemsEnter.Count(); j++)
9773 {
9774 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9775 itemEnter.OnInventoryEnter(ownerPlayerNew);
9776 }
9777 }
9778 }
9779 else if (ownerPlayerNew != null)
9780 {
9781 PlayerBase nplayer;
9782 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9783 {
9784 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9785 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9786 for (int k = 0; k < subItemsUpdate.Count(); k++)
9787 {
9788 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9789 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9790 }
9791 }
9792 }
9793
9794 if (old_owner)
9795 old_owner.OnChildItemRemoved(this);
9796 if (new_owner)
9797 new_owner.OnChildItemReceived(this);
9798 }
9799
9800 // -------------------------------------------------------------------------------
9801 override void EEDelete(EntityAI parent)
9802 {
9803 super.EEDelete(parent);
9804 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9805 if (player)
9806 {
9807 OnInventoryExit(player);
9808
9809 if (player.IsAlive())
9810 {
9811 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9812 if (r_index >= 0)
9813 {
9814 InventoryLocation r_il = new InventoryLocation;
9815 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9816
9817 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9818 int r_type = r_il.GetType();
9819 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9820 {
9821 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9822 }
9823 else if (r_type == InventoryLocationType.ATTACHMENT)
9824 {
9825 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9826 }
9827
9828 }
9829
9830 player.RemoveQuickBarEntityShortcut(this);
9831 }
9832 }
9833 }
9834 // -------------------------------------------------------------------------------
9835 override void EEKilled(Object killer)
9836 {
9837 super.EEKilled(killer);
9838
9840 if (killer && killer.IsFireplace() && CanExplodeInFire())
9841 {
9842 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9843 {
9844 if (IsMagazine())
9845 {
9846 if (Magazine.Cast(this).GetAmmoCount() > 0)
9847 {
9848 ExplodeAmmo();
9849 }
9850 }
9851 else
9852 {
9853 Explode(DamageType.EXPLOSION);
9854 }
9855 }
9856 }
9857 }
9858
9859 override void OnWasAttached(EntityAI parent, int slot_id)
9860 {
9861 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9862
9863 super.OnWasAttached(parent, slot_id);
9864
9865 if (HasQuantity())
9866 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9867
9868 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9869 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
9870 }
9871
9872 override void OnWasDetached(EntityAI parent, int slot_id)
9873 {
9874 super.OnWasDetached(parent, slot_id);
9875
9876 if (HasQuantity())
9877 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9878
9879 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9880 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
9881 }
9882
9883 override string ChangeIntoOnAttach(string slot)
9884 {
9885 int idx;
9886 TStringArray inventory_slots = new TStringArray;
9887 TStringArray attach_types = new TStringArray;
9888
9889 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9890 if (inventory_slots.Count() < 1) //is string
9891 {
9892 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9893 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9894 }
9895 else //is array
9896 {
9897 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9898 }
9899
9900 idx = inventory_slots.Find(slot);
9901 if (idx < 0)
9902 return "";
9903
9904 return attach_types.Get(idx);
9905 }
9906
9907 override string ChangeIntoOnDetach()
9908 {
9909 int idx = -1;
9910 string slot;
9911
9912 TStringArray inventory_slots = new TStringArray;
9913 TStringArray detach_types = new TStringArray;
9914
9915 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9916 if (inventory_slots.Count() < 1) //is string
9917 {
9918 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9919 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9920 }
9921 else //is array
9922 {
9923 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9924 if (detach_types.Count() < 1)
9925 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9926 }
9927
9928 for (int i = 0; i < inventory_slots.Count(); i++)
9929 {
9930 slot = inventory_slots.Get(i);
9931 }
9932
9933 if (slot != "")
9934 {
9935 if (detach_types.Count() == 1)
9936 idx = 0;
9937 else
9938 idx = inventory_slots.Find(slot);
9939 }
9940 if (idx < 0)
9941 return "";
9942
9943 return detach_types.Get(idx);
9944 }
9945
9946 void ExplodeAmmo()
9947 {
9948 //timer
9949 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9950
9951 //min/max time
9952 float min_time = 1;
9953 float max_time = 3;
9954 float delay = Math.RandomFloat(min_time, max_time);
9955
9956 explode_timer.Run(delay, this, "DoAmmoExplosion");
9957 }
9958
9959 void DoAmmoExplosion()
9960 {
9961 Magazine magazine = Magazine.Cast(this);
9962 int pop_sounds_count = 6;
9963 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9964
9965 //play sound
9966 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9967 string sound_name = pop_sounds[ sound_idx ];
9968 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
9969
9970 //remove ammo count
9971 magazine.ServerAddAmmoCount(-1);
9972
9973 //if condition then repeat -> ExplodeAmmo
9974 float min_temp_to_explode = 100; //min temperature for item to explode
9975
9976 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9977 {
9978 ExplodeAmmo();
9979 }
9980 }
9981
9982 // -------------------------------------------------------------------------------
9983 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9984 {
9985 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9986
9987 const int CHANCE_DAMAGE_CARGO = 4;
9988 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9989 const int CHANCE_DAMAGE_NOTHING = 2;
9990
9991 if (IsClothing() || IsContainer() || IsItemTent())
9992 {
9993 float dmg = damageResult.GetDamage("","Health") * -0.5;
9994 int chances;
9995 int rnd;
9996
9997 if (GetInventory().GetCargo())
9998 {
9999 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10000 rnd = Math.RandomInt(0,chances);
10001
10002 if (rnd < CHANCE_DAMAGE_CARGO)
10003 {
10004 DamageItemInCargo(dmg);
10005 }
10006 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10007 {
10009 }
10010 }
10011 else
10012 {
10013 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10014 rnd = Math.RandomInt(0,chances);
10015
10016 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10017 {
10019 }
10020 }
10021 }
10022 }
10023
10024 bool DamageItemInCargo(float damage)
10025 {
10026 CargoBase cargo = GetInventory().GetCargo();
10027 if (cargo)
10028 {
10029 int item_count = cargo.GetItemCount();
10030 if (item_count > 0)
10031 {
10032 int random_pick = Math.RandomInt(0, item_count);
10033 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
10034 if (!item.IsExplosive())
10035 {
10036 item.AddHealth("","",damage);
10037 return true;
10038 }
10039 }
10040 }
10041 return false;
10042 }
10043
10044 bool DamageItemAttachments(float damage)
10045 {
10046 GameInventory inventory = GetInventory();
10047 int attachment_count = inventory.AttachmentCount();
10048 if (attachment_count > 0)
10049 {
10050 int random_pick = Math.RandomInt(0, attachment_count);
10051 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
10052 if (!attachment.IsExplosive())
10053 {
10054 attachment.AddHealth("","",damage);
10055 return true;
10056 }
10057 }
10058 return false;
10059 }
10060
10061 override bool IsSplitable()
10062 {
10063 return m_CanThisBeSplit;
10064 }
10065 //----------------
10066 override bool CanBeSplit()
10067 {
10068 if (IsSplitable() && (GetQuantity() > 1))
10069 return GetInventory().CanRemoveEntity();
10070
10071 return false;
10072 }
10073
10074 protected bool ShouldSplitQuantity(float quantity)
10075 {
10076 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
10077 if (!IsSplitable())
10078 return false;
10079
10080 // nothing to split?
10081 if (GetQuantity() <= 1)
10082 return false;
10083
10084 // check if we should re-use the item instead of creating a new copy?
10085 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
10086 int delta = GetQuantity() - quantity;
10087 if (delta == 0)
10088 return false;
10089
10090 // valid to split
10091 return true;
10092 }
10093
10094 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10095 {
10096 if (g_Game.IsClient())
10097 {
10098 if (ScriptInputUserData.CanStoreInputUserData())
10099 {
10100 ScriptInputUserData ctx = new ScriptInputUserData;
10102 ctx.Write(1);
10103 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10104 ctx.Write(i1);
10105 ctx.Write(destination_entity);
10106 ctx.Write(true);
10107 ctx.Write(slot_id);
10108 ctx.Send();
10109 }
10110 }
10111 else if (!g_Game.IsMultiplayer())
10112 {
10113 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
10114 }
10115 }
10116
10117 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10118 {
10119 float split_quantity_new;
10120 ItemBase new_item;
10121 float quantity = GetQuantity();
10122 float stack_max = GetTargetQuantityMax(slot_id);
10123 InventoryLocation loc = new InventoryLocation;
10124
10125 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10126 {
10127 if (stack_max <= GetQuantity())
10128 split_quantity_new = stack_max;
10129 else
10130 split_quantity_new = GetQuantity();
10131
10132 if (ShouldSplitQuantity(split_quantity_new))
10133 {
10134 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10135 if (new_item)
10136 {
10137 new_item.SetResultOfSplit(true);
10138 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10139 AddQuantity(-split_quantity_new, false, true);
10140 new_item.SetQuantity(split_quantity_new, false, true);
10141 }
10142 }
10143 }
10144 else if (destination_entity && slot_id == -1)
10145 {
10146 if (quantity > stack_max)
10147 split_quantity_new = stack_max;
10148 else
10149 split_quantity_new = quantity;
10150
10151 if (ShouldSplitQuantity(split_quantity_new))
10152 {
10153 GameInventory destinationInventory = destination_entity.GetInventory();
10154 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10155 {
10156 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10157 new_item = ItemBase.Cast(o);
10158 }
10159
10160 if (new_item)
10161 {
10162 new_item.SetResultOfSplit(true);
10163 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10164 AddQuantity(-split_quantity_new, false, true);
10165 new_item.SetQuantity(split_quantity_new, false, true);
10166 }
10167 }
10168 }
10169 else
10170 {
10171 if (stack_max != 0)
10172 {
10173 if (stack_max < GetQuantity())
10174 {
10175 split_quantity_new = GetQuantity() - stack_max;
10176 }
10177
10178 if (split_quantity_new == 0)
10179 {
10180 if (!g_Game.IsMultiplayer())
10181 player.PhysicalPredictiveDropItem(this);
10182 else
10183 player.ServerDropEntity(this);
10184 return;
10185 }
10186
10187 if (ShouldSplitQuantity(split_quantity_new))
10188 {
10189 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10190
10191 if (new_item)
10192 {
10193 new_item.SetResultOfSplit(true);
10194 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10195 SetQuantity(split_quantity_new, false, true);
10196 new_item.SetQuantity(stack_max, false, true);
10197 new_item.PlaceOnSurface();
10198 }
10199 }
10200 }
10201 }
10202 }
10203
10204 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10205 {
10206 float split_quantity_new;
10207 ItemBase new_item;
10208 float quantity = GetQuantity();
10209 float stack_max = GetTargetQuantityMax(slot_id);
10210 InventoryLocation loc = new InventoryLocation;
10211
10212 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10213 {
10214 if (stack_max <= GetQuantity())
10215 split_quantity_new = stack_max;
10216 else
10217 split_quantity_new = GetQuantity();
10218
10219 if (ShouldSplitQuantity(split_quantity_new))
10220 {
10221 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10222 if (new_item)
10223 {
10224 new_item.SetResultOfSplit(true);
10225 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10226 AddQuantity(-split_quantity_new, false, true);
10227 new_item.SetQuantity(split_quantity_new, false, true);
10228 }
10229 }
10230 }
10231 else if (destination_entity && slot_id == -1)
10232 {
10233 if (quantity > stack_max)
10234 split_quantity_new = stack_max;
10235 else
10236 split_quantity_new = quantity;
10237
10238 if (ShouldSplitQuantity(split_quantity_new))
10239 {
10240 GameInventory destinationInventory = destination_entity.GetInventory();
10241 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10242 {
10243 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10244 new_item = ItemBase.Cast(o);
10245 }
10246
10247 if (new_item)
10248 {
10249 new_item.SetResultOfSplit(true);
10250 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10251 AddQuantity(-split_quantity_new, false, true);
10252 new_item.SetQuantity(split_quantity_new, false, true);
10253 }
10254 }
10255 }
10256 else
10257 {
10258 if (stack_max != 0)
10259 {
10260 if (stack_max < GetQuantity())
10261 {
10262 split_quantity_new = GetQuantity() - stack_max;
10263 }
10264
10265 if (ShouldSplitQuantity(split_quantity_new))
10266 {
10267 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10268
10269 if (new_item)
10270 {
10271 new_item.SetResultOfSplit(true);
10272 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10273 SetQuantity(split_quantity_new, false, true);
10274 new_item.SetQuantity(stack_max, false, true);
10275 new_item.PlaceOnSurface();
10276 }
10277 }
10278 }
10279 }
10280 }
10281
10282 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10283 {
10284 if (g_Game.IsClient())
10285 {
10286 if (ScriptInputUserData.CanStoreInputUserData())
10287 {
10288 ScriptInputUserData ctx = new ScriptInputUserData;
10290 ctx.Write(4);
10291 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10292 ctx.Write(thiz);
10293 dst.WriteToContext(ctx);
10294 ctx.Send();
10295 }
10296 }
10297 else if (!g_Game.IsMultiplayer())
10298 {
10300 }
10301 }
10302
10303 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10304 {
10305 if (g_Game.IsClient())
10306 {
10307 if (ScriptInputUserData.CanStoreInputUserData())
10308 {
10309 ScriptInputUserData ctx = new ScriptInputUserData;
10311 ctx.Write(2);
10312 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10313 ctx.Write(dummy);
10314 ctx.Write(destination_entity);
10315 ctx.Write(true);
10316 ctx.Write(idx);
10317 ctx.Write(row);
10318 ctx.Write(col);
10319 ctx.Send();
10320 }
10321 }
10322 else if (!g_Game.IsMultiplayer())
10323 {
10324 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10325 }
10326 }
10327
10328 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10329 {
10331 }
10332
10333 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10334 {
10335 float quantity = GetQuantity();
10336 float split_quantity_new;
10337 ItemBase new_item;
10338 if (dst.IsValid())
10339 {
10340 int slot_id = dst.GetSlot();
10341 float stack_max = GetTargetQuantityMax(slot_id);
10342
10343 if (quantity > stack_max)
10344 split_quantity_new = stack_max;
10345 else
10346 split_quantity_new = quantity;
10347
10348 if (ShouldSplitQuantity(split_quantity_new))
10349 {
10350 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10351
10352 if (new_item)
10353 {
10354 new_item.SetResultOfSplit(true);
10355 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10356 AddQuantity(-split_quantity_new, false, true);
10357 new_item.SetQuantity(split_quantity_new, false, true);
10358 }
10359
10360 return new_item;
10361 }
10362 }
10363
10364 return null;
10365 }
10366
10367 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10368 {
10369 float quantity = GetQuantity();
10370 float split_quantity_new;
10371 ItemBase new_item;
10372 if (destination_entity)
10373 {
10374 float stackable = GetTargetQuantityMax();
10375 if (quantity > stackable)
10376 split_quantity_new = stackable;
10377 else
10378 split_quantity_new = quantity;
10379
10380 if (ShouldSplitQuantity(split_quantity_new))
10381 {
10382 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10383 if (new_item)
10384 {
10385 new_item.SetResultOfSplit(true);
10386 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10387 AddQuantity(-split_quantity_new, false, true);
10388 new_item.SetQuantity(split_quantity_new, false, true);
10389 }
10390 }
10391 }
10392 }
10393
10394 void SplitIntoStackMaxHandsClient(PlayerBase player)
10395 {
10396 if (g_Game.IsClient())
10397 {
10398 if (ScriptInputUserData.CanStoreInputUserData())
10399 {
10400 ScriptInputUserData ctx = new ScriptInputUserData;
10402 ctx.Write(3);
10403 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10404 ctx.Write(i1);
10405 ItemBase destination_entity = this;
10406 ctx.Write(destination_entity);
10407 ctx.Write(true);
10408 ctx.Write(0);
10409 ctx.Send();
10410 }
10411 }
10412 else if (!g_Game.IsMultiplayer())
10413 {
10414 SplitIntoStackMaxHands(player);
10415 }
10416 }
10417
10418 void SplitIntoStackMaxHands(PlayerBase player)
10419 {
10420 float quantity = GetQuantity();
10421 float split_quantity_new;
10422 ref ItemBase new_item;
10423 if (player)
10424 {
10425 float stackable = GetTargetQuantityMax();
10426 if (quantity > stackable)
10427 split_quantity_new = stackable;
10428 else
10429 split_quantity_new = quantity;
10430
10431 if (ShouldSplitQuantity(split_quantity_new))
10432 {
10433 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10434 new_item = ItemBase.Cast(in_hands);
10435 if (new_item)
10436 {
10437 new_item.SetResultOfSplit(true);
10438 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10439 AddQuantity(-split_quantity_new, false, true);
10440 new_item.SetQuantity(split_quantity_new, false, true);
10441 }
10442 }
10443 }
10444 }
10445
10446 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10447 {
10448 float quantity = GetQuantity();
10449 float split_quantity_new = Math.Floor(quantity * 0.5);
10450
10451 if (!ShouldSplitQuantity(split_quantity_new))
10452 return;
10453
10454 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10455
10456 if (new_item)
10457 {
10458 if (new_item.GetQuantityMax() < split_quantity_new)
10459 {
10460 split_quantity_new = new_item.GetQuantityMax();
10461 }
10462
10463 new_item.SetResultOfSplit(true);
10464 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10465
10466 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10467 {
10468 AddQuantity(-1, false, true);
10469 new_item.SetQuantity(1, false, true);
10470 }
10471 else
10472 {
10473 AddQuantity(-split_quantity_new, false, true);
10474 new_item.SetQuantity(split_quantity_new, false, true);
10475 }
10476 }
10477 }
10478
10479 void SplitItem(PlayerBase player)
10480 {
10481 float quantity = GetQuantity();
10482 float split_quantity_new = Math.Floor(quantity / 2);
10483
10484 if (!ShouldSplitQuantity(split_quantity_new))
10485 return;
10486
10487 InventoryLocation invloc = new InventoryLocation;
10488 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10489
10490 ItemBase new_item;
10491 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10492
10493 if (new_item)
10494 {
10495 if (new_item.GetQuantityMax() < split_quantity_new)
10496 {
10497 split_quantity_new = new_item.GetQuantityMax();
10498 }
10499 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10500 {
10501 AddQuantity(-1, false, true);
10502 new_item.SetQuantity(1, false, true);
10503 }
10504 else if (split_quantity_new > 1)
10505 {
10506 AddQuantity(-split_quantity_new, false, true);
10507 new_item.SetQuantity(split_quantity_new, false, true);
10508 }
10509 }
10510 }
10511
10513 void OnQuantityChanged(float delta)
10514 {
10515 SetWeightDirty();
10516 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10517
10518 if (parent)
10519 parent.OnAttachmentQuantityChangedEx(this, delta);
10520
10521 if (IsLiquidContainer())
10522 {
10523 if (GetQuantityNormalized() <= 0.0)
10524 {
10526 }
10527 else if (GetLiquidType() == LIQUID_NONE)
10528 {
10529 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10531 }
10532 }
10533 }
10534
10537 {
10538 // insert code here
10539 }
10540
10542 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10543 {
10545 }
10546
10547 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10548 {
10549 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10550
10551 if (g_Game.IsServer())
10552 {
10553 if (newLevel == GameConstants.STATE_RUINED)
10554 {
10556 EntityAI parent = GetHierarchyParent();
10557 if (parent && parent.IsFireplace())
10558 {
10559 CargoBase cargo = GetInventory().GetCargo();
10560 if (cargo)
10561 {
10562 for (int i = 0; i < cargo.GetItemCount(); ++i)
10563 {
10564 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10565 }
10566 }
10567 }
10568 }
10569
10570 if (IsResultOfSplit())
10571 {
10572 // reset the splitting result flag, return to normal item behavior
10573 SetResultOfSplit(false);
10574 return;
10575 }
10576
10577 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10578 {
10579 SetCleanness(0);//unclean the item upon damage dealt
10580 }
10581 }
10582 }
10583
10584 // just the split? TODO: verify
10585 override void OnRightClick()
10586 {
10587 super.OnRightClick();
10588
10589 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
10590 {
10591 if (g_Game.IsClient())
10592 {
10593 if (ScriptInputUserData.CanStoreInputUserData())
10594 {
10595 EntityAI root = GetHierarchyRoot();
10596 Man playerOwner = GetHierarchyRootPlayer();
10597 InventoryLocation dst = new InventoryLocation;
10598
10599 // If we have no hierarchy root player and the root is the same as this item the source item is in the vicinity so we want to create the new split item there also
10600 if (!playerOwner && root && root == this)
10601 {
10603 }
10604 else
10605 {
10606 // Check if we can place the new split item in the same parent where the source item is placed in or otherwise drop it in vicinity
10607 GetInventory().GetCurrentInventoryLocation(dst);
10608 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
10609 {
10610 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10611 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
10612 {
10614 }
10615 else
10616 {
10617 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10618 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10619 this shouldnt cause issues within this scope*/
10620 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10621 {
10623 }
10624 else
10625 {
10626 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10627 }
10628 }
10629 }
10630 }
10631
10632 ScriptInputUserData ctx = new ScriptInputUserData;
10634 ctx.Write(4);
10635 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10636 ctx.Write(thiz);
10637 dst.WriteToContext(ctx);
10638 ctx.Write(true); // dummy
10639 ctx.Send();
10640 }
10641 }
10642 else if (!g_Game.IsMultiplayer())
10643 {
10644 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
10645 }
10646 }
10647 }
10648
10649 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
10650 {
10651 if (root)
10652 {
10653 vector m4[4];
10654 root.GetTransform(m4);
10655 dst.SetGround(this, m4);
10656 }
10657 else
10658 {
10659 GetInventory().GetCurrentInventoryLocation(dst);
10660 }
10661 }
10662
10663 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10664 {
10665 //TODO: delete check zero quantity check after fix double posts hands fsm events
10666 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10667 return false;
10668
10669 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10670 return false;
10671
10672 //can_this_be_combined = ConfigGetBool("canBeSplit");
10674 return false;
10675
10676
10677 Magazine mag = Magazine.Cast(this);
10678 if (mag)
10679 {
10680 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10681 return false;
10682
10683 if (stack_max_limit)
10684 {
10685 Magazine other_mag = Magazine.Cast(other_item);
10686 if (other_item)
10687 {
10688 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10689 return false;
10690 }
10691
10692 }
10693 }
10694 else
10695 {
10696 //TODO: delete check zero quantity check after fix double posts hands fsm events
10697 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10698 return false;
10699
10700 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10701 return false;
10702 }
10703
10704 PlayerBase player = null;
10705 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10706 {
10707 if (player.GetInventory().HasAttachment(this))
10708 return false;
10709
10710 if (player.IsItemsToDelete())
10711 return false;
10712 }
10713
10714 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10715 return false;
10716
10717 int slotID;
10718 string slotName;
10719 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10720 return false;
10721
10722 return true;
10723 }
10724
10725 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10726 {
10727 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10728 }
10729
10730 bool IsResultOfSplit()
10731 {
10732 return m_IsResultOfSplit;
10733 }
10734
10735 void SetResultOfSplit(bool value)
10736 {
10737 m_IsResultOfSplit = value;
10738 }
10739
10740 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10741 {
10742 return ComputeQuantityUsedEx(other_item, use_stack_max);
10743 }
10744
10745 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10746 {
10747 float other_item_quantity = other_item.GetQuantity();
10748 float this_free_space;
10749
10750 float stack_max = GetQuantityMax();
10751
10752 this_free_space = stack_max - GetQuantity();
10753
10754 if (other_item_quantity > this_free_space)
10755 {
10756 return this_free_space;
10757 }
10758 else
10759 {
10760 return other_item_quantity;
10761 }
10762 }
10763
10764 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10765 {
10766 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10767 }
10768
10769 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10770 {
10771 if (!CanBeCombined(other_item, false))
10772 return;
10773
10774 if (!IsMagazine() && other_item)
10775 {
10776 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10777 if (quantity_used != 0)
10778 {
10779 float hp1 = GetHealth01("","");
10780 float hp2 = other_item.GetHealth01("","");
10781 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10782 hpResult = hpResult / (GetQuantity() + quantity_used);
10783
10784 hpResult *= GetMaxHealth();
10785 Math.Round(hpResult);
10786 SetHealth("", "Health", hpResult);
10787
10788 AddQuantity(quantity_used);
10789 other_item.AddQuantity(-quantity_used);
10790 }
10791 }
10792 OnCombine(other_item);
10793 }
10794
10795 void OnCombine(ItemBase other_item)
10796 {
10797 #ifdef SERVER
10798 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10799 GetHierarchyParent().IncreaseLifetimeUp();
10800 #endif
10801 };
10802
10803 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10804 {
10805 PlayerBase p = PlayerBase.Cast(player);
10806
10807 array<int> recipesIds = p.m_Recipes;
10808 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10809 if (moduleRecipesManager)
10810 {
10811 EntityAI itemInHands = player.GetEntityInHands();
10812 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10813 }
10814
10815 for (int i = 0;i < recipesIds.Count(); i++)
10816 {
10817 int key = recipesIds.Get(i);
10818 string recipeName = moduleRecipesManager.GetRecipeName(key);
10819 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10820 }
10821 }
10822
10823 // -------------------------------------------------------------------------
10824 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10825 {
10826 super.GetDebugActions(outputList);
10827
10828 //quantity
10829 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10830 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10831 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10832 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10833 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10834
10835 //health
10836 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10837 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10838 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10839 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10840 //temperature
10841 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10842 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10843 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10844 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10845
10846 //wet
10847 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10848 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10849 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10850
10851 //liquidtype
10852 if (IsLiquidContainer())
10853 {
10854 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10855 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10856 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10857 }
10858
10859 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10860 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10861
10862 // watch
10863 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10864 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10865 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10866
10867 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10868
10869 InventoryLocation loc = new InventoryLocation();
10870 GetInventory().GetCurrentInventoryLocation(loc);
10871 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
10872 {
10873 if (Gizmo_IsSupported())
10874 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
10875 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
10876 }
10877
10878 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10879 }
10880
10881 // -------------------------------------------------------------------------
10882 // -------------------------------------------------------------------------
10883 // -------------------------------------------------------------------------
10884 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10885 {
10886 super.OnAction(action_id, player, ctx);
10887
10888 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
10889 {
10890 switch (action_id)
10891 {
10892 case EActions.GIZMO_OBJECT:
10893 if (GetGizmoApi())
10894 GetGizmoApi().SelectObject(this);
10895 return true;
10896 case EActions.GIZMO_PHYSICS:
10897 if (GetGizmoApi())
10898 GetGizmoApi().SelectPhysics(GetPhysics());
10899 return true;
10900 }
10901 }
10902
10903 if (g_Game.IsServer())
10904 {
10905 switch (action_id)
10906 {
10907 case EActions.DELETE:
10908 Delete();
10909 return true;
10910 }
10911 }
10912
10913 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10914 {
10915 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10916 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10917 PlayerBase p = PlayerBase.Cast(player);
10918 if (EActions.RECIPES_RANGE_START < 1000)
10919 {
10920 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10921 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10922 }
10923 }
10924 #ifndef SERVER
10925 else if (action_id == EActions.WATCH_PLAYER)
10926 {
10927 PluginDeveloper.SetDeveloperItemClientEx(player);
10928 }
10929 #endif
10930 if (g_Game.IsServer())
10931 {
10932 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10933 {
10934 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10935 OnDebugButtonPressServer(id + 1);
10936 }
10937
10938 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10939 {
10940 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10941 InsertAgent(agent_id,100);
10942 }
10943
10944 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10945 {
10946 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10947 RemoveAgent(agent_id2);
10948 }
10949
10950 else if (action_id == EActions.ADD_QUANTITY)
10951 {
10952 if (IsMagazine())
10953 {
10954 Magazine mag = Magazine.Cast(this);
10955 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10956 }
10957 else
10958 {
10959 AddQuantity(GetQuantityMax() * 0.2);
10960 }
10961
10962 if (m_EM)
10963 {
10964 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10965 }
10966 //PrintVariables();
10967 }
10968
10969 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10970 {
10971 if (IsMagazine())
10972 {
10973 Magazine mag2 = Magazine.Cast(this);
10974 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10975 }
10976 else
10977 {
10978 AddQuantity(- GetQuantityMax() * 0.2);
10979 }
10980 if (m_EM)
10981 {
10982 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10983 }
10984 //PrintVariables();
10985 }
10986
10987 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10988 {
10989 SetQuantity(0);
10990
10991 if (m_EM)
10992 {
10993 m_EM.SetEnergy(0);
10994 }
10995 }
10996
10997 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10998 {
11000
11001 if (m_EM)
11002 {
11003 m_EM.SetEnergy(m_EM.GetEnergyMax());
11004 }
11005 }
11006
11007 else if (action_id == EActions.ADD_HEALTH)
11008 {
11009 AddHealth("","",GetMaxHealth("","Health")/5);
11010 }
11011 else if (action_id == EActions.REMOVE_HEALTH)
11012 {
11013 AddHealth("","",-GetMaxHealth("","Health")/5);
11014 }
11015 else if (action_id == EActions.DESTROY_HEALTH)
11016 {
11017 SetHealth01("","",0);
11018 }
11019 else if (action_id == EActions.WATCH_ITEM)
11020 {
11022 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11023 #ifdef DEVELOPER
11024 SetDebugDeveloper_item(this);
11025 #endif
11026 }
11027
11028 else if (action_id == EActions.ADD_TEMPERATURE)
11029 {
11030 AddTemperature(20);
11031 //PrintVariables();
11032 }
11033
11034 else if (action_id == EActions.REMOVE_TEMPERATURE)
11035 {
11036 AddTemperature(-20);
11037 //PrintVariables();
11038 }
11039
11040 else if (action_id == EActions.FLIP_FROZEN)
11041 {
11042 SetFrozen(!GetIsFrozen());
11043 //PrintVariables();
11044 }
11045
11046 else if (action_id == EActions.ADD_WETNESS)
11047 {
11048 AddWet(GetWetMax()/5);
11049 //PrintVariables();
11050 }
11051
11052 else if (action_id == EActions.REMOVE_WETNESS)
11053 {
11054 AddWet(-GetWetMax()/5);
11055 //PrintVariables();
11056 }
11057
11058 else if (action_id == EActions.LIQUIDTYPE_UP)
11059 {
11060 int curr_type = GetLiquidType();
11061 SetLiquidType(curr_type * 2);
11062 //AddWet(1);
11063 //PrintVariables();
11064 }
11065
11066 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11067 {
11068 int curr_type2 = GetLiquidType();
11069 SetLiquidType(curr_type2 / 2);
11070 }
11071
11072 else if (action_id == EActions.MAKE_SPECIAL)
11073 {
11074 auto debugParams = DebugSpawnParams.WithPlayer(player);
11075 OnDebugSpawnEx(debugParams);
11076 }
11077
11078 }
11079
11080
11081 return false;
11082 }
11083
11084 // -------------------------------------------------------------------------
11085
11086
11089 void OnActivatedByTripWire();
11090
11092 void OnActivatedByItem(notnull ItemBase item);
11093
11094 //----------------------------------------------------------------
11095 //returns true if item is able to explode when put in fire
11096 bool CanExplodeInFire()
11097 {
11098 return false;
11099 }
11100
11101 //----------------------------------------------------------------
11102 bool CanEat()
11103 {
11104 return true;
11105 }
11106
11107 //----------------------------------------------------------------
11108 override bool IsIgnoredByConstruction()
11109 {
11110 return true;
11111 }
11112
11113 //----------------------------------------------------------------
11114 //has FoodStages in config?
11115 bool HasFoodStage()
11116 {
11117 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11118 return g_Game.ConfigIsExisting(config_path);
11119 }
11120
11122 FoodStage GetFoodStage()
11123 {
11124 return null;
11125 }
11126
11127 bool CanBeCooked()
11128 {
11129 return false;
11130 }
11131
11132 bool CanBeCookedOnStick()
11133 {
11134 return false;
11135 }
11136
11138 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11140
11141 //----------------------------------------------------------------
11142 bool CanRepair(ItemBase item_repair_kit)
11143 {
11144 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11145 return module_repairing.CanRepair(this, item_repair_kit);
11146 }
11147
11148 //----------------------------------------------------------------
11149 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11150 {
11151 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11152 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11153 }
11154
11155 //----------------------------------------------------------------
11156 int GetItemSize()
11157 {
11158 /*
11159 vector v_size = this.ConfigGetVector("itemSize");
11160 int v_size_x = v_size[0];
11161 int v_size_y = v_size[1];
11162 int size = v_size_x * v_size_y;
11163 return size;
11164 */
11165
11166 return 1;
11167 }
11168
11169 //----------------------------------------------------------------
11170 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11171 bool CanBeMovedOverride()
11172 {
11173 return m_CanBeMovedOverride;
11174 }
11175
11176 //----------------------------------------------------------------
11177 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11178 void SetCanBeMovedOverride(bool setting)
11179 {
11180 m_CanBeMovedOverride = setting;
11181 }
11182
11183 //----------------------------------------------------------------
11191 void MessageToOwnerStatus(string text)
11192 {
11193 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11194
11195 if (player)
11196 {
11197 player.MessageStatus(text);
11198 }
11199 }
11200
11201 //----------------------------------------------------------------
11209 void MessageToOwnerAction(string text)
11210 {
11211 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11212
11213 if (player)
11214 {
11215 player.MessageAction(text);
11216 }
11217 }
11218
11219 //----------------------------------------------------------------
11227 void MessageToOwnerFriendly(string text)
11228 {
11229 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11230
11231 if (player)
11232 {
11233 player.MessageFriendly(text);
11234 }
11235 }
11236
11237 //----------------------------------------------------------------
11245 void MessageToOwnerImportant(string text)
11246 {
11247 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11248
11249 if (player)
11250 {
11251 player.MessageImportant(text);
11252 }
11253 }
11254
11255 override bool IsItemBase()
11256 {
11257 return true;
11258 }
11259
11260 // Checks if item is of questioned kind
11261 override bool KindOf(string tag)
11262 {
11263 bool found = false;
11264 string item_name = this.GetType();
11265 ref TStringArray item_tag_array = new TStringArray;
11266 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11267
11268 int array_size = item_tag_array.Count();
11269 for (int i = 0; i < array_size; i++)
11270 {
11271 if (item_tag_array.Get(i) == tag)
11272 {
11273 found = true;
11274 break;
11275 }
11276 }
11277 return found;
11278 }
11279
11280
11281 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11282 {
11283 //Debug.Log("OnRPC called");
11284 super.OnRPC(sender, rpc_type,ctx);
11285
11286 //Play soundset for attachment locking (ActionLockAttachment.c)
11287 switch (rpc_type)
11288 {
11289 #ifndef SERVER
11290 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11291 Param2<bool, string> p = new Param2<bool, string>(false, "");
11292
11293 if (!ctx.Read(p))
11294 return;
11295
11296 bool play = p.param1;
11297 string soundSet = p.param2;
11298
11299 if (play)
11300 {
11301 if (m_LockingSound)
11302 {
11304 {
11305 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11306 }
11307 }
11308 else
11309 {
11310 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11311 }
11312 }
11313 else
11314 {
11315 SEffectManager.DestroyEffect(m_LockingSound);
11316 }
11317
11318 break;
11319 #endif
11320
11321 }
11322
11323 if (GetWrittenNoteData())
11324 {
11325 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11326 }
11327 }
11328
11329 //-----------------------------
11330 // VARIABLE MANIPULATION SYSTEM
11331 //-----------------------------
11332 int NameToID(string name)
11333 {
11334 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11335 return plugin.GetID(name);
11336 }
11337
11338 string IDToName(int id)
11339 {
11340 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11341 return plugin.GetName(id);
11342 }
11343
11345 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11346 {
11347 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11348 //read the flags
11349 int varFlags;
11350 if (!ctx.Read(varFlags))
11351 return;
11352
11353 if (varFlags & ItemVariableFlags.FLOAT)
11354 {
11355 ReadVarsFromCTX(ctx);
11356 }
11357 }
11358
11359 override void SerializeNumericalVars(array<float> floats_out)
11360 {
11361 //some variables handled on EntityAI level already!
11362 super.SerializeNumericalVars(floats_out);
11363
11364 // the order of serialization must be the same as the order of de-serialization
11365 //--------------------------------------------
11366 if (IsVariableSet(VARIABLE_QUANTITY))
11367 {
11368 floats_out.Insert(m_VarQuantity);
11369 }
11370 //--------------------------------------------
11371 if (IsVariableSet(VARIABLE_WET))
11372 {
11373 floats_out.Insert(m_VarWet);
11374 }
11375 //--------------------------------------------
11376 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11377 {
11378 floats_out.Insert(m_VarLiquidType);
11379 }
11380 //--------------------------------------------
11381 if (IsVariableSet(VARIABLE_COLOR))
11382 {
11383 floats_out.Insert(m_ColorComponentR);
11384 floats_out.Insert(m_ColorComponentG);
11385 floats_out.Insert(m_ColorComponentB);
11386 floats_out.Insert(m_ColorComponentA);
11387 }
11388 //--------------------------------------------
11389 if (IsVariableSet(VARIABLE_CLEANNESS))
11390 {
11391 floats_out.Insert(m_Cleanness);
11392 }
11393 }
11394
11395 override void DeSerializeNumericalVars(array<float> floats)
11396 {
11397 //some variables handled on EntityAI level already!
11398 super.DeSerializeNumericalVars(floats);
11399
11400 // the order of serialization must be the same as the order of de-serialization
11401 int index = 0;
11402 int mask = Math.Round(floats.Get(index));
11403
11404 index++;
11405 //--------------------------------------------
11406 if (mask & VARIABLE_QUANTITY)
11407 {
11408 if (m_IsStoreLoad)
11409 {
11410 SetStoreLoadedQuantity(floats.Get(index));
11411 }
11412 else
11413 {
11414 float quantity = floats.Get(index);
11415 SetQuantity(quantity, true, false, false, false);
11416 }
11417 index++;
11418 }
11419 //--------------------------------------------
11420 if (mask & VARIABLE_WET)
11421 {
11422 float wet = floats.Get(index);
11423 SetWet(wet);
11424 index++;
11425 }
11426 //--------------------------------------------
11427 if (mask & VARIABLE_LIQUIDTYPE)
11428 {
11429 int liquidtype = Math.Round(floats.Get(index));
11430 SetLiquidType(liquidtype);
11431 index++;
11432 }
11433 //--------------------------------------------
11434 if (mask & VARIABLE_COLOR)
11435 {
11436 m_ColorComponentR = Math.Round(floats.Get(index));
11437 index++;
11438 m_ColorComponentG = Math.Round(floats.Get(index));
11439 index++;
11440 m_ColorComponentB = Math.Round(floats.Get(index));
11441 index++;
11442 m_ColorComponentA = Math.Round(floats.Get(index));
11443 index++;
11444 }
11445 //--------------------------------------------
11446 if (mask & VARIABLE_CLEANNESS)
11447 {
11448 int cleanness = Math.Round(floats.Get(index));
11449 SetCleanness(cleanness);
11450 index++;
11451 }
11452 }
11453
11454 override void WriteVarsToCTX(ParamsWriteContext ctx)
11455 {
11456 super.WriteVarsToCTX(ctx);
11457
11458 //--------------------------------------------
11459 if (IsVariableSet(VARIABLE_QUANTITY))
11460 {
11461 ctx.Write(GetQuantity());
11462 }
11463 //--------------------------------------------
11464 if (IsVariableSet(VARIABLE_WET))
11465 {
11466 ctx.Write(GetWet());
11467 }
11468 //--------------------------------------------
11469 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11470 {
11471 ctx.Write(GetLiquidType());
11472 }
11473 //--------------------------------------------
11474 if (IsVariableSet(VARIABLE_COLOR))
11475 {
11476 int r,g,b,a;
11477 GetColor(r,g,b,a);
11478 ctx.Write(r);
11479 ctx.Write(g);
11480 ctx.Write(b);
11481 ctx.Write(a);
11482 }
11483 //--------------------------------------------
11484 if (IsVariableSet(VARIABLE_CLEANNESS))
11485 {
11486 ctx.Write(GetCleanness());
11487 }
11488 }
11489
11490 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11491 {
11492 if (!super.ReadVarsFromCTX(ctx,version))
11493 return false;
11494
11495 int intValue;
11496 float value;
11497
11498 if (version < 140)
11499 {
11500 if (!ctx.Read(intValue))
11501 return false;
11502
11503 m_VariablesMask = intValue;
11504 }
11505
11506 if (m_VariablesMask & VARIABLE_QUANTITY)
11507 {
11508 if (!ctx.Read(value))
11509 return false;
11510
11511 if (IsStoreLoad())
11512 {
11514 }
11515 else
11516 {
11517 SetQuantity(value, true, false, false, false);
11518 }
11519 }
11520 //--------------------------------------------
11521 if (version < 140)
11522 {
11523 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11524 {
11525 if (!ctx.Read(value))
11526 return false;
11527 SetTemperatureDirect(value);
11528 }
11529 }
11530 //--------------------------------------------
11531 if (m_VariablesMask & VARIABLE_WET)
11532 {
11533 if (!ctx.Read(value))
11534 return false;
11535 SetWet(value);
11536 }
11537 //--------------------------------------------
11538 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11539 {
11540 if (!ctx.Read(intValue))
11541 return false;
11542 SetLiquidType(intValue);
11543 }
11544 //--------------------------------------------
11545 if (m_VariablesMask & VARIABLE_COLOR)
11546 {
11547 int r,g,b,a;
11548 if (!ctx.Read(r))
11549 return false;
11550 if (!ctx.Read(g))
11551 return false;
11552 if (!ctx.Read(b))
11553 return false;
11554 if (!ctx.Read(a))
11555 return false;
11556
11557 SetColor(r,g,b,a);
11558 }
11559 //--------------------------------------------
11560 if (m_VariablesMask & VARIABLE_CLEANNESS)
11561 {
11562 if (!ctx.Read(intValue))
11563 return false;
11564 SetCleanness(intValue);
11565 }
11566 //--------------------------------------------
11567 if (version >= 138 && version < 140)
11568 {
11569 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11570 {
11571 if (!ctx.Read(intValue))
11572 return false;
11573 SetFrozen(intValue);
11574 }
11575 }
11576
11577 return true;
11578 }
11579
11580 //----------------------------------------------------------------
11581 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11582 {
11583 m_IsStoreLoad = true;
11585 {
11586 m_FixDamageSystemInit = true;
11587 }
11588
11589 if (!super.OnStoreLoad(ctx, version))
11590 {
11591 m_IsStoreLoad = false;
11592 return false;
11593 }
11594
11595 if (version >= 114)
11596 {
11597 bool hasQuickBarIndexSaved;
11598
11599 if (!ctx.Read(hasQuickBarIndexSaved))
11600 {
11601 m_IsStoreLoad = false;
11602 return false;
11603 }
11604
11605 if (hasQuickBarIndexSaved)
11606 {
11607 int itmQBIndex;
11608
11609 //Load quickbar item bind
11610 if (!ctx.Read(itmQBIndex))
11611 {
11612 m_IsStoreLoad = false;
11613 return false;
11614 }
11615
11616 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11617 if (itmQBIndex != -1 && parentPlayer)
11618 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11619 }
11620 }
11621 else
11622 {
11623 // Backup of how it used to be
11624 PlayerBase player;
11625 int itemQBIndex;
11626 if (version == int.MAX)
11627 {
11628 if (!ctx.Read(itemQBIndex))
11629 {
11630 m_IsStoreLoad = false;
11631 return false;
11632 }
11633 }
11634 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11635 {
11636 //Load quickbar item bind
11637 if (!ctx.Read(itemQBIndex))
11638 {
11639 m_IsStoreLoad = false;
11640 return false;
11641 }
11642 if (itemQBIndex != -1 && player)
11643 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11644 }
11645 }
11646
11647 if (version < 140)
11648 {
11649 // variable management system
11650 if (!LoadVariables(ctx, version))
11651 {
11652 m_IsStoreLoad = false;
11653 return false;
11654 }
11655 }
11656
11657 //agent trasmission system
11658 if (!LoadAgents(ctx, version))
11659 {
11660 m_IsStoreLoad = false;
11661 return false;
11662 }
11663 if (version >= 132)
11664 {
11665 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11666 if (raib)
11667 {
11668 if (!raib.OnStoreLoad(ctx,version))
11669 {
11670 m_IsStoreLoad = false;
11671 return false;
11672 }
11673 }
11674 }
11675
11676 m_IsStoreLoad = false;
11677 return true;
11678 }
11679
11680 //----------------------------------------------------------------
11681
11682 override void OnStoreSave(ParamsWriteContext ctx)
11683 {
11684 super.OnStoreSave(ctx);
11685
11686 PlayerBase player;
11687 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11688 {
11689 ctx.Write(true); // Keep track of if we should actually read this in or not
11690 //Save quickbar item bind
11691 int itemQBIndex = -1;
11692 itemQBIndex = player.FindQuickBarEntityIndex(this);
11693 ctx.Write(itemQBIndex);
11694 }
11695 else
11696 {
11697 ctx.Write(false); // Keep track of if we should actually read this in or not
11698 }
11699
11700 SaveAgents(ctx);//agent trasmission system
11701
11702 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11703 if (raib)
11704 {
11705 raib.OnStoreSave(ctx);
11706 }
11707 }
11708 //----------------------------------------------------------------
11709
11710 override void AfterStoreLoad()
11711 {
11712 super.AfterStoreLoad();
11713
11715 {
11717 }
11718
11719 if (GetStoreLoadedQuantity() != float.LOWEST)
11720 {
11722 SetStoreLoadedQuantity(float.LOWEST);//IMPORTANT to do this !! we use 'm_StoreLoadedQuantity' inside SetQuantity to distinguish between initial quantity setting and the consequent(normal gameplay) calls
11723 }
11724 }
11725
11726 override void EEOnAfterLoad()
11727 {
11728 super.EEOnAfterLoad();
11729
11731 {
11732 m_FixDamageSystemInit = false;
11733 }
11734
11737 }
11738
11739 bool CanBeDisinfected()
11740 {
11741 return false;
11742 }
11743
11744
11745 //----------------------------------------------------------------
11746 override void OnVariablesSynchronized()
11747 {
11748 if (m_Initialized)
11749 {
11750 #ifdef PLATFORM_CONSOLE
11751 //bruteforce it is
11752 if (IsSplitable())
11753 {
11754 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
11755 if (menu)
11756 {
11757 menu.Refresh();
11758 }
11759 }
11760 #endif
11761 }
11762
11764 {
11765 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11766 m_WantPlayImpactSound = false;
11767 }
11768
11770 {
11771 SetWeightDirty();
11773 }
11774 if (m_VarWet != m_VarWetPrev)
11775 {
11778 }
11779
11780 if (m_SoundSyncPlay != 0)
11781 {
11784
11785 m_SoundSyncPlay = 0;
11786 m_SoundSyncSlotID = -1;
11787 }
11788 if (m_SoundSyncStop != 0)
11789 {
11791 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11792 m_SoundSyncStop = 0;
11793 }
11794
11795 super.OnVariablesSynchronized();
11796 }
11797
11798 //------------------------- Quantity
11799 //----------------------------------------------------------------
11801 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11802 {
11803 if (!IsServerCheck(allow_client))
11804 return false;
11805
11806 if (!HasQuantity())
11807 return false;
11808
11809 float min = GetQuantityMin();
11810 float max = GetQuantityMax();
11811
11812 if (value <= (min + 0.001))
11813 value = min;
11814
11815 if (value == min)
11816 {
11817 if (destroy_config)
11818 {
11819 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11820 if (dstr)
11821 {
11822 m_VarQuantity = Math.Clamp(value, min, max);
11823 this.Delete();
11824 return true;
11825 }
11826 }
11827 else if (destroy_forced)
11828 {
11829 m_VarQuantity = Math.Clamp(value, min, max);
11830 this.Delete();
11831 return true;
11832 }
11833 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11834 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11835 }
11836
11837 float delta = m_VarQuantity;
11838 m_VarQuantity = Math.Clamp(value, min, max);
11839
11840 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
11841 {
11842 EntityAI parent = GetHierarchyRoot();
11843 InventoryLocation iLoc = new InventoryLocation();
11844 GetInventory().GetCurrentInventoryLocation(iLoc);
11845 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
11846 {
11847 int iLocSlot = iLoc.GetSlot();
11848 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
11849 {
11850 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
11851 }
11852 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
11853 {
11854 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
11855 }
11856 }
11857 }
11858
11859 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11860 {
11861 delta = m_VarQuantity - delta;
11862
11863 if (delta)
11864 OnQuantityChanged(delta);
11865 }
11866
11867 SetVariableMask(VARIABLE_QUANTITY);
11868
11869 return false;
11870 }
11871
11872 //----------------------------------------------------------------
11874 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11875 {
11876 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11877 }
11878 //----------------------------------------------------------------
11879 void SetQuantityMax()
11880 {
11881 float max = GetQuantityMax();
11882 SetQuantity(max);
11883 }
11884
11885 override void SetQuantityToMinimum()
11886 {
11887 float min = GetQuantityMin();
11888 SetQuantity(min);
11889 }
11890 //----------------------------------------------------------------
11892 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11893 {
11894 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11895 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11896 SetQuantity(result, destroy_config, destroy_forced);
11897 }
11898
11899 //----------------------------------------------------------------
11901 override float GetQuantityNormalized()
11902 {
11903 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11904 }
11905
11907 {
11908 return GetQuantityNormalized();
11909 }
11910
11911 /*void SetAmmoNormalized(float value)
11912 {
11913 float value_clamped = Math.Clamp(value, 0, 1);
11914 Magazine this_mag = Magazine.Cast(this);
11915 int max_rounds = this_mag.GetAmmoMax();
11916 int result = value * max_rounds;//can the rounded if higher precision is required
11917 this_mag.SetAmmoCount(result);
11918 }*/
11919 //----------------------------------------------------------------
11920 override int GetQuantityMax()
11921 {
11922 int slot = -1;
11923 GameInventory inventory = GetInventory();
11924 if (inventory)
11925 {
11926 InventoryLocation il = new InventoryLocation;
11927 inventory.GetCurrentInventoryLocation(il);
11928 slot = il.GetSlot();
11929 }
11930
11931 return GetTargetQuantityMax(slot);
11932 }
11933
11934 override int GetTargetQuantityMax(int attSlotID = -1)
11935 {
11936 float quantity_max = 0;
11937
11938 if (IsSplitable()) //only stackable/splitable items can check for stack size
11939 {
11940 if (attSlotID != -1)
11941 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11942
11943 if (quantity_max <= 0)
11944 quantity_max = m_VarStackMax;
11945 }
11946
11947 if (quantity_max <= 0)
11948 quantity_max = m_VarQuantityMax;
11949
11950 return quantity_max;
11951 }
11952 //----------------------------------------------------------------
11953 override int GetQuantityMin()
11954 {
11955 return m_VarQuantityMin;
11956 }
11957 //----------------------------------------------------------------
11958 int GetQuantityInit()
11959 {
11960 return m_VarQuantityInit;
11961 }
11962
11963 //----------------------------------------------------------------
11964 override bool HasQuantity()
11965 {
11966 return !(GetQuantityMax() - GetQuantityMin() == 0);
11967 }
11968
11969 override float GetQuantity()
11970 {
11971 return m_VarQuantity;
11972 }
11973
11974 bool IsFullQuantity()
11975 {
11976 return GetQuantity() >= GetQuantityMax();
11977 }
11978
11979 //Calculates weight of single item without attachments and cargo
11980 override float GetSingleInventoryItemWeightEx()
11981 {
11982 //this needs to be first stored inside local variables, when returned directly during inside return call, the result is completely different due to enforce script bug
11983 float weightEx = GetWeightEx();//overall weight of the item
11984 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11985 return weightEx - special;
11986 }
11987
11988 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11990 {
11992 }
11993
11994 override protected float GetWeightSpecialized(bool forceRecalc = false)
11995 {
11996 if (IsSplitable()) //quantity determines size of the stack
11997 {
11998 #ifdef DEVELOPER
11999 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12000 {
12001 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12002 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12003 }
12004 #endif
12005
12006 return GetQuantity() * GetConfigWeightModified();
12007 }
12008 else if (HasEnergyManager())// items with energy manager
12009 {
12010 #ifdef DEVELOPER
12011 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12012 {
12013 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12014 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12015 }
12016 #endif
12017 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12018 }
12019 else//everything else
12020 {
12021 #ifdef DEVELOPER
12022 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12023 {
12024 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12025 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12026 }
12027 #endif
12028 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12029 }
12030 }
12031
12033 int GetNumberOfItems()
12034 {
12035 int item_count = 0;
12036 ItemBase item;
12037
12038 GameInventory inventory = GetInventory();
12039 CargoBase cargo = inventory.GetCargo();
12040 if (cargo != NULL)
12041 {
12042 item_count = cargo.GetItemCount();
12043 }
12044
12045 int nAttachments = inventory.AttachmentCount();
12046 for (int i = 0; i < nAttachments; ++i)
12047 {
12048 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
12049 if (item)
12050 item_count += item.GetNumberOfItems();
12051 }
12052 return item_count;
12053 }
12054
12056 float GetUnitWeight(bool include_wetness = true)
12057 {
12058 float weight = 0;
12059 float wetness = 1;
12060 if (include_wetness)
12061 wetness += GetWet();
12062 if (IsSplitable()) //quantity determines size of the stack
12063 {
12064 weight = wetness * m_ConfigWeight;
12065 }
12066 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12067 {
12068 weight = 1;
12069 }
12070 return weight;
12071 }
12072
12073 //-----------------------------------------------------------------
12074
12075 override void ClearInventory()
12076 {
12077 GameInventory inventory = GetInventory();
12078 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
12079 {
12080 array<EntityAI> items = new array<EntityAI>;
12081 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
12082 for (int i = 0; i < items.Count(); ++i)
12083 {
12084 ItemBase item = ItemBase.Cast(items.Get(i));
12085 if (item)
12086 {
12087 g_Game.ObjectDelete(item);
12088 }
12089 }
12090 }
12091 }
12092
12093 //------------------------- Energy
12094
12095 //----------------------------------------------------------------
12096 float GetEnergy()
12097 {
12098 float energy = 0;
12099 if (HasEnergyManager())
12100 {
12101 energy = GetCompEM().GetEnergy();
12102 }
12103 return energy;
12104 }
12105
12106
12107 override void OnEnergyConsumed()
12108 {
12109 super.OnEnergyConsumed();
12110
12112 }
12113
12114 override void OnEnergyAdded()
12115 {
12116 super.OnEnergyAdded();
12117
12119 }
12120
12121 // Converts energy (from Energy Manager) to quantity, if enabled.
12123 {
12124 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12125 {
12126 if (HasQuantity())
12127 {
12128 float energy_0to1 = GetCompEM().GetEnergy0To1();
12129 SetQuantityNormalized(energy_0to1);
12130 }
12131 }
12132 }
12133
12134 //----------------------------------------------------------------
12135 float GetHeatIsolationInit()
12136 {
12137 return ConfigGetFloat("heatIsolation");
12138 }
12139
12140 float GetHeatIsolation()
12141 {
12142 return m_HeatIsolation;
12143 }
12144
12145 float GetDryingIncrement(string pIncrementName)
12146 {
12147 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12148 if (g_Game.ConfigIsExisting(paramPath))
12149 return g_Game.ConfigGetFloat(paramPath);
12150
12151 return 0.0;
12152 }
12153
12154 float GetSoakingIncrement(string pIncrementName)
12155 {
12156 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12157 if (g_Game.ConfigIsExisting(paramPath))
12158 return g_Game.ConfigGetFloat(paramPath);
12159
12160 return 0.0;
12161 }
12162 //----------------------------------------------------------------
12163 override void SetWet(float value, bool allow_client = false)
12164 {
12165 if (!IsServerCheck(allow_client))
12166 return;
12167
12168 float min = GetWetMin();
12169 float max = GetWetMax();
12170
12171 float previousValue = m_VarWet;
12172
12173 m_VarWet = Math.Clamp(value, min, max);
12174
12175 if (previousValue != m_VarWet)
12176 {
12177 SetVariableMask(VARIABLE_WET);
12178 OnWetChanged(m_VarWet, previousValue);
12179 }
12180 }
12181 //----------------------------------------------------------------
12182 override void AddWet(float value)
12183 {
12184 SetWet(GetWet() + value);
12185 }
12186 //----------------------------------------------------------------
12187 override void SetWetMax()
12188 {
12190 }
12191 //----------------------------------------------------------------
12192 override float GetWet()
12193 {
12194 return m_VarWet;
12195 }
12196 //----------------------------------------------------------------
12197 override float GetWetMax()
12198 {
12199 return m_VarWetMax;
12200 }
12201 //----------------------------------------------------------------
12202 override float GetWetMin()
12203 {
12204 return m_VarWetMin;
12205 }
12206 //----------------------------------------------------------------
12207 override float GetWetInit()
12208 {
12209 return m_VarWetInit;
12210 }
12211 //----------------------------------------------------------------
12212 override void OnWetChanged(float newVal, float oldVal)
12213 {
12214 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12215 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12216 if (newLevel != oldLevel)
12217 {
12218 OnWetLevelChanged(newLevel,oldLevel);
12219 }
12220 }
12221
12222 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12223 {
12224 SetWeightDirty();
12225 }
12226
12227 override EWetnessLevel GetWetLevel()
12228 {
12229 return GetWetLevelInternal(m_VarWet);
12230 }
12231
12232 //----------------------------------------------------------------
12233
12234 override void SetStoreLoad(bool value)
12235 {
12236 m_IsStoreLoad = value;
12237 }
12238
12239 override bool IsStoreLoad()
12240 {
12241 return m_IsStoreLoad;
12242 }
12243
12244 override void SetStoreLoadedQuantity(float value)
12245 {
12246 m_StoreLoadedQuantity = value;
12247 }
12248
12249 override float GetStoreLoadedQuantity()
12250 {
12251 return m_StoreLoadedQuantity;
12252 }
12253
12254 //----------------------------------------------------------------
12255
12256 float GetItemModelLength()
12257 {
12258 if (ConfigIsExisting("itemModelLength"))
12259 {
12260 return ConfigGetFloat("itemModelLength");
12261 }
12262 return 0;
12263 }
12264
12265 float GetItemAttachOffset()
12266 {
12267 if (ConfigIsExisting("itemAttachOffset"))
12268 {
12269 return ConfigGetFloat("itemAttachOffset");
12270 }
12271 return 0;
12272 }
12273
12274 override void SetCleanness(int value, bool allow_client = false)
12275 {
12276 if (!IsServerCheck(allow_client))
12277 return;
12278
12279 int previousValue = m_Cleanness;
12280
12281 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12282
12283 if (previousValue != m_Cleanness)
12284 SetVariableMask(VARIABLE_CLEANNESS);
12285 }
12286
12287 override int GetCleanness()
12288 {
12289 return m_Cleanness;
12290 }
12291
12293 {
12294 return true;
12295 }
12296
12297 //----------------------------------------------------------------
12298 // ATTACHMENT LOCKING
12299 // Getters relevant to generic ActionLockAttachment
12300 int GetLockType()
12301 {
12302 return m_LockType;
12303 }
12304
12305 string GetLockSoundSet()
12306 {
12307 return m_LockSoundSet;
12308 }
12309
12310 //----------------------------------------------------------------
12311 //------------------------- Color
12312 // sets items color variable given color components
12313 override void SetColor(int r, int g, int b, int a)
12314 {
12319 SetVariableMask(VARIABLE_COLOR);
12320 }
12322 override void GetColor(out int r,out int g,out int b,out int a)
12323 {
12328 }
12329
12330 bool IsColorSet()
12331 {
12332 return IsVariableSet(VARIABLE_COLOR);
12333 }
12334
12336 string GetColorString()
12337 {
12338 int r,g,b,a;
12339 GetColor(r,g,b,a);
12340 r = r/255;
12341 g = g/255;
12342 b = b/255;
12343 a = a/255;
12344 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12345 }
12346 //----------------------------------------------------------------
12347 //------------------------- LiquidType
12348
12349 override void SetLiquidType(int value, bool allow_client = false)
12350 {
12351 if (!IsServerCheck(allow_client))
12352 return;
12353
12354 int old = m_VarLiquidType;
12355 m_VarLiquidType = value;
12356 OnLiquidTypeChanged(old,value);
12357 SetVariableMask(VARIABLE_LIQUIDTYPE);
12358 }
12359
12360 int GetLiquidTypeInit()
12361 {
12362 return ConfigGetInt("varLiquidTypeInit");
12363 }
12364
12365 override int GetLiquidType()
12366 {
12367 return m_VarLiquidType;
12368 }
12369
12370 protected void OnLiquidTypeChanged(int oldType, int newType)
12371 {
12372 if (newType == LIQUID_NONE && GetIsFrozen())
12373 SetFrozen(false);
12374 }
12375
12377 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12378 {
12379 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12380 }
12381
12382 // -------------------------------------------------------------------------
12384 void OnInventoryEnter(Man player)
12385 {
12386 PlayerBase nplayer;
12387 if (PlayerBase.CastTo(nplayer, player))
12388 {
12389 m_CanPlayImpactSound = true;
12390 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12391 }
12392 }
12393
12394 // -------------------------------------------------------------------------
12396 void OnInventoryExit(Man player)
12397 {
12398 PlayerBase nplayer;
12399 if (PlayerBase.CastTo(nplayer,player))
12400 {
12401 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12402 }
12403
12404 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12405
12406 if (HasEnergyManager())
12407 {
12408 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12409 }
12410 }
12411
12412 // ADVANCED PLACEMENT EVENTS
12413 override void OnPlacementStarted(Man player)
12414 {
12415 super.OnPlacementStarted(player);
12416
12417 SetTakeable(false);
12418 }
12419
12420 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12421 {
12422 if (m_AdminLog)
12423 {
12424 m_AdminLog.OnPlacementComplete(player, this);
12425 }
12426
12427 super.OnPlacementComplete(player, position, orientation);
12428 }
12429
12430 //-----------------------------
12431 // AGENT SYSTEM
12432 //-----------------------------
12433 //--------------------------------------------------------------------------
12434 bool ContainsAgent(int agent_id)
12435 {
12436 if (agent_id & m_AttachedAgents)
12437 {
12438 return true;
12439 }
12440 else
12441 {
12442 return false;
12443 }
12444 }
12445
12446 //--------------------------------------------------------------------------
12447 override void RemoveAgent(int agent_id)
12448 {
12449 if (ContainsAgent(agent_id))
12450 {
12451 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12452 }
12453 }
12454
12455 //--------------------------------------------------------------------------
12456 override void RemoveAllAgents()
12457 {
12458 m_AttachedAgents = 0;
12459 }
12460 //--------------------------------------------------------------------------
12461 override void RemoveAllAgentsExcept(int agent_to_keep)
12462 {
12463 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12464 }
12465 // -------------------------------------------------------------------------
12466 override void InsertAgent(int agent, float count = 1)
12467 {
12468 if (count < 1)
12469 return;
12470 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12472 }
12473
12475 void TransferAgents(int agents)
12476 {
12478 }
12479
12480 // -------------------------------------------------------------------------
12481 override int GetAgents()
12482 {
12483 return m_AttachedAgents;
12484 }
12485 //----------------------------------------------------------------------
12486
12487 /*int GetContaminationType()
12488 {
12489 int contamination_type;
12490
12491 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12492 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12493 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12494 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12495
12496 Edible_Base edible = Edible_Base.Cast(this);
12497 int agents = GetAgents();
12498 if (edible)
12499 {
12500 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12501 if (profile)
12502 {
12503 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12504 }
12505 }
12506 if (agents & CONTAMINATED_MASK)
12507 {
12508 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12509 }
12510 if (agents & POISONED_MASK)
12511 {
12512 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12513 }
12514 if (agents & NERVE_GAS_MASK)
12515 {
12516 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12517 }
12518 if (agents & DIRTY_MASK)
12519 {
12520 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12521 }
12522
12523 return agents;
12524 }*/
12525
12526 // -------------------------------------------------------------------------
12527 bool LoadAgents(ParamsReadContext ctx, int version)
12528 {
12529 if (!ctx.Read(m_AttachedAgents))
12530 return false;
12531 return true;
12532 }
12533 // -------------------------------------------------------------------------
12535 {
12536
12538 }
12539 // -------------------------------------------------------------------------
12540
12542 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12543 {
12544 super.CheckForRoofLimited(timeTresholdMS);
12545
12546 float time = g_Game.GetTime();
12547 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12548 {
12549 m_PreviousRoofTestTime = time;
12550 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12551 }
12552 }
12553
12554 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12555 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12556 {
12557 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12558 {
12559 return 0;
12560 }
12561
12562 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12563 {
12564 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12565 if (filter)
12566 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12567 else
12568 return 0;//otherwise return 0 when no filter attached
12569 }
12570
12571 string subclassPath, entryName;
12572
12573 switch (type)
12574 {
12575 case DEF_BIOLOGICAL:
12576 entryName = "biological";
12577 break;
12578 case DEF_CHEMICAL:
12579 entryName = "chemical";
12580 break;
12581 default:
12582 entryName = "biological";
12583 break;
12584 }
12585
12586 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12587
12588 return g_Game.ConfigGetFloat(subclassPath + entryName);
12589 }
12590
12591
12592
12594 override void EEOnCECreate()
12595 {
12596 if (!IsMagazine())
12598
12600 }
12601
12602
12603 //-------------------------
12604 // OPEN/CLOSE USER ACTIONS
12605 //-------------------------
12607 void Open();
12608 void Close();
12609 bool IsOpen()
12610 {
12611 return true;
12612 }
12613
12614 override bool CanDisplayCargo()
12615 {
12616 return IsOpen();
12617 }
12618
12619
12620 // ------------------------------------------------------------
12621 // CONDITIONS
12622 // ------------------------------------------------------------
12623 override bool CanPutInCargo(EntityAI parent)
12624 {
12625 if (parent)
12626 {
12627 if (parent.IsInherited(DayZInfected))
12628 return true;
12629
12630 if (!parent.IsRuined())
12631 return true;
12632 }
12633
12634 return true;
12635 }
12636
12637 override bool CanPutAsAttachment(EntityAI parent)
12638 {
12639 if (!super.CanPutAsAttachment(parent))
12640 {
12641 return false;
12642 }
12643
12644 if (!IsRuined() && !parent.IsRuined())
12645 {
12646 return true;
12647 }
12648
12649 return false;
12650 }
12651
12652 override bool CanReceiveItemIntoCargo(EntityAI item)
12653 {
12654 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12655 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12656 // return false;
12657
12658 return super.CanReceiveItemIntoCargo(item);
12659 }
12660
12661 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12662 {
12663 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12664 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12665 // return false;
12666
12667 GameInventory attachmentInv = attachment.GetInventory();
12668 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12669 {
12670 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12671 return false;
12672 }
12673
12674 InventoryLocation loc = new InventoryLocation();
12675 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12676 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12677 return false;
12678
12679 return super.CanReceiveAttachment(attachment, slotId);
12680 }
12681
12682 override bool CanReleaseAttachment(EntityAI attachment)
12683 {
12684 if (!super.CanReleaseAttachment(attachment))
12685 return false;
12686
12687 return GetInventory().AreChildrenAccessible();
12688 }
12689
12690 /*override bool CanLoadAttachment(EntityAI attachment)
12691 {
12692 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12693 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12694 // return false;
12695
12696 GameInventory attachmentInv = attachment.GetInventory();
12697 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12698 {
12699 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12700 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12701
12702 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12703 return false;
12704 }
12705
12706 return super.CanLoadAttachment(attachment);
12707 }*/
12708
12709 // Plays muzzle flash particle effects
12710 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12711 {
12712 int id = muzzle_owner.GetMuzzleID();
12713 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12714
12715 if (WPOF_array)
12716 {
12717 for (int i = 0; i < WPOF_array.Count(); i++)
12718 {
12719 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12720
12721 if (WPOF)
12722 {
12723 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12724 }
12725 }
12726 }
12727 }
12728
12729 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12730 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12731 {
12732 int id = muzzle_owner.GetMuzzleID();
12733 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12734
12735 if (WPOBE_array)
12736 {
12737 for (int i = 0; i < WPOBE_array.Count(); i++)
12738 {
12739 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12740
12741 if (WPOBE)
12742 {
12743 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12744 }
12745 }
12746 }
12747 }
12748
12749 // Plays all weapon overheating particles
12750 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12751 {
12752 int id = muzzle_owner.GetMuzzleID();
12753 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12754
12755 if (WPOOH_array)
12756 {
12757 for (int i = 0; i < WPOOH_array.Count(); i++)
12758 {
12759 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12760
12761 if (WPOOH)
12762 {
12763 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12764 }
12765 }
12766 }
12767 }
12768
12769 // Updates all weapon overheating particles
12770 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12771 {
12772 int id = muzzle_owner.GetMuzzleID();
12773 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12774
12775 if (WPOOH_array)
12776 {
12777 for (int i = 0; i < WPOOH_array.Count(); i++)
12778 {
12779 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12780
12781 if (WPOOH)
12782 {
12783 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12784 }
12785 }
12786 }
12787 }
12788
12789 // Stops overheating particles
12790 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12791 {
12792 int id = muzzle_owner.GetMuzzleID();
12793 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12794
12795 if (WPOOH_array)
12796 {
12797 for (int i = 0; i < WPOOH_array.Count(); i++)
12798 {
12799 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12800
12801 if (WPOOH)
12802 {
12803 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12804 }
12805 }
12806 }
12807 }
12808
12809 //----------------------------------------------------------------
12810 //Item Behaviour - unified approach
12811 override bool IsHeavyBehaviour()
12812 {
12813 if (m_ItemBehaviour == 0)
12814 {
12815 return true;
12816 }
12817
12818 return false;
12819 }
12820
12821 override bool IsOneHandedBehaviour()
12822 {
12823 if (m_ItemBehaviour == 1)
12824 {
12825 return true;
12826 }
12827
12828 return false;
12829 }
12830
12831 override bool IsTwoHandedBehaviour()
12832 {
12833 if (m_ItemBehaviour == 2)
12834 {
12835 return true;
12836 }
12837
12838 return false;
12839 }
12840
12841 bool IsDeployable()
12842 {
12843 return false;
12844 }
12845
12847 float GetDeployTime()
12848 {
12849 return UATimeSpent.DEFAULT_DEPLOY;
12850 }
12851
12852
12853 //----------------------------------------------------------------
12854 // Item Targeting (User Actions)
12855 override void SetTakeable(bool pState)
12856 {
12857 m_IsTakeable = pState;
12858 SetSynchDirty();
12859 }
12860
12861 override bool IsTakeable()
12862 {
12863 return m_IsTakeable;
12864 }
12865
12866 // For cases where we want to show object widget which cant be taken to hands
12868 {
12869 return false;
12870 }
12871
12873 protected void PreLoadSoundAttachmentType()
12874 {
12875 string att_type = "None";
12876
12877 if (ConfigIsExisting("soundAttType"))
12878 {
12879 att_type = ConfigGetString("soundAttType");
12880 }
12881
12882 m_SoundAttType = att_type;
12883 }
12884
12885 override string GetAttachmentSoundType()
12886 {
12887 return m_SoundAttType;
12888 }
12889
12890 //----------------------------------------------------------------
12891 //SOUNDS - ItemSoundHandler
12892 //----------------------------------------------------------------
12893
12894 string GetPlaceSoundset(); // played when deploy starts
12895 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12896 string GetDeploySoundset(); // played when deploy sucessfully finishes
12897 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
12898 string GetFoldSoundset(); // played when fold sucessfully finishes
12899
12901 {
12902 if (!m_ItemSoundHandler)
12904
12905 return m_ItemSoundHandler;
12906 }
12907
12908 // override to initialize sounds
12909 protected void InitItemSounds()
12910 {
12911 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
12912 return;
12913
12915
12916 if (GetPlaceSoundset() != string.Empty)
12917 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12918
12919 if (GetDeploySoundset() != string.Empty)
12920 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12921
12922 SoundParameters params = new SoundParameters();
12923 params.m_Loop = true;
12924 if (GetLoopDeploySoundset() != string.Empty)
12925 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12926 }
12927
12928 // Start sound using ItemSoundHandler
12929 void StartItemSoundServer(int id, int slotId)
12930 {
12931 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12932 {
12933 m_SoundSyncSlotID = slotId;
12934 m_SoundSyncPlay = id;
12935
12936 SetSynchDirty();
12937
12938 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12939 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
12940 }
12941 }
12942
12943 void StartItemSoundServer(int id)
12944 {
12945 StartItemSoundServer(id, InventorySlots.INVALID);
12946 }
12947
12948 // Stop sound using ItemSoundHandler
12949 void StopItemSoundServer(int id)
12950 {
12951 if (!g_Game.IsServer())
12952 return;
12953
12954 m_SoundSyncStop = id;
12955 SetSynchDirty();
12956
12957 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12958 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
12959 }
12960
12961 protected void ClearStartItemSoundServer()
12962 {
12963 m_SoundSyncPlay = 0;
12964 m_SoundSyncSlotID = InventorySlots.INVALID;
12965 }
12966
12967 protected void ClearStopItemSoundServer()
12968 {
12969 m_SoundSyncStop = 0;
12970 }
12971
12972 void OnApply(PlayerBase player);
12973
12975 {
12976 return 1.0;
12977 };
12978 //returns applicable selection
12979 array<string> GetHeadHidingSelection()
12980 {
12982 }
12983
12985 {
12987 }
12988
12989 WrittenNoteData GetWrittenNoteData() {};
12990
12992 {
12993 SetDynamicPhysicsLifeTime(0.01);
12994 m_ItemBeingDroppedPhys = false;
12995 }
12996
12998 {
12999 array<string> zone_names = new array<string>;
13000 GetDamageZones(zone_names);
13001 for (int i = 0; i < zone_names.Count(); i++)
13002 {
13003 SetHealthMax(zone_names.Get(i),"Health");
13004 }
13005 SetHealthMax("","Health");
13006 }
13007
13009 void SetZoneDamageCEInit()
13010 {
13011 float global_health = GetHealth01("","Health");
13012 array<string> zones = new array<string>;
13013 GetDamageZones(zones);
13014 //set damage of all zones to match global health level
13015 for (int i = 0; i < zones.Count(); i++)
13016 {
13017 SetHealth01(zones.Get(i),"Health",global_health);
13018 }
13019 }
13020
13022 bool IsCoverFaceForShave(string slot_name)
13023 {
13024 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13025 }
13026
13027 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13028 {
13029 if (!hasRootAsPlayer)
13030 {
13031 if (refParentIB)
13032 {
13033 // parent is wet
13034 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13035 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13036 // parent has liquid inside
13037 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13038 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13039 // drying
13040 else if (m_VarWet > m_VarWetMin)
13041 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13042 }
13043 else
13044 {
13045 // drying on ground or inside non-itembase (car, ...)
13046 if (m_VarWet > m_VarWetMin)
13047 AddWet(-1 * delta * GetDryingIncrement("ground"));
13048 }
13049 }
13050 }
13051
13052 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13053 {
13055 {
13056 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13057 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13058 {
13059 float heatPermCoef = 1.0;
13060 EntityAI ent = this;
13061 while (ent)
13062 {
13063 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13064 ent = ent.GetHierarchyParent();
13065 }
13066
13067 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13068 }
13069 }
13070 }
13071
13072 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13073 {
13074 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13075 EntityAI parent = GetHierarchyParent();
13076 if (!parent)
13077 {
13078 hasParent = false;
13079 hasRootAsPlayer = false;
13080 }
13081 else
13082 {
13083 hasParent = true;
13084 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13085 refParentIB = ItemBase.Cast(parent);
13086 }
13087 }
13088
13089 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13090 {
13091 // this is stub, implemented on Edible_Base
13092 }
13093
13094 bool CanDecay()
13095 {
13096 // return true used on selected food clases so they can decay
13097 return false;
13098 }
13099
13100 protected bool CanProcessDecay()
13101 {
13102 // this is stub, implemented on Edible_Base class
13103 // used to determine whether it is still necessary for the food to decay
13104 return false;
13105 }
13106
13107 protected bool CanHaveWetness()
13108 {
13109 // return true used on selected items that have a wetness effect
13110 return false;
13111 }
13112
13114 bool CanBeConsumed(ConsumeConditionData data = null)
13115 {
13116 return !GetIsFrozen() && IsOpen();
13117 }
13118
13119 override void ProcessVariables()
13120 {
13121 bool hasParent = false, hasRootAsPlayer = false;
13122 ItemBase refParentIB;
13123
13124 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13125 bool foodDecay = g_Game.IsFoodDecayEnabled();
13126
13127 if (wwtu || foodDecay)
13128 {
13129 bool processWetness = wwtu && CanHaveWetness();
13130 bool processTemperature = wwtu && CanHaveTemperature();
13131 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13132
13133 if (processWetness || processTemperature || processDecay)
13134 {
13135 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13136
13137 if (processWetness)
13138 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13139
13140 if (processTemperature)
13141 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13142
13143 if (processDecay)
13144 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13145 }
13146 }
13147 }
13148
13151 {
13152 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13153 }
13154
13155 override float GetTemperatureFreezeThreshold()
13156 {
13158 return Liquid.GetFreezeThreshold(GetLiquidType());
13159
13160 return super.GetTemperatureFreezeThreshold();
13161 }
13162
13163 override float GetTemperatureThawThreshold()
13164 {
13166 return Liquid.GetThawThreshold(GetLiquidType());
13167
13168 return super.GetTemperatureThawThreshold();
13169 }
13170
13171 override float GetItemOverheatThreshold()
13172 {
13174 return Liquid.GetBoilThreshold(GetLiquidType());
13175
13176 return super.GetItemOverheatThreshold();
13177 }
13178
13179 override float GetTemperatureFreezeTime()
13180 {
13181 if (HasQuantity())
13182 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13183
13184 return super.GetTemperatureFreezeTime();
13185 }
13186
13187 override float GetTemperatureThawTime()
13188 {
13189 if (HasQuantity())
13190 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13191
13192 return super.GetTemperatureThawTime();
13193 }
13194
13196 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13198 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13199
13200 bool IsCargoException4x3(EntityAI item)
13201 {
13202 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13203 }
13204
13206 {
13207 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13208 }
13209
13211 void AddLightSourceItem(ItemBase lightsource)
13212 {
13213 m_LightSourceItem = lightsource;
13214 }
13215
13217 {
13218 m_LightSourceItem = null;
13219 }
13220
13222 {
13223 return m_LightSourceItem;
13224 }
13225
13227 array<int> GetValidFinishers()
13228 {
13229 return null;
13230 }
13231
13233 bool GetActionWidgetOverride(out typename name)
13234 {
13235 return false;
13236 }
13237
13238 bool PairWithDevice(notnull ItemBase otherDevice)
13239 {
13240 if (g_Game.IsServer())
13241 {
13242 ItemBase explosive = otherDevice;
13244 if (!trg)
13245 {
13246 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13247 explosive = this;
13248 }
13249
13250 explosive.PairRemote(trg);
13251 trg.SetControlledDevice(explosive);
13252
13253 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13254 trg.SetPersistentPairID(persistentID);
13255 explosive.SetPersistentPairID(persistentID);
13256
13257 return true;
13258 }
13259 return false;
13260 }
13261
13263 float GetBaitEffectivity()
13264 {
13265 float ret = 1.0;
13266 if (HasQuantity())
13267 ret *= GetQuantityNormalized();
13268 ret *= GetHealth01();
13269
13270 return ret;
13271 }
13272
13273 #ifdef DEVELOPER
13274 override void SetDebugItem()
13275 {
13276 super.SetDebugItem();
13277 _itemBase = this;
13278 }
13279
13280 override string GetDebugText()
13281 {
13282 string text = super.GetDebugText();
13283
13284 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13285 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13286
13287 return text;
13288 }
13289 #endif
13290
13291 bool CanBeUsedForSuicide()
13292 {
13293 return true;
13294 }
13295
13297 //DEPRECATED BELOW
13299 // Backwards compatibility
13300 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13301 {
13302 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13303 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13304 }
13305
13306 // replaced by ItemSoundHandler
13307 protected EffectSound m_SoundDeployFinish;
13308 protected EffectSound m_SoundPlace;
13309 protected EffectSound m_DeployLoopSoundEx;
13310 protected EffectSound m_SoundDeploy;
13311 bool m_IsPlaceSound;
13312 bool m_IsDeploySound;
13314
13315 string GetDeployFinishSoundset();
13316 void PlayDeploySound();
13317 void PlayDeployFinishSound();
13318 void PlayPlaceSound();
13319 void PlayDeployLoopSoundEx();
13320 void StopDeployLoopSoundEx();
13321 void SoundSynchRemoteReset();
13322 void SoundSynchRemote();
13323 bool UsesGlobalDeploy(){return false;}
13324 bool CanPlayDeployLoopSound(){return false;}
13326 bool IsPlaceSound(){return m_IsPlaceSound;}
13327 bool IsDeploySound(){return m_IsDeploySound;}
13328 void SetIsPlaceSound(bool is_place_sound);
13329 void SetIsDeploySound(bool is_deploy_sound);
13330
13331 [Obsolete("Use ItemSoundHandler instead")]
13333 void PlayAttachSound(string slot_type)
13334 {
13335 if (!g_Game.IsDedicatedServer())
13336 {
13337 if (ConfigIsExisting("attachSoundSet"))
13338 {
13339 string cfg_path = "";
13340 string soundset = "";
13341 string type_name = GetType();
13342
13343 TStringArray cfg_soundset_array = new TStringArray;
13344 TStringArray cfg_slot_array = new TStringArray;
13345 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13346 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13347
13348 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13349 {
13350 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13351 {
13352 if (cfg_slot_array[i] == slot_type)
13353 {
13354 soundset = cfg_soundset_array[i];
13355 break;
13356 }
13357 }
13358 }
13359
13360 if (soundset != "")
13361 {
13362 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13363 sound.SetAutodestroy(true);
13364 }
13365 }
13366 }
13367 }
13368
13369 void PlayDetachSound(string slot_type) {}
13370}
13371
13372EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13373{
13374 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13375 if (entity)
13376 {
13377 bool is_item = entity.IsInherited(ItemBase);
13378 if (is_item && full_quantity)
13379 {
13380 ItemBase item = ItemBase.Cast(entity);
13381 item.SetQuantity(item.GetQuantityInit());
13382 }
13383 }
13384 else
13385 {
13386 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13387 return NULL;
13388 }
13389 return entity;
13390}
13391
13392void SetupSpawnedItem(ItemBase item, float health, float quantity)
13393{
13394 if (item)
13395 {
13396 if (health > 0)
13397 item.SetHealth("", "", health);
13398
13399 if (item.CanHaveTemperature())
13400 {
13401 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13402 if (item.CanFreeze())
13403 item.SetFrozen(false);
13404 }
13405
13406 if (item.HasEnergyManager())
13407 {
13408 if (quantity >= 0)
13409 {
13410 item.GetCompEM().SetEnergy0To1(quantity);
13411 }
13412 else
13413 {
13414 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13415 }
13416 }
13417 else if (item.IsMagazine())
13418 {
13419 Magazine mag = Magazine.Cast(item);
13420 if (quantity >= 0)
13421 {
13422 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13423 }
13424 else
13425 {
13426 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13427 }
13428
13429 }
13430 else
13431 {
13432 if (quantity >= 0)
13433 {
13434 item.SetQuantityNormalized(quantity, false);
13435 }
13436 else
13437 {
13438 item.SetQuantity(Math.AbsFloat(quantity));
13439 }
13440
13441 }
13442 }
13443}
13444
13445#ifdef DEVELOPER
13446ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13447#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
string Debug()
Определения CachedEquipmentStorageBase.c:29
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
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...
Определения ItemBase.c:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
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...
Определения ItemBase.c:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
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()
Определения ItemBase.c:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения 3_Game/DayZ/Entities/Man.c:48
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)
Определения ItemBase.c:21
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)
Определения InventoryLocation.c:507
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
InventoryLocation.
Определения InventoryLocation.c:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1032
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения ItemBase.c:14
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
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.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()

Используется в Barrel_ColorBase::CanDetachAttachment(), FireplaceBase::CanDetachAttachment(), ClothingBase::CanPutAsAttachment(), Barrel_ColorBase::CanPutInCargo(), Clothing::CanPutInCargo(), Clothing_Base::CanPutInCargoClothingConditions() и Barrel_ColorBase::CanPutIntoHands().