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

◆ GetTargetQuantityMax()

override int SpawnItemOnLocation::GetTargetQuantityMax ( int attSlotID = -1)
private

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

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

Используется в InventoryItem::GetQuantityMax(), InventoryItem::SplitIntoStackMax(), InventoryItem::SplitIntoStackMaxCargo(), InventoryItem::SplitIntoStackMaxEx(), InventoryItem::SplitIntoStackMaxHands() и InventoryItem::SplitIntoStackMaxToInventoryLocationEx().