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

◆ OnWasDetached()

override void SpawnItemOnLocation::OnWasDetached ( EntityAI parent,
int slot_id )
private

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

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