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

◆ GetWetMax()

override float SpawnItemOnLocation::GetWetMax ( )
protected

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

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

Используется в Entity::HasWetness(), InventoryItem::InitItemVariables(), InventoryItem::OnAction() и InventoryItem::SetWet().