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

◆ GetActions()

override void SpawnItemOnLocation::GetActions ( typename action_input_type ,
out array< ActionBase_Basic > actions )
private

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

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