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

◆ GetLockType()

int SpawnItemOnLocation::GetLockType ( )
protected

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

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