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

◆ HasMuzzle()

bool SpawnItemOnLocation::HasMuzzle ( )
private

Returns true if this item has a muzzle (weapons, suppressors)

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

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

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