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

◆ GetItemModelLength()

float SpawnItemOnLocation::GetItemModelLength ( )
protected

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

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

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