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

◆ SetIsHologram()

void SpawnItemOnLocation::SetIsHologram ( bool is_hologram)
private

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

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