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

◆ AddLightSourceItem()

void SpawnItemOnLocation::AddLightSourceItem ( ItemBase lightsource)
protected

Adds a light source child.

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

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