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

◆ GetInfectionChance()

float SpawnItemOnLocation::GetInfectionChance ( int system = 0,
Param param = null )
private

Infection chance while/after using this item, originally used for wound infection after bandaging, params 'system' and 'param' can allow usage by other systems as well.

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

5455{
5456 override bool CanPutAsAttachment(EntityAI parent)
5457 {
5458 return true;
5459 }
5460};
5461
5462//const bool QUANTITY_DEBUG_REMOVE_ME = false;
5463
5464class ItemBase extends InventoryItem
5465{
5469
5471
5472 static int m_DebugActionsMask;
5474 // ============================================
5475 // Variable Manipulation System
5476 // ============================================
5477 // Quantity
5478
5479 float m_VarQuantity;
5480 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
5482 int m_VarQuantityMin;
5483 int m_VarQuantityMax;
5484 int m_Count;
5485 float m_VarStackMax;
5486 float m_StoreLoadedQuantity = float.LOWEST;
5487 // Wet
5488 float m_VarWet;
5489 float m_VarWetPrev;//for client to know wetness changed during synchronization
5490 float m_VarWetInit;
5491 float m_VarWetMin;
5492 float m_VarWetMax;
5493 // Cleanness
5494 int m_Cleanness;
5495 int m_CleannessInit;
5496 int m_CleannessMin;
5497 int m_CleannessMax;
5498 // impact sounds
5500 bool m_CanPlayImpactSound = true;
5501 float m_ImpactSpeed;
5503 //
5504 float m_HeatIsolation;
5505 float m_ItemModelLength;
5506 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
5508 int m_VarLiquidType;
5509 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
5510 int m_QuickBarBonus;
5511 bool m_IsBeingPlaced;
5512 bool m_IsHologram;
5513 bool m_IsTakeable;
5514 bool m_ThrowItemOnDrop;
5517 bool m_FixDamageSystemInit = false; //can be changed on storage version check
5518 bool can_this_be_combined; //Check if item can be combined
5519 bool m_CanThisBeSplit; //Check if item can be split
5520 bool m_IsStoreLoad = false;
5521 bool m_CanShowQuantity;
5522 bool m_HasQuantityBar;
5523 protected bool m_CanBeDigged;
5524 protected bool m_IsResultOfSplit
5525
5526 string m_SoundAttType;
5527 // items color variables
5532 //-------------------------------------------------------
5533
5534 // light source managing
5536
5540
5541 //==============================================
5542 // agent system
5543 private int m_AttachedAgents;
5544
5546 void TransferModifiers(PlayerBase reciever);
5547
5548
5549 // Weapons & suppressors particle effects
5554 static int m_LastRegisteredWeaponID = 0;
5555
5556 // Overheating effects
5558 float m_OverheatingShots;
5559 ref Timer m_CheckOverheating;
5560 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
5561 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
5562 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
5563 ref array <ref OverheatingParticle> m_OverheatingParticles;
5564
5566 protected bool m_HideSelectionsBySlot;
5567
5568 // Admin Log
5569 PluginAdminLog m_AdminLog;
5570
5571 // misc
5572 ref Timer m_PhysDropTimer;
5573
5574 // Attachment Locking variables
5575 ref array<int> m_CompatibleLocks;
5576 protected int m_LockType;
5577 protected ref EffectSound m_LockingSound;
5578 protected string m_LockSoundSet;
5579
5580 // ItemSoundHandler
5581 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
5582 protected int m_SoundSyncPlay; // id for sound to play
5583 protected int m_SoundSyncStop; // id for sound to stop
5585
5586 //temperature
5587 private float m_TemperaturePerQuantityWeight;
5588
5589 // -------------------------------------------------------------------------
5590 void ItemBase()
5591 {
5592 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
5596
5597 if (!GetGame().IsDedicatedServer())
5598 {
5599 if (HasMuzzle())
5600 {
5602
5604 {
5606 }
5607 }
5608
5610 m_ActionsInitialize = false;
5611 }
5612
5613 m_OldLocation = null;
5614
5615 if (GetGame().IsServer())
5616 {
5617 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
5618 }
5619
5620 if (ConfigIsExisting("headSelectionsToHide"))
5621 {
5623 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
5624 }
5625
5626 m_HideSelectionsBySlot = false;
5627 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5628 {
5629 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
5630 }
5631
5632 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
5633
5634 m_IsResultOfSplit = false;
5635
5637 }
5638
5639 override void InitItemVariables()
5640 {
5641 super.InitItemVariables();
5642
5643 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
5644 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
5645 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
5646 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
5647 m_VarStackMax = ConfigGetFloat("varStackMax");
5648 m_Count = ConfigGetInt("count");
5649
5650 m_CanShowQuantity = ConfigGetBool("quantityShow");
5651 m_HasQuantityBar = ConfigGetBool("quantityBar");
5652
5653 m_CleannessInit = ConfigGetInt("varCleannessInit");
5655 m_CleannessMin = ConfigGetInt("varCleannessMin");
5656 m_CleannessMax = ConfigGetInt("varCleannessMax");
5657
5658 m_WantPlayImpactSound = false;
5659 m_ImpactSpeed = 0.0;
5660
5661 m_VarWetInit = ConfigGetFloat("varWetInit");
5663 m_VarWetMin = ConfigGetFloat("varWetMin");
5664 m_VarWetMax = ConfigGetFloat("varWetMax");
5665
5666 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
5667 if (IsLiquidContainer() && GetQuantity() != 0)
5669 m_IsBeingPlaced = false;
5670 m_IsHologram = false;
5671 m_IsTakeable = true;
5672 m_CanBeMovedOverride = false;
5676 m_CanBeDigged = ConfigGetBool("canBeDigged");
5677
5678 m_CompatibleLocks = new array<int>();
5679 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
5680 m_LockType = ConfigGetInt("lockType");
5681
5682 //Define if item can be split and set ability to be combined accordingly
5683 m_CanThisBeSplit = false;
5684 can_this_be_combined = false;
5685 if (ConfigIsExisting("canBeSplit"))
5686 {
5687 can_this_be_combined = ConfigGetBool("canBeSplit");
5689 }
5690
5691 m_ItemBehaviour = -1;
5692 if (ConfigIsExisting("itemBehaviour"))
5693 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
5694
5695 //RegisterNetSyncVariableInt("m_VariablesMask");
5696 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
5697 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
5698 RegisterNetSyncVariableInt("m_VarLiquidType");
5699 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5700
5701 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5702 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5703 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5704
5705 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5706 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5707 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5708 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5709
5710 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5711 RegisterNetSyncVariableBool("m_IsTakeable");
5712 RegisterNetSyncVariableBool("m_IsHologram");
5713
5714 InitItemSounds();
5716 {
5717 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
5718 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
5719 }
5720
5721 m_LockSoundSet = ConfigGetString("lockSoundSet");
5722
5724 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5725 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
5726
5727 }
5728
5729 override int GetQuickBarBonus()
5730 {
5731 return m_QuickBarBonus;
5732 }
5733
5734 void InitializeActions()
5735 {
5737 if (!m_InputActionMap)
5738 {
5740 m_InputActionMap = iam;
5741 SetActions();
5743 }
5744 }
5745
5746 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
5747 {
5749 {
5750 m_ActionsInitialize = true;
5752 }
5753
5754 actions = m_InputActionMap.Get(action_input_type);
5755 }
5756
5757 void SetActions()
5758 {
5759 AddAction(ActionTakeItem);
5760 AddAction(ActionTakeItemToHands);
5761 AddAction(ActionWorldCraft);
5763 AddAction(ActionAttachWithSwitch);
5764 }
5765
5766 void SetActionAnimOverrides(); // Override action animation for specific item
5767
5768 void AddAction(typename actionName)
5769 {
5770 ActionBase action = ActionManagerBase.GetAction(actionName);
5771
5772 if (!action)
5773 {
5774 Debug.LogError("Action " + actionName + " dosn't exist!");
5775 return;
5776 }
5777
5778 typename ai = action.GetInputType();
5779 if (!ai)
5780 {
5781 m_ActionsInitialize = false;
5782 return;
5783 }
5784
5785 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5786 if (!action_array)
5787 {
5788 action_array = new array<ActionBase_Basic>;
5789 m_InputActionMap.Insert(ai, action_array);
5790 }
5791 if (LogManager.IsActionLogEnable())
5792 {
5793 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
5794 }
5795
5796 if (action_array.Find(action) != -1)
5797 {
5798 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
5799 }
5800 else
5801 {
5802 action_array.Insert(action);
5803 }
5804 }
5805
5806 void RemoveAction(typename actionName)
5807 {
5808 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
5809 ActionBase action = player.GetActionManager().GetAction(actionName);
5810 typename ai = action.GetInputType();
5811 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
5812
5813 if (action_array)
5814 {
5815 action_array.RemoveItem(action);
5816 }
5817 }
5818
5819 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
5820 // Set -1 for params which should stay in default state
5821 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
5822 {
5823 ActionOverrideData overrideData = new ActionOverrideData();
5824 overrideData.m_CommandUID = commandUID;
5825 overrideData.m_CommandUIDProne = commandUIDProne;
5826 overrideData.m_StanceMask = stanceMask;
5827
5828 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
5829 if (!actionMap) // create new map of action > overidables map
5830 {
5831 actionMap = new TActionAnimOverrideMap();
5832 m_ItemActionOverrides.Insert(action, actionMap);
5833 }
5834
5835 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
5836
5837 }
5838
5839 void OnItemInHandsPlayerSwimStart(PlayerBase player);
5840
5841 ScriptedLightBase GetLight();
5842
5843 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
5844 void LoadParticleConfigOnFire(int id)
5845 {
5846 if (!m_OnFireEffect)
5848
5851
5852 string config_to_search = "CfgVehicles";
5853 string muzzle_owner_config;
5854
5855 if (!m_OnFireEffect.Contains(id))
5856 {
5857 if (IsInherited(Weapon))
5858 config_to_search = "CfgWeapons";
5859
5860 muzzle_owner_config = config_to_search + " " + GetType() + " ";
5861
5862 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5863
5864 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
5865
5866 if (config_OnFire_subclass_count > 0)
5867 {
5868 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5869
5870 for (int i = 0; i < config_OnFire_subclass_count; i++)
5871 {
5872 string particle_class = "";
5873 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
5874 string config_OnFire_entry = config_OnFire_class + particle_class;
5875 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5876 WPOF_array.Insert(WPOF);
5877 }
5878
5879
5880 m_OnFireEffect.Insert(id, WPOF_array);
5881 }
5882 }
5883
5884 if (!m_OnBulletCasingEjectEffect.Contains(id))
5885 {
5886 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
5887 muzzle_owner_config = config_to_search + " " + GetType() + " ";
5888
5889 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5890
5891 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5892
5893 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5894 {
5895 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5896
5897 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5898 {
5899 string particle_class2 = "";
5900 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5901 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5902 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5903 WPOBE_array.Insert(WPOBE);
5904 }
5905
5906
5907 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
5908 }
5909 }
5910 }
5911
5912 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
5914 {
5917
5918 if (!m_OnOverheatingEffect.Contains(id))
5919 {
5920 string config_to_search = "CfgVehicles";
5921
5922 if (IsInherited(Weapon))
5923 config_to_search = "CfgWeapons";
5924
5925 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
5926 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5927
5928 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
5929 {
5930
5931 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
5932
5934 {
5935 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
5936 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5937 Error(error);
5938 return;
5939 }
5940
5941 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
5942 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
5943
5944
5945
5946 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
5947 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5948
5949 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5950 {
5951 string particle_class = "";
5952 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
5953 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5954 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
5955
5956 if (entry_type == CT_CLASS)
5957 {
5958 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5959 WPOOH_array.Insert(WPOF);
5960 }
5961 }
5962
5963
5964 m_OnOverheatingEffect.Insert(id, WPOOH_array);
5965 }
5966 }
5967 }
5968
5969 float GetOverheatingValue()
5970 {
5971 return m_OverheatingShots;
5972 }
5973
5974 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
5975 {
5976 if (m_MaxOverheatingValue > 0)
5977 {
5979
5980 if (!m_CheckOverheating)
5982
5984 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
5985
5986 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5987 }
5988 }
5989
5990 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
5991 {
5993 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5994
5996 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5997
5999 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6000
6002 {
6004 }
6005 }
6006
6008 {
6010 }
6011
6012 void OnOverheatingDecay()
6013 {
6014 if (m_MaxOverheatingValue > 0)
6015 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
6016 else
6018
6019 if (m_OverheatingShots <= 0)
6020 {
6023 }
6024 else
6025 {
6026 if (!m_CheckOverheating)
6028
6030 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
6031 }
6032
6033 CheckOverheating(this, "", this);
6034 }
6035
6036 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6037 {
6039 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6040 }
6041
6042 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6043 {
6045 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6047 }
6048
6049 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6050 {
6052 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6053 }
6054
6055 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
6056 {
6058 m_OverheatingParticles = new array<ref OverheatingParticle>;
6059
6060 OverheatingParticle OP = new OverheatingParticle();
6061 OP.RegisterParticle(p);
6062 OP.SetOverheatingLimitMin(min_heat_coef);
6063 OP.SetOverheatingLimitMax(max_heat_coef);
6064 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
6065
6066 m_OverheatingParticles.Insert(OP);
6067 }
6068
6069 float GetOverheatingCoef()
6070 {
6071 if (m_MaxOverheatingValue > 0)
6073
6074 return -1;
6075 }
6076
6078 {
6080 {
6081 float overheat_coef = GetOverheatingCoef();
6082 int count = m_OverheatingParticles.Count();
6083
6084 for (int i = count; i > 0; --i)
6085 {
6086 int id = i - 1;
6087 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6088 Particle p = OP.GetParticle();
6089
6090 float overheat_min = OP.GetOverheatingLimitMin();
6091 float overheat_max = OP.GetOverheatingLimitMax();
6092
6093 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6094 {
6095 if (p)
6096 {
6097 p.Stop();
6098 OP.RegisterParticle(null);
6099 }
6100 }
6101 }
6102 }
6103 }
6104
6106 {
6108 {
6109 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
6110 {
6111 int id = i - 1;
6112 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6113
6114 if (OP)
6115 {
6116 Particle p = OP.GetParticle();
6117
6118 if (p)
6119 {
6120 p.Stop();
6121 }
6122
6123 delete OP;
6124 }
6125 }
6126
6127 m_OverheatingParticles.Clear();
6129 }
6130 }
6131
6133 float GetInfectionChance(int system = 0, Param param = null)
6134 {
6135 return 0.0;
6136 }
6137
6138
6139 float GetDisinfectQuantity(int system = 0, Param param1 = null)
6140 {
6141 return 250;//default value
6142 }
6143
6144 float GetFilterDamageRatio()
6145 {
6146 return 0;
6147 }
6148
6150 bool HasMuzzle()
6151 {
6152 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
6153 return true;
6154
6155 return false;
6156 }
6157
6159 int GetMuzzleID()
6160 {
6161 if (!m_WeaponTypeToID)
6163
6164 if (m_WeaponTypeToID.Contains(GetType()))
6165 {
6166 return m_WeaponTypeToID.Get(GetType());
6167 }
6168 else
6169 {
6170 // Register new weapon ID
6172 }
6173
6175 }
6176
6183 {
6184 return -1;
6185 }
6186
6187
6188
6189 // -------------------------------------------------------------------------
6190 void ~ItemBase()
6191 {
6192 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
6193 {
6194 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
6195 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6196
6197 if (r_index >= 0)
6198 {
6199 InventoryLocation r_il = new InventoryLocation;
6200 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6201
6202 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6203 int r_type = r_il.GetType();
6204 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6205 {
6206 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6207 }
6208 else if (r_type == InventoryLocationType.ATTACHMENT)
6209 {
6210 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6211 }
6212
6213 }
6214
6215 player.GetHumanInventory().ClearUserReservedLocation(this);
6216 }
6217
6218 if (m_LockingSound)
6219 SEffectManager.DestroyEffect(m_LockingSound);
6220 }
6221
6222
6223
6224 // -------------------------------------------------------------------------
6225 static int GetDebugActionsMask()
6226 {
6227 return ItemBase.m_DebugActionsMask;
6228 }
6229
6230 static bool HasDebugActionsMask(int mask)
6231 {
6232 return ItemBase.m_DebugActionsMask & mask;
6233 }
6234
6235 static void SetDebugActionsMask(int mask)
6236 {
6237 ItemBase.m_DebugActionsMask = mask;
6238 }
6239
6240 static void AddDebugActionsMask(int mask)
6241 {
6242 ItemBase.m_DebugActionsMask |= mask;
6243 }
6244
6245 static void RemoveDebugActionsMask(int mask)
6246 {
6247 ItemBase.m_DebugActionsMask &= ~mask;
6248 }
6249
6250 static void ToggleDebugActionsMask(int mask)
6251 {
6252 if (HasDebugActionsMask(mask))
6253 {
6255 }
6256 else
6257 {
6258 AddDebugActionsMask(mask);
6259 }
6260 }
6261
6262 // -------------------------------------------------------------------------
6263 void SetCEBasedQuantity()
6264 {
6265 if (GetEconomyProfile())
6266 {
6267 float q_max = GetEconomyProfile().GetQuantityMax();
6268 if (q_max > 0)
6269 {
6270 float q_min = GetEconomyProfile().GetQuantityMin();
6271 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6272
6273 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
6274 {
6275 ComponentEnergyManager comp = GetCompEM();
6276 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
6277 {
6278 comp.SetEnergy0To1(quantity_randomized);
6279 }
6280 }
6281 else if (HasQuantity())
6282 {
6283 SetQuantityNormalized(quantity_randomized, false);
6284 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
6285 }
6286
6287 }
6288 }
6289 }
6290
6292 void LockToParent()
6293 {
6294 EntityAI parent = GetHierarchyParent();
6295
6296 if (parent)
6297 {
6298 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6299 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6300 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
6301 }
6302 }
6303
6305 void UnlockFromParent()
6306 {
6307 EntityAI parent = GetHierarchyParent();
6308
6309 if (parent)
6310 {
6311 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6312 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6313 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
6314 }
6315 }
6316
6317 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
6318 {
6319 /*
6320 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
6321 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
6322 */
6323 ItemBase item2 = ItemBase.Cast(entity2);
6324
6325 if (GetGame().IsClient())
6326 {
6327 if (ScriptInputUserData.CanStoreInputUserData())
6328 {
6329 ScriptInputUserData ctx = new ScriptInputUserData;
6331 ctx.Write(-1);
6332 ItemBase i1 = this; // @NOTE: workaround for correct serialization
6333 ctx.Write(i1);
6334 ctx.Write(item2);
6335 ctx.Write(use_stack_max);
6336 ctx.Write(-1);
6337 ctx.Send();
6338
6339 if (IsCombineAll(item2, use_stack_max))
6340 {
6341 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6342 }
6343 }
6344 }
6345 else if (!GetGame().IsMultiplayer())
6346 {
6347 CombineItems(item2, use_stack_max);
6348 }
6349 }
6350
6351 bool IsLiquidPresent()
6352 {
6353 return (GetLiquidType() != 0 && HasQuantity());
6354 }
6355
6356 bool IsLiquidContainer()
6357 {
6358 return m_LiquidContainerMask != 0;
6359 }
6360
6362 {
6363 return m_LiquidContainerMask;
6364 }
6365
6366 bool IsBloodContainer()
6367 {
6368 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
6369 return false;
6370 }
6371
6372 bool IsNVG()
6373 {
6374 return false;
6375 }
6376
6379 bool IsExplosive()
6380 {
6381 return false;
6382 }
6383
6385 {
6386 return "";
6387 }
6388
6390
6391 bool IsLightSource()
6392 {
6393 return false;
6394 }
6395
6397 {
6398 return true;
6399 }
6400
6401 //--- ACTION CONDITIONS
6402 //direction
6403 bool IsFacingPlayer(PlayerBase player, string selection)
6404 {
6405 return true;
6406 }
6407
6408 bool IsPlayerInside(PlayerBase player, string selection)
6409 {
6410 return true;
6411 }
6412
6413 override bool CanObstruct()
6414 {
6415 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
6416 return !player || !IsPlayerInside(player, "");
6417 }
6418
6419 override bool IsBeingPlaced()
6420 {
6421 return m_IsBeingPlaced;
6422 }
6423
6424 void SetIsBeingPlaced(bool is_being_placed)
6425 {
6426 m_IsBeingPlaced = is_being_placed;
6427 if (!is_being_placed)
6429 SetSynchDirty();
6430 }
6431
6432 //server-side
6433 void OnEndPlacement() {}
6434
6435 override bool IsHologram()
6436 {
6437 return m_IsHologram;
6438 }
6439
6440 bool CanBeDigged()
6441 {
6442 return m_CanBeDigged;
6443 }
6444
6446 {
6447 return 1;
6448 }
6449
6450 bool CanMakeGardenplot()
6451 {
6452 return false;
6453 }
6454
6455 void SetIsHologram(bool is_hologram)
6456 {
6457 m_IsHologram = is_hologram;
6458 SetSynchDirty();
6459 }
6460 /*
6461 protected float GetNutritionalEnergy()
6462 {
6463 Edible_Base edible = Edible_Base.Cast(this);
6464 return edible.GetFoodEnergy();
6465 }
6466
6467 protected float GetNutritionalWaterContent()
6468 {
6469 Edible_Base edible = Edible_Base.Cast(this);
6470 return edible.GetFoodWater();
6471 }
6472
6473 protected float GetNutritionalIndex()
6474 {
6475 Edible_Base edible = Edible_Base.Cast(this);
6476 return edible.GetFoodNutritionalIndex();
6477 }
6478
6479 protected float GetNutritionalFullnessIndex()
6480 {
6481 Edible_Base edible = Edible_Base.Cast(this);
6482 return edible.GetFoodTotalVolume();
6483 }
6484
6485 protected float GetNutritionalToxicity()
6486 {
6487 Edible_Base edible = Edible_Base.Cast(this);
6488 return edible.GetFoodToxicity();
6489
6490 }
6491 */
6492
6493
6494 // -------------------------------------------------------------------------
6495 override void OnMovedInsideCargo(EntityAI container)
6496 {
6497 super.OnMovedInsideCargo(container);
6498
6499 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6500 }
6501
6502 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6503 {
6504 super.EEItemLocationChanged(oldLoc,newLoc);
6505
6506 PlayerBase new_player = null;
6507 PlayerBase old_player = null;
6508
6509 if (newLoc.GetParent())
6510 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6511
6512 if (oldLoc.GetParent())
6513 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6514
6515 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
6516 {
6517 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6518
6519 if (r_index >= 0)
6520 {
6521 InventoryLocation r_il = new InventoryLocation;
6522 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6523
6524 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6525 int r_type = r_il.GetType();
6526 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6527 {
6528 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6529 }
6530 else if (r_type == InventoryLocationType.ATTACHMENT)
6531 {
6532 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6533 }
6534
6535 }
6536 }
6537
6538 if (newLoc.GetType() == InventoryLocationType.HANDS)
6539 {
6540 if (new_player)
6541 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6542
6543 if (new_player == old_player)
6544 {
6545
6546 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6547 {
6548 if (oldLoc.GetType() == InventoryLocationType.CARGO)
6549 {
6550 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6551 {
6552 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6553 }
6554 }
6555 else
6556 {
6557 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6558 }
6559 }
6560
6561 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6562 {
6563 int type = oldLoc.GetType();
6564 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
6565 {
6566 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6567 }
6568 else if (type == InventoryLocationType.ATTACHMENT)
6569 {
6570 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6571 }
6572 }
6573 if (!m_OldLocation)
6574 {
6575 m_OldLocation = new InventoryLocation;
6576 }
6577 m_OldLocation.Copy(oldLoc);
6578 }
6579 else
6580 {
6581 if (m_OldLocation)
6582 {
6583 m_OldLocation.Reset();
6584 }
6585 }
6586
6588 }
6589 else
6590 {
6591 if (new_player)
6592 {
6593 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6594 if (res_index >= 0)
6595 {
6596 InventoryLocation il = new InventoryLocation;
6597 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6598 ItemBase it = ItemBase.Cast(il.GetItem());
6599 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6600 int rel_type = il.GetType();
6601 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
6602 {
6603 il.GetParent().GetOnReleaseLock().Invoke(it);
6604 }
6605 else if (rel_type == InventoryLocationType.ATTACHMENT)
6606 {
6607 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
6608 }
6609 //it.GetOnReleaseLock().Invoke(it);
6610 }
6611 }
6612 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
6613 {
6614 //ThrowPhysically(old_player, vector.Zero);
6615 m_ThrowItemOnDrop = false;
6616 }
6617
6618 if (m_OldLocation)
6619 {
6620 m_OldLocation.Reset();
6621 }
6622 }
6623 }
6624
6625 override void EOnContact(IEntity other, Contact extra)
6626 {
6628 {
6629 int liquidType = -1;
6630 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
6631 if (impactSpeed > 0.0)
6632 {
6633 m_ImpactSpeed = impactSpeed;
6634 #ifndef SERVER
6635 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
6636 #else
6637 m_WantPlayImpactSound = true;
6638 SetSynchDirty();
6639 #endif
6640 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
6641 }
6642 }
6643
6644 #ifdef SERVER
6645 if (GetCompEM() && GetCompEM().IsPlugged())
6646 {
6647 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
6648 GetCompEM().UnplugThis();
6649 }
6650 #endif
6651 }
6652
6653 void RefreshPhysics();
6654
6655 override void OnCreatePhysics()
6656 {
6658 }
6659
6660 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6661 {
6662
6663 }
6664 // -------------------------------------------------------------------------
6665 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
6666 {
6667 super.OnItemLocationChanged(old_owner, new_owner);
6668
6669 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6670 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6671
6672 if (!relatedPlayer && playerNew)
6673 relatedPlayer = playerNew;
6674
6675 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6676 {
6677 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
6678 if (actionMgr)
6679 {
6680 ActionBase currentAction = actionMgr.GetRunningAction();
6681 if (currentAction)
6682 currentAction.OnItemLocationChanged(this);
6683 }
6684 }
6685
6686 Man ownerPlayerOld = null;
6687 Man ownerPlayerNew = null;
6688
6689 if (old_owner)
6690 {
6691 if (old_owner.IsMan())
6692 {
6693 ownerPlayerOld = Man.Cast(old_owner);
6694 }
6695 else
6696 {
6697 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6698 }
6699 }
6700 else
6701 {
6702 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
6703 {
6704 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
6705
6706 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
6707 {
6708 GetCompEM().UnplugThis();
6709 }
6710 }
6711 }
6712
6713 if (new_owner)
6714 {
6715 if (new_owner.IsMan())
6716 {
6717 ownerPlayerNew = Man.Cast(new_owner);
6718 }
6719 else
6720 {
6721 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6722 }
6723 }
6724
6725 if (ownerPlayerOld != ownerPlayerNew)
6726 {
6727 if (ownerPlayerOld)
6728 {
6729 array<EntityAI> subItemsExit = new array<EntityAI>;
6730 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
6731 for (int i = 0; i < subItemsExit.Count(); i++)
6732 {
6733 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
6734 itemExit.OnInventoryExit(ownerPlayerOld);
6735 }
6736 }
6737
6738 if (ownerPlayerNew)
6739 {
6740 array<EntityAI> subItemsEnter = new array<EntityAI>;
6741 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
6742 for (int j = 0; j < subItemsEnter.Count(); j++)
6743 {
6744 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
6745 itemEnter.OnInventoryEnter(ownerPlayerNew);
6746 }
6747 }
6748 }
6749 else if (ownerPlayerNew != null)
6750 {
6751 PlayerBase nplayer;
6752 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6753 {
6754 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6755 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
6756 for (int k = 0; k < subItemsUpdate.Count(); k++)
6757 {
6758 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
6759 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6760 }
6761 }
6762 }
6763
6764 if (old_owner)
6765 old_owner.OnChildItemRemoved(this);
6766 if (new_owner)
6767 new_owner.OnChildItemReceived(this);
6768 }
6769
6770 // -------------------------------------------------------------------------------
6771 override void EEDelete(EntityAI parent)
6772 {
6773 super.EEDelete(parent);
6774 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6775 if (player)
6776 {
6777 OnInventoryExit(player);
6778
6779 if (player.IsAlive())
6780 {
6781 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6782 if (r_index >= 0)
6783 {
6784 InventoryLocation r_il = new InventoryLocation;
6785 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6786
6787 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6788 int r_type = r_il.GetType();
6789 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6790 {
6791 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6792 }
6793 else if (r_type == InventoryLocationType.ATTACHMENT)
6794 {
6795 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
6796 }
6797
6798 }
6799
6800 player.RemoveQuickBarEntityShortcut(this);
6801 }
6802 }
6803 }
6804 // -------------------------------------------------------------------------------
6805 override void EEKilled(Object killer)
6806 {
6807 super.EEKilled(killer);
6808
6810 if (killer && killer.IsFireplace() && CanExplodeInFire())
6811 {
6812 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6813 {
6814 if (IsMagazine())
6815 {
6816 if (Magazine.Cast(this).GetAmmoCount() > 0)
6817 {
6818 ExplodeAmmo();
6819 }
6820 }
6821 else
6822 {
6823 Explode(DamageType.EXPLOSION);
6824 }
6825 }
6826 }
6827 }
6828
6829 override void OnWasAttached(EntityAI parent, int slot_id)
6830 {
6831 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6832
6833 super.OnWasAttached(parent, slot_id);
6834
6835 if (HasQuantity())
6836 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6837
6838 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
6839 }
6840
6841 override void OnWasDetached(EntityAI parent, int slot_id)
6842 {
6843 super.OnWasDetached(parent, slot_id);
6844
6845 if (HasQuantity())
6846 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6847 }
6848
6849 override string ChangeIntoOnAttach(string slot)
6850 {
6851 int idx;
6852 TStringArray inventory_slots = new TStringArray;
6853 TStringArray attach_types = new TStringArray;
6854
6855 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6856 if (inventory_slots.Count() < 1) //is string
6857 {
6858 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6859 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6860 }
6861 else //is array
6862 {
6863 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6864 }
6865
6866 idx = inventory_slots.Find(slot);
6867 if (idx < 0)
6868 return "";
6869
6870 return attach_types.Get(idx);
6871 }
6872
6873 override string ChangeIntoOnDetach()
6874 {
6875 int idx = -1;
6876 string slot;
6877
6878 TStringArray inventory_slots = new TStringArray;
6879 TStringArray detach_types = new TStringArray;
6880
6881 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6882 if (inventory_slots.Count() < 1) //is string
6883 {
6884 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6885 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6886 }
6887 else //is array
6888 {
6889 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6890 if (detach_types.Count() < 1)
6891 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6892 }
6893
6894 for (int i = 0; i < inventory_slots.Count(); i++)
6895 {
6896 slot = inventory_slots.Get(i);
6897 }
6898
6899 if (slot != "")
6900 {
6901 if (detach_types.Count() == 1)
6902 idx = 0;
6903 else
6904 idx = inventory_slots.Find(slot);
6905 }
6906 if (idx < 0)
6907 return "";
6908
6909 return detach_types.Get(idx);
6910 }
6911
6912 void ExplodeAmmo()
6913 {
6914 //timer
6915 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
6916
6917 //min/max time
6918 float min_time = 1;
6919 float max_time = 3;
6920 float delay = Math.RandomFloat(min_time, max_time);
6921
6922 explode_timer.Run(delay, this, "DoAmmoExplosion");
6923 }
6924
6925 void DoAmmoExplosion()
6926 {
6927 Magazine magazine = Magazine.Cast(this);
6928 int pop_sounds_count = 6;
6929 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6930
6931 //play sound
6932 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6933 string sound_name = pop_sounds[ sound_idx ];
6934 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
6935
6936 //remove ammo count
6937 magazine.ServerAddAmmoCount(-1);
6938
6939 //if condition then repeat -> ExplodeAmmo
6940 float min_temp_to_explode = 100; //min temperature for item to explode
6941
6942 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
6943 {
6944 ExplodeAmmo();
6945 }
6946 }
6947
6948 // -------------------------------------------------------------------------------
6949 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
6950 {
6951 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
6952
6953 const int CHANCE_DAMAGE_CARGO = 4;
6954 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6955 const int CHANCE_DAMAGE_NOTHING = 2;
6956
6957 if (IsClothing() || IsContainer() || IsItemTent())
6958 {
6959 float dmg = damageResult.GetDamage("","Health") * -0.5;
6960 int chances;
6961 int rnd;
6962
6963 if (GetInventory().GetCargo())
6964 {
6965 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6966 rnd = Math.RandomInt(0,chances);
6967
6968 if (rnd < CHANCE_DAMAGE_CARGO)
6969 {
6970 DamageItemInCargo(dmg);
6971 }
6972 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6973 {
6975 }
6976 }
6977 else
6978 {
6979 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6980 rnd = Math.RandomInt(0,chances);
6981
6982 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6983 {
6985 }
6986 }
6987 }
6988 }
6989
6990 bool DamageItemInCargo(float damage)
6991 {
6992 if (GetInventory().GetCargo())
6993 {
6994 int item_count = GetInventory().GetCargo().GetItemCount();
6995 if (item_count > 0)
6996 {
6997 int random_pick = Math.RandomInt(0, item_count);
6998 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
6999 if (!item.IsExplosive())
7000 {
7001 item.AddHealth("","",damage);
7002 return true;
7003 }
7004 }
7005 }
7006 return false;
7007 }
7008
7009 bool DamageItemAttachments(float damage)
7010 {
7011 int attachment_count = GetInventory().AttachmentCount();
7012 if (attachment_count > 0)
7013 {
7014 int random_pick = Math.RandomInt(0, attachment_count);
7015 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7016 if (!attachment.IsExplosive())
7017 {
7018 attachment.AddHealth("","",damage);
7019 return true;
7020 }
7021 }
7022 return false;
7023 }
7024
7025 override bool IsSplitable()
7026 {
7027 return m_CanThisBeSplit;
7028 }
7029 //----------------
7030 override bool CanBeSplit()
7031 {
7032 if (IsSplitable() && (GetQuantity() > 1))
7033 return GetInventory().CanRemoveEntity();
7034
7035 return false;
7036 }
7037
7038 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
7039 {
7040 if (!CanBeSplit())
7041 return;
7042
7043 if (GetGame().IsClient())
7044 {
7045 if (ScriptInputUserData.CanStoreInputUserData())
7046 {
7047 ScriptInputUserData ctx = new ScriptInputUserData;
7049 ctx.Write(1);
7050 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7051 ctx.Write(i1);
7052 ctx.Write(destination_entity);
7053 ctx.Write(true);
7054 ctx.Write(slot_id);
7055 ctx.Send();
7056 }
7057 }
7058 else if (!GetGame().IsMultiplayer())
7059 {
7060 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
7061 }
7062 }
7063
7064 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
7065 {
7066 if (!CanBeSplit())
7067 return;
7068
7069 float split_quantity_new;
7070 ref ItemBase new_item;
7071 float quantity = GetQuantity();
7072 float stack_max = GetTargetQuantityMax(slot_id);
7073 InventoryLocation loc = new InventoryLocation;
7074
7075 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7076 {
7077 if (stack_max <= GetQuantity())
7078 split_quantity_new = stack_max;
7079 else
7080 split_quantity_new = GetQuantity();
7081
7082 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7083 if (new_item)
7084 {
7085 new_item.SetResultOfSplit(true);
7086 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7087 AddQuantity(-split_quantity_new);
7088 new_item.SetQuantity(split_quantity_new);
7089 }
7090 }
7091 else if (destination_entity && slot_id == -1)
7092 {
7093 if (quantity > stack_max)
7094 split_quantity_new = stack_max;
7095 else
7096 split_quantity_new = quantity;
7097
7098 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7099 {
7100 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7101 new_item = ItemBase.Cast(o);
7102 }
7103
7104 if (new_item)
7105 {
7106 new_item.SetResultOfSplit(true);
7107 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7108 AddQuantity(-split_quantity_new);
7109 new_item.SetQuantity(split_quantity_new);
7110 }
7111 }
7112 else
7113 {
7114 if (stack_max != 0)
7115 {
7116 if (stack_max < GetQuantity())
7117 {
7118 split_quantity_new = GetQuantity() - stack_max;
7119 }
7120
7121 if (split_quantity_new == 0)
7122 {
7123 if (!GetGame().IsMultiplayer())
7124 player.PhysicalPredictiveDropItem(this);
7125 else
7126 player.ServerDropEntity(this);
7127 return;
7128 }
7129
7130 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7131
7132 if (new_item)
7133 {
7134 new_item.SetResultOfSplit(true);
7135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7136 SetQuantity(split_quantity_new);
7137 new_item.SetQuantity(stack_max);
7138 new_item.PlaceOnSurface();
7139 }
7140 }
7141 }
7142 }
7143
7144 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
7145 {
7146 if (!CanBeSplit())
7147 return;
7148
7149 float split_quantity_new;
7150 ref ItemBase new_item;
7151 float quantity = GetQuantity();
7152 float stack_max = GetTargetQuantityMax(slot_id);
7153 InventoryLocation loc = new InventoryLocation;
7154
7155 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7156 {
7157 if (stack_max <= GetQuantity())
7158 split_quantity_new = stack_max;
7159 else
7160 split_quantity_new = GetQuantity();
7161
7162 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7163 if (new_item)
7164 {
7165 new_item.SetResultOfSplit(true);
7166 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7167 AddQuantity(-split_quantity_new);
7168 new_item.SetQuantity(split_quantity_new);
7169 }
7170 }
7171 else if (destination_entity && slot_id == -1)
7172 {
7173 if (quantity > stack_max)
7174 split_quantity_new = stack_max;
7175 else
7176 split_quantity_new = quantity;
7177
7178 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7179 {
7180 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7181 new_item = ItemBase.Cast(o);
7182 }
7183
7184 if (new_item)
7185 {
7186 new_item.SetResultOfSplit(true);
7187 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7188 AddQuantity(-split_quantity_new);
7189 new_item.SetQuantity(split_quantity_new);
7190 }
7191 }
7192 else
7193 {
7194 if (stack_max != 0)
7195 {
7196 if (stack_max < GetQuantity())
7197 {
7198 split_quantity_new = GetQuantity() - stack_max;
7199 }
7200
7201 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7202
7203 if (new_item)
7204 {
7205 new_item.SetResultOfSplit(true);
7206 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7207 SetQuantity(split_quantity_new);
7208 new_item.SetQuantity(stack_max);
7209 new_item.PlaceOnSurface();
7210 }
7211 }
7212 }
7213 }
7214
7215 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
7216 {
7217 if (!CanBeSplit())
7218 return;
7219
7220 if (GetGame().IsClient())
7221 {
7222 if (ScriptInputUserData.CanStoreInputUserData())
7223 {
7224 ScriptInputUserData ctx = new ScriptInputUserData;
7226 ctx.Write(4);
7227 ItemBase thiz = this; // @NOTE: workaround for correct serialization
7228 ctx.Write(thiz);
7229 dst.WriteToContext(ctx);
7230 ctx.Send();
7231 }
7232 }
7233 else if (!GetGame().IsMultiplayer())
7234 {
7236 }
7237 }
7238
7239 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
7240 {
7241 if (!CanBeSplit())
7242 return;
7243
7244 if (GetGame().IsClient())
7245 {
7246 if (ScriptInputUserData.CanStoreInputUserData())
7247 {
7248 ScriptInputUserData ctx = new ScriptInputUserData;
7250 ctx.Write(2);
7251 ItemBase dummy = this; // @NOTE: workaround for correct serialization
7252 ctx.Write(dummy);
7253 ctx.Write(destination_entity);
7254 ctx.Write(true);
7255 ctx.Write(idx);
7256 ctx.Write(row);
7257 ctx.Write(col);
7258 ctx.Send();
7259 }
7260 }
7261 else if (!GetGame().IsMultiplayer())
7262 {
7263 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
7264 }
7265 }
7266
7267 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
7268 {
7270 }
7271
7272 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
7273 {
7274 if (!CanBeSplit())
7275 return this;
7276
7277 float quantity = GetQuantity();
7278 float split_quantity_new;
7279 ItemBase new_item;
7280 if (dst.IsValid())
7281 {
7282 int slot_id = dst.GetSlot();
7283 float stack_max = GetTargetQuantityMax(slot_id);
7284
7285 if (quantity > stack_max)
7286 split_quantity_new = stack_max;
7287 else
7288 split_quantity_new = quantity;
7289
7290 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
7291
7292 if (new_item)
7293 {
7294 new_item.SetResultOfSplit(true);
7295 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7296 AddQuantity(-split_quantity_new);
7297 new_item.SetQuantity(split_quantity_new);
7298 }
7299
7300 return new_item;
7301 }
7302
7303 return null;
7304 }
7305
7306 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
7307 {
7308 if (!CanBeSplit())
7309 return;
7310
7311 float quantity = GetQuantity();
7312 float split_quantity_new;
7313 ref ItemBase new_item;
7314 if (destination_entity)
7315 {
7316 float stackable = GetTargetQuantityMax();
7317 if (quantity > stackable)
7318 split_quantity_new = stackable;
7319 else
7320 split_quantity_new = quantity;
7321
7322 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
7323 if (new_item)
7324 {
7325 new_item.SetResultOfSplit(true);
7326 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7327 AddQuantity(-split_quantity_new);
7328 new_item.SetQuantity(split_quantity_new);
7329 }
7330 }
7331 }
7332
7333 void SplitIntoStackMaxHandsClient(PlayerBase player)
7334 {
7335 if (!CanBeSplit())
7336 return;
7337
7338 if (GetGame().IsClient())
7339 {
7340 if (ScriptInputUserData.CanStoreInputUserData())
7341 {
7342 ScriptInputUserData ctx = new ScriptInputUserData;
7344 ctx.Write(3);
7345 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7346 ctx.Write(i1);
7347 ItemBase destination_entity = this;
7348 ctx.Write(destination_entity);
7349 ctx.Write(true);
7350 ctx.Write(0);
7351 ctx.Send();
7352 }
7353 }
7354 else if (!GetGame().IsMultiplayer())
7355 {
7356 SplitIntoStackMaxHands(player);
7357 }
7358 }
7359
7360 void SplitIntoStackMaxHands(PlayerBase player)
7361 {
7362 if (!CanBeSplit())
7363 return;
7364
7365 float quantity = GetQuantity();
7366 float split_quantity_new;
7367 ref ItemBase new_item;
7368 if (player)
7369 {
7370 float stackable = GetTargetQuantityMax();
7371 if (quantity > stackable)
7372 split_quantity_new = stackable;
7373 else
7374 split_quantity_new = quantity;
7375
7376 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
7377 new_item = ItemBase.Cast(in_hands);
7378 if (new_item)
7379 {
7380 new_item.SetResultOfSplit(true);
7381 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7382 AddQuantity(-split_quantity_new);
7383 new_item.SetQuantity(split_quantity_new);
7384 }
7385 }
7386 }
7387
7388 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
7389 {
7390 if (!CanBeSplit())
7391 return;
7392
7393 float quantity = GetQuantity();
7394 float split_quantity_new = Math.Floor(quantity * 0.5);
7395
7396 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
7397
7398 if (new_item)
7399 {
7400 if (new_item.GetQuantityMax() < split_quantity_new)
7401 {
7402 split_quantity_new = new_item.GetQuantityMax();
7403 }
7404
7405 new_item.SetResultOfSplit(true);
7406 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7407
7408 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
7409 {
7410 AddQuantity(-1);
7411 new_item.SetQuantity(1);
7412 }
7413 else
7414 {
7415 AddQuantity(-split_quantity_new);
7416 new_item.SetQuantity(split_quantity_new);
7417 }
7418 }
7419 }
7420
7421 void SplitItem(PlayerBase player)
7422 {
7423 if (!CanBeSplit())
7424 return;
7425
7426 float quantity = GetQuantity();
7427 float split_quantity_new = Math.Floor(quantity / 2);
7428
7429 InventoryLocation invloc = new InventoryLocation;
7430 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
7431
7432 ItemBase new_item;
7433 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7434
7435 if (new_item)
7436 {
7437 if (new_item.GetQuantityMax() < split_quantity_new)
7438 {
7439 split_quantity_new = new_item.GetQuantityMax();
7440 }
7441 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
7442 {
7443 AddQuantity(-1);
7444 new_item.SetQuantity(1);
7445 }
7446 else
7447 {
7448 AddQuantity(-split_quantity_new);
7449 new_item.SetQuantity(split_quantity_new);
7450 }
7451 }
7452 }
7453
7455 void OnQuantityChanged(float delta)
7456 {
7457 SetWeightDirty();
7458 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
7459
7460 if (parent)
7461 parent.OnAttachmentQuantityChangedEx(this, delta);
7462
7463 if (IsLiquidContainer())
7464 {
7465 if (GetQuantityNormalized() <= 0.0)
7466 {
7468 }
7469 else if (GetLiquidType() == LIQUID_NONE)
7470 {
7471 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
7473 }
7474 }
7475
7476 }
7477
7480 {
7481 // insert code here
7482 }
7483
7485 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
7486 {
7488 }
7489
7490 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
7491 {
7492 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7493
7494 if (GetGame().IsServer())
7495 {
7496 if (newLevel == GameConstants.STATE_RUINED)
7497 {
7499 EntityAI parent = GetHierarchyParent();
7500 if (parent && parent.IsFireplace())
7501 {
7502 CargoBase cargo = GetInventory().GetCargo();
7503 if (cargo)
7504 {
7505 for (int i = 0; i < cargo.GetItemCount(); ++i)
7506 {
7507 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
7508 }
7509 }
7510 }
7511 }
7512
7513 if (IsResultOfSplit())
7514 {
7515 // reset the splitting result flag, return to normal item behavior
7516 SetResultOfSplit(false);
7517 return;
7518 }
7519
7520 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7521 {
7522 SetCleanness(0);//unclean the item upon damage dealt
7523 }
7524 }
7525 }
7526
7527 // just the split? TODO: verify
7528 override void OnRightClick()
7529 {
7530 super.OnRightClick();
7531
7532 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
7533 {
7534 if (GetGame().IsClient())
7535 {
7536 if (ScriptInputUserData.CanStoreInputUserData())
7537 {
7538 vector m4[4];
7539 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
7540
7541 EntityAI root = GetHierarchyRoot();
7542
7543 InventoryLocation dst = new InventoryLocation;
7544 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
7545 {
7546 if (root)
7547 {
7548 root.GetTransform(m4);
7549 dst.SetGround(this, m4);
7550 }
7551 else
7552 GetInventory().GetCurrentInventoryLocation(dst);
7553 }
7554 else
7555 {
7556 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
7557 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
7558 this shouldnt cause issues within this scope*/
7559 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
7560 {
7561 if (root)
7562 {
7563 root.GetTransform(m4);
7564 dst.SetGround(this, m4);
7565 }
7566 else
7567 GetInventory().GetCurrentInventoryLocation(dst);
7568 }
7569 else
7570 {
7571 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7572 }
7573 }
7574
7575 ScriptInputUserData ctx = new ScriptInputUserData;
7577 ctx.Write(4);
7578 ItemBase thiz = this; // @NOTE: workaround for correct serialization
7579 ctx.Write(thiz);
7580 dst.WriteToContext(ctx);
7581 ctx.Write(true); // dummy
7582 ctx.Send();
7583 }
7584 }
7585 else if (!GetGame().IsMultiplayer())
7586 {
7587 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
7588 }
7589 }
7590 }
7591
7592 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
7593 {
7594 //TODO: delete check zero quantity check after fix double posts hands fsm events
7595 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
7596 return false;
7597
7598 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7599 return false;
7600
7601 //can_this_be_combined = ConfigGetBool("canBeSplit");
7603 return false;
7604
7605
7606 Magazine mag = Magazine.Cast(this);
7607 if (mag)
7608 {
7609 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7610 return false;
7611
7612 if (stack_max_limit)
7613 {
7614 Magazine other_mag = Magazine.Cast(other_item);
7615 if (other_item)
7616 {
7617 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7618 return false;
7619 }
7620
7621 }
7622 }
7623 else
7624 {
7625 //TODO: delete check zero quantity check after fix double posts hands fsm events
7626 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
7627 return false;
7628
7629 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
7630 return false;
7631 }
7632
7633 PlayerBase player = null;
7634 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
7635 {
7636 if (player.GetInventory().HasAttachment(this))
7637 return false;
7638
7639 if (player.IsItemsToDelete())
7640 return false;
7641 }
7642
7643 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7644 return false;
7645
7646 int slotID;
7647 string slotName;
7648 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7649 return false;
7650
7651 return true;
7652 }
7653
7654 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
7655 {
7656 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
7657 }
7658
7659 bool IsResultOfSplit()
7660 {
7661 return m_IsResultOfSplit;
7662 }
7663
7664 void SetResultOfSplit(bool value)
7665 {
7666 m_IsResultOfSplit = value;
7667 }
7668
7669 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
7670 {
7671 return ComputeQuantityUsedEx(other_item, use_stack_max);
7672 }
7673
7674 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
7675 {
7676 float other_item_quantity = other_item.GetQuantity();
7677 float this_free_space;
7678
7679 float stack_max = GetQuantityMax();
7680
7681 this_free_space = stack_max - GetQuantity();
7682
7683 if (other_item_quantity > this_free_space)
7684 {
7685 return this_free_space;
7686 }
7687 else
7688 {
7689 return other_item_quantity;
7690 }
7691 }
7692
7693 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
7694 {
7695 CombineItems(ItemBase.Cast(entity2),use_stack_max);
7696 }
7697
7698 void CombineItems(ItemBase other_item, bool use_stack_max = true)
7699 {
7700 if (!CanBeCombined(other_item, false))
7701 return;
7702
7703 if (!IsMagazine() && other_item)
7704 {
7705 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
7706 if (quantity_used != 0)
7707 {
7708 float hp1 = GetHealth01("","");
7709 float hp2 = other_item.GetHealth01("","");
7710 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
7711 hpResult = hpResult / (GetQuantity() + quantity_used);
7712
7713 hpResult *= GetMaxHealth();
7714 Math.Round(hpResult);
7715 SetHealth("", "Health", hpResult);
7716
7717 AddQuantity(quantity_used);
7718 other_item.AddQuantity(-quantity_used);
7719 }
7720 }
7721 OnCombine(other_item);
7722 }
7723
7724 void OnCombine(ItemBase other_item)
7725 {
7726 #ifdef SERVER
7727 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7728 GetHierarchyParent().IncreaseLifetimeUp();
7729 #endif
7730 };
7731
7732 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
7733 {
7734 PlayerBase p = PlayerBase.Cast(player);
7735
7736 array<int> recipesIds = p.m_Recipes;
7737 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7738 if (moduleRecipesManager)
7739 {
7740 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7741 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
7742 }
7743
7744 for (int i = 0;i < recipesIds.Count(); i++)
7745 {
7746 int key = recipesIds.Get(i);
7747 string recipeName = moduleRecipesManager.GetRecipeName(key);
7748 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
7749 }
7750 }
7751
7752 // -------------------------------------------------------------------------
7753 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7754 {
7755 super.GetDebugActions(outputList);
7756
7757 //quantity
7758 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
7759 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
7760 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
7761 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
7762
7763 //health
7764 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
7765 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
7766 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
7767 //temperature
7768 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
7769 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
7770 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
7771
7772 //wet
7773 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
7774 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
7775
7776 //liquidtype
7777 if (IsLiquidContainer())
7778 {
7779 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
7780 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
7781 }
7782
7783 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
7784 // watch
7785 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
7786 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
7787
7788 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7789 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
7790 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
7791 }
7792
7793 // -------------------------------------------------------------------------
7794 // -------------------------------------------------------------------------
7795 // -------------------------------------------------------------------------
7796 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
7797 {
7798 super.OnAction(action_id, player, ctx);
7799 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
7800 {
7801 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
7802 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
7803 PlayerBase p = PlayerBase.Cast(player);
7804 if (EActions.RECIPES_RANGE_START < 1000)
7805 {
7806 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7807 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7808 }
7809 }
7810 #ifndef SERVER
7811 else if (action_id == EActions.WATCH_PLAYER)
7812 {
7813 PluginDeveloper.SetDeveloperItemClientEx(player);
7814 }
7815 #endif
7816 if (GetGame().IsServer())
7817 {
7818 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7819 {
7820 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7821 OnDebugButtonPressServer(id + 1);
7822 }
7823
7824 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7825 {
7826 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7827 InsertAgent(agent_id,100);
7828 }
7829
7830 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7831 {
7832 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7833 RemoveAgent(agent_id2);
7834 }
7835
7836 else if (action_id == EActions.ADD_QUANTITY)
7837 {
7838 if (IsMagazine())
7839 {
7840 Magazine mag = Magazine.Cast(this);
7841 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7842 }
7843 else
7844 {
7845 AddQuantity(GetQuantityMax() * 0.2);
7846 }
7847
7848 if (m_EM)
7849 {
7850 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7851 }
7852 //PrintVariables();
7853 }
7854
7855 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
7856 {
7857 if (IsMagazine())
7858 {
7859 Magazine mag2 = Magazine.Cast(this);
7860 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7861 }
7862 else
7863 {
7864 AddQuantity(- GetQuantityMax() * 0.2);
7865 }
7866 if (m_EM)
7867 {
7868 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7869 }
7870 //PrintVariables();
7871 }
7872
7873 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
7874 {
7875 SetQuantity(0);
7876
7877 if (m_EM)
7878 {
7879 m_EM.SetEnergy(0);
7880 }
7881 }
7882
7883 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
7884 {
7886
7887 if (m_EM)
7888 {
7889 m_EM.SetEnergy(m_EM.GetEnergyMax());
7890 }
7891 }
7892
7893 else if (action_id == EActions.ADD_HEALTH)
7894 {
7895 AddHealth("","",GetMaxHealth("","Health")/5);
7896 }
7897 else if (action_id == EActions.REMOVE_HEALTH)
7898 {
7899 AddHealth("","",-GetMaxHealth("","Health")/5);
7900 }
7901 else if (action_id == EActions.DESTROY_HEALTH)
7902 {
7903 SetHealth01("","",0);
7904 }
7905 else if (action_id == EActions.WATCH_ITEM)
7906 {
7908 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
7909 #ifdef DEVELOPER
7910 SetDebugDeveloper_item(this);
7911 #endif
7912 }
7913
7914 else if (action_id == EActions.ADD_TEMPERATURE)
7915 {
7916 AddTemperature(20);
7917 //PrintVariables();
7918 }
7919
7920 else if (action_id == EActions.REMOVE_TEMPERATURE)
7921 {
7922 AddTemperature(-20);
7923 //PrintVariables();
7924 }
7925
7926 else if (action_id == EActions.FLIP_FROZEN)
7927 {
7928 SetFrozen(!GetIsFrozen());
7929 //PrintVariables();
7930 }
7931
7932 else if (action_id == EActions.ADD_WETNESS)
7933 {
7934 AddWet(GetWetMax()/5);
7935 //PrintVariables();
7936 }
7937
7938 else if (action_id == EActions.REMOVE_WETNESS)
7939 {
7940 AddWet(-GetWetMax()/5);
7941 //PrintVariables();
7942 }
7943
7944 else if (action_id == EActions.LIQUIDTYPE_UP)
7945 {
7946 int curr_type = GetLiquidType();
7947 SetLiquidType(curr_type * 2);
7948 //AddWet(1);
7949 //PrintVariables();
7950 }
7951
7952 else if (action_id == EActions.LIQUIDTYPE_DOWN)
7953 {
7954 int curr_type2 = GetLiquidType();
7955 SetLiquidType(curr_type2 / 2);
7956 }
7957
7958 else if (action_id == EActions.MAKE_SPECIAL)
7959 {
7960 auto debugParams = DebugSpawnParams.WithPlayer(player);
7961 OnDebugSpawnEx(debugParams);
7962 }
7963
7964 else if (action_id == EActions.DELETE)
7965 {
7966 Delete();
7967 }
7968
7969 }
7970
7971
7972 return false;
7973 }
7974
7975 // -------------------------------------------------------------------------
7976
7977
7980 void OnActivatedByTripWire();
7981
7983 void OnActivatedByItem(notnull ItemBase item);
7984
7985 //----------------------------------------------------------------
7986 //returns true if item is able to explode when put in fire
7987 bool CanExplodeInFire()
7988 {
7989 return false;
7990 }
7991
7992 //----------------------------------------------------------------
7993 bool CanEat()
7994 {
7995 return true;
7996 }
7997
7998 //----------------------------------------------------------------
7999 override bool IsIgnoredByConstruction()
8000 {
8001 return true;
8002 }
8003
8004 //----------------------------------------------------------------
8005 //has FoodStages in config?
8006 bool HasFoodStage()
8007 {
8008 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
8009 return GetGame().ConfigIsExisting(config_path);
8010 }
8011
8013 FoodStage GetFoodStage()
8014 {
8015 return null;
8016 }
8017
8018 bool CanBeCooked()
8019 {
8020 return false;
8021 }
8022
8023 bool CanBeCookedOnStick()
8024 {
8025 return false;
8026 }
8027
8029 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
8031
8032 //----------------------------------------------------------------
8033 bool CanRepair(ItemBase item_repair_kit)
8034 {
8035 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8036 return module_repairing.CanRepair(this, item_repair_kit);
8037 }
8038
8039 //----------------------------------------------------------------
8040 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
8041 {
8042 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8043 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8044 }
8045
8046 //----------------------------------------------------------------
8047 int GetItemSize()
8048 {
8049 /*
8050 vector v_size = this.ConfigGetVector("itemSize");
8051 int v_size_x = v_size[0];
8052 int v_size_y = v_size[1];
8053 int size = v_size_x * v_size_y;
8054 return size;
8055 */
8056
8057 return 1;
8058 }
8059
8060 //----------------------------------------------------------------
8061 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8062 bool CanBeMovedOverride()
8063 {
8064 return m_CanBeMovedOverride;
8065 }
8066
8067 //----------------------------------------------------------------
8068 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8069 void SetCanBeMovedOverride(bool setting)
8070 {
8071 m_CanBeMovedOverride = setting;
8072 }
8073
8074 //----------------------------------------------------------------
8082 void MessageToOwnerStatus(string text)
8083 {
8084 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8085
8086 if (player)
8087 {
8088 player.MessageStatus(text);
8089 }
8090 }
8091
8092 //----------------------------------------------------------------
8100 void MessageToOwnerAction(string text)
8101 {
8102 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8103
8104 if (player)
8105 {
8106 player.MessageAction(text);
8107 }
8108 }
8109
8110 //----------------------------------------------------------------
8118 void MessageToOwnerFriendly(string text)
8119 {
8120 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8121
8122 if (player)
8123 {
8124 player.MessageFriendly(text);
8125 }
8126 }
8127
8128 //----------------------------------------------------------------
8136 void MessageToOwnerImportant(string text)
8137 {
8138 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8139
8140 if (player)
8141 {
8142 player.MessageImportant(text);
8143 }
8144 }
8145
8146 override bool IsItemBase()
8147 {
8148 return true;
8149 }
8150
8151 // Checks if item is of questioned kind
8152 override bool KindOf(string tag)
8153 {
8154 bool found = false;
8155 string item_name = this.GetType();
8156 ref TStringArray item_tag_array = new TStringArray;
8157 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
8158
8159 int array_size = item_tag_array.Count();
8160 for (int i = 0; i < array_size; i++)
8161 {
8162 if (item_tag_array.Get(i) == tag)
8163 {
8164 found = true;
8165 break;
8166 }
8167 }
8168 return found;
8169 }
8170
8171
8172 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
8173 {
8174 //Debug.Log("OnRPC called");
8175 super.OnRPC(sender, rpc_type,ctx);
8176
8177 //Play soundset for attachment locking (ActionLockAttachment.c)
8178 switch (rpc_type)
8179 {
8180 #ifndef SERVER
8181 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8182 Param2<bool, string> p = new Param2<bool, string>(false, "");
8183
8184 if (!ctx.Read(p))
8185 return;
8186
8187 bool play = p.param1;
8188 string soundSet = p.param2;
8189
8190 if (play)
8191 {
8192 if (m_LockingSound)
8193 {
8195 {
8196 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8197 }
8198 }
8199 else
8200 {
8201 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8202 }
8203 }
8204 else
8205 {
8206 SEffectManager.DestroyEffect(m_LockingSound);
8207 }
8208
8209 break;
8210 #endif
8211
8212 }
8213
8214 if (GetWrittenNoteData())
8215 {
8216 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
8217 }
8218 }
8219
8220 //-----------------------------
8221 // VARIABLE MANIPULATION SYSTEM
8222 //-----------------------------
8223 int NameToID(string name)
8224 {
8225 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
8226 return plugin.GetID(name);
8227 }
8228
8229 string IDToName(int id)
8230 {
8231 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
8232 return plugin.GetName(id);
8233 }
8234
8236 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
8237 {
8238 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
8239 //read the flags
8240 int varFlags;
8241 if (!ctx.Read(varFlags))
8242 return;
8243
8244 if (varFlags & ItemVariableFlags.FLOAT)
8245 {
8246 ReadVarsFromCTX(ctx);
8247 }
8248 }
8249
8250 override void SerializeNumericalVars(array<float> floats_out)
8251 {
8252 //some variables handled on EntityAI level already!
8253 super.SerializeNumericalVars(floats_out);
8254
8255 // the order of serialization must be the same as the order of de-serialization
8256 //--------------------------------------------
8257 if (IsVariableSet(VARIABLE_QUANTITY))
8258 {
8259 floats_out.Insert(m_VarQuantity);
8260 }
8261 //--------------------------------------------
8262 if (IsVariableSet(VARIABLE_WET))
8263 {
8264 floats_out.Insert(m_VarWet);
8265 }
8266 //--------------------------------------------
8267 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
8268 {
8269 floats_out.Insert(m_VarLiquidType);
8270 }
8271 //--------------------------------------------
8272 if (IsVariableSet(VARIABLE_COLOR))
8273 {
8274 floats_out.Insert(m_ColorComponentR);
8275 floats_out.Insert(m_ColorComponentG);
8276 floats_out.Insert(m_ColorComponentB);
8277 floats_out.Insert(m_ColorComponentA);
8278 }
8279 //--------------------------------------------
8280 if (IsVariableSet(VARIABLE_CLEANNESS))
8281 {
8282 floats_out.Insert(m_Cleanness);
8283 }
8284 }
8285
8286 override void DeSerializeNumericalVars(array<float> floats)
8287 {
8288 //some variables handled on EntityAI level already!
8289 super.DeSerializeNumericalVars(floats);
8290
8291 // the order of serialization must be the same as the order of de-serialization
8292 int index = 0;
8293 int mask = Math.Round(floats.Get(index));
8294
8295 index++;
8296 //--------------------------------------------
8297 if (mask & VARIABLE_QUANTITY)
8298 {
8299 if (m_IsStoreLoad)
8300 {
8301 SetStoreLoadedQuantity(floats.Get(index));
8302 }
8303 else
8304 {
8305 float quantity = floats.Get(index);
8306 SetQuantity(quantity, true, false, false, false);
8307 }
8308 index++;
8309 }
8310 //--------------------------------------------
8311 if (mask & VARIABLE_WET)
8312 {
8313 float wet = floats.Get(index);
8314 SetWet(wet);
8315 index++;
8316 }
8317 //--------------------------------------------
8318 if (mask & VARIABLE_LIQUIDTYPE)
8319 {
8320 int liquidtype = Math.Round(floats.Get(index));
8321 SetLiquidType(liquidtype);
8322 index++;
8323 }
8324 //--------------------------------------------
8325 if (mask & VARIABLE_COLOR)
8326 {
8327 m_ColorComponentR = Math.Round(floats.Get(index));
8328 index++;
8329 m_ColorComponentG = Math.Round(floats.Get(index));
8330 index++;
8331 m_ColorComponentB = Math.Round(floats.Get(index));
8332 index++;
8333 m_ColorComponentA = Math.Round(floats.Get(index));
8334 index++;
8335 }
8336 //--------------------------------------------
8337 if (mask & VARIABLE_CLEANNESS)
8338 {
8339 int cleanness = Math.Round(floats.Get(index));
8340 SetCleanness(cleanness);
8341 index++;
8342 }
8343 }
8344
8345 override void WriteVarsToCTX(ParamsWriteContext ctx)
8346 {
8347 super.WriteVarsToCTX(ctx);
8348
8349 //--------------------------------------------
8350 if (IsVariableSet(VARIABLE_QUANTITY))
8351 {
8352 ctx.Write(GetQuantity());
8353 }
8354 //--------------------------------------------
8355 if (IsVariableSet(VARIABLE_WET))
8356 {
8357 ctx.Write(GetWet());
8358 }
8359 //--------------------------------------------
8360 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
8361 {
8362 ctx.Write(GetLiquidType());
8363 }
8364 //--------------------------------------------
8365 if (IsVariableSet(VARIABLE_COLOR))
8366 {
8367 int r,g,b,a;
8368 GetColor(r,g,b,a);
8369 ctx.Write(r);
8370 ctx.Write(g);
8371 ctx.Write(b);
8372 ctx.Write(a);
8373 }
8374 //--------------------------------------------
8375 if (IsVariableSet(VARIABLE_CLEANNESS))
8376 {
8377 ctx.Write(GetCleanness());
8378 }
8379 }
8380
8381 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
8382 {
8383 if (!super.ReadVarsFromCTX(ctx,version))
8384 return false;
8385
8386 int intValue;
8387 float value;
8388
8389 if (version < 140)
8390 {
8391 if (!ctx.Read(intValue))
8392 return false;
8393
8394 m_VariablesMask = intValue;
8395 }
8396
8397 if (m_VariablesMask & VARIABLE_QUANTITY)
8398 {
8399 if (!ctx.Read(value))
8400 return false;
8401
8402 if (IsStoreLoad())
8403 {
8405 }
8406 else
8407 {
8408 SetQuantity(value, true, false, false, false);
8409 }
8410 }
8411 //--------------------------------------------
8412 if (version < 140)
8413 {
8414 if (m_VariablesMask & VARIABLE_TEMPERATURE)
8415 {
8416 if (!ctx.Read(value))
8417 return false;
8418 SetTemperatureDirect(value);
8419 }
8420 }
8421 //--------------------------------------------
8422 if (m_VariablesMask & VARIABLE_WET)
8423 {
8424 if (!ctx.Read(value))
8425 return false;
8426 SetWet(value);
8427 }
8428 //--------------------------------------------
8429 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
8430 {
8431 if (!ctx.Read(intValue))
8432 return false;
8433 SetLiquidType(intValue);
8434 }
8435 //--------------------------------------------
8436 if (m_VariablesMask & VARIABLE_COLOR)
8437 {
8438 int r,g,b,a;
8439 if (!ctx.Read(r))
8440 return false;
8441 if (!ctx.Read(g))
8442 return false;
8443 if (!ctx.Read(b))
8444 return false;
8445 if (!ctx.Read(a))
8446 return false;
8447
8448 SetColor(r,g,b,a);
8449 }
8450 //--------------------------------------------
8451 if (m_VariablesMask & VARIABLE_CLEANNESS)
8452 {
8453 if (!ctx.Read(intValue))
8454 return false;
8455 SetCleanness(intValue);
8456 }
8457 //--------------------------------------------
8458 if (version >= 138 && version < 140)
8459 {
8460 if (m_VariablesMask & VARIABLE_TEMPERATURE)
8461 {
8462 if (!ctx.Read(intValue))
8463 return false;
8464 SetFrozen(intValue);
8465 }
8466 }
8467
8468 return true;
8469 }
8470
8471 //----------------------------------------------------------------
8472 override bool OnStoreLoad(ParamsReadContext ctx, int version)
8473 {
8474 m_IsStoreLoad = true;
8476 {
8477 m_FixDamageSystemInit = true;
8478 }
8479
8480 if (!super.OnStoreLoad(ctx, version))
8481 {
8482 m_IsStoreLoad = false;
8483 return false;
8484 }
8485
8486 if (version >= 114)
8487 {
8488 bool hasQuickBarIndexSaved;
8489
8490 if (!ctx.Read(hasQuickBarIndexSaved))
8491 {
8492 m_IsStoreLoad = false;
8493 return false;
8494 }
8495
8496 if (hasQuickBarIndexSaved)
8497 {
8498 int itmQBIndex;
8499
8500 //Load quickbar item bind
8501 if (!ctx.Read(itmQBIndex))
8502 {
8503 m_IsStoreLoad = false;
8504 return false;
8505 }
8506
8507 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8508 if (itmQBIndex != -1 && parentPlayer)
8509 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8510 }
8511 }
8512 else
8513 {
8514 // Backup of how it used to be
8515 PlayerBase player;
8516 int itemQBIndex;
8517 if (version == int.MAX)
8518 {
8519 if (!ctx.Read(itemQBIndex))
8520 {
8521 m_IsStoreLoad = false;
8522 return false;
8523 }
8524 }
8525 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8526 {
8527 //Load quickbar item bind
8528 if (!ctx.Read(itemQBIndex))
8529 {
8530 m_IsStoreLoad = false;
8531 return false;
8532 }
8533 if (itemQBIndex != -1 && player)
8534 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8535 }
8536 }
8537
8538 if (version < 140)
8539 {
8540 // variable management system
8541 if (!LoadVariables(ctx, version))
8542 {
8543 m_IsStoreLoad = false;
8544 return false;
8545 }
8546 }
8547
8548 //agent trasmission system
8549 if (!LoadAgents(ctx, version))
8550 {
8551 m_IsStoreLoad = false;
8552 return false;
8553 }
8554 if (version >= 132)
8555 {
8556 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8557 if (raib)
8558 {
8559 if (!raib.OnStoreLoad(ctx,version))
8560 {
8561 m_IsStoreLoad = false;
8562 return false;
8563 }
8564 }
8565 }
8566
8567 m_IsStoreLoad = false;
8568 return true;
8569 }
8570
8571 //----------------------------------------------------------------
8572
8573 override void OnStoreSave(ParamsWriteContext ctx)
8574 {
8575 super.OnStoreSave(ctx);
8576
8577 PlayerBase player;
8578 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8579 {
8580 ctx.Write(true); // Keep track of if we should actually read this in or not
8581 //Save quickbar item bind
8582 int itemQBIndex = -1;
8583 itemQBIndex = player.FindQuickBarEntityIndex(this);
8584 ctx.Write(itemQBIndex);
8585 }
8586 else
8587 {
8588 ctx.Write(false); // Keep track of if we should actually read this in or not
8589 }
8590
8591 SaveAgents(ctx);//agent trasmission system
8592
8593 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
8594 if (raib)
8595 {
8596 raib.OnStoreSave(ctx);
8597 }
8598 }
8599 //----------------------------------------------------------------
8600
8601 override void AfterStoreLoad()
8602 {
8603 super.AfterStoreLoad();
8604
8606 {
8608 }
8609
8610 if (GetStoreLoadedQuantity() != float.LOWEST)
8611 {
8613 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
8614 }
8615 }
8616
8617 override void EEOnAfterLoad()
8618 {
8619 super.EEOnAfterLoad();
8620
8622 {
8623 m_FixDamageSystemInit = false;
8624 }
8625
8628 }
8629
8630 bool CanBeDisinfected()
8631 {
8632 return false;
8633 }
8634
8635
8636 //----------------------------------------------------------------
8637 override void OnVariablesSynchronized()
8638 {
8639 if (m_Initialized)
8640 {
8641 #ifdef PLATFORM_CONSOLE
8642 //bruteforce it is
8643 if (IsSplitable())
8644 {
8645 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
8646 if (menu)
8647 {
8648 menu.Refresh();
8649 }
8650 }
8651 #endif
8652 }
8653
8655 {
8656 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8657 m_WantPlayImpactSound = false;
8658 }
8659
8661 {
8662 SetWeightDirty();
8664 }
8665 if (m_VarWet != m_VarWetPrev)
8666 {
8669 }
8670
8671 if (m_SoundSyncPlay != 0)
8672 {
8673 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
8674 m_SoundSyncPlay = 0;
8675 }
8676 if (m_SoundSyncStop != 0)
8677 {
8678 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
8679 m_SoundSyncStop = 0;
8680 }
8681
8682 super.OnVariablesSynchronized();
8683 }
8684
8685 //------------------------- Quantity
8686 //----------------------------------------------------------------
8688 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
8689 {
8690 if (!IsServerCheck(allow_client))
8691 return false;
8692
8693 if (!HasQuantity())
8694 return false;
8695
8696 float min = GetQuantityMin();
8697 float max = GetQuantityMax();
8698
8699 if (value <= (min + 0.001))
8700 value = min;
8701
8702 if (value == min)
8703 {
8704 if (destroy_config)
8705 {
8706 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8707 if (dstr)
8708 {
8709 m_VarQuantity = Math.Clamp(value, min, max);
8710 this.Delete();
8711 return true;
8712 }
8713 }
8714 else if (destroy_forced)
8715 {
8716 m_VarQuantity = Math.Clamp(value, min, max);
8717 this.Delete();
8718 return true;
8719 }
8720 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
8721 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
8722 }
8723
8724 float delta = m_VarQuantity;
8725 m_VarQuantity = Math.Clamp(value, min, max);
8726
8727 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
8728 {
8729 delta = m_VarQuantity - delta;
8730
8731 if (delta)
8732 OnQuantityChanged(delta);
8733 }
8734
8735 SetVariableMask(VARIABLE_QUANTITY);
8736
8737 return false;
8738 }
8739
8740 //----------------------------------------------------------------
8742 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
8743 {
8744 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
8745 }
8746 //----------------------------------------------------------------
8747 void SetQuantityMax()
8748 {
8749 float max = GetQuantityMax();
8750 SetQuantity(max);
8751 }
8752
8753 override void SetQuantityToMinimum()
8754 {
8755 float min = GetQuantityMin();
8756 SetQuantity(min);
8757 }
8758 //----------------------------------------------------------------
8760 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
8761 {
8762 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
8763 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
8764 SetQuantity(result, destroy_config, destroy_forced);
8765 }
8766
8767 //----------------------------------------------------------------
8769 override float GetQuantityNormalized()
8770 {
8771 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
8772 }
8773
8775 {
8776 return GetQuantityNormalized();
8777 }
8778
8779 /*void SetAmmoNormalized(float value)
8780 {
8781 float value_clamped = Math.Clamp(value, 0, 1);
8782 Magazine this_mag = Magazine.Cast(this);
8783 int max_rounds = this_mag.GetAmmoMax();
8784 int result = value * max_rounds;//can the rounded if higher precision is required
8785 this_mag.SetAmmoCount(result);
8786 }*/
8787 //----------------------------------------------------------------
8788 override int GetQuantityMax()
8789 {
8790 int slot = -1;
8791 if (GetInventory())
8792 {
8793 InventoryLocation il = new InventoryLocation;
8794 GetInventory().GetCurrentInventoryLocation(il);
8795 slot = il.GetSlot();
8796 }
8797
8798 return GetTargetQuantityMax(slot);
8799 }
8800
8801 override int GetTargetQuantityMax(int attSlotID = -1)
8802 {
8803 float quantity_max = 0;
8804
8805 if (IsSplitable()) //only stackable/splitable items can check for stack size
8806 {
8807 if (attSlotID != -1)
8808 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8809
8810 if (quantity_max <= 0)
8811 quantity_max = m_VarStackMax;
8812 }
8813
8814 if (quantity_max <= 0)
8815 quantity_max = m_VarQuantityMax;
8816
8817 return quantity_max;
8818 }
8819 //----------------------------------------------------------------
8820 override int GetQuantityMin()
8821 {
8822 return m_VarQuantityMin;
8823 }
8824 //----------------------------------------------------------------
8825 int GetQuantityInit()
8826 {
8827 return m_VarQuantityInit;
8828 }
8829
8830 //----------------------------------------------------------------
8831 override bool HasQuantity()
8832 {
8833 return !(GetQuantityMax() - GetQuantityMin() == 0);
8834 }
8835
8836 override float GetQuantity()
8837 {
8838 return m_VarQuantity;
8839 }
8840
8841 bool IsFullQuantity()
8842 {
8843 return GetQuantity() >= GetQuantityMax();
8844 }
8845
8846 //Calculates weight of single item without attachments and cargo
8847 override float GetSingleInventoryItemWeightEx()
8848 {
8849 //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
8850 float weightEx = GetWeightEx();//overall weight of the item
8851 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
8852 return weightEx - special;
8853 }
8854
8855 // Obsolete, use GetSingleInventoryItemWeightEx() instead
8857 {
8859 }
8860
8861 override protected float GetWeightSpecialized(bool forceRecalc = false)
8862 {
8863 if (IsSplitable()) //quantity determines size of the stack
8864 {
8865 #ifdef DEVELOPER
8866 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8867 {
8868 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8869 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
8870 }
8871 #endif
8872
8873 return GetQuantity() * GetConfigWeightModified();
8874 }
8875 else if (HasEnergyManager())// items with energy manager
8876 {
8877 #ifdef DEVELOPER
8878 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8879 {
8880 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8881 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
8882 }
8883 #endif
8884 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8885 }
8886 else//everything else
8887 {
8888 #ifdef DEVELOPER
8889 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8890 {
8891 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8892 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
8893 }
8894 #endif
8895 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8896 }
8897 }
8898
8900 int GetNumberOfItems()
8901 {
8902 int item_count = 0;
8903 ItemBase item;
8904
8905 if (GetInventory().GetCargo() != NULL)
8906 {
8907 item_count = GetInventory().GetCargo().GetItemCount();
8908 }
8909
8910 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8911 {
8912 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8913 if (item)
8914 item_count += item.GetNumberOfItems();
8915 }
8916 return item_count;
8917 }
8918
8920 float GetUnitWeight(bool include_wetness = true)
8921 {
8922 float weight = 0;
8923 float wetness = 1;
8924 if (include_wetness)
8925 wetness += GetWet();
8926 if (IsSplitable()) //quantity determines size of the stack
8927 {
8928 weight = wetness * m_ConfigWeight;
8929 }
8930 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
8931 {
8932 weight = 1;
8933 }
8934 return weight;
8935 }
8936
8937 //-----------------------------------------------------------------
8938
8939 override void ClearInventory()
8940 {
8941 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
8942 {
8943 GameInventory inv = GetInventory();
8944 array<EntityAI> items = new array<EntityAI>;
8945 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
8946 for (int i = 0; i < items.Count(); i++)
8947 {
8948 ItemBase item = ItemBase.Cast(items.Get(i));
8949 if (item)
8950 {
8951 GetGame().ObjectDelete(item);
8952 }
8953 }
8954 }
8955 }
8956
8957 //------------------------- Energy
8958
8959 //----------------------------------------------------------------
8960 float GetEnergy()
8961 {
8962 float energy = 0;
8963 if (HasEnergyManager())
8964 {
8965 energy = GetCompEM().GetEnergy();
8966 }
8967 return energy;
8968 }
8969
8970
8971 override void OnEnergyConsumed()
8972 {
8973 super.OnEnergyConsumed();
8974
8976 }
8977
8978 override void OnEnergyAdded()
8979 {
8980 super.OnEnergyAdded();
8981
8983 }
8984
8985 // Converts energy (from Energy Manager) to quantity, if enabled.
8987 {
8988 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8989 {
8990 if (HasQuantity())
8991 {
8992 float energy_0to1 = GetCompEM().GetEnergy0To1();
8993 SetQuantityNormalized(energy_0to1);
8994 }
8995 }
8996 }
8997
8998 //----------------------------------------------------------------
8999 float GetHeatIsolationInit()
9000 {
9001 return ConfigGetFloat("heatIsolation");
9002 }
9003
9004 float GetHeatIsolation()
9005 {
9006 return m_HeatIsolation;
9007 }
9008
9009 float GetDryingIncrement(string pIncrementName)
9010 {
9011 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
9012 if (GetGame().ConfigIsExisting(paramPath))
9013 return GetGame().ConfigGetFloat(paramPath);
9014
9015 return 0.0;
9016 }
9017
9018 float GetSoakingIncrement(string pIncrementName)
9019 {
9020 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
9021 if (GetGame().ConfigIsExisting(paramPath))
9022 return GetGame().ConfigGetFloat(paramPath);
9023
9024 return 0.0;
9025 }
9026 //----------------------------------------------------------------
9027 override void SetWet(float value, bool allow_client = false)
9028 {
9029 if (!IsServerCheck(allow_client))
9030 return;
9031
9032 float min = GetWetMin();
9033 float max = GetWetMax();
9034
9035 float previousValue = m_VarWet;
9036
9037 m_VarWet = Math.Clamp(value, min, max);
9038
9039 if (previousValue != m_VarWet)
9040 {
9041 SetVariableMask(VARIABLE_WET);
9042 OnWetChanged(m_VarWet, previousValue);
9043 }
9044 }
9045 //----------------------------------------------------------------
9046 override void AddWet(float value)
9047 {
9048 SetWet(GetWet() + value);
9049 }
9050 //----------------------------------------------------------------
9051 override void SetWetMax()
9052 {
9054 }
9055 //----------------------------------------------------------------
9056 override float GetWet()
9057 {
9058 return m_VarWet;
9059 }
9060 //----------------------------------------------------------------
9061 override float GetWetMax()
9062 {
9063 return m_VarWetMax;
9064 }
9065 //----------------------------------------------------------------
9066 override float GetWetMin()
9067 {
9068 return m_VarWetMin;
9069 }
9070 //----------------------------------------------------------------
9071 override float GetWetInit()
9072 {
9073 return m_VarWetInit;
9074 }
9075 //----------------------------------------------------------------
9076 override void OnWetChanged(float newVal, float oldVal)
9077 {
9078 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
9079 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
9080 if (newLevel != oldLevel)
9081 {
9082 OnWetLevelChanged(newLevel,oldLevel);
9083 }
9084 }
9085
9086 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
9087 {
9088 SetWeightDirty();
9089 }
9090
9091 override EWetnessLevel GetWetLevel()
9092 {
9093 return GetWetLevelInternal(m_VarWet);
9094 }
9095
9096 //----------------------------------------------------------------
9097
9098 override void SetStoreLoad(bool value)
9099 {
9100 m_IsStoreLoad = value;
9101 }
9102
9103 override bool IsStoreLoad()
9104 {
9105 return m_IsStoreLoad;
9106 }
9107
9108 override void SetStoreLoadedQuantity(float value)
9109 {
9110 m_StoreLoadedQuantity = value;
9111 }
9112
9113 override float GetStoreLoadedQuantity()
9114 {
9115 return m_StoreLoadedQuantity;
9116 }
9117
9118 //----------------------------------------------------------------
9119
9120 float GetItemModelLength()
9121 {
9122 if (ConfigIsExisting("itemModelLength"))
9123 {
9124 return ConfigGetFloat("itemModelLength");
9125 }
9126 return 0;
9127 }
9128
9129 float GetItemAttachOffset()
9130 {
9131 if (ConfigIsExisting("itemAttachOffset"))
9132 {
9133 return ConfigGetFloat("itemAttachOffset");
9134 }
9135 return 0;
9136 }
9137
9138 override void SetCleanness(int value, bool allow_client = false)
9139 {
9140 if (!IsServerCheck(allow_client))
9141 return;
9142
9143 int previousValue = m_Cleanness;
9144
9145 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
9146
9147 if (previousValue != m_Cleanness)
9148 SetVariableMask(VARIABLE_CLEANNESS);
9149 }
9150
9151 override int GetCleanness()
9152 {
9153 return m_Cleanness;
9154 }
9155
9157 {
9158 return true;
9159 }
9160
9161 //----------------------------------------------------------------
9162 // ATTACHMENT LOCKING
9163 // Getters relevant to generic ActionLockAttachment
9164 int GetLockType()
9165 {
9166 return m_LockType;
9167 }
9168
9169 string GetLockSoundSet()
9170 {
9171 return m_LockSoundSet;
9172 }
9173
9174 //----------------------------------------------------------------
9175 //------------------------- Color
9176 // sets items color variable given color components
9177 override void SetColor(int r, int g, int b, int a)
9178 {
9183 SetVariableMask(VARIABLE_COLOR);
9184 }
9186 override void GetColor(out int r,out int g,out int b,out int a)
9187 {
9192 }
9193
9194 bool IsColorSet()
9195 {
9196 return IsVariableSet(VARIABLE_COLOR);
9197 }
9198
9200 string GetColorString()
9201 {
9202 int r,g,b,a;
9203 GetColor(r,g,b,a);
9204 r = r/255;
9205 g = g/255;
9206 b = b/255;
9207 a = a/255;
9208 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9209 }
9210 //----------------------------------------------------------------
9211 //------------------------- LiquidType
9212
9213 override void SetLiquidType(int value, bool allow_client = false)
9214 {
9215 if (!IsServerCheck(allow_client))
9216 return;
9217
9218 int old = m_VarLiquidType;
9219 m_VarLiquidType = value;
9220 OnLiquidTypeChanged(old,value);
9221 SetVariableMask(VARIABLE_LIQUIDTYPE);
9222 }
9223
9224 int GetLiquidTypeInit()
9225 {
9226 return ConfigGetInt("varLiquidTypeInit");
9227 }
9228
9229 override int GetLiquidType()
9230 {
9231 return m_VarLiquidType;
9232 }
9233
9234 protected void OnLiquidTypeChanged(int oldType, int newType)
9235 {
9236 if (newType == LIQUID_NONE && GetIsFrozen())
9237 SetFrozen(false);
9238 }
9239
9241 void UpdateQuickbarShortcutVisibility(PlayerBase player)
9242 {
9243 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9244 }
9245
9246 // -------------------------------------------------------------------------
9248 void OnInventoryEnter(Man player)
9249 {
9250 PlayerBase nplayer;
9251 if (PlayerBase.CastTo(nplayer, player))
9252 {
9253 m_CanPlayImpactSound = true;
9254 //nplayer.OnItemInventoryEnter(this);
9255 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9256 }
9257 }
9258
9259 // -------------------------------------------------------------------------
9261 void OnInventoryExit(Man player)
9262 {
9263 PlayerBase nplayer;
9264 if (PlayerBase.CastTo(nplayer,player))
9265 {
9266 //nplayer.OnItemInventoryExit(this);
9267 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9268
9269 }
9270
9271 //if (!GetGame().IsDedicatedServer())
9272 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9273
9274
9275 if (HasEnergyManager())
9276 {
9277 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
9278 }
9279 }
9280
9281 // ADVANCED PLACEMENT EVENTS
9282 override void OnPlacementStarted(Man player)
9283 {
9284 super.OnPlacementStarted(player);
9285
9286 SetTakeable(false);
9287 }
9288
9289 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
9290 {
9291 if (m_AdminLog)
9292 {
9293 m_AdminLog.OnPlacementComplete(player, this);
9294 }
9295
9296 super.OnPlacementComplete(player, position, orientation);
9297 }
9298
9299 //-----------------------------
9300 // AGENT SYSTEM
9301 //-----------------------------
9302 //--------------------------------------------------------------------------
9303 bool ContainsAgent(int agent_id)
9304 {
9305 if (agent_id & m_AttachedAgents)
9306 {
9307 return true;
9308 }
9309 else
9310 {
9311 return false;
9312 }
9313 }
9314
9315 //--------------------------------------------------------------------------
9316 override void RemoveAgent(int agent_id)
9317 {
9318 if (ContainsAgent(agent_id))
9319 {
9320 m_AttachedAgents = ~agent_id & m_AttachedAgents;
9321 }
9322 }
9323
9324 //--------------------------------------------------------------------------
9325 override void RemoveAllAgents()
9326 {
9327 m_AttachedAgents = 0;
9328 }
9329 //--------------------------------------------------------------------------
9330 override void RemoveAllAgentsExcept(int agent_to_keep)
9331 {
9332 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
9333 }
9334 // -------------------------------------------------------------------------
9335 override void InsertAgent(int agent, float count = 1)
9336 {
9337 if (count < 1)
9338 return;
9339 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
9341 }
9342
9344 void TransferAgents(int agents)
9345 {
9347 }
9348
9349 // -------------------------------------------------------------------------
9350 override int GetAgents()
9351 {
9352 return m_AttachedAgents;
9353 }
9354 //----------------------------------------------------------------------
9355
9356 /*int GetContaminationType()
9357 {
9358 int contamination_type;
9359
9360 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
9361 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
9362 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
9363 const int DIRTY_MASK = eAgents.WOUND_AGENT;
9364
9365 Edible_Base edible = Edible_Base.Cast(this);
9366 int agents = GetAgents();
9367 if (edible)
9368 {
9369 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
9370 if (profile)
9371 {
9372 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
9373 }
9374 }
9375 if (agents & CONTAMINATED_MASK)
9376 {
9377 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
9378 }
9379 if (agents & POISONED_MASK)
9380 {
9381 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
9382 }
9383 if (agents & NERVE_GAS_MASK)
9384 {
9385 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
9386 }
9387 if (agents & DIRTY_MASK)
9388 {
9389 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
9390 }
9391
9392 return agents;
9393 }*/
9394
9395 // -------------------------------------------------------------------------
9396 bool LoadAgents(ParamsReadContext ctx, int version)
9397 {
9398 if (!ctx.Read(m_AttachedAgents))
9399 return false;
9400 return true;
9401 }
9402 // -------------------------------------------------------------------------
9404 {
9405
9407 }
9408 // -------------------------------------------------------------------------
9409
9411 override void CheckForRoofLimited(float timeTresholdMS = 3000)
9412 {
9413 super.CheckForRoofLimited(timeTresholdMS);
9414
9415 float time = GetGame().GetTime();
9416 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9417 {
9418 m_PreviousRoofTestTime = time;
9419 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9420 }
9421 }
9422
9423 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
9424 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
9425 {
9426 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
9427 {
9428 return 0;
9429 }
9430
9431 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
9432 {
9433 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
9434 if (filter)
9435 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
9436 else
9437 return 0;//otherwise return 0 when no filter attached
9438 }
9439
9440 string subclassPath, entryName;
9441
9442 switch (type)
9443 {
9444 case DEF_BIOLOGICAL:
9445 entryName = "biological";
9446 break;
9447 case DEF_CHEMICAL:
9448 entryName = "chemical";
9449 break;
9450 default:
9451 entryName = "biological";
9452 break;
9453 }
9454
9455 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
9456
9457 return GetGame().ConfigGetFloat(subclassPath + entryName);
9458 }
9459
9460
9461
9463 override void EEOnCECreate()
9464 {
9465 if (!IsMagazine())
9467
9469 }
9470
9471
9472 //-------------------------
9473 // OPEN/CLOSE USER ACTIONS
9474 //-------------------------
9476 void Open();
9477 void Close();
9478 bool IsOpen()
9479 {
9480 return true;
9481 }
9482
9483 override bool CanDisplayCargo()
9484 {
9485 return IsOpen();
9486 }
9487
9488
9489 // ------------------------------------------------------------
9490 // CONDITIONS
9491 // ------------------------------------------------------------
9492 override bool CanPutInCargo(EntityAI parent)
9493 {
9494 if (parent)
9495 {
9496 if (parent.IsInherited(DayZInfected))
9497 return true;
9498
9499 if (!parent.IsRuined())
9500 return true;
9501 }
9502
9503 return true;
9504 }
9505
9506 override bool CanPutAsAttachment(EntityAI parent)
9507 {
9508 if (!super.CanPutAsAttachment(parent))
9509 {
9510 return false;
9511 }
9512
9513 if (!IsRuined() && !parent.IsRuined())
9514 {
9515 return true;
9516 }
9517
9518 return false;
9519 }
9520
9521 override bool CanReceiveItemIntoCargo(EntityAI item)
9522 {
9523 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9524 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9525 // return false;
9526
9527 return super.CanReceiveItemIntoCargo(item);
9528 }
9529
9530 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
9531 {
9532 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9533 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9534 // return false;
9535
9536 GameInventory attachmentInv = attachment.GetInventory();
9537 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9538 {
9539 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9540 return false;
9541 }
9542
9543 InventoryLocation loc = new InventoryLocation();
9544 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9545 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
9546 return false;
9547
9548 return super.CanReceiveAttachment(attachment, slotId);
9549 }
9550
9551 override bool CanReleaseAttachment(EntityAI attachment)
9552 {
9553 if (!super.CanReleaseAttachment(attachment))
9554 return false;
9555
9556 return GetInventory().AreChildrenAccessible();
9557 }
9558
9559 /*override bool CanLoadAttachment(EntityAI attachment)
9560 {
9561 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
9562 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
9563 // return false;
9564
9565 GameInventory attachmentInv = attachment.GetInventory();
9566 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
9567 {
9568 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
9569 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
9570
9571 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9572 return false;
9573 }
9574
9575 return super.CanLoadAttachment(attachment);
9576 }*/
9577
9578 // Plays muzzle flash particle effects
9579 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9580 {
9581 int id = muzzle_owner.GetMuzzleID();
9582 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
9583
9584 if (WPOF_array)
9585 {
9586 for (int i = 0; i < WPOF_array.Count(); i++)
9587 {
9588 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9589
9590 if (WPOF)
9591 {
9592 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9593 }
9594 }
9595 }
9596 }
9597
9598 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
9599 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9600 {
9601 int id = muzzle_owner.GetMuzzleID();
9602 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
9603
9604 if (WPOBE_array)
9605 {
9606 for (int i = 0; i < WPOBE_array.Count(); i++)
9607 {
9608 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9609
9610 if (WPOBE)
9611 {
9612 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9613 }
9614 }
9615 }
9616 }
9617
9618 // Plays all weapon overheating particles
9619 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9620 {
9621 int id = muzzle_owner.GetMuzzleID();
9622 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9623
9624 if (WPOOH_array)
9625 {
9626 for (int i = 0; i < WPOOH_array.Count(); i++)
9627 {
9628 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9629
9630 if (WPOOH)
9631 {
9632 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9633 }
9634 }
9635 }
9636 }
9637
9638 // Updates all weapon overheating particles
9639 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9640 {
9641 int id = muzzle_owner.GetMuzzleID();
9642 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9643
9644 if (WPOOH_array)
9645 {
9646 for (int i = 0; i < WPOOH_array.Count(); i++)
9647 {
9648 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9649
9650 if (WPOOH)
9651 {
9652 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9653 }
9654 }
9655 }
9656 }
9657
9658 // Stops overheating particles
9659 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9660 {
9661 int id = muzzle_owner.GetMuzzleID();
9662 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9663
9664 if (WPOOH_array)
9665 {
9666 for (int i = 0; i < WPOOH_array.Count(); i++)
9667 {
9668 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9669
9670 if (WPOOH)
9671 {
9672 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9673 }
9674 }
9675 }
9676 }
9677
9678 //----------------------------------------------------------------
9679 //Item Behaviour - unified approach
9680 override bool IsHeavyBehaviour()
9681 {
9682 if (m_ItemBehaviour == 0)
9683 {
9684 return true;
9685 }
9686
9687 return false;
9688 }
9689
9690 override bool IsOneHandedBehaviour()
9691 {
9692 if (m_ItemBehaviour == 1)
9693 {
9694 return true;
9695 }
9696
9697 return false;
9698 }
9699
9700 override bool IsTwoHandedBehaviour()
9701 {
9702 if (m_ItemBehaviour == 2)
9703 {
9704 return true;
9705 }
9706
9707 return false;
9708 }
9709
9710 bool IsDeployable()
9711 {
9712 return false;
9713 }
9714
9716 float GetDeployTime()
9717 {
9718 return UATimeSpent.DEFAULT_DEPLOY;
9719 }
9720
9721
9722 //----------------------------------------------------------------
9723 // Item Targeting (User Actions)
9724 override void SetTakeable(bool pState)
9725 {
9726 m_IsTakeable = pState;
9727 SetSynchDirty();
9728 }
9729
9730 override bool IsTakeable()
9731 {
9732 return m_IsTakeable;
9733 }
9734
9735 // For cases where we want to show object widget which cant be taken to hands
9737 {
9738 return false;
9739 }
9740
9742 protected void PreLoadSoundAttachmentType()
9743 {
9744 string att_type = "None";
9745
9746 if (ConfigIsExisting("soundAttType"))
9747 {
9748 att_type = ConfigGetString("soundAttType");
9749 }
9750
9751 m_SoundAttType = att_type;
9752 }
9753
9754 override string GetAttachmentSoundType()
9755 {
9756 return m_SoundAttType;
9757 }
9758
9759 //----------------------------------------------------------------
9760 //SOUNDS - ItemSoundHandler
9761 //----------------------------------------------------------------
9762
9763 string GetPlaceSoundset(); // played when deploy starts
9764 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
9765 string GetDeploySoundset(); // played when deploy sucessfully finishes
9766
9768 {
9769 if (!m_ItemSoundHandler)
9771
9772 return m_ItemSoundHandler;
9773 }
9774
9775 // override to initialize sounds
9776 protected void InitItemSounds()
9777 {
9778 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
9779 return;
9780
9782
9783 if (GetPlaceSoundset() != string.Empty)
9784 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
9785
9786 if (GetDeploySoundset() != string.Empty)
9787 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
9788
9789 SoundParameters params = new SoundParameters();
9790 params.m_Loop = true;
9791 if (GetLoopDeploySoundset() != string.Empty)
9792 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
9793 }
9794
9795 // Start sound using ItemSoundHandler
9796 void StartItemSoundServer(int id)
9797 {
9798 if (!GetGame().IsServer())
9799 return;
9800
9801 m_SoundSyncPlay = id;
9802 SetSynchDirty();
9803
9804 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
9806 }
9807
9808 // Stop sound using ItemSoundHandler
9809 void StopItemSoundServer(int id)
9810 {
9811 if (!GetGame().IsServer())
9812 return;
9813
9814 m_SoundSyncStop = id;
9815 SetSynchDirty();
9816
9817 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
9819 }
9820
9821 protected void ClearStartItemSoundServer()
9822 {
9823 m_SoundSyncPlay = 0;
9824 }
9825
9826 protected void ClearStopItemSoundServer()
9827 {
9828 m_SoundSyncStop = 0;
9829 }
9830
9832 void PlayAttachSound(string slot_type)
9833 {
9834 if (!GetGame().IsDedicatedServer())
9835 {
9836 if (ConfigIsExisting("attachSoundSet"))
9837 {
9838 string cfg_path = "";
9839 string soundset = "";
9840 string type_name = GetType();
9841
9842 TStringArray cfg_soundset_array = new TStringArray;
9843 TStringArray cfg_slot_array = new TStringArray;
9844 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9845 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9846
9847 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9848 {
9849 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9850 {
9851 if (cfg_slot_array[i] == slot_type)
9852 {
9853 soundset = cfg_soundset_array[i];
9854 break;
9855 }
9856 }
9857 }
9858
9859 if (soundset != "")
9860 {
9861 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
9862 sound.SetAutodestroy(true);
9863 }
9864 }
9865 }
9866 }
9867
9868 void PlayDetachSound(string slot_type)
9869 {
9870 //TODO - evaluate if needed and devise universal config structure if so
9871 }
9872
9873 void OnApply(PlayerBase player);
9874
9876 {
9877 return 1.0;
9878 };
9879 //returns applicable selection
9880 array<string> GetHeadHidingSelection()
9881 {
9883 }
9884
9886 {
9888 }
9889
9890 WrittenNoteData GetWrittenNoteData() {};
9891
9893 {
9894 SetDynamicPhysicsLifeTime(0.01);
9895 m_ItemBeingDroppedPhys = false;
9896 }
9897
9899 {
9900 array<string> zone_names = new array<string>;
9901 GetDamageZones(zone_names);
9902 for (int i = 0; i < zone_names.Count(); i++)
9903 {
9904 SetHealthMax(zone_names.Get(i),"Health");
9905 }
9906 SetHealthMax("","Health");
9907 }
9908
9910 void SetZoneDamageCEInit()
9911 {
9912 float global_health = GetHealth01("","Health");
9913 array<string> zones = new array<string>;
9914 GetDamageZones(zones);
9915 //set damage of all zones to match global health level
9916 for (int i = 0; i < zones.Count(); i++)
9917 {
9918 SetHealth01(zones.Get(i),"Health",global_health);
9919 }
9920 }
9921
9923 bool IsCoverFaceForShave(string slot_name)
9924 {
9925 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9926 }
9927
9928 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
9929 {
9930 if (!hasRootAsPlayer)
9931 {
9932 if (refParentIB)
9933 {
9934 // parent is wet
9935 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
9936 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9937 // parent has liquid inside
9938 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
9939 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9940 // drying
9941 else if (m_VarWet > m_VarWetMin)
9942 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
9943 }
9944 else
9945 {
9946 // drying on ground or inside non-itembase (car, ...)
9947 if (m_VarWet > m_VarWetMin)
9948 AddWet(-1 * delta * GetDryingIncrement("ground"));
9949 }
9950 }
9951 }
9952
9953 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
9954 {
9956 {
9957 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
9958 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9959 {
9960 float heatPermCoef = 1.0;
9961 EntityAI ent = this;
9962 while (ent)
9963 {
9964 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9965 ent = ent.GetHierarchyParent();
9966 }
9967
9968 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9969 }
9970 }
9971 }
9972
9973 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
9974 {
9975 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
9976 EntityAI parent = GetHierarchyParent();
9977 if (!parent)
9978 {
9979 hasParent = false;
9980 hasRootAsPlayer = false;
9981 }
9982 else
9983 {
9984 hasParent = true;
9985 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9986 refParentIB = ItemBase.Cast(parent);
9987 }
9988 }
9989
9990 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
9991 {
9992 // this is stub, implemented on Edible_Base
9993 }
9994
9995 bool CanDecay()
9996 {
9997 // return true used on selected food clases so they can decay
9998 return false;
9999 }
10000
10001 protected bool CanProcessDecay()
10002 {
10003 // this is stub, implemented on Edible_Base class
10004 // used to determine whether it is still necessary for the food to decay
10005 return false;
10006 }
10007
10008 protected bool CanHaveWetness()
10009 {
10010 // return true used on selected items that have a wetness effect
10011 return false;
10012 }
10013
10015 bool CanBeConsumed(ConsumeConditionData data = null)
10016 {
10017 return !GetIsFrozen() && IsOpen();
10018 }
10019
10020 override void ProcessVariables()
10021 {
10022 bool hasParent = false, hasRootAsPlayer = false;
10023 ItemBase refParentIB;
10024
10025 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
10026 bool foodDecay = g_Game.IsFoodDecayEnabled();
10027
10028 if (wwtu || foodDecay)
10029 {
10030 bool processWetness = wwtu && CanHaveWetness();
10031 bool processTemperature = wwtu && CanHaveTemperature();
10032 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
10033
10034 if (processWetness || processTemperature || processDecay)
10035 {
10036 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
10037
10038 if (processWetness)
10039 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10040
10041 if (processTemperature)
10042 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10043
10044 if (processDecay)
10045 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10046 }
10047 }
10048 }
10049
10052 {
10053 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
10054 }
10055
10056 override float GetTemperatureFreezeThreshold()
10057 {
10059 return Liquid.GetFreezeThreshold(GetLiquidType());
10060
10061 return super.GetTemperatureFreezeThreshold();
10062 }
10063
10064 override float GetTemperatureThawThreshold()
10065 {
10067 return Liquid.GetThawThreshold(GetLiquidType());
10068
10069 return super.GetTemperatureThawThreshold();
10070 }
10071
10072 override float GetItemOverheatThreshold()
10073 {
10075 return Liquid.GetBoilThreshold(GetLiquidType());
10076
10077 return super.GetItemOverheatThreshold();
10078 }
10079
10080 override float GetTemperatureFreezeTime()
10081 {
10082 if (HasQuantity())
10083 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
10084
10085 return super.GetTemperatureFreezeTime();
10086 }
10087
10088 override float GetTemperatureThawTime()
10089 {
10090 if (HasQuantity())
10091 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
10092
10093 return super.GetTemperatureThawTime();
10094 }
10095
10097 void AffectLiquidContainerOnFill(int liquid_type, float amount);
10099 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
10100
10101 bool IsCargoException4x3(EntityAI item)
10102 {
10103 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10104 }
10105
10107 {
10108 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10109 }
10110
10112 void AddLightSourceItem(ItemBase lightsource)
10113 {
10114 m_LightSourceItem = lightsource;
10115 }
10116
10118 {
10119 m_LightSourceItem = null;
10120 }
10121
10123 {
10124 return m_LightSourceItem;
10125 }
10126
10128 array<int> GetValidFinishers()
10129 {
10130 return null;
10131 }
10132
10134 bool GetActionWidgetOverride(out typename name)
10135 {
10136 return false;
10137 }
10138
10139 bool PairWithDevice(notnull ItemBase otherDevice)
10140 {
10141 if (GetGame().IsServer())
10142 {
10143 ItemBase explosive = otherDevice;
10145 if (!trg)
10146 {
10147 trg = RemoteDetonatorTrigger.Cast(otherDevice);
10148 explosive = this;
10149 }
10150
10151 explosive.PairRemote(trg);
10152 trg.SetControlledDevice(explosive);
10153
10154 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10155 trg.SetPersistentPairID(persistentID);
10156 explosive.SetPersistentPairID(persistentID);
10157
10158 return true;
10159 }
10160 return false;
10161 }
10162
10164 float GetBaitEffectivity()
10165 {
10166 float ret = 1.0;
10167 if (HasQuantity())
10168 ret *= GetQuantityNormalized();
10169 ret *= GetHealth01();
10170
10171 return ret;
10172 }
10173
10174 #ifdef DEVELOPER
10175 override void SetDebugItem()
10176 {
10177 super.SetDebugItem();
10178 _itemBase = this;
10179 }
10180
10181 override string GetDebugText()
10182 {
10183 string text = super.GetDebugText();
10184
10185 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
10186 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
10187
10188 return text;
10189 }
10190 #endif
10191
10192 bool CanBeUsedForSuicide()
10193 {
10194 return true;
10195 }
10196
10198 //DEPRECATED BELOW
10200 // Backwards compatibility
10201 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10202 {
10203 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
10204 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
10205 }
10206
10207 // replaced by ItemSoundHandler
10208 protected EffectSound m_SoundDeployFinish;
10209 protected EffectSound m_SoundPlace;
10210 protected EffectSound m_DeployLoopSoundEx;
10211 protected EffectSound m_SoundDeploy;
10212 bool m_IsPlaceSound;
10213 bool m_IsDeploySound;
10215
10216 string GetDeployFinishSoundset();
10217 void PlayDeploySound();
10218 void PlayDeployFinishSound();
10219 void PlayPlaceSound();
10220 void PlayDeployLoopSoundEx();
10221 void StopDeployLoopSoundEx();
10222 void SoundSynchRemoteReset();
10223 void SoundSynchRemote();
10224 bool UsesGlobalDeploy(){return false;}
10225 bool CanPlayDeployLoopSound(){return false;}
10227 bool IsPlaceSound(){return m_IsPlaceSound;}
10228 bool IsDeploySound(){return m_IsDeploySound;}
10229 void SetIsPlaceSound(bool is_place_sound);
10230 void SetIsDeploySound(bool is_deploy_sound);
10231}
10232
10233EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
10234{
10235 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
10236 if (entity)
10237 {
10238 bool is_item = entity.IsInherited(ItemBase);
10239 if (is_item && full_quantity)
10240 {
10241 ItemBase item = ItemBase.Cast(entity);
10242 item.SetQuantity(item.GetQuantityInit());
10243 }
10244 }
10245 else
10246 {
10247 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
10248 return NULL;
10249 }
10250 return entity;
10251}
10252
10253void SetupSpawnedItem(ItemBase item, float health, float quantity)
10254{
10255 if (item)
10256 {
10257 if (health > 0)
10258 item.SetHealth("", "", health);
10259
10260 if (item.CanHaveTemperature())
10261 {
10262 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
10263 if (item.CanFreeze())
10264 item.SetFrozen(false);
10265 }
10266
10267 if (item.HasEnergyManager())
10268 {
10269 if (quantity >= 0)
10270 {
10271 item.GetCompEM().SetEnergy0To1(quantity);
10272 }
10273 else
10274 {
10275 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
10276 }
10277 }
10278 else if (item.IsMagazine())
10279 {
10280 Magazine mag = Magazine.Cast(item);
10281 if (quantity >= 0)
10282 {
10283 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10284 }
10285 else
10286 {
10287 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
10288 }
10289
10290 }
10291 else
10292 {
10293 if (quantity >= 0)
10294 {
10295 item.SetQuantityNormalized(quantity, false);
10296 }
10297 else
10298 {
10299 item.SetQuantity(Math.AbsFloat(quantity));
10300 }
10301
10302 }
10303 }
10304}
10305
10306#ifdef DEVELOPER
10307ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
10308#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()