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

◆ CanDecay()

BrisketSpread Edible_Base CanDecay ( )
protected

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

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

Используется в InventoryItem::ProcessVariables().