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

◆ CanBeCookedOnStick()

bool SpawnItemOnLocation::CanBeCookedOnStick ( )
protected

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

7566{
7567 override bool CanPutAsAttachment(EntityAI parent)
7568 {
7569 return true;
7570 }
7571};
7572
7574{
7575
7576};
7577
7578//const bool QUANTITY_DEBUG_REMOVE_ME = false;
7579
7580class ItemBase extends InventoryItem
7581{
7585
7587
7588 static int m_DebugActionsMask;
7590 // ============================================
7591 // Variable Manipulation System
7592 // ============================================
7593 // Quantity
7594
7595 float m_VarQuantity;
7596 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
7598 int m_VarQuantityMin;
7599 int m_VarQuantityMax;
7600 int m_Count;
7601 float m_VarStackMax;
7602 float m_StoreLoadedQuantity = float.LOWEST;
7603 // Wet
7604 float m_VarWet;
7605 float m_VarWetPrev;//for client to know wetness changed during synchronization
7606 float m_VarWetInit;
7607 float m_VarWetMin;
7608 float m_VarWetMax;
7609 // Cleanness
7610 int m_Cleanness;
7611 int m_CleannessInit;
7612 int m_CleannessMin;
7613 int m_CleannessMax;
7614 // impact sounds
7616 bool m_CanPlayImpactSound = true;
7617 float m_ImpactSpeed;
7619 //
7620 float m_HeatIsolation;
7621 float m_ItemModelLength;
7622 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
7624 int m_VarLiquidType;
7625 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
7626 int m_QuickBarBonus;
7627 bool m_IsBeingPlaced;
7628 bool m_IsHologram;
7629 bool m_IsTakeable;
7630 bool m_ThrowItemOnDrop;
7633 bool m_FixDamageSystemInit = false; //can be changed on storage version check
7634 bool can_this_be_combined; //Check if item can be combined
7635 bool m_CanThisBeSplit; //Check if item can be split
7636 bool m_IsStoreLoad = false;
7637 bool m_CanShowQuantity;
7638 bool m_HasQuantityBar;
7639 protected bool m_CanBeDigged;
7640 protected bool m_IsResultOfSplit
7641
7642 string m_SoundAttType;
7643 // items color variables
7648 //-------------------------------------------------------
7649
7650 // light source managing
7652
7656
7657 //==============================================
7658 // agent system
7659 private int m_AttachedAgents;
7660
7662 void TransferModifiers(PlayerBase reciever);
7663
7664
7665 // Weapons & suppressors particle effects
7669 ref static map<string, int> m_WeaponTypeToID;
7670 static int m_LastRegisteredWeaponID = 0;
7671
7672 // Overheating effects
7674 float m_OverheatingShots;
7675 ref Timer m_CheckOverheating;
7676 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
7677 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
7678 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
7679 ref array <ref OverheatingParticle> m_OverheatingParticles;
7680
7682 protected bool m_HideSelectionsBySlot;
7683
7684 // Admin Log
7685 PluginAdminLog m_AdminLog;
7686
7687 // misc
7688 ref Timer m_PhysDropTimer;
7689
7690 // Attachment Locking variables
7691 ref array<int> m_CompatibleLocks;
7692 protected int m_LockType;
7693 protected ref EffectSound m_LockingSound;
7694 protected string m_LockSoundSet;
7695
7696 // ItemSoundHandler variables
7697 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
7698 protected int m_SoundSyncPlay; // id for sound to play
7699 protected int m_SoundSyncStop; // id for sound to stop
7700 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
7701
7703
7704 //temperature
7705 private float m_TemperaturePerQuantityWeight;
7706
7707 // -------------------------------------------------------------------------
7708 void ItemBase()
7709 {
7710 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
7714
7715 if (!g_Game.IsDedicatedServer())
7716 {
7717 if (HasMuzzle())
7718 {
7720
7722 {
7724 }
7725 }
7726
7728 m_ActionsInitialize = false;
7729 }
7730
7731 m_OldLocation = null;
7732
7733 if (g_Game.IsServer())
7734 {
7735 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
7736 }
7737
7738 if (ConfigIsExisting("headSelectionsToHide"))
7739 {
7741 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
7742 }
7743
7744 m_HideSelectionsBySlot = false;
7745 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7746 {
7747 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
7748 }
7749
7750 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
7751
7752 m_IsResultOfSplit = false;
7753
7755 }
7756
7757 override void InitItemVariables()
7758 {
7759 super.InitItemVariables();
7760
7761 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
7762 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
7763 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
7764 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
7765 m_VarStackMax = ConfigGetFloat("varStackMax");
7766 m_Count = ConfigGetInt("count");
7767
7768 m_CanShowQuantity = ConfigGetBool("quantityShow");
7769 m_HasQuantityBar = ConfigGetBool("quantityBar");
7770
7771 m_CleannessInit = ConfigGetInt("varCleannessInit");
7773 m_CleannessMin = ConfigGetInt("varCleannessMin");
7774 m_CleannessMax = ConfigGetInt("varCleannessMax");
7775
7776 m_WantPlayImpactSound = false;
7777 m_ImpactSpeed = 0.0;
7778
7779 m_VarWetInit = ConfigGetFloat("varWetInit");
7781 m_VarWetMin = ConfigGetFloat("varWetMin");
7782 m_VarWetMax = ConfigGetFloat("varWetMax");
7783
7784 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
7785 if (IsLiquidContainer() && GetQuantity() != 0)
7787 m_IsBeingPlaced = false;
7788 m_IsHologram = false;
7789 m_IsTakeable = true;
7790 m_CanBeMovedOverride = false;
7794 m_CanBeDigged = ConfigGetBool("canBeDigged");
7795
7796 m_CompatibleLocks = new array<int>();
7797 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
7798 m_LockType = ConfigGetInt("lockType");
7799
7800 //Define if item can be split and set ability to be combined accordingly
7801 m_CanThisBeSplit = false;
7802 can_this_be_combined = false;
7803 if (ConfigIsExisting("canBeSplit"))
7804 {
7805 can_this_be_combined = ConfigGetBool("canBeSplit");
7807 }
7808
7809 m_ItemBehaviour = -1;
7810 if (ConfigIsExisting("itemBehaviour"))
7811 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
7812
7813 //RegisterNetSyncVariableInt("m_VariablesMask");
7814 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7815 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
7816 RegisterNetSyncVariableInt("m_VarLiquidType");
7817 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7818
7819 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7820 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7821 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7822
7823 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7824 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7825 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7826 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7827
7828 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7829 RegisterNetSyncVariableBool("m_IsTakeable");
7830 RegisterNetSyncVariableBool("m_IsHologram");
7831
7834 {
7835 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
7836 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
7837 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
7838 }
7839
7840 m_LockSoundSet = ConfigGetString("lockSoundSet");
7841
7843 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7844 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
7845
7846 m_SoundSyncSlotID = -1;
7847 }
7848
7849 override int GetQuickBarBonus()
7850 {
7851 return m_QuickBarBonus;
7852 }
7853
7854 void InitializeActions()
7855 {
7857 if (!m_InputActionMap)
7858 {
7860 m_InputActionMap = iam;
7861 SetActions();
7863 }
7864 }
7865
7866 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
7867 {
7869 {
7870 m_ActionsInitialize = true;
7872 }
7873
7874 actions = m_InputActionMap.Get(action_input_type);
7875 }
7876
7877 void SetActions()
7878 {
7879 AddAction(ActionTakeItem);
7880 AddAction(ActionTakeItemToHands);
7881 AddAction(ActionWorldCraft);
7883 AddAction(ActionAttachWithSwitch);
7884 }
7885
7886 void SetActionAnimOverrides(); // Override action animation for specific item
7887
7888 void AddAction(typename actionName)
7889 {
7890 ActionBase action = ActionManagerBase.GetAction(actionName);
7891
7892 if (!action)
7893 {
7894 Debug.LogError("Action " + actionName + " dosn't exist!");
7895 return;
7896 }
7897
7898 typename ai = action.GetInputType();
7899 if (!ai)
7900 {
7901 m_ActionsInitialize = false;
7902 return;
7903 }
7904
7905 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7906 if (!action_array)
7907 {
7908 action_array = new array<ActionBase_Basic>;
7909 m_InputActionMap.Insert(ai, action_array);
7910 }
7911 if (LogManager.IsActionLogEnable())
7912 {
7913 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
7914 }
7915
7916 if (action_array.Find(action) != -1)
7917 {
7918 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
7919 }
7920 else
7921 {
7922 action_array.Insert(action);
7923 }
7924 }
7925
7926 void RemoveAction(typename actionName)
7927 {
7928 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
7929 ActionBase action = player.GetActionManager().GetAction(actionName);
7930 typename ai = action.GetInputType();
7931 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7932
7933 if (action_array)
7934 {
7935 action_array.RemoveItem(action);
7936 }
7937 }
7938
7939 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
7940 // Set -1 for params which should stay in default state
7941 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
7942 {
7943 ActionOverrideData overrideData = new ActionOverrideData();
7944 overrideData.m_CommandUID = commandUID;
7945 overrideData.m_CommandUIDProne = commandUIDProne;
7946 overrideData.m_StanceMask = stanceMask;
7947
7948 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
7949 if (!actionMap) // create new map of action > overidables map
7950 {
7951 actionMap = new TActionAnimOverrideMap();
7952 m_ItemActionOverrides.Insert(action, actionMap);
7953 }
7954
7955 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
7956
7957 }
7958
7959 void OnItemInHandsPlayerSwimStart(PlayerBase player);
7960
7961 ScriptedLightBase GetLight();
7962
7963 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
7964 void LoadParticleConfigOnFire(int id)
7965 {
7966 if (!m_OnFireEffect)
7968
7971
7972 string config_to_search = "CfgVehicles";
7973 string muzzle_owner_config;
7974
7975 if (!m_OnFireEffect.Contains(id))
7976 {
7977 if (IsInherited(Weapon))
7978 config_to_search = "CfgWeapons";
7979
7980 muzzle_owner_config = config_to_search + " " + GetType() + " ";
7981
7982 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7983
7984 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
7985
7986 if (config_OnFire_subclass_count > 0)
7987 {
7988 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7989
7990 for (int i = 0; i < config_OnFire_subclass_count; i++)
7991 {
7992 string particle_class = "";
7993 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
7994 string config_OnFire_entry = config_OnFire_class + particle_class;
7995 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7996 WPOF_array.Insert(WPOF);
7997 }
7998
7999
8000 m_OnFireEffect.Insert(id, WPOF_array);
8001 }
8002 }
8003
8004 if (!m_OnBulletCasingEjectEffect.Contains(id))
8005 {
8006 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8007 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8008
8009 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8010
8011 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8012
8013 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8014 {
8015 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8016
8017 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8018 {
8019 string particle_class2 = "";
8020 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8021 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8022 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8023 WPOBE_array.Insert(WPOBE);
8024 }
8025
8026
8027 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8028 }
8029 }
8030 }
8031
8032 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8034 {
8037
8038 if (!m_OnOverheatingEffect.Contains(id))
8039 {
8040 string config_to_search = "CfgVehicles";
8041
8042 if (IsInherited(Weapon))
8043 config_to_search = "CfgWeapons";
8044
8045 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8046 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8047
8048 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
8049 {
8050
8051 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8052
8054 {
8055 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8056 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8057 Error(error);
8058 return;
8059 }
8060
8061 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8062 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8063
8064
8065
8066 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8067 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8068
8069 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8070 {
8071 string particle_class = "";
8072 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8073 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8074 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
8075
8076 if (entry_type == CT_CLASS)
8077 {
8078 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8079 WPOOH_array.Insert(WPOF);
8080 }
8081 }
8082
8083
8084 m_OnOverheatingEffect.Insert(id, WPOOH_array);
8085 }
8086 }
8087 }
8088
8089 float GetOverheatingValue()
8090 {
8091 return m_OverheatingShots;
8092 }
8093
8094 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
8095 {
8096 if (m_MaxOverheatingValue > 0)
8097 {
8099
8100 if (!m_CheckOverheating)
8102
8104 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8105
8106 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8107 }
8108 }
8109
8110 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8111 {
8113 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8114
8116 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8117
8119 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8120
8122 {
8124 }
8125 }
8126
8128 {
8130 }
8131
8132 void OnOverheatingDecay()
8133 {
8134 if (m_MaxOverheatingValue > 0)
8135 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
8136 else
8138
8139 if (m_OverheatingShots <= 0)
8140 {
8143 }
8144 else
8145 {
8146 if (!m_CheckOverheating)
8148
8150 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8151 }
8152
8153 CheckOverheating(this, "", this);
8154 }
8155
8156 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8157 {
8159 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8160 }
8161
8162 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8163 {
8165 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8167 }
8168
8169 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8170 {
8172 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8173 }
8174
8175 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
8176 {
8178 m_OverheatingParticles = new array<ref OverheatingParticle>;
8179
8180 OverheatingParticle OP = new OverheatingParticle();
8181 OP.RegisterParticle(p);
8182 OP.SetOverheatingLimitMin(min_heat_coef);
8183 OP.SetOverheatingLimitMax(max_heat_coef);
8184 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
8185
8186 m_OverheatingParticles.Insert(OP);
8187 }
8188
8189 float GetOverheatingCoef()
8190 {
8191 if (m_MaxOverheatingValue > 0)
8193
8194 return -1;
8195 }
8196
8198 {
8200 {
8201 float overheat_coef = GetOverheatingCoef();
8202 int count = m_OverheatingParticles.Count();
8203
8204 for (int i = count; i > 0; --i)
8205 {
8206 int id = i - 1;
8207 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8208 Particle p = OP.GetParticle();
8209
8210 float overheat_min = OP.GetOverheatingLimitMin();
8211 float overheat_max = OP.GetOverheatingLimitMax();
8212
8213 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8214 {
8215 if (p)
8216 {
8217 p.Stop();
8218 OP.RegisterParticle(null);
8219 }
8220 }
8221 }
8222 }
8223 }
8224
8226 {
8228 {
8229 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
8230 {
8231 int id = i - 1;
8232 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8233
8234 if (OP)
8235 {
8236 Particle p = OP.GetParticle();
8237
8238 if (p)
8239 {
8240 p.Stop();
8241 }
8242
8243 delete OP;
8244 }
8245 }
8246
8247 m_OverheatingParticles.Clear();
8249 }
8250 }
8251
8253 float GetInfectionChance(int system = 0, Param param = null)
8254 {
8255 return 0.0;
8256 }
8257
8258
8259 float GetDisinfectQuantity(int system = 0, Param param1 = null)
8260 {
8261 return 250;//default value
8262 }
8263
8264 float GetFilterDamageRatio()
8265 {
8266 return 0;
8267 }
8268
8270 bool HasMuzzle()
8271 {
8272 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
8273 return true;
8274
8275 return false;
8276 }
8277
8279 int GetMuzzleID()
8280 {
8281 if (!m_WeaponTypeToID)
8282 m_WeaponTypeToID = new map<string, int>;
8283
8284 if (m_WeaponTypeToID.Contains(GetType()))
8285 {
8286 return m_WeaponTypeToID.Get(GetType());
8287 }
8288 else
8289 {
8290 // Register new weapon ID
8292 }
8293
8295 }
8296
8303 {
8304 return -1;
8305 }
8306
8307
8308
8309 // -------------------------------------------------------------------------
8310 void ~ItemBase()
8311 {
8312 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
8313 {
8314 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8315 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8316
8317 if (r_index >= 0)
8318 {
8319 InventoryLocation r_il = new InventoryLocation;
8320 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8321
8322 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8323 int r_type = r_il.GetType();
8324 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8325 {
8326 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8327 }
8328 else if (r_type == InventoryLocationType.ATTACHMENT)
8329 {
8330 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8331 }
8332
8333 }
8334
8335 player.GetHumanInventory().ClearUserReservedLocation(this);
8336 }
8337
8338 if (m_LockingSound)
8339 SEffectManager.DestroyEffect(m_LockingSound);
8340 }
8341
8342
8343
8344 // -------------------------------------------------------------------------
8345 static int GetDebugActionsMask()
8346 {
8347 return ItemBase.m_DebugActionsMask;
8348 }
8349
8350 static bool HasDebugActionsMask(int mask)
8351 {
8352 return ItemBase.m_DebugActionsMask & mask;
8353 }
8354
8355 static void SetDebugActionsMask(int mask)
8356 {
8357 ItemBase.m_DebugActionsMask = mask;
8358 }
8359
8360 static void AddDebugActionsMask(int mask)
8361 {
8362 ItemBase.m_DebugActionsMask |= mask;
8363 }
8364
8365 static void RemoveDebugActionsMask(int mask)
8366 {
8367 ItemBase.m_DebugActionsMask &= ~mask;
8368 }
8369
8370 static void ToggleDebugActionsMask(int mask)
8371 {
8372 if (HasDebugActionsMask(mask))
8373 {
8375 }
8376 else
8377 {
8378 AddDebugActionsMask(mask);
8379 }
8380 }
8381
8382 // -------------------------------------------------------------------------
8383 void SetCEBasedQuantity()
8384 {
8385 if (GetEconomyProfile())
8386 {
8387 float q_max = GetEconomyProfile().GetQuantityMax();
8388 if (q_max > 0)
8389 {
8390 float q_min = GetEconomyProfile().GetQuantityMin();
8391 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8392
8393 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
8394 {
8395 ComponentEnergyManager comp = GetCompEM();
8396 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
8397 {
8398 comp.SetEnergy0To1(quantity_randomized);
8399 }
8400 }
8401 else if (HasQuantity())
8402 {
8403 SetQuantityNormalized(quantity_randomized, false);
8404 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
8405 }
8406
8407 }
8408 }
8409 }
8410
8412 void LockToParent()
8413 {
8414 EntityAI parent = GetHierarchyParent();
8415
8416 if (parent)
8417 {
8418 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8419 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8420 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
8421 }
8422 }
8423
8425 void UnlockFromParent()
8426 {
8427 EntityAI parent = GetHierarchyParent();
8428
8429 if (parent)
8430 {
8431 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8432 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8433 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
8434 }
8435 }
8436
8437 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
8438 {
8439 /*
8440 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
8441 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
8442 */
8443 ItemBase item2 = ItemBase.Cast(entity2);
8444
8445 if (g_Game.IsClient())
8446 {
8447 if (ScriptInputUserData.CanStoreInputUserData())
8448 {
8449 ScriptInputUserData ctx = new ScriptInputUserData;
8451 ctx.Write(-1);
8452 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8453 ctx.Write(i1);
8454 ctx.Write(item2);
8455 ctx.Write(use_stack_max);
8456 ctx.Write(-1);
8457 ctx.Send();
8458
8459 if (IsCombineAll(item2, use_stack_max))
8460 {
8461 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8462 }
8463 }
8464 }
8465 else if (!g_Game.IsMultiplayer())
8466 {
8467 CombineItems(item2, use_stack_max);
8468 }
8469 }
8470
8471 bool IsLiquidPresent()
8472 {
8473 return (GetLiquidType() != 0 && HasQuantity());
8474 }
8475
8476 bool IsLiquidContainer()
8477 {
8478 return m_LiquidContainerMask != 0;
8479 }
8480
8482 {
8483 return m_LiquidContainerMask;
8484 }
8485
8486 bool IsBloodContainer()
8487 {
8488 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
8489 return false;
8490 }
8491
8492 bool IsNVG()
8493 {
8494 return false;
8495 }
8496
8499 bool IsExplosive()
8500 {
8501 return false;
8502 }
8503
8505 {
8506 return "";
8507 }
8508
8510
8511 bool IsLightSource()
8512 {
8513 return false;
8514 }
8515
8517 {
8518 return true;
8519 }
8520
8521 //--- ACTION CONDITIONS
8522 //direction
8523 bool IsFacingPlayer(PlayerBase player, string selection)
8524 {
8525 return true;
8526 }
8527
8528 bool IsPlayerInside(PlayerBase player, string selection)
8529 {
8530 return true;
8531 }
8532
8533 override bool CanObstruct()
8534 {
8535 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8536 return !player || !IsPlayerInside(player, "");
8537 }
8538
8539 override bool IsBeingPlaced()
8540 {
8541 return m_IsBeingPlaced;
8542 }
8543
8544 void SetIsBeingPlaced(bool is_being_placed)
8545 {
8546 m_IsBeingPlaced = is_being_placed;
8547 if (!is_being_placed)
8549 SetSynchDirty();
8550 }
8551
8552 //server-side
8553 void OnEndPlacement() {}
8554
8555 override bool IsHologram()
8556 {
8557 return m_IsHologram;
8558 }
8559
8560 bool CanBeDigged()
8561 {
8562 return m_CanBeDigged;
8563 }
8564
8566 {
8567 return 1;
8568 }
8569
8570 bool CanMakeGardenplot()
8571 {
8572 return false;
8573 }
8574
8575 void SetIsHologram(bool is_hologram)
8576 {
8577 m_IsHologram = is_hologram;
8578 SetSynchDirty();
8579 }
8580 /*
8581 protected float GetNutritionalEnergy()
8582 {
8583 Edible_Base edible = Edible_Base.Cast(this);
8584 return edible.GetFoodEnergy();
8585 }
8586
8587 protected float GetNutritionalWaterContent()
8588 {
8589 Edible_Base edible = Edible_Base.Cast(this);
8590 return edible.GetFoodWater();
8591 }
8592
8593 protected float GetNutritionalIndex()
8594 {
8595 Edible_Base edible = Edible_Base.Cast(this);
8596 return edible.GetFoodNutritionalIndex();
8597 }
8598
8599 protected float GetNutritionalFullnessIndex()
8600 {
8601 Edible_Base edible = Edible_Base.Cast(this);
8602 return edible.GetFoodTotalVolume();
8603 }
8604
8605 protected float GetNutritionalToxicity()
8606 {
8607 Edible_Base edible = Edible_Base.Cast(this);
8608 return edible.GetFoodToxicity();
8609
8610 }
8611 */
8612
8613
8614 // -------------------------------------------------------------------------
8615 override void OnMovedInsideCargo(EntityAI container)
8616 {
8617 super.OnMovedInsideCargo(container);
8618
8619 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8620 }
8621
8622 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8623 {
8624 super.EEItemLocationChanged(oldLoc, newLoc);
8625
8626 PlayerBase newPlayer = null;
8627 PlayerBase oldPlayer = null;
8628
8629 if (newLoc.GetParent())
8630 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8631
8632 if (oldLoc.GetParent())
8633 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8634
8635 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
8636 {
8637 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
8638
8639 if (rIndex >= 0)
8640 {
8641 InventoryLocation rIl = new InventoryLocation;
8642 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
8643
8644 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
8645 int rType = rIl.GetType();
8646 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
8647 {
8648 rIl.GetParent().GetOnReleaseLock().Invoke(this);
8649 }
8650 else if (rType == InventoryLocationType.ATTACHMENT)
8651 {
8652 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
8653 }
8654
8655 }
8656 }
8657
8658 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
8659 {
8660 if (newPlayer)
8661 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
8662
8663 if (newPlayer == oldPlayer)
8664 {
8665 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8666 {
8667 if (oldLoc.GetType() == InventoryLocationType.CARGO)
8668 {
8669 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8670 {
8671 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8672 }
8673 }
8674 else
8675 {
8676 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8677 }
8678 }
8679
8680 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8681 {
8682 int type = oldLoc.GetType();
8683 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
8684 {
8685 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8686 }
8687 else if (type == InventoryLocationType.ATTACHMENT)
8688 {
8689 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8690 }
8691 }
8692 if (!m_OldLocation)
8693 {
8694 m_OldLocation = new InventoryLocation;
8695 }
8696 m_OldLocation.Copy(oldLoc);
8697 }
8698 else
8699 {
8700 if (m_OldLocation)
8701 {
8702 m_OldLocation.Reset();
8703 }
8704 }
8705
8706 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
8707 }
8708 else
8709 {
8710 if (newPlayer)
8711 {
8712 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8713 if (resIndex >= 0)
8714 {
8715 InventoryLocation il = new InventoryLocation;
8716 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
8717 ItemBase it = ItemBase.Cast(il.GetItem());
8718 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
8719 int rel_type = il.GetType();
8720 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
8721 {
8722 il.GetParent().GetOnReleaseLock().Invoke(it);
8723 }
8724 else if (rel_type == InventoryLocationType.ATTACHMENT)
8725 {
8726 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
8727 }
8728 //it.GetOnReleaseLock().Invoke(it);
8729 }
8730 }
8731 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
8732 {
8733 //ThrowPhysically(oldPlayer, vector.Zero);
8734 m_ThrowItemOnDrop = false;
8735 }
8736
8737 if (m_OldLocation)
8738 {
8739 m_OldLocation.Reset();
8740 }
8741 }
8742
8743 if (oldLoc.GetType() == InventoryLocationType.TEMP)
8744 {
8745 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
8746 }
8747
8748 if (newLoc.GetType() == InventoryLocationType.TEMP)
8749 {
8750 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
8751 }
8752 }
8753
8754 override void EOnContact(IEntity other, Contact extra)
8755 {
8757 {
8758 int liquidType = -1;
8759 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
8760 if (impactSpeed > 0.0)
8761 {
8762 m_ImpactSpeed = impactSpeed;
8763 #ifndef SERVER
8764 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8765 #else
8766 m_WantPlayImpactSound = true;
8767 SetSynchDirty();
8768 #endif
8769 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
8770 }
8771 }
8772
8773 #ifdef SERVER
8774 if (GetCompEM() && GetCompEM().IsPlugged())
8775 {
8776 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
8777 GetCompEM().UnplugThis();
8778 }
8779 #endif
8780 }
8781
8782 void RefreshPhysics();
8783
8784 override void OnCreatePhysics()
8785 {
8787 }
8788
8789 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8790 {
8791
8792 }
8793 // -------------------------------------------------------------------------
8794 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
8795 {
8796 super.OnItemLocationChanged(old_owner, new_owner);
8797
8798 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8799 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8800
8801 if (!relatedPlayer && playerNew)
8802 relatedPlayer = playerNew;
8803
8804 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8805 {
8806 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
8807 if (actionMgr)
8808 {
8809 ActionBase currentAction = actionMgr.GetRunningAction();
8810 if (currentAction)
8811 currentAction.OnItemLocationChanged(this);
8812 }
8813 }
8814
8815 Man ownerPlayerOld = null;
8816 Man ownerPlayerNew = null;
8817
8818 if (old_owner)
8819 {
8820 if (old_owner.IsMan())
8821 {
8822 ownerPlayerOld = Man.Cast(old_owner);
8823 }
8824 else
8825 {
8826 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8827 }
8828 }
8829 else
8830 {
8831 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
8832 {
8833 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
8834
8835 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
8836 {
8837 GetCompEM().UnplugThis();
8838 }
8839 }
8840 }
8841
8842 if (new_owner)
8843 {
8844 if (new_owner.IsMan())
8845 {
8846 ownerPlayerNew = Man.Cast(new_owner);
8847 }
8848 else
8849 {
8850 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8851 }
8852 }
8853
8854 if (ownerPlayerOld != ownerPlayerNew)
8855 {
8856 if (ownerPlayerOld)
8857 {
8858 array<EntityAI> subItemsExit = new array<EntityAI>;
8859 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
8860 for (int i = 0; i < subItemsExit.Count(); i++)
8861 {
8862 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
8863 itemExit.OnInventoryExit(ownerPlayerOld);
8864 }
8865 }
8866
8867 if (ownerPlayerNew)
8868 {
8869 array<EntityAI> subItemsEnter = new array<EntityAI>;
8870 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
8871 for (int j = 0; j < subItemsEnter.Count(); j++)
8872 {
8873 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
8874 itemEnter.OnInventoryEnter(ownerPlayerNew);
8875 }
8876 }
8877 }
8878 else if (ownerPlayerNew != null)
8879 {
8880 PlayerBase nplayer;
8881 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8882 {
8883 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8884 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
8885 for (int k = 0; k < subItemsUpdate.Count(); k++)
8886 {
8887 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
8888 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8889 }
8890 }
8891 }
8892
8893 if (old_owner)
8894 old_owner.OnChildItemRemoved(this);
8895 if (new_owner)
8896 new_owner.OnChildItemReceived(this);
8897 }
8898
8899 // -------------------------------------------------------------------------------
8900 override void EEDelete(EntityAI parent)
8901 {
8902 super.EEDelete(parent);
8903 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8904 if (player)
8905 {
8906 OnInventoryExit(player);
8907
8908 if (player.IsAlive())
8909 {
8910 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8911 if (r_index >= 0)
8912 {
8913 InventoryLocation r_il = new InventoryLocation;
8914 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8915
8916 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8917 int r_type = r_il.GetType();
8918 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8919 {
8920 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8921 }
8922 else if (r_type == InventoryLocationType.ATTACHMENT)
8923 {
8924 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8925 }
8926
8927 }
8928
8929 player.RemoveQuickBarEntityShortcut(this);
8930 }
8931 }
8932 }
8933 // -------------------------------------------------------------------------------
8934 override void EEKilled(Object killer)
8935 {
8936 super.EEKilled(killer);
8937
8939 if (killer && killer.IsFireplace() && CanExplodeInFire())
8940 {
8941 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8942 {
8943 if (IsMagazine())
8944 {
8945 if (Magazine.Cast(this).GetAmmoCount() > 0)
8946 {
8947 ExplodeAmmo();
8948 }
8949 }
8950 else
8951 {
8952 Explode(DamageType.EXPLOSION);
8953 }
8954 }
8955 }
8956 }
8957
8958 override void OnWasAttached(EntityAI parent, int slot_id)
8959 {
8960 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8961
8962 super.OnWasAttached(parent, slot_id);
8963
8964 if (HasQuantity())
8965 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8966
8967 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
8968 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
8969 }
8970
8971 override void OnWasDetached(EntityAI parent, int slot_id)
8972 {
8973 super.OnWasDetached(parent, slot_id);
8974
8975 if (HasQuantity())
8976 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8977
8978 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
8979 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
8980 }
8981
8982 override string ChangeIntoOnAttach(string slot)
8983 {
8984 int idx;
8985 TStringArray inventory_slots = new TStringArray;
8986 TStringArray attach_types = new TStringArray;
8987
8988 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8989 if (inventory_slots.Count() < 1) //is string
8990 {
8991 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8992 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8993 }
8994 else //is array
8995 {
8996 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8997 }
8998
8999 idx = inventory_slots.Find(slot);
9000 if (idx < 0)
9001 return "";
9002
9003 return attach_types.Get(idx);
9004 }
9005
9006 override string ChangeIntoOnDetach()
9007 {
9008 int idx = -1;
9009 string slot;
9010
9011 TStringArray inventory_slots = new TStringArray;
9012 TStringArray detach_types = new TStringArray;
9013
9014 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9015 if (inventory_slots.Count() < 1) //is string
9016 {
9017 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9018 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9019 }
9020 else //is array
9021 {
9022 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9023 if (detach_types.Count() < 1)
9024 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9025 }
9026
9027 for (int i = 0; i < inventory_slots.Count(); i++)
9028 {
9029 slot = inventory_slots.Get(i);
9030 }
9031
9032 if (slot != "")
9033 {
9034 if (detach_types.Count() == 1)
9035 idx = 0;
9036 else
9037 idx = inventory_slots.Find(slot);
9038 }
9039 if (idx < 0)
9040 return "";
9041
9042 return detach_types.Get(idx);
9043 }
9044
9045 void ExplodeAmmo()
9046 {
9047 //timer
9048 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9049
9050 //min/max time
9051 float min_time = 1;
9052 float max_time = 3;
9053 float delay = Math.RandomFloat(min_time, max_time);
9054
9055 explode_timer.Run(delay, this, "DoAmmoExplosion");
9056 }
9057
9058 void DoAmmoExplosion()
9059 {
9060 Magazine magazine = Magazine.Cast(this);
9061 int pop_sounds_count = 6;
9062 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9063
9064 //play sound
9065 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9066 string sound_name = pop_sounds[ sound_idx ];
9067 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
9068
9069 //remove ammo count
9070 magazine.ServerAddAmmoCount(-1);
9071
9072 //if condition then repeat -> ExplodeAmmo
9073 float min_temp_to_explode = 100; //min temperature for item to explode
9074
9075 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9076 {
9077 ExplodeAmmo();
9078 }
9079 }
9080
9081 // -------------------------------------------------------------------------------
9082 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9083 {
9084 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9085
9086 const int CHANCE_DAMAGE_CARGO = 4;
9087 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9088 const int CHANCE_DAMAGE_NOTHING = 2;
9089
9090 if (IsClothing() || IsContainer() || IsItemTent())
9091 {
9092 float dmg = damageResult.GetDamage("","Health") * -0.5;
9093 int chances;
9094 int rnd;
9095
9096 if (GetInventory().GetCargo())
9097 {
9098 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9099 rnd = Math.RandomInt(0,chances);
9100
9101 if (rnd < CHANCE_DAMAGE_CARGO)
9102 {
9103 DamageItemInCargo(dmg);
9104 }
9105 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9106 {
9108 }
9109 }
9110 else
9111 {
9112 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9113 rnd = Math.RandomInt(0,chances);
9114
9115 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9116 {
9118 }
9119 }
9120 }
9121 }
9122
9123 bool DamageItemInCargo(float damage)
9124 {
9125 CargoBase cargo = GetInventory().GetCargo();
9126 if (cargo)
9127 {
9128 int item_count = cargo.GetItemCount();
9129 if (item_count > 0)
9130 {
9131 int random_pick = Math.RandomInt(0, item_count);
9132 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
9133 if (!item.IsExplosive())
9134 {
9135 item.AddHealth("","",damage);
9136 return true;
9137 }
9138 }
9139 }
9140 return false;
9141 }
9142
9143 bool DamageItemAttachments(float damage)
9144 {
9145 GameInventory inventory = GetInventory();
9146 int attachment_count = inventory.AttachmentCount();
9147 if (attachment_count > 0)
9148 {
9149 int random_pick = Math.RandomInt(0, attachment_count);
9150 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
9151 if (!attachment.IsExplosive())
9152 {
9153 attachment.AddHealth("","",damage);
9154 return true;
9155 }
9156 }
9157 return false;
9158 }
9159
9160 override bool IsSplitable()
9161 {
9162 return m_CanThisBeSplit;
9163 }
9164 //----------------
9165 override bool CanBeSplit()
9166 {
9167 if (IsSplitable() && (GetQuantity() > 1))
9168 return GetInventory().CanRemoveEntity();
9169
9170 return false;
9171 }
9172
9173 protected bool ShouldSplitQuantity(float quantity)
9174 {
9175 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
9176 if (!IsSplitable())
9177 return false;
9178
9179 // nothing to split?
9180 if (GetQuantity() <= 1)
9181 return false;
9182
9183 // check if we should re-use the item instead of creating a new copy?
9184 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
9185 int delta = GetQuantity() - quantity;
9186 if (delta == 0)
9187 return false;
9188
9189 // valid to split
9190 return true;
9191 }
9192
9193 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
9194 {
9195 if (g_Game.IsClient())
9196 {
9197 if (ScriptInputUserData.CanStoreInputUserData())
9198 {
9199 ScriptInputUserData ctx = new ScriptInputUserData;
9201 ctx.Write(1);
9202 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9203 ctx.Write(i1);
9204 ctx.Write(destination_entity);
9205 ctx.Write(true);
9206 ctx.Write(slot_id);
9207 ctx.Send();
9208 }
9209 }
9210 else if (!g_Game.IsMultiplayer())
9211 {
9212 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
9213 }
9214 }
9215
9216 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
9217 {
9218 float split_quantity_new;
9219 ItemBase new_item;
9220 float quantity = GetQuantity();
9221 float stack_max = GetTargetQuantityMax(slot_id);
9222 InventoryLocation loc = new InventoryLocation;
9223
9224 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9225 {
9226 if (stack_max <= GetQuantity())
9227 split_quantity_new = stack_max;
9228 else
9229 split_quantity_new = GetQuantity();
9230
9231 if (ShouldSplitQuantity(split_quantity_new))
9232 {
9233 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9234 if (new_item)
9235 {
9236 new_item.SetResultOfSplit(true);
9237 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9238 AddQuantity(-split_quantity_new, false, true);
9239 new_item.SetQuantity(split_quantity_new, false, true);
9240 }
9241 }
9242 }
9243 else if (destination_entity && slot_id == -1)
9244 {
9245 if (quantity > stack_max)
9246 split_quantity_new = stack_max;
9247 else
9248 split_quantity_new = quantity;
9249
9250 if (ShouldSplitQuantity(split_quantity_new))
9251 {
9252 GameInventory destinationInventory = destination_entity.GetInventory();
9253 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9254 {
9255 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9256 new_item = ItemBase.Cast(o);
9257 }
9258
9259 if (new_item)
9260 {
9261 new_item.SetResultOfSplit(true);
9262 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9263 AddQuantity(-split_quantity_new, false, true);
9264 new_item.SetQuantity(split_quantity_new, false, true);
9265 }
9266 }
9267 }
9268 else
9269 {
9270 if (stack_max != 0)
9271 {
9272 if (stack_max < GetQuantity())
9273 {
9274 split_quantity_new = GetQuantity() - stack_max;
9275 }
9276
9277 if (split_quantity_new == 0)
9278 {
9279 if (!g_Game.IsMultiplayer())
9280 player.PhysicalPredictiveDropItem(this);
9281 else
9282 player.ServerDropEntity(this);
9283 return;
9284 }
9285
9286 if (ShouldSplitQuantity(split_quantity_new))
9287 {
9288 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9289
9290 if (new_item)
9291 {
9292 new_item.SetResultOfSplit(true);
9293 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9294 SetQuantity(split_quantity_new, false, true);
9295 new_item.SetQuantity(stack_max, false, true);
9296 new_item.PlaceOnSurface();
9297 }
9298 }
9299 }
9300 }
9301 }
9302
9303 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
9304 {
9305 float split_quantity_new;
9306 ItemBase new_item;
9307 float quantity = GetQuantity();
9308 float stack_max = GetTargetQuantityMax(slot_id);
9309 InventoryLocation loc = new InventoryLocation;
9310
9311 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9312 {
9313 if (stack_max <= GetQuantity())
9314 split_quantity_new = stack_max;
9315 else
9316 split_quantity_new = GetQuantity();
9317
9318 if (ShouldSplitQuantity(split_quantity_new))
9319 {
9320 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9321 if (new_item)
9322 {
9323 new_item.SetResultOfSplit(true);
9324 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9325 AddQuantity(-split_quantity_new, false, true);
9326 new_item.SetQuantity(split_quantity_new, false, true);
9327 }
9328 }
9329 }
9330 else if (destination_entity && slot_id == -1)
9331 {
9332 if (quantity > stack_max)
9333 split_quantity_new = stack_max;
9334 else
9335 split_quantity_new = quantity;
9336
9337 if (ShouldSplitQuantity(split_quantity_new))
9338 {
9339 GameInventory destinationInventory = destination_entity.GetInventory();
9340 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9341 {
9342 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9343 new_item = ItemBase.Cast(o);
9344 }
9345
9346 if (new_item)
9347 {
9348 new_item.SetResultOfSplit(true);
9349 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9350 AddQuantity(-split_quantity_new, false, true);
9351 new_item.SetQuantity(split_quantity_new, false, true);
9352 }
9353 }
9354 }
9355 else
9356 {
9357 if (stack_max != 0)
9358 {
9359 if (stack_max < GetQuantity())
9360 {
9361 split_quantity_new = GetQuantity() - stack_max;
9362 }
9363
9364 if (ShouldSplitQuantity(split_quantity_new))
9365 {
9366 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9367
9368 if (new_item)
9369 {
9370 new_item.SetResultOfSplit(true);
9371 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9372 SetQuantity(split_quantity_new, false, true);
9373 new_item.SetQuantity(stack_max, false, true);
9374 new_item.PlaceOnSurface();
9375 }
9376 }
9377 }
9378 }
9379 }
9380
9381 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
9382 {
9383 if (g_Game.IsClient())
9384 {
9385 if (ScriptInputUserData.CanStoreInputUserData())
9386 {
9387 ScriptInputUserData ctx = new ScriptInputUserData;
9389 ctx.Write(4);
9390 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9391 ctx.Write(thiz);
9392 dst.WriteToContext(ctx);
9393 ctx.Send();
9394 }
9395 }
9396 else if (!g_Game.IsMultiplayer())
9397 {
9399 }
9400 }
9401
9402 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
9403 {
9404 if (g_Game.IsClient())
9405 {
9406 if (ScriptInputUserData.CanStoreInputUserData())
9407 {
9408 ScriptInputUserData ctx = new ScriptInputUserData;
9410 ctx.Write(2);
9411 ItemBase dummy = this; // @NOTE: workaround for correct serialization
9412 ctx.Write(dummy);
9413 ctx.Write(destination_entity);
9414 ctx.Write(true);
9415 ctx.Write(idx);
9416 ctx.Write(row);
9417 ctx.Write(col);
9418 ctx.Send();
9419 }
9420 }
9421 else if (!g_Game.IsMultiplayer())
9422 {
9423 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
9424 }
9425 }
9426
9427 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
9428 {
9430 }
9431
9432 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
9433 {
9434 float quantity = GetQuantity();
9435 float split_quantity_new;
9436 ItemBase new_item;
9437 if (dst.IsValid())
9438 {
9439 int slot_id = dst.GetSlot();
9440 float stack_max = GetTargetQuantityMax(slot_id);
9441
9442 if (quantity > stack_max)
9443 split_quantity_new = stack_max;
9444 else
9445 split_quantity_new = quantity;
9446
9447 if (ShouldSplitQuantity(split_quantity_new))
9448 {
9449 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9450
9451 if (new_item)
9452 {
9453 new_item.SetResultOfSplit(true);
9454 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9455 AddQuantity(-split_quantity_new, false, true);
9456 new_item.SetQuantity(split_quantity_new, false, true);
9457 }
9458
9459 return new_item;
9460 }
9461 }
9462
9463 return null;
9464 }
9465
9466 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
9467 {
9468 float quantity = GetQuantity();
9469 float split_quantity_new;
9470 ItemBase new_item;
9471 if (destination_entity)
9472 {
9473 float stackable = GetTargetQuantityMax();
9474 if (quantity > stackable)
9475 split_quantity_new = stackable;
9476 else
9477 split_quantity_new = quantity;
9478
9479 if (ShouldSplitQuantity(split_quantity_new))
9480 {
9481 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
9482 if (new_item)
9483 {
9484 new_item.SetResultOfSplit(true);
9485 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9486 AddQuantity(-split_quantity_new, false, true);
9487 new_item.SetQuantity(split_quantity_new, false, true);
9488 }
9489 }
9490 }
9491 }
9492
9493 void SplitIntoStackMaxHandsClient(PlayerBase player)
9494 {
9495 if (g_Game.IsClient())
9496 {
9497 if (ScriptInputUserData.CanStoreInputUserData())
9498 {
9499 ScriptInputUserData ctx = new ScriptInputUserData;
9501 ctx.Write(3);
9502 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9503 ctx.Write(i1);
9504 ItemBase destination_entity = this;
9505 ctx.Write(destination_entity);
9506 ctx.Write(true);
9507 ctx.Write(0);
9508 ctx.Send();
9509 }
9510 }
9511 else if (!g_Game.IsMultiplayer())
9512 {
9513 SplitIntoStackMaxHands(player);
9514 }
9515 }
9516
9517 void SplitIntoStackMaxHands(PlayerBase player)
9518 {
9519 float quantity = GetQuantity();
9520 float split_quantity_new;
9521 ref ItemBase new_item;
9522 if (player)
9523 {
9524 float stackable = GetTargetQuantityMax();
9525 if (quantity > stackable)
9526 split_quantity_new = stackable;
9527 else
9528 split_quantity_new = quantity;
9529
9530 if (ShouldSplitQuantity(split_quantity_new))
9531 {
9532 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
9533 new_item = ItemBase.Cast(in_hands);
9534 if (new_item)
9535 {
9536 new_item.SetResultOfSplit(true);
9537 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9538 AddQuantity(-split_quantity_new, false, true);
9539 new_item.SetQuantity(split_quantity_new, false, true);
9540 }
9541 }
9542 }
9543 }
9544
9545 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
9546 {
9547 float quantity = GetQuantity();
9548 float split_quantity_new = Math.Floor(quantity * 0.5);
9549
9550 if (!ShouldSplitQuantity(split_quantity_new))
9551 return;
9552
9553 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9554
9555 if (new_item)
9556 {
9557 if (new_item.GetQuantityMax() < split_quantity_new)
9558 {
9559 split_quantity_new = new_item.GetQuantityMax();
9560 }
9561
9562 new_item.SetResultOfSplit(true);
9563 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9564
9565 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9566 {
9567 AddQuantity(-1, false, true);
9568 new_item.SetQuantity(1, false, true);
9569 }
9570 else
9571 {
9572 AddQuantity(-split_quantity_new, false, true);
9573 new_item.SetQuantity(split_quantity_new, false, true);
9574 }
9575 }
9576 }
9577
9578 void SplitItem(PlayerBase player)
9579 {
9580 float quantity = GetQuantity();
9581 float split_quantity_new = Math.Floor(quantity / 2);
9582
9583 if (!ShouldSplitQuantity(split_quantity_new))
9584 return;
9585
9586 InventoryLocation invloc = new InventoryLocation;
9587 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
9588
9589 ItemBase new_item;
9590 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9591
9592 if (new_item)
9593 {
9594 if (new_item.GetQuantityMax() < split_quantity_new)
9595 {
9596 split_quantity_new = new_item.GetQuantityMax();
9597 }
9598 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9599 {
9600 AddQuantity(-1, false, true);
9601 new_item.SetQuantity(1, false, true);
9602 }
9603 else if (split_quantity_new > 1)
9604 {
9605 AddQuantity(-split_quantity_new, false, true);
9606 new_item.SetQuantity(split_quantity_new, false, true);
9607 }
9608 }
9609 }
9610
9612 void OnQuantityChanged(float delta)
9613 {
9614 SetWeightDirty();
9615 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
9616
9617 if (parent)
9618 parent.OnAttachmentQuantityChangedEx(this, delta);
9619
9620 if (IsLiquidContainer())
9621 {
9622 if (GetQuantityNormalized() <= 0.0)
9623 {
9625 }
9626 else if (GetLiquidType() == LIQUID_NONE)
9627 {
9628 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
9630 }
9631 }
9632 }
9633
9636 {
9637 // insert code here
9638 }
9639
9641 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
9642 {
9644 }
9645
9646 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
9647 {
9648 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9649
9650 if (g_Game.IsServer())
9651 {
9652 if (newLevel == GameConstants.STATE_RUINED)
9653 {
9655 EntityAI parent = GetHierarchyParent();
9656 if (parent && parent.IsFireplace())
9657 {
9658 CargoBase cargo = GetInventory().GetCargo();
9659 if (cargo)
9660 {
9661 for (int i = 0; i < cargo.GetItemCount(); ++i)
9662 {
9663 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
9664 }
9665 }
9666 }
9667 }
9668
9669 if (IsResultOfSplit())
9670 {
9671 // reset the splitting result flag, return to normal item behavior
9672 SetResultOfSplit(false);
9673 return;
9674 }
9675
9676 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9677 {
9678 SetCleanness(0);//unclean the item upon damage dealt
9679 }
9680 }
9681 }
9682
9683 // just the split? TODO: verify
9684 override void OnRightClick()
9685 {
9686 super.OnRightClick();
9687
9688 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
9689 {
9690 if (g_Game.IsClient())
9691 {
9692 if (ScriptInputUserData.CanStoreInputUserData())
9693 {
9694 EntityAI root = GetHierarchyRoot();
9695 Man playerOwner = GetHierarchyRootPlayer();
9696 InventoryLocation dst = new InventoryLocation;
9697
9698 // 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
9699 if (!playerOwner && root && root == this)
9700 {
9702 }
9703 else
9704 {
9705 // 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
9706 GetInventory().GetCurrentInventoryLocation(dst);
9707 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
9708 {
9709 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9710 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
9711 {
9713 }
9714 else
9715 {
9716 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
9717 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
9718 this shouldnt cause issues within this scope*/
9719 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
9720 {
9722 }
9723 else
9724 {
9725 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9726 }
9727 }
9728 }
9729 }
9730
9731 ScriptInputUserData ctx = new ScriptInputUserData;
9733 ctx.Write(4);
9734 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9735 ctx.Write(thiz);
9736 dst.WriteToContext(ctx);
9737 ctx.Write(true); // dummy
9738 ctx.Send();
9739 }
9740 }
9741 else if (!g_Game.IsMultiplayer())
9742 {
9743 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
9744 }
9745 }
9746 }
9747
9748 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
9749 {
9750 if (root)
9751 {
9752 vector m4[4];
9753 root.GetTransform(m4);
9754 dst.SetGround(this, m4);
9755 }
9756 else
9757 {
9758 GetInventory().GetCurrentInventoryLocation(dst);
9759 }
9760 }
9761
9762 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
9763 {
9764 //TODO: delete check zero quantity check after fix double posts hands fsm events
9765 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
9766 return false;
9767
9768 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9769 return false;
9770
9771 //can_this_be_combined = ConfigGetBool("canBeSplit");
9773 return false;
9774
9775
9776 Magazine mag = Magazine.Cast(this);
9777 if (mag)
9778 {
9779 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9780 return false;
9781
9782 if (stack_max_limit)
9783 {
9784 Magazine other_mag = Magazine.Cast(other_item);
9785 if (other_item)
9786 {
9787 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9788 return false;
9789 }
9790
9791 }
9792 }
9793 else
9794 {
9795 //TODO: delete check zero quantity check after fix double posts hands fsm events
9796 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
9797 return false;
9798
9799 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
9800 return false;
9801 }
9802
9803 PlayerBase player = null;
9804 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
9805 {
9806 if (player.GetInventory().HasAttachment(this))
9807 return false;
9808
9809 if (player.IsItemsToDelete())
9810 return false;
9811 }
9812
9813 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9814 return false;
9815
9816 int slotID;
9817 string slotName;
9818 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9819 return false;
9820
9821 return true;
9822 }
9823
9824 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
9825 {
9826 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
9827 }
9828
9829 bool IsResultOfSplit()
9830 {
9831 return m_IsResultOfSplit;
9832 }
9833
9834 void SetResultOfSplit(bool value)
9835 {
9836 m_IsResultOfSplit = value;
9837 }
9838
9839 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
9840 {
9841 return ComputeQuantityUsedEx(other_item, use_stack_max);
9842 }
9843
9844 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
9845 {
9846 float other_item_quantity = other_item.GetQuantity();
9847 float this_free_space;
9848
9849 float stack_max = GetQuantityMax();
9850
9851 this_free_space = stack_max - GetQuantity();
9852
9853 if (other_item_quantity > this_free_space)
9854 {
9855 return this_free_space;
9856 }
9857 else
9858 {
9859 return other_item_quantity;
9860 }
9861 }
9862
9863 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
9864 {
9865 CombineItems(ItemBase.Cast(entity2),use_stack_max);
9866 }
9867
9868 void CombineItems(ItemBase other_item, bool use_stack_max = true)
9869 {
9870 if (!CanBeCombined(other_item, false))
9871 return;
9872
9873 if (!IsMagazine() && other_item)
9874 {
9875 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
9876 if (quantity_used != 0)
9877 {
9878 float hp1 = GetHealth01("","");
9879 float hp2 = other_item.GetHealth01("","");
9880 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
9881 hpResult = hpResult / (GetQuantity() + quantity_used);
9882
9883 hpResult *= GetMaxHealth();
9884 Math.Round(hpResult);
9885 SetHealth("", "Health", hpResult);
9886
9887 AddQuantity(quantity_used);
9888 other_item.AddQuantity(-quantity_used);
9889 }
9890 }
9891 OnCombine(other_item);
9892 }
9893
9894 void OnCombine(ItemBase other_item)
9895 {
9896 #ifdef SERVER
9897 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9898 GetHierarchyParent().IncreaseLifetimeUp();
9899 #endif
9900 };
9901
9902 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
9903 {
9904 PlayerBase p = PlayerBase.Cast(player);
9905
9906 array<int> recipesIds = p.m_Recipes;
9907 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
9908 if (moduleRecipesManager)
9909 {
9910 EntityAI itemInHands = player.GetEntityInHands();
9911 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
9912 }
9913
9914 for (int i = 0;i < recipesIds.Count(); i++)
9915 {
9916 int key = recipesIds.Get(i);
9917 string recipeName = moduleRecipesManager.GetRecipeName(key);
9918 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
9919 }
9920 }
9921
9922 // -------------------------------------------------------------------------
9923 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9924 {
9925 super.GetDebugActions(outputList);
9926
9927 //quantity
9928 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
9929 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
9930 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
9931 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
9932 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9933
9934 //health
9935 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
9936 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
9937 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
9938 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9939 //temperature
9940 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
9941 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
9942 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
9943 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9944
9945 //wet
9946 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
9947 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
9948 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9949
9950 //liquidtype
9951 if (IsLiquidContainer())
9952 {
9953 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
9954 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
9955 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9956 }
9957
9958 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
9959 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9960
9961 // watch
9962 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
9963 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
9964 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9965
9966 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
9967
9968 InventoryLocation loc = new InventoryLocation();
9969 GetInventory().GetCurrentInventoryLocation(loc);
9970 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
9971 {
9972 if (Gizmo_IsSupported())
9973 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
9974 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
9975 }
9976
9977 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9978 }
9979
9980 // -------------------------------------------------------------------------
9981 // -------------------------------------------------------------------------
9982 // -------------------------------------------------------------------------
9983 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
9984 {
9985 super.OnAction(action_id, player, ctx);
9986
9987 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
9988 {
9989 switch (action_id)
9990 {
9991 case EActions.GIZMO_OBJECT:
9992 if (GetGizmoApi())
9993 GetGizmoApi().SelectObject(this);
9994 return true;
9995 case EActions.GIZMO_PHYSICS:
9996 if (GetGizmoApi())
9997 GetGizmoApi().SelectPhysics(GetPhysics());
9998 return true;
9999 }
10000 }
10001
10002 if (g_Game.IsServer())
10003 {
10004 switch (action_id)
10005 {
10006 case EActions.DELETE:
10007 Delete();
10008 return true;
10009 }
10010 }
10011
10012 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10013 {
10014 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10015 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10016 PlayerBase p = PlayerBase.Cast(player);
10017 if (EActions.RECIPES_RANGE_START < 1000)
10018 {
10019 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10020 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10021 }
10022 }
10023 #ifndef SERVER
10024 else if (action_id == EActions.WATCH_PLAYER)
10025 {
10026 PluginDeveloper.SetDeveloperItemClientEx(player);
10027 }
10028 #endif
10029 if (g_Game.IsServer())
10030 {
10031 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10032 {
10033 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10034 OnDebugButtonPressServer(id + 1);
10035 }
10036
10037 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10038 {
10039 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10040 InsertAgent(agent_id,100);
10041 }
10042
10043 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10044 {
10045 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10046 RemoveAgent(agent_id2);
10047 }
10048
10049 else if (action_id == EActions.ADD_QUANTITY)
10050 {
10051 if (IsMagazine())
10052 {
10053 Magazine mag = Magazine.Cast(this);
10054 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10055 }
10056 else
10057 {
10058 AddQuantity(GetQuantityMax() * 0.2);
10059 }
10060
10061 if (m_EM)
10062 {
10063 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10064 }
10065 //PrintVariables();
10066 }
10067
10068 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10069 {
10070 if (IsMagazine())
10071 {
10072 Magazine mag2 = Magazine.Cast(this);
10073 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10074 }
10075 else
10076 {
10077 AddQuantity(- GetQuantityMax() * 0.2);
10078 }
10079 if (m_EM)
10080 {
10081 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10082 }
10083 //PrintVariables();
10084 }
10085
10086 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10087 {
10088 SetQuantity(0);
10089
10090 if (m_EM)
10091 {
10092 m_EM.SetEnergy(0);
10093 }
10094 }
10095
10096 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10097 {
10099
10100 if (m_EM)
10101 {
10102 m_EM.SetEnergy(m_EM.GetEnergyMax());
10103 }
10104 }
10105
10106 else if (action_id == EActions.ADD_HEALTH)
10107 {
10108 AddHealth("","",GetMaxHealth("","Health")/5);
10109 }
10110 else if (action_id == EActions.REMOVE_HEALTH)
10111 {
10112 AddHealth("","",-GetMaxHealth("","Health")/5);
10113 }
10114 else if (action_id == EActions.DESTROY_HEALTH)
10115 {
10116 SetHealth01("","",0);
10117 }
10118 else if (action_id == EActions.WATCH_ITEM)
10119 {
10121 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
10122 #ifdef DEVELOPER
10123 SetDebugDeveloper_item(this);
10124 #endif
10125 }
10126
10127 else if (action_id == EActions.ADD_TEMPERATURE)
10128 {
10129 AddTemperature(20);
10130 //PrintVariables();
10131 }
10132
10133 else if (action_id == EActions.REMOVE_TEMPERATURE)
10134 {
10135 AddTemperature(-20);
10136 //PrintVariables();
10137 }
10138
10139 else if (action_id == EActions.FLIP_FROZEN)
10140 {
10141 SetFrozen(!GetIsFrozen());
10142 //PrintVariables();
10143 }
10144
10145 else if (action_id == EActions.ADD_WETNESS)
10146 {
10147 AddWet(GetWetMax()/5);
10148 //PrintVariables();
10149 }
10150
10151 else if (action_id == EActions.REMOVE_WETNESS)
10152 {
10153 AddWet(-GetWetMax()/5);
10154 //PrintVariables();
10155 }
10156
10157 else if (action_id == EActions.LIQUIDTYPE_UP)
10158 {
10159 int curr_type = GetLiquidType();
10160 SetLiquidType(curr_type * 2);
10161 //AddWet(1);
10162 //PrintVariables();
10163 }
10164
10165 else if (action_id == EActions.LIQUIDTYPE_DOWN)
10166 {
10167 int curr_type2 = GetLiquidType();
10168 SetLiquidType(curr_type2 / 2);
10169 }
10170
10171 else if (action_id == EActions.MAKE_SPECIAL)
10172 {
10173 auto debugParams = DebugSpawnParams.WithPlayer(player);
10174 OnDebugSpawnEx(debugParams);
10175 }
10176
10177 }
10178
10179
10180 return false;
10181 }
10182
10183 // -------------------------------------------------------------------------
10184
10185
10188 void OnActivatedByTripWire();
10189
10191 void OnActivatedByItem(notnull ItemBase item);
10192
10193 //----------------------------------------------------------------
10194 //returns true if item is able to explode when put in fire
10195 bool CanExplodeInFire()
10196 {
10197 return false;
10198 }
10199
10200 //----------------------------------------------------------------
10201 bool CanEat()
10202 {
10203 return true;
10204 }
10205
10206 //----------------------------------------------------------------
10207 override bool IsIgnoredByConstruction()
10208 {
10209 return true;
10210 }
10211
10212 //----------------------------------------------------------------
10213 //has FoodStages in config?
10214 bool HasFoodStage()
10215 {
10216 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
10217 return g_Game.ConfigIsExisting(config_path);
10218 }
10219
10221 FoodStage GetFoodStage()
10222 {
10223 return null;
10224 }
10225
10226 bool CanBeCooked()
10227 {
10228 return false;
10229 }
10230
10231 bool CanBeCookedOnStick()
10232 {
10233 return false;
10234 }
10235
10237 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
10239
10240 //----------------------------------------------------------------
10241 bool CanRepair(ItemBase item_repair_kit)
10242 {
10243 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10244 return module_repairing.CanRepair(this, item_repair_kit);
10245 }
10246
10247 //----------------------------------------------------------------
10248 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
10249 {
10250 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10251 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10252 }
10253
10254 //----------------------------------------------------------------
10255 int GetItemSize()
10256 {
10257 /*
10258 vector v_size = this.ConfigGetVector("itemSize");
10259 int v_size_x = v_size[0];
10260 int v_size_y = v_size[1];
10261 int size = v_size_x * v_size_y;
10262 return size;
10263 */
10264
10265 return 1;
10266 }
10267
10268 //----------------------------------------------------------------
10269 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10270 bool CanBeMovedOverride()
10271 {
10272 return m_CanBeMovedOverride;
10273 }
10274
10275 //----------------------------------------------------------------
10276 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10277 void SetCanBeMovedOverride(bool setting)
10278 {
10279 m_CanBeMovedOverride = setting;
10280 }
10281
10282 //----------------------------------------------------------------
10290 void MessageToOwnerStatus(string text)
10291 {
10292 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10293
10294 if (player)
10295 {
10296 player.MessageStatus(text);
10297 }
10298 }
10299
10300 //----------------------------------------------------------------
10308 void MessageToOwnerAction(string text)
10309 {
10310 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10311
10312 if (player)
10313 {
10314 player.MessageAction(text);
10315 }
10316 }
10317
10318 //----------------------------------------------------------------
10326 void MessageToOwnerFriendly(string text)
10327 {
10328 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10329
10330 if (player)
10331 {
10332 player.MessageFriendly(text);
10333 }
10334 }
10335
10336 //----------------------------------------------------------------
10344 void MessageToOwnerImportant(string text)
10345 {
10346 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10347
10348 if (player)
10349 {
10350 player.MessageImportant(text);
10351 }
10352 }
10353
10354 override bool IsItemBase()
10355 {
10356 return true;
10357 }
10358
10359 // Checks if item is of questioned kind
10360 override bool KindOf(string tag)
10361 {
10362 bool found = false;
10363 string item_name = this.GetType();
10364 ref TStringArray item_tag_array = new TStringArray;
10365 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
10366
10367 int array_size = item_tag_array.Count();
10368 for (int i = 0; i < array_size; i++)
10369 {
10370 if (item_tag_array.Get(i) == tag)
10371 {
10372 found = true;
10373 break;
10374 }
10375 }
10376 return found;
10377 }
10378
10379
10380 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
10381 {
10382 //Debug.Log("OnRPC called");
10383 super.OnRPC(sender, rpc_type,ctx);
10384
10385 //Play soundset for attachment locking (ActionLockAttachment.c)
10386 switch (rpc_type)
10387 {
10388 #ifndef SERVER
10389 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10390 Param2<bool, string> p = new Param2<bool, string>(false, "");
10391
10392 if (!ctx.Read(p))
10393 return;
10394
10395 bool play = p.param1;
10396 string soundSet = p.param2;
10397
10398 if (play)
10399 {
10400 if (m_LockingSound)
10401 {
10403 {
10404 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10405 }
10406 }
10407 else
10408 {
10409 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10410 }
10411 }
10412 else
10413 {
10414 SEffectManager.DestroyEffect(m_LockingSound);
10415 }
10416
10417 break;
10418 #endif
10419
10420 }
10421
10422 if (GetWrittenNoteData())
10423 {
10424 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
10425 }
10426 }
10427
10428 //-----------------------------
10429 // VARIABLE MANIPULATION SYSTEM
10430 //-----------------------------
10431 int NameToID(string name)
10432 {
10433 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10434 return plugin.GetID(name);
10435 }
10436
10437 string IDToName(int id)
10438 {
10439 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10440 return plugin.GetName(id);
10441 }
10442
10444 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
10445 {
10446 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
10447 //read the flags
10448 int varFlags;
10449 if (!ctx.Read(varFlags))
10450 return;
10451
10452 if (varFlags & ItemVariableFlags.FLOAT)
10453 {
10454 ReadVarsFromCTX(ctx);
10455 }
10456 }
10457
10458 override void SerializeNumericalVars(array<float> floats_out)
10459 {
10460 //some variables handled on EntityAI level already!
10461 super.SerializeNumericalVars(floats_out);
10462
10463 // the order of serialization must be the same as the order of de-serialization
10464 //--------------------------------------------
10465 if (IsVariableSet(VARIABLE_QUANTITY))
10466 {
10467 floats_out.Insert(m_VarQuantity);
10468 }
10469 //--------------------------------------------
10470 if (IsVariableSet(VARIABLE_WET))
10471 {
10472 floats_out.Insert(m_VarWet);
10473 }
10474 //--------------------------------------------
10475 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10476 {
10477 floats_out.Insert(m_VarLiquidType);
10478 }
10479 //--------------------------------------------
10480 if (IsVariableSet(VARIABLE_COLOR))
10481 {
10482 floats_out.Insert(m_ColorComponentR);
10483 floats_out.Insert(m_ColorComponentG);
10484 floats_out.Insert(m_ColorComponentB);
10485 floats_out.Insert(m_ColorComponentA);
10486 }
10487 //--------------------------------------------
10488 if (IsVariableSet(VARIABLE_CLEANNESS))
10489 {
10490 floats_out.Insert(m_Cleanness);
10491 }
10492 }
10493
10494 override void DeSerializeNumericalVars(array<float> floats)
10495 {
10496 //some variables handled on EntityAI level already!
10497 super.DeSerializeNumericalVars(floats);
10498
10499 // the order of serialization must be the same as the order of de-serialization
10500 int index = 0;
10501 int mask = Math.Round(floats.Get(index));
10502
10503 index++;
10504 //--------------------------------------------
10505 if (mask & VARIABLE_QUANTITY)
10506 {
10507 if (m_IsStoreLoad)
10508 {
10509 SetStoreLoadedQuantity(floats.Get(index));
10510 }
10511 else
10512 {
10513 float quantity = floats.Get(index);
10514 SetQuantity(quantity, true, false, false, false);
10515 }
10516 index++;
10517 }
10518 //--------------------------------------------
10519 if (mask & VARIABLE_WET)
10520 {
10521 float wet = floats.Get(index);
10522 SetWet(wet);
10523 index++;
10524 }
10525 //--------------------------------------------
10526 if (mask & VARIABLE_LIQUIDTYPE)
10527 {
10528 int liquidtype = Math.Round(floats.Get(index));
10529 SetLiquidType(liquidtype);
10530 index++;
10531 }
10532 //--------------------------------------------
10533 if (mask & VARIABLE_COLOR)
10534 {
10535 m_ColorComponentR = Math.Round(floats.Get(index));
10536 index++;
10537 m_ColorComponentG = Math.Round(floats.Get(index));
10538 index++;
10539 m_ColorComponentB = Math.Round(floats.Get(index));
10540 index++;
10541 m_ColorComponentA = Math.Round(floats.Get(index));
10542 index++;
10543 }
10544 //--------------------------------------------
10545 if (mask & VARIABLE_CLEANNESS)
10546 {
10547 int cleanness = Math.Round(floats.Get(index));
10548 SetCleanness(cleanness);
10549 index++;
10550 }
10551 }
10552
10553 override void WriteVarsToCTX(ParamsWriteContext ctx)
10554 {
10555 super.WriteVarsToCTX(ctx);
10556
10557 //--------------------------------------------
10558 if (IsVariableSet(VARIABLE_QUANTITY))
10559 {
10560 ctx.Write(GetQuantity());
10561 }
10562 //--------------------------------------------
10563 if (IsVariableSet(VARIABLE_WET))
10564 {
10565 ctx.Write(GetWet());
10566 }
10567 //--------------------------------------------
10568 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10569 {
10570 ctx.Write(GetLiquidType());
10571 }
10572 //--------------------------------------------
10573 if (IsVariableSet(VARIABLE_COLOR))
10574 {
10575 int r,g,b,a;
10576 GetColor(r,g,b,a);
10577 ctx.Write(r);
10578 ctx.Write(g);
10579 ctx.Write(b);
10580 ctx.Write(a);
10581 }
10582 //--------------------------------------------
10583 if (IsVariableSet(VARIABLE_CLEANNESS))
10584 {
10585 ctx.Write(GetCleanness());
10586 }
10587 }
10588
10589 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
10590 {
10591 if (!super.ReadVarsFromCTX(ctx,version))
10592 return false;
10593
10594 int intValue;
10595 float value;
10596
10597 if (version < 140)
10598 {
10599 if (!ctx.Read(intValue))
10600 return false;
10601
10602 m_VariablesMask = intValue;
10603 }
10604
10605 if (m_VariablesMask & VARIABLE_QUANTITY)
10606 {
10607 if (!ctx.Read(value))
10608 return false;
10609
10610 if (IsStoreLoad())
10611 {
10613 }
10614 else
10615 {
10616 SetQuantity(value, true, false, false, false);
10617 }
10618 }
10619 //--------------------------------------------
10620 if (version < 140)
10621 {
10622 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10623 {
10624 if (!ctx.Read(value))
10625 return false;
10626 SetTemperatureDirect(value);
10627 }
10628 }
10629 //--------------------------------------------
10630 if (m_VariablesMask & VARIABLE_WET)
10631 {
10632 if (!ctx.Read(value))
10633 return false;
10634 SetWet(value);
10635 }
10636 //--------------------------------------------
10637 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
10638 {
10639 if (!ctx.Read(intValue))
10640 return false;
10641 SetLiquidType(intValue);
10642 }
10643 //--------------------------------------------
10644 if (m_VariablesMask & VARIABLE_COLOR)
10645 {
10646 int r,g,b,a;
10647 if (!ctx.Read(r))
10648 return false;
10649 if (!ctx.Read(g))
10650 return false;
10651 if (!ctx.Read(b))
10652 return false;
10653 if (!ctx.Read(a))
10654 return false;
10655
10656 SetColor(r,g,b,a);
10657 }
10658 //--------------------------------------------
10659 if (m_VariablesMask & VARIABLE_CLEANNESS)
10660 {
10661 if (!ctx.Read(intValue))
10662 return false;
10663 SetCleanness(intValue);
10664 }
10665 //--------------------------------------------
10666 if (version >= 138 && version < 140)
10667 {
10668 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10669 {
10670 if (!ctx.Read(intValue))
10671 return false;
10672 SetFrozen(intValue);
10673 }
10674 }
10675
10676 return true;
10677 }
10678
10679 //----------------------------------------------------------------
10680 override bool OnStoreLoad(ParamsReadContext ctx, int version)
10681 {
10682 m_IsStoreLoad = true;
10684 {
10685 m_FixDamageSystemInit = true;
10686 }
10687
10688 if (!super.OnStoreLoad(ctx, version))
10689 {
10690 m_IsStoreLoad = false;
10691 return false;
10692 }
10693
10694 if (version >= 114)
10695 {
10696 bool hasQuickBarIndexSaved;
10697
10698 if (!ctx.Read(hasQuickBarIndexSaved))
10699 {
10700 m_IsStoreLoad = false;
10701 return false;
10702 }
10703
10704 if (hasQuickBarIndexSaved)
10705 {
10706 int itmQBIndex;
10707
10708 //Load quickbar item bind
10709 if (!ctx.Read(itmQBIndex))
10710 {
10711 m_IsStoreLoad = false;
10712 return false;
10713 }
10714
10715 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10716 if (itmQBIndex != -1 && parentPlayer)
10717 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10718 }
10719 }
10720 else
10721 {
10722 // Backup of how it used to be
10723 PlayerBase player;
10724 int itemQBIndex;
10725 if (version == int.MAX)
10726 {
10727 if (!ctx.Read(itemQBIndex))
10728 {
10729 m_IsStoreLoad = false;
10730 return false;
10731 }
10732 }
10733 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10734 {
10735 //Load quickbar item bind
10736 if (!ctx.Read(itemQBIndex))
10737 {
10738 m_IsStoreLoad = false;
10739 return false;
10740 }
10741 if (itemQBIndex != -1 && player)
10742 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10743 }
10744 }
10745
10746 if (version < 140)
10747 {
10748 // variable management system
10749 if (!LoadVariables(ctx, version))
10750 {
10751 m_IsStoreLoad = false;
10752 return false;
10753 }
10754 }
10755
10756 //agent trasmission system
10757 if (!LoadAgents(ctx, version))
10758 {
10759 m_IsStoreLoad = false;
10760 return false;
10761 }
10762 if (version >= 132)
10763 {
10764 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10765 if (raib)
10766 {
10767 if (!raib.OnStoreLoad(ctx,version))
10768 {
10769 m_IsStoreLoad = false;
10770 return false;
10771 }
10772 }
10773 }
10774
10775 m_IsStoreLoad = false;
10776 return true;
10777 }
10778
10779 //----------------------------------------------------------------
10780
10781 override void OnStoreSave(ParamsWriteContext ctx)
10782 {
10783 super.OnStoreSave(ctx);
10784
10785 PlayerBase player;
10786 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10787 {
10788 ctx.Write(true); // Keep track of if we should actually read this in or not
10789 //Save quickbar item bind
10790 int itemQBIndex = -1;
10791 itemQBIndex = player.FindQuickBarEntityIndex(this);
10792 ctx.Write(itemQBIndex);
10793 }
10794 else
10795 {
10796 ctx.Write(false); // Keep track of if we should actually read this in or not
10797 }
10798
10799 SaveAgents(ctx);//agent trasmission system
10800
10801 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10802 if (raib)
10803 {
10804 raib.OnStoreSave(ctx);
10805 }
10806 }
10807 //----------------------------------------------------------------
10808
10809 override void AfterStoreLoad()
10810 {
10811 super.AfterStoreLoad();
10812
10814 {
10816 }
10817
10818 if (GetStoreLoadedQuantity() != float.LOWEST)
10819 {
10821 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
10822 }
10823 }
10824
10825 override void EEOnAfterLoad()
10826 {
10827 super.EEOnAfterLoad();
10828
10830 {
10831 m_FixDamageSystemInit = false;
10832 }
10833
10836 }
10837
10838 bool CanBeDisinfected()
10839 {
10840 return false;
10841 }
10842
10843
10844 //----------------------------------------------------------------
10845 override void OnVariablesSynchronized()
10846 {
10847 if (m_Initialized)
10848 {
10849 #ifdef PLATFORM_CONSOLE
10850 //bruteforce it is
10851 if (IsSplitable())
10852 {
10853 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
10854 if (menu)
10855 {
10856 menu.Refresh();
10857 }
10858 }
10859 #endif
10860 }
10861
10863 {
10864 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10865 m_WantPlayImpactSound = false;
10866 }
10867
10869 {
10870 SetWeightDirty();
10872 }
10873 if (m_VarWet != m_VarWetPrev)
10874 {
10877 }
10878
10879 if (m_SoundSyncPlay != 0)
10880 {
10883
10884 m_SoundSyncPlay = 0;
10885 m_SoundSyncSlotID = -1;
10886 }
10887 if (m_SoundSyncStop != 0)
10888 {
10890 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
10891 m_SoundSyncStop = 0;
10892 }
10893
10894 super.OnVariablesSynchronized();
10895 }
10896
10897 //------------------------- Quantity
10898 //----------------------------------------------------------------
10900 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
10901 {
10902 if (!IsServerCheck(allow_client))
10903 return false;
10904
10905 if (!HasQuantity())
10906 return false;
10907
10908 float min = GetQuantityMin();
10909 float max = GetQuantityMax();
10910
10911 if (value <= (min + 0.001))
10912 value = min;
10913
10914 if (value == min)
10915 {
10916 if (destroy_config)
10917 {
10918 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10919 if (dstr)
10920 {
10921 m_VarQuantity = Math.Clamp(value, min, max);
10922 this.Delete();
10923 return true;
10924 }
10925 }
10926 else if (destroy_forced)
10927 {
10928 m_VarQuantity = Math.Clamp(value, min, max);
10929 this.Delete();
10930 return true;
10931 }
10932 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
10933 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
10934 }
10935
10936 float delta = m_VarQuantity;
10937 m_VarQuantity = Math.Clamp(value, min, max);
10938
10939 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10940 {
10941 EntityAI parent = GetHierarchyRoot();
10942 InventoryLocation iLoc = new InventoryLocation();
10943 GetInventory().GetCurrentInventoryLocation(iLoc);
10944 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
10945 {
10946 int iLocSlot = iLoc.GetSlot();
10947 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
10948 {
10949 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
10950 }
10951 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
10952 {
10953 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
10954 }
10955 }
10956 }
10957
10958 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
10959 {
10960 delta = m_VarQuantity - delta;
10961
10962 if (delta)
10963 OnQuantityChanged(delta);
10964 }
10965
10966 SetVariableMask(VARIABLE_QUANTITY);
10967
10968 return false;
10969 }
10970
10971 //----------------------------------------------------------------
10973 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
10974 {
10975 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
10976 }
10977 //----------------------------------------------------------------
10978 void SetQuantityMax()
10979 {
10980 float max = GetQuantityMax();
10981 SetQuantity(max);
10982 }
10983
10984 override void SetQuantityToMinimum()
10985 {
10986 float min = GetQuantityMin();
10987 SetQuantity(min);
10988 }
10989 //----------------------------------------------------------------
10991 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
10992 {
10993 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
10994 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
10995 SetQuantity(result, destroy_config, destroy_forced);
10996 }
10997
10998 //----------------------------------------------------------------
11000 override float GetQuantityNormalized()
11001 {
11002 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11003 }
11004
11006 {
11007 return GetQuantityNormalized();
11008 }
11009
11010 /*void SetAmmoNormalized(float value)
11011 {
11012 float value_clamped = Math.Clamp(value, 0, 1);
11013 Magazine this_mag = Magazine.Cast(this);
11014 int max_rounds = this_mag.GetAmmoMax();
11015 int result = value * max_rounds;//can the rounded if higher precision is required
11016 this_mag.SetAmmoCount(result);
11017 }*/
11018 //----------------------------------------------------------------
11019 override int GetQuantityMax()
11020 {
11021 int slot = -1;
11022 GameInventory inventory = GetInventory();
11023 if (inventory)
11024 {
11025 InventoryLocation il = new InventoryLocation;
11026 inventory.GetCurrentInventoryLocation(il);
11027 slot = il.GetSlot();
11028 }
11029
11030 return GetTargetQuantityMax(slot);
11031 }
11032
11033 override int GetTargetQuantityMax(int attSlotID = -1)
11034 {
11035 float quantity_max = 0;
11036
11037 if (IsSplitable()) //only stackable/splitable items can check for stack size
11038 {
11039 if (attSlotID != -1)
11040 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11041
11042 if (quantity_max <= 0)
11043 quantity_max = m_VarStackMax;
11044 }
11045
11046 if (quantity_max <= 0)
11047 quantity_max = m_VarQuantityMax;
11048
11049 return quantity_max;
11050 }
11051 //----------------------------------------------------------------
11052 override int GetQuantityMin()
11053 {
11054 return m_VarQuantityMin;
11055 }
11056 //----------------------------------------------------------------
11057 int GetQuantityInit()
11058 {
11059 return m_VarQuantityInit;
11060 }
11061
11062 //----------------------------------------------------------------
11063 override bool HasQuantity()
11064 {
11065 return !(GetQuantityMax() - GetQuantityMin() == 0);
11066 }
11067
11068 override float GetQuantity()
11069 {
11070 return m_VarQuantity;
11071 }
11072
11073 bool IsFullQuantity()
11074 {
11075 return GetQuantity() >= GetQuantityMax();
11076 }
11077
11078 //Calculates weight of single item without attachments and cargo
11079 override float GetSingleInventoryItemWeightEx()
11080 {
11081 //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
11082 float weightEx = GetWeightEx();//overall weight of the item
11083 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11084 return weightEx - special;
11085 }
11086
11087 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11089 {
11091 }
11092
11093 override protected float GetWeightSpecialized(bool forceRecalc = false)
11094 {
11095 if (IsSplitable()) //quantity determines size of the stack
11096 {
11097 #ifdef DEVELOPER
11098 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11099 {
11100 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11101 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
11102 }
11103 #endif
11104
11105 return GetQuantity() * GetConfigWeightModified();
11106 }
11107 else if (HasEnergyManager())// items with energy manager
11108 {
11109 #ifdef DEVELOPER
11110 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11111 {
11112 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11113 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
11114 }
11115 #endif
11116 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11117 }
11118 else//everything else
11119 {
11120 #ifdef DEVELOPER
11121 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11122 {
11123 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11124 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
11125 }
11126 #endif
11127 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11128 }
11129 }
11130
11132 int GetNumberOfItems()
11133 {
11134 int item_count = 0;
11135 ItemBase item;
11136
11137 GameInventory inventory = GetInventory();
11138 CargoBase cargo = inventory.GetCargo();
11139 if (cargo != NULL)
11140 {
11141 item_count = cargo.GetItemCount();
11142 }
11143
11144 int nAttachments = inventory.AttachmentCount();
11145 for (int i = 0; i < nAttachments; ++i)
11146 {
11147 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
11148 if (item)
11149 item_count += item.GetNumberOfItems();
11150 }
11151 return item_count;
11152 }
11153
11155 float GetUnitWeight(bool include_wetness = true)
11156 {
11157 float weight = 0;
11158 float wetness = 1;
11159 if (include_wetness)
11160 wetness += GetWet();
11161 if (IsSplitable()) //quantity determines size of the stack
11162 {
11163 weight = wetness * m_ConfigWeight;
11164 }
11165 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
11166 {
11167 weight = 1;
11168 }
11169 return weight;
11170 }
11171
11172 //-----------------------------------------------------------------
11173
11174 override void ClearInventory()
11175 {
11176 GameInventory inventory = GetInventory();
11177 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
11178 {
11179 array<EntityAI> items = new array<EntityAI>;
11180 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
11181 for (int i = 0; i < items.Count(); ++i)
11182 {
11183 ItemBase item = ItemBase.Cast(items.Get(i));
11184 if (item)
11185 {
11186 g_Game.ObjectDelete(item);
11187 }
11188 }
11189 }
11190 }
11191
11192 //------------------------- Energy
11193
11194 //----------------------------------------------------------------
11195 float GetEnergy()
11196 {
11197 float energy = 0;
11198 if (HasEnergyManager())
11199 {
11200 energy = GetCompEM().GetEnergy();
11201 }
11202 return energy;
11203 }
11204
11205
11206 override void OnEnergyConsumed()
11207 {
11208 super.OnEnergyConsumed();
11209
11211 }
11212
11213 override void OnEnergyAdded()
11214 {
11215 super.OnEnergyAdded();
11216
11218 }
11219
11220 // Converts energy (from Energy Manager) to quantity, if enabled.
11222 {
11223 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11224 {
11225 if (HasQuantity())
11226 {
11227 float energy_0to1 = GetCompEM().GetEnergy0To1();
11228 SetQuantityNormalized(energy_0to1);
11229 }
11230 }
11231 }
11232
11233 //----------------------------------------------------------------
11234 float GetHeatIsolationInit()
11235 {
11236 return ConfigGetFloat("heatIsolation");
11237 }
11238
11239 float GetHeatIsolation()
11240 {
11241 return m_HeatIsolation;
11242 }
11243
11244 float GetDryingIncrement(string pIncrementName)
11245 {
11246 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
11247 if (g_Game.ConfigIsExisting(paramPath))
11248 return g_Game.ConfigGetFloat(paramPath);
11249
11250 return 0.0;
11251 }
11252
11253 float GetSoakingIncrement(string pIncrementName)
11254 {
11255 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
11256 if (g_Game.ConfigIsExisting(paramPath))
11257 return g_Game.ConfigGetFloat(paramPath);
11258
11259 return 0.0;
11260 }
11261 //----------------------------------------------------------------
11262 override void SetWet(float value, bool allow_client = false)
11263 {
11264 if (!IsServerCheck(allow_client))
11265 return;
11266
11267 float min = GetWetMin();
11268 float max = GetWetMax();
11269
11270 float previousValue = m_VarWet;
11271
11272 m_VarWet = Math.Clamp(value, min, max);
11273
11274 if (previousValue != m_VarWet)
11275 {
11276 SetVariableMask(VARIABLE_WET);
11277 OnWetChanged(m_VarWet, previousValue);
11278 }
11279 }
11280 //----------------------------------------------------------------
11281 override void AddWet(float value)
11282 {
11283 SetWet(GetWet() + value);
11284 }
11285 //----------------------------------------------------------------
11286 override void SetWetMax()
11287 {
11289 }
11290 //----------------------------------------------------------------
11291 override float GetWet()
11292 {
11293 return m_VarWet;
11294 }
11295 //----------------------------------------------------------------
11296 override float GetWetMax()
11297 {
11298 return m_VarWetMax;
11299 }
11300 //----------------------------------------------------------------
11301 override float GetWetMin()
11302 {
11303 return m_VarWetMin;
11304 }
11305 //----------------------------------------------------------------
11306 override float GetWetInit()
11307 {
11308 return m_VarWetInit;
11309 }
11310 //----------------------------------------------------------------
11311 override void OnWetChanged(float newVal, float oldVal)
11312 {
11313 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
11314 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
11315 if (newLevel != oldLevel)
11316 {
11317 OnWetLevelChanged(newLevel,oldLevel);
11318 }
11319 }
11320
11321 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
11322 {
11323 SetWeightDirty();
11324 }
11325
11326 override EWetnessLevel GetWetLevel()
11327 {
11328 return GetWetLevelInternal(m_VarWet);
11329 }
11330
11331 //----------------------------------------------------------------
11332
11333 override void SetStoreLoad(bool value)
11334 {
11335 m_IsStoreLoad = value;
11336 }
11337
11338 override bool IsStoreLoad()
11339 {
11340 return m_IsStoreLoad;
11341 }
11342
11343 override void SetStoreLoadedQuantity(float value)
11344 {
11345 m_StoreLoadedQuantity = value;
11346 }
11347
11348 override float GetStoreLoadedQuantity()
11349 {
11350 return m_StoreLoadedQuantity;
11351 }
11352
11353 //----------------------------------------------------------------
11354
11355 float GetItemModelLength()
11356 {
11357 if (ConfigIsExisting("itemModelLength"))
11358 {
11359 return ConfigGetFloat("itemModelLength");
11360 }
11361 return 0;
11362 }
11363
11364 float GetItemAttachOffset()
11365 {
11366 if (ConfigIsExisting("itemAttachOffset"))
11367 {
11368 return ConfigGetFloat("itemAttachOffset");
11369 }
11370 return 0;
11371 }
11372
11373 override void SetCleanness(int value, bool allow_client = false)
11374 {
11375 if (!IsServerCheck(allow_client))
11376 return;
11377
11378 int previousValue = m_Cleanness;
11379
11380 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
11381
11382 if (previousValue != m_Cleanness)
11383 SetVariableMask(VARIABLE_CLEANNESS);
11384 }
11385
11386 override int GetCleanness()
11387 {
11388 return m_Cleanness;
11389 }
11390
11392 {
11393 return true;
11394 }
11395
11396 //----------------------------------------------------------------
11397 // ATTACHMENT LOCKING
11398 // Getters relevant to generic ActionLockAttachment
11399 int GetLockType()
11400 {
11401 return m_LockType;
11402 }
11403
11404 string GetLockSoundSet()
11405 {
11406 return m_LockSoundSet;
11407 }
11408
11409 //----------------------------------------------------------------
11410 //------------------------- Color
11411 // sets items color variable given color components
11412 override void SetColor(int r, int g, int b, int a)
11413 {
11418 SetVariableMask(VARIABLE_COLOR);
11419 }
11421 override void GetColor(out int r,out int g,out int b,out int a)
11422 {
11427 }
11428
11429 bool IsColorSet()
11430 {
11431 return IsVariableSet(VARIABLE_COLOR);
11432 }
11433
11435 string GetColorString()
11436 {
11437 int r,g,b,a;
11438 GetColor(r,g,b,a);
11439 r = r/255;
11440 g = g/255;
11441 b = b/255;
11442 a = a/255;
11443 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11444 }
11445 //----------------------------------------------------------------
11446 //------------------------- LiquidType
11447
11448 override void SetLiquidType(int value, bool allow_client = false)
11449 {
11450 if (!IsServerCheck(allow_client))
11451 return;
11452
11453 int old = m_VarLiquidType;
11454 m_VarLiquidType = value;
11455 OnLiquidTypeChanged(old,value);
11456 SetVariableMask(VARIABLE_LIQUIDTYPE);
11457 }
11458
11459 int GetLiquidTypeInit()
11460 {
11461 return ConfigGetInt("varLiquidTypeInit");
11462 }
11463
11464 override int GetLiquidType()
11465 {
11466 return m_VarLiquidType;
11467 }
11468
11469 protected void OnLiquidTypeChanged(int oldType, int newType)
11470 {
11471 if (newType == LIQUID_NONE && GetIsFrozen())
11472 SetFrozen(false);
11473 }
11474
11476 void UpdateQuickbarShortcutVisibility(PlayerBase player)
11477 {
11478 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11479 }
11480
11481 // -------------------------------------------------------------------------
11483 void OnInventoryEnter(Man player)
11484 {
11485 PlayerBase nplayer;
11486 if (PlayerBase.CastTo(nplayer, player))
11487 {
11488 m_CanPlayImpactSound = true;
11489 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11490 }
11491 }
11492
11493 // -------------------------------------------------------------------------
11495 void OnInventoryExit(Man player)
11496 {
11497 PlayerBase nplayer;
11498 if (PlayerBase.CastTo(nplayer,player))
11499 {
11500 nplayer.SetEnableQuickBarEntityShortcut(this, false);
11501 }
11502
11503 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11504
11505 if (HasEnergyManager())
11506 {
11507 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
11508 }
11509 }
11510
11511 // ADVANCED PLACEMENT EVENTS
11512 override void OnPlacementStarted(Man player)
11513 {
11514 super.OnPlacementStarted(player);
11515
11516 SetTakeable(false);
11517 }
11518
11519 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
11520 {
11521 if (m_AdminLog)
11522 {
11523 m_AdminLog.OnPlacementComplete(player, this);
11524 }
11525
11526 super.OnPlacementComplete(player, position, orientation);
11527 }
11528
11529 //-----------------------------
11530 // AGENT SYSTEM
11531 //-----------------------------
11532 //--------------------------------------------------------------------------
11533 bool ContainsAgent(int agent_id)
11534 {
11535 if (agent_id & m_AttachedAgents)
11536 {
11537 return true;
11538 }
11539 else
11540 {
11541 return false;
11542 }
11543 }
11544
11545 //--------------------------------------------------------------------------
11546 override void RemoveAgent(int agent_id)
11547 {
11548 if (ContainsAgent(agent_id))
11549 {
11550 m_AttachedAgents = ~agent_id & m_AttachedAgents;
11551 }
11552 }
11553
11554 //--------------------------------------------------------------------------
11555 override void RemoveAllAgents()
11556 {
11557 m_AttachedAgents = 0;
11558 }
11559 //--------------------------------------------------------------------------
11560 override void RemoveAllAgentsExcept(int agent_to_keep)
11561 {
11562 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
11563 }
11564 // -------------------------------------------------------------------------
11565 override void InsertAgent(int agent, float count = 1)
11566 {
11567 if (count < 1)
11568 return;
11569 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
11571 }
11572
11574 void TransferAgents(int agents)
11575 {
11577 }
11578
11579 // -------------------------------------------------------------------------
11580 override int GetAgents()
11581 {
11582 return m_AttachedAgents;
11583 }
11584 //----------------------------------------------------------------------
11585
11586 /*int GetContaminationType()
11587 {
11588 int contamination_type;
11589
11590 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
11591 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
11592 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
11593 const int DIRTY_MASK = eAgents.WOUND_AGENT;
11594
11595 Edible_Base edible = Edible_Base.Cast(this);
11596 int agents = GetAgents();
11597 if (edible)
11598 {
11599 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
11600 if (profile)
11601 {
11602 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
11603 }
11604 }
11605 if (agents & CONTAMINATED_MASK)
11606 {
11607 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
11608 }
11609 if (agents & POISONED_MASK)
11610 {
11611 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
11612 }
11613 if (agents & NERVE_GAS_MASK)
11614 {
11615 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
11616 }
11617 if (agents & DIRTY_MASK)
11618 {
11619 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
11620 }
11621
11622 return agents;
11623 }*/
11624
11625 // -------------------------------------------------------------------------
11626 bool LoadAgents(ParamsReadContext ctx, int version)
11627 {
11628 if (!ctx.Read(m_AttachedAgents))
11629 return false;
11630 return true;
11631 }
11632 // -------------------------------------------------------------------------
11634 {
11635
11637 }
11638 // -------------------------------------------------------------------------
11639
11641 override void CheckForRoofLimited(float timeTresholdMS = 3000)
11642 {
11643 super.CheckForRoofLimited(timeTresholdMS);
11644
11645 float time = g_Game.GetTime();
11646 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11647 {
11648 m_PreviousRoofTestTime = time;
11649 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11650 }
11651 }
11652
11653 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
11654 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
11655 {
11656 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
11657 {
11658 return 0;
11659 }
11660
11661 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
11662 {
11663 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
11664 if (filter)
11665 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
11666 else
11667 return 0;//otherwise return 0 when no filter attached
11668 }
11669
11670 string subclassPath, entryName;
11671
11672 switch (type)
11673 {
11674 case DEF_BIOLOGICAL:
11675 entryName = "biological";
11676 break;
11677 case DEF_CHEMICAL:
11678 entryName = "chemical";
11679 break;
11680 default:
11681 entryName = "biological";
11682 break;
11683 }
11684
11685 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
11686
11687 return g_Game.ConfigGetFloat(subclassPath + entryName);
11688 }
11689
11690
11691
11693 override void EEOnCECreate()
11694 {
11695 if (!IsMagazine())
11697
11699 }
11700
11701
11702 //-------------------------
11703 // OPEN/CLOSE USER ACTIONS
11704 //-------------------------
11706 void Open();
11707 void Close();
11708 bool IsOpen()
11709 {
11710 return true;
11711 }
11712
11713 override bool CanDisplayCargo()
11714 {
11715 return IsOpen();
11716 }
11717
11718
11719 // ------------------------------------------------------------
11720 // CONDITIONS
11721 // ------------------------------------------------------------
11722 override bool CanPutInCargo(EntityAI parent)
11723 {
11724 if (parent)
11725 {
11726 if (parent.IsInherited(DayZInfected))
11727 return true;
11728
11729 if (!parent.IsRuined())
11730 return true;
11731 }
11732
11733 return true;
11734 }
11735
11736 override bool CanPutAsAttachment(EntityAI parent)
11737 {
11738 if (!super.CanPutAsAttachment(parent))
11739 {
11740 return false;
11741 }
11742
11743 if (!IsRuined() && !parent.IsRuined())
11744 {
11745 return true;
11746 }
11747
11748 return false;
11749 }
11750
11751 override bool CanReceiveItemIntoCargo(EntityAI item)
11752 {
11753 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11754 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11755 // return false;
11756
11757 return super.CanReceiveItemIntoCargo(item);
11758 }
11759
11760 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
11761 {
11762 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11763 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11764 // return false;
11765
11766 GameInventory attachmentInv = attachment.GetInventory();
11767 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11768 {
11769 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11770 return false;
11771 }
11772
11773 InventoryLocation loc = new InventoryLocation();
11774 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11775 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
11776 return false;
11777
11778 return super.CanReceiveAttachment(attachment, slotId);
11779 }
11780
11781 override bool CanReleaseAttachment(EntityAI attachment)
11782 {
11783 if (!super.CanReleaseAttachment(attachment))
11784 return false;
11785
11786 return GetInventory().AreChildrenAccessible();
11787 }
11788
11789 /*override bool CanLoadAttachment(EntityAI attachment)
11790 {
11791 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11792 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11793 // return false;
11794
11795 GameInventory attachmentInv = attachment.GetInventory();
11796 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11797 {
11798 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
11799 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
11800
11801 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11802 return false;
11803 }
11804
11805 return super.CanLoadAttachment(attachment);
11806 }*/
11807
11808 // Plays muzzle flash particle effects
11809 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11810 {
11811 int id = muzzle_owner.GetMuzzleID();
11812 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
11813
11814 if (WPOF_array)
11815 {
11816 for (int i = 0; i < WPOF_array.Count(); i++)
11817 {
11818 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11819
11820 if (WPOF)
11821 {
11822 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11823 }
11824 }
11825 }
11826 }
11827
11828 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
11829 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11830 {
11831 int id = muzzle_owner.GetMuzzleID();
11832 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
11833
11834 if (WPOBE_array)
11835 {
11836 for (int i = 0; i < WPOBE_array.Count(); i++)
11837 {
11838 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11839
11840 if (WPOBE)
11841 {
11842 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11843 }
11844 }
11845 }
11846 }
11847
11848 // Plays all weapon overheating particles
11849 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11850 {
11851 int id = muzzle_owner.GetMuzzleID();
11852 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11853
11854 if (WPOOH_array)
11855 {
11856 for (int i = 0; i < WPOOH_array.Count(); i++)
11857 {
11858 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11859
11860 if (WPOOH)
11861 {
11862 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11863 }
11864 }
11865 }
11866 }
11867
11868 // Updates all weapon overheating particles
11869 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11870 {
11871 int id = muzzle_owner.GetMuzzleID();
11872 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11873
11874 if (WPOOH_array)
11875 {
11876 for (int i = 0; i < WPOOH_array.Count(); i++)
11877 {
11878 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11879
11880 if (WPOOH)
11881 {
11882 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11883 }
11884 }
11885 }
11886 }
11887
11888 // Stops overheating particles
11889 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11890 {
11891 int id = muzzle_owner.GetMuzzleID();
11892 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11893
11894 if (WPOOH_array)
11895 {
11896 for (int i = 0; i < WPOOH_array.Count(); i++)
11897 {
11898 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11899
11900 if (WPOOH)
11901 {
11902 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11903 }
11904 }
11905 }
11906 }
11907
11908 //----------------------------------------------------------------
11909 //Item Behaviour - unified approach
11910 override bool IsHeavyBehaviour()
11911 {
11912 if (m_ItemBehaviour == 0)
11913 {
11914 return true;
11915 }
11916
11917 return false;
11918 }
11919
11920 override bool IsOneHandedBehaviour()
11921 {
11922 if (m_ItemBehaviour == 1)
11923 {
11924 return true;
11925 }
11926
11927 return false;
11928 }
11929
11930 override bool IsTwoHandedBehaviour()
11931 {
11932 if (m_ItemBehaviour == 2)
11933 {
11934 return true;
11935 }
11936
11937 return false;
11938 }
11939
11940 bool IsDeployable()
11941 {
11942 return false;
11943 }
11944
11946 float GetDeployTime()
11947 {
11948 return UATimeSpent.DEFAULT_DEPLOY;
11949 }
11950
11951
11952 //----------------------------------------------------------------
11953 // Item Targeting (User Actions)
11954 override void SetTakeable(bool pState)
11955 {
11956 m_IsTakeable = pState;
11957 SetSynchDirty();
11958 }
11959
11960 override bool IsTakeable()
11961 {
11962 return m_IsTakeable;
11963 }
11964
11965 // For cases where we want to show object widget which cant be taken to hands
11967 {
11968 return false;
11969 }
11970
11972 protected void PreLoadSoundAttachmentType()
11973 {
11974 string att_type = "None";
11975
11976 if (ConfigIsExisting("soundAttType"))
11977 {
11978 att_type = ConfigGetString("soundAttType");
11979 }
11980
11981 m_SoundAttType = att_type;
11982 }
11983
11984 override string GetAttachmentSoundType()
11985 {
11986 return m_SoundAttType;
11987 }
11988
11989 //----------------------------------------------------------------
11990 //SOUNDS - ItemSoundHandler
11991 //----------------------------------------------------------------
11992
11993 string GetPlaceSoundset(); // played when deploy starts
11994 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
11995 string GetDeploySoundset(); // played when deploy sucessfully finishes
11996 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
11997 string GetFoldSoundset(); // played when fold sucessfully finishes
11998
12000 {
12001 if (!m_ItemSoundHandler)
12003
12004 return m_ItemSoundHandler;
12005 }
12006
12007 // override to initialize sounds
12008 protected void InitItemSounds()
12009 {
12010 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
12011 return;
12012
12014
12015 if (GetPlaceSoundset() != string.Empty)
12016 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12017
12018 if (GetDeploySoundset() != string.Empty)
12019 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12020
12021 SoundParameters params = new SoundParameters();
12022 params.m_Loop = true;
12023 if (GetLoopDeploySoundset() != string.Empty)
12024 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12025 }
12026
12027 // Start sound using ItemSoundHandler
12028 void StartItemSoundServer(int id, int slotId)
12029 {
12030 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12031 {
12032 m_SoundSyncSlotID = slotId;
12033 m_SoundSyncPlay = id;
12034
12035 SetSynchDirty();
12036
12037 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12038 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
12039 }
12040 }
12041
12042 void StartItemSoundServer(int id)
12043 {
12044 StartItemSoundServer(id, InventorySlots.INVALID);
12045 }
12046
12047 // Stop sound using ItemSoundHandler
12048 void StopItemSoundServer(int id)
12049 {
12050 if (!g_Game.IsServer())
12051 return;
12052
12053 m_SoundSyncStop = id;
12054 SetSynchDirty();
12055
12056 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12057 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
12058 }
12059
12060 protected void ClearStartItemSoundServer()
12061 {
12062 m_SoundSyncPlay = 0;
12063 m_SoundSyncSlotID = InventorySlots.INVALID;
12064 }
12065
12066 protected void ClearStopItemSoundServer()
12067 {
12068 m_SoundSyncStop = 0;
12069 }
12070
12071 void OnApply(PlayerBase player);
12072
12074 {
12075 return 1.0;
12076 };
12077 //returns applicable selection
12078 array<string> GetHeadHidingSelection()
12079 {
12081 }
12082
12084 {
12086 }
12087
12088 WrittenNoteData GetWrittenNoteData() {};
12089
12091 {
12092 SetDynamicPhysicsLifeTime(0.01);
12093 m_ItemBeingDroppedPhys = false;
12094 }
12095
12097 {
12098 array<string> zone_names = new array<string>;
12099 GetDamageZones(zone_names);
12100 for (int i = 0; i < zone_names.Count(); i++)
12101 {
12102 SetHealthMax(zone_names.Get(i),"Health");
12103 }
12104 SetHealthMax("","Health");
12105 }
12106
12108 void SetZoneDamageCEInit()
12109 {
12110 float global_health = GetHealth01("","Health");
12111 array<string> zones = new array<string>;
12112 GetDamageZones(zones);
12113 //set damage of all zones to match global health level
12114 for (int i = 0; i < zones.Count(); i++)
12115 {
12116 SetHealth01(zones.Get(i),"Health",global_health);
12117 }
12118 }
12119
12121 bool IsCoverFaceForShave(string slot_name)
12122 {
12123 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12124 }
12125
12126 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12127 {
12128 if (!hasRootAsPlayer)
12129 {
12130 if (refParentIB)
12131 {
12132 // parent is wet
12133 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
12134 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12135 // parent has liquid inside
12136 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
12137 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12138 // drying
12139 else if (m_VarWet > m_VarWetMin)
12140 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
12141 }
12142 else
12143 {
12144 // drying on ground or inside non-itembase (car, ...)
12145 if (m_VarWet > m_VarWetMin)
12146 AddWet(-1 * delta * GetDryingIncrement("ground"));
12147 }
12148 }
12149 }
12150
12151 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12152 {
12154 {
12155 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
12156 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12157 {
12158 float heatPermCoef = 1.0;
12159 EntityAI ent = this;
12160 while (ent)
12161 {
12162 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12163 ent = ent.GetHierarchyParent();
12164 }
12165
12166 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12167 }
12168 }
12169 }
12170
12171 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
12172 {
12173 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
12174 EntityAI parent = GetHierarchyParent();
12175 if (!parent)
12176 {
12177 hasParent = false;
12178 hasRootAsPlayer = false;
12179 }
12180 else
12181 {
12182 hasParent = true;
12183 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12184 refParentIB = ItemBase.Cast(parent);
12185 }
12186 }
12187
12188 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
12189 {
12190 // this is stub, implemented on Edible_Base
12191 }
12192
12193 bool CanDecay()
12194 {
12195 // return true used on selected food clases so they can decay
12196 return false;
12197 }
12198
12199 protected bool CanProcessDecay()
12200 {
12201 // this is stub, implemented on Edible_Base class
12202 // used to determine whether it is still necessary for the food to decay
12203 return false;
12204 }
12205
12206 protected bool CanHaveWetness()
12207 {
12208 // return true used on selected items that have a wetness effect
12209 return false;
12210 }
12211
12213 bool CanBeConsumed(ConsumeConditionData data = null)
12214 {
12215 return !GetIsFrozen() && IsOpen();
12216 }
12217
12218 override void ProcessVariables()
12219 {
12220 bool hasParent = false, hasRootAsPlayer = false;
12221 ItemBase refParentIB;
12222
12223 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
12224 bool foodDecay = g_Game.IsFoodDecayEnabled();
12225
12226 if (wwtu || foodDecay)
12227 {
12228 bool processWetness = wwtu && CanHaveWetness();
12229 bool processTemperature = wwtu && CanHaveTemperature();
12230 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
12231
12232 if (processWetness || processTemperature || processDecay)
12233 {
12234 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
12235
12236 if (processWetness)
12237 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12238
12239 if (processTemperature)
12240 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12241
12242 if (processDecay)
12243 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12244 }
12245 }
12246 }
12247
12250 {
12251 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
12252 }
12253
12254 override float GetTemperatureFreezeThreshold()
12255 {
12257 return Liquid.GetFreezeThreshold(GetLiquidType());
12258
12259 return super.GetTemperatureFreezeThreshold();
12260 }
12261
12262 override float GetTemperatureThawThreshold()
12263 {
12265 return Liquid.GetThawThreshold(GetLiquidType());
12266
12267 return super.GetTemperatureThawThreshold();
12268 }
12269
12270 override float GetItemOverheatThreshold()
12271 {
12273 return Liquid.GetBoilThreshold(GetLiquidType());
12274
12275 return super.GetItemOverheatThreshold();
12276 }
12277
12278 override float GetTemperatureFreezeTime()
12279 {
12280 if (HasQuantity())
12281 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
12282
12283 return super.GetTemperatureFreezeTime();
12284 }
12285
12286 override float GetTemperatureThawTime()
12287 {
12288 if (HasQuantity())
12289 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
12290
12291 return super.GetTemperatureThawTime();
12292 }
12293
12295 void AffectLiquidContainerOnFill(int liquid_type, float amount);
12297 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
12298
12299 bool IsCargoException4x3(EntityAI item)
12300 {
12301 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12302 }
12303
12305 {
12306 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12307 }
12308
12310 void AddLightSourceItem(ItemBase lightsource)
12311 {
12312 m_LightSourceItem = lightsource;
12313 }
12314
12316 {
12317 m_LightSourceItem = null;
12318 }
12319
12321 {
12322 return m_LightSourceItem;
12323 }
12324
12326 array<int> GetValidFinishers()
12327 {
12328 return null;
12329 }
12330
12332 bool GetActionWidgetOverride(out typename name)
12333 {
12334 return false;
12335 }
12336
12337 bool PairWithDevice(notnull ItemBase otherDevice)
12338 {
12339 if (g_Game.IsServer())
12340 {
12341 ItemBase explosive = otherDevice;
12343 if (!trg)
12344 {
12345 trg = RemoteDetonatorTrigger.Cast(otherDevice);
12346 explosive = this;
12347 }
12348
12349 explosive.PairRemote(trg);
12350 trg.SetControlledDevice(explosive);
12351
12352 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12353 trg.SetPersistentPairID(persistentID);
12354 explosive.SetPersistentPairID(persistentID);
12355
12356 return true;
12357 }
12358 return false;
12359 }
12360
12362 float GetBaitEffectivity()
12363 {
12364 float ret = 1.0;
12365 if (HasQuantity())
12366 ret *= GetQuantityNormalized();
12367 ret *= GetHealth01();
12368
12369 return ret;
12370 }
12371
12372 #ifdef DEVELOPER
12373 override void SetDebugItem()
12374 {
12375 super.SetDebugItem();
12376 _itemBase = this;
12377 }
12378
12379 override string GetDebugText()
12380 {
12381 string text = super.GetDebugText();
12382
12383 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
12384 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
12385
12386 return text;
12387 }
12388 #endif
12389
12390 bool CanBeUsedForSuicide()
12391 {
12392 return true;
12393 }
12394
12396 //DEPRECATED BELOW
12398 // Backwards compatibility
12399 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12400 {
12401 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
12402 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
12403 }
12404
12405 // replaced by ItemSoundHandler
12406 protected EffectSound m_SoundDeployFinish;
12407 protected EffectSound m_SoundPlace;
12408 protected EffectSound m_DeployLoopSoundEx;
12409 protected EffectSound m_SoundDeploy;
12410 bool m_IsPlaceSound;
12411 bool m_IsDeploySound;
12413
12414 string GetDeployFinishSoundset();
12415 void PlayDeploySound();
12416 void PlayDeployFinishSound();
12417 void PlayPlaceSound();
12418 void PlayDeployLoopSoundEx();
12419 void StopDeployLoopSoundEx();
12420 void SoundSynchRemoteReset();
12421 void SoundSynchRemote();
12422 bool UsesGlobalDeploy(){return false;}
12423 bool CanPlayDeployLoopSound(){return false;}
12425 bool IsPlaceSound(){return m_IsPlaceSound;}
12426 bool IsDeploySound(){return m_IsDeploySound;}
12427 void SetIsPlaceSound(bool is_place_sound);
12428 void SetIsDeploySound(bool is_deploy_sound);
12429
12430 [Obsolete("Use ItemSoundHandler instead")]
12432 void PlayAttachSound(string slot_type)
12433 {
12434 if (!g_Game.IsDedicatedServer())
12435 {
12436 if (ConfigIsExisting("attachSoundSet"))
12437 {
12438 string cfg_path = "";
12439 string soundset = "";
12440 string type_name = GetType();
12441
12442 TStringArray cfg_soundset_array = new TStringArray;
12443 TStringArray cfg_slot_array = new TStringArray;
12444 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12445 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12446
12447 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12448 {
12449 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12450 {
12451 if (cfg_slot_array[i] == slot_type)
12452 {
12453 soundset = cfg_soundset_array[i];
12454 break;
12455 }
12456 }
12457 }
12458
12459 if (soundset != "")
12460 {
12461 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
12462 sound.SetAutodestroy(true);
12463 }
12464 }
12465 }
12466 }
12467
12468 void PlayDetachSound(string slot_type) {}
12469}
12470
12471EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
12472{
12473 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
12474 if (entity)
12475 {
12476 bool is_item = entity.IsInherited(ItemBase);
12477 if (is_item && full_quantity)
12478 {
12479 ItemBase item = ItemBase.Cast(entity);
12480 item.SetQuantity(item.GetQuantityInit());
12481 }
12482 }
12483 else
12484 {
12485 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
12486 return NULL;
12487 }
12488 return entity;
12489}
12490
12491void SetupSpawnedItem(ItemBase item, float health, float quantity)
12492{
12493 if (item)
12494 {
12495 if (health > 0)
12496 item.SetHealth("", "", health);
12497
12498 if (item.CanHaveTemperature())
12499 {
12500 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
12501 if (item.CanFreeze())
12502 item.SetFrozen(false);
12503 }
12504
12505 if (item.HasEnergyManager())
12506 {
12507 if (quantity >= 0)
12508 {
12509 item.GetCompEM().SetEnergy0To1(quantity);
12510 }
12511 else
12512 {
12513 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
12514 }
12515 }
12516 else if (item.IsMagazine())
12517 {
12518 Magazine mag = Magazine.Cast(item);
12519 if (quantity >= 0)
12520 {
12521 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12522 }
12523 else
12524 {
12525 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
12526 }
12527
12528 }
12529 else
12530 {
12531 if (quantity >= 0)
12532 {
12533 item.SetQuantityNormalized(quantity, false);
12534 }
12535 else
12536 {
12537 item.SetQuantity(Math.AbsFloat(quantity));
12538 }
12539
12540 }
12541 }
12542}
12543
12544#ifdef DEVELOPER
12545ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
12546#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()