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

◆ GetItemOverheatThreshold()

override float SpawnItemOnLocation::GetItemOverheatThreshold ( )
protected

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

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