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

◆ IsLightSource()

bool SpawnItemOnLocation::IsLightSource ( )
private

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

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