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

◆ DoAmmoExplosion()

void SpawnItemOnLocation::DoAmmoExplosion ( )
private

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

6247{
6248 override bool CanPutAsAttachment(EntityAI parent)
6249 {
6250 return true;
6251 }
6252};
6253
6254//const bool QUANTITY_DEBUG_REMOVE_ME = false;
6255
6256class ItemBase extends InventoryItem
6257{
6261
6263
6264 static int m_DebugActionsMask;
6266 // ============================================
6267 // Variable Manipulation System
6268 // ============================================
6269 // Quantity
6270
6271 float m_VarQuantity;
6272 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
6274 int m_VarQuantityMin;
6275 int m_VarQuantityMax;
6276 int m_Count;
6277 float m_VarStackMax;
6278 float m_StoreLoadedQuantity = float.LOWEST;
6279 // Wet
6280 float m_VarWet;
6281 float m_VarWetPrev;//for client to know wetness changed during synchronization
6282 float m_VarWetInit;
6283 float m_VarWetMin;
6284 float m_VarWetMax;
6285 // Cleanness
6286 int m_Cleanness;
6287 int m_CleannessInit;
6288 int m_CleannessMin;
6289 int m_CleannessMax;
6290 // impact sounds
6292 bool m_CanPlayImpactSound = true;
6293 float m_ImpactSpeed;
6295 //
6296 float m_HeatIsolation;
6297 float m_ItemModelLength;
6298 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
6300 int m_VarLiquidType;
6301 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
6302 int m_QuickBarBonus;
6303 bool m_IsBeingPlaced;
6304 bool m_IsHologram;
6305 bool m_IsTakeable;
6306 bool m_ThrowItemOnDrop;
6309 bool m_FixDamageSystemInit = false; //can be changed on storage version check
6310 bool can_this_be_combined; //Check if item can be combined
6311 bool m_CanThisBeSplit; //Check if item can be split
6312 bool m_IsStoreLoad = false;
6313 bool m_CanShowQuantity;
6314 bool m_HasQuantityBar;
6315 protected bool m_CanBeDigged;
6316 protected bool m_IsResultOfSplit
6317
6318 string m_SoundAttType;
6319 // items color variables
6324 //-------------------------------------------------------
6325
6326 // light source managing
6328
6332
6333 //==============================================
6334 // agent system
6335 private int m_AttachedAgents;
6336
6338 void TransferModifiers(PlayerBase reciever);
6339
6340
6341 // Weapons & suppressors particle effects
6346 static int m_LastRegisteredWeaponID = 0;
6347
6348 // Overheating effects
6350 float m_OverheatingShots;
6351 ref Timer m_CheckOverheating;
6352 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
6353 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
6354 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
6355 ref array <ref OverheatingParticle> m_OverheatingParticles;
6356
6358 protected bool m_HideSelectionsBySlot;
6359
6360 // Admin Log
6361 PluginAdminLog m_AdminLog;
6362
6363 // misc
6364 ref Timer m_PhysDropTimer;
6365
6366 // Attachment Locking variables
6367 ref array<int> m_CompatibleLocks;
6368 protected int m_LockType;
6369 protected ref EffectSound m_LockingSound;
6370 protected string m_LockSoundSet;
6371
6372 // ItemSoundHandler
6373 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
6374 protected int m_SoundSyncPlay; // id for sound to play
6375 protected int m_SoundSyncStop; // id for sound to stop
6377
6378 //temperature
6379 private float m_TemperaturePerQuantityWeight;
6380
6381 // -------------------------------------------------------------------------
6382 void ItemBase()
6383 {
6384 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
6388
6389 if (!GetGame().IsDedicatedServer())
6390 {
6391 if (HasMuzzle())
6392 {
6394
6396 {
6398 }
6399 }
6400
6402 m_ActionsInitialize = false;
6403 }
6404
6405 m_OldLocation = null;
6406
6407 if (GetGame().IsServer())
6408 {
6409 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
6410 }
6411
6412 if (ConfigIsExisting("headSelectionsToHide"))
6413 {
6415 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
6416 }
6417
6418 m_HideSelectionsBySlot = false;
6419 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6420 {
6421 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
6422 }
6423
6424 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
6425
6426 m_IsResultOfSplit = false;
6427
6429 }
6430
6431 override void InitItemVariables()
6432 {
6433 super.InitItemVariables();
6434
6435 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
6436 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
6437 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
6438 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
6439 m_VarStackMax = ConfigGetFloat("varStackMax");
6440 m_Count = ConfigGetInt("count");
6441
6442 m_CanShowQuantity = ConfigGetBool("quantityShow");
6443 m_HasQuantityBar = ConfigGetBool("quantityBar");
6444
6445 m_CleannessInit = ConfigGetInt("varCleannessInit");
6447 m_CleannessMin = ConfigGetInt("varCleannessMin");
6448 m_CleannessMax = ConfigGetInt("varCleannessMax");
6449
6450 m_WantPlayImpactSound = false;
6451 m_ImpactSpeed = 0.0;
6452
6453 m_VarWetInit = ConfigGetFloat("varWetInit");
6455 m_VarWetMin = ConfigGetFloat("varWetMin");
6456 m_VarWetMax = ConfigGetFloat("varWetMax");
6457
6458 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
6459 if (IsLiquidContainer() && GetQuantity() != 0)
6461 m_IsBeingPlaced = false;
6462 m_IsHologram = false;
6463 m_IsTakeable = true;
6464 m_CanBeMovedOverride = false;
6468 m_CanBeDigged = ConfigGetBool("canBeDigged");
6469
6470 m_CompatibleLocks = new array<int>();
6471 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
6472 m_LockType = ConfigGetInt("lockType");
6473
6474 //Define if item can be split and set ability to be combined accordingly
6475 m_CanThisBeSplit = false;
6476 can_this_be_combined = false;
6477 if (ConfigIsExisting("canBeSplit"))
6478 {
6479 can_this_be_combined = ConfigGetBool("canBeSplit");
6481 }
6482
6483 m_ItemBehaviour = -1;
6484 if (ConfigIsExisting("itemBehaviour"))
6485 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
6486
6487 //RegisterNetSyncVariableInt("m_VariablesMask");
6488 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
6489 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
6490 RegisterNetSyncVariableInt("m_VarLiquidType");
6491 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6492
6493 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6494 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6495 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6496
6497 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6498 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6499 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6500 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6501
6502 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6503 RegisterNetSyncVariableBool("m_IsTakeable");
6504 RegisterNetSyncVariableBool("m_IsHologram");
6505
6506 InitItemSounds();
6508 {
6509 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
6510 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
6511 }
6512
6513 m_LockSoundSet = ConfigGetString("lockSoundSet");
6514
6516 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6517 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
6518
6519 }
6520
6521 override int GetQuickBarBonus()
6522 {
6523 return m_QuickBarBonus;
6524 }
6525
6526 void InitializeActions()
6527 {
6529 if (!m_InputActionMap)
6530 {
6532 m_InputActionMap = iam;
6533 SetActions();
6535 }
6536 }
6537
6538 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
6539 {
6541 {
6542 m_ActionsInitialize = true;
6544 }
6545
6546 actions = m_InputActionMap.Get(action_input_type);
6547 }
6548
6549 void SetActions()
6550 {
6551 AddAction(ActionTakeItem);
6552 AddAction(ActionTakeItemToHands);
6553 AddAction(ActionWorldCraft);
6555 AddAction(ActionAttachWithSwitch);
6556 }
6557
6558 void SetActionAnimOverrides(); // Override action animation for specific item
6559
6560 void AddAction(typename actionName)
6561 {
6562 ActionBase action = ActionManagerBase.GetAction(actionName);
6563
6564 if (!action)
6565 {
6566 Debug.LogError("Action " + actionName + " dosn't exist!");
6567 return;
6568 }
6569
6570 typename ai = action.GetInputType();
6571 if (!ai)
6572 {
6573 m_ActionsInitialize = false;
6574 return;
6575 }
6576
6577 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
6578 if (!action_array)
6579 {
6580 action_array = new array<ActionBase_Basic>;
6581 m_InputActionMap.Insert(ai, action_array);
6582 }
6583 if (LogManager.IsActionLogEnable())
6584 {
6585 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
6586 }
6587
6588 if (action_array.Find(action) != -1)
6589 {
6590 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
6591 }
6592 else
6593 {
6594 action_array.Insert(action);
6595 }
6596 }
6597
6598 void RemoveAction(typename actionName)
6599 {
6600 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
6601 ActionBase action = player.GetActionManager().GetAction(actionName);
6602 typename ai = action.GetInputType();
6603 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
6604
6605 if (action_array)
6606 {
6607 action_array.RemoveItem(action);
6608 }
6609 }
6610
6611 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
6612 // Set -1 for params which should stay in default state
6613 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
6614 {
6615 ActionOverrideData overrideData = new ActionOverrideData();
6616 overrideData.m_CommandUID = commandUID;
6617 overrideData.m_CommandUIDProne = commandUIDProne;
6618 overrideData.m_StanceMask = stanceMask;
6619
6620 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
6621 if (!actionMap) // create new map of action > overidables map
6622 {
6623 actionMap = new TActionAnimOverrideMap();
6624 m_ItemActionOverrides.Insert(action, actionMap);
6625 }
6626
6627 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
6628
6629 }
6630
6631 void OnItemInHandsPlayerSwimStart(PlayerBase player);
6632
6633 ScriptedLightBase GetLight();
6634
6635 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
6636 void LoadParticleConfigOnFire(int id)
6637 {
6638 if (!m_OnFireEffect)
6640
6643
6644 string config_to_search = "CfgVehicles";
6645 string muzzle_owner_config;
6646
6647 if (!m_OnFireEffect.Contains(id))
6648 {
6649 if (IsInherited(Weapon))
6650 config_to_search = "CfgWeapons";
6651
6652 muzzle_owner_config = config_to_search + " " + GetType() + " ";
6653
6654 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6655
6656 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
6657
6658 if (config_OnFire_subclass_count > 0)
6659 {
6660 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6661
6662 for (int i = 0; i < config_OnFire_subclass_count; i++)
6663 {
6664 string particle_class = "";
6665 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
6666 string config_OnFire_entry = config_OnFire_class + particle_class;
6667 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6668 WPOF_array.Insert(WPOF);
6669 }
6670
6671
6672 m_OnFireEffect.Insert(id, WPOF_array);
6673 }
6674 }
6675
6676 if (!m_OnBulletCasingEjectEffect.Contains(id))
6677 {
6678 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
6679 muzzle_owner_config = config_to_search + " " + GetType() + " ";
6680
6681 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6682
6683 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6684
6685 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6686 {
6687 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6688
6689 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6690 {
6691 string particle_class2 = "";
6692 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6693 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6694 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6695 WPOBE_array.Insert(WPOBE);
6696 }
6697
6698
6699 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
6700 }
6701 }
6702 }
6703
6704 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
6706 {
6709
6710 if (!m_OnOverheatingEffect.Contains(id))
6711 {
6712 string config_to_search = "CfgVehicles";
6713
6714 if (IsInherited(Weapon))
6715 config_to_search = "CfgWeapons";
6716
6717 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
6718 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6719
6720 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
6721 {
6722
6723 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
6724
6726 {
6727 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
6728 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6729 Error(error);
6730 return;
6731 }
6732
6733 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
6734 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
6735
6736
6737
6738 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
6739 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6740
6741 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6742 {
6743 string particle_class = "";
6744 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6745 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6746 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
6747
6748 if (entry_type == CT_CLASS)
6749 {
6750 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6751 WPOOH_array.Insert(WPOF);
6752 }
6753 }
6754
6755
6756 m_OnOverheatingEffect.Insert(id, WPOOH_array);
6757 }
6758 }
6759 }
6760
6761 float GetOverheatingValue()
6762 {
6763 return m_OverheatingShots;
6764 }
6765
6766 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
6767 {
6768 if (m_MaxOverheatingValue > 0)
6769 {
6771
6772 if (!m_CheckOverheating)
6774
6776 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
6777
6778 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6779 }
6780 }
6781
6782 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6783 {
6785 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6786
6788 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6789
6791 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6792
6794 {
6796 }
6797 }
6798
6800 {
6802 }
6803
6804 void OnOverheatingDecay()
6805 {
6806 if (m_MaxOverheatingValue > 0)
6807 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
6808 else
6810
6811 if (m_OverheatingShots <= 0)
6812 {
6815 }
6816 else
6817 {
6818 if (!m_CheckOverheating)
6820
6822 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
6823 }
6824
6825 CheckOverheating(this, "", this);
6826 }
6827
6828 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6829 {
6831 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6832 }
6833
6834 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6835 {
6837 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
6839 }
6840
6841 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
6842 {
6844 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6845 }
6846
6847 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
6848 {
6850 m_OverheatingParticles = new array<ref OverheatingParticle>;
6851
6852 OverheatingParticle OP = new OverheatingParticle();
6853 OP.RegisterParticle(p);
6854 OP.SetOverheatingLimitMin(min_heat_coef);
6855 OP.SetOverheatingLimitMax(max_heat_coef);
6856 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
6857
6858 m_OverheatingParticles.Insert(OP);
6859 }
6860
6861 float GetOverheatingCoef()
6862 {
6863 if (m_MaxOverheatingValue > 0)
6865
6866 return -1;
6867 }
6868
6870 {
6872 {
6873 float overheat_coef = GetOverheatingCoef();
6874 int count = m_OverheatingParticles.Count();
6875
6876 for (int i = count; i > 0; --i)
6877 {
6878 int id = i - 1;
6879 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6880 Particle p = OP.GetParticle();
6881
6882 float overheat_min = OP.GetOverheatingLimitMin();
6883 float overheat_max = OP.GetOverheatingLimitMax();
6884
6885 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6886 {
6887 if (p)
6888 {
6889 p.Stop();
6890 OP.RegisterParticle(null);
6891 }
6892 }
6893 }
6894 }
6895 }
6896
6898 {
6900 {
6901 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
6902 {
6903 int id = i - 1;
6904 OverheatingParticle OP = m_OverheatingParticles.Get(id);
6905
6906 if (OP)
6907 {
6908 Particle p = OP.GetParticle();
6909
6910 if (p)
6911 {
6912 p.Stop();
6913 }
6914
6915 delete OP;
6916 }
6917 }
6918
6919 m_OverheatingParticles.Clear();
6921 }
6922 }
6923
6925 float GetInfectionChance(int system = 0, Param param = null)
6926 {
6927 return 0.0;
6928 }
6929
6930
6931 float GetDisinfectQuantity(int system = 0, Param param1 = null)
6932 {
6933 return 250;//default value
6934 }
6935
6936 float GetFilterDamageRatio()
6937 {
6938 return 0;
6939 }
6940
6942 bool HasMuzzle()
6943 {
6944 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
6945 return true;
6946
6947 return false;
6948 }
6949
6951 int GetMuzzleID()
6952 {
6953 if (!m_WeaponTypeToID)
6955
6956 if (m_WeaponTypeToID.Contains(GetType()))
6957 {
6958 return m_WeaponTypeToID.Get(GetType());
6959 }
6960 else
6961 {
6962 // Register new weapon ID
6964 }
6965
6967 }
6968
6975 {
6976 return -1;
6977 }
6978
6979
6980
6981 // -------------------------------------------------------------------------
6982 void ~ItemBase()
6983 {
6984 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
6985 {
6986 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
6987 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6988
6989 if (r_index >= 0)
6990 {
6991 InventoryLocation r_il = new InventoryLocation;
6992 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6993
6994 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6995 int r_type = r_il.GetType();
6996 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
6997 {
6998 r_il.GetParent().GetOnReleaseLock().Invoke(this);
6999 }
7000 else if (r_type == InventoryLocationType.ATTACHMENT)
7001 {
7002 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
7003 }
7004
7005 }
7006
7007 player.GetHumanInventory().ClearUserReservedLocation(this);
7008 }
7009
7010 if (m_LockingSound)
7011 SEffectManager.DestroyEffect(m_LockingSound);
7012 }
7013
7014
7015
7016 // -------------------------------------------------------------------------
7017 static int GetDebugActionsMask()
7018 {
7019 return ItemBase.m_DebugActionsMask;
7020 }
7021
7022 static bool HasDebugActionsMask(int mask)
7023 {
7024 return ItemBase.m_DebugActionsMask & mask;
7025 }
7026
7027 static void SetDebugActionsMask(int mask)
7028 {
7029 ItemBase.m_DebugActionsMask = mask;
7030 }
7031
7032 static void AddDebugActionsMask(int mask)
7033 {
7034 ItemBase.m_DebugActionsMask |= mask;
7035 }
7036
7037 static void RemoveDebugActionsMask(int mask)
7038 {
7039 ItemBase.m_DebugActionsMask &= ~mask;
7040 }
7041
7042 static void ToggleDebugActionsMask(int mask)
7043 {
7044 if (HasDebugActionsMask(mask))
7045 {
7047 }
7048 else
7049 {
7050 AddDebugActionsMask(mask);
7051 }
7052 }
7053
7054 // -------------------------------------------------------------------------
7055 void SetCEBasedQuantity()
7056 {
7057 if (GetEconomyProfile())
7058 {
7059 float q_max = GetEconomyProfile().GetQuantityMax();
7060 if (q_max > 0)
7061 {
7062 float q_min = GetEconomyProfile().GetQuantityMin();
7063 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7064
7065 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
7066 {
7067 ComponentEnergyManager comp = GetCompEM();
7068 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
7069 {
7070 comp.SetEnergy0To1(quantity_randomized);
7071 }
7072 }
7073 else if (HasQuantity())
7074 {
7075 SetQuantityNormalized(quantity_randomized, false);
7076 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
7077 }
7078
7079 }
7080 }
7081 }
7082
7084 void LockToParent()
7085 {
7086 EntityAI parent = GetHierarchyParent();
7087
7088 if (parent)
7089 {
7090 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7091 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7092 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
7093 }
7094 }
7095
7097 void UnlockFromParent()
7098 {
7099 EntityAI parent = GetHierarchyParent();
7100
7101 if (parent)
7102 {
7103 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7104 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7105 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
7106 }
7107 }
7108
7109 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
7110 {
7111 /*
7112 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
7113 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
7114 */
7115 ItemBase item2 = ItemBase.Cast(entity2);
7116
7117 if (GetGame().IsClient())
7118 {
7119 if (ScriptInputUserData.CanStoreInputUserData())
7120 {
7121 ScriptInputUserData ctx = new ScriptInputUserData;
7123 ctx.Write(-1);
7124 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7125 ctx.Write(i1);
7126 ctx.Write(item2);
7127 ctx.Write(use_stack_max);
7128 ctx.Write(-1);
7129 ctx.Send();
7130
7131 if (IsCombineAll(item2, use_stack_max))
7132 {
7133 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7134 }
7135 }
7136 }
7137 else if (!GetGame().IsMultiplayer())
7138 {
7139 CombineItems(item2, use_stack_max);
7140 }
7141 }
7142
7143 bool IsLiquidPresent()
7144 {
7145 return (GetLiquidType() != 0 && HasQuantity());
7146 }
7147
7148 bool IsLiquidContainer()
7149 {
7150 return m_LiquidContainerMask != 0;
7151 }
7152
7154 {
7155 return m_LiquidContainerMask;
7156 }
7157
7158 bool IsBloodContainer()
7159 {
7160 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
7161 return false;
7162 }
7163
7164 bool IsNVG()
7165 {
7166 return false;
7167 }
7168
7171 bool IsExplosive()
7172 {
7173 return false;
7174 }
7175
7177 {
7178 return "";
7179 }
7180
7182
7183 bool IsLightSource()
7184 {
7185 return false;
7186 }
7187
7189 {
7190 return true;
7191 }
7192
7193 //--- ACTION CONDITIONS
7194 //direction
7195 bool IsFacingPlayer(PlayerBase player, string selection)
7196 {
7197 return true;
7198 }
7199
7200 bool IsPlayerInside(PlayerBase player, string selection)
7201 {
7202 return true;
7203 }
7204
7205 override bool CanObstruct()
7206 {
7207 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
7208 return !player || !IsPlayerInside(player, "");
7209 }
7210
7211 override bool IsBeingPlaced()
7212 {
7213 return m_IsBeingPlaced;
7214 }
7215
7216 void SetIsBeingPlaced(bool is_being_placed)
7217 {
7218 m_IsBeingPlaced = is_being_placed;
7219 if (!is_being_placed)
7221 SetSynchDirty();
7222 }
7223
7224 //server-side
7225 void OnEndPlacement() {}
7226
7227 override bool IsHologram()
7228 {
7229 return m_IsHologram;
7230 }
7231
7232 bool CanBeDigged()
7233 {
7234 return m_CanBeDigged;
7235 }
7236
7238 {
7239 return 1;
7240 }
7241
7242 bool CanMakeGardenplot()
7243 {
7244 return false;
7245 }
7246
7247 void SetIsHologram(bool is_hologram)
7248 {
7249 m_IsHologram = is_hologram;
7250 SetSynchDirty();
7251 }
7252 /*
7253 protected float GetNutritionalEnergy()
7254 {
7255 Edible_Base edible = Edible_Base.Cast(this);
7256 return edible.GetFoodEnergy();
7257 }
7258
7259 protected float GetNutritionalWaterContent()
7260 {
7261 Edible_Base edible = Edible_Base.Cast(this);
7262 return edible.GetFoodWater();
7263 }
7264
7265 protected float GetNutritionalIndex()
7266 {
7267 Edible_Base edible = Edible_Base.Cast(this);
7268 return edible.GetFoodNutritionalIndex();
7269 }
7270
7271 protected float GetNutritionalFullnessIndex()
7272 {
7273 Edible_Base edible = Edible_Base.Cast(this);
7274 return edible.GetFoodTotalVolume();
7275 }
7276
7277 protected float GetNutritionalToxicity()
7278 {
7279 Edible_Base edible = Edible_Base.Cast(this);
7280 return edible.GetFoodToxicity();
7281
7282 }
7283 */
7284
7285
7286 // -------------------------------------------------------------------------
7287 override void OnMovedInsideCargo(EntityAI container)
7288 {
7289 super.OnMovedInsideCargo(container);
7290
7291 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7292 }
7293
7294 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
7295 {
7296 super.EEItemLocationChanged(oldLoc,newLoc);
7297
7298 PlayerBase new_player = null;
7299 PlayerBase old_player = null;
7300
7301 if (newLoc.GetParent())
7302 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
7303
7304 if (oldLoc.GetParent())
7305 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
7306
7307 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
7308 {
7309 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
7310
7311 if (r_index >= 0)
7312 {
7313 InventoryLocation r_il = new InventoryLocation;
7314 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7315
7316 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7317 int r_type = r_il.GetType();
7318 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
7319 {
7320 r_il.GetParent().GetOnReleaseLock().Invoke(this);
7321 }
7322 else if (r_type == InventoryLocationType.ATTACHMENT)
7323 {
7324 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
7325 }
7326
7327 }
7328 }
7329
7330 if (newLoc.GetType() == InventoryLocationType.HANDS)
7331 {
7332 if (new_player)
7333 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
7334
7335 if (new_player == old_player)
7336 {
7337
7338 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
7339 {
7340 if (oldLoc.GetType() == InventoryLocationType.CARGO)
7341 {
7342 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
7343 {
7344 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7345 }
7346 }
7347 else
7348 {
7349 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7350 }
7351 }
7352
7353 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
7354 {
7355 int type = oldLoc.GetType();
7356 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
7357 {
7358 oldLoc.GetParent().GetOnSetLock().Invoke(this);
7359 }
7360 else if (type == InventoryLocationType.ATTACHMENT)
7361 {
7362 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
7363 }
7364 }
7365 if (!m_OldLocation)
7366 {
7367 m_OldLocation = new InventoryLocation;
7368 }
7369 m_OldLocation.Copy(oldLoc);
7370 }
7371 else
7372 {
7373 if (m_OldLocation)
7374 {
7375 m_OldLocation.Reset();
7376 }
7377 }
7378
7380 }
7381 else
7382 {
7383 if (new_player)
7384 {
7385 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7386 if (res_index >= 0)
7387 {
7388 InventoryLocation il = new InventoryLocation;
7389 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
7390 ItemBase it = ItemBase.Cast(il.GetItem());
7391 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
7392 int rel_type = il.GetType();
7393 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
7394 {
7395 il.GetParent().GetOnReleaseLock().Invoke(it);
7396 }
7397 else if (rel_type == InventoryLocationType.ATTACHMENT)
7398 {
7399 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
7400 }
7401 //it.GetOnReleaseLock().Invoke(it);
7402 }
7403 }
7404 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
7405 {
7406 //ThrowPhysically(old_player, vector.Zero);
7407 m_ThrowItemOnDrop = false;
7408 }
7409
7410 if (m_OldLocation)
7411 {
7412 m_OldLocation.Reset();
7413 }
7414 }
7415 }
7416
7417 override void EOnContact(IEntity other, Contact extra)
7418 {
7420 {
7421 int liquidType = -1;
7422 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
7423 if (impactSpeed > 0.0)
7424 {
7425 m_ImpactSpeed = impactSpeed;
7426 #ifndef SERVER
7427 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
7428 #else
7429 m_WantPlayImpactSound = true;
7430 SetSynchDirty();
7431 #endif
7432 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
7433 }
7434 }
7435
7436 #ifdef SERVER
7437 if (GetCompEM() && GetCompEM().IsPlugged())
7438 {
7439 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
7440 GetCompEM().UnplugThis();
7441 }
7442 #endif
7443 }
7444
7445 void RefreshPhysics();
7446
7447 override void OnCreatePhysics()
7448 {
7450 }
7451
7452 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
7453 {
7454
7455 }
7456 // -------------------------------------------------------------------------
7457 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
7458 {
7459 super.OnItemLocationChanged(old_owner, new_owner);
7460
7461 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7462 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7463
7464 if (!relatedPlayer && playerNew)
7465 relatedPlayer = playerNew;
7466
7467 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7468 {
7469 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
7470 if (actionMgr)
7471 {
7472 ActionBase currentAction = actionMgr.GetRunningAction();
7473 if (currentAction)
7474 currentAction.OnItemLocationChanged(this);
7475 }
7476 }
7477
7478 Man ownerPlayerOld = null;
7479 Man ownerPlayerNew = null;
7480
7481 if (old_owner)
7482 {
7483 if (old_owner.IsMan())
7484 {
7485 ownerPlayerOld = Man.Cast(old_owner);
7486 }
7487 else
7488 {
7489 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7490 }
7491 }
7492 else
7493 {
7494 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
7495 {
7496 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
7497
7498 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
7499 {
7500 GetCompEM().UnplugThis();
7501 }
7502 }
7503 }
7504
7505 if (new_owner)
7506 {
7507 if (new_owner.IsMan())
7508 {
7509 ownerPlayerNew = Man.Cast(new_owner);
7510 }
7511 else
7512 {
7513 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7514 }
7515 }
7516
7517 if (ownerPlayerOld != ownerPlayerNew)
7518 {
7519 if (ownerPlayerOld)
7520 {
7521 array<EntityAI> subItemsExit = new array<EntityAI>;
7522 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
7523 for (int i = 0; i < subItemsExit.Count(); i++)
7524 {
7525 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
7526 itemExit.OnInventoryExit(ownerPlayerOld);
7527 }
7528 }
7529
7530 if (ownerPlayerNew)
7531 {
7532 array<EntityAI> subItemsEnter = new array<EntityAI>;
7533 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
7534 for (int j = 0; j < subItemsEnter.Count(); j++)
7535 {
7536 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
7537 itemEnter.OnInventoryEnter(ownerPlayerNew);
7538 }
7539 }
7540 }
7541 else if (ownerPlayerNew != null)
7542 {
7543 PlayerBase nplayer;
7544 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7545 {
7546 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7547 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
7548 for (int k = 0; k < subItemsUpdate.Count(); k++)
7549 {
7550 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
7551 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7552 }
7553 }
7554 }
7555
7556 if (old_owner)
7557 old_owner.OnChildItemRemoved(this);
7558 if (new_owner)
7559 new_owner.OnChildItemReceived(this);
7560 }
7561
7562 // -------------------------------------------------------------------------------
7563 override void EEDelete(EntityAI parent)
7564 {
7565 super.EEDelete(parent);
7566 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7567 if (player)
7568 {
7569 OnInventoryExit(player);
7570
7571 if (player.IsAlive())
7572 {
7573 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7574 if (r_index >= 0)
7575 {
7576 InventoryLocation r_il = new InventoryLocation;
7577 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7578
7579 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7580 int r_type = r_il.GetType();
7581 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
7582 {
7583 r_il.GetParent().GetOnReleaseLock().Invoke(this);
7584 }
7585 else if (r_type == InventoryLocationType.ATTACHMENT)
7586 {
7587 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
7588 }
7589
7590 }
7591
7592 player.RemoveQuickBarEntityShortcut(this);
7593 }
7594 }
7595 }
7596 // -------------------------------------------------------------------------------
7597 override void EEKilled(Object killer)
7598 {
7599 super.EEKilled(killer);
7600
7602 if (killer && killer.IsFireplace() && CanExplodeInFire())
7603 {
7604 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7605 {
7606 if (IsMagazine())
7607 {
7608 if (Magazine.Cast(this).GetAmmoCount() > 0)
7609 {
7610 ExplodeAmmo();
7611 }
7612 }
7613 else
7614 {
7615 Explode(DamageType.EXPLOSION);
7616 }
7617 }
7618 }
7619 }
7620
7621 override void OnWasAttached(EntityAI parent, int slot_id)
7622 {
7623 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7624
7625 super.OnWasAttached(parent, slot_id);
7626
7627 if (HasQuantity())
7628 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7629
7630 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
7631 }
7632
7633 override void OnWasDetached(EntityAI parent, int slot_id)
7634 {
7635 super.OnWasDetached(parent, slot_id);
7636
7637 if (HasQuantity())
7638 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7639 }
7640
7641 override string ChangeIntoOnAttach(string slot)
7642 {
7643 int idx;
7644 TStringArray inventory_slots = new TStringArray;
7645 TStringArray attach_types = new TStringArray;
7646
7647 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7648 if (inventory_slots.Count() < 1) //is string
7649 {
7650 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7651 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7652 }
7653 else //is array
7654 {
7655 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7656 }
7657
7658 idx = inventory_slots.Find(slot);
7659 if (idx < 0)
7660 return "";
7661
7662 return attach_types.Get(idx);
7663 }
7664
7665 override string ChangeIntoOnDetach()
7666 {
7667 int idx = -1;
7668 string slot;
7669
7670 TStringArray inventory_slots = new TStringArray;
7671 TStringArray detach_types = new TStringArray;
7672
7673 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7674 if (inventory_slots.Count() < 1) //is string
7675 {
7676 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7677 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7678 }
7679 else //is array
7680 {
7681 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7682 if (detach_types.Count() < 1)
7683 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7684 }
7685
7686 for (int i = 0; i < inventory_slots.Count(); i++)
7687 {
7688 slot = inventory_slots.Get(i);
7689 }
7690
7691 if (slot != "")
7692 {
7693 if (detach_types.Count() == 1)
7694 idx = 0;
7695 else
7696 idx = inventory_slots.Find(slot);
7697 }
7698 if (idx < 0)
7699 return "";
7700
7701 return detach_types.Get(idx);
7702 }
7703
7704 void ExplodeAmmo()
7705 {
7706 //timer
7707 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
7708
7709 //min/max time
7710 float min_time = 1;
7711 float max_time = 3;
7712 float delay = Math.RandomFloat(min_time, max_time);
7713
7714 explode_timer.Run(delay, this, "DoAmmoExplosion");
7715 }
7716
7717 void DoAmmoExplosion()
7718 {
7719 Magazine magazine = Magazine.Cast(this);
7720 int pop_sounds_count = 6;
7721 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7722
7723 //play sound
7724 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7725 string sound_name = pop_sounds[ sound_idx ];
7726 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
7727
7728 //remove ammo count
7729 magazine.ServerAddAmmoCount(-1);
7730
7731 //if condition then repeat -> ExplodeAmmo
7732 float min_temp_to_explode = 100; //min temperature for item to explode
7733
7734 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
7735 {
7736 ExplodeAmmo();
7737 }
7738 }
7739
7740 // -------------------------------------------------------------------------------
7741 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
7742 {
7743 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
7744
7745 const int CHANCE_DAMAGE_CARGO = 4;
7746 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7747 const int CHANCE_DAMAGE_NOTHING = 2;
7748
7749 if (IsClothing() || IsContainer() || IsItemTent())
7750 {
7751 float dmg = damageResult.GetDamage("","Health") * -0.5;
7752 int chances;
7753 int rnd;
7754
7755 if (GetInventory().GetCargo())
7756 {
7757 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7758 rnd = Math.RandomInt(0,chances);
7759
7760 if (rnd < CHANCE_DAMAGE_CARGO)
7761 {
7762 DamageItemInCargo(dmg);
7763 }
7764 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7765 {
7767 }
7768 }
7769 else
7770 {
7771 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7772 rnd = Math.RandomInt(0,chances);
7773
7774 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7775 {
7777 }
7778 }
7779 }
7780 }
7781
7782 bool DamageItemInCargo(float damage)
7783 {
7784 if (GetInventory().GetCargo())
7785 {
7786 int item_count = GetInventory().GetCargo().GetItemCount();
7787 if (item_count > 0)
7788 {
7789 int random_pick = Math.RandomInt(0, item_count);
7790 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
7791 if (!item.IsExplosive())
7792 {
7793 item.AddHealth("","",damage);
7794 return true;
7795 }
7796 }
7797 }
7798 return false;
7799 }
7800
7801 bool DamageItemAttachments(float damage)
7802 {
7803 int attachment_count = GetInventory().AttachmentCount();
7804 if (attachment_count > 0)
7805 {
7806 int random_pick = Math.RandomInt(0, attachment_count);
7807 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7808 if (!attachment.IsExplosive())
7809 {
7810 attachment.AddHealth("","",damage);
7811 return true;
7812 }
7813 }
7814 return false;
7815 }
7816
7817 override bool IsSplitable()
7818 {
7819 return m_CanThisBeSplit;
7820 }
7821 //----------------
7822 override bool CanBeSplit()
7823 {
7824 if (IsSplitable() && (GetQuantity() > 1))
7825 return GetInventory().CanRemoveEntity();
7826
7827 return false;
7828 }
7829
7830 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
7831 {
7832 if (!CanBeSplit())
7833 return;
7834
7835 if (GetGame().IsClient())
7836 {
7837 if (ScriptInputUserData.CanStoreInputUserData())
7838 {
7839 ScriptInputUserData ctx = new ScriptInputUserData;
7841 ctx.Write(1);
7842 ItemBase i1 = this; // @NOTE: workaround for correct serialization
7843 ctx.Write(i1);
7844 ctx.Write(destination_entity);
7845 ctx.Write(true);
7846 ctx.Write(slot_id);
7847 ctx.Send();
7848 }
7849 }
7850 else if (!GetGame().IsMultiplayer())
7851 {
7852 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
7853 }
7854 }
7855
7856 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
7857 {
7858 if (!CanBeSplit())
7859 return;
7860
7861 float split_quantity_new;
7862 ref ItemBase new_item;
7863 float quantity = GetQuantity();
7864 float stack_max = GetTargetQuantityMax(slot_id);
7865 InventoryLocation loc = new InventoryLocation;
7866
7867 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7868 {
7869 if (stack_max <= GetQuantity())
7870 split_quantity_new = stack_max;
7871 else
7872 split_quantity_new = GetQuantity();
7873
7874 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7875 if (new_item)
7876 {
7877 new_item.SetResultOfSplit(true);
7878 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7879 AddQuantity(-split_quantity_new);
7880 new_item.SetQuantity(split_quantity_new);
7881 }
7882 }
7883 else if (destination_entity && slot_id == -1)
7884 {
7885 if (quantity > stack_max)
7886 split_quantity_new = stack_max;
7887 else
7888 split_quantity_new = quantity;
7889
7890 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7891 {
7892 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7893 new_item = ItemBase.Cast(o);
7894 }
7895
7896 if (new_item)
7897 {
7898 new_item.SetResultOfSplit(true);
7899 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7900 AddQuantity(-split_quantity_new);
7901 new_item.SetQuantity(split_quantity_new);
7902 }
7903 }
7904 else
7905 {
7906 if (stack_max != 0)
7907 {
7908 if (stack_max < GetQuantity())
7909 {
7910 split_quantity_new = GetQuantity() - stack_max;
7911 }
7912
7913 if (split_quantity_new == 0)
7914 {
7915 if (!GetGame().IsMultiplayer())
7916 player.PhysicalPredictiveDropItem(this);
7917 else
7918 player.ServerDropEntity(this);
7919 return;
7920 }
7921
7922 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7923
7924 if (new_item)
7925 {
7926 new_item.SetResultOfSplit(true);
7927 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7928 SetQuantity(split_quantity_new);
7929 new_item.SetQuantity(stack_max);
7930 new_item.PlaceOnSurface();
7931 }
7932 }
7933 }
7934 }
7935
7936 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
7937 {
7938 if (!CanBeSplit())
7939 return;
7940
7941 float split_quantity_new;
7942 ref ItemBase new_item;
7943 float quantity = GetQuantity();
7944 float stack_max = GetTargetQuantityMax(slot_id);
7945 InventoryLocation loc = new InventoryLocation;
7946
7947 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7948 {
7949 if (stack_max <= GetQuantity())
7950 split_quantity_new = stack_max;
7951 else
7952 split_quantity_new = GetQuantity();
7953
7954 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
7955 if (new_item)
7956 {
7957 new_item.SetResultOfSplit(true);
7958 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7959 AddQuantity(-split_quantity_new);
7960 new_item.SetQuantity(split_quantity_new);
7961 }
7962 }
7963 else if (destination_entity && slot_id == -1)
7964 {
7965 if (quantity > stack_max)
7966 split_quantity_new = stack_max;
7967 else
7968 split_quantity_new = quantity;
7969
7970 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
7971 {
7972 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
7973 new_item = ItemBase.Cast(o);
7974 }
7975
7976 if (new_item)
7977 {
7978 new_item.SetResultOfSplit(true);
7979 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7980 AddQuantity(-split_quantity_new);
7981 new_item.SetQuantity(split_quantity_new);
7982 }
7983 }
7984 else
7985 {
7986 if (stack_max != 0)
7987 {
7988 if (stack_max < GetQuantity())
7989 {
7990 split_quantity_new = GetQuantity() - stack_max;
7991 }
7992
7993 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
7994
7995 if (new_item)
7996 {
7997 new_item.SetResultOfSplit(true);
7998 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7999 SetQuantity(split_quantity_new);
8000 new_item.SetQuantity(stack_max);
8001 new_item.PlaceOnSurface();
8002 }
8003 }
8004 }
8005 }
8006
8007 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
8008 {
8009 if (!CanBeSplit())
8010 return;
8011
8012 if (GetGame().IsClient())
8013 {
8014 if (ScriptInputUserData.CanStoreInputUserData())
8015 {
8016 ScriptInputUserData ctx = new ScriptInputUserData;
8018 ctx.Write(4);
8019 ItemBase thiz = this; // @NOTE: workaround for correct serialization
8020 ctx.Write(thiz);
8021 dst.WriteToContext(ctx);
8022 ctx.Send();
8023 }
8024 }
8025 else if (!GetGame().IsMultiplayer())
8026 {
8028 }
8029 }
8030
8031 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
8032 {
8033 if (!CanBeSplit())
8034 return;
8035
8036 if (GetGame().IsClient())
8037 {
8038 if (ScriptInputUserData.CanStoreInputUserData())
8039 {
8040 ScriptInputUserData ctx = new ScriptInputUserData;
8042 ctx.Write(2);
8043 ItemBase dummy = this; // @NOTE: workaround for correct serialization
8044 ctx.Write(dummy);
8045 ctx.Write(destination_entity);
8046 ctx.Write(true);
8047 ctx.Write(idx);
8048 ctx.Write(row);
8049 ctx.Write(col);
8050 ctx.Send();
8051 }
8052 }
8053 else if (!GetGame().IsMultiplayer())
8054 {
8055 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
8056 }
8057 }
8058
8059 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
8060 {
8062 }
8063
8064 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
8065 {
8066 if (!CanBeSplit())
8067 return this;
8068
8069 float quantity = GetQuantity();
8070 float split_quantity_new;
8071 ItemBase new_item;
8072 if (dst.IsValid())
8073 {
8074 int slot_id = dst.GetSlot();
8075 float stack_max = GetTargetQuantityMax(slot_id);
8076
8077 if (quantity > stack_max)
8078 split_quantity_new = stack_max;
8079 else
8080 split_quantity_new = quantity;
8081
8082 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
8083
8084 if (new_item)
8085 {
8086 new_item.SetResultOfSplit(true);
8087 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8088 AddQuantity(-split_quantity_new);
8089 new_item.SetQuantity(split_quantity_new);
8090 }
8091
8092 return new_item;
8093 }
8094
8095 return null;
8096 }
8097
8098 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
8099 {
8100 if (!CanBeSplit())
8101 return;
8102
8103 float quantity = GetQuantity();
8104 float split_quantity_new;
8105 ref ItemBase new_item;
8106 if (destination_entity)
8107 {
8108 float stackable = GetTargetQuantityMax();
8109 if (quantity > stackable)
8110 split_quantity_new = stackable;
8111 else
8112 split_quantity_new = quantity;
8113
8114 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
8115 if (new_item)
8116 {
8117 new_item.SetResultOfSplit(true);
8118 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8119 AddQuantity(-split_quantity_new);
8120 new_item.SetQuantity(split_quantity_new);
8121 }
8122 }
8123 }
8124
8125 void SplitIntoStackMaxHandsClient(PlayerBase player)
8126 {
8127 if (!CanBeSplit())
8128 return;
8129
8130 if (GetGame().IsClient())
8131 {
8132 if (ScriptInputUserData.CanStoreInputUserData())
8133 {
8134 ScriptInputUserData ctx = new ScriptInputUserData;
8136 ctx.Write(3);
8137 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8138 ctx.Write(i1);
8139 ItemBase destination_entity = this;
8140 ctx.Write(destination_entity);
8141 ctx.Write(true);
8142 ctx.Write(0);
8143 ctx.Send();
8144 }
8145 }
8146 else if (!GetGame().IsMultiplayer())
8147 {
8148 SplitIntoStackMaxHands(player);
8149 }
8150 }
8151
8152 void SplitIntoStackMaxHands(PlayerBase player)
8153 {
8154 if (!CanBeSplit())
8155 return;
8156
8157 float quantity = GetQuantity();
8158 float split_quantity_new;
8159 ref ItemBase new_item;
8160 if (player)
8161 {
8162 float stackable = GetTargetQuantityMax();
8163 if (quantity > stackable)
8164 split_quantity_new = stackable;
8165 else
8166 split_quantity_new = quantity;
8167
8168 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
8169 new_item = ItemBase.Cast(in_hands);
8170 if (new_item)
8171 {
8172 new_item.SetResultOfSplit(true);
8173 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8174 AddQuantity(-split_quantity_new);
8175 new_item.SetQuantity(split_quantity_new);
8176 }
8177 }
8178 }
8179
8180 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
8181 {
8182 if (!CanBeSplit())
8183 return;
8184
8185 float quantity = GetQuantity();
8186 float split_quantity_new = Math.Floor(quantity * 0.5);
8187
8188 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
8189
8190 if (new_item)
8191 {
8192 if (new_item.GetQuantityMax() < split_quantity_new)
8193 {
8194 split_quantity_new = new_item.GetQuantityMax();
8195 }
8196
8197 new_item.SetResultOfSplit(true);
8198 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8199
8200 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
8201 {
8202 AddQuantity(-1);
8203 new_item.SetQuantity(1);
8204 }
8205 else
8206 {
8207 AddQuantity(-split_quantity_new);
8208 new_item.SetQuantity(split_quantity_new);
8209 }
8210 }
8211 }
8212
8213 void SplitItem(PlayerBase player)
8214 {
8215 if (!CanBeSplit())
8216 return;
8217
8218 float quantity = GetQuantity();
8219 float split_quantity_new = Math.Floor(quantity / 2);
8220
8221 InventoryLocation invloc = new InventoryLocation;
8222 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
8223
8224 ItemBase new_item;
8225 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
8226
8227 if (new_item)
8228 {
8229 if (new_item.GetQuantityMax() < split_quantity_new)
8230 {
8231 split_quantity_new = new_item.GetQuantityMax();
8232 }
8233 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
8234 {
8235 AddQuantity(-1);
8236 new_item.SetQuantity(1);
8237 }
8238 else
8239 {
8240 AddQuantity(-split_quantity_new);
8241 new_item.SetQuantity(split_quantity_new);
8242 }
8243 }
8244 }
8245
8247 void OnQuantityChanged(float delta)
8248 {
8249 SetWeightDirty();
8250 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
8251
8252 if (parent)
8253 parent.OnAttachmentQuantityChangedEx(this, delta);
8254
8255 if (IsLiquidContainer())
8256 {
8257 if (GetQuantityNormalized() <= 0.0)
8258 {
8260 }
8261 else if (GetLiquidType() == LIQUID_NONE)
8262 {
8263 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
8265 }
8266 }
8267
8268 }
8269
8272 {
8273 // insert code here
8274 }
8275
8277 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
8278 {
8280 }
8281
8282 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
8283 {
8284 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
8285
8286 if (GetGame().IsServer())
8287 {
8288 if (newLevel == GameConstants.STATE_RUINED)
8289 {
8291 EntityAI parent = GetHierarchyParent();
8292 if (parent && parent.IsFireplace())
8293 {
8294 CargoBase cargo = GetInventory().GetCargo();
8295 if (cargo)
8296 {
8297 for (int i = 0; i < cargo.GetItemCount(); ++i)
8298 {
8299 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
8300 }
8301 }
8302 }
8303 }
8304
8305 if (IsResultOfSplit())
8306 {
8307 // reset the splitting result flag, return to normal item behavior
8308 SetResultOfSplit(false);
8309 return;
8310 }
8311
8312 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
8313 {
8314 SetCleanness(0);//unclean the item upon damage dealt
8315 }
8316 }
8317 }
8318
8319 // just the split? TODO: verify
8320 override void OnRightClick()
8321 {
8322 super.OnRightClick();
8323
8324 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
8325 {
8326 if (GetGame().IsClient())
8327 {
8328 if (ScriptInputUserData.CanStoreInputUserData())
8329 {
8330 vector m4[4];
8331 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
8332
8333 EntityAI root = GetHierarchyRoot();
8334
8335 InventoryLocation dst = new InventoryLocation;
8336 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
8337 {
8338 if (root)
8339 {
8340 root.GetTransform(m4);
8341 dst.SetGround(this, m4);
8342 }
8343 else
8344 GetInventory().GetCurrentInventoryLocation(dst);
8345 }
8346 else
8347 {
8348 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
8349 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
8350 this shouldnt cause issues within this scope*/
8351 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
8352 {
8353 if (root)
8354 {
8355 root.GetTransform(m4);
8356 dst.SetGround(this, m4);
8357 }
8358 else
8359 GetInventory().GetCurrentInventoryLocation(dst);
8360 }
8361 else
8362 {
8363 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8364 }
8365 }
8366
8367 ScriptInputUserData ctx = new ScriptInputUserData;
8369 ctx.Write(4);
8370 ItemBase thiz = this; // @NOTE: workaround for correct serialization
8371 ctx.Write(thiz);
8372 dst.WriteToContext(ctx);
8373 ctx.Write(true); // dummy
8374 ctx.Send();
8375 }
8376 }
8377 else if (!GetGame().IsMultiplayer())
8378 {
8379 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
8380 }
8381 }
8382 }
8383
8384 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
8385 {
8386 //TODO: delete check zero quantity check after fix double posts hands fsm events
8387 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
8388 return false;
8389
8390 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8391 return false;
8392
8393 //can_this_be_combined = ConfigGetBool("canBeSplit");
8395 return false;
8396
8397
8398 Magazine mag = Magazine.Cast(this);
8399 if (mag)
8400 {
8401 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8402 return false;
8403
8404 if (stack_max_limit)
8405 {
8406 Magazine other_mag = Magazine.Cast(other_item);
8407 if (other_item)
8408 {
8409 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8410 return false;
8411 }
8412
8413 }
8414 }
8415 else
8416 {
8417 //TODO: delete check zero quantity check after fix double posts hands fsm events
8418 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
8419 return false;
8420
8421 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
8422 return false;
8423 }
8424
8425 PlayerBase player = null;
8426 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
8427 {
8428 if (player.GetInventory().HasAttachment(this))
8429 return false;
8430
8431 if (player.IsItemsToDelete())
8432 return false;
8433 }
8434
8435 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8436 return false;
8437
8438 int slotID;
8439 string slotName;
8440 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8441 return false;
8442
8443 return true;
8444 }
8445
8446 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
8447 {
8448 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
8449 }
8450
8451 bool IsResultOfSplit()
8452 {
8453 return m_IsResultOfSplit;
8454 }
8455
8456 void SetResultOfSplit(bool value)
8457 {
8458 m_IsResultOfSplit = value;
8459 }
8460
8461 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
8462 {
8463 return ComputeQuantityUsedEx(other_item, use_stack_max);
8464 }
8465
8466 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
8467 {
8468 float other_item_quantity = other_item.GetQuantity();
8469 float this_free_space;
8470
8471 float stack_max = GetQuantityMax();
8472
8473 this_free_space = stack_max - GetQuantity();
8474
8475 if (other_item_quantity > this_free_space)
8476 {
8477 return this_free_space;
8478 }
8479 else
8480 {
8481 return other_item_quantity;
8482 }
8483 }
8484
8485 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
8486 {
8487 CombineItems(ItemBase.Cast(entity2),use_stack_max);
8488 }
8489
8490 void CombineItems(ItemBase other_item, bool use_stack_max = true)
8491 {
8492 if (!CanBeCombined(other_item, false))
8493 return;
8494
8495 if (!IsMagazine() && other_item)
8496 {
8497 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
8498 if (quantity_used != 0)
8499 {
8500 float hp1 = GetHealth01("","");
8501 float hp2 = other_item.GetHealth01("","");
8502 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
8503 hpResult = hpResult / (GetQuantity() + quantity_used);
8504
8505 hpResult *= GetMaxHealth();
8506 Math.Round(hpResult);
8507 SetHealth("", "Health", hpResult);
8508
8509 AddQuantity(quantity_used);
8510 other_item.AddQuantity(-quantity_used);
8511 }
8512 }
8513 OnCombine(other_item);
8514 }
8515
8516 void OnCombine(ItemBase other_item)
8517 {
8518 #ifdef SERVER
8519 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8520 GetHierarchyParent().IncreaseLifetimeUp();
8521 #endif
8522 };
8523
8524 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
8525 {
8526 PlayerBase p = PlayerBase.Cast(player);
8527
8528 array<int> recipesIds = p.m_Recipes;
8529 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
8530 if (moduleRecipesManager)
8531 {
8532 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
8533 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
8534 }
8535
8536 for (int i = 0;i < recipesIds.Count(); i++)
8537 {
8538 int key = recipesIds.Get(i);
8539 string recipeName = moduleRecipesManager.GetRecipeName(key);
8540 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
8541 }
8542 }
8543
8544 // -------------------------------------------------------------------------
8545 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8546 {
8547 super.GetDebugActions(outputList);
8548
8549 //quantity
8550 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
8551 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
8552 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
8553 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
8554
8555 //health
8556 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
8557 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
8558 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
8559 //temperature
8560 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
8561 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
8562 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
8563
8564 //wet
8565 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
8566 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
8567
8568 //liquidtype
8569 if (IsLiquidContainer())
8570 {
8571 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
8572 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
8573 }
8574
8575 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
8576 // watch
8577 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
8578 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
8579
8580 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
8581 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
8582 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
8583 }
8584
8585 // -------------------------------------------------------------------------
8586 // -------------------------------------------------------------------------
8587 // -------------------------------------------------------------------------
8588 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
8589 {
8590 super.OnAction(action_id, player, ctx);
8591 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
8592 {
8593 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
8594 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
8595 PlayerBase p = PlayerBase.Cast(player);
8596 if (EActions.RECIPES_RANGE_START < 1000)
8597 {
8598 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8599 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8600 }
8601 }
8602 #ifndef SERVER
8603 else if (action_id == EActions.WATCH_PLAYER)
8604 {
8605 PluginDeveloper.SetDeveloperItemClientEx(player);
8606 }
8607 #endif
8608 if (GetGame().IsServer())
8609 {
8610 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8611 {
8612 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8613 OnDebugButtonPressServer(id + 1);
8614 }
8615
8616 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8617 {
8618 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8619 InsertAgent(agent_id,100);
8620 }
8621
8622 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8623 {
8624 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8625 RemoveAgent(agent_id2);
8626 }
8627
8628 else if (action_id == EActions.ADD_QUANTITY)
8629 {
8630 if (IsMagazine())
8631 {
8632 Magazine mag = Magazine.Cast(this);
8633 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8634 }
8635 else
8636 {
8637 AddQuantity(GetQuantityMax() * 0.2);
8638 }
8639
8640 if (m_EM)
8641 {
8642 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8643 }
8644 //PrintVariables();
8645 }
8646
8647 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
8648 {
8649 if (IsMagazine())
8650 {
8651 Magazine mag2 = Magazine.Cast(this);
8652 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8653 }
8654 else
8655 {
8656 AddQuantity(- GetQuantityMax() * 0.2);
8657 }
8658 if (m_EM)
8659 {
8660 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8661 }
8662 //PrintVariables();
8663 }
8664
8665 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
8666 {
8667 SetQuantity(0);
8668
8669 if (m_EM)
8670 {
8671 m_EM.SetEnergy(0);
8672 }
8673 }
8674
8675 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
8676 {
8678
8679 if (m_EM)
8680 {
8681 m_EM.SetEnergy(m_EM.GetEnergyMax());
8682 }
8683 }
8684
8685 else if (action_id == EActions.ADD_HEALTH)
8686 {
8687 AddHealth("","",GetMaxHealth("","Health")/5);
8688 }
8689 else if (action_id == EActions.REMOVE_HEALTH)
8690 {
8691 AddHealth("","",-GetMaxHealth("","Health")/5);
8692 }
8693 else if (action_id == EActions.DESTROY_HEALTH)
8694 {
8695 SetHealth01("","",0);
8696 }
8697 else if (action_id == EActions.WATCH_ITEM)
8698 {
8700 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
8701 #ifdef DEVELOPER
8702 SetDebugDeveloper_item(this);
8703 #endif
8704 }
8705
8706 else if (action_id == EActions.ADD_TEMPERATURE)
8707 {
8708 AddTemperature(20);
8709 //PrintVariables();
8710 }
8711
8712 else if (action_id == EActions.REMOVE_TEMPERATURE)
8713 {
8714 AddTemperature(-20);
8715 //PrintVariables();
8716 }
8717
8718 else if (action_id == EActions.FLIP_FROZEN)
8719 {
8720 SetFrozen(!GetIsFrozen());
8721 //PrintVariables();
8722 }
8723
8724 else if (action_id == EActions.ADD_WETNESS)
8725 {
8726 AddWet(GetWetMax()/5);
8727 //PrintVariables();
8728 }
8729
8730 else if (action_id == EActions.REMOVE_WETNESS)
8731 {
8732 AddWet(-GetWetMax()/5);
8733 //PrintVariables();
8734 }
8735
8736 else if (action_id == EActions.LIQUIDTYPE_UP)
8737 {
8738 int curr_type = GetLiquidType();
8739 SetLiquidType(curr_type * 2);
8740 //AddWet(1);
8741 //PrintVariables();
8742 }
8743
8744 else if (action_id == EActions.LIQUIDTYPE_DOWN)
8745 {
8746 int curr_type2 = GetLiquidType();
8747 SetLiquidType(curr_type2 / 2);
8748 }
8749
8750 else if (action_id == EActions.MAKE_SPECIAL)
8751 {
8752 auto debugParams = DebugSpawnParams.WithPlayer(player);
8753 OnDebugSpawnEx(debugParams);
8754 }
8755
8756 else if (action_id == EActions.DELETE)
8757 {
8758 Delete();
8759 }
8760
8761 }
8762
8763
8764 return false;
8765 }
8766
8767 // -------------------------------------------------------------------------
8768
8769
8772 void OnActivatedByTripWire();
8773
8775 void OnActivatedByItem(notnull ItemBase item);
8776
8777 //----------------------------------------------------------------
8778 //returns true if item is able to explode when put in fire
8779 bool CanExplodeInFire()
8780 {
8781 return false;
8782 }
8783
8784 //----------------------------------------------------------------
8785 bool CanEat()
8786 {
8787 return true;
8788 }
8789
8790 //----------------------------------------------------------------
8791 override bool IsIgnoredByConstruction()
8792 {
8793 return true;
8794 }
8795
8796 //----------------------------------------------------------------
8797 //has FoodStages in config?
8798 bool HasFoodStage()
8799 {
8800 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
8801 return GetGame().ConfigIsExisting(config_path);
8802 }
8803
8805 FoodStage GetFoodStage()
8806 {
8807 return null;
8808 }
8809
8810 bool CanBeCooked()
8811 {
8812 return false;
8813 }
8814
8815 bool CanBeCookedOnStick()
8816 {
8817 return false;
8818 }
8819
8821 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
8823
8824 //----------------------------------------------------------------
8825 bool CanRepair(ItemBase item_repair_kit)
8826 {
8827 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8828 return module_repairing.CanRepair(this, item_repair_kit);
8829 }
8830
8831 //----------------------------------------------------------------
8832 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
8833 {
8834 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
8835 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8836 }
8837
8838 //----------------------------------------------------------------
8839 int GetItemSize()
8840 {
8841 /*
8842 vector v_size = this.ConfigGetVector("itemSize");
8843 int v_size_x = v_size[0];
8844 int v_size_y = v_size[1];
8845 int size = v_size_x * v_size_y;
8846 return size;
8847 */
8848
8849 return 1;
8850 }
8851
8852 //----------------------------------------------------------------
8853 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8854 bool CanBeMovedOverride()
8855 {
8856 return m_CanBeMovedOverride;
8857 }
8858
8859 //----------------------------------------------------------------
8860 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
8861 void SetCanBeMovedOverride(bool setting)
8862 {
8863 m_CanBeMovedOverride = setting;
8864 }
8865
8866 //----------------------------------------------------------------
8874 void MessageToOwnerStatus(string text)
8875 {
8876 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8877
8878 if (player)
8879 {
8880 player.MessageStatus(text);
8881 }
8882 }
8883
8884 //----------------------------------------------------------------
8892 void MessageToOwnerAction(string text)
8893 {
8894 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8895
8896 if (player)
8897 {
8898 player.MessageAction(text);
8899 }
8900 }
8901
8902 //----------------------------------------------------------------
8910 void MessageToOwnerFriendly(string text)
8911 {
8912 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8913
8914 if (player)
8915 {
8916 player.MessageFriendly(text);
8917 }
8918 }
8919
8920 //----------------------------------------------------------------
8928 void MessageToOwnerImportant(string text)
8929 {
8930 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8931
8932 if (player)
8933 {
8934 player.MessageImportant(text);
8935 }
8936 }
8937
8938 override bool IsItemBase()
8939 {
8940 return true;
8941 }
8942
8943 // Checks if item is of questioned kind
8944 override bool KindOf(string tag)
8945 {
8946 bool found = false;
8947 string item_name = this.GetType();
8948 ref TStringArray item_tag_array = new TStringArray;
8949 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
8950
8951 int array_size = item_tag_array.Count();
8952 for (int i = 0; i < array_size; i++)
8953 {
8954 if (item_tag_array.Get(i) == tag)
8955 {
8956 found = true;
8957 break;
8958 }
8959 }
8960 return found;
8961 }
8962
8963
8964 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
8965 {
8966 //Debug.Log("OnRPC called");
8967 super.OnRPC(sender, rpc_type,ctx);
8968
8969 //Play soundset for attachment locking (ActionLockAttachment.c)
8970 switch (rpc_type)
8971 {
8972 #ifndef SERVER
8973 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8974 Param2<bool, string> p = new Param2<bool, string>(false, "");
8975
8976 if (!ctx.Read(p))
8977 return;
8978
8979 bool play = p.param1;
8980 string soundSet = p.param2;
8981
8982 if (play)
8983 {
8984 if (m_LockingSound)
8985 {
8987 {
8988 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8989 }
8990 }
8991 else
8992 {
8993 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
8994 }
8995 }
8996 else
8997 {
8998 SEffectManager.DestroyEffect(m_LockingSound);
8999 }
9000
9001 break;
9002 #endif
9003
9004 }
9005
9006 if (GetWrittenNoteData())
9007 {
9008 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
9009 }
9010 }
9011
9012 //-----------------------------
9013 // VARIABLE MANIPULATION SYSTEM
9014 //-----------------------------
9015 int NameToID(string name)
9016 {
9017 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
9018 return plugin.GetID(name);
9019 }
9020
9021 string IDToName(int id)
9022 {
9023 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
9024 return plugin.GetName(id);
9025 }
9026
9028 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
9029 {
9030 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
9031 //read the flags
9032 int varFlags;
9033 if (!ctx.Read(varFlags))
9034 return;
9035
9036 if (varFlags & ItemVariableFlags.FLOAT)
9037 {
9038 ReadVarsFromCTX(ctx);
9039 }
9040 }
9041
9042 override void SerializeNumericalVars(array<float> floats_out)
9043 {
9044 //some variables handled on EntityAI level already!
9045 super.SerializeNumericalVars(floats_out);
9046
9047 // the order of serialization must be the same as the order of de-serialization
9048 //--------------------------------------------
9049 if (IsVariableSet(VARIABLE_QUANTITY))
9050 {
9051 floats_out.Insert(m_VarQuantity);
9052 }
9053 //--------------------------------------------
9054 if (IsVariableSet(VARIABLE_WET))
9055 {
9056 floats_out.Insert(m_VarWet);
9057 }
9058 //--------------------------------------------
9059 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
9060 {
9061 floats_out.Insert(m_VarLiquidType);
9062 }
9063 //--------------------------------------------
9064 if (IsVariableSet(VARIABLE_COLOR))
9065 {
9066 floats_out.Insert(m_ColorComponentR);
9067 floats_out.Insert(m_ColorComponentG);
9068 floats_out.Insert(m_ColorComponentB);
9069 floats_out.Insert(m_ColorComponentA);
9070 }
9071 //--------------------------------------------
9072 if (IsVariableSet(VARIABLE_CLEANNESS))
9073 {
9074 floats_out.Insert(m_Cleanness);
9075 }
9076 }
9077
9078 override void DeSerializeNumericalVars(array<float> floats)
9079 {
9080 //some variables handled on EntityAI level already!
9081 super.DeSerializeNumericalVars(floats);
9082
9083 // the order of serialization must be the same as the order of de-serialization
9084 int index = 0;
9085 int mask = Math.Round(floats.Get(index));
9086
9087 index++;
9088 //--------------------------------------------
9089 if (mask & VARIABLE_QUANTITY)
9090 {
9091 if (m_IsStoreLoad)
9092 {
9093 SetStoreLoadedQuantity(floats.Get(index));
9094 }
9095 else
9096 {
9097 float quantity = floats.Get(index);
9098 SetQuantity(quantity, true, false, false, false);
9099 }
9100 index++;
9101 }
9102 //--------------------------------------------
9103 if (mask & VARIABLE_WET)
9104 {
9105 float wet = floats.Get(index);
9106 SetWet(wet);
9107 index++;
9108 }
9109 //--------------------------------------------
9110 if (mask & VARIABLE_LIQUIDTYPE)
9111 {
9112 int liquidtype = Math.Round(floats.Get(index));
9113 SetLiquidType(liquidtype);
9114 index++;
9115 }
9116 //--------------------------------------------
9117 if (mask & VARIABLE_COLOR)
9118 {
9119 m_ColorComponentR = Math.Round(floats.Get(index));
9120 index++;
9121 m_ColorComponentG = Math.Round(floats.Get(index));
9122 index++;
9123 m_ColorComponentB = Math.Round(floats.Get(index));
9124 index++;
9125 m_ColorComponentA = Math.Round(floats.Get(index));
9126 index++;
9127 }
9128 //--------------------------------------------
9129 if (mask & VARIABLE_CLEANNESS)
9130 {
9131 int cleanness = Math.Round(floats.Get(index));
9132 SetCleanness(cleanness);
9133 index++;
9134 }
9135 }
9136
9137 override void WriteVarsToCTX(ParamsWriteContext ctx)
9138 {
9139 super.WriteVarsToCTX(ctx);
9140
9141 //--------------------------------------------
9142 if (IsVariableSet(VARIABLE_QUANTITY))
9143 {
9144 ctx.Write(GetQuantity());
9145 }
9146 //--------------------------------------------
9147 if (IsVariableSet(VARIABLE_WET))
9148 {
9149 ctx.Write(GetWet());
9150 }
9151 //--------------------------------------------
9152 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
9153 {
9154 ctx.Write(GetLiquidType());
9155 }
9156 //--------------------------------------------
9157 if (IsVariableSet(VARIABLE_COLOR))
9158 {
9159 int r,g,b,a;
9160 GetColor(r,g,b,a);
9161 ctx.Write(r);
9162 ctx.Write(g);
9163 ctx.Write(b);
9164 ctx.Write(a);
9165 }
9166 //--------------------------------------------
9167 if (IsVariableSet(VARIABLE_CLEANNESS))
9168 {
9169 ctx.Write(GetCleanness());
9170 }
9171 }
9172
9173 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
9174 {
9175 if (!super.ReadVarsFromCTX(ctx,version))
9176 return false;
9177
9178 int intValue;
9179 float value;
9180
9181 if (version < 140)
9182 {
9183 if (!ctx.Read(intValue))
9184 return false;
9185
9186 m_VariablesMask = intValue;
9187 }
9188
9189 if (m_VariablesMask & VARIABLE_QUANTITY)
9190 {
9191 if (!ctx.Read(value))
9192 return false;
9193
9194 if (IsStoreLoad())
9195 {
9197 }
9198 else
9199 {
9200 SetQuantity(value, true, false, false, false);
9201 }
9202 }
9203 //--------------------------------------------
9204 if (version < 140)
9205 {
9206 if (m_VariablesMask & VARIABLE_TEMPERATURE)
9207 {
9208 if (!ctx.Read(value))
9209 return false;
9210 SetTemperatureDirect(value);
9211 }
9212 }
9213 //--------------------------------------------
9214 if (m_VariablesMask & VARIABLE_WET)
9215 {
9216 if (!ctx.Read(value))
9217 return false;
9218 SetWet(value);
9219 }
9220 //--------------------------------------------
9221 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
9222 {
9223 if (!ctx.Read(intValue))
9224 return false;
9225 SetLiquidType(intValue);
9226 }
9227 //--------------------------------------------
9228 if (m_VariablesMask & VARIABLE_COLOR)
9229 {
9230 int r,g,b,a;
9231 if (!ctx.Read(r))
9232 return false;
9233 if (!ctx.Read(g))
9234 return false;
9235 if (!ctx.Read(b))
9236 return false;
9237 if (!ctx.Read(a))
9238 return false;
9239
9240 SetColor(r,g,b,a);
9241 }
9242 //--------------------------------------------
9243 if (m_VariablesMask & VARIABLE_CLEANNESS)
9244 {
9245 if (!ctx.Read(intValue))
9246 return false;
9247 SetCleanness(intValue);
9248 }
9249 //--------------------------------------------
9250 if (version >= 138 && version < 140)
9251 {
9252 if (m_VariablesMask & VARIABLE_TEMPERATURE)
9253 {
9254 if (!ctx.Read(intValue))
9255 return false;
9256 SetFrozen(intValue);
9257 }
9258 }
9259
9260 return true;
9261 }
9262
9263 //----------------------------------------------------------------
9264 override bool OnStoreLoad(ParamsReadContext ctx, int version)
9265 {
9266 m_IsStoreLoad = true;
9268 {
9269 m_FixDamageSystemInit = true;
9270 }
9271
9272 if (!super.OnStoreLoad(ctx, version))
9273 {
9274 m_IsStoreLoad = false;
9275 return false;
9276 }
9277
9278 if (version >= 114)
9279 {
9280 bool hasQuickBarIndexSaved;
9281
9282 if (!ctx.Read(hasQuickBarIndexSaved))
9283 {
9284 m_IsStoreLoad = false;
9285 return false;
9286 }
9287
9288 if (hasQuickBarIndexSaved)
9289 {
9290 int itmQBIndex;
9291
9292 //Load quickbar item bind
9293 if (!ctx.Read(itmQBIndex))
9294 {
9295 m_IsStoreLoad = false;
9296 return false;
9297 }
9298
9299 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9300 if (itmQBIndex != -1 && parentPlayer)
9301 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9302 }
9303 }
9304 else
9305 {
9306 // Backup of how it used to be
9307 PlayerBase player;
9308 int itemQBIndex;
9309 if (version == int.MAX)
9310 {
9311 if (!ctx.Read(itemQBIndex))
9312 {
9313 m_IsStoreLoad = false;
9314 return false;
9315 }
9316 }
9317 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9318 {
9319 //Load quickbar item bind
9320 if (!ctx.Read(itemQBIndex))
9321 {
9322 m_IsStoreLoad = false;
9323 return false;
9324 }
9325 if (itemQBIndex != -1 && player)
9326 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9327 }
9328 }
9329
9330 if (version < 140)
9331 {
9332 // variable management system
9333 if (!LoadVariables(ctx, version))
9334 {
9335 m_IsStoreLoad = false;
9336 return false;
9337 }
9338 }
9339
9340 //agent trasmission system
9341 if (!LoadAgents(ctx, version))
9342 {
9343 m_IsStoreLoad = false;
9344 return false;
9345 }
9346 if (version >= 132)
9347 {
9348 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
9349 if (raib)
9350 {
9351 if (!raib.OnStoreLoad(ctx,version))
9352 {
9353 m_IsStoreLoad = false;
9354 return false;
9355 }
9356 }
9357 }
9358
9359 m_IsStoreLoad = false;
9360 return true;
9361 }
9362
9363 //----------------------------------------------------------------
9364
9365 override void OnStoreSave(ParamsWriteContext ctx)
9366 {
9367 super.OnStoreSave(ctx);
9368
9369 PlayerBase player;
9370 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9371 {
9372 ctx.Write(true); // Keep track of if we should actually read this in or not
9373 //Save quickbar item bind
9374 int itemQBIndex = -1;
9375 itemQBIndex = player.FindQuickBarEntityIndex(this);
9376 ctx.Write(itemQBIndex);
9377 }
9378 else
9379 {
9380 ctx.Write(false); // Keep track of if we should actually read this in or not
9381 }
9382
9383 SaveAgents(ctx);//agent trasmission system
9384
9385 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
9386 if (raib)
9387 {
9388 raib.OnStoreSave(ctx);
9389 }
9390 }
9391 //----------------------------------------------------------------
9392
9393 override void AfterStoreLoad()
9394 {
9395 super.AfterStoreLoad();
9396
9398 {
9400 }
9401
9402 if (GetStoreLoadedQuantity() != float.LOWEST)
9403 {
9405 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
9406 }
9407 }
9408
9409 override void EEOnAfterLoad()
9410 {
9411 super.EEOnAfterLoad();
9412
9414 {
9415 m_FixDamageSystemInit = false;
9416 }
9417
9420 }
9421
9422 bool CanBeDisinfected()
9423 {
9424 return false;
9425 }
9426
9427
9428 //----------------------------------------------------------------
9429 override void OnVariablesSynchronized()
9430 {
9431 if (m_Initialized)
9432 {
9433 #ifdef PLATFORM_CONSOLE
9434 //bruteforce it is
9435 if (IsSplitable())
9436 {
9437 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
9438 if (menu)
9439 {
9440 menu.Refresh();
9441 }
9442 }
9443 #endif
9444 }
9445
9447 {
9448 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9449 m_WantPlayImpactSound = false;
9450 }
9451
9453 {
9454 SetWeightDirty();
9456 }
9457 if (m_VarWet != m_VarWetPrev)
9458 {
9461 }
9462
9463 if (m_SoundSyncPlay != 0)
9464 {
9465 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
9466 m_SoundSyncPlay = 0;
9467 }
9468 if (m_SoundSyncStop != 0)
9469 {
9470 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
9471 m_SoundSyncStop = 0;
9472 }
9473
9474 super.OnVariablesSynchronized();
9475 }
9476
9477 //------------------------- Quantity
9478 //----------------------------------------------------------------
9480 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
9481 {
9482 if (!IsServerCheck(allow_client))
9483 return false;
9484
9485 if (!HasQuantity())
9486 return false;
9487
9488 float min = GetQuantityMin();
9489 float max = GetQuantityMax();
9490
9491 if (value <= (min + 0.001))
9492 value = min;
9493
9494 if (value == min)
9495 {
9496 if (destroy_config)
9497 {
9498 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9499 if (dstr)
9500 {
9501 m_VarQuantity = Math.Clamp(value, min, max);
9502 this.Delete();
9503 return true;
9504 }
9505 }
9506 else if (destroy_forced)
9507 {
9508 m_VarQuantity = Math.Clamp(value, min, max);
9509 this.Delete();
9510 return true;
9511 }
9512 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
9513 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
9514 }
9515
9516 float delta = m_VarQuantity;
9517 m_VarQuantity = Math.Clamp(value, min, max);
9518
9519 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
9520 {
9521 delta = m_VarQuantity - delta;
9522
9523 if (delta)
9524 OnQuantityChanged(delta);
9525 }
9526
9527 SetVariableMask(VARIABLE_QUANTITY);
9528
9529 return false;
9530 }
9531
9532 //----------------------------------------------------------------
9534 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
9535 {
9536 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
9537 }
9538 //----------------------------------------------------------------
9539 void SetQuantityMax()
9540 {
9541 float max = GetQuantityMax();
9542 SetQuantity(max);
9543 }
9544
9545 override void SetQuantityToMinimum()
9546 {
9547 float min = GetQuantityMin();
9548 SetQuantity(min);
9549 }
9550 //----------------------------------------------------------------
9552 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
9553 {
9554 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
9555 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
9556 SetQuantity(result, destroy_config, destroy_forced);
9557 }
9558
9559 //----------------------------------------------------------------
9561 override float GetQuantityNormalized()
9562 {
9563 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
9564 }
9565
9567 {
9568 return GetQuantityNormalized();
9569 }
9570
9571 /*void SetAmmoNormalized(float value)
9572 {
9573 float value_clamped = Math.Clamp(value, 0, 1);
9574 Magazine this_mag = Magazine.Cast(this);
9575 int max_rounds = this_mag.GetAmmoMax();
9576 int result = value * max_rounds;//can the rounded if higher precision is required
9577 this_mag.SetAmmoCount(result);
9578 }*/
9579 //----------------------------------------------------------------
9580 override int GetQuantityMax()
9581 {
9582 int slot = -1;
9583 if (GetInventory())
9584 {
9585 InventoryLocation il = new InventoryLocation;
9586 GetInventory().GetCurrentInventoryLocation(il);
9587 slot = il.GetSlot();
9588 }
9589
9590 return GetTargetQuantityMax(slot);
9591 }
9592
9593 override int GetTargetQuantityMax(int attSlotID = -1)
9594 {
9595 float quantity_max = 0;
9596
9597 if (IsSplitable()) //only stackable/splitable items can check for stack size
9598 {
9599 if (attSlotID != -1)
9600 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9601
9602 if (quantity_max <= 0)
9603 quantity_max = m_VarStackMax;
9604 }
9605
9606 if (quantity_max <= 0)
9607 quantity_max = m_VarQuantityMax;
9608
9609 return quantity_max;
9610 }
9611 //----------------------------------------------------------------
9612 override int GetQuantityMin()
9613 {
9614 return m_VarQuantityMin;
9615 }
9616 //----------------------------------------------------------------
9617 int GetQuantityInit()
9618 {
9619 return m_VarQuantityInit;
9620 }
9621
9622 //----------------------------------------------------------------
9623 override bool HasQuantity()
9624 {
9625 return !(GetQuantityMax() - GetQuantityMin() == 0);
9626 }
9627
9628 override float GetQuantity()
9629 {
9630 return m_VarQuantity;
9631 }
9632
9633 bool IsFullQuantity()
9634 {
9635 return GetQuantity() >= GetQuantityMax();
9636 }
9637
9638 //Calculates weight of single item without attachments and cargo
9639 override float GetSingleInventoryItemWeightEx()
9640 {
9641 //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
9642 float weightEx = GetWeightEx();//overall weight of the item
9643 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
9644 return weightEx - special;
9645 }
9646
9647 // Obsolete, use GetSingleInventoryItemWeightEx() instead
9649 {
9651 }
9652
9653 override protected float GetWeightSpecialized(bool forceRecalc = false)
9654 {
9655 if (IsSplitable()) //quantity determines size of the stack
9656 {
9657 #ifdef DEVELOPER
9658 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9659 {
9660 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9661 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
9662 }
9663 #endif
9664
9665 return GetQuantity() * GetConfigWeightModified();
9666 }
9667 else if (HasEnergyManager())// items with energy manager
9668 {
9669 #ifdef DEVELOPER
9670 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9671 {
9672 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9673 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
9674 }
9675 #endif
9676 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9677 }
9678 else//everything else
9679 {
9680 #ifdef DEVELOPER
9681 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9682 {
9683 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9684 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
9685 }
9686 #endif
9687 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9688 }
9689 }
9690
9692 int GetNumberOfItems()
9693 {
9694 int item_count = 0;
9695 ItemBase item;
9696
9697 if (GetInventory().GetCargo() != NULL)
9698 {
9699 item_count = GetInventory().GetCargo().GetItemCount();
9700 }
9701
9702 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9703 {
9704 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9705 if (item)
9706 item_count += item.GetNumberOfItems();
9707 }
9708 return item_count;
9709 }
9710
9712 float GetUnitWeight(bool include_wetness = true)
9713 {
9714 float weight = 0;
9715 float wetness = 1;
9716 if (include_wetness)
9717 wetness += GetWet();
9718 if (IsSplitable()) //quantity determines size of the stack
9719 {
9720 weight = wetness * m_ConfigWeight;
9721 }
9722 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
9723 {
9724 weight = 1;
9725 }
9726 return weight;
9727 }
9728
9729 //-----------------------------------------------------------------
9730
9731 override void ClearInventory()
9732 {
9733 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
9734 {
9735 GameInventory inv = GetInventory();
9736 array<EntityAI> items = new array<EntityAI>;
9737 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
9738 for (int i = 0; i < items.Count(); i++)
9739 {
9740 ItemBase item = ItemBase.Cast(items.Get(i));
9741 if (item)
9742 {
9743 GetGame().ObjectDelete(item);
9744 }
9745 }
9746 }
9747 }
9748
9749 //------------------------- Energy
9750
9751 //----------------------------------------------------------------
9752 float GetEnergy()
9753 {
9754 float energy = 0;
9755 if (HasEnergyManager())
9756 {
9757 energy = GetCompEM().GetEnergy();
9758 }
9759 return energy;
9760 }
9761
9762
9763 override void OnEnergyConsumed()
9764 {
9765 super.OnEnergyConsumed();
9766
9768 }
9769
9770 override void OnEnergyAdded()
9771 {
9772 super.OnEnergyAdded();
9773
9775 }
9776
9777 // Converts energy (from Energy Manager) to quantity, if enabled.
9779 {
9780 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9781 {
9782 if (HasQuantity())
9783 {
9784 float energy_0to1 = GetCompEM().GetEnergy0To1();
9785 SetQuantityNormalized(energy_0to1);
9786 }
9787 }
9788 }
9789
9790 //----------------------------------------------------------------
9791 float GetHeatIsolationInit()
9792 {
9793 return ConfigGetFloat("heatIsolation");
9794 }
9795
9796 float GetHeatIsolation()
9797 {
9798 return m_HeatIsolation;
9799 }
9800
9801 float GetDryingIncrement(string pIncrementName)
9802 {
9803 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
9804 if (GetGame().ConfigIsExisting(paramPath))
9805 return GetGame().ConfigGetFloat(paramPath);
9806
9807 return 0.0;
9808 }
9809
9810 float GetSoakingIncrement(string pIncrementName)
9811 {
9812 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
9813 if (GetGame().ConfigIsExisting(paramPath))
9814 return GetGame().ConfigGetFloat(paramPath);
9815
9816 return 0.0;
9817 }
9818 //----------------------------------------------------------------
9819 override void SetWet(float value, bool allow_client = false)
9820 {
9821 if (!IsServerCheck(allow_client))
9822 return;
9823
9824 float min = GetWetMin();
9825 float max = GetWetMax();
9826
9827 float previousValue = m_VarWet;
9828
9829 m_VarWet = Math.Clamp(value, min, max);
9830
9831 if (previousValue != m_VarWet)
9832 {
9833 SetVariableMask(VARIABLE_WET);
9834 OnWetChanged(m_VarWet, previousValue);
9835 }
9836 }
9837 //----------------------------------------------------------------
9838 override void AddWet(float value)
9839 {
9840 SetWet(GetWet() + value);
9841 }
9842 //----------------------------------------------------------------
9843 override void SetWetMax()
9844 {
9846 }
9847 //----------------------------------------------------------------
9848 override float GetWet()
9849 {
9850 return m_VarWet;
9851 }
9852 //----------------------------------------------------------------
9853 override float GetWetMax()
9854 {
9855 return m_VarWetMax;
9856 }
9857 //----------------------------------------------------------------
9858 override float GetWetMin()
9859 {
9860 return m_VarWetMin;
9861 }
9862 //----------------------------------------------------------------
9863 override float GetWetInit()
9864 {
9865 return m_VarWetInit;
9866 }
9867 //----------------------------------------------------------------
9868 override void OnWetChanged(float newVal, float oldVal)
9869 {
9870 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
9871 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
9872 if (newLevel != oldLevel)
9873 {
9874 OnWetLevelChanged(newLevel,oldLevel);
9875 }
9876 }
9877
9878 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
9879 {
9880 SetWeightDirty();
9881 }
9882
9883 override EWetnessLevel GetWetLevel()
9884 {
9885 return GetWetLevelInternal(m_VarWet);
9886 }
9887
9888 //----------------------------------------------------------------
9889
9890 override void SetStoreLoad(bool value)
9891 {
9892 m_IsStoreLoad = value;
9893 }
9894
9895 override bool IsStoreLoad()
9896 {
9897 return m_IsStoreLoad;
9898 }
9899
9900 override void SetStoreLoadedQuantity(float value)
9901 {
9902 m_StoreLoadedQuantity = value;
9903 }
9904
9905 override float GetStoreLoadedQuantity()
9906 {
9907 return m_StoreLoadedQuantity;
9908 }
9909
9910 //----------------------------------------------------------------
9911
9912 float GetItemModelLength()
9913 {
9914 if (ConfigIsExisting("itemModelLength"))
9915 {
9916 return ConfigGetFloat("itemModelLength");
9917 }
9918 return 0;
9919 }
9920
9921 float GetItemAttachOffset()
9922 {
9923 if (ConfigIsExisting("itemAttachOffset"))
9924 {
9925 return ConfigGetFloat("itemAttachOffset");
9926 }
9927 return 0;
9928 }
9929
9930 override void SetCleanness(int value, bool allow_client = false)
9931 {
9932 if (!IsServerCheck(allow_client))
9933 return;
9934
9935 int previousValue = m_Cleanness;
9936
9937 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
9938
9939 if (previousValue != m_Cleanness)
9940 SetVariableMask(VARIABLE_CLEANNESS);
9941 }
9942
9943 override int GetCleanness()
9944 {
9945 return m_Cleanness;
9946 }
9947
9949 {
9950 return true;
9951 }
9952
9953 //----------------------------------------------------------------
9954 // ATTACHMENT LOCKING
9955 // Getters relevant to generic ActionLockAttachment
9956 int GetLockType()
9957 {
9958 return m_LockType;
9959 }
9960
9961 string GetLockSoundSet()
9962 {
9963 return m_LockSoundSet;
9964 }
9965
9966 //----------------------------------------------------------------
9967 //------------------------- Color
9968 // sets items color variable given color components
9969 override void SetColor(int r, int g, int b, int a)
9970 {
9975 SetVariableMask(VARIABLE_COLOR);
9976 }
9978 override void GetColor(out int r,out int g,out int b,out int a)
9979 {
9984 }
9985
9986 bool IsColorSet()
9987 {
9988 return IsVariableSet(VARIABLE_COLOR);
9989 }
9990
9992 string GetColorString()
9993 {
9994 int r,g,b,a;
9995 GetColor(r,g,b,a);
9996 r = r/255;
9997 g = g/255;
9998 b = b/255;
9999 a = a/255;
10000 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10001 }
10002 //----------------------------------------------------------------
10003 //------------------------- LiquidType
10004
10005 override void SetLiquidType(int value, bool allow_client = false)
10006 {
10007 if (!IsServerCheck(allow_client))
10008 return;
10009
10010 int old = m_VarLiquidType;
10011 m_VarLiquidType = value;
10012 OnLiquidTypeChanged(old,value);
10013 SetVariableMask(VARIABLE_LIQUIDTYPE);
10014 }
10015
10016 int GetLiquidTypeInit()
10017 {
10018 return ConfigGetInt("varLiquidTypeInit");
10019 }
10020
10021 override int GetLiquidType()
10022 {
10023 return m_VarLiquidType;
10024 }
10025
10026 protected void OnLiquidTypeChanged(int oldType, int newType)
10027 {
10028 if (newType == LIQUID_NONE && GetIsFrozen())
10029 SetFrozen(false);
10030 }
10031
10033 void UpdateQuickbarShortcutVisibility(PlayerBase player)
10034 {
10035 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10036 }
10037
10038 // -------------------------------------------------------------------------
10040 void OnInventoryEnter(Man player)
10041 {
10042 PlayerBase nplayer;
10043 if (PlayerBase.CastTo(nplayer, player))
10044 {
10045 m_CanPlayImpactSound = true;
10046 //nplayer.OnItemInventoryEnter(this);
10047 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10048 }
10049 }
10050
10051 // -------------------------------------------------------------------------
10053 void OnInventoryExit(Man player)
10054 {
10055 PlayerBase nplayer;
10056 if (PlayerBase.CastTo(nplayer,player))
10057 {
10058 //nplayer.OnItemInventoryExit(this);
10059 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10060
10061 }
10062
10063 //if (!GetGame().IsDedicatedServer())
10064 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10065
10066
10067 if (HasEnergyManager())
10068 {
10069 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
10070 }
10071 }
10072
10073 // ADVANCED PLACEMENT EVENTS
10074 override void OnPlacementStarted(Man player)
10075 {
10076 super.OnPlacementStarted(player);
10077
10078 SetTakeable(false);
10079 }
10080
10081 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
10082 {
10083 if (m_AdminLog)
10084 {
10085 m_AdminLog.OnPlacementComplete(player, this);
10086 }
10087
10088 super.OnPlacementComplete(player, position, orientation);
10089 }
10090
10091 //-----------------------------
10092 // AGENT SYSTEM
10093 //-----------------------------
10094 //--------------------------------------------------------------------------
10095 bool ContainsAgent(int agent_id)
10096 {
10097 if (agent_id & m_AttachedAgents)
10098 {
10099 return true;
10100 }
10101 else
10102 {
10103 return false;
10104 }
10105 }
10106
10107 //--------------------------------------------------------------------------
10108 override void RemoveAgent(int agent_id)
10109 {
10110 if (ContainsAgent(agent_id))
10111 {
10112 m_AttachedAgents = ~agent_id & m_AttachedAgents;
10113 }
10114 }
10115
10116 //--------------------------------------------------------------------------
10117 override void RemoveAllAgents()
10118 {
10119 m_AttachedAgents = 0;
10120 }
10121 //--------------------------------------------------------------------------
10122 override void RemoveAllAgentsExcept(int agent_to_keep)
10123 {
10124 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
10125 }
10126 // -------------------------------------------------------------------------
10127 override void InsertAgent(int agent, float count = 1)
10128 {
10129 if (count < 1)
10130 return;
10131 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
10133 }
10134
10136 void TransferAgents(int agents)
10137 {
10139 }
10140
10141 // -------------------------------------------------------------------------
10142 override int GetAgents()
10143 {
10144 return m_AttachedAgents;
10145 }
10146 //----------------------------------------------------------------------
10147
10148 /*int GetContaminationType()
10149 {
10150 int contamination_type;
10151
10152 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
10153 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
10154 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
10155 const int DIRTY_MASK = eAgents.WOUND_AGENT;
10156
10157 Edible_Base edible = Edible_Base.Cast(this);
10158 int agents = GetAgents();
10159 if (edible)
10160 {
10161 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
10162 if (profile)
10163 {
10164 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
10165 }
10166 }
10167 if (agents & CONTAMINATED_MASK)
10168 {
10169 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
10170 }
10171 if (agents & POISONED_MASK)
10172 {
10173 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
10174 }
10175 if (agents & NERVE_GAS_MASK)
10176 {
10177 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
10178 }
10179 if (agents & DIRTY_MASK)
10180 {
10181 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
10182 }
10183
10184 return agents;
10185 }*/
10186
10187 // -------------------------------------------------------------------------
10188 bool LoadAgents(ParamsReadContext ctx, int version)
10189 {
10190 if (!ctx.Read(m_AttachedAgents))
10191 return false;
10192 return true;
10193 }
10194 // -------------------------------------------------------------------------
10196 {
10197
10199 }
10200 // -------------------------------------------------------------------------
10201
10203 override void CheckForRoofLimited(float timeTresholdMS = 3000)
10204 {
10205 super.CheckForRoofLimited(timeTresholdMS);
10206
10207 float time = GetGame().GetTime();
10208 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
10209 {
10210 m_PreviousRoofTestTime = time;
10211 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
10212 }
10213 }
10214
10215 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
10216 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
10217 {
10218 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
10219 {
10220 return 0;
10221 }
10222
10223 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
10224 {
10225 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
10226 if (filter)
10227 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
10228 else
10229 return 0;//otherwise return 0 when no filter attached
10230 }
10231
10232 string subclassPath, entryName;
10233
10234 switch (type)
10235 {
10236 case DEF_BIOLOGICAL:
10237 entryName = "biological";
10238 break;
10239 case DEF_CHEMICAL:
10240 entryName = "chemical";
10241 break;
10242 default:
10243 entryName = "biological";
10244 break;
10245 }
10246
10247 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
10248
10249 return GetGame().ConfigGetFloat(subclassPath + entryName);
10250 }
10251
10252
10253
10255 override void EEOnCECreate()
10256 {
10257 if (!IsMagazine())
10259
10261 }
10262
10263
10264 //-------------------------
10265 // OPEN/CLOSE USER ACTIONS
10266 //-------------------------
10268 void Open();
10269 void Close();
10270 bool IsOpen()
10271 {
10272 return true;
10273 }
10274
10275 override bool CanDisplayCargo()
10276 {
10277 return IsOpen();
10278 }
10279
10280
10281 // ------------------------------------------------------------
10282 // CONDITIONS
10283 // ------------------------------------------------------------
10284 override bool CanPutInCargo(EntityAI parent)
10285 {
10286 if (parent)
10287 {
10288 if (parent.IsInherited(DayZInfected))
10289 return true;
10290
10291 if (!parent.IsRuined())
10292 return true;
10293 }
10294
10295 return true;
10296 }
10297
10298 override bool CanPutAsAttachment(EntityAI parent)
10299 {
10300 if (!super.CanPutAsAttachment(parent))
10301 {
10302 return false;
10303 }
10304
10305 if (!IsRuined() && !parent.IsRuined())
10306 {
10307 return true;
10308 }
10309
10310 return false;
10311 }
10312
10313 override bool CanReceiveItemIntoCargo(EntityAI item)
10314 {
10315 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
10316 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
10317 // return false;
10318
10319 return super.CanReceiveItemIntoCargo(item);
10320 }
10321
10322 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
10323 {
10324 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
10325 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
10326 // return false;
10327
10328 GameInventory attachmentInv = attachment.GetInventory();
10329 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
10330 {
10331 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10332 return false;
10333 }
10334
10335 InventoryLocation loc = new InventoryLocation();
10336 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10337 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
10338 return false;
10339
10340 return super.CanReceiveAttachment(attachment, slotId);
10341 }
10342
10343 override bool CanReleaseAttachment(EntityAI attachment)
10344 {
10345 if (!super.CanReleaseAttachment(attachment))
10346 return false;
10347
10348 return GetInventory().AreChildrenAccessible();
10349 }
10350
10351 /*override bool CanLoadAttachment(EntityAI attachment)
10352 {
10353 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
10354 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
10355 // return false;
10356
10357 GameInventory attachmentInv = attachment.GetInventory();
10358 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
10359 {
10360 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
10361 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
10362
10363 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10364 return false;
10365 }
10366
10367 return super.CanLoadAttachment(attachment);
10368 }*/
10369
10370 // Plays muzzle flash particle effects
10371 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10372 {
10373 int id = muzzle_owner.GetMuzzleID();
10374 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
10375
10376 if (WPOF_array)
10377 {
10378 for (int i = 0; i < WPOF_array.Count(); i++)
10379 {
10380 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10381
10382 if (WPOF)
10383 {
10384 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10385 }
10386 }
10387 }
10388 }
10389
10390 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
10391 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10392 {
10393 int id = muzzle_owner.GetMuzzleID();
10394 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
10395
10396 if (WPOBE_array)
10397 {
10398 for (int i = 0; i < WPOBE_array.Count(); i++)
10399 {
10400 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10401
10402 if (WPOBE)
10403 {
10404 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10405 }
10406 }
10407 }
10408 }
10409
10410 // Plays all weapon overheating particles
10411 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10412 {
10413 int id = muzzle_owner.GetMuzzleID();
10414 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10415
10416 if (WPOOH_array)
10417 {
10418 for (int i = 0; i < WPOOH_array.Count(); i++)
10419 {
10420 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10421
10422 if (WPOOH)
10423 {
10424 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10425 }
10426 }
10427 }
10428 }
10429
10430 // Updates all weapon overheating particles
10431 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10432 {
10433 int id = muzzle_owner.GetMuzzleID();
10434 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10435
10436 if (WPOOH_array)
10437 {
10438 for (int i = 0; i < WPOOH_array.Count(); i++)
10439 {
10440 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10441
10442 if (WPOOH)
10443 {
10444 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10445 }
10446 }
10447 }
10448 }
10449
10450 // Stops overheating particles
10451 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
10452 {
10453 int id = muzzle_owner.GetMuzzleID();
10454 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10455
10456 if (WPOOH_array)
10457 {
10458 for (int i = 0; i < WPOOH_array.Count(); i++)
10459 {
10460 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10461
10462 if (WPOOH)
10463 {
10464 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10465 }
10466 }
10467 }
10468 }
10469
10470 //----------------------------------------------------------------
10471 //Item Behaviour - unified approach
10472 override bool IsHeavyBehaviour()
10473 {
10474 if (m_ItemBehaviour == 0)
10475 {
10476 return true;
10477 }
10478
10479 return false;
10480 }
10481
10482 override bool IsOneHandedBehaviour()
10483 {
10484 if (m_ItemBehaviour == 1)
10485 {
10486 return true;
10487 }
10488
10489 return false;
10490 }
10491
10492 override bool IsTwoHandedBehaviour()
10493 {
10494 if (m_ItemBehaviour == 2)
10495 {
10496 return true;
10497 }
10498
10499 return false;
10500 }
10501
10502 bool IsDeployable()
10503 {
10504 return false;
10505 }
10506
10508 float GetDeployTime()
10509 {
10510 return UATimeSpent.DEFAULT_DEPLOY;
10511 }
10512
10513
10514 //----------------------------------------------------------------
10515 // Item Targeting (User Actions)
10516 override void SetTakeable(bool pState)
10517 {
10518 m_IsTakeable = pState;
10519 SetSynchDirty();
10520 }
10521
10522 override bool IsTakeable()
10523 {
10524 return m_IsTakeable;
10525 }
10526
10527 // For cases where we want to show object widget which cant be taken to hands
10529 {
10530 return false;
10531 }
10532
10534 protected void PreLoadSoundAttachmentType()
10535 {
10536 string att_type = "None";
10537
10538 if (ConfigIsExisting("soundAttType"))
10539 {
10540 att_type = ConfigGetString("soundAttType");
10541 }
10542
10543 m_SoundAttType = att_type;
10544 }
10545
10546 override string GetAttachmentSoundType()
10547 {
10548 return m_SoundAttType;
10549 }
10550
10551 //----------------------------------------------------------------
10552 //SOUNDS - ItemSoundHandler
10553 //----------------------------------------------------------------
10554
10555 string GetPlaceSoundset(); // played when deploy starts
10556 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
10557 string GetDeploySoundset(); // played when deploy sucessfully finishes
10558
10560 {
10561 if (!m_ItemSoundHandler)
10563
10564 return m_ItemSoundHandler;
10565 }
10566
10567 // override to initialize sounds
10568 protected void InitItemSounds()
10569 {
10570 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
10571 return;
10572
10574
10575 if (GetPlaceSoundset() != string.Empty)
10576 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
10577
10578 if (GetDeploySoundset() != string.Empty)
10579 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
10580
10581 SoundParameters params = new SoundParameters();
10582 params.m_Loop = true;
10583 if (GetLoopDeploySoundset() != string.Empty)
10584 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
10585 }
10586
10587 // Start sound using ItemSoundHandler
10588 void StartItemSoundServer(int id)
10589 {
10590 if (!GetGame().IsServer())
10591 return;
10592
10593 m_SoundSyncPlay = id;
10594 SetSynchDirty();
10595
10596 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
10598 }
10599
10600 // Stop sound using ItemSoundHandler
10601 void StopItemSoundServer(int id)
10602 {
10603 if (!GetGame().IsServer())
10604 return;
10605
10606 m_SoundSyncStop = id;
10607 SetSynchDirty();
10608
10609 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
10611 }
10612
10613 protected void ClearStartItemSoundServer()
10614 {
10615 m_SoundSyncPlay = 0;
10616 }
10617
10618 protected void ClearStopItemSoundServer()
10619 {
10620 m_SoundSyncStop = 0;
10621 }
10622
10624 void PlayAttachSound(string slot_type)
10625 {
10626 if (!GetGame().IsDedicatedServer())
10627 {
10628 if (ConfigIsExisting("attachSoundSet"))
10629 {
10630 string cfg_path = "";
10631 string soundset = "";
10632 string type_name = GetType();
10633
10634 TStringArray cfg_soundset_array = new TStringArray;
10635 TStringArray cfg_slot_array = new TStringArray;
10636 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10637 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10638
10639 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10640 {
10641 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10642 {
10643 if (cfg_slot_array[i] == slot_type)
10644 {
10645 soundset = cfg_soundset_array[i];
10646 break;
10647 }
10648 }
10649 }
10650
10651 if (soundset != "")
10652 {
10653 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
10654 sound.SetAutodestroy(true);
10655 }
10656 }
10657 }
10658 }
10659
10660 void PlayDetachSound(string slot_type)
10661 {
10662 //TODO - evaluate if needed and devise universal config structure if so
10663 }
10664
10665 void OnApply(PlayerBase player);
10666
10668 {
10669 return 1.0;
10670 };
10671 //returns applicable selection
10672 array<string> GetHeadHidingSelection()
10673 {
10675 }
10676
10678 {
10680 }
10681
10682 WrittenNoteData GetWrittenNoteData() {};
10683
10685 {
10686 SetDynamicPhysicsLifeTime(0.01);
10687 m_ItemBeingDroppedPhys = false;
10688 }
10689
10691 {
10692 array<string> zone_names = new array<string>;
10693 GetDamageZones(zone_names);
10694 for (int i = 0; i < zone_names.Count(); i++)
10695 {
10696 SetHealthMax(zone_names.Get(i),"Health");
10697 }
10698 SetHealthMax("","Health");
10699 }
10700
10702 void SetZoneDamageCEInit()
10703 {
10704 float global_health = GetHealth01("","Health");
10705 array<string> zones = new array<string>;
10706 GetDamageZones(zones);
10707 //set damage of all zones to match global health level
10708 for (int i = 0; i < zones.Count(); i++)
10709 {
10710 SetHealth01(zones.Get(i),"Health",global_health);
10711 }
10712 }
10713
10715 bool IsCoverFaceForShave(string slot_name)
10716 {
10717 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10718 }
10719
10720 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10721 {
10722 if (!hasRootAsPlayer)
10723 {
10724 if (refParentIB)
10725 {
10726 // parent is wet
10727 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
10728 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10729 // parent has liquid inside
10730 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
10731 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10732 // drying
10733 else if (m_VarWet > m_VarWetMin)
10734 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
10735 }
10736 else
10737 {
10738 // drying on ground or inside non-itembase (car, ...)
10739 if (m_VarWet > m_VarWetMin)
10740 AddWet(-1 * delta * GetDryingIncrement("ground"));
10741 }
10742 }
10743 }
10744
10745 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10746 {
10748 {
10749 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
10750 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
10751 {
10752 float heatPermCoef = 1.0;
10753 EntityAI ent = this;
10754 while (ent)
10755 {
10756 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10757 ent = ent.GetHierarchyParent();
10758 }
10759
10760 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10761 }
10762 }
10763 }
10764
10765 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
10766 {
10767 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
10768 EntityAI parent = GetHierarchyParent();
10769 if (!parent)
10770 {
10771 hasParent = false;
10772 hasRootAsPlayer = false;
10773 }
10774 else
10775 {
10776 hasParent = true;
10777 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10778 refParentIB = ItemBase.Cast(parent);
10779 }
10780 }
10781
10782 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
10783 {
10784 // this is stub, implemented on Edible_Base
10785 }
10786
10787 bool CanDecay()
10788 {
10789 // return true used on selected food clases so they can decay
10790 return false;
10791 }
10792
10793 protected bool CanProcessDecay()
10794 {
10795 // this is stub, implemented on Edible_Base class
10796 // used to determine whether it is still necessary for the food to decay
10797 return false;
10798 }
10799
10800 protected bool CanHaveWetness()
10801 {
10802 // return true used on selected items that have a wetness effect
10803 return false;
10804 }
10805
10807 bool CanBeConsumed(ConsumeConditionData data = null)
10808 {
10809 return !GetIsFrozen() && IsOpen();
10810 }
10811
10812 override void ProcessVariables()
10813 {
10814 bool hasParent = false, hasRootAsPlayer = false;
10815 ItemBase refParentIB;
10816
10817 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
10818 bool foodDecay = g_Game.IsFoodDecayEnabled();
10819
10820 if (wwtu || foodDecay)
10821 {
10822 bool processWetness = wwtu && CanHaveWetness();
10823 bool processTemperature = wwtu && CanHaveTemperature();
10824 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
10825
10826 if (processWetness || processTemperature || processDecay)
10827 {
10828 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
10829
10830 if (processWetness)
10831 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10832
10833 if (processTemperature)
10834 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10835
10836 if (processDecay)
10837 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10838 }
10839 }
10840 }
10841
10844 {
10845 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
10846 }
10847
10848 override float GetTemperatureFreezeThreshold()
10849 {
10851 return Liquid.GetFreezeThreshold(GetLiquidType());
10852
10853 return super.GetTemperatureFreezeThreshold();
10854 }
10855
10856 override float GetTemperatureThawThreshold()
10857 {
10859 return Liquid.GetThawThreshold(GetLiquidType());
10860
10861 return super.GetTemperatureThawThreshold();
10862 }
10863
10864 override float GetItemOverheatThreshold()
10865 {
10867 return Liquid.GetBoilThreshold(GetLiquidType());
10868
10869 return super.GetItemOverheatThreshold();
10870 }
10871
10872 override float GetTemperatureFreezeTime()
10873 {
10874 if (HasQuantity())
10875 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
10876
10877 return super.GetTemperatureFreezeTime();
10878 }
10879
10880 override float GetTemperatureThawTime()
10881 {
10882 if (HasQuantity())
10883 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
10884
10885 return super.GetTemperatureThawTime();
10886 }
10887
10889 void AffectLiquidContainerOnFill(int liquid_type, float amount);
10891 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
10892
10893 bool IsCargoException4x3(EntityAI item)
10894 {
10895 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10896 }
10897
10899 {
10900 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10901 }
10902
10904 void AddLightSourceItem(ItemBase lightsource)
10905 {
10906 m_LightSourceItem = lightsource;
10907 }
10908
10910 {
10911 m_LightSourceItem = null;
10912 }
10913
10915 {
10916 return m_LightSourceItem;
10917 }
10918
10920 array<int> GetValidFinishers()
10921 {
10922 return null;
10923 }
10924
10926 bool GetActionWidgetOverride(out typename name)
10927 {
10928 return false;
10929 }
10930
10931 bool PairWithDevice(notnull ItemBase otherDevice)
10932 {
10933 if (GetGame().IsServer())
10934 {
10935 ItemBase explosive = otherDevice;
10937 if (!trg)
10938 {
10939 trg = RemoteDetonatorTrigger.Cast(otherDevice);
10940 explosive = this;
10941 }
10942
10943 explosive.PairRemote(trg);
10944 trg.SetControlledDevice(explosive);
10945
10946 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10947 trg.SetPersistentPairID(persistentID);
10948 explosive.SetPersistentPairID(persistentID);
10949
10950 return true;
10951 }
10952 return false;
10953 }
10954
10956 float GetBaitEffectivity()
10957 {
10958 float ret = 1.0;
10959 if (HasQuantity())
10960 ret *= GetQuantityNormalized();
10961 ret *= GetHealth01();
10962
10963 return ret;
10964 }
10965
10966 #ifdef DEVELOPER
10967 override void SetDebugItem()
10968 {
10969 super.SetDebugItem();
10970 _itemBase = this;
10971 }
10972
10973 override string GetDebugText()
10974 {
10975 string text = super.GetDebugText();
10976
10977 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
10978 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
10979
10980 return text;
10981 }
10982 #endif
10983
10984 bool CanBeUsedForSuicide()
10985 {
10986 return true;
10987 }
10988
10990 //DEPRECATED BELOW
10992 // Backwards compatibility
10993 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
10994 {
10995 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
10996 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
10997 }
10998
10999 // replaced by ItemSoundHandler
11000 protected EffectSound m_SoundDeployFinish;
11001 protected EffectSound m_SoundPlace;
11002 protected EffectSound m_DeployLoopSoundEx;
11003 protected EffectSound m_SoundDeploy;
11004 bool m_IsPlaceSound;
11005 bool m_IsDeploySound;
11007
11008 string GetDeployFinishSoundset();
11009 void PlayDeploySound();
11010 void PlayDeployFinishSound();
11011 void PlayPlaceSound();
11012 void PlayDeployLoopSoundEx();
11013 void StopDeployLoopSoundEx();
11014 void SoundSynchRemoteReset();
11015 void SoundSynchRemote();
11016 bool UsesGlobalDeploy(){return false;}
11017 bool CanPlayDeployLoopSound(){return false;}
11019 bool IsPlaceSound(){return m_IsPlaceSound;}
11020 bool IsDeploySound(){return m_IsDeploySound;}
11021 void SetIsPlaceSound(bool is_place_sound);
11022 void SetIsDeploySound(bool is_deploy_sound);
11023}
11024
11025EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
11026{
11027 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
11028 if (entity)
11029 {
11030 bool is_item = entity.IsInherited(ItemBase);
11031 if (is_item && full_quantity)
11032 {
11033 ItemBase item = ItemBase.Cast(entity);
11034 item.SetQuantity(item.GetQuantityInit());
11035 }
11036 }
11037 else
11038 {
11039 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
11040 return NULL;
11041 }
11042 return entity;
11043}
11044
11045void SetupSpawnedItem(ItemBase item, float health, float quantity)
11046{
11047 if (item)
11048 {
11049 if (health > 0)
11050 item.SetHealth("", "", health);
11051
11052 if (item.CanHaveTemperature())
11053 {
11054 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
11055 if (item.CanFreeze())
11056 item.SetFrozen(false);
11057 }
11058
11059 if (item.HasEnergyManager())
11060 {
11061 if (quantity >= 0)
11062 {
11063 item.GetCompEM().SetEnergy0To1(quantity);
11064 }
11065 else
11066 {
11067 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
11068 }
11069 }
11070 else if (item.IsMagazine())
11071 {
11072 Magazine mag = Magazine.Cast(item);
11073 if (quantity >= 0)
11074 {
11075 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11076 }
11077 else
11078 {
11079 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
11080 }
11081
11082 }
11083 else
11084 {
11085 if (quantity >= 0)
11086 {
11087 item.SetQuantityNormalized(quantity, false);
11088 }
11089 else
11090 {
11091 item.SetQuantity(Math.AbsFloat(quantity));
11092 }
11093
11094 }
11095 }
11096}
11097
11098#ifdef DEVELOPER
11099ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
11100#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()