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

◆ OnEnergyAdded()

override void SpawnItemOnLocation::OnEnergyAdded ( )
protected

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

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