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

◆ ClearInventory()

override void SpawnItemOnLocation::ClearInventory ( )
protected

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

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

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