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

◆ GetHeatIsolation()

float SpawnItemOnLocation::GetHeatIsolation ( )
protected

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

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