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

◆ GetQuantityInit()

int SpawnItemOnLocation::GetQuantityInit ( )
protected

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

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