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

◆ OnWetChanged()

override void SpawnItemOnLocation::OnWetChanged ( float newVal,
float oldVal )
protected

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

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