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

◆ IsLiquidContainer()

bool SpawnItemOnLocation::IsLiquidContainer ( )
private

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

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

Используется в InventoryItem::GetDebugActions(), InventoryItem::GetItemOverheatThreshold(), InventoryItem::GetTemperatureFreezeThreshold(), InventoryItem::GetTemperatureThawThreshold(), InventoryItem::GetUnitWeight(), InventoryItem::InitItemVariables() и InventoryItem::OnQuantityChanged().