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

◆ RemoveDebugActionsMask()

static void SpawnItemOnLocation::RemoveDebugActionsMask ( int mask)
staticprivate

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

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

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