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

◆ SetZoneDamageCEInit()

void SpawnItemOnLocation::SetZoneDamageCEInit ( )
protected

Sets zone damages to match randomized global health set by CE (CE spawn only)

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

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

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