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

◆ GetHeatIsolationInit()

float SpawnItemOnLocation::GetHeatIsolationInit ( )
protected

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

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