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

◆ SetWet()

override void SpawnItemOnLocation::SetWet ( float value,
bool allow_client = false )
protected

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

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