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

◆ GetNumberOfItems()

int SpawnItemOnLocation::GetNumberOfItems ( )
protected

Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.

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

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

Используется в Barrel_ColorBase::CanDetachAttachment(), FireplaceBase::CanDetachAttachment(), ClothingBase::CanPutAsAttachment(), Barrel_ColorBase::CanPutInCargo(), Clothing::CanPutInCargo(), Clothing_Base::CanPutInCargoClothingConditions() и Barrel_ColorBase::CanPutIntoHands().