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

◆ GetItemSize()

int SpawnItemOnLocation::GetItemSize ( )
private

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

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