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

◆ GetLiquidContainerMask()

int SpawnItemOnLocation::GetLiquidContainerMask ( )
private

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

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