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

◆ GetEnergy()

float SpawnItemOnLocation::GetEnergy ( )
protected

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

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

Используется в ItemBase::CanAddFuel(), FlammableBase::CanBeIgnitedBy(), BroomBase::CanTransformIntoStick(), ItemBase::GetFuel(), InventoryItem::GetWeightSpecialized(), FlammableBase::OnWork(), Chemlight_ColorBase::OnWorkStop(), FlammableBase::OnWorkStop() и Roadflare::OnWorkStop().