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

◆ SetQuantityMax()

void SpawnItemOnLocation::SetQuantityMax ( )
protected

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

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

Используется в InventoryItem::OnAction(), Barrel_ColorBase::OnDebugSpawn() и OnDebugSpawn().