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

◆ KillAllOverheatingParticles()

void SpawnItemOnLocation::KillAllOverheatingParticles ( )
private

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

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