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

◆ CanBeConsumed()

bool SpawnItemOnLocation::CanBeConsumed ( ConsumeConditionData data = null)
protected

Items cannot be consumed if frozen by default. Override for exceptions.

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

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