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

◆ GetWrittenNoteData()

WrittenNoteData SpawnItemOnLocation::GetWrittenNoteData ( )
protected

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

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