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

◆ GetDisinfectQuantity()

float SpawnItemOnLocation::GetDisinfectQuantity ( int system = 0,
Param param1 = null )
private

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

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