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

◆ IncreaseOverheating()

void SpawnItemOnLocation::IncreaseOverheating ( ItemBase weapon,
string ammoType,
ItemBase muzzle_owner,
ItemBase suppressor,
string config_to_search )
private

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

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

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