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

◆ GetSoakingIncrement()

float SpawnItemOnLocation::GetSoakingIncrement ( string pIncrementName)
protected

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

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