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

◆ OverrideActionAnimation()

void SpawnItemOnLocation::OverrideActionAnimation ( typename action ,
int commandUID,
int stanceMask = -1,
int commandUIDProne = -1 )
private

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

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

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