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

◆ IsOverheatingEffectActive()

bool SpawnItemOnLocation::IsOverheatingEffectActive ( )
private

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

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