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

◆ IsFacingPlayer()

bool SpawnItemOnLocation::IsFacingPlayer ( PlayerBase player,
string selection )
private

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

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