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

◆ SetStoreLoadedQuantity()

override void SpawnItemOnLocation::SetStoreLoadedQuantity ( float value)
protected

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

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

Используется в InventoryItem::AfterStoreLoad(), InventoryItem::DeSerializeNumericalVars() и InventoryItem::ReadVarsFromCTX().