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

◆ GetFilterDamageRatio()

override float GetFilterDamageRatio ( )
private

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

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