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

◆ OnEnergyConsumed()

override void SpawnItemOnLocation::OnEnergyConsumed ( )
protected

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

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