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

◆ GetQuantityInit()

int SpawnItemOnLocation::GetQuantityInit ( )
protected

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

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