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

◆ IsDeploySound()

bool SpawnItemOnLocation::IsDeploySound ( )
protected

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

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