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

◆ EOnContact()

override void SpawnItemOnLocation::EOnContact ( IEntity other,
Contact extra )
private

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

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