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

◆ ProcessItemWetness()

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

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

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