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

◆ LoadParticleConfigOnFire()

void SpawnItemOnLocation::LoadParticleConfigOnFire ( int id)
private

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

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

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