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

◆ StartItemSoundServer() [2/2]

void SpawnItemOnLocation::StartItemSoundServer ( int id,
int slotId )
protected

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

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

Используется в ShippingContainerKeys_ColorBase::DestroyKeyServer(), InventoryItem::OnWasAttached(), InventoryItem::OnWasDetached(), InventoryItem::SetQuantity(), InventoryItem::StartItemSoundServer() и ItemBase::ToggleAnimation().