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

◆ CanBeMovedOverride()

bool SpawnItemOnLocation::CanBeMovedOverride ( )
private

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

7384{
7385 override bool CanPutAsAttachment(EntityAI parent)
7386 {
7387 return true;
7388 }
7389};
7390
7391//const bool QUANTITY_DEBUG_REMOVE_ME = false;
7392
7393class ItemBase extends InventoryItem
7394{
7398
7400
7401 static int m_DebugActionsMask;
7403 // ============================================
7404 // Variable Manipulation System
7405 // ============================================
7406 // Quantity
7407
7408 float m_VarQuantity;
7409 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
7411 int m_VarQuantityMin;
7412 int m_VarQuantityMax;
7413 int m_Count;
7414 float m_VarStackMax;
7415 float m_StoreLoadedQuantity = float.LOWEST;
7416 // Wet
7417 float m_VarWet;
7418 float m_VarWetPrev;//for client to know wetness changed during synchronization
7419 float m_VarWetInit;
7420 float m_VarWetMin;
7421 float m_VarWetMax;
7422 // Cleanness
7423 int m_Cleanness;
7424 int m_CleannessInit;
7425 int m_CleannessMin;
7426 int m_CleannessMax;
7427 // impact sounds
7429 bool m_CanPlayImpactSound = true;
7430 float m_ImpactSpeed;
7432 //
7433 float m_HeatIsolation;
7434 float m_ItemModelLength;
7435 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
7437 int m_VarLiquidType;
7438 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
7439 int m_QuickBarBonus;
7440 bool m_IsBeingPlaced;
7441 bool m_IsHologram;
7442 bool m_IsTakeable;
7443 bool m_ThrowItemOnDrop;
7446 bool m_FixDamageSystemInit = false; //can be changed on storage version check
7447 bool can_this_be_combined; //Check if item can be combined
7448 bool m_CanThisBeSplit; //Check if item can be split
7449 bool m_IsStoreLoad = false;
7450 bool m_CanShowQuantity;
7451 bool m_HasQuantityBar;
7452 protected bool m_CanBeDigged;
7453 protected bool m_IsResultOfSplit
7454
7455 string m_SoundAttType;
7456 // items color variables
7461 //-------------------------------------------------------
7462
7463 // light source managing
7465
7469
7470 //==============================================
7471 // agent system
7472 private int m_AttachedAgents;
7473
7475 void TransferModifiers(PlayerBase reciever);
7476
7477
7478 // Weapons & suppressors particle effects
7483 static int m_LastRegisteredWeaponID = 0;
7484
7485 // Overheating effects
7487 float m_OverheatingShots;
7488 ref Timer m_CheckOverheating;
7489 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
7490 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
7491 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
7492 ref array <ref OverheatingParticle> m_OverheatingParticles;
7493
7495 protected bool m_HideSelectionsBySlot;
7496
7497 // Admin Log
7498 PluginAdminLog m_AdminLog;
7499
7500 // misc
7501 ref Timer m_PhysDropTimer;
7502
7503 // Attachment Locking variables
7504 ref array<int> m_CompatibleLocks;
7505 protected int m_LockType;
7506 protected ref EffectSound m_LockingSound;
7507 protected string m_LockSoundSet;
7508
7509 // ItemSoundHandler
7510 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
7511 protected int m_SoundSyncPlay; // id for sound to play
7512 protected int m_SoundSyncStop; // id for sound to stop
7514
7515 //temperature
7516 private float m_TemperaturePerQuantityWeight;
7517
7518 // -------------------------------------------------------------------------
7519 void ItemBase()
7520 {
7521 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
7525
7526 if (!GetGame().IsDedicatedServer())
7527 {
7528 if (HasMuzzle())
7529 {
7531
7533 {
7535 }
7536 }
7537
7539 m_ActionsInitialize = false;
7540 }
7541
7542 m_OldLocation = null;
7543
7544 if (GetGame().IsServer())
7545 {
7546 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
7547 }
7548
7549 if (ConfigIsExisting("headSelectionsToHide"))
7550 {
7552 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
7553 }
7554
7555 m_HideSelectionsBySlot = false;
7556 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7557 {
7558 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
7559 }
7560
7561 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
7562
7563 m_IsResultOfSplit = false;
7564
7566 }
7567
7568 override void InitItemVariables()
7569 {
7570 super.InitItemVariables();
7571
7572 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
7573 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
7574 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
7575 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
7576 m_VarStackMax = ConfigGetFloat("varStackMax");
7577 m_Count = ConfigGetInt("count");
7578
7579 m_CanShowQuantity = ConfigGetBool("quantityShow");
7580 m_HasQuantityBar = ConfigGetBool("quantityBar");
7581
7582 m_CleannessInit = ConfigGetInt("varCleannessInit");
7584 m_CleannessMin = ConfigGetInt("varCleannessMin");
7585 m_CleannessMax = ConfigGetInt("varCleannessMax");
7586
7587 m_WantPlayImpactSound = false;
7588 m_ImpactSpeed = 0.0;
7589
7590 m_VarWetInit = ConfigGetFloat("varWetInit");
7592 m_VarWetMin = ConfigGetFloat("varWetMin");
7593 m_VarWetMax = ConfigGetFloat("varWetMax");
7594
7595 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
7596 if (IsLiquidContainer() && GetQuantity() != 0)
7598 m_IsBeingPlaced = false;
7599 m_IsHologram = false;
7600 m_IsTakeable = true;
7601 m_CanBeMovedOverride = false;
7605 m_CanBeDigged = ConfigGetBool("canBeDigged");
7606
7607 m_CompatibleLocks = new array<int>();
7608 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
7609 m_LockType = ConfigGetInt("lockType");
7610
7611 //Define if item can be split and set ability to be combined accordingly
7612 m_CanThisBeSplit = false;
7613 can_this_be_combined = false;
7614 if (ConfigIsExisting("canBeSplit"))
7615 {
7616 can_this_be_combined = ConfigGetBool("canBeSplit");
7618 }
7619
7620 m_ItemBehaviour = -1;
7621 if (ConfigIsExisting("itemBehaviour"))
7622 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
7623
7624 //RegisterNetSyncVariableInt("m_VariablesMask");
7625 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7626 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
7627 RegisterNetSyncVariableInt("m_VarLiquidType");
7628 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7629
7630 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7631 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7632 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7633
7634 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7635 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7636 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7637 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7638
7639 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7640 RegisterNetSyncVariableBool("m_IsTakeable");
7641 RegisterNetSyncVariableBool("m_IsHologram");
7642
7643 InitItemSounds();
7645 {
7646 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
7647 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
7648 }
7649
7650 m_LockSoundSet = ConfigGetString("lockSoundSet");
7651
7653 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7654 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
7655
7656 }
7657
7658 override int GetQuickBarBonus()
7659 {
7660 return m_QuickBarBonus;
7661 }
7662
7663 void InitializeActions()
7664 {
7666 if (!m_InputActionMap)
7667 {
7669 m_InputActionMap = iam;
7670 SetActions();
7672 }
7673 }
7674
7675 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
7676 {
7678 {
7679 m_ActionsInitialize = true;
7681 }
7682
7683 actions = m_InputActionMap.Get(action_input_type);
7684 }
7685
7686 void SetActions()
7687 {
7688 AddAction(ActionTakeItem);
7689 AddAction(ActionTakeItemToHands);
7690 AddAction(ActionWorldCraft);
7692 AddAction(ActionAttachWithSwitch);
7693 }
7694
7695 void SetActionAnimOverrides(); // Override action animation for specific item
7696
7697 void AddAction(typename actionName)
7698 {
7699 ActionBase action = ActionManagerBase.GetAction(actionName);
7700
7701 if (!action)
7702 {
7703 Debug.LogError("Action " + actionName + " dosn't exist!");
7704 return;
7705 }
7706
7707 typename ai = action.GetInputType();
7708 if (!ai)
7709 {
7710 m_ActionsInitialize = false;
7711 return;
7712 }
7713
7714 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7715 if (!action_array)
7716 {
7717 action_array = new array<ActionBase_Basic>;
7718 m_InputActionMap.Insert(ai, action_array);
7719 }
7720 if (LogManager.IsActionLogEnable())
7721 {
7722 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
7723 }
7724
7725 if (action_array.Find(action) != -1)
7726 {
7727 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
7728 }
7729 else
7730 {
7731 action_array.Insert(action);
7732 }
7733 }
7734
7735 void RemoveAction(typename actionName)
7736 {
7737 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
7738 ActionBase action = player.GetActionManager().GetAction(actionName);
7739 typename ai = action.GetInputType();
7740 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7741
7742 if (action_array)
7743 {
7744 action_array.RemoveItem(action);
7745 }
7746 }
7747
7748 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
7749 // Set -1 for params which should stay in default state
7750 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
7751 {
7752 ActionOverrideData overrideData = new ActionOverrideData();
7753 overrideData.m_CommandUID = commandUID;
7754 overrideData.m_CommandUIDProne = commandUIDProne;
7755 overrideData.m_StanceMask = stanceMask;
7756
7757 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
7758 if (!actionMap) // create new map of action > overidables map
7759 {
7760 actionMap = new TActionAnimOverrideMap();
7761 m_ItemActionOverrides.Insert(action, actionMap);
7762 }
7763
7764 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
7765
7766 }
7767
7768 void OnItemInHandsPlayerSwimStart(PlayerBase player);
7769
7770 ScriptedLightBase GetLight();
7771
7772 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
7773 void LoadParticleConfigOnFire(int id)
7774 {
7775 if (!m_OnFireEffect)
7777
7780
7781 string config_to_search = "CfgVehicles";
7782 string muzzle_owner_config;
7783
7784 if (!m_OnFireEffect.Contains(id))
7785 {
7786 if (IsInherited(Weapon))
7787 config_to_search = "CfgWeapons";
7788
7789 muzzle_owner_config = config_to_search + " " + GetType() + " ";
7790
7791 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7792
7793 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
7794
7795 if (config_OnFire_subclass_count > 0)
7796 {
7797 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7798
7799 for (int i = 0; i < config_OnFire_subclass_count; i++)
7800 {
7801 string particle_class = "";
7802 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
7803 string config_OnFire_entry = config_OnFire_class + particle_class;
7804 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7805 WPOF_array.Insert(WPOF);
7806 }
7807
7808
7809 m_OnFireEffect.Insert(id, WPOF_array);
7810 }
7811 }
7812
7813 if (!m_OnBulletCasingEjectEffect.Contains(id))
7814 {
7815 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
7816 muzzle_owner_config = config_to_search + " " + GetType() + " ";
7817
7818 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7819
7820 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
7821
7822 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7823 {
7824 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7825
7826 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7827 {
7828 string particle_class2 = "";
7829 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
7830 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7831 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7832 WPOBE_array.Insert(WPOBE);
7833 }
7834
7835
7836 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
7837 }
7838 }
7839 }
7840
7841 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
7843 {
7846
7847 if (!m_OnOverheatingEffect.Contains(id))
7848 {
7849 string config_to_search = "CfgVehicles";
7850
7851 if (IsInherited(Weapon))
7852 config_to_search = "CfgWeapons";
7853
7854 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
7855 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7856
7857 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
7858 {
7859
7860 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
7861
7863 {
7864 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
7865 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7866 Error(error);
7867 return;
7868 }
7869
7870 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
7871 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
7872
7873
7874
7875 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
7876 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7877
7878 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7879 {
7880 string particle_class = "";
7881 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
7882 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7883 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
7884
7885 if (entry_type == CT_CLASS)
7886 {
7887 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7888 WPOOH_array.Insert(WPOF);
7889 }
7890 }
7891
7892
7893 m_OnOverheatingEffect.Insert(id, WPOOH_array);
7894 }
7895 }
7896 }
7897
7898 float GetOverheatingValue()
7899 {
7900 return m_OverheatingShots;
7901 }
7902
7903 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
7904 {
7905 if (m_MaxOverheatingValue > 0)
7906 {
7908
7909 if (!m_CheckOverheating)
7911
7913 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
7914
7915 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7916 }
7917 }
7918
7919 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7920 {
7922 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7923
7925 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7926
7928 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7929
7931 {
7933 }
7934 }
7935
7937 {
7939 }
7940
7941 void OnOverheatingDecay()
7942 {
7943 if (m_MaxOverheatingValue > 0)
7944 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
7945 else
7947
7948 if (m_OverheatingShots <= 0)
7949 {
7952 }
7953 else
7954 {
7955 if (!m_CheckOverheating)
7957
7959 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
7960 }
7961
7962 CheckOverheating(this, "", this);
7963 }
7964
7965 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7966 {
7968 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
7969 }
7970
7971 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7972 {
7974 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
7976 }
7977
7978 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7979 {
7981 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7982 }
7983
7984 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
7985 {
7987 m_OverheatingParticles = new array<ref OverheatingParticle>;
7988
7989 OverheatingParticle OP = new OverheatingParticle();
7990 OP.RegisterParticle(p);
7991 OP.SetOverheatingLimitMin(min_heat_coef);
7992 OP.SetOverheatingLimitMax(max_heat_coef);
7993 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
7994
7995 m_OverheatingParticles.Insert(OP);
7996 }
7997
7998 float GetOverheatingCoef()
7999 {
8000 if (m_MaxOverheatingValue > 0)
8002
8003 return -1;
8004 }
8005
8007 {
8009 {
8010 float overheat_coef = GetOverheatingCoef();
8011 int count = m_OverheatingParticles.Count();
8012
8013 for (int i = count; i > 0; --i)
8014 {
8015 int id = i - 1;
8016 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8017 Particle p = OP.GetParticle();
8018
8019 float overheat_min = OP.GetOverheatingLimitMin();
8020 float overheat_max = OP.GetOverheatingLimitMax();
8021
8022 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8023 {
8024 if (p)
8025 {
8026 p.Stop();
8027 OP.RegisterParticle(null);
8028 }
8029 }
8030 }
8031 }
8032 }
8033
8035 {
8037 {
8038 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
8039 {
8040 int id = i - 1;
8041 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8042
8043 if (OP)
8044 {
8045 Particle p = OP.GetParticle();
8046
8047 if (p)
8048 {
8049 p.Stop();
8050 }
8051
8052 delete OP;
8053 }
8054 }
8055
8056 m_OverheatingParticles.Clear();
8058 }
8059 }
8060
8062 float GetInfectionChance(int system = 0, Param param = null)
8063 {
8064 return 0.0;
8065 }
8066
8067
8068 float GetDisinfectQuantity(int system = 0, Param param1 = null)
8069 {
8070 return 250;//default value
8071 }
8072
8073 float GetFilterDamageRatio()
8074 {
8075 return 0;
8076 }
8077
8079 bool HasMuzzle()
8080 {
8081 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
8082 return true;
8083
8084 return false;
8085 }
8086
8088 int GetMuzzleID()
8089 {
8090 if (!m_WeaponTypeToID)
8092
8093 if (m_WeaponTypeToID.Contains(GetType()))
8094 {
8095 return m_WeaponTypeToID.Get(GetType());
8096 }
8097 else
8098 {
8099 // Register new weapon ID
8101 }
8102
8104 }
8105
8112 {
8113 return -1;
8114 }
8115
8116
8117
8118 // -------------------------------------------------------------------------
8119 void ~ItemBase()
8120 {
8121 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
8122 {
8123 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
8124 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8125
8126 if (r_index >= 0)
8127 {
8128 InventoryLocation r_il = new InventoryLocation;
8129 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8130
8131 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8132 int r_type = r_il.GetType();
8133 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8134 {
8135 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8136 }
8137 else if (r_type == InventoryLocationType.ATTACHMENT)
8138 {
8139 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8140 }
8141
8142 }
8143
8144 player.GetHumanInventory().ClearUserReservedLocation(this);
8145 }
8146
8147 if (m_LockingSound)
8148 SEffectManager.DestroyEffect(m_LockingSound);
8149 }
8150
8151
8152
8153 // -------------------------------------------------------------------------
8154 static int GetDebugActionsMask()
8155 {
8156 return ItemBase.m_DebugActionsMask;
8157 }
8158
8159 static bool HasDebugActionsMask(int mask)
8160 {
8161 return ItemBase.m_DebugActionsMask & mask;
8162 }
8163
8164 static void SetDebugActionsMask(int mask)
8165 {
8166 ItemBase.m_DebugActionsMask = mask;
8167 }
8168
8169 static void AddDebugActionsMask(int mask)
8170 {
8171 ItemBase.m_DebugActionsMask |= mask;
8172 }
8173
8174 static void RemoveDebugActionsMask(int mask)
8175 {
8176 ItemBase.m_DebugActionsMask &= ~mask;
8177 }
8178
8179 static void ToggleDebugActionsMask(int mask)
8180 {
8181 if (HasDebugActionsMask(mask))
8182 {
8184 }
8185 else
8186 {
8187 AddDebugActionsMask(mask);
8188 }
8189 }
8190
8191 // -------------------------------------------------------------------------
8192 void SetCEBasedQuantity()
8193 {
8194 if (GetEconomyProfile())
8195 {
8196 float q_max = GetEconomyProfile().GetQuantityMax();
8197 if (q_max > 0)
8198 {
8199 float q_min = GetEconomyProfile().GetQuantityMin();
8200 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8201
8202 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
8203 {
8204 ComponentEnergyManager comp = GetCompEM();
8205 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
8206 {
8207 comp.SetEnergy0To1(quantity_randomized);
8208 }
8209 }
8210 else if (HasQuantity())
8211 {
8212 SetQuantityNormalized(quantity_randomized, false);
8213 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
8214 }
8215
8216 }
8217 }
8218 }
8219
8221 void LockToParent()
8222 {
8223 EntityAI parent = GetHierarchyParent();
8224
8225 if (parent)
8226 {
8227 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8228 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8229 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
8230 }
8231 }
8232
8234 void UnlockFromParent()
8235 {
8236 EntityAI parent = GetHierarchyParent();
8237
8238 if (parent)
8239 {
8240 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8241 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8242 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
8243 }
8244 }
8245
8246 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
8247 {
8248 /*
8249 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
8250 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
8251 */
8252 ItemBase item2 = ItemBase.Cast(entity2);
8253
8254 if (GetGame().IsClient())
8255 {
8256 if (ScriptInputUserData.CanStoreInputUserData())
8257 {
8258 ScriptInputUserData ctx = new ScriptInputUserData;
8260 ctx.Write(-1);
8261 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8262 ctx.Write(i1);
8263 ctx.Write(item2);
8264 ctx.Write(use_stack_max);
8265 ctx.Write(-1);
8266 ctx.Send();
8267
8268 if (IsCombineAll(item2, use_stack_max))
8269 {
8270 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8271 }
8272 }
8273 }
8274 else if (!GetGame().IsMultiplayer())
8275 {
8276 CombineItems(item2, use_stack_max);
8277 }
8278 }
8279
8280 bool IsLiquidPresent()
8281 {
8282 return (GetLiquidType() != 0 && HasQuantity());
8283 }
8284
8285 bool IsLiquidContainer()
8286 {
8287 return m_LiquidContainerMask != 0;
8288 }
8289
8291 {
8292 return m_LiquidContainerMask;
8293 }
8294
8295 bool IsBloodContainer()
8296 {
8297 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
8298 return false;
8299 }
8300
8301 bool IsNVG()
8302 {
8303 return false;
8304 }
8305
8308 bool IsExplosive()
8309 {
8310 return false;
8311 }
8312
8314 {
8315 return "";
8316 }
8317
8319
8320 bool IsLightSource()
8321 {
8322 return false;
8323 }
8324
8326 {
8327 return true;
8328 }
8329
8330 //--- ACTION CONDITIONS
8331 //direction
8332 bool IsFacingPlayer(PlayerBase player, string selection)
8333 {
8334 return true;
8335 }
8336
8337 bool IsPlayerInside(PlayerBase player, string selection)
8338 {
8339 return true;
8340 }
8341
8342 override bool CanObstruct()
8343 {
8344 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8345 return !player || !IsPlayerInside(player, "");
8346 }
8347
8348 override bool IsBeingPlaced()
8349 {
8350 return m_IsBeingPlaced;
8351 }
8352
8353 void SetIsBeingPlaced(bool is_being_placed)
8354 {
8355 m_IsBeingPlaced = is_being_placed;
8356 if (!is_being_placed)
8358 SetSynchDirty();
8359 }
8360
8361 //server-side
8362 void OnEndPlacement() {}
8363
8364 override bool IsHologram()
8365 {
8366 return m_IsHologram;
8367 }
8368
8369 bool CanBeDigged()
8370 {
8371 return m_CanBeDigged;
8372 }
8373
8375 {
8376 return 1;
8377 }
8378
8379 bool CanMakeGardenplot()
8380 {
8381 return false;
8382 }
8383
8384 void SetIsHologram(bool is_hologram)
8385 {
8386 m_IsHologram = is_hologram;
8387 SetSynchDirty();
8388 }
8389 /*
8390 protected float GetNutritionalEnergy()
8391 {
8392 Edible_Base edible = Edible_Base.Cast(this);
8393 return edible.GetFoodEnergy();
8394 }
8395
8396 protected float GetNutritionalWaterContent()
8397 {
8398 Edible_Base edible = Edible_Base.Cast(this);
8399 return edible.GetFoodWater();
8400 }
8401
8402 protected float GetNutritionalIndex()
8403 {
8404 Edible_Base edible = Edible_Base.Cast(this);
8405 return edible.GetFoodNutritionalIndex();
8406 }
8407
8408 protected float GetNutritionalFullnessIndex()
8409 {
8410 Edible_Base edible = Edible_Base.Cast(this);
8411 return edible.GetFoodTotalVolume();
8412 }
8413
8414 protected float GetNutritionalToxicity()
8415 {
8416 Edible_Base edible = Edible_Base.Cast(this);
8417 return edible.GetFoodToxicity();
8418
8419 }
8420 */
8421
8422
8423 // -------------------------------------------------------------------------
8424 override void OnMovedInsideCargo(EntityAI container)
8425 {
8426 super.OnMovedInsideCargo(container);
8427
8428 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8429 }
8430
8431 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8432 {
8433 super.EEItemLocationChanged(oldLoc,newLoc);
8434
8435 PlayerBase new_player = null;
8436 PlayerBase old_player = null;
8437
8438 if (newLoc.GetParent())
8439 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8440
8441 if (oldLoc.GetParent())
8442 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8443
8444 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
8445 {
8446 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8447
8448 if (r_index >= 0)
8449 {
8450 InventoryLocation r_il = new InventoryLocation;
8451 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8452
8453 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8454 int r_type = r_il.GetType();
8455 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8456 {
8457 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8458 }
8459 else if (r_type == InventoryLocationType.ATTACHMENT)
8460 {
8461 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8462 }
8463
8464 }
8465 }
8466
8467 if (newLoc.GetType() == InventoryLocationType.HANDS)
8468 {
8469 if (new_player)
8470 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8471
8472 if (new_player == old_player)
8473 {
8474
8475 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8476 {
8477 if (oldLoc.GetType() == InventoryLocationType.CARGO)
8478 {
8479 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8480 {
8481 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8482 }
8483 }
8484 else
8485 {
8486 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8487 }
8488 }
8489
8490 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8491 {
8492 int type = oldLoc.GetType();
8493 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
8494 {
8495 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8496 }
8497 else if (type == InventoryLocationType.ATTACHMENT)
8498 {
8499 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8500 }
8501 }
8502 if (!m_OldLocation)
8503 {
8504 m_OldLocation = new InventoryLocation;
8505 }
8506 m_OldLocation.Copy(oldLoc);
8507 }
8508 else
8509 {
8510 if (m_OldLocation)
8511 {
8512 m_OldLocation.Reset();
8513 }
8514 }
8515
8517 }
8518 else
8519 {
8520 if (new_player)
8521 {
8522 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8523 if (res_index >= 0)
8524 {
8525 InventoryLocation il = new InventoryLocation;
8526 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8527 ItemBase it = ItemBase.Cast(il.GetItem());
8528 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8529 int rel_type = il.GetType();
8530 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
8531 {
8532 il.GetParent().GetOnReleaseLock().Invoke(it);
8533 }
8534 else if (rel_type == InventoryLocationType.ATTACHMENT)
8535 {
8536 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
8537 }
8538 //it.GetOnReleaseLock().Invoke(it);
8539 }
8540 }
8541 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
8542 {
8543 //ThrowPhysically(old_player, vector.Zero);
8544 m_ThrowItemOnDrop = false;
8545 }
8546
8547 if (m_OldLocation)
8548 {
8549 m_OldLocation.Reset();
8550 }
8551 }
8552 }
8553
8554 override void EOnContact(IEntity other, Contact extra)
8555 {
8557 {
8558 int liquidType = -1;
8559 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
8560 if (impactSpeed > 0.0)
8561 {
8562 m_ImpactSpeed = impactSpeed;
8563 #ifndef SERVER
8564 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8565 #else
8566 m_WantPlayImpactSound = true;
8567 SetSynchDirty();
8568 #endif
8569 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
8570 }
8571 }
8572
8573 #ifdef SERVER
8574 if (GetCompEM() && GetCompEM().IsPlugged())
8575 {
8576 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
8577 GetCompEM().UnplugThis();
8578 }
8579 #endif
8580 }
8581
8582 void RefreshPhysics();
8583
8584 override void OnCreatePhysics()
8585 {
8587 }
8588
8589 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8590 {
8591
8592 }
8593 // -------------------------------------------------------------------------
8594 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
8595 {
8596 super.OnItemLocationChanged(old_owner, new_owner);
8597
8598 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8599 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8600
8601 if (!relatedPlayer && playerNew)
8602 relatedPlayer = playerNew;
8603
8604 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8605 {
8606 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
8607 if (actionMgr)
8608 {
8609 ActionBase currentAction = actionMgr.GetRunningAction();
8610 if (currentAction)
8611 currentAction.OnItemLocationChanged(this);
8612 }
8613 }
8614
8615 Man ownerPlayerOld = null;
8616 Man ownerPlayerNew = null;
8617
8618 if (old_owner)
8619 {
8620 if (old_owner.IsMan())
8621 {
8622 ownerPlayerOld = Man.Cast(old_owner);
8623 }
8624 else
8625 {
8626 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8627 }
8628 }
8629 else
8630 {
8631 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
8632 {
8633 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
8634
8635 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
8636 {
8637 GetCompEM().UnplugThis();
8638 }
8639 }
8640 }
8641
8642 if (new_owner)
8643 {
8644 if (new_owner.IsMan())
8645 {
8646 ownerPlayerNew = Man.Cast(new_owner);
8647 }
8648 else
8649 {
8650 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8651 }
8652 }
8653
8654 if (ownerPlayerOld != ownerPlayerNew)
8655 {
8656 if (ownerPlayerOld)
8657 {
8658 array<EntityAI> subItemsExit = new array<EntityAI>;
8659 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
8660 for (int i = 0; i < subItemsExit.Count(); i++)
8661 {
8662 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
8663 itemExit.OnInventoryExit(ownerPlayerOld);
8664 }
8665 }
8666
8667 if (ownerPlayerNew)
8668 {
8669 array<EntityAI> subItemsEnter = new array<EntityAI>;
8670 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
8671 for (int j = 0; j < subItemsEnter.Count(); j++)
8672 {
8673 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
8674 itemEnter.OnInventoryEnter(ownerPlayerNew);
8675 }
8676 }
8677 }
8678 else if (ownerPlayerNew != null)
8679 {
8680 PlayerBase nplayer;
8681 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8682 {
8683 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8684 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
8685 for (int k = 0; k < subItemsUpdate.Count(); k++)
8686 {
8687 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
8688 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8689 }
8690 }
8691 }
8692
8693 if (old_owner)
8694 old_owner.OnChildItemRemoved(this);
8695 if (new_owner)
8696 new_owner.OnChildItemReceived(this);
8697 }
8698
8699 // -------------------------------------------------------------------------------
8700 override void EEDelete(EntityAI parent)
8701 {
8702 super.EEDelete(parent);
8703 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8704 if (player)
8705 {
8706 OnInventoryExit(player);
8707
8708 if (player.IsAlive())
8709 {
8710 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8711 if (r_index >= 0)
8712 {
8713 InventoryLocation r_il = new InventoryLocation;
8714 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8715
8716 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8717 int r_type = r_il.GetType();
8718 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8719 {
8720 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8721 }
8722 else if (r_type == InventoryLocationType.ATTACHMENT)
8723 {
8724 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8725 }
8726
8727 }
8728
8729 player.RemoveQuickBarEntityShortcut(this);
8730 }
8731 }
8732 }
8733 // -------------------------------------------------------------------------------
8734 override void EEKilled(Object killer)
8735 {
8736 super.EEKilled(killer);
8737
8739 if (killer && killer.IsFireplace() && CanExplodeInFire())
8740 {
8741 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8742 {
8743 if (IsMagazine())
8744 {
8745 if (Magazine.Cast(this).GetAmmoCount() > 0)
8746 {
8747 ExplodeAmmo();
8748 }
8749 }
8750 else
8751 {
8752 Explode(DamageType.EXPLOSION);
8753 }
8754 }
8755 }
8756 }
8757
8758 override void OnWasAttached(EntityAI parent, int slot_id)
8759 {
8760 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8761
8762 super.OnWasAttached(parent, slot_id);
8763
8764 if (HasQuantity())
8765 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8766
8767 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
8768 }
8769
8770 override void OnWasDetached(EntityAI parent, int slot_id)
8771 {
8772 super.OnWasDetached(parent, slot_id);
8773
8774 if (HasQuantity())
8775 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8776 }
8777
8778 override string ChangeIntoOnAttach(string slot)
8779 {
8780 int idx;
8781 TStringArray inventory_slots = new TStringArray;
8782 TStringArray attach_types = new TStringArray;
8783
8784 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8785 if (inventory_slots.Count() < 1) //is string
8786 {
8787 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8788 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8789 }
8790 else //is array
8791 {
8792 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8793 }
8794
8795 idx = inventory_slots.Find(slot);
8796 if (idx < 0)
8797 return "";
8798
8799 return attach_types.Get(idx);
8800 }
8801
8802 override string ChangeIntoOnDetach()
8803 {
8804 int idx = -1;
8805 string slot;
8806
8807 TStringArray inventory_slots = new TStringArray;
8808 TStringArray detach_types = new TStringArray;
8809
8810 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8811 if (inventory_slots.Count() < 1) //is string
8812 {
8813 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8814 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8815 }
8816 else //is array
8817 {
8818 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8819 if (detach_types.Count() < 1)
8820 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8821 }
8822
8823 for (int i = 0; i < inventory_slots.Count(); i++)
8824 {
8825 slot = inventory_slots.Get(i);
8826 }
8827
8828 if (slot != "")
8829 {
8830 if (detach_types.Count() == 1)
8831 idx = 0;
8832 else
8833 idx = inventory_slots.Find(slot);
8834 }
8835 if (idx < 0)
8836 return "";
8837
8838 return detach_types.Get(idx);
8839 }
8840
8841 void ExplodeAmmo()
8842 {
8843 //timer
8844 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
8845
8846 //min/max time
8847 float min_time = 1;
8848 float max_time = 3;
8849 float delay = Math.RandomFloat(min_time, max_time);
8850
8851 explode_timer.Run(delay, this, "DoAmmoExplosion");
8852 }
8853
8854 void DoAmmoExplosion()
8855 {
8856 Magazine magazine = Magazine.Cast(this);
8857 int pop_sounds_count = 6;
8858 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8859
8860 //play sound
8861 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8862 string sound_name = pop_sounds[ sound_idx ];
8863 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
8864
8865 //remove ammo count
8866 magazine.ServerAddAmmoCount(-1);
8867
8868 //if condition then repeat -> ExplodeAmmo
8869 float min_temp_to_explode = 100; //min temperature for item to explode
8870
8871 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
8872 {
8873 ExplodeAmmo();
8874 }
8875 }
8876
8877 // -------------------------------------------------------------------------------
8878 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
8879 {
8880 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
8881
8882 const int CHANCE_DAMAGE_CARGO = 4;
8883 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8884 const int CHANCE_DAMAGE_NOTHING = 2;
8885
8886 if (IsClothing() || IsContainer() || IsItemTent())
8887 {
8888 float dmg = damageResult.GetDamage("","Health") * -0.5;
8889 int chances;
8890 int rnd;
8891
8892 if (GetInventory().GetCargo())
8893 {
8894 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8895 rnd = Math.RandomInt(0,chances);
8896
8897 if (rnd < CHANCE_DAMAGE_CARGO)
8898 {
8899 DamageItemInCargo(dmg);
8900 }
8901 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8902 {
8904 }
8905 }
8906 else
8907 {
8908 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8909 rnd = Math.RandomInt(0,chances);
8910
8911 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8912 {
8914 }
8915 }
8916 }
8917 }
8918
8919 bool DamageItemInCargo(float damage)
8920 {
8921 if (GetInventory().GetCargo())
8922 {
8923 int item_count = GetInventory().GetCargo().GetItemCount();
8924 if (item_count > 0)
8925 {
8926 int random_pick = Math.RandomInt(0, item_count);
8927 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
8928 if (!item.IsExplosive())
8929 {
8930 item.AddHealth("","",damage);
8931 return true;
8932 }
8933 }
8934 }
8935 return false;
8936 }
8937
8938 bool DamageItemAttachments(float damage)
8939 {
8940 int attachment_count = GetInventory().AttachmentCount();
8941 if (attachment_count > 0)
8942 {
8943 int random_pick = Math.RandomInt(0, attachment_count);
8944 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8945 if (!attachment.IsExplosive())
8946 {
8947 attachment.AddHealth("","",damage);
8948 return true;
8949 }
8950 }
8951 return false;
8952 }
8953
8954 override bool IsSplitable()
8955 {
8956 return m_CanThisBeSplit;
8957 }
8958 //----------------
8959 override bool CanBeSplit()
8960 {
8961 if (IsSplitable() && (GetQuantity() > 1))
8962 return GetInventory().CanRemoveEntity();
8963
8964 return false;
8965 }
8966
8967 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
8968 {
8969 if (!CanBeSplit())
8970 return;
8971
8972 if (GetGame().IsClient())
8973 {
8974 if (ScriptInputUserData.CanStoreInputUserData())
8975 {
8976 ScriptInputUserData ctx = new ScriptInputUserData;
8978 ctx.Write(1);
8979 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8980 ctx.Write(i1);
8981 ctx.Write(destination_entity);
8982 ctx.Write(true);
8983 ctx.Write(slot_id);
8984 ctx.Send();
8985 }
8986 }
8987 else if (!GetGame().IsMultiplayer())
8988 {
8989 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
8990 }
8991 }
8992
8993 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
8994 {
8995 if (!CanBeSplit())
8996 return;
8997
8998 float split_quantity_new;
8999 ref ItemBase new_item;
9000 float quantity = GetQuantity();
9001 float stack_max = GetTargetQuantityMax(slot_id);
9002 InventoryLocation loc = new InventoryLocation;
9003
9004 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9005 {
9006 if (stack_max <= GetQuantity())
9007 split_quantity_new = stack_max;
9008 else
9009 split_quantity_new = GetQuantity();
9010
9011 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9012 if (new_item)
9013 {
9014 new_item.SetResultOfSplit(true);
9015 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9016 AddQuantity(-split_quantity_new);
9017 new_item.SetQuantity(split_quantity_new);
9018 }
9019 }
9020 else if (destination_entity && slot_id == -1)
9021 {
9022 if (quantity > stack_max)
9023 split_quantity_new = stack_max;
9024 else
9025 split_quantity_new = quantity;
9026
9027 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9028 {
9029 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9030 new_item = ItemBase.Cast(o);
9031 }
9032
9033 if (new_item)
9034 {
9035 new_item.SetResultOfSplit(true);
9036 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9037 AddQuantity(-split_quantity_new);
9038 new_item.SetQuantity(split_quantity_new);
9039 }
9040 }
9041 else
9042 {
9043 if (stack_max != 0)
9044 {
9045 if (stack_max < GetQuantity())
9046 {
9047 split_quantity_new = GetQuantity() - stack_max;
9048 }
9049
9050 if (split_quantity_new == 0)
9051 {
9052 if (!GetGame().IsMultiplayer())
9053 player.PhysicalPredictiveDropItem(this);
9054 else
9055 player.ServerDropEntity(this);
9056 return;
9057 }
9058
9059 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9060
9061 if (new_item)
9062 {
9063 new_item.SetResultOfSplit(true);
9064 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9065 SetQuantity(split_quantity_new);
9066 new_item.SetQuantity(stack_max);
9067 new_item.PlaceOnSurface();
9068 }
9069 }
9070 }
9071 }
9072
9073 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
9074 {
9075 if (!CanBeSplit())
9076 return;
9077
9078 float split_quantity_new;
9079 ref ItemBase new_item;
9080 float quantity = GetQuantity();
9081 float stack_max = GetTargetQuantityMax(slot_id);
9082 InventoryLocation loc = new InventoryLocation;
9083
9084 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9085 {
9086 if (stack_max <= GetQuantity())
9087 split_quantity_new = stack_max;
9088 else
9089 split_quantity_new = GetQuantity();
9090
9091 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9092 if (new_item)
9093 {
9094 new_item.SetResultOfSplit(true);
9095 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9096 AddQuantity(-split_quantity_new);
9097 new_item.SetQuantity(split_quantity_new);
9098 }
9099 }
9100 else if (destination_entity && slot_id == -1)
9101 {
9102 if (quantity > stack_max)
9103 split_quantity_new = stack_max;
9104 else
9105 split_quantity_new = quantity;
9106
9107 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9108 {
9109 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9110 new_item = ItemBase.Cast(o);
9111 }
9112
9113 if (new_item)
9114 {
9115 new_item.SetResultOfSplit(true);
9116 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9117 AddQuantity(-split_quantity_new);
9118 new_item.SetQuantity(split_quantity_new);
9119 }
9120 }
9121 else
9122 {
9123 if (stack_max != 0)
9124 {
9125 if (stack_max < GetQuantity())
9126 {
9127 split_quantity_new = GetQuantity() - stack_max;
9128 }
9129
9130 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9131
9132 if (new_item)
9133 {
9134 new_item.SetResultOfSplit(true);
9135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9136 SetQuantity(split_quantity_new);
9137 new_item.SetQuantity(stack_max);
9138 new_item.PlaceOnSurface();
9139 }
9140 }
9141 }
9142 }
9143
9144 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
9145 {
9146 if (!CanBeSplit())
9147 return;
9148
9149 if (GetGame().IsClient())
9150 {
9151 if (ScriptInputUserData.CanStoreInputUserData())
9152 {
9153 ScriptInputUserData ctx = new ScriptInputUserData;
9155 ctx.Write(4);
9156 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9157 ctx.Write(thiz);
9158 dst.WriteToContext(ctx);
9159 ctx.Send();
9160 }
9161 }
9162 else if (!GetGame().IsMultiplayer())
9163 {
9165 }
9166 }
9167
9168 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
9169 {
9170 if (!CanBeSplit())
9171 return;
9172
9173 if (GetGame().IsClient())
9174 {
9175 if (ScriptInputUserData.CanStoreInputUserData())
9176 {
9177 ScriptInputUserData ctx = new ScriptInputUserData;
9179 ctx.Write(2);
9180 ItemBase dummy = this; // @NOTE: workaround for correct serialization
9181 ctx.Write(dummy);
9182 ctx.Write(destination_entity);
9183 ctx.Write(true);
9184 ctx.Write(idx);
9185 ctx.Write(row);
9186 ctx.Write(col);
9187 ctx.Send();
9188 }
9189 }
9190 else if (!GetGame().IsMultiplayer())
9191 {
9192 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
9193 }
9194 }
9195
9196 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
9197 {
9199 }
9200
9201 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
9202 {
9203 if (!CanBeSplit())
9204 return this;
9205
9206 float quantity = GetQuantity();
9207 float split_quantity_new;
9208 ItemBase new_item;
9209 if (dst.IsValid())
9210 {
9211 int slot_id = dst.GetSlot();
9212 float stack_max = GetTargetQuantityMax(slot_id);
9213
9214 if (quantity > stack_max)
9215 split_quantity_new = stack_max;
9216 else
9217 split_quantity_new = quantity;
9218
9219 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9220
9221 if (new_item)
9222 {
9223 new_item.SetResultOfSplit(true);
9224 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9225 AddQuantity(-split_quantity_new);
9226 new_item.SetQuantity(split_quantity_new);
9227 }
9228
9229 return new_item;
9230 }
9231
9232 return null;
9233 }
9234
9235 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
9236 {
9237 if (!CanBeSplit())
9238 return;
9239
9240 float quantity = GetQuantity();
9241 float split_quantity_new;
9242 ref ItemBase new_item;
9243 if (destination_entity)
9244 {
9245 float stackable = GetTargetQuantityMax();
9246 if (quantity > stackable)
9247 split_quantity_new = stackable;
9248 else
9249 split_quantity_new = quantity;
9250
9251 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
9252 if (new_item)
9253 {
9254 new_item.SetResultOfSplit(true);
9255 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9256 AddQuantity(-split_quantity_new);
9257 new_item.SetQuantity(split_quantity_new);
9258 }
9259 }
9260 }
9261
9262 void SplitIntoStackMaxHandsClient(PlayerBase player)
9263 {
9264 if (!CanBeSplit())
9265 return;
9266
9267 if (GetGame().IsClient())
9268 {
9269 if (ScriptInputUserData.CanStoreInputUserData())
9270 {
9271 ScriptInputUserData ctx = new ScriptInputUserData;
9273 ctx.Write(3);
9274 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9275 ctx.Write(i1);
9276 ItemBase destination_entity = this;
9277 ctx.Write(destination_entity);
9278 ctx.Write(true);
9279 ctx.Write(0);
9280 ctx.Send();
9281 }
9282 }
9283 else if (!GetGame().IsMultiplayer())
9284 {
9285 SplitIntoStackMaxHands(player);
9286 }
9287 }
9288
9289 void SplitIntoStackMaxHands(PlayerBase player)
9290 {
9291 if (!CanBeSplit())
9292 return;
9293
9294 float quantity = GetQuantity();
9295 float split_quantity_new;
9296 ref ItemBase new_item;
9297 if (player)
9298 {
9299 float stackable = GetTargetQuantityMax();
9300 if (quantity > stackable)
9301 split_quantity_new = stackable;
9302 else
9303 split_quantity_new = quantity;
9304
9305 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
9306 new_item = ItemBase.Cast(in_hands);
9307 if (new_item)
9308 {
9309 new_item.SetResultOfSplit(true);
9310 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9311 AddQuantity(-split_quantity_new);
9312 new_item.SetQuantity(split_quantity_new);
9313 }
9314 }
9315 }
9316
9317 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
9318 {
9319 if (!CanBeSplit())
9320 return;
9321
9322 float quantity = GetQuantity();
9323 float split_quantity_new = Math.Floor(quantity * 0.5);
9324
9325 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9326
9327 if (new_item)
9328 {
9329 if (new_item.GetQuantityMax() < split_quantity_new)
9330 {
9331 split_quantity_new = new_item.GetQuantityMax();
9332 }
9333
9334 new_item.SetResultOfSplit(true);
9335 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9336
9337 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9338 {
9339 AddQuantity(-1);
9340 new_item.SetQuantity(1);
9341 }
9342 else
9343 {
9344 AddQuantity(-split_quantity_new);
9345 new_item.SetQuantity(split_quantity_new);
9346 }
9347 }
9348 }
9349
9350 void SplitItem(PlayerBase player)
9351 {
9352 if (!CanBeSplit())
9353 return;
9354
9355 float quantity = GetQuantity();
9356 float split_quantity_new = Math.Floor(quantity / 2);
9357
9358 InventoryLocation invloc = new InventoryLocation;
9359 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
9360
9361 ItemBase new_item;
9362 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9363
9364 if (new_item)
9365 {
9366 if (new_item.GetQuantityMax() < split_quantity_new)
9367 {
9368 split_quantity_new = new_item.GetQuantityMax();
9369 }
9370 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9371 {
9372 AddQuantity(-1);
9373 new_item.SetQuantity(1);
9374 }
9375 else
9376 {
9377 AddQuantity(-split_quantity_new);
9378 new_item.SetQuantity(split_quantity_new);
9379 }
9380 }
9381 }
9382
9384 void OnQuantityChanged(float delta)
9385 {
9386 SetWeightDirty();
9387 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
9388
9389 if (parent)
9390 parent.OnAttachmentQuantityChangedEx(this, delta);
9391
9392 if (IsLiquidContainer())
9393 {
9394 if (GetQuantityNormalized() <= 0.0)
9395 {
9397 }
9398 else if (GetLiquidType() == LIQUID_NONE)
9399 {
9400 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
9402 }
9403 }
9404
9405 }
9406
9409 {
9410 // insert code here
9411 }
9412
9414 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
9415 {
9417 }
9418
9419 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
9420 {
9421 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9422
9423 if (GetGame().IsServer())
9424 {
9425 if (newLevel == GameConstants.STATE_RUINED)
9426 {
9428 EntityAI parent = GetHierarchyParent();
9429 if (parent && parent.IsFireplace())
9430 {
9431 CargoBase cargo = GetInventory().GetCargo();
9432 if (cargo)
9433 {
9434 for (int i = 0; i < cargo.GetItemCount(); ++i)
9435 {
9436 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
9437 }
9438 }
9439 }
9440 }
9441
9442 if (IsResultOfSplit())
9443 {
9444 // reset the splitting result flag, return to normal item behavior
9445 SetResultOfSplit(false);
9446 return;
9447 }
9448
9449 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9450 {
9451 SetCleanness(0);//unclean the item upon damage dealt
9452 }
9453 }
9454 }
9455
9456 // just the split? TODO: verify
9457 override void OnRightClick()
9458 {
9459 super.OnRightClick();
9460
9461 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
9462 {
9463 if (GetGame().IsClient())
9464 {
9465 if (ScriptInputUserData.CanStoreInputUserData())
9466 {
9467 vector m4[4];
9468 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9469
9470 EntityAI root = GetHierarchyRoot();
9471
9472 InventoryLocation dst = new InventoryLocation;
9473 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
9474 {
9475 if (root)
9476 {
9477 root.GetTransform(m4);
9478 dst.SetGround(this, m4);
9479 }
9480 else
9481 GetInventory().GetCurrentInventoryLocation(dst);
9482 }
9483 else
9484 {
9485 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
9486 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
9487 this shouldnt cause issues within this scope*/
9488 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
9489 {
9490 if (root)
9491 {
9492 root.GetTransform(m4);
9493 dst.SetGround(this, m4);
9494 }
9495 else
9496 GetInventory().GetCurrentInventoryLocation(dst);
9497 }
9498 else
9499 {
9500 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9501 }
9502 }
9503
9504 ScriptInputUserData ctx = new ScriptInputUserData;
9506 ctx.Write(4);
9507 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9508 ctx.Write(thiz);
9509 dst.WriteToContext(ctx);
9510 ctx.Write(true); // dummy
9511 ctx.Send();
9512 }
9513 }
9514 else if (!GetGame().IsMultiplayer())
9515 {
9516 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
9517 }
9518 }
9519 }
9520
9521 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
9522 {
9523 //TODO: delete check zero quantity check after fix double posts hands fsm events
9524 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
9525 return false;
9526
9527 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9528 return false;
9529
9530 //can_this_be_combined = ConfigGetBool("canBeSplit");
9532 return false;
9533
9534
9535 Magazine mag = Magazine.Cast(this);
9536 if (mag)
9537 {
9538 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9539 return false;
9540
9541 if (stack_max_limit)
9542 {
9543 Magazine other_mag = Magazine.Cast(other_item);
9544 if (other_item)
9545 {
9546 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9547 return false;
9548 }
9549
9550 }
9551 }
9552 else
9553 {
9554 //TODO: delete check zero quantity check after fix double posts hands fsm events
9555 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
9556 return false;
9557
9558 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
9559 return false;
9560 }
9561
9562 PlayerBase player = null;
9563 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
9564 {
9565 if (player.GetInventory().HasAttachment(this))
9566 return false;
9567
9568 if (player.IsItemsToDelete())
9569 return false;
9570 }
9571
9572 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9573 return false;
9574
9575 int slotID;
9576 string slotName;
9577 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9578 return false;
9579
9580 return true;
9581 }
9582
9583 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
9584 {
9585 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
9586 }
9587
9588 bool IsResultOfSplit()
9589 {
9590 return m_IsResultOfSplit;
9591 }
9592
9593 void SetResultOfSplit(bool value)
9594 {
9595 m_IsResultOfSplit = value;
9596 }
9597
9598 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
9599 {
9600 return ComputeQuantityUsedEx(other_item, use_stack_max);
9601 }
9602
9603 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
9604 {
9605 float other_item_quantity = other_item.GetQuantity();
9606 float this_free_space;
9607
9608 float stack_max = GetQuantityMax();
9609
9610 this_free_space = stack_max - GetQuantity();
9611
9612 if (other_item_quantity > this_free_space)
9613 {
9614 return this_free_space;
9615 }
9616 else
9617 {
9618 return other_item_quantity;
9619 }
9620 }
9621
9622 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
9623 {
9624 CombineItems(ItemBase.Cast(entity2),use_stack_max);
9625 }
9626
9627 void CombineItems(ItemBase other_item, bool use_stack_max = true)
9628 {
9629 if (!CanBeCombined(other_item, false))
9630 return;
9631
9632 if (!IsMagazine() && other_item)
9633 {
9634 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
9635 if (quantity_used != 0)
9636 {
9637 float hp1 = GetHealth01("","");
9638 float hp2 = other_item.GetHealth01("","");
9639 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
9640 hpResult = hpResult / (GetQuantity() + quantity_used);
9641
9642 hpResult *= GetMaxHealth();
9643 Math.Round(hpResult);
9644 SetHealth("", "Health", hpResult);
9645
9646 AddQuantity(quantity_used);
9647 other_item.AddQuantity(-quantity_used);
9648 }
9649 }
9650 OnCombine(other_item);
9651 }
9652
9653 void OnCombine(ItemBase other_item)
9654 {
9655 #ifdef SERVER
9656 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9657 GetHierarchyParent().IncreaseLifetimeUp();
9658 #endif
9659 };
9660
9661 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
9662 {
9663 PlayerBase p = PlayerBase.Cast(player);
9664
9665 array<int> recipesIds = p.m_Recipes;
9666 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
9667 if (moduleRecipesManager)
9668 {
9669 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9670 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
9671 }
9672
9673 for (int i = 0;i < recipesIds.Count(); i++)
9674 {
9675 int key = recipesIds.Get(i);
9676 string recipeName = moduleRecipesManager.GetRecipeName(key);
9677 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
9678 }
9679 }
9680
9681 // -------------------------------------------------------------------------
9682 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9683 {
9684 super.GetDebugActions(outputList);
9685
9686 //quantity
9687 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
9688 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
9689 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
9690 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
9691
9692 //health
9693 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
9694 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
9695 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
9696 //temperature
9697 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
9698 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
9699 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
9700
9701 //wet
9702 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
9703 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
9704
9705 //liquidtype
9706 if (IsLiquidContainer())
9707 {
9708 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
9709 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
9710 }
9711
9712 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
9713 // watch
9714 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
9715 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
9716
9717 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
9718 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
9719 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
9720 }
9721
9722 // -------------------------------------------------------------------------
9723 // -------------------------------------------------------------------------
9724 // -------------------------------------------------------------------------
9725 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
9726 {
9727 super.OnAction(action_id, player, ctx);
9728 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
9729 {
9730 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
9731 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
9732 PlayerBase p = PlayerBase.Cast(player);
9733 if (EActions.RECIPES_RANGE_START < 1000)
9734 {
9735 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9736 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9737 }
9738 }
9739 #ifndef SERVER
9740 else if (action_id == EActions.WATCH_PLAYER)
9741 {
9742 PluginDeveloper.SetDeveloperItemClientEx(player);
9743 }
9744 #endif
9745 if (GetGame().IsServer())
9746 {
9747 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9748 {
9749 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9750 OnDebugButtonPressServer(id + 1);
9751 }
9752
9753 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9754 {
9755 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9756 InsertAgent(agent_id,100);
9757 }
9758
9759 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9760 {
9761 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9762 RemoveAgent(agent_id2);
9763 }
9764
9765 else if (action_id == EActions.ADD_QUANTITY)
9766 {
9767 if (IsMagazine())
9768 {
9769 Magazine mag = Magazine.Cast(this);
9770 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9771 }
9772 else
9773 {
9774 AddQuantity(GetQuantityMax() * 0.2);
9775 }
9776
9777 if (m_EM)
9778 {
9779 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9780 }
9781 //PrintVariables();
9782 }
9783
9784 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
9785 {
9786 if (IsMagazine())
9787 {
9788 Magazine mag2 = Magazine.Cast(this);
9789 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9790 }
9791 else
9792 {
9793 AddQuantity(- GetQuantityMax() * 0.2);
9794 }
9795 if (m_EM)
9796 {
9797 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9798 }
9799 //PrintVariables();
9800 }
9801
9802 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
9803 {
9804 SetQuantity(0);
9805
9806 if (m_EM)
9807 {
9808 m_EM.SetEnergy(0);
9809 }
9810 }
9811
9812 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
9813 {
9815
9816 if (m_EM)
9817 {
9818 m_EM.SetEnergy(m_EM.GetEnergyMax());
9819 }
9820 }
9821
9822 else if (action_id == EActions.ADD_HEALTH)
9823 {
9824 AddHealth("","",GetMaxHealth("","Health")/5);
9825 }
9826 else if (action_id == EActions.REMOVE_HEALTH)
9827 {
9828 AddHealth("","",-GetMaxHealth("","Health")/5);
9829 }
9830 else if (action_id == EActions.DESTROY_HEALTH)
9831 {
9832 SetHealth01("","",0);
9833 }
9834 else if (action_id == EActions.WATCH_ITEM)
9835 {
9837 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
9838 #ifdef DEVELOPER
9839 SetDebugDeveloper_item(this);
9840 #endif
9841 }
9842
9843 else if (action_id == EActions.ADD_TEMPERATURE)
9844 {
9845 AddTemperature(20);
9846 //PrintVariables();
9847 }
9848
9849 else if (action_id == EActions.REMOVE_TEMPERATURE)
9850 {
9851 AddTemperature(-20);
9852 //PrintVariables();
9853 }
9854
9855 else if (action_id == EActions.FLIP_FROZEN)
9856 {
9857 SetFrozen(!GetIsFrozen());
9858 //PrintVariables();
9859 }
9860
9861 else if (action_id == EActions.ADD_WETNESS)
9862 {
9863 AddWet(GetWetMax()/5);
9864 //PrintVariables();
9865 }
9866
9867 else if (action_id == EActions.REMOVE_WETNESS)
9868 {
9869 AddWet(-GetWetMax()/5);
9870 //PrintVariables();
9871 }
9872
9873 else if (action_id == EActions.LIQUIDTYPE_UP)
9874 {
9875 int curr_type = GetLiquidType();
9876 SetLiquidType(curr_type * 2);
9877 //AddWet(1);
9878 //PrintVariables();
9879 }
9880
9881 else if (action_id == EActions.LIQUIDTYPE_DOWN)
9882 {
9883 int curr_type2 = GetLiquidType();
9884 SetLiquidType(curr_type2 / 2);
9885 }
9886
9887 else if (action_id == EActions.MAKE_SPECIAL)
9888 {
9889 auto debugParams = DebugSpawnParams.WithPlayer(player);
9890 OnDebugSpawnEx(debugParams);
9891 }
9892
9893 else if (action_id == EActions.DELETE)
9894 {
9895 Delete();
9896 }
9897
9898 }
9899
9900
9901 return false;
9902 }
9903
9904 // -------------------------------------------------------------------------
9905
9906
9909 void OnActivatedByTripWire();
9910
9912 void OnActivatedByItem(notnull ItemBase item);
9913
9914 //----------------------------------------------------------------
9915 //returns true if item is able to explode when put in fire
9916 bool CanExplodeInFire()
9917 {
9918 return false;
9919 }
9920
9921 //----------------------------------------------------------------
9922 bool CanEat()
9923 {
9924 return true;
9925 }
9926
9927 //----------------------------------------------------------------
9928 override bool IsIgnoredByConstruction()
9929 {
9930 return true;
9931 }
9932
9933 //----------------------------------------------------------------
9934 //has FoodStages in config?
9935 bool HasFoodStage()
9936 {
9937 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
9938 return GetGame().ConfigIsExisting(config_path);
9939 }
9940
9942 FoodStage GetFoodStage()
9943 {
9944 return null;
9945 }
9946
9947 bool CanBeCooked()
9948 {
9949 return false;
9950 }
9951
9952 bool CanBeCookedOnStick()
9953 {
9954 return false;
9955 }
9956
9958 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
9960
9961 //----------------------------------------------------------------
9962 bool CanRepair(ItemBase item_repair_kit)
9963 {
9964 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
9965 return module_repairing.CanRepair(this, item_repair_kit);
9966 }
9967
9968 //----------------------------------------------------------------
9969 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
9970 {
9971 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
9972 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9973 }
9974
9975 //----------------------------------------------------------------
9976 int GetItemSize()
9977 {
9978 /*
9979 vector v_size = this.ConfigGetVector("itemSize");
9980 int v_size_x = v_size[0];
9981 int v_size_y = v_size[1];
9982 int size = v_size_x * v_size_y;
9983 return size;
9984 */
9985
9986 return 1;
9987 }
9988
9989 //----------------------------------------------------------------
9990 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
9991 bool CanBeMovedOverride()
9992 {
9993 return m_CanBeMovedOverride;
9994 }
9995
9996 //----------------------------------------------------------------
9997 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
9998 void SetCanBeMovedOverride(bool setting)
9999 {
10000 m_CanBeMovedOverride = setting;
10001 }
10002
10003 //----------------------------------------------------------------
10011 void MessageToOwnerStatus(string text)
10012 {
10013 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10014
10015 if (player)
10016 {
10017 player.MessageStatus(text);
10018 }
10019 }
10020
10021 //----------------------------------------------------------------
10029 void MessageToOwnerAction(string text)
10030 {
10031 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10032
10033 if (player)
10034 {
10035 player.MessageAction(text);
10036 }
10037 }
10038
10039 //----------------------------------------------------------------
10047 void MessageToOwnerFriendly(string text)
10048 {
10049 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10050
10051 if (player)
10052 {
10053 player.MessageFriendly(text);
10054 }
10055 }
10056
10057 //----------------------------------------------------------------
10065 void MessageToOwnerImportant(string text)
10066 {
10067 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10068
10069 if (player)
10070 {
10071 player.MessageImportant(text);
10072 }
10073 }
10074
10075 override bool IsItemBase()
10076 {
10077 return true;
10078 }
10079
10080 // Checks if item is of questioned kind
10081 override bool KindOf(string tag)
10082 {
10083 bool found = false;
10084 string item_name = this.GetType();
10085 ref TStringArray item_tag_array = new TStringArray;
10086 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
10087
10088 int array_size = item_tag_array.Count();
10089 for (int i = 0; i < array_size; i++)
10090 {
10091 if (item_tag_array.Get(i) == tag)
10092 {
10093 found = true;
10094 break;
10095 }
10096 }
10097 return found;
10098 }
10099
10100
10101 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
10102 {
10103 //Debug.Log("OnRPC called");
10104 super.OnRPC(sender, rpc_type,ctx);
10105
10106 //Play soundset for attachment locking (ActionLockAttachment.c)
10107 switch (rpc_type)
10108 {
10109 #ifndef SERVER
10110 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10111 Param2<bool, string> p = new Param2<bool, string>(false, "");
10112
10113 if (!ctx.Read(p))
10114 return;
10115
10116 bool play = p.param1;
10117 string soundSet = p.param2;
10118
10119 if (play)
10120 {
10121 if (m_LockingSound)
10122 {
10124 {
10125 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10126 }
10127 }
10128 else
10129 {
10130 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10131 }
10132 }
10133 else
10134 {
10135 SEffectManager.DestroyEffect(m_LockingSound);
10136 }
10137
10138 break;
10139 #endif
10140
10141 }
10142
10143 if (GetWrittenNoteData())
10144 {
10145 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
10146 }
10147 }
10148
10149 //-----------------------------
10150 // VARIABLE MANIPULATION SYSTEM
10151 //-----------------------------
10152 int NameToID(string name)
10153 {
10154 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10155 return plugin.GetID(name);
10156 }
10157
10158 string IDToName(int id)
10159 {
10160 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10161 return plugin.GetName(id);
10162 }
10163
10165 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
10166 {
10167 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
10168 //read the flags
10169 int varFlags;
10170 if (!ctx.Read(varFlags))
10171 return;
10172
10173 if (varFlags & ItemVariableFlags.FLOAT)
10174 {
10175 ReadVarsFromCTX(ctx);
10176 }
10177 }
10178
10179 override void SerializeNumericalVars(array<float> floats_out)
10180 {
10181 //some variables handled on EntityAI level already!
10182 super.SerializeNumericalVars(floats_out);
10183
10184 // the order of serialization must be the same as the order of de-serialization
10185 //--------------------------------------------
10186 if (IsVariableSet(VARIABLE_QUANTITY))
10187 {
10188 floats_out.Insert(m_VarQuantity);
10189 }
10190 //--------------------------------------------
10191 if (IsVariableSet(VARIABLE_WET))
10192 {
10193 floats_out.Insert(m_VarWet);
10194 }
10195 //--------------------------------------------
10196 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10197 {
10198 floats_out.Insert(m_VarLiquidType);
10199 }
10200 //--------------------------------------------
10201 if (IsVariableSet(VARIABLE_COLOR))
10202 {
10203 floats_out.Insert(m_ColorComponentR);
10204 floats_out.Insert(m_ColorComponentG);
10205 floats_out.Insert(m_ColorComponentB);
10206 floats_out.Insert(m_ColorComponentA);
10207 }
10208 //--------------------------------------------
10209 if (IsVariableSet(VARIABLE_CLEANNESS))
10210 {
10211 floats_out.Insert(m_Cleanness);
10212 }
10213 }
10214
10215 override void DeSerializeNumericalVars(array<float> floats)
10216 {
10217 //some variables handled on EntityAI level already!
10218 super.DeSerializeNumericalVars(floats);
10219
10220 // the order of serialization must be the same as the order of de-serialization
10221 int index = 0;
10222 int mask = Math.Round(floats.Get(index));
10223
10224 index++;
10225 //--------------------------------------------
10226 if (mask & VARIABLE_QUANTITY)
10227 {
10228 if (m_IsStoreLoad)
10229 {
10230 SetStoreLoadedQuantity(floats.Get(index));
10231 }
10232 else
10233 {
10234 float quantity = floats.Get(index);
10235 SetQuantity(quantity, true, false, false, false);
10236 }
10237 index++;
10238 }
10239 //--------------------------------------------
10240 if (mask & VARIABLE_WET)
10241 {
10242 float wet = floats.Get(index);
10243 SetWet(wet);
10244 index++;
10245 }
10246 //--------------------------------------------
10247 if (mask & VARIABLE_LIQUIDTYPE)
10248 {
10249 int liquidtype = Math.Round(floats.Get(index));
10250 SetLiquidType(liquidtype);
10251 index++;
10252 }
10253 //--------------------------------------------
10254 if (mask & VARIABLE_COLOR)
10255 {
10256 m_ColorComponentR = Math.Round(floats.Get(index));
10257 index++;
10258 m_ColorComponentG = Math.Round(floats.Get(index));
10259 index++;
10260 m_ColorComponentB = Math.Round(floats.Get(index));
10261 index++;
10262 m_ColorComponentA = Math.Round(floats.Get(index));
10263 index++;
10264 }
10265 //--------------------------------------------
10266 if (mask & VARIABLE_CLEANNESS)
10267 {
10268 int cleanness = Math.Round(floats.Get(index));
10269 SetCleanness(cleanness);
10270 index++;
10271 }
10272 }
10273
10274 override void WriteVarsToCTX(ParamsWriteContext ctx)
10275 {
10276 super.WriteVarsToCTX(ctx);
10277
10278 //--------------------------------------------
10279 if (IsVariableSet(VARIABLE_QUANTITY))
10280 {
10281 ctx.Write(GetQuantity());
10282 }
10283 //--------------------------------------------
10284 if (IsVariableSet(VARIABLE_WET))
10285 {
10286 ctx.Write(GetWet());
10287 }
10288 //--------------------------------------------
10289 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10290 {
10291 ctx.Write(GetLiquidType());
10292 }
10293 //--------------------------------------------
10294 if (IsVariableSet(VARIABLE_COLOR))
10295 {
10296 int r,g,b,a;
10297 GetColor(r,g,b,a);
10298 ctx.Write(r);
10299 ctx.Write(g);
10300 ctx.Write(b);
10301 ctx.Write(a);
10302 }
10303 //--------------------------------------------
10304 if (IsVariableSet(VARIABLE_CLEANNESS))
10305 {
10306 ctx.Write(GetCleanness());
10307 }
10308 }
10309
10310 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
10311 {
10312 if (!super.ReadVarsFromCTX(ctx,version))
10313 return false;
10314
10315 int intValue;
10316 float value;
10317
10318 if (version < 140)
10319 {
10320 if (!ctx.Read(intValue))
10321 return false;
10322
10323 m_VariablesMask = intValue;
10324 }
10325
10326 if (m_VariablesMask & VARIABLE_QUANTITY)
10327 {
10328 if (!ctx.Read(value))
10329 return false;
10330
10331 if (IsStoreLoad())
10332 {
10334 }
10335 else
10336 {
10337 SetQuantity(value, true, false, false, false);
10338 }
10339 }
10340 //--------------------------------------------
10341 if (version < 140)
10342 {
10343 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10344 {
10345 if (!ctx.Read(value))
10346 return false;
10347 SetTemperatureDirect(value);
10348 }
10349 }
10350 //--------------------------------------------
10351 if (m_VariablesMask & VARIABLE_WET)
10352 {
10353 if (!ctx.Read(value))
10354 return false;
10355 SetWet(value);
10356 }
10357 //--------------------------------------------
10358 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
10359 {
10360 if (!ctx.Read(intValue))
10361 return false;
10362 SetLiquidType(intValue);
10363 }
10364 //--------------------------------------------
10365 if (m_VariablesMask & VARIABLE_COLOR)
10366 {
10367 int r,g,b,a;
10368 if (!ctx.Read(r))
10369 return false;
10370 if (!ctx.Read(g))
10371 return false;
10372 if (!ctx.Read(b))
10373 return false;
10374 if (!ctx.Read(a))
10375 return false;
10376
10377 SetColor(r,g,b,a);
10378 }
10379 //--------------------------------------------
10380 if (m_VariablesMask & VARIABLE_CLEANNESS)
10381 {
10382 if (!ctx.Read(intValue))
10383 return false;
10384 SetCleanness(intValue);
10385 }
10386 //--------------------------------------------
10387 if (version >= 138 && version < 140)
10388 {
10389 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10390 {
10391 if (!ctx.Read(intValue))
10392 return false;
10393 SetFrozen(intValue);
10394 }
10395 }
10396
10397 return true;
10398 }
10399
10400 //----------------------------------------------------------------
10401 override bool OnStoreLoad(ParamsReadContext ctx, int version)
10402 {
10403 m_IsStoreLoad = true;
10405 {
10406 m_FixDamageSystemInit = true;
10407 }
10408
10409 if (!super.OnStoreLoad(ctx, version))
10410 {
10411 m_IsStoreLoad = false;
10412 return false;
10413 }
10414
10415 if (version >= 114)
10416 {
10417 bool hasQuickBarIndexSaved;
10418
10419 if (!ctx.Read(hasQuickBarIndexSaved))
10420 {
10421 m_IsStoreLoad = false;
10422 return false;
10423 }
10424
10425 if (hasQuickBarIndexSaved)
10426 {
10427 int itmQBIndex;
10428
10429 //Load quickbar item bind
10430 if (!ctx.Read(itmQBIndex))
10431 {
10432 m_IsStoreLoad = false;
10433 return false;
10434 }
10435
10436 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10437 if (itmQBIndex != -1 && parentPlayer)
10438 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10439 }
10440 }
10441 else
10442 {
10443 // Backup of how it used to be
10444 PlayerBase player;
10445 int itemQBIndex;
10446 if (version == int.MAX)
10447 {
10448 if (!ctx.Read(itemQBIndex))
10449 {
10450 m_IsStoreLoad = false;
10451 return false;
10452 }
10453 }
10454 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10455 {
10456 //Load quickbar item bind
10457 if (!ctx.Read(itemQBIndex))
10458 {
10459 m_IsStoreLoad = false;
10460 return false;
10461 }
10462 if (itemQBIndex != -1 && player)
10463 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10464 }
10465 }
10466
10467 if (version < 140)
10468 {
10469 // variable management system
10470 if (!LoadVariables(ctx, version))
10471 {
10472 m_IsStoreLoad = false;
10473 return false;
10474 }
10475 }
10476
10477 //agent trasmission system
10478 if (!LoadAgents(ctx, version))
10479 {
10480 m_IsStoreLoad = false;
10481 return false;
10482 }
10483 if (version >= 132)
10484 {
10485 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10486 if (raib)
10487 {
10488 if (!raib.OnStoreLoad(ctx,version))
10489 {
10490 m_IsStoreLoad = false;
10491 return false;
10492 }
10493 }
10494 }
10495
10496 m_IsStoreLoad = false;
10497 return true;
10498 }
10499
10500 //----------------------------------------------------------------
10501
10502 override void OnStoreSave(ParamsWriteContext ctx)
10503 {
10504 super.OnStoreSave(ctx);
10505
10506 PlayerBase player;
10507 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10508 {
10509 ctx.Write(true); // Keep track of if we should actually read this in or not
10510 //Save quickbar item bind
10511 int itemQBIndex = -1;
10512 itemQBIndex = player.FindQuickBarEntityIndex(this);
10513 ctx.Write(itemQBIndex);
10514 }
10515 else
10516 {
10517 ctx.Write(false); // Keep track of if we should actually read this in or not
10518 }
10519
10520 SaveAgents(ctx);//agent trasmission system
10521
10522 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10523 if (raib)
10524 {
10525 raib.OnStoreSave(ctx);
10526 }
10527 }
10528 //----------------------------------------------------------------
10529
10530 override void AfterStoreLoad()
10531 {
10532 super.AfterStoreLoad();
10533
10535 {
10537 }
10538
10539 if (GetStoreLoadedQuantity() != float.LOWEST)
10540 {
10542 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
10543 }
10544 }
10545
10546 override void EEOnAfterLoad()
10547 {
10548 super.EEOnAfterLoad();
10549
10551 {
10552 m_FixDamageSystemInit = false;
10553 }
10554
10557 }
10558
10559 bool CanBeDisinfected()
10560 {
10561 return false;
10562 }
10563
10564
10565 //----------------------------------------------------------------
10566 override void OnVariablesSynchronized()
10567 {
10568 if (m_Initialized)
10569 {
10570 #ifdef PLATFORM_CONSOLE
10571 //bruteforce it is
10572 if (IsSplitable())
10573 {
10574 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
10575 if (menu)
10576 {
10577 menu.Refresh();
10578 }
10579 }
10580 #endif
10581 }
10582
10584 {
10585 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10586 m_WantPlayImpactSound = false;
10587 }
10588
10590 {
10591 SetWeightDirty();
10593 }
10594 if (m_VarWet != m_VarWetPrev)
10595 {
10598 }
10599
10600 if (m_SoundSyncPlay != 0)
10601 {
10602 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
10603 m_SoundSyncPlay = 0;
10604 }
10605 if (m_SoundSyncStop != 0)
10606 {
10607 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
10608 m_SoundSyncStop = 0;
10609 }
10610
10611 super.OnVariablesSynchronized();
10612 }
10613
10614 //------------------------- Quantity
10615 //----------------------------------------------------------------
10617 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
10618 {
10619 if (!IsServerCheck(allow_client))
10620 return false;
10621
10622 if (!HasQuantity())
10623 return false;
10624
10625 float min = GetQuantityMin();
10626 float max = GetQuantityMax();
10627
10628 if (value <= (min + 0.001))
10629 value = min;
10630
10631 if (value == min)
10632 {
10633 if (destroy_config)
10634 {
10635 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10636 if (dstr)
10637 {
10638 m_VarQuantity = Math.Clamp(value, min, max);
10639 this.Delete();
10640 return true;
10641 }
10642 }
10643 else if (destroy_forced)
10644 {
10645 m_VarQuantity = Math.Clamp(value, min, max);
10646 this.Delete();
10647 return true;
10648 }
10649 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
10650 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
10651 }
10652
10653 float delta = m_VarQuantity;
10654 m_VarQuantity = Math.Clamp(value, min, max);
10655
10656 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
10657 {
10658 delta = m_VarQuantity - delta;
10659
10660 if (delta)
10661 OnQuantityChanged(delta);
10662 }
10663
10664 SetVariableMask(VARIABLE_QUANTITY);
10665
10666 return false;
10667 }
10668
10669 //----------------------------------------------------------------
10671 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
10672 {
10673 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
10674 }
10675 //----------------------------------------------------------------
10676 void SetQuantityMax()
10677 {
10678 float max = GetQuantityMax();
10679 SetQuantity(max);
10680 }
10681
10682 override void SetQuantityToMinimum()
10683 {
10684 float min = GetQuantityMin();
10685 SetQuantity(min);
10686 }
10687 //----------------------------------------------------------------
10689 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
10690 {
10691 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
10692 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
10693 SetQuantity(result, destroy_config, destroy_forced);
10694 }
10695
10696 //----------------------------------------------------------------
10698 override float GetQuantityNormalized()
10699 {
10700 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
10701 }
10702
10704 {
10705 return GetQuantityNormalized();
10706 }
10707
10708 /*void SetAmmoNormalized(float value)
10709 {
10710 float value_clamped = Math.Clamp(value, 0, 1);
10711 Magazine this_mag = Magazine.Cast(this);
10712 int max_rounds = this_mag.GetAmmoMax();
10713 int result = value * max_rounds;//can the rounded if higher precision is required
10714 this_mag.SetAmmoCount(result);
10715 }*/
10716 //----------------------------------------------------------------
10717 override int GetQuantityMax()
10718 {
10719 int slot = -1;
10720 if (GetInventory())
10721 {
10722 InventoryLocation il = new InventoryLocation;
10723 GetInventory().GetCurrentInventoryLocation(il);
10724 slot = il.GetSlot();
10725 }
10726
10727 return GetTargetQuantityMax(slot);
10728 }
10729
10730 override int GetTargetQuantityMax(int attSlotID = -1)
10731 {
10732 float quantity_max = 0;
10733
10734 if (IsSplitable()) //only stackable/splitable items can check for stack size
10735 {
10736 if (attSlotID != -1)
10737 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10738
10739 if (quantity_max <= 0)
10740 quantity_max = m_VarStackMax;
10741 }
10742
10743 if (quantity_max <= 0)
10744 quantity_max = m_VarQuantityMax;
10745
10746 return quantity_max;
10747 }
10748 //----------------------------------------------------------------
10749 override int GetQuantityMin()
10750 {
10751 return m_VarQuantityMin;
10752 }
10753 //----------------------------------------------------------------
10754 int GetQuantityInit()
10755 {
10756 return m_VarQuantityInit;
10757 }
10758
10759 //----------------------------------------------------------------
10760 override bool HasQuantity()
10761 {
10762 return !(GetQuantityMax() - GetQuantityMin() == 0);
10763 }
10764
10765 override float GetQuantity()
10766 {
10767 return m_VarQuantity;
10768 }
10769
10770 bool IsFullQuantity()
10771 {
10772 return GetQuantity() >= GetQuantityMax();
10773 }
10774
10775 //Calculates weight of single item without attachments and cargo
10776 override float GetSingleInventoryItemWeightEx()
10777 {
10778 //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
10779 float weightEx = GetWeightEx();//overall weight of the item
10780 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
10781 return weightEx - special;
10782 }
10783
10784 // Obsolete, use GetSingleInventoryItemWeightEx() instead
10786 {
10788 }
10789
10790 override protected float GetWeightSpecialized(bool forceRecalc = false)
10791 {
10792 if (IsSplitable()) //quantity determines size of the stack
10793 {
10794 #ifdef DEVELOPER
10795 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10796 {
10797 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10798 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
10799 }
10800 #endif
10801
10802 return GetQuantity() * GetConfigWeightModified();
10803 }
10804 else if (HasEnergyManager())// items with energy manager
10805 {
10806 #ifdef DEVELOPER
10807 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10808 {
10809 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10810 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
10811 }
10812 #endif
10813 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10814 }
10815 else//everything else
10816 {
10817 #ifdef DEVELOPER
10818 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10819 {
10820 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10821 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
10822 }
10823 #endif
10824 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10825 }
10826 }
10827
10829 int GetNumberOfItems()
10830 {
10831 int item_count = 0;
10832 ItemBase item;
10833
10834 if (GetInventory().GetCargo() != NULL)
10835 {
10836 item_count = GetInventory().GetCargo().GetItemCount();
10837 }
10838
10839 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10840 {
10841 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10842 if (item)
10843 item_count += item.GetNumberOfItems();
10844 }
10845 return item_count;
10846 }
10847
10849 float GetUnitWeight(bool include_wetness = true)
10850 {
10851 float weight = 0;
10852 float wetness = 1;
10853 if (include_wetness)
10854 wetness += GetWet();
10855 if (IsSplitable()) //quantity determines size of the stack
10856 {
10857 weight = wetness * m_ConfigWeight;
10858 }
10859 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
10860 {
10861 weight = 1;
10862 }
10863 return weight;
10864 }
10865
10866 //-----------------------------------------------------------------
10867
10868 override void ClearInventory()
10869 {
10870 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
10871 {
10872 GameInventory inv = GetInventory();
10873 array<EntityAI> items = new array<EntityAI>;
10874 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
10875 for (int i = 0; i < items.Count(); i++)
10876 {
10877 ItemBase item = ItemBase.Cast(items.Get(i));
10878 if (item)
10879 {
10880 GetGame().ObjectDelete(item);
10881 }
10882 }
10883 }
10884 }
10885
10886 //------------------------- Energy
10887
10888 //----------------------------------------------------------------
10889 float GetEnergy()
10890 {
10891 float energy = 0;
10892 if (HasEnergyManager())
10893 {
10894 energy = GetCompEM().GetEnergy();
10895 }
10896 return energy;
10897 }
10898
10899
10900 override void OnEnergyConsumed()
10901 {
10902 super.OnEnergyConsumed();
10903
10905 }
10906
10907 override void OnEnergyAdded()
10908 {
10909 super.OnEnergyAdded();
10910
10912 }
10913
10914 // Converts energy (from Energy Manager) to quantity, if enabled.
10916 {
10917 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10918 {
10919 if (HasQuantity())
10920 {
10921 float energy_0to1 = GetCompEM().GetEnergy0To1();
10922 SetQuantityNormalized(energy_0to1);
10923 }
10924 }
10925 }
10926
10927 //----------------------------------------------------------------
10928 float GetHeatIsolationInit()
10929 {
10930 return ConfigGetFloat("heatIsolation");
10931 }
10932
10933 float GetHeatIsolation()
10934 {
10935 return m_HeatIsolation;
10936 }
10937
10938 float GetDryingIncrement(string pIncrementName)
10939 {
10940 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
10941 if (GetGame().ConfigIsExisting(paramPath))
10942 return GetGame().ConfigGetFloat(paramPath);
10943
10944 return 0.0;
10945 }
10946
10947 float GetSoakingIncrement(string pIncrementName)
10948 {
10949 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
10950 if (GetGame().ConfigIsExisting(paramPath))
10951 return GetGame().ConfigGetFloat(paramPath);
10952
10953 return 0.0;
10954 }
10955 //----------------------------------------------------------------
10956 override void SetWet(float value, bool allow_client = false)
10957 {
10958 if (!IsServerCheck(allow_client))
10959 return;
10960
10961 float min = GetWetMin();
10962 float max = GetWetMax();
10963
10964 float previousValue = m_VarWet;
10965
10966 m_VarWet = Math.Clamp(value, min, max);
10967
10968 if (previousValue != m_VarWet)
10969 {
10970 SetVariableMask(VARIABLE_WET);
10971 OnWetChanged(m_VarWet, previousValue);
10972 }
10973 }
10974 //----------------------------------------------------------------
10975 override void AddWet(float value)
10976 {
10977 SetWet(GetWet() + value);
10978 }
10979 //----------------------------------------------------------------
10980 override void SetWetMax()
10981 {
10983 }
10984 //----------------------------------------------------------------
10985 override float GetWet()
10986 {
10987 return m_VarWet;
10988 }
10989 //----------------------------------------------------------------
10990 override float GetWetMax()
10991 {
10992 return m_VarWetMax;
10993 }
10994 //----------------------------------------------------------------
10995 override float GetWetMin()
10996 {
10997 return m_VarWetMin;
10998 }
10999 //----------------------------------------------------------------
11000 override float GetWetInit()
11001 {
11002 return m_VarWetInit;
11003 }
11004 //----------------------------------------------------------------
11005 override void OnWetChanged(float newVal, float oldVal)
11006 {
11007 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
11008 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
11009 if (newLevel != oldLevel)
11010 {
11011 OnWetLevelChanged(newLevel,oldLevel);
11012 }
11013 }
11014
11015 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
11016 {
11017 SetWeightDirty();
11018 }
11019
11020 override EWetnessLevel GetWetLevel()
11021 {
11022 return GetWetLevelInternal(m_VarWet);
11023 }
11024
11025 //----------------------------------------------------------------
11026
11027 override void SetStoreLoad(bool value)
11028 {
11029 m_IsStoreLoad = value;
11030 }
11031
11032 override bool IsStoreLoad()
11033 {
11034 return m_IsStoreLoad;
11035 }
11036
11037 override void SetStoreLoadedQuantity(float value)
11038 {
11039 m_StoreLoadedQuantity = value;
11040 }
11041
11042 override float GetStoreLoadedQuantity()
11043 {
11044 return m_StoreLoadedQuantity;
11045 }
11046
11047 //----------------------------------------------------------------
11048
11049 float GetItemModelLength()
11050 {
11051 if (ConfigIsExisting("itemModelLength"))
11052 {
11053 return ConfigGetFloat("itemModelLength");
11054 }
11055 return 0;
11056 }
11057
11058 float GetItemAttachOffset()
11059 {
11060 if (ConfigIsExisting("itemAttachOffset"))
11061 {
11062 return ConfigGetFloat("itemAttachOffset");
11063 }
11064 return 0;
11065 }
11066
11067 override void SetCleanness(int value, bool allow_client = false)
11068 {
11069 if (!IsServerCheck(allow_client))
11070 return;
11071
11072 int previousValue = m_Cleanness;
11073
11074 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
11075
11076 if (previousValue != m_Cleanness)
11077 SetVariableMask(VARIABLE_CLEANNESS);
11078 }
11079
11080 override int GetCleanness()
11081 {
11082 return m_Cleanness;
11083 }
11084
11086 {
11087 return true;
11088 }
11089
11090 //----------------------------------------------------------------
11091 // ATTACHMENT LOCKING
11092 // Getters relevant to generic ActionLockAttachment
11093 int GetLockType()
11094 {
11095 return m_LockType;
11096 }
11097
11098 string GetLockSoundSet()
11099 {
11100 return m_LockSoundSet;
11101 }
11102
11103 //----------------------------------------------------------------
11104 //------------------------- Color
11105 // sets items color variable given color components
11106 override void SetColor(int r, int g, int b, int a)
11107 {
11112 SetVariableMask(VARIABLE_COLOR);
11113 }
11115 override void GetColor(out int r,out int g,out int b,out int a)
11116 {
11121 }
11122
11123 bool IsColorSet()
11124 {
11125 return IsVariableSet(VARIABLE_COLOR);
11126 }
11127
11129 string GetColorString()
11130 {
11131 int r,g,b,a;
11132 GetColor(r,g,b,a);
11133 r = r/255;
11134 g = g/255;
11135 b = b/255;
11136 a = a/255;
11137 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11138 }
11139 //----------------------------------------------------------------
11140 //------------------------- LiquidType
11141
11142 override void SetLiquidType(int value, bool allow_client = false)
11143 {
11144 if (!IsServerCheck(allow_client))
11145 return;
11146
11147 int old = m_VarLiquidType;
11148 m_VarLiquidType = value;
11149 OnLiquidTypeChanged(old,value);
11150 SetVariableMask(VARIABLE_LIQUIDTYPE);
11151 }
11152
11153 int GetLiquidTypeInit()
11154 {
11155 return ConfigGetInt("varLiquidTypeInit");
11156 }
11157
11158 override int GetLiquidType()
11159 {
11160 return m_VarLiquidType;
11161 }
11162
11163 protected void OnLiquidTypeChanged(int oldType, int newType)
11164 {
11165 if (newType == LIQUID_NONE && GetIsFrozen())
11166 SetFrozen(false);
11167 }
11168
11170 void UpdateQuickbarShortcutVisibility(PlayerBase player)
11171 {
11172 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11173 }
11174
11175 // -------------------------------------------------------------------------
11177 void OnInventoryEnter(Man player)
11178 {
11179 PlayerBase nplayer;
11180 if (PlayerBase.CastTo(nplayer, player))
11181 {
11182 m_CanPlayImpactSound = true;
11183 //nplayer.OnItemInventoryEnter(this);
11184 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11185 }
11186 }
11187
11188 // -------------------------------------------------------------------------
11190 void OnInventoryExit(Man player)
11191 {
11192 PlayerBase nplayer;
11193 if (PlayerBase.CastTo(nplayer,player))
11194 {
11195 //nplayer.OnItemInventoryExit(this);
11196 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11197
11198 }
11199
11200 //if (!GetGame().IsDedicatedServer())
11201 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11202
11203
11204 if (HasEnergyManager())
11205 {
11206 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
11207 }
11208 }
11209
11210 // ADVANCED PLACEMENT EVENTS
11211 override void OnPlacementStarted(Man player)
11212 {
11213 super.OnPlacementStarted(player);
11214
11215 SetTakeable(false);
11216 }
11217
11218 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
11219 {
11220 if (m_AdminLog)
11221 {
11222 m_AdminLog.OnPlacementComplete(player, this);
11223 }
11224
11225 super.OnPlacementComplete(player, position, orientation);
11226 }
11227
11228 //-----------------------------
11229 // AGENT SYSTEM
11230 //-----------------------------
11231 //--------------------------------------------------------------------------
11232 bool ContainsAgent(int agent_id)
11233 {
11234 if (agent_id & m_AttachedAgents)
11235 {
11236 return true;
11237 }
11238 else
11239 {
11240 return false;
11241 }
11242 }
11243
11244 //--------------------------------------------------------------------------
11245 override void RemoveAgent(int agent_id)
11246 {
11247 if (ContainsAgent(agent_id))
11248 {
11249 m_AttachedAgents = ~agent_id & m_AttachedAgents;
11250 }
11251 }
11252
11253 //--------------------------------------------------------------------------
11254 override void RemoveAllAgents()
11255 {
11256 m_AttachedAgents = 0;
11257 }
11258 //--------------------------------------------------------------------------
11259 override void RemoveAllAgentsExcept(int agent_to_keep)
11260 {
11261 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
11262 }
11263 // -------------------------------------------------------------------------
11264 override void InsertAgent(int agent, float count = 1)
11265 {
11266 if (count < 1)
11267 return;
11268 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
11270 }
11271
11273 void TransferAgents(int agents)
11274 {
11276 }
11277
11278 // -------------------------------------------------------------------------
11279 override int GetAgents()
11280 {
11281 return m_AttachedAgents;
11282 }
11283 //----------------------------------------------------------------------
11284
11285 /*int GetContaminationType()
11286 {
11287 int contamination_type;
11288
11289 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
11290 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
11291 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
11292 const int DIRTY_MASK = eAgents.WOUND_AGENT;
11293
11294 Edible_Base edible = Edible_Base.Cast(this);
11295 int agents = GetAgents();
11296 if (edible)
11297 {
11298 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
11299 if (profile)
11300 {
11301 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
11302 }
11303 }
11304 if (agents & CONTAMINATED_MASK)
11305 {
11306 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
11307 }
11308 if (agents & POISONED_MASK)
11309 {
11310 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
11311 }
11312 if (agents & NERVE_GAS_MASK)
11313 {
11314 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
11315 }
11316 if (agents & DIRTY_MASK)
11317 {
11318 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
11319 }
11320
11321 return agents;
11322 }*/
11323
11324 // -------------------------------------------------------------------------
11325 bool LoadAgents(ParamsReadContext ctx, int version)
11326 {
11327 if (!ctx.Read(m_AttachedAgents))
11328 return false;
11329 return true;
11330 }
11331 // -------------------------------------------------------------------------
11333 {
11334
11336 }
11337 // -------------------------------------------------------------------------
11338
11340 override void CheckForRoofLimited(float timeTresholdMS = 3000)
11341 {
11342 super.CheckForRoofLimited(timeTresholdMS);
11343
11344 float time = GetGame().GetTime();
11345 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11346 {
11347 m_PreviousRoofTestTime = time;
11348 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11349 }
11350 }
11351
11352 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
11353 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
11354 {
11355 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
11356 {
11357 return 0;
11358 }
11359
11360 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
11361 {
11362 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
11363 if (filter)
11364 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
11365 else
11366 return 0;//otherwise return 0 when no filter attached
11367 }
11368
11369 string subclassPath, entryName;
11370
11371 switch (type)
11372 {
11373 case DEF_BIOLOGICAL:
11374 entryName = "biological";
11375 break;
11376 case DEF_CHEMICAL:
11377 entryName = "chemical";
11378 break;
11379 default:
11380 entryName = "biological";
11381 break;
11382 }
11383
11384 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
11385
11386 return GetGame().ConfigGetFloat(subclassPath + entryName);
11387 }
11388
11389
11390
11392 override void EEOnCECreate()
11393 {
11394 if (!IsMagazine())
11396
11398 }
11399
11400
11401 //-------------------------
11402 // OPEN/CLOSE USER ACTIONS
11403 //-------------------------
11405 void Open();
11406 void Close();
11407 bool IsOpen()
11408 {
11409 return true;
11410 }
11411
11412 override bool CanDisplayCargo()
11413 {
11414 return IsOpen();
11415 }
11416
11417
11418 // ------------------------------------------------------------
11419 // CONDITIONS
11420 // ------------------------------------------------------------
11421 override bool CanPutInCargo(EntityAI parent)
11422 {
11423 if (parent)
11424 {
11425 if (parent.IsInherited(DayZInfected))
11426 return true;
11427
11428 if (!parent.IsRuined())
11429 return true;
11430 }
11431
11432 return true;
11433 }
11434
11435 override bool CanPutAsAttachment(EntityAI parent)
11436 {
11437 if (!super.CanPutAsAttachment(parent))
11438 {
11439 return false;
11440 }
11441
11442 if (!IsRuined() && !parent.IsRuined())
11443 {
11444 return true;
11445 }
11446
11447 return false;
11448 }
11449
11450 override bool CanReceiveItemIntoCargo(EntityAI item)
11451 {
11452 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11453 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11454 // return false;
11455
11456 return super.CanReceiveItemIntoCargo(item);
11457 }
11458
11459 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
11460 {
11461 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11462 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11463 // return false;
11464
11465 GameInventory attachmentInv = attachment.GetInventory();
11466 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11467 {
11468 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11469 return false;
11470 }
11471
11472 InventoryLocation loc = new InventoryLocation();
11473 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11474 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
11475 return false;
11476
11477 return super.CanReceiveAttachment(attachment, slotId);
11478 }
11479
11480 override bool CanReleaseAttachment(EntityAI attachment)
11481 {
11482 if (!super.CanReleaseAttachment(attachment))
11483 return false;
11484
11485 return GetInventory().AreChildrenAccessible();
11486 }
11487
11488 /*override bool CanLoadAttachment(EntityAI attachment)
11489 {
11490 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11491 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11492 // return false;
11493
11494 GameInventory attachmentInv = attachment.GetInventory();
11495 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11496 {
11497 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
11498 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
11499
11500 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11501 return false;
11502 }
11503
11504 return super.CanLoadAttachment(attachment);
11505 }*/
11506
11507 // Plays muzzle flash particle effects
11508 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11509 {
11510 int id = muzzle_owner.GetMuzzleID();
11511 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
11512
11513 if (WPOF_array)
11514 {
11515 for (int i = 0; i < WPOF_array.Count(); i++)
11516 {
11517 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11518
11519 if (WPOF)
11520 {
11521 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11522 }
11523 }
11524 }
11525 }
11526
11527 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
11528 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11529 {
11530 int id = muzzle_owner.GetMuzzleID();
11531 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
11532
11533 if (WPOBE_array)
11534 {
11535 for (int i = 0; i < WPOBE_array.Count(); i++)
11536 {
11537 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11538
11539 if (WPOBE)
11540 {
11541 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11542 }
11543 }
11544 }
11545 }
11546
11547 // Plays all weapon overheating particles
11548 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11549 {
11550 int id = muzzle_owner.GetMuzzleID();
11551 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11552
11553 if (WPOOH_array)
11554 {
11555 for (int i = 0; i < WPOOH_array.Count(); i++)
11556 {
11557 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11558
11559 if (WPOOH)
11560 {
11561 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11562 }
11563 }
11564 }
11565 }
11566
11567 // Updates all weapon overheating particles
11568 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11569 {
11570 int id = muzzle_owner.GetMuzzleID();
11571 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11572
11573 if (WPOOH_array)
11574 {
11575 for (int i = 0; i < WPOOH_array.Count(); i++)
11576 {
11577 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11578
11579 if (WPOOH)
11580 {
11581 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11582 }
11583 }
11584 }
11585 }
11586
11587 // Stops overheating particles
11588 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11589 {
11590 int id = muzzle_owner.GetMuzzleID();
11591 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11592
11593 if (WPOOH_array)
11594 {
11595 for (int i = 0; i < WPOOH_array.Count(); i++)
11596 {
11597 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11598
11599 if (WPOOH)
11600 {
11601 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11602 }
11603 }
11604 }
11605 }
11606
11607 //----------------------------------------------------------------
11608 //Item Behaviour - unified approach
11609 override bool IsHeavyBehaviour()
11610 {
11611 if (m_ItemBehaviour == 0)
11612 {
11613 return true;
11614 }
11615
11616 return false;
11617 }
11618
11619 override bool IsOneHandedBehaviour()
11620 {
11621 if (m_ItemBehaviour == 1)
11622 {
11623 return true;
11624 }
11625
11626 return false;
11627 }
11628
11629 override bool IsTwoHandedBehaviour()
11630 {
11631 if (m_ItemBehaviour == 2)
11632 {
11633 return true;
11634 }
11635
11636 return false;
11637 }
11638
11639 bool IsDeployable()
11640 {
11641 return false;
11642 }
11643
11645 float GetDeployTime()
11646 {
11647 return UATimeSpent.DEFAULT_DEPLOY;
11648 }
11649
11650
11651 //----------------------------------------------------------------
11652 // Item Targeting (User Actions)
11653 override void SetTakeable(bool pState)
11654 {
11655 m_IsTakeable = pState;
11656 SetSynchDirty();
11657 }
11658
11659 override bool IsTakeable()
11660 {
11661 return m_IsTakeable;
11662 }
11663
11664 // For cases where we want to show object widget which cant be taken to hands
11666 {
11667 return false;
11668 }
11669
11671 protected void PreLoadSoundAttachmentType()
11672 {
11673 string att_type = "None";
11674
11675 if (ConfigIsExisting("soundAttType"))
11676 {
11677 att_type = ConfigGetString("soundAttType");
11678 }
11679
11680 m_SoundAttType = att_type;
11681 }
11682
11683 override string GetAttachmentSoundType()
11684 {
11685 return m_SoundAttType;
11686 }
11687
11688 //----------------------------------------------------------------
11689 //SOUNDS - ItemSoundHandler
11690 //----------------------------------------------------------------
11691
11692 string GetPlaceSoundset(); // played when deploy starts
11693 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
11694 string GetDeploySoundset(); // played when deploy sucessfully finishes
11695
11697 {
11698 if (!m_ItemSoundHandler)
11700
11701 return m_ItemSoundHandler;
11702 }
11703
11704 // override to initialize sounds
11705 protected void InitItemSounds()
11706 {
11707 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
11708 return;
11709
11711
11712 if (GetPlaceSoundset() != string.Empty)
11713 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
11714
11715 if (GetDeploySoundset() != string.Empty)
11716 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
11717
11718 SoundParameters params = new SoundParameters();
11719 params.m_Loop = true;
11720 if (GetLoopDeploySoundset() != string.Empty)
11721 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
11722 }
11723
11724 // Start sound using ItemSoundHandler
11725 void StartItemSoundServer(int id)
11726 {
11727 if (!GetGame().IsServer())
11728 return;
11729
11730 m_SoundSyncPlay = id;
11731 SetSynchDirty();
11732
11733 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
11735 }
11736
11737 // Stop sound using ItemSoundHandler
11738 void StopItemSoundServer(int id)
11739 {
11740 if (!GetGame().IsServer())
11741 return;
11742
11743 m_SoundSyncStop = id;
11744 SetSynchDirty();
11745
11746 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
11748 }
11749
11750 protected void ClearStartItemSoundServer()
11751 {
11752 m_SoundSyncPlay = 0;
11753 }
11754
11755 protected void ClearStopItemSoundServer()
11756 {
11757 m_SoundSyncStop = 0;
11758 }
11759
11761 void PlayAttachSound(string slot_type)
11762 {
11763 if (!GetGame().IsDedicatedServer())
11764 {
11765 if (ConfigIsExisting("attachSoundSet"))
11766 {
11767 string cfg_path = "";
11768 string soundset = "";
11769 string type_name = GetType();
11770
11771 TStringArray cfg_soundset_array = new TStringArray;
11772 TStringArray cfg_slot_array = new TStringArray;
11773 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11774 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11775
11776 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11777 {
11778 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11779 {
11780 if (cfg_slot_array[i] == slot_type)
11781 {
11782 soundset = cfg_soundset_array[i];
11783 break;
11784 }
11785 }
11786 }
11787
11788 if (soundset != "")
11789 {
11790 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
11791 sound.SetAutodestroy(true);
11792 }
11793 }
11794 }
11795 }
11796
11797 void PlayDetachSound(string slot_type)
11798 {
11799 //TODO - evaluate if needed and devise universal config structure if so
11800 }
11801
11802 void OnApply(PlayerBase player);
11803
11805 {
11806 return 1.0;
11807 };
11808 //returns applicable selection
11809 array<string> GetHeadHidingSelection()
11810 {
11812 }
11813
11815 {
11817 }
11818
11819 WrittenNoteData GetWrittenNoteData() {};
11820
11822 {
11823 SetDynamicPhysicsLifeTime(0.01);
11824 m_ItemBeingDroppedPhys = false;
11825 }
11826
11828 {
11829 array<string> zone_names = new array<string>;
11830 GetDamageZones(zone_names);
11831 for (int i = 0; i < zone_names.Count(); i++)
11832 {
11833 SetHealthMax(zone_names.Get(i),"Health");
11834 }
11835 SetHealthMax("","Health");
11836 }
11837
11839 void SetZoneDamageCEInit()
11840 {
11841 float global_health = GetHealth01("","Health");
11842 array<string> zones = new array<string>;
11843 GetDamageZones(zones);
11844 //set damage of all zones to match global health level
11845 for (int i = 0; i < zones.Count(); i++)
11846 {
11847 SetHealth01(zones.Get(i),"Health",global_health);
11848 }
11849 }
11850
11852 bool IsCoverFaceForShave(string slot_name)
11853 {
11854 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11855 }
11856
11857 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
11858 {
11859 if (!hasRootAsPlayer)
11860 {
11861 if (refParentIB)
11862 {
11863 // parent is wet
11864 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
11865 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11866 // parent has liquid inside
11867 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
11868 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11869 // drying
11870 else if (m_VarWet > m_VarWetMin)
11871 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
11872 }
11873 else
11874 {
11875 // drying on ground or inside non-itembase (car, ...)
11876 if (m_VarWet > m_VarWetMin)
11877 AddWet(-1 * delta * GetDryingIncrement("ground"));
11878 }
11879 }
11880 }
11881
11882 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
11883 {
11885 {
11886 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
11887 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11888 {
11889 float heatPermCoef = 1.0;
11890 EntityAI ent = this;
11891 while (ent)
11892 {
11893 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11894 ent = ent.GetHierarchyParent();
11895 }
11896
11897 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11898 }
11899 }
11900 }
11901
11902 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
11903 {
11904 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
11905 EntityAI parent = GetHierarchyParent();
11906 if (!parent)
11907 {
11908 hasParent = false;
11909 hasRootAsPlayer = false;
11910 }
11911 else
11912 {
11913 hasParent = true;
11914 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11915 refParentIB = ItemBase.Cast(parent);
11916 }
11917 }
11918
11919 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
11920 {
11921 // this is stub, implemented on Edible_Base
11922 }
11923
11924 bool CanDecay()
11925 {
11926 // return true used on selected food clases so they can decay
11927 return false;
11928 }
11929
11930 protected bool CanProcessDecay()
11931 {
11932 // this is stub, implemented on Edible_Base class
11933 // used to determine whether it is still necessary for the food to decay
11934 return false;
11935 }
11936
11937 protected bool CanHaveWetness()
11938 {
11939 // return true used on selected items that have a wetness effect
11940 return false;
11941 }
11942
11944 bool CanBeConsumed(ConsumeConditionData data = null)
11945 {
11946 return !GetIsFrozen() && IsOpen();
11947 }
11948
11949 override void ProcessVariables()
11950 {
11951 bool hasParent = false, hasRootAsPlayer = false;
11952 ItemBase refParentIB;
11953
11954 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
11955 bool foodDecay = g_Game.IsFoodDecayEnabled();
11956
11957 if (wwtu || foodDecay)
11958 {
11959 bool processWetness = wwtu && CanHaveWetness();
11960 bool processTemperature = wwtu && CanHaveTemperature();
11961 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
11962
11963 if (processWetness || processTemperature || processDecay)
11964 {
11965 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
11966
11967 if (processWetness)
11968 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11969
11970 if (processTemperature)
11971 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11972
11973 if (processDecay)
11974 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11975 }
11976 }
11977 }
11978
11981 {
11982 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
11983 }
11984
11985 override float GetTemperatureFreezeThreshold()
11986 {
11988 return Liquid.GetFreezeThreshold(GetLiquidType());
11989
11990 return super.GetTemperatureFreezeThreshold();
11991 }
11992
11993 override float GetTemperatureThawThreshold()
11994 {
11996 return Liquid.GetThawThreshold(GetLiquidType());
11997
11998 return super.GetTemperatureThawThreshold();
11999 }
12000
12001 override float GetItemOverheatThreshold()
12002 {
12004 return Liquid.GetBoilThreshold(GetLiquidType());
12005
12006 return super.GetItemOverheatThreshold();
12007 }
12008
12009 override float GetTemperatureFreezeTime()
12010 {
12011 if (HasQuantity())
12012 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
12013
12014 return super.GetTemperatureFreezeTime();
12015 }
12016
12017 override float GetTemperatureThawTime()
12018 {
12019 if (HasQuantity())
12020 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
12021
12022 return super.GetTemperatureThawTime();
12023 }
12024
12026 void AffectLiquidContainerOnFill(int liquid_type, float amount);
12028 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
12029
12030 bool IsCargoException4x3(EntityAI item)
12031 {
12032 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12033 }
12034
12036 {
12037 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12038 }
12039
12041 void AddLightSourceItem(ItemBase lightsource)
12042 {
12043 m_LightSourceItem = lightsource;
12044 }
12045
12047 {
12048 m_LightSourceItem = null;
12049 }
12050
12052 {
12053 return m_LightSourceItem;
12054 }
12055
12057 array<int> GetValidFinishers()
12058 {
12059 return null;
12060 }
12061
12063 bool GetActionWidgetOverride(out typename name)
12064 {
12065 return false;
12066 }
12067
12068 bool PairWithDevice(notnull ItemBase otherDevice)
12069 {
12070 if (GetGame().IsServer())
12071 {
12072 ItemBase explosive = otherDevice;
12074 if (!trg)
12075 {
12076 trg = RemoteDetonatorTrigger.Cast(otherDevice);
12077 explosive = this;
12078 }
12079
12080 explosive.PairRemote(trg);
12081 trg.SetControlledDevice(explosive);
12082
12083 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12084 trg.SetPersistentPairID(persistentID);
12085 explosive.SetPersistentPairID(persistentID);
12086
12087 return true;
12088 }
12089 return false;
12090 }
12091
12093 float GetBaitEffectivity()
12094 {
12095 float ret = 1.0;
12096 if (HasQuantity())
12097 ret *= GetQuantityNormalized();
12098 ret *= GetHealth01();
12099
12100 return ret;
12101 }
12102
12103 #ifdef DEVELOPER
12104 override void SetDebugItem()
12105 {
12106 super.SetDebugItem();
12107 _itemBase = this;
12108 }
12109
12110 override string GetDebugText()
12111 {
12112 string text = super.GetDebugText();
12113
12114 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
12115 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
12116
12117 return text;
12118 }
12119 #endif
12120
12121 bool CanBeUsedForSuicide()
12122 {
12123 return true;
12124 }
12125
12127 //DEPRECATED BELOW
12129 // Backwards compatibility
12130 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12131 {
12132 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
12133 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
12134 }
12135
12136 // replaced by ItemSoundHandler
12137 protected EffectSound m_SoundDeployFinish;
12138 protected EffectSound m_SoundPlace;
12139 protected EffectSound m_DeployLoopSoundEx;
12140 protected EffectSound m_SoundDeploy;
12141 bool m_IsPlaceSound;
12142 bool m_IsDeploySound;
12144
12145 string GetDeployFinishSoundset();
12146 void PlayDeploySound();
12147 void PlayDeployFinishSound();
12148 void PlayPlaceSound();
12149 void PlayDeployLoopSoundEx();
12150 void StopDeployLoopSoundEx();
12151 void SoundSynchRemoteReset();
12152 void SoundSynchRemote();
12153 bool UsesGlobalDeploy(){return false;}
12154 bool CanPlayDeployLoopSound(){return false;}
12156 bool IsPlaceSound(){return m_IsPlaceSound;}
12157 bool IsDeploySound(){return m_IsDeploySound;}
12158 void SetIsPlaceSound(bool is_place_sound);
12159 void SetIsDeploySound(bool is_deploy_sound);
12160}
12161
12162EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
12163{
12164 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
12165 if (entity)
12166 {
12167 bool is_item = entity.IsInherited(ItemBase);
12168 if (is_item && full_quantity)
12169 {
12170 ItemBase item = ItemBase.Cast(entity);
12171 item.SetQuantity(item.GetQuantityInit());
12172 }
12173 }
12174 else
12175 {
12176 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
12177 return NULL;
12178 }
12179 return entity;
12180}
12181
12182void SetupSpawnedItem(ItemBase item, float health, float quantity)
12183{
12184 if (item)
12185 {
12186 if (health > 0)
12187 item.SetHealth("", "", health);
12188
12189 if (item.CanHaveTemperature())
12190 {
12191 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
12192 if (item.CanFreeze())
12193 item.SetFrozen(false);
12194 }
12195
12196 if (item.HasEnergyManager())
12197 {
12198 if (quantity >= 0)
12199 {
12200 item.GetCompEM().SetEnergy0To1(quantity);
12201 }
12202 else
12203 {
12204 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
12205 }
12206 }
12207 else if (item.IsMagazine())
12208 {
12209 Magazine mag = Magazine.Cast(item);
12210 if (quantity >= 0)
12211 {
12212 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12213 }
12214 else
12215 {
12216 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
12217 }
12218
12219 }
12220 else
12221 {
12222 if (quantity >= 0)
12223 {
12224 item.SetQuantityNormalized(quantity, false);
12225 }
12226 else
12227 {
12228 item.SetQuantity(Math.AbsFloat(quantity));
12229 }
12230
12231 }
12232 }
12233}
12234
12235#ifdef DEVELOPER
12236ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
12237#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()