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

◆ IsPlayerInside()

bool SpawnItemOnLocation::IsPlayerInside ( PlayerBase player,
string selection )
private

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

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