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

◆ SetStoreLoadedQuantity()

override void SpawnItemOnLocation::SetStoreLoadedQuantity ( float value)
protected

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

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

Используется в InventoryItem::AfterStoreLoad(), InventoryItem::DeSerializeNumericalVars() и InventoryItem::ReadVarsFromCTX().