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

◆ GetWetMax()

override float SpawnItemOnLocation::GetWetMax ( )
protected

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

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

Используется в Entity::HasWetness(), InventoryItem::InitItemVariables(), InventoryItem::OnAction() и InventoryItem::SetWet().