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

◆ ClearStartItemSoundServer()

void SpawnItemOnLocation::ClearStartItemSoundServer ( )
protected

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

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