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

◆ InitItemVariables()

override void SpawnItemOnLocation::InitItemVariables ( )
private

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

4961{
4962 override bool CanPutAsAttachment(EntityAI parent)
4963 {
4964 return true;
4965 }
4966};
4967
4968//const bool QUANTITY_DEBUG_REMOVE_ME = false;
4969
4970class ItemBase extends InventoryItem
4971{
4975
4977
4978 static int m_DebugActionsMask;
4980 // ============================================
4981 // Variable Manipulation System
4982 // ============================================
4983 // Quantity
4984
4985 float m_VarQuantity;
4986 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
4988 int m_VarQuantityMin;
4989 int m_VarQuantityMax;
4990 int m_Count;
4991 float m_VarStackMax;
4992 float m_StoreLoadedQuantity = float.LOWEST;
4993 // Wet
4994 float m_VarWet;
4995 float m_VarWetPrev;//for client to know wetness changed during synchronization
4996 float m_VarWetInit;
4997 float m_VarWetMin;
4998 float m_VarWetMax;
4999 // Cleanness
5000 int m_Cleanness;
5001 int m_CleannessInit;
5002 int m_CleannessMin;
5003 int m_CleannessMax;
5004 // impact sounds
5006 bool m_CanPlayImpactSound = true;
5007 float m_ImpactSpeed;
5009 //
5010 float m_HeatIsolation;
5011 float m_ItemModelLength;
5012 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
5014 int m_VarLiquidType;
5015 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
5016 int m_QuickBarBonus;
5017 bool m_IsBeingPlaced;
5018 bool m_IsHologram;
5019 bool m_IsTakeable;
5020 bool m_ThrowItemOnDrop;
5023 bool m_FixDamageSystemInit = false; //can be changed on storage version check
5024 bool can_this_be_combined; //Check if item can be combined
5025 bool m_CanThisBeSplit; //Check if item can be split
5026 bool m_IsStoreLoad = false;
5027 bool m_CanShowQuantity;
5028 bool m_HasQuantityBar;
5029 protected bool m_CanBeDigged;
5030 protected bool m_IsResultOfSplit
5031
5032 string m_SoundAttType;
5033 // items color variables
5038 //-------------------------------------------------------
5039
5040 // light source managing
5042
5046
5047 //==============================================
5048 // agent system
5049 private int m_AttachedAgents;
5050
5052 void TransferModifiers(PlayerBase reciever);
5053
5054
5055 // Weapons & suppressors particle effects
5060 static int m_LastRegisteredWeaponID = 0;
5061
5062 // Overheating effects
5064 float m_OverheatingShots;
5065 ref Timer m_CheckOverheating;
5066 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
5067 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
5068 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
5069 ref array <ref OverheatingParticle> m_OverheatingParticles;
5070
5072 protected bool m_HideSelectionsBySlot;
5073
5074 // Admin Log
5075 PluginAdminLog m_AdminLog;
5076
5077 // misc
5078 ref Timer m_PhysDropTimer;
5079
5080 // Attachment Locking variables
5081 ref array<int> m_CompatibleLocks;
5082 protected int m_LockType;
5083 protected ref EffectSound m_LockingSound;
5084 protected string m_LockSoundSet;
5085
5086 // ItemSoundHandler
5087 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
5088 protected int m_SoundSyncPlay; // id for sound to play
5089 protected int m_SoundSyncStop; // id for sound to stop
5091
5092 //temperature
5093 private float m_TemperaturePerQuantityWeight;
5094
5095 // -------------------------------------------------------------------------
5096 void ItemBase()
5097 {
5098 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
5102
5103 if (!GetGame().IsDedicatedServer())
5104 {
5105 if (HasMuzzle())
5106 {
5108
5110 {
5112 }
5113 }
5114
5116 m_ActionsInitialize = false;
5117 }
5118
5119 m_OldLocation = null;
5120
5121 if (GetGame().IsServer())
5122 {
5123 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
5124 }
5125
5126 if (ConfigIsExisting("headSelectionsToHide"))
5127 {
5129 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
5130 }
5131
5132 m_HideSelectionsBySlot = false;
5133 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5134 {
5135 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
5136 }
5137
5138 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
5139
5140 m_IsResultOfSplit = false;
5141
5143 }
5144
5145 override void InitItemVariables()
5146 {
5147 super.InitItemVariables();
5148
5149 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
5150 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
5151 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
5152 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
5153 m_VarStackMax = ConfigGetFloat("varStackMax");
5154 m_Count = ConfigGetInt("count");
5155
5156 m_CanShowQuantity = ConfigGetBool("quantityShow");
5157 m_HasQuantityBar = ConfigGetBool("quantityBar");
5158
5159 m_CleannessInit = ConfigGetInt("varCleannessInit");
5161 m_CleannessMin = ConfigGetInt("varCleannessMin");
5162 m_CleannessMax = ConfigGetInt("varCleannessMax");
5163
5164 m_WantPlayImpactSound = false;
5165 m_ImpactSpeed = 0.0;
5166
5167 m_VarWetInit = ConfigGetFloat("varWetInit");
5169 m_VarWetMin = ConfigGetFloat("varWetMin");
5170 m_VarWetMax = ConfigGetFloat("varWetMax");
5171
5172 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
5173 if (IsLiquidContainer() && GetQuantity() != 0)
5175 m_IsBeingPlaced = false;
5176 m_IsHologram = false;
5177 m_IsTakeable = true;
5178 m_CanBeMovedOverride = false;
5182 m_CanBeDigged = ConfigGetBool("canBeDigged");
5183
5184 m_CompatibleLocks = new array<int>();
5185 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
5186 m_LockType = ConfigGetInt("lockType");
5187
5188 //Define if item can be split and set ability to be combined accordingly
5189 m_CanThisBeSplit = false;
5190 can_this_be_combined = false;
5191 if (ConfigIsExisting("canBeSplit"))
5192 {
5193 can_this_be_combined = ConfigGetBool("canBeSplit");
5195 }
5196
5197 m_ItemBehaviour = -1;
5198 if (ConfigIsExisting("itemBehaviour"))
5199 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
5200
5201 //RegisterNetSyncVariableInt("m_VariablesMask");
5202 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
5203 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
5204 RegisterNetSyncVariableInt("m_VarLiquidType");
5205 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5206
5207 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5208 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5209 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5210
5211 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5212 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5213 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5214 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5215
5216 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5217 RegisterNetSyncVariableBool("m_IsTakeable");
5218 RegisterNetSyncVariableBool("m_IsHologram");
5219
5220 InitItemSounds();
5222 {
5223 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
5224 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
5225 }
5226
5227 m_LockSoundSet = ConfigGetString("lockSoundSet");
5228
5230 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5231 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
5232
5233 }
5234
5235 override int GetQuickBarBonus()
5236 {
5237 return m_QuickBarBonus;
5238 }
5239
5240 void InitializeActions()
5241 {
5243 if (!m_InputActionMap)
5244 {
5246 m_InputActionMap = iam;
5247 SetActions();
5249 }
5250 }
5251
5252 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
5253 {
5255 {
5256 m_ActionsInitialize = true;
5258 }
5259
5260 actions = m_InputActionMap.Get(action_input_type);
5261 }
5262
5263 void SetActions()
5264 {
5265 AddAction(ActionTakeItem);
5266 AddAction(ActionTakeItemToHands);
5267 AddAction(ActionWorldCraft);
5269 AddAction(ActionAttachWithSwitch);
5270 }
5271
5272 void SetActionAnimOverrides(); // Override action animation for specific item
5273
5274 void AddAction(typename actionName)
5275 {
5276 ActionBase action = ActionManagerBase.GetAction(actionName);
5277
5278 if (!action)
5279 {
5280 Debug.LogError("Action " + actionName + " dosn't exist!");
5281 return;
5282 }
5283
5284 typename ai = action.GetInputType();
5285 if (!ai)
5286 {
5287 m_ActionsInitialize = false;
5288 return;
5289 }
5290
5291 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5292 if (!action_array)
5293 {
5294 action_array = new array<ActionBase_Basic>;
5295 m_InputActionMap.Insert(ai, action_array);
5296 }
5297 if (LogManager.IsActionLogEnable())
5298 {
5299 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
5300 }
5301
5302 if (action_array.Find(action) != -1)
5303 {
5304 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
5305 }
5306 else
5307 {
5308 action_array.Insert(action);
5309 }
5310 }
5311
5312 void RemoveAction(typename actionName)
5313 {
5314 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
5315 ActionBase action = player.GetActionManager().GetAction(actionName);
5316 typename ai = action.GetInputType();
5317 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5318
5319 if (action_array)
5320 {
5321 action_array.RemoveItem(action);
5322 }
5323 }
5324
5325 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
5326 // Set -1 for params which should stay in default state
5327 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
5328 {
5329 ActionOverrideData overrideData = new ActionOverrideData();
5330 overrideData.m_CommandUID = commandUID;
5331 overrideData.m_CommandUIDProne = commandUIDProne;
5332 overrideData.m_StanceMask = stanceMask;
5333
5334 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
5335 if (!actionMap) // create new map of action > overidables map
5336 {
5337 actionMap = new TActionAnimOverrideMap();
5338 m_ItemActionOverrides.Insert(action, actionMap);
5339 }
5340
5341 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
5342
5343 }
5344
5345 void OnItemInHandsPlayerSwimStart(PlayerBase player);
5346
5347 ScriptedLightBase GetLight();
5348
5349 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
5350 void LoadParticleConfigOnFire(int id)
5351 {
5352 if (!m_OnFireEffect)
5354
5357
5358 string config_to_search = "CfgVehicles";
5359 string muzzle_owner_config;
5360
5361 if (!m_OnFireEffect.Contains(id))
5362 {
5363 if (IsInherited(Weapon))
5364 config_to_search = "CfgWeapons";
5365
5366 muzzle_owner_config = config_to_search + " " + GetType() + " ";
5367
5368 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5369
5370 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
5371
5372 if (config_OnFire_subclass_count > 0)
5373 {
5374 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5375
5376 for (int i = 0; i < config_OnFire_subclass_count; i++)
5377 {
5378 string particle_class = "";
5379 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
5380 string config_OnFire_entry = config_OnFire_class + particle_class;
5381 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5382 WPOF_array.Insert(WPOF);
5383 }
5384
5385
5386 m_OnFireEffect.Insert(id, WPOF_array);
5387 }
5388 }
5389
5390 if (!m_OnBulletCasingEjectEffect.Contains(id))
5391 {
5392 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
5393 muzzle_owner_config = config_to_search + " " + GetType() + " ";
5394
5395 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5396
5397 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5398
5399 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5400 {
5401 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5402
5403 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5404 {
5405 string particle_class2 = "";
5406 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5407 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5408 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5409 WPOBE_array.Insert(WPOBE);
5410 }
5411
5412
5413 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
5414 }
5415 }
5416 }
5417
5418 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
5420 {
5423
5424 if (!m_OnOverheatingEffect.Contains(id))
5425 {
5426 string config_to_search = "CfgVehicles";
5427
5428 if (IsInherited(Weapon))
5429 config_to_search = "CfgWeapons";
5430
5431 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
5432 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5433
5434 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
5435 {
5436
5437 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
5438
5440 {
5441 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
5442 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5443 Error(error);
5444 return;
5445 }
5446
5447 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
5448 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
5449
5450
5451
5452 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
5453 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5454
5455 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5456 {
5457 string particle_class = "";
5458 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
5459 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5460 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
5461
5462 if (entry_type == CT_CLASS)
5463 {
5464 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5465 WPOOH_array.Insert(WPOF);
5466 }
5467 }
5468
5469
5470 m_OnOverheatingEffect.Insert(id, WPOOH_array);
5471 }
5472 }
5473 }
5474
5475 float GetOverheatingValue()
5476 {
5477 return m_OverheatingShots;
5478 }
5479
5480 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
5481 {
5482 if (m_MaxOverheatingValue > 0)
5483 {
5485
5486 if (!m_CheckOverheating)
5488
5490 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
5491
5492 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5493 }
5494 }
5495
5496 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
5497 {
5499 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5500
5502 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5503
5505 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5506
5508 {
5510 }
5511 }
5512
5514 {
5516 }
5517
5518 void OnOverheatingDecay()
5519 {
5520 if (m_MaxOverheatingValue > 0)
5521 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
5522 else
5524
5525 if (m_OverheatingShots <= 0)
5526 {
5529 }
5530 else
5531 {
5532 if (!m_CheckOverheating)
5534
5536 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
5537 }
5538
5539 CheckOverheating(this, "", this);
5540 }
5541
5542 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
5543 {
5545 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
5546 }
5547
5548 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
5549 {
5551 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
5553 }
5554
5555 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
5556 {
5558 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5559 }
5560
5561 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
5562 {
5564 m_OverheatingParticles = new array<ref OverheatingParticle>;
5565
5566 OverheatingParticle OP = new OverheatingParticle();
5567 OP.RegisterParticle(p);
5568 OP.SetOverheatingLimitMin(min_heat_coef);
5569 OP.SetOverheatingLimitMax(max_heat_coef);
5570 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
5571
5572 m_OverheatingParticles.Insert(OP);
5573 }
5574
5575 float GetOverheatingCoef()
5576 {
5577 if (m_MaxOverheatingValue > 0)
5579
5580 return -1;
5581 }
5582
5584 {
5586 {
5587 float overheat_coef = GetOverheatingCoef();
5588 int count = m_OverheatingParticles.Count();
5589
5590 for (int i = count; i > 0; --i)
5591 {
5592 int id = i - 1;
5593 OverheatingParticle OP = m_OverheatingParticles.Get(id);
5594 Particle p = OP.GetParticle();
5595
5596 float overheat_min = OP.GetOverheatingLimitMin();
5597 float overheat_max = OP.GetOverheatingLimitMax();
5598
5599 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5600 {
5601 if (p)
5602 {
5603 p.Stop();
5604 OP.RegisterParticle(null);
5605 }
5606 }
5607 }
5608 }
5609 }
5610
5612 {
5614 {
5615 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
5616 {
5617 int id = i - 1;
5618 OverheatingParticle OP = m_OverheatingParticles.Get(id);
5619
5620 if (OP)
5621 {
5622 Particle p = OP.GetParticle();
5623
5624 if (p)
5625 {
5626 p.Stop();
5627 }
5628
5629 delete OP;
5630 }
5631 }
5632
5633 m_OverheatingParticles.Clear();
5635 }
5636 }
5637
5639 float GetInfectionChance(int system = 0, Param param = null)
5640 {
5641 return 0.0;
5642 }
5643
5644
5645 float GetDisinfectQuantity(int system = 0, Param param1 = null)
5646 {
5647 return 250;//default value
5648 }
5649
5650 float GetFilterDamageRatio()
5651 {
5652 return 0;
5653 }
5654
5656 bool HasMuzzle()
5657 {
5658 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
5659 return true;
5660
5661 return false;
5662 }
5663
5665 int GetMuzzleID()
5666 {
5667 if (!m_WeaponTypeToID)
5669
5670 if (m_WeaponTypeToID.Contains(GetType()))
5671 {
5672 return m_WeaponTypeToID.Get(GetType());
5673 }
5674 else
5675 {
5676 // Register new weapon ID
5678 }
5679
5681 }
5682
5689 {
5690 return -1;
5691 }
5692
5693
5694
5695 // -------------------------------------------------------------------------
5696 void ~ItemBase()
5697 {
5698 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
5699 {
5700 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
5701 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
5702
5703 if (r_index >= 0)
5704 {
5705 InventoryLocation r_il = new InventoryLocation;
5706 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
5707
5708 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
5709 int r_type = r_il.GetType();
5710 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
5711 {
5712 r_il.GetParent().GetOnReleaseLock().Invoke(this);
5713 }
5714 else if (r_type == InventoryLocationType.ATTACHMENT)
5715 {
5716 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
5717 }
5718
5719 }
5720
5721 player.GetHumanInventory().ClearUserReservedLocation(this);
5722 }
5723
5724 if (m_LockingSound)
5725 SEffectManager.DestroyEffect(m_LockingSound);
5726 }
5727
5728
5729
5730 // -------------------------------------------------------------------------
5731 static int GetDebugActionsMask()
5732 {
5733 return ItemBase.m_DebugActionsMask;
5734 }
5735
5736 static bool HasDebugActionsMask(int mask)
5737 {
5738 return ItemBase.m_DebugActionsMask & mask;
5739 }
5740
5741 static void SetDebugActionsMask(int mask)
5742 {
5743 ItemBase.m_DebugActionsMask = mask;
5744 }
5745
5746 static void AddDebugActionsMask(int mask)
5747 {
5748 ItemBase.m_DebugActionsMask |= mask;
5749 }
5750
5751 static void RemoveDebugActionsMask(int mask)
5752 {
5753 ItemBase.m_DebugActionsMask &= ~mask;
5754 }
5755
5756 static void ToggleDebugActionsMask(int mask)
5757 {
5758 if (HasDebugActionsMask(mask))
5759 {
5761 }
5762 else
5763 {
5764 AddDebugActionsMask(mask);
5765 }
5766 }
5767
5768 // -------------------------------------------------------------------------
5769 void SetCEBasedQuantity()
5770 {
5771 if (GetEconomyProfile())
5772 {
5773 float q_max = GetEconomyProfile().GetQuantityMax();
5774 if (q_max > 0)
5775 {
5776 float q_min = GetEconomyProfile().GetQuantityMin();
5777 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
5778
5779 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
5780 {
5781 ComponentEnergyManager comp = GetCompEM();
5782 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
5783 {
5784 comp.SetEnergy0To1(quantity_randomized);
5785 }
5786 }
5787 else if (HasQuantity())
5788 {
5789 SetQuantityNormalized(quantity_randomized, false);
5790 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
5791 }
5792
5793 }
5794 }
5795 }
5796
5798 void LockToParent()
5799 {
5800 EntityAI parent = GetHierarchyParent();
5801
5802 if (parent)
5803 {
5804 InventoryLocation inventory_location_to_lock = new InventoryLocation;
5805 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
5806 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
5807 }
5808 }
5809
5811 void UnlockFromParent()
5812 {
5813 EntityAI parent = GetHierarchyParent();
5814
5815 if (parent)
5816 {
5817 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
5818 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
5819 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
5820 }
5821 }
5822
5823 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
5824 {
5825 /*
5826 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
5827 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
5828 */
5829 ItemBase item2 = ItemBase.Cast(entity2);
5830
5831 if (GetGame().IsClient())
5832 {
5833 if (ScriptInputUserData.CanStoreInputUserData())
5834 {
5835 ScriptInputUserData ctx = new ScriptInputUserData;
5837 ctx.Write(-1);
5838 ItemBase i1 = this; // @NOTE: workaround for correct serialization
5839 ctx.Write(i1);
5840 ctx.Write(item2);
5841 ctx.Write(use_stack_max);
5842 ctx.Write(-1);
5843 ctx.Send();
5844
5845 if (IsCombineAll(item2, use_stack_max))
5846 {
5847 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
5848 }
5849 }
5850 }
5851 else if (!GetGame().IsMultiplayer())
5852 {
5853 CombineItems(item2, use_stack_max);
5854 }
5855 }
5856
5857 bool IsLiquidPresent()
5858 {
5859 return (GetLiquidType() != 0 && HasQuantity());
5860 }
5861
5862 bool IsLiquidContainer()
5863 {
5864 return m_LiquidContainerMask != 0;
5865 }
5866
5868 {
5869 return m_LiquidContainerMask;
5870 }
5871
5872 bool IsBloodContainer()
5873 {
5874 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
5875 return false;
5876 }
5877
5878 bool IsNVG()
5879 {
5880 return false;
5881 }
5882
5885 bool IsExplosive()
5886 {
5887 return false;
5888 }
5889
5891 {
5892 return "";
5893 }
5894
5896
5897 bool IsLightSource()
5898 {
5899 return false;
5900 }
5901
5903 {
5904 return true;
5905 }
5906
5907 //--- ACTION CONDITIONS
5908 //direction
5909 bool IsFacingPlayer(PlayerBase player, string selection)
5910 {
5911 return true;
5912 }
5913
5914 bool IsPlayerInside(PlayerBase player, string selection)
5915 {
5916 return true;
5917 }
5918
5919 override bool CanObstruct()
5920 {
5921 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
5922 return !player || !IsPlayerInside(player, "");
5923 }
5924
5925 override bool IsBeingPlaced()
5926 {
5927 return m_IsBeingPlaced;
5928 }
5929
5930 void SetIsBeingPlaced(bool is_being_placed)
5931 {
5932 m_IsBeingPlaced = is_being_placed;
5933 if (!is_being_placed)
5935 SetSynchDirty();
5936 }
5937
5938 //server-side
5939 void OnEndPlacement() {}
5940
5941 override bool IsHologram()
5942 {
5943 return m_IsHologram;
5944 }
5945
5946 bool CanBeDigged()
5947 {
5948 return m_CanBeDigged;
5949 }
5950
5952 {
5953 return 1;
5954 }
5955
5956 bool CanMakeGardenplot()
5957 {
5958 return false;
5959 }
5960
5961 void SetIsHologram(bool is_hologram)
5962 {
5963 m_IsHologram = is_hologram;
5964 SetSynchDirty();
5965 }
5966 /*
5967 protected float GetNutritionalEnergy()
5968 {
5969 Edible_Base edible = Edible_Base.Cast(this);
5970 return edible.GetFoodEnergy();
5971 }
5972
5973 protected float GetNutritionalWaterContent()
5974 {
5975 Edible_Base edible = Edible_Base.Cast(this);
5976 return edible.GetFoodWater();
5977 }
5978
5979 protected float GetNutritionalIndex()
5980 {
5981 Edible_Base edible = Edible_Base.Cast(this);
5982 return edible.GetFoodNutritionalIndex();
5983 }
5984
5985 protected float GetNutritionalFullnessIndex()
5986 {
5987 Edible_Base edible = Edible_Base.Cast(this);
5988 return edible.GetFoodTotalVolume();
5989 }
5990
5991 protected float GetNutritionalToxicity()
5992 {
5993 Edible_Base edible = Edible_Base.Cast(this);
5994 return edible.GetFoodToxicity();
5995
5996 }
5997 */
5998
5999
6000 // -------------------------------------------------------------------------
6001 override void OnMovedInsideCargo(EntityAI container)
6002 {
6003 super.OnMovedInsideCargo(container);
6004
6005 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6006 }
6007
6008 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6009 {
6010 super.EEItemLocationChanged(oldLoc,newLoc);
6011
6012 PlayerBase new_player = null;
6013 PlayerBase old_player = null;
6014
6015 if (newLoc.GetParent())
6016 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6017
6018 if (oldLoc.GetParent())
6019 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6020
6021 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
6022 {
6023 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6024
6025 if (r_index >= 0)
6026 {
6027 InventoryLocation r_il = new InventoryLocation;
6028 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6029
6030 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6031 int r_type = r_il.GetType();
6032 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6033 {
6034 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6035 }
6036 else if (r_type == InventoryLocationType.ATTACHMENT)
6037 {
6038 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6039 }
6040
6041 }
6042 }
6043
6044 if (newLoc.GetType() == InventoryLocationType.HANDS)
6045 {
6046 if (new_player)
6047 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6048
6049 if (new_player == old_player)
6050 {
6051
6052 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6053 {
6054 if (oldLoc.GetType() == InventoryLocationType.CARGO)
6055 {
6056 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6057 {
6058 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6059 }
6060 }
6061 else
6062 {
6063 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6064 }
6065 }
6066
6067 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6068 {
6069 int type = oldLoc.GetType();
6070 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
6071 {
6072 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6073 }
6074 else if (type == InventoryLocationType.ATTACHMENT)
6075 {
6076 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6077 }
6078 }
6079 if (!m_OldLocation)
6080 {
6081 m_OldLocation = new InventoryLocation;
6082 }
6083 m_OldLocation.Copy(oldLoc);
6084 }
6085 else
6086 {
6087 if (m_OldLocation)
6088 {
6089 m_OldLocation.Reset();
6090 }
6091 }
6092
6094 }
6095 else
6096 {
6097 if (new_player)
6098 {
6099 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6100 if (res_index >= 0)
6101 {
6102 InventoryLocation il = new InventoryLocation;
6103 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6104 ItemBase it = ItemBase.Cast(il.GetItem());
6105 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6106 int rel_type = il.GetType();
6107 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
6108 {
6109 il.GetParent().GetOnReleaseLock().Invoke(it);
6110 }
6111 else if (rel_type == InventoryLocationType.ATTACHMENT)
6112 {
6113 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
6114 }
6115 //it.GetOnReleaseLock().Invoke(it);
6116 }
6117 }
6118 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
6119 {
6120 //ThrowPhysically(old_player, vector.Zero);
6121 m_ThrowItemOnDrop = false;
6122 }
6123
6124 if (m_OldLocation)
6125 {
6126 m_OldLocation.Reset();
6127 }
6128 }
6129 }
6130
6131 override void EOnContact(IEntity other, Contact extra)
6132 {
6134 {
6135 int liquidType = -1;
6136 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
6137 if (impactSpeed > 0.0)
6138 {
6139 m_ImpactSpeed = impactSpeed;
6140 #ifndef SERVER
6141 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
6142 #else
6143 m_WantPlayImpactSound = true;
6144 SetSynchDirty();
6145 #endif
6146 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
6147 }
6148 }
6149
6150 #ifdef SERVER
6151 if (GetCompEM() && GetCompEM().IsPlugged())
6152 {
6153 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
6154 GetCompEM().UnplugThis();
6155 }
6156 #endif
6157 }
6158
6159 void RefreshPhysics();
6160
6161 override void OnCreatePhysics()
6162 {
6164 }
6165
6166 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6167 {
6168
6169 }
6170 // -------------------------------------------------------------------------
6171 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
6172 {
6173 super.OnItemLocationChanged(old_owner, new_owner);
6174
6175 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6176 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6177
6178 if (!relatedPlayer && playerNew)
6179 relatedPlayer = playerNew;
6180
6181 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6182 {
6183 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
6184 if (actionMgr)
6185 {
6186 ActionBase currentAction = actionMgr.GetRunningAction();
6187 if (currentAction)
6188 currentAction.OnItemLocationChanged(this);
6189 }
6190 }
6191
6192 Man ownerPlayerOld = null;
6193 Man ownerPlayerNew = null;
6194
6195 if (old_owner)
6196 {
6197 if (old_owner.IsMan())
6198 {
6199 ownerPlayerOld = Man.Cast(old_owner);
6200 }
6201 else
6202 {
6203 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6204 }
6205 }
6206 else
6207 {
6208 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
6209 {
6210 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
6211
6212 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
6213 {
6214 GetCompEM().UnplugThis();
6215 }
6216 }
6217 }
6218
6219 if (new_owner)
6220 {
6221 if (new_owner.IsMan())
6222 {
6223 ownerPlayerNew = Man.Cast(new_owner);
6224 }
6225 else
6226 {
6227 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6228 }
6229 }
6230
6231 if (ownerPlayerOld != ownerPlayerNew)
6232 {
6233 if (ownerPlayerOld)
6234 {
6235 array<EntityAI> subItemsExit = new array<EntityAI>;
6236 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
6237 for (int i = 0; i < subItemsExit.Count(); i++)
6238 {
6239 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
6240 itemExit.OnInventoryExit(ownerPlayerOld);
6241 }
6242 }
6243
6244 if (ownerPlayerNew)
6245 {
6246 array<EntityAI> subItemsEnter = new array<EntityAI>;
6247 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
6248 for (int j = 0; j < subItemsEnter.Count(); j++)
6249 {
6250 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
6251 itemEnter.OnInventoryEnter(ownerPlayerNew);
6252 }
6253 }
6254 }
6255 else if (ownerPlayerNew != null)
6256 {
6257 PlayerBase nplayer;
6258 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6259 {
6260 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6261 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
6262 for (int k = 0; k < subItemsUpdate.Count(); k++)
6263 {
6264 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
6265 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6266 }
6267 }
6268 }
6269
6270 if (old_owner)
6271 old_owner.OnChildItemRemoved(this);
6272 if (new_owner)
6273 new_owner.OnChildItemReceived(this);
6274 }
6275
6276 // -------------------------------------------------------------------------------
6277 override void EEDelete(EntityAI parent)
6278 {
6279 super.EEDelete(parent);
6280 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6281 if (player)
6282 {
6283 OnInventoryExit(player);
6284
6285 if (player.IsAlive())
6286 {
6287 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6288 if (r_index >= 0)
6289 {
6290 InventoryLocation r_il = new InventoryLocation;
6291 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6292
6293 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6294 int r_type = r_il.GetType();
6295 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6296 {
6297 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6298 }
6299 else if (r_type == InventoryLocationType.ATTACHMENT)
6300 {
6301 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6302 }
6303
6304 }
6305
6306 player.RemoveQuickBarEntityShortcut(this);
6307 }
6308 }
6309 }
6310 // -------------------------------------------------------------------------------
6311 override void EEKilled(Object killer)
6312 {
6313 super.EEKilled(killer);
6314
6316 if (killer && killer.IsFireplace() && CanExplodeInFire())
6317 {
6318 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6319 {
6320 if (IsMagazine())
6321 {
6322 if (Magazine.Cast(this).GetAmmoCount() > 0)
6323 {
6324 ExplodeAmmo();
6325 }
6326 }
6327 else
6328 {
6329 Explode(DamageType.EXPLOSION);
6330 }
6331 }
6332 }
6333 }
6334
6335 override void OnWasAttached(EntityAI parent, int slot_id)
6336 {
6337 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6338
6339 super.OnWasAttached(parent, slot_id);
6340
6341 if (HasQuantity())
6342 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6343
6344 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
6345 }
6346
6347 override void OnWasDetached(EntityAI parent, int slot_id)
6348 {
6349 super.OnWasDetached(parent, slot_id);
6350
6351 if (HasQuantity())
6352 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6353 }
6354
6355 override string ChangeIntoOnAttach(string slot)
6356 {
6357 int idx;
6358 TStringArray inventory_slots = new TStringArray;
6359 TStringArray attach_types = new TStringArray;
6360
6361 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6362 if (inventory_slots.Count() < 1) //is string
6363 {
6364 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6365 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6366 }
6367 else //is array
6368 {
6369 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6370 }
6371
6372 idx = inventory_slots.Find(slot);
6373 if (idx < 0)
6374 return "";
6375
6376 return attach_types.Get(idx);
6377 }
6378
6379 override string ChangeIntoOnDetach()
6380 {
6381 int idx = -1;
6382 string slot;
6383
6384 TStringArray inventory_slots = new TStringArray;
6385 TStringArray detach_types = new TStringArray;
6386
6387 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6388 if (inventory_slots.Count() < 1) //is string
6389 {
6390 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6391 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6392 }
6393 else //is array
6394 {
6395 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6396 if (detach_types.Count() < 1)
6397 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6398 }
6399
6400 for (int i = 0; i < inventory_slots.Count(); i++)
6401 {
6402 slot = inventory_slots.Get(i);
6403 }
6404
6405 if (slot != "")
6406 {
6407 if (detach_types.Count() == 1)
6408 idx = 0;
6409 else
6410 idx = inventory_slots.Find(slot);
6411 }
6412 if (idx < 0)
6413 return "";
6414
6415 return detach_types.Get(idx);
6416 }
6417
6418 void ExplodeAmmo()
6419 {
6420 //timer
6421 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
6422
6423 //min/max time
6424 float min_time = 1;
6425 float max_time = 3;
6426 float delay = Math.RandomFloat(min_time, max_time);
6427
6428 explode_timer.Run(delay, this, "DoAmmoExplosion");
6429 }
6430
6431 void DoAmmoExplosion()
6432 {
6433 Magazine magazine = Magazine.Cast(this);
6434 int pop_sounds_count = 6;
6435 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6436
6437 //play sound
6438 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6439 string sound_name = pop_sounds[ sound_idx ];
6440 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
6441
6442 //remove ammo count
6443 magazine.ServerAddAmmoCount(-1);
6444
6445 //if condition then repeat -> ExplodeAmmo
6446 float min_temp_to_explode = 100; //min temperature for item to explode
6447
6448 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
6449 {
6450 ExplodeAmmo();
6451 }
6452 }
6453
6454 // -------------------------------------------------------------------------------
6455 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
6456 {
6457 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
6458
6459 const int CHANCE_DAMAGE_CARGO = 4;
6460 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6461 const int CHANCE_DAMAGE_NOTHING = 2;
6462
6463 if (IsClothing() || IsContainer() || IsItemTent())
6464 {
6465 float dmg = damageResult.GetDamage("","Health") * -0.5;
6466 int chances;
6467 int rnd;
6468
6469 if (GetInventory().GetCargo())
6470 {
6471 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6472 rnd = Math.RandomInt(0,chances);
6473
6474 if (rnd < CHANCE_DAMAGE_CARGO)
6475 {
6476 DamageItemInCargo(dmg);
6477 }
6478 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6479 {
6481 }
6482 }
6483 else
6484 {
6485 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6486 rnd = Math.RandomInt(0,chances);
6487
6488 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6489 {
6491 }
6492 }
6493 }
6494 }
6495
6496 bool DamageItemInCargo(float damage)
6497 {
6498 if (GetInventory().GetCargo())
6499 {
6500 int item_count = GetInventory().GetCargo().GetItemCount();
6501 if (item_count > 0)
6502 {
6503 int random_pick = Math.RandomInt(0, item_count);
6504 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
6505 if (!item.IsExplosive())
6506 {
6507 item.AddHealth("","",damage);
6508 return true;
6509 }
6510 }
6511 }
6512 return false;
6513 }
6514
6515 bool DamageItemAttachments(float damage)
6516 {
6517 int attachment_count = GetInventory().AttachmentCount();
6518 if (attachment_count > 0)
6519 {
6520 int random_pick = Math.RandomInt(0, attachment_count);
6521 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6522 if (!attachment.IsExplosive())
6523 {
6524 attachment.AddHealth("","",damage);
6525 return true;
6526 }
6527 }
6528 return false;
6529 }
6530
6531 override bool IsSplitable()
6532 {
6533 return m_CanThisBeSplit;
6534 }
6535 //----------------
6536 override bool CanBeSplit()
6537 {
6538 if (IsSplitable() && (GetQuantity() > 1))
6539 return GetInventory().CanRemoveEntity();
6540
6541 return false;
6542 }
6543
6544 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
6545 {
6546 if (!CanBeSplit())
6547 return;
6548
6549 if (GetGame().IsClient())
6550 {
6551 if (ScriptInputUserData.CanStoreInputUserData())
6552 {
6553 ScriptInputUserData ctx = new ScriptInputUserData;
6555 ctx.Write(1);
6556 ItemBase i1 = this; // @NOTE: workaround for correct serialization
6557 ctx.Write(i1);
6558 ctx.Write(destination_entity);
6559 ctx.Write(true);
6560 ctx.Write(slot_id);
6561 ctx.Send();
6562 }
6563 }
6564 else if (!GetGame().IsMultiplayer())
6565 {
6566 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
6567 }
6568 }
6569
6570 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
6571 {
6572 if (!CanBeSplit())
6573 return;
6574
6575 float split_quantity_new;
6576 ref ItemBase new_item;
6577 float quantity = GetQuantity();
6578 float stack_max = GetTargetQuantityMax(slot_id);
6579 InventoryLocation loc = new InventoryLocation;
6580
6581 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6582 {
6583 if (stack_max <= GetQuantity())
6584 split_quantity_new = stack_max;
6585 else
6586 split_quantity_new = GetQuantity();
6587
6588 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
6589 if (new_item)
6590 {
6591 new_item.SetResultOfSplit(true);
6592 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6593 AddQuantity(-split_quantity_new);
6594 new_item.SetQuantity(split_quantity_new);
6595 }
6596 }
6597 else if (destination_entity && slot_id == -1)
6598 {
6599 if (quantity > stack_max)
6600 split_quantity_new = stack_max;
6601 else
6602 split_quantity_new = quantity;
6603
6604 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
6605 {
6606 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
6607 new_item = ItemBase.Cast(o);
6608 }
6609
6610 if (new_item)
6611 {
6612 new_item.SetResultOfSplit(true);
6613 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6614 AddQuantity(-split_quantity_new);
6615 new_item.SetQuantity(split_quantity_new);
6616 }
6617 }
6618 else
6619 {
6620 if (stack_max != 0)
6621 {
6622 if (stack_max < GetQuantity())
6623 {
6624 split_quantity_new = GetQuantity() - stack_max;
6625 }
6626
6627 if (split_quantity_new == 0)
6628 {
6629 if (!GetGame().IsMultiplayer())
6630 player.PhysicalPredictiveDropItem(this);
6631 else
6632 player.ServerDropEntity(this);
6633 return;
6634 }
6635
6636 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
6637
6638 if (new_item)
6639 {
6640 new_item.SetResultOfSplit(true);
6641 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6642 SetQuantity(split_quantity_new);
6643 new_item.SetQuantity(stack_max);
6644 new_item.PlaceOnSurface();
6645 }
6646 }
6647 }
6648 }
6649
6650 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
6651 {
6652 if (!CanBeSplit())
6653 return;
6654
6655 float split_quantity_new;
6656 ref ItemBase new_item;
6657 float quantity = GetQuantity();
6658 float stack_max = GetTargetQuantityMax(slot_id);
6659 InventoryLocation loc = new InventoryLocation;
6660
6661 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6662 {
6663 if (stack_max <= GetQuantity())
6664 split_quantity_new = stack_max;
6665 else
6666 split_quantity_new = GetQuantity();
6667
6668 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
6669 if (new_item)
6670 {
6671 new_item.SetResultOfSplit(true);
6672 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6673 AddQuantity(-split_quantity_new);
6674 new_item.SetQuantity(split_quantity_new);
6675 }
6676 }
6677 else if (destination_entity && slot_id == -1)
6678 {
6679 if (quantity > stack_max)
6680 split_quantity_new = stack_max;
6681 else
6682 split_quantity_new = quantity;
6683
6684 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
6685 {
6686 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
6687 new_item = ItemBase.Cast(o);
6688 }
6689
6690 if (new_item)
6691 {
6692 new_item.SetResultOfSplit(true);
6693 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6694 AddQuantity(-split_quantity_new);
6695 new_item.SetQuantity(split_quantity_new);
6696 }
6697 }
6698 else
6699 {
6700 if (stack_max != 0)
6701 {
6702 if (stack_max < GetQuantity())
6703 {
6704 split_quantity_new = GetQuantity() - stack_max;
6705 }
6706
6707 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
6708
6709 if (new_item)
6710 {
6711 new_item.SetResultOfSplit(true);
6712 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6713 SetQuantity(split_quantity_new);
6714 new_item.SetQuantity(stack_max);
6715 new_item.PlaceOnSurface();
6716 }
6717 }
6718 }
6719 }
6720
6721 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
6722 {
6723 if (!CanBeSplit())
6724 return;
6725
6726 if (GetGame().IsClient())
6727 {
6728 if (ScriptInputUserData.CanStoreInputUserData())
6729 {
6730 ScriptInputUserData ctx = new ScriptInputUserData;
6732 ctx.Write(4);
6733 ItemBase thiz = this; // @NOTE: workaround for correct serialization
6734 ctx.Write(thiz);
6735 dst.WriteToContext(ctx);
6736 ctx.Send();
6737 }
6738 }
6739 else if (!GetGame().IsMultiplayer())
6740 {
6742 }
6743 }
6744
6745 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
6746 {
6747 if (!CanBeSplit())
6748 return;
6749
6750 if (GetGame().IsClient())
6751 {
6752 if (ScriptInputUserData.CanStoreInputUserData())
6753 {
6754 ScriptInputUserData ctx = new ScriptInputUserData;
6756 ctx.Write(2);
6757 ItemBase dummy = this; // @NOTE: workaround for correct serialization
6758 ctx.Write(dummy);
6759 ctx.Write(destination_entity);
6760 ctx.Write(true);
6761 ctx.Write(idx);
6762 ctx.Write(row);
6763 ctx.Write(col);
6764 ctx.Send();
6765 }
6766 }
6767 else if (!GetGame().IsMultiplayer())
6768 {
6769 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
6770 }
6771 }
6772
6773 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
6774 {
6776 }
6777
6778 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
6779 {
6780 if (!CanBeSplit())
6781 return this;
6782
6783 float quantity = GetQuantity();
6784 float split_quantity_new;
6785 ItemBase new_item;
6786 if (dst.IsValid())
6787 {
6788 int slot_id = dst.GetSlot();
6789 float stack_max = GetTargetQuantityMax(slot_id);
6790
6791 if (quantity > stack_max)
6792 split_quantity_new = stack_max;
6793 else
6794 split_quantity_new = quantity;
6795
6796 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
6797
6798 if (new_item)
6799 {
6800 new_item.SetResultOfSplit(true);
6801 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6802 AddQuantity(-split_quantity_new);
6803 new_item.SetQuantity(split_quantity_new);
6804 }
6805
6806 return new_item;
6807 }
6808
6809 return null;
6810 }
6811
6812 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
6813 {
6814 if (!CanBeSplit())
6815 return;
6816
6817 float quantity = GetQuantity();
6818 float split_quantity_new;
6819 ref ItemBase new_item;
6820 if (destination_entity)
6821 {
6822 float stackable = GetTargetQuantityMax();
6823 if (quantity > stackable)
6824 split_quantity_new = stackable;
6825 else
6826 split_quantity_new = quantity;
6827
6828 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
6829 if (new_item)
6830 {
6831 new_item.SetResultOfSplit(true);
6832 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6833 AddQuantity(-split_quantity_new);
6834 new_item.SetQuantity(split_quantity_new);
6835 }
6836 }
6837 }
6838
6839 void SplitIntoStackMaxHandsClient(PlayerBase player)
6840 {
6841 if (!CanBeSplit())
6842 return;
6843
6844 if (GetGame().IsClient())
6845 {
6846 if (ScriptInputUserData.CanStoreInputUserData())
6847 {
6848 ScriptInputUserData ctx = new ScriptInputUserData;
6850 ctx.Write(3);
6851 ItemBase i1 = this; // @NOTE: workaround for correct serialization
6852 ctx.Write(i1);
6853 ItemBase destination_entity = this;
6854 ctx.Write(destination_entity);
6855 ctx.Write(true);
6856 ctx.Write(0);
6857 ctx.Send();
6858 }
6859 }
6860 else if (!GetGame().IsMultiplayer())
6861 {
6862 SplitIntoStackMaxHands(player);
6863 }
6864 }
6865
6866 void SplitIntoStackMaxHands(PlayerBase player)
6867 {
6868 if (!CanBeSplit())
6869 return;
6870
6871 float quantity = GetQuantity();
6872 float split_quantity_new;
6873 ref ItemBase new_item;
6874 if (player)
6875 {
6876 float stackable = GetTargetQuantityMax();
6877 if (quantity > stackable)
6878 split_quantity_new = stackable;
6879 else
6880 split_quantity_new = quantity;
6881
6882 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
6883 new_item = ItemBase.Cast(in_hands);
6884 if (new_item)
6885 {
6886 new_item.SetResultOfSplit(true);
6887 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6888 AddQuantity(-split_quantity_new);
6889 new_item.SetQuantity(split_quantity_new);
6890 }
6891 }
6892 }
6893
6894 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
6895 {
6896 if (!CanBeSplit())
6897 return;
6898
6899 float quantity = GetQuantity();
6900 float split_quantity_new = Math.Floor(quantity * 0.5);
6901
6902 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
6903
6904 if (new_item)
6905 {
6906 if (new_item.GetQuantityMax() < split_quantity_new)
6907 {
6908 split_quantity_new = new_item.GetQuantityMax();
6909 }
6910
6911 new_item.SetResultOfSplit(true);
6912 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6913
6914 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
6915 {
6916 AddQuantity(-1);
6917 new_item.SetQuantity(1);
6918 }
6919 else
6920 {
6921 AddQuantity(-split_quantity_new);
6922 new_item.SetQuantity(split_quantity_new);
6923 }
6924 }
6925 }
6926
6927 void SplitItem(PlayerBase player)
6928 {
6929 if (!CanBeSplit())
6930 return;
6931
6932 float quantity = GetQuantity();
6933 float split_quantity_new = Math.Floor(quantity / 2);
6934
6935 InventoryLocation invloc = new InventoryLocation;
6936 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
6937
6938 ItemBase new_item;
6939 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
6940
6941 if (new_item)
6942 {
6943 if (new_item.GetQuantityMax() < split_quantity_new)
6944 {
6945 split_quantity_new = new_item.GetQuantityMax();
6946 }
6947 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
6948 {
6949 AddQuantity(-1);
6950 new_item.SetQuantity(1);
6951 }
6952 else
6953 {
6954 AddQuantity(-split_quantity_new);
6955 new_item.SetQuantity(split_quantity_new);
6956 }
6957 }
6958 }
6959
6961 void OnQuantityChanged(float delta)
6962 {
6963 SetWeightDirty();
6964 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
6965
6966 if (parent)
6967 parent.OnAttachmentQuantityChangedEx(this, delta);
6968
6969 if (IsLiquidContainer())
6970 {
6971 if (GetQuantityNormalized() <= 0.0)
6972 {
6974 }
6975 else if (GetLiquidType() == LIQUID_NONE)
6976 {
6977 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
6979 }
6980 }
6981
6982 }
6983
6986 {
6987 // insert code here
6988 }
6989
6991 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
6992 {
6994 }
6995
6996 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
6997 {
6998 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
6999
7000 if (GetGame().IsServer())
7001 {
7002 if (newLevel == GameConstants.STATE_RUINED)
7003 {
7005 EntityAI parent = GetHierarchyParent();
7006 if (parent && parent.IsFireplace())
7007 {
7008 CargoBase cargo = GetInventory().GetCargo();
7009 if (cargo)
7010 {
7011 for (int i = 0; i < cargo.GetItemCount(); ++i)
7012 {
7013 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
7014 }
7015 }
7016 }
7017 }
7018
7019 if (IsResultOfSplit())
7020 {
7021 // reset the splitting result flag, return to normal item behavior
7022 SetResultOfSplit(false);
7023 return;
7024 }
7025
7026 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7027 {
7028 SetCleanness(0);//unclean the item upon damage dealt
7029 }
7030 }
7031 }
7032
7033 // just the split? TODO: verify
7034 override void OnRightClick()
7035 {
7036 super.OnRightClick();
7037
7038 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
7039 {
7040 if (GetGame().IsClient())
7041 {
7042 if (ScriptInputUserData.CanStoreInputUserData())
7043 {
7044 vector m4[4];
7045 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
7046
7047 EntityAI root = GetHierarchyRoot();
7048
7049 InventoryLocation dst = new InventoryLocation;
7050 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
7051 {
7052 if (root)
7053 {
7054 root.GetTransform(m4);
7055 dst.SetGround(this, m4);
7056 }
7057 else
7058 GetInventory().GetCurrentInventoryLocation(dst);
7059 }
7060 else
7061 {
7062 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
7063 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
7064 this shouldnt cause issues within this scope*/
7065 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
7066 {
7067 if (root)
7068 {
7069 root.GetTransform(m4);
7070 dst.SetGround(this, m4);
7071 }
7072 else
7073 GetInventory().GetCurrentInventoryLocation(dst);
7074 }
7075 else
7076 {
7077 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7078 }
7079 }
7080
7081 ScriptInputUserData ctx = new ScriptInputUserData;
7083 ctx.Write(4);
7084 ItemBase thiz = this; // @NOTE: workaround for correct serialization
7085 ctx.Write(thiz);
7086 dst.WriteToContext(ctx);
7087 ctx.Write(true); // dummy
7088 ctx.Send();
7089 }
7090 }
7091 else if (!GetGame().IsMultiplayer())
7092 {
7093 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
7094 }
7095 }
7096 }
7097
7098 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
7099 {
7100 //TODO: delete check zero quantity check after fix double posts hands fsm events
7101 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
7102 return false;
7103
7104 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7105 return false;
7106
7107 //can_this_be_combined = ConfigGetBool("canBeSplit");
7109 return false;
7110
7111
7112 Magazine mag = Magazine.Cast(this);
7113 if (mag)
7114 {
7115 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7116 return false;
7117
7118 if (stack_max_limit)
7119 {
7120 Magazine other_mag = Magazine.Cast(other_item);
7121 if (other_item)
7122 {
7123 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7124 return false;
7125 }
7126
7127 }
7128 }
7129 else
7130 {
7131 //TODO: delete check zero quantity check after fix double posts hands fsm events
7132 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
7133 return false;
7134
7135 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
7136 return false;
7137 }
7138
7139 PlayerBase player = null;
7140 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
7141 {
7142 if (player.GetInventory().HasAttachment(this))
7143 return false;
7144
7145 if (player.IsItemsToDelete())
7146 return false;
7147 }
7148
7149 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7150 return false;
7151
7152 int slotID;
7153 string slotName;
7154 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7155 return false;
7156
7157 return true;
7158 }
7159
7160 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
7161 {
7162 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
7163 }
7164
7165 bool IsResultOfSplit()
7166 {
7167 return m_IsResultOfSplit;
7168 }
7169
7170 void SetResultOfSplit(bool value)
7171 {
7172 m_IsResultOfSplit = value;
7173 }
7174
7175 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
7176 {
7177 return ComputeQuantityUsedEx(other_item, use_stack_max);
7178 }
7179
7180 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
7181 {
7182 float other_item_quantity = other_item.GetQuantity();
7183 float this_free_space;
7184
7185 float stack_max = GetQuantityMax();
7186
7187 this_free_space = stack_max - GetQuantity();
7188
7189 if (other_item_quantity > this_free_space)
7190 {
7191 return this_free_space;
7192 }
7193 else
7194 {
7195 return other_item_quantity;
7196 }
7197 }
7198
7199 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
7200 {
7201 CombineItems(ItemBase.Cast(entity2),use_stack_max);
7202 }
7203
7204 void CombineItems(ItemBase other_item, bool use_stack_max = true)
7205 {
7206 if (!CanBeCombined(other_item, false))
7207 return;
7208
7209 if (!IsMagazine() && other_item)
7210 {
7211 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
7212 if (quantity_used != 0)
7213 {
7214 float hp1 = GetHealth01("","");
7215 float hp2 = other_item.GetHealth01("","");
7216 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
7217 hpResult = hpResult / (GetQuantity() + quantity_used);
7218
7219 hpResult *= GetMaxHealth();
7220 Math.Round(hpResult);
7221 SetHealth("", "Health", hpResult);
7222
7223 AddQuantity(quantity_used);
7224 other_item.AddQuantity(-quantity_used);
7225 }
7226 }
7227 OnCombine(other_item);
7228 }
7229
7230 void OnCombine(ItemBase other_item)
7231 {
7232 #ifdef SERVER
7233 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7234 GetHierarchyParent().IncreaseLifetimeUp();
7235 #endif
7236 };
7237
7238 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
7239 {
7240 PlayerBase p = PlayerBase.Cast(player);
7241
7242 array<int> recipesIds = p.m_Recipes;
7243 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7244 if (moduleRecipesManager)
7245 {
7246 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7247 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
7248 }
7249
7250 for (int i = 0;i < recipesIds.Count(); i++)
7251 {
7252 int key = recipesIds.Get(i);
7253 string recipeName = moduleRecipesManager.GetRecipeName(key);
7254 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
7255 }
7256 }
7257
7258 // -------------------------------------------------------------------------
7259 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7260 {
7261 super.GetDebugActions(outputList);
7262
7263 //quantity
7264 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
7265 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
7266 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
7267 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
7268
7269 //health
7270 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
7271 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
7272 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
7273 //temperature
7274 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
7275 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
7276 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
7277
7278 //wet
7279 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
7280 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
7281
7282 //liquidtype
7283 if (IsLiquidContainer())
7284 {
7285 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
7286 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
7287 }
7288
7289 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
7290 // watch
7291 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
7292 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
7293
7294 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7295 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
7296 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7297 }
7298
7299 // -------------------------------------------------------------------------
7300 // -------------------------------------------------------------------------
7301 // -------------------------------------------------------------------------
7302 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
7303 {
7304 super.OnAction(action_id, player, ctx);
7305 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
7306 {
7307 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7308 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
7309 PlayerBase p = PlayerBase.Cast(player);
7310 if (EActions.RECIPES_RANGE_START < 1000)
7311 {
7312 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7313 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7314 }
7315 }
7316 #ifndef SERVER
7317 else if (action_id == EActions.WATCH_PLAYER)
7318 {
7319 PluginDeveloper.SetDeveloperItemClientEx(player);
7320 }
7321 #endif
7322 if (GetGame().IsServer())
7323 {
7324 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7325 {
7326 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7327 OnDebugButtonPressServer(id + 1);
7328 }
7329
7330 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7331 {
7332 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7333 InsertAgent(agent_id,100);
7334 }
7335
7336 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7337 {
7338 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7339 RemoveAgent(agent_id2);
7340 }
7341
7342 else if (action_id == EActions.ADD_QUANTITY)
7343 {
7344 if (IsMagazine())
7345 {
7346 Magazine mag = Magazine.Cast(this);
7347 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7348 }
7349 else
7350 {
7351 AddQuantity(GetQuantityMax() * 0.2);
7352 }
7353
7354 if (m_EM)
7355 {
7356 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7357 }
7358 //PrintVariables();
7359 }
7360
7361 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
7362 {
7363 if (IsMagazine())
7364 {
7365 Magazine mag2 = Magazine.Cast(this);
7366 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7367 }
7368 else
7369 {
7370 AddQuantity(- GetQuantityMax() * 0.2);
7371 }
7372 if (m_EM)
7373 {
7374 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7375 }
7376 //PrintVariables();
7377 }
7378
7379 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
7380 {
7381 SetQuantity(0);
7382
7383 if (m_EM)
7384 {
7385 m_EM.SetEnergy(0);
7386 }
7387 }
7388
7389 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
7390 {
7392
7393 if (m_EM)
7394 {
7395 m_EM.SetEnergy(m_EM.GetEnergyMax());
7396 }
7397 }
7398
7399 else if (action_id == EActions.ADD_HEALTH)
7400 {
7401 AddHealth("","",GetMaxHealth("","Health")/5);
7402 }
7403 else if (action_id == EActions.REMOVE_HEALTH)
7404 {
7405 AddHealth("","",-GetMaxHealth("","Health")/5);
7406 }
7407 else if (action_id == EActions.DESTROY_HEALTH)
7408 {
7409 SetHealth01("","",0);
7410 }
7411 else if (action_id == EActions.WATCH_ITEM)
7412 {
7414 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
7415 #ifdef DEVELOPER
7416 SetDebugDeveloper_item(this);
7417 #endif
7418 }
7419
7420 else if (action_id == EActions.ADD_TEMPERATURE)
7421 {
7422 AddTemperature(20);
7423 //PrintVariables();
7424 }
7425
7426 else if (action_id == EActions.REMOVE_TEMPERATURE)
7427 {
7428 AddTemperature(-20);
7429 //PrintVariables();
7430 }
7431
7432 else if (action_id == EActions.FLIP_FROZEN)
7433 {
7434 SetFrozen(!GetIsFrozen());
7435 //PrintVariables();
7436 }
7437
7438 else if (action_id == EActions.ADD_WETNESS)
7439 {
7440 AddWet(GetWetMax()/5);
7441 //PrintVariables();
7442 }
7443
7444 else if (action_id == EActions.REMOVE_WETNESS)
7445 {
7446 AddWet(-GetWetMax()/5);
7447 //PrintVariables();
7448 }
7449
7450 else if (action_id == EActions.LIQUIDTYPE_UP)
7451 {
7452 int curr_type = GetLiquidType();
7453 SetLiquidType(curr_type * 2);
7454 //AddWet(1);
7455 //PrintVariables();
7456 }
7457
7458 else if (action_id == EActions.LIQUIDTYPE_DOWN)
7459 {
7460 int curr_type2 = GetLiquidType();
7461 SetLiquidType(curr_type2 / 2);
7462 }
7463
7464 else if (action_id == EActions.MAKE_SPECIAL)
7465 {
7466 auto debugParams = DebugSpawnParams.WithPlayer(player);
7467 OnDebugSpawnEx(debugParams);
7468 }
7469
7470 else if (action_id == EActions.DELETE)
7471 {
7472 Delete();
7473 }
7474
7475 }
7476
7477
7478 return false;
7479 }
7480
7481 // -------------------------------------------------------------------------
7482
7483
7486 void OnActivatedByTripWire();
7487
7489 void OnActivatedByItem(notnull ItemBase item);
7490
7491 //----------------------------------------------------------------
7492 //returns true if item is able to explode when put in fire
7493 bool CanExplodeInFire()
7494 {
7495 return false;
7496 }
7497
7498 //----------------------------------------------------------------
7499 bool CanEat()
7500 {
7501 return true;
7502 }
7503
7504 //----------------------------------------------------------------
7505 override bool IsIgnoredByConstruction()
7506 {
7507 return true;
7508 }
7509
7510 //----------------------------------------------------------------
7511 //has FoodStages in config?
7512 bool HasFoodStage()
7513 {
7514 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
7515 return GetGame().ConfigIsExisting(config_path);
7516 }
7517
7519 FoodStage GetFoodStage()
7520 {
7521 return null;
7522 }
7523
7524 bool CanBeCooked()
7525 {
7526 return false;
7527 }
7528
7529 bool CanBeCookedOnStick()
7530 {
7531 return false;
7532 }
7533
7535 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
7537
7538 //----------------------------------------------------------------
7539 bool CanRepair(ItemBase item_repair_kit)
7540 {
7541 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
7542 return module_repairing.CanRepair(this, item_repair_kit);
7543 }
7544
7545 //----------------------------------------------------------------
7546 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
7547 {
7548 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
7549 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7550 }
7551
7552 //----------------------------------------------------------------
7553 int GetItemSize()
7554 {
7555 /*
7556 vector v_size = this.ConfigGetVector("itemSize");
7557 int v_size_x = v_size[0];
7558 int v_size_y = v_size[1];
7559 int size = v_size_x * v_size_y;
7560 return size;
7561 */
7562
7563 return 1;
7564 }
7565
7566 //----------------------------------------------------------------
7567 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
7568 bool CanBeMovedOverride()
7569 {
7570 return m_CanBeMovedOverride;
7571 }
7572
7573 //----------------------------------------------------------------
7574 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
7575 void SetCanBeMovedOverride(bool setting)
7576 {
7577 m_CanBeMovedOverride = setting;
7578 }
7579
7580 //----------------------------------------------------------------
7588 void MessageToOwnerStatus(string text)
7589 {
7590 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7591
7592 if (player)
7593 {
7594 player.MessageStatus(text);
7595 }
7596 }
7597
7598 //----------------------------------------------------------------
7606 void MessageToOwnerAction(string text)
7607 {
7608 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7609
7610 if (player)
7611 {
7612 player.MessageAction(text);
7613 }
7614 }
7615
7616 //----------------------------------------------------------------
7624 void MessageToOwnerFriendly(string text)
7625 {
7626 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7627
7628 if (player)
7629 {
7630 player.MessageFriendly(text);
7631 }
7632 }
7633
7634 //----------------------------------------------------------------
7642 void MessageToOwnerImportant(string text)
7643 {
7644 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7645
7646 if (player)
7647 {
7648 player.MessageImportant(text);
7649 }
7650 }
7651
7652 override bool IsItemBase()
7653 {
7654 return true;
7655 }
7656
7657 // Checks if item is of questioned kind
7658 override bool KindOf(string tag)
7659 {
7660 bool found = false;
7661 string item_name = this.GetType();
7662 ref TStringArray item_tag_array = new TStringArray;
7663 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
7664
7665 int array_size = item_tag_array.Count();
7666 for (int i = 0; i < array_size; i++)
7667 {
7668 if (item_tag_array.Get(i) == tag)
7669 {
7670 found = true;
7671 break;
7672 }
7673 }
7674 return found;
7675 }
7676
7677
7678 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
7679 {
7680 //Debug.Log("OnRPC called");
7681 super.OnRPC(sender, rpc_type,ctx);
7682
7683 //Play soundset for attachment locking (ActionLockAttachment.c)
7684 switch (rpc_type)
7685 {
7686 #ifndef SERVER
7687 case ERPCs.RPC_SOUND_LOCK_ATTACH:
7688 Param2<bool, string> p = new Param2<bool, string>(false, "");
7689
7690 if (!ctx.Read(p))
7691 return;
7692
7693 bool play = p.param1;
7694 string soundSet = p.param2;
7695
7696 if (play)
7697 {
7698 if (m_LockingSound)
7699 {
7701 {
7702 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
7703 }
7704 }
7705 else
7706 {
7707 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
7708 }
7709 }
7710 else
7711 {
7712 SEffectManager.DestroyEffect(m_LockingSound);
7713 }
7714
7715 break;
7716 #endif
7717
7718 }
7719
7720 if (GetWrittenNoteData())
7721 {
7722 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
7723 }
7724 }
7725
7726 //-----------------------------
7727 // VARIABLE MANIPULATION SYSTEM
7728 //-----------------------------
7729 int NameToID(string name)
7730 {
7731 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
7732 return plugin.GetID(name);
7733 }
7734
7735 string IDToName(int id)
7736 {
7737 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
7738 return plugin.GetName(id);
7739 }
7740
7742 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
7743 {
7744 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
7745 //read the flags
7746 int varFlags;
7747 if (!ctx.Read(varFlags))
7748 return;
7749
7750 if (varFlags & ItemVariableFlags.FLOAT)
7751 {
7752 ReadVarsFromCTX(ctx);
7753 }
7754 }
7755
7756 override void SerializeNumericalVars(array<float> floats_out)
7757 {
7758 //some variables handled on EntityAI level already!
7759 super.SerializeNumericalVars(floats_out);
7760
7761 // the order of serialization must be the same as the order of de-serialization
7762 //--------------------------------------------
7763 if (IsVariableSet(VARIABLE_QUANTITY))
7764 {
7765 floats_out.Insert(m_VarQuantity);
7766 }
7767 //--------------------------------------------
7768 if (IsVariableSet(VARIABLE_WET))
7769 {
7770 floats_out.Insert(m_VarWet);
7771 }
7772 //--------------------------------------------
7773 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
7774 {
7775 floats_out.Insert(m_VarLiquidType);
7776 }
7777 //--------------------------------------------
7778 if (IsVariableSet(VARIABLE_COLOR))
7779 {
7780 floats_out.Insert(m_ColorComponentR);
7781 floats_out.Insert(m_ColorComponentG);
7782 floats_out.Insert(m_ColorComponentB);
7783 floats_out.Insert(m_ColorComponentA);
7784 }
7785 //--------------------------------------------
7786 if (IsVariableSet(VARIABLE_CLEANNESS))
7787 {
7788 floats_out.Insert(m_Cleanness);
7789 }
7790 }
7791
7792 override void DeSerializeNumericalVars(array<float> floats)
7793 {
7794 //some variables handled on EntityAI level already!
7795 super.DeSerializeNumericalVars(floats);
7796
7797 // the order of serialization must be the same as the order of de-serialization
7798 int index = 0;
7799 int mask = Math.Round(floats.Get(index));
7800
7801 index++;
7802 //--------------------------------------------
7803 if (mask & VARIABLE_QUANTITY)
7804 {
7805 if (m_IsStoreLoad)
7806 {
7807 SetStoreLoadedQuantity(floats.Get(index));
7808 }
7809 else
7810 {
7811 float quantity = floats.Get(index);
7812 SetQuantity(quantity, true, false, false, false);
7813 }
7814 index++;
7815 }
7816 //--------------------------------------------
7817 if (mask & VARIABLE_WET)
7818 {
7819 float wet = floats.Get(index);
7820 SetWet(wet);
7821 index++;
7822 }
7823 //--------------------------------------------
7824 if (mask & VARIABLE_LIQUIDTYPE)
7825 {
7826 int liquidtype = Math.Round(floats.Get(index));
7827 SetLiquidType(liquidtype);
7828 index++;
7829 }
7830 //--------------------------------------------
7831 if (mask & VARIABLE_COLOR)
7832 {
7833 m_ColorComponentR = Math.Round(floats.Get(index));
7834 index++;
7835 m_ColorComponentG = Math.Round(floats.Get(index));
7836 index++;
7837 m_ColorComponentB = Math.Round(floats.Get(index));
7838 index++;
7839 m_ColorComponentA = Math.Round(floats.Get(index));
7840 index++;
7841 }
7842 //--------------------------------------------
7843 if (mask & VARIABLE_CLEANNESS)
7844 {
7845 int cleanness = Math.Round(floats.Get(index));
7846 SetCleanness(cleanness);
7847 index++;
7848 }
7849 }
7850
7851 override void WriteVarsToCTX(ParamsWriteContext ctx)
7852 {
7853 super.WriteVarsToCTX(ctx);
7854
7855 //--------------------------------------------
7856 if (IsVariableSet(VARIABLE_QUANTITY))
7857 {
7858 ctx.Write(GetQuantity());
7859 }
7860 //--------------------------------------------
7861 if (IsVariableSet(VARIABLE_WET))
7862 {
7863 ctx.Write(GetWet());
7864 }
7865 //--------------------------------------------
7866 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
7867 {
7868 ctx.Write(GetLiquidType());
7869 }
7870 //--------------------------------------------
7871 if (IsVariableSet(VARIABLE_COLOR))
7872 {
7873 int r,g,b,a;
7874 GetColor(r,g,b,a);
7875 ctx.Write(r);
7876 ctx.Write(g);
7877 ctx.Write(b);
7878 ctx.Write(a);
7879 }
7880 //--------------------------------------------
7881 if (IsVariableSet(VARIABLE_CLEANNESS))
7882 {
7883 ctx.Write(GetCleanness());
7884 }
7885 }
7886
7887 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
7888 {
7889 if (!super.ReadVarsFromCTX(ctx,version))
7890 return false;
7891
7892 int intValue;
7893 float value;
7894
7895 if (version < 140)
7896 {
7897 if (!ctx.Read(intValue))
7898 return false;
7899
7900 m_VariablesMask = intValue;
7901 }
7902
7903 if (m_VariablesMask & VARIABLE_QUANTITY)
7904 {
7905 if (!ctx.Read(value))
7906 return false;
7907
7908 if (IsStoreLoad())
7909 {
7911 }
7912 else
7913 {
7914 SetQuantity(value, true, false, false, false);
7915 }
7916 }
7917 //--------------------------------------------
7918 if (version < 140)
7919 {
7920 if (m_VariablesMask & VARIABLE_TEMPERATURE)
7921 {
7922 if (!ctx.Read(value))
7923 return false;
7924 SetTemperatureDirect(value);
7925 }
7926 }
7927 //--------------------------------------------
7928 if (m_VariablesMask & VARIABLE_WET)
7929 {
7930 if (!ctx.Read(value))
7931 return false;
7932 SetWet(value);
7933 }
7934 //--------------------------------------------
7935 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
7936 {
7937 if (!ctx.Read(intValue))
7938 return false;
7939 SetLiquidType(intValue);
7940 }
7941 //--------------------------------------------
7942 if (m_VariablesMask & VARIABLE_COLOR)
7943 {
7944 int r,g,b,a;
7945 if (!ctx.Read(r))
7946 return false;
7947 if (!ctx.Read(g))
7948 return false;
7949 if (!ctx.Read(b))
7950 return false;
7951 if (!ctx.Read(a))
7952 return false;
7953
7954 SetColor(r,g,b,a);
7955 }
7956 //--------------------------------------------
7957 if (m_VariablesMask & VARIABLE_CLEANNESS)
7958 {
7959 if (!ctx.Read(intValue))
7960 return false;
7961 SetCleanness(intValue);
7962 }
7963 //--------------------------------------------
7964 if (version >= 138 && version < 140)
7965 {
7966 if (m_VariablesMask & VARIABLE_TEMPERATURE)
7967 {
7968 if (!ctx.Read(intValue))
7969 return false;
7970 SetFrozen(intValue);
7971 }
7972 }
7973
7974 return true;
7975 }
7976
7977 //----------------------------------------------------------------
7978 override bool OnStoreLoad(ParamsReadContext ctx, int version)
7979 {
7980 m_IsStoreLoad = true;
7982 {
7983 m_FixDamageSystemInit = true;
7984 }
7985
7986 if (!super.OnStoreLoad(ctx, version))
7987 {
7988 m_IsStoreLoad = false;
7989 return false;
7990 }
7991
7992 if (version >= 114)
7993 {
7994 bool hasQuickBarIndexSaved;
7995
7996 if (!ctx.Read(hasQuickBarIndexSaved))
7997 {
7998 m_IsStoreLoad = false;
7999 return false;
8000 }
8001
8002 if (hasQuickBarIndexSaved)
8003 {
8004 int itmQBIndex;
8005
8006 //Load quickbar item bind
8007 if (!ctx.Read(itmQBIndex))
8008 {
8009 m_IsStoreLoad = false;
8010 return false;
8011 }
8012
8013 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8014 if (itmQBIndex != -1 && parentPlayer)
8015 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8016 }
8017 }
8018 else
8019 {
8020 // Backup of how it used to be
8021 PlayerBase player;
8022 int itemQBIndex;
8023 if (version == int.MAX)
8024 {
8025 if (!ctx.Read(itemQBIndex))
8026 {
8027 m_IsStoreLoad = false;
8028 return false;
8029 }
8030 }
8031 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8032 {
8033 //Load quickbar item bind
8034 if (!ctx.Read(itemQBIndex))
8035 {
8036 m_IsStoreLoad = false;
8037 return false;
8038 }
8039 if (itemQBIndex != -1 && player)
8040 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8041 }
8042 }
8043
8044 if (version < 140)
8045 {
8046 // variable management system
8047 if (!LoadVariables(ctx, version))
8048 {
8049 m_IsStoreLoad = false;
8050 return false;
8051 }
8052 }
8053
8054 //agent trasmission system
8055 if (!LoadAgents(ctx, version))
8056 {
8057 m_IsStoreLoad = false;
8058 return false;
8059 }
8060 if (version >= 132)
8061 {
8062 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8063 if (raib)
8064 {
8065 if (!raib.OnStoreLoad(ctx,version))
8066 {
8067 m_IsStoreLoad = false;
8068 return false;
8069 }
8070 }
8071 }
8072
8073 m_IsStoreLoad = false;
8074 return true;
8075 }
8076
8077 //----------------------------------------------------------------
8078
8079 override void OnStoreSave(ParamsWriteContext ctx)
8080 {
8081 super.OnStoreSave(ctx);
8082
8083 PlayerBase player;
8084 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8085 {
8086 ctx.Write(true); // Keep track of if we should actually read this in or not
8087 //Save quickbar item bind
8088 int itemQBIndex = -1;
8089 itemQBIndex = player.FindQuickBarEntityIndex(this);
8090 ctx.Write(itemQBIndex);
8091 }
8092 else
8093 {
8094 ctx.Write(false); // Keep track of if we should actually read this in or not
8095 }
8096
8097 SaveAgents(ctx);//agent trasmission system
8098
8099 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8100 if (raib)
8101 {
8102 raib.OnStoreSave(ctx);
8103 }
8104 }
8105 //----------------------------------------------------------------
8106
8107 override void AfterStoreLoad()
8108 {
8109 super.AfterStoreLoad();
8110
8112 {
8114 }
8115
8116 if (GetStoreLoadedQuantity() != float.LOWEST)
8117 {
8119 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
8120 }
8121 }
8122
8123 override void EEOnAfterLoad()
8124 {
8125 super.EEOnAfterLoad();
8126
8128 {
8129 m_FixDamageSystemInit = false;
8130 }
8131
8134 }
8135
8136 bool CanBeDisinfected()
8137 {
8138 return false;
8139 }
8140
8141
8142 //----------------------------------------------------------------
8143 override void OnVariablesSynchronized()
8144 {
8145 if (m_Initialized)
8146 {
8147 #ifdef PLATFORM_CONSOLE
8148 //bruteforce it is
8149 if (IsSplitable())
8150 {
8151 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
8152 if (menu)
8153 {
8154 menu.Refresh();
8155 }
8156 }
8157 #endif
8158 }
8159
8161 {
8162 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8163 m_WantPlayImpactSound = false;
8164 }
8165
8167 {
8168 SetWeightDirty();
8170 }
8171 if (m_VarWet != m_VarWetPrev)
8172 {
8175 }
8176
8177 if (m_SoundSyncPlay != 0)
8178 {
8179 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
8180 m_SoundSyncPlay = 0;
8181 }
8182 if (m_SoundSyncStop != 0)
8183 {
8184 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
8185 m_SoundSyncStop = 0;
8186 }
8187
8188 super.OnVariablesSynchronized();
8189 }
8190
8191 //------------------------- Quantity
8192 //----------------------------------------------------------------
8194 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
8195 {
8196 if (!IsServerCheck(allow_client))
8197 return false;
8198
8199 if (!HasQuantity())
8200 return false;
8201
8202 float min = GetQuantityMin();
8203 float max = GetQuantityMax();
8204
8205 if (value <= (min + 0.001))
8206 value = min;
8207
8208 if (value == min)
8209 {
8210 if (destroy_config)
8211 {
8212 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8213 if (dstr)
8214 {
8215 m_VarQuantity = Math.Clamp(value, min, max);
8216 this.Delete();
8217 return true;
8218 }
8219 }
8220 else if (destroy_forced)
8221 {
8222 m_VarQuantity = Math.Clamp(value, min, max);
8223 this.Delete();
8224 return true;
8225 }
8226 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
8227 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
8228 }
8229
8230 float delta = m_VarQuantity;
8231 m_VarQuantity = Math.Clamp(value, min, max);
8232
8233 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
8234 {
8235 delta = m_VarQuantity - delta;
8236
8237 if (delta)
8238 OnQuantityChanged(delta);
8239 }
8240
8241 SetVariableMask(VARIABLE_QUANTITY);
8242
8243 return false;
8244 }
8245
8246 //----------------------------------------------------------------
8248 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
8249 {
8250 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
8251 }
8252 //----------------------------------------------------------------
8253 void SetQuantityMax()
8254 {
8255 float max = GetQuantityMax();
8256 SetQuantity(max);
8257 }
8258
8259 override void SetQuantityToMinimum()
8260 {
8261 float min = GetQuantityMin();
8262 SetQuantity(min);
8263 }
8264 //----------------------------------------------------------------
8266 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
8267 {
8268 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
8269 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
8270 SetQuantity(result, destroy_config, destroy_forced);
8271 }
8272
8273 //----------------------------------------------------------------
8275 override float GetQuantityNormalized()
8276 {
8277 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
8278 }
8279
8281 {
8282 return GetQuantityNormalized();
8283 }
8284
8285 /*void SetAmmoNormalized(float value)
8286 {
8287 float value_clamped = Math.Clamp(value, 0, 1);
8288 Magazine this_mag = Magazine.Cast(this);
8289 int max_rounds = this_mag.GetAmmoMax();
8290 int result = value * max_rounds;//can the rounded if higher precision is required
8291 this_mag.SetAmmoCount(result);
8292 }*/
8293 //----------------------------------------------------------------
8294 override int GetQuantityMax()
8295 {
8296 int slot = -1;
8297 if (GetInventory())
8298 {
8299 InventoryLocation il = new InventoryLocation;
8300 GetInventory().GetCurrentInventoryLocation(il);
8301 slot = il.GetSlot();
8302 }
8303
8304 return GetTargetQuantityMax(slot);
8305 }
8306
8307 override int GetTargetQuantityMax(int attSlotID = -1)
8308 {
8309 float quantity_max = 0;
8310
8311 if (IsSplitable()) //only stackable/splitable items can check for stack size
8312 {
8313 if (attSlotID != -1)
8314 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8315
8316 if (quantity_max <= 0)
8317 quantity_max = m_VarStackMax;
8318 }
8319
8320 if (quantity_max <= 0)
8321 quantity_max = m_VarQuantityMax;
8322
8323 return quantity_max;
8324 }
8325 //----------------------------------------------------------------
8326 override int GetQuantityMin()
8327 {
8328 return m_VarQuantityMin;
8329 }
8330 //----------------------------------------------------------------
8331 int GetQuantityInit()
8332 {
8333 return m_VarQuantityInit;
8334 }
8335
8336 //----------------------------------------------------------------
8337 override bool HasQuantity()
8338 {
8339 return !(GetQuantityMax() - GetQuantityMin() == 0);
8340 }
8341
8342 override float GetQuantity()
8343 {
8344 return m_VarQuantity;
8345 }
8346
8347 bool IsFullQuantity()
8348 {
8349 return GetQuantity() >= GetQuantityMax();
8350 }
8351
8352 //Calculates weight of single item without attachments and cargo
8353 override float GetSingleInventoryItemWeightEx()
8354 {
8355 //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
8356 float weightEx = GetWeightEx();//overall weight of the item
8357 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
8358 return weightEx - special;
8359 }
8360
8361 // Obsolete, use GetSingleInventoryItemWeightEx() instead
8363 {
8365 }
8366
8367 override protected float GetWeightSpecialized(bool forceRecalc = false)
8368 {
8369 if (IsSplitable()) //quantity determines size of the stack
8370 {
8371 #ifdef DEVELOPER
8372 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8373 {
8374 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8375 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
8376 }
8377 #endif
8378
8379 return GetQuantity() * GetConfigWeightModified();
8380 }
8381 else if (HasEnergyManager())// items with energy manager
8382 {
8383 #ifdef DEVELOPER
8384 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8385 {
8386 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8387 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
8388 }
8389 #endif
8390 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8391 }
8392 else//everything else
8393 {
8394 #ifdef DEVELOPER
8395 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8396 {
8397 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8398 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
8399 }
8400 #endif
8401 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8402 }
8403 }
8404
8406 int GetNumberOfItems()
8407 {
8408 int item_count = 0;
8409 ItemBase item;
8410
8411 if (GetInventory().GetCargo() != NULL)
8412 {
8413 item_count = GetInventory().GetCargo().GetItemCount();
8414 }
8415
8416 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8417 {
8418 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8419 if (item)
8420 item_count += item.GetNumberOfItems();
8421 }
8422 return item_count;
8423 }
8424
8426 float GetUnitWeight(bool include_wetness = true)
8427 {
8428 float weight = 0;
8429 float wetness = 1;
8430 if (include_wetness)
8431 wetness += GetWet();
8432 if (IsSplitable()) //quantity determines size of the stack
8433 {
8434 weight = wetness * m_ConfigWeight;
8435 }
8436 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
8437 {
8438 weight = 1;
8439 }
8440 return weight;
8441 }
8442
8443 //-----------------------------------------------------------------
8444
8445 override void ClearInventory()
8446 {
8447 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
8448 {
8449 GameInventory inv = GetInventory();
8450 array<EntityAI> items = new array<EntityAI>;
8451 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
8452 for (int i = 0; i < items.Count(); i++)
8453 {
8454 ItemBase item = ItemBase.Cast(items.Get(i));
8455 if (item)
8456 {
8457 GetGame().ObjectDelete(item);
8458 }
8459 }
8460 }
8461 }
8462
8463 //------------------------- Energy
8464
8465 //----------------------------------------------------------------
8466 float GetEnergy()
8467 {
8468 float energy = 0;
8469 if (HasEnergyManager())
8470 {
8471 energy = GetCompEM().GetEnergy();
8472 }
8473 return energy;
8474 }
8475
8476
8477 override void OnEnergyConsumed()
8478 {
8479 super.OnEnergyConsumed();
8480
8482 }
8483
8484 override void OnEnergyAdded()
8485 {
8486 super.OnEnergyAdded();
8487
8489 }
8490
8491 // Converts energy (from Energy Manager) to quantity, if enabled.
8493 {
8494 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8495 {
8496 if (HasQuantity())
8497 {
8498 float energy_0to1 = GetCompEM().GetEnergy0To1();
8499 SetQuantityNormalized(energy_0to1);
8500 }
8501 }
8502 }
8503
8504 //----------------------------------------------------------------
8505 float GetHeatIsolationInit()
8506 {
8507 return ConfigGetFloat("heatIsolation");
8508 }
8509
8510 float GetHeatIsolation()
8511 {
8512 return m_HeatIsolation;
8513 }
8514
8515 float GetDryingIncrement(string pIncrementName)
8516 {
8517 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
8518 if (GetGame().ConfigIsExisting(paramPath))
8519 return GetGame().ConfigGetFloat(paramPath);
8520
8521 return 0.0;
8522 }
8523
8524 float GetSoakingIncrement(string pIncrementName)
8525 {
8526 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
8527 if (GetGame().ConfigIsExisting(paramPath))
8528 return GetGame().ConfigGetFloat(paramPath);
8529
8530 return 0.0;
8531 }
8532 //----------------------------------------------------------------
8533 override void SetWet(float value, bool allow_client = false)
8534 {
8535 if (!IsServerCheck(allow_client))
8536 return;
8537
8538 float min = GetWetMin();
8539 float max = GetWetMax();
8540
8541 float previousValue = m_VarWet;
8542
8543 m_VarWet = Math.Clamp(value, min, max);
8544
8545 if (previousValue != m_VarWet)
8546 {
8547 SetVariableMask(VARIABLE_WET);
8548 OnWetChanged(m_VarWet, previousValue);
8549 }
8550 }
8551 //----------------------------------------------------------------
8552 override void AddWet(float value)
8553 {
8554 SetWet(GetWet() + value);
8555 }
8556 //----------------------------------------------------------------
8557 override void SetWetMax()
8558 {
8560 }
8561 //----------------------------------------------------------------
8562 override float GetWet()
8563 {
8564 return m_VarWet;
8565 }
8566 //----------------------------------------------------------------
8567 override float GetWetMax()
8568 {
8569 return m_VarWetMax;
8570 }
8571 //----------------------------------------------------------------
8572 override float GetWetMin()
8573 {
8574 return m_VarWetMin;
8575 }
8576 //----------------------------------------------------------------
8577 override float GetWetInit()
8578 {
8579 return m_VarWetInit;
8580 }
8581 //----------------------------------------------------------------
8582 override void OnWetChanged(float newVal, float oldVal)
8583 {
8584 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
8585 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
8586 if (newLevel != oldLevel)
8587 {
8588 OnWetLevelChanged(newLevel,oldLevel);
8589 }
8590 }
8591
8592 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
8593 {
8594 SetWeightDirty();
8595 }
8596
8597 override EWetnessLevel GetWetLevel()
8598 {
8599 return GetWetLevelInternal(m_VarWet);
8600 }
8601
8602 //----------------------------------------------------------------
8603
8604 override void SetStoreLoad(bool value)
8605 {
8606 m_IsStoreLoad = value;
8607 }
8608
8609 override bool IsStoreLoad()
8610 {
8611 return m_IsStoreLoad;
8612 }
8613
8614 override void SetStoreLoadedQuantity(float value)
8615 {
8616 m_StoreLoadedQuantity = value;
8617 }
8618
8619 override float GetStoreLoadedQuantity()
8620 {
8621 return m_StoreLoadedQuantity;
8622 }
8623
8624 //----------------------------------------------------------------
8625
8626 float GetItemModelLength()
8627 {
8628 if (ConfigIsExisting("itemModelLength"))
8629 {
8630 return ConfigGetFloat("itemModelLength");
8631 }
8632 return 0;
8633 }
8634
8635 float GetItemAttachOffset()
8636 {
8637 if (ConfigIsExisting("itemAttachOffset"))
8638 {
8639 return ConfigGetFloat("itemAttachOffset");
8640 }
8641 return 0;
8642 }
8643
8644 override void SetCleanness(int value, bool allow_client = false)
8645 {
8646 if (!IsServerCheck(allow_client))
8647 return;
8648
8649 int previousValue = m_Cleanness;
8650
8651 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
8652
8653 if (previousValue != m_Cleanness)
8654 SetVariableMask(VARIABLE_CLEANNESS);
8655 }
8656
8657 override int GetCleanness()
8658 {
8659 return m_Cleanness;
8660 }
8661
8663 {
8664 return true;
8665 }
8666
8667 //----------------------------------------------------------------
8668 // ATTACHMENT LOCKING
8669 // Getters relevant to generic ActionLockAttachment
8670 int GetLockType()
8671 {
8672 return m_LockType;
8673 }
8674
8675 string GetLockSoundSet()
8676 {
8677 return m_LockSoundSet;
8678 }
8679
8680 //----------------------------------------------------------------
8681 //------------------------- Color
8682 // sets items color variable given color components
8683 override void SetColor(int r, int g, int b, int a)
8684 {
8689 SetVariableMask(VARIABLE_COLOR);
8690 }
8692 override void GetColor(out int r,out int g,out int b,out int a)
8693 {
8698 }
8699
8700 bool IsColorSet()
8701 {
8702 return IsVariableSet(VARIABLE_COLOR);
8703 }
8704
8706 string GetColorString()
8707 {
8708 int r,g,b,a;
8709 GetColor(r,g,b,a);
8710 r = r/255;
8711 g = g/255;
8712 b = b/255;
8713 a = a/255;
8714 return MiscGameplayFunctions.GetColorString(r, g, b, a);
8715 }
8716 //----------------------------------------------------------------
8717 //------------------------- LiquidType
8718
8719 override void SetLiquidType(int value, bool allow_client = false)
8720 {
8721 if (!IsServerCheck(allow_client))
8722 return;
8723
8724 int old = m_VarLiquidType;
8725 m_VarLiquidType = value;
8726 OnLiquidTypeChanged(old,value);
8727 SetVariableMask(VARIABLE_LIQUIDTYPE);
8728 }
8729
8730 int GetLiquidTypeInit()
8731 {
8732 return ConfigGetInt("varLiquidTypeInit");
8733 }
8734
8735 override int GetLiquidType()
8736 {
8737 return m_VarLiquidType;
8738 }
8739
8740 protected void OnLiquidTypeChanged(int oldType, int newType)
8741 {
8742 if (newType == LIQUID_NONE && GetIsFrozen())
8743 SetFrozen(false);
8744 }
8745
8747 void UpdateQuickbarShortcutVisibility(PlayerBase player)
8748 {
8749 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8750 }
8751
8752 // -------------------------------------------------------------------------
8754 void OnInventoryEnter(Man player)
8755 {
8756 PlayerBase nplayer;
8757 if (PlayerBase.CastTo(nplayer, player))
8758 {
8759 m_CanPlayImpactSound = true;
8760 //nplayer.OnItemInventoryEnter(this);
8761 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8762 }
8763 }
8764
8765 // -------------------------------------------------------------------------
8767 void OnInventoryExit(Man player)
8768 {
8769 PlayerBase nplayer;
8770 if (PlayerBase.CastTo(nplayer,player))
8771 {
8772 //nplayer.OnItemInventoryExit(this);
8773 nplayer.SetEnableQuickBarEntityShortcut(this,false);
8774
8775 }
8776
8777 //if (!GetGame().IsDedicatedServer())
8778 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
8779
8780
8781 if (HasEnergyManager())
8782 {
8783 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
8784 }
8785 }
8786
8787 // ADVANCED PLACEMENT EVENTS
8788 override void OnPlacementStarted(Man player)
8789 {
8790 super.OnPlacementStarted(player);
8791
8792 SetTakeable(false);
8793 }
8794
8795 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
8796 {
8797 if (m_AdminLog)
8798 {
8799 m_AdminLog.OnPlacementComplete(player, this);
8800 }
8801
8802 super.OnPlacementComplete(player, position, orientation);
8803 }
8804
8805 //-----------------------------
8806 // AGENT SYSTEM
8807 //-----------------------------
8808 //--------------------------------------------------------------------------
8809 bool ContainsAgent(int agent_id)
8810 {
8811 if (agent_id & m_AttachedAgents)
8812 {
8813 return true;
8814 }
8815 else
8816 {
8817 return false;
8818 }
8819 }
8820
8821 //--------------------------------------------------------------------------
8822 override void RemoveAgent(int agent_id)
8823 {
8824 if (ContainsAgent(agent_id))
8825 {
8826 m_AttachedAgents = ~agent_id & m_AttachedAgents;
8827 }
8828 }
8829
8830 //--------------------------------------------------------------------------
8831 override void RemoveAllAgents()
8832 {
8833 m_AttachedAgents = 0;
8834 }
8835 //--------------------------------------------------------------------------
8836 override void RemoveAllAgentsExcept(int agent_to_keep)
8837 {
8838 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
8839 }
8840 // -------------------------------------------------------------------------
8841 override void InsertAgent(int agent, float count = 1)
8842 {
8843 if (count < 1)
8844 return;
8845 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
8847 }
8848
8850 void TransferAgents(int agents)
8851 {
8853 }
8854
8855 // -------------------------------------------------------------------------
8856 override int GetAgents()
8857 {
8858 return m_AttachedAgents;
8859 }
8860 //----------------------------------------------------------------------
8861
8862 /*int GetContaminationType()
8863 {
8864 int contamination_type;
8865
8866 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
8867 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
8868 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
8869 const int DIRTY_MASK = eAgents.WOUND_AGENT;
8870
8871 Edible_Base edible = Edible_Base.Cast(this);
8872 int agents = GetAgents();
8873 if (edible)
8874 {
8875 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
8876 if (profile)
8877 {
8878 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
8879 }
8880 }
8881 if (agents & CONTAMINATED_MASK)
8882 {
8883 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
8884 }
8885 if (agents & POISONED_MASK)
8886 {
8887 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
8888 }
8889 if (agents & NERVE_GAS_MASK)
8890 {
8891 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
8892 }
8893 if (agents & DIRTY_MASK)
8894 {
8895 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
8896 }
8897
8898 return agents;
8899 }*/
8900
8901 // -------------------------------------------------------------------------
8902 bool LoadAgents(ParamsReadContext ctx, int version)
8903 {
8904 if (!ctx.Read(m_AttachedAgents))
8905 return false;
8906 return true;
8907 }
8908 // -------------------------------------------------------------------------
8910 {
8911
8913 }
8914 // -------------------------------------------------------------------------
8915
8917 override void CheckForRoofLimited(float timeTresholdMS = 3000)
8918 {
8919 super.CheckForRoofLimited(timeTresholdMS);
8920
8921 float time = GetGame().GetTime();
8922 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
8923 {
8924 m_PreviousRoofTestTime = time;
8925 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
8926 }
8927 }
8928
8929 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
8930 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
8931 {
8932 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
8933 {
8934 return 0;
8935 }
8936
8937 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
8938 {
8939 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
8940 if (filter)
8941 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
8942 else
8943 return 0;//otherwise return 0 when no filter attached
8944 }
8945
8946 string subclassPath, entryName;
8947
8948 switch (type)
8949 {
8950 case DEF_BIOLOGICAL:
8951 entryName = "biological";
8952 break;
8953 case DEF_CHEMICAL:
8954 entryName = "chemical";
8955 break;
8956 default:
8957 entryName = "biological";
8958 break;
8959 }
8960
8961 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
8962
8963 return GetGame().ConfigGetFloat(subclassPath + entryName);
8964 }
8965
8966
8967
8969 override void EEOnCECreate()
8970 {
8971 if (!IsMagazine())
8973
8975 }
8976
8977
8978 //-------------------------
8979 // OPEN/CLOSE USER ACTIONS
8980 //-------------------------
8982 void Open();
8983 void Close();
8984 bool IsOpen()
8985 {
8986 return true;
8987 }
8988
8989 override bool CanDisplayCargo()
8990 {
8991 return IsOpen();
8992 }
8993
8994
8995 // ------------------------------------------------------------
8996 // CONDITIONS
8997 // ------------------------------------------------------------
8998 override bool CanPutInCargo(EntityAI parent)
8999 {
9000 if (parent)
9001 {
9002 if (parent.IsInherited(DayZInfected))
9003 return true;
9004
9005 if (!parent.IsRuined())
9006 return true;
9007 }
9008
9009 return true;
9010 }
9011
9012 override bool CanPutAsAttachment(EntityAI parent)
9013 {
9014 if (!super.CanPutAsAttachment(parent))
9015 {
9016 return false;
9017 }
9018
9019 if (!IsRuined() && !parent.IsRuined())
9020 {
9021 return true;
9022 }
9023
9024 return false;
9025 }
9026
9027 override bool CanReceiveItemIntoCargo(EntityAI item)
9028 {
9029 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9030 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9031 // return false;
9032
9033 return super.CanReceiveItemIntoCargo(item);
9034 }
9035
9036 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
9037 {
9038 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9039 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9040 // return false;
9041
9042 GameInventory attachmentInv = attachment.GetInventory();
9043 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9044 {
9045 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9046 return false;
9047 }
9048
9049 InventoryLocation loc = new InventoryLocation();
9050 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9051 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
9052 return false;
9053
9054 return super.CanReceiveAttachment(attachment, slotId);
9055 }
9056
9057 override bool CanReleaseAttachment(EntityAI attachment)
9058 {
9059 if (!super.CanReleaseAttachment(attachment))
9060 return false;
9061
9062 return GetInventory().AreChildrenAccessible();
9063 }
9064
9065 /*override bool CanLoadAttachment(EntityAI attachment)
9066 {
9067 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9068 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9069 // return false;
9070
9071 GameInventory attachmentInv = attachment.GetInventory();
9072 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9073 {
9074 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
9075 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
9076
9077 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9078 return false;
9079 }
9080
9081 return super.CanLoadAttachment(attachment);
9082 }*/
9083
9084 // Plays muzzle flash particle effects
9085 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9086 {
9087 int id = muzzle_owner.GetMuzzleID();
9088 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
9089
9090 if (WPOF_array)
9091 {
9092 for (int i = 0; i < WPOF_array.Count(); i++)
9093 {
9094 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9095
9096 if (WPOF)
9097 {
9098 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9099 }
9100 }
9101 }
9102 }
9103
9104 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
9105 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9106 {
9107 int id = muzzle_owner.GetMuzzleID();
9108 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
9109
9110 if (WPOBE_array)
9111 {
9112 for (int i = 0; i < WPOBE_array.Count(); i++)
9113 {
9114 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9115
9116 if (WPOBE)
9117 {
9118 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9119 }
9120 }
9121 }
9122 }
9123
9124 // Plays all weapon overheating particles
9125 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9126 {
9127 int id = muzzle_owner.GetMuzzleID();
9128 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9129
9130 if (WPOOH_array)
9131 {
9132 for (int i = 0; i < WPOOH_array.Count(); i++)
9133 {
9134 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9135
9136 if (WPOOH)
9137 {
9138 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9139 }
9140 }
9141 }
9142 }
9143
9144 // Updates all weapon overheating particles
9145 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9146 {
9147 int id = muzzle_owner.GetMuzzleID();
9148 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9149
9150 if (WPOOH_array)
9151 {
9152 for (int i = 0; i < WPOOH_array.Count(); i++)
9153 {
9154 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9155
9156 if (WPOOH)
9157 {
9158 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9159 }
9160 }
9161 }
9162 }
9163
9164 // Stops overheating particles
9165 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9166 {
9167 int id = muzzle_owner.GetMuzzleID();
9168 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9169
9170 if (WPOOH_array)
9171 {
9172 for (int i = 0; i < WPOOH_array.Count(); i++)
9173 {
9174 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9175
9176 if (WPOOH)
9177 {
9178 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9179 }
9180 }
9181 }
9182 }
9183
9184 //----------------------------------------------------------------
9185 //Item Behaviour - unified approach
9186 override bool IsHeavyBehaviour()
9187 {
9188 if (m_ItemBehaviour == 0)
9189 {
9190 return true;
9191 }
9192
9193 return false;
9194 }
9195
9196 override bool IsOneHandedBehaviour()
9197 {
9198 if (m_ItemBehaviour == 1)
9199 {
9200 return true;
9201 }
9202
9203 return false;
9204 }
9205
9206 override bool IsTwoHandedBehaviour()
9207 {
9208 if (m_ItemBehaviour == 2)
9209 {
9210 return true;
9211 }
9212
9213 return false;
9214 }
9215
9216 bool IsDeployable()
9217 {
9218 return false;
9219 }
9220
9222 float GetDeployTime()
9223 {
9224 return UATimeSpent.DEFAULT_DEPLOY;
9225 }
9226
9227
9228 //----------------------------------------------------------------
9229 // Item Targeting (User Actions)
9230 override void SetTakeable(bool pState)
9231 {
9232 m_IsTakeable = pState;
9233 SetSynchDirty();
9234 }
9235
9236 override bool IsTakeable()
9237 {
9238 return m_IsTakeable;
9239 }
9240
9241 // For cases where we want to show object widget which cant be taken to hands
9243 {
9244 return false;
9245 }
9246
9248 protected void PreLoadSoundAttachmentType()
9249 {
9250 string att_type = "None";
9251
9252 if (ConfigIsExisting("soundAttType"))
9253 {
9254 att_type = ConfigGetString("soundAttType");
9255 }
9256
9257 m_SoundAttType = att_type;
9258 }
9259
9260 override string GetAttachmentSoundType()
9261 {
9262 return m_SoundAttType;
9263 }
9264
9265 //----------------------------------------------------------------
9266 //SOUNDS - ItemSoundHandler
9267 //----------------------------------------------------------------
9268
9269 string GetPlaceSoundset(); // played when deploy starts
9270 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
9271 string GetDeploySoundset(); // played when deploy sucessfully finishes
9272
9274 {
9275 if (!m_ItemSoundHandler)
9277
9278 return m_ItemSoundHandler;
9279 }
9280
9281 // override to initialize sounds
9282 protected void InitItemSounds()
9283 {
9284 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
9285 return;
9286
9288
9289 if (GetPlaceSoundset() != string.Empty)
9290 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
9291
9292 if (GetDeploySoundset() != string.Empty)
9293 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
9294
9295 SoundParameters params = new SoundParameters();
9296 params.m_Loop = true;
9297 if (GetLoopDeploySoundset() != string.Empty)
9298 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
9299 }
9300
9301 // Start sound using ItemSoundHandler
9302 void StartItemSoundServer(int id)
9303 {
9304 if (!GetGame().IsServer())
9305 return;
9306
9307 m_SoundSyncPlay = id;
9308 SetSynchDirty();
9309
9310 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
9312 }
9313
9314 // Stop sound using ItemSoundHandler
9315 void StopItemSoundServer(int id)
9316 {
9317 if (!GetGame().IsServer())
9318 return;
9319
9320 m_SoundSyncStop = id;
9321 SetSynchDirty();
9322
9323 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
9325 }
9326
9327 protected void ClearStartItemSoundServer()
9328 {
9329 m_SoundSyncPlay = 0;
9330 }
9331
9332 protected void ClearStopItemSoundServer()
9333 {
9334 m_SoundSyncStop = 0;
9335 }
9336
9338 void PlayAttachSound(string slot_type)
9339 {
9340 if (!GetGame().IsDedicatedServer())
9341 {
9342 if (ConfigIsExisting("attachSoundSet"))
9343 {
9344 string cfg_path = "";
9345 string soundset = "";
9346 string type_name = GetType();
9347
9348 TStringArray cfg_soundset_array = new TStringArray;
9349 TStringArray cfg_slot_array = new TStringArray;
9350 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9351 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9352
9353 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9354 {
9355 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9356 {
9357 if (cfg_slot_array[i] == slot_type)
9358 {
9359 soundset = cfg_soundset_array[i];
9360 break;
9361 }
9362 }
9363 }
9364
9365 if (soundset != "")
9366 {
9367 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
9368 sound.SetAutodestroy(true);
9369 }
9370 }
9371 }
9372 }
9373
9374 void PlayDetachSound(string slot_type)
9375 {
9376 //TODO - evaluate if needed and devise universal config structure if so
9377 }
9378
9379 void OnApply(PlayerBase player);
9380
9382 {
9383 return 1.0;
9384 };
9385 //returns applicable selection
9386 array<string> GetHeadHidingSelection()
9387 {
9389 }
9390
9392 {
9394 }
9395
9396 WrittenNoteData GetWrittenNoteData() {};
9397
9399 {
9400 SetDynamicPhysicsLifeTime(0.01);
9401 m_ItemBeingDroppedPhys = false;
9402 }
9403
9405 {
9406 array<string> zone_names = new array<string>;
9407 GetDamageZones(zone_names);
9408 for (int i = 0; i < zone_names.Count(); i++)
9409 {
9410 SetHealthMax(zone_names.Get(i),"Health");
9411 }
9412 SetHealthMax("","Health");
9413 }
9414
9416 void SetZoneDamageCEInit()
9417 {
9418 float global_health = GetHealth01("","Health");
9419 array<string> zones = new array<string>;
9420 GetDamageZones(zones);
9421 //set damage of all zones to match global health level
9422 for (int i = 0; i < zones.Count(); i++)
9423 {
9424 SetHealth01(zones.Get(i),"Health",global_health);
9425 }
9426 }
9427
9429 bool IsCoverFaceForShave(string slot_name)
9430 {
9431 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9432 }
9433
9434 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
9435 {
9436 if (!hasRootAsPlayer)
9437 {
9438 if (refParentIB)
9439 {
9440 // parent is wet
9441 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
9442 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9443 // parent has liquid inside
9444 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
9445 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9446 // drying
9447 else if (m_VarWet > m_VarWetMin)
9448 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
9449 }
9450 else
9451 {
9452 // drying on ground or inside non-itembase (car, ...)
9453 if (m_VarWet > m_VarWetMin)
9454 AddWet(-1 * delta * GetDryingIncrement("ground"));
9455 }
9456 }
9457 }
9458
9459 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
9460 {
9462 {
9463 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
9464 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9465 {
9466 float heatPermCoef = 1.0;
9467 EntityAI ent = this;
9468 while (ent)
9469 {
9470 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9471 ent = ent.GetHierarchyParent();
9472 }
9473
9474 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9475 }
9476 }
9477 }
9478
9479 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
9480 {
9481 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
9482 EntityAI parent = GetHierarchyParent();
9483 if (!parent)
9484 {
9485 hasParent = false;
9486 hasRootAsPlayer = false;
9487 }
9488 else
9489 {
9490 hasParent = true;
9491 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9492 refParentIB = ItemBase.Cast(parent);
9493 }
9494 }
9495
9496 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
9497 {
9498 // this is stub, implemented on Edible_Base
9499 }
9500
9501 bool CanDecay()
9502 {
9503 // return true used on selected food clases so they can decay
9504 return false;
9505 }
9506
9507 protected bool CanProcessDecay()
9508 {
9509 // this is stub, implemented on Edible_Base class
9510 // used to determine whether it is still necessary for the food to decay
9511 return false;
9512 }
9513
9514 protected bool CanHaveWetness()
9515 {
9516 // return true used on selected items that have a wetness effect
9517 return false;
9518 }
9519
9521 bool CanBeConsumed(ConsumeConditionData data = null)
9522 {
9523 return !GetIsFrozen() && IsOpen();
9524 }
9525
9526 override void ProcessVariables()
9527 {
9528 bool hasParent = false, hasRootAsPlayer = false;
9529 ItemBase refParentIB;
9530
9531 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
9532 bool foodDecay = g_Game.IsFoodDecayEnabled();
9533
9534 if (wwtu || foodDecay)
9535 {
9536 bool processWetness = wwtu && CanHaveWetness();
9537 bool processTemperature = wwtu && CanHaveTemperature();
9538 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
9539
9540 if (processWetness || processTemperature || processDecay)
9541 {
9542 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
9543
9544 if (processWetness)
9545 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9546
9547 if (processTemperature)
9548 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9549
9550 if (processDecay)
9551 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9552 }
9553 }
9554 }
9555
9558 {
9559 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
9560 }
9561
9562 override float GetTemperatureFreezeThreshold()
9563 {
9565 return Liquid.GetFreezeThreshold(GetLiquidType());
9566
9567 return super.GetTemperatureFreezeThreshold();
9568 }
9569
9570 override float GetTemperatureThawThreshold()
9571 {
9573 return Liquid.GetThawThreshold(GetLiquidType());
9574
9575 return super.GetTemperatureThawThreshold();
9576 }
9577
9578 override float GetItemOverheatThreshold()
9579 {
9581 return Liquid.GetBoilThreshold(GetLiquidType());
9582
9583 return super.GetItemOverheatThreshold();
9584 }
9585
9586 override float GetTemperatureFreezeTime()
9587 {
9588 if (HasQuantity())
9589 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
9590
9591 return super.GetTemperatureFreezeTime();
9592 }
9593
9594 override float GetTemperatureThawTime()
9595 {
9596 if (HasQuantity())
9597 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
9598
9599 return super.GetTemperatureThawTime();
9600 }
9601
9603 void AffectLiquidContainerOnFill(int liquid_type, float amount);
9605 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
9606
9607 bool IsCargoException4x3(EntityAI item)
9608 {
9609 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9610 }
9611
9613 {
9614 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
9615 }
9616
9618 void AddLightSourceItem(ItemBase lightsource)
9619 {
9620 m_LightSourceItem = lightsource;
9621 }
9622
9624 {
9625 m_LightSourceItem = null;
9626 }
9627
9629 {
9630 return m_LightSourceItem;
9631 }
9632
9634 array<int> GetValidFinishers()
9635 {
9636 return null;
9637 }
9638
9640 bool GetActionWidgetOverride(out typename name)
9641 {
9642 return false;
9643 }
9644
9645 bool PairWithDevice(notnull ItemBase otherDevice)
9646 {
9647 if (GetGame().IsServer())
9648 {
9649 ItemBase explosive = otherDevice;
9651 if (!trg)
9652 {
9653 trg = RemoteDetonatorTrigger.Cast(otherDevice);
9654 explosive = this;
9655 }
9656
9657 explosive.PairRemote(trg);
9658 trg.SetControlledDevice(explosive);
9659
9660 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
9661 trg.SetPersistentPairID(persistentID);
9662 explosive.SetPersistentPairID(persistentID);
9663
9664 return true;
9665 }
9666 return false;
9667 }
9668
9670 float GetBaitEffectivity()
9671 {
9672 float ret = 1.0;
9673 if (HasQuantity())
9674 ret *= GetQuantityNormalized();
9675 ret *= GetHealth01();
9676
9677 return ret;
9678 }
9679
9680 #ifdef DEVELOPER
9681 override void SetDebugItem()
9682 {
9683 super.SetDebugItem();
9684 _itemBase = this;
9685 }
9686
9687 override string GetDebugText()
9688 {
9689 string text = super.GetDebugText();
9690
9691 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
9692 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
9693
9694 return text;
9695 }
9696 #endif
9697
9698 bool CanBeUsedForSuicide()
9699 {
9700 return true;
9701 }
9702
9704 //DEPRECATED BELOW
9706 // Backwards compatibility
9707 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
9708 {
9709 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
9710 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
9711 }
9712
9713 // replaced by ItemSoundHandler
9714 protected EffectSound m_SoundDeployFinish;
9715 protected EffectSound m_SoundPlace;
9716 protected EffectSound m_DeployLoopSoundEx;
9717 protected EffectSound m_SoundDeploy;
9718 bool m_IsPlaceSound;
9719 bool m_IsDeploySound;
9721
9722 string GetDeployFinishSoundset();
9723 void PlayDeploySound();
9724 void PlayDeployFinishSound();
9725 void PlayPlaceSound();
9726 void PlayDeployLoopSoundEx();
9727 void StopDeployLoopSoundEx();
9728 void SoundSynchRemoteReset();
9729 void SoundSynchRemote();
9730 bool UsesGlobalDeploy(){return false;}
9731 bool CanPlayDeployLoopSound(){return false;}
9733 bool IsPlaceSound(){return m_IsPlaceSound;}
9734 bool IsDeploySound(){return m_IsDeploySound;}
9735 void SetIsPlaceSound(bool is_place_sound);
9736 void SetIsDeploySound(bool is_deploy_sound);
9737}
9738
9739EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
9740{
9741 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
9742 if (entity)
9743 {
9744 bool is_item = entity.IsInherited(ItemBase);
9745 if (is_item && full_quantity)
9746 {
9747 ItemBase item = ItemBase.Cast(entity);
9748 item.SetQuantity(item.GetQuantityInit());
9749 }
9750 }
9751 else
9752 {
9753 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
9754 return NULL;
9755 }
9756 return entity;
9757}
9758
9759void SetupSpawnedItem(ItemBase item, float health, float quantity)
9760{
9761 if (item)
9762 {
9763 if (health > 0)
9764 item.SetHealth("", "", health);
9765
9766 if (item.CanHaveTemperature())
9767 {
9768 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
9769 if (item.CanFreeze())
9770 item.SetFrozen(false);
9771 }
9772
9773 if (item.HasEnergyManager())
9774 {
9775 if (quantity >= 0)
9776 {
9777 item.GetCompEM().SetEnergy0To1(quantity);
9778 }
9779 else
9780 {
9781 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
9782 }
9783 }
9784 else if (item.IsMagazine())
9785 {
9786 Magazine mag = Magazine.Cast(item);
9787 if (quantity >= 0)
9788 {
9789 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
9790 }
9791 else
9792 {
9793 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
9794 }
9795
9796 }
9797 else
9798 {
9799 if (quantity >= 0)
9800 {
9801 item.SetQuantityNormalized(quantity, false);
9802 }
9803 else
9804 {
9805 item.SetQuantity(Math.AbsFloat(quantity));
9806 }
9807
9808 }
9809 }
9810}
9811
9812#ifdef DEVELOPER
9813ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
9814#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()

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