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

◆ InsertAgent()

override void SpawnItemOnLocation::InsertAgent ( int agent,
float count = 1 )
protected

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

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

Используется в Bottle_Base::EEOnCECreate(), Edible_Base::HumanSteakMeat(), InventoryItem::OnAction(), Bottle_Base::OnDebugSpawn(), Edible_Base::ProcessDecay() и ManBase::SetBloodyHandsPenalty().