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

◆ CopyScriptPropertiesFrom()

void SpawnItemOnLocation::CopyScriptPropertiesFrom ( EntityAI oldItem)
protected

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

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