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

◆ UnlockFromParent()

void SpawnItemOnLocation::UnlockFromParent ( )
private

Unlocks this item from its attachment slot of its parent.

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

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

Используется в DestroyPlant(), CarWheel_Ruined::EEHealthLevelChanged(), InventoryItemSuper::EEHealthLevelChanged() и RemovePlantEx().