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

◆ SetColor()

override void SpawnItemOnLocation::SetColor ( int r,
int g,
int b,
int a )
protected

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

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