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

◆ GetDeployTime()

float SpawnItemOnLocation::GetDeployTime ( )
protected

how long it takes to deploy this item in seconds

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

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