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

◆ RemoveAllAgents()

override void SpawnItemOnLocation::RemoveAllAgents ( )
protected

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

8647{
8648 override bool CanPutAsAttachment(EntityAI parent)
8649 {
8650 return true;
8651 }
8652};
8653
8654//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8655
8656class ItemBase extends InventoryItem
8657{
8661
8663
8664 static int m_DebugActionsMask;
8666 // ============================================
8667 // Variable Manipulation System
8668 // ============================================
8669 // Quantity
8670
8671 float m_VarQuantity;
8672 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8674 int m_VarQuantityMin;
8675 int m_VarQuantityMax;
8676 int m_Count;
8677 float m_VarStackMax;
8678 float m_StoreLoadedQuantity = float.LOWEST;
8679 // Wet
8680 float m_VarWet;
8681 float m_VarWetPrev;//for client to know wetness changed during synchronization
8682 float m_VarWetInit;
8683 float m_VarWetMin;
8684 float m_VarWetMax;
8685 // Cleanness
8686 int m_Cleanness;
8687 int m_CleannessInit;
8688 int m_CleannessMin;
8689 int m_CleannessMax;
8690 // impact sounds
8692 bool m_CanPlayImpactSound = true;
8693 float m_ImpactSpeed;
8695 //
8696 float m_HeatIsolation;
8697 float m_ItemModelLength;
8698 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8700 int m_VarLiquidType;
8701 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8702 int m_QuickBarBonus;
8703 bool m_IsBeingPlaced;
8704 bool m_IsHologram;
8705 bool m_IsTakeable;
8706 bool m_ThrowItemOnDrop;
8709 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8710 bool can_this_be_combined; //Check if item can be combined
8711 bool m_CanThisBeSplit; //Check if item can be split
8712 bool m_IsStoreLoad = false;
8713 bool m_CanShowQuantity;
8714 bool m_HasQuantityBar;
8715 protected bool m_CanBeDigged;
8716 protected bool m_IsResultOfSplit
8717
8718 string m_SoundAttType;
8719 // items color variables
8724 //-------------------------------------------------------
8725
8726 // light source managing
8728
8732
8733 //==============================================
8734 // agent system
8735 private int m_AttachedAgents;
8736
8738 void TransferModifiers(PlayerBase reciever);
8739
8740
8741 // Weapons & suppressors particle effects
8746 static int m_LastRegisteredWeaponID = 0;
8747
8748 // Overheating effects
8750 float m_OverheatingShots;
8751 ref Timer m_CheckOverheating;
8752 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8753 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8754 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8755 ref array <ref OverheatingParticle> m_OverheatingParticles;
8756
8758 protected bool m_HideSelectionsBySlot;
8759
8760 // Admin Log
8761 PluginAdminLog m_AdminLog;
8762
8763 // misc
8764 ref Timer m_PhysDropTimer;
8765
8766 // Attachment Locking variables
8767 ref array<int> m_CompatibleLocks;
8768 protected int m_LockType;
8769 protected ref EffectSound m_LockingSound;
8770 protected string m_LockSoundSet;
8771
8772 // ItemSoundHandler
8773 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8774 protected int m_SoundSyncPlay; // id for sound to play
8775 protected int m_SoundSyncStop; // id for sound to stop
8777
8778 //temperature
8779 private float m_TemperaturePerQuantityWeight;
8780
8781 // -------------------------------------------------------------------------
8782 void ItemBase()
8783 {
8784 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8788
8789 if (!GetGame().IsDedicatedServer())
8790 {
8791 if (HasMuzzle())
8792 {
8794
8796 {
8798 }
8799 }
8800
8802 m_ActionsInitialize = false;
8803 }
8804
8805 m_OldLocation = null;
8806
8807 if (GetGame().IsServer())
8808 {
8809 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8810 }
8811
8812 if (ConfigIsExisting("headSelectionsToHide"))
8813 {
8815 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8816 }
8817
8818 m_HideSelectionsBySlot = false;
8819 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8820 {
8821 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8822 }
8823
8824 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8825
8826 m_IsResultOfSplit = false;
8827
8829 }
8830
8831 override void InitItemVariables()
8832 {
8833 super.InitItemVariables();
8834
8835 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8836 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8837 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8838 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8839 m_VarStackMax = ConfigGetFloat("varStackMax");
8840 m_Count = ConfigGetInt("count");
8841
8842 m_CanShowQuantity = ConfigGetBool("quantityShow");
8843 m_HasQuantityBar = ConfigGetBool("quantityBar");
8844
8845 m_CleannessInit = ConfigGetInt("varCleannessInit");
8847 m_CleannessMin = ConfigGetInt("varCleannessMin");
8848 m_CleannessMax = ConfigGetInt("varCleannessMax");
8849
8850 m_WantPlayImpactSound = false;
8851 m_ImpactSpeed = 0.0;
8852
8853 m_VarWetInit = ConfigGetFloat("varWetInit");
8855 m_VarWetMin = ConfigGetFloat("varWetMin");
8856 m_VarWetMax = ConfigGetFloat("varWetMax");
8857
8858 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8859 if (IsLiquidContainer() && GetQuantity() != 0)
8861 m_IsBeingPlaced = false;
8862 m_IsHologram = false;
8863 m_IsTakeable = true;
8864 m_CanBeMovedOverride = false;
8868 m_CanBeDigged = ConfigGetBool("canBeDigged");
8869
8870 m_CompatibleLocks = new array<int>();
8871 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8872 m_LockType = ConfigGetInt("lockType");
8873
8874 //Define if item can be split and set ability to be combined accordingly
8875 m_CanThisBeSplit = false;
8876 can_this_be_combined = false;
8877 if (ConfigIsExisting("canBeSplit"))
8878 {
8879 can_this_be_combined = ConfigGetBool("canBeSplit");
8881 }
8882
8883 m_ItemBehaviour = -1;
8884 if (ConfigIsExisting("itemBehaviour"))
8885 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8886
8887 //RegisterNetSyncVariableInt("m_VariablesMask");
8888 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8889 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8890 RegisterNetSyncVariableInt("m_VarLiquidType");
8891 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8892
8893 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8894 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8895 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8896
8897 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8898 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8899 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8900 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8901
8902 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8903 RegisterNetSyncVariableBool("m_IsTakeable");
8904 RegisterNetSyncVariableBool("m_IsHologram");
8905
8906 InitItemSounds();
8908 {
8909 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8910 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8911 }
8912
8913 m_LockSoundSet = ConfigGetString("lockSoundSet");
8914
8916 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8917 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8918
8919 }
8920
8921 override int GetQuickBarBonus()
8922 {
8923 return m_QuickBarBonus;
8924 }
8925
8926 void InitializeActions()
8927 {
8929 if (!m_InputActionMap)
8930 {
8932 m_InputActionMap = iam;
8933 SetActions();
8935 }
8936 }
8937
8938 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8939 {
8941 {
8942 m_ActionsInitialize = true;
8944 }
8945
8946 actions = m_InputActionMap.Get(action_input_type);
8947 }
8948
8949 void SetActions()
8950 {
8951 AddAction(ActionTakeItem);
8952 AddAction(ActionTakeItemToHands);
8953 AddAction(ActionWorldCraft);
8955 AddAction(ActionAttachWithSwitch);
8956 }
8957
8958 void SetActionAnimOverrides(); // Override action animation for specific item
8959
8960 void AddAction(typename actionName)
8961 {
8962 ActionBase action = ActionManagerBase.GetAction(actionName);
8963
8964 if (!action)
8965 {
8966 Debug.LogError("Action " + actionName + " dosn't exist!");
8967 return;
8968 }
8969
8970 typename ai = action.GetInputType();
8971 if (!ai)
8972 {
8973 m_ActionsInitialize = false;
8974 return;
8975 }
8976
8977 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8978 if (!action_array)
8979 {
8980 action_array = new array<ActionBase_Basic>;
8981 m_InputActionMap.Insert(ai, action_array);
8982 }
8983 if (LogManager.IsActionLogEnable())
8984 {
8985 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8986 }
8987
8988 if (action_array.Find(action) != -1)
8989 {
8990 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8991 }
8992 else
8993 {
8994 action_array.Insert(action);
8995 }
8996 }
8997
8998 void RemoveAction(typename actionName)
8999 {
9000 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9001 ActionBase action = player.GetActionManager().GetAction(actionName);
9002 typename ai = action.GetInputType();
9003 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9004
9005 if (action_array)
9006 {
9007 action_array.RemoveItem(action);
9008 }
9009 }
9010
9011 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9012 // Set -1 for params which should stay in default state
9013 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9014 {
9015 ActionOverrideData overrideData = new ActionOverrideData();
9016 overrideData.m_CommandUID = commandUID;
9017 overrideData.m_CommandUIDProne = commandUIDProne;
9018 overrideData.m_StanceMask = stanceMask;
9019
9020 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9021 if (!actionMap) // create new map of action > overidables map
9022 {
9023 actionMap = new TActionAnimOverrideMap();
9024 m_ItemActionOverrides.Insert(action, actionMap);
9025 }
9026
9027 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9028
9029 }
9030
9031 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9032
9033 ScriptedLightBase GetLight();
9034
9035 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9036 void LoadParticleConfigOnFire(int id)
9037 {
9038 if (!m_OnFireEffect)
9040
9043
9044 string config_to_search = "CfgVehicles";
9045 string muzzle_owner_config;
9046
9047 if (!m_OnFireEffect.Contains(id))
9048 {
9049 if (IsInherited(Weapon))
9050 config_to_search = "CfgWeapons";
9051
9052 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9053
9054 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9055
9056 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
9057
9058 if (config_OnFire_subclass_count > 0)
9059 {
9060 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9061
9062 for (int i = 0; i < config_OnFire_subclass_count; i++)
9063 {
9064 string particle_class = "";
9065 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
9066 string config_OnFire_entry = config_OnFire_class + particle_class;
9067 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9068 WPOF_array.Insert(WPOF);
9069 }
9070
9071
9072 m_OnFireEffect.Insert(id, WPOF_array);
9073 }
9074 }
9075
9076 if (!m_OnBulletCasingEjectEffect.Contains(id))
9077 {
9078 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
9079 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9080
9081 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9082
9083 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9084
9085 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9086 {
9087 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9088
9089 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9090 {
9091 string particle_class2 = "";
9092 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9093 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9094 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9095 WPOBE_array.Insert(WPOBE);
9096 }
9097
9098
9099 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
9100 }
9101 }
9102 }
9103
9104 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9106 {
9109
9110 if (!m_OnOverheatingEffect.Contains(id))
9111 {
9112 string config_to_search = "CfgVehicles";
9113
9114 if (IsInherited(Weapon))
9115 config_to_search = "CfgWeapons";
9116
9117 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
9118 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9119
9120 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
9121 {
9122
9123 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
9124
9126 {
9127 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
9128 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9129 Error(error);
9130 return;
9131 }
9132
9133 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
9134 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
9135
9136
9137
9138 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
9139 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9140
9141 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9142 {
9143 string particle_class = "";
9144 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9145 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9146 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
9147
9148 if (entry_type == CT_CLASS)
9149 {
9150 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9151 WPOOH_array.Insert(WPOF);
9152 }
9153 }
9154
9155
9156 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9157 }
9158 }
9159 }
9160
9161 float GetOverheatingValue()
9162 {
9163 return m_OverheatingShots;
9164 }
9165
9166 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9167 {
9168 if (m_MaxOverheatingValue > 0)
9169 {
9171
9172 if (!m_CheckOverheating)
9174
9176 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9177
9178 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9179 }
9180 }
9181
9182 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9183 {
9185 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9186
9188 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9189
9191 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9192
9194 {
9196 }
9197 }
9198
9200 {
9202 }
9203
9204 void OnOverheatingDecay()
9205 {
9206 if (m_MaxOverheatingValue > 0)
9207 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9208 else
9210
9211 if (m_OverheatingShots <= 0)
9212 {
9215 }
9216 else
9217 {
9218 if (!m_CheckOverheating)
9220
9222 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9223 }
9224
9225 CheckOverheating(this, "", this);
9226 }
9227
9228 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9229 {
9231 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9232 }
9233
9234 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9235 {
9237 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9239 }
9240
9241 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9242 {
9244 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9245 }
9246
9247 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9248 {
9250 m_OverheatingParticles = new array<ref OverheatingParticle>;
9251
9252 OverheatingParticle OP = new OverheatingParticle();
9253 OP.RegisterParticle(p);
9254 OP.SetOverheatingLimitMin(min_heat_coef);
9255 OP.SetOverheatingLimitMax(max_heat_coef);
9256 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9257
9258 m_OverheatingParticles.Insert(OP);
9259 }
9260
9261 float GetOverheatingCoef()
9262 {
9263 if (m_MaxOverheatingValue > 0)
9265
9266 return -1;
9267 }
9268
9270 {
9272 {
9273 float overheat_coef = GetOverheatingCoef();
9274 int count = m_OverheatingParticles.Count();
9275
9276 for (int i = count; i > 0; --i)
9277 {
9278 int id = i - 1;
9279 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9280 Particle p = OP.GetParticle();
9281
9282 float overheat_min = OP.GetOverheatingLimitMin();
9283 float overheat_max = OP.GetOverheatingLimitMax();
9284
9285 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9286 {
9287 if (p)
9288 {
9289 p.Stop();
9290 OP.RegisterParticle(null);
9291 }
9292 }
9293 }
9294 }
9295 }
9296
9298 {
9300 {
9301 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9302 {
9303 int id = i - 1;
9304 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9305
9306 if (OP)
9307 {
9308 Particle p = OP.GetParticle();
9309
9310 if (p)
9311 {
9312 p.Stop();
9313 }
9314
9315 delete OP;
9316 }
9317 }
9318
9319 m_OverheatingParticles.Clear();
9321 }
9322 }
9323
9325 float GetInfectionChance(int system = 0, Param param = null)
9326 {
9327 return 0.0;
9328 }
9329
9330
9331 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9332 {
9333 return 250;//default value
9334 }
9335
9336 float GetFilterDamageRatio()
9337 {
9338 return 0;
9339 }
9340
9342 bool HasMuzzle()
9343 {
9344 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9345 return true;
9346
9347 return false;
9348 }
9349
9351 int GetMuzzleID()
9352 {
9353 if (!m_WeaponTypeToID)
9355
9356 if (m_WeaponTypeToID.Contains(GetType()))
9357 {
9358 return m_WeaponTypeToID.Get(GetType());
9359 }
9360 else
9361 {
9362 // Register new weapon ID
9364 }
9365
9367 }
9368
9375 {
9376 return -1;
9377 }
9378
9379
9380
9381 // -------------------------------------------------------------------------
9382 void ~ItemBase()
9383 {
9384 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
9385 {
9386 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9387 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9388
9389 if (r_index >= 0)
9390 {
9391 InventoryLocation r_il = new InventoryLocation;
9392 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9393
9394 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9395 int r_type = r_il.GetType();
9396 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9397 {
9398 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9399 }
9400 else if (r_type == InventoryLocationType.ATTACHMENT)
9401 {
9402 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9403 }
9404
9405 }
9406
9407 player.GetHumanInventory().ClearUserReservedLocation(this);
9408 }
9409
9410 if (m_LockingSound)
9411 SEffectManager.DestroyEffect(m_LockingSound);
9412 }
9413
9414
9415
9416 // -------------------------------------------------------------------------
9417 static int GetDebugActionsMask()
9418 {
9419 return ItemBase.m_DebugActionsMask;
9420 }
9421
9422 static bool HasDebugActionsMask(int mask)
9423 {
9424 return ItemBase.m_DebugActionsMask & mask;
9425 }
9426
9427 static void SetDebugActionsMask(int mask)
9428 {
9429 ItemBase.m_DebugActionsMask = mask;
9430 }
9431
9432 static void AddDebugActionsMask(int mask)
9433 {
9434 ItemBase.m_DebugActionsMask |= mask;
9435 }
9436
9437 static void RemoveDebugActionsMask(int mask)
9438 {
9439 ItemBase.m_DebugActionsMask &= ~mask;
9440 }
9441
9442 static void ToggleDebugActionsMask(int mask)
9443 {
9444 if (HasDebugActionsMask(mask))
9445 {
9447 }
9448 else
9449 {
9450 AddDebugActionsMask(mask);
9451 }
9452 }
9453
9454 // -------------------------------------------------------------------------
9455 void SetCEBasedQuantity()
9456 {
9457 if (GetEconomyProfile())
9458 {
9459 float q_max = GetEconomyProfile().GetQuantityMax();
9460 if (q_max > 0)
9461 {
9462 float q_min = GetEconomyProfile().GetQuantityMin();
9463 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9464
9465 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9466 {
9467 ComponentEnergyManager comp = GetCompEM();
9468 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
9469 {
9470 comp.SetEnergy0To1(quantity_randomized);
9471 }
9472 }
9473 else if (HasQuantity())
9474 {
9475 SetQuantityNormalized(quantity_randomized, false);
9476 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9477 }
9478
9479 }
9480 }
9481 }
9482
9484 void LockToParent()
9485 {
9486 EntityAI parent = GetHierarchyParent();
9487
9488 if (parent)
9489 {
9490 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9491 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9492 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9493 }
9494 }
9495
9497 void UnlockFromParent()
9498 {
9499 EntityAI parent = GetHierarchyParent();
9500
9501 if (parent)
9502 {
9503 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9504 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9505 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9506 }
9507 }
9508
9509 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9510 {
9511 /*
9512 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9513 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
9514 */
9515 ItemBase item2 = ItemBase.Cast(entity2);
9516
9517 if (GetGame().IsClient())
9518 {
9519 if (ScriptInputUserData.CanStoreInputUserData())
9520 {
9521 ScriptInputUserData ctx = new ScriptInputUserData;
9523 ctx.Write(-1);
9524 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9525 ctx.Write(i1);
9526 ctx.Write(item2);
9527 ctx.Write(use_stack_max);
9528 ctx.Write(-1);
9529 ctx.Send();
9530
9531 if (IsCombineAll(item2, use_stack_max))
9532 {
9533 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9534 }
9535 }
9536 }
9537 else if (!GetGame().IsMultiplayer())
9538 {
9539 CombineItems(item2, use_stack_max);
9540 }
9541 }
9542
9543 bool IsLiquidPresent()
9544 {
9545 return (GetLiquidType() != 0 && HasQuantity());
9546 }
9547
9548 bool IsLiquidContainer()
9549 {
9550 return m_LiquidContainerMask != 0;
9551 }
9552
9554 {
9555 return m_LiquidContainerMask;
9556 }
9557
9558 bool IsBloodContainer()
9559 {
9560 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9561 return false;
9562 }
9563
9564 bool IsNVG()
9565 {
9566 return false;
9567 }
9568
9571 bool IsExplosive()
9572 {
9573 return false;
9574 }
9575
9577 {
9578 return "";
9579 }
9580
9582
9583 bool IsLightSource()
9584 {
9585 return false;
9586 }
9587
9589 {
9590 return true;
9591 }
9592
9593 //--- ACTION CONDITIONS
9594 //direction
9595 bool IsFacingPlayer(PlayerBase player, string selection)
9596 {
9597 return true;
9598 }
9599
9600 bool IsPlayerInside(PlayerBase player, string selection)
9601 {
9602 return true;
9603 }
9604
9605 override bool CanObstruct()
9606 {
9607 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9608 return !player || !IsPlayerInside(player, "");
9609 }
9610
9611 override bool IsBeingPlaced()
9612 {
9613 return m_IsBeingPlaced;
9614 }
9615
9616 void SetIsBeingPlaced(bool is_being_placed)
9617 {
9618 m_IsBeingPlaced = is_being_placed;
9619 if (!is_being_placed)
9621 SetSynchDirty();
9622 }
9623
9624 //server-side
9625 void OnEndPlacement() {}
9626
9627 override bool IsHologram()
9628 {
9629 return m_IsHologram;
9630 }
9631
9632 bool CanBeDigged()
9633 {
9634 return m_CanBeDigged;
9635 }
9636
9638 {
9639 return 1;
9640 }
9641
9642 bool CanMakeGardenplot()
9643 {
9644 return false;
9645 }
9646
9647 void SetIsHologram(bool is_hologram)
9648 {
9649 m_IsHologram = is_hologram;
9650 SetSynchDirty();
9651 }
9652 /*
9653 protected float GetNutritionalEnergy()
9654 {
9655 Edible_Base edible = Edible_Base.Cast(this);
9656 return edible.GetFoodEnergy();
9657 }
9658
9659 protected float GetNutritionalWaterContent()
9660 {
9661 Edible_Base edible = Edible_Base.Cast(this);
9662 return edible.GetFoodWater();
9663 }
9664
9665 protected float GetNutritionalIndex()
9666 {
9667 Edible_Base edible = Edible_Base.Cast(this);
9668 return edible.GetFoodNutritionalIndex();
9669 }
9670
9671 protected float GetNutritionalFullnessIndex()
9672 {
9673 Edible_Base edible = Edible_Base.Cast(this);
9674 return edible.GetFoodTotalVolume();
9675 }
9676
9677 protected float GetNutritionalToxicity()
9678 {
9679 Edible_Base edible = Edible_Base.Cast(this);
9680 return edible.GetFoodToxicity();
9681
9682 }
9683 */
9684
9685
9686 // -------------------------------------------------------------------------
9687 override void OnMovedInsideCargo(EntityAI container)
9688 {
9689 super.OnMovedInsideCargo(container);
9690
9691 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9692 }
9693
9694 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9695 {
9696 super.EEItemLocationChanged(oldLoc,newLoc);
9697
9698 PlayerBase new_player = null;
9699 PlayerBase old_player = null;
9700
9701 if (newLoc.GetParent())
9702 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9703
9704 if (oldLoc.GetParent())
9705 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9706
9707 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
9708 {
9709 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9710
9711 if (r_index >= 0)
9712 {
9713 InventoryLocation r_il = new InventoryLocation;
9714 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9715
9716 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9717 int r_type = r_il.GetType();
9718 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9719 {
9720 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9721 }
9722 else if (r_type == InventoryLocationType.ATTACHMENT)
9723 {
9724 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9725 }
9726
9727 }
9728 }
9729
9730 if (newLoc.GetType() == InventoryLocationType.HANDS)
9731 {
9732 if (new_player)
9733 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9734
9735 if (new_player == old_player)
9736 {
9737
9738 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9739 {
9740 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9741 {
9742 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9743 {
9744 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9745 }
9746 }
9747 else
9748 {
9749 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9750 }
9751 }
9752
9753 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9754 {
9755 int type = oldLoc.GetType();
9756 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9757 {
9758 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9759 }
9760 else if (type == InventoryLocationType.ATTACHMENT)
9761 {
9762 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9763 }
9764 }
9765 if (!m_OldLocation)
9766 {
9767 m_OldLocation = new InventoryLocation;
9768 }
9769 m_OldLocation.Copy(oldLoc);
9770 }
9771 else
9772 {
9773 if (m_OldLocation)
9774 {
9775 m_OldLocation.Reset();
9776 }
9777 }
9778
9780 }
9781 else
9782 {
9783 if (new_player)
9784 {
9785 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9786 if (res_index >= 0)
9787 {
9788 InventoryLocation il = new InventoryLocation;
9789 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9790 ItemBase it = ItemBase.Cast(il.GetItem());
9791 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9792 int rel_type = il.GetType();
9793 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9794 {
9795 il.GetParent().GetOnReleaseLock().Invoke(it);
9796 }
9797 else if (rel_type == InventoryLocationType.ATTACHMENT)
9798 {
9799 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9800 }
9801 //it.GetOnReleaseLock().Invoke(it);
9802 }
9803 }
9804 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9805 {
9806 //ThrowPhysically(old_player, vector.Zero);
9807 m_ThrowItemOnDrop = false;
9808 }
9809
9810 if (m_OldLocation)
9811 {
9812 m_OldLocation.Reset();
9813 }
9814 }
9815 }
9816
9817 override void EOnContact(IEntity other, Contact extra)
9818 {
9820 {
9821 int liquidType = -1;
9822 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9823 if (impactSpeed > 0.0)
9824 {
9825 m_ImpactSpeed = impactSpeed;
9826 #ifndef SERVER
9827 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9828 #else
9829 m_WantPlayImpactSound = true;
9830 SetSynchDirty();
9831 #endif
9832 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9833 }
9834 }
9835
9836 #ifdef SERVER
9837 if (GetCompEM() && GetCompEM().IsPlugged())
9838 {
9839 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9840 GetCompEM().UnplugThis();
9841 }
9842 #endif
9843 }
9844
9845 void RefreshPhysics();
9846
9847 override void OnCreatePhysics()
9848 {
9850 }
9851
9852 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9853 {
9854
9855 }
9856 // -------------------------------------------------------------------------
9857 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9858 {
9859 super.OnItemLocationChanged(old_owner, new_owner);
9860
9861 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9862 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9863
9864 if (!relatedPlayer && playerNew)
9865 relatedPlayer = playerNew;
9866
9867 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9868 {
9869 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9870 if (actionMgr)
9871 {
9872 ActionBase currentAction = actionMgr.GetRunningAction();
9873 if (currentAction)
9874 currentAction.OnItemLocationChanged(this);
9875 }
9876 }
9877
9878 Man ownerPlayerOld = null;
9879 Man ownerPlayerNew = null;
9880
9881 if (old_owner)
9882 {
9883 if (old_owner.IsMan())
9884 {
9885 ownerPlayerOld = Man.Cast(old_owner);
9886 }
9887 else
9888 {
9889 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9890 }
9891 }
9892 else
9893 {
9894 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9895 {
9896 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9897
9898 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9899 {
9900 GetCompEM().UnplugThis();
9901 }
9902 }
9903 }
9904
9905 if (new_owner)
9906 {
9907 if (new_owner.IsMan())
9908 {
9909 ownerPlayerNew = Man.Cast(new_owner);
9910 }
9911 else
9912 {
9913 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9914 }
9915 }
9916
9917 if (ownerPlayerOld != ownerPlayerNew)
9918 {
9919 if (ownerPlayerOld)
9920 {
9921 array<EntityAI> subItemsExit = new array<EntityAI>;
9922 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9923 for (int i = 0; i < subItemsExit.Count(); i++)
9924 {
9925 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9926 itemExit.OnInventoryExit(ownerPlayerOld);
9927 }
9928 }
9929
9930 if (ownerPlayerNew)
9931 {
9932 array<EntityAI> subItemsEnter = new array<EntityAI>;
9933 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9934 for (int j = 0; j < subItemsEnter.Count(); j++)
9935 {
9936 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9937 itemEnter.OnInventoryEnter(ownerPlayerNew);
9938 }
9939 }
9940 }
9941 else if (ownerPlayerNew != null)
9942 {
9943 PlayerBase nplayer;
9944 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9945 {
9946 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9947 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9948 for (int k = 0; k < subItemsUpdate.Count(); k++)
9949 {
9950 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9951 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9952 }
9953 }
9954 }
9955
9956 if (old_owner)
9957 old_owner.OnChildItemRemoved(this);
9958 if (new_owner)
9959 new_owner.OnChildItemReceived(this);
9960 }
9961
9962 // -------------------------------------------------------------------------------
9963 override void EEDelete(EntityAI parent)
9964 {
9965 super.EEDelete(parent);
9966 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9967 if (player)
9968 {
9969 OnInventoryExit(player);
9970
9971 if (player.IsAlive())
9972 {
9973 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9974 if (r_index >= 0)
9975 {
9976 InventoryLocation r_il = new InventoryLocation;
9977 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9978
9979 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9980 int r_type = r_il.GetType();
9981 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9982 {
9983 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9984 }
9985 else if (r_type == InventoryLocationType.ATTACHMENT)
9986 {
9987 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9988 }
9989
9990 }
9991
9992 player.RemoveQuickBarEntityShortcut(this);
9993 }
9994 }
9995 }
9996 // -------------------------------------------------------------------------------
9997 override void EEKilled(Object killer)
9998 {
9999 super.EEKilled(killer);
10000
10002 if (killer && killer.IsFireplace() && CanExplodeInFire())
10003 {
10004 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10005 {
10006 if (IsMagazine())
10007 {
10008 if (Magazine.Cast(this).GetAmmoCount() > 0)
10009 {
10010 ExplodeAmmo();
10011 }
10012 }
10013 else
10014 {
10015 Explode(DamageType.EXPLOSION);
10016 }
10017 }
10018 }
10019 }
10020
10021 override void OnWasAttached(EntityAI parent, int slot_id)
10022 {
10023 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10024
10025 super.OnWasAttached(parent, slot_id);
10026
10027 if (HasQuantity())
10028 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10029
10030 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
10031 }
10032
10033 override void OnWasDetached(EntityAI parent, int slot_id)
10034 {
10035 super.OnWasDetached(parent, slot_id);
10036
10037 if (HasQuantity())
10038 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10039 }
10040
10041 override string ChangeIntoOnAttach(string slot)
10042 {
10043 int idx;
10044 TStringArray inventory_slots = new TStringArray;
10045 TStringArray attach_types = new TStringArray;
10046
10047 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10048 if (inventory_slots.Count() < 1) //is string
10049 {
10050 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10051 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10052 }
10053 else //is array
10054 {
10055 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10056 }
10057
10058 idx = inventory_slots.Find(slot);
10059 if (idx < 0)
10060 return "";
10061
10062 return attach_types.Get(idx);
10063 }
10064
10065 override string ChangeIntoOnDetach()
10066 {
10067 int idx = -1;
10068 string slot;
10069
10070 TStringArray inventory_slots = new TStringArray;
10071 TStringArray detach_types = new TStringArray;
10072
10073 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10074 if (inventory_slots.Count() < 1) //is string
10075 {
10076 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10077 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10078 }
10079 else //is array
10080 {
10081 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10082 if (detach_types.Count() < 1)
10083 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10084 }
10085
10086 for (int i = 0; i < inventory_slots.Count(); i++)
10087 {
10088 slot = inventory_slots.Get(i);
10089 }
10090
10091 if (slot != "")
10092 {
10093 if (detach_types.Count() == 1)
10094 idx = 0;
10095 else
10096 idx = inventory_slots.Find(slot);
10097 }
10098 if (idx < 0)
10099 return "";
10100
10101 return detach_types.Get(idx);
10102 }
10103
10104 void ExplodeAmmo()
10105 {
10106 //timer
10107 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
10108
10109 //min/max time
10110 float min_time = 1;
10111 float max_time = 3;
10112 float delay = Math.RandomFloat(min_time, max_time);
10113
10114 explode_timer.Run(delay, this, "DoAmmoExplosion");
10115 }
10116
10117 void DoAmmoExplosion()
10118 {
10119 Magazine magazine = Magazine.Cast(this);
10120 int pop_sounds_count = 6;
10121 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10122
10123 //play sound
10124 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10125 string sound_name = pop_sounds[ sound_idx ];
10126 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
10127
10128 //remove ammo count
10129 magazine.ServerAddAmmoCount(-1);
10130
10131 //if condition then repeat -> ExplodeAmmo
10132 float min_temp_to_explode = 100; //min temperature for item to explode
10133
10134 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
10135 {
10136 ExplodeAmmo();
10137 }
10138 }
10139
10140 // -------------------------------------------------------------------------------
10141 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
10142 {
10143 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
10144
10145 const int CHANCE_DAMAGE_CARGO = 4;
10146 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10147 const int CHANCE_DAMAGE_NOTHING = 2;
10148
10149 if (IsClothing() || IsContainer() || IsItemTent())
10150 {
10151 float dmg = damageResult.GetDamage("","Health") * -0.5;
10152 int chances;
10153 int rnd;
10154
10155 if (GetInventory().GetCargo())
10156 {
10157 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10158 rnd = Math.RandomInt(0,chances);
10159
10160 if (rnd < CHANCE_DAMAGE_CARGO)
10161 {
10162 DamageItemInCargo(dmg);
10163 }
10164 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10165 {
10167 }
10168 }
10169 else
10170 {
10171 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10172 rnd = Math.RandomInt(0,chances);
10173
10174 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10175 {
10177 }
10178 }
10179 }
10180 }
10181
10182 bool DamageItemInCargo(float damage)
10183 {
10184 if (GetInventory().GetCargo())
10185 {
10186 int item_count = GetInventory().GetCargo().GetItemCount();
10187 if (item_count > 0)
10188 {
10189 int random_pick = Math.RandomInt(0, item_count);
10190 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
10191 if (!item.IsExplosive())
10192 {
10193 item.AddHealth("","",damage);
10194 return true;
10195 }
10196 }
10197 }
10198 return false;
10199 }
10200
10201 bool DamageItemAttachments(float damage)
10202 {
10203 int attachment_count = GetInventory().AttachmentCount();
10204 if (attachment_count > 0)
10205 {
10206 int random_pick = Math.RandomInt(0, attachment_count);
10207 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10208 if (!attachment.IsExplosive())
10209 {
10210 attachment.AddHealth("","",damage);
10211 return true;
10212 }
10213 }
10214 return false;
10215 }
10216
10217 override bool IsSplitable()
10218 {
10219 return m_CanThisBeSplit;
10220 }
10221 //----------------
10222 override bool CanBeSplit()
10223 {
10224 if (IsSplitable() && (GetQuantity() > 1))
10225 return GetInventory().CanRemoveEntity();
10226
10227 return false;
10228 }
10229
10230 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10231 {
10232 if (!CanBeSplit())
10233 return;
10234
10235 if (GetGame().IsClient())
10236 {
10237 if (ScriptInputUserData.CanStoreInputUserData())
10238 {
10239 ScriptInputUserData ctx = new ScriptInputUserData;
10241 ctx.Write(1);
10242 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10243 ctx.Write(i1);
10244 ctx.Write(destination_entity);
10245 ctx.Write(true);
10246 ctx.Write(slot_id);
10247 ctx.Send();
10248 }
10249 }
10250 else if (!GetGame().IsMultiplayer())
10251 {
10252 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
10253 }
10254 }
10255
10256 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10257 {
10258 if (!CanBeSplit())
10259 return;
10260
10261 float split_quantity_new;
10262 ref ItemBase new_item;
10263 float quantity = GetQuantity();
10264 float stack_max = GetTargetQuantityMax(slot_id);
10265 InventoryLocation loc = new InventoryLocation;
10266
10267 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10268 {
10269 if (stack_max <= GetQuantity())
10270 split_quantity_new = stack_max;
10271 else
10272 split_quantity_new = GetQuantity();
10273
10274 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10275 if (new_item)
10276 {
10277 new_item.SetResultOfSplit(true);
10278 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10279 AddQuantity(-split_quantity_new);
10280 new_item.SetQuantity(split_quantity_new);
10281 }
10282 }
10283 else if (destination_entity && slot_id == -1)
10284 {
10285 if (quantity > stack_max)
10286 split_quantity_new = stack_max;
10287 else
10288 split_quantity_new = quantity;
10289
10290 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10291 {
10292 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10293 new_item = ItemBase.Cast(o);
10294 }
10295
10296 if (new_item)
10297 {
10298 new_item.SetResultOfSplit(true);
10299 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10300 AddQuantity(-split_quantity_new);
10301 new_item.SetQuantity(split_quantity_new);
10302 }
10303 }
10304 else
10305 {
10306 if (stack_max != 0)
10307 {
10308 if (stack_max < GetQuantity())
10309 {
10310 split_quantity_new = GetQuantity() - stack_max;
10311 }
10312
10313 if (split_quantity_new == 0)
10314 {
10315 if (!GetGame().IsMultiplayer())
10316 player.PhysicalPredictiveDropItem(this);
10317 else
10318 player.ServerDropEntity(this);
10319 return;
10320 }
10321
10322 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10323
10324 if (new_item)
10325 {
10326 new_item.SetResultOfSplit(true);
10327 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10328 SetQuantity(split_quantity_new);
10329 new_item.SetQuantity(stack_max);
10330 new_item.PlaceOnSurface();
10331 }
10332 }
10333 }
10334 }
10335
10336 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10337 {
10338 if (!CanBeSplit())
10339 return;
10340
10341 float split_quantity_new;
10342 ref ItemBase new_item;
10343 float quantity = GetQuantity();
10344 float stack_max = GetTargetQuantityMax(slot_id);
10345 InventoryLocation loc = new InventoryLocation;
10346
10347 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10348 {
10349 if (stack_max <= GetQuantity())
10350 split_quantity_new = stack_max;
10351 else
10352 split_quantity_new = GetQuantity();
10353
10354 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10355 if (new_item)
10356 {
10357 new_item.SetResultOfSplit(true);
10358 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10359 AddQuantity(-split_quantity_new);
10360 new_item.SetQuantity(split_quantity_new);
10361 }
10362 }
10363 else if (destination_entity && slot_id == -1)
10364 {
10365 if (quantity > stack_max)
10366 split_quantity_new = stack_max;
10367 else
10368 split_quantity_new = quantity;
10369
10370 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10371 {
10372 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10373 new_item = ItemBase.Cast(o);
10374 }
10375
10376 if (new_item)
10377 {
10378 new_item.SetResultOfSplit(true);
10379 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10380 AddQuantity(-split_quantity_new);
10381 new_item.SetQuantity(split_quantity_new);
10382 }
10383 }
10384 else
10385 {
10386 if (stack_max != 0)
10387 {
10388 if (stack_max < GetQuantity())
10389 {
10390 split_quantity_new = GetQuantity() - stack_max;
10391 }
10392
10393 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10394
10395 if (new_item)
10396 {
10397 new_item.SetResultOfSplit(true);
10398 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10399 SetQuantity(split_quantity_new);
10400 new_item.SetQuantity(stack_max);
10401 new_item.PlaceOnSurface();
10402 }
10403 }
10404 }
10405 }
10406
10407 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10408 {
10409 if (!CanBeSplit())
10410 return;
10411
10412 if (GetGame().IsClient())
10413 {
10414 if (ScriptInputUserData.CanStoreInputUserData())
10415 {
10416 ScriptInputUserData ctx = new ScriptInputUserData;
10418 ctx.Write(4);
10419 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10420 ctx.Write(thiz);
10421 dst.WriteToContext(ctx);
10422 ctx.Send();
10423 }
10424 }
10425 else if (!GetGame().IsMultiplayer())
10426 {
10428 }
10429 }
10430
10431 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10432 {
10433 if (!CanBeSplit())
10434 return;
10435
10436 if (GetGame().IsClient())
10437 {
10438 if (ScriptInputUserData.CanStoreInputUserData())
10439 {
10440 ScriptInputUserData ctx = new ScriptInputUserData;
10442 ctx.Write(2);
10443 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10444 ctx.Write(dummy);
10445 ctx.Write(destination_entity);
10446 ctx.Write(true);
10447 ctx.Write(idx);
10448 ctx.Write(row);
10449 ctx.Write(col);
10450 ctx.Send();
10451 }
10452 }
10453 else if (!GetGame().IsMultiplayer())
10454 {
10455 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10456 }
10457 }
10458
10459 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10460 {
10462 }
10463
10464 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10465 {
10466 if (!CanBeSplit())
10467 return this;
10468
10469 float quantity = GetQuantity();
10470 float split_quantity_new;
10471 ItemBase new_item;
10472 if (dst.IsValid())
10473 {
10474 int slot_id = dst.GetSlot();
10475 float stack_max = GetTargetQuantityMax(slot_id);
10476
10477 if (quantity > stack_max)
10478 split_quantity_new = stack_max;
10479 else
10480 split_quantity_new = quantity;
10481
10482 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10483
10484 if (new_item)
10485 {
10486 new_item.SetResultOfSplit(true);
10487 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10488 AddQuantity(-split_quantity_new);
10489 new_item.SetQuantity(split_quantity_new);
10490 }
10491
10492 return new_item;
10493 }
10494
10495 return null;
10496 }
10497
10498 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10499 {
10500 if (!CanBeSplit())
10501 return;
10502
10503 float quantity = GetQuantity();
10504 float split_quantity_new;
10505 ref ItemBase new_item;
10506 if (destination_entity)
10507 {
10508 float stackable = GetTargetQuantityMax();
10509 if (quantity > stackable)
10510 split_quantity_new = stackable;
10511 else
10512 split_quantity_new = quantity;
10513
10514 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10515 if (new_item)
10516 {
10517 new_item.SetResultOfSplit(true);
10518 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10519 AddQuantity(-split_quantity_new);
10520 new_item.SetQuantity(split_quantity_new);
10521 }
10522 }
10523 }
10524
10525 void SplitIntoStackMaxHandsClient(PlayerBase player)
10526 {
10527 if (!CanBeSplit())
10528 return;
10529
10530 if (GetGame().IsClient())
10531 {
10532 if (ScriptInputUserData.CanStoreInputUserData())
10533 {
10534 ScriptInputUserData ctx = new ScriptInputUserData;
10536 ctx.Write(3);
10537 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10538 ctx.Write(i1);
10539 ItemBase destination_entity = this;
10540 ctx.Write(destination_entity);
10541 ctx.Write(true);
10542 ctx.Write(0);
10543 ctx.Send();
10544 }
10545 }
10546 else if (!GetGame().IsMultiplayer())
10547 {
10548 SplitIntoStackMaxHands(player);
10549 }
10550 }
10551
10552 void SplitIntoStackMaxHands(PlayerBase player)
10553 {
10554 if (!CanBeSplit())
10555 return;
10556
10557 float quantity = GetQuantity();
10558 float split_quantity_new;
10559 ref ItemBase new_item;
10560 if (player)
10561 {
10562 float stackable = GetTargetQuantityMax();
10563 if (quantity > stackable)
10564 split_quantity_new = stackable;
10565 else
10566 split_quantity_new = quantity;
10567
10568 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10569 new_item = ItemBase.Cast(in_hands);
10570 if (new_item)
10571 {
10572 new_item.SetResultOfSplit(true);
10573 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10574 AddQuantity(-split_quantity_new);
10575 new_item.SetQuantity(split_quantity_new);
10576 }
10577 }
10578 }
10579
10580 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10581 {
10582 if (!CanBeSplit())
10583 return;
10584
10585 float quantity = GetQuantity();
10586 float split_quantity_new = Math.Floor(quantity * 0.5);
10587
10588 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10589
10590 if (new_item)
10591 {
10592 if (new_item.GetQuantityMax() < split_quantity_new)
10593 {
10594 split_quantity_new = new_item.GetQuantityMax();
10595 }
10596
10597 new_item.SetResultOfSplit(true);
10598 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10599
10600 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10601 {
10602 AddQuantity(-1);
10603 new_item.SetQuantity(1);
10604 }
10605 else
10606 {
10607 AddQuantity(-split_quantity_new);
10608 new_item.SetQuantity(split_quantity_new);
10609 }
10610 }
10611 }
10612
10613 void SplitItem(PlayerBase player)
10614 {
10615 if (!CanBeSplit())
10616 return;
10617
10618 float quantity = GetQuantity();
10619 float split_quantity_new = Math.Floor(quantity / 2);
10620
10621 InventoryLocation invloc = new InventoryLocation;
10622 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10623
10624 ItemBase new_item;
10625 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10626
10627 if (new_item)
10628 {
10629 if (new_item.GetQuantityMax() < split_quantity_new)
10630 {
10631 split_quantity_new = new_item.GetQuantityMax();
10632 }
10633 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10634 {
10635 AddQuantity(-1);
10636 new_item.SetQuantity(1);
10637 }
10638 else
10639 {
10640 AddQuantity(-split_quantity_new);
10641 new_item.SetQuantity(split_quantity_new);
10642 }
10643 }
10644 }
10645
10647 void OnQuantityChanged(float delta)
10648 {
10649 SetWeightDirty();
10650 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10651
10652 if (parent)
10653 parent.OnAttachmentQuantityChangedEx(this, delta);
10654
10655 if (IsLiquidContainer())
10656 {
10657 if (GetQuantityNormalized() <= 0.0)
10658 {
10660 }
10661 else if (GetLiquidType() == LIQUID_NONE)
10662 {
10663 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10665 }
10666 }
10667
10668 }
10669
10672 {
10673 // insert code here
10674 }
10675
10677 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10678 {
10680 }
10681
10682 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10683 {
10684 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10685
10686 if (GetGame().IsServer())
10687 {
10688 if (newLevel == GameConstants.STATE_RUINED)
10689 {
10691 EntityAI parent = GetHierarchyParent();
10692 if (parent && parent.IsFireplace())
10693 {
10694 CargoBase cargo = GetInventory().GetCargo();
10695 if (cargo)
10696 {
10697 for (int i = 0; i < cargo.GetItemCount(); ++i)
10698 {
10699 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10700 }
10701 }
10702 }
10703 }
10704
10705 if (IsResultOfSplit())
10706 {
10707 // reset the splitting result flag, return to normal item behavior
10708 SetResultOfSplit(false);
10709 return;
10710 }
10711
10712 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10713 {
10714 SetCleanness(0);//unclean the item upon damage dealt
10715 }
10716 }
10717 }
10718
10719 // just the split? TODO: verify
10720 override void OnRightClick()
10721 {
10722 super.OnRightClick();
10723
10724 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
10725 {
10726 if (GetGame().IsClient())
10727 {
10728 if (ScriptInputUserData.CanStoreInputUserData())
10729 {
10730 vector m4[4];
10731 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
10732
10733 EntityAI root = GetHierarchyRoot();
10734
10735 InventoryLocation dst = new InventoryLocation;
10736 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
10737 {
10738 if (root)
10739 {
10740 root.GetTransform(m4);
10741 dst.SetGround(this, m4);
10742 }
10743 else
10744 GetInventory().GetCurrentInventoryLocation(dst);
10745 }
10746 else
10747 {
10748 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10749 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10750 this shouldnt cause issues within this scope*/
10751 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10752 {
10753 if (root)
10754 {
10755 root.GetTransform(m4);
10756 dst.SetGround(this, m4);
10757 }
10758 else
10759 GetInventory().GetCurrentInventoryLocation(dst);
10760 }
10761 else
10762 {
10763 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10764 }
10765 }
10766
10767 ScriptInputUserData ctx = new ScriptInputUserData;
10769 ctx.Write(4);
10770 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10771 ctx.Write(thiz);
10772 dst.WriteToContext(ctx);
10773 ctx.Write(true); // dummy
10774 ctx.Send();
10775 }
10776 }
10777 else if (!GetGame().IsMultiplayer())
10778 {
10779 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
10780 }
10781 }
10782 }
10783
10784 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10785 {
10786 //TODO: delete check zero quantity check after fix double posts hands fsm events
10787 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10788 return false;
10789
10790 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10791 return false;
10792
10793 //can_this_be_combined = ConfigGetBool("canBeSplit");
10795 return false;
10796
10797
10798 Magazine mag = Magazine.Cast(this);
10799 if (mag)
10800 {
10801 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10802 return false;
10803
10804 if (stack_max_limit)
10805 {
10806 Magazine other_mag = Magazine.Cast(other_item);
10807 if (other_item)
10808 {
10809 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10810 return false;
10811 }
10812
10813 }
10814 }
10815 else
10816 {
10817 //TODO: delete check zero quantity check after fix double posts hands fsm events
10818 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10819 return false;
10820
10821 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10822 return false;
10823 }
10824
10825 PlayerBase player = null;
10826 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10827 {
10828 if (player.GetInventory().HasAttachment(this))
10829 return false;
10830
10831 if (player.IsItemsToDelete())
10832 return false;
10833 }
10834
10835 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10836 return false;
10837
10838 int slotID;
10839 string slotName;
10840 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10841 return false;
10842
10843 return true;
10844 }
10845
10846 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10847 {
10848 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10849 }
10850
10851 bool IsResultOfSplit()
10852 {
10853 return m_IsResultOfSplit;
10854 }
10855
10856 void SetResultOfSplit(bool value)
10857 {
10858 m_IsResultOfSplit = value;
10859 }
10860
10861 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10862 {
10863 return ComputeQuantityUsedEx(other_item, use_stack_max);
10864 }
10865
10866 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10867 {
10868 float other_item_quantity = other_item.GetQuantity();
10869 float this_free_space;
10870
10871 float stack_max = GetQuantityMax();
10872
10873 this_free_space = stack_max - GetQuantity();
10874
10875 if (other_item_quantity > this_free_space)
10876 {
10877 return this_free_space;
10878 }
10879 else
10880 {
10881 return other_item_quantity;
10882 }
10883 }
10884
10885 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10886 {
10887 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10888 }
10889
10890 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10891 {
10892 if (!CanBeCombined(other_item, false))
10893 return;
10894
10895 if (!IsMagazine() && other_item)
10896 {
10897 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10898 if (quantity_used != 0)
10899 {
10900 float hp1 = GetHealth01("","");
10901 float hp2 = other_item.GetHealth01("","");
10902 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10903 hpResult = hpResult / (GetQuantity() + quantity_used);
10904
10905 hpResult *= GetMaxHealth();
10906 Math.Round(hpResult);
10907 SetHealth("", "Health", hpResult);
10908
10909 AddQuantity(quantity_used);
10910 other_item.AddQuantity(-quantity_used);
10911 }
10912 }
10913 OnCombine(other_item);
10914 }
10915
10916 void OnCombine(ItemBase other_item)
10917 {
10918 #ifdef SERVER
10919 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10920 GetHierarchyParent().IncreaseLifetimeUp();
10921 #endif
10922 };
10923
10924 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10925 {
10926 PlayerBase p = PlayerBase.Cast(player);
10927
10928 array<int> recipesIds = p.m_Recipes;
10929 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10930 if (moduleRecipesManager)
10931 {
10932 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10933 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10934 }
10935
10936 for (int i = 0;i < recipesIds.Count(); i++)
10937 {
10938 int key = recipesIds.Get(i);
10939 string recipeName = moduleRecipesManager.GetRecipeName(key);
10940 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10941 }
10942 }
10943
10944 // -------------------------------------------------------------------------
10945 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10946 {
10947 super.GetDebugActions(outputList);
10948
10949 //quantity
10950 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10951 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10952 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10953 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10954
10955 //health
10956 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10957 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10958 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10959 //temperature
10960 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10961 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10962 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10963
10964 //wet
10965 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10966 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10967
10968 //liquidtype
10969 if (IsLiquidContainer())
10970 {
10971 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10972 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10973 }
10974
10975 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10976 // watch
10977 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10978 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10979
10980 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10981 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10982 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10983 }
10984
10985 // -------------------------------------------------------------------------
10986 // -------------------------------------------------------------------------
10987 // -------------------------------------------------------------------------
10988 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10989 {
10990 super.OnAction(action_id, player, ctx);
10991 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10992 {
10993 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10994 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10995 PlayerBase p = PlayerBase.Cast(player);
10996 if (EActions.RECIPES_RANGE_START < 1000)
10997 {
10998 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10999 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11000 }
11001 }
11002 #ifndef SERVER
11003 else if (action_id == EActions.WATCH_PLAYER)
11004 {
11005 PluginDeveloper.SetDeveloperItemClientEx(player);
11006 }
11007 #endif
11008 if (GetGame().IsServer())
11009 {
11010 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11011 {
11012 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11013 OnDebugButtonPressServer(id + 1);
11014 }
11015
11016 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11017 {
11018 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11019 InsertAgent(agent_id,100);
11020 }
11021
11022 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11023 {
11024 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11025 RemoveAgent(agent_id2);
11026 }
11027
11028 else if (action_id == EActions.ADD_QUANTITY)
11029 {
11030 if (IsMagazine())
11031 {
11032 Magazine mag = Magazine.Cast(this);
11033 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11034 }
11035 else
11036 {
11037 AddQuantity(GetQuantityMax() * 0.2);
11038 }
11039
11040 if (m_EM)
11041 {
11042 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11043 }
11044 //PrintVariables();
11045 }
11046
11047 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
11048 {
11049 if (IsMagazine())
11050 {
11051 Magazine mag2 = Magazine.Cast(this);
11052 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11053 }
11054 else
11055 {
11056 AddQuantity(- GetQuantityMax() * 0.2);
11057 }
11058 if (m_EM)
11059 {
11060 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11061 }
11062 //PrintVariables();
11063 }
11064
11065 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
11066 {
11067 SetQuantity(0);
11068
11069 if (m_EM)
11070 {
11071 m_EM.SetEnergy(0);
11072 }
11073 }
11074
11075 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
11076 {
11078
11079 if (m_EM)
11080 {
11081 m_EM.SetEnergy(m_EM.GetEnergyMax());
11082 }
11083 }
11084
11085 else if (action_id == EActions.ADD_HEALTH)
11086 {
11087 AddHealth("","",GetMaxHealth("","Health")/5);
11088 }
11089 else if (action_id == EActions.REMOVE_HEALTH)
11090 {
11091 AddHealth("","",-GetMaxHealth("","Health")/5);
11092 }
11093 else if (action_id == EActions.DESTROY_HEALTH)
11094 {
11095 SetHealth01("","",0);
11096 }
11097 else if (action_id == EActions.WATCH_ITEM)
11098 {
11100 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11101 #ifdef DEVELOPER
11102 SetDebugDeveloper_item(this);
11103 #endif
11104 }
11105
11106 else if (action_id == EActions.ADD_TEMPERATURE)
11107 {
11108 AddTemperature(20);
11109 //PrintVariables();
11110 }
11111
11112 else if (action_id == EActions.REMOVE_TEMPERATURE)
11113 {
11114 AddTemperature(-20);
11115 //PrintVariables();
11116 }
11117
11118 else if (action_id == EActions.FLIP_FROZEN)
11119 {
11120 SetFrozen(!GetIsFrozen());
11121 //PrintVariables();
11122 }
11123
11124 else if (action_id == EActions.ADD_WETNESS)
11125 {
11126 AddWet(GetWetMax()/5);
11127 //PrintVariables();
11128 }
11129
11130 else if (action_id == EActions.REMOVE_WETNESS)
11131 {
11132 AddWet(-GetWetMax()/5);
11133 //PrintVariables();
11134 }
11135
11136 else if (action_id == EActions.LIQUIDTYPE_UP)
11137 {
11138 int curr_type = GetLiquidType();
11139 SetLiquidType(curr_type * 2);
11140 //AddWet(1);
11141 //PrintVariables();
11142 }
11143
11144 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11145 {
11146 int curr_type2 = GetLiquidType();
11147 SetLiquidType(curr_type2 / 2);
11148 }
11149
11150 else if (action_id == EActions.MAKE_SPECIAL)
11151 {
11152 auto debugParams = DebugSpawnParams.WithPlayer(player);
11153 OnDebugSpawnEx(debugParams);
11154 }
11155
11156 else if (action_id == EActions.DELETE)
11157 {
11158 Delete();
11159 }
11160
11161 }
11162
11163
11164 return false;
11165 }
11166
11167 // -------------------------------------------------------------------------
11168
11169
11172 void OnActivatedByTripWire();
11173
11175 void OnActivatedByItem(notnull ItemBase item);
11176
11177 //----------------------------------------------------------------
11178 //returns true if item is able to explode when put in fire
11179 bool CanExplodeInFire()
11180 {
11181 return false;
11182 }
11183
11184 //----------------------------------------------------------------
11185 bool CanEat()
11186 {
11187 return true;
11188 }
11189
11190 //----------------------------------------------------------------
11191 override bool IsIgnoredByConstruction()
11192 {
11193 return true;
11194 }
11195
11196 //----------------------------------------------------------------
11197 //has FoodStages in config?
11198 bool HasFoodStage()
11199 {
11200 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11201 return GetGame().ConfigIsExisting(config_path);
11202 }
11203
11205 FoodStage GetFoodStage()
11206 {
11207 return null;
11208 }
11209
11210 bool CanBeCooked()
11211 {
11212 return false;
11213 }
11214
11215 bool CanBeCookedOnStick()
11216 {
11217 return false;
11218 }
11219
11221 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11223
11224 //----------------------------------------------------------------
11225 bool CanRepair(ItemBase item_repair_kit)
11226 {
11227 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11228 return module_repairing.CanRepair(this, item_repair_kit);
11229 }
11230
11231 //----------------------------------------------------------------
11232 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11233 {
11234 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11235 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11236 }
11237
11238 //----------------------------------------------------------------
11239 int GetItemSize()
11240 {
11241 /*
11242 vector v_size = this.ConfigGetVector("itemSize");
11243 int v_size_x = v_size[0];
11244 int v_size_y = v_size[1];
11245 int size = v_size_x * v_size_y;
11246 return size;
11247 */
11248
11249 return 1;
11250 }
11251
11252 //----------------------------------------------------------------
11253 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11254 bool CanBeMovedOverride()
11255 {
11256 return m_CanBeMovedOverride;
11257 }
11258
11259 //----------------------------------------------------------------
11260 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11261 void SetCanBeMovedOverride(bool setting)
11262 {
11263 m_CanBeMovedOverride = setting;
11264 }
11265
11266 //----------------------------------------------------------------
11274 void MessageToOwnerStatus(string text)
11275 {
11276 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11277
11278 if (player)
11279 {
11280 player.MessageStatus(text);
11281 }
11282 }
11283
11284 //----------------------------------------------------------------
11292 void MessageToOwnerAction(string text)
11293 {
11294 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11295
11296 if (player)
11297 {
11298 player.MessageAction(text);
11299 }
11300 }
11301
11302 //----------------------------------------------------------------
11310 void MessageToOwnerFriendly(string text)
11311 {
11312 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11313
11314 if (player)
11315 {
11316 player.MessageFriendly(text);
11317 }
11318 }
11319
11320 //----------------------------------------------------------------
11328 void MessageToOwnerImportant(string text)
11329 {
11330 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11331
11332 if (player)
11333 {
11334 player.MessageImportant(text);
11335 }
11336 }
11337
11338 override bool IsItemBase()
11339 {
11340 return true;
11341 }
11342
11343 // Checks if item is of questioned kind
11344 override bool KindOf(string tag)
11345 {
11346 bool found = false;
11347 string item_name = this.GetType();
11348 ref TStringArray item_tag_array = new TStringArray;
11349 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11350
11351 int array_size = item_tag_array.Count();
11352 for (int i = 0; i < array_size; i++)
11353 {
11354 if (item_tag_array.Get(i) == tag)
11355 {
11356 found = true;
11357 break;
11358 }
11359 }
11360 return found;
11361 }
11362
11363
11364 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11365 {
11366 //Debug.Log("OnRPC called");
11367 super.OnRPC(sender, rpc_type,ctx);
11368
11369 //Play soundset for attachment locking (ActionLockAttachment.c)
11370 switch (rpc_type)
11371 {
11372 #ifndef SERVER
11373 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11374 Param2<bool, string> p = new Param2<bool, string>(false, "");
11375
11376 if (!ctx.Read(p))
11377 return;
11378
11379 bool play = p.param1;
11380 string soundSet = p.param2;
11381
11382 if (play)
11383 {
11384 if (m_LockingSound)
11385 {
11387 {
11388 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11389 }
11390 }
11391 else
11392 {
11393 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11394 }
11395 }
11396 else
11397 {
11398 SEffectManager.DestroyEffect(m_LockingSound);
11399 }
11400
11401 break;
11402 #endif
11403
11404 }
11405
11406 if (GetWrittenNoteData())
11407 {
11408 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11409 }
11410 }
11411
11412 //-----------------------------
11413 // VARIABLE MANIPULATION SYSTEM
11414 //-----------------------------
11415 int NameToID(string name)
11416 {
11417 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11418 return plugin.GetID(name);
11419 }
11420
11421 string IDToName(int id)
11422 {
11423 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11424 return plugin.GetName(id);
11425 }
11426
11428 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11429 {
11430 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11431 //read the flags
11432 int varFlags;
11433 if (!ctx.Read(varFlags))
11434 return;
11435
11436 if (varFlags & ItemVariableFlags.FLOAT)
11437 {
11438 ReadVarsFromCTX(ctx);
11439 }
11440 }
11441
11442 override void SerializeNumericalVars(array<float> floats_out)
11443 {
11444 //some variables handled on EntityAI level already!
11445 super.SerializeNumericalVars(floats_out);
11446
11447 // the order of serialization must be the same as the order of de-serialization
11448 //--------------------------------------------
11449 if (IsVariableSet(VARIABLE_QUANTITY))
11450 {
11451 floats_out.Insert(m_VarQuantity);
11452 }
11453 //--------------------------------------------
11454 if (IsVariableSet(VARIABLE_WET))
11455 {
11456 floats_out.Insert(m_VarWet);
11457 }
11458 //--------------------------------------------
11459 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11460 {
11461 floats_out.Insert(m_VarLiquidType);
11462 }
11463 //--------------------------------------------
11464 if (IsVariableSet(VARIABLE_COLOR))
11465 {
11466 floats_out.Insert(m_ColorComponentR);
11467 floats_out.Insert(m_ColorComponentG);
11468 floats_out.Insert(m_ColorComponentB);
11469 floats_out.Insert(m_ColorComponentA);
11470 }
11471 //--------------------------------------------
11472 if (IsVariableSet(VARIABLE_CLEANNESS))
11473 {
11474 floats_out.Insert(m_Cleanness);
11475 }
11476 }
11477
11478 override void DeSerializeNumericalVars(array<float> floats)
11479 {
11480 //some variables handled on EntityAI level already!
11481 super.DeSerializeNumericalVars(floats);
11482
11483 // the order of serialization must be the same as the order of de-serialization
11484 int index = 0;
11485 int mask = Math.Round(floats.Get(index));
11486
11487 index++;
11488 //--------------------------------------------
11489 if (mask & VARIABLE_QUANTITY)
11490 {
11491 if (m_IsStoreLoad)
11492 {
11493 SetStoreLoadedQuantity(floats.Get(index));
11494 }
11495 else
11496 {
11497 float quantity = floats.Get(index);
11498 SetQuantity(quantity, true, false, false, false);
11499 }
11500 index++;
11501 }
11502 //--------------------------------------------
11503 if (mask & VARIABLE_WET)
11504 {
11505 float wet = floats.Get(index);
11506 SetWet(wet);
11507 index++;
11508 }
11509 //--------------------------------------------
11510 if (mask & VARIABLE_LIQUIDTYPE)
11511 {
11512 int liquidtype = Math.Round(floats.Get(index));
11513 SetLiquidType(liquidtype);
11514 index++;
11515 }
11516 //--------------------------------------------
11517 if (mask & VARIABLE_COLOR)
11518 {
11519 m_ColorComponentR = Math.Round(floats.Get(index));
11520 index++;
11521 m_ColorComponentG = Math.Round(floats.Get(index));
11522 index++;
11523 m_ColorComponentB = Math.Round(floats.Get(index));
11524 index++;
11525 m_ColorComponentA = Math.Round(floats.Get(index));
11526 index++;
11527 }
11528 //--------------------------------------------
11529 if (mask & VARIABLE_CLEANNESS)
11530 {
11531 int cleanness = Math.Round(floats.Get(index));
11532 SetCleanness(cleanness);
11533 index++;
11534 }
11535 }
11536
11537 override void WriteVarsToCTX(ParamsWriteContext ctx)
11538 {
11539 super.WriteVarsToCTX(ctx);
11540
11541 //--------------------------------------------
11542 if (IsVariableSet(VARIABLE_QUANTITY))
11543 {
11544 ctx.Write(GetQuantity());
11545 }
11546 //--------------------------------------------
11547 if (IsVariableSet(VARIABLE_WET))
11548 {
11549 ctx.Write(GetWet());
11550 }
11551 //--------------------------------------------
11552 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11553 {
11554 ctx.Write(GetLiquidType());
11555 }
11556 //--------------------------------------------
11557 if (IsVariableSet(VARIABLE_COLOR))
11558 {
11559 int r,g,b,a;
11560 GetColor(r,g,b,a);
11561 ctx.Write(r);
11562 ctx.Write(g);
11563 ctx.Write(b);
11564 ctx.Write(a);
11565 }
11566 //--------------------------------------------
11567 if (IsVariableSet(VARIABLE_CLEANNESS))
11568 {
11569 ctx.Write(GetCleanness());
11570 }
11571 }
11572
11573 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11574 {
11575 if (!super.ReadVarsFromCTX(ctx,version))
11576 return false;
11577
11578 int intValue;
11579 float value;
11580
11581 if (version < 140)
11582 {
11583 if (!ctx.Read(intValue))
11584 return false;
11585
11586 m_VariablesMask = intValue;
11587 }
11588
11589 if (m_VariablesMask & VARIABLE_QUANTITY)
11590 {
11591 if (!ctx.Read(value))
11592 return false;
11593
11594 if (IsStoreLoad())
11595 {
11597 }
11598 else
11599 {
11600 SetQuantity(value, true, false, false, false);
11601 }
11602 }
11603 //--------------------------------------------
11604 if (version < 140)
11605 {
11606 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11607 {
11608 if (!ctx.Read(value))
11609 return false;
11610 SetTemperatureDirect(value);
11611 }
11612 }
11613 //--------------------------------------------
11614 if (m_VariablesMask & VARIABLE_WET)
11615 {
11616 if (!ctx.Read(value))
11617 return false;
11618 SetWet(value);
11619 }
11620 //--------------------------------------------
11621 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11622 {
11623 if (!ctx.Read(intValue))
11624 return false;
11625 SetLiquidType(intValue);
11626 }
11627 //--------------------------------------------
11628 if (m_VariablesMask & VARIABLE_COLOR)
11629 {
11630 int r,g,b,a;
11631 if (!ctx.Read(r))
11632 return false;
11633 if (!ctx.Read(g))
11634 return false;
11635 if (!ctx.Read(b))
11636 return false;
11637 if (!ctx.Read(a))
11638 return false;
11639
11640 SetColor(r,g,b,a);
11641 }
11642 //--------------------------------------------
11643 if (m_VariablesMask & VARIABLE_CLEANNESS)
11644 {
11645 if (!ctx.Read(intValue))
11646 return false;
11647 SetCleanness(intValue);
11648 }
11649 //--------------------------------------------
11650 if (version >= 138 && version < 140)
11651 {
11652 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11653 {
11654 if (!ctx.Read(intValue))
11655 return false;
11656 SetFrozen(intValue);
11657 }
11658 }
11659
11660 return true;
11661 }
11662
11663 //----------------------------------------------------------------
11664 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11665 {
11666 m_IsStoreLoad = true;
11668 {
11669 m_FixDamageSystemInit = true;
11670 }
11671
11672 if (!super.OnStoreLoad(ctx, version))
11673 {
11674 m_IsStoreLoad = false;
11675 return false;
11676 }
11677
11678 if (version >= 114)
11679 {
11680 bool hasQuickBarIndexSaved;
11681
11682 if (!ctx.Read(hasQuickBarIndexSaved))
11683 {
11684 m_IsStoreLoad = false;
11685 return false;
11686 }
11687
11688 if (hasQuickBarIndexSaved)
11689 {
11690 int itmQBIndex;
11691
11692 //Load quickbar item bind
11693 if (!ctx.Read(itmQBIndex))
11694 {
11695 m_IsStoreLoad = false;
11696 return false;
11697 }
11698
11699 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11700 if (itmQBIndex != -1 && parentPlayer)
11701 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11702 }
11703 }
11704 else
11705 {
11706 // Backup of how it used to be
11707 PlayerBase player;
11708 int itemQBIndex;
11709 if (version == int.MAX)
11710 {
11711 if (!ctx.Read(itemQBIndex))
11712 {
11713 m_IsStoreLoad = false;
11714 return false;
11715 }
11716 }
11717 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11718 {
11719 //Load quickbar item bind
11720 if (!ctx.Read(itemQBIndex))
11721 {
11722 m_IsStoreLoad = false;
11723 return false;
11724 }
11725 if (itemQBIndex != -1 && player)
11726 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11727 }
11728 }
11729
11730 if (version < 140)
11731 {
11732 // variable management system
11733 if (!LoadVariables(ctx, version))
11734 {
11735 m_IsStoreLoad = false;
11736 return false;
11737 }
11738 }
11739
11740 //agent trasmission system
11741 if (!LoadAgents(ctx, version))
11742 {
11743 m_IsStoreLoad = false;
11744 return false;
11745 }
11746 if (version >= 132)
11747 {
11748 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11749 if (raib)
11750 {
11751 if (!raib.OnStoreLoad(ctx,version))
11752 {
11753 m_IsStoreLoad = false;
11754 return false;
11755 }
11756 }
11757 }
11758
11759 m_IsStoreLoad = false;
11760 return true;
11761 }
11762
11763 //----------------------------------------------------------------
11764
11765 override void OnStoreSave(ParamsWriteContext ctx)
11766 {
11767 super.OnStoreSave(ctx);
11768
11769 PlayerBase player;
11770 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11771 {
11772 ctx.Write(true); // Keep track of if we should actually read this in or not
11773 //Save quickbar item bind
11774 int itemQBIndex = -1;
11775 itemQBIndex = player.FindQuickBarEntityIndex(this);
11776 ctx.Write(itemQBIndex);
11777 }
11778 else
11779 {
11780 ctx.Write(false); // Keep track of if we should actually read this in or not
11781 }
11782
11783 SaveAgents(ctx);//agent trasmission system
11784
11785 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11786 if (raib)
11787 {
11788 raib.OnStoreSave(ctx);
11789 }
11790 }
11791 //----------------------------------------------------------------
11792
11793 override void AfterStoreLoad()
11794 {
11795 super.AfterStoreLoad();
11796
11798 {
11800 }
11801
11802 if (GetStoreLoadedQuantity() != float.LOWEST)
11803 {
11805 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
11806 }
11807 }
11808
11809 override void EEOnAfterLoad()
11810 {
11811 super.EEOnAfterLoad();
11812
11814 {
11815 m_FixDamageSystemInit = false;
11816 }
11817
11820 }
11821
11822 bool CanBeDisinfected()
11823 {
11824 return false;
11825 }
11826
11827
11828 //----------------------------------------------------------------
11829 override void OnVariablesSynchronized()
11830 {
11831 if (m_Initialized)
11832 {
11833 #ifdef PLATFORM_CONSOLE
11834 //bruteforce it is
11835 if (IsSplitable())
11836 {
11837 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
11838 if (menu)
11839 {
11840 menu.Refresh();
11841 }
11842 }
11843 #endif
11844 }
11845
11847 {
11848 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11849 m_WantPlayImpactSound = false;
11850 }
11851
11853 {
11854 SetWeightDirty();
11856 }
11857 if (m_VarWet != m_VarWetPrev)
11858 {
11861 }
11862
11863 if (m_SoundSyncPlay != 0)
11864 {
11865 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
11866 m_SoundSyncPlay = 0;
11867 }
11868 if (m_SoundSyncStop != 0)
11869 {
11870 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11871 m_SoundSyncStop = 0;
11872 }
11873
11874 super.OnVariablesSynchronized();
11875 }
11876
11877 //------------------------- Quantity
11878 //----------------------------------------------------------------
11880 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11881 {
11882 if (!IsServerCheck(allow_client))
11883 return false;
11884
11885 if (!HasQuantity())
11886 return false;
11887
11888 float min = GetQuantityMin();
11889 float max = GetQuantityMax();
11890
11891 if (value <= (min + 0.001))
11892 value = min;
11893
11894 if (value == min)
11895 {
11896 if (destroy_config)
11897 {
11898 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11899 if (dstr)
11900 {
11901 m_VarQuantity = Math.Clamp(value, min, max);
11902 this.Delete();
11903 return true;
11904 }
11905 }
11906 else if (destroy_forced)
11907 {
11908 m_VarQuantity = Math.Clamp(value, min, max);
11909 this.Delete();
11910 return true;
11911 }
11912 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11913 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11914 }
11915
11916 float delta = m_VarQuantity;
11917 m_VarQuantity = Math.Clamp(value, min, max);
11918
11919 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11920 {
11921 delta = m_VarQuantity - delta;
11922
11923 if (delta)
11924 OnQuantityChanged(delta);
11925 }
11926
11927 SetVariableMask(VARIABLE_QUANTITY);
11928
11929 return false;
11930 }
11931
11932 //----------------------------------------------------------------
11934 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11935 {
11936 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11937 }
11938 //----------------------------------------------------------------
11939 void SetQuantityMax()
11940 {
11941 float max = GetQuantityMax();
11942 SetQuantity(max);
11943 }
11944
11945 override void SetQuantityToMinimum()
11946 {
11947 float min = GetQuantityMin();
11948 SetQuantity(min);
11949 }
11950 //----------------------------------------------------------------
11952 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11953 {
11954 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11955 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11956 SetQuantity(result, destroy_config, destroy_forced);
11957 }
11958
11959 //----------------------------------------------------------------
11961 override float GetQuantityNormalized()
11962 {
11963 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11964 }
11965
11967 {
11968 return GetQuantityNormalized();
11969 }
11970
11971 /*void SetAmmoNormalized(float value)
11972 {
11973 float value_clamped = Math.Clamp(value, 0, 1);
11974 Magazine this_mag = Magazine.Cast(this);
11975 int max_rounds = this_mag.GetAmmoMax();
11976 int result = value * max_rounds;//can the rounded if higher precision is required
11977 this_mag.SetAmmoCount(result);
11978 }*/
11979 //----------------------------------------------------------------
11980 override int GetQuantityMax()
11981 {
11982 int slot = -1;
11983 if (GetInventory())
11984 {
11985 InventoryLocation il = new InventoryLocation;
11986 GetInventory().GetCurrentInventoryLocation(il);
11987 slot = il.GetSlot();
11988 }
11989
11990 return GetTargetQuantityMax(slot);
11991 }
11992
11993 override int GetTargetQuantityMax(int attSlotID = -1)
11994 {
11995 float quantity_max = 0;
11996
11997 if (IsSplitable()) //only stackable/splitable items can check for stack size
11998 {
11999 if (attSlotID != -1)
12000 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12001
12002 if (quantity_max <= 0)
12003 quantity_max = m_VarStackMax;
12004 }
12005
12006 if (quantity_max <= 0)
12007 quantity_max = m_VarQuantityMax;
12008
12009 return quantity_max;
12010 }
12011 //----------------------------------------------------------------
12012 override int GetQuantityMin()
12013 {
12014 return m_VarQuantityMin;
12015 }
12016 //----------------------------------------------------------------
12017 int GetQuantityInit()
12018 {
12019 return m_VarQuantityInit;
12020 }
12021
12022 //----------------------------------------------------------------
12023 override bool HasQuantity()
12024 {
12025 return !(GetQuantityMax() - GetQuantityMin() == 0);
12026 }
12027
12028 override float GetQuantity()
12029 {
12030 return m_VarQuantity;
12031 }
12032
12033 bool IsFullQuantity()
12034 {
12035 return GetQuantity() >= GetQuantityMax();
12036 }
12037
12038 //Calculates weight of single item without attachments and cargo
12039 override float GetSingleInventoryItemWeightEx()
12040 {
12041 //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
12042 float weightEx = GetWeightEx();//overall weight of the item
12043 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
12044 return weightEx - special;
12045 }
12046
12047 // Obsolete, use GetSingleInventoryItemWeightEx() instead
12049 {
12051 }
12052
12053 override protected float GetWeightSpecialized(bool forceRecalc = false)
12054 {
12055 if (IsSplitable()) //quantity determines size of the stack
12056 {
12057 #ifdef DEVELOPER
12058 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12059 {
12060 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12061 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12062 }
12063 #endif
12064
12065 return GetQuantity() * GetConfigWeightModified();
12066 }
12067 else if (HasEnergyManager())// items with energy manager
12068 {
12069 #ifdef DEVELOPER
12070 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12071 {
12072 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12073 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12074 }
12075 #endif
12076 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12077 }
12078 else//everything else
12079 {
12080 #ifdef DEVELOPER
12081 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12082 {
12083 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12084 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12085 }
12086 #endif
12087 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12088 }
12089 }
12090
12092 int GetNumberOfItems()
12093 {
12094 int item_count = 0;
12095 ItemBase item;
12096
12097 if (GetInventory().GetCargo() != NULL)
12098 {
12099 item_count = GetInventory().GetCargo().GetItemCount();
12100 }
12101
12102 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12103 {
12104 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12105 if (item)
12106 item_count += item.GetNumberOfItems();
12107 }
12108 return item_count;
12109 }
12110
12112 float GetUnitWeight(bool include_wetness = true)
12113 {
12114 float weight = 0;
12115 float wetness = 1;
12116 if (include_wetness)
12117 wetness += GetWet();
12118 if (IsSplitable()) //quantity determines size of the stack
12119 {
12120 weight = wetness * m_ConfigWeight;
12121 }
12122 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12123 {
12124 weight = 1;
12125 }
12126 return weight;
12127 }
12128
12129 //-----------------------------------------------------------------
12130
12131 override void ClearInventory()
12132 {
12133 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
12134 {
12135 GameInventory inv = GetInventory();
12136 array<EntityAI> items = new array<EntityAI>;
12137 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
12138 for (int i = 0; i < items.Count(); i++)
12139 {
12140 ItemBase item = ItemBase.Cast(items.Get(i));
12141 if (item)
12142 {
12143 GetGame().ObjectDelete(item);
12144 }
12145 }
12146 }
12147 }
12148
12149 //------------------------- Energy
12150
12151 //----------------------------------------------------------------
12152 float GetEnergy()
12153 {
12154 float energy = 0;
12155 if (HasEnergyManager())
12156 {
12157 energy = GetCompEM().GetEnergy();
12158 }
12159 return energy;
12160 }
12161
12162
12163 override void OnEnergyConsumed()
12164 {
12165 super.OnEnergyConsumed();
12166
12168 }
12169
12170 override void OnEnergyAdded()
12171 {
12172 super.OnEnergyAdded();
12173
12175 }
12176
12177 // Converts energy (from Energy Manager) to quantity, if enabled.
12179 {
12180 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12181 {
12182 if (HasQuantity())
12183 {
12184 float energy_0to1 = GetCompEM().GetEnergy0To1();
12185 SetQuantityNormalized(energy_0to1);
12186 }
12187 }
12188 }
12189
12190 //----------------------------------------------------------------
12191 float GetHeatIsolationInit()
12192 {
12193 return ConfigGetFloat("heatIsolation");
12194 }
12195
12196 float GetHeatIsolation()
12197 {
12198 return m_HeatIsolation;
12199 }
12200
12201 float GetDryingIncrement(string pIncrementName)
12202 {
12203 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12204 if (GetGame().ConfigIsExisting(paramPath))
12205 return GetGame().ConfigGetFloat(paramPath);
12206
12207 return 0.0;
12208 }
12209
12210 float GetSoakingIncrement(string pIncrementName)
12211 {
12212 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12213 if (GetGame().ConfigIsExisting(paramPath))
12214 return GetGame().ConfigGetFloat(paramPath);
12215
12216 return 0.0;
12217 }
12218 //----------------------------------------------------------------
12219 override void SetWet(float value, bool allow_client = false)
12220 {
12221 if (!IsServerCheck(allow_client))
12222 return;
12223
12224 float min = GetWetMin();
12225 float max = GetWetMax();
12226
12227 float previousValue = m_VarWet;
12228
12229 m_VarWet = Math.Clamp(value, min, max);
12230
12231 if (previousValue != m_VarWet)
12232 {
12233 SetVariableMask(VARIABLE_WET);
12234 OnWetChanged(m_VarWet, previousValue);
12235 }
12236 }
12237 //----------------------------------------------------------------
12238 override void AddWet(float value)
12239 {
12240 SetWet(GetWet() + value);
12241 }
12242 //----------------------------------------------------------------
12243 override void SetWetMax()
12244 {
12246 }
12247 //----------------------------------------------------------------
12248 override float GetWet()
12249 {
12250 return m_VarWet;
12251 }
12252 //----------------------------------------------------------------
12253 override float GetWetMax()
12254 {
12255 return m_VarWetMax;
12256 }
12257 //----------------------------------------------------------------
12258 override float GetWetMin()
12259 {
12260 return m_VarWetMin;
12261 }
12262 //----------------------------------------------------------------
12263 override float GetWetInit()
12264 {
12265 return m_VarWetInit;
12266 }
12267 //----------------------------------------------------------------
12268 override void OnWetChanged(float newVal, float oldVal)
12269 {
12270 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12271 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12272 if (newLevel != oldLevel)
12273 {
12274 OnWetLevelChanged(newLevel,oldLevel);
12275 }
12276 }
12277
12278 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12279 {
12280 SetWeightDirty();
12281 }
12282
12283 override EWetnessLevel GetWetLevel()
12284 {
12285 return GetWetLevelInternal(m_VarWet);
12286 }
12287
12288 //----------------------------------------------------------------
12289
12290 override void SetStoreLoad(bool value)
12291 {
12292 m_IsStoreLoad = value;
12293 }
12294
12295 override bool IsStoreLoad()
12296 {
12297 return m_IsStoreLoad;
12298 }
12299
12300 override void SetStoreLoadedQuantity(float value)
12301 {
12302 m_StoreLoadedQuantity = value;
12303 }
12304
12305 override float GetStoreLoadedQuantity()
12306 {
12307 return m_StoreLoadedQuantity;
12308 }
12309
12310 //----------------------------------------------------------------
12311
12312 float GetItemModelLength()
12313 {
12314 if (ConfigIsExisting("itemModelLength"))
12315 {
12316 return ConfigGetFloat("itemModelLength");
12317 }
12318 return 0;
12319 }
12320
12321 float GetItemAttachOffset()
12322 {
12323 if (ConfigIsExisting("itemAttachOffset"))
12324 {
12325 return ConfigGetFloat("itemAttachOffset");
12326 }
12327 return 0;
12328 }
12329
12330 override void SetCleanness(int value, bool allow_client = false)
12331 {
12332 if (!IsServerCheck(allow_client))
12333 return;
12334
12335 int previousValue = m_Cleanness;
12336
12337 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12338
12339 if (previousValue != m_Cleanness)
12340 SetVariableMask(VARIABLE_CLEANNESS);
12341 }
12342
12343 override int GetCleanness()
12344 {
12345 return m_Cleanness;
12346 }
12347
12349 {
12350 return true;
12351 }
12352
12353 //----------------------------------------------------------------
12354 // ATTACHMENT LOCKING
12355 // Getters relevant to generic ActionLockAttachment
12356 int GetLockType()
12357 {
12358 return m_LockType;
12359 }
12360
12361 string GetLockSoundSet()
12362 {
12363 return m_LockSoundSet;
12364 }
12365
12366 //----------------------------------------------------------------
12367 //------------------------- Color
12368 // sets items color variable given color components
12369 override void SetColor(int r, int g, int b, int a)
12370 {
12375 SetVariableMask(VARIABLE_COLOR);
12376 }
12378 override void GetColor(out int r,out int g,out int b,out int a)
12379 {
12384 }
12385
12386 bool IsColorSet()
12387 {
12388 return IsVariableSet(VARIABLE_COLOR);
12389 }
12390
12392 string GetColorString()
12393 {
12394 int r,g,b,a;
12395 GetColor(r,g,b,a);
12396 r = r/255;
12397 g = g/255;
12398 b = b/255;
12399 a = a/255;
12400 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12401 }
12402 //----------------------------------------------------------------
12403 //------------------------- LiquidType
12404
12405 override void SetLiquidType(int value, bool allow_client = false)
12406 {
12407 if (!IsServerCheck(allow_client))
12408 return;
12409
12410 int old = m_VarLiquidType;
12411 m_VarLiquidType = value;
12412 OnLiquidTypeChanged(old,value);
12413 SetVariableMask(VARIABLE_LIQUIDTYPE);
12414 }
12415
12416 int GetLiquidTypeInit()
12417 {
12418 return ConfigGetInt("varLiquidTypeInit");
12419 }
12420
12421 override int GetLiquidType()
12422 {
12423 return m_VarLiquidType;
12424 }
12425
12426 protected void OnLiquidTypeChanged(int oldType, int newType)
12427 {
12428 if (newType == LIQUID_NONE && GetIsFrozen())
12429 SetFrozen(false);
12430 }
12431
12433 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12434 {
12435 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12436 }
12437
12438 // -------------------------------------------------------------------------
12440 void OnInventoryEnter(Man player)
12441 {
12442 PlayerBase nplayer;
12443 if (PlayerBase.CastTo(nplayer, player))
12444 {
12445 m_CanPlayImpactSound = true;
12446 //nplayer.OnItemInventoryEnter(this);
12447 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12448 }
12449 }
12450
12451 // -------------------------------------------------------------------------
12453 void OnInventoryExit(Man player)
12454 {
12455 PlayerBase nplayer;
12456 if (PlayerBase.CastTo(nplayer,player))
12457 {
12458 //nplayer.OnItemInventoryExit(this);
12459 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12460
12461 }
12462
12463 //if (!GetGame().IsDedicatedServer())
12464 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12465
12466
12467 if (HasEnergyManager())
12468 {
12469 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12470 }
12471 }
12472
12473 // ADVANCED PLACEMENT EVENTS
12474 override void OnPlacementStarted(Man player)
12475 {
12476 super.OnPlacementStarted(player);
12477
12478 SetTakeable(false);
12479 }
12480
12481 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12482 {
12483 if (m_AdminLog)
12484 {
12485 m_AdminLog.OnPlacementComplete(player, this);
12486 }
12487
12488 super.OnPlacementComplete(player, position, orientation);
12489 }
12490
12491 //-----------------------------
12492 // AGENT SYSTEM
12493 //-----------------------------
12494 //--------------------------------------------------------------------------
12495 bool ContainsAgent(int agent_id)
12496 {
12497 if (agent_id & m_AttachedAgents)
12498 {
12499 return true;
12500 }
12501 else
12502 {
12503 return false;
12504 }
12505 }
12506
12507 //--------------------------------------------------------------------------
12508 override void RemoveAgent(int agent_id)
12509 {
12510 if (ContainsAgent(agent_id))
12511 {
12512 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12513 }
12514 }
12515
12516 //--------------------------------------------------------------------------
12517 override void RemoveAllAgents()
12518 {
12519 m_AttachedAgents = 0;
12520 }
12521 //--------------------------------------------------------------------------
12522 override void RemoveAllAgentsExcept(int agent_to_keep)
12523 {
12524 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12525 }
12526 // -------------------------------------------------------------------------
12527 override void InsertAgent(int agent, float count = 1)
12528 {
12529 if (count < 1)
12530 return;
12531 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12533 }
12534
12536 void TransferAgents(int agents)
12537 {
12539 }
12540
12541 // -------------------------------------------------------------------------
12542 override int GetAgents()
12543 {
12544 return m_AttachedAgents;
12545 }
12546 //----------------------------------------------------------------------
12547
12548 /*int GetContaminationType()
12549 {
12550 int contamination_type;
12551
12552 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12553 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12554 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12555 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12556
12557 Edible_Base edible = Edible_Base.Cast(this);
12558 int agents = GetAgents();
12559 if (edible)
12560 {
12561 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12562 if (profile)
12563 {
12564 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12565 }
12566 }
12567 if (agents & CONTAMINATED_MASK)
12568 {
12569 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12570 }
12571 if (agents & POISONED_MASK)
12572 {
12573 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12574 }
12575 if (agents & NERVE_GAS_MASK)
12576 {
12577 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12578 }
12579 if (agents & DIRTY_MASK)
12580 {
12581 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12582 }
12583
12584 return agents;
12585 }*/
12586
12587 // -------------------------------------------------------------------------
12588 bool LoadAgents(ParamsReadContext ctx, int version)
12589 {
12590 if (!ctx.Read(m_AttachedAgents))
12591 return false;
12592 return true;
12593 }
12594 // -------------------------------------------------------------------------
12596 {
12597
12599 }
12600 // -------------------------------------------------------------------------
12601
12603 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12604 {
12605 super.CheckForRoofLimited(timeTresholdMS);
12606
12607 float time = GetGame().GetTime();
12608 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12609 {
12610 m_PreviousRoofTestTime = time;
12611 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12612 }
12613 }
12614
12615 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12616 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12617 {
12618 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12619 {
12620 return 0;
12621 }
12622
12623 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12624 {
12625 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12626 if (filter)
12627 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12628 else
12629 return 0;//otherwise return 0 when no filter attached
12630 }
12631
12632 string subclassPath, entryName;
12633
12634 switch (type)
12635 {
12636 case DEF_BIOLOGICAL:
12637 entryName = "biological";
12638 break;
12639 case DEF_CHEMICAL:
12640 entryName = "chemical";
12641 break;
12642 default:
12643 entryName = "biological";
12644 break;
12645 }
12646
12647 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12648
12649 return GetGame().ConfigGetFloat(subclassPath + entryName);
12650 }
12651
12652
12653
12655 override void EEOnCECreate()
12656 {
12657 if (!IsMagazine())
12659
12661 }
12662
12663
12664 //-------------------------
12665 // OPEN/CLOSE USER ACTIONS
12666 //-------------------------
12668 void Open();
12669 void Close();
12670 bool IsOpen()
12671 {
12672 return true;
12673 }
12674
12675 override bool CanDisplayCargo()
12676 {
12677 return IsOpen();
12678 }
12679
12680
12681 // ------------------------------------------------------------
12682 // CONDITIONS
12683 // ------------------------------------------------------------
12684 override bool CanPutInCargo(EntityAI parent)
12685 {
12686 if (parent)
12687 {
12688 if (parent.IsInherited(DayZInfected))
12689 return true;
12690
12691 if (!parent.IsRuined())
12692 return true;
12693 }
12694
12695 return true;
12696 }
12697
12698 override bool CanPutAsAttachment(EntityAI parent)
12699 {
12700 if (!super.CanPutAsAttachment(parent))
12701 {
12702 return false;
12703 }
12704
12705 if (!IsRuined() && !parent.IsRuined())
12706 {
12707 return true;
12708 }
12709
12710 return false;
12711 }
12712
12713 override bool CanReceiveItemIntoCargo(EntityAI item)
12714 {
12715 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12716 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12717 // return false;
12718
12719 return super.CanReceiveItemIntoCargo(item);
12720 }
12721
12722 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12723 {
12724 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12725 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12726 // return false;
12727
12728 GameInventory attachmentInv = attachment.GetInventory();
12729 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12730 {
12731 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12732 return false;
12733 }
12734
12735 InventoryLocation loc = new InventoryLocation();
12736 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12737 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12738 return false;
12739
12740 return super.CanReceiveAttachment(attachment, slotId);
12741 }
12742
12743 override bool CanReleaseAttachment(EntityAI attachment)
12744 {
12745 if (!super.CanReleaseAttachment(attachment))
12746 return false;
12747
12748 return GetInventory().AreChildrenAccessible();
12749 }
12750
12751 /*override bool CanLoadAttachment(EntityAI attachment)
12752 {
12753 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12754 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12755 // return false;
12756
12757 GameInventory attachmentInv = attachment.GetInventory();
12758 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12759 {
12760 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12761 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12762
12763 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12764 return false;
12765 }
12766
12767 return super.CanLoadAttachment(attachment);
12768 }*/
12769
12770 // Plays muzzle flash particle effects
12771 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12772 {
12773 int id = muzzle_owner.GetMuzzleID();
12774 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12775
12776 if (WPOF_array)
12777 {
12778 for (int i = 0; i < WPOF_array.Count(); i++)
12779 {
12780 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12781
12782 if (WPOF)
12783 {
12784 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12785 }
12786 }
12787 }
12788 }
12789
12790 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12791 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12792 {
12793 int id = muzzle_owner.GetMuzzleID();
12794 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12795
12796 if (WPOBE_array)
12797 {
12798 for (int i = 0; i < WPOBE_array.Count(); i++)
12799 {
12800 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12801
12802 if (WPOBE)
12803 {
12804 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12805 }
12806 }
12807 }
12808 }
12809
12810 // Plays all weapon overheating particles
12811 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12812 {
12813 int id = muzzle_owner.GetMuzzleID();
12814 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12815
12816 if (WPOOH_array)
12817 {
12818 for (int i = 0; i < WPOOH_array.Count(); i++)
12819 {
12820 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12821
12822 if (WPOOH)
12823 {
12824 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12825 }
12826 }
12827 }
12828 }
12829
12830 // Updates all weapon overheating particles
12831 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12832 {
12833 int id = muzzle_owner.GetMuzzleID();
12834 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12835
12836 if (WPOOH_array)
12837 {
12838 for (int i = 0; i < WPOOH_array.Count(); i++)
12839 {
12840 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12841
12842 if (WPOOH)
12843 {
12844 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12845 }
12846 }
12847 }
12848 }
12849
12850 // Stops overheating particles
12851 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12852 {
12853 int id = muzzle_owner.GetMuzzleID();
12854 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12855
12856 if (WPOOH_array)
12857 {
12858 for (int i = 0; i < WPOOH_array.Count(); i++)
12859 {
12860 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12861
12862 if (WPOOH)
12863 {
12864 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12865 }
12866 }
12867 }
12868 }
12869
12870 //----------------------------------------------------------------
12871 //Item Behaviour - unified approach
12872 override bool IsHeavyBehaviour()
12873 {
12874 if (m_ItemBehaviour == 0)
12875 {
12876 return true;
12877 }
12878
12879 return false;
12880 }
12881
12882 override bool IsOneHandedBehaviour()
12883 {
12884 if (m_ItemBehaviour == 1)
12885 {
12886 return true;
12887 }
12888
12889 return false;
12890 }
12891
12892 override bool IsTwoHandedBehaviour()
12893 {
12894 if (m_ItemBehaviour == 2)
12895 {
12896 return true;
12897 }
12898
12899 return false;
12900 }
12901
12902 bool IsDeployable()
12903 {
12904 return false;
12905 }
12906
12908 float GetDeployTime()
12909 {
12910 return UATimeSpent.DEFAULT_DEPLOY;
12911 }
12912
12913
12914 //----------------------------------------------------------------
12915 // Item Targeting (User Actions)
12916 override void SetTakeable(bool pState)
12917 {
12918 m_IsTakeable = pState;
12919 SetSynchDirty();
12920 }
12921
12922 override bool IsTakeable()
12923 {
12924 return m_IsTakeable;
12925 }
12926
12927 // For cases where we want to show object widget which cant be taken to hands
12929 {
12930 return false;
12931 }
12932
12934 protected void PreLoadSoundAttachmentType()
12935 {
12936 string att_type = "None";
12937
12938 if (ConfigIsExisting("soundAttType"))
12939 {
12940 att_type = ConfigGetString("soundAttType");
12941 }
12942
12943 m_SoundAttType = att_type;
12944 }
12945
12946 override string GetAttachmentSoundType()
12947 {
12948 return m_SoundAttType;
12949 }
12950
12951 //----------------------------------------------------------------
12952 //SOUNDS - ItemSoundHandler
12953 //----------------------------------------------------------------
12954
12955 string GetPlaceSoundset(); // played when deploy starts
12956 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12957 string GetDeploySoundset(); // played when deploy sucessfully finishes
12958
12960 {
12961 if (!m_ItemSoundHandler)
12963
12964 return m_ItemSoundHandler;
12965 }
12966
12967 // override to initialize sounds
12968 protected void InitItemSounds()
12969 {
12970 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
12971 return;
12972
12974
12975 if (GetPlaceSoundset() != string.Empty)
12976 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12977
12978 if (GetDeploySoundset() != string.Empty)
12979 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12980
12981 SoundParameters params = new SoundParameters();
12982 params.m_Loop = true;
12983 if (GetLoopDeploySoundset() != string.Empty)
12984 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12985 }
12986
12987 // Start sound using ItemSoundHandler
12988 void StartItemSoundServer(int id)
12989 {
12990 if (!GetGame().IsServer())
12991 return;
12992
12993 m_SoundSyncPlay = id;
12994 SetSynchDirty();
12995
12996 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12998 }
12999
13000 // Stop sound using ItemSoundHandler
13001 void StopItemSoundServer(int id)
13002 {
13003 if (!GetGame().IsServer())
13004 return;
13005
13006 m_SoundSyncStop = id;
13007 SetSynchDirty();
13008
13009 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
13011 }
13012
13013 protected void ClearStartItemSoundServer()
13014 {
13015 m_SoundSyncPlay = 0;
13016 }
13017
13018 protected void ClearStopItemSoundServer()
13019 {
13020 m_SoundSyncStop = 0;
13021 }
13022
13024 void PlayAttachSound(string slot_type)
13025 {
13026 if (!GetGame().IsDedicatedServer())
13027 {
13028 if (ConfigIsExisting("attachSoundSet"))
13029 {
13030 string cfg_path = "";
13031 string soundset = "";
13032 string type_name = GetType();
13033
13034 TStringArray cfg_soundset_array = new TStringArray;
13035 TStringArray cfg_slot_array = new TStringArray;
13036 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13037 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13038
13039 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13040 {
13041 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13042 {
13043 if (cfg_slot_array[i] == slot_type)
13044 {
13045 soundset = cfg_soundset_array[i];
13046 break;
13047 }
13048 }
13049 }
13050
13051 if (soundset != "")
13052 {
13053 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13054 sound.SetAutodestroy(true);
13055 }
13056 }
13057 }
13058 }
13059
13060 void PlayDetachSound(string slot_type)
13061 {
13062 //TODO - evaluate if needed and devise universal config structure if so
13063 }
13064
13065 void OnApply(PlayerBase player);
13066
13068 {
13069 return 1.0;
13070 };
13071 //returns applicable selection
13072 array<string> GetHeadHidingSelection()
13073 {
13075 }
13076
13078 {
13080 }
13081
13082 WrittenNoteData GetWrittenNoteData() {};
13083
13085 {
13086 SetDynamicPhysicsLifeTime(0.01);
13087 m_ItemBeingDroppedPhys = false;
13088 }
13089
13091 {
13092 array<string> zone_names = new array<string>;
13093 GetDamageZones(zone_names);
13094 for (int i = 0; i < zone_names.Count(); i++)
13095 {
13096 SetHealthMax(zone_names.Get(i),"Health");
13097 }
13098 SetHealthMax("","Health");
13099 }
13100
13102 void SetZoneDamageCEInit()
13103 {
13104 float global_health = GetHealth01("","Health");
13105 array<string> zones = new array<string>;
13106 GetDamageZones(zones);
13107 //set damage of all zones to match global health level
13108 for (int i = 0; i < zones.Count(); i++)
13109 {
13110 SetHealth01(zones.Get(i),"Health",global_health);
13111 }
13112 }
13113
13115 bool IsCoverFaceForShave(string slot_name)
13116 {
13117 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13118 }
13119
13120 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13121 {
13122 if (!hasRootAsPlayer)
13123 {
13124 if (refParentIB)
13125 {
13126 // parent is wet
13127 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13128 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13129 // parent has liquid inside
13130 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13131 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13132 // drying
13133 else if (m_VarWet > m_VarWetMin)
13134 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13135 }
13136 else
13137 {
13138 // drying on ground or inside non-itembase (car, ...)
13139 if (m_VarWet > m_VarWetMin)
13140 AddWet(-1 * delta * GetDryingIncrement("ground"));
13141 }
13142 }
13143 }
13144
13145 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13146 {
13148 {
13149 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13150 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13151 {
13152 float heatPermCoef = 1.0;
13153 EntityAI ent = this;
13154 while (ent)
13155 {
13156 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13157 ent = ent.GetHierarchyParent();
13158 }
13159
13160 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13161 }
13162 }
13163 }
13164
13165 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13166 {
13167 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13168 EntityAI parent = GetHierarchyParent();
13169 if (!parent)
13170 {
13171 hasParent = false;
13172 hasRootAsPlayer = false;
13173 }
13174 else
13175 {
13176 hasParent = true;
13177 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13178 refParentIB = ItemBase.Cast(parent);
13179 }
13180 }
13181
13182 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13183 {
13184 // this is stub, implemented on Edible_Base
13185 }
13186
13187 bool CanDecay()
13188 {
13189 // return true used on selected food clases so they can decay
13190 return false;
13191 }
13192
13193 protected bool CanProcessDecay()
13194 {
13195 // this is stub, implemented on Edible_Base class
13196 // used to determine whether it is still necessary for the food to decay
13197 return false;
13198 }
13199
13200 protected bool CanHaveWetness()
13201 {
13202 // return true used on selected items that have a wetness effect
13203 return false;
13204 }
13205
13207 bool CanBeConsumed(ConsumeConditionData data = null)
13208 {
13209 return !GetIsFrozen() && IsOpen();
13210 }
13211
13212 override void ProcessVariables()
13213 {
13214 bool hasParent = false, hasRootAsPlayer = false;
13215 ItemBase refParentIB;
13216
13217 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13218 bool foodDecay = g_Game.IsFoodDecayEnabled();
13219
13220 if (wwtu || foodDecay)
13221 {
13222 bool processWetness = wwtu && CanHaveWetness();
13223 bool processTemperature = wwtu && CanHaveTemperature();
13224 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13225
13226 if (processWetness || processTemperature || processDecay)
13227 {
13228 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13229
13230 if (processWetness)
13231 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13232
13233 if (processTemperature)
13234 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13235
13236 if (processDecay)
13237 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13238 }
13239 }
13240 }
13241
13244 {
13245 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13246 }
13247
13248 override float GetTemperatureFreezeThreshold()
13249 {
13251 return Liquid.GetFreezeThreshold(GetLiquidType());
13252
13253 return super.GetTemperatureFreezeThreshold();
13254 }
13255
13256 override float GetTemperatureThawThreshold()
13257 {
13259 return Liquid.GetThawThreshold(GetLiquidType());
13260
13261 return super.GetTemperatureThawThreshold();
13262 }
13263
13264 override float GetItemOverheatThreshold()
13265 {
13267 return Liquid.GetBoilThreshold(GetLiquidType());
13268
13269 return super.GetItemOverheatThreshold();
13270 }
13271
13272 override float GetTemperatureFreezeTime()
13273 {
13274 if (HasQuantity())
13275 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13276
13277 return super.GetTemperatureFreezeTime();
13278 }
13279
13280 override float GetTemperatureThawTime()
13281 {
13282 if (HasQuantity())
13283 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13284
13285 return super.GetTemperatureThawTime();
13286 }
13287
13289 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13291 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13292
13293 bool IsCargoException4x3(EntityAI item)
13294 {
13295 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13296 }
13297
13299 {
13300 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13301 }
13302
13304 void AddLightSourceItem(ItemBase lightsource)
13305 {
13306 m_LightSourceItem = lightsource;
13307 }
13308
13310 {
13311 m_LightSourceItem = null;
13312 }
13313
13315 {
13316 return m_LightSourceItem;
13317 }
13318
13320 array<int> GetValidFinishers()
13321 {
13322 return null;
13323 }
13324
13326 bool GetActionWidgetOverride(out typename name)
13327 {
13328 return false;
13329 }
13330
13331 bool PairWithDevice(notnull ItemBase otherDevice)
13332 {
13333 if (GetGame().IsServer())
13334 {
13335 ItemBase explosive = otherDevice;
13337 if (!trg)
13338 {
13339 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13340 explosive = this;
13341 }
13342
13343 explosive.PairRemote(trg);
13344 trg.SetControlledDevice(explosive);
13345
13346 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13347 trg.SetPersistentPairID(persistentID);
13348 explosive.SetPersistentPairID(persistentID);
13349
13350 return true;
13351 }
13352 return false;
13353 }
13354
13356 float GetBaitEffectivity()
13357 {
13358 float ret = 1.0;
13359 if (HasQuantity())
13360 ret *= GetQuantityNormalized();
13361 ret *= GetHealth01();
13362
13363 return ret;
13364 }
13365
13366 #ifdef DEVELOPER
13367 override void SetDebugItem()
13368 {
13369 super.SetDebugItem();
13370 _itemBase = this;
13371 }
13372
13373 override string GetDebugText()
13374 {
13375 string text = super.GetDebugText();
13376
13377 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13378 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13379
13380 return text;
13381 }
13382 #endif
13383
13384 bool CanBeUsedForSuicide()
13385 {
13386 return true;
13387 }
13388
13390 //DEPRECATED BELOW
13392 // Backwards compatibility
13393 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13394 {
13395 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13396 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13397 }
13398
13399 // replaced by ItemSoundHandler
13400 protected EffectSound m_SoundDeployFinish;
13401 protected EffectSound m_SoundPlace;
13402 protected EffectSound m_DeployLoopSoundEx;
13403 protected EffectSound m_SoundDeploy;
13404 bool m_IsPlaceSound;
13405 bool m_IsDeploySound;
13407
13408 string GetDeployFinishSoundset();
13409 void PlayDeploySound();
13410 void PlayDeployFinishSound();
13411 void PlayPlaceSound();
13412 void PlayDeployLoopSoundEx();
13413 void StopDeployLoopSoundEx();
13414 void SoundSynchRemoteReset();
13415 void SoundSynchRemote();
13416 bool UsesGlobalDeploy(){return false;}
13417 bool CanPlayDeployLoopSound(){return false;}
13419 bool IsPlaceSound(){return m_IsPlaceSound;}
13420 bool IsDeploySound(){return m_IsDeploySound;}
13421 void SetIsPlaceSound(bool is_place_sound);
13422 void SetIsDeploySound(bool is_deploy_sound);
13423}
13424
13425EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13426{
13427 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13428 if (entity)
13429 {
13430 bool is_item = entity.IsInherited(ItemBase);
13431 if (is_item && full_quantity)
13432 {
13433 ItemBase item = ItemBase.Cast(entity);
13434 item.SetQuantity(item.GetQuantityInit());
13435 }
13436 }
13437 else
13438 {
13439 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13440 return NULL;
13441 }
13442 return entity;
13443}
13444
13445void SetupSpawnedItem(ItemBase item, float health, float quantity)
13446{
13447 if (item)
13448 {
13449 if (health > 0)
13450 item.SetHealth("", "", health);
13451
13452 if (item.CanHaveTemperature())
13453 {
13454 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13455 if (item.CanFreeze())
13456 item.SetFrozen(false);
13457 }
13458
13459 if (item.HasEnergyManager())
13460 {
13461 if (quantity >= 0)
13462 {
13463 item.GetCompEM().SetEnergy0To1(quantity);
13464 }
13465 else
13466 {
13467 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13468 }
13469 }
13470 else if (item.IsMagazine())
13471 {
13472 Magazine mag = Magazine.Cast(item);
13473 if (quantity >= 0)
13474 {
13475 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13476 }
13477 else
13478 {
13479 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13480 }
13481
13482 }
13483 else
13484 {
13485 if (quantity >= 0)
13486 {
13487 item.SetQuantityNormalized(quantity, false);
13488 }
13489 else
13490 {
13491 item.SetQuantity(Math.AbsFloat(quantity));
13492 }
13493
13494 }
13495 }
13496}
13497
13498#ifdef DEVELOPER
13499ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13500#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8078
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
Определения ItemBase.c:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
InventoryLocation.
Определения InventoryLocation.c:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1012
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения InventoryItem.c:731
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()

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