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

◆ GetLiquidType()

override int SpawnItemOnLocation::GetLiquidType ( )
protected

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

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

Используется в ActionFillBottleBase::ActionCondition(), InventoryItem::GetItemOverheatThreshold(), InventoryItem::GetTemperatureFreezeThreshold(), InventoryItem::GetTemperatureThawThreshold(), InventoryItem::IsLiquidPresent(), InventoryItem::OnAction(), Barrel_ColorBase::OnFreezeStateChangeServer(), OnFreezeStateChangeServer(), InventoryItem::OnQuantityChanged() и InventoryItem::WriteVarsToCTX().