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

◆ CanBeConsumed()

bool SpawnItemOnLocation::CanBeConsumed ( ConsumeConditionData data = null)
protected

Items cannot be consumed if frozen by default. Override for exceptions.

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

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