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

◆ PairWithDevice()

bool SpawnItemOnLocation::PairWithDevice ( notnull ItemBase otherDevice)
protected

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

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

Используется в ClaymoreMine::OnDebugSpawn() и ClaymoreMine::OnPlacementComplete().