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

◆ OnWetLevelChanged()

override void SpawnItemOnLocation::OnWetLevelChanged ( EWetnessLevel newLevel,
EWetnessLevel oldLevel )
protected

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

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

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