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

◆ GetOnDigWormsAmount()

int SpawnItemOnLocation::GetOnDigWormsAmount ( )
private

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

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