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

◆ AddAction()

void SpawnItemOnLocation::AddAction ( typename actionName )
private

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

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