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

◆ IsCargoException4x3()

bool SpawnItemOnLocation::IsCargoException4x3 ( EntityAI item)
protected

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

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

Используется в Cauldron::CanLoadItemIntoCargo(), FryingPan::CanLoadItemIntoCargo(), Pot::CanLoadItemIntoCargo(), Cauldron::CanPutInCargo(), FryingPan::CanPutInCargo(), Pot::CanPutInCargo(), Cauldron::CanReceiveItemIntoCargo(), FryingPan::CanReceiveItemIntoCargo() и Pot::CanReceiveItemIntoCargo().