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

◆ SetWetMax()

override void SpawnItemOnLocation::SetWetMax ( )
protected

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

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