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

◆ GetTemperatureThawThreshold()

override float SpawnItemOnLocation::GetTemperatureThawThreshold ( )
protected

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

9597{
9598 override bool CanPutAsAttachment(EntityAI parent)
9599 {
9600 return true;
9601 }
9602};
9603
9605{
9606
9607};
9608
9609//const bool QUANTITY_DEBUG_REMOVE_ME = false;
9610
9611class ItemBase extends InventoryItem
9612{
9616
9618
9619 static int m_DebugActionsMask;
9621 // ============================================
9622 // Variable Manipulation System
9623 // ============================================
9624 // Quantity
9625
9626 float m_VarQuantity;
9627 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
9629 int m_VarQuantityMin;
9630 int m_VarQuantityMax;
9631 int m_Count;
9632 float m_VarStackMax;
9633 float m_StoreLoadedQuantity = float.LOWEST;
9634 // Wet
9635 float m_VarWet;
9636 float m_VarWetPrev;//for client to know wetness changed during synchronization
9637 float m_VarWetInit;
9638 float m_VarWetMin;
9639 float m_VarWetMax;
9640 // Cleanness
9641 int m_Cleanness;
9642 int m_CleannessInit;
9643 int m_CleannessMin;
9644 int m_CleannessMax;
9645 // impact sounds
9647 bool m_CanPlayImpactSound = true;
9648 float m_ImpactSpeed;
9650 //
9651 float m_HeatIsolation;
9652 float m_ItemModelLength;
9653 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
9655 int m_VarLiquidType;
9656 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
9657 int m_QuickBarBonus;
9658 bool m_IsBeingPlaced;
9659 bool m_IsHologram;
9660 bool m_IsTakeable;
9661 bool m_ThrowItemOnDrop;
9664 bool m_FixDamageSystemInit = false; //can be changed on storage version check
9665 bool can_this_be_combined; //Check if item can be combined
9666 bool m_CanThisBeSplit; //Check if item can be split
9667 bool m_IsStoreLoad = false;
9668 bool m_CanShowQuantity;
9669 bool m_HasQuantityBar;
9670 protected bool m_CanBeDigged;
9671 protected bool m_IsResultOfSplit
9672
9673 string m_SoundAttType;
9674 // items color variables
9679 //-------------------------------------------------------
9680
9681 // light source managing
9683
9687
9688 //==============================================
9689 // agent system
9690 private int m_AttachedAgents;
9691
9693 void TransferModifiers(PlayerBase reciever);
9694
9695
9696 // Weapons & suppressors particle effects
9700 ref static map<string, int> m_WeaponTypeToID;
9701 static int m_LastRegisteredWeaponID = 0;
9702
9703 // Overheating effects
9705 float m_OverheatingShots;
9706 ref Timer m_CheckOverheating;
9707 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
9708 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
9709 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
9710 ref array <ref OverheatingParticle> m_OverheatingParticles;
9711
9713 protected bool m_HideSelectionsBySlot;
9714
9715 // Admin Log
9716 PluginAdminLog m_AdminLog;
9717
9718 // misc
9719 ref Timer m_PhysDropTimer;
9720
9721 // Attachment Locking variables
9722 ref array<int> m_CompatibleLocks;
9723 protected int m_LockType;
9724 protected ref EffectSound m_LockingSound;
9725 protected string m_LockSoundSet;
9726
9727 // ItemSoundHandler variables
9728 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
9729 protected int m_SoundSyncPlay; // id for sound to play
9730 protected int m_SoundSyncStop; // id for sound to stop
9731 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
9732
9734
9735 //temperature
9736 private float m_TemperaturePerQuantityWeight;
9737
9738 // -------------------------------------------------------------------------
9739 void ItemBase()
9740 {
9741 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
9745
9746 if (!g_Game.IsDedicatedServer())
9747 {
9748 if (HasMuzzle())
9749 {
9751
9753 {
9755 }
9756 }
9757
9759 m_ActionsInitialize = false;
9760 }
9761
9762 m_OldLocation = null;
9763
9764 if (g_Game.IsServer())
9765 {
9766 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
9767 }
9768
9769 if (ConfigIsExisting("headSelectionsToHide"))
9770 {
9772 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
9773 }
9774
9775 m_HideSelectionsBySlot = false;
9776 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9777 {
9778 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
9779 }
9780
9781 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
9782
9783 m_IsResultOfSplit = false;
9784
9786 }
9787
9788 override void InitItemVariables()
9789 {
9790 super.InitItemVariables();
9791
9792 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
9793 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
9794 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
9795 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
9796 m_VarStackMax = ConfigGetFloat("varStackMax");
9797 m_Count = ConfigGetInt("count");
9798
9799 m_CanShowQuantity = ConfigGetBool("quantityShow");
9800 m_HasQuantityBar = ConfigGetBool("quantityBar");
9801
9802 m_CleannessInit = ConfigGetInt("varCleannessInit");
9804 m_CleannessMin = ConfigGetInt("varCleannessMin");
9805 m_CleannessMax = ConfigGetInt("varCleannessMax");
9806
9807 m_WantPlayImpactSound = false;
9808 m_ImpactSpeed = 0.0;
9809
9810 m_VarWetInit = ConfigGetFloat("varWetInit");
9812 m_VarWetMin = ConfigGetFloat("varWetMin");
9813 m_VarWetMax = ConfigGetFloat("varWetMax");
9814
9815 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
9816 if (IsLiquidContainer() && GetQuantity() != 0)
9818 m_IsBeingPlaced = false;
9819 m_IsHologram = false;
9820 m_IsTakeable = true;
9821 m_CanBeMovedOverride = false;
9825 m_CanBeDigged = ConfigGetBool("canBeDigged");
9826
9827 m_CompatibleLocks = new array<int>();
9828 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
9829 m_LockType = ConfigGetInt("lockType");
9830
9831 //Define if item can be split and set ability to be combined accordingly
9832 m_CanThisBeSplit = false;
9833 can_this_be_combined = false;
9834 if (ConfigIsExisting("canBeSplit"))
9835 {
9836 can_this_be_combined = ConfigGetBool("canBeSplit");
9838 }
9839
9840 m_ItemBehaviour = -1;
9841 if (ConfigIsExisting("itemBehaviour"))
9842 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
9843
9844 //RegisterNetSyncVariableInt("m_VariablesMask");
9845 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9846 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
9847 RegisterNetSyncVariableInt("m_VarLiquidType");
9848 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9849
9850 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9851 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9852 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9853
9854 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9855 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9856 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9857 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9858
9859 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9860 RegisterNetSyncVariableBool("m_IsTakeable");
9861 RegisterNetSyncVariableBool("m_IsHologram");
9862
9865 {
9866 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
9867 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
9868 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
9869 }
9870
9871 m_LockSoundSet = ConfigGetString("lockSoundSet");
9872
9874 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9875 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
9876
9877 m_SoundSyncSlotID = -1;
9878 }
9879
9880 override int GetQuickBarBonus()
9881 {
9882 return m_QuickBarBonus;
9883 }
9884
9885 void InitializeActions()
9886 {
9888 if (!m_InputActionMap)
9889 {
9891 m_InputActionMap = iam;
9892 SetActions();
9894 }
9895 }
9896
9897 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
9898 {
9900 {
9901 m_ActionsInitialize = true;
9903 }
9904
9905 actions = m_InputActionMap.Get(action_input_type);
9906 }
9907
9908 void SetActions()
9909 {
9910 AddAction(ActionTakeItem);
9911 AddAction(ActionTakeItemToHands);
9912 AddAction(ActionWorldCraft);
9914 AddAction(ActionAttachWithSwitch);
9915 }
9916
9917 void SetActionAnimOverrides(); // Override action animation for specific item
9918
9919 void AddAction(typename actionName)
9920 {
9921 ActionBase action = ActionManagerBase.GetAction(actionName);
9922
9923 if (!action)
9924 {
9925 Debug.LogError("Action " + actionName + " dosn't exist!");
9926 return;
9927 }
9928
9929 typename ai = action.GetInputType();
9930 if (!ai)
9931 {
9932 m_ActionsInitialize = false;
9933 return;
9934 }
9935
9936 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9937 if (!action_array)
9938 {
9939 action_array = new array<ActionBase_Basic>;
9940 m_InputActionMap.Insert(ai, action_array);
9941 }
9942 if (LogManager.IsActionLogEnable())
9943 {
9944 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
9945 }
9946
9947 if (action_array.Find(action) != -1)
9948 {
9949 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
9950 }
9951 else
9952 {
9953 action_array.Insert(action);
9954 }
9955 }
9956
9957 void RemoveAction(typename actionName)
9958 {
9959 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9960 ActionBase action = player.GetActionManager().GetAction(actionName);
9961 typename ai = action.GetInputType();
9962 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9963
9964 if (action_array)
9965 {
9966 action_array.RemoveItem(action);
9967 }
9968 }
9969
9970 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9971 // Set -1 for params which should stay in default state
9972 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9973 {
9974 ActionOverrideData overrideData = new ActionOverrideData();
9975 overrideData.m_CommandUID = commandUID;
9976 overrideData.m_CommandUIDProne = commandUIDProne;
9977 overrideData.m_StanceMask = stanceMask;
9978
9979 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9980 if (!actionMap) // create new map of action > overidables map
9981 {
9982 actionMap = new TActionAnimOverrideMap();
9983 m_ItemActionOverrides.Insert(action, actionMap);
9984 }
9985
9986 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9987
9988 }
9989
9990 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9991
9992 ScriptedLightBase GetLight();
9993
9994 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9995 void LoadParticleConfigOnFire(int id)
9996 {
9997 if (!m_OnFireEffect)
9999
10002
10003 string config_to_search = "CfgVehicles";
10004 string muzzle_owner_config;
10005
10006 if (!m_OnFireEffect.Contains(id))
10007 {
10008 if (IsInherited(Weapon))
10009 config_to_search = "CfgWeapons";
10010
10011 muzzle_owner_config = config_to_search + " " + GetType() + " ";
10012
10013 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
10014
10015 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
10016
10017 if (config_OnFire_subclass_count > 0)
10018 {
10019 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
10020
10021 for (int i = 0; i < config_OnFire_subclass_count; i++)
10022 {
10023 string particle_class = "";
10024 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
10025 string config_OnFire_entry = config_OnFire_class + particle_class;
10026 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
10027 WPOF_array.Insert(WPOF);
10028 }
10029
10030
10031 m_OnFireEffect.Insert(id, WPOF_array);
10032 }
10033 }
10034
10035 if (!m_OnBulletCasingEjectEffect.Contains(id))
10036 {
10037 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
10038 muzzle_owner_config = config_to_search + " " + GetType() + " ";
10039
10040 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
10041
10042 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
10043
10044 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
10045 {
10046 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
10047
10048 for (i = 0; i < config_OnBulletCasingEject_count; i++)
10049 {
10050 string particle_class2 = "";
10051 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
10052 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
10053 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
10054 WPOBE_array.Insert(WPOBE);
10055 }
10056
10057
10058 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
10059 }
10060 }
10061 }
10062
10063 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
10065 {
10068
10069 if (!m_OnOverheatingEffect.Contains(id))
10070 {
10071 string config_to_search = "CfgVehicles";
10072
10073 if (IsInherited(Weapon))
10074 config_to_search = "CfgWeapons";
10075
10076 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
10077 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10078
10079 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
10080 {
10081
10082 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
10083
10085 {
10086 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
10087 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10088 Error(error);
10089 return;
10090 }
10091
10092 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
10093 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
10094
10095
10096
10097 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
10098 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10099
10100 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10101 {
10102 string particle_class = "";
10103 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
10104 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10105 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
10106
10107 if (entry_type == CT_CLASS)
10108 {
10109 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10110 WPOOH_array.Insert(WPOF);
10111 }
10112 }
10113
10114
10115 m_OnOverheatingEffect.Insert(id, WPOOH_array);
10116 }
10117 }
10118 }
10119
10120 float GetOverheatingValue()
10121 {
10122 return m_OverheatingShots;
10123 }
10124
10125 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10126 {
10127 if (m_MaxOverheatingValue > 0)
10128 {
10130
10131 if (!m_CheckOverheating)
10133
10135 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
10136
10137 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10138 }
10139 }
10140
10141 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
10142 {
10144 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10145
10147 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10148
10150 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10151
10153 {
10155 }
10156 }
10157
10159 {
10161 }
10162
10163 void OnOverheatingDecay()
10164 {
10165 if (m_MaxOverheatingValue > 0)
10166 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
10167 else
10169
10170 if (m_OverheatingShots <= 0)
10171 {
10174 }
10175 else
10176 {
10177 if (!m_CheckOverheating)
10179
10181 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
10182 }
10183
10184 CheckOverheating(this, "", this);
10185 }
10186
10187 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
10188 {
10190 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
10191 }
10192
10193 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
10194 {
10196 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
10198 }
10199
10200 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
10201 {
10203 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10204 }
10205
10206 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
10207 {
10209 m_OverheatingParticles = new array<ref OverheatingParticle>;
10210
10211 OverheatingParticle OP = new OverheatingParticle();
10212 OP.RegisterParticle(p);
10213 OP.SetOverheatingLimitMin(min_heat_coef);
10214 OP.SetOverheatingLimitMax(max_heat_coef);
10215 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
10216
10217 m_OverheatingParticles.Insert(OP);
10218 }
10219
10220 float GetOverheatingCoef()
10221 {
10222 if (m_MaxOverheatingValue > 0)
10224
10225 return -1;
10226 }
10227
10229 {
10231 {
10232 float overheat_coef = GetOverheatingCoef();
10233 int count = m_OverheatingParticles.Count();
10234
10235 for (int i = count; i > 0; --i)
10236 {
10237 int id = i - 1;
10238 OverheatingParticle OP = m_OverheatingParticles.Get(id);
10239 Particle p = OP.GetParticle();
10240
10241 float overheat_min = OP.GetOverheatingLimitMin();
10242 float overheat_max = OP.GetOverheatingLimitMax();
10243
10244 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10245 {
10246 if (p)
10247 {
10248 p.Stop();
10249 OP.RegisterParticle(null);
10250 }
10251 }
10252 }
10253 }
10254 }
10255
10257 {
10259 {
10260 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
10261 {
10262 int id = i - 1;
10263 OverheatingParticle OP = m_OverheatingParticles.Get(id);
10264
10265 if (OP)
10266 {
10267 Particle p = OP.GetParticle();
10268
10269 if (p)
10270 {
10271 p.Stop();
10272 }
10273
10274 delete OP;
10275 }
10276 }
10277
10278 m_OverheatingParticles.Clear();
10280 }
10281 }
10282
10284 float GetInfectionChance(int system = 0, Param param = null)
10285 {
10286 return 0.0;
10287 }
10288
10289
10290 float GetDisinfectQuantity(int system = 0, Param param1 = null)
10291 {
10292 return 250;//default value
10293 }
10294
10295 float GetFilterDamageRatio()
10296 {
10297 return 0;
10298 }
10299
10301 bool HasMuzzle()
10302 {
10303 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
10304 return true;
10305
10306 return false;
10307 }
10308
10310 int GetMuzzleID()
10311 {
10312 if (!m_WeaponTypeToID)
10313 m_WeaponTypeToID = new map<string, int>;
10314
10315 if (m_WeaponTypeToID.Contains(GetType()))
10316 {
10317 return m_WeaponTypeToID.Get(GetType());
10318 }
10319 else
10320 {
10321 // Register new weapon ID
10323 }
10324
10326 }
10327
10334 {
10335 return -1;
10336 }
10337
10338
10339
10340 // -------------------------------------------------------------------------
10341 void ~ItemBase()
10342 {
10343 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
10344 {
10345 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10346 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10347
10348 if (r_index >= 0)
10349 {
10350 InventoryLocation r_il = new InventoryLocation;
10351 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10352
10353 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10354 int r_type = r_il.GetType();
10355 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10356 {
10357 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10358 }
10359 else if (r_type == InventoryLocationType.ATTACHMENT)
10360 {
10361 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10362 }
10363
10364 }
10365
10366 player.GetHumanInventory().ClearUserReservedLocation(this);
10367 }
10368
10369 if (m_LockingSound)
10370 SEffectManager.DestroyEffect(m_LockingSound);
10371 }
10372
10373
10374
10375 // -------------------------------------------------------------------------
10376 static int GetDebugActionsMask()
10377 {
10378 return ItemBase.m_DebugActionsMask;
10379 }
10380
10381 static bool HasDebugActionsMask(int mask)
10382 {
10383 return ItemBase.m_DebugActionsMask & mask;
10384 }
10385
10386 static void SetDebugActionsMask(int mask)
10387 {
10388 ItemBase.m_DebugActionsMask = mask;
10389 }
10390
10391 static void AddDebugActionsMask(int mask)
10392 {
10393 ItemBase.m_DebugActionsMask |= mask;
10394 }
10395
10396 static void RemoveDebugActionsMask(int mask)
10397 {
10398 ItemBase.m_DebugActionsMask &= ~mask;
10399 }
10400
10401 static void ToggleDebugActionsMask(int mask)
10402 {
10403 if (HasDebugActionsMask(mask))
10404 {
10406 }
10407 else
10408 {
10409 AddDebugActionsMask(mask);
10410 }
10411 }
10412
10413 // -------------------------------------------------------------------------
10414 void SetCEBasedQuantity()
10415 {
10416 if (GetEconomyProfile())
10417 {
10418 float q_max = GetEconomyProfile().GetQuantityMax();
10419 if (q_max > 0)
10420 {
10421 float q_min = GetEconomyProfile().GetQuantityMin();
10422 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10423
10424 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
10425 {
10426 ComponentEnergyManager comp = GetCompEM();
10427 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
10428 {
10429 comp.SetEnergy0To1(quantity_randomized);
10430 }
10431 }
10432 else if (HasQuantity())
10433 {
10434 SetQuantityNormalized(quantity_randomized, false);
10435 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
10436 }
10437
10438 }
10439 }
10440 }
10441
10443 void LockToParent()
10444 {
10445 EntityAI parent = GetHierarchyParent();
10446
10447 if (parent)
10448 {
10449 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10450 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10451 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
10452 }
10453 }
10454
10456 void UnlockFromParent()
10457 {
10458 EntityAI parent = GetHierarchyParent();
10459
10460 if (parent)
10461 {
10462 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10463 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10464 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
10465 }
10466 }
10467
10468 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
10469 {
10470 /*
10471 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
10472 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
10473 */
10474 ItemBase item2 = ItemBase.Cast(entity2);
10475
10476 if (g_Game.IsClient())
10477 {
10478 if (ScriptInputUserData.CanStoreInputUserData())
10479 {
10480 ScriptInputUserData ctx = new ScriptInputUserData;
10482 ctx.Write(-1);
10483 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10484 ctx.Write(i1);
10485 ctx.Write(item2);
10486 ctx.Write(use_stack_max);
10487 ctx.Write(-1);
10488 ctx.Send();
10489
10490 if (IsCombineAll(item2, use_stack_max))
10491 {
10492 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10493 }
10494 }
10495 }
10496 else if (!g_Game.IsMultiplayer())
10497 {
10498 CombineItems(item2, use_stack_max);
10499 }
10500 }
10501
10502 bool IsLiquidPresent()
10503 {
10504 return (GetLiquidType() != 0 && HasQuantity());
10505 }
10506
10507 bool IsLiquidContainer()
10508 {
10509 return m_LiquidContainerMask != 0;
10510 }
10511
10513 {
10514 return m_LiquidContainerMask;
10515 }
10516
10517 bool IsBloodContainer()
10518 {
10519 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
10520 return false;
10521 }
10522
10523 bool IsNVG()
10524 {
10525 return false;
10526 }
10527
10530 bool IsExplosive()
10531 {
10532 return false;
10533 }
10534
10536 {
10537 return "";
10538 }
10539
10541
10542 bool IsLightSource()
10543 {
10544 return false;
10545 }
10546
10548 {
10549 return true;
10550 }
10551
10552 //--- ACTION CONDITIONS
10553 //direction
10554 bool IsFacingPlayer(PlayerBase player, string selection)
10555 {
10556 return true;
10557 }
10558
10559 bool IsPlayerInside(PlayerBase player, string selection)
10560 {
10561 return true;
10562 }
10563
10564 override bool CanObstruct()
10565 {
10566 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10567 return !player || !IsPlayerInside(player, "");
10568 }
10569
10570 override bool IsBeingPlaced()
10571 {
10572 return m_IsBeingPlaced;
10573 }
10574
10575 void SetIsBeingPlaced(bool is_being_placed)
10576 {
10577 m_IsBeingPlaced = is_being_placed;
10578 if (!is_being_placed)
10580 SetSynchDirty();
10581 }
10582
10583 //server-side
10584 void OnEndPlacement() {}
10585
10586 override bool IsHologram()
10587 {
10588 return m_IsHologram;
10589 }
10590
10591 bool CanBeDigged()
10592 {
10593 return m_CanBeDigged;
10594 }
10595
10597 {
10598 return 1;
10599 }
10600
10601 bool CanMakeGardenplot()
10602 {
10603 return false;
10604 }
10605
10606 void SetIsHologram(bool is_hologram)
10607 {
10608 m_IsHologram = is_hologram;
10609 SetSynchDirty();
10610 }
10611 /*
10612 protected float GetNutritionalEnergy()
10613 {
10614 Edible_Base edible = Edible_Base.Cast(this);
10615 return edible.GetFoodEnergy();
10616 }
10617
10618 protected float GetNutritionalWaterContent()
10619 {
10620 Edible_Base edible = Edible_Base.Cast(this);
10621 return edible.GetFoodWater();
10622 }
10623
10624 protected float GetNutritionalIndex()
10625 {
10626 Edible_Base edible = Edible_Base.Cast(this);
10627 return edible.GetFoodNutritionalIndex();
10628 }
10629
10630 protected float GetNutritionalFullnessIndex()
10631 {
10632 Edible_Base edible = Edible_Base.Cast(this);
10633 return edible.GetFoodTotalVolume();
10634 }
10635
10636 protected float GetNutritionalToxicity()
10637 {
10638 Edible_Base edible = Edible_Base.Cast(this);
10639 return edible.GetFoodToxicity();
10640
10641 }
10642 */
10643
10644
10645 // -------------------------------------------------------------------------
10646 override void OnMovedInsideCargo(EntityAI container)
10647 {
10648 super.OnMovedInsideCargo(container);
10649
10650 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10651 }
10652
10653 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10654 {
10655 super.EEItemLocationChanged(oldLoc, newLoc);
10656
10657 PlayerBase newPlayer = null;
10658 PlayerBase oldPlayer = null;
10659
10660 if (newLoc.GetParent())
10661 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10662
10663 if (oldLoc.GetParent())
10664 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10665
10666 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
10667 {
10668 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10669
10670 if (rIndex >= 0)
10671 {
10672 InventoryLocation rIl = new InventoryLocation;
10673 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10674
10675 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10676 int rType = rIl.GetType();
10677 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
10678 {
10679 rIl.GetParent().GetOnReleaseLock().Invoke(this);
10680 }
10681 else if (rType == InventoryLocationType.ATTACHMENT)
10682 {
10683 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
10684 }
10685
10686 }
10687 }
10688
10689 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
10690 {
10691 if (newPlayer)
10692 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10693
10694 if (newPlayer == oldPlayer)
10695 {
10696 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10697 {
10698 if (oldLoc.GetType() == InventoryLocationType.CARGO)
10699 {
10700 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10701 {
10702 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10703 }
10704 }
10705 else
10706 {
10707 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10708 }
10709 }
10710
10711 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10712 {
10713 int type = oldLoc.GetType();
10714 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
10715 {
10716 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10717 }
10718 else if (type == InventoryLocationType.ATTACHMENT)
10719 {
10720 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10721 }
10722 }
10723 if (!m_OldLocation)
10724 {
10725 m_OldLocation = new InventoryLocation;
10726 }
10727 m_OldLocation.Copy(oldLoc);
10728 }
10729 else
10730 {
10731 if (m_OldLocation)
10732 {
10733 m_OldLocation.Reset();
10734 }
10735 }
10736
10737 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
10738 }
10739 else
10740 {
10741 if (newPlayer)
10742 {
10743 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10744 if (resIndex >= 0)
10745 {
10746 InventoryLocation il = new InventoryLocation;
10747 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10748 ItemBase it = ItemBase.Cast(il.GetItem());
10749 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10750 int rel_type = il.GetType();
10751 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
10752 {
10753 il.GetParent().GetOnReleaseLock().Invoke(it);
10754 }
10755 else if (rel_type == InventoryLocationType.ATTACHMENT)
10756 {
10757 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
10758 }
10759 //it.GetOnReleaseLock().Invoke(it);
10760 }
10761 }
10762 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
10763 {
10764 //ThrowPhysically(oldPlayer, vector.Zero);
10765 m_ThrowItemOnDrop = false;
10766 }
10767
10768 if (m_OldLocation)
10769 {
10770 m_OldLocation.Reset();
10771 }
10772 }
10773
10774 if (oldLoc.GetType() == InventoryLocationType.TEMP)
10775 {
10776 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10777 }
10778
10779 if (newLoc.GetType() == InventoryLocationType.TEMP)
10780 {
10781 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10782 }
10783 }
10784
10785 override void EOnContact(IEntity other, Contact extra)
10786 {
10788 {
10789 int liquidType = -1;
10790 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
10791 if (impactSpeed > 0.0)
10792 {
10793 m_ImpactSpeed = impactSpeed;
10794 #ifndef SERVER
10795 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10796 #else
10797 m_WantPlayImpactSound = true;
10798 SetSynchDirty();
10799 #endif
10800 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
10801 }
10802 }
10803
10804 #ifdef SERVER
10805 if (GetCompEM() && GetCompEM().IsPlugged())
10806 {
10807 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
10808 GetCompEM().UnplugThis();
10809 }
10810 #endif
10811 }
10812
10813 void RefreshPhysics();
10814
10815 override void OnCreatePhysics()
10816 {
10818 }
10819
10820 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10821 {
10822
10823 }
10824 // -------------------------------------------------------------------------
10825 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
10826 {
10827 super.OnItemLocationChanged(old_owner, new_owner);
10828
10829 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10830 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10831
10832 if (!relatedPlayer && playerNew)
10833 relatedPlayer = playerNew;
10834
10835 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10836 {
10837 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
10838 if (actionMgr)
10839 {
10840 ActionBase currentAction = actionMgr.GetRunningAction();
10841 if (currentAction)
10842 currentAction.OnItemLocationChanged(this);
10843 }
10844 }
10845
10846 Man ownerPlayerOld = null;
10847 Man ownerPlayerNew = null;
10848
10849 if (old_owner)
10850 {
10851 if (old_owner.IsMan())
10852 {
10853 ownerPlayerOld = Man.Cast(old_owner);
10854 }
10855 else
10856 {
10857 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10858 }
10859 }
10860 else
10861 {
10862 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
10863 {
10864 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
10865
10866 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
10867 {
10868 GetCompEM().UnplugThis();
10869 }
10870 }
10871 }
10872
10873 if (new_owner)
10874 {
10875 if (new_owner.IsMan())
10876 {
10877 ownerPlayerNew = Man.Cast(new_owner);
10878 }
10879 else
10880 {
10881 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10882 }
10883 }
10884
10885 if (ownerPlayerOld != ownerPlayerNew)
10886 {
10887 if (ownerPlayerOld)
10888 {
10889 array<EntityAI> subItemsExit = new array<EntityAI>;
10890 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
10891 for (int i = 0; i < subItemsExit.Count(); i++)
10892 {
10893 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
10894 itemExit.OnInventoryExit(ownerPlayerOld);
10895 }
10896 }
10897
10898 if (ownerPlayerNew)
10899 {
10900 array<EntityAI> subItemsEnter = new array<EntityAI>;
10901 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
10902 for (int j = 0; j < subItemsEnter.Count(); j++)
10903 {
10904 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
10905 itemEnter.OnInventoryEnter(ownerPlayerNew);
10906 }
10907 }
10908 }
10909 else if (ownerPlayerNew != null)
10910 {
10911 PlayerBase nplayer;
10912 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10913 {
10914 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10915 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
10916 for (int k = 0; k < subItemsUpdate.Count(); k++)
10917 {
10918 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
10919 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10920 }
10921 }
10922 }
10923
10924 if (old_owner)
10925 old_owner.OnChildItemRemoved(this);
10926 if (new_owner)
10927 new_owner.OnChildItemReceived(this);
10928 }
10929
10930 // -------------------------------------------------------------------------------
10931 override void EEDelete(EntityAI parent)
10932 {
10933 super.EEDelete(parent);
10934 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10935 if (player)
10936 {
10937 OnInventoryExit(player);
10938
10939 if (player.IsAlive())
10940 {
10941 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10942 if (r_index >= 0)
10943 {
10944 InventoryLocation r_il = new InventoryLocation;
10945 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10946
10947 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10948 int r_type = r_il.GetType();
10949 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10950 {
10951 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10952 }
10953 else if (r_type == InventoryLocationType.ATTACHMENT)
10954 {
10955 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10956 }
10957
10958 }
10959
10960 player.RemoveQuickBarEntityShortcut(this);
10961 }
10962 }
10963 }
10964 // -------------------------------------------------------------------------------
10965 override void EEKilled(Object killer)
10966 {
10967 super.EEKilled(killer);
10968
10970 if (killer && killer.IsFireplace() && CanExplodeInFire())
10971 {
10972 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10973 {
10974 if (IsMagazine())
10975 {
10976 if (Magazine.Cast(this).GetAmmoCount() > 0)
10977 {
10978 ExplodeAmmo();
10979 }
10980 }
10981 else
10982 {
10983 Explode(DamageType.EXPLOSION);
10984 }
10985 }
10986 }
10987 }
10988
10989 override void OnWasAttached(EntityAI parent, int slot_id)
10990 {
10991 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10992
10993 super.OnWasAttached(parent, slot_id);
10994
10995 if (HasQuantity())
10996 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10997
10998 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10999 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
11000 }
11001
11002 override void OnWasDetached(EntityAI parent, int slot_id)
11003 {
11004 super.OnWasDetached(parent, slot_id);
11005
11006 if (HasQuantity())
11007 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
11008
11009 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
11010 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
11011 }
11012
11013 override string ChangeIntoOnAttach(string slot)
11014 {
11015 int idx;
11016 TStringArray inventory_slots = new TStringArray;
11017 TStringArray attach_types = new TStringArray;
11018
11019 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
11020 if (inventory_slots.Count() < 1) //is string
11021 {
11022 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
11023 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
11024 }
11025 else //is array
11026 {
11027 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
11028 }
11029
11030 idx = inventory_slots.Find(slot);
11031 if (idx < 0)
11032 return "";
11033
11034 return attach_types.Get(idx);
11035 }
11036
11037 override string ChangeIntoOnDetach()
11038 {
11039 int idx = -1;
11040 string slot;
11041
11042 TStringArray inventory_slots = new TStringArray;
11043 TStringArray detach_types = new TStringArray;
11044
11045 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
11046 if (inventory_slots.Count() < 1) //is string
11047 {
11048 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
11049 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11050 }
11051 else //is array
11052 {
11053 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
11054 if (detach_types.Count() < 1)
11055 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11056 }
11057
11058 for (int i = 0; i < inventory_slots.Count(); i++)
11059 {
11060 slot = inventory_slots.Get(i);
11061 }
11062
11063 if (slot != "")
11064 {
11065 if (detach_types.Count() == 1)
11066 idx = 0;
11067 else
11068 idx = inventory_slots.Find(slot);
11069 }
11070 if (idx < 0)
11071 return "";
11072
11073 return detach_types.Get(idx);
11074 }
11075
11076 void ExplodeAmmo()
11077 {
11078 //timer
11079 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
11080
11081 //min/max time
11082 float min_time = 1;
11083 float max_time = 3;
11084 float delay = Math.RandomFloat(min_time, max_time);
11085
11086 explode_timer.Run(delay, this, "DoAmmoExplosion");
11087 }
11088
11089 void DoAmmoExplosion()
11090 {
11091 Magazine magazine = Magazine.Cast(this);
11092 int pop_sounds_count = 6;
11093 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11094
11095 //play sound
11096 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11097 string sound_name = pop_sounds[ sound_idx ];
11098 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
11099
11100 //remove ammo count
11101 magazine.ServerAddAmmoCount(-1);
11102
11103 //if condition then repeat -> ExplodeAmmo
11104 float min_temp_to_explode = 100; //min temperature for item to explode
11105
11106 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
11107 {
11108 ExplodeAmmo();
11109 }
11110 }
11111
11112 // -------------------------------------------------------------------------------
11113 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
11114 {
11115 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
11116
11117 const int CHANCE_DAMAGE_CARGO = 4;
11118 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11119 const int CHANCE_DAMAGE_NOTHING = 2;
11120
11121 if (IsClothing() || IsContainer() || IsItemTent())
11122 {
11123 float dmg = damageResult.GetDamage("","Health") * -0.5;
11124 int chances;
11125 int rnd;
11126
11127 if (GetInventory().GetCargo())
11128 {
11129 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11130 rnd = Math.RandomInt(0,chances);
11131
11132 if (rnd < CHANCE_DAMAGE_CARGO)
11133 {
11134 DamageItemInCargo(dmg);
11135 }
11136 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11137 {
11139 }
11140 }
11141 else
11142 {
11143 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11144 rnd = Math.RandomInt(0,chances);
11145
11146 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11147 {
11149 }
11150 }
11151 }
11152 }
11153
11154 bool DamageItemInCargo(float damage)
11155 {
11156 CargoBase cargo = GetInventory().GetCargo();
11157 if (cargo)
11158 {
11159 int item_count = cargo.GetItemCount();
11160 if (item_count > 0)
11161 {
11162 int random_pick = Math.RandomInt(0, item_count);
11163 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
11164 if (!item.IsExplosive())
11165 {
11166 item.AddHealth("","",damage);
11167 return true;
11168 }
11169 }
11170 }
11171 return false;
11172 }
11173
11174 bool DamageItemAttachments(float damage)
11175 {
11176 GameInventory inventory = GetInventory();
11177 int attachment_count = inventory.AttachmentCount();
11178 if (attachment_count > 0)
11179 {
11180 int random_pick = Math.RandomInt(0, attachment_count);
11181 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
11182 if (!attachment.IsExplosive())
11183 {
11184 attachment.AddHealth("","",damage);
11185 return true;
11186 }
11187 }
11188 return false;
11189 }
11190
11191 override bool IsSplitable()
11192 {
11193 return m_CanThisBeSplit;
11194 }
11195 //----------------
11196 override bool CanBeSplit()
11197 {
11198 if (IsSplitable() && (GetQuantity() > 1))
11199 return GetInventory().CanRemoveEntity();
11200
11201 return false;
11202 }
11203
11204 protected bool ShouldSplitQuantity(float quantity)
11205 {
11206 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
11207 if (!IsSplitable())
11208 return false;
11209
11210 // nothing to split?
11211 if (GetQuantity() <= 1)
11212 return false;
11213
11214 // check if we should re-use the item instead of creating a new copy?
11215 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
11216 int delta = GetQuantity() - quantity;
11217 if (delta == 0)
11218 return false;
11219
11220 // valid to split
11221 return true;
11222 }
11223
11224 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
11225 {
11226 if (g_Game.IsClient())
11227 {
11228 if (ScriptInputUserData.CanStoreInputUserData())
11229 {
11230 ScriptInputUserData ctx = new ScriptInputUserData;
11232 ctx.Write(1);
11233 ItemBase i1 = this; // @NOTE: workaround for correct serialization
11234 ctx.Write(i1);
11235 ctx.Write(destination_entity);
11236 ctx.Write(true);
11237 ctx.Write(slot_id);
11238 ctx.Send();
11239 }
11240 }
11241 else if (!g_Game.IsMultiplayer())
11242 {
11243 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
11244 }
11245 }
11246
11247 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
11248 {
11249 float split_quantity_new;
11250 ItemBase new_item;
11251 float quantity = GetQuantity();
11252 float stack_max = GetTargetQuantityMax(slot_id);
11253 InventoryLocation loc = new InventoryLocation;
11254
11255 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11256 {
11257 if (stack_max <= GetQuantity())
11258 split_quantity_new = stack_max;
11259 else
11260 split_quantity_new = GetQuantity();
11261
11262 if (ShouldSplitQuantity(split_quantity_new))
11263 {
11264 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
11265 if (new_item)
11266 {
11267 new_item.SetResultOfSplit(true);
11268 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11269 AddQuantity(-split_quantity_new, false, true);
11270 new_item.SetQuantity(split_quantity_new, false, true);
11271 }
11272 }
11273 }
11274 else if (destination_entity && slot_id == -1)
11275 {
11276 if (quantity > stack_max)
11277 split_quantity_new = stack_max;
11278 else
11279 split_quantity_new = quantity;
11280
11281 if (ShouldSplitQuantity(split_quantity_new))
11282 {
11283 GameInventory destinationInventory = destination_entity.GetInventory();
11284 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
11285 {
11286 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
11287 new_item = ItemBase.Cast(o);
11288 }
11289
11290 if (new_item)
11291 {
11292 new_item.SetResultOfSplit(true);
11293 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11294 AddQuantity(-split_quantity_new, false, true);
11295 new_item.SetQuantity(split_quantity_new, false, true);
11296 }
11297 }
11298 }
11299 else
11300 {
11301 if (stack_max != 0)
11302 {
11303 if (stack_max < GetQuantity())
11304 {
11305 split_quantity_new = GetQuantity() - stack_max;
11306 }
11307
11308 if (split_quantity_new == 0)
11309 {
11310 if (!g_Game.IsMultiplayer())
11311 player.PhysicalPredictiveDropItem(this);
11312 else
11313 player.ServerDropEntity(this);
11314 return;
11315 }
11316
11317 if (ShouldSplitQuantity(split_quantity_new))
11318 {
11319 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
11320
11321 if (new_item)
11322 {
11323 new_item.SetResultOfSplit(true);
11324 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11325 SetQuantity(split_quantity_new, false, true);
11326 new_item.SetQuantity(stack_max, false, true);
11327 new_item.PlaceOnSurface();
11328 }
11329 }
11330 }
11331 }
11332 }
11333
11334 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
11335 {
11336 float split_quantity_new;
11337 ItemBase new_item;
11338 float quantity = GetQuantity();
11339 float stack_max = GetTargetQuantityMax(slot_id);
11340 InventoryLocation loc = new InventoryLocation;
11341
11342 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11343 {
11344 if (stack_max <= GetQuantity())
11345 split_quantity_new = stack_max;
11346 else
11347 split_quantity_new = GetQuantity();
11348
11349 if (ShouldSplitQuantity(split_quantity_new))
11350 {
11351 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
11352 if (new_item)
11353 {
11354 new_item.SetResultOfSplit(true);
11355 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11356 AddQuantity(-split_quantity_new, false, true);
11357 new_item.SetQuantity(split_quantity_new, false, true);
11358 }
11359 }
11360 }
11361 else if (destination_entity && slot_id == -1)
11362 {
11363 if (quantity > stack_max)
11364 split_quantity_new = stack_max;
11365 else
11366 split_quantity_new = quantity;
11367
11368 if (ShouldSplitQuantity(split_quantity_new))
11369 {
11370 GameInventory destinationInventory = destination_entity.GetInventory();
11371 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
11372 {
11373 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
11374 new_item = ItemBase.Cast(o);
11375 }
11376
11377 if (new_item)
11378 {
11379 new_item.SetResultOfSplit(true);
11380 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11381 AddQuantity(-split_quantity_new, false, true);
11382 new_item.SetQuantity(split_quantity_new, false, true);
11383 }
11384 }
11385 }
11386 else
11387 {
11388 if (stack_max != 0)
11389 {
11390 if (stack_max < GetQuantity())
11391 {
11392 split_quantity_new = GetQuantity() - stack_max;
11393 }
11394
11395 if (ShouldSplitQuantity(split_quantity_new))
11396 {
11397 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
11398
11399 if (new_item)
11400 {
11401 new_item.SetResultOfSplit(true);
11402 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11403 SetQuantity(split_quantity_new, false, true);
11404 new_item.SetQuantity(stack_max, false, true);
11405 new_item.PlaceOnSurface();
11406 }
11407 }
11408 }
11409 }
11410 }
11411
11412 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
11413 {
11414 if (g_Game.IsClient())
11415 {
11416 if (ScriptInputUserData.CanStoreInputUserData())
11417 {
11418 ScriptInputUserData ctx = new ScriptInputUserData;
11420 ctx.Write(4);
11421 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11422 ctx.Write(thiz);
11423 dst.WriteToContext(ctx);
11424 ctx.Send();
11425 }
11426 }
11427 else if (!g_Game.IsMultiplayer())
11428 {
11430 }
11431 }
11432
11433 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
11434 {
11435 if (g_Game.IsClient())
11436 {
11437 if (ScriptInputUserData.CanStoreInputUserData())
11438 {
11439 ScriptInputUserData ctx = new ScriptInputUserData;
11441 ctx.Write(2);
11442 ItemBase dummy = this; // @NOTE: workaround for correct serialization
11443 ctx.Write(dummy);
11444 ctx.Write(destination_entity);
11445 ctx.Write(true);
11446 ctx.Write(idx);
11447 ctx.Write(row);
11448 ctx.Write(col);
11449 ctx.Send();
11450 }
11451 }
11452 else if (!g_Game.IsMultiplayer())
11453 {
11454 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
11455 }
11456 }
11457
11458 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
11459 {
11461 }
11462
11463 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
11464 {
11465 float quantity = GetQuantity();
11466 float split_quantity_new;
11467 ItemBase new_item;
11468 if (dst.IsValid())
11469 {
11470 int slot_id = dst.GetSlot();
11471 float stack_max = GetTargetQuantityMax(slot_id);
11472
11473 if (quantity > stack_max)
11474 split_quantity_new = stack_max;
11475 else
11476 split_quantity_new = quantity;
11477
11478 if (ShouldSplitQuantity(split_quantity_new))
11479 {
11480 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11481
11482 if (new_item)
11483 {
11484 new_item.SetResultOfSplit(true);
11485 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11486 AddQuantity(-split_quantity_new, false, true);
11487 new_item.SetQuantity(split_quantity_new, false, true);
11488 }
11489
11490 return new_item;
11491 }
11492 }
11493
11494 return null;
11495 }
11496
11497 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
11498 {
11499 float quantity = GetQuantity();
11500 float split_quantity_new;
11501 ItemBase new_item;
11502 if (destination_entity)
11503 {
11504 float stackable = GetTargetQuantityMax();
11505 if (quantity > stackable)
11506 split_quantity_new = stackable;
11507 else
11508 split_quantity_new = quantity;
11509
11510 if (ShouldSplitQuantity(split_quantity_new))
11511 {
11512 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
11513 if (new_item)
11514 {
11515 new_item.SetResultOfSplit(true);
11516 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11517 AddQuantity(-split_quantity_new, false, true);
11518 new_item.SetQuantity(split_quantity_new, false, true);
11519 }
11520 }
11521 }
11522 }
11523
11524 void SplitIntoStackMaxHandsClient(PlayerBase player)
11525 {
11526 if (g_Game.IsClient())
11527 {
11528 if (ScriptInputUserData.CanStoreInputUserData())
11529 {
11530 ScriptInputUserData ctx = new ScriptInputUserData;
11532 ctx.Write(3);
11533 ItemBase i1 = this; // @NOTE: workaround for correct serialization
11534 ctx.Write(i1);
11535 ItemBase destination_entity = this;
11536 ctx.Write(destination_entity);
11537 ctx.Write(true);
11538 ctx.Write(0);
11539 ctx.Send();
11540 }
11541 }
11542 else if (!g_Game.IsMultiplayer())
11543 {
11544 SplitIntoStackMaxHands(player);
11545 }
11546 }
11547
11548 void SplitIntoStackMaxHands(PlayerBase player)
11549 {
11550 float quantity = GetQuantity();
11551 float split_quantity_new;
11552 ref ItemBase new_item;
11553 if (player)
11554 {
11555 float stackable = GetTargetQuantityMax();
11556 if (quantity > stackable)
11557 split_quantity_new = stackable;
11558 else
11559 split_quantity_new = quantity;
11560
11561 if (ShouldSplitQuantity(split_quantity_new))
11562 {
11563 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
11564 new_item = ItemBase.Cast(in_hands);
11565 if (new_item)
11566 {
11567 new_item.SetResultOfSplit(true);
11568 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11569 AddQuantity(-split_quantity_new, false, true);
11570 new_item.SetQuantity(split_quantity_new, false, true);
11571 }
11572 }
11573 }
11574 }
11575
11576 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
11577 {
11578 float quantity = GetQuantity();
11579 float split_quantity_new = Math.Floor(quantity * 0.5);
11580
11581 if (!ShouldSplitQuantity(split_quantity_new))
11582 return;
11583
11584 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11585
11586 if (new_item)
11587 {
11588 if (new_item.GetQuantityMax() < split_quantity_new)
11589 {
11590 split_quantity_new = new_item.GetQuantityMax();
11591 }
11592
11593 new_item.SetResultOfSplit(true);
11594 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11595
11596 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11597 {
11598 AddQuantity(-1, false, true);
11599 new_item.SetQuantity(1, false, true);
11600 }
11601 else
11602 {
11603 AddQuantity(-split_quantity_new, false, true);
11604 new_item.SetQuantity(split_quantity_new, false, true);
11605 }
11606 }
11607 }
11608
11609 void SplitItem(PlayerBase player)
11610 {
11611 float quantity = GetQuantity();
11612 float split_quantity_new = Math.Floor(quantity / 2);
11613
11614 if (!ShouldSplitQuantity(split_quantity_new))
11615 return;
11616
11617 InventoryLocation invloc = new InventoryLocation;
11618 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
11619
11620 ItemBase new_item;
11621 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11622
11623 if (new_item)
11624 {
11625 if (new_item.GetQuantityMax() < split_quantity_new)
11626 {
11627 split_quantity_new = new_item.GetQuantityMax();
11628 }
11629 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11630 {
11631 AddQuantity(-1, false, true);
11632 new_item.SetQuantity(1, false, true);
11633 }
11634 else if (split_quantity_new > 1)
11635 {
11636 AddQuantity(-split_quantity_new, false, true);
11637 new_item.SetQuantity(split_quantity_new, false, true);
11638 }
11639 }
11640 }
11641
11643 void OnQuantityChanged(float delta)
11644 {
11645 SetWeightDirty();
11646 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
11647
11648 if (parent)
11649 parent.OnAttachmentQuantityChangedEx(this, delta);
11650
11651 if (IsLiquidContainer())
11652 {
11653 if (GetQuantityNormalized() <= 0.0)
11654 {
11656 }
11657 else if (GetLiquidType() == LIQUID_NONE)
11658 {
11659 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
11661 }
11662 }
11663 }
11664
11667 {
11668 // insert code here
11669 }
11670
11672 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
11673 {
11675 }
11676
11677 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
11678 {
11679 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11680
11681 if (g_Game.IsServer())
11682 {
11683 if (newLevel == GameConstants.STATE_RUINED)
11684 {
11686 EntityAI parent = GetHierarchyParent();
11687 if (parent && parent.IsFireplace())
11688 {
11689 CargoBase cargo = GetInventory().GetCargo();
11690 if (cargo)
11691 {
11692 for (int i = 0; i < cargo.GetItemCount(); ++i)
11693 {
11694 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
11695 }
11696 }
11697 }
11698 }
11699
11700 if (IsResultOfSplit())
11701 {
11702 // reset the splitting result flag, return to normal item behavior
11703 SetResultOfSplit(false);
11704 return;
11705 }
11706
11707 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11708 {
11709 SetCleanness(0);//unclean the item upon damage dealt
11710 }
11711 }
11712 }
11713
11714 // just the split? TODO: verify
11715 override void OnRightClick()
11716 {
11717 super.OnRightClick();
11718
11719 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
11720 {
11721 if (g_Game.IsClient())
11722 {
11723 if (ScriptInputUserData.CanStoreInputUserData())
11724 {
11725 EntityAI root = GetHierarchyRoot();
11726 Man playerOwner = GetHierarchyRootPlayer();
11727 InventoryLocation dst = new InventoryLocation;
11728
11729 // 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
11730 if (!playerOwner && root && root == this)
11731 {
11733 }
11734 else
11735 {
11736 // 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
11737 GetInventory().GetCurrentInventoryLocation(dst);
11738 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
11739 {
11740 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
11741 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
11742 {
11744 }
11745 else
11746 {
11747 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
11748 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
11749 this shouldnt cause issues within this scope*/
11750 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
11751 {
11753 }
11754 else
11755 {
11756 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11757 }
11758 }
11759 }
11760 }
11761
11762 ScriptInputUserData ctx = new ScriptInputUserData;
11764 ctx.Write(4);
11765 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11766 ctx.Write(thiz);
11767 dst.WriteToContext(ctx);
11768 ctx.Write(true); // dummy
11769 ctx.Send();
11770 }
11771 }
11772 else if (!g_Game.IsMultiplayer())
11773 {
11774 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
11775 }
11776 }
11777 }
11778
11779 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
11780 {
11781 if (root)
11782 {
11783 vector m4[4];
11784 root.GetTransform(m4);
11785 dst.SetGround(this, m4);
11786 }
11787 else
11788 {
11789 GetInventory().GetCurrentInventoryLocation(dst);
11790 }
11791 }
11792
11793 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
11794 {
11795 //TODO: delete check zero quantity check after fix double posts hands fsm events
11796 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
11797 return false;
11798
11799 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11800 return false;
11801
11802 //can_this_be_combined = ConfigGetBool("canBeSplit");
11804 return false;
11805
11806
11807 Magazine mag = Magazine.Cast(this);
11808 if (mag)
11809 {
11810 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11811 return false;
11812
11813 if (stack_max_limit)
11814 {
11815 Magazine other_mag = Magazine.Cast(other_item);
11816 if (other_item)
11817 {
11818 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11819 return false;
11820 }
11821
11822 }
11823 }
11824 else
11825 {
11826 //TODO: delete check zero quantity check after fix double posts hands fsm events
11827 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
11828 return false;
11829
11830 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
11831 return false;
11832 }
11833
11834 PlayerBase player = null;
11835 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
11836 {
11837 if (player.GetInventory().HasAttachment(this))
11838 return false;
11839
11840 if (player.IsItemsToDelete())
11841 return false;
11842 }
11843
11844 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11845 return false;
11846
11847 int slotID;
11848 string slotName;
11849 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11850 return false;
11851
11852 return true;
11853 }
11854
11855 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
11856 {
11857 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
11858 }
11859
11860 bool IsResultOfSplit()
11861 {
11862 return m_IsResultOfSplit;
11863 }
11864
11865 void SetResultOfSplit(bool value)
11866 {
11867 m_IsResultOfSplit = value;
11868 }
11869
11870 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
11871 {
11872 return ComputeQuantityUsedEx(other_item, use_stack_max);
11873 }
11874
11875 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
11876 {
11877 float other_item_quantity = other_item.GetQuantity();
11878 float this_free_space;
11879
11880 float stack_max = GetQuantityMax();
11881
11882 this_free_space = stack_max - GetQuantity();
11883
11884 if (other_item_quantity > this_free_space)
11885 {
11886 return this_free_space;
11887 }
11888 else
11889 {
11890 return other_item_quantity;
11891 }
11892 }
11893
11894 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
11895 {
11896 CombineItems(ItemBase.Cast(entity2),use_stack_max);
11897 }
11898
11899 void CombineItems(ItemBase other_item, bool use_stack_max = true)
11900 {
11901 if (!CanBeCombined(other_item, false))
11902 return;
11903
11904 if (!IsMagazine() && other_item)
11905 {
11906 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
11907 if (quantity_used != 0)
11908 {
11909 float hp1 = GetHealth01("","");
11910 float hp2 = other_item.GetHealth01("","");
11911 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
11912 hpResult = hpResult / (GetQuantity() + quantity_used);
11913
11914 hpResult *= GetMaxHealth();
11915 Math.Round(hpResult);
11916 SetHealth("", "Health", hpResult);
11917
11918 AddQuantity(quantity_used);
11919 other_item.AddQuantity(-quantity_used);
11920 }
11921 }
11922 OnCombine(other_item);
11923 }
11924
11925 void OnCombine(ItemBase other_item)
11926 {
11927 #ifdef SERVER
11928 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11929 GetHierarchyParent().IncreaseLifetimeUp();
11930 #endif
11931 };
11932
11933 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
11934 {
11935 PlayerBase p = PlayerBase.Cast(player);
11936
11937 array<int> recipesIds = p.m_Recipes;
11938 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11939 if (moduleRecipesManager)
11940 {
11941 EntityAI itemInHands = player.GetEntityInHands();
11942 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
11943 }
11944
11945 for (int i = 0;i < recipesIds.Count(); i++)
11946 {
11947 int key = recipesIds.Get(i);
11948 string recipeName = moduleRecipesManager.GetRecipeName(key);
11949 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
11950 }
11951 }
11952
11953 // -------------------------------------------------------------------------
11954 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11955 {
11956 super.GetDebugActions(outputList);
11957
11958 //quantity
11959 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
11960 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
11961 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
11962 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
11963 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11964
11965 //health
11966 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
11967 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
11968 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
11969 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11970 //temperature
11971 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
11972 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
11973 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
11974 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11975
11976 //wet
11977 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
11978 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
11979 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11980
11981 //liquidtype
11982 if (IsLiquidContainer())
11983 {
11984 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
11985 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
11986 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11987 }
11988
11989 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
11990 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11991
11992 // watch
11993 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
11994 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
11995 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11996
11997 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
11998
11999 InventoryLocation loc = new InventoryLocation();
12000 GetInventory().GetCurrentInventoryLocation(loc);
12001 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
12002 {
12003 if (Gizmo_IsSupported())
12004 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
12005 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
12006 }
12007
12008 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
12009 }
12010
12011 // -------------------------------------------------------------------------
12012 // -------------------------------------------------------------------------
12013 // -------------------------------------------------------------------------
12014 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
12015 {
12016 super.OnAction(action_id, player, ctx);
12017
12018 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
12019 {
12020 switch (action_id)
12021 {
12022 case EActions.GIZMO_OBJECT:
12023 if (GetGizmoApi())
12024 GetGizmoApi().SelectObject(this);
12025 return true;
12026 case EActions.GIZMO_PHYSICS:
12027 if (GetGizmoApi())
12028 GetGizmoApi().SelectPhysics(GetPhysics());
12029 return true;
12030 }
12031 }
12032
12033 if (g_Game.IsServer())
12034 {
12035 switch (action_id)
12036 {
12037 case EActions.DELETE:
12038 Delete();
12039 return true;
12040 }
12041 }
12042
12043 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
12044 {
12045 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
12046 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
12047 PlayerBase p = PlayerBase.Cast(player);
12048 if (EActions.RECIPES_RANGE_START < 1000)
12049 {
12050 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
12051 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
12052 }
12053 }
12054 #ifndef SERVER
12055 else if (action_id == EActions.WATCH_PLAYER)
12056 {
12057 PluginDeveloper.SetDeveloperItemClientEx(player);
12058 }
12059 #endif
12060 if (g_Game.IsServer())
12061 {
12062 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
12063 {
12064 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
12065 OnDebugButtonPressServer(id + 1);
12066 }
12067
12068 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
12069 {
12070 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
12071 InsertAgent(agent_id,100);
12072 }
12073
12074 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
12075 {
12076 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
12077 RemoveAgent(agent_id2);
12078 }
12079
12080 else if (action_id == EActions.ADD_QUANTITY)
12081 {
12082 if (IsMagazine())
12083 {
12084 Magazine mag = Magazine.Cast(this);
12085 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
12086 }
12087 else
12088 {
12089 AddQuantity(GetQuantityMax() * 0.2);
12090 }
12091
12092 if (m_EM)
12093 {
12094 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
12095 }
12096 //PrintVariables();
12097 }
12098
12099 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
12100 {
12101 if (IsMagazine())
12102 {
12103 Magazine mag2 = Magazine.Cast(this);
12104 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
12105 }
12106 else
12107 {
12108 AddQuantity(- GetQuantityMax() * 0.2);
12109 }
12110 if (m_EM)
12111 {
12112 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12113 }
12114 //PrintVariables();
12115 }
12116
12117 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
12118 {
12119 SetQuantity(0);
12120
12121 if (m_EM)
12122 {
12123 m_EM.SetEnergy(0);
12124 }
12125 }
12126
12127 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
12128 {
12130
12131 if (m_EM)
12132 {
12133 m_EM.SetEnergy(m_EM.GetEnergyMax());
12134 }
12135 }
12136
12137 else if (action_id == EActions.ADD_HEALTH)
12138 {
12139 AddHealth("","",GetMaxHealth("","Health")/5);
12140 }
12141 else if (action_id == EActions.REMOVE_HEALTH)
12142 {
12143 AddHealth("","",-GetMaxHealth("","Health")/5);
12144 }
12145 else if (action_id == EActions.DESTROY_HEALTH)
12146 {
12147 SetHealth01("","",0);
12148 }
12149 else if (action_id == EActions.WATCH_ITEM)
12150 {
12152 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
12153 #ifdef DEVELOPER
12154 SetDebugDeveloper_item(this);
12155 #endif
12156 }
12157
12158 else if (action_id == EActions.ADD_TEMPERATURE)
12159 {
12160 AddTemperature(20);
12161 //PrintVariables();
12162 }
12163
12164 else if (action_id == EActions.REMOVE_TEMPERATURE)
12165 {
12166 AddTemperature(-20);
12167 //PrintVariables();
12168 }
12169
12170 else if (action_id == EActions.FLIP_FROZEN)
12171 {
12172 SetFrozen(!GetIsFrozen());
12173 //PrintVariables();
12174 }
12175
12176 else if (action_id == EActions.ADD_WETNESS)
12177 {
12178 AddWet(GetWetMax()/5);
12179 //PrintVariables();
12180 }
12181
12182 else if (action_id == EActions.REMOVE_WETNESS)
12183 {
12184 AddWet(-GetWetMax()/5);
12185 //PrintVariables();
12186 }
12187
12188 else if (action_id == EActions.LIQUIDTYPE_UP)
12189 {
12190 int curr_type = GetLiquidType();
12191 SetLiquidType(curr_type * 2);
12192 //AddWet(1);
12193 //PrintVariables();
12194 }
12195
12196 else if (action_id == EActions.LIQUIDTYPE_DOWN)
12197 {
12198 int curr_type2 = GetLiquidType();
12199 SetLiquidType(curr_type2 / 2);
12200 }
12201
12202 else if (action_id == EActions.MAKE_SPECIAL)
12203 {
12204 auto debugParams = DebugSpawnParams.WithPlayer(player);
12205 OnDebugSpawnEx(debugParams);
12206 }
12207
12208 }
12209
12210
12211 return false;
12212 }
12213
12214 // -------------------------------------------------------------------------
12215
12216
12219 void OnActivatedByTripWire();
12220
12222 void OnActivatedByItem(notnull ItemBase item);
12223
12224 //----------------------------------------------------------------
12225 //returns true if item is able to explode when put in fire
12226 bool CanExplodeInFire()
12227 {
12228 return false;
12229 }
12230
12231 //----------------------------------------------------------------
12232 bool CanEat()
12233 {
12234 return true;
12235 }
12236
12237 //----------------------------------------------------------------
12238 override bool IsIgnoredByConstruction()
12239 {
12240 return true;
12241 }
12242
12243 //----------------------------------------------------------------
12244 //has FoodStages in config?
12245 bool HasFoodStage()
12246 {
12247 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
12248 return g_Game.ConfigIsExisting(config_path);
12249 }
12250
12252 FoodStage GetFoodStage()
12253 {
12254 return null;
12255 }
12256
12257 bool CanBeCooked()
12258 {
12259 return false;
12260 }
12261
12262 bool CanBeCookedOnStick()
12263 {
12264 return false;
12265 }
12266
12268 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
12270
12271 //----------------------------------------------------------------
12272 bool CanRepair(ItemBase item_repair_kit)
12273 {
12274 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
12275 return module_repairing.CanRepair(this, item_repair_kit);
12276 }
12277
12278 //----------------------------------------------------------------
12279 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
12280 {
12281 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
12282 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12283 }
12284
12285 //----------------------------------------------------------------
12286 int GetItemSize()
12287 {
12288 /*
12289 vector v_size = this.ConfigGetVector("itemSize");
12290 int v_size_x = v_size[0];
12291 int v_size_y = v_size[1];
12292 int size = v_size_x * v_size_y;
12293 return size;
12294 */
12295
12296 return 1;
12297 }
12298
12299 //----------------------------------------------------------------
12300 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
12301 bool CanBeMovedOverride()
12302 {
12303 return m_CanBeMovedOverride;
12304 }
12305
12306 //----------------------------------------------------------------
12307 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
12308 void SetCanBeMovedOverride(bool setting)
12309 {
12310 m_CanBeMovedOverride = setting;
12311 }
12312
12313 //----------------------------------------------------------------
12321 void MessageToOwnerStatus(string text)
12322 {
12323 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12324
12325 if (player)
12326 {
12327 player.MessageStatus(text);
12328 }
12329 }
12330
12331 //----------------------------------------------------------------
12339 void MessageToOwnerAction(string text)
12340 {
12341 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12342
12343 if (player)
12344 {
12345 player.MessageAction(text);
12346 }
12347 }
12348
12349 //----------------------------------------------------------------
12357 void MessageToOwnerFriendly(string text)
12358 {
12359 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12360
12361 if (player)
12362 {
12363 player.MessageFriendly(text);
12364 }
12365 }
12366
12367 //----------------------------------------------------------------
12375 void MessageToOwnerImportant(string text)
12376 {
12377 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12378
12379 if (player)
12380 {
12381 player.MessageImportant(text);
12382 }
12383 }
12384
12385 override bool IsItemBase()
12386 {
12387 return true;
12388 }
12389
12390 // Checks if item is of questioned kind
12391 override bool KindOf(string tag)
12392 {
12393 bool found = false;
12394 string item_name = this.GetType();
12395 ref TStringArray item_tag_array = new TStringArray;
12396 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
12397
12398 int array_size = item_tag_array.Count();
12399 for (int i = 0; i < array_size; i++)
12400 {
12401 if (item_tag_array.Get(i) == tag)
12402 {
12403 found = true;
12404 break;
12405 }
12406 }
12407 return found;
12408 }
12409
12410
12411 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
12412 {
12413 //Debug.Log("OnRPC called");
12414 super.OnRPC(sender, rpc_type,ctx);
12415
12416 //Play soundset for attachment locking (ActionLockAttachment.c)
12417 switch (rpc_type)
12418 {
12419 #ifndef SERVER
12420 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12421 Param2<bool, string> p = new Param2<bool, string>(false, "");
12422
12423 if (!ctx.Read(p))
12424 return;
12425
12426 bool play = p.param1;
12427 string soundSet = p.param2;
12428
12429 if (play)
12430 {
12431 if (m_LockingSound)
12432 {
12434 {
12435 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
12436 }
12437 }
12438 else
12439 {
12440 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
12441 }
12442 }
12443 else
12444 {
12445 SEffectManager.DestroyEffect(m_LockingSound);
12446 }
12447
12448 break;
12449 #endif
12450
12451 }
12452
12453 if (GetWrittenNoteData())
12454 {
12455 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
12456 }
12457 }
12458
12459 //-----------------------------
12460 // VARIABLE MANIPULATION SYSTEM
12461 //-----------------------------
12462 int NameToID(string name)
12463 {
12464 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
12465 return plugin.GetID(name);
12466 }
12467
12468 string IDToName(int id)
12469 {
12470 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
12471 return plugin.GetName(id);
12472 }
12473
12475 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
12476 {
12477 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
12478 //read the flags
12479 int varFlags;
12480 if (!ctx.Read(varFlags))
12481 return;
12482
12483 if (varFlags & ItemVariableFlags.FLOAT)
12484 {
12485 ReadVarsFromCTX(ctx);
12486 }
12487 }
12488
12489 override void SerializeNumericalVars(array<float> floats_out)
12490 {
12491 //some variables handled on EntityAI level already!
12492 super.SerializeNumericalVars(floats_out);
12493
12494 // the order of serialization must be the same as the order of de-serialization
12495 //--------------------------------------------
12496 if (IsVariableSet(VARIABLE_QUANTITY))
12497 {
12498 floats_out.Insert(m_VarQuantity);
12499 }
12500 //--------------------------------------------
12501 if (IsVariableSet(VARIABLE_WET))
12502 {
12503 floats_out.Insert(m_VarWet);
12504 }
12505 //--------------------------------------------
12506 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12507 {
12508 floats_out.Insert(m_VarLiquidType);
12509 }
12510 //--------------------------------------------
12511 if (IsVariableSet(VARIABLE_COLOR))
12512 {
12513 floats_out.Insert(m_ColorComponentR);
12514 floats_out.Insert(m_ColorComponentG);
12515 floats_out.Insert(m_ColorComponentB);
12516 floats_out.Insert(m_ColorComponentA);
12517 }
12518 //--------------------------------------------
12519 if (IsVariableSet(VARIABLE_CLEANNESS))
12520 {
12521 floats_out.Insert(m_Cleanness);
12522 }
12523 }
12524
12525 override void DeSerializeNumericalVars(array<float> floats)
12526 {
12527 //some variables handled on EntityAI level already!
12528 super.DeSerializeNumericalVars(floats);
12529
12530 // the order of serialization must be the same as the order of de-serialization
12531 int index = 0;
12532 int mask = Math.Round(floats.Get(index));
12533
12534 index++;
12535 //--------------------------------------------
12536 if (mask & VARIABLE_QUANTITY)
12537 {
12538 if (m_IsStoreLoad)
12539 {
12540 SetStoreLoadedQuantity(floats.Get(index));
12541 }
12542 else
12543 {
12544 float quantity = floats.Get(index);
12545 SetQuantity(quantity, true, false, false, false);
12546 }
12547 index++;
12548 }
12549 //--------------------------------------------
12550 if (mask & VARIABLE_WET)
12551 {
12552 float wet = floats.Get(index);
12553 SetWet(wet);
12554 index++;
12555 }
12556 //--------------------------------------------
12557 if (mask & VARIABLE_LIQUIDTYPE)
12558 {
12559 int liquidtype = Math.Round(floats.Get(index));
12560 SetLiquidType(liquidtype);
12561 index++;
12562 }
12563 //--------------------------------------------
12564 if (mask & VARIABLE_COLOR)
12565 {
12566 m_ColorComponentR = Math.Round(floats.Get(index));
12567 index++;
12568 m_ColorComponentG = Math.Round(floats.Get(index));
12569 index++;
12570 m_ColorComponentB = Math.Round(floats.Get(index));
12571 index++;
12572 m_ColorComponentA = Math.Round(floats.Get(index));
12573 index++;
12574 }
12575 //--------------------------------------------
12576 if (mask & VARIABLE_CLEANNESS)
12577 {
12578 int cleanness = Math.Round(floats.Get(index));
12579 SetCleanness(cleanness);
12580 index++;
12581 }
12582 }
12583
12584 override void WriteVarsToCTX(ParamsWriteContext ctx)
12585 {
12586 super.WriteVarsToCTX(ctx);
12587
12588 //--------------------------------------------
12589 if (IsVariableSet(VARIABLE_QUANTITY))
12590 {
12591 ctx.Write(GetQuantity());
12592 }
12593 //--------------------------------------------
12594 if (IsVariableSet(VARIABLE_WET))
12595 {
12596 ctx.Write(GetWet());
12597 }
12598 //--------------------------------------------
12599 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12600 {
12601 ctx.Write(GetLiquidType());
12602 }
12603 //--------------------------------------------
12604 if (IsVariableSet(VARIABLE_COLOR))
12605 {
12606 int r,g,b,a;
12607 GetColor(r,g,b,a);
12608 ctx.Write(r);
12609 ctx.Write(g);
12610 ctx.Write(b);
12611 ctx.Write(a);
12612 }
12613 //--------------------------------------------
12614 if (IsVariableSet(VARIABLE_CLEANNESS))
12615 {
12616 ctx.Write(GetCleanness());
12617 }
12618 }
12619
12620 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
12621 {
12622 if (!super.ReadVarsFromCTX(ctx,version))
12623 return false;
12624
12625 int intValue;
12626 float value;
12627
12628 if (version < 140)
12629 {
12630 if (!ctx.Read(intValue))
12631 return false;
12632
12633 m_VariablesMask = intValue;
12634 }
12635
12636 if (m_VariablesMask & VARIABLE_QUANTITY)
12637 {
12638 if (!ctx.Read(value))
12639 return false;
12640
12641 if (IsStoreLoad())
12642 {
12644 }
12645 else
12646 {
12647 SetQuantity(value, true, false, false, false);
12648 }
12649 }
12650 //--------------------------------------------
12651 if (version < 140)
12652 {
12653 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12654 {
12655 if (!ctx.Read(value))
12656 return false;
12657 SetTemperatureDirect(value);
12658 }
12659 }
12660 //--------------------------------------------
12661 if (m_VariablesMask & VARIABLE_WET)
12662 {
12663 if (!ctx.Read(value))
12664 return false;
12665 SetWet(value);
12666 }
12667 //--------------------------------------------
12668 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
12669 {
12670 if (!ctx.Read(intValue))
12671 return false;
12672 SetLiquidType(intValue);
12673 }
12674 //--------------------------------------------
12675 if (m_VariablesMask & VARIABLE_COLOR)
12676 {
12677 int r,g,b,a;
12678 if (!ctx.Read(r))
12679 return false;
12680 if (!ctx.Read(g))
12681 return false;
12682 if (!ctx.Read(b))
12683 return false;
12684 if (!ctx.Read(a))
12685 return false;
12686
12687 SetColor(r,g,b,a);
12688 }
12689 //--------------------------------------------
12690 if (m_VariablesMask & VARIABLE_CLEANNESS)
12691 {
12692 if (!ctx.Read(intValue))
12693 return false;
12694 SetCleanness(intValue);
12695 }
12696 //--------------------------------------------
12697 if (version >= 138 && version < 140)
12698 {
12699 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12700 {
12701 if (!ctx.Read(intValue))
12702 return false;
12703 SetFrozen(intValue);
12704 }
12705 }
12706
12707 return true;
12708 }
12709
12710 //----------------------------------------------------------------
12711 override bool OnStoreLoad(ParamsReadContext ctx, int version)
12712 {
12713 m_IsStoreLoad = true;
12715 {
12716 m_FixDamageSystemInit = true;
12717 }
12718
12719 if (!super.OnStoreLoad(ctx, version))
12720 {
12721 m_IsStoreLoad = false;
12722 return false;
12723 }
12724
12725 if (version >= 114)
12726 {
12727 bool hasQuickBarIndexSaved;
12728
12729 if (!ctx.Read(hasQuickBarIndexSaved))
12730 {
12731 m_IsStoreLoad = false;
12732 return false;
12733 }
12734
12735 if (hasQuickBarIndexSaved)
12736 {
12737 int itmQBIndex;
12738
12739 //Load quickbar item bind
12740 if (!ctx.Read(itmQBIndex))
12741 {
12742 m_IsStoreLoad = false;
12743 return false;
12744 }
12745
12746 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12747 if (itmQBIndex != -1 && parentPlayer)
12748 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12749 }
12750 }
12751 else
12752 {
12753 // Backup of how it used to be
12754 PlayerBase player;
12755 int itemQBIndex;
12756 if (version == int.MAX)
12757 {
12758 if (!ctx.Read(itemQBIndex))
12759 {
12760 m_IsStoreLoad = false;
12761 return false;
12762 }
12763 }
12764 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12765 {
12766 //Load quickbar item bind
12767 if (!ctx.Read(itemQBIndex))
12768 {
12769 m_IsStoreLoad = false;
12770 return false;
12771 }
12772 if (itemQBIndex != -1 && player)
12773 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12774 }
12775 }
12776
12777 if (version < 140)
12778 {
12779 // variable management system
12780 if (!LoadVariables(ctx, version))
12781 {
12782 m_IsStoreLoad = false;
12783 return false;
12784 }
12785 }
12786
12787 //agent trasmission system
12788 if (!LoadAgents(ctx, version))
12789 {
12790 m_IsStoreLoad = false;
12791 return false;
12792 }
12793 if (version >= 132)
12794 {
12795 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12796 if (raib)
12797 {
12798 if (!raib.OnStoreLoad(ctx,version))
12799 {
12800 m_IsStoreLoad = false;
12801 return false;
12802 }
12803 }
12804 }
12805
12806 m_IsStoreLoad = false;
12807 return true;
12808 }
12809
12810 //----------------------------------------------------------------
12811
12812 override void OnStoreSave(ParamsWriteContext ctx)
12813 {
12814 super.OnStoreSave(ctx);
12815
12816 PlayerBase player;
12817 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12818 {
12819 ctx.Write(true); // Keep track of if we should actually read this in or not
12820 //Save quickbar item bind
12821 int itemQBIndex = -1;
12822 itemQBIndex = player.FindQuickBarEntityIndex(this);
12823 ctx.Write(itemQBIndex);
12824 }
12825 else
12826 {
12827 ctx.Write(false); // Keep track of if we should actually read this in or not
12828 }
12829
12830 SaveAgents(ctx);//agent trasmission system
12831
12832 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12833 if (raib)
12834 {
12835 raib.OnStoreSave(ctx);
12836 }
12837 }
12838 //----------------------------------------------------------------
12839
12840 override void AfterStoreLoad()
12841 {
12842 super.AfterStoreLoad();
12843
12845 {
12847 }
12848
12849 if (GetStoreLoadedQuantity() != float.LOWEST)
12850 {
12852 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
12853 }
12854 }
12855
12856 override void EEOnAfterLoad()
12857 {
12858 super.EEOnAfterLoad();
12859
12861 {
12862 m_FixDamageSystemInit = false;
12863 }
12864
12867 }
12868
12869 bool CanBeDisinfected()
12870 {
12871 return false;
12872 }
12873
12874
12875 //----------------------------------------------------------------
12876 override void OnVariablesSynchronized()
12877 {
12878 if (m_Initialized)
12879 {
12880 #ifdef PLATFORM_CONSOLE
12881 //bruteforce it is
12882 if (IsSplitable())
12883 {
12884 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
12885 if (menu)
12886 {
12887 menu.Refresh();
12888 }
12889 }
12890 #endif
12891 }
12892
12894 {
12895 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
12896 m_WantPlayImpactSound = false;
12897 }
12898
12900 {
12901 SetWeightDirty();
12903 }
12904 if (m_VarWet != m_VarWetPrev)
12905 {
12908 }
12909
12910 if (m_SoundSyncPlay != 0)
12911 {
12914
12915 m_SoundSyncPlay = 0;
12916 m_SoundSyncSlotID = -1;
12917 }
12918 if (m_SoundSyncStop != 0)
12919 {
12921 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
12922 m_SoundSyncStop = 0;
12923 }
12924
12925 super.OnVariablesSynchronized();
12926 }
12927
12928 //------------------------- Quantity
12929 //----------------------------------------------------------------
12931 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
12932 {
12933 if (!IsServerCheck(allow_client))
12934 return false;
12935
12936 if (!HasQuantity())
12937 return false;
12938
12939 float min = GetQuantityMin();
12940 float max = GetQuantityMax();
12941
12942 if (value <= (min + 0.001))
12943 value = min;
12944
12945 if (value == min)
12946 {
12947 if (destroy_config)
12948 {
12949 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12950 if (dstr)
12951 {
12952 m_VarQuantity = Math.Clamp(value, min, max);
12953 this.Delete();
12954 return true;
12955 }
12956 }
12957 else if (destroy_forced)
12958 {
12959 m_VarQuantity = Math.Clamp(value, min, max);
12960 this.Delete();
12961 return true;
12962 }
12963 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
12964 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
12965 }
12966
12967 float delta = m_VarQuantity;
12968 m_VarQuantity = Math.Clamp(value, min, max);
12969
12970 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12971 {
12972 EntityAI parent = GetHierarchyRoot();
12973 InventoryLocation iLoc = new InventoryLocation();
12974 GetInventory().GetCurrentInventoryLocation(iLoc);
12975 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
12976 {
12977 int iLocSlot = iLoc.GetSlot();
12978 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
12979 {
12980 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
12981 }
12982 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
12983 {
12984 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
12985 }
12986 }
12987 }
12988
12989 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
12990 {
12991 delta = m_VarQuantity - delta;
12992
12993 if (delta)
12994 OnQuantityChanged(delta);
12995 }
12996
12997 SetVariableMask(VARIABLE_QUANTITY);
12998
12999 return false;
13000 }
13001
13002 //----------------------------------------------------------------
13004 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
13005 {
13006 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
13007 }
13008 //----------------------------------------------------------------
13009 void SetQuantityMax()
13010 {
13011 float max = GetQuantityMax();
13012 SetQuantity(max);
13013 }
13014
13015 override void SetQuantityToMinimum()
13016 {
13017 float min = GetQuantityMin();
13018 SetQuantity(min);
13019 }
13020 //----------------------------------------------------------------
13022 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
13023 {
13024 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
13025 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
13026 SetQuantity(result, destroy_config, destroy_forced);
13027 }
13028
13029 //----------------------------------------------------------------
13031 override float GetQuantityNormalized()
13032 {
13033 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
13034 }
13035
13037 {
13038 return GetQuantityNormalized();
13039 }
13040
13041 /*void SetAmmoNormalized(float value)
13042 {
13043 float value_clamped = Math.Clamp(value, 0, 1);
13044 Magazine this_mag = Magazine.Cast(this);
13045 int max_rounds = this_mag.GetAmmoMax();
13046 int result = value * max_rounds;//can the rounded if higher precision is required
13047 this_mag.SetAmmoCount(result);
13048 }*/
13049 //----------------------------------------------------------------
13050 override int GetQuantityMax()
13051 {
13052 int slot = -1;
13053 GameInventory inventory = GetInventory();
13054 if (inventory)
13055 {
13056 InventoryLocation il = new InventoryLocation;
13057 inventory.GetCurrentInventoryLocation(il);
13058 slot = il.GetSlot();
13059 }
13060
13061 return GetTargetQuantityMax(slot);
13062 }
13063
13064 override int GetTargetQuantityMax(int attSlotID = -1)
13065 {
13066 float quantity_max = 0;
13067
13068 if (IsSplitable()) //only stackable/splitable items can check for stack size
13069 {
13070 if (attSlotID != -1)
13071 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
13072
13073 if (quantity_max <= 0)
13074 quantity_max = m_VarStackMax;
13075 }
13076
13077 if (quantity_max <= 0)
13078 quantity_max = m_VarQuantityMax;
13079
13080 return quantity_max;
13081 }
13082 //----------------------------------------------------------------
13083 override int GetQuantityMin()
13084 {
13085 return m_VarQuantityMin;
13086 }
13087 //----------------------------------------------------------------
13088 int GetQuantityInit()
13089 {
13090 return m_VarQuantityInit;
13091 }
13092
13093 //----------------------------------------------------------------
13094 override bool HasQuantity()
13095 {
13096 return !(GetQuantityMax() - GetQuantityMin() == 0);
13097 }
13098
13099 override float GetQuantity()
13100 {
13101 return m_VarQuantity;
13102 }
13103
13104 bool IsFullQuantity()
13105 {
13106 return GetQuantity() >= GetQuantityMax();
13107 }
13108
13109 //Calculates weight of single item without attachments and cargo
13110 override float GetSingleInventoryItemWeightEx()
13111 {
13112 //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
13113 float weightEx = GetWeightEx();//overall weight of the item
13114 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
13115 return weightEx - special;
13116 }
13117
13118 // Obsolete, use GetSingleInventoryItemWeightEx() instead
13120 {
13122 }
13123
13124 override protected float GetWeightSpecialized(bool forceRecalc = false)
13125 {
13126 if (IsSplitable()) //quantity determines size of the stack
13127 {
13128 #ifdef DEVELOPER
13129 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13130 {
13131 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13132 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
13133 }
13134 #endif
13135
13136 return GetQuantity() * GetConfigWeightModified();
13137 }
13138 else if (HasEnergyManager())// items with energy manager
13139 {
13140 #ifdef DEVELOPER
13141 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13142 {
13143 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13144 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
13145 }
13146 #endif
13147 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13148 }
13149 else//everything else
13150 {
13151 #ifdef DEVELOPER
13152 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13153 {
13154 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13155 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
13156 }
13157 #endif
13158 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13159 }
13160 }
13161
13163 int GetNumberOfItems()
13164 {
13165 int item_count = 0;
13166 ItemBase item;
13167
13168 GameInventory inventory = GetInventory();
13169 CargoBase cargo = inventory.GetCargo();
13170 if (cargo != NULL)
13171 {
13172 item_count = cargo.GetItemCount();
13173 }
13174
13175 int nAttachments = inventory.AttachmentCount();
13176 for (int i = 0; i < nAttachments; ++i)
13177 {
13178 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
13179 if (item)
13180 item_count += item.GetNumberOfItems();
13181 }
13182 return item_count;
13183 }
13184
13186 float GetUnitWeight(bool include_wetness = true)
13187 {
13188 float weight = 0;
13189 float wetness = 1;
13190 if (include_wetness)
13191 wetness += GetWet();
13192 if (IsSplitable()) //quantity determines size of the stack
13193 {
13194 weight = wetness * m_ConfigWeight;
13195 }
13196 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
13197 {
13198 weight = 1;
13199 }
13200 return weight;
13201 }
13202
13203 //-----------------------------------------------------------------
13204
13205 override void ClearInventory()
13206 {
13207 GameInventory inventory = GetInventory();
13208 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
13209 {
13210 array<EntityAI> items = new array<EntityAI>;
13211 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
13212 for (int i = 0; i < items.Count(); ++i)
13213 {
13214 ItemBase item = ItemBase.Cast(items.Get(i));
13215 if (item)
13216 {
13217 g_Game.ObjectDelete(item);
13218 }
13219 }
13220 }
13221 }
13222
13223 //------------------------- Energy
13224
13225 //----------------------------------------------------------------
13226 float GetEnergy()
13227 {
13228 float energy = 0;
13229 if (HasEnergyManager())
13230 {
13231 energy = GetCompEM().GetEnergy();
13232 }
13233 return energy;
13234 }
13235
13236
13237 override void OnEnergyConsumed()
13238 {
13239 super.OnEnergyConsumed();
13240
13242 }
13243
13244 override void OnEnergyAdded()
13245 {
13246 super.OnEnergyAdded();
13247
13249 }
13250
13251 // Converts energy (from Energy Manager) to quantity, if enabled.
13253 {
13254 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13255 {
13256 if (HasQuantity())
13257 {
13258 float energy_0to1 = GetCompEM().GetEnergy0To1();
13259 SetQuantityNormalized(energy_0to1);
13260 }
13261 }
13262 }
13263
13264 //----------------------------------------------------------------
13265 float GetHeatIsolationInit()
13266 {
13267 return ConfigGetFloat("heatIsolation");
13268 }
13269
13270 float GetHeatIsolation()
13271 {
13272 return m_HeatIsolation;
13273 }
13274
13275 float GetDryingIncrement(string pIncrementName)
13276 {
13277 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
13278 if (g_Game.ConfigIsExisting(paramPath))
13279 return g_Game.ConfigGetFloat(paramPath);
13280
13281 return 0.0;
13282 }
13283
13284 float GetSoakingIncrement(string pIncrementName)
13285 {
13286 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
13287 if (g_Game.ConfigIsExisting(paramPath))
13288 return g_Game.ConfigGetFloat(paramPath);
13289
13290 return 0.0;
13291 }
13292 //----------------------------------------------------------------
13293 override void SetWet(float value, bool allow_client = false)
13294 {
13295 if (!IsServerCheck(allow_client))
13296 return;
13297
13298 float min = GetWetMin();
13299 float max = GetWetMax();
13300
13301 float previousValue = m_VarWet;
13302
13303 m_VarWet = Math.Clamp(value, min, max);
13304
13305 if (previousValue != m_VarWet)
13306 {
13307 SetVariableMask(VARIABLE_WET);
13308 OnWetChanged(m_VarWet, previousValue);
13309 }
13310 }
13311 //----------------------------------------------------------------
13312 override void AddWet(float value)
13313 {
13314 SetWet(GetWet() + value);
13315 }
13316 //----------------------------------------------------------------
13317 override void SetWetMax()
13318 {
13320 }
13321 //----------------------------------------------------------------
13322 override float GetWet()
13323 {
13324 return m_VarWet;
13325 }
13326 //----------------------------------------------------------------
13327 override float GetWetMax()
13328 {
13329 return m_VarWetMax;
13330 }
13331 //----------------------------------------------------------------
13332 override float GetWetMin()
13333 {
13334 return m_VarWetMin;
13335 }
13336 //----------------------------------------------------------------
13337 override float GetWetInit()
13338 {
13339 return m_VarWetInit;
13340 }
13341 //----------------------------------------------------------------
13342 override void OnWetChanged(float newVal, float oldVal)
13343 {
13344 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
13345 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
13346 if (newLevel != oldLevel)
13347 {
13348 OnWetLevelChanged(newLevel,oldLevel);
13349 }
13350 }
13351
13352 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
13353 {
13354 SetWeightDirty();
13355 }
13356
13357 override EWetnessLevel GetWetLevel()
13358 {
13359 return GetWetLevelInternal(m_VarWet);
13360 }
13361
13362 //----------------------------------------------------------------
13363
13364 override void SetStoreLoad(bool value)
13365 {
13366 m_IsStoreLoad = value;
13367 }
13368
13369 override bool IsStoreLoad()
13370 {
13371 return m_IsStoreLoad;
13372 }
13373
13374 override void SetStoreLoadedQuantity(float value)
13375 {
13376 m_StoreLoadedQuantity = value;
13377 }
13378
13379 override float GetStoreLoadedQuantity()
13380 {
13381 return m_StoreLoadedQuantity;
13382 }
13383
13384 //----------------------------------------------------------------
13385
13386 float GetItemModelLength()
13387 {
13388 if (ConfigIsExisting("itemModelLength"))
13389 {
13390 return ConfigGetFloat("itemModelLength");
13391 }
13392 return 0;
13393 }
13394
13395 float GetItemAttachOffset()
13396 {
13397 if (ConfigIsExisting("itemAttachOffset"))
13398 {
13399 return ConfigGetFloat("itemAttachOffset");
13400 }
13401 return 0;
13402 }
13403
13404 override void SetCleanness(int value, bool allow_client = false)
13405 {
13406 if (!IsServerCheck(allow_client))
13407 return;
13408
13409 int previousValue = m_Cleanness;
13410
13411 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
13412
13413 if (previousValue != m_Cleanness)
13414 SetVariableMask(VARIABLE_CLEANNESS);
13415 }
13416
13417 override int GetCleanness()
13418 {
13419 return m_Cleanness;
13420 }
13421
13423 {
13424 return true;
13425 }
13426
13427 //----------------------------------------------------------------
13428 // ATTACHMENT LOCKING
13429 // Getters relevant to generic ActionLockAttachment
13430 int GetLockType()
13431 {
13432 return m_LockType;
13433 }
13434
13435 string GetLockSoundSet()
13436 {
13437 return m_LockSoundSet;
13438 }
13439
13440 //----------------------------------------------------------------
13441 //------------------------- Color
13442 // sets items color variable given color components
13443 override void SetColor(int r, int g, int b, int a)
13444 {
13449 SetVariableMask(VARIABLE_COLOR);
13450 }
13452 override void GetColor(out int r,out int g,out int b,out int a)
13453 {
13458 }
13459
13460 bool IsColorSet()
13461 {
13462 return IsVariableSet(VARIABLE_COLOR);
13463 }
13464
13466 string GetColorString()
13467 {
13468 int r,g,b,a;
13469 GetColor(r,g,b,a);
13470 r = r/255;
13471 g = g/255;
13472 b = b/255;
13473 a = a/255;
13474 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13475 }
13476 //----------------------------------------------------------------
13477 //------------------------- LiquidType
13478
13479 override void SetLiquidType(int value, bool allow_client = false)
13480 {
13481 if (!IsServerCheck(allow_client))
13482 return;
13483
13484 int old = m_VarLiquidType;
13485 m_VarLiquidType = value;
13486 OnLiquidTypeChanged(old,value);
13487 SetVariableMask(VARIABLE_LIQUIDTYPE);
13488 }
13489
13490 int GetLiquidTypeInit()
13491 {
13492 return ConfigGetInt("varLiquidTypeInit");
13493 }
13494
13495 override int GetLiquidType()
13496 {
13497 return m_VarLiquidType;
13498 }
13499
13500 protected void OnLiquidTypeChanged(int oldType, int newType)
13501 {
13502 if (newType == LIQUID_NONE && GetIsFrozen())
13503 SetFrozen(false);
13504 }
13505
13507 void UpdateQuickbarShortcutVisibility(PlayerBase player)
13508 {
13509 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13510 }
13511
13512 // -------------------------------------------------------------------------
13514 void OnInventoryEnter(Man player)
13515 {
13516 PlayerBase nplayer;
13517 if (PlayerBase.CastTo(nplayer, player))
13518 {
13519 m_CanPlayImpactSound = true;
13520 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13521 }
13522 }
13523
13524 // -------------------------------------------------------------------------
13526 void OnInventoryExit(Man player)
13527 {
13528 PlayerBase nplayer;
13529 if (PlayerBase.CastTo(nplayer,player))
13530 {
13531 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13532 }
13533
13534 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13535
13536 if (HasEnergyManager())
13537 {
13538 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
13539 }
13540 }
13541
13542 // ADVANCED PLACEMENT EVENTS
13543 override void OnPlacementStarted(Man player)
13544 {
13545 super.OnPlacementStarted(player);
13546
13547 SetTakeable(false);
13548 }
13549
13550 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
13551 {
13552 if (m_AdminLog)
13553 {
13554 m_AdminLog.OnPlacementComplete(player, this);
13555 }
13556
13557 super.OnPlacementComplete(player, position, orientation);
13558 }
13559
13560 //-----------------------------
13561 // AGENT SYSTEM
13562 //-----------------------------
13563 //--------------------------------------------------------------------------
13564 bool ContainsAgent(int agent_id)
13565 {
13566 if (agent_id & m_AttachedAgents)
13567 {
13568 return true;
13569 }
13570 else
13571 {
13572 return false;
13573 }
13574 }
13575
13576 //--------------------------------------------------------------------------
13577 override void RemoveAgent(int agent_id)
13578 {
13579 if (ContainsAgent(agent_id))
13580 {
13581 m_AttachedAgents = ~agent_id & m_AttachedAgents;
13582 }
13583 }
13584
13585 //--------------------------------------------------------------------------
13586 override void RemoveAllAgents()
13587 {
13588 m_AttachedAgents = 0;
13589 }
13590 //--------------------------------------------------------------------------
13591 override void RemoveAllAgentsExcept(int agent_to_keep)
13592 {
13593 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
13594 }
13595 // -------------------------------------------------------------------------
13596 override void InsertAgent(int agent, float count = 1)
13597 {
13598 if (count < 1)
13599 return;
13600 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
13602 }
13603
13605 void TransferAgents(int agents)
13606 {
13608 }
13609
13610 // -------------------------------------------------------------------------
13611 override int GetAgents()
13612 {
13613 return m_AttachedAgents;
13614 }
13615 //----------------------------------------------------------------------
13616
13617 /*int GetContaminationType()
13618 {
13619 int contamination_type;
13620
13621 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
13622 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
13623 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
13624 const int DIRTY_MASK = eAgents.WOUND_AGENT;
13625
13626 Edible_Base edible = Edible_Base.Cast(this);
13627 int agents = GetAgents();
13628 if (edible)
13629 {
13630 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
13631 if (profile)
13632 {
13633 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
13634 }
13635 }
13636 if (agents & CONTAMINATED_MASK)
13637 {
13638 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
13639 }
13640 if (agents & POISONED_MASK)
13641 {
13642 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
13643 }
13644 if (agents & NERVE_GAS_MASK)
13645 {
13646 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
13647 }
13648 if (agents & DIRTY_MASK)
13649 {
13650 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
13651 }
13652
13653 return agents;
13654 }*/
13655
13656 // -------------------------------------------------------------------------
13657 bool LoadAgents(ParamsReadContext ctx, int version)
13658 {
13659 if (!ctx.Read(m_AttachedAgents))
13660 return false;
13661 return true;
13662 }
13663 // -------------------------------------------------------------------------
13665 {
13666
13668 }
13669 // -------------------------------------------------------------------------
13670
13672 override void CheckForRoofLimited(float timeTresholdMS = 3000)
13673 {
13674 super.CheckForRoofLimited(timeTresholdMS);
13675
13676 float time = g_Game.GetTime();
13677 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13678 {
13679 m_PreviousRoofTestTime = time;
13680 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13681 }
13682 }
13683
13684 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
13685 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
13686 {
13687 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
13688 {
13689 return 0;
13690 }
13691
13692 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
13693 {
13694 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
13695 if (filter)
13696 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
13697 else
13698 return 0;//otherwise return 0 when no filter attached
13699 }
13700
13701 string subclassPath, entryName;
13702
13703 switch (type)
13704 {
13705 case DEF_BIOLOGICAL:
13706 entryName = "biological";
13707 break;
13708 case DEF_CHEMICAL:
13709 entryName = "chemical";
13710 break;
13711 default:
13712 entryName = "biological";
13713 break;
13714 }
13715
13716 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
13717
13718 return g_Game.ConfigGetFloat(subclassPath + entryName);
13719 }
13720
13721
13722
13724 override void EEOnCECreate()
13725 {
13726 if (!IsMagazine())
13728
13730 }
13731
13732
13733 //-------------------------
13734 // OPEN/CLOSE USER ACTIONS
13735 //-------------------------
13737 void Open();
13738 void Close();
13739 bool IsOpen()
13740 {
13741 return true;
13742 }
13743
13744 override bool CanDisplayCargo()
13745 {
13746 return IsOpen();
13747 }
13748
13749
13750 // ------------------------------------------------------------
13751 // CONDITIONS
13752 // ------------------------------------------------------------
13753 override bool CanPutInCargo(EntityAI parent)
13754 {
13755 if (parent)
13756 {
13757 if (parent.IsInherited(DayZInfected))
13758 return true;
13759
13760 if (!parent.IsRuined())
13761 return true;
13762 }
13763
13764 return true;
13765 }
13766
13767 override bool CanPutAsAttachment(EntityAI parent)
13768 {
13769 if (!super.CanPutAsAttachment(parent))
13770 {
13771 return false;
13772 }
13773
13774 if (!IsRuined() && !parent.IsRuined())
13775 {
13776 return true;
13777 }
13778
13779 return false;
13780 }
13781
13782 override bool CanReceiveItemIntoCargo(EntityAI item)
13783 {
13784 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13785 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13786 // return false;
13787
13788 return super.CanReceiveItemIntoCargo(item);
13789 }
13790
13791 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
13792 {
13793 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13794 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13795 // return false;
13796
13797 GameInventory attachmentInv = attachment.GetInventory();
13798 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13799 {
13800 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13801 return false;
13802 }
13803
13804 InventoryLocation loc = new InventoryLocation();
13805 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13806 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
13807 return false;
13808
13809 return super.CanReceiveAttachment(attachment, slotId);
13810 }
13811
13812 override bool CanReleaseAttachment(EntityAI attachment)
13813 {
13814 if (!super.CanReleaseAttachment(attachment))
13815 return false;
13816
13817 return GetInventory().AreChildrenAccessible();
13818 }
13819
13820 /*override bool CanLoadAttachment(EntityAI attachment)
13821 {
13822 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13823 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13824 // return false;
13825
13826 GameInventory attachmentInv = attachment.GetInventory();
13827 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13828 {
13829 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
13830 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
13831
13832 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13833 return false;
13834 }
13835
13836 return super.CanLoadAttachment(attachment);
13837 }*/
13838
13839 // Plays muzzle flash particle effects
13840 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13841 {
13842 int id = muzzle_owner.GetMuzzleID();
13843 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
13844
13845 if (WPOF_array)
13846 {
13847 for (int i = 0; i < WPOF_array.Count(); i++)
13848 {
13849 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13850
13851 if (WPOF)
13852 {
13853 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13854 }
13855 }
13856 }
13857 }
13858
13859 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
13860 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13861 {
13862 int id = muzzle_owner.GetMuzzleID();
13863 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
13864
13865 if (WPOBE_array)
13866 {
13867 for (int i = 0; i < WPOBE_array.Count(); i++)
13868 {
13869 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13870
13871 if (WPOBE)
13872 {
13873 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13874 }
13875 }
13876 }
13877 }
13878
13879 // Plays all weapon overheating particles
13880 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13881 {
13882 int id = muzzle_owner.GetMuzzleID();
13883 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13884
13885 if (WPOOH_array)
13886 {
13887 for (int i = 0; i < WPOOH_array.Count(); i++)
13888 {
13889 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13890
13891 if (WPOOH)
13892 {
13893 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13894 }
13895 }
13896 }
13897 }
13898
13899 // Updates all weapon overheating particles
13900 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13901 {
13902 int id = muzzle_owner.GetMuzzleID();
13903 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13904
13905 if (WPOOH_array)
13906 {
13907 for (int i = 0; i < WPOOH_array.Count(); i++)
13908 {
13909 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13910
13911 if (WPOOH)
13912 {
13913 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13914 }
13915 }
13916 }
13917 }
13918
13919 // Stops overheating particles
13920 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13921 {
13922 int id = muzzle_owner.GetMuzzleID();
13923 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13924
13925 if (WPOOH_array)
13926 {
13927 for (int i = 0; i < WPOOH_array.Count(); i++)
13928 {
13929 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13930
13931 if (WPOOH)
13932 {
13933 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13934 }
13935 }
13936 }
13937 }
13938
13939 //----------------------------------------------------------------
13940 //Item Behaviour - unified approach
13941 override bool IsHeavyBehaviour()
13942 {
13943 if (m_ItemBehaviour == 0)
13944 {
13945 return true;
13946 }
13947
13948 return false;
13949 }
13950
13951 override bool IsOneHandedBehaviour()
13952 {
13953 if (m_ItemBehaviour == 1)
13954 {
13955 return true;
13956 }
13957
13958 return false;
13959 }
13960
13961 override bool IsTwoHandedBehaviour()
13962 {
13963 if (m_ItemBehaviour == 2)
13964 {
13965 return true;
13966 }
13967
13968 return false;
13969 }
13970
13971 bool IsDeployable()
13972 {
13973 return false;
13974 }
13975
13977 float GetDeployTime()
13978 {
13979 return UATimeSpent.DEFAULT_DEPLOY;
13980 }
13981
13982
13983 //----------------------------------------------------------------
13984 // Item Targeting (User Actions)
13985 override void SetTakeable(bool pState)
13986 {
13987 m_IsTakeable = pState;
13988 SetSynchDirty();
13989 }
13990
13991 override bool IsTakeable()
13992 {
13993 return m_IsTakeable;
13994 }
13995
13996 // For cases where we want to show object widget which cant be taken to hands
13998 {
13999 return false;
14000 }
14001
14003 protected void PreLoadSoundAttachmentType()
14004 {
14005 string att_type = "None";
14006
14007 if (ConfigIsExisting("soundAttType"))
14008 {
14009 att_type = ConfigGetString("soundAttType");
14010 }
14011
14012 m_SoundAttType = att_type;
14013 }
14014
14015 override string GetAttachmentSoundType()
14016 {
14017 return m_SoundAttType;
14018 }
14019
14020 //----------------------------------------------------------------
14021 //SOUNDS - ItemSoundHandler
14022 //----------------------------------------------------------------
14023
14024 string GetPlaceSoundset(); // played when deploy starts
14025 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
14026 string GetDeploySoundset(); // played when deploy sucessfully finishes
14027 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
14028 string GetFoldSoundset(); // played when fold sucessfully finishes
14029
14031 {
14032 if (!m_ItemSoundHandler)
14034
14035 return m_ItemSoundHandler;
14036 }
14037
14038 // override to initialize sounds
14039 protected void InitItemSounds()
14040 {
14041 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
14042 return;
14043
14045
14046 if (GetPlaceSoundset() != string.Empty)
14047 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
14048
14049 if (GetDeploySoundset() != string.Empty)
14050 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
14051
14052 SoundParameters params = new SoundParameters();
14053 params.m_Loop = true;
14054 if (GetLoopDeploySoundset() != string.Empty)
14055 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
14056 }
14057
14058 // Start sound using ItemSoundHandler
14059 void StartItemSoundServer(int id, int slotId)
14060 {
14061 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
14062 {
14063 m_SoundSyncSlotID = slotId;
14064 m_SoundSyncPlay = id;
14065
14066 SetSynchDirty();
14067
14068 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
14069 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
14070 }
14071 }
14072
14073 void StartItemSoundServer(int id)
14074 {
14075 StartItemSoundServer(id, InventorySlots.INVALID);
14076 }
14077
14078 // Stop sound using ItemSoundHandler
14079 void StopItemSoundServer(int id)
14080 {
14081 if (!g_Game.IsServer())
14082 return;
14083
14084 m_SoundSyncStop = id;
14085 SetSynchDirty();
14086
14087 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
14088 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
14089 }
14090
14091 protected void ClearStartItemSoundServer()
14092 {
14093 m_SoundSyncPlay = 0;
14094 m_SoundSyncSlotID = InventorySlots.INVALID;
14095 }
14096
14097 protected void ClearStopItemSoundServer()
14098 {
14099 m_SoundSyncStop = 0;
14100 }
14101
14102 void OnApply(PlayerBase player);
14103
14105 {
14106 return 1.0;
14107 };
14108 //returns applicable selection
14109 array<string> GetHeadHidingSelection()
14110 {
14112 }
14113
14115 {
14117 }
14118
14119 WrittenNoteData GetWrittenNoteData() {};
14120
14122 {
14123 SetDynamicPhysicsLifeTime(0.01);
14124 m_ItemBeingDroppedPhys = false;
14125 }
14126
14128 {
14129 array<string> zone_names = new array<string>;
14130 GetDamageZones(zone_names);
14131 for (int i = 0; i < zone_names.Count(); i++)
14132 {
14133 SetHealthMax(zone_names.Get(i),"Health");
14134 }
14135 SetHealthMax("","Health");
14136 }
14137
14139 void SetZoneDamageCEInit()
14140 {
14141 float global_health = GetHealth01("","Health");
14142 array<string> zones = new array<string>;
14143 GetDamageZones(zones);
14144 //set damage of all zones to match global health level
14145 for (int i = 0; i < zones.Count(); i++)
14146 {
14147 SetHealth01(zones.Get(i),"Health",global_health);
14148 }
14149 }
14150
14152 bool IsCoverFaceForShave(string slot_name)
14153 {
14154 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14155 }
14156
14157 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
14158 {
14159 if (!hasRootAsPlayer)
14160 {
14161 if (refParentIB)
14162 {
14163 // parent is wet
14164 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
14165 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14166 // parent has liquid inside
14167 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
14168 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14169 // drying
14170 else if (m_VarWet > m_VarWetMin)
14171 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
14172 }
14173 else
14174 {
14175 // drying on ground or inside non-itembase (car, ...)
14176 if (m_VarWet > m_VarWetMin)
14177 AddWet(-1 * delta * GetDryingIncrement("ground"));
14178 }
14179 }
14180 }
14181
14182 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
14183 {
14185 {
14186 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
14187 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
14188 {
14189 float heatPermCoef = 1.0;
14190 EntityAI ent = this;
14191 while (ent)
14192 {
14193 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14194 ent = ent.GetHierarchyParent();
14195 }
14196
14197 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14198 }
14199 }
14200 }
14201
14202 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
14203 {
14204 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
14205 EntityAI parent = GetHierarchyParent();
14206 if (!parent)
14207 {
14208 hasParent = false;
14209 hasRootAsPlayer = false;
14210 }
14211 else
14212 {
14213 hasParent = true;
14214 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14215 refParentIB = ItemBase.Cast(parent);
14216 }
14217 }
14218
14219 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
14220 {
14221 // this is stub, implemented on Edible_Base
14222 }
14223
14224 bool CanDecay()
14225 {
14226 // return true used on selected food clases so they can decay
14227 return false;
14228 }
14229
14230 protected bool CanProcessDecay()
14231 {
14232 // this is stub, implemented on Edible_Base class
14233 // used to determine whether it is still necessary for the food to decay
14234 return false;
14235 }
14236
14237 protected bool CanHaveWetness()
14238 {
14239 // return true used on selected items that have a wetness effect
14240 return false;
14241 }
14242
14244 bool CanBeConsumed(ConsumeConditionData data = null)
14245 {
14246 return !GetIsFrozen() && IsOpen();
14247 }
14248
14249 override void ProcessVariables()
14250 {
14251 bool hasParent = false, hasRootAsPlayer = false;
14252 ItemBase refParentIB;
14253
14254 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
14255 bool foodDecay = g_Game.IsFoodDecayEnabled();
14256
14257 if (wwtu || foodDecay)
14258 {
14259 bool processWetness = wwtu && CanHaveWetness();
14260 bool processTemperature = wwtu && CanHaveTemperature();
14261 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
14262
14263 if (processWetness || processTemperature || processDecay)
14264 {
14265 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
14266
14267 if (processWetness)
14268 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14269
14270 if (processTemperature)
14271 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14272
14273 if (processDecay)
14274 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14275 }
14276 }
14277 }
14278
14281 {
14282 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
14283 }
14284
14285 override float GetTemperatureFreezeThreshold()
14286 {
14288 return Liquid.GetFreezeThreshold(GetLiquidType());
14289
14290 return super.GetTemperatureFreezeThreshold();
14291 }
14292
14293 override float GetTemperatureThawThreshold()
14294 {
14296 return Liquid.GetThawThreshold(GetLiquidType());
14297
14298 return super.GetTemperatureThawThreshold();
14299 }
14300
14301 override float GetItemOverheatThreshold()
14302 {
14304 return Liquid.GetBoilThreshold(GetLiquidType());
14305
14306 return super.GetItemOverheatThreshold();
14307 }
14308
14309 override float GetTemperatureFreezeTime()
14310 {
14311 if (HasQuantity())
14312 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
14313
14314 return super.GetTemperatureFreezeTime();
14315 }
14316
14317 override float GetTemperatureThawTime()
14318 {
14319 if (HasQuantity())
14320 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
14321
14322 return super.GetTemperatureThawTime();
14323 }
14324
14326 void AffectLiquidContainerOnFill(int liquid_type, float amount);
14328 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
14329
14330 bool IsCargoException4x3(EntityAI item)
14331 {
14332 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14333 }
14334
14336 {
14337 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14338 }
14339
14341 void AddLightSourceItem(ItemBase lightsource)
14342 {
14343 m_LightSourceItem = lightsource;
14344 }
14345
14347 {
14348 m_LightSourceItem = null;
14349 }
14350
14352 {
14353 return m_LightSourceItem;
14354 }
14355
14357 array<int> GetValidFinishers()
14358 {
14359 return null;
14360 }
14361
14363 bool GetActionWidgetOverride(out typename name)
14364 {
14365 return false;
14366 }
14367
14368 bool PairWithDevice(notnull ItemBase otherDevice)
14369 {
14370 if (g_Game.IsServer())
14371 {
14372 ItemBase explosive = otherDevice;
14374 if (!trg)
14375 {
14376 trg = RemoteDetonatorTrigger.Cast(otherDevice);
14377 explosive = this;
14378 }
14379
14380 explosive.PairRemote(trg);
14381 trg.SetControlledDevice(explosive);
14382
14383 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14384 trg.SetPersistentPairID(persistentID);
14385 explosive.SetPersistentPairID(persistentID);
14386
14387 return true;
14388 }
14389 return false;
14390 }
14391
14393 float GetBaitEffectivity()
14394 {
14395 float ret = 1.0;
14396 if (HasQuantity())
14397 ret *= GetQuantityNormalized();
14398 ret *= GetHealth01();
14399
14400 return ret;
14401 }
14402
14403 #ifdef DEVELOPER
14404 override void SetDebugItem()
14405 {
14406 super.SetDebugItem();
14407 _itemBase = this;
14408 }
14409
14410 override string GetDebugText()
14411 {
14412 string text = super.GetDebugText();
14413
14414 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
14415 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
14416
14417 return text;
14418 }
14419 #endif
14420
14421 bool CanBeUsedForSuicide()
14422 {
14423 return true;
14424 }
14425
14427 //DEPRECATED BELOW
14429 // Backwards compatibility
14430 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
14431 {
14432 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
14433 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
14434 }
14435
14436 // replaced by ItemSoundHandler
14437 protected EffectSound m_SoundDeployFinish;
14438 protected EffectSound m_SoundPlace;
14439 protected EffectSound m_DeployLoopSoundEx;
14440 protected EffectSound m_SoundDeploy;
14441 bool m_IsPlaceSound;
14442 bool m_IsDeploySound;
14444
14445 string GetDeployFinishSoundset();
14446 void PlayDeploySound();
14447 void PlayDeployFinishSound();
14448 void PlayPlaceSound();
14449 void PlayDeployLoopSoundEx();
14450 void StopDeployLoopSoundEx();
14451 void SoundSynchRemoteReset();
14452 void SoundSynchRemote();
14453 bool UsesGlobalDeploy(){return false;}
14454 bool CanPlayDeployLoopSound(){return false;}
14456 bool IsPlaceSound(){return m_IsPlaceSound;}
14457 bool IsDeploySound(){return m_IsDeploySound;}
14458 void SetIsPlaceSound(bool is_place_sound);
14459 void SetIsDeploySound(bool is_deploy_sound);
14460
14461 [Obsolete("Use ItemSoundHandler instead")]
14463 void PlayAttachSound(string slot_type)
14464 {
14465 if (!g_Game.IsDedicatedServer())
14466 {
14467 if (ConfigIsExisting("attachSoundSet"))
14468 {
14469 string cfg_path = "";
14470 string soundset = "";
14471 string type_name = GetType();
14472
14473 TStringArray cfg_soundset_array = new TStringArray;
14474 TStringArray cfg_slot_array = new TStringArray;
14475 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14476 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14477
14478 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14479 {
14480 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14481 {
14482 if (cfg_slot_array[i] == slot_type)
14483 {
14484 soundset = cfg_soundset_array[i];
14485 break;
14486 }
14487 }
14488 }
14489
14490 if (soundset != "")
14491 {
14492 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
14493 sound.SetAutodestroy(true);
14494 }
14495 }
14496 }
14497 }
14498
14499 void PlayDetachSound(string slot_type) {}
14500}
14501
14502EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
14503{
14504 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
14505 if (entity)
14506 {
14507 bool is_item = entity.IsInherited(ItemBase);
14508 if (is_item && full_quantity)
14509 {
14510 ItemBase item = ItemBase.Cast(entity);
14511 item.SetQuantity(item.GetQuantityInit());
14512 }
14513 }
14514 else
14515 {
14516 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
14517 return NULL;
14518 }
14519 return entity;
14520}
14521
14522void SetupSpawnedItem(ItemBase item, float health, float quantity)
14523{
14524 if (item)
14525 {
14526 if (health > 0)
14527 item.SetHealth("", "", health);
14528
14529 if (item.CanHaveTemperature())
14530 {
14531 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
14532 if (item.CanFreeze())
14533 item.SetFrozen(false);
14534 }
14535
14536 if (item.HasEnergyManager())
14537 {
14538 if (quantity >= 0)
14539 {
14540 item.GetCompEM().SetEnergy0To1(quantity);
14541 }
14542 else
14543 {
14544 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
14545 }
14546 }
14547 else if (item.IsMagazine())
14548 {
14549 Magazine mag = Magazine.Cast(item);
14550 if (quantity >= 0)
14551 {
14552 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14553 }
14554 else
14555 {
14556 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
14557 }
14558
14559 }
14560 else
14561 {
14562 if (quantity >= 0)
14563 {
14564 item.SetQuantityNormalized(quantity, false);
14565 }
14566 else
14567 {
14568 item.SetQuantity(Math.AbsFloat(quantity));
14569 }
14570
14571 }
14572 }
14573}
14574
14575#ifdef DEVELOPER
14576ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
14577#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
string Debug()
Определения CachedEquipmentStorageBase.c:29
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
Определения ItemBase.c:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения 3_Game/DayZ/Entities/Man.c:48
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
Определения ItemBase.c:21
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:507
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
InventoryLocation.
Определения InventoryLocation.c:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1032
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения ItemBase.c:14
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()

Используется в Entity::CanFreeze() и Entity::SetTemperatureEx().