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

◆ SetCEBasedQuantity()

void SpawnItemOnLocation::SetCEBasedQuantity ( )
private

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

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

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