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

◆ GetSingleInventoryItemWeightEx()

override float SpawnItemOnLocation::GetSingleInventoryItemWeightEx ( )
private

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

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