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

◆ UpdateOverheating()

void SpawnItemOnLocation::UpdateOverheating ( ItemBase weapon = null,
string ammoType = "",
ItemBase muzzle_owner = null,
ItemBase suppressor = null,
string config_to_search = "" )
private

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

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