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

◆ GetQuantity()

override float SpawnItemOnLocation::GetQuantity ( )
protected

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

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

Используется в InventoryItem::AddQuantity(), InventoryItem::CanBeCombined(), InventoryItem::CanBeSplit(), ItemBase::CanIgniteItem(), Clothing::CanPutAsAttachment(), ItemBase::CanPutAsAttachment(), InventoryItem::CombineItems(), InventoryItem::ComputeQuantityUsedEx(), Mask_Base::ConsumeQuantity(), Barrel_ColorBase::DetermineAction(), Mask_Base::GetFilterQuantity(), Mask_Base::GetFilterQuantity01(), InventoryItem::GetProtectionLevel(), FlammableBase::GetRagQuantity(), InventoryItem::GetWeightSpecialized(), Mask_Base::HasValidFilter(), InventoryItem::InitItemVariables(), LargeGasCanister::IsDestructionBehaviour(), MediumGasCanister::IsDestructionBehaviour(), SmallGasCanister::IsDestructionBehaviour(), InventoryItem::IsFullQuantity(), ItemBase::RemovePlanks(), InventoryItem::ShouldSplitQuantity(), InventoryItem::SplitIntoStackMax(), InventoryItem::SplitIntoStackMaxCargo(), InventoryItem::SplitIntoStackMaxEx(), InventoryItem::SplitIntoStackMaxHands(), InventoryItem::SplitIntoStackMaxToInventoryLocationEx(), InventoryItem::SplitItem(), InventoryItem::SplitItemToInventoryLocation(), FlammableBase::UpdateLight(), BroomBase::UpdateParticle(), FlammableBase::UpdateParticle(), ItemBase::UpdateSelections() и InventoryItem::WriteVarsToCTX().