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

◆ ~ItemBase()

void SpawnItemOnLocation::~ItemBase ( )
private

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

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