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

◆ EEOnCECreate()

override void SpawnItemOnLocation::EEOnCECreate ( )
protected

Called when entity is being created as new by CE/ Debug.

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

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