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

◆ GetItemSoundHandler()

ItemSoundHandler SpawnItemOnLocation::GetItemSoundHandler ( )
protected

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

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

Используется в Barrel_ColorBase::InitItemSounds(), FireplaceBase::InitItemSounds(), InitItemSounds(), InventoryItem::InitItemSounds(), ItemBase::InitItemSounds() и ShippingContainerKeys_ColorBase::InitItemSounds().