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

◆ GetTemperatureFreezeTime()

override float SpawnItemOnLocation::GetTemperatureFreezeTime ( )
protected

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

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

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