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

◆ SetQuantityMax()

void SpawnItemOnLocation::SetQuantityMax ( )
protected

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

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

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