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

◆ IsFullQuantity()

bool SpawnItemOnLocation::IsFullQuantity ( )
protected

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

8408{
8409 override bool CanPutAsAttachment(EntityAI parent)
8410 {
8411 return true;
8412 }
8413};
8414
8416{
8417
8418};
8419
8420//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8421
8422class ItemBase extends InventoryItem
8423{
8427
8429
8430 static int m_DebugActionsMask;
8432 // ============================================
8433 // Variable Manipulation System
8434 // ============================================
8435 // Quantity
8436
8437 float m_VarQuantity;
8438 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8440 int m_VarQuantityMin;
8441 int m_VarQuantityMax;
8442 int m_Count;
8443 float m_VarStackMax;
8444 float m_StoreLoadedQuantity = float.LOWEST;
8445 // Wet
8446 float m_VarWet;
8447 float m_VarWetPrev;//for client to know wetness changed during synchronization
8448 float m_VarWetInit;
8449 float m_VarWetMin;
8450 float m_VarWetMax;
8451 // Cleanness
8452 int m_Cleanness;
8453 int m_CleannessInit;
8454 int m_CleannessMin;
8455 int m_CleannessMax;
8456 // impact sounds
8458 bool m_CanPlayImpactSound = true;
8459 float m_ImpactSpeed;
8461 //
8462 float m_HeatIsolation;
8463 float m_ItemModelLength;
8464 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8466 int m_VarLiquidType;
8467 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8468 int m_QuickBarBonus;
8469 bool m_IsBeingPlaced;
8470 bool m_IsHologram;
8471 bool m_IsTakeable;
8472 bool m_ThrowItemOnDrop;
8475 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8476 bool can_this_be_combined; //Check if item can be combined
8477 bool m_CanThisBeSplit; //Check if item can be split
8478 bool m_IsStoreLoad = false;
8479 bool m_CanShowQuantity;
8480 bool m_HasQuantityBar;
8481 protected bool m_CanBeDigged;
8482 protected bool m_IsResultOfSplit
8483
8484 string m_SoundAttType;
8485 // items color variables
8490 //-------------------------------------------------------
8491
8492 // light source managing
8494
8498
8499 //==============================================
8500 // agent system
8501 private int m_AttachedAgents;
8502
8504 void TransferModifiers(PlayerBase reciever);
8505
8506
8507 // Weapons & suppressors particle effects
8511 ref static map<string, int> m_WeaponTypeToID;
8512 static int m_LastRegisteredWeaponID = 0;
8513
8514 // Overheating effects
8516 float m_OverheatingShots;
8517 ref Timer m_CheckOverheating;
8518 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8519 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8520 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8521 ref array <ref OverheatingParticle> m_OverheatingParticles;
8522
8524 protected bool m_HideSelectionsBySlot;
8525
8526 // Admin Log
8527 PluginAdminLog m_AdminLog;
8528
8529 // misc
8530 ref Timer m_PhysDropTimer;
8531
8532 // Attachment Locking variables
8533 ref array<int> m_CompatibleLocks;
8534 protected int m_LockType;
8535 protected ref EffectSound m_LockingSound;
8536 protected string m_LockSoundSet;
8537
8538 // ItemSoundHandler variables
8539 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8540 protected int m_SoundSyncPlay; // id for sound to play
8541 protected int m_SoundSyncStop; // id for sound to stop
8542 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
8543
8545
8546 //temperature
8547 private float m_TemperaturePerQuantityWeight;
8548
8549 // -------------------------------------------------------------------------
8550 void ItemBase()
8551 {
8552 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8556
8557 if (!g_Game.IsDedicatedServer())
8558 {
8559 if (HasMuzzle())
8560 {
8562
8564 {
8566 }
8567 }
8568
8570 m_ActionsInitialize = false;
8571 }
8572
8573 m_OldLocation = null;
8574
8575 if (g_Game.IsServer())
8576 {
8577 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8578 }
8579
8580 if (ConfigIsExisting("headSelectionsToHide"))
8581 {
8583 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8584 }
8585
8586 m_HideSelectionsBySlot = false;
8587 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8588 {
8589 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8590 }
8591
8592 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8593
8594 m_IsResultOfSplit = false;
8595
8597 }
8598
8599 override void InitItemVariables()
8600 {
8601 super.InitItemVariables();
8602
8603 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8604 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8605 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8606 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8607 m_VarStackMax = ConfigGetFloat("varStackMax");
8608 m_Count = ConfigGetInt("count");
8609
8610 m_CanShowQuantity = ConfigGetBool("quantityShow");
8611 m_HasQuantityBar = ConfigGetBool("quantityBar");
8612
8613 m_CleannessInit = ConfigGetInt("varCleannessInit");
8615 m_CleannessMin = ConfigGetInt("varCleannessMin");
8616 m_CleannessMax = ConfigGetInt("varCleannessMax");
8617
8618 m_WantPlayImpactSound = false;
8619 m_ImpactSpeed = 0.0;
8620
8621 m_VarWetInit = ConfigGetFloat("varWetInit");
8623 m_VarWetMin = ConfigGetFloat("varWetMin");
8624 m_VarWetMax = ConfigGetFloat("varWetMax");
8625
8626 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8627 if (IsLiquidContainer() && GetQuantity() != 0)
8629 m_IsBeingPlaced = false;
8630 m_IsHologram = false;
8631 m_IsTakeable = true;
8632 m_CanBeMovedOverride = false;
8636 m_CanBeDigged = ConfigGetBool("canBeDigged");
8637
8638 m_CompatibleLocks = new array<int>();
8639 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8640 m_LockType = ConfigGetInt("lockType");
8641
8642 //Define if item can be split and set ability to be combined accordingly
8643 m_CanThisBeSplit = false;
8644 can_this_be_combined = false;
8645 if (ConfigIsExisting("canBeSplit"))
8646 {
8647 can_this_be_combined = ConfigGetBool("canBeSplit");
8649 }
8650
8651 m_ItemBehaviour = -1;
8652 if (ConfigIsExisting("itemBehaviour"))
8653 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8654
8655 //RegisterNetSyncVariableInt("m_VariablesMask");
8656 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8657 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8658 RegisterNetSyncVariableInt("m_VarLiquidType");
8659 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8660
8661 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8662 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8663 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8664
8665 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8666 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8667 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8668 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8669
8670 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8671 RegisterNetSyncVariableBool("m_IsTakeable");
8672 RegisterNetSyncVariableBool("m_IsHologram");
8673
8676 {
8677 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8678 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8679 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
8680 }
8681
8682 m_LockSoundSet = ConfigGetString("lockSoundSet");
8683
8685 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8686 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8687
8688 m_SoundSyncSlotID = -1;
8689 }
8690
8691 override int GetQuickBarBonus()
8692 {
8693 return m_QuickBarBonus;
8694 }
8695
8696 void InitializeActions()
8697 {
8699 if (!m_InputActionMap)
8700 {
8702 m_InputActionMap = iam;
8703 SetActions();
8705 }
8706 }
8707
8708 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8709 {
8711 {
8712 m_ActionsInitialize = true;
8714 }
8715
8716 actions = m_InputActionMap.Get(action_input_type);
8717 }
8718
8719 void SetActions()
8720 {
8721 AddAction(ActionTakeItem);
8722 AddAction(ActionTakeItemToHands);
8723 AddAction(ActionWorldCraft);
8725 AddAction(ActionAttachWithSwitch);
8726 }
8727
8728 void SetActionAnimOverrides(); // Override action animation for specific item
8729
8730 void AddAction(typename actionName)
8731 {
8732 ActionBase action = ActionManagerBase.GetAction(actionName);
8733
8734 if (!action)
8735 {
8736 Debug.LogError("Action " + actionName + " dosn't exist!");
8737 return;
8738 }
8739
8740 typename ai = action.GetInputType();
8741 if (!ai)
8742 {
8743 m_ActionsInitialize = false;
8744 return;
8745 }
8746
8747 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8748 if (!action_array)
8749 {
8750 action_array = new array<ActionBase_Basic>;
8751 m_InputActionMap.Insert(ai, action_array);
8752 }
8753 if (LogManager.IsActionLogEnable())
8754 {
8755 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8756 }
8757
8758 if (action_array.Find(action) != -1)
8759 {
8760 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8761 }
8762 else
8763 {
8764 action_array.Insert(action);
8765 }
8766 }
8767
8768 void RemoveAction(typename actionName)
8769 {
8770 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8771 ActionBase action = player.GetActionManager().GetAction(actionName);
8772 typename ai = action.GetInputType();
8773 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8774
8775 if (action_array)
8776 {
8777 action_array.RemoveItem(action);
8778 }
8779 }
8780
8781 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
8782 // Set -1 for params which should stay in default state
8783 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
8784 {
8785 ActionOverrideData overrideData = new ActionOverrideData();
8786 overrideData.m_CommandUID = commandUID;
8787 overrideData.m_CommandUIDProne = commandUIDProne;
8788 overrideData.m_StanceMask = stanceMask;
8789
8790 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
8791 if (!actionMap) // create new map of action > overidables map
8792 {
8793 actionMap = new TActionAnimOverrideMap();
8794 m_ItemActionOverrides.Insert(action, actionMap);
8795 }
8796
8797 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
8798
8799 }
8800
8801 void OnItemInHandsPlayerSwimStart(PlayerBase player);
8802
8803 ScriptedLightBase GetLight();
8804
8805 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8806 void LoadParticleConfigOnFire(int id)
8807 {
8808 if (!m_OnFireEffect)
8810
8813
8814 string config_to_search = "CfgVehicles";
8815 string muzzle_owner_config;
8816
8817 if (!m_OnFireEffect.Contains(id))
8818 {
8819 if (IsInherited(Weapon))
8820 config_to_search = "CfgWeapons";
8821
8822 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8823
8824 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8825
8826 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
8827
8828 if (config_OnFire_subclass_count > 0)
8829 {
8830 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8831
8832 for (int i = 0; i < config_OnFire_subclass_count; i++)
8833 {
8834 string particle_class = "";
8835 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8836 string config_OnFire_entry = config_OnFire_class + particle_class;
8837 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8838 WPOF_array.Insert(WPOF);
8839 }
8840
8841
8842 m_OnFireEffect.Insert(id, WPOF_array);
8843 }
8844 }
8845
8846 if (!m_OnBulletCasingEjectEffect.Contains(id))
8847 {
8848 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8849 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8850
8851 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8852
8853 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8854
8855 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8856 {
8857 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8858
8859 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8860 {
8861 string particle_class2 = "";
8862 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8863 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8864 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8865 WPOBE_array.Insert(WPOBE);
8866 }
8867
8868
8869 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8870 }
8871 }
8872 }
8873
8874 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8876 {
8879
8880 if (!m_OnOverheatingEffect.Contains(id))
8881 {
8882 string config_to_search = "CfgVehicles";
8883
8884 if (IsInherited(Weapon))
8885 config_to_search = "CfgWeapons";
8886
8887 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8888 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8889
8890 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
8891 {
8892
8893 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8894
8896 {
8897 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8898 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8899 Error(error);
8900 return;
8901 }
8902
8903 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8904 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8905
8906
8907
8908 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8909 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8910
8911 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8912 {
8913 string particle_class = "";
8914 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8915 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8916 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
8917
8918 if (entry_type == CT_CLASS)
8919 {
8920 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8921 WPOOH_array.Insert(WPOF);
8922 }
8923 }
8924
8925
8926 m_OnOverheatingEffect.Insert(id, WPOOH_array);
8927 }
8928 }
8929 }
8930
8931 float GetOverheatingValue()
8932 {
8933 return m_OverheatingShots;
8934 }
8935
8936 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
8937 {
8938 if (m_MaxOverheatingValue > 0)
8939 {
8941
8942 if (!m_CheckOverheating)
8944
8946 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8947
8948 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8949 }
8950 }
8951
8952 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8953 {
8955 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8956
8958 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8959
8961 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8962
8964 {
8966 }
8967 }
8968
8970 {
8972 }
8973
8974 void OnOverheatingDecay()
8975 {
8976 if (m_MaxOverheatingValue > 0)
8977 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
8978 else
8980
8981 if (m_OverheatingShots <= 0)
8982 {
8985 }
8986 else
8987 {
8988 if (!m_CheckOverheating)
8990
8992 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8993 }
8994
8995 CheckOverheating(this, "", this);
8996 }
8997
8998 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8999 {
9001 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9002 }
9003
9004 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9005 {
9007 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9009 }
9010
9011 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9012 {
9014 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9015 }
9016
9017 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9018 {
9020 m_OverheatingParticles = new array<ref OverheatingParticle>;
9021
9022 OverheatingParticle OP = new OverheatingParticle();
9023 OP.RegisterParticle(p);
9024 OP.SetOverheatingLimitMin(min_heat_coef);
9025 OP.SetOverheatingLimitMax(max_heat_coef);
9026 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9027
9028 m_OverheatingParticles.Insert(OP);
9029 }
9030
9031 float GetOverheatingCoef()
9032 {
9033 if (m_MaxOverheatingValue > 0)
9035
9036 return -1;
9037 }
9038
9040 {
9042 {
9043 float overheat_coef = GetOverheatingCoef();
9044 int count = m_OverheatingParticles.Count();
9045
9046 for (int i = count; i > 0; --i)
9047 {
9048 int id = i - 1;
9049 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9050 Particle p = OP.GetParticle();
9051
9052 float overheat_min = OP.GetOverheatingLimitMin();
9053 float overheat_max = OP.GetOverheatingLimitMax();
9054
9055 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9056 {
9057 if (p)
9058 {
9059 p.Stop();
9060 OP.RegisterParticle(null);
9061 }
9062 }
9063 }
9064 }
9065 }
9066
9068 {
9070 {
9071 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9072 {
9073 int id = i - 1;
9074 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9075
9076 if (OP)
9077 {
9078 Particle p = OP.GetParticle();
9079
9080 if (p)
9081 {
9082 p.Stop();
9083 }
9084
9085 delete OP;
9086 }
9087 }
9088
9089 m_OverheatingParticles.Clear();
9091 }
9092 }
9093
9095 float GetInfectionChance(int system = 0, Param param = null)
9096 {
9097 return 0.0;
9098 }
9099
9100
9101 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9102 {
9103 return 250;//default value
9104 }
9105
9106 float GetFilterDamageRatio()
9107 {
9108 return 0;
9109 }
9110
9112 bool HasMuzzle()
9113 {
9114 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9115 return true;
9116
9117 return false;
9118 }
9119
9121 int GetMuzzleID()
9122 {
9123 if (!m_WeaponTypeToID)
9124 m_WeaponTypeToID = new map<string, int>;
9125
9126 if (m_WeaponTypeToID.Contains(GetType()))
9127 {
9128 return m_WeaponTypeToID.Get(GetType());
9129 }
9130 else
9131 {
9132 // Register new weapon ID
9134 }
9135
9137 }
9138
9145 {
9146 return -1;
9147 }
9148
9149
9150
9151 // -------------------------------------------------------------------------
9152 void ~ItemBase()
9153 {
9154 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
9155 {
9156 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9157 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9158
9159 if (r_index >= 0)
9160 {
9161 InventoryLocation r_il = new InventoryLocation;
9162 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9163
9164 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9165 int r_type = r_il.GetType();
9166 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9167 {
9168 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9169 }
9170 else if (r_type == InventoryLocationType.ATTACHMENT)
9171 {
9172 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9173 }
9174
9175 }
9176
9177 player.GetHumanInventory().ClearUserReservedLocation(this);
9178 }
9179
9180 if (m_LockingSound)
9181 SEffectManager.DestroyEffect(m_LockingSound);
9182 }
9183
9184
9185
9186 // -------------------------------------------------------------------------
9187 static int GetDebugActionsMask()
9188 {
9189 return ItemBase.m_DebugActionsMask;
9190 }
9191
9192 static bool HasDebugActionsMask(int mask)
9193 {
9194 return ItemBase.m_DebugActionsMask & mask;
9195 }
9196
9197 static void SetDebugActionsMask(int mask)
9198 {
9199 ItemBase.m_DebugActionsMask = mask;
9200 }
9201
9202 static void AddDebugActionsMask(int mask)
9203 {
9204 ItemBase.m_DebugActionsMask |= mask;
9205 }
9206
9207 static void RemoveDebugActionsMask(int mask)
9208 {
9209 ItemBase.m_DebugActionsMask &= ~mask;
9210 }
9211
9212 static void ToggleDebugActionsMask(int mask)
9213 {
9214 if (HasDebugActionsMask(mask))
9215 {
9217 }
9218 else
9219 {
9220 AddDebugActionsMask(mask);
9221 }
9222 }
9223
9224 // -------------------------------------------------------------------------
9225 void SetCEBasedQuantity()
9226 {
9227 if (GetEconomyProfile())
9228 {
9229 float q_max = GetEconomyProfile().GetQuantityMax();
9230 if (q_max > 0)
9231 {
9232 float q_min = GetEconomyProfile().GetQuantityMin();
9233 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9234
9235 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9236 {
9237 ComponentEnergyManager comp = GetCompEM();
9238 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
9239 {
9240 comp.SetEnergy0To1(quantity_randomized);
9241 }
9242 }
9243 else if (HasQuantity())
9244 {
9245 SetQuantityNormalized(quantity_randomized, false);
9246 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9247 }
9248
9249 }
9250 }
9251 }
9252
9254 void LockToParent()
9255 {
9256 EntityAI parent = GetHierarchyParent();
9257
9258 if (parent)
9259 {
9260 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9261 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9262 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9263 }
9264 }
9265
9267 void UnlockFromParent()
9268 {
9269 EntityAI parent = GetHierarchyParent();
9270
9271 if (parent)
9272 {
9273 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9274 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9275 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9276 }
9277 }
9278
9279 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9280 {
9281 /*
9282 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9283 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
9284 */
9285 ItemBase item2 = ItemBase.Cast(entity2);
9286
9287 if (g_Game.IsClient())
9288 {
9289 if (ScriptInputUserData.CanStoreInputUserData())
9290 {
9291 ScriptInputUserData ctx = new ScriptInputUserData;
9293 ctx.Write(-1);
9294 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9295 ctx.Write(i1);
9296 ctx.Write(item2);
9297 ctx.Write(use_stack_max);
9298 ctx.Write(-1);
9299 ctx.Send();
9300
9301 if (IsCombineAll(item2, use_stack_max))
9302 {
9303 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9304 }
9305 }
9306 }
9307 else if (!g_Game.IsMultiplayer())
9308 {
9309 CombineItems(item2, use_stack_max);
9310 }
9311 }
9312
9313 bool IsLiquidPresent()
9314 {
9315 return (GetLiquidType() != 0 && HasQuantity());
9316 }
9317
9318 bool IsLiquidContainer()
9319 {
9320 return m_LiquidContainerMask != 0;
9321 }
9322
9324 {
9325 return m_LiquidContainerMask;
9326 }
9327
9328 bool IsBloodContainer()
9329 {
9330 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9331 return false;
9332 }
9333
9334 bool IsNVG()
9335 {
9336 return false;
9337 }
9338
9341 bool IsExplosive()
9342 {
9343 return false;
9344 }
9345
9347 {
9348 return "";
9349 }
9350
9352
9353 bool IsLightSource()
9354 {
9355 return false;
9356 }
9357
9359 {
9360 return true;
9361 }
9362
9363 //--- ACTION CONDITIONS
9364 //direction
9365 bool IsFacingPlayer(PlayerBase player, string selection)
9366 {
9367 return true;
9368 }
9369
9370 bool IsPlayerInside(PlayerBase player, string selection)
9371 {
9372 return true;
9373 }
9374
9375 override bool CanObstruct()
9376 {
9377 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9378 return !player || !IsPlayerInside(player, "");
9379 }
9380
9381 override bool IsBeingPlaced()
9382 {
9383 return m_IsBeingPlaced;
9384 }
9385
9386 void SetIsBeingPlaced(bool is_being_placed)
9387 {
9388 m_IsBeingPlaced = is_being_placed;
9389 if (!is_being_placed)
9391 SetSynchDirty();
9392 }
9393
9394 //server-side
9395 void OnEndPlacement() {}
9396
9397 override bool IsHologram()
9398 {
9399 return m_IsHologram;
9400 }
9401
9402 bool CanBeDigged()
9403 {
9404 return m_CanBeDigged;
9405 }
9406
9408 {
9409 return 1;
9410 }
9411
9412 bool CanMakeGardenplot()
9413 {
9414 return false;
9415 }
9416
9417 void SetIsHologram(bool is_hologram)
9418 {
9419 m_IsHologram = is_hologram;
9420 SetSynchDirty();
9421 }
9422 /*
9423 protected float GetNutritionalEnergy()
9424 {
9425 Edible_Base edible = Edible_Base.Cast(this);
9426 return edible.GetFoodEnergy();
9427 }
9428
9429 protected float GetNutritionalWaterContent()
9430 {
9431 Edible_Base edible = Edible_Base.Cast(this);
9432 return edible.GetFoodWater();
9433 }
9434
9435 protected float GetNutritionalIndex()
9436 {
9437 Edible_Base edible = Edible_Base.Cast(this);
9438 return edible.GetFoodNutritionalIndex();
9439 }
9440
9441 protected float GetNutritionalFullnessIndex()
9442 {
9443 Edible_Base edible = Edible_Base.Cast(this);
9444 return edible.GetFoodTotalVolume();
9445 }
9446
9447 protected float GetNutritionalToxicity()
9448 {
9449 Edible_Base edible = Edible_Base.Cast(this);
9450 return edible.GetFoodToxicity();
9451
9452 }
9453 */
9454
9455
9456 // -------------------------------------------------------------------------
9457 override void OnMovedInsideCargo(EntityAI container)
9458 {
9459 super.OnMovedInsideCargo(container);
9460
9461 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9462 }
9463
9464 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9465 {
9466 super.EEItemLocationChanged(oldLoc, newLoc);
9467
9468 PlayerBase newPlayer = null;
9469 PlayerBase oldPlayer = null;
9470
9471 if (newLoc.GetParent())
9472 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9473
9474 if (oldLoc.GetParent())
9475 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9476
9477 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
9478 {
9479 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9480
9481 if (rIndex >= 0)
9482 {
9483 InventoryLocation rIl = new InventoryLocation;
9484 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9485
9486 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9487 int rType = rIl.GetType();
9488 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
9489 {
9490 rIl.GetParent().GetOnReleaseLock().Invoke(this);
9491 }
9492 else if (rType == InventoryLocationType.ATTACHMENT)
9493 {
9494 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
9495 }
9496
9497 }
9498 }
9499
9500 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
9501 {
9502 if (newPlayer)
9503 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9504
9505 if (newPlayer == oldPlayer)
9506 {
9507 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9508 {
9509 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9510 {
9511 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9512 {
9513 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9514 }
9515 }
9516 else
9517 {
9518 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9519 }
9520 }
9521
9522 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9523 {
9524 int type = oldLoc.GetType();
9525 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9526 {
9527 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9528 }
9529 else if (type == InventoryLocationType.ATTACHMENT)
9530 {
9531 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9532 }
9533 }
9534 if (!m_OldLocation)
9535 {
9536 m_OldLocation = new InventoryLocation;
9537 }
9538 m_OldLocation.Copy(oldLoc);
9539 }
9540 else
9541 {
9542 if (m_OldLocation)
9543 {
9544 m_OldLocation.Reset();
9545 }
9546 }
9547
9548 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
9549 }
9550 else
9551 {
9552 if (newPlayer)
9553 {
9554 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9555 if (resIndex >= 0)
9556 {
9557 InventoryLocation il = new InventoryLocation;
9558 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9559 ItemBase it = ItemBase.Cast(il.GetItem());
9560 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9561 int rel_type = il.GetType();
9562 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9563 {
9564 il.GetParent().GetOnReleaseLock().Invoke(it);
9565 }
9566 else if (rel_type == InventoryLocationType.ATTACHMENT)
9567 {
9568 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9569 }
9570 //it.GetOnReleaseLock().Invoke(it);
9571 }
9572 }
9573 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9574 {
9575 //ThrowPhysically(oldPlayer, vector.Zero);
9576 m_ThrowItemOnDrop = false;
9577 }
9578
9579 if (m_OldLocation)
9580 {
9581 m_OldLocation.Reset();
9582 }
9583 }
9584
9585 if (oldLoc.GetType() == InventoryLocationType.TEMP)
9586 {
9587 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9588 }
9589
9590 if (newLoc.GetType() == InventoryLocationType.TEMP)
9591 {
9592 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9593 }
9594 }
9595
9596 override void EOnContact(IEntity other, Contact extra)
9597 {
9599 {
9600 int liquidType = -1;
9601 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9602 if (impactSpeed > 0.0)
9603 {
9604 m_ImpactSpeed = impactSpeed;
9605 #ifndef SERVER
9606 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9607 #else
9608 m_WantPlayImpactSound = true;
9609 SetSynchDirty();
9610 #endif
9611 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9612 }
9613 }
9614
9615 #ifdef SERVER
9616 if (GetCompEM() && GetCompEM().IsPlugged())
9617 {
9618 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9619 GetCompEM().UnplugThis();
9620 }
9621 #endif
9622 }
9623
9624 void RefreshPhysics();
9625
9626 override void OnCreatePhysics()
9627 {
9629 }
9630
9631 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9632 {
9633
9634 }
9635 // -------------------------------------------------------------------------
9636 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9637 {
9638 super.OnItemLocationChanged(old_owner, new_owner);
9639
9640 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9641 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9642
9643 if (!relatedPlayer && playerNew)
9644 relatedPlayer = playerNew;
9645
9646 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9647 {
9648 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9649 if (actionMgr)
9650 {
9651 ActionBase currentAction = actionMgr.GetRunningAction();
9652 if (currentAction)
9653 currentAction.OnItemLocationChanged(this);
9654 }
9655 }
9656
9657 Man ownerPlayerOld = null;
9658 Man ownerPlayerNew = null;
9659
9660 if (old_owner)
9661 {
9662 if (old_owner.IsMan())
9663 {
9664 ownerPlayerOld = Man.Cast(old_owner);
9665 }
9666 else
9667 {
9668 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9669 }
9670 }
9671 else
9672 {
9673 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9674 {
9675 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9676
9677 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9678 {
9679 GetCompEM().UnplugThis();
9680 }
9681 }
9682 }
9683
9684 if (new_owner)
9685 {
9686 if (new_owner.IsMan())
9687 {
9688 ownerPlayerNew = Man.Cast(new_owner);
9689 }
9690 else
9691 {
9692 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9693 }
9694 }
9695
9696 if (ownerPlayerOld != ownerPlayerNew)
9697 {
9698 if (ownerPlayerOld)
9699 {
9700 array<EntityAI> subItemsExit = new array<EntityAI>;
9701 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9702 for (int i = 0; i < subItemsExit.Count(); i++)
9703 {
9704 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9705 itemExit.OnInventoryExit(ownerPlayerOld);
9706 }
9707 }
9708
9709 if (ownerPlayerNew)
9710 {
9711 array<EntityAI> subItemsEnter = new array<EntityAI>;
9712 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9713 for (int j = 0; j < subItemsEnter.Count(); j++)
9714 {
9715 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9716 itemEnter.OnInventoryEnter(ownerPlayerNew);
9717 }
9718 }
9719 }
9720 else if (ownerPlayerNew != null)
9721 {
9722 PlayerBase nplayer;
9723 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9724 {
9725 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9726 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9727 for (int k = 0; k < subItemsUpdate.Count(); k++)
9728 {
9729 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9730 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9731 }
9732 }
9733 }
9734
9735 if (old_owner)
9736 old_owner.OnChildItemRemoved(this);
9737 if (new_owner)
9738 new_owner.OnChildItemReceived(this);
9739 }
9740
9741 // -------------------------------------------------------------------------------
9742 override void EEDelete(EntityAI parent)
9743 {
9744 super.EEDelete(parent);
9745 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9746 if (player)
9747 {
9748 OnInventoryExit(player);
9749
9750 if (player.IsAlive())
9751 {
9752 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9753 if (r_index >= 0)
9754 {
9755 InventoryLocation r_il = new InventoryLocation;
9756 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9757
9758 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9759 int r_type = r_il.GetType();
9760 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9761 {
9762 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9763 }
9764 else if (r_type == InventoryLocationType.ATTACHMENT)
9765 {
9766 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9767 }
9768
9769 }
9770
9771 player.RemoveQuickBarEntityShortcut(this);
9772 }
9773 }
9774 }
9775 // -------------------------------------------------------------------------------
9776 override void EEKilled(Object killer)
9777 {
9778 super.EEKilled(killer);
9779
9781 if (killer && killer.IsFireplace() && CanExplodeInFire())
9782 {
9783 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9784 {
9785 if (IsMagazine())
9786 {
9787 if (Magazine.Cast(this).GetAmmoCount() > 0)
9788 {
9789 ExplodeAmmo();
9790 }
9791 }
9792 else
9793 {
9794 Explode(DamageType.EXPLOSION);
9795 }
9796 }
9797 }
9798 }
9799
9800 override void OnWasAttached(EntityAI parent, int slot_id)
9801 {
9802 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9803
9804 super.OnWasAttached(parent, slot_id);
9805
9806 if (HasQuantity())
9807 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9808
9809 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9810 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
9811 }
9812
9813 override void OnWasDetached(EntityAI parent, int slot_id)
9814 {
9815 super.OnWasDetached(parent, slot_id);
9816
9817 if (HasQuantity())
9818 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9819
9820 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9821 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
9822 }
9823
9824 override string ChangeIntoOnAttach(string slot)
9825 {
9826 int idx;
9827 TStringArray inventory_slots = new TStringArray;
9828 TStringArray attach_types = new TStringArray;
9829
9830 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9831 if (inventory_slots.Count() < 1) //is string
9832 {
9833 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9834 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9835 }
9836 else //is array
9837 {
9838 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9839 }
9840
9841 idx = inventory_slots.Find(slot);
9842 if (idx < 0)
9843 return "";
9844
9845 return attach_types.Get(idx);
9846 }
9847
9848 override string ChangeIntoOnDetach()
9849 {
9850 int idx = -1;
9851 string slot;
9852
9853 TStringArray inventory_slots = new TStringArray;
9854 TStringArray detach_types = new TStringArray;
9855
9856 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9857 if (inventory_slots.Count() < 1) //is string
9858 {
9859 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9860 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9861 }
9862 else //is array
9863 {
9864 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9865 if (detach_types.Count() < 1)
9866 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9867 }
9868
9869 for (int i = 0; i < inventory_slots.Count(); i++)
9870 {
9871 slot = inventory_slots.Get(i);
9872 }
9873
9874 if (slot != "")
9875 {
9876 if (detach_types.Count() == 1)
9877 idx = 0;
9878 else
9879 idx = inventory_slots.Find(slot);
9880 }
9881 if (idx < 0)
9882 return "";
9883
9884 return detach_types.Get(idx);
9885 }
9886
9887 void ExplodeAmmo()
9888 {
9889 //timer
9890 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9891
9892 //min/max time
9893 float min_time = 1;
9894 float max_time = 3;
9895 float delay = Math.RandomFloat(min_time, max_time);
9896
9897 explode_timer.Run(delay, this, "DoAmmoExplosion");
9898 }
9899
9900 void DoAmmoExplosion()
9901 {
9902 Magazine magazine = Magazine.Cast(this);
9903 int pop_sounds_count = 6;
9904 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9905
9906 //play sound
9907 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9908 string sound_name = pop_sounds[ sound_idx ];
9909 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
9910
9911 //remove ammo count
9912 magazine.ServerAddAmmoCount(-1);
9913
9914 //if condition then repeat -> ExplodeAmmo
9915 float min_temp_to_explode = 100; //min temperature for item to explode
9916
9917 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9918 {
9919 ExplodeAmmo();
9920 }
9921 }
9922
9923 // -------------------------------------------------------------------------------
9924 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9925 {
9926 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9927
9928 const int CHANCE_DAMAGE_CARGO = 4;
9929 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9930 const int CHANCE_DAMAGE_NOTHING = 2;
9931
9932 if (IsClothing() || IsContainer() || IsItemTent())
9933 {
9934 float dmg = damageResult.GetDamage("","Health") * -0.5;
9935 int chances;
9936 int rnd;
9937
9938 if (GetInventory().GetCargo())
9939 {
9940 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9941 rnd = Math.RandomInt(0,chances);
9942
9943 if (rnd < CHANCE_DAMAGE_CARGO)
9944 {
9945 DamageItemInCargo(dmg);
9946 }
9947 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9948 {
9950 }
9951 }
9952 else
9953 {
9954 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9955 rnd = Math.RandomInt(0,chances);
9956
9957 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9958 {
9960 }
9961 }
9962 }
9963 }
9964
9965 bool DamageItemInCargo(float damage)
9966 {
9967 CargoBase cargo = GetInventory().GetCargo();
9968 if (cargo)
9969 {
9970 int item_count = cargo.GetItemCount();
9971 if (item_count > 0)
9972 {
9973 int random_pick = Math.RandomInt(0, item_count);
9974 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
9975 if (!item.IsExplosive())
9976 {
9977 item.AddHealth("","",damage);
9978 return true;
9979 }
9980 }
9981 }
9982 return false;
9983 }
9984
9985 bool DamageItemAttachments(float damage)
9986 {
9987 GameInventory inventory = GetInventory();
9988 int attachment_count = inventory.AttachmentCount();
9989 if (attachment_count > 0)
9990 {
9991 int random_pick = Math.RandomInt(0, attachment_count);
9992 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
9993 if (!attachment.IsExplosive())
9994 {
9995 attachment.AddHealth("","",damage);
9996 return true;
9997 }
9998 }
9999 return false;
10000 }
10001
10002 override bool IsSplitable()
10003 {
10004 return m_CanThisBeSplit;
10005 }
10006 //----------------
10007 override bool CanBeSplit()
10008 {
10009 if (IsSplitable() && (GetQuantity() > 1))
10010 return GetInventory().CanRemoveEntity();
10011
10012 return false;
10013 }
10014
10015 protected bool ShouldSplitQuantity(float quantity)
10016 {
10017 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
10018 if (!IsSplitable())
10019 return false;
10020
10021 // nothing to split?
10022 if (GetQuantity() <= 1)
10023 return false;
10024
10025 // check if we should re-use the item instead of creating a new copy?
10026 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
10027 int delta = GetQuantity() - quantity;
10028 if (delta == 0)
10029 return false;
10030
10031 // valid to split
10032 return true;
10033 }
10034
10035 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10036 {
10037 if (g_Game.IsClient())
10038 {
10039 if (ScriptInputUserData.CanStoreInputUserData())
10040 {
10041 ScriptInputUserData ctx = new ScriptInputUserData;
10043 ctx.Write(1);
10044 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10045 ctx.Write(i1);
10046 ctx.Write(destination_entity);
10047 ctx.Write(true);
10048 ctx.Write(slot_id);
10049 ctx.Send();
10050 }
10051 }
10052 else if (!g_Game.IsMultiplayer())
10053 {
10054 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
10055 }
10056 }
10057
10058 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10059 {
10060 float split_quantity_new;
10061 ItemBase new_item;
10062 float quantity = GetQuantity();
10063 float stack_max = GetTargetQuantityMax(slot_id);
10064 InventoryLocation loc = new InventoryLocation;
10065
10066 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10067 {
10068 if (stack_max <= GetQuantity())
10069 split_quantity_new = stack_max;
10070 else
10071 split_quantity_new = GetQuantity();
10072
10073 if (ShouldSplitQuantity(split_quantity_new))
10074 {
10075 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10076 if (new_item)
10077 {
10078 new_item.SetResultOfSplit(true);
10079 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10080 AddQuantity(-split_quantity_new, false, true);
10081 new_item.SetQuantity(split_quantity_new, false, true);
10082 }
10083 }
10084 }
10085 else if (destination_entity && slot_id == -1)
10086 {
10087 if (quantity > stack_max)
10088 split_quantity_new = stack_max;
10089 else
10090 split_quantity_new = quantity;
10091
10092 if (ShouldSplitQuantity(split_quantity_new))
10093 {
10094 GameInventory destinationInventory = destination_entity.GetInventory();
10095 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10096 {
10097 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10098 new_item = ItemBase.Cast(o);
10099 }
10100
10101 if (new_item)
10102 {
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10105 AddQuantity(-split_quantity_new, false, true);
10106 new_item.SetQuantity(split_quantity_new, false, true);
10107 }
10108 }
10109 }
10110 else
10111 {
10112 if (stack_max != 0)
10113 {
10114 if (stack_max < GetQuantity())
10115 {
10116 split_quantity_new = GetQuantity() - stack_max;
10117 }
10118
10119 if (split_quantity_new == 0)
10120 {
10121 if (!g_Game.IsMultiplayer())
10122 player.PhysicalPredictiveDropItem(this);
10123 else
10124 player.ServerDropEntity(this);
10125 return;
10126 }
10127
10128 if (ShouldSplitQuantity(split_quantity_new))
10129 {
10130 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10131
10132 if (new_item)
10133 {
10134 new_item.SetResultOfSplit(true);
10135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10136 SetQuantity(split_quantity_new, false, true);
10137 new_item.SetQuantity(stack_max, false, true);
10138 new_item.PlaceOnSurface();
10139 }
10140 }
10141 }
10142 }
10143 }
10144
10145 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10146 {
10147 float split_quantity_new;
10148 ItemBase new_item;
10149 float quantity = GetQuantity();
10150 float stack_max = GetTargetQuantityMax(slot_id);
10151 InventoryLocation loc = new InventoryLocation;
10152
10153 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10154 {
10155 if (stack_max <= GetQuantity())
10156 split_quantity_new = stack_max;
10157 else
10158 split_quantity_new = GetQuantity();
10159
10160 if (ShouldSplitQuantity(split_quantity_new))
10161 {
10162 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10163 if (new_item)
10164 {
10165 new_item.SetResultOfSplit(true);
10166 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10167 AddQuantity(-split_quantity_new, false, true);
10168 new_item.SetQuantity(split_quantity_new, false, true);
10169 }
10170 }
10171 }
10172 else if (destination_entity && slot_id == -1)
10173 {
10174 if (quantity > stack_max)
10175 split_quantity_new = stack_max;
10176 else
10177 split_quantity_new = quantity;
10178
10179 if (ShouldSplitQuantity(split_quantity_new))
10180 {
10181 GameInventory destinationInventory = destination_entity.GetInventory();
10182 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10183 {
10184 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10185 new_item = ItemBase.Cast(o);
10186 }
10187
10188 if (new_item)
10189 {
10190 new_item.SetResultOfSplit(true);
10191 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10192 AddQuantity(-split_quantity_new, false, true);
10193 new_item.SetQuantity(split_quantity_new, false, true);
10194 }
10195 }
10196 }
10197 else
10198 {
10199 if (stack_max != 0)
10200 {
10201 if (stack_max < GetQuantity())
10202 {
10203 split_quantity_new = GetQuantity() - stack_max;
10204 }
10205
10206 if (ShouldSplitQuantity(split_quantity_new))
10207 {
10208 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10209
10210 if (new_item)
10211 {
10212 new_item.SetResultOfSplit(true);
10213 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10214 SetQuantity(split_quantity_new, false, true);
10215 new_item.SetQuantity(stack_max, false, true);
10216 new_item.PlaceOnSurface();
10217 }
10218 }
10219 }
10220 }
10221 }
10222
10223 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10224 {
10225 if (g_Game.IsClient())
10226 {
10227 if (ScriptInputUserData.CanStoreInputUserData())
10228 {
10229 ScriptInputUserData ctx = new ScriptInputUserData;
10231 ctx.Write(4);
10232 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10233 ctx.Write(thiz);
10234 dst.WriteToContext(ctx);
10235 ctx.Send();
10236 }
10237 }
10238 else if (!g_Game.IsMultiplayer())
10239 {
10241 }
10242 }
10243
10244 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10245 {
10246 if (g_Game.IsClient())
10247 {
10248 if (ScriptInputUserData.CanStoreInputUserData())
10249 {
10250 ScriptInputUserData ctx = new ScriptInputUserData;
10252 ctx.Write(2);
10253 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10254 ctx.Write(dummy);
10255 ctx.Write(destination_entity);
10256 ctx.Write(true);
10257 ctx.Write(idx);
10258 ctx.Write(row);
10259 ctx.Write(col);
10260 ctx.Send();
10261 }
10262 }
10263 else if (!g_Game.IsMultiplayer())
10264 {
10265 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10266 }
10267 }
10268
10269 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10270 {
10272 }
10273
10274 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10275 {
10276 float quantity = GetQuantity();
10277 float split_quantity_new;
10278 ItemBase new_item;
10279 if (dst.IsValid())
10280 {
10281 int slot_id = dst.GetSlot();
10282 float stack_max = GetTargetQuantityMax(slot_id);
10283
10284 if (quantity > stack_max)
10285 split_quantity_new = stack_max;
10286 else
10287 split_quantity_new = quantity;
10288
10289 if (ShouldSplitQuantity(split_quantity_new))
10290 {
10291 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10292
10293 if (new_item)
10294 {
10295 new_item.SetResultOfSplit(true);
10296 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10297 AddQuantity(-split_quantity_new, false, true);
10298 new_item.SetQuantity(split_quantity_new, false, true);
10299 }
10300
10301 return new_item;
10302 }
10303 }
10304
10305 return null;
10306 }
10307
10308 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10309 {
10310 float quantity = GetQuantity();
10311 float split_quantity_new;
10312 ItemBase new_item;
10313 if (destination_entity)
10314 {
10315 float stackable = GetTargetQuantityMax();
10316 if (quantity > stackable)
10317 split_quantity_new = stackable;
10318 else
10319 split_quantity_new = quantity;
10320
10321 if (ShouldSplitQuantity(split_quantity_new))
10322 {
10323 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10324 if (new_item)
10325 {
10326 new_item.SetResultOfSplit(true);
10327 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10328 AddQuantity(-split_quantity_new, false, true);
10329 new_item.SetQuantity(split_quantity_new, false, true);
10330 }
10331 }
10332 }
10333 }
10334
10335 void SplitIntoStackMaxHandsClient(PlayerBase player)
10336 {
10337 if (g_Game.IsClient())
10338 {
10339 if (ScriptInputUserData.CanStoreInputUserData())
10340 {
10341 ScriptInputUserData ctx = new ScriptInputUserData;
10343 ctx.Write(3);
10344 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10345 ctx.Write(i1);
10346 ItemBase destination_entity = this;
10347 ctx.Write(destination_entity);
10348 ctx.Write(true);
10349 ctx.Write(0);
10350 ctx.Send();
10351 }
10352 }
10353 else if (!g_Game.IsMultiplayer())
10354 {
10355 SplitIntoStackMaxHands(player);
10356 }
10357 }
10358
10359 void SplitIntoStackMaxHands(PlayerBase player)
10360 {
10361 float quantity = GetQuantity();
10362 float split_quantity_new;
10363 ref ItemBase new_item;
10364 if (player)
10365 {
10366 float stackable = GetTargetQuantityMax();
10367 if (quantity > stackable)
10368 split_quantity_new = stackable;
10369 else
10370 split_quantity_new = quantity;
10371
10372 if (ShouldSplitQuantity(split_quantity_new))
10373 {
10374 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10375 new_item = ItemBase.Cast(in_hands);
10376 if (new_item)
10377 {
10378 new_item.SetResultOfSplit(true);
10379 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10380 AddQuantity(-split_quantity_new, false, true);
10381 new_item.SetQuantity(split_quantity_new, false, true);
10382 }
10383 }
10384 }
10385 }
10386
10387 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10388 {
10389 float quantity = GetQuantity();
10390 float split_quantity_new = Math.Floor(quantity * 0.5);
10391
10392 if (!ShouldSplitQuantity(split_quantity_new))
10393 return;
10394
10395 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10396
10397 if (new_item)
10398 {
10399 if (new_item.GetQuantityMax() < split_quantity_new)
10400 {
10401 split_quantity_new = new_item.GetQuantityMax();
10402 }
10403
10404 new_item.SetResultOfSplit(true);
10405 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10406
10407 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10408 {
10409 AddQuantity(-1, false, true);
10410 new_item.SetQuantity(1, false, true);
10411 }
10412 else
10413 {
10414 AddQuantity(-split_quantity_new, false, true);
10415 new_item.SetQuantity(split_quantity_new, false, true);
10416 }
10417 }
10418 }
10419
10420 void SplitItem(PlayerBase player)
10421 {
10422 float quantity = GetQuantity();
10423 float split_quantity_new = Math.Floor(quantity / 2);
10424
10425 if (!ShouldSplitQuantity(split_quantity_new))
10426 return;
10427
10428 InventoryLocation invloc = new InventoryLocation;
10429 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10430
10431 ItemBase new_item;
10432 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10433
10434 if (new_item)
10435 {
10436 if (new_item.GetQuantityMax() < split_quantity_new)
10437 {
10438 split_quantity_new = new_item.GetQuantityMax();
10439 }
10440 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10441 {
10442 AddQuantity(-1, false, true);
10443 new_item.SetQuantity(1, false, true);
10444 }
10445 else if (split_quantity_new > 1)
10446 {
10447 AddQuantity(-split_quantity_new, false, true);
10448 new_item.SetQuantity(split_quantity_new, false, true);
10449 }
10450 }
10451 }
10452
10454 void OnQuantityChanged(float delta)
10455 {
10456 SetWeightDirty();
10457 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10458
10459 if (parent)
10460 parent.OnAttachmentQuantityChangedEx(this, delta);
10461
10462 if (IsLiquidContainer())
10463 {
10464 if (GetQuantityNormalized() <= 0.0)
10465 {
10467 }
10468 else if (GetLiquidType() == LIQUID_NONE)
10469 {
10470 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10472 }
10473 }
10474 }
10475
10478 {
10479 // insert code here
10480 }
10481
10483 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10484 {
10486 }
10487
10488 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10489 {
10490 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10491
10492 if (g_Game.IsServer())
10493 {
10494 if (newLevel == GameConstants.STATE_RUINED)
10495 {
10497 EntityAI parent = GetHierarchyParent();
10498 if (parent && parent.IsFireplace())
10499 {
10500 CargoBase cargo = GetInventory().GetCargo();
10501 if (cargo)
10502 {
10503 for (int i = 0; i < cargo.GetItemCount(); ++i)
10504 {
10505 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10506 }
10507 }
10508 }
10509 }
10510
10511 if (IsResultOfSplit())
10512 {
10513 // reset the splitting result flag, return to normal item behavior
10514 SetResultOfSplit(false);
10515 return;
10516 }
10517
10518 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10519 {
10520 SetCleanness(0);//unclean the item upon damage dealt
10521 }
10522 }
10523 }
10524
10525 // just the split? TODO: verify
10526 override void OnRightClick()
10527 {
10528 super.OnRightClick();
10529
10530 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
10531 {
10532 if (g_Game.IsClient())
10533 {
10534 if (ScriptInputUserData.CanStoreInputUserData())
10535 {
10536 EntityAI root = GetHierarchyRoot();
10537 Man playerOwner = GetHierarchyRootPlayer();
10538 InventoryLocation dst = new InventoryLocation;
10539
10540 // If we have no hierarchy root player and the root is the same as this item the source item is in the vicinity so we want to create the new split item there also
10541 if (!playerOwner && root && root == this)
10542 {
10544 }
10545 else
10546 {
10547 // Check if we can place the new split item in the same parent where the source item is placed in or otherwise drop it in vicinity
10548 GetInventory().GetCurrentInventoryLocation(dst);
10549 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
10550 {
10551 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10552 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
10553 {
10555 }
10556 else
10557 {
10558 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10559 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10560 this shouldnt cause issues within this scope*/
10561 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10562 {
10564 }
10565 else
10566 {
10567 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10568 }
10569 }
10570 }
10571 }
10572
10573 ScriptInputUserData ctx = new ScriptInputUserData;
10575 ctx.Write(4);
10576 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10577 ctx.Write(thiz);
10578 dst.WriteToContext(ctx);
10579 ctx.Write(true); // dummy
10580 ctx.Send();
10581 }
10582 }
10583 else if (!g_Game.IsMultiplayer())
10584 {
10585 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
10586 }
10587 }
10588 }
10589
10590 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
10591 {
10592 if (root)
10593 {
10594 vector m4[4];
10595 root.GetTransform(m4);
10596 dst.SetGround(this, m4);
10597 }
10598 else
10599 {
10600 GetInventory().GetCurrentInventoryLocation(dst);
10601 }
10602 }
10603
10604 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10605 {
10606 //TODO: delete check zero quantity check after fix double posts hands fsm events
10607 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10608 return false;
10609
10610 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10611 return false;
10612
10613 //can_this_be_combined = ConfigGetBool("canBeSplit");
10615 return false;
10616
10617
10618 Magazine mag = Magazine.Cast(this);
10619 if (mag)
10620 {
10621 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10622 return false;
10623
10624 if (stack_max_limit)
10625 {
10626 Magazine other_mag = Magazine.Cast(other_item);
10627 if (other_item)
10628 {
10629 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10630 return false;
10631 }
10632
10633 }
10634 }
10635 else
10636 {
10637 //TODO: delete check zero quantity check after fix double posts hands fsm events
10638 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10639 return false;
10640
10641 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10642 return false;
10643 }
10644
10645 PlayerBase player = null;
10646 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10647 {
10648 if (player.GetInventory().HasAttachment(this))
10649 return false;
10650
10651 if (player.IsItemsToDelete())
10652 return false;
10653 }
10654
10655 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10656 return false;
10657
10658 int slotID;
10659 string slotName;
10660 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10661 return false;
10662
10663 return true;
10664 }
10665
10666 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10667 {
10668 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10669 }
10670
10671 bool IsResultOfSplit()
10672 {
10673 return m_IsResultOfSplit;
10674 }
10675
10676 void SetResultOfSplit(bool value)
10677 {
10678 m_IsResultOfSplit = value;
10679 }
10680
10681 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10682 {
10683 return ComputeQuantityUsedEx(other_item, use_stack_max);
10684 }
10685
10686 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10687 {
10688 float other_item_quantity = other_item.GetQuantity();
10689 float this_free_space;
10690
10691 float stack_max = GetQuantityMax();
10692
10693 this_free_space = stack_max - GetQuantity();
10694
10695 if (other_item_quantity > this_free_space)
10696 {
10697 return this_free_space;
10698 }
10699 else
10700 {
10701 return other_item_quantity;
10702 }
10703 }
10704
10705 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10706 {
10707 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10708 }
10709
10710 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10711 {
10712 if (!CanBeCombined(other_item, false))
10713 return;
10714
10715 if (!IsMagazine() && other_item)
10716 {
10717 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10718 if (quantity_used != 0)
10719 {
10720 float hp1 = GetHealth01("","");
10721 float hp2 = other_item.GetHealth01("","");
10722 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10723 hpResult = hpResult / (GetQuantity() + quantity_used);
10724
10725 hpResult *= GetMaxHealth();
10726 Math.Round(hpResult);
10727 SetHealth("", "Health", hpResult);
10728
10729 AddQuantity(quantity_used);
10730 other_item.AddQuantity(-quantity_used);
10731 }
10732 }
10733 OnCombine(other_item);
10734 }
10735
10736 void OnCombine(ItemBase other_item)
10737 {
10738 #ifdef SERVER
10739 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10740 GetHierarchyParent().IncreaseLifetimeUp();
10741 #endif
10742 };
10743
10744 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10745 {
10746 PlayerBase p = PlayerBase.Cast(player);
10747
10748 array<int> recipesIds = p.m_Recipes;
10749 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10750 if (moduleRecipesManager)
10751 {
10752 EntityAI itemInHands = player.GetEntityInHands();
10753 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10754 }
10755
10756 for (int i = 0;i < recipesIds.Count(); i++)
10757 {
10758 int key = recipesIds.Get(i);
10759 string recipeName = moduleRecipesManager.GetRecipeName(key);
10760 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10761 }
10762 }
10763
10764 // -------------------------------------------------------------------------
10765 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10766 {
10767 super.GetDebugActions(outputList);
10768
10769 //quantity
10770 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10771 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10772 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10773 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10774 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10775
10776 //health
10777 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10778 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10779 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10780 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10781 //temperature
10782 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10783 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10784 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10785 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10786
10787 //wet
10788 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10789 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10790 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10791
10792 //liquidtype
10793 if (IsLiquidContainer())
10794 {
10795 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10796 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10797 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10798 }
10799
10800 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10801 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10802
10803 // watch
10804 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10805 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10806 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10807
10808 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10809
10810 InventoryLocation loc = new InventoryLocation();
10811 GetInventory().GetCurrentInventoryLocation(loc);
10812 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
10813 {
10814 if (Gizmo_IsSupported())
10815 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
10816 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
10817 }
10818
10819 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10820 }
10821
10822 // -------------------------------------------------------------------------
10823 // -------------------------------------------------------------------------
10824 // -------------------------------------------------------------------------
10825 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10826 {
10827 super.OnAction(action_id, player, ctx);
10828
10829 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
10830 {
10831 switch (action_id)
10832 {
10833 case EActions.GIZMO_OBJECT:
10834 if (GetGizmoApi())
10835 GetGizmoApi().SelectObject(this);
10836 return true;
10837 case EActions.GIZMO_PHYSICS:
10838 if (GetGizmoApi())
10839 GetGizmoApi().SelectPhysics(GetPhysics());
10840 return true;
10841 }
10842 }
10843
10844 if (g_Game.IsServer())
10845 {
10846 switch (action_id)
10847 {
10848 case EActions.DELETE:
10849 Delete();
10850 return true;
10851 }
10852 }
10853
10854 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10855 {
10856 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10857 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10858 PlayerBase p = PlayerBase.Cast(player);
10859 if (EActions.RECIPES_RANGE_START < 1000)
10860 {
10861 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10862 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10863 }
10864 }
10865 #ifndef SERVER
10866 else if (action_id == EActions.WATCH_PLAYER)
10867 {
10868 PluginDeveloper.SetDeveloperItemClientEx(player);
10869 }
10870 #endif
10871 if (g_Game.IsServer())
10872 {
10873 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10874 {
10875 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10876 OnDebugButtonPressServer(id + 1);
10877 }
10878
10879 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10880 {
10881 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10882 InsertAgent(agent_id,100);
10883 }
10884
10885 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10886 {
10887 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10888 RemoveAgent(agent_id2);
10889 }
10890
10891 else if (action_id == EActions.ADD_QUANTITY)
10892 {
10893 if (IsMagazine())
10894 {
10895 Magazine mag = Magazine.Cast(this);
10896 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10897 }
10898 else
10899 {
10900 AddQuantity(GetQuantityMax() * 0.2);
10901 }
10902
10903 if (m_EM)
10904 {
10905 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10906 }
10907 //PrintVariables();
10908 }
10909
10910 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10911 {
10912 if (IsMagazine())
10913 {
10914 Magazine mag2 = Magazine.Cast(this);
10915 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10916 }
10917 else
10918 {
10919 AddQuantity(- GetQuantityMax() * 0.2);
10920 }
10921 if (m_EM)
10922 {
10923 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10924 }
10925 //PrintVariables();
10926 }
10927
10928 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10929 {
10930 SetQuantity(0);
10931
10932 if (m_EM)
10933 {
10934 m_EM.SetEnergy(0);
10935 }
10936 }
10937
10938 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10939 {
10941
10942 if (m_EM)
10943 {
10944 m_EM.SetEnergy(m_EM.GetEnergyMax());
10945 }
10946 }
10947
10948 else if (action_id == EActions.ADD_HEALTH)
10949 {
10950 AddHealth("","",GetMaxHealth("","Health")/5);
10951 }
10952 else if (action_id == EActions.REMOVE_HEALTH)
10953 {
10954 AddHealth("","",-GetMaxHealth("","Health")/5);
10955 }
10956 else if (action_id == EActions.DESTROY_HEALTH)
10957 {
10958 SetHealth01("","",0);
10959 }
10960 else if (action_id == EActions.WATCH_ITEM)
10961 {
10963 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
10964 #ifdef DEVELOPER
10965 SetDebugDeveloper_item(this);
10966 #endif
10967 }
10968
10969 else if (action_id == EActions.ADD_TEMPERATURE)
10970 {
10971 AddTemperature(20);
10972 //PrintVariables();
10973 }
10974
10975 else if (action_id == EActions.REMOVE_TEMPERATURE)
10976 {
10977 AddTemperature(-20);
10978 //PrintVariables();
10979 }
10980
10981 else if (action_id == EActions.FLIP_FROZEN)
10982 {
10983 SetFrozen(!GetIsFrozen());
10984 //PrintVariables();
10985 }
10986
10987 else if (action_id == EActions.ADD_WETNESS)
10988 {
10989 AddWet(GetWetMax()/5);
10990 //PrintVariables();
10991 }
10992
10993 else if (action_id == EActions.REMOVE_WETNESS)
10994 {
10995 AddWet(-GetWetMax()/5);
10996 //PrintVariables();
10997 }
10998
10999 else if (action_id == EActions.LIQUIDTYPE_UP)
11000 {
11001 int curr_type = GetLiquidType();
11002 SetLiquidType(curr_type * 2);
11003 //AddWet(1);
11004 //PrintVariables();
11005 }
11006
11007 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11008 {
11009 int curr_type2 = GetLiquidType();
11010 SetLiquidType(curr_type2 / 2);
11011 }
11012
11013 else if (action_id == EActions.MAKE_SPECIAL)
11014 {
11015 auto debugParams = DebugSpawnParams.WithPlayer(player);
11016 OnDebugSpawnEx(debugParams);
11017 }
11018
11019 }
11020
11021
11022 return false;
11023 }
11024
11025 // -------------------------------------------------------------------------
11026
11027
11030 void OnActivatedByTripWire();
11031
11033 void OnActivatedByItem(notnull ItemBase item);
11034
11035 //----------------------------------------------------------------
11036 //returns true if item is able to explode when put in fire
11037 bool CanExplodeInFire()
11038 {
11039 return false;
11040 }
11041
11042 //----------------------------------------------------------------
11043 bool CanEat()
11044 {
11045 return true;
11046 }
11047
11048 //----------------------------------------------------------------
11049 override bool IsIgnoredByConstruction()
11050 {
11051 return true;
11052 }
11053
11054 //----------------------------------------------------------------
11055 //has FoodStages in config?
11056 bool HasFoodStage()
11057 {
11058 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11059 return g_Game.ConfigIsExisting(config_path);
11060 }
11061
11063 FoodStage GetFoodStage()
11064 {
11065 return null;
11066 }
11067
11068 bool CanBeCooked()
11069 {
11070 return false;
11071 }
11072
11073 bool CanBeCookedOnStick()
11074 {
11075 return false;
11076 }
11077
11079 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11081
11082 //----------------------------------------------------------------
11083 bool CanRepair(ItemBase item_repair_kit)
11084 {
11085 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11086 return module_repairing.CanRepair(this, item_repair_kit);
11087 }
11088
11089 //----------------------------------------------------------------
11090 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11091 {
11092 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11093 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11094 }
11095
11096 //----------------------------------------------------------------
11097 int GetItemSize()
11098 {
11099 /*
11100 vector v_size = this.ConfigGetVector("itemSize");
11101 int v_size_x = v_size[0];
11102 int v_size_y = v_size[1];
11103 int size = v_size_x * v_size_y;
11104 return size;
11105 */
11106
11107 return 1;
11108 }
11109
11110 //----------------------------------------------------------------
11111 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11112 bool CanBeMovedOverride()
11113 {
11114 return m_CanBeMovedOverride;
11115 }
11116
11117 //----------------------------------------------------------------
11118 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11119 void SetCanBeMovedOverride(bool setting)
11120 {
11121 m_CanBeMovedOverride = setting;
11122 }
11123
11124 //----------------------------------------------------------------
11132 void MessageToOwnerStatus(string text)
11133 {
11134 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11135
11136 if (player)
11137 {
11138 player.MessageStatus(text);
11139 }
11140 }
11141
11142 //----------------------------------------------------------------
11150 void MessageToOwnerAction(string text)
11151 {
11152 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11153
11154 if (player)
11155 {
11156 player.MessageAction(text);
11157 }
11158 }
11159
11160 //----------------------------------------------------------------
11168 void MessageToOwnerFriendly(string text)
11169 {
11170 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11171
11172 if (player)
11173 {
11174 player.MessageFriendly(text);
11175 }
11176 }
11177
11178 //----------------------------------------------------------------
11186 void MessageToOwnerImportant(string text)
11187 {
11188 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11189
11190 if (player)
11191 {
11192 player.MessageImportant(text);
11193 }
11194 }
11195
11196 override bool IsItemBase()
11197 {
11198 return true;
11199 }
11200
11201 // Checks if item is of questioned kind
11202 override bool KindOf(string tag)
11203 {
11204 bool found = false;
11205 string item_name = this.GetType();
11206 ref TStringArray item_tag_array = new TStringArray;
11207 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11208
11209 int array_size = item_tag_array.Count();
11210 for (int i = 0; i < array_size; i++)
11211 {
11212 if (item_tag_array.Get(i) == tag)
11213 {
11214 found = true;
11215 break;
11216 }
11217 }
11218 return found;
11219 }
11220
11221
11222 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11223 {
11224 //Debug.Log("OnRPC called");
11225 super.OnRPC(sender, rpc_type,ctx);
11226
11227 //Play soundset for attachment locking (ActionLockAttachment.c)
11228 switch (rpc_type)
11229 {
11230 #ifndef SERVER
11231 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11232 Param2<bool, string> p = new Param2<bool, string>(false, "");
11233
11234 if (!ctx.Read(p))
11235 return;
11236
11237 bool play = p.param1;
11238 string soundSet = p.param2;
11239
11240 if (play)
11241 {
11242 if (m_LockingSound)
11243 {
11245 {
11246 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11247 }
11248 }
11249 else
11250 {
11251 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11252 }
11253 }
11254 else
11255 {
11256 SEffectManager.DestroyEffect(m_LockingSound);
11257 }
11258
11259 break;
11260 #endif
11261
11262 }
11263
11264 if (GetWrittenNoteData())
11265 {
11266 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11267 }
11268 }
11269
11270 //-----------------------------
11271 // VARIABLE MANIPULATION SYSTEM
11272 //-----------------------------
11273 int NameToID(string name)
11274 {
11275 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11276 return plugin.GetID(name);
11277 }
11278
11279 string IDToName(int id)
11280 {
11281 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11282 return plugin.GetName(id);
11283 }
11284
11286 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11287 {
11288 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11289 //read the flags
11290 int varFlags;
11291 if (!ctx.Read(varFlags))
11292 return;
11293
11294 if (varFlags & ItemVariableFlags.FLOAT)
11295 {
11296 ReadVarsFromCTX(ctx);
11297 }
11298 }
11299
11300 override void SerializeNumericalVars(array<float> floats_out)
11301 {
11302 //some variables handled on EntityAI level already!
11303 super.SerializeNumericalVars(floats_out);
11304
11305 // the order of serialization must be the same as the order of de-serialization
11306 //--------------------------------------------
11307 if (IsVariableSet(VARIABLE_QUANTITY))
11308 {
11309 floats_out.Insert(m_VarQuantity);
11310 }
11311 //--------------------------------------------
11312 if (IsVariableSet(VARIABLE_WET))
11313 {
11314 floats_out.Insert(m_VarWet);
11315 }
11316 //--------------------------------------------
11317 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11318 {
11319 floats_out.Insert(m_VarLiquidType);
11320 }
11321 //--------------------------------------------
11322 if (IsVariableSet(VARIABLE_COLOR))
11323 {
11324 floats_out.Insert(m_ColorComponentR);
11325 floats_out.Insert(m_ColorComponentG);
11326 floats_out.Insert(m_ColorComponentB);
11327 floats_out.Insert(m_ColorComponentA);
11328 }
11329 //--------------------------------------------
11330 if (IsVariableSet(VARIABLE_CLEANNESS))
11331 {
11332 floats_out.Insert(m_Cleanness);
11333 }
11334 }
11335
11336 override void DeSerializeNumericalVars(array<float> floats)
11337 {
11338 //some variables handled on EntityAI level already!
11339 super.DeSerializeNumericalVars(floats);
11340
11341 // the order of serialization must be the same as the order of de-serialization
11342 int index = 0;
11343 int mask = Math.Round(floats.Get(index));
11344
11345 index++;
11346 //--------------------------------------------
11347 if (mask & VARIABLE_QUANTITY)
11348 {
11349 if (m_IsStoreLoad)
11350 {
11351 SetStoreLoadedQuantity(floats.Get(index));
11352 }
11353 else
11354 {
11355 float quantity = floats.Get(index);
11356 SetQuantity(quantity, true, false, false, false);
11357 }
11358 index++;
11359 }
11360 //--------------------------------------------
11361 if (mask & VARIABLE_WET)
11362 {
11363 float wet = floats.Get(index);
11364 SetWet(wet);
11365 index++;
11366 }
11367 //--------------------------------------------
11368 if (mask & VARIABLE_LIQUIDTYPE)
11369 {
11370 int liquidtype = Math.Round(floats.Get(index));
11371 SetLiquidType(liquidtype);
11372 index++;
11373 }
11374 //--------------------------------------------
11375 if (mask & VARIABLE_COLOR)
11376 {
11377 m_ColorComponentR = Math.Round(floats.Get(index));
11378 index++;
11379 m_ColorComponentG = Math.Round(floats.Get(index));
11380 index++;
11381 m_ColorComponentB = Math.Round(floats.Get(index));
11382 index++;
11383 m_ColorComponentA = Math.Round(floats.Get(index));
11384 index++;
11385 }
11386 //--------------------------------------------
11387 if (mask & VARIABLE_CLEANNESS)
11388 {
11389 int cleanness = Math.Round(floats.Get(index));
11390 SetCleanness(cleanness);
11391 index++;
11392 }
11393 }
11394
11395 override void WriteVarsToCTX(ParamsWriteContext ctx)
11396 {
11397 super.WriteVarsToCTX(ctx);
11398
11399 //--------------------------------------------
11400 if (IsVariableSet(VARIABLE_QUANTITY))
11401 {
11402 ctx.Write(GetQuantity());
11403 }
11404 //--------------------------------------------
11405 if (IsVariableSet(VARIABLE_WET))
11406 {
11407 ctx.Write(GetWet());
11408 }
11409 //--------------------------------------------
11410 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11411 {
11412 ctx.Write(GetLiquidType());
11413 }
11414 //--------------------------------------------
11415 if (IsVariableSet(VARIABLE_COLOR))
11416 {
11417 int r,g,b,a;
11418 GetColor(r,g,b,a);
11419 ctx.Write(r);
11420 ctx.Write(g);
11421 ctx.Write(b);
11422 ctx.Write(a);
11423 }
11424 //--------------------------------------------
11425 if (IsVariableSet(VARIABLE_CLEANNESS))
11426 {
11427 ctx.Write(GetCleanness());
11428 }
11429 }
11430
11431 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11432 {
11433 if (!super.ReadVarsFromCTX(ctx,version))
11434 return false;
11435
11436 int intValue;
11437 float value;
11438
11439 if (version < 140)
11440 {
11441 if (!ctx.Read(intValue))
11442 return false;
11443
11444 m_VariablesMask = intValue;
11445 }
11446
11447 if (m_VariablesMask & VARIABLE_QUANTITY)
11448 {
11449 if (!ctx.Read(value))
11450 return false;
11451
11452 if (IsStoreLoad())
11453 {
11455 }
11456 else
11457 {
11458 SetQuantity(value, true, false, false, false);
11459 }
11460 }
11461 //--------------------------------------------
11462 if (version < 140)
11463 {
11464 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11465 {
11466 if (!ctx.Read(value))
11467 return false;
11468 SetTemperatureDirect(value);
11469 }
11470 }
11471 //--------------------------------------------
11472 if (m_VariablesMask & VARIABLE_WET)
11473 {
11474 if (!ctx.Read(value))
11475 return false;
11476 SetWet(value);
11477 }
11478 //--------------------------------------------
11479 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11480 {
11481 if (!ctx.Read(intValue))
11482 return false;
11483 SetLiquidType(intValue);
11484 }
11485 //--------------------------------------------
11486 if (m_VariablesMask & VARIABLE_COLOR)
11487 {
11488 int r,g,b,a;
11489 if (!ctx.Read(r))
11490 return false;
11491 if (!ctx.Read(g))
11492 return false;
11493 if (!ctx.Read(b))
11494 return false;
11495 if (!ctx.Read(a))
11496 return false;
11497
11498 SetColor(r,g,b,a);
11499 }
11500 //--------------------------------------------
11501 if (m_VariablesMask & VARIABLE_CLEANNESS)
11502 {
11503 if (!ctx.Read(intValue))
11504 return false;
11505 SetCleanness(intValue);
11506 }
11507 //--------------------------------------------
11508 if (version >= 138 && version < 140)
11509 {
11510 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11511 {
11512 if (!ctx.Read(intValue))
11513 return false;
11514 SetFrozen(intValue);
11515 }
11516 }
11517
11518 return true;
11519 }
11520
11521 //----------------------------------------------------------------
11522 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11523 {
11524 m_IsStoreLoad = true;
11526 {
11527 m_FixDamageSystemInit = true;
11528 }
11529
11530 if (!super.OnStoreLoad(ctx, version))
11531 {
11532 m_IsStoreLoad = false;
11533 return false;
11534 }
11535
11536 if (version >= 114)
11537 {
11538 bool hasQuickBarIndexSaved;
11539
11540 if (!ctx.Read(hasQuickBarIndexSaved))
11541 {
11542 m_IsStoreLoad = false;
11543 return false;
11544 }
11545
11546 if (hasQuickBarIndexSaved)
11547 {
11548 int itmQBIndex;
11549
11550 //Load quickbar item bind
11551 if (!ctx.Read(itmQBIndex))
11552 {
11553 m_IsStoreLoad = false;
11554 return false;
11555 }
11556
11557 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11558 if (itmQBIndex != -1 && parentPlayer)
11559 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11560 }
11561 }
11562 else
11563 {
11564 // Backup of how it used to be
11565 PlayerBase player;
11566 int itemQBIndex;
11567 if (version == int.MAX)
11568 {
11569 if (!ctx.Read(itemQBIndex))
11570 {
11571 m_IsStoreLoad = false;
11572 return false;
11573 }
11574 }
11575 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11576 {
11577 //Load quickbar item bind
11578 if (!ctx.Read(itemQBIndex))
11579 {
11580 m_IsStoreLoad = false;
11581 return false;
11582 }
11583 if (itemQBIndex != -1 && player)
11584 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11585 }
11586 }
11587
11588 if (version < 140)
11589 {
11590 // variable management system
11591 if (!LoadVariables(ctx, version))
11592 {
11593 m_IsStoreLoad = false;
11594 return false;
11595 }
11596 }
11597
11598 //agent trasmission system
11599 if (!LoadAgents(ctx, version))
11600 {
11601 m_IsStoreLoad = false;
11602 return false;
11603 }
11604 if (version >= 132)
11605 {
11606 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11607 if (raib)
11608 {
11609 if (!raib.OnStoreLoad(ctx,version))
11610 {
11611 m_IsStoreLoad = false;
11612 return false;
11613 }
11614 }
11615 }
11616
11617 m_IsStoreLoad = false;
11618 return true;
11619 }
11620
11621 //----------------------------------------------------------------
11622
11623 override void OnStoreSave(ParamsWriteContext ctx)
11624 {
11625 super.OnStoreSave(ctx);
11626
11627 PlayerBase player;
11628 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11629 {
11630 ctx.Write(true); // Keep track of if we should actually read this in or not
11631 //Save quickbar item bind
11632 int itemQBIndex = -1;
11633 itemQBIndex = player.FindQuickBarEntityIndex(this);
11634 ctx.Write(itemQBIndex);
11635 }
11636 else
11637 {
11638 ctx.Write(false); // Keep track of if we should actually read this in or not
11639 }
11640
11641 SaveAgents(ctx);//agent trasmission system
11642
11643 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11644 if (raib)
11645 {
11646 raib.OnStoreSave(ctx);
11647 }
11648 }
11649 //----------------------------------------------------------------
11650
11651 override void AfterStoreLoad()
11652 {
11653 super.AfterStoreLoad();
11654
11656 {
11658 }
11659
11660 if (GetStoreLoadedQuantity() != float.LOWEST)
11661 {
11663 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
11664 }
11665 }
11666
11667 override void EEOnAfterLoad()
11668 {
11669 super.EEOnAfterLoad();
11670
11672 {
11673 m_FixDamageSystemInit = false;
11674 }
11675
11678 }
11679
11680 bool CanBeDisinfected()
11681 {
11682 return false;
11683 }
11684
11685
11686 //----------------------------------------------------------------
11687 override void OnVariablesSynchronized()
11688 {
11689 if (m_Initialized)
11690 {
11691 #ifdef PLATFORM_CONSOLE
11692 //bruteforce it is
11693 if (IsSplitable())
11694 {
11695 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
11696 if (menu)
11697 {
11698 menu.Refresh();
11699 }
11700 }
11701 #endif
11702 }
11703
11705 {
11706 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11707 m_WantPlayImpactSound = false;
11708 }
11709
11711 {
11712 SetWeightDirty();
11714 }
11715 if (m_VarWet != m_VarWetPrev)
11716 {
11719 }
11720
11721 if (m_SoundSyncPlay != 0)
11722 {
11725
11726 m_SoundSyncPlay = 0;
11727 m_SoundSyncSlotID = -1;
11728 }
11729 if (m_SoundSyncStop != 0)
11730 {
11732 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11733 m_SoundSyncStop = 0;
11734 }
11735
11736 super.OnVariablesSynchronized();
11737 }
11738
11739 //------------------------- Quantity
11740 //----------------------------------------------------------------
11742 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11743 {
11744 if (!IsServerCheck(allow_client))
11745 return false;
11746
11747 if (!HasQuantity())
11748 return false;
11749
11750 float min = GetQuantityMin();
11751 float max = GetQuantityMax();
11752
11753 if (value <= (min + 0.001))
11754 value = min;
11755
11756 if (value == min)
11757 {
11758 if (destroy_config)
11759 {
11760 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11761 if (dstr)
11762 {
11763 m_VarQuantity = Math.Clamp(value, min, max);
11764 this.Delete();
11765 return true;
11766 }
11767 }
11768 else if (destroy_forced)
11769 {
11770 m_VarQuantity = Math.Clamp(value, min, max);
11771 this.Delete();
11772 return true;
11773 }
11774 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11775 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11776 }
11777
11778 float delta = m_VarQuantity;
11779 m_VarQuantity = Math.Clamp(value, min, max);
11780
11781 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
11782 {
11783 EntityAI parent = GetHierarchyRoot();
11784 InventoryLocation iLoc = new InventoryLocation();
11785 GetInventory().GetCurrentInventoryLocation(iLoc);
11786 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
11787 {
11788 int iLocSlot = iLoc.GetSlot();
11789 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
11790 {
11791 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
11792 }
11793 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
11794 {
11795 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
11796 }
11797 }
11798 }
11799
11800 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11801 {
11802 delta = m_VarQuantity - delta;
11803
11804 if (delta)
11805 OnQuantityChanged(delta);
11806 }
11807
11808 SetVariableMask(VARIABLE_QUANTITY);
11809
11810 return false;
11811 }
11812
11813 //----------------------------------------------------------------
11815 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11816 {
11817 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11818 }
11819 //----------------------------------------------------------------
11820 void SetQuantityMax()
11821 {
11822 float max = GetQuantityMax();
11823 SetQuantity(max);
11824 }
11825
11826 override void SetQuantityToMinimum()
11827 {
11828 float min = GetQuantityMin();
11829 SetQuantity(min);
11830 }
11831 //----------------------------------------------------------------
11833 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11834 {
11835 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11836 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11837 SetQuantity(result, destroy_config, destroy_forced);
11838 }
11839
11840 //----------------------------------------------------------------
11842 override float GetQuantityNormalized()
11843 {
11844 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11845 }
11846
11848 {
11849 return GetQuantityNormalized();
11850 }
11851
11852 /*void SetAmmoNormalized(float value)
11853 {
11854 float value_clamped = Math.Clamp(value, 0, 1);
11855 Magazine this_mag = Magazine.Cast(this);
11856 int max_rounds = this_mag.GetAmmoMax();
11857 int result = value * max_rounds;//can the rounded if higher precision is required
11858 this_mag.SetAmmoCount(result);
11859 }*/
11860 //----------------------------------------------------------------
11861 override int GetQuantityMax()
11862 {
11863 int slot = -1;
11864 GameInventory inventory = GetInventory();
11865 if (inventory)
11866 {
11867 InventoryLocation il = new InventoryLocation;
11868 inventory.GetCurrentInventoryLocation(il);
11869 slot = il.GetSlot();
11870 }
11871
11872 return GetTargetQuantityMax(slot);
11873 }
11874
11875 override int GetTargetQuantityMax(int attSlotID = -1)
11876 {
11877 float quantity_max = 0;
11878
11879 if (IsSplitable()) //only stackable/splitable items can check for stack size
11880 {
11881 if (attSlotID != -1)
11882 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11883
11884 if (quantity_max <= 0)
11885 quantity_max = m_VarStackMax;
11886 }
11887
11888 if (quantity_max <= 0)
11889 quantity_max = m_VarQuantityMax;
11890
11891 return quantity_max;
11892 }
11893 //----------------------------------------------------------------
11894 override int GetQuantityMin()
11895 {
11896 return m_VarQuantityMin;
11897 }
11898 //----------------------------------------------------------------
11899 int GetQuantityInit()
11900 {
11901 return m_VarQuantityInit;
11902 }
11903
11904 //----------------------------------------------------------------
11905 override bool HasQuantity()
11906 {
11907 return !(GetQuantityMax() - GetQuantityMin() == 0);
11908 }
11909
11910 override float GetQuantity()
11911 {
11912 return m_VarQuantity;
11913 }
11914
11915 bool IsFullQuantity()
11916 {
11917 return GetQuantity() >= GetQuantityMax();
11918 }
11919
11920 //Calculates weight of single item without attachments and cargo
11921 override float GetSingleInventoryItemWeightEx()
11922 {
11923 //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
11924 float weightEx = GetWeightEx();//overall weight of the item
11925 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11926 return weightEx - special;
11927 }
11928
11929 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11931 {
11933 }
11934
11935 override protected float GetWeightSpecialized(bool forceRecalc = false)
11936 {
11937 if (IsSplitable()) //quantity determines size of the stack
11938 {
11939 #ifdef DEVELOPER
11940 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11941 {
11942 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11943 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
11944 }
11945 #endif
11946
11947 return GetQuantity() * GetConfigWeightModified();
11948 }
11949 else if (HasEnergyManager())// items with energy manager
11950 {
11951 #ifdef DEVELOPER
11952 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11953 {
11954 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11955 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
11956 }
11957 #endif
11958 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11959 }
11960 else//everything else
11961 {
11962 #ifdef DEVELOPER
11963 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11964 {
11965 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11966 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
11967 }
11968 #endif
11969 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11970 }
11971 }
11972
11974 int GetNumberOfItems()
11975 {
11976 int item_count = 0;
11977 ItemBase item;
11978
11979 GameInventory inventory = GetInventory();
11980 CargoBase cargo = inventory.GetCargo();
11981 if (cargo != NULL)
11982 {
11983 item_count = cargo.GetItemCount();
11984 }
11985
11986 int nAttachments = inventory.AttachmentCount();
11987 for (int i = 0; i < nAttachments; ++i)
11988 {
11989 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
11990 if (item)
11991 item_count += item.GetNumberOfItems();
11992 }
11993 return item_count;
11994 }
11995
11997 float GetUnitWeight(bool include_wetness = true)
11998 {
11999 float weight = 0;
12000 float wetness = 1;
12001 if (include_wetness)
12002 wetness += GetWet();
12003 if (IsSplitable()) //quantity determines size of the stack
12004 {
12005 weight = wetness * m_ConfigWeight;
12006 }
12007 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12008 {
12009 weight = 1;
12010 }
12011 return weight;
12012 }
12013
12014 //-----------------------------------------------------------------
12015
12016 override void ClearInventory()
12017 {
12018 GameInventory inventory = GetInventory();
12019 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
12020 {
12021 array<EntityAI> items = new array<EntityAI>;
12022 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
12023 for (int i = 0; i < items.Count(); ++i)
12024 {
12025 ItemBase item = ItemBase.Cast(items.Get(i));
12026 if (item)
12027 {
12028 g_Game.ObjectDelete(item);
12029 }
12030 }
12031 }
12032 }
12033
12034 //------------------------- Energy
12035
12036 //----------------------------------------------------------------
12037 float GetEnergy()
12038 {
12039 float energy = 0;
12040 if (HasEnergyManager())
12041 {
12042 energy = GetCompEM().GetEnergy();
12043 }
12044 return energy;
12045 }
12046
12047
12048 override void OnEnergyConsumed()
12049 {
12050 super.OnEnergyConsumed();
12051
12053 }
12054
12055 override void OnEnergyAdded()
12056 {
12057 super.OnEnergyAdded();
12058
12060 }
12061
12062 // Converts energy (from Energy Manager) to quantity, if enabled.
12064 {
12065 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12066 {
12067 if (HasQuantity())
12068 {
12069 float energy_0to1 = GetCompEM().GetEnergy0To1();
12070 SetQuantityNormalized(energy_0to1);
12071 }
12072 }
12073 }
12074
12075 //----------------------------------------------------------------
12076 float GetHeatIsolationInit()
12077 {
12078 return ConfigGetFloat("heatIsolation");
12079 }
12080
12081 float GetHeatIsolation()
12082 {
12083 return m_HeatIsolation;
12084 }
12085
12086 float GetDryingIncrement(string pIncrementName)
12087 {
12088 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12089 if (g_Game.ConfigIsExisting(paramPath))
12090 return g_Game.ConfigGetFloat(paramPath);
12091
12092 return 0.0;
12093 }
12094
12095 float GetSoakingIncrement(string pIncrementName)
12096 {
12097 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12098 if (g_Game.ConfigIsExisting(paramPath))
12099 return g_Game.ConfigGetFloat(paramPath);
12100
12101 return 0.0;
12102 }
12103 //----------------------------------------------------------------
12104 override void SetWet(float value, bool allow_client = false)
12105 {
12106 if (!IsServerCheck(allow_client))
12107 return;
12108
12109 float min = GetWetMin();
12110 float max = GetWetMax();
12111
12112 float previousValue = m_VarWet;
12113
12114 m_VarWet = Math.Clamp(value, min, max);
12115
12116 if (previousValue != m_VarWet)
12117 {
12118 SetVariableMask(VARIABLE_WET);
12119 OnWetChanged(m_VarWet, previousValue);
12120 }
12121 }
12122 //----------------------------------------------------------------
12123 override void AddWet(float value)
12124 {
12125 SetWet(GetWet() + value);
12126 }
12127 //----------------------------------------------------------------
12128 override void SetWetMax()
12129 {
12131 }
12132 //----------------------------------------------------------------
12133 override float GetWet()
12134 {
12135 return m_VarWet;
12136 }
12137 //----------------------------------------------------------------
12138 override float GetWetMax()
12139 {
12140 return m_VarWetMax;
12141 }
12142 //----------------------------------------------------------------
12143 override float GetWetMin()
12144 {
12145 return m_VarWetMin;
12146 }
12147 //----------------------------------------------------------------
12148 override float GetWetInit()
12149 {
12150 return m_VarWetInit;
12151 }
12152 //----------------------------------------------------------------
12153 override void OnWetChanged(float newVal, float oldVal)
12154 {
12155 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12156 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12157 if (newLevel != oldLevel)
12158 {
12159 OnWetLevelChanged(newLevel,oldLevel);
12160 }
12161 }
12162
12163 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12164 {
12165 SetWeightDirty();
12166 }
12167
12168 override EWetnessLevel GetWetLevel()
12169 {
12170 return GetWetLevelInternal(m_VarWet);
12171 }
12172
12173 //----------------------------------------------------------------
12174
12175 override void SetStoreLoad(bool value)
12176 {
12177 m_IsStoreLoad = value;
12178 }
12179
12180 override bool IsStoreLoad()
12181 {
12182 return m_IsStoreLoad;
12183 }
12184
12185 override void SetStoreLoadedQuantity(float value)
12186 {
12187 m_StoreLoadedQuantity = value;
12188 }
12189
12190 override float GetStoreLoadedQuantity()
12191 {
12192 return m_StoreLoadedQuantity;
12193 }
12194
12195 //----------------------------------------------------------------
12196
12197 float GetItemModelLength()
12198 {
12199 if (ConfigIsExisting("itemModelLength"))
12200 {
12201 return ConfigGetFloat("itemModelLength");
12202 }
12203 return 0;
12204 }
12205
12206 float GetItemAttachOffset()
12207 {
12208 if (ConfigIsExisting("itemAttachOffset"))
12209 {
12210 return ConfigGetFloat("itemAttachOffset");
12211 }
12212 return 0;
12213 }
12214
12215 override void SetCleanness(int value, bool allow_client = false)
12216 {
12217 if (!IsServerCheck(allow_client))
12218 return;
12219
12220 int previousValue = m_Cleanness;
12221
12222 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12223
12224 if (previousValue != m_Cleanness)
12225 SetVariableMask(VARIABLE_CLEANNESS);
12226 }
12227
12228 override int GetCleanness()
12229 {
12230 return m_Cleanness;
12231 }
12232
12234 {
12235 return true;
12236 }
12237
12238 //----------------------------------------------------------------
12239 // ATTACHMENT LOCKING
12240 // Getters relevant to generic ActionLockAttachment
12241 int GetLockType()
12242 {
12243 return m_LockType;
12244 }
12245
12246 string GetLockSoundSet()
12247 {
12248 return m_LockSoundSet;
12249 }
12250
12251 //----------------------------------------------------------------
12252 //------------------------- Color
12253 // sets items color variable given color components
12254 override void SetColor(int r, int g, int b, int a)
12255 {
12260 SetVariableMask(VARIABLE_COLOR);
12261 }
12263 override void GetColor(out int r,out int g,out int b,out int a)
12264 {
12269 }
12270
12271 bool IsColorSet()
12272 {
12273 return IsVariableSet(VARIABLE_COLOR);
12274 }
12275
12277 string GetColorString()
12278 {
12279 int r,g,b,a;
12280 GetColor(r,g,b,a);
12281 r = r/255;
12282 g = g/255;
12283 b = b/255;
12284 a = a/255;
12285 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12286 }
12287 //----------------------------------------------------------------
12288 //------------------------- LiquidType
12289
12290 override void SetLiquidType(int value, bool allow_client = false)
12291 {
12292 if (!IsServerCheck(allow_client))
12293 return;
12294
12295 int old = m_VarLiquidType;
12296 m_VarLiquidType = value;
12297 OnLiquidTypeChanged(old,value);
12298 SetVariableMask(VARIABLE_LIQUIDTYPE);
12299 }
12300
12301 int GetLiquidTypeInit()
12302 {
12303 return ConfigGetInt("varLiquidTypeInit");
12304 }
12305
12306 override int GetLiquidType()
12307 {
12308 return m_VarLiquidType;
12309 }
12310
12311 protected void OnLiquidTypeChanged(int oldType, int newType)
12312 {
12313 if (newType == LIQUID_NONE && GetIsFrozen())
12314 SetFrozen(false);
12315 }
12316
12318 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12319 {
12320 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12321 }
12322
12323 // -------------------------------------------------------------------------
12325 void OnInventoryEnter(Man player)
12326 {
12327 PlayerBase nplayer;
12328 if (PlayerBase.CastTo(nplayer, player))
12329 {
12330 m_CanPlayImpactSound = true;
12331 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12332 }
12333 }
12334
12335 // -------------------------------------------------------------------------
12337 void OnInventoryExit(Man player)
12338 {
12339 PlayerBase nplayer;
12340 if (PlayerBase.CastTo(nplayer,player))
12341 {
12342 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12343 }
12344
12345 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12346
12347 if (HasEnergyManager())
12348 {
12349 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12350 }
12351 }
12352
12353 // ADVANCED PLACEMENT EVENTS
12354 override void OnPlacementStarted(Man player)
12355 {
12356 super.OnPlacementStarted(player);
12357
12358 SetTakeable(false);
12359 }
12360
12361 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12362 {
12363 if (m_AdminLog)
12364 {
12365 m_AdminLog.OnPlacementComplete(player, this);
12366 }
12367
12368 super.OnPlacementComplete(player, position, orientation);
12369 }
12370
12371 //-----------------------------
12372 // AGENT SYSTEM
12373 //-----------------------------
12374 //--------------------------------------------------------------------------
12375 bool ContainsAgent(int agent_id)
12376 {
12377 if (agent_id & m_AttachedAgents)
12378 {
12379 return true;
12380 }
12381 else
12382 {
12383 return false;
12384 }
12385 }
12386
12387 //--------------------------------------------------------------------------
12388 override void RemoveAgent(int agent_id)
12389 {
12390 if (ContainsAgent(agent_id))
12391 {
12392 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12393 }
12394 }
12395
12396 //--------------------------------------------------------------------------
12397 override void RemoveAllAgents()
12398 {
12399 m_AttachedAgents = 0;
12400 }
12401 //--------------------------------------------------------------------------
12402 override void RemoveAllAgentsExcept(int agent_to_keep)
12403 {
12404 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12405 }
12406 // -------------------------------------------------------------------------
12407 override void InsertAgent(int agent, float count = 1)
12408 {
12409 if (count < 1)
12410 return;
12411 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12413 }
12414
12416 void TransferAgents(int agents)
12417 {
12419 }
12420
12421 // -------------------------------------------------------------------------
12422 override int GetAgents()
12423 {
12424 return m_AttachedAgents;
12425 }
12426 //----------------------------------------------------------------------
12427
12428 /*int GetContaminationType()
12429 {
12430 int contamination_type;
12431
12432 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12433 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12434 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12435 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12436
12437 Edible_Base edible = Edible_Base.Cast(this);
12438 int agents = GetAgents();
12439 if (edible)
12440 {
12441 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12442 if (profile)
12443 {
12444 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12445 }
12446 }
12447 if (agents & CONTAMINATED_MASK)
12448 {
12449 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12450 }
12451 if (agents & POISONED_MASK)
12452 {
12453 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12454 }
12455 if (agents & NERVE_GAS_MASK)
12456 {
12457 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12458 }
12459 if (agents & DIRTY_MASK)
12460 {
12461 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12462 }
12463
12464 return agents;
12465 }*/
12466
12467 // -------------------------------------------------------------------------
12468 bool LoadAgents(ParamsReadContext ctx, int version)
12469 {
12470 if (!ctx.Read(m_AttachedAgents))
12471 return false;
12472 return true;
12473 }
12474 // -------------------------------------------------------------------------
12476 {
12477
12479 }
12480 // -------------------------------------------------------------------------
12481
12483 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12484 {
12485 super.CheckForRoofLimited(timeTresholdMS);
12486
12487 float time = g_Game.GetTime();
12488 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12489 {
12490 m_PreviousRoofTestTime = time;
12491 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12492 }
12493 }
12494
12495 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12496 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12497 {
12498 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12499 {
12500 return 0;
12501 }
12502
12503 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12504 {
12505 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12506 if (filter)
12507 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12508 else
12509 return 0;//otherwise return 0 when no filter attached
12510 }
12511
12512 string subclassPath, entryName;
12513
12514 switch (type)
12515 {
12516 case DEF_BIOLOGICAL:
12517 entryName = "biological";
12518 break;
12519 case DEF_CHEMICAL:
12520 entryName = "chemical";
12521 break;
12522 default:
12523 entryName = "biological";
12524 break;
12525 }
12526
12527 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12528
12529 return g_Game.ConfigGetFloat(subclassPath + entryName);
12530 }
12531
12532
12533
12535 override void EEOnCECreate()
12536 {
12537 if (!IsMagazine())
12539
12541 }
12542
12543
12544 //-------------------------
12545 // OPEN/CLOSE USER ACTIONS
12546 //-------------------------
12548 void Open();
12549 void Close();
12550 bool IsOpen()
12551 {
12552 return true;
12553 }
12554
12555 override bool CanDisplayCargo()
12556 {
12557 return IsOpen();
12558 }
12559
12560
12561 // ------------------------------------------------------------
12562 // CONDITIONS
12563 // ------------------------------------------------------------
12564 override bool CanPutInCargo(EntityAI parent)
12565 {
12566 if (parent)
12567 {
12568 if (parent.IsInherited(DayZInfected))
12569 return true;
12570
12571 if (!parent.IsRuined())
12572 return true;
12573 }
12574
12575 return true;
12576 }
12577
12578 override bool CanPutAsAttachment(EntityAI parent)
12579 {
12580 if (!super.CanPutAsAttachment(parent))
12581 {
12582 return false;
12583 }
12584
12585 if (!IsRuined() && !parent.IsRuined())
12586 {
12587 return true;
12588 }
12589
12590 return false;
12591 }
12592
12593 override bool CanReceiveItemIntoCargo(EntityAI item)
12594 {
12595 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12596 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12597 // return false;
12598
12599 return super.CanReceiveItemIntoCargo(item);
12600 }
12601
12602 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12603 {
12604 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12605 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12606 // return false;
12607
12608 GameInventory attachmentInv = attachment.GetInventory();
12609 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12610 {
12611 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12612 return false;
12613 }
12614
12615 InventoryLocation loc = new InventoryLocation();
12616 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12617 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12618 return false;
12619
12620 return super.CanReceiveAttachment(attachment, slotId);
12621 }
12622
12623 override bool CanReleaseAttachment(EntityAI attachment)
12624 {
12625 if (!super.CanReleaseAttachment(attachment))
12626 return false;
12627
12628 return GetInventory().AreChildrenAccessible();
12629 }
12630
12631 /*override bool CanLoadAttachment(EntityAI attachment)
12632 {
12633 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12634 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12635 // return false;
12636
12637 GameInventory attachmentInv = attachment.GetInventory();
12638 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12639 {
12640 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12641 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12642
12643 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12644 return false;
12645 }
12646
12647 return super.CanLoadAttachment(attachment);
12648 }*/
12649
12650 // Plays muzzle flash particle effects
12651 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12652 {
12653 int id = muzzle_owner.GetMuzzleID();
12654 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12655
12656 if (WPOF_array)
12657 {
12658 for (int i = 0; i < WPOF_array.Count(); i++)
12659 {
12660 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12661
12662 if (WPOF)
12663 {
12664 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12665 }
12666 }
12667 }
12668 }
12669
12670 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12671 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12672 {
12673 int id = muzzle_owner.GetMuzzleID();
12674 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12675
12676 if (WPOBE_array)
12677 {
12678 for (int i = 0; i < WPOBE_array.Count(); i++)
12679 {
12680 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12681
12682 if (WPOBE)
12683 {
12684 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12685 }
12686 }
12687 }
12688 }
12689
12690 // Plays all weapon overheating particles
12691 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12692 {
12693 int id = muzzle_owner.GetMuzzleID();
12694 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12695
12696 if (WPOOH_array)
12697 {
12698 for (int i = 0; i < WPOOH_array.Count(); i++)
12699 {
12700 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12701
12702 if (WPOOH)
12703 {
12704 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12705 }
12706 }
12707 }
12708 }
12709
12710 // Updates all weapon overheating particles
12711 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12712 {
12713 int id = muzzle_owner.GetMuzzleID();
12714 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12715
12716 if (WPOOH_array)
12717 {
12718 for (int i = 0; i < WPOOH_array.Count(); i++)
12719 {
12720 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12721
12722 if (WPOOH)
12723 {
12724 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12725 }
12726 }
12727 }
12728 }
12729
12730 // Stops overheating particles
12731 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12732 {
12733 int id = muzzle_owner.GetMuzzleID();
12734 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12735
12736 if (WPOOH_array)
12737 {
12738 for (int i = 0; i < WPOOH_array.Count(); i++)
12739 {
12740 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12741
12742 if (WPOOH)
12743 {
12744 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12745 }
12746 }
12747 }
12748 }
12749
12750 //----------------------------------------------------------------
12751 //Item Behaviour - unified approach
12752 override bool IsHeavyBehaviour()
12753 {
12754 if (m_ItemBehaviour == 0)
12755 {
12756 return true;
12757 }
12758
12759 return false;
12760 }
12761
12762 override bool IsOneHandedBehaviour()
12763 {
12764 if (m_ItemBehaviour == 1)
12765 {
12766 return true;
12767 }
12768
12769 return false;
12770 }
12771
12772 override bool IsTwoHandedBehaviour()
12773 {
12774 if (m_ItemBehaviour == 2)
12775 {
12776 return true;
12777 }
12778
12779 return false;
12780 }
12781
12782 bool IsDeployable()
12783 {
12784 return false;
12785 }
12786
12788 float GetDeployTime()
12789 {
12790 return UATimeSpent.DEFAULT_DEPLOY;
12791 }
12792
12793
12794 //----------------------------------------------------------------
12795 // Item Targeting (User Actions)
12796 override void SetTakeable(bool pState)
12797 {
12798 m_IsTakeable = pState;
12799 SetSynchDirty();
12800 }
12801
12802 override bool IsTakeable()
12803 {
12804 return m_IsTakeable;
12805 }
12806
12807 // For cases where we want to show object widget which cant be taken to hands
12809 {
12810 return false;
12811 }
12812
12814 protected void PreLoadSoundAttachmentType()
12815 {
12816 string att_type = "None";
12817
12818 if (ConfigIsExisting("soundAttType"))
12819 {
12820 att_type = ConfigGetString("soundAttType");
12821 }
12822
12823 m_SoundAttType = att_type;
12824 }
12825
12826 override string GetAttachmentSoundType()
12827 {
12828 return m_SoundAttType;
12829 }
12830
12831 //----------------------------------------------------------------
12832 //SOUNDS - ItemSoundHandler
12833 //----------------------------------------------------------------
12834
12835 string GetPlaceSoundset(); // played when deploy starts
12836 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12837 string GetDeploySoundset(); // played when deploy sucessfully finishes
12838 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
12839 string GetFoldSoundset(); // played when fold sucessfully finishes
12840
12842 {
12843 if (!m_ItemSoundHandler)
12845
12846 return m_ItemSoundHandler;
12847 }
12848
12849 // override to initialize sounds
12850 protected void InitItemSounds()
12851 {
12852 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
12853 return;
12854
12856
12857 if (GetPlaceSoundset() != string.Empty)
12858 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12859
12860 if (GetDeploySoundset() != string.Empty)
12861 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12862
12863 SoundParameters params = new SoundParameters();
12864 params.m_Loop = true;
12865 if (GetLoopDeploySoundset() != string.Empty)
12866 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12867 }
12868
12869 // Start sound using ItemSoundHandler
12870 void StartItemSoundServer(int id, int slotId)
12871 {
12872 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12873 {
12874 m_SoundSyncSlotID = slotId;
12875 m_SoundSyncPlay = id;
12876
12877 SetSynchDirty();
12878
12879 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12880 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
12881 }
12882 }
12883
12884 void StartItemSoundServer(int id)
12885 {
12886 StartItemSoundServer(id, InventorySlots.INVALID);
12887 }
12888
12889 // Stop sound using ItemSoundHandler
12890 void StopItemSoundServer(int id)
12891 {
12892 if (!g_Game.IsServer())
12893 return;
12894
12895 m_SoundSyncStop = id;
12896 SetSynchDirty();
12897
12898 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12899 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
12900 }
12901
12902 protected void ClearStartItemSoundServer()
12903 {
12904 m_SoundSyncPlay = 0;
12905 m_SoundSyncSlotID = InventorySlots.INVALID;
12906 }
12907
12908 protected void ClearStopItemSoundServer()
12909 {
12910 m_SoundSyncStop = 0;
12911 }
12912
12913 void OnApply(PlayerBase player);
12914
12916 {
12917 return 1.0;
12918 };
12919 //returns applicable selection
12920 array<string> GetHeadHidingSelection()
12921 {
12923 }
12924
12926 {
12928 }
12929
12930 WrittenNoteData GetWrittenNoteData() {};
12931
12933 {
12934 SetDynamicPhysicsLifeTime(0.01);
12935 m_ItemBeingDroppedPhys = false;
12936 }
12937
12939 {
12940 array<string> zone_names = new array<string>;
12941 GetDamageZones(zone_names);
12942 for (int i = 0; i < zone_names.Count(); i++)
12943 {
12944 SetHealthMax(zone_names.Get(i),"Health");
12945 }
12946 SetHealthMax("","Health");
12947 }
12948
12950 void SetZoneDamageCEInit()
12951 {
12952 float global_health = GetHealth01("","Health");
12953 array<string> zones = new array<string>;
12954 GetDamageZones(zones);
12955 //set damage of all zones to match global health level
12956 for (int i = 0; i < zones.Count(); i++)
12957 {
12958 SetHealth01(zones.Get(i),"Health",global_health);
12959 }
12960 }
12961
12963 bool IsCoverFaceForShave(string slot_name)
12964 {
12965 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12966 }
12967
12968 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12969 {
12970 if (!hasRootAsPlayer)
12971 {
12972 if (refParentIB)
12973 {
12974 // parent is wet
12975 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
12976 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12977 // parent has liquid inside
12978 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
12979 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12980 // drying
12981 else if (m_VarWet > m_VarWetMin)
12982 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
12983 }
12984 else
12985 {
12986 // drying on ground or inside non-itembase (car, ...)
12987 if (m_VarWet > m_VarWetMin)
12988 AddWet(-1 * delta * GetDryingIncrement("ground"));
12989 }
12990 }
12991 }
12992
12993 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12994 {
12996 {
12997 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
12998 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12999 {
13000 float heatPermCoef = 1.0;
13001 EntityAI ent = this;
13002 while (ent)
13003 {
13004 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13005 ent = ent.GetHierarchyParent();
13006 }
13007
13008 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13009 }
13010 }
13011 }
13012
13013 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13014 {
13015 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13016 EntityAI parent = GetHierarchyParent();
13017 if (!parent)
13018 {
13019 hasParent = false;
13020 hasRootAsPlayer = false;
13021 }
13022 else
13023 {
13024 hasParent = true;
13025 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13026 refParentIB = ItemBase.Cast(parent);
13027 }
13028 }
13029
13030 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13031 {
13032 // this is stub, implemented on Edible_Base
13033 }
13034
13035 bool CanDecay()
13036 {
13037 // return true used on selected food clases so they can decay
13038 return false;
13039 }
13040
13041 protected bool CanProcessDecay()
13042 {
13043 // this is stub, implemented on Edible_Base class
13044 // used to determine whether it is still necessary for the food to decay
13045 return false;
13046 }
13047
13048 protected bool CanHaveWetness()
13049 {
13050 // return true used on selected items that have a wetness effect
13051 return false;
13052 }
13053
13055 bool CanBeConsumed(ConsumeConditionData data = null)
13056 {
13057 return !GetIsFrozen() && IsOpen();
13058 }
13059
13060 override void ProcessVariables()
13061 {
13062 bool hasParent = false, hasRootAsPlayer = false;
13063 ItemBase refParentIB;
13064
13065 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13066 bool foodDecay = g_Game.IsFoodDecayEnabled();
13067
13068 if (wwtu || foodDecay)
13069 {
13070 bool processWetness = wwtu && CanHaveWetness();
13071 bool processTemperature = wwtu && CanHaveTemperature();
13072 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13073
13074 if (processWetness || processTemperature || processDecay)
13075 {
13076 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13077
13078 if (processWetness)
13079 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13080
13081 if (processTemperature)
13082 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13083
13084 if (processDecay)
13085 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13086 }
13087 }
13088 }
13089
13092 {
13093 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13094 }
13095
13096 override float GetTemperatureFreezeThreshold()
13097 {
13099 return Liquid.GetFreezeThreshold(GetLiquidType());
13100
13101 return super.GetTemperatureFreezeThreshold();
13102 }
13103
13104 override float GetTemperatureThawThreshold()
13105 {
13107 return Liquid.GetThawThreshold(GetLiquidType());
13108
13109 return super.GetTemperatureThawThreshold();
13110 }
13111
13112 override float GetItemOverheatThreshold()
13113 {
13115 return Liquid.GetBoilThreshold(GetLiquidType());
13116
13117 return super.GetItemOverheatThreshold();
13118 }
13119
13120 override float GetTemperatureFreezeTime()
13121 {
13122 if (HasQuantity())
13123 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13124
13125 return super.GetTemperatureFreezeTime();
13126 }
13127
13128 override float GetTemperatureThawTime()
13129 {
13130 if (HasQuantity())
13131 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13132
13133 return super.GetTemperatureThawTime();
13134 }
13135
13137 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13139 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13140
13141 bool IsCargoException4x3(EntityAI item)
13142 {
13143 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13144 }
13145
13147 {
13148 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13149 }
13150
13152 void AddLightSourceItem(ItemBase lightsource)
13153 {
13154 m_LightSourceItem = lightsource;
13155 }
13156
13158 {
13159 m_LightSourceItem = null;
13160 }
13161
13163 {
13164 return m_LightSourceItem;
13165 }
13166
13168 array<int> GetValidFinishers()
13169 {
13170 return null;
13171 }
13172
13174 bool GetActionWidgetOverride(out typename name)
13175 {
13176 return false;
13177 }
13178
13179 bool PairWithDevice(notnull ItemBase otherDevice)
13180 {
13181 if (g_Game.IsServer())
13182 {
13183 ItemBase explosive = otherDevice;
13185 if (!trg)
13186 {
13187 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13188 explosive = this;
13189 }
13190
13191 explosive.PairRemote(trg);
13192 trg.SetControlledDevice(explosive);
13193
13194 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13195 trg.SetPersistentPairID(persistentID);
13196 explosive.SetPersistentPairID(persistentID);
13197
13198 return true;
13199 }
13200 return false;
13201 }
13202
13204 float GetBaitEffectivity()
13205 {
13206 float ret = 1.0;
13207 if (HasQuantity())
13208 ret *= GetQuantityNormalized();
13209 ret *= GetHealth01();
13210
13211 return ret;
13212 }
13213
13214 #ifdef DEVELOPER
13215 override void SetDebugItem()
13216 {
13217 super.SetDebugItem();
13218 _itemBase = this;
13219 }
13220
13221 override string GetDebugText()
13222 {
13223 string text = super.GetDebugText();
13224
13225 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13226 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13227
13228 return text;
13229 }
13230 #endif
13231
13232 bool CanBeUsedForSuicide()
13233 {
13234 return true;
13235 }
13236
13238 //DEPRECATED BELOW
13240 // Backwards compatibility
13241 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13242 {
13243 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13244 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13245 }
13246
13247 // replaced by ItemSoundHandler
13248 protected EffectSound m_SoundDeployFinish;
13249 protected EffectSound m_SoundPlace;
13250 protected EffectSound m_DeployLoopSoundEx;
13251 protected EffectSound m_SoundDeploy;
13252 bool m_IsPlaceSound;
13253 bool m_IsDeploySound;
13255
13256 string GetDeployFinishSoundset();
13257 void PlayDeploySound();
13258 void PlayDeployFinishSound();
13259 void PlayPlaceSound();
13260 void PlayDeployLoopSoundEx();
13261 void StopDeployLoopSoundEx();
13262 void SoundSynchRemoteReset();
13263 void SoundSynchRemote();
13264 bool UsesGlobalDeploy(){return false;}
13265 bool CanPlayDeployLoopSound(){return false;}
13267 bool IsPlaceSound(){return m_IsPlaceSound;}
13268 bool IsDeploySound(){return m_IsDeploySound;}
13269 void SetIsPlaceSound(bool is_place_sound);
13270 void SetIsDeploySound(bool is_deploy_sound);
13271
13272 [Obsolete("Use ItemSoundHandler instead")]
13274 void PlayAttachSound(string slot_type)
13275 {
13276 if (!g_Game.IsDedicatedServer())
13277 {
13278 if (ConfigIsExisting("attachSoundSet"))
13279 {
13280 string cfg_path = "";
13281 string soundset = "";
13282 string type_name = GetType();
13283
13284 TStringArray cfg_soundset_array = new TStringArray;
13285 TStringArray cfg_slot_array = new TStringArray;
13286 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13287 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13288
13289 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13290 {
13291 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13292 {
13293 if (cfg_slot_array[i] == slot_type)
13294 {
13295 soundset = cfg_soundset_array[i];
13296 break;
13297 }
13298 }
13299 }
13300
13301 if (soundset != "")
13302 {
13303 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13304 sound.SetAutodestroy(true);
13305 }
13306 }
13307 }
13308 }
13309
13310 void PlayDetachSound(string slot_type) {}
13311}
13312
13313EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13314{
13315 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13316 if (entity)
13317 {
13318 bool is_item = entity.IsInherited(ItemBase);
13319 if (is_item && full_quantity)
13320 {
13321 ItemBase item = ItemBase.Cast(entity);
13322 item.SetQuantity(item.GetQuantityInit());
13323 }
13324 }
13325 else
13326 {
13327 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13328 return NULL;
13329 }
13330 return entity;
13331}
13332
13333void SetupSpawnedItem(ItemBase item, float health, float quantity)
13334{
13335 if (item)
13336 {
13337 if (health > 0)
13338 item.SetHealth("", "", health);
13339
13340 if (item.CanHaveTemperature())
13341 {
13342 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13343 if (item.CanFreeze())
13344 item.SetFrozen(false);
13345 }
13346
13347 if (item.HasEnergyManager())
13348 {
13349 if (quantity >= 0)
13350 {
13351 item.GetCompEM().SetEnergy0To1(quantity);
13352 }
13353 else
13354 {
13355 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13356 }
13357 }
13358 else if (item.IsMagazine())
13359 {
13360 Magazine mag = Magazine.Cast(item);
13361 if (quantity >= 0)
13362 {
13363 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13364 }
13365 else
13366 {
13367 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13368 }
13369
13370 }
13371 else
13372 {
13373 if (quantity >= 0)
13374 {
13375 item.SetQuantityNormalized(quantity, false);
13376 }
13377 else
13378 {
13379 item.SetQuantity(Math.AbsFloat(quantity));
13380 }
13381
13382 }
13383 }
13384}
13385
13386#ifdef DEVELOPER
13387ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13388#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
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
string Debug()
Определения CachedEquipmentStorageBase.c:29
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
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
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:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
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:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
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:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
void OnApply(PlayerBase player)
override 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:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
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:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
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:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
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
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
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()
Определения 3_Game/DayZ/Entities/Man.c:48
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
Определения ItemBase.c:21
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
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:507
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:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
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 string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
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:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
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:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
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:1032
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 CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
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
Определения ItemBase.c:14
Определения 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 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:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
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
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
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:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
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
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()

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