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

◆ GetOverheatingCoef()

float SpawnItemOnLocation::GetOverheatingCoef ( )
private

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

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

Используется в InventoryItem::UpdateAllOverheatingParticles().