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

◆ GetQuantityNormalizedScripted()

override float GetQuantityNormalizedScripted ( )
private

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

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