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

◆ OnOverheatingDecay()

void SpawnItemOnLocation::OnOverheatingDecay ( )
private

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

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