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

◆ StopOverheating()

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

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

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