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

◆ CheckOverheating()

void SpawnItemOnLocation::CheckOverheating ( ItemBase weapon = null,
string ammoType = "",
ItemBase muzzle_owner = null,
ItemBase suppressor = null,
string config_to_search = "" )
private

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

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

Используется в InventoryItem::IncreaseOverheating() и InventoryItem::OnOverheatingDecay().