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

◆ IsColorSet()

bool SpawnItemOnLocation::IsColorSet ( )
protected

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

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