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

◆ GetBandagingEffectivity()

float SpawnItemOnLocation::GetBandagingEffectivity ( )
protected

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

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