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

◆ StopItemSoundServer()

void SpawnItemOnLocation::StopItemSoundServer ( int id)
protected

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

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