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

◆ OnWetChanged()

override void SpawnItemOnLocation::OnWetChanged ( float newVal,
float oldVal )
protected

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

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