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

◆ OnEnergyAdded()

override void SpawnItemOnLocation::OnEnergyAdded ( )
protected

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

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