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

◆ SetStoreLoadedQuantity()

override void SpawnItemOnLocation::SetStoreLoadedQuantity ( float value)
protected

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

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

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