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

◆ CanMakeGardenplot()

bool SpawnItemOnLocation::CanMakeGardenplot ( )
private

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

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