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

◆ TransferAgents()

void SpawnItemOnLocation::TransferAgents ( int agents)
protected

transfer agents from another item

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

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