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

◆ OnPlacementComplete()

override void SpawnItemOnLocation::OnPlacementComplete ( Man player,
vector position = "0 0 0",
vector orientation = "0 0 0" )
protected

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

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