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

◆ LockToParent()

void SpawnItemOnLocation::LockToParent ( )
private

Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible in inventory over this item.

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

5614{
5615 override bool CanPutAsAttachment(EntityAI parent)
5616 {
5617 return true;
5618 }
5619};
5620
5621//const bool QUANTITY_DEBUG_REMOVE_ME = false;
5622
5623class ItemBase extends InventoryItem
5624{
5628
5630
5631 static int m_DebugActionsMask;
5633 // ============================================
5634 // Variable Manipulation System
5635 // ============================================
5636 // Quantity
5637
5638 float m_VarQuantity;
5639 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
5641 int m_VarQuantityMin;
5642 int m_VarQuantityMax;
5643 int m_Count;
5644 float m_VarStackMax;
5645 float m_StoreLoadedQuantity = float.LOWEST;
5646 // Wet
5647 float m_VarWet;
5648 float m_VarWetPrev;//for client to know wetness changed during synchronization
5649 float m_VarWetInit;
5650 float m_VarWetMin;
5651 float m_VarWetMax;
5652 // Cleanness
5653 int m_Cleanness;
5654 int m_CleannessInit;
5655 int m_CleannessMin;
5656 int m_CleannessMax;
5657 // impact sounds
5659 bool m_CanPlayImpactSound = true;
5660 float m_ImpactSpeed;
5662 //
5663 float m_HeatIsolation;
5664 float m_ItemModelLength;
5665 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
5667 int m_VarLiquidType;
5668 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
5669 int m_QuickBarBonus;
5670 bool m_IsBeingPlaced;
5671 bool m_IsHologram;
5672 bool m_IsTakeable;
5673 bool m_ThrowItemOnDrop;
5676 bool m_FixDamageSystemInit = false; //can be changed on storage version check
5677 bool can_this_be_combined; //Check if item can be combined
5678 bool m_CanThisBeSplit; //Check if item can be split
5679 bool m_IsStoreLoad = false;
5680 bool m_CanShowQuantity;
5681 bool m_HasQuantityBar;
5682 protected bool m_CanBeDigged;
5683 protected bool m_IsResultOfSplit
5684
5685 string m_SoundAttType;
5686 // items color variables
5691 //-------------------------------------------------------
5692
5693 // light source managing
5695
5699
5700 //==============================================
5701 // agent system
5702 private int m_AttachedAgents;
5703
5705 void TransferModifiers(PlayerBase reciever);
5706
5707
5708 // Weapons & suppressors particle effects
5713 static int m_LastRegisteredWeaponID = 0;
5714
5715 // Overheating effects
5717 float m_OverheatingShots;
5718 ref Timer m_CheckOverheating;
5719 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
5720 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
5721 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
5722 ref array <ref OverheatingParticle> m_OverheatingParticles;
5723
5725 protected bool m_HideSelectionsBySlot;
5726
5727 // Admin Log
5728 PluginAdminLog m_AdminLog;
5729
5730 // misc
5731 ref Timer m_PhysDropTimer;
5732
5733 // Attachment Locking variables
5734 ref array<int> m_CompatibleLocks;
5735 protected int m_LockType;
5736 protected ref EffectSound m_LockingSound;
5737 protected string m_LockSoundSet;
5738
5739 // ItemSoundHandler
5740 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
5741 protected int m_SoundSyncPlay; // id for sound to play
5742 protected int m_SoundSyncStop; // id for sound to stop
5744
5745 //temperature
5746 private float m_TemperaturePerQuantityWeight;
5747
5748 // -------------------------------------------------------------------------
5749 void ItemBase()
5750 {
5751 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
5755
5756 if (!GetGame().IsDedicatedServer())
5757 {
5758 if (HasMuzzle())
5759 {
5761
5763 {
5765 }
5766 }
5767
5769 m_ActionsInitialize = false;
5770 }
5771
5772 m_OldLocation = null;
5773
5774 if (GetGame().IsServer())
5775 {
5776 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
5777 }
5778
5779 if (ConfigIsExisting("headSelectionsToHide"))
5780 {
5782 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
5783 }
5784
5785 m_HideSelectionsBySlot = false;
5786 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5787 {
5788 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
5789 }
5790
5791 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
5792
5793 m_IsResultOfSplit = false;
5794
5796 }
5797
5798 override void InitItemVariables()
5799 {
5800 super.InitItemVariables();
5801
5802 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
5803 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
5804 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
5805 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
5806 m_VarStackMax = ConfigGetFloat("varStackMax");
5807 m_Count = ConfigGetInt("count");
5808
5809 m_CanShowQuantity = ConfigGetBool("quantityShow");
5810 m_HasQuantityBar = ConfigGetBool("quantityBar");
5811
5812 m_CleannessInit = ConfigGetInt("varCleannessInit");
5814 m_CleannessMin = ConfigGetInt("varCleannessMin");
5815 m_CleannessMax = ConfigGetInt("varCleannessMax");
5816
5817 m_WantPlayImpactSound = false;
5818 m_ImpactSpeed = 0.0;
5819
5820 m_VarWetInit = ConfigGetFloat("varWetInit");
5822 m_VarWetMin = ConfigGetFloat("varWetMin");
5823 m_VarWetMax = ConfigGetFloat("varWetMax");
5824
5825 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
5826 if (IsLiquidContainer() && GetQuantity() != 0)
5828 m_IsBeingPlaced = false;
5829 m_IsHologram = false;
5830 m_IsTakeable = true;
5831 m_CanBeMovedOverride = false;
5835 m_CanBeDigged = ConfigGetBool("canBeDigged");
5836
5837 m_CompatibleLocks = new array<int>();
5838 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
5839 m_LockType = ConfigGetInt("lockType");
5840
5841 //Define if item can be split and set ability to be combined accordingly
5842 m_CanThisBeSplit = false;
5843 can_this_be_combined = false;
5844 if (ConfigIsExisting("canBeSplit"))
5845 {
5846 can_this_be_combined = ConfigGetBool("canBeSplit");
5848 }
5849
5850 m_ItemBehaviour = -1;
5851 if (ConfigIsExisting("itemBehaviour"))
5852 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
5853
5854 //RegisterNetSyncVariableInt("m_VariablesMask");
5855 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
5856 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
5857 RegisterNetSyncVariableInt("m_VarLiquidType");
5858 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5859
5860 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5861 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5862 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5863
5864 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5865 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5866 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5867 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5868
5869 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5870 RegisterNetSyncVariableBool("m_IsTakeable");
5871 RegisterNetSyncVariableBool("m_IsHologram");
5872
5873 InitItemSounds();
5875 {
5876 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
5877 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
5878 }
5879
5880 m_LockSoundSet = ConfigGetString("lockSoundSet");
5881
5883 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5884 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
5885
5886 }
5887
5888 override int GetQuickBarBonus()
5889 {
5890 return m_QuickBarBonus;
5891 }
5892
5893 void InitializeActions()
5894 {
5896 if (!m_InputActionMap)
5897 {
5899 m_InputActionMap = iam;
5900 SetActions();
5902 }
5903 }
5904
5905 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
5906 {
5908 {
5909 m_ActionsInitialize = true;
5911 }
5912
5913 actions = m_InputActionMap.Get(action_input_type);
5914 }
5915
5916 void SetActions()
5917 {
5918 AddAction(ActionTakeItem);
5919 AddAction(ActionTakeItemToHands);
5920 AddAction(ActionWorldCraft);
5922 AddAction(ActionAttachWithSwitch);
5923 }
5924
5925 void SetActionAnimOverrides(); // Override action animation for specific item
5926
5927 void AddAction(typename actionName)
5928 {
5929 ActionBase action = ActionManagerBase.GetAction(actionName);
5930
5931 if (!action)
5932 {
5933 Debug.LogError("Action " + actionName + " dosn't exist!");
5934 return;
5935 }
5936
5937 typename ai = action.GetInputType();
5938 if (!ai)
5939 {
5940 m_ActionsInitialize = false;
5941 return;
5942 }
5943
5944 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5945 if (!action_array)
5946 {
5947 action_array = new array<ActionBase_Basic>;
5948 m_InputActionMap.Insert(ai, action_array);
5949 }
5950 if (LogManager.IsActionLogEnable())
5951 {
5952 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
5953 }
5954
5955 if (action_array.Find(action) != -1)
5956 {
5957 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
5958 }
5959 else
5960 {
5961 action_array.Insert(action);
5962 }
5963 }
5964
5965 void RemoveAction(typename actionName)
5966 {
5967 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
5968 ActionBase action = player.GetActionManager().GetAction(actionName);
5969 typename ai = action.GetInputType();
5970 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5971
5972 if (action_array)
5973 {
5974 action_array.RemoveItem(action);
5975 }
5976 }
5977
5978 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
5979 // Set -1 for params which should stay in default state
5980 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
5981 {
5982 ActionOverrideData overrideData = new ActionOverrideData();
5983 overrideData.m_CommandUID = commandUID;
5984 overrideData.m_CommandUIDProne = commandUIDProne;
5985 overrideData.m_StanceMask = stanceMask;
5986
5987 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
5988 if (!actionMap) // create new map of action > overidables map
5989 {
5990 actionMap = new TActionAnimOverrideMap();
5991 m_ItemActionOverrides.Insert(action, actionMap);
5992 }
5993
5994 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
5995
5996 }
5997
5998 void OnItemInHandsPlayerSwimStart(PlayerBase player);
5999
6000 ScriptedLightBase GetLight();
6001
6002 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
6003 void LoadParticleConfigOnFire(int id)
6004 {
6005 if (!m_OnFireEffect)
6007
6010
6011 string config_to_search = "CfgVehicles";
6012 string muzzle_owner_config;
6013
6014 if (!m_OnFireEffect.Contains(id))
6015 {
6016 if (IsInherited(Weapon))
6017 config_to_search = "CfgWeapons";
6018
6019 muzzle_owner_config = config_to_search + " " + GetType() + " ";
6020
6021 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6022
6023 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
6024
6025 if (config_OnFire_subclass_count > 0)
6026 {
6027 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6028
6029 for (int i = 0; i < config_OnFire_subclass_count; i++)
6030 {
6031 string particle_class = "";
6032 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
6033 string config_OnFire_entry = config_OnFire_class + particle_class;
6034 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6035 WPOF_array.Insert(WPOF);
6036 }
6037
6038
6039 m_OnFireEffect.Insert(id, WPOF_array);
6040 }
6041 }
6042
6043 if (!m_OnBulletCasingEjectEffect.Contains(id))
6044 {
6045 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
6046 muzzle_owner_config = config_to_search + " " + GetType() + " ";
6047
6048 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6049
6050 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6051
6052 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6053 {
6054 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6055
6056 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6057 {
6058 string particle_class2 = "";
6059 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6060 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6061 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6062 WPOBE_array.Insert(WPOBE);
6063 }
6064
6065
6066 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
6067 }
6068 }
6069 }
6070
6071 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
6073 {
6076
6077 if (!m_OnOverheatingEffect.Contains(id))
6078 {
6079 string config_to_search = "CfgVehicles";
6080
6081 if (IsInherited(Weapon))
6082 config_to_search = "CfgWeapons";
6083
6084 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
6085 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6086
6087 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
6088 {
6089
6090 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
6091
6093 {
6094 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
6095 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6096 Error(error);
6097 return;
6098 }
6099
6100 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
6101 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
6102
6103
6104
6105 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
6106 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6107
6108 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6109 {
6110 string particle_class = "";
6111 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6112 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6113 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
6114
6115 if (entry_type == CT_CLASS)
6116 {
6117 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6118 WPOOH_array.Insert(WPOF);
6119 }
6120 }
6121
6122
6123 m_OnOverheatingEffect.Insert(id, WPOOH_array);
6124 }
6125 }
6126 }
6127
6128 float GetOverheatingValue()
6129 {
6130 return m_OverheatingShots;
6131 }
6132
6133 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
6134 {
6135 if (m_MaxOverheatingValue > 0)
6136 {
6138
6139 if (!m_CheckOverheating)
6141
6143 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
6144
6145 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6146 }
6147 }
6148
6149 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6150 {
6152 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6153
6155 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6156
6158 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6159
6161 {
6163 }
6164 }
6165
6167 {
6169 }
6170
6171 void OnOverheatingDecay()
6172 {
6173 if (m_MaxOverheatingValue > 0)
6174 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
6175 else
6177
6178 if (m_OverheatingShots <= 0)
6179 {
6182 }
6183 else
6184 {
6185 if (!m_CheckOverheating)
6187
6189 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
6190 }
6191
6192 CheckOverheating(this, "", this);
6193 }
6194
6195 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6196 {
6198 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6199 }
6200
6201 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6202 {
6204 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6206 }
6207
6208 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6209 {
6211 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6212 }
6213
6214 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
6215 {
6217 m_OverheatingParticles = new array<ref OverheatingParticle>;
6218
6219 OverheatingParticle OP = new OverheatingParticle();
6220 OP.RegisterParticle(p);
6221 OP.SetOverheatingLimitMin(min_heat_coef);
6222 OP.SetOverheatingLimitMax(max_heat_coef);
6223 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
6224
6225 m_OverheatingParticles.Insert(OP);
6226 }
6227
6228 float GetOverheatingCoef()
6229 {
6230 if (m_MaxOverheatingValue > 0)
6232
6233 return -1;
6234 }
6235
6237 {
6239 {
6240 float overheat_coef = GetOverheatingCoef();
6241 int count = m_OverheatingParticles.Count();
6242
6243 for (int i = count; i > 0; --i)
6244 {
6245 int id = i - 1;
6246 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6247 Particle p = OP.GetParticle();
6248
6249 float overheat_min = OP.GetOverheatingLimitMin();
6250 float overheat_max = OP.GetOverheatingLimitMax();
6251
6252 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6253 {
6254 if (p)
6255 {
6256 p.Stop();
6257 OP.RegisterParticle(null);
6258 }
6259 }
6260 }
6261 }
6262 }
6263
6265 {
6267 {
6268 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
6269 {
6270 int id = i - 1;
6271 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6272
6273 if (OP)
6274 {
6275 Particle p = OP.GetParticle();
6276
6277 if (p)
6278 {
6279 p.Stop();
6280 }
6281
6282 delete OP;
6283 }
6284 }
6285
6286 m_OverheatingParticles.Clear();
6288 }
6289 }
6290
6292 float GetInfectionChance(int system = 0, Param param = null)
6293 {
6294 return 0.0;
6295 }
6296
6297
6298 float GetDisinfectQuantity(int system = 0, Param param1 = null)
6299 {
6300 return 250;//default value
6301 }
6302
6303 float GetFilterDamageRatio()
6304 {
6305 return 0;
6306 }
6307
6309 bool HasMuzzle()
6310 {
6311 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
6312 return true;
6313
6314 return false;
6315 }
6316
6318 int GetMuzzleID()
6319 {
6320 if (!m_WeaponTypeToID)
6322
6323 if (m_WeaponTypeToID.Contains(GetType()))
6324 {
6325 return m_WeaponTypeToID.Get(GetType());
6326 }
6327 else
6328 {
6329 // Register new weapon ID
6331 }
6332
6334 }
6335
6342 {
6343 return -1;
6344 }
6345
6346
6347
6348 // -------------------------------------------------------------------------
6349 void ~ItemBase()
6350 {
6351 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
6352 {
6353 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
6354 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6355
6356 if (r_index >= 0)
6357 {
6358 InventoryLocation r_il = new InventoryLocation;
6359 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6360
6361 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6362 int r_type = r_il.GetType();
6363 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6364 {
6365 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6366 }
6367 else if (r_type == InventoryLocationType.ATTACHMENT)
6368 {
6369 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6370 }
6371
6372 }
6373
6374 player.GetHumanInventory().ClearUserReservedLocation(this);
6375 }
6376
6377 if (m_LockingSound)
6378 SEffectManager.DestroyEffect(m_LockingSound);
6379 }
6380
6381
6382
6383 // -------------------------------------------------------------------------
6384 static int GetDebugActionsMask()
6385 {
6386 return ItemBase.m_DebugActionsMask;
6387 }
6388
6389 static bool HasDebugActionsMask(int mask)
6390 {
6391 return ItemBase.m_DebugActionsMask & mask;
6392 }
6393
6394 static void SetDebugActionsMask(int mask)
6395 {
6396 ItemBase.m_DebugActionsMask = mask;
6397 }
6398
6399 static void AddDebugActionsMask(int mask)
6400 {
6401 ItemBase.m_DebugActionsMask |= mask;
6402 }
6403
6404 static void RemoveDebugActionsMask(int mask)
6405 {
6406 ItemBase.m_DebugActionsMask &= ~mask;
6407 }
6408
6409 static void ToggleDebugActionsMask(int mask)
6410 {
6411 if (HasDebugActionsMask(mask))
6412 {
6414 }
6415 else
6416 {
6417 AddDebugActionsMask(mask);
6418 }
6419 }
6420
6421 // -------------------------------------------------------------------------
6422 void SetCEBasedQuantity()
6423 {
6424 if (GetEconomyProfile())
6425 {
6426 float q_max = GetEconomyProfile().GetQuantityMax();
6427 if (q_max > 0)
6428 {
6429 float q_min = GetEconomyProfile().GetQuantityMin();
6430 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6431
6432 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
6433 {
6434 ComponentEnergyManager comp = GetCompEM();
6435 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
6436 {
6437 comp.SetEnergy0To1(quantity_randomized);
6438 }
6439 }
6440 else if (HasQuantity())
6441 {
6442 SetQuantityNormalized(quantity_randomized, false);
6443 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
6444 }
6445
6446 }
6447 }
6448 }
6449
6451 void LockToParent()
6452 {
6453 EntityAI parent = GetHierarchyParent();
6454
6455 if (parent)
6456 {
6457 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6458 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6459 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
6460 }
6461 }
6462
6464 void UnlockFromParent()
6465 {
6466 EntityAI parent = GetHierarchyParent();
6467
6468 if (parent)
6469 {
6470 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6471 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6472 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
6473 }
6474 }
6475
6476 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
6477 {
6478 /*
6479 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
6480 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
6481 */
6482 ItemBase item2 = ItemBase.Cast(entity2);
6483
6484 if (GetGame().IsClient())
6485 {
6486 if (ScriptInputUserData.CanStoreInputUserData())
6487 {
6488 ScriptInputUserData ctx = new ScriptInputUserData;
6490 ctx.Write(-1);
6491 ItemBase i1 = this; // @NOTE: workaround for correct serialization
6492 ctx.Write(i1);
6493 ctx.Write(item2);
6494 ctx.Write(use_stack_max);
6495 ctx.Write(-1);
6496 ctx.Send();
6497
6498 if (IsCombineAll(item2, use_stack_max))
6499 {
6500 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6501 }
6502 }
6503 }
6504 else if (!GetGame().IsMultiplayer())
6505 {
6506 CombineItems(item2, use_stack_max);
6507 }
6508 }
6509
6510 bool IsLiquidPresent()
6511 {
6512 return (GetLiquidType() != 0 && HasQuantity());
6513 }
6514
6515 bool IsLiquidContainer()
6516 {
6517 return m_LiquidContainerMask != 0;
6518 }
6519
6521 {
6522 return m_LiquidContainerMask;
6523 }
6524
6525 bool IsBloodContainer()
6526 {
6527 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
6528 return false;
6529 }
6530
6531 bool IsNVG()
6532 {
6533 return false;
6534 }
6535
6538 bool IsExplosive()
6539 {
6540 return false;
6541 }
6542
6544 {
6545 return "";
6546 }
6547
6549
6550 bool IsLightSource()
6551 {
6552 return false;
6553 }
6554
6556 {
6557 return true;
6558 }
6559
6560 //--- ACTION CONDITIONS
6561 //direction
6562 bool IsFacingPlayer(PlayerBase player, string selection)
6563 {
6564 return true;
6565 }
6566
6567 bool IsPlayerInside(PlayerBase player, string selection)
6568 {
6569 return true;
6570 }
6571
6572 override bool CanObstruct()
6573 {
6574 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
6575 return !player || !IsPlayerInside(player, "");
6576 }
6577
6578 override bool IsBeingPlaced()
6579 {
6580 return m_IsBeingPlaced;
6581 }
6582
6583 void SetIsBeingPlaced(bool is_being_placed)
6584 {
6585 m_IsBeingPlaced = is_being_placed;
6586 if (!is_being_placed)
6588 SetSynchDirty();
6589 }
6590
6591 //server-side
6592 void OnEndPlacement() {}
6593
6594 override bool IsHologram()
6595 {
6596 return m_IsHologram;
6597 }
6598
6599 bool CanBeDigged()
6600 {
6601 return m_CanBeDigged;
6602 }
6603
6605 {
6606 return 1;
6607 }
6608
6609 bool CanMakeGardenplot()
6610 {
6611 return false;
6612 }
6613
6614 void SetIsHologram(bool is_hologram)
6615 {
6616 m_IsHologram = is_hologram;
6617 SetSynchDirty();
6618 }
6619 /*
6620 protected float GetNutritionalEnergy()
6621 {
6622 Edible_Base edible = Edible_Base.Cast(this);
6623 return edible.GetFoodEnergy();
6624 }
6625
6626 protected float GetNutritionalWaterContent()
6627 {
6628 Edible_Base edible = Edible_Base.Cast(this);
6629 return edible.GetFoodWater();
6630 }
6631
6632 protected float GetNutritionalIndex()
6633 {
6634 Edible_Base edible = Edible_Base.Cast(this);
6635 return edible.GetFoodNutritionalIndex();
6636 }
6637
6638 protected float GetNutritionalFullnessIndex()
6639 {
6640 Edible_Base edible = Edible_Base.Cast(this);
6641 return edible.GetFoodTotalVolume();
6642 }
6643
6644 protected float GetNutritionalToxicity()
6645 {
6646 Edible_Base edible = Edible_Base.Cast(this);
6647 return edible.GetFoodToxicity();
6648
6649 }
6650 */
6651
6652
6653 // -------------------------------------------------------------------------
6654 override void OnMovedInsideCargo(EntityAI container)
6655 {
6656 super.OnMovedInsideCargo(container);
6657
6658 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6659 }
6660
6661 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6662 {
6663 super.EEItemLocationChanged(oldLoc,newLoc);
6664
6665 PlayerBase new_player = null;
6666 PlayerBase old_player = null;
6667
6668 if (newLoc.GetParent())
6669 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6670
6671 if (oldLoc.GetParent())
6672 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6673
6674 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
6675 {
6676 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6677
6678 if (r_index >= 0)
6679 {
6680 InventoryLocation r_il = new InventoryLocation;
6681 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6682
6683 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6684 int r_type = r_il.GetType();
6685 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6686 {
6687 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6688 }
6689 else if (r_type == InventoryLocationType.ATTACHMENT)
6690 {
6691 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6692 }
6693
6694 }
6695 }
6696
6697 if (newLoc.GetType() == InventoryLocationType.HANDS)
6698 {
6699 if (new_player)
6700 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6701
6702 if (new_player == old_player)
6703 {
6704
6705 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6706 {
6707 if (oldLoc.GetType() == InventoryLocationType.CARGO)
6708 {
6709 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6710 {
6711 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6712 }
6713 }
6714 else
6715 {
6716 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6717 }
6718 }
6719
6720 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6721 {
6722 int type = oldLoc.GetType();
6723 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
6724 {
6725 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6726 }
6727 else if (type == InventoryLocationType.ATTACHMENT)
6728 {
6729 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6730 }
6731 }
6732 if (!m_OldLocation)
6733 {
6734 m_OldLocation = new InventoryLocation;
6735 }
6736 m_OldLocation.Copy(oldLoc);
6737 }
6738 else
6739 {
6740 if (m_OldLocation)
6741 {
6742 m_OldLocation.Reset();
6743 }
6744 }
6745
6747 }
6748 else
6749 {
6750 if (new_player)
6751 {
6752 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6753 if (res_index >= 0)
6754 {
6755 InventoryLocation il = new InventoryLocation;
6756 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6757 ItemBase it = ItemBase.Cast(il.GetItem());
6758 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6759 int rel_type = il.GetType();
6760 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
6761 {
6762 il.GetParent().GetOnReleaseLock().Invoke(it);
6763 }
6764 else if (rel_type == InventoryLocationType.ATTACHMENT)
6765 {
6766 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
6767 }
6768 //it.GetOnReleaseLock().Invoke(it);
6769 }
6770 }
6771 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
6772 {
6773 //ThrowPhysically(old_player, vector.Zero);
6774 m_ThrowItemOnDrop = false;
6775 }
6776
6777 if (m_OldLocation)
6778 {
6779 m_OldLocation.Reset();
6780 }
6781 }
6782 }
6783
6784 override void EOnContact(IEntity other, Contact extra)
6785 {
6787 {
6788 int liquidType = -1;
6789 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
6790 if (impactSpeed > 0.0)
6791 {
6792 m_ImpactSpeed = impactSpeed;
6793 #ifndef SERVER
6794 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
6795 #else
6796 m_WantPlayImpactSound = true;
6797 SetSynchDirty();
6798 #endif
6799 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
6800 }
6801 }
6802
6803 #ifdef SERVER
6804 if (GetCompEM() && GetCompEM().IsPlugged())
6805 {
6806 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
6807 GetCompEM().UnplugThis();
6808 }
6809 #endif
6810 }
6811
6812 void RefreshPhysics();
6813
6814 override void OnCreatePhysics()
6815 {
6817 }
6818
6819 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6820 {
6821
6822 }
6823 // -------------------------------------------------------------------------
6824 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
6825 {
6826 super.OnItemLocationChanged(old_owner, new_owner);
6827
6828 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6829 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6830
6831 if (!relatedPlayer && playerNew)
6832 relatedPlayer = playerNew;
6833
6834 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6835 {
6836 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
6837 if (actionMgr)
6838 {
6839 ActionBase currentAction = actionMgr.GetRunningAction();
6840 if (currentAction)
6841 currentAction.OnItemLocationChanged(this);
6842 }
6843 }
6844
6845 Man ownerPlayerOld = null;
6846 Man ownerPlayerNew = null;
6847
6848 if (old_owner)
6849 {
6850 if (old_owner.IsMan())
6851 {
6852 ownerPlayerOld = Man.Cast(old_owner);
6853 }
6854 else
6855 {
6856 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6857 }
6858 }
6859 else
6860 {
6861 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
6862 {
6863 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
6864
6865 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
6866 {
6867 GetCompEM().UnplugThis();
6868 }
6869 }
6870 }
6871
6872 if (new_owner)
6873 {
6874 if (new_owner.IsMan())
6875 {
6876 ownerPlayerNew = Man.Cast(new_owner);
6877 }
6878 else
6879 {
6880 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6881 }
6882 }
6883
6884 if (ownerPlayerOld != ownerPlayerNew)
6885 {
6886 if (ownerPlayerOld)
6887 {
6888 array<EntityAI> subItemsExit = new array<EntityAI>;
6889 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
6890 for (int i = 0; i < subItemsExit.Count(); i++)
6891 {
6892 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
6893 itemExit.OnInventoryExit(ownerPlayerOld);
6894 }
6895 }
6896
6897 if (ownerPlayerNew)
6898 {
6899 array<EntityAI> subItemsEnter = new array<EntityAI>;
6900 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
6901 for (int j = 0; j < subItemsEnter.Count(); j++)
6902 {
6903 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
6904 itemEnter.OnInventoryEnter(ownerPlayerNew);
6905 }
6906 }
6907 }
6908 else if (ownerPlayerNew != null)
6909 {
6910 PlayerBase nplayer;
6911 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6912 {
6913 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6914 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
6915 for (int k = 0; k < subItemsUpdate.Count(); k++)
6916 {
6917 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
6918 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6919 }
6920 }
6921 }
6922
6923 if (old_owner)
6924 old_owner.OnChildItemRemoved(this);
6925 if (new_owner)
6926 new_owner.OnChildItemReceived(this);
6927 }
6928
6929 // -------------------------------------------------------------------------------
6930 override void EEDelete(EntityAI parent)
6931 {
6932 super.EEDelete(parent);
6933 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6934 if (player)
6935 {
6936 OnInventoryExit(player);
6937
6938 if (player.IsAlive())
6939 {
6940 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6941 if (r_index >= 0)
6942 {
6943 InventoryLocation r_il = new InventoryLocation;
6944 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6945
6946 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6947 int r_type = r_il.GetType();
6948 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6949 {
6950 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6951 }
6952 else if (r_type == InventoryLocationType.ATTACHMENT)
6953 {
6954 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6955 }
6956
6957 }
6958
6959 player.RemoveQuickBarEntityShortcut(this);
6960 }
6961 }
6962 }
6963 // -------------------------------------------------------------------------------
6964 override void EEKilled(Object killer)
6965 {
6966 super.EEKilled(killer);
6967
6969 if (killer && killer.IsFireplace() && CanExplodeInFire())
6970 {
6971 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6972 {
6973 if (IsMagazine())
6974 {
6975 if (Magazine.Cast(this).GetAmmoCount() > 0)
6976 {
6977 ExplodeAmmo();
6978 }
6979 }
6980 else
6981 {
6982 Explode(DamageType.EXPLOSION);
6983 }
6984 }
6985 }
6986 }
6987
6988 override void OnWasAttached(EntityAI parent, int slot_id)
6989 {
6990 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6991
6992 super.OnWasAttached(parent, slot_id);
6993
6994 if (HasQuantity())
6995 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6996
6997 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
6998 }
6999
7000 override void OnWasDetached(EntityAI parent, int slot_id)
7001 {
7002 super.OnWasDetached(parent, slot_id);
7003
7004 if (HasQuantity())
7005 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7006 }
7007
7008 override string ChangeIntoOnAttach(string slot)
7009 {
7010 int idx;
7011 TStringArray inventory_slots = new TStringArray;
7012 TStringArray attach_types = new TStringArray;
7013
7014 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7015 if (inventory_slots.Count() < 1) //is string
7016 {
7017 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7018 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7019 }
7020 else //is array
7021 {
7022 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7023 }
7024
7025 idx = inventory_slots.Find(slot);
7026 if (idx < 0)
7027 return "";
7028
7029 return attach_types.Get(idx);
7030 }
7031
7032 override string ChangeIntoOnDetach()
7033 {
7034 int idx = -1;
7035 string slot;
7036
7037 TStringArray inventory_slots = new TStringArray;
7038 TStringArray detach_types = new TStringArray;
7039
7040 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7041 if (inventory_slots.Count() < 1) //is string
7042 {
7043 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7044 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7045 }
7046 else //is array
7047 {
7048 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7049 if (detach_types.Count() < 1)
7050 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7051 }
7052
7053 for (int i = 0; i < inventory_slots.Count(); i++)
7054 {
7055 slot = inventory_slots.Get(i);
7056 }
7057
7058 if (slot != "")
7059 {
7060 if (detach_types.Count() == 1)
7061 idx = 0;
7062 else
7063 idx = inventory_slots.Find(slot);
7064 }
7065 if (idx < 0)
7066 return "";
7067
7068 return detach_types.Get(idx);
7069 }
7070
7071 void ExplodeAmmo()
7072 {
7073 //timer
7074 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
7075
7076 //min/max time
7077 float min_time = 1;
7078 float max_time = 3;
7079 float delay = Math.RandomFloat(min_time, max_time);
7080
7081 explode_timer.Run(delay, this, "DoAmmoExplosion");
7082 }
7083
7084 void DoAmmoExplosion()
7085 {
7086 Magazine magazine = Magazine.Cast(this);
7087 int pop_sounds_count = 6;
7088 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7089
7090 //play sound
7091 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7092 string sound_name = pop_sounds[ sound_idx ];
7093 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
7094
7095 //remove ammo count
7096 magazine.ServerAddAmmoCount(-1);
7097
7098 //if condition then repeat -> ExplodeAmmo
7099 float min_temp_to_explode = 100; //min temperature for item to explode
7100
7101 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
7102 {
7103 ExplodeAmmo();
7104 }
7105 }
7106
7107 // -------------------------------------------------------------------------------
7108 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
7109 {
7110 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
7111
7112 const int CHANCE_DAMAGE_CARGO = 4;
7113 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7114 const int CHANCE_DAMAGE_NOTHING = 2;
7115
7116 if (IsClothing() || IsContainer() || IsItemTent())
7117 {
7118 float dmg = damageResult.GetDamage("","Health") * -0.5;
7119 int chances;
7120 int rnd;
7121
7122 if (GetInventory().GetCargo())
7123 {
7124 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7125 rnd = Math.RandomInt(0,chances);
7126
7127 if (rnd < CHANCE_DAMAGE_CARGO)
7128 {
7129 DamageItemInCargo(dmg);
7130 }
7131 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7132 {
7134 }
7135 }
7136 else
7137 {
7138 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7139 rnd = Math.RandomInt(0,chances);
7140
7141 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7142 {
7144 }
7145 }
7146 }
7147 }
7148
7149 bool DamageItemInCargo(float damage)
7150 {
7151 if (GetInventory().GetCargo())
7152 {
7153 int item_count = GetInventory().GetCargo().GetItemCount();
7154 if (item_count > 0)
7155 {
7156 int random_pick = Math.RandomInt(0, item_count);
7157 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
7158 if (!item.IsExplosive())
7159 {
7160 item.AddHealth("","",damage);
7161 return true;
7162 }
7163 }
7164 }
7165 return false;
7166 }
7167
7168 bool DamageItemAttachments(float damage)
7169 {
7170 int attachment_count = GetInventory().AttachmentCount();
7171 if (attachment_count > 0)
7172 {
7173 int random_pick = Math.RandomInt(0, attachment_count);
7174 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7175 if (!attachment.IsExplosive())
7176 {
7177 attachment.AddHealth("","",damage);
7178 return true;
7179 }
7180 }
7181 return false;
7182 }
7183
7184 override bool IsSplitable()
7185 {
7186 return m_CanThisBeSplit;
7187 }
7188 //----------------
7189 override bool CanBeSplit()
7190 {
7191 if (IsSplitable() && (GetQuantity() > 1))
7192 return GetInventory().CanRemoveEntity();
7193
7194 return false;
7195 }
7196
7197 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
7198 {
7199 if (!CanBeSplit())
7200 return;
7201
7202 if (GetGame().IsClient())
7203 {
7204 if (ScriptInputUserData.CanStoreInputUserData())
7205 {
7206 ScriptInputUserData ctx = new ScriptInputUserData;
7208 ctx.Write(1);
7209 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7210 ctx.Write(i1);
7211 ctx.Write(destination_entity);
7212 ctx.Write(true);
7213 ctx.Write(slot_id);
7214 ctx.Send();
7215 }
7216 }
7217 else if (!GetGame().IsMultiplayer())
7218 {
7219 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
7220 }
7221 }
7222
7223 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
7224 {
7225 if (!CanBeSplit())
7226 return;
7227
7228 float split_quantity_new;
7229 ref ItemBase new_item;
7230 float quantity = GetQuantity();
7231 float stack_max = GetTargetQuantityMax(slot_id);
7232 InventoryLocation loc = new InventoryLocation;
7233
7234 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7235 {
7236 if (stack_max <= GetQuantity())
7237 split_quantity_new = stack_max;
7238 else
7239 split_quantity_new = GetQuantity();
7240
7241 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7242 if (new_item)
7243 {
7244 new_item.SetResultOfSplit(true);
7245 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7246 AddQuantity(-split_quantity_new);
7247 new_item.SetQuantity(split_quantity_new);
7248 }
7249 }
7250 else if (destination_entity && slot_id == -1)
7251 {
7252 if (quantity > stack_max)
7253 split_quantity_new = stack_max;
7254 else
7255 split_quantity_new = quantity;
7256
7257 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7258 {
7259 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7260 new_item = ItemBase.Cast(o);
7261 }
7262
7263 if (new_item)
7264 {
7265 new_item.SetResultOfSplit(true);
7266 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7267 AddQuantity(-split_quantity_new);
7268 new_item.SetQuantity(split_quantity_new);
7269 }
7270 }
7271 else
7272 {
7273 if (stack_max != 0)
7274 {
7275 if (stack_max < GetQuantity())
7276 {
7277 split_quantity_new = GetQuantity() - stack_max;
7278 }
7279
7280 if (split_quantity_new == 0)
7281 {
7282 if (!GetGame().IsMultiplayer())
7283 player.PhysicalPredictiveDropItem(this);
7284 else
7285 player.ServerDropEntity(this);
7286 return;
7287 }
7288
7289 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7290
7291 if (new_item)
7292 {
7293 new_item.SetResultOfSplit(true);
7294 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7295 SetQuantity(split_quantity_new);
7296 new_item.SetQuantity(stack_max);
7297 new_item.PlaceOnSurface();
7298 }
7299 }
7300 }
7301 }
7302
7303 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
7304 {
7305 if (!CanBeSplit())
7306 return;
7307
7308 float split_quantity_new;
7309 ref ItemBase new_item;
7310 float quantity = GetQuantity();
7311 float stack_max = GetTargetQuantityMax(slot_id);
7312 InventoryLocation loc = new InventoryLocation;
7313
7314 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7315 {
7316 if (stack_max <= GetQuantity())
7317 split_quantity_new = stack_max;
7318 else
7319 split_quantity_new = GetQuantity();
7320
7321 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7322 if (new_item)
7323 {
7324 new_item.SetResultOfSplit(true);
7325 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7326 AddQuantity(-split_quantity_new);
7327 new_item.SetQuantity(split_quantity_new);
7328 }
7329 }
7330 else if (destination_entity && slot_id == -1)
7331 {
7332 if (quantity > stack_max)
7333 split_quantity_new = stack_max;
7334 else
7335 split_quantity_new = quantity;
7336
7337 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7338 {
7339 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7340 new_item = ItemBase.Cast(o);
7341 }
7342
7343 if (new_item)
7344 {
7345 new_item.SetResultOfSplit(true);
7346 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7347 AddQuantity(-split_quantity_new);
7348 new_item.SetQuantity(split_quantity_new);
7349 }
7350 }
7351 else
7352 {
7353 if (stack_max != 0)
7354 {
7355 if (stack_max < GetQuantity())
7356 {
7357 split_quantity_new = GetQuantity() - stack_max;
7358 }
7359
7360 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7361
7362 if (new_item)
7363 {
7364 new_item.SetResultOfSplit(true);
7365 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7366 SetQuantity(split_quantity_new);
7367 new_item.SetQuantity(stack_max);
7368 new_item.PlaceOnSurface();
7369 }
7370 }
7371 }
7372 }
7373
7374 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
7375 {
7376 if (!CanBeSplit())
7377 return;
7378
7379 if (GetGame().IsClient())
7380 {
7381 if (ScriptInputUserData.CanStoreInputUserData())
7382 {
7383 ScriptInputUserData ctx = new ScriptInputUserData;
7385 ctx.Write(4);
7386 ItemBase thiz = this; // @NOTE: workaround for correct serialization
7387 ctx.Write(thiz);
7388 dst.WriteToContext(ctx);
7389 ctx.Send();
7390 }
7391 }
7392 else if (!GetGame().IsMultiplayer())
7393 {
7395 }
7396 }
7397
7398 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
7399 {
7400 if (!CanBeSplit())
7401 return;
7402
7403 if (GetGame().IsClient())
7404 {
7405 if (ScriptInputUserData.CanStoreInputUserData())
7406 {
7407 ScriptInputUserData ctx = new ScriptInputUserData;
7409 ctx.Write(2);
7410 ItemBase dummy = this; // @NOTE: workaround for correct serialization
7411 ctx.Write(dummy);
7412 ctx.Write(destination_entity);
7413 ctx.Write(true);
7414 ctx.Write(idx);
7415 ctx.Write(row);
7416 ctx.Write(col);
7417 ctx.Send();
7418 }
7419 }
7420 else if (!GetGame().IsMultiplayer())
7421 {
7422 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
7423 }
7424 }
7425
7426 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
7427 {
7429 }
7430
7431 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
7432 {
7433 if (!CanBeSplit())
7434 return this;
7435
7436 float quantity = GetQuantity();
7437 float split_quantity_new;
7438 ItemBase new_item;
7439 if (dst.IsValid())
7440 {
7441 int slot_id = dst.GetSlot();
7442 float stack_max = GetTargetQuantityMax(slot_id);
7443
7444 if (quantity > stack_max)
7445 split_quantity_new = stack_max;
7446 else
7447 split_quantity_new = quantity;
7448
7449 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
7450
7451 if (new_item)
7452 {
7453 new_item.SetResultOfSplit(true);
7454 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7455 AddQuantity(-split_quantity_new);
7456 new_item.SetQuantity(split_quantity_new);
7457 }
7458
7459 return new_item;
7460 }
7461
7462 return null;
7463 }
7464
7465 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
7466 {
7467 if (!CanBeSplit())
7468 return;
7469
7470 float quantity = GetQuantity();
7471 float split_quantity_new;
7472 ref ItemBase new_item;
7473 if (destination_entity)
7474 {
7475 float stackable = GetTargetQuantityMax();
7476 if (quantity > stackable)
7477 split_quantity_new = stackable;
7478 else
7479 split_quantity_new = quantity;
7480
7481 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
7482 if (new_item)
7483 {
7484 new_item.SetResultOfSplit(true);
7485 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7486 AddQuantity(-split_quantity_new);
7487 new_item.SetQuantity(split_quantity_new);
7488 }
7489 }
7490 }
7491
7492 void SplitIntoStackMaxHandsClient(PlayerBase player)
7493 {
7494 if (!CanBeSplit())
7495 return;
7496
7497 if (GetGame().IsClient())
7498 {
7499 if (ScriptInputUserData.CanStoreInputUserData())
7500 {
7501 ScriptInputUserData ctx = new ScriptInputUserData;
7503 ctx.Write(3);
7504 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7505 ctx.Write(i1);
7506 ItemBase destination_entity = this;
7507 ctx.Write(destination_entity);
7508 ctx.Write(true);
7509 ctx.Write(0);
7510 ctx.Send();
7511 }
7512 }
7513 else if (!GetGame().IsMultiplayer())
7514 {
7515 SplitIntoStackMaxHands(player);
7516 }
7517 }
7518
7519 void SplitIntoStackMaxHands(PlayerBase player)
7520 {
7521 if (!CanBeSplit())
7522 return;
7523
7524 float quantity = GetQuantity();
7525 float split_quantity_new;
7526 ref ItemBase new_item;
7527 if (player)
7528 {
7529 float stackable = GetTargetQuantityMax();
7530 if (quantity > stackable)
7531 split_quantity_new = stackable;
7532 else
7533 split_quantity_new = quantity;
7534
7535 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
7536 new_item = ItemBase.Cast(in_hands);
7537 if (new_item)
7538 {
7539 new_item.SetResultOfSplit(true);
7540 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7541 AddQuantity(-split_quantity_new);
7542 new_item.SetQuantity(split_quantity_new);
7543 }
7544 }
7545 }
7546
7547 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
7548 {
7549 if (!CanBeSplit())
7550 return;
7551
7552 float quantity = GetQuantity();
7553 float split_quantity_new = Math.Floor(quantity * 0.5);
7554
7555 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
7556
7557 if (new_item)
7558 {
7559 if (new_item.GetQuantityMax() < split_quantity_new)
7560 {
7561 split_quantity_new = new_item.GetQuantityMax();
7562 }
7563
7564 new_item.SetResultOfSplit(true);
7565 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7566
7567 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
7568 {
7569 AddQuantity(-1);
7570 new_item.SetQuantity(1);
7571 }
7572 else
7573 {
7574 AddQuantity(-split_quantity_new);
7575 new_item.SetQuantity(split_quantity_new);
7576 }
7577 }
7578 }
7579
7580 void SplitItem(PlayerBase player)
7581 {
7582 if (!CanBeSplit())
7583 return;
7584
7585 float quantity = GetQuantity();
7586 float split_quantity_new = Math.Floor(quantity / 2);
7587
7588 InventoryLocation invloc = new InventoryLocation;
7589 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
7590
7591 ItemBase new_item;
7592 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7593
7594 if (new_item)
7595 {
7596 if (new_item.GetQuantityMax() < split_quantity_new)
7597 {
7598 split_quantity_new = new_item.GetQuantityMax();
7599 }
7600 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
7601 {
7602 AddQuantity(-1);
7603 new_item.SetQuantity(1);
7604 }
7605 else
7606 {
7607 AddQuantity(-split_quantity_new);
7608 new_item.SetQuantity(split_quantity_new);
7609 }
7610 }
7611 }
7612
7614 void OnQuantityChanged(float delta)
7615 {
7616 SetWeightDirty();
7617 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
7618
7619 if (parent)
7620 parent.OnAttachmentQuantityChangedEx(this, delta);
7621
7622 if (IsLiquidContainer())
7623 {
7624 if (GetQuantityNormalized() <= 0.0)
7625 {
7627 }
7628 else if (GetLiquidType() == LIQUID_NONE)
7629 {
7630 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
7632 }
7633 }
7634
7635 }
7636
7639 {
7640 // insert code here
7641 }
7642
7644 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
7645 {
7647 }
7648
7649 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
7650 {
7651 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7652
7653 if (GetGame().IsServer())
7654 {
7655 if (newLevel == GameConstants.STATE_RUINED)
7656 {
7658 EntityAI parent = GetHierarchyParent();
7659 if (parent && parent.IsFireplace())
7660 {
7661 CargoBase cargo = GetInventory().GetCargo();
7662 if (cargo)
7663 {
7664 for (int i = 0; i < cargo.GetItemCount(); ++i)
7665 {
7666 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
7667 }
7668 }
7669 }
7670 }
7671
7672 if (IsResultOfSplit())
7673 {
7674 // reset the splitting result flag, return to normal item behavior
7675 SetResultOfSplit(false);
7676 return;
7677 }
7678
7679 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7680 {
7681 SetCleanness(0);//unclean the item upon damage dealt
7682 }
7683 }
7684 }
7685
7686 // just the split? TODO: verify
7687 override void OnRightClick()
7688 {
7689 super.OnRightClick();
7690
7691 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
7692 {
7693 if (GetGame().IsClient())
7694 {
7695 if (ScriptInputUserData.CanStoreInputUserData())
7696 {
7697 vector m4[4];
7698 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
7699
7700 EntityAI root = GetHierarchyRoot();
7701
7702 InventoryLocation dst = new InventoryLocation;
7703 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
7704 {
7705 if (root)
7706 {
7707 root.GetTransform(m4);
7708 dst.SetGround(this, m4);
7709 }
7710 else
7711 GetInventory().GetCurrentInventoryLocation(dst);
7712 }
7713 else
7714 {
7715 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
7716 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
7717 this shouldnt cause issues within this scope*/
7718 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
7719 {
7720 if (root)
7721 {
7722 root.GetTransform(m4);
7723 dst.SetGround(this, m4);
7724 }
7725 else
7726 GetInventory().GetCurrentInventoryLocation(dst);
7727 }
7728 else
7729 {
7730 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7731 }
7732 }
7733
7734 ScriptInputUserData ctx = new ScriptInputUserData;
7736 ctx.Write(4);
7737 ItemBase thiz = this; // @NOTE: workaround for correct serialization
7738 ctx.Write(thiz);
7739 dst.WriteToContext(ctx);
7740 ctx.Write(true); // dummy
7741 ctx.Send();
7742 }
7743 }
7744 else if (!GetGame().IsMultiplayer())
7745 {
7746 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
7747 }
7748 }
7749 }
7750
7751 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
7752 {
7753 //TODO: delete check zero quantity check after fix double posts hands fsm events
7754 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
7755 return false;
7756
7757 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7758 return false;
7759
7760 //can_this_be_combined = ConfigGetBool("canBeSplit");
7762 return false;
7763
7764
7765 Magazine mag = Magazine.Cast(this);
7766 if (mag)
7767 {
7768 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7769 return false;
7770
7771 if (stack_max_limit)
7772 {
7773 Magazine other_mag = Magazine.Cast(other_item);
7774 if (other_item)
7775 {
7776 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7777 return false;
7778 }
7779
7780 }
7781 }
7782 else
7783 {
7784 //TODO: delete check zero quantity check after fix double posts hands fsm events
7785 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
7786 return false;
7787
7788 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
7789 return false;
7790 }
7791
7792 PlayerBase player = null;
7793 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
7794 {
7795 if (player.GetInventory().HasAttachment(this))
7796 return false;
7797
7798 if (player.IsItemsToDelete())
7799 return false;
7800 }
7801
7802 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7803 return false;
7804
7805 int slotID;
7806 string slotName;
7807 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7808 return false;
7809
7810 return true;
7811 }
7812
7813 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
7814 {
7815 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
7816 }
7817
7818 bool IsResultOfSplit()
7819 {
7820 return m_IsResultOfSplit;
7821 }
7822
7823 void SetResultOfSplit(bool value)
7824 {
7825 m_IsResultOfSplit = value;
7826 }
7827
7828 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
7829 {
7830 return ComputeQuantityUsedEx(other_item, use_stack_max);
7831 }
7832
7833 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
7834 {
7835 float other_item_quantity = other_item.GetQuantity();
7836 float this_free_space;
7837
7838 float stack_max = GetQuantityMax();
7839
7840 this_free_space = stack_max - GetQuantity();
7841
7842 if (other_item_quantity > this_free_space)
7843 {
7844 return this_free_space;
7845 }
7846 else
7847 {
7848 return other_item_quantity;
7849 }
7850 }
7851
7852 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
7853 {
7854 CombineItems(ItemBase.Cast(entity2),use_stack_max);
7855 }
7856
7857 void CombineItems(ItemBase other_item, bool use_stack_max = true)
7858 {
7859 if (!CanBeCombined(other_item, false))
7860 return;
7861
7862 if (!IsMagazine() && other_item)
7863 {
7864 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
7865 if (quantity_used != 0)
7866 {
7867 float hp1 = GetHealth01("","");
7868 float hp2 = other_item.GetHealth01("","");
7869 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
7870 hpResult = hpResult / (GetQuantity() + quantity_used);
7871
7872 hpResult *= GetMaxHealth();
7873 Math.Round(hpResult);
7874 SetHealth("", "Health", hpResult);
7875
7876 AddQuantity(quantity_used);
7877 other_item.AddQuantity(-quantity_used);
7878 }
7879 }
7880 OnCombine(other_item);
7881 }
7882
7883 void OnCombine(ItemBase other_item)
7884 {
7885 #ifdef SERVER
7886 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7887 GetHierarchyParent().IncreaseLifetimeUp();
7888 #endif
7889 };
7890
7891 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
7892 {
7893 PlayerBase p = PlayerBase.Cast(player);
7894
7895 array<int> recipesIds = p.m_Recipes;
7896 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7897 if (moduleRecipesManager)
7898 {
7899 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7900 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
7901 }
7902
7903 for (int i = 0;i < recipesIds.Count(); i++)
7904 {
7905 int key = recipesIds.Get(i);
7906 string recipeName = moduleRecipesManager.GetRecipeName(key);
7907 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
7908 }
7909 }
7910
7911 // -------------------------------------------------------------------------
7912 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7913 {
7914 super.GetDebugActions(outputList);
7915
7916 //quantity
7917 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
7918 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
7919 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
7920 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
7921
7922 //health
7923 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
7924 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
7925 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
7926 //temperature
7927 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
7928 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
7929 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
7930
7931 //wet
7932 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
7933 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
7934
7935 //liquidtype
7936 if (IsLiquidContainer())
7937 {
7938 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
7939 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
7940 }
7941
7942 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
7943 // watch
7944 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
7945 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
7946
7947 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7948 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
7949 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7950 }
7951
7952 // -------------------------------------------------------------------------
7953 // -------------------------------------------------------------------------
7954 // -------------------------------------------------------------------------
7955 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
7956 {
7957 super.OnAction(action_id, player, ctx);
7958 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
7959 {
7960 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7961 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
7962 PlayerBase p = PlayerBase.Cast(player);
7963 if (EActions.RECIPES_RANGE_START < 1000)
7964 {
7965 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7966 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7967 }
7968 }
7969 #ifndef SERVER
7970 else if (action_id == EActions.WATCH_PLAYER)
7971 {
7972 PluginDeveloper.SetDeveloperItemClientEx(player);
7973 }
7974 #endif
7975 if (GetGame().IsServer())
7976 {
7977 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7978 {
7979 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7980 OnDebugButtonPressServer(id + 1);
7981 }
7982
7983 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7984 {
7985 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7986 InsertAgent(agent_id,100);
7987 }
7988
7989 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7990 {
7991 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7992 RemoveAgent(agent_id2);
7993 }
7994
7995 else if (action_id == EActions.ADD_QUANTITY)
7996 {
7997 if (IsMagazine())
7998 {
7999 Magazine mag = Magazine.Cast(this);
8000 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8001 }
8002 else
8003 {
8004 AddQuantity(GetQuantityMax() * 0.2);
8005 }
8006
8007 if (m_EM)
8008 {
8009 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8010 }
8011 //PrintVariables();
8012 }
8013
8014 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
8015 {
8016 if (IsMagazine())
8017 {
8018 Magazine mag2 = Magazine.Cast(this);
8019 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8020 }
8021 else
8022 {
8023 AddQuantity(- GetQuantityMax() * 0.2);
8024 }
8025 if (m_EM)
8026 {
8027 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8028 }
8029 //PrintVariables();
8030 }
8031
8032 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
8033 {
8034 SetQuantity(0);
8035
8036 if (m_EM)
8037 {
8038 m_EM.SetEnergy(0);
8039 }
8040 }
8041
8042 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
8043 {
8045
8046 if (m_EM)
8047 {
8048 m_EM.SetEnergy(m_EM.GetEnergyMax());
8049 }
8050 }
8051
8052 else if (action_id == EActions.ADD_HEALTH)
8053 {
8054 AddHealth("","",GetMaxHealth("","Health")/5);
8055 }
8056 else if (action_id == EActions.REMOVE_HEALTH)
8057 {
8058 AddHealth("","",-GetMaxHealth("","Health")/5);
8059 }
8060 else if (action_id == EActions.DESTROY_HEALTH)
8061 {
8062 SetHealth01("","",0);
8063 }
8064 else if (action_id == EActions.WATCH_ITEM)
8065 {
8067 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
8068 #ifdef DEVELOPER
8069 SetDebugDeveloper_item(this);
8070 #endif
8071 }
8072
8073 else if (action_id == EActions.ADD_TEMPERATURE)
8074 {
8075 AddTemperature(20);
8076 //PrintVariables();
8077 }
8078
8079 else if (action_id == EActions.REMOVE_TEMPERATURE)
8080 {
8081 AddTemperature(-20);
8082 //PrintVariables();
8083 }
8084
8085 else if (action_id == EActions.FLIP_FROZEN)
8086 {
8087 SetFrozen(!GetIsFrozen());
8088 //PrintVariables();
8089 }
8090
8091 else if (action_id == EActions.ADD_WETNESS)
8092 {
8093 AddWet(GetWetMax()/5);
8094 //PrintVariables();
8095 }
8096
8097 else if (action_id == EActions.REMOVE_WETNESS)
8098 {
8099 AddWet(-GetWetMax()/5);
8100 //PrintVariables();
8101 }
8102
8103 else if (action_id == EActions.LIQUIDTYPE_UP)
8104 {
8105 int curr_type = GetLiquidType();
8106 SetLiquidType(curr_type * 2);
8107 //AddWet(1);
8108 //PrintVariables();
8109 }
8110
8111 else if (action_id == EActions.LIQUIDTYPE_DOWN)
8112 {
8113 int curr_type2 = GetLiquidType();
8114 SetLiquidType(curr_type2 / 2);
8115 }
8116
8117 else if (action_id == EActions.MAKE_SPECIAL)
8118 {
8119 auto debugParams = DebugSpawnParams.WithPlayer(player);
8120 OnDebugSpawnEx(debugParams);
8121 }
8122
8123 else if (action_id == EActions.DELETE)
8124 {
8125 Delete();
8126 }
8127
8128 }
8129
8130
8131 return false;
8132 }
8133
8134 // -------------------------------------------------------------------------
8135
8136
8139 void OnActivatedByTripWire();
8140
8142 void OnActivatedByItem(notnull ItemBase item);
8143
8144 //----------------------------------------------------------------
8145 //returns true if item is able to explode when put in fire
8146 bool CanExplodeInFire()
8147 {
8148 return false;
8149 }
8150
8151 //----------------------------------------------------------------
8152 bool CanEat()
8153 {
8154 return true;
8155 }
8156
8157 //----------------------------------------------------------------
8158 override bool IsIgnoredByConstruction()
8159 {
8160 return true;
8161 }
8162
8163 //----------------------------------------------------------------
8164 //has FoodStages in config?
8165 bool HasFoodStage()
8166 {
8167 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
8168 return GetGame().ConfigIsExisting(config_path);
8169 }
8170
8172 FoodStage GetFoodStage()
8173 {
8174 return null;
8175 }
8176
8177 bool CanBeCooked()
8178 {
8179 return false;
8180 }
8181
8182 bool CanBeCookedOnStick()
8183 {
8184 return false;
8185 }
8186
8188 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
8190
8191 //----------------------------------------------------------------
8192 bool CanRepair(ItemBase item_repair_kit)
8193 {
8194 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8195 return module_repairing.CanRepair(this, item_repair_kit);
8196 }
8197
8198 //----------------------------------------------------------------
8199 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
8200 {
8201 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8202 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8203 }
8204
8205 //----------------------------------------------------------------
8206 int GetItemSize()
8207 {
8208 /*
8209 vector v_size = this.ConfigGetVector("itemSize");
8210 int v_size_x = v_size[0];
8211 int v_size_y = v_size[1];
8212 int size = v_size_x * v_size_y;
8213 return size;
8214 */
8215
8216 return 1;
8217 }
8218
8219 //----------------------------------------------------------------
8220 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8221 bool CanBeMovedOverride()
8222 {
8223 return m_CanBeMovedOverride;
8224 }
8225
8226 //----------------------------------------------------------------
8227 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8228 void SetCanBeMovedOverride(bool setting)
8229 {
8230 m_CanBeMovedOverride = setting;
8231 }
8232
8233 //----------------------------------------------------------------
8241 void MessageToOwnerStatus(string text)
8242 {
8243 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8244
8245 if (player)
8246 {
8247 player.MessageStatus(text);
8248 }
8249 }
8250
8251 //----------------------------------------------------------------
8259 void MessageToOwnerAction(string text)
8260 {
8261 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8262
8263 if (player)
8264 {
8265 player.MessageAction(text);
8266 }
8267 }
8268
8269 //----------------------------------------------------------------
8277 void MessageToOwnerFriendly(string text)
8278 {
8279 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8280
8281 if (player)
8282 {
8283 player.MessageFriendly(text);
8284 }
8285 }
8286
8287 //----------------------------------------------------------------
8295 void MessageToOwnerImportant(string text)
8296 {
8297 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8298
8299 if (player)
8300 {
8301 player.MessageImportant(text);
8302 }
8303 }
8304
8305 override bool IsItemBase()
8306 {
8307 return true;
8308 }
8309
8310 // Checks if item is of questioned kind
8311 override bool KindOf(string tag)
8312 {
8313 bool found = false;
8314 string item_name = this.GetType();
8315 ref TStringArray item_tag_array = new TStringArray;
8316 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
8317
8318 int array_size = item_tag_array.Count();
8319 for (int i = 0; i < array_size; i++)
8320 {
8321 if (item_tag_array.Get(i) == tag)
8322 {
8323 found = true;
8324 break;
8325 }
8326 }
8327 return found;
8328 }
8329
8330
8331 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
8332 {
8333 //Debug.Log("OnRPC called");
8334 super.OnRPC(sender, rpc_type,ctx);
8335
8336 //Play soundset for attachment locking (ActionLockAttachment.c)
8337 switch (rpc_type)
8338 {
8339 #ifndef SERVER
8340 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8341 Param2<bool, string> p = new Param2<bool, string>(false, "");
8342
8343 if (!ctx.Read(p))
8344 return;
8345
8346 bool play = p.param1;
8347 string soundSet = p.param2;
8348
8349 if (play)
8350 {
8351 if (m_LockingSound)
8352 {
8354 {
8355 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8356 }
8357 }
8358 else
8359 {
8360 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8361 }
8362 }
8363 else
8364 {
8365 SEffectManager.DestroyEffect(m_LockingSound);
8366 }
8367
8368 break;
8369 #endif
8370
8371 }
8372
8373 if (GetWrittenNoteData())
8374 {
8375 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
8376 }
8377 }
8378
8379 //-----------------------------
8380 // VARIABLE MANIPULATION SYSTEM
8381 //-----------------------------
8382 int NameToID(string name)
8383 {
8384 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
8385 return plugin.GetID(name);
8386 }
8387
8388 string IDToName(int id)
8389 {
8390 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
8391 return plugin.GetName(id);
8392 }
8393
8395 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
8396 {
8397 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
8398 //read the flags
8399 int varFlags;
8400 if (!ctx.Read(varFlags))
8401 return;
8402
8403 if (varFlags & ItemVariableFlags.FLOAT)
8404 {
8405 ReadVarsFromCTX(ctx);
8406 }
8407 }
8408
8409 override void SerializeNumericalVars(array<float> floats_out)
8410 {
8411 //some variables handled on EntityAI level already!
8412 super.SerializeNumericalVars(floats_out);
8413
8414 // the order of serialization must be the same as the order of de-serialization
8415 //--------------------------------------------
8416 if (IsVariableSet(VARIABLE_QUANTITY))
8417 {
8418 floats_out.Insert(m_VarQuantity);
8419 }
8420 //--------------------------------------------
8421 if (IsVariableSet(VARIABLE_WET))
8422 {
8423 floats_out.Insert(m_VarWet);
8424 }
8425 //--------------------------------------------
8426 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
8427 {
8428 floats_out.Insert(m_VarLiquidType);
8429 }
8430 //--------------------------------------------
8431 if (IsVariableSet(VARIABLE_COLOR))
8432 {
8433 floats_out.Insert(m_ColorComponentR);
8434 floats_out.Insert(m_ColorComponentG);
8435 floats_out.Insert(m_ColorComponentB);
8436 floats_out.Insert(m_ColorComponentA);
8437 }
8438 //--------------------------------------------
8439 if (IsVariableSet(VARIABLE_CLEANNESS))
8440 {
8441 floats_out.Insert(m_Cleanness);
8442 }
8443 }
8444
8445 override void DeSerializeNumericalVars(array<float> floats)
8446 {
8447 //some variables handled on EntityAI level already!
8448 super.DeSerializeNumericalVars(floats);
8449
8450 // the order of serialization must be the same as the order of de-serialization
8451 int index = 0;
8452 int mask = Math.Round(floats.Get(index));
8453
8454 index++;
8455 //--------------------------------------------
8456 if (mask & VARIABLE_QUANTITY)
8457 {
8458 if (m_IsStoreLoad)
8459 {
8460 SetStoreLoadedQuantity(floats.Get(index));
8461 }
8462 else
8463 {
8464 float quantity = floats.Get(index);
8465 SetQuantity(quantity, true, false, false, false);
8466 }
8467 index++;
8468 }
8469 //--------------------------------------------
8470 if (mask & VARIABLE_WET)
8471 {
8472 float wet = floats.Get(index);
8473 SetWet(wet);
8474 index++;
8475 }
8476 //--------------------------------------------
8477 if (mask & VARIABLE_LIQUIDTYPE)
8478 {
8479 int liquidtype = Math.Round(floats.Get(index));
8480 SetLiquidType(liquidtype);
8481 index++;
8482 }
8483 //--------------------------------------------
8484 if (mask & VARIABLE_COLOR)
8485 {
8486 m_ColorComponentR = Math.Round(floats.Get(index));
8487 index++;
8488 m_ColorComponentG = Math.Round(floats.Get(index));
8489 index++;
8490 m_ColorComponentB = Math.Round(floats.Get(index));
8491 index++;
8492 m_ColorComponentA = Math.Round(floats.Get(index));
8493 index++;
8494 }
8495 //--------------------------------------------
8496 if (mask & VARIABLE_CLEANNESS)
8497 {
8498 int cleanness = Math.Round(floats.Get(index));
8499 SetCleanness(cleanness);
8500 index++;
8501 }
8502 }
8503
8504 override void WriteVarsToCTX(ParamsWriteContext ctx)
8505 {
8506 super.WriteVarsToCTX(ctx);
8507
8508 //--------------------------------------------
8509 if (IsVariableSet(VARIABLE_QUANTITY))
8510 {
8511 ctx.Write(GetQuantity());
8512 }
8513 //--------------------------------------------
8514 if (IsVariableSet(VARIABLE_WET))
8515 {
8516 ctx.Write(GetWet());
8517 }
8518 //--------------------------------------------
8519 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
8520 {
8521 ctx.Write(GetLiquidType());
8522 }
8523 //--------------------------------------------
8524 if (IsVariableSet(VARIABLE_COLOR))
8525 {
8526 int r,g,b,a;
8527 GetColor(r,g,b,a);
8528 ctx.Write(r);
8529 ctx.Write(g);
8530 ctx.Write(b);
8531 ctx.Write(a);
8532 }
8533 //--------------------------------------------
8534 if (IsVariableSet(VARIABLE_CLEANNESS))
8535 {
8536 ctx.Write(GetCleanness());
8537 }
8538 }
8539
8540 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
8541 {
8542 if (!super.ReadVarsFromCTX(ctx,version))
8543 return false;
8544
8545 int intValue;
8546 float value;
8547
8548 if (version < 140)
8549 {
8550 if (!ctx.Read(intValue))
8551 return false;
8552
8553 m_VariablesMask = intValue;
8554 }
8555
8556 if (m_VariablesMask & VARIABLE_QUANTITY)
8557 {
8558 if (!ctx.Read(value))
8559 return false;
8560
8561 if (IsStoreLoad())
8562 {
8564 }
8565 else
8566 {
8567 SetQuantity(value, true, false, false, false);
8568 }
8569 }
8570 //--------------------------------------------
8571 if (version < 140)
8572 {
8573 if (m_VariablesMask & VARIABLE_TEMPERATURE)
8574 {
8575 if (!ctx.Read(value))
8576 return false;
8577 SetTemperatureDirect(value);
8578 }
8579 }
8580 //--------------------------------------------
8581 if (m_VariablesMask & VARIABLE_WET)
8582 {
8583 if (!ctx.Read(value))
8584 return false;
8585 SetWet(value);
8586 }
8587 //--------------------------------------------
8588 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
8589 {
8590 if (!ctx.Read(intValue))
8591 return false;
8592 SetLiquidType(intValue);
8593 }
8594 //--------------------------------------------
8595 if (m_VariablesMask & VARIABLE_COLOR)
8596 {
8597 int r,g,b,a;
8598 if (!ctx.Read(r))
8599 return false;
8600 if (!ctx.Read(g))
8601 return false;
8602 if (!ctx.Read(b))
8603 return false;
8604 if (!ctx.Read(a))
8605 return false;
8606
8607 SetColor(r,g,b,a);
8608 }
8609 //--------------------------------------------
8610 if (m_VariablesMask & VARIABLE_CLEANNESS)
8611 {
8612 if (!ctx.Read(intValue))
8613 return false;
8614 SetCleanness(intValue);
8615 }
8616 //--------------------------------------------
8617 if (version >= 138 && version < 140)
8618 {
8619 if (m_VariablesMask & VARIABLE_TEMPERATURE)
8620 {
8621 if (!ctx.Read(intValue))
8622 return false;
8623 SetFrozen(intValue);
8624 }
8625 }
8626
8627 return true;
8628 }
8629
8630 //----------------------------------------------------------------
8631 override bool OnStoreLoad(ParamsReadContext ctx, int version)
8632 {
8633 m_IsStoreLoad = true;
8635 {
8636 m_FixDamageSystemInit = true;
8637 }
8638
8639 if (!super.OnStoreLoad(ctx, version))
8640 {
8641 m_IsStoreLoad = false;
8642 return false;
8643 }
8644
8645 if (version >= 114)
8646 {
8647 bool hasQuickBarIndexSaved;
8648
8649 if (!ctx.Read(hasQuickBarIndexSaved))
8650 {
8651 m_IsStoreLoad = false;
8652 return false;
8653 }
8654
8655 if (hasQuickBarIndexSaved)
8656 {
8657 int itmQBIndex;
8658
8659 //Load quickbar item bind
8660 if (!ctx.Read(itmQBIndex))
8661 {
8662 m_IsStoreLoad = false;
8663 return false;
8664 }
8665
8666 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8667 if (itmQBIndex != -1 && parentPlayer)
8668 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8669 }
8670 }
8671 else
8672 {
8673 // Backup of how it used to be
8674 PlayerBase player;
8675 int itemQBIndex;
8676 if (version == int.MAX)
8677 {
8678 if (!ctx.Read(itemQBIndex))
8679 {
8680 m_IsStoreLoad = false;
8681 return false;
8682 }
8683 }
8684 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8685 {
8686 //Load quickbar item bind
8687 if (!ctx.Read(itemQBIndex))
8688 {
8689 m_IsStoreLoad = false;
8690 return false;
8691 }
8692 if (itemQBIndex != -1 && player)
8693 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8694 }
8695 }
8696
8697 if (version < 140)
8698 {
8699 // variable management system
8700 if (!LoadVariables(ctx, version))
8701 {
8702 m_IsStoreLoad = false;
8703 return false;
8704 }
8705 }
8706
8707 //agent trasmission system
8708 if (!LoadAgents(ctx, version))
8709 {
8710 m_IsStoreLoad = false;
8711 return false;
8712 }
8713 if (version >= 132)
8714 {
8715 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8716 if (raib)
8717 {
8718 if (!raib.OnStoreLoad(ctx,version))
8719 {
8720 m_IsStoreLoad = false;
8721 return false;
8722 }
8723 }
8724 }
8725
8726 m_IsStoreLoad = false;
8727 return true;
8728 }
8729
8730 //----------------------------------------------------------------
8731
8732 override void OnStoreSave(ParamsWriteContext ctx)
8733 {
8734 super.OnStoreSave(ctx);
8735
8736 PlayerBase player;
8737 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8738 {
8739 ctx.Write(true); // Keep track of if we should actually read this in or not
8740 //Save quickbar item bind
8741 int itemQBIndex = -1;
8742 itemQBIndex = player.FindQuickBarEntityIndex(this);
8743 ctx.Write(itemQBIndex);
8744 }
8745 else
8746 {
8747 ctx.Write(false); // Keep track of if we should actually read this in or not
8748 }
8749
8750 SaveAgents(ctx);//agent trasmission system
8751
8752 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8753 if (raib)
8754 {
8755 raib.OnStoreSave(ctx);
8756 }
8757 }
8758 //----------------------------------------------------------------
8759
8760 override void AfterStoreLoad()
8761 {
8762 super.AfterStoreLoad();
8763
8765 {
8767 }
8768
8769 if (GetStoreLoadedQuantity() != float.LOWEST)
8770 {
8772 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
8773 }
8774 }
8775
8776 override void EEOnAfterLoad()
8777 {
8778 super.EEOnAfterLoad();
8779
8781 {
8782 m_FixDamageSystemInit = false;
8783 }
8784
8787 }
8788
8789 bool CanBeDisinfected()
8790 {
8791 return false;
8792 }
8793
8794
8795 //----------------------------------------------------------------
8796 override void OnVariablesSynchronized()
8797 {
8798 if (m_Initialized)
8799 {
8800 #ifdef PLATFORM_CONSOLE
8801 //bruteforce it is
8802 if (IsSplitable())
8803 {
8804 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
8805 if (menu)
8806 {
8807 menu.Refresh();
8808 }
8809 }
8810 #endif
8811 }
8812
8814 {
8815 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8816 m_WantPlayImpactSound = false;
8817 }
8818
8820 {
8821 SetWeightDirty();
8823 }
8824 if (m_VarWet != m_VarWetPrev)
8825 {
8828 }
8829
8830 if (m_SoundSyncPlay != 0)
8831 {
8832 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
8833 m_SoundSyncPlay = 0;
8834 }
8835 if (m_SoundSyncStop != 0)
8836 {
8837 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
8838 m_SoundSyncStop = 0;
8839 }
8840
8841 super.OnVariablesSynchronized();
8842 }
8843
8844 //------------------------- Quantity
8845 //----------------------------------------------------------------
8847 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
8848 {
8849 if (!IsServerCheck(allow_client))
8850 return false;
8851
8852 if (!HasQuantity())
8853 return false;
8854
8855 float min = GetQuantityMin();
8856 float max = GetQuantityMax();
8857
8858 if (value <= (min + 0.001))
8859 value = min;
8860
8861 if (value == min)
8862 {
8863 if (destroy_config)
8864 {
8865 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8866 if (dstr)
8867 {
8868 m_VarQuantity = Math.Clamp(value, min, max);
8869 this.Delete();
8870 return true;
8871 }
8872 }
8873 else if (destroy_forced)
8874 {
8875 m_VarQuantity = Math.Clamp(value, min, max);
8876 this.Delete();
8877 return true;
8878 }
8879 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
8880 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
8881 }
8882
8883 float delta = m_VarQuantity;
8884 m_VarQuantity = Math.Clamp(value, min, max);
8885
8886 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
8887 {
8888 delta = m_VarQuantity - delta;
8889
8890 if (delta)
8891 OnQuantityChanged(delta);
8892 }
8893
8894 SetVariableMask(VARIABLE_QUANTITY);
8895
8896 return false;
8897 }
8898
8899 //----------------------------------------------------------------
8901 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
8902 {
8903 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
8904 }
8905 //----------------------------------------------------------------
8906 void SetQuantityMax()
8907 {
8908 float max = GetQuantityMax();
8909 SetQuantity(max);
8910 }
8911
8912 override void SetQuantityToMinimum()
8913 {
8914 float min = GetQuantityMin();
8915 SetQuantity(min);
8916 }
8917 //----------------------------------------------------------------
8919 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
8920 {
8921 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
8922 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
8923 SetQuantity(result, destroy_config, destroy_forced);
8924 }
8925
8926 //----------------------------------------------------------------
8928 override float GetQuantityNormalized()
8929 {
8930 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
8931 }
8932
8934 {
8935 return GetQuantityNormalized();
8936 }
8937
8938 /*void SetAmmoNormalized(float value)
8939 {
8940 float value_clamped = Math.Clamp(value, 0, 1);
8941 Magazine this_mag = Magazine.Cast(this);
8942 int max_rounds = this_mag.GetAmmoMax();
8943 int result = value * max_rounds;//can the rounded if higher precision is required
8944 this_mag.SetAmmoCount(result);
8945 }*/
8946 //----------------------------------------------------------------
8947 override int GetQuantityMax()
8948 {
8949 int slot = -1;
8950 if (GetInventory())
8951 {
8952 InventoryLocation il = new InventoryLocation;
8953 GetInventory().GetCurrentInventoryLocation(il);
8954 slot = il.GetSlot();
8955 }
8956
8957 return GetTargetQuantityMax(slot);
8958 }
8959
8960 override int GetTargetQuantityMax(int attSlotID = -1)
8961 {
8962 float quantity_max = 0;
8963
8964 if (IsSplitable()) //only stackable/splitable items can check for stack size
8965 {
8966 if (attSlotID != -1)
8967 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8968
8969 if (quantity_max <= 0)
8970 quantity_max = m_VarStackMax;
8971 }
8972
8973 if (quantity_max <= 0)
8974 quantity_max = m_VarQuantityMax;
8975
8976 return quantity_max;
8977 }
8978 //----------------------------------------------------------------
8979 override int GetQuantityMin()
8980 {
8981 return m_VarQuantityMin;
8982 }
8983 //----------------------------------------------------------------
8984 int GetQuantityInit()
8985 {
8986 return m_VarQuantityInit;
8987 }
8988
8989 //----------------------------------------------------------------
8990 override bool HasQuantity()
8991 {
8992 return !(GetQuantityMax() - GetQuantityMin() == 0);
8993 }
8994
8995 override float GetQuantity()
8996 {
8997 return m_VarQuantity;
8998 }
8999
9000 bool IsFullQuantity()
9001 {
9002 return GetQuantity() >= GetQuantityMax();
9003 }
9004
9005 //Calculates weight of single item without attachments and cargo
9006 override float GetSingleInventoryItemWeightEx()
9007 {
9008 //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
9009 float weightEx = GetWeightEx();//overall weight of the item
9010 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
9011 return weightEx - special;
9012 }
9013
9014 // Obsolete, use GetSingleInventoryItemWeightEx() instead
9016 {
9018 }
9019
9020 override protected float GetWeightSpecialized(bool forceRecalc = false)
9021 {
9022 if (IsSplitable()) //quantity determines size of the stack
9023 {
9024 #ifdef DEVELOPER
9025 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9026 {
9027 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9028 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
9029 }
9030 #endif
9031
9032 return GetQuantity() * GetConfigWeightModified();
9033 }
9034 else if (HasEnergyManager())// items with energy manager
9035 {
9036 #ifdef DEVELOPER
9037 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9038 {
9039 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9040 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
9041 }
9042 #endif
9043 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9044 }
9045 else//everything else
9046 {
9047 #ifdef DEVELOPER
9048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9049 {
9050 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9051 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
9052 }
9053 #endif
9054 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9055 }
9056 }
9057
9059 int GetNumberOfItems()
9060 {
9061 int item_count = 0;
9062 ItemBase item;
9063
9064 if (GetInventory().GetCargo() != NULL)
9065 {
9066 item_count = GetInventory().GetCargo().GetItemCount();
9067 }
9068
9069 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9070 {
9071 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9072 if (item)
9073 item_count += item.GetNumberOfItems();
9074 }
9075 return item_count;
9076 }
9077
9079 float GetUnitWeight(bool include_wetness = true)
9080 {
9081 float weight = 0;
9082 float wetness = 1;
9083 if (include_wetness)
9084 wetness += GetWet();
9085 if (IsSplitable()) //quantity determines size of the stack
9086 {
9087 weight = wetness * m_ConfigWeight;
9088 }
9089 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
9090 {
9091 weight = 1;
9092 }
9093 return weight;
9094 }
9095
9096 //-----------------------------------------------------------------
9097
9098 override void ClearInventory()
9099 {
9100 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
9101 {
9102 GameInventory inv = GetInventory();
9103 array<EntityAI> items = new array<EntityAI>;
9104 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
9105 for (int i = 0; i < items.Count(); i++)
9106 {
9107 ItemBase item = ItemBase.Cast(items.Get(i));
9108 if (item)
9109 {
9110 GetGame().ObjectDelete(item);
9111 }
9112 }
9113 }
9114 }
9115
9116 //------------------------- Energy
9117
9118 //----------------------------------------------------------------
9119 float GetEnergy()
9120 {
9121 float energy = 0;
9122 if (HasEnergyManager())
9123 {
9124 energy = GetCompEM().GetEnergy();
9125 }
9126 return energy;
9127 }
9128
9129
9130 override void OnEnergyConsumed()
9131 {
9132 super.OnEnergyConsumed();
9133
9135 }
9136
9137 override void OnEnergyAdded()
9138 {
9139 super.OnEnergyAdded();
9140
9142 }
9143
9144 // Converts energy (from Energy Manager) to quantity, if enabled.
9146 {
9147 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9148 {
9149 if (HasQuantity())
9150 {
9151 float energy_0to1 = GetCompEM().GetEnergy0To1();
9152 SetQuantityNormalized(energy_0to1);
9153 }
9154 }
9155 }
9156
9157 //----------------------------------------------------------------
9158 float GetHeatIsolationInit()
9159 {
9160 return ConfigGetFloat("heatIsolation");
9161 }
9162
9163 float GetHeatIsolation()
9164 {
9165 return m_HeatIsolation;
9166 }
9167
9168 float GetDryingIncrement(string pIncrementName)
9169 {
9170 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
9171 if (GetGame().ConfigIsExisting(paramPath))
9172 return GetGame().ConfigGetFloat(paramPath);
9173
9174 return 0.0;
9175 }
9176
9177 float GetSoakingIncrement(string pIncrementName)
9178 {
9179 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
9180 if (GetGame().ConfigIsExisting(paramPath))
9181 return GetGame().ConfigGetFloat(paramPath);
9182
9183 return 0.0;
9184 }
9185 //----------------------------------------------------------------
9186 override void SetWet(float value, bool allow_client = false)
9187 {
9188 if (!IsServerCheck(allow_client))
9189 return;
9190
9191 float min = GetWetMin();
9192 float max = GetWetMax();
9193
9194 float previousValue = m_VarWet;
9195
9196 m_VarWet = Math.Clamp(value, min, max);
9197
9198 if (previousValue != m_VarWet)
9199 {
9200 SetVariableMask(VARIABLE_WET);
9201 OnWetChanged(m_VarWet, previousValue);
9202 }
9203 }
9204 //----------------------------------------------------------------
9205 override void AddWet(float value)
9206 {
9207 SetWet(GetWet() + value);
9208 }
9209 //----------------------------------------------------------------
9210 override void SetWetMax()
9211 {
9213 }
9214 //----------------------------------------------------------------
9215 override float GetWet()
9216 {
9217 return m_VarWet;
9218 }
9219 //----------------------------------------------------------------
9220 override float GetWetMax()
9221 {
9222 return m_VarWetMax;
9223 }
9224 //----------------------------------------------------------------
9225 override float GetWetMin()
9226 {
9227 return m_VarWetMin;
9228 }
9229 //----------------------------------------------------------------
9230 override float GetWetInit()
9231 {
9232 return m_VarWetInit;
9233 }
9234 //----------------------------------------------------------------
9235 override void OnWetChanged(float newVal, float oldVal)
9236 {
9237 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
9238 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
9239 if (newLevel != oldLevel)
9240 {
9241 OnWetLevelChanged(newLevel,oldLevel);
9242 }
9243 }
9244
9245 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
9246 {
9247 SetWeightDirty();
9248 }
9249
9250 override EWetnessLevel GetWetLevel()
9251 {
9252 return GetWetLevelInternal(m_VarWet);
9253 }
9254
9255 //----------------------------------------------------------------
9256
9257 override void SetStoreLoad(bool value)
9258 {
9259 m_IsStoreLoad = value;
9260 }
9261
9262 override bool IsStoreLoad()
9263 {
9264 return m_IsStoreLoad;
9265 }
9266
9267 override void SetStoreLoadedQuantity(float value)
9268 {
9269 m_StoreLoadedQuantity = value;
9270 }
9271
9272 override float GetStoreLoadedQuantity()
9273 {
9274 return m_StoreLoadedQuantity;
9275 }
9276
9277 //----------------------------------------------------------------
9278
9279 float GetItemModelLength()
9280 {
9281 if (ConfigIsExisting("itemModelLength"))
9282 {
9283 return ConfigGetFloat("itemModelLength");
9284 }
9285 return 0;
9286 }
9287
9288 float GetItemAttachOffset()
9289 {
9290 if (ConfigIsExisting("itemAttachOffset"))
9291 {
9292 return ConfigGetFloat("itemAttachOffset");
9293 }
9294 return 0;
9295 }
9296
9297 override void SetCleanness(int value, bool allow_client = false)
9298 {
9299 if (!IsServerCheck(allow_client))
9300 return;
9301
9302 int previousValue = m_Cleanness;
9303
9304 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
9305
9306 if (previousValue != m_Cleanness)
9307 SetVariableMask(VARIABLE_CLEANNESS);
9308 }
9309
9310 override int GetCleanness()
9311 {
9312 return m_Cleanness;
9313 }
9314
9316 {
9317 return true;
9318 }
9319
9320 //----------------------------------------------------------------
9321 // ATTACHMENT LOCKING
9322 // Getters relevant to generic ActionLockAttachment
9323 int GetLockType()
9324 {
9325 return m_LockType;
9326 }
9327
9328 string GetLockSoundSet()
9329 {
9330 return m_LockSoundSet;
9331 }
9332
9333 //----------------------------------------------------------------
9334 //------------------------- Color
9335 // sets items color variable given color components
9336 override void SetColor(int r, int g, int b, int a)
9337 {
9342 SetVariableMask(VARIABLE_COLOR);
9343 }
9345 override void GetColor(out int r,out int g,out int b,out int a)
9346 {
9351 }
9352
9353 bool IsColorSet()
9354 {
9355 return IsVariableSet(VARIABLE_COLOR);
9356 }
9357
9359 string GetColorString()
9360 {
9361 int r,g,b,a;
9362 GetColor(r,g,b,a);
9363 r = r/255;
9364 g = g/255;
9365 b = b/255;
9366 a = a/255;
9367 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9368 }
9369 //----------------------------------------------------------------
9370 //------------------------- LiquidType
9371
9372 override void SetLiquidType(int value, bool allow_client = false)
9373 {
9374 if (!IsServerCheck(allow_client))
9375 return;
9376
9377 int old = m_VarLiquidType;
9378 m_VarLiquidType = value;
9379 OnLiquidTypeChanged(old,value);
9380 SetVariableMask(VARIABLE_LIQUIDTYPE);
9381 }
9382
9383 int GetLiquidTypeInit()
9384 {
9385 return ConfigGetInt("varLiquidTypeInit");
9386 }
9387
9388 override int GetLiquidType()
9389 {
9390 return m_VarLiquidType;
9391 }
9392
9393 protected void OnLiquidTypeChanged(int oldType, int newType)
9394 {
9395 if (newType == LIQUID_NONE && GetIsFrozen())
9396 SetFrozen(false);
9397 }
9398
9400 void UpdateQuickbarShortcutVisibility(PlayerBase player)
9401 {
9402 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9403 }
9404
9405 // -------------------------------------------------------------------------
9407 void OnInventoryEnter(Man player)
9408 {
9409 PlayerBase nplayer;
9410 if (PlayerBase.CastTo(nplayer, player))
9411 {
9412 m_CanPlayImpactSound = true;
9413 //nplayer.OnItemInventoryEnter(this);
9414 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9415 }
9416 }
9417
9418 // -------------------------------------------------------------------------
9420 void OnInventoryExit(Man player)
9421 {
9422 PlayerBase nplayer;
9423 if (PlayerBase.CastTo(nplayer,player))
9424 {
9425 //nplayer.OnItemInventoryExit(this);
9426 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9427
9428 }
9429
9430 //if (!GetGame().IsDedicatedServer())
9431 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9432
9433
9434 if (HasEnergyManager())
9435 {
9436 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
9437 }
9438 }
9439
9440 // ADVANCED PLACEMENT EVENTS
9441 override void OnPlacementStarted(Man player)
9442 {
9443 super.OnPlacementStarted(player);
9444
9445 SetTakeable(false);
9446 }
9447
9448 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
9449 {
9450 if (m_AdminLog)
9451 {
9452 m_AdminLog.OnPlacementComplete(player, this);
9453 }
9454
9455 super.OnPlacementComplete(player, position, orientation);
9456 }
9457
9458 //-----------------------------
9459 // AGENT SYSTEM
9460 //-----------------------------
9461 //--------------------------------------------------------------------------
9462 bool ContainsAgent(int agent_id)
9463 {
9464 if (agent_id & m_AttachedAgents)
9465 {
9466 return true;
9467 }
9468 else
9469 {
9470 return false;
9471 }
9472 }
9473
9474 //--------------------------------------------------------------------------
9475 override void RemoveAgent(int agent_id)
9476 {
9477 if (ContainsAgent(agent_id))
9478 {
9479 m_AttachedAgents = ~agent_id & m_AttachedAgents;
9480 }
9481 }
9482
9483 //--------------------------------------------------------------------------
9484 override void RemoveAllAgents()
9485 {
9486 m_AttachedAgents = 0;
9487 }
9488 //--------------------------------------------------------------------------
9489 override void RemoveAllAgentsExcept(int agent_to_keep)
9490 {
9491 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
9492 }
9493 // -------------------------------------------------------------------------
9494 override void InsertAgent(int agent, float count = 1)
9495 {
9496 if (count < 1)
9497 return;
9498 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
9500 }
9501
9503 void TransferAgents(int agents)
9504 {
9506 }
9507
9508 // -------------------------------------------------------------------------
9509 override int GetAgents()
9510 {
9511 return m_AttachedAgents;
9512 }
9513 //----------------------------------------------------------------------
9514
9515 /*int GetContaminationType()
9516 {
9517 int contamination_type;
9518
9519 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
9520 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
9521 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
9522 const int DIRTY_MASK = eAgents.WOUND_AGENT;
9523
9524 Edible_Base edible = Edible_Base.Cast(this);
9525 int agents = GetAgents();
9526 if (edible)
9527 {
9528 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
9529 if (profile)
9530 {
9531 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
9532 }
9533 }
9534 if (agents & CONTAMINATED_MASK)
9535 {
9536 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
9537 }
9538 if (agents & POISONED_MASK)
9539 {
9540 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
9541 }
9542 if (agents & NERVE_GAS_MASK)
9543 {
9544 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
9545 }
9546 if (agents & DIRTY_MASK)
9547 {
9548 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
9549 }
9550
9551 return agents;
9552 }*/
9553
9554 // -------------------------------------------------------------------------
9555 bool LoadAgents(ParamsReadContext ctx, int version)
9556 {
9557 if (!ctx.Read(m_AttachedAgents))
9558 return false;
9559 return true;
9560 }
9561 // -------------------------------------------------------------------------
9563 {
9564
9566 }
9567 // -------------------------------------------------------------------------
9568
9570 override void CheckForRoofLimited(float timeTresholdMS = 3000)
9571 {
9572 super.CheckForRoofLimited(timeTresholdMS);
9573
9574 float time = GetGame().GetTime();
9575 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9576 {
9577 m_PreviousRoofTestTime = time;
9578 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9579 }
9580 }
9581
9582 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
9583 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
9584 {
9585 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
9586 {
9587 return 0;
9588 }
9589
9590 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
9591 {
9592 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
9593 if (filter)
9594 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
9595 else
9596 return 0;//otherwise return 0 when no filter attached
9597 }
9598
9599 string subclassPath, entryName;
9600
9601 switch (type)
9602 {
9603 case DEF_BIOLOGICAL:
9604 entryName = "biological";
9605 break;
9606 case DEF_CHEMICAL:
9607 entryName = "chemical";
9608 break;
9609 default:
9610 entryName = "biological";
9611 break;
9612 }
9613
9614 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
9615
9616 return GetGame().ConfigGetFloat(subclassPath + entryName);
9617 }
9618
9619
9620
9622 override void EEOnCECreate()
9623 {
9624 if (!IsMagazine())
9626
9628 }
9629
9630
9631 //-------------------------
9632 // OPEN/CLOSE USER ACTIONS
9633 //-------------------------
9635 void Open();
9636 void Close();
9637 bool IsOpen()
9638 {
9639 return true;
9640 }
9641
9642 override bool CanDisplayCargo()
9643 {
9644 return IsOpen();
9645 }
9646
9647
9648 // ------------------------------------------------------------
9649 // CONDITIONS
9650 // ------------------------------------------------------------
9651 override bool CanPutInCargo(EntityAI parent)
9652 {
9653 if (parent)
9654 {
9655 if (parent.IsInherited(DayZInfected))
9656 return true;
9657
9658 if (!parent.IsRuined())
9659 return true;
9660 }
9661
9662 return true;
9663 }
9664
9665 override bool CanPutAsAttachment(EntityAI parent)
9666 {
9667 if (!super.CanPutAsAttachment(parent))
9668 {
9669 return false;
9670 }
9671
9672 if (!IsRuined() && !parent.IsRuined())
9673 {
9674 return true;
9675 }
9676
9677 return false;
9678 }
9679
9680 override bool CanReceiveItemIntoCargo(EntityAI item)
9681 {
9682 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9683 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9684 // return false;
9685
9686 return super.CanReceiveItemIntoCargo(item);
9687 }
9688
9689 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
9690 {
9691 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9692 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9693 // return false;
9694
9695 GameInventory attachmentInv = attachment.GetInventory();
9696 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9697 {
9698 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9699 return false;
9700 }
9701
9702 InventoryLocation loc = new InventoryLocation();
9703 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9704 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
9705 return false;
9706
9707 return super.CanReceiveAttachment(attachment, slotId);
9708 }
9709
9710 override bool CanReleaseAttachment(EntityAI attachment)
9711 {
9712 if (!super.CanReleaseAttachment(attachment))
9713 return false;
9714
9715 return GetInventory().AreChildrenAccessible();
9716 }
9717
9718 /*override bool CanLoadAttachment(EntityAI attachment)
9719 {
9720 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9721 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9722 // return false;
9723
9724 GameInventory attachmentInv = attachment.GetInventory();
9725 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9726 {
9727 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
9728 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
9729
9730 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9731 return false;
9732 }
9733
9734 return super.CanLoadAttachment(attachment);
9735 }*/
9736
9737 // Plays muzzle flash particle effects
9738 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9739 {
9740 int id = muzzle_owner.GetMuzzleID();
9741 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
9742
9743 if (WPOF_array)
9744 {
9745 for (int i = 0; i < WPOF_array.Count(); i++)
9746 {
9747 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9748
9749 if (WPOF)
9750 {
9751 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9752 }
9753 }
9754 }
9755 }
9756
9757 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
9758 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9759 {
9760 int id = muzzle_owner.GetMuzzleID();
9761 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
9762
9763 if (WPOBE_array)
9764 {
9765 for (int i = 0; i < WPOBE_array.Count(); i++)
9766 {
9767 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9768
9769 if (WPOBE)
9770 {
9771 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9772 }
9773 }
9774 }
9775 }
9776
9777 // Plays all weapon overheating particles
9778 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9779 {
9780 int id = muzzle_owner.GetMuzzleID();
9781 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9782
9783 if (WPOOH_array)
9784 {
9785 for (int i = 0; i < WPOOH_array.Count(); i++)
9786 {
9787 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9788
9789 if (WPOOH)
9790 {
9791 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9792 }
9793 }
9794 }
9795 }
9796
9797 // Updates all weapon overheating particles
9798 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9799 {
9800 int id = muzzle_owner.GetMuzzleID();
9801 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9802
9803 if (WPOOH_array)
9804 {
9805 for (int i = 0; i < WPOOH_array.Count(); i++)
9806 {
9807 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9808
9809 if (WPOOH)
9810 {
9811 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9812 }
9813 }
9814 }
9815 }
9816
9817 // Stops overheating particles
9818 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9819 {
9820 int id = muzzle_owner.GetMuzzleID();
9821 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9822
9823 if (WPOOH_array)
9824 {
9825 for (int i = 0; i < WPOOH_array.Count(); i++)
9826 {
9827 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9828
9829 if (WPOOH)
9830 {
9831 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9832 }
9833 }
9834 }
9835 }
9836
9837 //----------------------------------------------------------------
9838 //Item Behaviour - unified approach
9839 override bool IsHeavyBehaviour()
9840 {
9841 if (m_ItemBehaviour == 0)
9842 {
9843 return true;
9844 }
9845
9846 return false;
9847 }
9848
9849 override bool IsOneHandedBehaviour()
9850 {
9851 if (m_ItemBehaviour == 1)
9852 {
9853 return true;
9854 }
9855
9856 return false;
9857 }
9858
9859 override bool IsTwoHandedBehaviour()
9860 {
9861 if (m_ItemBehaviour == 2)
9862 {
9863 return true;
9864 }
9865
9866 return false;
9867 }
9868
9869 bool IsDeployable()
9870 {
9871 return false;
9872 }
9873
9875 float GetDeployTime()
9876 {
9877 return UATimeSpent.DEFAULT_DEPLOY;
9878 }
9879
9880
9881 //----------------------------------------------------------------
9882 // Item Targeting (User Actions)
9883 override void SetTakeable(bool pState)
9884 {
9885 m_IsTakeable = pState;
9886 SetSynchDirty();
9887 }
9888
9889 override bool IsTakeable()
9890 {
9891 return m_IsTakeable;
9892 }
9893
9894 // For cases where we want to show object widget which cant be taken to hands
9896 {
9897 return false;
9898 }
9899
9901 protected void PreLoadSoundAttachmentType()
9902 {
9903 string att_type = "None";
9904
9905 if (ConfigIsExisting("soundAttType"))
9906 {
9907 att_type = ConfigGetString("soundAttType");
9908 }
9909
9910 m_SoundAttType = att_type;
9911 }
9912
9913 override string GetAttachmentSoundType()
9914 {
9915 return m_SoundAttType;
9916 }
9917
9918 //----------------------------------------------------------------
9919 //SOUNDS - ItemSoundHandler
9920 //----------------------------------------------------------------
9921
9922 string GetPlaceSoundset(); // played when deploy starts
9923 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
9924 string GetDeploySoundset(); // played when deploy sucessfully finishes
9925
9927 {
9928 if (!m_ItemSoundHandler)
9930
9931 return m_ItemSoundHandler;
9932 }
9933
9934 // override to initialize sounds
9935 protected void InitItemSounds()
9936 {
9937 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
9938 return;
9939
9941
9942 if (GetPlaceSoundset() != string.Empty)
9943 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
9944
9945 if (GetDeploySoundset() != string.Empty)
9946 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
9947
9948 SoundParameters params = new SoundParameters();
9949 params.m_Loop = true;
9950 if (GetLoopDeploySoundset() != string.Empty)
9951 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
9952 }
9953
9954 // Start sound using ItemSoundHandler
9955 void StartItemSoundServer(int id)
9956 {
9957 if (!GetGame().IsServer())
9958 return;
9959
9960 m_SoundSyncPlay = id;
9961 SetSynchDirty();
9962
9963 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
9965 }
9966
9967 // Stop sound using ItemSoundHandler
9968 void StopItemSoundServer(int id)
9969 {
9970 if (!GetGame().IsServer())
9971 return;
9972
9973 m_SoundSyncStop = id;
9974 SetSynchDirty();
9975
9976 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
9978 }
9979
9980 protected void ClearStartItemSoundServer()
9981 {
9982 m_SoundSyncPlay = 0;
9983 }
9984
9985 protected void ClearStopItemSoundServer()
9986 {
9987 m_SoundSyncStop = 0;
9988 }
9989
9991 void PlayAttachSound(string slot_type)
9992 {
9993 if (!GetGame().IsDedicatedServer())
9994 {
9995 if (ConfigIsExisting("attachSoundSet"))
9996 {
9997 string cfg_path = "";
9998 string soundset = "";
9999 string type_name = GetType();
10000
10001 TStringArray cfg_soundset_array = new TStringArray;
10002 TStringArray cfg_slot_array = new TStringArray;
10003 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10004 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10005
10006 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10007 {
10008 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10009 {
10010 if (cfg_slot_array[i] == slot_type)
10011 {
10012 soundset = cfg_soundset_array[i];
10013 break;
10014 }
10015 }
10016 }
10017
10018 if (soundset != "")
10019 {
10020 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
10021 sound.SetAutodestroy(true);
10022 }
10023 }
10024 }
10025 }
10026
10027 void PlayDetachSound(string slot_type)
10028 {
10029 //TODO - evaluate if needed and devise universal config structure if so
10030 }
10031
10032 void OnApply(PlayerBase player);
10033
10035 {
10036 return 1.0;
10037 };
10038 //returns applicable selection
10039 array<string> GetHeadHidingSelection()
10040 {
10042 }
10043
10045 {
10047 }
10048
10049 WrittenNoteData GetWrittenNoteData() {};
10050
10052 {
10053 SetDynamicPhysicsLifeTime(0.01);
10054 m_ItemBeingDroppedPhys = false;
10055 }
10056
10058 {
10059 array<string> zone_names = new array<string>;
10060 GetDamageZones(zone_names);
10061 for (int i = 0; i < zone_names.Count(); i++)
10062 {
10063 SetHealthMax(zone_names.Get(i),"Health");
10064 }
10065 SetHealthMax("","Health");
10066 }
10067
10069 void SetZoneDamageCEInit()
10070 {
10071 float global_health = GetHealth01("","Health");
10072 array<string> zones = new array<string>;
10073 GetDamageZones(zones);
10074 //set damage of all zones to match global health level
10075 for (int i = 0; i < zones.Count(); i++)
10076 {
10077 SetHealth01(zones.Get(i),"Health",global_health);
10078 }
10079 }
10080
10082 bool IsCoverFaceForShave(string slot_name)
10083 {
10084 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10085 }
10086
10087 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10088 {
10089 if (!hasRootAsPlayer)
10090 {
10091 if (refParentIB)
10092 {
10093 // parent is wet
10094 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
10095 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10096 // parent has liquid inside
10097 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
10098 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10099 // drying
10100 else if (m_VarWet > m_VarWetMin)
10101 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
10102 }
10103 else
10104 {
10105 // drying on ground or inside non-itembase (car, ...)
10106 if (m_VarWet > m_VarWetMin)
10107 AddWet(-1 * delta * GetDryingIncrement("ground"));
10108 }
10109 }
10110 }
10111
10112 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10113 {
10115 {
10116 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
10117 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
10118 {
10119 float heatPermCoef = 1.0;
10120 EntityAI ent = this;
10121 while (ent)
10122 {
10123 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10124 ent = ent.GetHierarchyParent();
10125 }
10126
10127 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10128 }
10129 }
10130 }
10131
10132 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
10133 {
10134 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
10135 EntityAI parent = GetHierarchyParent();
10136 if (!parent)
10137 {
10138 hasParent = false;
10139 hasRootAsPlayer = false;
10140 }
10141 else
10142 {
10143 hasParent = true;
10144 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10145 refParentIB = ItemBase.Cast(parent);
10146 }
10147 }
10148
10149 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
10150 {
10151 // this is stub, implemented on Edible_Base
10152 }
10153
10154 bool CanDecay()
10155 {
10156 // return true used on selected food clases so they can decay
10157 return false;
10158 }
10159
10160 protected bool CanProcessDecay()
10161 {
10162 // this is stub, implemented on Edible_Base class
10163 // used to determine whether it is still necessary for the food to decay
10164 return false;
10165 }
10166
10167 protected bool CanHaveWetness()
10168 {
10169 // return true used on selected items that have a wetness effect
10170 return false;
10171 }
10172
10174 bool CanBeConsumed(ConsumeConditionData data = null)
10175 {
10176 return !GetIsFrozen() && IsOpen();
10177 }
10178
10179 override void ProcessVariables()
10180 {
10181 bool hasParent = false, hasRootAsPlayer = false;
10182 ItemBase refParentIB;
10183
10184 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
10185 bool foodDecay = g_Game.IsFoodDecayEnabled();
10186
10187 if (wwtu || foodDecay)
10188 {
10189 bool processWetness = wwtu && CanHaveWetness();
10190 bool processTemperature = wwtu && CanHaveTemperature();
10191 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
10192
10193 if (processWetness || processTemperature || processDecay)
10194 {
10195 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
10196
10197 if (processWetness)
10198 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10199
10200 if (processTemperature)
10201 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10202
10203 if (processDecay)
10204 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10205 }
10206 }
10207 }
10208
10211 {
10212 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
10213 }
10214
10215 override float GetTemperatureFreezeThreshold()
10216 {
10218 return Liquid.GetFreezeThreshold(GetLiquidType());
10219
10220 return super.GetTemperatureFreezeThreshold();
10221 }
10222
10223 override float GetTemperatureThawThreshold()
10224 {
10226 return Liquid.GetThawThreshold(GetLiquidType());
10227
10228 return super.GetTemperatureThawThreshold();
10229 }
10230
10231 override float GetItemOverheatThreshold()
10232 {
10234 return Liquid.GetBoilThreshold(GetLiquidType());
10235
10236 return super.GetItemOverheatThreshold();
10237 }
10238
10239 override float GetTemperatureFreezeTime()
10240 {
10241 if (HasQuantity())
10242 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
10243
10244 return super.GetTemperatureFreezeTime();
10245 }
10246
10247 override float GetTemperatureThawTime()
10248 {
10249 if (HasQuantity())
10250 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
10251
10252 return super.GetTemperatureThawTime();
10253 }
10254
10256 void AffectLiquidContainerOnFill(int liquid_type, float amount);
10258 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
10259
10260 bool IsCargoException4x3(EntityAI item)
10261 {
10262 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10263 }
10264
10266 {
10267 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10268 }
10269
10271 void AddLightSourceItem(ItemBase lightsource)
10272 {
10273 m_LightSourceItem = lightsource;
10274 }
10275
10277 {
10278 m_LightSourceItem = null;
10279 }
10280
10282 {
10283 return m_LightSourceItem;
10284 }
10285
10287 array<int> GetValidFinishers()
10288 {
10289 return null;
10290 }
10291
10293 bool GetActionWidgetOverride(out typename name)
10294 {
10295 return false;
10296 }
10297
10298 bool PairWithDevice(notnull ItemBase otherDevice)
10299 {
10300 if (GetGame().IsServer())
10301 {
10302 ItemBase explosive = otherDevice;
10304 if (!trg)
10305 {
10306 trg = RemoteDetonatorTrigger.Cast(otherDevice);
10307 explosive = this;
10308 }
10309
10310 explosive.PairRemote(trg);
10311 trg.SetControlledDevice(explosive);
10312
10313 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10314 trg.SetPersistentPairID(persistentID);
10315 explosive.SetPersistentPairID(persistentID);
10316
10317 return true;
10318 }
10319 return false;
10320 }
10321
10323 float GetBaitEffectivity()
10324 {
10325 float ret = 1.0;
10326 if (HasQuantity())
10327 ret *= GetQuantityNormalized();
10328 ret *= GetHealth01();
10329
10330 return ret;
10331 }
10332
10333 #ifdef DEVELOPER
10334 override void SetDebugItem()
10335 {
10336 super.SetDebugItem();
10337 _itemBase = this;
10338 }
10339
10340 override string GetDebugText()
10341 {
10342 string text = super.GetDebugText();
10343
10344 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
10345 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
10346
10347 return text;
10348 }
10349 #endif
10350
10351 bool CanBeUsedForSuicide()
10352 {
10353 return true;
10354 }
10355
10357 //DEPRECATED BELOW
10359 // Backwards compatibility
10360 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10361 {
10362 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
10363 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
10364 }
10365
10366 // replaced by ItemSoundHandler
10367 protected EffectSound m_SoundDeployFinish;
10368 protected EffectSound m_SoundPlace;
10369 protected EffectSound m_DeployLoopSoundEx;
10370 protected EffectSound m_SoundDeploy;
10371 bool m_IsPlaceSound;
10372 bool m_IsDeploySound;
10374
10375 string GetDeployFinishSoundset();
10376 void PlayDeploySound();
10377 void PlayDeployFinishSound();
10378 void PlayPlaceSound();
10379 void PlayDeployLoopSoundEx();
10380 void StopDeployLoopSoundEx();
10381 void SoundSynchRemoteReset();
10382 void SoundSynchRemote();
10383 bool UsesGlobalDeploy(){return false;}
10384 bool CanPlayDeployLoopSound(){return false;}
10386 bool IsPlaceSound(){return m_IsPlaceSound;}
10387 bool IsDeploySound(){return m_IsDeploySound;}
10388 void SetIsPlaceSound(bool is_place_sound);
10389 void SetIsDeploySound(bool is_deploy_sound);
10390}
10391
10392EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
10393{
10394 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
10395 if (entity)
10396 {
10397 bool is_item = entity.IsInherited(ItemBase);
10398 if (is_item && full_quantity)
10399 {
10400 ItemBase item = ItemBase.Cast(entity);
10401 item.SetQuantity(item.GetQuantityInit());
10402 }
10403 }
10404 else
10405 {
10406 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
10407 return NULL;
10408 }
10409 return entity;
10410}
10411
10412void SetupSpawnedItem(ItemBase item, float health, float quantity)
10413{
10414 if (item)
10415 {
10416 if (health > 0)
10417 item.SetHealth("", "", health);
10418
10419 if (item.CanHaveTemperature())
10420 {
10421 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
10422 if (item.CanFreeze())
10423 item.SetFrozen(false);
10424 }
10425
10426 if (item.HasEnergyManager())
10427 {
10428 if (quantity >= 0)
10429 {
10430 item.GetCompEM().SetEnergy0To1(quantity);
10431 }
10432 else
10433 {
10434 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
10435 }
10436 }
10437 else if (item.IsMagazine())
10438 {
10439 Magazine mag = Magazine.Cast(item);
10440 if (quantity >= 0)
10441 {
10442 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10443 }
10444 else
10445 {
10446 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
10447 }
10448
10449 }
10450 else
10451 {
10452 if (quantity >= 0)
10453 {
10454 item.SetQuantityNormalized(quantity, false);
10455 }
10456 else
10457 {
10458 item.SetQuantity(Math.AbsFloat(quantity));
10459 }
10460
10461 }
10462 }
10463}
10464
10465#ifdef DEVELOPER
10466ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
10467#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
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
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
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
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:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
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:8078
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:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
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:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
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:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
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:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
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
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
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()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
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:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
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 void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
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:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
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:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
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:1012
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 IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
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
Определения InventoryItem.c:731
Определения 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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
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:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
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
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
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:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
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
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()