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

◆ RemoveAgent()

override void SpawnItemOnLocation::RemoveAgent ( int agent_id)
protected

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

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