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

◆ ConvertEnergyToQuantity()

void SpawnItemOnLocation::ConvertEnergyToQuantity ( )
protected

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

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

Используется в InventoryItem::OnEnergyAdded() и InventoryItem::OnEnergyConsumed().