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

◆ IsFullQuantity()

bool SpawnItemOnLocation::IsFullQuantity ( )
private

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

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

Используется в CAContinuousMineWood::CreatePrimaryItems().