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

◆ StartItemSoundServer() [1/2]

void SpawnItemOnLocation::StartItemSoundServer ( int id)
protected

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

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