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

◆ HasQuantity()

override bool SpawnItemOnLocation::HasQuantity ( )
private

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

8153{
8154 override bool CanPutAsAttachment(EntityAI parent)
8155 {
8156 return true;
8157 }
8158};
8159
8160//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8161
8162class ItemBase extends InventoryItem
8163{
8167
8169
8170 static int m_DebugActionsMask;
8172 // ============================================
8173 // Variable Manipulation System
8174 // ============================================
8175 // Quantity
8176
8177 float m_VarQuantity;
8178 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8180 int m_VarQuantityMin;
8181 int m_VarQuantityMax;
8182 int m_Count;
8183 float m_VarStackMax;
8184 float m_StoreLoadedQuantity = float.LOWEST;
8185 // Wet
8186 float m_VarWet;
8187 float m_VarWetPrev;//for client to know wetness changed during synchronization
8188 float m_VarWetInit;
8189 float m_VarWetMin;
8190 float m_VarWetMax;
8191 // Cleanness
8192 int m_Cleanness;
8193 int m_CleannessInit;
8194 int m_CleannessMin;
8195 int m_CleannessMax;
8196 // impact sounds
8198 bool m_CanPlayImpactSound = true;
8199 float m_ImpactSpeed;
8201 //
8202 float m_HeatIsolation;
8203 float m_ItemModelLength;
8204 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8206 int m_VarLiquidType;
8207 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8208 int m_QuickBarBonus;
8209 bool m_IsBeingPlaced;
8210 bool m_IsHologram;
8211 bool m_IsTakeable;
8212 bool m_ThrowItemOnDrop;
8215 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8216 bool can_this_be_combined; //Check if item can be combined
8217 bool m_CanThisBeSplit; //Check if item can be split
8218 bool m_IsStoreLoad = false;
8219 bool m_CanShowQuantity;
8220 bool m_HasQuantityBar;
8221 protected bool m_CanBeDigged;
8222 protected bool m_IsResultOfSplit
8223
8224 string m_SoundAttType;
8225 // items color variables
8230 //-------------------------------------------------------
8231
8232 // light source managing
8234
8238
8239 //==============================================
8240 // agent system
8241 private int m_AttachedAgents;
8242
8244 void TransferModifiers(PlayerBase reciever);
8245
8246
8247 // Weapons & suppressors particle effects
8252 static int m_LastRegisteredWeaponID = 0;
8253
8254 // Overheating effects
8256 float m_OverheatingShots;
8257 ref Timer m_CheckOverheating;
8258 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8259 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8260 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8261 ref array <ref OverheatingParticle> m_OverheatingParticles;
8262
8264 protected bool m_HideSelectionsBySlot;
8265
8266 // Admin Log
8267 PluginAdminLog m_AdminLog;
8268
8269 // misc
8270 ref Timer m_PhysDropTimer;
8271
8272 // Attachment Locking variables
8273 ref array<int> m_CompatibleLocks;
8274 protected int m_LockType;
8275 protected ref EffectSound m_LockingSound;
8276 protected string m_LockSoundSet;
8277
8278 // ItemSoundHandler
8279 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8280 protected int m_SoundSyncPlay; // id for sound to play
8281 protected int m_SoundSyncStop; // id for sound to stop
8283
8284 //temperature
8285 private float m_TemperaturePerQuantityWeight;
8286
8287 // -------------------------------------------------------------------------
8288 void ItemBase()
8289 {
8290 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8294
8295 if (!GetGame().IsDedicatedServer())
8296 {
8297 if (HasMuzzle())
8298 {
8300
8302 {
8304 }
8305 }
8306
8308 m_ActionsInitialize = false;
8309 }
8310
8311 m_OldLocation = null;
8312
8313 if (GetGame().IsServer())
8314 {
8315 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8316 }
8317
8318 if (ConfigIsExisting("headSelectionsToHide"))
8319 {
8321 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8322 }
8323
8324 m_HideSelectionsBySlot = false;
8325 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8326 {
8327 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8328 }
8329
8330 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8331
8332 m_IsResultOfSplit = false;
8333
8335 }
8336
8337 override void InitItemVariables()
8338 {
8339 super.InitItemVariables();
8340
8341 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8342 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8343 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8344 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8345 m_VarStackMax = ConfigGetFloat("varStackMax");
8346 m_Count = ConfigGetInt("count");
8347
8348 m_CanShowQuantity = ConfigGetBool("quantityShow");
8349 m_HasQuantityBar = ConfigGetBool("quantityBar");
8350
8351 m_CleannessInit = ConfigGetInt("varCleannessInit");
8353 m_CleannessMin = ConfigGetInt("varCleannessMin");
8354 m_CleannessMax = ConfigGetInt("varCleannessMax");
8355
8356 m_WantPlayImpactSound = false;
8357 m_ImpactSpeed = 0.0;
8358
8359 m_VarWetInit = ConfigGetFloat("varWetInit");
8361 m_VarWetMin = ConfigGetFloat("varWetMin");
8362 m_VarWetMax = ConfigGetFloat("varWetMax");
8363
8364 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8365 if (IsLiquidContainer() && GetQuantity() != 0)
8367 m_IsBeingPlaced = false;
8368 m_IsHologram = false;
8369 m_IsTakeable = true;
8370 m_CanBeMovedOverride = false;
8374 m_CanBeDigged = ConfigGetBool("canBeDigged");
8375
8376 m_CompatibleLocks = new array<int>();
8377 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8378 m_LockType = ConfigGetInt("lockType");
8379
8380 //Define if item can be split and set ability to be combined accordingly
8381 m_CanThisBeSplit = false;
8382 can_this_be_combined = false;
8383 if (ConfigIsExisting("canBeSplit"))
8384 {
8385 can_this_be_combined = ConfigGetBool("canBeSplit");
8387 }
8388
8389 m_ItemBehaviour = -1;
8390 if (ConfigIsExisting("itemBehaviour"))
8391 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8392
8393 //RegisterNetSyncVariableInt("m_VariablesMask");
8394 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8395 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8396 RegisterNetSyncVariableInt("m_VarLiquidType");
8397 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8398
8399 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8400 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8401 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8402
8403 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8404 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8405 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8406 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8407
8408 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8409 RegisterNetSyncVariableBool("m_IsTakeable");
8410 RegisterNetSyncVariableBool("m_IsHologram");
8411
8412 InitItemSounds();
8414 {
8415 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8416 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8417 }
8418
8419 m_LockSoundSet = ConfigGetString("lockSoundSet");
8420
8422 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8423 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8424
8425 }
8426
8427 override int GetQuickBarBonus()
8428 {
8429 return m_QuickBarBonus;
8430 }
8431
8432 void InitializeActions()
8433 {
8435 if (!m_InputActionMap)
8436 {
8438 m_InputActionMap = iam;
8439 SetActions();
8441 }
8442 }
8443
8444 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8445 {
8447 {
8448 m_ActionsInitialize = true;
8450 }
8451
8452 actions = m_InputActionMap.Get(action_input_type);
8453 }
8454
8455 void SetActions()
8456 {
8457 AddAction(ActionTakeItem);
8458 AddAction(ActionTakeItemToHands);
8459 AddAction(ActionWorldCraft);
8461 AddAction(ActionAttachWithSwitch);
8462 }
8463
8464 void SetActionAnimOverrides(); // Override action animation for specific item
8465
8466 void AddAction(typename actionName)
8467 {
8468 ActionBase action = ActionManagerBase.GetAction(actionName);
8469
8470 if (!action)
8471 {
8472 Debug.LogError("Action " + actionName + " dosn't exist!");
8473 return;
8474 }
8475
8476 typename ai = action.GetInputType();
8477 if (!ai)
8478 {
8479 m_ActionsInitialize = false;
8480 return;
8481 }
8482
8483 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8484 if (!action_array)
8485 {
8486 action_array = new array<ActionBase_Basic>;
8487 m_InputActionMap.Insert(ai, action_array);
8488 }
8489 if (LogManager.IsActionLogEnable())
8490 {
8491 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8492 }
8493
8494 if (action_array.Find(action) != -1)
8495 {
8496 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8497 }
8498 else
8499 {
8500 action_array.Insert(action);
8501 }
8502 }
8503
8504 void RemoveAction(typename actionName)
8505 {
8506 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
8507 ActionBase action = player.GetActionManager().GetAction(actionName);
8508 typename ai = action.GetInputType();
8509 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8510
8511 if (action_array)
8512 {
8513 action_array.RemoveItem(action);
8514 }
8515 }
8516
8517 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
8518 // Set -1 for params which should stay in default state
8519 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
8520 {
8521 ActionOverrideData overrideData = new ActionOverrideData();
8522 overrideData.m_CommandUID = commandUID;
8523 overrideData.m_CommandUIDProne = commandUIDProne;
8524 overrideData.m_StanceMask = stanceMask;
8525
8526 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
8527 if (!actionMap) // create new map of action > overidables map
8528 {
8529 actionMap = new TActionAnimOverrideMap();
8530 m_ItemActionOverrides.Insert(action, actionMap);
8531 }
8532
8533 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
8534
8535 }
8536
8537 void OnItemInHandsPlayerSwimStart(PlayerBase player);
8538
8539 ScriptedLightBase GetLight();
8540
8541 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8542 void LoadParticleConfigOnFire(int id)
8543 {
8544 if (!m_OnFireEffect)
8546
8549
8550 string config_to_search = "CfgVehicles";
8551 string muzzle_owner_config;
8552
8553 if (!m_OnFireEffect.Contains(id))
8554 {
8555 if (IsInherited(Weapon))
8556 config_to_search = "CfgWeapons";
8557
8558 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8559
8560 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8561
8562 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
8563
8564 if (config_OnFire_subclass_count > 0)
8565 {
8566 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8567
8568 for (int i = 0; i < config_OnFire_subclass_count; i++)
8569 {
8570 string particle_class = "";
8571 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
8572 string config_OnFire_entry = config_OnFire_class + particle_class;
8573 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8574 WPOF_array.Insert(WPOF);
8575 }
8576
8577
8578 m_OnFireEffect.Insert(id, WPOF_array);
8579 }
8580 }
8581
8582 if (!m_OnBulletCasingEjectEffect.Contains(id))
8583 {
8584 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8585 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8586
8587 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8588
8589 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8590
8591 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8592 {
8593 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8594
8595 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8596 {
8597 string particle_class2 = "";
8598 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8599 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8600 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8601 WPOBE_array.Insert(WPOBE);
8602 }
8603
8604
8605 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8606 }
8607 }
8608 }
8609
8610 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8612 {
8615
8616 if (!m_OnOverheatingEffect.Contains(id))
8617 {
8618 string config_to_search = "CfgVehicles";
8619
8620 if (IsInherited(Weapon))
8621 config_to_search = "CfgWeapons";
8622
8623 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8624 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8625
8626 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
8627 {
8628
8629 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8630
8632 {
8633 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8634 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8635 Error(error);
8636 return;
8637 }
8638
8639 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8640 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8641
8642
8643
8644 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
8645 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8646
8647 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8648 {
8649 string particle_class = "";
8650 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8651 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8652 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
8653
8654 if (entry_type == CT_CLASS)
8655 {
8656 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8657 WPOOH_array.Insert(WPOF);
8658 }
8659 }
8660
8661
8662 m_OnOverheatingEffect.Insert(id, WPOOH_array);
8663 }
8664 }
8665 }
8666
8667 float GetOverheatingValue()
8668 {
8669 return m_OverheatingShots;
8670 }
8671
8672 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
8673 {
8674 if (m_MaxOverheatingValue > 0)
8675 {
8677
8678 if (!m_CheckOverheating)
8680
8682 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8683
8684 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8685 }
8686 }
8687
8688 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8689 {
8691 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8692
8694 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8695
8697 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8698
8700 {
8702 }
8703 }
8704
8706 {
8708 }
8709
8710 void OnOverheatingDecay()
8711 {
8712 if (m_MaxOverheatingValue > 0)
8713 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
8714 else
8716
8717 if (m_OverheatingShots <= 0)
8718 {
8721 }
8722 else
8723 {
8724 if (!m_CheckOverheating)
8726
8728 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8729 }
8730
8731 CheckOverheating(this, "", this);
8732 }
8733
8734 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8735 {
8737 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8738 }
8739
8740 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8741 {
8743 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8745 }
8746
8747 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8748 {
8750 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8751 }
8752
8753 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
8754 {
8756 m_OverheatingParticles = new array<ref OverheatingParticle>;
8757
8758 OverheatingParticle OP = new OverheatingParticle();
8759 OP.RegisterParticle(p);
8760 OP.SetOverheatingLimitMin(min_heat_coef);
8761 OP.SetOverheatingLimitMax(max_heat_coef);
8762 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
8763
8764 m_OverheatingParticles.Insert(OP);
8765 }
8766
8767 float GetOverheatingCoef()
8768 {
8769 if (m_MaxOverheatingValue > 0)
8771
8772 return -1;
8773 }
8774
8776 {
8778 {
8779 float overheat_coef = GetOverheatingCoef();
8780 int count = m_OverheatingParticles.Count();
8781
8782 for (int i = count; i > 0; --i)
8783 {
8784 int id = i - 1;
8785 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8786 Particle p = OP.GetParticle();
8787
8788 float overheat_min = OP.GetOverheatingLimitMin();
8789 float overheat_max = OP.GetOverheatingLimitMax();
8790
8791 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8792 {
8793 if (p)
8794 {
8795 p.Stop();
8796 OP.RegisterParticle(null);
8797 }
8798 }
8799 }
8800 }
8801 }
8802
8804 {
8806 {
8807 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
8808 {
8809 int id = i - 1;
8810 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8811
8812 if (OP)
8813 {
8814 Particle p = OP.GetParticle();
8815
8816 if (p)
8817 {
8818 p.Stop();
8819 }
8820
8821 delete OP;
8822 }
8823 }
8824
8825 m_OverheatingParticles.Clear();
8827 }
8828 }
8829
8831 float GetInfectionChance(int system = 0, Param param = null)
8832 {
8833 return 0.0;
8834 }
8835
8836
8837 float GetDisinfectQuantity(int system = 0, Param param1 = null)
8838 {
8839 return 250;//default value
8840 }
8841
8842 float GetFilterDamageRatio()
8843 {
8844 return 0;
8845 }
8846
8848 bool HasMuzzle()
8849 {
8850 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
8851 return true;
8852
8853 return false;
8854 }
8855
8857 int GetMuzzleID()
8858 {
8859 if (!m_WeaponTypeToID)
8861
8862 if (m_WeaponTypeToID.Contains(GetType()))
8863 {
8864 return m_WeaponTypeToID.Get(GetType());
8865 }
8866 else
8867 {
8868 // Register new weapon ID
8870 }
8871
8873 }
8874
8881 {
8882 return -1;
8883 }
8884
8885
8886
8887 // -------------------------------------------------------------------------
8888 void ~ItemBase()
8889 {
8890 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
8891 {
8892 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
8893 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8894
8895 if (r_index >= 0)
8896 {
8897 InventoryLocation r_il = new InventoryLocation;
8898 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8899
8900 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8901 int r_type = r_il.GetType();
8902 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8903 {
8904 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8905 }
8906 else if (r_type == InventoryLocationType.ATTACHMENT)
8907 {
8908 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8909 }
8910
8911 }
8912
8913 player.GetHumanInventory().ClearUserReservedLocation(this);
8914 }
8915
8916 if (m_LockingSound)
8917 SEffectManager.DestroyEffect(m_LockingSound);
8918 }
8919
8920
8921
8922 // -------------------------------------------------------------------------
8923 static int GetDebugActionsMask()
8924 {
8925 return ItemBase.m_DebugActionsMask;
8926 }
8927
8928 static bool HasDebugActionsMask(int mask)
8929 {
8930 return ItemBase.m_DebugActionsMask & mask;
8931 }
8932
8933 static void SetDebugActionsMask(int mask)
8934 {
8935 ItemBase.m_DebugActionsMask = mask;
8936 }
8937
8938 static void AddDebugActionsMask(int mask)
8939 {
8940 ItemBase.m_DebugActionsMask |= mask;
8941 }
8942
8943 static void RemoveDebugActionsMask(int mask)
8944 {
8945 ItemBase.m_DebugActionsMask &= ~mask;
8946 }
8947
8948 static void ToggleDebugActionsMask(int mask)
8949 {
8950 if (HasDebugActionsMask(mask))
8951 {
8953 }
8954 else
8955 {
8956 AddDebugActionsMask(mask);
8957 }
8958 }
8959
8960 // -------------------------------------------------------------------------
8961 void SetCEBasedQuantity()
8962 {
8963 if (GetEconomyProfile())
8964 {
8965 float q_max = GetEconomyProfile().GetQuantityMax();
8966 if (q_max > 0)
8967 {
8968 float q_min = GetEconomyProfile().GetQuantityMin();
8969 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8970
8971 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
8972 {
8973 ComponentEnergyManager comp = GetCompEM();
8974 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
8975 {
8976 comp.SetEnergy0To1(quantity_randomized);
8977 }
8978 }
8979 else if (HasQuantity())
8980 {
8981 SetQuantityNormalized(quantity_randomized, false);
8982 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
8983 }
8984
8985 }
8986 }
8987 }
8988
8990 void LockToParent()
8991 {
8992 EntityAI parent = GetHierarchyParent();
8993
8994 if (parent)
8995 {
8996 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8997 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8998 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
8999 }
9000 }
9001
9003 void UnlockFromParent()
9004 {
9005 EntityAI parent = GetHierarchyParent();
9006
9007 if (parent)
9008 {
9009 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9010 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9011 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9012 }
9013 }
9014
9015 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9016 {
9017 /*
9018 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9019 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
9020 */
9021 ItemBase item2 = ItemBase.Cast(entity2);
9022
9023 if (GetGame().IsClient())
9024 {
9025 if (ScriptInputUserData.CanStoreInputUserData())
9026 {
9027 ScriptInputUserData ctx = new ScriptInputUserData;
9029 ctx.Write(-1);
9030 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9031 ctx.Write(i1);
9032 ctx.Write(item2);
9033 ctx.Write(use_stack_max);
9034 ctx.Write(-1);
9035 ctx.Send();
9036
9037 if (IsCombineAll(item2, use_stack_max))
9038 {
9039 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9040 }
9041 }
9042 }
9043 else if (!GetGame().IsMultiplayer())
9044 {
9045 CombineItems(item2, use_stack_max);
9046 }
9047 }
9048
9049 bool IsLiquidPresent()
9050 {
9051 return (GetLiquidType() != 0 && HasQuantity());
9052 }
9053
9054 bool IsLiquidContainer()
9055 {
9056 return m_LiquidContainerMask != 0;
9057 }
9058
9060 {
9061 return m_LiquidContainerMask;
9062 }
9063
9064 bool IsBloodContainer()
9065 {
9066 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9067 return false;
9068 }
9069
9070 bool IsNVG()
9071 {
9072 return false;
9073 }
9074
9077 bool IsExplosive()
9078 {
9079 return false;
9080 }
9081
9083 {
9084 return "";
9085 }
9086
9088
9089 bool IsLightSource()
9090 {
9091 return false;
9092 }
9093
9095 {
9096 return true;
9097 }
9098
9099 //--- ACTION CONDITIONS
9100 //direction
9101 bool IsFacingPlayer(PlayerBase player, string selection)
9102 {
9103 return true;
9104 }
9105
9106 bool IsPlayerInside(PlayerBase player, string selection)
9107 {
9108 return true;
9109 }
9110
9111 override bool CanObstruct()
9112 {
9113 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9114 return !player || !IsPlayerInside(player, "");
9115 }
9116
9117 override bool IsBeingPlaced()
9118 {
9119 return m_IsBeingPlaced;
9120 }
9121
9122 void SetIsBeingPlaced(bool is_being_placed)
9123 {
9124 m_IsBeingPlaced = is_being_placed;
9125 if (!is_being_placed)
9127 SetSynchDirty();
9128 }
9129
9130 //server-side
9131 void OnEndPlacement() {}
9132
9133 override bool IsHologram()
9134 {
9135 return m_IsHologram;
9136 }
9137
9138 bool CanBeDigged()
9139 {
9140 return m_CanBeDigged;
9141 }
9142
9144 {
9145 return 1;
9146 }
9147
9148 bool CanMakeGardenplot()
9149 {
9150 return false;
9151 }
9152
9153 void SetIsHologram(bool is_hologram)
9154 {
9155 m_IsHologram = is_hologram;
9156 SetSynchDirty();
9157 }
9158 /*
9159 protected float GetNutritionalEnergy()
9160 {
9161 Edible_Base edible = Edible_Base.Cast(this);
9162 return edible.GetFoodEnergy();
9163 }
9164
9165 protected float GetNutritionalWaterContent()
9166 {
9167 Edible_Base edible = Edible_Base.Cast(this);
9168 return edible.GetFoodWater();
9169 }
9170
9171 protected float GetNutritionalIndex()
9172 {
9173 Edible_Base edible = Edible_Base.Cast(this);
9174 return edible.GetFoodNutritionalIndex();
9175 }
9176
9177 protected float GetNutritionalFullnessIndex()
9178 {
9179 Edible_Base edible = Edible_Base.Cast(this);
9180 return edible.GetFoodTotalVolume();
9181 }
9182
9183 protected float GetNutritionalToxicity()
9184 {
9185 Edible_Base edible = Edible_Base.Cast(this);
9186 return edible.GetFoodToxicity();
9187
9188 }
9189 */
9190
9191
9192 // -------------------------------------------------------------------------
9193 override void OnMovedInsideCargo(EntityAI container)
9194 {
9195 super.OnMovedInsideCargo(container);
9196
9197 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9198 }
9199
9200 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9201 {
9202 super.EEItemLocationChanged(oldLoc,newLoc);
9203
9204 PlayerBase new_player = null;
9205 PlayerBase old_player = null;
9206
9207 if (newLoc.GetParent())
9208 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9209
9210 if (oldLoc.GetParent())
9211 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9212
9213 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
9214 {
9215 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9216
9217 if (r_index >= 0)
9218 {
9219 InventoryLocation r_il = new InventoryLocation;
9220 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9221
9222 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9223 int r_type = r_il.GetType();
9224 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9225 {
9226 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9227 }
9228 else if (r_type == InventoryLocationType.ATTACHMENT)
9229 {
9230 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9231 }
9232
9233 }
9234 }
9235
9236 if (newLoc.GetType() == InventoryLocationType.HANDS)
9237 {
9238 if (new_player)
9239 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9240
9241 if (new_player == old_player)
9242 {
9243
9244 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9245 {
9246 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9247 {
9248 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9249 {
9250 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9251 }
9252 }
9253 else
9254 {
9255 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9256 }
9257 }
9258
9259 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9260 {
9261 int type = oldLoc.GetType();
9262 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9263 {
9264 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9265 }
9266 else if (type == InventoryLocationType.ATTACHMENT)
9267 {
9268 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9269 }
9270 }
9271 if (!m_OldLocation)
9272 {
9273 m_OldLocation = new InventoryLocation;
9274 }
9275 m_OldLocation.Copy(oldLoc);
9276 }
9277 else
9278 {
9279 if (m_OldLocation)
9280 {
9281 m_OldLocation.Reset();
9282 }
9283 }
9284
9286 }
9287 else
9288 {
9289 if (new_player)
9290 {
9291 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9292 if (res_index >= 0)
9293 {
9294 InventoryLocation il = new InventoryLocation;
9295 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9296 ItemBase it = ItemBase.Cast(il.GetItem());
9297 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9298 int rel_type = il.GetType();
9299 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9300 {
9301 il.GetParent().GetOnReleaseLock().Invoke(it);
9302 }
9303 else if (rel_type == InventoryLocationType.ATTACHMENT)
9304 {
9305 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9306 }
9307 //it.GetOnReleaseLock().Invoke(it);
9308 }
9309 }
9310 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9311 {
9312 //ThrowPhysically(old_player, vector.Zero);
9313 m_ThrowItemOnDrop = false;
9314 }
9315
9316 if (m_OldLocation)
9317 {
9318 m_OldLocation.Reset();
9319 }
9320 }
9321 }
9322
9323 override void EOnContact(IEntity other, Contact extra)
9324 {
9326 {
9327 int liquidType = -1;
9328 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9329 if (impactSpeed > 0.0)
9330 {
9331 m_ImpactSpeed = impactSpeed;
9332 #ifndef SERVER
9333 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9334 #else
9335 m_WantPlayImpactSound = true;
9336 SetSynchDirty();
9337 #endif
9338 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9339 }
9340 }
9341
9342 #ifdef SERVER
9343 if (GetCompEM() && GetCompEM().IsPlugged())
9344 {
9345 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9346 GetCompEM().UnplugThis();
9347 }
9348 #endif
9349 }
9350
9351 void RefreshPhysics();
9352
9353 override void OnCreatePhysics()
9354 {
9356 }
9357
9358 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9359 {
9360
9361 }
9362 // -------------------------------------------------------------------------
9363 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9364 {
9365 super.OnItemLocationChanged(old_owner, new_owner);
9366
9367 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9368 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9369
9370 if (!relatedPlayer && playerNew)
9371 relatedPlayer = playerNew;
9372
9373 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9374 {
9375 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9376 if (actionMgr)
9377 {
9378 ActionBase currentAction = actionMgr.GetRunningAction();
9379 if (currentAction)
9380 currentAction.OnItemLocationChanged(this);
9381 }
9382 }
9383
9384 Man ownerPlayerOld = null;
9385 Man ownerPlayerNew = null;
9386
9387 if (old_owner)
9388 {
9389 if (old_owner.IsMan())
9390 {
9391 ownerPlayerOld = Man.Cast(old_owner);
9392 }
9393 else
9394 {
9395 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9396 }
9397 }
9398 else
9399 {
9400 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9401 {
9402 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9403
9404 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9405 {
9406 GetCompEM().UnplugThis();
9407 }
9408 }
9409 }
9410
9411 if (new_owner)
9412 {
9413 if (new_owner.IsMan())
9414 {
9415 ownerPlayerNew = Man.Cast(new_owner);
9416 }
9417 else
9418 {
9419 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9420 }
9421 }
9422
9423 if (ownerPlayerOld != ownerPlayerNew)
9424 {
9425 if (ownerPlayerOld)
9426 {
9427 array<EntityAI> subItemsExit = new array<EntityAI>;
9428 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9429 for (int i = 0; i < subItemsExit.Count(); i++)
9430 {
9431 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9432 itemExit.OnInventoryExit(ownerPlayerOld);
9433 }
9434 }
9435
9436 if (ownerPlayerNew)
9437 {
9438 array<EntityAI> subItemsEnter = new array<EntityAI>;
9439 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9440 for (int j = 0; j < subItemsEnter.Count(); j++)
9441 {
9442 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9443 itemEnter.OnInventoryEnter(ownerPlayerNew);
9444 }
9445 }
9446 }
9447 else if (ownerPlayerNew != null)
9448 {
9449 PlayerBase nplayer;
9450 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9451 {
9452 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9453 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9454 for (int k = 0; k < subItemsUpdate.Count(); k++)
9455 {
9456 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9457 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9458 }
9459 }
9460 }
9461
9462 if (old_owner)
9463 old_owner.OnChildItemRemoved(this);
9464 if (new_owner)
9465 new_owner.OnChildItemReceived(this);
9466 }
9467
9468 // -------------------------------------------------------------------------------
9469 override void EEDelete(EntityAI parent)
9470 {
9471 super.EEDelete(parent);
9472 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9473 if (player)
9474 {
9475 OnInventoryExit(player);
9476
9477 if (player.IsAlive())
9478 {
9479 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9480 if (r_index >= 0)
9481 {
9482 InventoryLocation r_il = new InventoryLocation;
9483 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9484
9485 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9486 int r_type = r_il.GetType();
9487 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9488 {
9489 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9490 }
9491 else if (r_type == InventoryLocationType.ATTACHMENT)
9492 {
9493 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9494 }
9495
9496 }
9497
9498 player.RemoveQuickBarEntityShortcut(this);
9499 }
9500 }
9501 }
9502 // -------------------------------------------------------------------------------
9503 override void EEKilled(Object killer)
9504 {
9505 super.EEKilled(killer);
9506
9508 if (killer && killer.IsFireplace() && CanExplodeInFire())
9509 {
9510 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9511 {
9512 if (IsMagazine())
9513 {
9514 if (Magazine.Cast(this).GetAmmoCount() > 0)
9515 {
9516 ExplodeAmmo();
9517 }
9518 }
9519 else
9520 {
9521 Explode(DamageType.EXPLOSION);
9522 }
9523 }
9524 }
9525 }
9526
9527 override void OnWasAttached(EntityAI parent, int slot_id)
9528 {
9529 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9530
9531 super.OnWasAttached(parent, slot_id);
9532
9533 if (HasQuantity())
9534 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9535
9536 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
9537 }
9538
9539 override void OnWasDetached(EntityAI parent, int slot_id)
9540 {
9541 super.OnWasDetached(parent, slot_id);
9542
9543 if (HasQuantity())
9544 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9545 }
9546
9547 override string ChangeIntoOnAttach(string slot)
9548 {
9549 int idx;
9550 TStringArray inventory_slots = new TStringArray;
9551 TStringArray attach_types = new TStringArray;
9552
9553 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9554 if (inventory_slots.Count() < 1) //is string
9555 {
9556 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9557 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9558 }
9559 else //is array
9560 {
9561 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9562 }
9563
9564 idx = inventory_slots.Find(slot);
9565 if (idx < 0)
9566 return "";
9567
9568 return attach_types.Get(idx);
9569 }
9570
9571 override string ChangeIntoOnDetach()
9572 {
9573 int idx = -1;
9574 string slot;
9575
9576 TStringArray inventory_slots = new TStringArray;
9577 TStringArray detach_types = new TStringArray;
9578
9579 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9580 if (inventory_slots.Count() < 1) //is string
9581 {
9582 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9583 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9584 }
9585 else //is array
9586 {
9587 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9588 if (detach_types.Count() < 1)
9589 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9590 }
9591
9592 for (int i = 0; i < inventory_slots.Count(); i++)
9593 {
9594 slot = inventory_slots.Get(i);
9595 }
9596
9597 if (slot != "")
9598 {
9599 if (detach_types.Count() == 1)
9600 idx = 0;
9601 else
9602 idx = inventory_slots.Find(slot);
9603 }
9604 if (idx < 0)
9605 return "";
9606
9607 return detach_types.Get(idx);
9608 }
9609
9610 void ExplodeAmmo()
9611 {
9612 //timer
9613 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9614
9615 //min/max time
9616 float min_time = 1;
9617 float max_time = 3;
9618 float delay = Math.RandomFloat(min_time, max_time);
9619
9620 explode_timer.Run(delay, this, "DoAmmoExplosion");
9621 }
9622
9623 void DoAmmoExplosion()
9624 {
9625 Magazine magazine = Magazine.Cast(this);
9626 int pop_sounds_count = 6;
9627 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9628
9629 //play sound
9630 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9631 string sound_name = pop_sounds[ sound_idx ];
9632 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
9633
9634 //remove ammo count
9635 magazine.ServerAddAmmoCount(-1);
9636
9637 //if condition then repeat -> ExplodeAmmo
9638 float min_temp_to_explode = 100; //min temperature for item to explode
9639
9640 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9641 {
9642 ExplodeAmmo();
9643 }
9644 }
9645
9646 // -------------------------------------------------------------------------------
9647 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9648 {
9649 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9650
9651 const int CHANCE_DAMAGE_CARGO = 4;
9652 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9653 const int CHANCE_DAMAGE_NOTHING = 2;
9654
9655 if (IsClothing() || IsContainer() || IsItemTent())
9656 {
9657 float dmg = damageResult.GetDamage("","Health") * -0.5;
9658 int chances;
9659 int rnd;
9660
9661 if (GetInventory().GetCargo())
9662 {
9663 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9664 rnd = Math.RandomInt(0,chances);
9665
9666 if (rnd < CHANCE_DAMAGE_CARGO)
9667 {
9668 DamageItemInCargo(dmg);
9669 }
9670 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9671 {
9673 }
9674 }
9675 else
9676 {
9677 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9678 rnd = Math.RandomInt(0,chances);
9679
9680 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9681 {
9683 }
9684 }
9685 }
9686 }
9687
9688 bool DamageItemInCargo(float damage)
9689 {
9690 if (GetInventory().GetCargo())
9691 {
9692 int item_count = GetInventory().GetCargo().GetItemCount();
9693 if (item_count > 0)
9694 {
9695 int random_pick = Math.RandomInt(0, item_count);
9696 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
9697 if (!item.IsExplosive())
9698 {
9699 item.AddHealth("","",damage);
9700 return true;
9701 }
9702 }
9703 }
9704 return false;
9705 }
9706
9707 bool DamageItemAttachments(float damage)
9708 {
9709 int attachment_count = GetInventory().AttachmentCount();
9710 if (attachment_count > 0)
9711 {
9712 int random_pick = Math.RandomInt(0, attachment_count);
9713 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9714 if (!attachment.IsExplosive())
9715 {
9716 attachment.AddHealth("","",damage);
9717 return true;
9718 }
9719 }
9720 return false;
9721 }
9722
9723 override bool IsSplitable()
9724 {
9725 return m_CanThisBeSplit;
9726 }
9727 //----------------
9728 override bool CanBeSplit()
9729 {
9730 if (IsSplitable() && (GetQuantity() > 1))
9731 return GetInventory().CanRemoveEntity();
9732
9733 return false;
9734 }
9735
9736 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
9737 {
9738 if (!CanBeSplit())
9739 return;
9740
9741 if (GetGame().IsClient())
9742 {
9743 if (ScriptInputUserData.CanStoreInputUserData())
9744 {
9745 ScriptInputUserData ctx = new ScriptInputUserData;
9747 ctx.Write(1);
9748 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9749 ctx.Write(i1);
9750 ctx.Write(destination_entity);
9751 ctx.Write(true);
9752 ctx.Write(slot_id);
9753 ctx.Send();
9754 }
9755 }
9756 else if (!GetGame().IsMultiplayer())
9757 {
9758 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
9759 }
9760 }
9761
9762 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
9763 {
9764 if (!CanBeSplit())
9765 return;
9766
9767 float split_quantity_new;
9768 ref ItemBase new_item;
9769 float quantity = GetQuantity();
9770 float stack_max = GetTargetQuantityMax(slot_id);
9771 InventoryLocation loc = new InventoryLocation;
9772
9773 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9774 {
9775 if (stack_max <= GetQuantity())
9776 split_quantity_new = stack_max;
9777 else
9778 split_quantity_new = GetQuantity();
9779
9780 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9781 if (new_item)
9782 {
9783 new_item.SetResultOfSplit(true);
9784 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9785 AddQuantity(-split_quantity_new);
9786 new_item.SetQuantity(split_quantity_new);
9787 }
9788 }
9789 else if (destination_entity && slot_id == -1)
9790 {
9791 if (quantity > stack_max)
9792 split_quantity_new = stack_max;
9793 else
9794 split_quantity_new = quantity;
9795
9796 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9797 {
9798 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9799 new_item = ItemBase.Cast(o);
9800 }
9801
9802 if (new_item)
9803 {
9804 new_item.SetResultOfSplit(true);
9805 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9806 AddQuantity(-split_quantity_new);
9807 new_item.SetQuantity(split_quantity_new);
9808 }
9809 }
9810 else
9811 {
9812 if (stack_max != 0)
9813 {
9814 if (stack_max < GetQuantity())
9815 {
9816 split_quantity_new = GetQuantity() - stack_max;
9817 }
9818
9819 if (split_quantity_new == 0)
9820 {
9821 if (!GetGame().IsMultiplayer())
9822 player.PhysicalPredictiveDropItem(this);
9823 else
9824 player.ServerDropEntity(this);
9825 return;
9826 }
9827
9828 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9829
9830 if (new_item)
9831 {
9832 new_item.SetResultOfSplit(true);
9833 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9834 SetQuantity(split_quantity_new);
9835 new_item.SetQuantity(stack_max);
9836 new_item.PlaceOnSurface();
9837 }
9838 }
9839 }
9840 }
9841
9842 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
9843 {
9844 if (!CanBeSplit())
9845 return;
9846
9847 float split_quantity_new;
9848 ref ItemBase new_item;
9849 float quantity = GetQuantity();
9850 float stack_max = GetTargetQuantityMax(slot_id);
9851 InventoryLocation loc = new InventoryLocation;
9852
9853 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9854 {
9855 if (stack_max <= GetQuantity())
9856 split_quantity_new = stack_max;
9857 else
9858 split_quantity_new = GetQuantity();
9859
9860 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9861 if (new_item)
9862 {
9863 new_item.SetResultOfSplit(true);
9864 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9865 AddQuantity(-split_quantity_new);
9866 new_item.SetQuantity(split_quantity_new);
9867 }
9868 }
9869 else if (destination_entity && slot_id == -1)
9870 {
9871 if (quantity > stack_max)
9872 split_quantity_new = stack_max;
9873 else
9874 split_quantity_new = quantity;
9875
9876 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9877 {
9878 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9879 new_item = ItemBase.Cast(o);
9880 }
9881
9882 if (new_item)
9883 {
9884 new_item.SetResultOfSplit(true);
9885 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9886 AddQuantity(-split_quantity_new);
9887 new_item.SetQuantity(split_quantity_new);
9888 }
9889 }
9890 else
9891 {
9892 if (stack_max != 0)
9893 {
9894 if (stack_max < GetQuantity())
9895 {
9896 split_quantity_new = GetQuantity() - stack_max;
9897 }
9898
9899 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9900
9901 if (new_item)
9902 {
9903 new_item.SetResultOfSplit(true);
9904 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9905 SetQuantity(split_quantity_new);
9906 new_item.SetQuantity(stack_max);
9907 new_item.PlaceOnSurface();
9908 }
9909 }
9910 }
9911 }
9912
9913 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
9914 {
9915 if (!CanBeSplit())
9916 return;
9917
9918 if (GetGame().IsClient())
9919 {
9920 if (ScriptInputUserData.CanStoreInputUserData())
9921 {
9922 ScriptInputUserData ctx = new ScriptInputUserData;
9924 ctx.Write(4);
9925 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9926 ctx.Write(thiz);
9927 dst.WriteToContext(ctx);
9928 ctx.Send();
9929 }
9930 }
9931 else if (!GetGame().IsMultiplayer())
9932 {
9934 }
9935 }
9936
9937 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
9938 {
9939 if (!CanBeSplit())
9940 return;
9941
9942 if (GetGame().IsClient())
9943 {
9944 if (ScriptInputUserData.CanStoreInputUserData())
9945 {
9946 ScriptInputUserData ctx = new ScriptInputUserData;
9948 ctx.Write(2);
9949 ItemBase dummy = this; // @NOTE: workaround for correct serialization
9950 ctx.Write(dummy);
9951 ctx.Write(destination_entity);
9952 ctx.Write(true);
9953 ctx.Write(idx);
9954 ctx.Write(row);
9955 ctx.Write(col);
9956 ctx.Send();
9957 }
9958 }
9959 else if (!GetGame().IsMultiplayer())
9960 {
9961 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
9962 }
9963 }
9964
9965 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
9966 {
9968 }
9969
9970 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
9971 {
9972 if (!CanBeSplit())
9973 return this;
9974
9975 float quantity = GetQuantity();
9976 float split_quantity_new;
9977 ItemBase new_item;
9978 if (dst.IsValid())
9979 {
9980 int slot_id = dst.GetSlot();
9981 float stack_max = GetTargetQuantityMax(slot_id);
9982
9983 if (quantity > stack_max)
9984 split_quantity_new = stack_max;
9985 else
9986 split_quantity_new = quantity;
9987
9988 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9989
9990 if (new_item)
9991 {
9992 new_item.SetResultOfSplit(true);
9993 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9994 AddQuantity(-split_quantity_new);
9995 new_item.SetQuantity(split_quantity_new);
9996 }
9997
9998 return new_item;
9999 }
10000
10001 return null;
10002 }
10003
10004 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10005 {
10006 if (!CanBeSplit())
10007 return;
10008
10009 float quantity = GetQuantity();
10010 float split_quantity_new;
10011 ref ItemBase new_item;
10012 if (destination_entity)
10013 {
10014 float stackable = GetTargetQuantityMax();
10015 if (quantity > stackable)
10016 split_quantity_new = stackable;
10017 else
10018 split_quantity_new = quantity;
10019
10020 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10021 if (new_item)
10022 {
10023 new_item.SetResultOfSplit(true);
10024 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10025 AddQuantity(-split_quantity_new);
10026 new_item.SetQuantity(split_quantity_new);
10027 }
10028 }
10029 }
10030
10031 void SplitIntoStackMaxHandsClient(PlayerBase player)
10032 {
10033 if (!CanBeSplit())
10034 return;
10035
10036 if (GetGame().IsClient())
10037 {
10038 if (ScriptInputUserData.CanStoreInputUserData())
10039 {
10040 ScriptInputUserData ctx = new ScriptInputUserData;
10042 ctx.Write(3);
10043 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10044 ctx.Write(i1);
10045 ItemBase destination_entity = this;
10046 ctx.Write(destination_entity);
10047 ctx.Write(true);
10048 ctx.Write(0);
10049 ctx.Send();
10050 }
10051 }
10052 else if (!GetGame().IsMultiplayer())
10053 {
10054 SplitIntoStackMaxHands(player);
10055 }
10056 }
10057
10058 void SplitIntoStackMaxHands(PlayerBase player)
10059 {
10060 if (!CanBeSplit())
10061 return;
10062
10063 float quantity = GetQuantity();
10064 float split_quantity_new;
10065 ref ItemBase new_item;
10066 if (player)
10067 {
10068 float stackable = GetTargetQuantityMax();
10069 if (quantity > stackable)
10070 split_quantity_new = stackable;
10071 else
10072 split_quantity_new = quantity;
10073
10074 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10075 new_item = ItemBase.Cast(in_hands);
10076 if (new_item)
10077 {
10078 new_item.SetResultOfSplit(true);
10079 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10080 AddQuantity(-split_quantity_new);
10081 new_item.SetQuantity(split_quantity_new);
10082 }
10083 }
10084 }
10085
10086 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10087 {
10088 if (!CanBeSplit())
10089 return;
10090
10091 float quantity = GetQuantity();
10092 float split_quantity_new = Math.Floor(quantity * 0.5);
10093
10094 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10095
10096 if (new_item)
10097 {
10098 if (new_item.GetQuantityMax() < split_quantity_new)
10099 {
10100 split_quantity_new = new_item.GetQuantityMax();
10101 }
10102
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10105
10106 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10107 {
10108 AddQuantity(-1);
10109 new_item.SetQuantity(1);
10110 }
10111 else
10112 {
10113 AddQuantity(-split_quantity_new);
10114 new_item.SetQuantity(split_quantity_new);
10115 }
10116 }
10117 }
10118
10119 void SplitItem(PlayerBase player)
10120 {
10121 if (!CanBeSplit())
10122 return;
10123
10124 float quantity = GetQuantity();
10125 float split_quantity_new = Math.Floor(quantity / 2);
10126
10127 InventoryLocation invloc = new InventoryLocation;
10128 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10129
10130 ItemBase new_item;
10131 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10132
10133 if (new_item)
10134 {
10135 if (new_item.GetQuantityMax() < split_quantity_new)
10136 {
10137 split_quantity_new = new_item.GetQuantityMax();
10138 }
10139 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10140 {
10141 AddQuantity(-1);
10142 new_item.SetQuantity(1);
10143 }
10144 else
10145 {
10146 AddQuantity(-split_quantity_new);
10147 new_item.SetQuantity(split_quantity_new);
10148 }
10149 }
10150 }
10151
10153 void OnQuantityChanged(float delta)
10154 {
10155 SetWeightDirty();
10156 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10157
10158 if (parent)
10159 parent.OnAttachmentQuantityChangedEx(this, delta);
10160
10161 if (IsLiquidContainer())
10162 {
10163 if (GetQuantityNormalized() <= 0.0)
10164 {
10166 }
10167 else if (GetLiquidType() == LIQUID_NONE)
10168 {
10169 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10171 }
10172 }
10173
10174 }
10175
10178 {
10179 // insert code here
10180 }
10181
10183 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10184 {
10186 }
10187
10188 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10189 {
10190 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10191
10192 if (GetGame().IsServer())
10193 {
10194 if (newLevel == GameConstants.STATE_RUINED)
10195 {
10197 EntityAI parent = GetHierarchyParent();
10198 if (parent && parent.IsFireplace())
10199 {
10200 CargoBase cargo = GetInventory().GetCargo();
10201 if (cargo)
10202 {
10203 for (int i = 0; i < cargo.GetItemCount(); ++i)
10204 {
10205 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10206 }
10207 }
10208 }
10209 }
10210
10211 if (IsResultOfSplit())
10212 {
10213 // reset the splitting result flag, return to normal item behavior
10214 SetResultOfSplit(false);
10215 return;
10216 }
10217
10218 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10219 {
10220 SetCleanness(0);//unclean the item upon damage dealt
10221 }
10222 }
10223 }
10224
10225 // just the split? TODO: verify
10226 override void OnRightClick()
10227 {
10228 super.OnRightClick();
10229
10230 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
10231 {
10232 if (GetGame().IsClient())
10233 {
10234 if (ScriptInputUserData.CanStoreInputUserData())
10235 {
10236 vector m4[4];
10237 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
10238
10239 EntityAI root = GetHierarchyRoot();
10240
10241 InventoryLocation dst = new InventoryLocation;
10242 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
10243 {
10244 if (root)
10245 {
10246 root.GetTransform(m4);
10247 dst.SetGround(this, m4);
10248 }
10249 else
10250 GetInventory().GetCurrentInventoryLocation(dst);
10251 }
10252 else
10253 {
10254 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10255 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10256 this shouldnt cause issues within this scope*/
10257 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10258 {
10259 if (root)
10260 {
10261 root.GetTransform(m4);
10262 dst.SetGround(this, m4);
10263 }
10264 else
10265 GetInventory().GetCurrentInventoryLocation(dst);
10266 }
10267 else
10268 {
10269 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10270 }
10271 }
10272
10273 ScriptInputUserData ctx = new ScriptInputUserData;
10275 ctx.Write(4);
10276 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10277 ctx.Write(thiz);
10278 dst.WriteToContext(ctx);
10279 ctx.Write(true); // dummy
10280 ctx.Send();
10281 }
10282 }
10283 else if (!GetGame().IsMultiplayer())
10284 {
10285 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
10286 }
10287 }
10288 }
10289
10290 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10291 {
10292 //TODO: delete check zero quantity check after fix double posts hands fsm events
10293 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10294 return false;
10295
10296 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10297 return false;
10298
10299 //can_this_be_combined = ConfigGetBool("canBeSplit");
10301 return false;
10302
10303
10304 Magazine mag = Magazine.Cast(this);
10305 if (mag)
10306 {
10307 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10308 return false;
10309
10310 if (stack_max_limit)
10311 {
10312 Magazine other_mag = Magazine.Cast(other_item);
10313 if (other_item)
10314 {
10315 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10316 return false;
10317 }
10318
10319 }
10320 }
10321 else
10322 {
10323 //TODO: delete check zero quantity check after fix double posts hands fsm events
10324 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10325 return false;
10326
10327 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10328 return false;
10329 }
10330
10331 PlayerBase player = null;
10332 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10333 {
10334 if (player.GetInventory().HasAttachment(this))
10335 return false;
10336
10337 if (player.IsItemsToDelete())
10338 return false;
10339 }
10340
10341 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10342 return false;
10343
10344 int slotID;
10345 string slotName;
10346 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10347 return false;
10348
10349 return true;
10350 }
10351
10352 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10353 {
10354 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10355 }
10356
10357 bool IsResultOfSplit()
10358 {
10359 return m_IsResultOfSplit;
10360 }
10361
10362 void SetResultOfSplit(bool value)
10363 {
10364 m_IsResultOfSplit = value;
10365 }
10366
10367 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10368 {
10369 return ComputeQuantityUsedEx(other_item, use_stack_max);
10370 }
10371
10372 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10373 {
10374 float other_item_quantity = other_item.GetQuantity();
10375 float this_free_space;
10376
10377 float stack_max = GetQuantityMax();
10378
10379 this_free_space = stack_max - GetQuantity();
10380
10381 if (other_item_quantity > this_free_space)
10382 {
10383 return this_free_space;
10384 }
10385 else
10386 {
10387 return other_item_quantity;
10388 }
10389 }
10390
10391 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10392 {
10393 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10394 }
10395
10396 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10397 {
10398 if (!CanBeCombined(other_item, false))
10399 return;
10400
10401 if (!IsMagazine() && other_item)
10402 {
10403 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10404 if (quantity_used != 0)
10405 {
10406 float hp1 = GetHealth01("","");
10407 float hp2 = other_item.GetHealth01("","");
10408 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10409 hpResult = hpResult / (GetQuantity() + quantity_used);
10410
10411 hpResult *= GetMaxHealth();
10412 Math.Round(hpResult);
10413 SetHealth("", "Health", hpResult);
10414
10415 AddQuantity(quantity_used);
10416 other_item.AddQuantity(-quantity_used);
10417 }
10418 }
10419 OnCombine(other_item);
10420 }
10421
10422 void OnCombine(ItemBase other_item)
10423 {
10424 #ifdef SERVER
10425 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10426 GetHierarchyParent().IncreaseLifetimeUp();
10427 #endif
10428 };
10429
10430 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10431 {
10432 PlayerBase p = PlayerBase.Cast(player);
10433
10434 array<int> recipesIds = p.m_Recipes;
10435 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10436 if (moduleRecipesManager)
10437 {
10438 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10439 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10440 }
10441
10442 for (int i = 0;i < recipesIds.Count(); i++)
10443 {
10444 int key = recipesIds.Get(i);
10445 string recipeName = moduleRecipesManager.GetRecipeName(key);
10446 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10447 }
10448 }
10449
10450 // -------------------------------------------------------------------------
10451 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10452 {
10453 super.GetDebugActions(outputList);
10454
10455 //quantity
10456 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10457 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10458 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10459 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10460
10461 //health
10462 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10463 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10464 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10465 //temperature
10466 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10467 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10468 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10469
10470 //wet
10471 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10472 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10473
10474 //liquidtype
10475 if (IsLiquidContainer())
10476 {
10477 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10478 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10479 }
10480
10481 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10482 // watch
10483 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10484 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10485
10486 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10487 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10488 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10489 }
10490
10491 // -------------------------------------------------------------------------
10492 // -------------------------------------------------------------------------
10493 // -------------------------------------------------------------------------
10494 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10495 {
10496 super.OnAction(action_id, player, ctx);
10497 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10498 {
10499 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10500 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10501 PlayerBase p = PlayerBase.Cast(player);
10502 if (EActions.RECIPES_RANGE_START < 1000)
10503 {
10504 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10505 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10506 }
10507 }
10508 #ifndef SERVER
10509 else if (action_id == EActions.WATCH_PLAYER)
10510 {
10511 PluginDeveloper.SetDeveloperItemClientEx(player);
10512 }
10513 #endif
10514 if (GetGame().IsServer())
10515 {
10516 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10517 {
10518 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10519 OnDebugButtonPressServer(id + 1);
10520 }
10521
10522 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10523 {
10524 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10525 InsertAgent(agent_id,100);
10526 }
10527
10528 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10529 {
10530 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10531 RemoveAgent(agent_id2);
10532 }
10533
10534 else if (action_id == EActions.ADD_QUANTITY)
10535 {
10536 if (IsMagazine())
10537 {
10538 Magazine mag = Magazine.Cast(this);
10539 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10540 }
10541 else
10542 {
10543 AddQuantity(GetQuantityMax() * 0.2);
10544 }
10545
10546 if (m_EM)
10547 {
10548 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10549 }
10550 //PrintVariables();
10551 }
10552
10553 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10554 {
10555 if (IsMagazine())
10556 {
10557 Magazine mag2 = Magazine.Cast(this);
10558 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10559 }
10560 else
10561 {
10562 AddQuantity(- GetQuantityMax() * 0.2);
10563 }
10564 if (m_EM)
10565 {
10566 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10567 }
10568 //PrintVariables();
10569 }
10570
10571 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10572 {
10573 SetQuantity(0);
10574
10575 if (m_EM)
10576 {
10577 m_EM.SetEnergy(0);
10578 }
10579 }
10580
10581 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10582 {
10584
10585 if (m_EM)
10586 {
10587 m_EM.SetEnergy(m_EM.GetEnergyMax());
10588 }
10589 }
10590
10591 else if (action_id == EActions.ADD_HEALTH)
10592 {
10593 AddHealth("","",GetMaxHealth("","Health")/5);
10594 }
10595 else if (action_id == EActions.REMOVE_HEALTH)
10596 {
10597 AddHealth("","",-GetMaxHealth("","Health")/5);
10598 }
10599 else if (action_id == EActions.DESTROY_HEALTH)
10600 {
10601 SetHealth01("","",0);
10602 }
10603 else if (action_id == EActions.WATCH_ITEM)
10604 {
10606 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
10607 #ifdef DEVELOPER
10608 SetDebugDeveloper_item(this);
10609 #endif
10610 }
10611
10612 else if (action_id == EActions.ADD_TEMPERATURE)
10613 {
10614 AddTemperature(20);
10615 //PrintVariables();
10616 }
10617
10618 else if (action_id == EActions.REMOVE_TEMPERATURE)
10619 {
10620 AddTemperature(-20);
10621 //PrintVariables();
10622 }
10623
10624 else if (action_id == EActions.FLIP_FROZEN)
10625 {
10626 SetFrozen(!GetIsFrozen());
10627 //PrintVariables();
10628 }
10629
10630 else if (action_id == EActions.ADD_WETNESS)
10631 {
10632 AddWet(GetWetMax()/5);
10633 //PrintVariables();
10634 }
10635
10636 else if (action_id == EActions.REMOVE_WETNESS)
10637 {
10638 AddWet(-GetWetMax()/5);
10639 //PrintVariables();
10640 }
10641
10642 else if (action_id == EActions.LIQUIDTYPE_UP)
10643 {
10644 int curr_type = GetLiquidType();
10645 SetLiquidType(curr_type * 2);
10646 //AddWet(1);
10647 //PrintVariables();
10648 }
10649
10650 else if (action_id == EActions.LIQUIDTYPE_DOWN)
10651 {
10652 int curr_type2 = GetLiquidType();
10653 SetLiquidType(curr_type2 / 2);
10654 }
10655
10656 else if (action_id == EActions.MAKE_SPECIAL)
10657 {
10658 auto debugParams = DebugSpawnParams.WithPlayer(player);
10659 OnDebugSpawnEx(debugParams);
10660 }
10661
10662 else if (action_id == EActions.DELETE)
10663 {
10664 Delete();
10665 }
10666
10667 }
10668
10669
10670 return false;
10671 }
10672
10673 // -------------------------------------------------------------------------
10674
10675
10678 void OnActivatedByTripWire();
10679
10681 void OnActivatedByItem(notnull ItemBase item);
10682
10683 //----------------------------------------------------------------
10684 //returns true if item is able to explode when put in fire
10685 bool CanExplodeInFire()
10686 {
10687 return false;
10688 }
10689
10690 //----------------------------------------------------------------
10691 bool CanEat()
10692 {
10693 return true;
10694 }
10695
10696 //----------------------------------------------------------------
10697 override bool IsIgnoredByConstruction()
10698 {
10699 return true;
10700 }
10701
10702 //----------------------------------------------------------------
10703 //has FoodStages in config?
10704 bool HasFoodStage()
10705 {
10706 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
10707 return GetGame().ConfigIsExisting(config_path);
10708 }
10709
10711 FoodStage GetFoodStage()
10712 {
10713 return null;
10714 }
10715
10716 bool CanBeCooked()
10717 {
10718 return false;
10719 }
10720
10721 bool CanBeCookedOnStick()
10722 {
10723 return false;
10724 }
10725
10727 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
10729
10730 //----------------------------------------------------------------
10731 bool CanRepair(ItemBase item_repair_kit)
10732 {
10733 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10734 return module_repairing.CanRepair(this, item_repair_kit);
10735 }
10736
10737 //----------------------------------------------------------------
10738 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
10739 {
10740 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10741 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10742 }
10743
10744 //----------------------------------------------------------------
10745 int GetItemSize()
10746 {
10747 /*
10748 vector v_size = this.ConfigGetVector("itemSize");
10749 int v_size_x = v_size[0];
10750 int v_size_y = v_size[1];
10751 int size = v_size_x * v_size_y;
10752 return size;
10753 */
10754
10755 return 1;
10756 }
10757
10758 //----------------------------------------------------------------
10759 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10760 bool CanBeMovedOverride()
10761 {
10762 return m_CanBeMovedOverride;
10763 }
10764
10765 //----------------------------------------------------------------
10766 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10767 void SetCanBeMovedOverride(bool setting)
10768 {
10769 m_CanBeMovedOverride = setting;
10770 }
10771
10772 //----------------------------------------------------------------
10780 void MessageToOwnerStatus(string text)
10781 {
10782 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10783
10784 if (player)
10785 {
10786 player.MessageStatus(text);
10787 }
10788 }
10789
10790 //----------------------------------------------------------------
10798 void MessageToOwnerAction(string text)
10799 {
10800 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10801
10802 if (player)
10803 {
10804 player.MessageAction(text);
10805 }
10806 }
10807
10808 //----------------------------------------------------------------
10816 void MessageToOwnerFriendly(string text)
10817 {
10818 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10819
10820 if (player)
10821 {
10822 player.MessageFriendly(text);
10823 }
10824 }
10825
10826 //----------------------------------------------------------------
10834 void MessageToOwnerImportant(string text)
10835 {
10836 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10837
10838 if (player)
10839 {
10840 player.MessageImportant(text);
10841 }
10842 }
10843
10844 override bool IsItemBase()
10845 {
10846 return true;
10847 }
10848
10849 // Checks if item is of questioned kind
10850 override bool KindOf(string tag)
10851 {
10852 bool found = false;
10853 string item_name = this.GetType();
10854 ref TStringArray item_tag_array = new TStringArray;
10855 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
10856
10857 int array_size = item_tag_array.Count();
10858 for (int i = 0; i < array_size; i++)
10859 {
10860 if (item_tag_array.Get(i) == tag)
10861 {
10862 found = true;
10863 break;
10864 }
10865 }
10866 return found;
10867 }
10868
10869
10870 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
10871 {
10872 //Debug.Log("OnRPC called");
10873 super.OnRPC(sender, rpc_type,ctx);
10874
10875 //Play soundset for attachment locking (ActionLockAttachment.c)
10876 switch (rpc_type)
10877 {
10878 #ifndef SERVER
10879 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10880 Param2<bool, string> p = new Param2<bool, string>(false, "");
10881
10882 if (!ctx.Read(p))
10883 return;
10884
10885 bool play = p.param1;
10886 string soundSet = p.param2;
10887
10888 if (play)
10889 {
10890 if (m_LockingSound)
10891 {
10893 {
10894 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10895 }
10896 }
10897 else
10898 {
10899 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10900 }
10901 }
10902 else
10903 {
10904 SEffectManager.DestroyEffect(m_LockingSound);
10905 }
10906
10907 break;
10908 #endif
10909
10910 }
10911
10912 if (GetWrittenNoteData())
10913 {
10914 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
10915 }
10916 }
10917
10918 //-----------------------------
10919 // VARIABLE MANIPULATION SYSTEM
10920 //-----------------------------
10921 int NameToID(string name)
10922 {
10923 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10924 return plugin.GetID(name);
10925 }
10926
10927 string IDToName(int id)
10928 {
10929 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10930 return plugin.GetName(id);
10931 }
10932
10934 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
10935 {
10936 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
10937 //read the flags
10938 int varFlags;
10939 if (!ctx.Read(varFlags))
10940 return;
10941
10942 if (varFlags & ItemVariableFlags.FLOAT)
10943 {
10944 ReadVarsFromCTX(ctx);
10945 }
10946 }
10947
10948 override void SerializeNumericalVars(array<float> floats_out)
10949 {
10950 //some variables handled on EntityAI level already!
10951 super.SerializeNumericalVars(floats_out);
10952
10953 // the order of serialization must be the same as the order of de-serialization
10954 //--------------------------------------------
10955 if (IsVariableSet(VARIABLE_QUANTITY))
10956 {
10957 floats_out.Insert(m_VarQuantity);
10958 }
10959 //--------------------------------------------
10960 if (IsVariableSet(VARIABLE_WET))
10961 {
10962 floats_out.Insert(m_VarWet);
10963 }
10964 //--------------------------------------------
10965 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10966 {
10967 floats_out.Insert(m_VarLiquidType);
10968 }
10969 //--------------------------------------------
10970 if (IsVariableSet(VARIABLE_COLOR))
10971 {
10972 floats_out.Insert(m_ColorComponentR);
10973 floats_out.Insert(m_ColorComponentG);
10974 floats_out.Insert(m_ColorComponentB);
10975 floats_out.Insert(m_ColorComponentA);
10976 }
10977 //--------------------------------------------
10978 if (IsVariableSet(VARIABLE_CLEANNESS))
10979 {
10980 floats_out.Insert(m_Cleanness);
10981 }
10982 }
10983
10984 override void DeSerializeNumericalVars(array<float> floats)
10985 {
10986 //some variables handled on EntityAI level already!
10987 super.DeSerializeNumericalVars(floats);
10988
10989 // the order of serialization must be the same as the order of de-serialization
10990 int index = 0;
10991 int mask = Math.Round(floats.Get(index));
10992
10993 index++;
10994 //--------------------------------------------
10995 if (mask & VARIABLE_QUANTITY)
10996 {
10997 if (m_IsStoreLoad)
10998 {
10999 SetStoreLoadedQuantity(floats.Get(index));
11000 }
11001 else
11002 {
11003 float quantity = floats.Get(index);
11004 SetQuantity(quantity, true, false, false, false);
11005 }
11006 index++;
11007 }
11008 //--------------------------------------------
11009 if (mask & VARIABLE_WET)
11010 {
11011 float wet = floats.Get(index);
11012 SetWet(wet);
11013 index++;
11014 }
11015 //--------------------------------------------
11016 if (mask & VARIABLE_LIQUIDTYPE)
11017 {
11018 int liquidtype = Math.Round(floats.Get(index));
11019 SetLiquidType(liquidtype);
11020 index++;
11021 }
11022 //--------------------------------------------
11023 if (mask & VARIABLE_COLOR)
11024 {
11025 m_ColorComponentR = Math.Round(floats.Get(index));
11026 index++;
11027 m_ColorComponentG = Math.Round(floats.Get(index));
11028 index++;
11029 m_ColorComponentB = Math.Round(floats.Get(index));
11030 index++;
11031 m_ColorComponentA = Math.Round(floats.Get(index));
11032 index++;
11033 }
11034 //--------------------------------------------
11035 if (mask & VARIABLE_CLEANNESS)
11036 {
11037 int cleanness = Math.Round(floats.Get(index));
11038 SetCleanness(cleanness);
11039 index++;
11040 }
11041 }
11042
11043 override void WriteVarsToCTX(ParamsWriteContext ctx)
11044 {
11045 super.WriteVarsToCTX(ctx);
11046
11047 //--------------------------------------------
11048 if (IsVariableSet(VARIABLE_QUANTITY))
11049 {
11050 ctx.Write(GetQuantity());
11051 }
11052 //--------------------------------------------
11053 if (IsVariableSet(VARIABLE_WET))
11054 {
11055 ctx.Write(GetWet());
11056 }
11057 //--------------------------------------------
11058 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11059 {
11060 ctx.Write(GetLiquidType());
11061 }
11062 //--------------------------------------------
11063 if (IsVariableSet(VARIABLE_COLOR))
11064 {
11065 int r,g,b,a;
11066 GetColor(r,g,b,a);
11067 ctx.Write(r);
11068 ctx.Write(g);
11069 ctx.Write(b);
11070 ctx.Write(a);
11071 }
11072 //--------------------------------------------
11073 if (IsVariableSet(VARIABLE_CLEANNESS))
11074 {
11075 ctx.Write(GetCleanness());
11076 }
11077 }
11078
11079 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11080 {
11081 if (!super.ReadVarsFromCTX(ctx,version))
11082 return false;
11083
11084 int intValue;
11085 float value;
11086
11087 if (version < 140)
11088 {
11089 if (!ctx.Read(intValue))
11090 return false;
11091
11092 m_VariablesMask = intValue;
11093 }
11094
11095 if (m_VariablesMask & VARIABLE_QUANTITY)
11096 {
11097 if (!ctx.Read(value))
11098 return false;
11099
11100 if (IsStoreLoad())
11101 {
11103 }
11104 else
11105 {
11106 SetQuantity(value, true, false, false, false);
11107 }
11108 }
11109 //--------------------------------------------
11110 if (version < 140)
11111 {
11112 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11113 {
11114 if (!ctx.Read(value))
11115 return false;
11116 SetTemperatureDirect(value);
11117 }
11118 }
11119 //--------------------------------------------
11120 if (m_VariablesMask & VARIABLE_WET)
11121 {
11122 if (!ctx.Read(value))
11123 return false;
11124 SetWet(value);
11125 }
11126 //--------------------------------------------
11127 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11128 {
11129 if (!ctx.Read(intValue))
11130 return false;
11131 SetLiquidType(intValue);
11132 }
11133 //--------------------------------------------
11134 if (m_VariablesMask & VARIABLE_COLOR)
11135 {
11136 int r,g,b,a;
11137 if (!ctx.Read(r))
11138 return false;
11139 if (!ctx.Read(g))
11140 return false;
11141 if (!ctx.Read(b))
11142 return false;
11143 if (!ctx.Read(a))
11144 return false;
11145
11146 SetColor(r,g,b,a);
11147 }
11148 //--------------------------------------------
11149 if (m_VariablesMask & VARIABLE_CLEANNESS)
11150 {
11151 if (!ctx.Read(intValue))
11152 return false;
11153 SetCleanness(intValue);
11154 }
11155 //--------------------------------------------
11156 if (version >= 138 && version < 140)
11157 {
11158 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11159 {
11160 if (!ctx.Read(intValue))
11161 return false;
11162 SetFrozen(intValue);
11163 }
11164 }
11165
11166 return true;
11167 }
11168
11169 //----------------------------------------------------------------
11170 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11171 {
11172 m_IsStoreLoad = true;
11174 {
11175 m_FixDamageSystemInit = true;
11176 }
11177
11178 if (!super.OnStoreLoad(ctx, version))
11179 {
11180 m_IsStoreLoad = false;
11181 return false;
11182 }
11183
11184 if (version >= 114)
11185 {
11186 bool hasQuickBarIndexSaved;
11187
11188 if (!ctx.Read(hasQuickBarIndexSaved))
11189 {
11190 m_IsStoreLoad = false;
11191 return false;
11192 }
11193
11194 if (hasQuickBarIndexSaved)
11195 {
11196 int itmQBIndex;
11197
11198 //Load quickbar item bind
11199 if (!ctx.Read(itmQBIndex))
11200 {
11201 m_IsStoreLoad = false;
11202 return false;
11203 }
11204
11205 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11206 if (itmQBIndex != -1 && parentPlayer)
11207 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11208 }
11209 }
11210 else
11211 {
11212 // Backup of how it used to be
11213 PlayerBase player;
11214 int itemQBIndex;
11215 if (version == int.MAX)
11216 {
11217 if (!ctx.Read(itemQBIndex))
11218 {
11219 m_IsStoreLoad = false;
11220 return false;
11221 }
11222 }
11223 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11224 {
11225 //Load quickbar item bind
11226 if (!ctx.Read(itemQBIndex))
11227 {
11228 m_IsStoreLoad = false;
11229 return false;
11230 }
11231 if (itemQBIndex != -1 && player)
11232 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11233 }
11234 }
11235
11236 if (version < 140)
11237 {
11238 // variable management system
11239 if (!LoadVariables(ctx, version))
11240 {
11241 m_IsStoreLoad = false;
11242 return false;
11243 }
11244 }
11245
11246 //agent trasmission system
11247 if (!LoadAgents(ctx, version))
11248 {
11249 m_IsStoreLoad = false;
11250 return false;
11251 }
11252 if (version >= 132)
11253 {
11254 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11255 if (raib)
11256 {
11257 if (!raib.OnStoreLoad(ctx,version))
11258 {
11259 m_IsStoreLoad = false;
11260 return false;
11261 }
11262 }
11263 }
11264
11265 m_IsStoreLoad = false;
11266 return true;
11267 }
11268
11269 //----------------------------------------------------------------
11270
11271 override void OnStoreSave(ParamsWriteContext ctx)
11272 {
11273 super.OnStoreSave(ctx);
11274
11275 PlayerBase player;
11276 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11277 {
11278 ctx.Write(true); // Keep track of if we should actually read this in or not
11279 //Save quickbar item bind
11280 int itemQBIndex = -1;
11281 itemQBIndex = player.FindQuickBarEntityIndex(this);
11282 ctx.Write(itemQBIndex);
11283 }
11284 else
11285 {
11286 ctx.Write(false); // Keep track of if we should actually read this in or not
11287 }
11288
11289 SaveAgents(ctx);//agent trasmission system
11290
11291 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11292 if (raib)
11293 {
11294 raib.OnStoreSave(ctx);
11295 }
11296 }
11297 //----------------------------------------------------------------
11298
11299 override void AfterStoreLoad()
11300 {
11301 super.AfterStoreLoad();
11302
11304 {
11306 }
11307
11308 if (GetStoreLoadedQuantity() != float.LOWEST)
11309 {
11311 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
11312 }
11313 }
11314
11315 override void EEOnAfterLoad()
11316 {
11317 super.EEOnAfterLoad();
11318
11320 {
11321 m_FixDamageSystemInit = false;
11322 }
11323
11326 }
11327
11328 bool CanBeDisinfected()
11329 {
11330 return false;
11331 }
11332
11333
11334 //----------------------------------------------------------------
11335 override void OnVariablesSynchronized()
11336 {
11337 if (m_Initialized)
11338 {
11339 #ifdef PLATFORM_CONSOLE
11340 //bruteforce it is
11341 if (IsSplitable())
11342 {
11343 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
11344 if (menu)
11345 {
11346 menu.Refresh();
11347 }
11348 }
11349 #endif
11350 }
11351
11353 {
11354 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11355 m_WantPlayImpactSound = false;
11356 }
11357
11359 {
11360 SetWeightDirty();
11362 }
11363 if (m_VarWet != m_VarWetPrev)
11364 {
11367 }
11368
11369 if (m_SoundSyncPlay != 0)
11370 {
11371 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
11372 m_SoundSyncPlay = 0;
11373 }
11374 if (m_SoundSyncStop != 0)
11375 {
11376 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11377 m_SoundSyncStop = 0;
11378 }
11379
11380 super.OnVariablesSynchronized();
11381 }
11382
11383 //------------------------- Quantity
11384 //----------------------------------------------------------------
11386 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11387 {
11388 if (!IsServerCheck(allow_client))
11389 return false;
11390
11391 if (!HasQuantity())
11392 return false;
11393
11394 float min = GetQuantityMin();
11395 float max = GetQuantityMax();
11396
11397 if (value <= (min + 0.001))
11398 value = min;
11399
11400 if (value == min)
11401 {
11402 if (destroy_config)
11403 {
11404 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11405 if (dstr)
11406 {
11407 m_VarQuantity = Math.Clamp(value, min, max);
11408 this.Delete();
11409 return true;
11410 }
11411 }
11412 else if (destroy_forced)
11413 {
11414 m_VarQuantity = Math.Clamp(value, min, max);
11415 this.Delete();
11416 return true;
11417 }
11418 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11419 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11420 }
11421
11422 float delta = m_VarQuantity;
11423 m_VarQuantity = Math.Clamp(value, min, max);
11424
11425 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11426 {
11427 delta = m_VarQuantity - delta;
11428
11429 if (delta)
11430 OnQuantityChanged(delta);
11431 }
11432
11433 SetVariableMask(VARIABLE_QUANTITY);
11434
11435 return false;
11436 }
11437
11438 //----------------------------------------------------------------
11440 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11441 {
11442 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11443 }
11444 //----------------------------------------------------------------
11445 void SetQuantityMax()
11446 {
11447 float max = GetQuantityMax();
11448 SetQuantity(max);
11449 }
11450
11451 override void SetQuantityToMinimum()
11452 {
11453 float min = GetQuantityMin();
11454 SetQuantity(min);
11455 }
11456 //----------------------------------------------------------------
11458 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11459 {
11460 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11461 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11462 SetQuantity(result, destroy_config, destroy_forced);
11463 }
11464
11465 //----------------------------------------------------------------
11467 override float GetQuantityNormalized()
11468 {
11469 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11470 }
11471
11473 {
11474 return GetQuantityNormalized();
11475 }
11476
11477 /*void SetAmmoNormalized(float value)
11478 {
11479 float value_clamped = Math.Clamp(value, 0, 1);
11480 Magazine this_mag = Magazine.Cast(this);
11481 int max_rounds = this_mag.GetAmmoMax();
11482 int result = value * max_rounds;//can the rounded if higher precision is required
11483 this_mag.SetAmmoCount(result);
11484 }*/
11485 //----------------------------------------------------------------
11486 override int GetQuantityMax()
11487 {
11488 int slot = -1;
11489 if (GetInventory())
11490 {
11491 InventoryLocation il = new InventoryLocation;
11492 GetInventory().GetCurrentInventoryLocation(il);
11493 slot = il.GetSlot();
11494 }
11495
11496 return GetTargetQuantityMax(slot);
11497 }
11498
11499 override int GetTargetQuantityMax(int attSlotID = -1)
11500 {
11501 float quantity_max = 0;
11502
11503 if (IsSplitable()) //only stackable/splitable items can check for stack size
11504 {
11505 if (attSlotID != -1)
11506 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11507
11508 if (quantity_max <= 0)
11509 quantity_max = m_VarStackMax;
11510 }
11511
11512 if (quantity_max <= 0)
11513 quantity_max = m_VarQuantityMax;
11514
11515 return quantity_max;
11516 }
11517 //----------------------------------------------------------------
11518 override int GetQuantityMin()
11519 {
11520 return m_VarQuantityMin;
11521 }
11522 //----------------------------------------------------------------
11523 int GetQuantityInit()
11524 {
11525 return m_VarQuantityInit;
11526 }
11527
11528 //----------------------------------------------------------------
11529 override bool HasQuantity()
11530 {
11531 return !(GetQuantityMax() - GetQuantityMin() == 0);
11532 }
11533
11534 override float GetQuantity()
11535 {
11536 return m_VarQuantity;
11537 }
11538
11539 bool IsFullQuantity()
11540 {
11541 return GetQuantity() >= GetQuantityMax();
11542 }
11543
11544 //Calculates weight of single item without attachments and cargo
11545 override float GetSingleInventoryItemWeightEx()
11546 {
11547 //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
11548 float weightEx = GetWeightEx();//overall weight of the item
11549 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11550 return weightEx - special;
11551 }
11552
11553 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11555 {
11557 }
11558
11559 override protected float GetWeightSpecialized(bool forceRecalc = false)
11560 {
11561 if (IsSplitable()) //quantity determines size of the stack
11562 {
11563 #ifdef DEVELOPER
11564 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11565 {
11566 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11567 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
11568 }
11569 #endif
11570
11571 return GetQuantity() * GetConfigWeightModified();
11572 }
11573 else if (HasEnergyManager())// items with energy manager
11574 {
11575 #ifdef DEVELOPER
11576 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11577 {
11578 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11579 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
11580 }
11581 #endif
11582 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11583 }
11584 else//everything else
11585 {
11586 #ifdef DEVELOPER
11587 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11588 {
11589 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11590 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
11591 }
11592 #endif
11593 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11594 }
11595 }
11596
11598 int GetNumberOfItems()
11599 {
11600 int item_count = 0;
11601 ItemBase item;
11602
11603 if (GetInventory().GetCargo() != NULL)
11604 {
11605 item_count = GetInventory().GetCargo().GetItemCount();
11606 }
11607
11608 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11609 {
11610 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11611 if (item)
11612 item_count += item.GetNumberOfItems();
11613 }
11614 return item_count;
11615 }
11616
11618 float GetUnitWeight(bool include_wetness = true)
11619 {
11620 float weight = 0;
11621 float wetness = 1;
11622 if (include_wetness)
11623 wetness += GetWet();
11624 if (IsSplitable()) //quantity determines size of the stack
11625 {
11626 weight = wetness * m_ConfigWeight;
11627 }
11628 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
11629 {
11630 weight = 1;
11631 }
11632 return weight;
11633 }
11634
11635 //-----------------------------------------------------------------
11636
11637 override void ClearInventory()
11638 {
11639 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
11640 {
11641 GameInventory inv = GetInventory();
11642 array<EntityAI> items = new array<EntityAI>;
11643 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
11644 for (int i = 0; i < items.Count(); i++)
11645 {
11646 ItemBase item = ItemBase.Cast(items.Get(i));
11647 if (item)
11648 {
11649 GetGame().ObjectDelete(item);
11650 }
11651 }
11652 }
11653 }
11654
11655 //------------------------- Energy
11656
11657 //----------------------------------------------------------------
11658 float GetEnergy()
11659 {
11660 float energy = 0;
11661 if (HasEnergyManager())
11662 {
11663 energy = GetCompEM().GetEnergy();
11664 }
11665 return energy;
11666 }
11667
11668
11669 override void OnEnergyConsumed()
11670 {
11671 super.OnEnergyConsumed();
11672
11674 }
11675
11676 override void OnEnergyAdded()
11677 {
11678 super.OnEnergyAdded();
11679
11681 }
11682
11683 // Converts energy (from Energy Manager) to quantity, if enabled.
11685 {
11686 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11687 {
11688 if (HasQuantity())
11689 {
11690 float energy_0to1 = GetCompEM().GetEnergy0To1();
11691 SetQuantityNormalized(energy_0to1);
11692 }
11693 }
11694 }
11695
11696 //----------------------------------------------------------------
11697 float GetHeatIsolationInit()
11698 {
11699 return ConfigGetFloat("heatIsolation");
11700 }
11701
11702 float GetHeatIsolation()
11703 {
11704 return m_HeatIsolation;
11705 }
11706
11707 float GetDryingIncrement(string pIncrementName)
11708 {
11709 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
11710 if (GetGame().ConfigIsExisting(paramPath))
11711 return GetGame().ConfigGetFloat(paramPath);
11712
11713 return 0.0;
11714 }
11715
11716 float GetSoakingIncrement(string pIncrementName)
11717 {
11718 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
11719 if (GetGame().ConfigIsExisting(paramPath))
11720 return GetGame().ConfigGetFloat(paramPath);
11721
11722 return 0.0;
11723 }
11724 //----------------------------------------------------------------
11725 override void SetWet(float value, bool allow_client = false)
11726 {
11727 if (!IsServerCheck(allow_client))
11728 return;
11729
11730 float min = GetWetMin();
11731 float max = GetWetMax();
11732
11733 float previousValue = m_VarWet;
11734
11735 m_VarWet = Math.Clamp(value, min, max);
11736
11737 if (previousValue != m_VarWet)
11738 {
11739 SetVariableMask(VARIABLE_WET);
11740 OnWetChanged(m_VarWet, previousValue);
11741 }
11742 }
11743 //----------------------------------------------------------------
11744 override void AddWet(float value)
11745 {
11746 SetWet(GetWet() + value);
11747 }
11748 //----------------------------------------------------------------
11749 override void SetWetMax()
11750 {
11752 }
11753 //----------------------------------------------------------------
11754 override float GetWet()
11755 {
11756 return m_VarWet;
11757 }
11758 //----------------------------------------------------------------
11759 override float GetWetMax()
11760 {
11761 return m_VarWetMax;
11762 }
11763 //----------------------------------------------------------------
11764 override float GetWetMin()
11765 {
11766 return m_VarWetMin;
11767 }
11768 //----------------------------------------------------------------
11769 override float GetWetInit()
11770 {
11771 return m_VarWetInit;
11772 }
11773 //----------------------------------------------------------------
11774 override void OnWetChanged(float newVal, float oldVal)
11775 {
11776 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
11777 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
11778 if (newLevel != oldLevel)
11779 {
11780 OnWetLevelChanged(newLevel,oldLevel);
11781 }
11782 }
11783
11784 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
11785 {
11786 SetWeightDirty();
11787 }
11788
11789 override EWetnessLevel GetWetLevel()
11790 {
11791 return GetWetLevelInternal(m_VarWet);
11792 }
11793
11794 //----------------------------------------------------------------
11795
11796 override void SetStoreLoad(bool value)
11797 {
11798 m_IsStoreLoad = value;
11799 }
11800
11801 override bool IsStoreLoad()
11802 {
11803 return m_IsStoreLoad;
11804 }
11805
11806 override void SetStoreLoadedQuantity(float value)
11807 {
11808 m_StoreLoadedQuantity = value;
11809 }
11810
11811 override float GetStoreLoadedQuantity()
11812 {
11813 return m_StoreLoadedQuantity;
11814 }
11815
11816 //----------------------------------------------------------------
11817
11818 float GetItemModelLength()
11819 {
11820 if (ConfigIsExisting("itemModelLength"))
11821 {
11822 return ConfigGetFloat("itemModelLength");
11823 }
11824 return 0;
11825 }
11826
11827 float GetItemAttachOffset()
11828 {
11829 if (ConfigIsExisting("itemAttachOffset"))
11830 {
11831 return ConfigGetFloat("itemAttachOffset");
11832 }
11833 return 0;
11834 }
11835
11836 override void SetCleanness(int value, bool allow_client = false)
11837 {
11838 if (!IsServerCheck(allow_client))
11839 return;
11840
11841 int previousValue = m_Cleanness;
11842
11843 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
11844
11845 if (previousValue != m_Cleanness)
11846 SetVariableMask(VARIABLE_CLEANNESS);
11847 }
11848
11849 override int GetCleanness()
11850 {
11851 return m_Cleanness;
11852 }
11853
11855 {
11856 return true;
11857 }
11858
11859 //----------------------------------------------------------------
11860 // ATTACHMENT LOCKING
11861 // Getters relevant to generic ActionLockAttachment
11862 int GetLockType()
11863 {
11864 return m_LockType;
11865 }
11866
11867 string GetLockSoundSet()
11868 {
11869 return m_LockSoundSet;
11870 }
11871
11872 //----------------------------------------------------------------
11873 //------------------------- Color
11874 // sets items color variable given color components
11875 override void SetColor(int r, int g, int b, int a)
11876 {
11881 SetVariableMask(VARIABLE_COLOR);
11882 }
11884 override void GetColor(out int r,out int g,out int b,out int a)
11885 {
11890 }
11891
11892 bool IsColorSet()
11893 {
11894 return IsVariableSet(VARIABLE_COLOR);
11895 }
11896
11898 string GetColorString()
11899 {
11900 int r,g,b,a;
11901 GetColor(r,g,b,a);
11902 r = r/255;
11903 g = g/255;
11904 b = b/255;
11905 a = a/255;
11906 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11907 }
11908 //----------------------------------------------------------------
11909 //------------------------- LiquidType
11910
11911 override void SetLiquidType(int value, bool allow_client = false)
11912 {
11913 if (!IsServerCheck(allow_client))
11914 return;
11915
11916 int old = m_VarLiquidType;
11917 m_VarLiquidType = value;
11918 OnLiquidTypeChanged(old,value);
11919 SetVariableMask(VARIABLE_LIQUIDTYPE);
11920 }
11921
11922 int GetLiquidTypeInit()
11923 {
11924 return ConfigGetInt("varLiquidTypeInit");
11925 }
11926
11927 override int GetLiquidType()
11928 {
11929 return m_VarLiquidType;
11930 }
11931
11932 protected void OnLiquidTypeChanged(int oldType, int newType)
11933 {
11934 if (newType == LIQUID_NONE && GetIsFrozen())
11935 SetFrozen(false);
11936 }
11937
11939 void UpdateQuickbarShortcutVisibility(PlayerBase player)
11940 {
11941 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11942 }
11943
11944 // -------------------------------------------------------------------------
11946 void OnInventoryEnter(Man player)
11947 {
11948 PlayerBase nplayer;
11949 if (PlayerBase.CastTo(nplayer, player))
11950 {
11951 m_CanPlayImpactSound = true;
11952 //nplayer.OnItemInventoryEnter(this);
11953 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11954 }
11955 }
11956
11957 // -------------------------------------------------------------------------
11959 void OnInventoryExit(Man player)
11960 {
11961 PlayerBase nplayer;
11962 if (PlayerBase.CastTo(nplayer,player))
11963 {
11964 //nplayer.OnItemInventoryExit(this);
11965 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11966
11967 }
11968
11969 //if (!GetGame().IsDedicatedServer())
11970 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11971
11972
11973 if (HasEnergyManager())
11974 {
11975 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
11976 }
11977 }
11978
11979 // ADVANCED PLACEMENT EVENTS
11980 override void OnPlacementStarted(Man player)
11981 {
11982 super.OnPlacementStarted(player);
11983
11984 SetTakeable(false);
11985 }
11986
11987 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
11988 {
11989 if (m_AdminLog)
11990 {
11991 m_AdminLog.OnPlacementComplete(player, this);
11992 }
11993
11994 super.OnPlacementComplete(player, position, orientation);
11995 }
11996
11997 //-----------------------------
11998 // AGENT SYSTEM
11999 //-----------------------------
12000 //--------------------------------------------------------------------------
12001 bool ContainsAgent(int agent_id)
12002 {
12003 if (agent_id & m_AttachedAgents)
12004 {
12005 return true;
12006 }
12007 else
12008 {
12009 return false;
12010 }
12011 }
12012
12013 //--------------------------------------------------------------------------
12014 override void RemoveAgent(int agent_id)
12015 {
12016 if (ContainsAgent(agent_id))
12017 {
12018 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12019 }
12020 }
12021
12022 //--------------------------------------------------------------------------
12023 override void RemoveAllAgents()
12024 {
12025 m_AttachedAgents = 0;
12026 }
12027 //--------------------------------------------------------------------------
12028 override void RemoveAllAgentsExcept(int agent_to_keep)
12029 {
12030 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12031 }
12032 // -------------------------------------------------------------------------
12033 override void InsertAgent(int agent, float count = 1)
12034 {
12035 if (count < 1)
12036 return;
12037 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12039 }
12040
12042 void TransferAgents(int agents)
12043 {
12045 }
12046
12047 // -------------------------------------------------------------------------
12048 override int GetAgents()
12049 {
12050 return m_AttachedAgents;
12051 }
12052 //----------------------------------------------------------------------
12053
12054 /*int GetContaminationType()
12055 {
12056 int contamination_type;
12057
12058 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12059 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12060 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12061 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12062
12063 Edible_Base edible = Edible_Base.Cast(this);
12064 int agents = GetAgents();
12065 if (edible)
12066 {
12067 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12068 if (profile)
12069 {
12070 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12071 }
12072 }
12073 if (agents & CONTAMINATED_MASK)
12074 {
12075 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12076 }
12077 if (agents & POISONED_MASK)
12078 {
12079 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12080 }
12081 if (agents & NERVE_GAS_MASK)
12082 {
12083 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12084 }
12085 if (agents & DIRTY_MASK)
12086 {
12087 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12088 }
12089
12090 return agents;
12091 }*/
12092
12093 // -------------------------------------------------------------------------
12094 bool LoadAgents(ParamsReadContext ctx, int version)
12095 {
12096 if (!ctx.Read(m_AttachedAgents))
12097 return false;
12098 return true;
12099 }
12100 // -------------------------------------------------------------------------
12102 {
12103
12105 }
12106 // -------------------------------------------------------------------------
12107
12109 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12110 {
12111 super.CheckForRoofLimited(timeTresholdMS);
12112
12113 float time = GetGame().GetTime();
12114 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12115 {
12116 m_PreviousRoofTestTime = time;
12117 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12118 }
12119 }
12120
12121 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12122 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12123 {
12124 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12125 {
12126 return 0;
12127 }
12128
12129 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12130 {
12131 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12132 if (filter)
12133 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12134 else
12135 return 0;//otherwise return 0 when no filter attached
12136 }
12137
12138 string subclassPath, entryName;
12139
12140 switch (type)
12141 {
12142 case DEF_BIOLOGICAL:
12143 entryName = "biological";
12144 break;
12145 case DEF_CHEMICAL:
12146 entryName = "chemical";
12147 break;
12148 default:
12149 entryName = "biological";
12150 break;
12151 }
12152
12153 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12154
12155 return GetGame().ConfigGetFloat(subclassPath + entryName);
12156 }
12157
12158
12159
12161 override void EEOnCECreate()
12162 {
12163 if (!IsMagazine())
12165
12167 }
12168
12169
12170 //-------------------------
12171 // OPEN/CLOSE USER ACTIONS
12172 //-------------------------
12174 void Open();
12175 void Close();
12176 bool IsOpen()
12177 {
12178 return true;
12179 }
12180
12181 override bool CanDisplayCargo()
12182 {
12183 return IsOpen();
12184 }
12185
12186
12187 // ------------------------------------------------------------
12188 // CONDITIONS
12189 // ------------------------------------------------------------
12190 override bool CanPutInCargo(EntityAI parent)
12191 {
12192 if (parent)
12193 {
12194 if (parent.IsInherited(DayZInfected))
12195 return true;
12196
12197 if (!parent.IsRuined())
12198 return true;
12199 }
12200
12201 return true;
12202 }
12203
12204 override bool CanPutAsAttachment(EntityAI parent)
12205 {
12206 if (!super.CanPutAsAttachment(parent))
12207 {
12208 return false;
12209 }
12210
12211 if (!IsRuined() && !parent.IsRuined())
12212 {
12213 return true;
12214 }
12215
12216 return false;
12217 }
12218
12219 override bool CanReceiveItemIntoCargo(EntityAI item)
12220 {
12221 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12222 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12223 // return false;
12224
12225 return super.CanReceiveItemIntoCargo(item);
12226 }
12227
12228 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12229 {
12230 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12231 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12232 // return false;
12233
12234 GameInventory attachmentInv = attachment.GetInventory();
12235 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12236 {
12237 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12238 return false;
12239 }
12240
12241 InventoryLocation loc = new InventoryLocation();
12242 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12243 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12244 return false;
12245
12246 return super.CanReceiveAttachment(attachment, slotId);
12247 }
12248
12249 override bool CanReleaseAttachment(EntityAI attachment)
12250 {
12251 if (!super.CanReleaseAttachment(attachment))
12252 return false;
12253
12254 return GetInventory().AreChildrenAccessible();
12255 }
12256
12257 /*override bool CanLoadAttachment(EntityAI attachment)
12258 {
12259 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12260 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12261 // return false;
12262
12263 GameInventory attachmentInv = attachment.GetInventory();
12264 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12265 {
12266 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12267 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12268
12269 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12270 return false;
12271 }
12272
12273 return super.CanLoadAttachment(attachment);
12274 }*/
12275
12276 // Plays muzzle flash particle effects
12277 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12278 {
12279 int id = muzzle_owner.GetMuzzleID();
12280 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12281
12282 if (WPOF_array)
12283 {
12284 for (int i = 0; i < WPOF_array.Count(); i++)
12285 {
12286 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12287
12288 if (WPOF)
12289 {
12290 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12291 }
12292 }
12293 }
12294 }
12295
12296 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12297 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12298 {
12299 int id = muzzle_owner.GetMuzzleID();
12300 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12301
12302 if (WPOBE_array)
12303 {
12304 for (int i = 0; i < WPOBE_array.Count(); i++)
12305 {
12306 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12307
12308 if (WPOBE)
12309 {
12310 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12311 }
12312 }
12313 }
12314 }
12315
12316 // Plays all weapon overheating particles
12317 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12318 {
12319 int id = muzzle_owner.GetMuzzleID();
12320 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12321
12322 if (WPOOH_array)
12323 {
12324 for (int i = 0; i < WPOOH_array.Count(); i++)
12325 {
12326 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12327
12328 if (WPOOH)
12329 {
12330 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12331 }
12332 }
12333 }
12334 }
12335
12336 // Updates all weapon overheating particles
12337 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12338 {
12339 int id = muzzle_owner.GetMuzzleID();
12340 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12341
12342 if (WPOOH_array)
12343 {
12344 for (int i = 0; i < WPOOH_array.Count(); i++)
12345 {
12346 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12347
12348 if (WPOOH)
12349 {
12350 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12351 }
12352 }
12353 }
12354 }
12355
12356 // Stops overheating particles
12357 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12358 {
12359 int id = muzzle_owner.GetMuzzleID();
12360 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12361
12362 if (WPOOH_array)
12363 {
12364 for (int i = 0; i < WPOOH_array.Count(); i++)
12365 {
12366 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12367
12368 if (WPOOH)
12369 {
12370 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12371 }
12372 }
12373 }
12374 }
12375
12376 //----------------------------------------------------------------
12377 //Item Behaviour - unified approach
12378 override bool IsHeavyBehaviour()
12379 {
12380 if (m_ItemBehaviour == 0)
12381 {
12382 return true;
12383 }
12384
12385 return false;
12386 }
12387
12388 override bool IsOneHandedBehaviour()
12389 {
12390 if (m_ItemBehaviour == 1)
12391 {
12392 return true;
12393 }
12394
12395 return false;
12396 }
12397
12398 override bool IsTwoHandedBehaviour()
12399 {
12400 if (m_ItemBehaviour == 2)
12401 {
12402 return true;
12403 }
12404
12405 return false;
12406 }
12407
12408 bool IsDeployable()
12409 {
12410 return false;
12411 }
12412
12414 float GetDeployTime()
12415 {
12416 return UATimeSpent.DEFAULT_DEPLOY;
12417 }
12418
12419
12420 //----------------------------------------------------------------
12421 // Item Targeting (User Actions)
12422 override void SetTakeable(bool pState)
12423 {
12424 m_IsTakeable = pState;
12425 SetSynchDirty();
12426 }
12427
12428 override bool IsTakeable()
12429 {
12430 return m_IsTakeable;
12431 }
12432
12433 // For cases where we want to show object widget which cant be taken to hands
12435 {
12436 return false;
12437 }
12438
12440 protected void PreLoadSoundAttachmentType()
12441 {
12442 string att_type = "None";
12443
12444 if (ConfigIsExisting("soundAttType"))
12445 {
12446 att_type = ConfigGetString("soundAttType");
12447 }
12448
12449 m_SoundAttType = att_type;
12450 }
12451
12452 override string GetAttachmentSoundType()
12453 {
12454 return m_SoundAttType;
12455 }
12456
12457 //----------------------------------------------------------------
12458 //SOUNDS - ItemSoundHandler
12459 //----------------------------------------------------------------
12460
12461 string GetPlaceSoundset(); // played when deploy starts
12462 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12463 string GetDeploySoundset(); // played when deploy sucessfully finishes
12464
12466 {
12467 if (!m_ItemSoundHandler)
12469
12470 return m_ItemSoundHandler;
12471 }
12472
12473 // override to initialize sounds
12474 protected void InitItemSounds()
12475 {
12476 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
12477 return;
12478
12480
12481 if (GetPlaceSoundset() != string.Empty)
12482 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12483
12484 if (GetDeploySoundset() != string.Empty)
12485 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12486
12487 SoundParameters params = new SoundParameters();
12488 params.m_Loop = true;
12489 if (GetLoopDeploySoundset() != string.Empty)
12490 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12491 }
12492
12493 // Start sound using ItemSoundHandler
12494 void StartItemSoundServer(int id)
12495 {
12496 if (!GetGame().IsServer())
12497 return;
12498
12499 m_SoundSyncPlay = id;
12500 SetSynchDirty();
12501
12502 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12504 }
12505
12506 // Stop sound using ItemSoundHandler
12507 void StopItemSoundServer(int id)
12508 {
12509 if (!GetGame().IsServer())
12510 return;
12511
12512 m_SoundSyncStop = id;
12513 SetSynchDirty();
12514
12515 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12517 }
12518
12519 protected void ClearStartItemSoundServer()
12520 {
12521 m_SoundSyncPlay = 0;
12522 }
12523
12524 protected void ClearStopItemSoundServer()
12525 {
12526 m_SoundSyncStop = 0;
12527 }
12528
12530 void PlayAttachSound(string slot_type)
12531 {
12532 if (!GetGame().IsDedicatedServer())
12533 {
12534 if (ConfigIsExisting("attachSoundSet"))
12535 {
12536 string cfg_path = "";
12537 string soundset = "";
12538 string type_name = GetType();
12539
12540 TStringArray cfg_soundset_array = new TStringArray;
12541 TStringArray cfg_slot_array = new TStringArray;
12542 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12543 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12544
12545 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12546 {
12547 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12548 {
12549 if (cfg_slot_array[i] == slot_type)
12550 {
12551 soundset = cfg_soundset_array[i];
12552 break;
12553 }
12554 }
12555 }
12556
12557 if (soundset != "")
12558 {
12559 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
12560 sound.SetAutodestroy(true);
12561 }
12562 }
12563 }
12564 }
12565
12566 void PlayDetachSound(string slot_type)
12567 {
12568 //TODO - evaluate if needed and devise universal config structure if so
12569 }
12570
12571 void OnApply(PlayerBase player);
12572
12574 {
12575 return 1.0;
12576 };
12577 //returns applicable selection
12578 array<string> GetHeadHidingSelection()
12579 {
12581 }
12582
12584 {
12586 }
12587
12588 WrittenNoteData GetWrittenNoteData() {};
12589
12591 {
12592 SetDynamicPhysicsLifeTime(0.01);
12593 m_ItemBeingDroppedPhys = false;
12594 }
12595
12597 {
12598 array<string> zone_names = new array<string>;
12599 GetDamageZones(zone_names);
12600 for (int i = 0; i < zone_names.Count(); i++)
12601 {
12602 SetHealthMax(zone_names.Get(i),"Health");
12603 }
12604 SetHealthMax("","Health");
12605 }
12606
12608 void SetZoneDamageCEInit()
12609 {
12610 float global_health = GetHealth01("","Health");
12611 array<string> zones = new array<string>;
12612 GetDamageZones(zones);
12613 //set damage of all zones to match global health level
12614 for (int i = 0; i < zones.Count(); i++)
12615 {
12616 SetHealth01(zones.Get(i),"Health",global_health);
12617 }
12618 }
12619
12621 bool IsCoverFaceForShave(string slot_name)
12622 {
12623 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12624 }
12625
12626 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12627 {
12628 if (!hasRootAsPlayer)
12629 {
12630 if (refParentIB)
12631 {
12632 // parent is wet
12633 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
12634 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12635 // parent has liquid inside
12636 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
12637 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12638 // drying
12639 else if (m_VarWet > m_VarWetMin)
12640 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
12641 }
12642 else
12643 {
12644 // drying on ground or inside non-itembase (car, ...)
12645 if (m_VarWet > m_VarWetMin)
12646 AddWet(-1 * delta * GetDryingIncrement("ground"));
12647 }
12648 }
12649 }
12650
12651 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12652 {
12654 {
12655 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
12656 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12657 {
12658 float heatPermCoef = 1.0;
12659 EntityAI ent = this;
12660 while (ent)
12661 {
12662 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12663 ent = ent.GetHierarchyParent();
12664 }
12665
12666 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12667 }
12668 }
12669 }
12670
12671 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
12672 {
12673 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
12674 EntityAI parent = GetHierarchyParent();
12675 if (!parent)
12676 {
12677 hasParent = false;
12678 hasRootAsPlayer = false;
12679 }
12680 else
12681 {
12682 hasParent = true;
12683 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12684 refParentIB = ItemBase.Cast(parent);
12685 }
12686 }
12687
12688 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
12689 {
12690 // this is stub, implemented on Edible_Base
12691 }
12692
12693 bool CanDecay()
12694 {
12695 // return true used on selected food clases so they can decay
12696 return false;
12697 }
12698
12699 protected bool CanProcessDecay()
12700 {
12701 // this is stub, implemented on Edible_Base class
12702 // used to determine whether it is still necessary for the food to decay
12703 return false;
12704 }
12705
12706 protected bool CanHaveWetness()
12707 {
12708 // return true used on selected items that have a wetness effect
12709 return false;
12710 }
12711
12713 bool CanBeConsumed(ConsumeConditionData data = null)
12714 {
12715 return !GetIsFrozen() && IsOpen();
12716 }
12717
12718 override void ProcessVariables()
12719 {
12720 bool hasParent = false, hasRootAsPlayer = false;
12721 ItemBase refParentIB;
12722
12723 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
12724 bool foodDecay = g_Game.IsFoodDecayEnabled();
12725
12726 if (wwtu || foodDecay)
12727 {
12728 bool processWetness = wwtu && CanHaveWetness();
12729 bool processTemperature = wwtu && CanHaveTemperature();
12730 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
12731
12732 if (processWetness || processTemperature || processDecay)
12733 {
12734 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
12735
12736 if (processWetness)
12737 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12738
12739 if (processTemperature)
12740 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12741
12742 if (processDecay)
12743 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12744 }
12745 }
12746 }
12747
12750 {
12751 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
12752 }
12753
12754 override float GetTemperatureFreezeThreshold()
12755 {
12757 return Liquid.GetFreezeThreshold(GetLiquidType());
12758
12759 return super.GetTemperatureFreezeThreshold();
12760 }
12761
12762 override float GetTemperatureThawThreshold()
12763 {
12765 return Liquid.GetThawThreshold(GetLiquidType());
12766
12767 return super.GetTemperatureThawThreshold();
12768 }
12769
12770 override float GetItemOverheatThreshold()
12771 {
12773 return Liquid.GetBoilThreshold(GetLiquidType());
12774
12775 return super.GetItemOverheatThreshold();
12776 }
12777
12778 override float GetTemperatureFreezeTime()
12779 {
12780 if (HasQuantity())
12781 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
12782
12783 return super.GetTemperatureFreezeTime();
12784 }
12785
12786 override float GetTemperatureThawTime()
12787 {
12788 if (HasQuantity())
12789 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
12790
12791 return super.GetTemperatureThawTime();
12792 }
12793
12795 void AffectLiquidContainerOnFill(int liquid_type, float amount);
12797 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
12798
12799 bool IsCargoException4x3(EntityAI item)
12800 {
12801 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12802 }
12803
12805 {
12806 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12807 }
12808
12810 void AddLightSourceItem(ItemBase lightsource)
12811 {
12812 m_LightSourceItem = lightsource;
12813 }
12814
12816 {
12817 m_LightSourceItem = null;
12818 }
12819
12821 {
12822 return m_LightSourceItem;
12823 }
12824
12826 array<int> GetValidFinishers()
12827 {
12828 return null;
12829 }
12830
12832 bool GetActionWidgetOverride(out typename name)
12833 {
12834 return false;
12835 }
12836
12837 bool PairWithDevice(notnull ItemBase otherDevice)
12838 {
12839 if (GetGame().IsServer())
12840 {
12841 ItemBase explosive = otherDevice;
12843 if (!trg)
12844 {
12845 trg = RemoteDetonatorTrigger.Cast(otherDevice);
12846 explosive = this;
12847 }
12848
12849 explosive.PairRemote(trg);
12850 trg.SetControlledDevice(explosive);
12851
12852 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12853 trg.SetPersistentPairID(persistentID);
12854 explosive.SetPersistentPairID(persistentID);
12855
12856 return true;
12857 }
12858 return false;
12859 }
12860
12862 float GetBaitEffectivity()
12863 {
12864 float ret = 1.0;
12865 if (HasQuantity())
12866 ret *= GetQuantityNormalized();
12867 ret *= GetHealth01();
12868
12869 return ret;
12870 }
12871
12872 #ifdef DEVELOPER
12873 override void SetDebugItem()
12874 {
12875 super.SetDebugItem();
12876 _itemBase = this;
12877 }
12878
12879 override string GetDebugText()
12880 {
12881 string text = super.GetDebugText();
12882
12883 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
12884 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
12885
12886 return text;
12887 }
12888 #endif
12889
12890 bool CanBeUsedForSuicide()
12891 {
12892 return true;
12893 }
12894
12896 //DEPRECATED BELOW
12898 // Backwards compatibility
12899 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12900 {
12901 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
12902 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
12903 }
12904
12905 // replaced by ItemSoundHandler
12906 protected EffectSound m_SoundDeployFinish;
12907 protected EffectSound m_SoundPlace;
12908 protected EffectSound m_DeployLoopSoundEx;
12909 protected EffectSound m_SoundDeploy;
12910 bool m_IsPlaceSound;
12911 bool m_IsDeploySound;
12913
12914 string GetDeployFinishSoundset();
12915 void PlayDeploySound();
12916 void PlayDeployFinishSound();
12917 void PlayPlaceSound();
12918 void PlayDeployLoopSoundEx();
12919 void StopDeployLoopSoundEx();
12920 void SoundSynchRemoteReset();
12921 void SoundSynchRemote();
12922 bool UsesGlobalDeploy(){return false;}
12923 bool CanPlayDeployLoopSound(){return false;}
12925 bool IsPlaceSound(){return m_IsPlaceSound;}
12926 bool IsDeploySound(){return m_IsDeploySound;}
12927 void SetIsPlaceSound(bool is_place_sound);
12928 void SetIsDeploySound(bool is_deploy_sound);
12929}
12930
12931EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
12932{
12933 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
12934 if (entity)
12935 {
12936 bool is_item = entity.IsInherited(ItemBase);
12937 if (is_item && full_quantity)
12938 {
12939 ItemBase item = ItemBase.Cast(entity);
12940 item.SetQuantity(item.GetQuantityInit());
12941 }
12942 }
12943 else
12944 {
12945 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
12946 return NULL;
12947 }
12948 return entity;
12949}
12950
12951void SetupSpawnedItem(ItemBase item, float health, float quantity)
12952{
12953 if (item)
12954 {
12955 if (health > 0)
12956 item.SetHealth("", "", health);
12957
12958 if (item.CanHaveTemperature())
12959 {
12960 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
12961 if (item.CanFreeze())
12962 item.SetFrozen(false);
12963 }
12964
12965 if (item.HasEnergyManager())
12966 {
12967 if (quantity >= 0)
12968 {
12969 item.GetCompEM().SetEnergy0To1(quantity);
12970 }
12971 else
12972 {
12973 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
12974 }
12975 }
12976 else if (item.IsMagazine())
12977 {
12978 Magazine mag = Magazine.Cast(item);
12979 if (quantity >= 0)
12980 {
12981 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12982 }
12983 else
12984 {
12985 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
12986 }
12987
12988 }
12989 else
12990 {
12991 if (quantity >= 0)
12992 {
12993 item.SetQuantityNormalized(quantity, false);
12994 }
12995 else
12996 {
12997 item.SetQuantity(Math.AbsFloat(quantity));
12998 }
12999
13000 }
13001 }
13002}
13003
13004#ifdef DEVELOPER
13005ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13006#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8078
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
Определения ItemBase.c:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
InventoryLocation.
Определения InventoryLocation.c:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1012
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения InventoryItem.c:731
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()

Используется в Mask_Base::ConsumeQuantity(), InventoryItem::ConvertEnergyToQuantity(), CAContinuousMineWood::CreatePrimaryItems(), InventoryItem::GetBaitEffectivity(), Mask_Base::GetFilterQuantityMax(), InventoryItem::GetProtectionLevel(), InventoryItem::GetTemperatureFreezeTime(), InventoryItem::GetTemperatureThawTime(), Mask_Base::HasIntegratedFilter(), InventoryItem::InitItemVariables(), InventoryItem::IsLiquidPresent(), InventoryItem::OnWasAttached(), InventoryItem::OnWasDetached(), InventoryItem::SetCEBasedQuantity() и InventoryItem::SetQuantity().