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

◆ IsExplosive()

bool SpawnItemOnLocation::IsExplosive ( )
private

explosive

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

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