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

◆ IsExplosive()

bool SpawnItemOnLocation::IsExplosive ( )
private

explosive

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

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