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

◆ HidesSelectionBySlot()

bool SpawnItemOnLocation::HidesSelectionBySlot ( )
protected

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

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