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

◆ GetItemAttachOffset()

float SpawnItemOnLocation::GetItemAttachOffset ( )
protected

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

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