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

◆ GetItemSoundHandler()

ItemSoundHandler SpawnItemOnLocation::GetItemSoundHandler ( )
protected

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

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

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