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

◆ GetLockSoundSet()

string SpawnItemOnLocation::GetLockSoundSet ( )
protected

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

8491{
8492 override bool CanPutAsAttachment(EntityAI parent)
8493 {
8494 return true;
8495 }
8496};
8497
8498//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8499
8500class ItemBase extends InventoryItem
8501{
8505
8507
8508 static int m_DebugActionsMask;
8510 // ============================================
8511 // Variable Manipulation System
8512 // ============================================
8513 // Quantity
8514
8515 float m_VarQuantity;
8516 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8518 int m_VarQuantityMin;
8519 int m_VarQuantityMax;
8520 int m_Count;
8521 float m_VarStackMax;
8522 float m_StoreLoadedQuantity = float.LOWEST;
8523 // Wet
8524 float m_VarWet;
8525 float m_VarWetPrev;//for client to know wetness changed during synchronization
8526 float m_VarWetInit;
8527 float m_VarWetMin;
8528 float m_VarWetMax;
8529 // Cleanness
8530 int m_Cleanness;
8531 int m_CleannessInit;
8532 int m_CleannessMin;
8533 int m_CleannessMax;
8534 // impact sounds
8536 bool m_CanPlayImpactSound = true;
8537 float m_ImpactSpeed;
8539 //
8540 float m_HeatIsolation;
8541 float m_ItemModelLength;
8542 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8544 int m_VarLiquidType;
8545 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8546 int m_QuickBarBonus;
8547 bool m_IsBeingPlaced;
8548 bool m_IsHologram;
8549 bool m_IsTakeable;
8550 bool m_ThrowItemOnDrop;
8553 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8554 bool can_this_be_combined; //Check if item can be combined
8555 bool m_CanThisBeSplit; //Check if item can be split
8556 bool m_IsStoreLoad = false;
8557 bool m_CanShowQuantity;
8558 bool m_HasQuantityBar;
8559 protected bool m_CanBeDigged;
8560 protected bool m_IsResultOfSplit
8561
8562 string m_SoundAttType;
8563 // items color variables
8568 //-------------------------------------------------------
8569
8570 // light source managing
8572
8576
8577 //==============================================
8578 // agent system
8579 private int m_AttachedAgents;
8580
8582 void TransferModifiers(PlayerBase reciever);
8583
8584
8585 // Weapons & suppressors particle effects
8590 static int m_LastRegisteredWeaponID = 0;
8591
8592 // Overheating effects
8594 float m_OverheatingShots;
8595 ref Timer m_CheckOverheating;
8596 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8597 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8598 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8599 ref array <ref OverheatingParticle> m_OverheatingParticles;
8600
8602 protected bool m_HideSelectionsBySlot;
8603
8604 // Admin Log
8605 PluginAdminLog m_AdminLog;
8606
8607 // misc
8608 ref Timer m_PhysDropTimer;
8609
8610 // Attachment Locking variables
8611 ref array<int> m_CompatibleLocks;
8612 protected int m_LockType;
8613 protected ref EffectSound m_LockingSound;
8614 protected string m_LockSoundSet;
8615
8616 // ItemSoundHandler
8617 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8618 protected int m_SoundSyncPlay; // id for sound to play
8619 protected int m_SoundSyncStop; // id for sound to stop
8621
8622 //temperature
8623 private float m_TemperaturePerQuantityWeight;
8624
8625 // -------------------------------------------------------------------------
8626 void ItemBase()
8627 {
8628 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8632
8633 if (!GetGame().IsDedicatedServer())
8634 {
8635 if (HasMuzzle())
8636 {
8638
8640 {
8642 }
8643 }
8644
8646 m_ActionsInitialize = false;
8647 }
8648
8649 m_OldLocation = null;
8650
8651 if (GetGame().IsServer())
8652 {
8653 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8654 }
8655
8656 if (ConfigIsExisting("headSelectionsToHide"))
8657 {
8659 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8660 }
8661
8662 m_HideSelectionsBySlot = false;
8663 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8664 {
8665 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8666 }
8667
8668 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8669
8670 m_IsResultOfSplit = false;
8671
8673 }
8674
8675 override void InitItemVariables()
8676 {
8677 super.InitItemVariables();
8678
8679 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8680 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8681 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8682 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8683 m_VarStackMax = ConfigGetFloat("varStackMax");
8684 m_Count = ConfigGetInt("count");
8685
8686 m_CanShowQuantity = ConfigGetBool("quantityShow");
8687 m_HasQuantityBar = ConfigGetBool("quantityBar");
8688
8689 m_CleannessInit = ConfigGetInt("varCleannessInit");
8691 m_CleannessMin = ConfigGetInt("varCleannessMin");
8692 m_CleannessMax = ConfigGetInt("varCleannessMax");
8693
8694 m_WantPlayImpactSound = false;
8695 m_ImpactSpeed = 0.0;
8696
8697 m_VarWetInit = ConfigGetFloat("varWetInit");
8699 m_VarWetMin = ConfigGetFloat("varWetMin");
8700 m_VarWetMax = ConfigGetFloat("varWetMax");
8701
8702 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8703 if (IsLiquidContainer() && GetQuantity() != 0)
8705 m_IsBeingPlaced = false;
8706 m_IsHologram = false;
8707 m_IsTakeable = true;
8708 m_CanBeMovedOverride = false;
8712 m_CanBeDigged = ConfigGetBool("canBeDigged");
8713
8714 m_CompatibleLocks = new array<int>();
8715 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8716 m_LockType = ConfigGetInt("lockType");
8717
8718 //Define if item can be split and set ability to be combined accordingly
8719 m_CanThisBeSplit = false;
8720 can_this_be_combined = false;
8721 if (ConfigIsExisting("canBeSplit"))
8722 {
8723 can_this_be_combined = ConfigGetBool("canBeSplit");
8725 }
8726
8727 m_ItemBehaviour = -1;
8728 if (ConfigIsExisting("itemBehaviour"))
8729 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8730
8731 //RegisterNetSyncVariableInt("m_VariablesMask");
8732 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8733 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8734 RegisterNetSyncVariableInt("m_VarLiquidType");
8735 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8736
8737 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8738 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8739 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8740
8741 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8742 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8743 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8744 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8745
8746 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8747 RegisterNetSyncVariableBool("m_IsTakeable");
8748 RegisterNetSyncVariableBool("m_IsHologram");
8749
8750 InitItemSounds();
8752 {
8753 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8754 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8755 }
8756
8757 m_LockSoundSet = ConfigGetString("lockSoundSet");
8758
8760 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8761 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8762
8763 }
8764
8765 override int GetQuickBarBonus()
8766 {
8767 return m_QuickBarBonus;
8768 }
8769
8770 void InitializeActions()
8771 {
8773 if (!m_InputActionMap)
8774 {
8776 m_InputActionMap = iam;
8777 SetActions();
8779 }
8780 }
8781
8782 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8783 {
8785 {
8786 m_ActionsInitialize = true;
8788 }
8789
8790 actions = m_InputActionMap.Get(action_input_type);
8791 }
8792
8793 void SetActions()
8794 {
8795 AddAction(ActionTakeItem);
8796 AddAction(ActionTakeItemToHands);
8797 AddAction(ActionWorldCraft);
8799 AddAction(ActionAttachWithSwitch);
8800 }
8801
8802 void SetActionAnimOverrides(); // Override action animation for specific item
8803
8804 void AddAction(typename actionName)
8805 {
8806 ActionBase action = ActionManagerBase.GetAction(actionName);
8807
8808 if (!action)
8809 {
8810 Debug.LogError("Action " + actionName + " dosn't exist!");
8811 return;
8812 }
8813
8814 typename ai = action.GetInputType();
8815 if (!ai)
8816 {
8817 m_ActionsInitialize = false;
8818 return;
8819 }
8820
8821 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8822 if (!action_array)
8823 {
8824 action_array = new array<ActionBase_Basic>;
8825 m_InputActionMap.Insert(ai, action_array);
8826 }
8827 if (LogManager.IsActionLogEnable())
8828 {
8829 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8830 }
8831
8832 if (action_array.Find(action) != -1)
8833 {
8834 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8835 }
8836 else
8837 {
8838 action_array.Insert(action);
8839 }
8840 }
8841
8842 void RemoveAction(typename actionName)
8843 {
8844 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
8845 ActionBase action = player.GetActionManager().GetAction(actionName);
8846 typename ai = action.GetInputType();
8847 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8848
8849 if (action_array)
8850 {
8851 action_array.RemoveItem(action);
8852 }
8853 }
8854
8855 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
8856 // Set -1 for params which should stay in default state
8857 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
8858 {
8859 ActionOverrideData overrideData = new ActionOverrideData();
8860 overrideData.m_CommandUID = commandUID;
8861 overrideData.m_CommandUIDProne = commandUIDProne;
8862 overrideData.m_StanceMask = stanceMask;
8863
8864 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
8865 if (!actionMap) // create new map of action > overidables map
8866 {
8867 actionMap = new TActionAnimOverrideMap();
8868 m_ItemActionOverrides.Insert(action, actionMap);
8869 }
8870
8871 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
8872
8873 }
8874
8875 void OnItemInHandsPlayerSwimStart(PlayerBase player);
8876
8877 ScriptedLightBase GetLight();
8878
8879 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8880 void LoadParticleConfigOnFire(int id)
8881 {
8882 if (!m_OnFireEffect)
8884
8887
8888 string config_to_search = "CfgVehicles";
8889 string muzzle_owner_config;
8890
8891 if (!m_OnFireEffect.Contains(id))
8892 {
8893 if (IsInherited(Weapon))
8894 config_to_search = "CfgWeapons";
8895
8896 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8897
8898 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8899
8900 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
8901
8902 if (config_OnFire_subclass_count > 0)
8903 {
8904 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8905
8906 for (int i = 0; i < config_OnFire_subclass_count; i++)
8907 {
8908 string particle_class = "";
8909 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
8910 string config_OnFire_entry = config_OnFire_class + particle_class;
8911 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8912 WPOF_array.Insert(WPOF);
8913 }
8914
8915
8916 m_OnFireEffect.Insert(id, WPOF_array);
8917 }
8918 }
8919
8920 if (!m_OnBulletCasingEjectEffect.Contains(id))
8921 {
8922 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8923 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8924
8925 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8926
8927 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8928
8929 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8930 {
8931 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8932
8933 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8934 {
8935 string particle_class2 = "";
8936 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8937 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8938 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8939 WPOBE_array.Insert(WPOBE);
8940 }
8941
8942
8943 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8944 }
8945 }
8946 }
8947
8948 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8950 {
8953
8954 if (!m_OnOverheatingEffect.Contains(id))
8955 {
8956 string config_to_search = "CfgVehicles";
8957
8958 if (IsInherited(Weapon))
8959 config_to_search = "CfgWeapons";
8960
8961 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8962 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8963
8964 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
8965 {
8966
8967 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8968
8970 {
8971 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8972 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8973 Error(error);
8974 return;
8975 }
8976
8977 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8978 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8979
8980
8981
8982 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
8983 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8984
8985 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8986 {
8987 string particle_class = "";
8988 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8989 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8990 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
8991
8992 if (entry_type == CT_CLASS)
8993 {
8994 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8995 WPOOH_array.Insert(WPOF);
8996 }
8997 }
8998
8999
9000 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9001 }
9002 }
9003 }
9004
9005 float GetOverheatingValue()
9006 {
9007 return m_OverheatingShots;
9008 }
9009
9010 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9011 {
9012 if (m_MaxOverheatingValue > 0)
9013 {
9015
9016 if (!m_CheckOverheating)
9018
9020 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9021
9022 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9023 }
9024 }
9025
9026 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9027 {
9029 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9030
9032 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9033
9035 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9036
9038 {
9040 }
9041 }
9042
9044 {
9046 }
9047
9048 void OnOverheatingDecay()
9049 {
9050 if (m_MaxOverheatingValue > 0)
9051 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9052 else
9054
9055 if (m_OverheatingShots <= 0)
9056 {
9059 }
9060 else
9061 {
9062 if (!m_CheckOverheating)
9064
9066 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9067 }
9068
9069 CheckOverheating(this, "", this);
9070 }
9071
9072 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9073 {
9075 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9076 }
9077
9078 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9079 {
9081 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9083 }
9084
9085 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9086 {
9088 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9089 }
9090
9091 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9092 {
9094 m_OverheatingParticles = new array<ref OverheatingParticle>;
9095
9096 OverheatingParticle OP = new OverheatingParticle();
9097 OP.RegisterParticle(p);
9098 OP.SetOverheatingLimitMin(min_heat_coef);
9099 OP.SetOverheatingLimitMax(max_heat_coef);
9100 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9101
9102 m_OverheatingParticles.Insert(OP);
9103 }
9104
9105 float GetOverheatingCoef()
9106 {
9107 if (m_MaxOverheatingValue > 0)
9109
9110 return -1;
9111 }
9112
9114 {
9116 {
9117 float overheat_coef = GetOverheatingCoef();
9118 int count = m_OverheatingParticles.Count();
9119
9120 for (int i = count; i > 0; --i)
9121 {
9122 int id = i - 1;
9123 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9124 Particle p = OP.GetParticle();
9125
9126 float overheat_min = OP.GetOverheatingLimitMin();
9127 float overheat_max = OP.GetOverheatingLimitMax();
9128
9129 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9130 {
9131 if (p)
9132 {
9133 p.Stop();
9134 OP.RegisterParticle(null);
9135 }
9136 }
9137 }
9138 }
9139 }
9140
9142 {
9144 {
9145 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9146 {
9147 int id = i - 1;
9148 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9149
9150 if (OP)
9151 {
9152 Particle p = OP.GetParticle();
9153
9154 if (p)
9155 {
9156 p.Stop();
9157 }
9158
9159 delete OP;
9160 }
9161 }
9162
9163 m_OverheatingParticles.Clear();
9165 }
9166 }
9167
9169 float GetInfectionChance(int system = 0, Param param = null)
9170 {
9171 return 0.0;
9172 }
9173
9174
9175 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9176 {
9177 return 250;//default value
9178 }
9179
9180 float GetFilterDamageRatio()
9181 {
9182 return 0;
9183 }
9184
9186 bool HasMuzzle()
9187 {
9188 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9189 return true;
9190
9191 return false;
9192 }
9193
9195 int GetMuzzleID()
9196 {
9197 if (!m_WeaponTypeToID)
9199
9200 if (m_WeaponTypeToID.Contains(GetType()))
9201 {
9202 return m_WeaponTypeToID.Get(GetType());
9203 }
9204 else
9205 {
9206 // Register new weapon ID
9208 }
9209
9211 }
9212
9219 {
9220 return -1;
9221 }
9222
9223
9224
9225 // -------------------------------------------------------------------------
9226 void ~ItemBase()
9227 {
9228 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
9229 {
9230 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9231 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9232
9233 if (r_index >= 0)
9234 {
9235 InventoryLocation r_il = new InventoryLocation;
9236 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9237
9238 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9239 int r_type = r_il.GetType();
9240 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9241 {
9242 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9243 }
9244 else if (r_type == InventoryLocationType.ATTACHMENT)
9245 {
9246 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9247 }
9248
9249 }
9250
9251 player.GetHumanInventory().ClearUserReservedLocation(this);
9252 }
9253
9254 if (m_LockingSound)
9255 SEffectManager.DestroyEffect(m_LockingSound);
9256 }
9257
9258
9259
9260 // -------------------------------------------------------------------------
9261 static int GetDebugActionsMask()
9262 {
9263 return ItemBase.m_DebugActionsMask;
9264 }
9265
9266 static bool HasDebugActionsMask(int mask)
9267 {
9268 return ItemBase.m_DebugActionsMask & mask;
9269 }
9270
9271 static void SetDebugActionsMask(int mask)
9272 {
9273 ItemBase.m_DebugActionsMask = mask;
9274 }
9275
9276 static void AddDebugActionsMask(int mask)
9277 {
9278 ItemBase.m_DebugActionsMask |= mask;
9279 }
9280
9281 static void RemoveDebugActionsMask(int mask)
9282 {
9283 ItemBase.m_DebugActionsMask &= ~mask;
9284 }
9285
9286 static void ToggleDebugActionsMask(int mask)
9287 {
9288 if (HasDebugActionsMask(mask))
9289 {
9291 }
9292 else
9293 {
9294 AddDebugActionsMask(mask);
9295 }
9296 }
9297
9298 // -------------------------------------------------------------------------
9299 void SetCEBasedQuantity()
9300 {
9301 if (GetEconomyProfile())
9302 {
9303 float q_max = GetEconomyProfile().GetQuantityMax();
9304 if (q_max > 0)
9305 {
9306 float q_min = GetEconomyProfile().GetQuantityMin();
9307 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9308
9309 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9310 {
9311 ComponentEnergyManager comp = GetCompEM();
9312 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
9313 {
9314 comp.SetEnergy0To1(quantity_randomized);
9315 }
9316 }
9317 else if (HasQuantity())
9318 {
9319 SetQuantityNormalized(quantity_randomized, false);
9320 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9321 }
9322
9323 }
9324 }
9325 }
9326
9328 void LockToParent()
9329 {
9330 EntityAI parent = GetHierarchyParent();
9331
9332 if (parent)
9333 {
9334 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9335 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9336 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9337 }
9338 }
9339
9341 void UnlockFromParent()
9342 {
9343 EntityAI parent = GetHierarchyParent();
9344
9345 if (parent)
9346 {
9347 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9348 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9349 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9350 }
9351 }
9352
9353 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9354 {
9355 /*
9356 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9357 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
9358 */
9359 ItemBase item2 = ItemBase.Cast(entity2);
9360
9361 if (GetGame().IsClient())
9362 {
9363 if (ScriptInputUserData.CanStoreInputUserData())
9364 {
9365 ScriptInputUserData ctx = new ScriptInputUserData;
9367 ctx.Write(-1);
9368 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9369 ctx.Write(i1);
9370 ctx.Write(item2);
9371 ctx.Write(use_stack_max);
9372 ctx.Write(-1);
9373 ctx.Send();
9374
9375 if (IsCombineAll(item2, use_stack_max))
9376 {
9377 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9378 }
9379 }
9380 }
9381 else if (!GetGame().IsMultiplayer())
9382 {
9383 CombineItems(item2, use_stack_max);
9384 }
9385 }
9386
9387 bool IsLiquidPresent()
9388 {
9389 return (GetLiquidType() != 0 && HasQuantity());
9390 }
9391
9392 bool IsLiquidContainer()
9393 {
9394 return m_LiquidContainerMask != 0;
9395 }
9396
9398 {
9399 return m_LiquidContainerMask;
9400 }
9401
9402 bool IsBloodContainer()
9403 {
9404 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9405 return false;
9406 }
9407
9408 bool IsNVG()
9409 {
9410 return false;
9411 }
9412
9415 bool IsExplosive()
9416 {
9417 return false;
9418 }
9419
9421 {
9422 return "";
9423 }
9424
9426
9427 bool IsLightSource()
9428 {
9429 return false;
9430 }
9431
9433 {
9434 return true;
9435 }
9436
9437 //--- ACTION CONDITIONS
9438 //direction
9439 bool IsFacingPlayer(PlayerBase player, string selection)
9440 {
9441 return true;
9442 }
9443
9444 bool IsPlayerInside(PlayerBase player, string selection)
9445 {
9446 return true;
9447 }
9448
9449 override bool CanObstruct()
9450 {
9451 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9452 return !player || !IsPlayerInside(player, "");
9453 }
9454
9455 override bool IsBeingPlaced()
9456 {
9457 return m_IsBeingPlaced;
9458 }
9459
9460 void SetIsBeingPlaced(bool is_being_placed)
9461 {
9462 m_IsBeingPlaced = is_being_placed;
9463 if (!is_being_placed)
9465 SetSynchDirty();
9466 }
9467
9468 //server-side
9469 void OnEndPlacement() {}
9470
9471 override bool IsHologram()
9472 {
9473 return m_IsHologram;
9474 }
9475
9476 bool CanBeDigged()
9477 {
9478 return m_CanBeDigged;
9479 }
9480
9482 {
9483 return 1;
9484 }
9485
9486 bool CanMakeGardenplot()
9487 {
9488 return false;
9489 }
9490
9491 void SetIsHologram(bool is_hologram)
9492 {
9493 m_IsHologram = is_hologram;
9494 SetSynchDirty();
9495 }
9496 /*
9497 protected float GetNutritionalEnergy()
9498 {
9499 Edible_Base edible = Edible_Base.Cast(this);
9500 return edible.GetFoodEnergy();
9501 }
9502
9503 protected float GetNutritionalWaterContent()
9504 {
9505 Edible_Base edible = Edible_Base.Cast(this);
9506 return edible.GetFoodWater();
9507 }
9508
9509 protected float GetNutritionalIndex()
9510 {
9511 Edible_Base edible = Edible_Base.Cast(this);
9512 return edible.GetFoodNutritionalIndex();
9513 }
9514
9515 protected float GetNutritionalFullnessIndex()
9516 {
9517 Edible_Base edible = Edible_Base.Cast(this);
9518 return edible.GetFoodTotalVolume();
9519 }
9520
9521 protected float GetNutritionalToxicity()
9522 {
9523 Edible_Base edible = Edible_Base.Cast(this);
9524 return edible.GetFoodToxicity();
9525
9526 }
9527 */
9528
9529
9530 // -------------------------------------------------------------------------
9531 override void OnMovedInsideCargo(EntityAI container)
9532 {
9533 super.OnMovedInsideCargo(container);
9534
9535 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9536 }
9537
9538 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9539 {
9540 super.EEItemLocationChanged(oldLoc,newLoc);
9541
9542 PlayerBase new_player = null;
9543 PlayerBase old_player = null;
9544
9545 if (newLoc.GetParent())
9546 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9547
9548 if (oldLoc.GetParent())
9549 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9550
9551 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
9552 {
9553 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9554
9555 if (r_index >= 0)
9556 {
9557 InventoryLocation r_il = new InventoryLocation;
9558 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9559
9560 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9561 int r_type = r_il.GetType();
9562 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9563 {
9564 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9565 }
9566 else if (r_type == InventoryLocationType.ATTACHMENT)
9567 {
9568 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9569 }
9570
9571 }
9572 }
9573
9574 if (newLoc.GetType() == InventoryLocationType.HANDS)
9575 {
9576 if (new_player)
9577 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9578
9579 if (new_player == old_player)
9580 {
9581
9582 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9583 {
9584 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9585 {
9586 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9587 {
9588 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9589 }
9590 }
9591 else
9592 {
9593 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9594 }
9595 }
9596
9597 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9598 {
9599 int type = oldLoc.GetType();
9600 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9601 {
9602 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9603 }
9604 else if (type == InventoryLocationType.ATTACHMENT)
9605 {
9606 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9607 }
9608 }
9609 if (!m_OldLocation)
9610 {
9611 m_OldLocation = new InventoryLocation;
9612 }
9613 m_OldLocation.Copy(oldLoc);
9614 }
9615 else
9616 {
9617 if (m_OldLocation)
9618 {
9619 m_OldLocation.Reset();
9620 }
9621 }
9622
9624 }
9625 else
9626 {
9627 if (new_player)
9628 {
9629 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9630 if (res_index >= 0)
9631 {
9632 InventoryLocation il = new InventoryLocation;
9633 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9634 ItemBase it = ItemBase.Cast(il.GetItem());
9635 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9636 int rel_type = il.GetType();
9637 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9638 {
9639 il.GetParent().GetOnReleaseLock().Invoke(it);
9640 }
9641 else if (rel_type == InventoryLocationType.ATTACHMENT)
9642 {
9643 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9644 }
9645 //it.GetOnReleaseLock().Invoke(it);
9646 }
9647 }
9648 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9649 {
9650 //ThrowPhysically(old_player, vector.Zero);
9651 m_ThrowItemOnDrop = false;
9652 }
9653
9654 if (m_OldLocation)
9655 {
9656 m_OldLocation.Reset();
9657 }
9658 }
9659 }
9660
9661 override void EOnContact(IEntity other, Contact extra)
9662 {
9664 {
9665 int liquidType = -1;
9666 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9667 if (impactSpeed > 0.0)
9668 {
9669 m_ImpactSpeed = impactSpeed;
9670 #ifndef SERVER
9671 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9672 #else
9673 m_WantPlayImpactSound = true;
9674 SetSynchDirty();
9675 #endif
9676 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9677 }
9678 }
9679
9680 #ifdef SERVER
9681 if (GetCompEM() && GetCompEM().IsPlugged())
9682 {
9683 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9684 GetCompEM().UnplugThis();
9685 }
9686 #endif
9687 }
9688
9689 void RefreshPhysics();
9690
9691 override void OnCreatePhysics()
9692 {
9694 }
9695
9696 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9697 {
9698
9699 }
9700 // -------------------------------------------------------------------------
9701 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9702 {
9703 super.OnItemLocationChanged(old_owner, new_owner);
9704
9705 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9706 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9707
9708 if (!relatedPlayer && playerNew)
9709 relatedPlayer = playerNew;
9710
9711 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9712 {
9713 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9714 if (actionMgr)
9715 {
9716 ActionBase currentAction = actionMgr.GetRunningAction();
9717 if (currentAction)
9718 currentAction.OnItemLocationChanged(this);
9719 }
9720 }
9721
9722 Man ownerPlayerOld = null;
9723 Man ownerPlayerNew = null;
9724
9725 if (old_owner)
9726 {
9727 if (old_owner.IsMan())
9728 {
9729 ownerPlayerOld = Man.Cast(old_owner);
9730 }
9731 else
9732 {
9733 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9734 }
9735 }
9736 else
9737 {
9738 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9739 {
9740 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9741
9742 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9743 {
9744 GetCompEM().UnplugThis();
9745 }
9746 }
9747 }
9748
9749 if (new_owner)
9750 {
9751 if (new_owner.IsMan())
9752 {
9753 ownerPlayerNew = Man.Cast(new_owner);
9754 }
9755 else
9756 {
9757 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9758 }
9759 }
9760
9761 if (ownerPlayerOld != ownerPlayerNew)
9762 {
9763 if (ownerPlayerOld)
9764 {
9765 array<EntityAI> subItemsExit = new array<EntityAI>;
9766 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9767 for (int i = 0; i < subItemsExit.Count(); i++)
9768 {
9769 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9770 itemExit.OnInventoryExit(ownerPlayerOld);
9771 }
9772 }
9773
9774 if (ownerPlayerNew)
9775 {
9776 array<EntityAI> subItemsEnter = new array<EntityAI>;
9777 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9778 for (int j = 0; j < subItemsEnter.Count(); j++)
9779 {
9780 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9781 itemEnter.OnInventoryEnter(ownerPlayerNew);
9782 }
9783 }
9784 }
9785 else if (ownerPlayerNew != null)
9786 {
9787 PlayerBase nplayer;
9788 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9789 {
9790 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9791 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9792 for (int k = 0; k < subItemsUpdate.Count(); k++)
9793 {
9794 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9795 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9796 }
9797 }
9798 }
9799
9800 if (old_owner)
9801 old_owner.OnChildItemRemoved(this);
9802 if (new_owner)
9803 new_owner.OnChildItemReceived(this);
9804 }
9805
9806 // -------------------------------------------------------------------------------
9807 override void EEDelete(EntityAI parent)
9808 {
9809 super.EEDelete(parent);
9810 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9811 if (player)
9812 {
9813 OnInventoryExit(player);
9814
9815 if (player.IsAlive())
9816 {
9817 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9818 if (r_index >= 0)
9819 {
9820 InventoryLocation r_il = new InventoryLocation;
9821 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9822
9823 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9824 int r_type = r_il.GetType();
9825 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9826 {
9827 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9828 }
9829 else if (r_type == InventoryLocationType.ATTACHMENT)
9830 {
9831 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9832 }
9833
9834 }
9835
9836 player.RemoveQuickBarEntityShortcut(this);
9837 }
9838 }
9839 }
9840 // -------------------------------------------------------------------------------
9841 override void EEKilled(Object killer)
9842 {
9843 super.EEKilled(killer);
9844
9846 if (killer && killer.IsFireplace() && CanExplodeInFire())
9847 {
9848 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9849 {
9850 if (IsMagazine())
9851 {
9852 if (Magazine.Cast(this).GetAmmoCount() > 0)
9853 {
9854 ExplodeAmmo();
9855 }
9856 }
9857 else
9858 {
9859 Explode(DamageType.EXPLOSION);
9860 }
9861 }
9862 }
9863 }
9864
9865 override void OnWasAttached(EntityAI parent, int slot_id)
9866 {
9867 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9868
9869 super.OnWasAttached(parent, slot_id);
9870
9871 if (HasQuantity())
9872 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9873
9874 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
9875 }
9876
9877 override void OnWasDetached(EntityAI parent, int slot_id)
9878 {
9879 super.OnWasDetached(parent, slot_id);
9880
9881 if (HasQuantity())
9882 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9883 }
9884
9885 override string ChangeIntoOnAttach(string slot)
9886 {
9887 int idx;
9888 TStringArray inventory_slots = new TStringArray;
9889 TStringArray attach_types = new TStringArray;
9890
9891 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9892 if (inventory_slots.Count() < 1) //is string
9893 {
9894 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9895 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9896 }
9897 else //is array
9898 {
9899 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9900 }
9901
9902 idx = inventory_slots.Find(slot);
9903 if (idx < 0)
9904 return "";
9905
9906 return attach_types.Get(idx);
9907 }
9908
9909 override string ChangeIntoOnDetach()
9910 {
9911 int idx = -1;
9912 string slot;
9913
9914 TStringArray inventory_slots = new TStringArray;
9915 TStringArray detach_types = new TStringArray;
9916
9917 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9918 if (inventory_slots.Count() < 1) //is string
9919 {
9920 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9921 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9922 }
9923 else //is array
9924 {
9925 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9926 if (detach_types.Count() < 1)
9927 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9928 }
9929
9930 for (int i = 0; i < inventory_slots.Count(); i++)
9931 {
9932 slot = inventory_slots.Get(i);
9933 }
9934
9935 if (slot != "")
9936 {
9937 if (detach_types.Count() == 1)
9938 idx = 0;
9939 else
9940 idx = inventory_slots.Find(slot);
9941 }
9942 if (idx < 0)
9943 return "";
9944
9945 return detach_types.Get(idx);
9946 }
9947
9948 void ExplodeAmmo()
9949 {
9950 //timer
9951 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9952
9953 //min/max time
9954 float min_time = 1;
9955 float max_time = 3;
9956 float delay = Math.RandomFloat(min_time, max_time);
9957
9958 explode_timer.Run(delay, this, "DoAmmoExplosion");
9959 }
9960
9961 void DoAmmoExplosion()
9962 {
9963 Magazine magazine = Magazine.Cast(this);
9964 int pop_sounds_count = 6;
9965 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9966
9967 //play sound
9968 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9969 string sound_name = pop_sounds[ sound_idx ];
9970 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
9971
9972 //remove ammo count
9973 magazine.ServerAddAmmoCount(-1);
9974
9975 //if condition then repeat -> ExplodeAmmo
9976 float min_temp_to_explode = 100; //min temperature for item to explode
9977
9978 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9979 {
9980 ExplodeAmmo();
9981 }
9982 }
9983
9984 // -------------------------------------------------------------------------------
9985 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9986 {
9987 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9988
9989 const int CHANCE_DAMAGE_CARGO = 4;
9990 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9991 const int CHANCE_DAMAGE_NOTHING = 2;
9992
9993 if (IsClothing() || IsContainer() || IsItemTent())
9994 {
9995 float dmg = damageResult.GetDamage("","Health") * -0.5;
9996 int chances;
9997 int rnd;
9998
9999 if (GetInventory().GetCargo())
10000 {
10001 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10002 rnd = Math.RandomInt(0,chances);
10003
10004 if (rnd < CHANCE_DAMAGE_CARGO)
10005 {
10006 DamageItemInCargo(dmg);
10007 }
10008 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10009 {
10011 }
10012 }
10013 else
10014 {
10015 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10016 rnd = Math.RandomInt(0,chances);
10017
10018 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10019 {
10021 }
10022 }
10023 }
10024 }
10025
10026 bool DamageItemInCargo(float damage)
10027 {
10028 if (GetInventory().GetCargo())
10029 {
10030 int item_count = GetInventory().GetCargo().GetItemCount();
10031 if (item_count > 0)
10032 {
10033 int random_pick = Math.RandomInt(0, item_count);
10034 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
10035 if (!item.IsExplosive())
10036 {
10037 item.AddHealth("","",damage);
10038 return true;
10039 }
10040 }
10041 }
10042 return false;
10043 }
10044
10045 bool DamageItemAttachments(float damage)
10046 {
10047 int attachment_count = GetInventory().AttachmentCount();
10048 if (attachment_count > 0)
10049 {
10050 int random_pick = Math.RandomInt(0, attachment_count);
10051 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10052 if (!attachment.IsExplosive())
10053 {
10054 attachment.AddHealth("","",damage);
10055 return true;
10056 }
10057 }
10058 return false;
10059 }
10060
10061 override bool IsSplitable()
10062 {
10063 return m_CanThisBeSplit;
10064 }
10065 //----------------
10066 override bool CanBeSplit()
10067 {
10068 if (IsSplitable() && (GetQuantity() > 1))
10069 return GetInventory().CanRemoveEntity();
10070
10071 return false;
10072 }
10073
10074 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10075 {
10076 if (!CanBeSplit())
10077 return;
10078
10079 if (GetGame().IsClient())
10080 {
10081 if (ScriptInputUserData.CanStoreInputUserData())
10082 {
10083 ScriptInputUserData ctx = new ScriptInputUserData;
10085 ctx.Write(1);
10086 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10087 ctx.Write(i1);
10088 ctx.Write(destination_entity);
10089 ctx.Write(true);
10090 ctx.Write(slot_id);
10091 ctx.Send();
10092 }
10093 }
10094 else if (!GetGame().IsMultiplayer())
10095 {
10096 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
10097 }
10098 }
10099
10100 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10101 {
10102 if (!CanBeSplit())
10103 return;
10104
10105 float split_quantity_new;
10106 ref ItemBase new_item;
10107 float quantity = GetQuantity();
10108 float stack_max = GetTargetQuantityMax(slot_id);
10109 InventoryLocation loc = new InventoryLocation;
10110
10111 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10112 {
10113 if (stack_max <= GetQuantity())
10114 split_quantity_new = stack_max;
10115 else
10116 split_quantity_new = GetQuantity();
10117
10118 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10119 if (new_item)
10120 {
10121 new_item.SetResultOfSplit(true);
10122 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10123 AddQuantity(-split_quantity_new);
10124 new_item.SetQuantity(split_quantity_new);
10125 }
10126 }
10127 else if (destination_entity && slot_id == -1)
10128 {
10129 if (quantity > stack_max)
10130 split_quantity_new = stack_max;
10131 else
10132 split_quantity_new = quantity;
10133
10134 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10135 {
10136 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10137 new_item = ItemBase.Cast(o);
10138 }
10139
10140 if (new_item)
10141 {
10142 new_item.SetResultOfSplit(true);
10143 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10144 AddQuantity(-split_quantity_new);
10145 new_item.SetQuantity(split_quantity_new);
10146 }
10147 }
10148 else
10149 {
10150 if (stack_max != 0)
10151 {
10152 if (stack_max < GetQuantity())
10153 {
10154 split_quantity_new = GetQuantity() - stack_max;
10155 }
10156
10157 if (split_quantity_new == 0)
10158 {
10159 if (!GetGame().IsMultiplayer())
10160 player.PhysicalPredictiveDropItem(this);
10161 else
10162 player.ServerDropEntity(this);
10163 return;
10164 }
10165
10166 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10167
10168 if (new_item)
10169 {
10170 new_item.SetResultOfSplit(true);
10171 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10172 SetQuantity(split_quantity_new);
10173 new_item.SetQuantity(stack_max);
10174 new_item.PlaceOnSurface();
10175 }
10176 }
10177 }
10178 }
10179
10180 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10181 {
10182 if (!CanBeSplit())
10183 return;
10184
10185 float split_quantity_new;
10186 ref ItemBase new_item;
10187 float quantity = GetQuantity();
10188 float stack_max = GetTargetQuantityMax(slot_id);
10189 InventoryLocation loc = new InventoryLocation;
10190
10191 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10192 {
10193 if (stack_max <= GetQuantity())
10194 split_quantity_new = stack_max;
10195 else
10196 split_quantity_new = GetQuantity();
10197
10198 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10199 if (new_item)
10200 {
10201 new_item.SetResultOfSplit(true);
10202 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10203 AddQuantity(-split_quantity_new);
10204 new_item.SetQuantity(split_quantity_new);
10205 }
10206 }
10207 else if (destination_entity && slot_id == -1)
10208 {
10209 if (quantity > stack_max)
10210 split_quantity_new = stack_max;
10211 else
10212 split_quantity_new = quantity;
10213
10214 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10215 {
10216 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10217 new_item = ItemBase.Cast(o);
10218 }
10219
10220 if (new_item)
10221 {
10222 new_item.SetResultOfSplit(true);
10223 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10224 AddQuantity(-split_quantity_new);
10225 new_item.SetQuantity(split_quantity_new);
10226 }
10227 }
10228 else
10229 {
10230 if (stack_max != 0)
10231 {
10232 if (stack_max < GetQuantity())
10233 {
10234 split_quantity_new = GetQuantity() - stack_max;
10235 }
10236
10237 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10238
10239 if (new_item)
10240 {
10241 new_item.SetResultOfSplit(true);
10242 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10243 SetQuantity(split_quantity_new);
10244 new_item.SetQuantity(stack_max);
10245 new_item.PlaceOnSurface();
10246 }
10247 }
10248 }
10249 }
10250
10251 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10252 {
10253 if (!CanBeSplit())
10254 return;
10255
10256 if (GetGame().IsClient())
10257 {
10258 if (ScriptInputUserData.CanStoreInputUserData())
10259 {
10260 ScriptInputUserData ctx = new ScriptInputUserData;
10262 ctx.Write(4);
10263 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10264 ctx.Write(thiz);
10265 dst.WriteToContext(ctx);
10266 ctx.Send();
10267 }
10268 }
10269 else if (!GetGame().IsMultiplayer())
10270 {
10272 }
10273 }
10274
10275 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10276 {
10277 if (!CanBeSplit())
10278 return;
10279
10280 if (GetGame().IsClient())
10281 {
10282 if (ScriptInputUserData.CanStoreInputUserData())
10283 {
10284 ScriptInputUserData ctx = new ScriptInputUserData;
10286 ctx.Write(2);
10287 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10288 ctx.Write(dummy);
10289 ctx.Write(destination_entity);
10290 ctx.Write(true);
10291 ctx.Write(idx);
10292 ctx.Write(row);
10293 ctx.Write(col);
10294 ctx.Send();
10295 }
10296 }
10297 else if (!GetGame().IsMultiplayer())
10298 {
10299 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10300 }
10301 }
10302
10303 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10304 {
10306 }
10307
10308 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10309 {
10310 if (!CanBeSplit())
10311 return this;
10312
10313 float quantity = GetQuantity();
10314 float split_quantity_new;
10315 ItemBase new_item;
10316 if (dst.IsValid())
10317 {
10318 int slot_id = dst.GetSlot();
10319 float stack_max = GetTargetQuantityMax(slot_id);
10320
10321 if (quantity > stack_max)
10322 split_quantity_new = stack_max;
10323 else
10324 split_quantity_new = quantity;
10325
10326 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10327
10328 if (new_item)
10329 {
10330 new_item.SetResultOfSplit(true);
10331 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10332 AddQuantity(-split_quantity_new);
10333 new_item.SetQuantity(split_quantity_new);
10334 }
10335
10336 return new_item;
10337 }
10338
10339 return null;
10340 }
10341
10342 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10343 {
10344 if (!CanBeSplit())
10345 return;
10346
10347 float quantity = GetQuantity();
10348 float split_quantity_new;
10349 ref ItemBase new_item;
10350 if (destination_entity)
10351 {
10352 float stackable = GetTargetQuantityMax();
10353 if (quantity > stackable)
10354 split_quantity_new = stackable;
10355 else
10356 split_quantity_new = quantity;
10357
10358 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10359 if (new_item)
10360 {
10361 new_item.SetResultOfSplit(true);
10362 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10363 AddQuantity(-split_quantity_new);
10364 new_item.SetQuantity(split_quantity_new);
10365 }
10366 }
10367 }
10368
10369 void SplitIntoStackMaxHandsClient(PlayerBase player)
10370 {
10371 if (!CanBeSplit())
10372 return;
10373
10374 if (GetGame().IsClient())
10375 {
10376 if (ScriptInputUserData.CanStoreInputUserData())
10377 {
10378 ScriptInputUserData ctx = new ScriptInputUserData;
10380 ctx.Write(3);
10381 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10382 ctx.Write(i1);
10383 ItemBase destination_entity = this;
10384 ctx.Write(destination_entity);
10385 ctx.Write(true);
10386 ctx.Write(0);
10387 ctx.Send();
10388 }
10389 }
10390 else if (!GetGame().IsMultiplayer())
10391 {
10392 SplitIntoStackMaxHands(player);
10393 }
10394 }
10395
10396 void SplitIntoStackMaxHands(PlayerBase player)
10397 {
10398 if (!CanBeSplit())
10399 return;
10400
10401 float quantity = GetQuantity();
10402 float split_quantity_new;
10403 ref ItemBase new_item;
10404 if (player)
10405 {
10406 float stackable = GetTargetQuantityMax();
10407 if (quantity > stackable)
10408 split_quantity_new = stackable;
10409 else
10410 split_quantity_new = quantity;
10411
10412 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10413 new_item = ItemBase.Cast(in_hands);
10414 if (new_item)
10415 {
10416 new_item.SetResultOfSplit(true);
10417 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10418 AddQuantity(-split_quantity_new);
10419 new_item.SetQuantity(split_quantity_new);
10420 }
10421 }
10422 }
10423
10424 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10425 {
10426 if (!CanBeSplit())
10427 return;
10428
10429 float quantity = GetQuantity();
10430 float split_quantity_new = Math.Floor(quantity * 0.5);
10431
10432 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10433
10434 if (new_item)
10435 {
10436 if (new_item.GetQuantityMax() < split_quantity_new)
10437 {
10438 split_quantity_new = new_item.GetQuantityMax();
10439 }
10440
10441 new_item.SetResultOfSplit(true);
10442 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10443
10444 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10445 {
10446 AddQuantity(-1);
10447 new_item.SetQuantity(1);
10448 }
10449 else
10450 {
10451 AddQuantity(-split_quantity_new);
10452 new_item.SetQuantity(split_quantity_new);
10453 }
10454 }
10455 }
10456
10457 void SplitItem(PlayerBase player)
10458 {
10459 if (!CanBeSplit())
10460 return;
10461
10462 float quantity = GetQuantity();
10463 float split_quantity_new = Math.Floor(quantity / 2);
10464
10465 InventoryLocation invloc = new InventoryLocation;
10466 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10467
10468 ItemBase new_item;
10469 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10470
10471 if (new_item)
10472 {
10473 if (new_item.GetQuantityMax() < split_quantity_new)
10474 {
10475 split_quantity_new = new_item.GetQuantityMax();
10476 }
10477 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10478 {
10479 AddQuantity(-1);
10480 new_item.SetQuantity(1);
10481 }
10482 else
10483 {
10484 AddQuantity(-split_quantity_new);
10485 new_item.SetQuantity(split_quantity_new);
10486 }
10487 }
10488 }
10489
10491 void OnQuantityChanged(float delta)
10492 {
10493 SetWeightDirty();
10494 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10495
10496 if (parent)
10497 parent.OnAttachmentQuantityChangedEx(this, delta);
10498
10499 if (IsLiquidContainer())
10500 {
10501 if (GetQuantityNormalized() <= 0.0)
10502 {
10504 }
10505 else if (GetLiquidType() == LIQUID_NONE)
10506 {
10507 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10509 }
10510 }
10511
10512 }
10513
10516 {
10517 // insert code here
10518 }
10519
10521 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10522 {
10524 }
10525
10526 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10527 {
10528 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10529
10530 if (GetGame().IsServer())
10531 {
10532 if (newLevel == GameConstants.STATE_RUINED)
10533 {
10535 EntityAI parent = GetHierarchyParent();
10536 if (parent && parent.IsFireplace())
10537 {
10538 CargoBase cargo = GetInventory().GetCargo();
10539 if (cargo)
10540 {
10541 for (int i = 0; i < cargo.GetItemCount(); ++i)
10542 {
10543 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10544 }
10545 }
10546 }
10547 }
10548
10549 if (IsResultOfSplit())
10550 {
10551 // reset the splitting result flag, return to normal item behavior
10552 SetResultOfSplit(false);
10553 return;
10554 }
10555
10556 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10557 {
10558 SetCleanness(0);//unclean the item upon damage dealt
10559 }
10560 }
10561 }
10562
10563 // just the split? TODO: verify
10564 override void OnRightClick()
10565 {
10566 super.OnRightClick();
10567
10568 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
10569 {
10570 if (GetGame().IsClient())
10571 {
10572 if (ScriptInputUserData.CanStoreInputUserData())
10573 {
10574 vector m4[4];
10575 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
10576
10577 EntityAI root = GetHierarchyRoot();
10578
10579 InventoryLocation dst = new InventoryLocation;
10580 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
10581 {
10582 if (root)
10583 {
10584 root.GetTransform(m4);
10585 dst.SetGround(this, m4);
10586 }
10587 else
10588 GetInventory().GetCurrentInventoryLocation(dst);
10589 }
10590 else
10591 {
10592 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10593 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10594 this shouldnt cause issues within this scope*/
10595 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10596 {
10597 if (root)
10598 {
10599 root.GetTransform(m4);
10600 dst.SetGround(this, m4);
10601 }
10602 else
10603 GetInventory().GetCurrentInventoryLocation(dst);
10604 }
10605 else
10606 {
10607 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10608 }
10609 }
10610
10611 ScriptInputUserData ctx = new ScriptInputUserData;
10613 ctx.Write(4);
10614 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10615 ctx.Write(thiz);
10616 dst.WriteToContext(ctx);
10617 ctx.Write(true); // dummy
10618 ctx.Send();
10619 }
10620 }
10621 else if (!GetGame().IsMultiplayer())
10622 {
10623 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
10624 }
10625 }
10626 }
10627
10628 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10629 {
10630 //TODO: delete check zero quantity check after fix double posts hands fsm events
10631 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10632 return false;
10633
10634 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10635 return false;
10636
10637 //can_this_be_combined = ConfigGetBool("canBeSplit");
10639 return false;
10640
10641
10642 Magazine mag = Magazine.Cast(this);
10643 if (mag)
10644 {
10645 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10646 return false;
10647
10648 if (stack_max_limit)
10649 {
10650 Magazine other_mag = Magazine.Cast(other_item);
10651 if (other_item)
10652 {
10653 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10654 return false;
10655 }
10656
10657 }
10658 }
10659 else
10660 {
10661 //TODO: delete check zero quantity check after fix double posts hands fsm events
10662 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10663 return false;
10664
10665 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10666 return false;
10667 }
10668
10669 PlayerBase player = null;
10670 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10671 {
10672 if (player.GetInventory().HasAttachment(this))
10673 return false;
10674
10675 if (player.IsItemsToDelete())
10676 return false;
10677 }
10678
10679 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10680 return false;
10681
10682 int slotID;
10683 string slotName;
10684 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10685 return false;
10686
10687 return true;
10688 }
10689
10690 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10691 {
10692 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10693 }
10694
10695 bool IsResultOfSplit()
10696 {
10697 return m_IsResultOfSplit;
10698 }
10699
10700 void SetResultOfSplit(bool value)
10701 {
10702 m_IsResultOfSplit = value;
10703 }
10704
10705 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10706 {
10707 return ComputeQuantityUsedEx(other_item, use_stack_max);
10708 }
10709
10710 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10711 {
10712 float other_item_quantity = other_item.GetQuantity();
10713 float this_free_space;
10714
10715 float stack_max = GetQuantityMax();
10716
10717 this_free_space = stack_max - GetQuantity();
10718
10719 if (other_item_quantity > this_free_space)
10720 {
10721 return this_free_space;
10722 }
10723 else
10724 {
10725 return other_item_quantity;
10726 }
10727 }
10728
10729 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10730 {
10731 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10732 }
10733
10734 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10735 {
10736 if (!CanBeCombined(other_item, false))
10737 return;
10738
10739 if (!IsMagazine() && other_item)
10740 {
10741 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10742 if (quantity_used != 0)
10743 {
10744 float hp1 = GetHealth01("","");
10745 float hp2 = other_item.GetHealth01("","");
10746 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10747 hpResult = hpResult / (GetQuantity() + quantity_used);
10748
10749 hpResult *= GetMaxHealth();
10750 Math.Round(hpResult);
10751 SetHealth("", "Health", hpResult);
10752
10753 AddQuantity(quantity_used);
10754 other_item.AddQuantity(-quantity_used);
10755 }
10756 }
10757 OnCombine(other_item);
10758 }
10759
10760 void OnCombine(ItemBase other_item)
10761 {
10762 #ifdef SERVER
10763 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10764 GetHierarchyParent().IncreaseLifetimeUp();
10765 #endif
10766 };
10767
10768 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10769 {
10770 PlayerBase p = PlayerBase.Cast(player);
10771
10772 array<int> recipesIds = p.m_Recipes;
10773 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10774 if (moduleRecipesManager)
10775 {
10776 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10777 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10778 }
10779
10780 for (int i = 0;i < recipesIds.Count(); i++)
10781 {
10782 int key = recipesIds.Get(i);
10783 string recipeName = moduleRecipesManager.GetRecipeName(key);
10784 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10785 }
10786 }
10787
10788 // -------------------------------------------------------------------------
10789 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10790 {
10791 super.GetDebugActions(outputList);
10792
10793 //quantity
10794 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10795 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10796 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10797 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10798
10799 //health
10800 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10801 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10802 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10803 //temperature
10804 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10805 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10806 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10807
10808 //wet
10809 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10810 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10811
10812 //liquidtype
10813 if (IsLiquidContainer())
10814 {
10815 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10816 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10817 }
10818
10819 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10820 // watch
10821 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10822 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10823
10824 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10825 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10826 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
10827 }
10828
10829 // -------------------------------------------------------------------------
10830 // -------------------------------------------------------------------------
10831 // -------------------------------------------------------------------------
10832 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10833 {
10834 super.OnAction(action_id, player, ctx);
10835 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10836 {
10837 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10838 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10839 PlayerBase p = PlayerBase.Cast(player);
10840 if (EActions.RECIPES_RANGE_START < 1000)
10841 {
10842 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10843 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10844 }
10845 }
10846 #ifndef SERVER
10847 else if (action_id == EActions.WATCH_PLAYER)
10848 {
10849 PluginDeveloper.SetDeveloperItemClientEx(player);
10850 }
10851 #endif
10852 if (GetGame().IsServer())
10853 {
10854 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10855 {
10856 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10857 OnDebugButtonPressServer(id + 1);
10858 }
10859
10860 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10861 {
10862 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10863 InsertAgent(agent_id,100);
10864 }
10865
10866 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10867 {
10868 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10869 RemoveAgent(agent_id2);
10870 }
10871
10872 else if (action_id == EActions.ADD_QUANTITY)
10873 {
10874 if (IsMagazine())
10875 {
10876 Magazine mag = Magazine.Cast(this);
10877 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10878 }
10879 else
10880 {
10881 AddQuantity(GetQuantityMax() * 0.2);
10882 }
10883
10884 if (m_EM)
10885 {
10886 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10887 }
10888 //PrintVariables();
10889 }
10890
10891 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10892 {
10893 if (IsMagazine())
10894 {
10895 Magazine mag2 = Magazine.Cast(this);
10896 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10897 }
10898 else
10899 {
10900 AddQuantity(- GetQuantityMax() * 0.2);
10901 }
10902 if (m_EM)
10903 {
10904 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10905 }
10906 //PrintVariables();
10907 }
10908
10909 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10910 {
10911 SetQuantity(0);
10912
10913 if (m_EM)
10914 {
10915 m_EM.SetEnergy(0);
10916 }
10917 }
10918
10919 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10920 {
10922
10923 if (m_EM)
10924 {
10925 m_EM.SetEnergy(m_EM.GetEnergyMax());
10926 }
10927 }
10928
10929 else if (action_id == EActions.ADD_HEALTH)
10930 {
10931 AddHealth("","",GetMaxHealth("","Health")/5);
10932 }
10933 else if (action_id == EActions.REMOVE_HEALTH)
10934 {
10935 AddHealth("","",-GetMaxHealth("","Health")/5);
10936 }
10937 else if (action_id == EActions.DESTROY_HEALTH)
10938 {
10939 SetHealth01("","",0);
10940 }
10941 else if (action_id == EActions.WATCH_ITEM)
10942 {
10944 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
10945 #ifdef DEVELOPER
10946 SetDebugDeveloper_item(this);
10947 #endif
10948 }
10949
10950 else if (action_id == EActions.ADD_TEMPERATURE)
10951 {
10952 AddTemperature(20);
10953 //PrintVariables();
10954 }
10955
10956 else if (action_id == EActions.REMOVE_TEMPERATURE)
10957 {
10958 AddTemperature(-20);
10959 //PrintVariables();
10960 }
10961
10962 else if (action_id == EActions.FLIP_FROZEN)
10963 {
10964 SetFrozen(!GetIsFrozen());
10965 //PrintVariables();
10966 }
10967
10968 else if (action_id == EActions.ADD_WETNESS)
10969 {
10970 AddWet(GetWetMax()/5);
10971 //PrintVariables();
10972 }
10973
10974 else if (action_id == EActions.REMOVE_WETNESS)
10975 {
10976 AddWet(-GetWetMax()/5);
10977 //PrintVariables();
10978 }
10979
10980 else if (action_id == EActions.LIQUIDTYPE_UP)
10981 {
10982 int curr_type = GetLiquidType();
10983 SetLiquidType(curr_type * 2);
10984 //AddWet(1);
10985 //PrintVariables();
10986 }
10987
10988 else if (action_id == EActions.LIQUIDTYPE_DOWN)
10989 {
10990 int curr_type2 = GetLiquidType();
10991 SetLiquidType(curr_type2 / 2);
10992 }
10993
10994 else if (action_id == EActions.MAKE_SPECIAL)
10995 {
10996 auto debugParams = DebugSpawnParams.WithPlayer(player);
10997 OnDebugSpawnEx(debugParams);
10998 }
10999
11000 else if (action_id == EActions.DELETE)
11001 {
11002 Delete();
11003 }
11004
11005 }
11006
11007
11008 return false;
11009 }
11010
11011 // -------------------------------------------------------------------------
11012
11013
11016 void OnActivatedByTripWire();
11017
11019 void OnActivatedByItem(notnull ItemBase item);
11020
11021 //----------------------------------------------------------------
11022 //returns true if item is able to explode when put in fire
11023 bool CanExplodeInFire()
11024 {
11025 return false;
11026 }
11027
11028 //----------------------------------------------------------------
11029 bool CanEat()
11030 {
11031 return true;
11032 }
11033
11034 //----------------------------------------------------------------
11035 override bool IsIgnoredByConstruction()
11036 {
11037 return true;
11038 }
11039
11040 //----------------------------------------------------------------
11041 //has FoodStages in config?
11042 bool HasFoodStage()
11043 {
11044 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11045 return GetGame().ConfigIsExisting(config_path);
11046 }
11047
11049 FoodStage GetFoodStage()
11050 {
11051 return null;
11052 }
11053
11054 bool CanBeCooked()
11055 {
11056 return false;
11057 }
11058
11059 bool CanBeCookedOnStick()
11060 {
11061 return false;
11062 }
11063
11065 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11067
11068 //----------------------------------------------------------------
11069 bool CanRepair(ItemBase item_repair_kit)
11070 {
11071 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11072 return module_repairing.CanRepair(this, item_repair_kit);
11073 }
11074
11075 //----------------------------------------------------------------
11076 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11077 {
11078 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11079 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11080 }
11081
11082 //----------------------------------------------------------------
11083 int GetItemSize()
11084 {
11085 /*
11086 vector v_size = this.ConfigGetVector("itemSize");
11087 int v_size_x = v_size[0];
11088 int v_size_y = v_size[1];
11089 int size = v_size_x * v_size_y;
11090 return size;
11091 */
11092
11093 return 1;
11094 }
11095
11096 //----------------------------------------------------------------
11097 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11098 bool CanBeMovedOverride()
11099 {
11100 return m_CanBeMovedOverride;
11101 }
11102
11103 //----------------------------------------------------------------
11104 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11105 void SetCanBeMovedOverride(bool setting)
11106 {
11107 m_CanBeMovedOverride = setting;
11108 }
11109
11110 //----------------------------------------------------------------
11118 void MessageToOwnerStatus(string text)
11119 {
11120 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11121
11122 if (player)
11123 {
11124 player.MessageStatus(text);
11125 }
11126 }
11127
11128 //----------------------------------------------------------------
11136 void MessageToOwnerAction(string text)
11137 {
11138 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11139
11140 if (player)
11141 {
11142 player.MessageAction(text);
11143 }
11144 }
11145
11146 //----------------------------------------------------------------
11154 void MessageToOwnerFriendly(string text)
11155 {
11156 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11157
11158 if (player)
11159 {
11160 player.MessageFriendly(text);
11161 }
11162 }
11163
11164 //----------------------------------------------------------------
11172 void MessageToOwnerImportant(string text)
11173 {
11174 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11175
11176 if (player)
11177 {
11178 player.MessageImportant(text);
11179 }
11180 }
11181
11182 override bool IsItemBase()
11183 {
11184 return true;
11185 }
11186
11187 // Checks if item is of questioned kind
11188 override bool KindOf(string tag)
11189 {
11190 bool found = false;
11191 string item_name = this.GetType();
11192 ref TStringArray item_tag_array = new TStringArray;
11193 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11194
11195 int array_size = item_tag_array.Count();
11196 for (int i = 0; i < array_size; i++)
11197 {
11198 if (item_tag_array.Get(i) == tag)
11199 {
11200 found = true;
11201 break;
11202 }
11203 }
11204 return found;
11205 }
11206
11207
11208 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11209 {
11210 //Debug.Log("OnRPC called");
11211 super.OnRPC(sender, rpc_type,ctx);
11212
11213 //Play soundset for attachment locking (ActionLockAttachment.c)
11214 switch (rpc_type)
11215 {
11216 #ifndef SERVER
11217 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11218 Param2<bool, string> p = new Param2<bool, string>(false, "");
11219
11220 if (!ctx.Read(p))
11221 return;
11222
11223 bool play = p.param1;
11224 string soundSet = p.param2;
11225
11226 if (play)
11227 {
11228 if (m_LockingSound)
11229 {
11231 {
11232 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11233 }
11234 }
11235 else
11236 {
11237 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11238 }
11239 }
11240 else
11241 {
11242 SEffectManager.DestroyEffect(m_LockingSound);
11243 }
11244
11245 break;
11246 #endif
11247
11248 }
11249
11250 if (GetWrittenNoteData())
11251 {
11252 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11253 }
11254 }
11255
11256 //-----------------------------
11257 // VARIABLE MANIPULATION SYSTEM
11258 //-----------------------------
11259 int NameToID(string name)
11260 {
11261 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11262 return plugin.GetID(name);
11263 }
11264
11265 string IDToName(int id)
11266 {
11267 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11268 return plugin.GetName(id);
11269 }
11270
11272 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11273 {
11274 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11275 //read the flags
11276 int varFlags;
11277 if (!ctx.Read(varFlags))
11278 return;
11279
11280 if (varFlags & ItemVariableFlags.FLOAT)
11281 {
11282 ReadVarsFromCTX(ctx);
11283 }
11284 }
11285
11286 override void SerializeNumericalVars(array<float> floats_out)
11287 {
11288 //some variables handled on EntityAI level already!
11289 super.SerializeNumericalVars(floats_out);
11290
11291 // the order of serialization must be the same as the order of de-serialization
11292 //--------------------------------------------
11293 if (IsVariableSet(VARIABLE_QUANTITY))
11294 {
11295 floats_out.Insert(m_VarQuantity);
11296 }
11297 //--------------------------------------------
11298 if (IsVariableSet(VARIABLE_WET))
11299 {
11300 floats_out.Insert(m_VarWet);
11301 }
11302 //--------------------------------------------
11303 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11304 {
11305 floats_out.Insert(m_VarLiquidType);
11306 }
11307 //--------------------------------------------
11308 if (IsVariableSet(VARIABLE_COLOR))
11309 {
11310 floats_out.Insert(m_ColorComponentR);
11311 floats_out.Insert(m_ColorComponentG);
11312 floats_out.Insert(m_ColorComponentB);
11313 floats_out.Insert(m_ColorComponentA);
11314 }
11315 //--------------------------------------------
11316 if (IsVariableSet(VARIABLE_CLEANNESS))
11317 {
11318 floats_out.Insert(m_Cleanness);
11319 }
11320 }
11321
11322 override void DeSerializeNumericalVars(array<float> floats)
11323 {
11324 //some variables handled on EntityAI level already!
11325 super.DeSerializeNumericalVars(floats);
11326
11327 // the order of serialization must be the same as the order of de-serialization
11328 int index = 0;
11329 int mask = Math.Round(floats.Get(index));
11330
11331 index++;
11332 //--------------------------------------------
11333 if (mask & VARIABLE_QUANTITY)
11334 {
11335 if (m_IsStoreLoad)
11336 {
11337 SetStoreLoadedQuantity(floats.Get(index));
11338 }
11339 else
11340 {
11341 float quantity = floats.Get(index);
11342 SetQuantity(quantity, true, false, false, false);
11343 }
11344 index++;
11345 }
11346 //--------------------------------------------
11347 if (mask & VARIABLE_WET)
11348 {
11349 float wet = floats.Get(index);
11350 SetWet(wet);
11351 index++;
11352 }
11353 //--------------------------------------------
11354 if (mask & VARIABLE_LIQUIDTYPE)
11355 {
11356 int liquidtype = Math.Round(floats.Get(index));
11357 SetLiquidType(liquidtype);
11358 index++;
11359 }
11360 //--------------------------------------------
11361 if (mask & VARIABLE_COLOR)
11362 {
11363 m_ColorComponentR = Math.Round(floats.Get(index));
11364 index++;
11365 m_ColorComponentG = Math.Round(floats.Get(index));
11366 index++;
11367 m_ColorComponentB = Math.Round(floats.Get(index));
11368 index++;
11369 m_ColorComponentA = Math.Round(floats.Get(index));
11370 index++;
11371 }
11372 //--------------------------------------------
11373 if (mask & VARIABLE_CLEANNESS)
11374 {
11375 int cleanness = Math.Round(floats.Get(index));
11376 SetCleanness(cleanness);
11377 index++;
11378 }
11379 }
11380
11381 override void WriteVarsToCTX(ParamsWriteContext ctx)
11382 {
11383 super.WriteVarsToCTX(ctx);
11384
11385 //--------------------------------------------
11386 if (IsVariableSet(VARIABLE_QUANTITY))
11387 {
11388 ctx.Write(GetQuantity());
11389 }
11390 //--------------------------------------------
11391 if (IsVariableSet(VARIABLE_WET))
11392 {
11393 ctx.Write(GetWet());
11394 }
11395 //--------------------------------------------
11396 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11397 {
11398 ctx.Write(GetLiquidType());
11399 }
11400 //--------------------------------------------
11401 if (IsVariableSet(VARIABLE_COLOR))
11402 {
11403 int r,g,b,a;
11404 GetColor(r,g,b,a);
11405 ctx.Write(r);
11406 ctx.Write(g);
11407 ctx.Write(b);
11408 ctx.Write(a);
11409 }
11410 //--------------------------------------------
11411 if (IsVariableSet(VARIABLE_CLEANNESS))
11412 {
11413 ctx.Write(GetCleanness());
11414 }
11415 }
11416
11417 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11418 {
11419 if (!super.ReadVarsFromCTX(ctx,version))
11420 return false;
11421
11422 int intValue;
11423 float value;
11424
11425 if (version < 140)
11426 {
11427 if (!ctx.Read(intValue))
11428 return false;
11429
11430 m_VariablesMask = intValue;
11431 }
11432
11433 if (m_VariablesMask & VARIABLE_QUANTITY)
11434 {
11435 if (!ctx.Read(value))
11436 return false;
11437
11438 if (IsStoreLoad())
11439 {
11441 }
11442 else
11443 {
11444 SetQuantity(value, true, false, false, false);
11445 }
11446 }
11447 //--------------------------------------------
11448 if (version < 140)
11449 {
11450 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11451 {
11452 if (!ctx.Read(value))
11453 return false;
11454 SetTemperatureDirect(value);
11455 }
11456 }
11457 //--------------------------------------------
11458 if (m_VariablesMask & VARIABLE_WET)
11459 {
11460 if (!ctx.Read(value))
11461 return false;
11462 SetWet(value);
11463 }
11464 //--------------------------------------------
11465 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11466 {
11467 if (!ctx.Read(intValue))
11468 return false;
11469 SetLiquidType(intValue);
11470 }
11471 //--------------------------------------------
11472 if (m_VariablesMask & VARIABLE_COLOR)
11473 {
11474 int r,g,b,a;
11475 if (!ctx.Read(r))
11476 return false;
11477 if (!ctx.Read(g))
11478 return false;
11479 if (!ctx.Read(b))
11480 return false;
11481 if (!ctx.Read(a))
11482 return false;
11483
11484 SetColor(r,g,b,a);
11485 }
11486 //--------------------------------------------
11487 if (m_VariablesMask & VARIABLE_CLEANNESS)
11488 {
11489 if (!ctx.Read(intValue))
11490 return false;
11491 SetCleanness(intValue);
11492 }
11493 //--------------------------------------------
11494 if (version >= 138 && version < 140)
11495 {
11496 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11497 {
11498 if (!ctx.Read(intValue))
11499 return false;
11500 SetFrozen(intValue);
11501 }
11502 }
11503
11504 return true;
11505 }
11506
11507 //----------------------------------------------------------------
11508 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11509 {
11510 m_IsStoreLoad = true;
11512 {
11513 m_FixDamageSystemInit = true;
11514 }
11515
11516 if (!super.OnStoreLoad(ctx, version))
11517 {
11518 m_IsStoreLoad = false;
11519 return false;
11520 }
11521
11522 if (version >= 114)
11523 {
11524 bool hasQuickBarIndexSaved;
11525
11526 if (!ctx.Read(hasQuickBarIndexSaved))
11527 {
11528 m_IsStoreLoad = false;
11529 return false;
11530 }
11531
11532 if (hasQuickBarIndexSaved)
11533 {
11534 int itmQBIndex;
11535
11536 //Load quickbar item bind
11537 if (!ctx.Read(itmQBIndex))
11538 {
11539 m_IsStoreLoad = false;
11540 return false;
11541 }
11542
11543 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11544 if (itmQBIndex != -1 && parentPlayer)
11545 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11546 }
11547 }
11548 else
11549 {
11550 // Backup of how it used to be
11551 PlayerBase player;
11552 int itemQBIndex;
11553 if (version == int.MAX)
11554 {
11555 if (!ctx.Read(itemQBIndex))
11556 {
11557 m_IsStoreLoad = false;
11558 return false;
11559 }
11560 }
11561 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11562 {
11563 //Load quickbar item bind
11564 if (!ctx.Read(itemQBIndex))
11565 {
11566 m_IsStoreLoad = false;
11567 return false;
11568 }
11569 if (itemQBIndex != -1 && player)
11570 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11571 }
11572 }
11573
11574 if (version < 140)
11575 {
11576 // variable management system
11577 if (!LoadVariables(ctx, version))
11578 {
11579 m_IsStoreLoad = false;
11580 return false;
11581 }
11582 }
11583
11584 //agent trasmission system
11585 if (!LoadAgents(ctx, version))
11586 {
11587 m_IsStoreLoad = false;
11588 return false;
11589 }
11590 if (version >= 132)
11591 {
11592 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11593 if (raib)
11594 {
11595 if (!raib.OnStoreLoad(ctx,version))
11596 {
11597 m_IsStoreLoad = false;
11598 return false;
11599 }
11600 }
11601 }
11602
11603 m_IsStoreLoad = false;
11604 return true;
11605 }
11606
11607 //----------------------------------------------------------------
11608
11609 override void OnStoreSave(ParamsWriteContext ctx)
11610 {
11611 super.OnStoreSave(ctx);
11612
11613 PlayerBase player;
11614 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11615 {
11616 ctx.Write(true); // Keep track of if we should actually read this in or not
11617 //Save quickbar item bind
11618 int itemQBIndex = -1;
11619 itemQBIndex = player.FindQuickBarEntityIndex(this);
11620 ctx.Write(itemQBIndex);
11621 }
11622 else
11623 {
11624 ctx.Write(false); // Keep track of if we should actually read this in or not
11625 }
11626
11627 SaveAgents(ctx);//agent trasmission system
11628
11629 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11630 if (raib)
11631 {
11632 raib.OnStoreSave(ctx);
11633 }
11634 }
11635 //----------------------------------------------------------------
11636
11637 override void AfterStoreLoad()
11638 {
11639 super.AfterStoreLoad();
11640
11642 {
11644 }
11645
11646 if (GetStoreLoadedQuantity() != float.LOWEST)
11647 {
11649 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
11650 }
11651 }
11652
11653 override void EEOnAfterLoad()
11654 {
11655 super.EEOnAfterLoad();
11656
11658 {
11659 m_FixDamageSystemInit = false;
11660 }
11661
11664 }
11665
11666 bool CanBeDisinfected()
11667 {
11668 return false;
11669 }
11670
11671
11672 //----------------------------------------------------------------
11673 override void OnVariablesSynchronized()
11674 {
11675 if (m_Initialized)
11676 {
11677 #ifdef PLATFORM_CONSOLE
11678 //bruteforce it is
11679 if (IsSplitable())
11680 {
11681 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
11682 if (menu)
11683 {
11684 menu.Refresh();
11685 }
11686 }
11687 #endif
11688 }
11689
11691 {
11692 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11693 m_WantPlayImpactSound = false;
11694 }
11695
11697 {
11698 SetWeightDirty();
11700 }
11701 if (m_VarWet != m_VarWetPrev)
11702 {
11705 }
11706
11707 if (m_SoundSyncPlay != 0)
11708 {
11709 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
11710 m_SoundSyncPlay = 0;
11711 }
11712 if (m_SoundSyncStop != 0)
11713 {
11714 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11715 m_SoundSyncStop = 0;
11716 }
11717
11718 super.OnVariablesSynchronized();
11719 }
11720
11721 //------------------------- Quantity
11722 //----------------------------------------------------------------
11724 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11725 {
11726 if (!IsServerCheck(allow_client))
11727 return false;
11728
11729 if (!HasQuantity())
11730 return false;
11731
11732 float min = GetQuantityMin();
11733 float max = GetQuantityMax();
11734
11735 if (value <= (min + 0.001))
11736 value = min;
11737
11738 if (value == min)
11739 {
11740 if (destroy_config)
11741 {
11742 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11743 if (dstr)
11744 {
11745 m_VarQuantity = Math.Clamp(value, min, max);
11746 this.Delete();
11747 return true;
11748 }
11749 }
11750 else if (destroy_forced)
11751 {
11752 m_VarQuantity = Math.Clamp(value, min, max);
11753 this.Delete();
11754 return true;
11755 }
11756 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11757 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11758 }
11759
11760 float delta = m_VarQuantity;
11761 m_VarQuantity = Math.Clamp(value, min, max);
11762
11763 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11764 {
11765 delta = m_VarQuantity - delta;
11766
11767 if (delta)
11768 OnQuantityChanged(delta);
11769 }
11770
11771 SetVariableMask(VARIABLE_QUANTITY);
11772
11773 return false;
11774 }
11775
11776 //----------------------------------------------------------------
11778 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11779 {
11780 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11781 }
11782 //----------------------------------------------------------------
11783 void SetQuantityMax()
11784 {
11785 float max = GetQuantityMax();
11786 SetQuantity(max);
11787 }
11788
11789 override void SetQuantityToMinimum()
11790 {
11791 float min = GetQuantityMin();
11792 SetQuantity(min);
11793 }
11794 //----------------------------------------------------------------
11796 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11797 {
11798 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11799 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11800 SetQuantity(result, destroy_config, destroy_forced);
11801 }
11802
11803 //----------------------------------------------------------------
11805 override float GetQuantityNormalized()
11806 {
11807 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11808 }
11809
11811 {
11812 return GetQuantityNormalized();
11813 }
11814
11815 /*void SetAmmoNormalized(float value)
11816 {
11817 float value_clamped = Math.Clamp(value, 0, 1);
11818 Magazine this_mag = Magazine.Cast(this);
11819 int max_rounds = this_mag.GetAmmoMax();
11820 int result = value * max_rounds;//can the rounded if higher precision is required
11821 this_mag.SetAmmoCount(result);
11822 }*/
11823 //----------------------------------------------------------------
11824 override int GetQuantityMax()
11825 {
11826 int slot = -1;
11827 if (GetInventory())
11828 {
11829 InventoryLocation il = new InventoryLocation;
11830 GetInventory().GetCurrentInventoryLocation(il);
11831 slot = il.GetSlot();
11832 }
11833
11834 return GetTargetQuantityMax(slot);
11835 }
11836
11837 override int GetTargetQuantityMax(int attSlotID = -1)
11838 {
11839 float quantity_max = 0;
11840
11841 if (IsSplitable()) //only stackable/splitable items can check for stack size
11842 {
11843 if (attSlotID != -1)
11844 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11845
11846 if (quantity_max <= 0)
11847 quantity_max = m_VarStackMax;
11848 }
11849
11850 if (quantity_max <= 0)
11851 quantity_max = m_VarQuantityMax;
11852
11853 return quantity_max;
11854 }
11855 //----------------------------------------------------------------
11856 override int GetQuantityMin()
11857 {
11858 return m_VarQuantityMin;
11859 }
11860 //----------------------------------------------------------------
11861 int GetQuantityInit()
11862 {
11863 return m_VarQuantityInit;
11864 }
11865
11866 //----------------------------------------------------------------
11867 override bool HasQuantity()
11868 {
11869 return !(GetQuantityMax() - GetQuantityMin() == 0);
11870 }
11871
11872 override float GetQuantity()
11873 {
11874 return m_VarQuantity;
11875 }
11876
11877 bool IsFullQuantity()
11878 {
11879 return GetQuantity() >= GetQuantityMax();
11880 }
11881
11882 //Calculates weight of single item without attachments and cargo
11883 override float GetSingleInventoryItemWeightEx()
11884 {
11885 //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
11886 float weightEx = GetWeightEx();//overall weight of the item
11887 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11888 return weightEx - special;
11889 }
11890
11891 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11893 {
11895 }
11896
11897 override protected float GetWeightSpecialized(bool forceRecalc = false)
11898 {
11899 if (IsSplitable()) //quantity determines size of the stack
11900 {
11901 #ifdef DEVELOPER
11902 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11903 {
11904 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11905 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
11906 }
11907 #endif
11908
11909 return GetQuantity() * GetConfigWeightModified();
11910 }
11911 else if (HasEnergyManager())// items with energy manager
11912 {
11913 #ifdef DEVELOPER
11914 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11915 {
11916 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11917 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
11918 }
11919 #endif
11920 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11921 }
11922 else//everything else
11923 {
11924 #ifdef DEVELOPER
11925 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11926 {
11927 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11928 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
11929 }
11930 #endif
11931 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11932 }
11933 }
11934
11936 int GetNumberOfItems()
11937 {
11938 int item_count = 0;
11939 ItemBase item;
11940
11941 if (GetInventory().GetCargo() != NULL)
11942 {
11943 item_count = GetInventory().GetCargo().GetItemCount();
11944 }
11945
11946 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11947 {
11948 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11949 if (item)
11950 item_count += item.GetNumberOfItems();
11951 }
11952 return item_count;
11953 }
11954
11956 float GetUnitWeight(bool include_wetness = true)
11957 {
11958 float weight = 0;
11959 float wetness = 1;
11960 if (include_wetness)
11961 wetness += GetWet();
11962 if (IsSplitable()) //quantity determines size of the stack
11963 {
11964 weight = wetness * m_ConfigWeight;
11965 }
11966 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
11967 {
11968 weight = 1;
11969 }
11970 return weight;
11971 }
11972
11973 //-----------------------------------------------------------------
11974
11975 override void ClearInventory()
11976 {
11977 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
11978 {
11979 GameInventory inv = GetInventory();
11980 array<EntityAI> items = new array<EntityAI>;
11981 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
11982 for (int i = 0; i < items.Count(); i++)
11983 {
11984 ItemBase item = ItemBase.Cast(items.Get(i));
11985 if (item)
11986 {
11987 GetGame().ObjectDelete(item);
11988 }
11989 }
11990 }
11991 }
11992
11993 //------------------------- Energy
11994
11995 //----------------------------------------------------------------
11996 float GetEnergy()
11997 {
11998 float energy = 0;
11999 if (HasEnergyManager())
12000 {
12001 energy = GetCompEM().GetEnergy();
12002 }
12003 return energy;
12004 }
12005
12006
12007 override void OnEnergyConsumed()
12008 {
12009 super.OnEnergyConsumed();
12010
12012 }
12013
12014 override void OnEnergyAdded()
12015 {
12016 super.OnEnergyAdded();
12017
12019 }
12020
12021 // Converts energy (from Energy Manager) to quantity, if enabled.
12023 {
12024 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12025 {
12026 if (HasQuantity())
12027 {
12028 float energy_0to1 = GetCompEM().GetEnergy0To1();
12029 SetQuantityNormalized(energy_0to1);
12030 }
12031 }
12032 }
12033
12034 //----------------------------------------------------------------
12035 float GetHeatIsolationInit()
12036 {
12037 return ConfigGetFloat("heatIsolation");
12038 }
12039
12040 float GetHeatIsolation()
12041 {
12042 return m_HeatIsolation;
12043 }
12044
12045 float GetDryingIncrement(string pIncrementName)
12046 {
12047 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12048 if (GetGame().ConfigIsExisting(paramPath))
12049 return GetGame().ConfigGetFloat(paramPath);
12050
12051 return 0.0;
12052 }
12053
12054 float GetSoakingIncrement(string pIncrementName)
12055 {
12056 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12057 if (GetGame().ConfigIsExisting(paramPath))
12058 return GetGame().ConfigGetFloat(paramPath);
12059
12060 return 0.0;
12061 }
12062 //----------------------------------------------------------------
12063 override void SetWet(float value, bool allow_client = false)
12064 {
12065 if (!IsServerCheck(allow_client))
12066 return;
12067
12068 float min = GetWetMin();
12069 float max = GetWetMax();
12070
12071 float previousValue = m_VarWet;
12072
12073 m_VarWet = Math.Clamp(value, min, max);
12074
12075 if (previousValue != m_VarWet)
12076 {
12077 SetVariableMask(VARIABLE_WET);
12078 OnWetChanged(m_VarWet, previousValue);
12079 }
12080 }
12081 //----------------------------------------------------------------
12082 override void AddWet(float value)
12083 {
12084 SetWet(GetWet() + value);
12085 }
12086 //----------------------------------------------------------------
12087 override void SetWetMax()
12088 {
12090 }
12091 //----------------------------------------------------------------
12092 override float GetWet()
12093 {
12094 return m_VarWet;
12095 }
12096 //----------------------------------------------------------------
12097 override float GetWetMax()
12098 {
12099 return m_VarWetMax;
12100 }
12101 //----------------------------------------------------------------
12102 override float GetWetMin()
12103 {
12104 return m_VarWetMin;
12105 }
12106 //----------------------------------------------------------------
12107 override float GetWetInit()
12108 {
12109 return m_VarWetInit;
12110 }
12111 //----------------------------------------------------------------
12112 override void OnWetChanged(float newVal, float oldVal)
12113 {
12114 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12115 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12116 if (newLevel != oldLevel)
12117 {
12118 OnWetLevelChanged(newLevel,oldLevel);
12119 }
12120 }
12121
12122 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12123 {
12124 SetWeightDirty();
12125 }
12126
12127 override EWetnessLevel GetWetLevel()
12128 {
12129 return GetWetLevelInternal(m_VarWet);
12130 }
12131
12132 //----------------------------------------------------------------
12133
12134 override void SetStoreLoad(bool value)
12135 {
12136 m_IsStoreLoad = value;
12137 }
12138
12139 override bool IsStoreLoad()
12140 {
12141 return m_IsStoreLoad;
12142 }
12143
12144 override void SetStoreLoadedQuantity(float value)
12145 {
12146 m_StoreLoadedQuantity = value;
12147 }
12148
12149 override float GetStoreLoadedQuantity()
12150 {
12151 return m_StoreLoadedQuantity;
12152 }
12153
12154 //----------------------------------------------------------------
12155
12156 float GetItemModelLength()
12157 {
12158 if (ConfigIsExisting("itemModelLength"))
12159 {
12160 return ConfigGetFloat("itemModelLength");
12161 }
12162 return 0;
12163 }
12164
12165 float GetItemAttachOffset()
12166 {
12167 if (ConfigIsExisting("itemAttachOffset"))
12168 {
12169 return ConfigGetFloat("itemAttachOffset");
12170 }
12171 return 0;
12172 }
12173
12174 override void SetCleanness(int value, bool allow_client = false)
12175 {
12176 if (!IsServerCheck(allow_client))
12177 return;
12178
12179 int previousValue = m_Cleanness;
12180
12181 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12182
12183 if (previousValue != m_Cleanness)
12184 SetVariableMask(VARIABLE_CLEANNESS);
12185 }
12186
12187 override int GetCleanness()
12188 {
12189 return m_Cleanness;
12190 }
12191
12193 {
12194 return true;
12195 }
12196
12197 //----------------------------------------------------------------
12198 // ATTACHMENT LOCKING
12199 // Getters relevant to generic ActionLockAttachment
12200 int GetLockType()
12201 {
12202 return m_LockType;
12203 }
12204
12205 string GetLockSoundSet()
12206 {
12207 return m_LockSoundSet;
12208 }
12209
12210 //----------------------------------------------------------------
12211 //------------------------- Color
12212 // sets items color variable given color components
12213 override void SetColor(int r, int g, int b, int a)
12214 {
12219 SetVariableMask(VARIABLE_COLOR);
12220 }
12222 override void GetColor(out int r,out int g,out int b,out int a)
12223 {
12228 }
12229
12230 bool IsColorSet()
12231 {
12232 return IsVariableSet(VARIABLE_COLOR);
12233 }
12234
12236 string GetColorString()
12237 {
12238 int r,g,b,a;
12239 GetColor(r,g,b,a);
12240 r = r/255;
12241 g = g/255;
12242 b = b/255;
12243 a = a/255;
12244 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12245 }
12246 //----------------------------------------------------------------
12247 //------------------------- LiquidType
12248
12249 override void SetLiquidType(int value, bool allow_client = false)
12250 {
12251 if (!IsServerCheck(allow_client))
12252 return;
12253
12254 int old = m_VarLiquidType;
12255 m_VarLiquidType = value;
12256 OnLiquidTypeChanged(old,value);
12257 SetVariableMask(VARIABLE_LIQUIDTYPE);
12258 }
12259
12260 int GetLiquidTypeInit()
12261 {
12262 return ConfigGetInt("varLiquidTypeInit");
12263 }
12264
12265 override int GetLiquidType()
12266 {
12267 return m_VarLiquidType;
12268 }
12269
12270 protected void OnLiquidTypeChanged(int oldType, int newType)
12271 {
12272 if (newType == LIQUID_NONE && GetIsFrozen())
12273 SetFrozen(false);
12274 }
12275
12277 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12278 {
12279 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12280 }
12281
12282 // -------------------------------------------------------------------------
12284 void OnInventoryEnter(Man player)
12285 {
12286 PlayerBase nplayer;
12287 if (PlayerBase.CastTo(nplayer, player))
12288 {
12289 m_CanPlayImpactSound = true;
12290 //nplayer.OnItemInventoryEnter(this);
12291 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12292 }
12293 }
12294
12295 // -------------------------------------------------------------------------
12297 void OnInventoryExit(Man player)
12298 {
12299 PlayerBase nplayer;
12300 if (PlayerBase.CastTo(nplayer,player))
12301 {
12302 //nplayer.OnItemInventoryExit(this);
12303 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12304
12305 }
12306
12307 //if (!GetGame().IsDedicatedServer())
12308 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12309
12310
12311 if (HasEnergyManager())
12312 {
12313 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12314 }
12315 }
12316
12317 // ADVANCED PLACEMENT EVENTS
12318 override void OnPlacementStarted(Man player)
12319 {
12320 super.OnPlacementStarted(player);
12321
12322 SetTakeable(false);
12323 }
12324
12325 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12326 {
12327 if (m_AdminLog)
12328 {
12329 m_AdminLog.OnPlacementComplete(player, this);
12330 }
12331
12332 super.OnPlacementComplete(player, position, orientation);
12333 }
12334
12335 //-----------------------------
12336 // AGENT SYSTEM
12337 //-----------------------------
12338 //--------------------------------------------------------------------------
12339 bool ContainsAgent(int agent_id)
12340 {
12341 if (agent_id & m_AttachedAgents)
12342 {
12343 return true;
12344 }
12345 else
12346 {
12347 return false;
12348 }
12349 }
12350
12351 //--------------------------------------------------------------------------
12352 override void RemoveAgent(int agent_id)
12353 {
12354 if (ContainsAgent(agent_id))
12355 {
12356 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12357 }
12358 }
12359
12360 //--------------------------------------------------------------------------
12361 override void RemoveAllAgents()
12362 {
12363 m_AttachedAgents = 0;
12364 }
12365 //--------------------------------------------------------------------------
12366 override void RemoveAllAgentsExcept(int agent_to_keep)
12367 {
12368 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12369 }
12370 // -------------------------------------------------------------------------
12371 override void InsertAgent(int agent, float count = 1)
12372 {
12373 if (count < 1)
12374 return;
12375 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12377 }
12378
12380 void TransferAgents(int agents)
12381 {
12383 }
12384
12385 // -------------------------------------------------------------------------
12386 override int GetAgents()
12387 {
12388 return m_AttachedAgents;
12389 }
12390 //----------------------------------------------------------------------
12391
12392 /*int GetContaminationType()
12393 {
12394 int contamination_type;
12395
12396 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12397 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12398 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12399 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12400
12401 Edible_Base edible = Edible_Base.Cast(this);
12402 int agents = GetAgents();
12403 if (edible)
12404 {
12405 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12406 if (profile)
12407 {
12408 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12409 }
12410 }
12411 if (agents & CONTAMINATED_MASK)
12412 {
12413 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12414 }
12415 if (agents & POISONED_MASK)
12416 {
12417 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12418 }
12419 if (agents & NERVE_GAS_MASK)
12420 {
12421 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12422 }
12423 if (agents & DIRTY_MASK)
12424 {
12425 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12426 }
12427
12428 return agents;
12429 }*/
12430
12431 // -------------------------------------------------------------------------
12432 bool LoadAgents(ParamsReadContext ctx, int version)
12433 {
12434 if (!ctx.Read(m_AttachedAgents))
12435 return false;
12436 return true;
12437 }
12438 // -------------------------------------------------------------------------
12440 {
12441
12443 }
12444 // -------------------------------------------------------------------------
12445
12447 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12448 {
12449 super.CheckForRoofLimited(timeTresholdMS);
12450
12451 float time = GetGame().GetTime();
12452 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12453 {
12454 m_PreviousRoofTestTime = time;
12455 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12456 }
12457 }
12458
12459 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12460 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12461 {
12462 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12463 {
12464 return 0;
12465 }
12466
12467 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12468 {
12469 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12470 if (filter)
12471 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12472 else
12473 return 0;//otherwise return 0 when no filter attached
12474 }
12475
12476 string subclassPath, entryName;
12477
12478 switch (type)
12479 {
12480 case DEF_BIOLOGICAL:
12481 entryName = "biological";
12482 break;
12483 case DEF_CHEMICAL:
12484 entryName = "chemical";
12485 break;
12486 default:
12487 entryName = "biological";
12488 break;
12489 }
12490
12491 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12492
12493 return GetGame().ConfigGetFloat(subclassPath + entryName);
12494 }
12495
12496
12497
12499 override void EEOnCECreate()
12500 {
12501 if (!IsMagazine())
12503
12505 }
12506
12507
12508 //-------------------------
12509 // OPEN/CLOSE USER ACTIONS
12510 //-------------------------
12512 void Open();
12513 void Close();
12514 bool IsOpen()
12515 {
12516 return true;
12517 }
12518
12519 override bool CanDisplayCargo()
12520 {
12521 return IsOpen();
12522 }
12523
12524
12525 // ------------------------------------------------------------
12526 // CONDITIONS
12527 // ------------------------------------------------------------
12528 override bool CanPutInCargo(EntityAI parent)
12529 {
12530 if (parent)
12531 {
12532 if (parent.IsInherited(DayZInfected))
12533 return true;
12534
12535 if (!parent.IsRuined())
12536 return true;
12537 }
12538
12539 return true;
12540 }
12541
12542 override bool CanPutAsAttachment(EntityAI parent)
12543 {
12544 if (!super.CanPutAsAttachment(parent))
12545 {
12546 return false;
12547 }
12548
12549 if (!IsRuined() && !parent.IsRuined())
12550 {
12551 return true;
12552 }
12553
12554 return false;
12555 }
12556
12557 override bool CanReceiveItemIntoCargo(EntityAI item)
12558 {
12559 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12560 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12561 // return false;
12562
12563 return super.CanReceiveItemIntoCargo(item);
12564 }
12565
12566 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12567 {
12568 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12569 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12570 // return false;
12571
12572 GameInventory attachmentInv = attachment.GetInventory();
12573 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12574 {
12575 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12576 return false;
12577 }
12578
12579 InventoryLocation loc = new InventoryLocation();
12580 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12581 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12582 return false;
12583
12584 return super.CanReceiveAttachment(attachment, slotId);
12585 }
12586
12587 override bool CanReleaseAttachment(EntityAI attachment)
12588 {
12589 if (!super.CanReleaseAttachment(attachment))
12590 return false;
12591
12592 return GetInventory().AreChildrenAccessible();
12593 }
12594
12595 /*override bool CanLoadAttachment(EntityAI attachment)
12596 {
12597 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12598 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12599 // return false;
12600
12601 GameInventory attachmentInv = attachment.GetInventory();
12602 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12603 {
12604 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12605 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12606
12607 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12608 return false;
12609 }
12610
12611 return super.CanLoadAttachment(attachment);
12612 }*/
12613
12614 // Plays muzzle flash particle effects
12615 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12616 {
12617 int id = muzzle_owner.GetMuzzleID();
12618 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12619
12620 if (WPOF_array)
12621 {
12622 for (int i = 0; i < WPOF_array.Count(); i++)
12623 {
12624 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12625
12626 if (WPOF)
12627 {
12628 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12629 }
12630 }
12631 }
12632 }
12633
12634 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12635 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12636 {
12637 int id = muzzle_owner.GetMuzzleID();
12638 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12639
12640 if (WPOBE_array)
12641 {
12642 for (int i = 0; i < WPOBE_array.Count(); i++)
12643 {
12644 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12645
12646 if (WPOBE)
12647 {
12648 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12649 }
12650 }
12651 }
12652 }
12653
12654 // Plays all weapon overheating particles
12655 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12656 {
12657 int id = muzzle_owner.GetMuzzleID();
12658 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12659
12660 if (WPOOH_array)
12661 {
12662 for (int i = 0; i < WPOOH_array.Count(); i++)
12663 {
12664 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12665
12666 if (WPOOH)
12667 {
12668 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12669 }
12670 }
12671 }
12672 }
12673
12674 // Updates all weapon overheating particles
12675 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12676 {
12677 int id = muzzle_owner.GetMuzzleID();
12678 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12679
12680 if (WPOOH_array)
12681 {
12682 for (int i = 0; i < WPOOH_array.Count(); i++)
12683 {
12684 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12685
12686 if (WPOOH)
12687 {
12688 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12689 }
12690 }
12691 }
12692 }
12693
12694 // Stops overheating particles
12695 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12696 {
12697 int id = muzzle_owner.GetMuzzleID();
12698 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12699
12700 if (WPOOH_array)
12701 {
12702 for (int i = 0; i < WPOOH_array.Count(); i++)
12703 {
12704 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12705
12706 if (WPOOH)
12707 {
12708 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12709 }
12710 }
12711 }
12712 }
12713
12714 //----------------------------------------------------------------
12715 //Item Behaviour - unified approach
12716 override bool IsHeavyBehaviour()
12717 {
12718 if (m_ItemBehaviour == 0)
12719 {
12720 return true;
12721 }
12722
12723 return false;
12724 }
12725
12726 override bool IsOneHandedBehaviour()
12727 {
12728 if (m_ItemBehaviour == 1)
12729 {
12730 return true;
12731 }
12732
12733 return false;
12734 }
12735
12736 override bool IsTwoHandedBehaviour()
12737 {
12738 if (m_ItemBehaviour == 2)
12739 {
12740 return true;
12741 }
12742
12743 return false;
12744 }
12745
12746 bool IsDeployable()
12747 {
12748 return false;
12749 }
12750
12752 float GetDeployTime()
12753 {
12754 return UATimeSpent.DEFAULT_DEPLOY;
12755 }
12756
12757
12758 //----------------------------------------------------------------
12759 // Item Targeting (User Actions)
12760 override void SetTakeable(bool pState)
12761 {
12762 m_IsTakeable = pState;
12763 SetSynchDirty();
12764 }
12765
12766 override bool IsTakeable()
12767 {
12768 return m_IsTakeable;
12769 }
12770
12771 // For cases where we want to show object widget which cant be taken to hands
12773 {
12774 return false;
12775 }
12776
12778 protected void PreLoadSoundAttachmentType()
12779 {
12780 string att_type = "None";
12781
12782 if (ConfigIsExisting("soundAttType"))
12783 {
12784 att_type = ConfigGetString("soundAttType");
12785 }
12786
12787 m_SoundAttType = att_type;
12788 }
12789
12790 override string GetAttachmentSoundType()
12791 {
12792 return m_SoundAttType;
12793 }
12794
12795 //----------------------------------------------------------------
12796 //SOUNDS - ItemSoundHandler
12797 //----------------------------------------------------------------
12798
12799 string GetPlaceSoundset(); // played when deploy starts
12800 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12801 string GetDeploySoundset(); // played when deploy sucessfully finishes
12802
12804 {
12805 if (!m_ItemSoundHandler)
12807
12808 return m_ItemSoundHandler;
12809 }
12810
12811 // override to initialize sounds
12812 protected void InitItemSounds()
12813 {
12814 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
12815 return;
12816
12818
12819 if (GetPlaceSoundset() != string.Empty)
12820 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12821
12822 if (GetDeploySoundset() != string.Empty)
12823 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12824
12825 SoundParameters params = new SoundParameters();
12826 params.m_Loop = true;
12827 if (GetLoopDeploySoundset() != string.Empty)
12828 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12829 }
12830
12831 // Start sound using ItemSoundHandler
12832 void StartItemSoundServer(int id)
12833 {
12834 if (!GetGame().IsServer())
12835 return;
12836
12837 m_SoundSyncPlay = id;
12838 SetSynchDirty();
12839
12840 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12842 }
12843
12844 // Stop sound using ItemSoundHandler
12845 void StopItemSoundServer(int id)
12846 {
12847 if (!GetGame().IsServer())
12848 return;
12849
12850 m_SoundSyncStop = id;
12851 SetSynchDirty();
12852
12853 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12855 }
12856
12857 protected void ClearStartItemSoundServer()
12858 {
12859 m_SoundSyncPlay = 0;
12860 }
12861
12862 protected void ClearStopItemSoundServer()
12863 {
12864 m_SoundSyncStop = 0;
12865 }
12866
12868 void PlayAttachSound(string slot_type)
12869 {
12870 if (!GetGame().IsDedicatedServer())
12871 {
12872 if (ConfigIsExisting("attachSoundSet"))
12873 {
12874 string cfg_path = "";
12875 string soundset = "";
12876 string type_name = GetType();
12877
12878 TStringArray cfg_soundset_array = new TStringArray;
12879 TStringArray cfg_slot_array = new TStringArray;
12880 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12881 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12882
12883 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12884 {
12885 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12886 {
12887 if (cfg_slot_array[i] == slot_type)
12888 {
12889 soundset = cfg_soundset_array[i];
12890 break;
12891 }
12892 }
12893 }
12894
12895 if (soundset != "")
12896 {
12897 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
12898 sound.SetAutodestroy(true);
12899 }
12900 }
12901 }
12902 }
12903
12904 void PlayDetachSound(string slot_type)
12905 {
12906 //TODO - evaluate if needed and devise universal config structure if so
12907 }
12908
12909 void OnApply(PlayerBase player);
12910
12912 {
12913 return 1.0;
12914 };
12915 //returns applicable selection
12916 array<string> GetHeadHidingSelection()
12917 {
12919 }
12920
12922 {
12924 }
12925
12926 WrittenNoteData GetWrittenNoteData() {};
12927
12929 {
12930 SetDynamicPhysicsLifeTime(0.01);
12931 m_ItemBeingDroppedPhys = false;
12932 }
12933
12935 {
12936 array<string> zone_names = new array<string>;
12937 GetDamageZones(zone_names);
12938 for (int i = 0; i < zone_names.Count(); i++)
12939 {
12940 SetHealthMax(zone_names.Get(i),"Health");
12941 }
12942 SetHealthMax("","Health");
12943 }
12944
12946 void SetZoneDamageCEInit()
12947 {
12948 float global_health = GetHealth01("","Health");
12949 array<string> zones = new array<string>;
12950 GetDamageZones(zones);
12951 //set damage of all zones to match global health level
12952 for (int i = 0; i < zones.Count(); i++)
12953 {
12954 SetHealth01(zones.Get(i),"Health",global_health);
12955 }
12956 }
12957
12959 bool IsCoverFaceForShave(string slot_name)
12960 {
12961 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12962 }
12963
12964 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12965 {
12966 if (!hasRootAsPlayer)
12967 {
12968 if (refParentIB)
12969 {
12970 // parent is wet
12971 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
12972 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12973 // parent has liquid inside
12974 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
12975 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12976 // drying
12977 else if (m_VarWet > m_VarWetMin)
12978 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
12979 }
12980 else
12981 {
12982 // drying on ground or inside non-itembase (car, ...)
12983 if (m_VarWet > m_VarWetMin)
12984 AddWet(-1 * delta * GetDryingIncrement("ground"));
12985 }
12986 }
12987 }
12988
12989 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12990 {
12992 {
12993 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
12994 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12995 {
12996 float heatPermCoef = 1.0;
12997 EntityAI ent = this;
12998 while (ent)
12999 {
13000 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13001 ent = ent.GetHierarchyParent();
13002 }
13003
13004 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13005 }
13006 }
13007 }
13008
13009 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13010 {
13011 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13012 EntityAI parent = GetHierarchyParent();
13013 if (!parent)
13014 {
13015 hasParent = false;
13016 hasRootAsPlayer = false;
13017 }
13018 else
13019 {
13020 hasParent = true;
13021 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13022 refParentIB = ItemBase.Cast(parent);
13023 }
13024 }
13025
13026 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13027 {
13028 // this is stub, implemented on Edible_Base
13029 }
13030
13031 bool CanDecay()
13032 {
13033 // return true used on selected food clases so they can decay
13034 return false;
13035 }
13036
13037 protected bool CanProcessDecay()
13038 {
13039 // this is stub, implemented on Edible_Base class
13040 // used to determine whether it is still necessary for the food to decay
13041 return false;
13042 }
13043
13044 protected bool CanHaveWetness()
13045 {
13046 // return true used on selected items that have a wetness effect
13047 return false;
13048 }
13049
13051 bool CanBeConsumed(ConsumeConditionData data = null)
13052 {
13053 return !GetIsFrozen() && IsOpen();
13054 }
13055
13056 override void ProcessVariables()
13057 {
13058 bool hasParent = false, hasRootAsPlayer = false;
13059 ItemBase refParentIB;
13060
13061 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13062 bool foodDecay = g_Game.IsFoodDecayEnabled();
13063
13064 if (wwtu || foodDecay)
13065 {
13066 bool processWetness = wwtu && CanHaveWetness();
13067 bool processTemperature = wwtu && CanHaveTemperature();
13068 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13069
13070 if (processWetness || processTemperature || processDecay)
13071 {
13072 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13073
13074 if (processWetness)
13075 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13076
13077 if (processTemperature)
13078 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13079
13080 if (processDecay)
13081 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13082 }
13083 }
13084 }
13085
13088 {
13089 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13090 }
13091
13092 override float GetTemperatureFreezeThreshold()
13093 {
13095 return Liquid.GetFreezeThreshold(GetLiquidType());
13096
13097 return super.GetTemperatureFreezeThreshold();
13098 }
13099
13100 override float GetTemperatureThawThreshold()
13101 {
13103 return Liquid.GetThawThreshold(GetLiquidType());
13104
13105 return super.GetTemperatureThawThreshold();
13106 }
13107
13108 override float GetItemOverheatThreshold()
13109 {
13111 return Liquid.GetBoilThreshold(GetLiquidType());
13112
13113 return super.GetItemOverheatThreshold();
13114 }
13115
13116 override float GetTemperatureFreezeTime()
13117 {
13118 if (HasQuantity())
13119 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13120
13121 return super.GetTemperatureFreezeTime();
13122 }
13123
13124 override float GetTemperatureThawTime()
13125 {
13126 if (HasQuantity())
13127 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13128
13129 return super.GetTemperatureThawTime();
13130 }
13131
13133 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13135 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13136
13137 bool IsCargoException4x3(EntityAI item)
13138 {
13139 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13140 }
13141
13143 {
13144 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13145 }
13146
13148 void AddLightSourceItem(ItemBase lightsource)
13149 {
13150 m_LightSourceItem = lightsource;
13151 }
13152
13154 {
13155 m_LightSourceItem = null;
13156 }
13157
13159 {
13160 return m_LightSourceItem;
13161 }
13162
13164 array<int> GetValidFinishers()
13165 {
13166 return null;
13167 }
13168
13170 bool GetActionWidgetOverride(out typename name)
13171 {
13172 return false;
13173 }
13174
13175 bool PairWithDevice(notnull ItemBase otherDevice)
13176 {
13177 if (GetGame().IsServer())
13178 {
13179 ItemBase explosive = otherDevice;
13181 if (!trg)
13182 {
13183 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13184 explosive = this;
13185 }
13186
13187 explosive.PairRemote(trg);
13188 trg.SetControlledDevice(explosive);
13189
13190 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13191 trg.SetPersistentPairID(persistentID);
13192 explosive.SetPersistentPairID(persistentID);
13193
13194 return true;
13195 }
13196 return false;
13197 }
13198
13200 float GetBaitEffectivity()
13201 {
13202 float ret = 1.0;
13203 if (HasQuantity())
13204 ret *= GetQuantityNormalized();
13205 ret *= GetHealth01();
13206
13207 return ret;
13208 }
13209
13210 #ifdef DEVELOPER
13211 override void SetDebugItem()
13212 {
13213 super.SetDebugItem();
13214 _itemBase = this;
13215 }
13216
13217 override string GetDebugText()
13218 {
13219 string text = super.GetDebugText();
13220
13221 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13222 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13223
13224 return text;
13225 }
13226 #endif
13227
13228 bool CanBeUsedForSuicide()
13229 {
13230 return true;
13231 }
13232
13234 //DEPRECATED BELOW
13236 // Backwards compatibility
13237 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13238 {
13239 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13240 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13241 }
13242
13243 // replaced by ItemSoundHandler
13244 protected EffectSound m_SoundDeployFinish;
13245 protected EffectSound m_SoundPlace;
13246 protected EffectSound m_DeployLoopSoundEx;
13247 protected EffectSound m_SoundDeploy;
13248 bool m_IsPlaceSound;
13249 bool m_IsDeploySound;
13251
13252 string GetDeployFinishSoundset();
13253 void PlayDeploySound();
13254 void PlayDeployFinishSound();
13255 void PlayPlaceSound();
13256 void PlayDeployLoopSoundEx();
13257 void StopDeployLoopSoundEx();
13258 void SoundSynchRemoteReset();
13259 void SoundSynchRemote();
13260 bool UsesGlobalDeploy(){return false;}
13261 bool CanPlayDeployLoopSound(){return false;}
13263 bool IsPlaceSound(){return m_IsPlaceSound;}
13264 bool IsDeploySound(){return m_IsDeploySound;}
13265 void SetIsPlaceSound(bool is_place_sound);
13266 void SetIsDeploySound(bool is_deploy_sound);
13267}
13268
13269EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13270{
13271 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13272 if (entity)
13273 {
13274 bool is_item = entity.IsInherited(ItemBase);
13275 if (is_item && full_quantity)
13276 {
13277 ItemBase item = ItemBase.Cast(entity);
13278 item.SetQuantity(item.GetQuantityInit());
13279 }
13280 }
13281 else
13282 {
13283 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13284 return NULL;
13285 }
13286 return entity;
13287}
13288
13289void SetupSpawnedItem(ItemBase item, float health, float quantity)
13290{
13291 if (item)
13292 {
13293 if (health > 0)
13294 item.SetHealth("", "", health);
13295
13296 if (item.CanHaveTemperature())
13297 {
13298 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13299 if (item.CanFreeze())
13300 item.SetFrozen(false);
13301 }
13302
13303 if (item.HasEnergyManager())
13304 {
13305 if (quantity >= 0)
13306 {
13307 item.GetCompEM().SetEnergy0To1(quantity);
13308 }
13309 else
13310 {
13311 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13312 }
13313 }
13314 else if (item.IsMagazine())
13315 {
13316 Magazine mag = Magazine.Cast(item);
13317 if (quantity >= 0)
13318 {
13319 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13320 }
13321 else
13322 {
13323 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13324 }
13325
13326 }
13327 else
13328 {
13329 if (quantity >= 0)
13330 {
13331 item.SetQuantityNormalized(quantity, false);
13332 }
13333 else
13334 {
13335 item.SetQuantity(Math.AbsFloat(quantity));
13336 }
13337
13338 }
13339 }
13340}
13341
13342#ifdef DEVELOPER
13343ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13344#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
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
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
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
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:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
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:8078
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:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
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:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
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:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
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:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
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
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
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()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
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:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
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 void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
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:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
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:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
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:1012
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 IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
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
Определения InventoryItem.c:731
Определения 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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
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:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
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
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
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:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
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
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()