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

◆ ProcessDecay()

void SpawnItemOnLocation::ProcessDecay ( float delta,
bool hasRootAsPlayer )
protected

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

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