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

◆ GetTemperatureFreezeThreshold()

override float SpawnItemOnLocation::GetTemperatureFreezeThreshold ( )
protected

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

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