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

◆ CanBeUsedForSuicide()

bool SpawnItemOnLocation::CanBeUsedForSuicide ( )
protected

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

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