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

◆ HierarchyCheck()

void SpawnItemOnLocation::HierarchyCheck ( out bool hasParent,
out bool hasRootAsPlayer,
out ItemBase refParentIB )
protected

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

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

Используется в InventoryItem::ProcessVariables().