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

◆ OnMovedInsideCargo()

override void SpawnItemOnLocation::OnMovedInsideCargo ( EntityAI container)
private

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

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