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

◆ UpdateAllOverheatingParticles()

void SpawnItemOnLocation::UpdateAllOverheatingParticles ( )
private

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

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

Используется в InventoryItem::UpdateOverheating().