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

◆ GetAgents()

override int SpawnItemOnLocation::GetAgents ( )
protected

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

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

Используется в BakedBeansCan_Opened::CanProcessDecay(), PeachesCan_Opened::CanProcessDecay(), SardinesCan_Opened::CanProcessDecay(), SpaghettiCan_Opened::CanProcessDecay(), TunaCan_Opened::CanProcessDecay() и SetActions().