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

◆ OnPlacementStarted()

override void SpawnItemOnLocation::OnPlacementStarted ( Man player)
protected

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

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