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

◆ GetWetLevel()

override EWetnessLevel SpawnItemOnLocation::GetWetLevel ( )
protected

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

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