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

◆ GetQuantity()

override float SpawnItemOnLocation::GetQuantity ( )
private

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

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

Используется в InventoryItem::AddQuantity(), InventoryItem::CanBeCombined(), InventoryItem::CanBeSplit(), ItemBase::CanIgniteItem(), Clothing::CanPutAsAttachment(), ItemBase::CanPutAsAttachment(), InventoryItem::CombineItems(), InventoryItem::ComputeQuantityUsedEx(), Mask_Base::ConsumeQuantity(), Barrel_ColorBase::DetermineAction(), Mask_Base::GetFilterQuantity(), Mask_Base::GetFilterQuantity01(), InventoryItem::GetProtectionLevel(), FlammableBase::GetRagQuantity(), InventoryItem::GetWeightSpecialized(), Mask_Base::HasValidFilter(), InventoryItem::InitItemVariables(), LargeGasCanister::IsDestructionBehaviour(), MediumGasCanister::IsDestructionBehaviour(), SmallGasCanister::IsDestructionBehaviour(), InventoryItem::IsFullQuantity(), ItemBase::RemovePlanks(), InventoryItem::SplitIntoStackMax(), InventoryItem::SplitIntoStackMaxCargo(), InventoryItem::SplitIntoStackMaxEx(), InventoryItem::SplitIntoStackMaxHands(), InventoryItem::SplitIntoStackMaxToInventoryLocationEx(), InventoryItem::SplitItem(), InventoryItem::SplitItemToInventoryLocation(), FlammableBase::UpdateLight(), BroomBase::UpdateParticle(), FlammableBase::UpdateParticle(), ItemBase::UpdateSelections() и InventoryItem::WriteVarsToCTX().