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

◆ StartOverheating()

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

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

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