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

◆ ProcessItemWetnessAndTemperature()

void SpawnItemOnLocation::ProcessItemWetnessAndTemperature ( float delta,
bool hasParent,
bool hasRootAsPlayer,
ItemBase refParentIB )
protected

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

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