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

◆ ProcessItemTemperature()

void SpawnItemOnLocation::ProcessItemTemperature ( float delta,
bool hasParent,
bool hasRootAsPlayer,
ItemBase refParentIB )
protected

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

9275{
9276 override bool CanPutAsAttachment(EntityAI parent)
9277 {
9278 return true;
9279 }
9280};
9281
9282//const bool QUANTITY_DEBUG_REMOVE_ME = false;
9283
9284class ItemBase extends InventoryItem
9285{
9289
9291
9292 static int m_DebugActionsMask;
9294 // ============================================
9295 // Variable Manipulation System
9296 // ============================================
9297 // Quantity
9298
9299 float m_VarQuantity;
9300 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
9302 int m_VarQuantityMin;
9303 int m_VarQuantityMax;
9304 int m_Count;
9305 float m_VarStackMax;
9306 float m_StoreLoadedQuantity = float.LOWEST;
9307 // Wet
9308 float m_VarWet;
9309 float m_VarWetPrev;//for client to know wetness changed during synchronization
9310 float m_VarWetInit;
9311 float m_VarWetMin;
9312 float m_VarWetMax;
9313 // Cleanness
9314 int m_Cleanness;
9315 int m_CleannessInit;
9316 int m_CleannessMin;
9317 int m_CleannessMax;
9318 // impact sounds
9320 bool m_CanPlayImpactSound = true;
9321 float m_ImpactSpeed;
9323 //
9324 float m_HeatIsolation;
9325 float m_ItemModelLength;
9326 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
9328 int m_VarLiquidType;
9329 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
9330 int m_QuickBarBonus;
9331 bool m_IsBeingPlaced;
9332 bool m_IsHologram;
9333 bool m_IsTakeable;
9334 bool m_ThrowItemOnDrop;
9337 bool m_FixDamageSystemInit = false; //can be changed on storage version check
9338 bool can_this_be_combined; //Check if item can be combined
9339 bool m_CanThisBeSplit; //Check if item can be split
9340 bool m_IsStoreLoad = false;
9341 bool m_CanShowQuantity;
9342 bool m_HasQuantityBar;
9343 protected bool m_CanBeDigged;
9344 protected bool m_IsResultOfSplit
9345
9346 string m_SoundAttType;
9347 // items color variables
9352 //-------------------------------------------------------
9353
9354 // light source managing
9356
9360
9361 //==============================================
9362 // agent system
9363 private int m_AttachedAgents;
9364
9366 void TransferModifiers(PlayerBase reciever);
9367
9368
9369 // Weapons & suppressors particle effects
9374 static int m_LastRegisteredWeaponID = 0;
9375
9376 // Overheating effects
9378 float m_OverheatingShots;
9379 ref Timer m_CheckOverheating;
9380 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
9381 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
9382 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
9383 ref array <ref OverheatingParticle> m_OverheatingParticles;
9384
9386 protected bool m_HideSelectionsBySlot;
9387
9388 // Admin Log
9389 PluginAdminLog m_AdminLog;
9390
9391 // misc
9392 ref Timer m_PhysDropTimer;
9393
9394 // Attachment Locking variables
9395 ref array<int> m_CompatibleLocks;
9396 protected int m_LockType;
9397 protected ref EffectSound m_LockingSound;
9398 protected string m_LockSoundSet;
9399
9400 // ItemSoundHandler
9401 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
9402 protected int m_SoundSyncPlay; // id for sound to play
9403 protected int m_SoundSyncStop; // id for sound to stop
9405
9406 //temperature
9407 private float m_TemperaturePerQuantityWeight;
9408
9409 // -------------------------------------------------------------------------
9410 void ItemBase()
9411 {
9412 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
9416
9417 if (!GetGame().IsDedicatedServer())
9418 {
9419 if (HasMuzzle())
9420 {
9422
9424 {
9426 }
9427 }
9428
9430 m_ActionsInitialize = false;
9431 }
9432
9433 m_OldLocation = null;
9434
9435 if (GetGame().IsServer())
9436 {
9437 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
9438 }
9439
9440 if (ConfigIsExisting("headSelectionsToHide"))
9441 {
9443 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
9444 }
9445
9446 m_HideSelectionsBySlot = false;
9447 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9448 {
9449 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
9450 }
9451
9452 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
9453
9454 m_IsResultOfSplit = false;
9455
9457 }
9458
9459 override void InitItemVariables()
9460 {
9461 super.InitItemVariables();
9462
9463 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
9464 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
9465 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
9466 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
9467 m_VarStackMax = ConfigGetFloat("varStackMax");
9468 m_Count = ConfigGetInt("count");
9469
9470 m_CanShowQuantity = ConfigGetBool("quantityShow");
9471 m_HasQuantityBar = ConfigGetBool("quantityBar");
9472
9473 m_CleannessInit = ConfigGetInt("varCleannessInit");
9475 m_CleannessMin = ConfigGetInt("varCleannessMin");
9476 m_CleannessMax = ConfigGetInt("varCleannessMax");
9477
9478 m_WantPlayImpactSound = false;
9479 m_ImpactSpeed = 0.0;
9480
9481 m_VarWetInit = ConfigGetFloat("varWetInit");
9483 m_VarWetMin = ConfigGetFloat("varWetMin");
9484 m_VarWetMax = ConfigGetFloat("varWetMax");
9485
9486 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
9487 if (IsLiquidContainer() && GetQuantity() != 0)
9489 m_IsBeingPlaced = false;
9490 m_IsHologram = false;
9491 m_IsTakeable = true;
9492 m_CanBeMovedOverride = false;
9496 m_CanBeDigged = ConfigGetBool("canBeDigged");
9497
9498 m_CompatibleLocks = new array<int>();
9499 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
9500 m_LockType = ConfigGetInt("lockType");
9501
9502 //Define if item can be split and set ability to be combined accordingly
9503 m_CanThisBeSplit = false;
9504 can_this_be_combined = false;
9505 if (ConfigIsExisting("canBeSplit"))
9506 {
9507 can_this_be_combined = ConfigGetBool("canBeSplit");
9509 }
9510
9511 m_ItemBehaviour = -1;
9512 if (ConfigIsExisting("itemBehaviour"))
9513 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
9514
9515 //RegisterNetSyncVariableInt("m_VariablesMask");
9516 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9517 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
9518 RegisterNetSyncVariableInt("m_VarLiquidType");
9519 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9520
9521 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9522 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9523 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9524
9525 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9526 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9527 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9528 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9529
9530 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9531 RegisterNetSyncVariableBool("m_IsTakeable");
9532 RegisterNetSyncVariableBool("m_IsHologram");
9533
9534 InitItemSounds();
9536 {
9537 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
9538 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
9539 }
9540
9541 m_LockSoundSet = ConfigGetString("lockSoundSet");
9542
9544 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9545 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
9546
9547 }
9548
9549 override int GetQuickBarBonus()
9550 {
9551 return m_QuickBarBonus;
9552 }
9553
9554 void InitializeActions()
9555 {
9557 if (!m_InputActionMap)
9558 {
9560 m_InputActionMap = iam;
9561 SetActions();
9563 }
9564 }
9565
9566 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
9567 {
9569 {
9570 m_ActionsInitialize = true;
9572 }
9573
9574 actions = m_InputActionMap.Get(action_input_type);
9575 }
9576
9577 void SetActions()
9578 {
9579 AddAction(ActionTakeItem);
9580 AddAction(ActionTakeItemToHands);
9581 AddAction(ActionWorldCraft);
9583 AddAction(ActionAttachWithSwitch);
9584 }
9585
9586 void SetActionAnimOverrides(); // Override action animation for specific item
9587
9588 void AddAction(typename actionName)
9589 {
9590 ActionBase action = ActionManagerBase.GetAction(actionName);
9591
9592 if (!action)
9593 {
9594 Debug.LogError("Action " + actionName + " dosn't exist!");
9595 return;
9596 }
9597
9598 typename ai = action.GetInputType();
9599 if (!ai)
9600 {
9601 m_ActionsInitialize = false;
9602 return;
9603 }
9604
9605 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9606 if (!action_array)
9607 {
9608 action_array = new array<ActionBase_Basic>;
9609 m_InputActionMap.Insert(ai, action_array);
9610 }
9611 if (LogManager.IsActionLogEnable())
9612 {
9613 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
9614 }
9615
9616 if (action_array.Find(action) != -1)
9617 {
9618 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
9619 }
9620 else
9621 {
9622 action_array.Insert(action);
9623 }
9624 }
9625
9626 void RemoveAction(typename actionName)
9627 {
9628 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9629 ActionBase action = player.GetActionManager().GetAction(actionName);
9630 typename ai = action.GetInputType();
9631 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9632
9633 if (action_array)
9634 {
9635 action_array.RemoveItem(action);
9636 }
9637 }
9638
9639 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9640 // Set -1 for params which should stay in default state
9641 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9642 {
9643 ActionOverrideData overrideData = new ActionOverrideData();
9644 overrideData.m_CommandUID = commandUID;
9645 overrideData.m_CommandUIDProne = commandUIDProne;
9646 overrideData.m_StanceMask = stanceMask;
9647
9648 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9649 if (!actionMap) // create new map of action > overidables map
9650 {
9651 actionMap = new TActionAnimOverrideMap();
9652 m_ItemActionOverrides.Insert(action, actionMap);
9653 }
9654
9655 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9656
9657 }
9658
9659 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9660
9661 ScriptedLightBase GetLight();
9662
9663 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9664 void LoadParticleConfigOnFire(int id)
9665 {
9666 if (!m_OnFireEffect)
9668
9671
9672 string config_to_search = "CfgVehicles";
9673 string muzzle_owner_config;
9674
9675 if (!m_OnFireEffect.Contains(id))
9676 {
9677 if (IsInherited(Weapon))
9678 config_to_search = "CfgWeapons";
9679
9680 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9681
9682 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9683
9684 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
9685
9686 if (config_OnFire_subclass_count > 0)
9687 {
9688 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9689
9690 for (int i = 0; i < config_OnFire_subclass_count; i++)
9691 {
9692 string particle_class = "";
9693 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
9694 string config_OnFire_entry = config_OnFire_class + particle_class;
9695 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9696 WPOF_array.Insert(WPOF);
9697 }
9698
9699
9700 m_OnFireEffect.Insert(id, WPOF_array);
9701 }
9702 }
9703
9704 if (!m_OnBulletCasingEjectEffect.Contains(id))
9705 {
9706 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
9707 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9708
9709 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9710
9711 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9712
9713 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9714 {
9715 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9716
9717 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9718 {
9719 string particle_class2 = "";
9720 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9721 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9722 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9723 WPOBE_array.Insert(WPOBE);
9724 }
9725
9726
9727 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
9728 }
9729 }
9730 }
9731
9732 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9734 {
9737
9738 if (!m_OnOverheatingEffect.Contains(id))
9739 {
9740 string config_to_search = "CfgVehicles";
9741
9742 if (IsInherited(Weapon))
9743 config_to_search = "CfgWeapons";
9744
9745 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
9746 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9747
9748 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
9749 {
9750
9751 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
9752
9754 {
9755 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
9756 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9757 Error(error);
9758 return;
9759 }
9760
9761 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
9762 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
9763
9764
9765
9766 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
9767 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9768
9769 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9770 {
9771 string particle_class = "";
9772 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9773 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9774 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
9775
9776 if (entry_type == CT_CLASS)
9777 {
9778 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9779 WPOOH_array.Insert(WPOF);
9780 }
9781 }
9782
9783
9784 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9785 }
9786 }
9787 }
9788
9789 float GetOverheatingValue()
9790 {
9791 return m_OverheatingShots;
9792 }
9793
9794 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9795 {
9796 if (m_MaxOverheatingValue > 0)
9797 {
9799
9800 if (!m_CheckOverheating)
9802
9804 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9805
9806 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9807 }
9808 }
9809
9810 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9811 {
9813 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9814
9816 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9817
9819 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9820
9822 {
9824 }
9825 }
9826
9828 {
9830 }
9831
9832 void OnOverheatingDecay()
9833 {
9834 if (m_MaxOverheatingValue > 0)
9835 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9836 else
9838
9839 if (m_OverheatingShots <= 0)
9840 {
9843 }
9844 else
9845 {
9846 if (!m_CheckOverheating)
9848
9850 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9851 }
9852
9853 CheckOverheating(this, "", this);
9854 }
9855
9856 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9857 {
9859 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9860 }
9861
9862 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9863 {
9865 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9867 }
9868
9869 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9870 {
9872 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9873 }
9874
9875 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9876 {
9878 m_OverheatingParticles = new array<ref OverheatingParticle>;
9879
9880 OverheatingParticle OP = new OverheatingParticle();
9881 OP.RegisterParticle(p);
9882 OP.SetOverheatingLimitMin(min_heat_coef);
9883 OP.SetOverheatingLimitMax(max_heat_coef);
9884 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9885
9886 m_OverheatingParticles.Insert(OP);
9887 }
9888
9889 float GetOverheatingCoef()
9890 {
9891 if (m_MaxOverheatingValue > 0)
9893
9894 return -1;
9895 }
9896
9898 {
9900 {
9901 float overheat_coef = GetOverheatingCoef();
9902 int count = m_OverheatingParticles.Count();
9903
9904 for (int i = count; i > 0; --i)
9905 {
9906 int id = i - 1;
9907 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9908 Particle p = OP.GetParticle();
9909
9910 float overheat_min = OP.GetOverheatingLimitMin();
9911 float overheat_max = OP.GetOverheatingLimitMax();
9912
9913 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9914 {
9915 if (p)
9916 {
9917 p.Stop();
9918 OP.RegisterParticle(null);
9919 }
9920 }
9921 }
9922 }
9923 }
9924
9926 {
9928 {
9929 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9930 {
9931 int id = i - 1;
9932 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9933
9934 if (OP)
9935 {
9936 Particle p = OP.GetParticle();
9937
9938 if (p)
9939 {
9940 p.Stop();
9941 }
9942
9943 delete OP;
9944 }
9945 }
9946
9947 m_OverheatingParticles.Clear();
9949 }
9950 }
9951
9953 float GetInfectionChance(int system = 0, Param param = null)
9954 {
9955 return 0.0;
9956 }
9957
9958
9959 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9960 {
9961 return 250;//default value
9962 }
9963
9964 float GetFilterDamageRatio()
9965 {
9966 return 0;
9967 }
9968
9970 bool HasMuzzle()
9971 {
9972 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9973 return true;
9974
9975 return false;
9976 }
9977
9979 int GetMuzzleID()
9980 {
9981 if (!m_WeaponTypeToID)
9983
9984 if (m_WeaponTypeToID.Contains(GetType()))
9985 {
9986 return m_WeaponTypeToID.Get(GetType());
9987 }
9988 else
9989 {
9990 // Register new weapon ID
9992 }
9993
9995 }
9996
10003 {
10004 return -1;
10005 }
10006
10007
10008
10009 // -------------------------------------------------------------------------
10010 void ~ItemBase()
10011 {
10012 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
10013 {
10014 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
10015 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10016
10017 if (r_index >= 0)
10018 {
10019 InventoryLocation r_il = new InventoryLocation;
10020 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10021
10022 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10023 int r_type = r_il.GetType();
10024 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10025 {
10026 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10027 }
10028 else if (r_type == InventoryLocationType.ATTACHMENT)
10029 {
10030 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10031 }
10032
10033 }
10034
10035 player.GetHumanInventory().ClearUserReservedLocation(this);
10036 }
10037
10038 if (m_LockingSound)
10039 SEffectManager.DestroyEffect(m_LockingSound);
10040 }
10041
10042
10043
10044 // -------------------------------------------------------------------------
10045 static int GetDebugActionsMask()
10046 {
10047 return ItemBase.m_DebugActionsMask;
10048 }
10049
10050 static bool HasDebugActionsMask(int mask)
10051 {
10052 return ItemBase.m_DebugActionsMask & mask;
10053 }
10054
10055 static void SetDebugActionsMask(int mask)
10056 {
10057 ItemBase.m_DebugActionsMask = mask;
10058 }
10059
10060 static void AddDebugActionsMask(int mask)
10061 {
10062 ItemBase.m_DebugActionsMask |= mask;
10063 }
10064
10065 static void RemoveDebugActionsMask(int mask)
10066 {
10067 ItemBase.m_DebugActionsMask &= ~mask;
10068 }
10069
10070 static void ToggleDebugActionsMask(int mask)
10071 {
10072 if (HasDebugActionsMask(mask))
10073 {
10075 }
10076 else
10077 {
10078 AddDebugActionsMask(mask);
10079 }
10080 }
10081
10082 // -------------------------------------------------------------------------
10083 void SetCEBasedQuantity()
10084 {
10085 if (GetEconomyProfile())
10086 {
10087 float q_max = GetEconomyProfile().GetQuantityMax();
10088 if (q_max > 0)
10089 {
10090 float q_min = GetEconomyProfile().GetQuantityMin();
10091 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10092
10093 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
10094 {
10095 ComponentEnergyManager comp = GetCompEM();
10096 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
10097 {
10098 comp.SetEnergy0To1(quantity_randomized);
10099 }
10100 }
10101 else if (HasQuantity())
10102 {
10103 SetQuantityNormalized(quantity_randomized, false);
10104 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
10105 }
10106
10107 }
10108 }
10109 }
10110
10112 void LockToParent()
10113 {
10114 EntityAI parent = GetHierarchyParent();
10115
10116 if (parent)
10117 {
10118 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10119 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10120 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
10121 }
10122 }
10123
10125 void UnlockFromParent()
10126 {
10127 EntityAI parent = GetHierarchyParent();
10128
10129 if (parent)
10130 {
10131 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10132 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10133 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
10134 }
10135 }
10136
10137 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
10138 {
10139 /*
10140 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
10141 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
10142 */
10143 ItemBase item2 = ItemBase.Cast(entity2);
10144
10145 if (GetGame().IsClient())
10146 {
10147 if (ScriptInputUserData.CanStoreInputUserData())
10148 {
10149 ScriptInputUserData ctx = new ScriptInputUserData;
10151 ctx.Write(-1);
10152 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10153 ctx.Write(i1);
10154 ctx.Write(item2);
10155 ctx.Write(use_stack_max);
10156 ctx.Write(-1);
10157 ctx.Send();
10158
10159 if (IsCombineAll(item2, use_stack_max))
10160 {
10161 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10162 }
10163 }
10164 }
10165 else if (!GetGame().IsMultiplayer())
10166 {
10167 CombineItems(item2, use_stack_max);
10168 }
10169 }
10170
10171 bool IsLiquidPresent()
10172 {
10173 return (GetLiquidType() != 0 && HasQuantity());
10174 }
10175
10176 bool IsLiquidContainer()
10177 {
10178 return m_LiquidContainerMask != 0;
10179 }
10180
10182 {
10183 return m_LiquidContainerMask;
10184 }
10185
10186 bool IsBloodContainer()
10187 {
10188 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
10189 return false;
10190 }
10191
10192 bool IsNVG()
10193 {
10194 return false;
10195 }
10196
10199 bool IsExplosive()
10200 {
10201 return false;
10202 }
10203
10205 {
10206 return "";
10207 }
10208
10210
10211 bool IsLightSource()
10212 {
10213 return false;
10214 }
10215
10217 {
10218 return true;
10219 }
10220
10221 //--- ACTION CONDITIONS
10222 //direction
10223 bool IsFacingPlayer(PlayerBase player, string selection)
10224 {
10225 return true;
10226 }
10227
10228 bool IsPlayerInside(PlayerBase player, string selection)
10229 {
10230 return true;
10231 }
10232
10233 override bool CanObstruct()
10234 {
10235 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10236 return !player || !IsPlayerInside(player, "");
10237 }
10238
10239 override bool IsBeingPlaced()
10240 {
10241 return m_IsBeingPlaced;
10242 }
10243
10244 void SetIsBeingPlaced(bool is_being_placed)
10245 {
10246 m_IsBeingPlaced = is_being_placed;
10247 if (!is_being_placed)
10249 SetSynchDirty();
10250 }
10251
10252 //server-side
10253 void OnEndPlacement() {}
10254
10255 override bool IsHologram()
10256 {
10257 return m_IsHologram;
10258 }
10259
10260 bool CanBeDigged()
10261 {
10262 return m_CanBeDigged;
10263 }
10264
10266 {
10267 return 1;
10268 }
10269
10270 bool CanMakeGardenplot()
10271 {
10272 return false;
10273 }
10274
10275 void SetIsHologram(bool is_hologram)
10276 {
10277 m_IsHologram = is_hologram;
10278 SetSynchDirty();
10279 }
10280 /*
10281 protected float GetNutritionalEnergy()
10282 {
10283 Edible_Base edible = Edible_Base.Cast(this);
10284 return edible.GetFoodEnergy();
10285 }
10286
10287 protected float GetNutritionalWaterContent()
10288 {
10289 Edible_Base edible = Edible_Base.Cast(this);
10290 return edible.GetFoodWater();
10291 }
10292
10293 protected float GetNutritionalIndex()
10294 {
10295 Edible_Base edible = Edible_Base.Cast(this);
10296 return edible.GetFoodNutritionalIndex();
10297 }
10298
10299 protected float GetNutritionalFullnessIndex()
10300 {
10301 Edible_Base edible = Edible_Base.Cast(this);
10302 return edible.GetFoodTotalVolume();
10303 }
10304
10305 protected float GetNutritionalToxicity()
10306 {
10307 Edible_Base edible = Edible_Base.Cast(this);
10308 return edible.GetFoodToxicity();
10309
10310 }
10311 */
10312
10313
10314 // -------------------------------------------------------------------------
10315 override void OnMovedInsideCargo(EntityAI container)
10316 {
10317 super.OnMovedInsideCargo(container);
10318
10319 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10320 }
10321
10322 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10323 {
10324 super.EEItemLocationChanged(oldLoc,newLoc);
10325
10326 PlayerBase new_player = null;
10327 PlayerBase old_player = null;
10328
10329 if (newLoc.GetParent())
10330 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10331
10332 if (oldLoc.GetParent())
10333 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10334
10335 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
10336 {
10337 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10338
10339 if (r_index >= 0)
10340 {
10341 InventoryLocation r_il = new InventoryLocation;
10342 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10343
10344 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10345 int r_type = r_il.GetType();
10346 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10347 {
10348 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10349 }
10350 else if (r_type == InventoryLocationType.ATTACHMENT)
10351 {
10352 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10353 }
10354
10355 }
10356 }
10357
10358 if (newLoc.GetType() == InventoryLocationType.HANDS)
10359 {
10360 if (new_player)
10361 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10362
10363 if (new_player == old_player)
10364 {
10365
10366 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10367 {
10368 if (oldLoc.GetType() == InventoryLocationType.CARGO)
10369 {
10370 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10371 {
10372 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10373 }
10374 }
10375 else
10376 {
10377 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10378 }
10379 }
10380
10381 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10382 {
10383 int type = oldLoc.GetType();
10384 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
10385 {
10386 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10387 }
10388 else if (type == InventoryLocationType.ATTACHMENT)
10389 {
10390 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10391 }
10392 }
10393 if (!m_OldLocation)
10394 {
10395 m_OldLocation = new InventoryLocation;
10396 }
10397 m_OldLocation.Copy(oldLoc);
10398 }
10399 else
10400 {
10401 if (m_OldLocation)
10402 {
10403 m_OldLocation.Reset();
10404 }
10405 }
10406
10408 }
10409 else
10410 {
10411 if (new_player)
10412 {
10413 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10414 if (res_index >= 0)
10415 {
10416 InventoryLocation il = new InventoryLocation;
10417 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10418 ItemBase it = ItemBase.Cast(il.GetItem());
10419 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10420 int rel_type = il.GetType();
10421 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
10422 {
10423 il.GetParent().GetOnReleaseLock().Invoke(it);
10424 }
10425 else if (rel_type == InventoryLocationType.ATTACHMENT)
10426 {
10427 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
10428 }
10429 //it.GetOnReleaseLock().Invoke(it);
10430 }
10431 }
10432 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
10433 {
10434 //ThrowPhysically(old_player, vector.Zero);
10435 m_ThrowItemOnDrop = false;
10436 }
10437
10438 if (m_OldLocation)
10439 {
10440 m_OldLocation.Reset();
10441 }
10442 }
10443 }
10444
10445 override void EOnContact(IEntity other, Contact extra)
10446 {
10448 {
10449 int liquidType = -1;
10450 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
10451 if (impactSpeed > 0.0)
10452 {
10453 m_ImpactSpeed = impactSpeed;
10454 #ifndef SERVER
10455 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10456 #else
10457 m_WantPlayImpactSound = true;
10458 SetSynchDirty();
10459 #endif
10460 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
10461 }
10462 }
10463
10464 #ifdef SERVER
10465 if (GetCompEM() && GetCompEM().IsPlugged())
10466 {
10467 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
10468 GetCompEM().UnplugThis();
10469 }
10470 #endif
10471 }
10472
10473 void RefreshPhysics();
10474
10475 override void OnCreatePhysics()
10476 {
10478 }
10479
10480 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10481 {
10482
10483 }
10484 // -------------------------------------------------------------------------
10485 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
10486 {
10487 super.OnItemLocationChanged(old_owner, new_owner);
10488
10489 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10490 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10491
10492 if (!relatedPlayer && playerNew)
10493 relatedPlayer = playerNew;
10494
10495 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10496 {
10497 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
10498 if (actionMgr)
10499 {
10500 ActionBase currentAction = actionMgr.GetRunningAction();
10501 if (currentAction)
10502 currentAction.OnItemLocationChanged(this);
10503 }
10504 }
10505
10506 Man ownerPlayerOld = null;
10507 Man ownerPlayerNew = null;
10508
10509 if (old_owner)
10510 {
10511 if (old_owner.IsMan())
10512 {
10513 ownerPlayerOld = Man.Cast(old_owner);
10514 }
10515 else
10516 {
10517 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10518 }
10519 }
10520 else
10521 {
10522 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
10523 {
10524 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
10525
10526 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
10527 {
10528 GetCompEM().UnplugThis();
10529 }
10530 }
10531 }
10532
10533 if (new_owner)
10534 {
10535 if (new_owner.IsMan())
10536 {
10537 ownerPlayerNew = Man.Cast(new_owner);
10538 }
10539 else
10540 {
10541 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10542 }
10543 }
10544
10545 if (ownerPlayerOld != ownerPlayerNew)
10546 {
10547 if (ownerPlayerOld)
10548 {
10549 array<EntityAI> subItemsExit = new array<EntityAI>;
10550 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
10551 for (int i = 0; i < subItemsExit.Count(); i++)
10552 {
10553 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
10554 itemExit.OnInventoryExit(ownerPlayerOld);
10555 }
10556 }
10557
10558 if (ownerPlayerNew)
10559 {
10560 array<EntityAI> subItemsEnter = new array<EntityAI>;
10561 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
10562 for (int j = 0; j < subItemsEnter.Count(); j++)
10563 {
10564 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
10565 itemEnter.OnInventoryEnter(ownerPlayerNew);
10566 }
10567 }
10568 }
10569 else if (ownerPlayerNew != null)
10570 {
10571 PlayerBase nplayer;
10572 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10573 {
10574 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10575 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
10576 for (int k = 0; k < subItemsUpdate.Count(); k++)
10577 {
10578 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
10579 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10580 }
10581 }
10582 }
10583
10584 if (old_owner)
10585 old_owner.OnChildItemRemoved(this);
10586 if (new_owner)
10587 new_owner.OnChildItemReceived(this);
10588 }
10589
10590 // -------------------------------------------------------------------------------
10591 override void EEDelete(EntityAI parent)
10592 {
10593 super.EEDelete(parent);
10594 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10595 if (player)
10596 {
10597 OnInventoryExit(player);
10598
10599 if (player.IsAlive())
10600 {
10601 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10602 if (r_index >= 0)
10603 {
10604 InventoryLocation r_il = new InventoryLocation;
10605 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10606
10607 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10608 int r_type = r_il.GetType();
10609 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10610 {
10611 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10612 }
10613 else if (r_type == InventoryLocationType.ATTACHMENT)
10614 {
10615 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10616 }
10617
10618 }
10619
10620 player.RemoveQuickBarEntityShortcut(this);
10621 }
10622 }
10623 }
10624 // -------------------------------------------------------------------------------
10625 override void EEKilled(Object killer)
10626 {
10627 super.EEKilled(killer);
10628
10630 if (killer && killer.IsFireplace() && CanExplodeInFire())
10631 {
10632 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10633 {
10634 if (IsMagazine())
10635 {
10636 if (Magazine.Cast(this).GetAmmoCount() > 0)
10637 {
10638 ExplodeAmmo();
10639 }
10640 }
10641 else
10642 {
10643 Explode(DamageType.EXPLOSION);
10644 }
10645 }
10646 }
10647 }
10648
10649 override void OnWasAttached(EntityAI parent, int slot_id)
10650 {
10651 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10652
10653 super.OnWasAttached(parent, slot_id);
10654
10655 if (HasQuantity())
10656 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10657
10658 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
10659 }
10660
10661 override void OnWasDetached(EntityAI parent, int slot_id)
10662 {
10663 super.OnWasDetached(parent, slot_id);
10664
10665 if (HasQuantity())
10666 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10667 }
10668
10669 override string ChangeIntoOnAttach(string slot)
10670 {
10671 int idx;
10672 TStringArray inventory_slots = new TStringArray;
10673 TStringArray attach_types = new TStringArray;
10674
10675 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10676 if (inventory_slots.Count() < 1) //is string
10677 {
10678 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10679 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10680 }
10681 else //is array
10682 {
10683 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10684 }
10685
10686 idx = inventory_slots.Find(slot);
10687 if (idx < 0)
10688 return "";
10689
10690 return attach_types.Get(idx);
10691 }
10692
10693 override string ChangeIntoOnDetach()
10694 {
10695 int idx = -1;
10696 string slot;
10697
10698 TStringArray inventory_slots = new TStringArray;
10699 TStringArray detach_types = new TStringArray;
10700
10701 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10702 if (inventory_slots.Count() < 1) //is string
10703 {
10704 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10705 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10706 }
10707 else //is array
10708 {
10709 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10710 if (detach_types.Count() < 1)
10711 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10712 }
10713
10714 for (int i = 0; i < inventory_slots.Count(); i++)
10715 {
10716 slot = inventory_slots.Get(i);
10717 }
10718
10719 if (slot != "")
10720 {
10721 if (detach_types.Count() == 1)
10722 idx = 0;
10723 else
10724 idx = inventory_slots.Find(slot);
10725 }
10726 if (idx < 0)
10727 return "";
10728
10729 return detach_types.Get(idx);
10730 }
10731
10732 void ExplodeAmmo()
10733 {
10734 //timer
10735 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
10736
10737 //min/max time
10738 float min_time = 1;
10739 float max_time = 3;
10740 float delay = Math.RandomFloat(min_time, max_time);
10741
10742 explode_timer.Run(delay, this, "DoAmmoExplosion");
10743 }
10744
10745 void DoAmmoExplosion()
10746 {
10747 Magazine magazine = Magazine.Cast(this);
10748 int pop_sounds_count = 6;
10749 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10750
10751 //play sound
10752 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10753 string sound_name = pop_sounds[ sound_idx ];
10754 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
10755
10756 //remove ammo count
10757 magazine.ServerAddAmmoCount(-1);
10758
10759 //if condition then repeat -> ExplodeAmmo
10760 float min_temp_to_explode = 100; //min temperature for item to explode
10761
10762 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
10763 {
10764 ExplodeAmmo();
10765 }
10766 }
10767
10768 // -------------------------------------------------------------------------------
10769 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
10770 {
10771 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
10772
10773 const int CHANCE_DAMAGE_CARGO = 4;
10774 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10775 const int CHANCE_DAMAGE_NOTHING = 2;
10776
10777 if (IsClothing() || IsContainer() || IsItemTent())
10778 {
10779 float dmg = damageResult.GetDamage("","Health") * -0.5;
10780 int chances;
10781 int rnd;
10782
10783 if (GetInventory().GetCargo())
10784 {
10785 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10786 rnd = Math.RandomInt(0,chances);
10787
10788 if (rnd < CHANCE_DAMAGE_CARGO)
10789 {
10790 DamageItemInCargo(dmg);
10791 }
10792 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10793 {
10795 }
10796 }
10797 else
10798 {
10799 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10800 rnd = Math.RandomInt(0,chances);
10801
10802 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10803 {
10805 }
10806 }
10807 }
10808 }
10809
10810 bool DamageItemInCargo(float damage)
10811 {
10812 if (GetInventory().GetCargo())
10813 {
10814 int item_count = GetInventory().GetCargo().GetItemCount();
10815 if (item_count > 0)
10816 {
10817 int random_pick = Math.RandomInt(0, item_count);
10818 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
10819 if (!item.IsExplosive())
10820 {
10821 item.AddHealth("","",damage);
10822 return true;
10823 }
10824 }
10825 }
10826 return false;
10827 }
10828
10829 bool DamageItemAttachments(float damage)
10830 {
10831 int attachment_count = GetInventory().AttachmentCount();
10832 if (attachment_count > 0)
10833 {
10834 int random_pick = Math.RandomInt(0, attachment_count);
10835 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10836 if (!attachment.IsExplosive())
10837 {
10838 attachment.AddHealth("","",damage);
10839 return true;
10840 }
10841 }
10842 return false;
10843 }
10844
10845 override bool IsSplitable()
10846 {
10847 return m_CanThisBeSplit;
10848 }
10849 //----------------
10850 override bool CanBeSplit()
10851 {
10852 if (IsSplitable() && (GetQuantity() > 1))
10853 return GetInventory().CanRemoveEntity();
10854
10855 return false;
10856 }
10857
10858 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10859 {
10860 if (!CanBeSplit())
10861 return;
10862
10863 if (GetGame().IsClient())
10864 {
10865 if (ScriptInputUserData.CanStoreInputUserData())
10866 {
10867 ScriptInputUserData ctx = new ScriptInputUserData;
10869 ctx.Write(1);
10870 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10871 ctx.Write(i1);
10872 ctx.Write(destination_entity);
10873 ctx.Write(true);
10874 ctx.Write(slot_id);
10875 ctx.Send();
10876 }
10877 }
10878 else if (!GetGame().IsMultiplayer())
10879 {
10880 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
10881 }
10882 }
10883
10884 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10885 {
10886 if (!CanBeSplit())
10887 return;
10888
10889 float split_quantity_new;
10890 ref ItemBase new_item;
10891 float quantity = GetQuantity();
10892 float stack_max = GetTargetQuantityMax(slot_id);
10893 InventoryLocation loc = new InventoryLocation;
10894
10895 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10896 {
10897 if (stack_max <= GetQuantity())
10898 split_quantity_new = stack_max;
10899 else
10900 split_quantity_new = GetQuantity();
10901
10902 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10903 if (new_item)
10904 {
10905 new_item.SetResultOfSplit(true);
10906 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10907 AddQuantity(-split_quantity_new);
10908 new_item.SetQuantity(split_quantity_new);
10909 }
10910 }
10911 else if (destination_entity && slot_id == -1)
10912 {
10913 if (quantity > stack_max)
10914 split_quantity_new = stack_max;
10915 else
10916 split_quantity_new = quantity;
10917
10918 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10919 {
10920 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10921 new_item = ItemBase.Cast(o);
10922 }
10923
10924 if (new_item)
10925 {
10926 new_item.SetResultOfSplit(true);
10927 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10928 AddQuantity(-split_quantity_new);
10929 new_item.SetQuantity(split_quantity_new);
10930 }
10931 }
10932 else
10933 {
10934 if (stack_max != 0)
10935 {
10936 if (stack_max < GetQuantity())
10937 {
10938 split_quantity_new = GetQuantity() - stack_max;
10939 }
10940
10941 if (split_quantity_new == 0)
10942 {
10943 if (!GetGame().IsMultiplayer())
10944 player.PhysicalPredictiveDropItem(this);
10945 else
10946 player.ServerDropEntity(this);
10947 return;
10948 }
10949
10950 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10951
10952 if (new_item)
10953 {
10954 new_item.SetResultOfSplit(true);
10955 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10956 SetQuantity(split_quantity_new);
10957 new_item.SetQuantity(stack_max);
10958 new_item.PlaceOnSurface();
10959 }
10960 }
10961 }
10962 }
10963
10964 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10965 {
10966 if (!CanBeSplit())
10967 return;
10968
10969 float split_quantity_new;
10970 ref ItemBase new_item;
10971 float quantity = GetQuantity();
10972 float stack_max = GetTargetQuantityMax(slot_id);
10973 InventoryLocation loc = new InventoryLocation;
10974
10975 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10976 {
10977 if (stack_max <= GetQuantity())
10978 split_quantity_new = stack_max;
10979 else
10980 split_quantity_new = GetQuantity();
10981
10982 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10983 if (new_item)
10984 {
10985 new_item.SetResultOfSplit(true);
10986 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10987 AddQuantity(-split_quantity_new);
10988 new_item.SetQuantity(split_quantity_new);
10989 }
10990 }
10991 else if (destination_entity && slot_id == -1)
10992 {
10993 if (quantity > stack_max)
10994 split_quantity_new = stack_max;
10995 else
10996 split_quantity_new = quantity;
10997
10998 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10999 {
11000 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
11001 new_item = ItemBase.Cast(o);
11002 }
11003
11004 if (new_item)
11005 {
11006 new_item.SetResultOfSplit(true);
11007 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11008 AddQuantity(-split_quantity_new);
11009 new_item.SetQuantity(split_quantity_new);
11010 }
11011 }
11012 else
11013 {
11014 if (stack_max != 0)
11015 {
11016 if (stack_max < GetQuantity())
11017 {
11018 split_quantity_new = GetQuantity() - stack_max;
11019 }
11020
11021 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
11022
11023 if (new_item)
11024 {
11025 new_item.SetResultOfSplit(true);
11026 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11027 SetQuantity(split_quantity_new);
11028 new_item.SetQuantity(stack_max);
11029 new_item.PlaceOnSurface();
11030 }
11031 }
11032 }
11033 }
11034
11035 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
11036 {
11037 if (!CanBeSplit())
11038 return;
11039
11040 if (GetGame().IsClient())
11041 {
11042 if (ScriptInputUserData.CanStoreInputUserData())
11043 {
11044 ScriptInputUserData ctx = new ScriptInputUserData;
11046 ctx.Write(4);
11047 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11048 ctx.Write(thiz);
11049 dst.WriteToContext(ctx);
11050 ctx.Send();
11051 }
11052 }
11053 else if (!GetGame().IsMultiplayer())
11054 {
11056 }
11057 }
11058
11059 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
11060 {
11061 if (!CanBeSplit())
11062 return;
11063
11064 if (GetGame().IsClient())
11065 {
11066 if (ScriptInputUserData.CanStoreInputUserData())
11067 {
11068 ScriptInputUserData ctx = new ScriptInputUserData;
11070 ctx.Write(2);
11071 ItemBase dummy = this; // @NOTE: workaround for correct serialization
11072 ctx.Write(dummy);
11073 ctx.Write(destination_entity);
11074 ctx.Write(true);
11075 ctx.Write(idx);
11076 ctx.Write(row);
11077 ctx.Write(col);
11078 ctx.Send();
11079 }
11080 }
11081 else if (!GetGame().IsMultiplayer())
11082 {
11083 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
11084 }
11085 }
11086
11087 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
11088 {
11090 }
11091
11092 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
11093 {
11094 if (!CanBeSplit())
11095 return this;
11096
11097 float quantity = GetQuantity();
11098 float split_quantity_new;
11099 ItemBase new_item;
11100 if (dst.IsValid())
11101 {
11102 int slot_id = dst.GetSlot();
11103 float stack_max = GetTargetQuantityMax(slot_id);
11104
11105 if (quantity > stack_max)
11106 split_quantity_new = stack_max;
11107 else
11108 split_quantity_new = quantity;
11109
11110 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11111
11112 if (new_item)
11113 {
11114 new_item.SetResultOfSplit(true);
11115 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11116 AddQuantity(-split_quantity_new);
11117 new_item.SetQuantity(split_quantity_new);
11118 }
11119
11120 return new_item;
11121 }
11122
11123 return null;
11124 }
11125
11126 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
11127 {
11128 if (!CanBeSplit())
11129 return;
11130
11131 float quantity = GetQuantity();
11132 float split_quantity_new;
11133 ref ItemBase new_item;
11134 if (destination_entity)
11135 {
11136 float stackable = GetTargetQuantityMax();
11137 if (quantity > stackable)
11138 split_quantity_new = stackable;
11139 else
11140 split_quantity_new = quantity;
11141
11142 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
11143 if (new_item)
11144 {
11145 new_item.SetResultOfSplit(true);
11146 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11147 AddQuantity(-split_quantity_new);
11148 new_item.SetQuantity(split_quantity_new);
11149 }
11150 }
11151 }
11152
11153 void SplitIntoStackMaxHandsClient(PlayerBase player)
11154 {
11155 if (!CanBeSplit())
11156 return;
11157
11158 if (GetGame().IsClient())
11159 {
11160 if (ScriptInputUserData.CanStoreInputUserData())
11161 {
11162 ScriptInputUserData ctx = new ScriptInputUserData;
11164 ctx.Write(3);
11165 ItemBase i1 = this; // @NOTE: workaround for correct serialization
11166 ctx.Write(i1);
11167 ItemBase destination_entity = this;
11168 ctx.Write(destination_entity);
11169 ctx.Write(true);
11170 ctx.Write(0);
11171 ctx.Send();
11172 }
11173 }
11174 else if (!GetGame().IsMultiplayer())
11175 {
11176 SplitIntoStackMaxHands(player);
11177 }
11178 }
11179
11180 void SplitIntoStackMaxHands(PlayerBase player)
11181 {
11182 if (!CanBeSplit())
11183 return;
11184
11185 float quantity = GetQuantity();
11186 float split_quantity_new;
11187 ref ItemBase new_item;
11188 if (player)
11189 {
11190 float stackable = GetTargetQuantityMax();
11191 if (quantity > stackable)
11192 split_quantity_new = stackable;
11193 else
11194 split_quantity_new = quantity;
11195
11196 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
11197 new_item = ItemBase.Cast(in_hands);
11198 if (new_item)
11199 {
11200 new_item.SetResultOfSplit(true);
11201 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11202 AddQuantity(-split_quantity_new);
11203 new_item.SetQuantity(split_quantity_new);
11204 }
11205 }
11206 }
11207
11208 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
11209 {
11210 if (!CanBeSplit())
11211 return;
11212
11213 float quantity = GetQuantity();
11214 float split_quantity_new = Math.Floor(quantity * 0.5);
11215
11216 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11217
11218 if (new_item)
11219 {
11220 if (new_item.GetQuantityMax() < split_quantity_new)
11221 {
11222 split_quantity_new = new_item.GetQuantityMax();
11223 }
11224
11225 new_item.SetResultOfSplit(true);
11226 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11227
11228 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11229 {
11230 AddQuantity(-1);
11231 new_item.SetQuantity(1);
11232 }
11233 else
11234 {
11235 AddQuantity(-split_quantity_new);
11236 new_item.SetQuantity(split_quantity_new);
11237 }
11238 }
11239 }
11240
11241 void SplitItem(PlayerBase player)
11242 {
11243 if (!CanBeSplit())
11244 return;
11245
11246 float quantity = GetQuantity();
11247 float split_quantity_new = Math.Floor(quantity / 2);
11248
11249 InventoryLocation invloc = new InventoryLocation;
11250 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
11251
11252 ItemBase new_item;
11253 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11254
11255 if (new_item)
11256 {
11257 if (new_item.GetQuantityMax() < split_quantity_new)
11258 {
11259 split_quantity_new = new_item.GetQuantityMax();
11260 }
11261 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11262 {
11263 AddQuantity(-1);
11264 new_item.SetQuantity(1);
11265 }
11266 else
11267 {
11268 AddQuantity(-split_quantity_new);
11269 new_item.SetQuantity(split_quantity_new);
11270 }
11271 }
11272 }
11273
11275 void OnQuantityChanged(float delta)
11276 {
11277 SetWeightDirty();
11278 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
11279
11280 if (parent)
11281 parent.OnAttachmentQuantityChangedEx(this, delta);
11282
11283 if (IsLiquidContainer())
11284 {
11285 if (GetQuantityNormalized() <= 0.0)
11286 {
11288 }
11289 else if (GetLiquidType() == LIQUID_NONE)
11290 {
11291 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
11293 }
11294 }
11295
11296 }
11297
11300 {
11301 // insert code here
11302 }
11303
11305 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
11306 {
11308 }
11309
11310 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
11311 {
11312 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11313
11314 if (GetGame().IsServer())
11315 {
11316 if (newLevel == GameConstants.STATE_RUINED)
11317 {
11319 EntityAI parent = GetHierarchyParent();
11320 if (parent && parent.IsFireplace())
11321 {
11322 CargoBase cargo = GetInventory().GetCargo();
11323 if (cargo)
11324 {
11325 for (int i = 0; i < cargo.GetItemCount(); ++i)
11326 {
11327 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
11328 }
11329 }
11330 }
11331 }
11332
11333 if (IsResultOfSplit())
11334 {
11335 // reset the splitting result flag, return to normal item behavior
11336 SetResultOfSplit(false);
11337 return;
11338 }
11339
11340 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11341 {
11342 SetCleanness(0);//unclean the item upon damage dealt
11343 }
11344 }
11345 }
11346
11347 // just the split? TODO: verify
11348 override void OnRightClick()
11349 {
11350 super.OnRightClick();
11351
11352 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
11353 {
11354 if (GetGame().IsClient())
11355 {
11356 if (ScriptInputUserData.CanStoreInputUserData())
11357 {
11358 vector m4[4];
11359 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
11360
11361 EntityAI root = GetHierarchyRoot();
11362
11363 InventoryLocation dst = new InventoryLocation;
11364 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
11365 {
11366 if (root)
11367 {
11368 root.GetTransform(m4);
11369 dst.SetGround(this, m4);
11370 }
11371 else
11372 GetInventory().GetCurrentInventoryLocation(dst);
11373 }
11374 else
11375 {
11376 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
11377 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
11378 this shouldnt cause issues within this scope*/
11379 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
11380 {
11381 if (root)
11382 {
11383 root.GetTransform(m4);
11384 dst.SetGround(this, m4);
11385 }
11386 else
11387 GetInventory().GetCurrentInventoryLocation(dst);
11388 }
11389 else
11390 {
11391 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11392 }
11393 }
11394
11395 ScriptInputUserData ctx = new ScriptInputUserData;
11397 ctx.Write(4);
11398 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11399 ctx.Write(thiz);
11400 dst.WriteToContext(ctx);
11401 ctx.Write(true); // dummy
11402 ctx.Send();
11403 }
11404 }
11405 else if (!GetGame().IsMultiplayer())
11406 {
11407 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
11408 }
11409 }
11410 }
11411
11412 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
11413 {
11414 //TODO: delete check zero quantity check after fix double posts hands fsm events
11415 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
11416 return false;
11417
11418 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11419 return false;
11420
11421 //can_this_be_combined = ConfigGetBool("canBeSplit");
11423 return false;
11424
11425
11426 Magazine mag = Magazine.Cast(this);
11427 if (mag)
11428 {
11429 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11430 return false;
11431
11432 if (stack_max_limit)
11433 {
11434 Magazine other_mag = Magazine.Cast(other_item);
11435 if (other_item)
11436 {
11437 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11438 return false;
11439 }
11440
11441 }
11442 }
11443 else
11444 {
11445 //TODO: delete check zero quantity check after fix double posts hands fsm events
11446 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
11447 return false;
11448
11449 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
11450 return false;
11451 }
11452
11453 PlayerBase player = null;
11454 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
11455 {
11456 if (player.GetInventory().HasAttachment(this))
11457 return false;
11458
11459 if (player.IsItemsToDelete())
11460 return false;
11461 }
11462
11463 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11464 return false;
11465
11466 int slotID;
11467 string slotName;
11468 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11469 return false;
11470
11471 return true;
11472 }
11473
11474 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
11475 {
11476 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
11477 }
11478
11479 bool IsResultOfSplit()
11480 {
11481 return m_IsResultOfSplit;
11482 }
11483
11484 void SetResultOfSplit(bool value)
11485 {
11486 m_IsResultOfSplit = value;
11487 }
11488
11489 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
11490 {
11491 return ComputeQuantityUsedEx(other_item, use_stack_max);
11492 }
11493
11494 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
11495 {
11496 float other_item_quantity = other_item.GetQuantity();
11497 float this_free_space;
11498
11499 float stack_max = GetQuantityMax();
11500
11501 this_free_space = stack_max - GetQuantity();
11502
11503 if (other_item_quantity > this_free_space)
11504 {
11505 return this_free_space;
11506 }
11507 else
11508 {
11509 return other_item_quantity;
11510 }
11511 }
11512
11513 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
11514 {
11515 CombineItems(ItemBase.Cast(entity2),use_stack_max);
11516 }
11517
11518 void CombineItems(ItemBase other_item, bool use_stack_max = true)
11519 {
11520 if (!CanBeCombined(other_item, false))
11521 return;
11522
11523 if (!IsMagazine() && other_item)
11524 {
11525 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
11526 if (quantity_used != 0)
11527 {
11528 float hp1 = GetHealth01("","");
11529 float hp2 = other_item.GetHealth01("","");
11530 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
11531 hpResult = hpResult / (GetQuantity() + quantity_used);
11532
11533 hpResult *= GetMaxHealth();
11534 Math.Round(hpResult);
11535 SetHealth("", "Health", hpResult);
11536
11537 AddQuantity(quantity_used);
11538 other_item.AddQuantity(-quantity_used);
11539 }
11540 }
11541 OnCombine(other_item);
11542 }
11543
11544 void OnCombine(ItemBase other_item)
11545 {
11546 #ifdef SERVER
11547 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11548 GetHierarchyParent().IncreaseLifetimeUp();
11549 #endif
11550 };
11551
11552 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
11553 {
11554 PlayerBase p = PlayerBase.Cast(player);
11555
11556 array<int> recipesIds = p.m_Recipes;
11557 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11558 if (moduleRecipesManager)
11559 {
11560 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11561 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
11562 }
11563
11564 for (int i = 0;i < recipesIds.Count(); i++)
11565 {
11566 int key = recipesIds.Get(i);
11567 string recipeName = moduleRecipesManager.GetRecipeName(key);
11568 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
11569 }
11570 }
11571
11572 // -------------------------------------------------------------------------
11573 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11574 {
11575 super.GetDebugActions(outputList);
11576
11577 //quantity
11578 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
11579 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
11580 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
11581 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
11582
11583 //health
11584 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
11585 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
11586 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
11587 //temperature
11588 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
11589 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
11590 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
11591
11592 //wet
11593 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
11594 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
11595
11596 //liquidtype
11597 if (IsLiquidContainer())
11598 {
11599 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
11600 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
11601 }
11602
11603 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
11604 // watch
11605 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
11606 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
11607
11608 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
11609 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
11610 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
11611 }
11612
11613 // -------------------------------------------------------------------------
11614 // -------------------------------------------------------------------------
11615 // -------------------------------------------------------------------------
11616 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
11617 {
11618 super.OnAction(action_id, player, ctx);
11619 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
11620 {
11621 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11622 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
11623 PlayerBase p = PlayerBase.Cast(player);
11624 if (EActions.RECIPES_RANGE_START < 1000)
11625 {
11626 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11627 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11628 }
11629 }
11630 #ifndef SERVER
11631 else if (action_id == EActions.WATCH_PLAYER)
11632 {
11633 PluginDeveloper.SetDeveloperItemClientEx(player);
11634 }
11635 #endif
11636 if (GetGame().IsServer())
11637 {
11638 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11639 {
11640 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11641 OnDebugButtonPressServer(id + 1);
11642 }
11643
11644 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11645 {
11646 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11647 InsertAgent(agent_id,100);
11648 }
11649
11650 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11651 {
11652 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11653 RemoveAgent(agent_id2);
11654 }
11655
11656 else if (action_id == EActions.ADD_QUANTITY)
11657 {
11658 if (IsMagazine())
11659 {
11660 Magazine mag = Magazine.Cast(this);
11661 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11662 }
11663 else
11664 {
11665 AddQuantity(GetQuantityMax() * 0.2);
11666 }
11667
11668 if (m_EM)
11669 {
11670 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11671 }
11672 //PrintVariables();
11673 }
11674
11675 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
11676 {
11677 if (IsMagazine())
11678 {
11679 Magazine mag2 = Magazine.Cast(this);
11680 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11681 }
11682 else
11683 {
11684 AddQuantity(- GetQuantityMax() * 0.2);
11685 }
11686 if (m_EM)
11687 {
11688 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11689 }
11690 //PrintVariables();
11691 }
11692
11693 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
11694 {
11695 SetQuantity(0);
11696
11697 if (m_EM)
11698 {
11699 m_EM.SetEnergy(0);
11700 }
11701 }
11702
11703 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
11704 {
11706
11707 if (m_EM)
11708 {
11709 m_EM.SetEnergy(m_EM.GetEnergyMax());
11710 }
11711 }
11712
11713 else if (action_id == EActions.ADD_HEALTH)
11714 {
11715 AddHealth("","",GetMaxHealth("","Health")/5);
11716 }
11717 else if (action_id == EActions.REMOVE_HEALTH)
11718 {
11719 AddHealth("","",-GetMaxHealth("","Health")/5);
11720 }
11721 else if (action_id == EActions.DESTROY_HEALTH)
11722 {
11723 SetHealth01("","",0);
11724 }
11725 else if (action_id == EActions.WATCH_ITEM)
11726 {
11728 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11729 #ifdef DEVELOPER
11730 SetDebugDeveloper_item(this);
11731 #endif
11732 }
11733
11734 else if (action_id == EActions.ADD_TEMPERATURE)
11735 {
11736 AddTemperature(20);
11737 //PrintVariables();
11738 }
11739
11740 else if (action_id == EActions.REMOVE_TEMPERATURE)
11741 {
11742 AddTemperature(-20);
11743 //PrintVariables();
11744 }
11745
11746 else if (action_id == EActions.FLIP_FROZEN)
11747 {
11748 SetFrozen(!GetIsFrozen());
11749 //PrintVariables();
11750 }
11751
11752 else if (action_id == EActions.ADD_WETNESS)
11753 {
11754 AddWet(GetWetMax()/5);
11755 //PrintVariables();
11756 }
11757
11758 else if (action_id == EActions.REMOVE_WETNESS)
11759 {
11760 AddWet(-GetWetMax()/5);
11761 //PrintVariables();
11762 }
11763
11764 else if (action_id == EActions.LIQUIDTYPE_UP)
11765 {
11766 int curr_type = GetLiquidType();
11767 SetLiquidType(curr_type * 2);
11768 //AddWet(1);
11769 //PrintVariables();
11770 }
11771
11772 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11773 {
11774 int curr_type2 = GetLiquidType();
11775 SetLiquidType(curr_type2 / 2);
11776 }
11777
11778 else if (action_id == EActions.MAKE_SPECIAL)
11779 {
11780 auto debugParams = DebugSpawnParams.WithPlayer(player);
11781 OnDebugSpawnEx(debugParams);
11782 }
11783
11784 else if (action_id == EActions.DELETE)
11785 {
11786 Delete();
11787 }
11788
11789 }
11790
11791
11792 return false;
11793 }
11794
11795 // -------------------------------------------------------------------------
11796
11797
11800 void OnActivatedByTripWire();
11801
11803 void OnActivatedByItem(notnull ItemBase item);
11804
11805 //----------------------------------------------------------------
11806 //returns true if item is able to explode when put in fire
11807 bool CanExplodeInFire()
11808 {
11809 return false;
11810 }
11811
11812 //----------------------------------------------------------------
11813 bool CanEat()
11814 {
11815 return true;
11816 }
11817
11818 //----------------------------------------------------------------
11819 override bool IsIgnoredByConstruction()
11820 {
11821 return true;
11822 }
11823
11824 //----------------------------------------------------------------
11825 //has FoodStages in config?
11826 bool HasFoodStage()
11827 {
11828 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11829 return GetGame().ConfigIsExisting(config_path);
11830 }
11831
11833 FoodStage GetFoodStage()
11834 {
11835 return null;
11836 }
11837
11838 bool CanBeCooked()
11839 {
11840 return false;
11841 }
11842
11843 bool CanBeCookedOnStick()
11844 {
11845 return false;
11846 }
11847
11849 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11851
11852 //----------------------------------------------------------------
11853 bool CanRepair(ItemBase item_repair_kit)
11854 {
11855 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11856 return module_repairing.CanRepair(this, item_repair_kit);
11857 }
11858
11859 //----------------------------------------------------------------
11860 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11861 {
11862 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11863 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11864 }
11865
11866 //----------------------------------------------------------------
11867 int GetItemSize()
11868 {
11869 /*
11870 vector v_size = this.ConfigGetVector("itemSize");
11871 int v_size_x = v_size[0];
11872 int v_size_y = v_size[1];
11873 int size = v_size_x * v_size_y;
11874 return size;
11875 */
11876
11877 return 1;
11878 }
11879
11880 //----------------------------------------------------------------
11881 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11882 bool CanBeMovedOverride()
11883 {
11884 return m_CanBeMovedOverride;
11885 }
11886
11887 //----------------------------------------------------------------
11888 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11889 void SetCanBeMovedOverride(bool setting)
11890 {
11891 m_CanBeMovedOverride = setting;
11892 }
11893
11894 //----------------------------------------------------------------
11902 void MessageToOwnerStatus(string text)
11903 {
11904 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11905
11906 if (player)
11907 {
11908 player.MessageStatus(text);
11909 }
11910 }
11911
11912 //----------------------------------------------------------------
11920 void MessageToOwnerAction(string text)
11921 {
11922 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11923
11924 if (player)
11925 {
11926 player.MessageAction(text);
11927 }
11928 }
11929
11930 //----------------------------------------------------------------
11938 void MessageToOwnerFriendly(string text)
11939 {
11940 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11941
11942 if (player)
11943 {
11944 player.MessageFriendly(text);
11945 }
11946 }
11947
11948 //----------------------------------------------------------------
11956 void MessageToOwnerImportant(string text)
11957 {
11958 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11959
11960 if (player)
11961 {
11962 player.MessageImportant(text);
11963 }
11964 }
11965
11966 override bool IsItemBase()
11967 {
11968 return true;
11969 }
11970
11971 // Checks if item is of questioned kind
11972 override bool KindOf(string tag)
11973 {
11974 bool found = false;
11975 string item_name = this.GetType();
11976 ref TStringArray item_tag_array = new TStringArray;
11977 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11978
11979 int array_size = item_tag_array.Count();
11980 for (int i = 0; i < array_size; i++)
11981 {
11982 if (item_tag_array.Get(i) == tag)
11983 {
11984 found = true;
11985 break;
11986 }
11987 }
11988 return found;
11989 }
11990
11991
11992 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11993 {
11994 //Debug.Log("OnRPC called");
11995 super.OnRPC(sender, rpc_type,ctx);
11996
11997 //Play soundset for attachment locking (ActionLockAttachment.c)
11998 switch (rpc_type)
11999 {
12000 #ifndef SERVER
12001 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12002 Param2<bool, string> p = new Param2<bool, string>(false, "");
12003
12004 if (!ctx.Read(p))
12005 return;
12006
12007 bool play = p.param1;
12008 string soundSet = p.param2;
12009
12010 if (play)
12011 {
12012 if (m_LockingSound)
12013 {
12015 {
12016 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
12017 }
12018 }
12019 else
12020 {
12021 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
12022 }
12023 }
12024 else
12025 {
12026 SEffectManager.DestroyEffect(m_LockingSound);
12027 }
12028
12029 break;
12030 #endif
12031
12032 }
12033
12034 if (GetWrittenNoteData())
12035 {
12036 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
12037 }
12038 }
12039
12040 //-----------------------------
12041 // VARIABLE MANIPULATION SYSTEM
12042 //-----------------------------
12043 int NameToID(string name)
12044 {
12045 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
12046 return plugin.GetID(name);
12047 }
12048
12049 string IDToName(int id)
12050 {
12051 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
12052 return plugin.GetName(id);
12053 }
12054
12056 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
12057 {
12058 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
12059 //read the flags
12060 int varFlags;
12061 if (!ctx.Read(varFlags))
12062 return;
12063
12064 if (varFlags & ItemVariableFlags.FLOAT)
12065 {
12066 ReadVarsFromCTX(ctx);
12067 }
12068 }
12069
12070 override void SerializeNumericalVars(array<float> floats_out)
12071 {
12072 //some variables handled on EntityAI level already!
12073 super.SerializeNumericalVars(floats_out);
12074
12075 // the order of serialization must be the same as the order of de-serialization
12076 //--------------------------------------------
12077 if (IsVariableSet(VARIABLE_QUANTITY))
12078 {
12079 floats_out.Insert(m_VarQuantity);
12080 }
12081 //--------------------------------------------
12082 if (IsVariableSet(VARIABLE_WET))
12083 {
12084 floats_out.Insert(m_VarWet);
12085 }
12086 //--------------------------------------------
12087 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12088 {
12089 floats_out.Insert(m_VarLiquidType);
12090 }
12091 //--------------------------------------------
12092 if (IsVariableSet(VARIABLE_COLOR))
12093 {
12094 floats_out.Insert(m_ColorComponentR);
12095 floats_out.Insert(m_ColorComponentG);
12096 floats_out.Insert(m_ColorComponentB);
12097 floats_out.Insert(m_ColorComponentA);
12098 }
12099 //--------------------------------------------
12100 if (IsVariableSet(VARIABLE_CLEANNESS))
12101 {
12102 floats_out.Insert(m_Cleanness);
12103 }
12104 }
12105
12106 override void DeSerializeNumericalVars(array<float> floats)
12107 {
12108 //some variables handled on EntityAI level already!
12109 super.DeSerializeNumericalVars(floats);
12110
12111 // the order of serialization must be the same as the order of de-serialization
12112 int index = 0;
12113 int mask = Math.Round(floats.Get(index));
12114
12115 index++;
12116 //--------------------------------------------
12117 if (mask & VARIABLE_QUANTITY)
12118 {
12119 if (m_IsStoreLoad)
12120 {
12121 SetStoreLoadedQuantity(floats.Get(index));
12122 }
12123 else
12124 {
12125 float quantity = floats.Get(index);
12126 SetQuantity(quantity, true, false, false, false);
12127 }
12128 index++;
12129 }
12130 //--------------------------------------------
12131 if (mask & VARIABLE_WET)
12132 {
12133 float wet = floats.Get(index);
12134 SetWet(wet);
12135 index++;
12136 }
12137 //--------------------------------------------
12138 if (mask & VARIABLE_LIQUIDTYPE)
12139 {
12140 int liquidtype = Math.Round(floats.Get(index));
12141 SetLiquidType(liquidtype);
12142 index++;
12143 }
12144 //--------------------------------------------
12145 if (mask & VARIABLE_COLOR)
12146 {
12147 m_ColorComponentR = Math.Round(floats.Get(index));
12148 index++;
12149 m_ColorComponentG = Math.Round(floats.Get(index));
12150 index++;
12151 m_ColorComponentB = Math.Round(floats.Get(index));
12152 index++;
12153 m_ColorComponentA = Math.Round(floats.Get(index));
12154 index++;
12155 }
12156 //--------------------------------------------
12157 if (mask & VARIABLE_CLEANNESS)
12158 {
12159 int cleanness = Math.Round(floats.Get(index));
12160 SetCleanness(cleanness);
12161 index++;
12162 }
12163 }
12164
12165 override void WriteVarsToCTX(ParamsWriteContext ctx)
12166 {
12167 super.WriteVarsToCTX(ctx);
12168
12169 //--------------------------------------------
12170 if (IsVariableSet(VARIABLE_QUANTITY))
12171 {
12172 ctx.Write(GetQuantity());
12173 }
12174 //--------------------------------------------
12175 if (IsVariableSet(VARIABLE_WET))
12176 {
12177 ctx.Write(GetWet());
12178 }
12179 //--------------------------------------------
12180 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12181 {
12182 ctx.Write(GetLiquidType());
12183 }
12184 //--------------------------------------------
12185 if (IsVariableSet(VARIABLE_COLOR))
12186 {
12187 int r,g,b,a;
12188 GetColor(r,g,b,a);
12189 ctx.Write(r);
12190 ctx.Write(g);
12191 ctx.Write(b);
12192 ctx.Write(a);
12193 }
12194 //--------------------------------------------
12195 if (IsVariableSet(VARIABLE_CLEANNESS))
12196 {
12197 ctx.Write(GetCleanness());
12198 }
12199 }
12200
12201 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
12202 {
12203 if (!super.ReadVarsFromCTX(ctx,version))
12204 return false;
12205
12206 int intValue;
12207 float value;
12208
12209 if (version < 140)
12210 {
12211 if (!ctx.Read(intValue))
12212 return false;
12213
12214 m_VariablesMask = intValue;
12215 }
12216
12217 if (m_VariablesMask & VARIABLE_QUANTITY)
12218 {
12219 if (!ctx.Read(value))
12220 return false;
12221
12222 if (IsStoreLoad())
12223 {
12225 }
12226 else
12227 {
12228 SetQuantity(value, true, false, false, false);
12229 }
12230 }
12231 //--------------------------------------------
12232 if (version < 140)
12233 {
12234 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12235 {
12236 if (!ctx.Read(value))
12237 return false;
12238 SetTemperatureDirect(value);
12239 }
12240 }
12241 //--------------------------------------------
12242 if (m_VariablesMask & VARIABLE_WET)
12243 {
12244 if (!ctx.Read(value))
12245 return false;
12246 SetWet(value);
12247 }
12248 //--------------------------------------------
12249 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
12250 {
12251 if (!ctx.Read(intValue))
12252 return false;
12253 SetLiquidType(intValue);
12254 }
12255 //--------------------------------------------
12256 if (m_VariablesMask & VARIABLE_COLOR)
12257 {
12258 int r,g,b,a;
12259 if (!ctx.Read(r))
12260 return false;
12261 if (!ctx.Read(g))
12262 return false;
12263 if (!ctx.Read(b))
12264 return false;
12265 if (!ctx.Read(a))
12266 return false;
12267
12268 SetColor(r,g,b,a);
12269 }
12270 //--------------------------------------------
12271 if (m_VariablesMask & VARIABLE_CLEANNESS)
12272 {
12273 if (!ctx.Read(intValue))
12274 return false;
12275 SetCleanness(intValue);
12276 }
12277 //--------------------------------------------
12278 if (version >= 138 && version < 140)
12279 {
12280 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12281 {
12282 if (!ctx.Read(intValue))
12283 return false;
12284 SetFrozen(intValue);
12285 }
12286 }
12287
12288 return true;
12289 }
12290
12291 //----------------------------------------------------------------
12292 override bool OnStoreLoad(ParamsReadContext ctx, int version)
12293 {
12294 m_IsStoreLoad = true;
12296 {
12297 m_FixDamageSystemInit = true;
12298 }
12299
12300 if (!super.OnStoreLoad(ctx, version))
12301 {
12302 m_IsStoreLoad = false;
12303 return false;
12304 }
12305
12306 if (version >= 114)
12307 {
12308 bool hasQuickBarIndexSaved;
12309
12310 if (!ctx.Read(hasQuickBarIndexSaved))
12311 {
12312 m_IsStoreLoad = false;
12313 return false;
12314 }
12315
12316 if (hasQuickBarIndexSaved)
12317 {
12318 int itmQBIndex;
12319
12320 //Load quickbar item bind
12321 if (!ctx.Read(itmQBIndex))
12322 {
12323 m_IsStoreLoad = false;
12324 return false;
12325 }
12326
12327 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12328 if (itmQBIndex != -1 && parentPlayer)
12329 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12330 }
12331 }
12332 else
12333 {
12334 // Backup of how it used to be
12335 PlayerBase player;
12336 int itemQBIndex;
12337 if (version == int.MAX)
12338 {
12339 if (!ctx.Read(itemQBIndex))
12340 {
12341 m_IsStoreLoad = false;
12342 return false;
12343 }
12344 }
12345 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12346 {
12347 //Load quickbar item bind
12348 if (!ctx.Read(itemQBIndex))
12349 {
12350 m_IsStoreLoad = false;
12351 return false;
12352 }
12353 if (itemQBIndex != -1 && player)
12354 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12355 }
12356 }
12357
12358 if (version < 140)
12359 {
12360 // variable management system
12361 if (!LoadVariables(ctx, version))
12362 {
12363 m_IsStoreLoad = false;
12364 return false;
12365 }
12366 }
12367
12368 //agent trasmission system
12369 if (!LoadAgents(ctx, version))
12370 {
12371 m_IsStoreLoad = false;
12372 return false;
12373 }
12374 if (version >= 132)
12375 {
12376 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12377 if (raib)
12378 {
12379 if (!raib.OnStoreLoad(ctx,version))
12380 {
12381 m_IsStoreLoad = false;
12382 return false;
12383 }
12384 }
12385 }
12386
12387 m_IsStoreLoad = false;
12388 return true;
12389 }
12390
12391 //----------------------------------------------------------------
12392
12393 override void OnStoreSave(ParamsWriteContext ctx)
12394 {
12395 super.OnStoreSave(ctx);
12396
12397 PlayerBase player;
12398 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12399 {
12400 ctx.Write(true); // Keep track of if we should actually read this in or not
12401 //Save quickbar item bind
12402 int itemQBIndex = -1;
12403 itemQBIndex = player.FindQuickBarEntityIndex(this);
12404 ctx.Write(itemQBIndex);
12405 }
12406 else
12407 {
12408 ctx.Write(false); // Keep track of if we should actually read this in or not
12409 }
12410
12411 SaveAgents(ctx);//agent trasmission system
12412
12413 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12414 if (raib)
12415 {
12416 raib.OnStoreSave(ctx);
12417 }
12418 }
12419 //----------------------------------------------------------------
12420
12421 override void AfterStoreLoad()
12422 {
12423 super.AfterStoreLoad();
12424
12426 {
12428 }
12429
12430 if (GetStoreLoadedQuantity() != float.LOWEST)
12431 {
12433 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
12434 }
12435 }
12436
12437 override void EEOnAfterLoad()
12438 {
12439 super.EEOnAfterLoad();
12440
12442 {
12443 m_FixDamageSystemInit = false;
12444 }
12445
12448 }
12449
12450 bool CanBeDisinfected()
12451 {
12452 return false;
12453 }
12454
12455
12456 //----------------------------------------------------------------
12457 override void OnVariablesSynchronized()
12458 {
12459 if (m_Initialized)
12460 {
12461 #ifdef PLATFORM_CONSOLE
12462 //bruteforce it is
12463 if (IsSplitable())
12464 {
12465 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
12466 if (menu)
12467 {
12468 menu.Refresh();
12469 }
12470 }
12471 #endif
12472 }
12473
12475 {
12476 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
12477 m_WantPlayImpactSound = false;
12478 }
12479
12481 {
12482 SetWeightDirty();
12484 }
12485 if (m_VarWet != m_VarWetPrev)
12486 {
12489 }
12490
12491 if (m_SoundSyncPlay != 0)
12492 {
12493 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
12494 m_SoundSyncPlay = 0;
12495 }
12496 if (m_SoundSyncStop != 0)
12497 {
12498 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
12499 m_SoundSyncStop = 0;
12500 }
12501
12502 super.OnVariablesSynchronized();
12503 }
12504
12505 //------------------------- Quantity
12506 //----------------------------------------------------------------
12508 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
12509 {
12510 if (!IsServerCheck(allow_client))
12511 return false;
12512
12513 if (!HasQuantity())
12514 return false;
12515
12516 float min = GetQuantityMin();
12517 float max = GetQuantityMax();
12518
12519 if (value <= (min + 0.001))
12520 value = min;
12521
12522 if (value == min)
12523 {
12524 if (destroy_config)
12525 {
12526 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12527 if (dstr)
12528 {
12529 m_VarQuantity = Math.Clamp(value, min, max);
12530 this.Delete();
12531 return true;
12532 }
12533 }
12534 else if (destroy_forced)
12535 {
12536 m_VarQuantity = Math.Clamp(value, min, max);
12537 this.Delete();
12538 return true;
12539 }
12540 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
12541 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
12542 }
12543
12544 float delta = m_VarQuantity;
12545 m_VarQuantity = Math.Clamp(value, min, max);
12546
12547 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
12548 {
12549 delta = m_VarQuantity - delta;
12550
12551 if (delta)
12552 OnQuantityChanged(delta);
12553 }
12554
12555 SetVariableMask(VARIABLE_QUANTITY);
12556
12557 return false;
12558 }
12559
12560 //----------------------------------------------------------------
12562 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
12563 {
12564 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
12565 }
12566 //----------------------------------------------------------------
12567 void SetQuantityMax()
12568 {
12569 float max = GetQuantityMax();
12570 SetQuantity(max);
12571 }
12572
12573 override void SetQuantityToMinimum()
12574 {
12575 float min = GetQuantityMin();
12576 SetQuantity(min);
12577 }
12578 //----------------------------------------------------------------
12580 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
12581 {
12582 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
12583 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
12584 SetQuantity(result, destroy_config, destroy_forced);
12585 }
12586
12587 //----------------------------------------------------------------
12589 override float GetQuantityNormalized()
12590 {
12591 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
12592 }
12593
12595 {
12596 return GetQuantityNormalized();
12597 }
12598
12599 /*void SetAmmoNormalized(float value)
12600 {
12601 float value_clamped = Math.Clamp(value, 0, 1);
12602 Magazine this_mag = Magazine.Cast(this);
12603 int max_rounds = this_mag.GetAmmoMax();
12604 int result = value * max_rounds;//can the rounded if higher precision is required
12605 this_mag.SetAmmoCount(result);
12606 }*/
12607 //----------------------------------------------------------------
12608 override int GetQuantityMax()
12609 {
12610 int slot = -1;
12611 if (GetInventory())
12612 {
12613 InventoryLocation il = new InventoryLocation;
12614 GetInventory().GetCurrentInventoryLocation(il);
12615 slot = il.GetSlot();
12616 }
12617
12618 return GetTargetQuantityMax(slot);
12619 }
12620
12621 override int GetTargetQuantityMax(int attSlotID = -1)
12622 {
12623 float quantity_max = 0;
12624
12625 if (IsSplitable()) //only stackable/splitable items can check for stack size
12626 {
12627 if (attSlotID != -1)
12628 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12629
12630 if (quantity_max <= 0)
12631 quantity_max = m_VarStackMax;
12632 }
12633
12634 if (quantity_max <= 0)
12635 quantity_max = m_VarQuantityMax;
12636
12637 return quantity_max;
12638 }
12639 //----------------------------------------------------------------
12640 override int GetQuantityMin()
12641 {
12642 return m_VarQuantityMin;
12643 }
12644 //----------------------------------------------------------------
12645 int GetQuantityInit()
12646 {
12647 return m_VarQuantityInit;
12648 }
12649
12650 //----------------------------------------------------------------
12651 override bool HasQuantity()
12652 {
12653 return !(GetQuantityMax() - GetQuantityMin() == 0);
12654 }
12655
12656 override float GetQuantity()
12657 {
12658 return m_VarQuantity;
12659 }
12660
12661 bool IsFullQuantity()
12662 {
12663 return GetQuantity() >= GetQuantityMax();
12664 }
12665
12666 //Calculates weight of single item without attachments and cargo
12667 override float GetSingleInventoryItemWeightEx()
12668 {
12669 //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
12670 float weightEx = GetWeightEx();//overall weight of the item
12671 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
12672 return weightEx - special;
12673 }
12674
12675 // Obsolete, use GetSingleInventoryItemWeightEx() instead
12677 {
12679 }
12680
12681 override protected float GetWeightSpecialized(bool forceRecalc = false)
12682 {
12683 if (IsSplitable()) //quantity determines size of the stack
12684 {
12685 #ifdef DEVELOPER
12686 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12687 {
12688 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12689 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12690 }
12691 #endif
12692
12693 return GetQuantity() * GetConfigWeightModified();
12694 }
12695 else if (HasEnergyManager())// items with energy manager
12696 {
12697 #ifdef DEVELOPER
12698 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12699 {
12700 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12701 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12702 }
12703 #endif
12704 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12705 }
12706 else//everything else
12707 {
12708 #ifdef DEVELOPER
12709 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12710 {
12711 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12712 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12713 }
12714 #endif
12715 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12716 }
12717 }
12718
12720 int GetNumberOfItems()
12721 {
12722 int item_count = 0;
12723 ItemBase item;
12724
12725 if (GetInventory().GetCargo() != NULL)
12726 {
12727 item_count = GetInventory().GetCargo().GetItemCount();
12728 }
12729
12730 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12731 {
12732 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12733 if (item)
12734 item_count += item.GetNumberOfItems();
12735 }
12736 return item_count;
12737 }
12738
12740 float GetUnitWeight(bool include_wetness = true)
12741 {
12742 float weight = 0;
12743 float wetness = 1;
12744 if (include_wetness)
12745 wetness += GetWet();
12746 if (IsSplitable()) //quantity determines size of the stack
12747 {
12748 weight = wetness * m_ConfigWeight;
12749 }
12750 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12751 {
12752 weight = 1;
12753 }
12754 return weight;
12755 }
12756
12757 //-----------------------------------------------------------------
12758
12759 override void ClearInventory()
12760 {
12761 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
12762 {
12763 GameInventory inv = GetInventory();
12764 array<EntityAI> items = new array<EntityAI>;
12765 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
12766 for (int i = 0; i < items.Count(); i++)
12767 {
12768 ItemBase item = ItemBase.Cast(items.Get(i));
12769 if (item)
12770 {
12771 GetGame().ObjectDelete(item);
12772 }
12773 }
12774 }
12775 }
12776
12777 //------------------------- Energy
12778
12779 //----------------------------------------------------------------
12780 float GetEnergy()
12781 {
12782 float energy = 0;
12783 if (HasEnergyManager())
12784 {
12785 energy = GetCompEM().GetEnergy();
12786 }
12787 return energy;
12788 }
12789
12790
12791 override void OnEnergyConsumed()
12792 {
12793 super.OnEnergyConsumed();
12794
12796 }
12797
12798 override void OnEnergyAdded()
12799 {
12800 super.OnEnergyAdded();
12801
12803 }
12804
12805 // Converts energy (from Energy Manager) to quantity, if enabled.
12807 {
12808 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12809 {
12810 if (HasQuantity())
12811 {
12812 float energy_0to1 = GetCompEM().GetEnergy0To1();
12813 SetQuantityNormalized(energy_0to1);
12814 }
12815 }
12816 }
12817
12818 //----------------------------------------------------------------
12819 float GetHeatIsolationInit()
12820 {
12821 return ConfigGetFloat("heatIsolation");
12822 }
12823
12824 float GetHeatIsolation()
12825 {
12826 return m_HeatIsolation;
12827 }
12828
12829 float GetDryingIncrement(string pIncrementName)
12830 {
12831 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12832 if (GetGame().ConfigIsExisting(paramPath))
12833 return GetGame().ConfigGetFloat(paramPath);
12834
12835 return 0.0;
12836 }
12837
12838 float GetSoakingIncrement(string pIncrementName)
12839 {
12840 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12841 if (GetGame().ConfigIsExisting(paramPath))
12842 return GetGame().ConfigGetFloat(paramPath);
12843
12844 return 0.0;
12845 }
12846 //----------------------------------------------------------------
12847 override void SetWet(float value, bool allow_client = false)
12848 {
12849 if (!IsServerCheck(allow_client))
12850 return;
12851
12852 float min = GetWetMin();
12853 float max = GetWetMax();
12854
12855 float previousValue = m_VarWet;
12856
12857 m_VarWet = Math.Clamp(value, min, max);
12858
12859 if (previousValue != m_VarWet)
12860 {
12861 SetVariableMask(VARIABLE_WET);
12862 OnWetChanged(m_VarWet, previousValue);
12863 }
12864 }
12865 //----------------------------------------------------------------
12866 override void AddWet(float value)
12867 {
12868 SetWet(GetWet() + value);
12869 }
12870 //----------------------------------------------------------------
12871 override void SetWetMax()
12872 {
12874 }
12875 //----------------------------------------------------------------
12876 override float GetWet()
12877 {
12878 return m_VarWet;
12879 }
12880 //----------------------------------------------------------------
12881 override float GetWetMax()
12882 {
12883 return m_VarWetMax;
12884 }
12885 //----------------------------------------------------------------
12886 override float GetWetMin()
12887 {
12888 return m_VarWetMin;
12889 }
12890 //----------------------------------------------------------------
12891 override float GetWetInit()
12892 {
12893 return m_VarWetInit;
12894 }
12895 //----------------------------------------------------------------
12896 override void OnWetChanged(float newVal, float oldVal)
12897 {
12898 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12899 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12900 if (newLevel != oldLevel)
12901 {
12902 OnWetLevelChanged(newLevel,oldLevel);
12903 }
12904 }
12905
12906 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12907 {
12908 SetWeightDirty();
12909 }
12910
12911 override EWetnessLevel GetWetLevel()
12912 {
12913 return GetWetLevelInternal(m_VarWet);
12914 }
12915
12916 //----------------------------------------------------------------
12917
12918 override void SetStoreLoad(bool value)
12919 {
12920 m_IsStoreLoad = value;
12921 }
12922
12923 override bool IsStoreLoad()
12924 {
12925 return m_IsStoreLoad;
12926 }
12927
12928 override void SetStoreLoadedQuantity(float value)
12929 {
12930 m_StoreLoadedQuantity = value;
12931 }
12932
12933 override float GetStoreLoadedQuantity()
12934 {
12935 return m_StoreLoadedQuantity;
12936 }
12937
12938 //----------------------------------------------------------------
12939
12940 float GetItemModelLength()
12941 {
12942 if (ConfigIsExisting("itemModelLength"))
12943 {
12944 return ConfigGetFloat("itemModelLength");
12945 }
12946 return 0;
12947 }
12948
12949 float GetItemAttachOffset()
12950 {
12951 if (ConfigIsExisting("itemAttachOffset"))
12952 {
12953 return ConfigGetFloat("itemAttachOffset");
12954 }
12955 return 0;
12956 }
12957
12958 override void SetCleanness(int value, bool allow_client = false)
12959 {
12960 if (!IsServerCheck(allow_client))
12961 return;
12962
12963 int previousValue = m_Cleanness;
12964
12965 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12966
12967 if (previousValue != m_Cleanness)
12968 SetVariableMask(VARIABLE_CLEANNESS);
12969 }
12970
12971 override int GetCleanness()
12972 {
12973 return m_Cleanness;
12974 }
12975
12977 {
12978 return true;
12979 }
12980
12981 //----------------------------------------------------------------
12982 // ATTACHMENT LOCKING
12983 // Getters relevant to generic ActionLockAttachment
12984 int GetLockType()
12985 {
12986 return m_LockType;
12987 }
12988
12989 string GetLockSoundSet()
12990 {
12991 return m_LockSoundSet;
12992 }
12993
12994 //----------------------------------------------------------------
12995 //------------------------- Color
12996 // sets items color variable given color components
12997 override void SetColor(int r, int g, int b, int a)
12998 {
13003 SetVariableMask(VARIABLE_COLOR);
13004 }
13006 override void GetColor(out int r,out int g,out int b,out int a)
13007 {
13012 }
13013
13014 bool IsColorSet()
13015 {
13016 return IsVariableSet(VARIABLE_COLOR);
13017 }
13018
13020 string GetColorString()
13021 {
13022 int r,g,b,a;
13023 GetColor(r,g,b,a);
13024 r = r/255;
13025 g = g/255;
13026 b = b/255;
13027 a = a/255;
13028 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13029 }
13030 //----------------------------------------------------------------
13031 //------------------------- LiquidType
13032
13033 override void SetLiquidType(int value, bool allow_client = false)
13034 {
13035 if (!IsServerCheck(allow_client))
13036 return;
13037
13038 int old = m_VarLiquidType;
13039 m_VarLiquidType = value;
13040 OnLiquidTypeChanged(old,value);
13041 SetVariableMask(VARIABLE_LIQUIDTYPE);
13042 }
13043
13044 int GetLiquidTypeInit()
13045 {
13046 return ConfigGetInt("varLiquidTypeInit");
13047 }
13048
13049 override int GetLiquidType()
13050 {
13051 return m_VarLiquidType;
13052 }
13053
13054 protected void OnLiquidTypeChanged(int oldType, int newType)
13055 {
13056 if (newType == LIQUID_NONE && GetIsFrozen())
13057 SetFrozen(false);
13058 }
13059
13061 void UpdateQuickbarShortcutVisibility(PlayerBase player)
13062 {
13063 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13064 }
13065
13066 // -------------------------------------------------------------------------
13068 void OnInventoryEnter(Man player)
13069 {
13070 PlayerBase nplayer;
13071 if (PlayerBase.CastTo(nplayer, player))
13072 {
13073 m_CanPlayImpactSound = true;
13074 //nplayer.OnItemInventoryEnter(this);
13075 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13076 }
13077 }
13078
13079 // -------------------------------------------------------------------------
13081 void OnInventoryExit(Man player)
13082 {
13083 PlayerBase nplayer;
13084 if (PlayerBase.CastTo(nplayer,player))
13085 {
13086 //nplayer.OnItemInventoryExit(this);
13087 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13088
13089 }
13090
13091 //if (!GetGame().IsDedicatedServer())
13092 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13093
13094
13095 if (HasEnergyManager())
13096 {
13097 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
13098 }
13099 }
13100
13101 // ADVANCED PLACEMENT EVENTS
13102 override void OnPlacementStarted(Man player)
13103 {
13104 super.OnPlacementStarted(player);
13105
13106 SetTakeable(false);
13107 }
13108
13109 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
13110 {
13111 if (m_AdminLog)
13112 {
13113 m_AdminLog.OnPlacementComplete(player, this);
13114 }
13115
13116 super.OnPlacementComplete(player, position, orientation);
13117 }
13118
13119 //-----------------------------
13120 // AGENT SYSTEM
13121 //-----------------------------
13122 //--------------------------------------------------------------------------
13123 bool ContainsAgent(int agent_id)
13124 {
13125 if (agent_id & m_AttachedAgents)
13126 {
13127 return true;
13128 }
13129 else
13130 {
13131 return false;
13132 }
13133 }
13134
13135 //--------------------------------------------------------------------------
13136 override void RemoveAgent(int agent_id)
13137 {
13138 if (ContainsAgent(agent_id))
13139 {
13140 m_AttachedAgents = ~agent_id & m_AttachedAgents;
13141 }
13142 }
13143
13144 //--------------------------------------------------------------------------
13145 override void RemoveAllAgents()
13146 {
13147 m_AttachedAgents = 0;
13148 }
13149 //--------------------------------------------------------------------------
13150 override void RemoveAllAgentsExcept(int agent_to_keep)
13151 {
13152 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
13153 }
13154 // -------------------------------------------------------------------------
13155 override void InsertAgent(int agent, float count = 1)
13156 {
13157 if (count < 1)
13158 return;
13159 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
13161 }
13162
13164 void TransferAgents(int agents)
13165 {
13167 }
13168
13169 // -------------------------------------------------------------------------
13170 override int GetAgents()
13171 {
13172 return m_AttachedAgents;
13173 }
13174 //----------------------------------------------------------------------
13175
13176 /*int GetContaminationType()
13177 {
13178 int contamination_type;
13179
13180 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
13181 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
13182 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
13183 const int DIRTY_MASK = eAgents.WOUND_AGENT;
13184
13185 Edible_Base edible = Edible_Base.Cast(this);
13186 int agents = GetAgents();
13187 if (edible)
13188 {
13189 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
13190 if (profile)
13191 {
13192 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
13193 }
13194 }
13195 if (agents & CONTAMINATED_MASK)
13196 {
13197 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
13198 }
13199 if (agents & POISONED_MASK)
13200 {
13201 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
13202 }
13203 if (agents & NERVE_GAS_MASK)
13204 {
13205 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
13206 }
13207 if (agents & DIRTY_MASK)
13208 {
13209 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
13210 }
13211
13212 return agents;
13213 }*/
13214
13215 // -------------------------------------------------------------------------
13216 bool LoadAgents(ParamsReadContext ctx, int version)
13217 {
13218 if (!ctx.Read(m_AttachedAgents))
13219 return false;
13220 return true;
13221 }
13222 // -------------------------------------------------------------------------
13224 {
13225
13227 }
13228 // -------------------------------------------------------------------------
13229
13231 override void CheckForRoofLimited(float timeTresholdMS = 3000)
13232 {
13233 super.CheckForRoofLimited(timeTresholdMS);
13234
13235 float time = GetGame().GetTime();
13236 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13237 {
13238 m_PreviousRoofTestTime = time;
13239 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13240 }
13241 }
13242
13243 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
13244 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
13245 {
13246 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
13247 {
13248 return 0;
13249 }
13250
13251 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
13252 {
13253 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
13254 if (filter)
13255 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
13256 else
13257 return 0;//otherwise return 0 when no filter attached
13258 }
13259
13260 string subclassPath, entryName;
13261
13262 switch (type)
13263 {
13264 case DEF_BIOLOGICAL:
13265 entryName = "biological";
13266 break;
13267 case DEF_CHEMICAL:
13268 entryName = "chemical";
13269 break;
13270 default:
13271 entryName = "biological";
13272 break;
13273 }
13274
13275 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
13276
13277 return GetGame().ConfigGetFloat(subclassPath + entryName);
13278 }
13279
13280
13281
13283 override void EEOnCECreate()
13284 {
13285 if (!IsMagazine())
13287
13289 }
13290
13291
13292 //-------------------------
13293 // OPEN/CLOSE USER ACTIONS
13294 //-------------------------
13296 void Open();
13297 void Close();
13298 bool IsOpen()
13299 {
13300 return true;
13301 }
13302
13303 override bool CanDisplayCargo()
13304 {
13305 return IsOpen();
13306 }
13307
13308
13309 // ------------------------------------------------------------
13310 // CONDITIONS
13311 // ------------------------------------------------------------
13312 override bool CanPutInCargo(EntityAI parent)
13313 {
13314 if (parent)
13315 {
13316 if (parent.IsInherited(DayZInfected))
13317 return true;
13318
13319 if (!parent.IsRuined())
13320 return true;
13321 }
13322
13323 return true;
13324 }
13325
13326 override bool CanPutAsAttachment(EntityAI parent)
13327 {
13328 if (!super.CanPutAsAttachment(parent))
13329 {
13330 return false;
13331 }
13332
13333 if (!IsRuined() && !parent.IsRuined())
13334 {
13335 return true;
13336 }
13337
13338 return false;
13339 }
13340
13341 override bool CanReceiveItemIntoCargo(EntityAI item)
13342 {
13343 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13344 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13345 // return false;
13346
13347 return super.CanReceiveItemIntoCargo(item);
13348 }
13349
13350 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
13351 {
13352 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13353 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13354 // return false;
13355
13356 GameInventory attachmentInv = attachment.GetInventory();
13357 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13358 {
13359 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13360 return false;
13361 }
13362
13363 InventoryLocation loc = new InventoryLocation();
13364 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13365 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
13366 return false;
13367
13368 return super.CanReceiveAttachment(attachment, slotId);
13369 }
13370
13371 override bool CanReleaseAttachment(EntityAI attachment)
13372 {
13373 if (!super.CanReleaseAttachment(attachment))
13374 return false;
13375
13376 return GetInventory().AreChildrenAccessible();
13377 }
13378
13379 /*override bool CanLoadAttachment(EntityAI attachment)
13380 {
13381 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13382 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13383 // return false;
13384
13385 GameInventory attachmentInv = attachment.GetInventory();
13386 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13387 {
13388 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
13389 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
13390
13391 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13392 return false;
13393 }
13394
13395 return super.CanLoadAttachment(attachment);
13396 }*/
13397
13398 // Plays muzzle flash particle effects
13399 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13400 {
13401 int id = muzzle_owner.GetMuzzleID();
13402 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
13403
13404 if (WPOF_array)
13405 {
13406 for (int i = 0; i < WPOF_array.Count(); i++)
13407 {
13408 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13409
13410 if (WPOF)
13411 {
13412 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13413 }
13414 }
13415 }
13416 }
13417
13418 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
13419 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13420 {
13421 int id = muzzle_owner.GetMuzzleID();
13422 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
13423
13424 if (WPOBE_array)
13425 {
13426 for (int i = 0; i < WPOBE_array.Count(); i++)
13427 {
13428 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13429
13430 if (WPOBE)
13431 {
13432 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13433 }
13434 }
13435 }
13436 }
13437
13438 // Plays all weapon overheating particles
13439 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13440 {
13441 int id = muzzle_owner.GetMuzzleID();
13442 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13443
13444 if (WPOOH_array)
13445 {
13446 for (int i = 0; i < WPOOH_array.Count(); i++)
13447 {
13448 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13449
13450 if (WPOOH)
13451 {
13452 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13453 }
13454 }
13455 }
13456 }
13457
13458 // Updates all weapon overheating particles
13459 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13460 {
13461 int id = muzzle_owner.GetMuzzleID();
13462 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13463
13464 if (WPOOH_array)
13465 {
13466 for (int i = 0; i < WPOOH_array.Count(); i++)
13467 {
13468 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13469
13470 if (WPOOH)
13471 {
13472 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13473 }
13474 }
13475 }
13476 }
13477
13478 // Stops overheating particles
13479 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13480 {
13481 int id = muzzle_owner.GetMuzzleID();
13482 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13483
13484 if (WPOOH_array)
13485 {
13486 for (int i = 0; i < WPOOH_array.Count(); i++)
13487 {
13488 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13489
13490 if (WPOOH)
13491 {
13492 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13493 }
13494 }
13495 }
13496 }
13497
13498 //----------------------------------------------------------------
13499 //Item Behaviour - unified approach
13500 override bool IsHeavyBehaviour()
13501 {
13502 if (m_ItemBehaviour == 0)
13503 {
13504 return true;
13505 }
13506
13507 return false;
13508 }
13509
13510 override bool IsOneHandedBehaviour()
13511 {
13512 if (m_ItemBehaviour == 1)
13513 {
13514 return true;
13515 }
13516
13517 return false;
13518 }
13519
13520 override bool IsTwoHandedBehaviour()
13521 {
13522 if (m_ItemBehaviour == 2)
13523 {
13524 return true;
13525 }
13526
13527 return false;
13528 }
13529
13530 bool IsDeployable()
13531 {
13532 return false;
13533 }
13534
13536 float GetDeployTime()
13537 {
13538 return UATimeSpent.DEFAULT_DEPLOY;
13539 }
13540
13541
13542 //----------------------------------------------------------------
13543 // Item Targeting (User Actions)
13544 override void SetTakeable(bool pState)
13545 {
13546 m_IsTakeable = pState;
13547 SetSynchDirty();
13548 }
13549
13550 override bool IsTakeable()
13551 {
13552 return m_IsTakeable;
13553 }
13554
13555 // For cases where we want to show object widget which cant be taken to hands
13557 {
13558 return false;
13559 }
13560
13562 protected void PreLoadSoundAttachmentType()
13563 {
13564 string att_type = "None";
13565
13566 if (ConfigIsExisting("soundAttType"))
13567 {
13568 att_type = ConfigGetString("soundAttType");
13569 }
13570
13571 m_SoundAttType = att_type;
13572 }
13573
13574 override string GetAttachmentSoundType()
13575 {
13576 return m_SoundAttType;
13577 }
13578
13579 //----------------------------------------------------------------
13580 //SOUNDS - ItemSoundHandler
13581 //----------------------------------------------------------------
13582
13583 string GetPlaceSoundset(); // played when deploy starts
13584 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
13585 string GetDeploySoundset(); // played when deploy sucessfully finishes
13586
13588 {
13589 if (!m_ItemSoundHandler)
13591
13592 return m_ItemSoundHandler;
13593 }
13594
13595 // override to initialize sounds
13596 protected void InitItemSounds()
13597 {
13598 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
13599 return;
13600
13602
13603 if (GetPlaceSoundset() != string.Empty)
13604 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
13605
13606 if (GetDeploySoundset() != string.Empty)
13607 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
13608
13609 SoundParameters params = new SoundParameters();
13610 params.m_Loop = true;
13611 if (GetLoopDeploySoundset() != string.Empty)
13612 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
13613 }
13614
13615 // Start sound using ItemSoundHandler
13616 void StartItemSoundServer(int id)
13617 {
13618 if (!GetGame().IsServer())
13619 return;
13620
13621 m_SoundSyncPlay = id;
13622 SetSynchDirty();
13623
13624 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
13626 }
13627
13628 // Stop sound using ItemSoundHandler
13629 void StopItemSoundServer(int id)
13630 {
13631 if (!GetGame().IsServer())
13632 return;
13633
13634 m_SoundSyncStop = id;
13635 SetSynchDirty();
13636
13637 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
13639 }
13640
13641 protected void ClearStartItemSoundServer()
13642 {
13643 m_SoundSyncPlay = 0;
13644 }
13645
13646 protected void ClearStopItemSoundServer()
13647 {
13648 m_SoundSyncStop = 0;
13649 }
13650
13652 void PlayAttachSound(string slot_type)
13653 {
13654 if (!GetGame().IsDedicatedServer())
13655 {
13656 if (ConfigIsExisting("attachSoundSet"))
13657 {
13658 string cfg_path = "";
13659 string soundset = "";
13660 string type_name = GetType();
13661
13662 TStringArray cfg_soundset_array = new TStringArray;
13663 TStringArray cfg_slot_array = new TStringArray;
13664 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13665 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13666
13667 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13668 {
13669 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13670 {
13671 if (cfg_slot_array[i] == slot_type)
13672 {
13673 soundset = cfg_soundset_array[i];
13674 break;
13675 }
13676 }
13677 }
13678
13679 if (soundset != "")
13680 {
13681 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13682 sound.SetAutodestroy(true);
13683 }
13684 }
13685 }
13686 }
13687
13688 void PlayDetachSound(string slot_type)
13689 {
13690 //TODO - evaluate if needed and devise universal config structure if so
13691 }
13692
13693 void OnApply(PlayerBase player);
13694
13696 {
13697 return 1.0;
13698 };
13699 //returns applicable selection
13700 array<string> GetHeadHidingSelection()
13701 {
13703 }
13704
13706 {
13708 }
13709
13710 WrittenNoteData GetWrittenNoteData() {};
13711
13713 {
13714 SetDynamicPhysicsLifeTime(0.01);
13715 m_ItemBeingDroppedPhys = false;
13716 }
13717
13719 {
13720 array<string> zone_names = new array<string>;
13721 GetDamageZones(zone_names);
13722 for (int i = 0; i < zone_names.Count(); i++)
13723 {
13724 SetHealthMax(zone_names.Get(i),"Health");
13725 }
13726 SetHealthMax("","Health");
13727 }
13728
13730 void SetZoneDamageCEInit()
13731 {
13732 float global_health = GetHealth01("","Health");
13733 array<string> zones = new array<string>;
13734 GetDamageZones(zones);
13735 //set damage of all zones to match global health level
13736 for (int i = 0; i < zones.Count(); i++)
13737 {
13738 SetHealth01(zones.Get(i),"Health",global_health);
13739 }
13740 }
13741
13743 bool IsCoverFaceForShave(string slot_name)
13744 {
13745 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13746 }
13747
13748 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13749 {
13750 if (!hasRootAsPlayer)
13751 {
13752 if (refParentIB)
13753 {
13754 // parent is wet
13755 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13756 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13757 // parent has liquid inside
13758 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13759 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13760 // drying
13761 else if (m_VarWet > m_VarWetMin)
13762 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13763 }
13764 else
13765 {
13766 // drying on ground or inside non-itembase (car, ...)
13767 if (m_VarWet > m_VarWetMin)
13768 AddWet(-1 * delta * GetDryingIncrement("ground"));
13769 }
13770 }
13771 }
13772
13773 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13774 {
13776 {
13777 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13778 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13779 {
13780 float heatPermCoef = 1.0;
13781 EntityAI ent = this;
13782 while (ent)
13783 {
13784 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13785 ent = ent.GetHierarchyParent();
13786 }
13787
13788 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13789 }
13790 }
13791 }
13792
13793 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13794 {
13795 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13796 EntityAI parent = GetHierarchyParent();
13797 if (!parent)
13798 {
13799 hasParent = false;
13800 hasRootAsPlayer = false;
13801 }
13802 else
13803 {
13804 hasParent = true;
13805 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13806 refParentIB = ItemBase.Cast(parent);
13807 }
13808 }
13809
13810 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13811 {
13812 // this is stub, implemented on Edible_Base
13813 }
13814
13815 bool CanDecay()
13816 {
13817 // return true used on selected food clases so they can decay
13818 return false;
13819 }
13820
13821 protected bool CanProcessDecay()
13822 {
13823 // this is stub, implemented on Edible_Base class
13824 // used to determine whether it is still necessary for the food to decay
13825 return false;
13826 }
13827
13828 protected bool CanHaveWetness()
13829 {
13830 // return true used on selected items that have a wetness effect
13831 return false;
13832 }
13833
13835 bool CanBeConsumed(ConsumeConditionData data = null)
13836 {
13837 return !GetIsFrozen() && IsOpen();
13838 }
13839
13840 override void ProcessVariables()
13841 {
13842 bool hasParent = false, hasRootAsPlayer = false;
13843 ItemBase refParentIB;
13844
13845 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13846 bool foodDecay = g_Game.IsFoodDecayEnabled();
13847
13848 if (wwtu || foodDecay)
13849 {
13850 bool processWetness = wwtu && CanHaveWetness();
13851 bool processTemperature = wwtu && CanHaveTemperature();
13852 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13853
13854 if (processWetness || processTemperature || processDecay)
13855 {
13856 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13857
13858 if (processWetness)
13859 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13860
13861 if (processTemperature)
13862 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13863
13864 if (processDecay)
13865 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13866 }
13867 }
13868 }
13869
13872 {
13873 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13874 }
13875
13876 override float GetTemperatureFreezeThreshold()
13877 {
13879 return Liquid.GetFreezeThreshold(GetLiquidType());
13880
13881 return super.GetTemperatureFreezeThreshold();
13882 }
13883
13884 override float GetTemperatureThawThreshold()
13885 {
13887 return Liquid.GetThawThreshold(GetLiquidType());
13888
13889 return super.GetTemperatureThawThreshold();
13890 }
13891
13892 override float GetItemOverheatThreshold()
13893 {
13895 return Liquid.GetBoilThreshold(GetLiquidType());
13896
13897 return super.GetItemOverheatThreshold();
13898 }
13899
13900 override float GetTemperatureFreezeTime()
13901 {
13902 if (HasQuantity())
13903 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13904
13905 return super.GetTemperatureFreezeTime();
13906 }
13907
13908 override float GetTemperatureThawTime()
13909 {
13910 if (HasQuantity())
13911 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13912
13913 return super.GetTemperatureThawTime();
13914 }
13915
13917 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13919 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13920
13921 bool IsCargoException4x3(EntityAI item)
13922 {
13923 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13924 }
13925
13927 {
13928 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13929 }
13930
13932 void AddLightSourceItem(ItemBase lightsource)
13933 {
13934 m_LightSourceItem = lightsource;
13935 }
13936
13938 {
13939 m_LightSourceItem = null;
13940 }
13941
13943 {
13944 return m_LightSourceItem;
13945 }
13946
13948 array<int> GetValidFinishers()
13949 {
13950 return null;
13951 }
13952
13954 bool GetActionWidgetOverride(out typename name)
13955 {
13956 return false;
13957 }
13958
13959 bool PairWithDevice(notnull ItemBase otherDevice)
13960 {
13961 if (GetGame().IsServer())
13962 {
13963 ItemBase explosive = otherDevice;
13965 if (!trg)
13966 {
13967 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13968 explosive = this;
13969 }
13970
13971 explosive.PairRemote(trg);
13972 trg.SetControlledDevice(explosive);
13973
13974 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13975 trg.SetPersistentPairID(persistentID);
13976 explosive.SetPersistentPairID(persistentID);
13977
13978 return true;
13979 }
13980 return false;
13981 }
13982
13984 float GetBaitEffectivity()
13985 {
13986 float ret = 1.0;
13987 if (HasQuantity())
13988 ret *= GetQuantityNormalized();
13989 ret *= GetHealth01();
13990
13991 return ret;
13992 }
13993
13994 #ifdef DEVELOPER
13995 override void SetDebugItem()
13996 {
13997 super.SetDebugItem();
13998 _itemBase = this;
13999 }
14000
14001 override string GetDebugText()
14002 {
14003 string text = super.GetDebugText();
14004
14005 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
14006 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
14007
14008 return text;
14009 }
14010 #endif
14011
14012 bool CanBeUsedForSuicide()
14013 {
14014 return true;
14015 }
14016
14018 //DEPRECATED BELOW
14020 // Backwards compatibility
14021 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
14022 {
14023 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
14024 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
14025 }
14026
14027 // replaced by ItemSoundHandler
14028 protected EffectSound m_SoundDeployFinish;
14029 protected EffectSound m_SoundPlace;
14030 protected EffectSound m_DeployLoopSoundEx;
14031 protected EffectSound m_SoundDeploy;
14032 bool m_IsPlaceSound;
14033 bool m_IsDeploySound;
14035
14036 string GetDeployFinishSoundset();
14037 void PlayDeploySound();
14038 void PlayDeployFinishSound();
14039 void PlayPlaceSound();
14040 void PlayDeployLoopSoundEx();
14041 void StopDeployLoopSoundEx();
14042 void SoundSynchRemoteReset();
14043 void SoundSynchRemote();
14044 bool UsesGlobalDeploy(){return false;}
14045 bool CanPlayDeployLoopSound(){return false;}
14047 bool IsPlaceSound(){return m_IsPlaceSound;}
14048 bool IsDeploySound(){return m_IsDeploySound;}
14049 void SetIsPlaceSound(bool is_place_sound);
14050 void SetIsDeploySound(bool is_deploy_sound);
14051}
14052
14053EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
14054{
14055 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
14056 if (entity)
14057 {
14058 bool is_item = entity.IsInherited(ItemBase);
14059 if (is_item && full_quantity)
14060 {
14061 ItemBase item = ItemBase.Cast(entity);
14062 item.SetQuantity(item.GetQuantityInit());
14063 }
14064 }
14065 else
14066 {
14067 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
14068 return NULL;
14069 }
14070 return entity;
14071}
14072
14073void SetupSpawnedItem(ItemBase item, float health, float quantity)
14074{
14075 if (item)
14076 {
14077 if (health > 0)
14078 item.SetHealth("", "", health);
14079
14080 if (item.CanHaveTemperature())
14081 {
14082 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
14083 if (item.CanFreeze())
14084 item.SetFrozen(false);
14085 }
14086
14087 if (item.HasEnergyManager())
14088 {
14089 if (quantity >= 0)
14090 {
14091 item.GetCompEM().SetEnergy0To1(quantity);
14092 }
14093 else
14094 {
14095 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
14096 }
14097 }
14098 else if (item.IsMagazine())
14099 {
14100 Magazine mag = Magazine.Cast(item);
14101 if (quantity >= 0)
14102 {
14103 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14104 }
14105 else
14106 {
14107 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
14108 }
14109
14110 }
14111 else
14112 {
14113 if (quantity >= 0)
14114 {
14115 item.SetQuantityNormalized(quantity, false);
14116 }
14117 else
14118 {
14119 item.SetQuantity(Math.AbsFloat(quantity));
14120 }
14121
14122 }
14123 }
14124}
14125
14126#ifdef DEVELOPER
14127ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
14128#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8078
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
Определения ItemBase.c:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
Определения ItemBase.c:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
InventoryLocation.
Определения InventoryLocation.c:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1012
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения InventoryItem.c:731
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()

Используется в InventoryItem::ProcessItemWetnessAndTemperature() и InventoryItem::ProcessVariables().