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

◆ GetWetInit()

override float SpawnItemOnLocation::GetWetInit ( )
protected

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

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