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

◆ ToggleDebugActionsMask()

static void SpawnItemOnLocation::ToggleDebugActionsMask ( int mask)
staticprivate

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

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