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

◆ GetDryingIncrement()

float SpawnItemOnLocation::GetDryingIncrement ( string pIncrementName)
protected

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

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

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