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

◆ SetActions()

void SpawnItemOnLocation::SetActions ( )
private

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

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