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

◆ RemoveAction()

void SpawnItemOnLocation::RemoveAction ( typename actionName )
private

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

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