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

◆ ProcessItemTemperature()

void SpawnItemOnLocation::ProcessItemTemperature ( float delta,
bool hasParent,
bool hasRootAsPlayer,
ItemBase refParentIB )
protected

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

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