9554{
9556 {
9557 return true;
9558 }
9559};
9560
9561
9562
9564{
9568
9570
9573
9574
9575
9576
9577
9586
9592
9597
9602
9623 protected bool m_IsResultOfSplit
9624
9626
9631
9632
9633
9635
9639
9640
9641
9643
9646
9647
9648
9654
9655
9663
9666
9667
9669
9670
9672
9673
9678
9679
9684
9685
9687
9688
9690 {
9695
9696 if (!
GetGame().IsDedicatedServer())
9697 {
9699 {
9701
9703 {
9705 }
9706 }
9707
9710 }
9711
9712 m_OldLocation = null;
9713
9715 {
9717 }
9718
9719 if (ConfigIsExisting("headSelectionsToHide"))
9720 {
9723 }
9724
9726 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9727 {
9729 }
9730
9732
9733 m_IsResultOfSplit = false;
9734
9736 }
9737
9739 {
9740 super.InitItemVariables();
9741
9747 m_Count = ConfigGetInt(
"count");
9748
9751
9756
9759
9764
9776
9780
9781
9784 if (ConfigIsExisting("canBeSplit"))
9785 {
9788 }
9789
9791 if (ConfigIsExisting("itemBehaviour"))
9793
9794
9797 RegisterNetSyncVariableInt("m_VarLiquidType");
9798 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9799
9800 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9801 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9802 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9803
9804 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9805 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9806 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9807 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9808
9809 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9810 RegisterNetSyncVariableBool("m_IsTakeable");
9811 RegisterNetSyncVariableBool("m_IsHologram");
9812
9815 {
9818 }
9819
9821
9823 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9825
9826 }
9827
9829 {
9831 }
9832
9834 {
9837 {
9842 }
9843 }
9844
9845 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9846 {
9848 {
9851 }
9852
9854 }
9855
9857 {
9863 }
9864
9866
9868 {
9870
9871 if (!action)
9872 {
9873 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9874 return;
9875 }
9876
9878 if (!ai)
9879 {
9881 return;
9882 }
9883
9885 if (!action_array)
9886 {
9887 action_array = new array<ActionBase_Basic>;
9889 }
9890 if (LogManager.IsActionLogEnable())
9891 {
9892 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9893 }
9894
9895 if (action_array.Find(action) != -1)
9896 {
9897 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9898 }
9899 else
9900 {
9901 action_array.Insert(action);
9902 }
9903 }
9904
9906 {
9908 ActionBase action = player.GetActionManager().GetAction(actionName);
9911
9912 if (action_array)
9913 {
9914 action_array.RemoveItem(action);
9915 }
9916 }
9917
9918
9919
9921 {
9922 ActionOverrideData overrideData = new ActionOverrideData();
9926
9928 if (!actionMap)
9929 {
9932 }
9933
9934 actionMap.Insert(this.
Type(), overrideData);
9935
9936 }
9937
9939
9941
9942
9944 {
9947
9950
9951 string config_to_search = "CfgVehicles";
9952 string muzzle_owner_config;
9953
9955 {
9956 if (IsInherited(Weapon))
9957 config_to_search = "CfgWeapons";
9958
9959 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9960
9961 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9962
9964
9965 if (config_OnFire_subclass_count > 0)
9966 {
9967 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9968
9969 for (int i = 0; i < config_OnFire_subclass_count; i++)
9970 {
9971 string particle_class = "";
9973 string config_OnFire_entry = config_OnFire_class + particle_class;
9974 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9975 WPOF_array.Insert(WPOF);
9976 }
9977
9978
9980 }
9981 }
9982
9984 {
9985 config_to_search = "CfgWeapons";
9986 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9987
9988 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9989
9991
9992 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9993 {
9994 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9995
9996 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9997 {
9998 string particle_class2 = "";
10000 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
10001 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
10002 WPOBE_array.Insert(WPOBE);
10003 }
10004
10005
10007 }
10008 }
10009 }
10010
10011
10013 {
10016
10018 {
10019 string config_to_search = "CfgVehicles";
10020
10021 if (IsInherited(Weapon))
10022 config_to_search = "CfgWeapons";
10023
10024 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10025 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10026
10027 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
10028 {
10029
10031
10033 {
10035 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10037 return;
10038 }
10039
10042
10043
10044
10046 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10047
10048 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10049 {
10050 string particle_class = "";
10052 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10054
10055 if (entry_type == CT_CLASS)
10056 {
10057 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10058 WPOOH_array.Insert(WPOF);
10059 }
10060 }
10061
10062
10064 }
10065 }
10066 }
10067
10069 {
10071 }
10072
10074 {
10076 {
10078
10081
10084
10085 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10086 }
10087 }
10088
10090 {
10092 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10093
10095 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10096
10098 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10099
10101 {
10103 }
10104 }
10105
10107 {
10109 }
10110
10112 {
10115 else
10117
10119 {
10122 }
10123 else
10124 {
10127
10130 }
10131
10133 }
10134
10136 {
10138 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10139 }
10140
10142 {
10144 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10146 }
10147
10149 {
10151 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10152 }
10153
10155 {
10158
10159 OverheatingParticle OP = new OverheatingParticle();
10164
10166 }
10167
10169 {
10172
10173 return -1;
10174 }
10175
10177 {
10179 {
10182
10183 for (int i = count; i > 0; --i)
10184 {
10185 int id = i - 1;
10188
10191
10192 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10193 {
10194 if (p)
10195 {
10198 }
10199 }
10200 }
10201 }
10202 }
10203
10205 {
10207 {
10209 {
10210 int id = i - 1;
10212
10213 if (OP)
10214 {
10216
10217 if (p)
10218 {
10220 }
10221
10222 delete OP;
10223 }
10224 }
10225
10228 }
10229 }
10230
10233 {
10234 return 0.0;
10235 }
10236
10237
10239 {
10240 return 250;
10241 }
10242
10244 {
10245 return 0;
10246 }
10247
10250 {
10252 return true;
10253
10254 return false;
10255 }
10256
10259 {
10262
10264 {
10266 }
10267 else
10268 {
10269
10271 }
10272
10274 }
10275
10282 {
10283 return -1;
10284 }
10285
10286
10287
10288
10290 {
10292 {
10294 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10295
10296 if (r_index >= 0)
10297 {
10298 InventoryLocation r_il = new InventoryLocation;
10299 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10300
10301 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10304 {
10305 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10306 }
10308 {
10309 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10310 }
10311
10312 }
10313
10314 player.GetHumanInventory().ClearUserReservedLocation(this);
10315 }
10316
10319 }
10320
10321
10322
10323
10325 {
10326 return ItemBase.m_DebugActionsMask;
10327 }
10328
10330 {
10331 return ItemBase.m_DebugActionsMask & mask;
10332 }
10333
10335 {
10336 ItemBase.m_DebugActionsMask = mask;
10337 }
10338
10340 {
10341 ItemBase.m_DebugActionsMask |= mask;
10342 }
10343
10345 {
10346 ItemBase.m_DebugActionsMask &= ~mask;
10347 }
10348
10350 {
10352 {
10354 }
10355 else
10356 {
10358 }
10359 }
10360
10361
10363 {
10364 if (GetEconomyProfile())
10365 {
10366 float q_max = GetEconomyProfile().GetQuantityMax();
10367 if (q_max > 0)
10368 {
10369 float q_min = GetEconomyProfile().GetQuantityMin();
10370 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10371
10373 {
10374 ComponentEnergyManager comp = GetCompEM();
10376 {
10378 }
10379 }
10381 {
10383
10384 }
10385
10386 }
10387 }
10388 }
10389
10392 {
10393 EntityAI parent = GetHierarchyParent();
10394
10395 if (parent)
10396 {
10397 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10398 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10399 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10400 }
10401 }
10402
10405 {
10406 EntityAI parent = GetHierarchyParent();
10407
10408 if (parent)
10409 {
10410 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10411 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10412 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10413 }
10414 }
10415
10417 {
10418
10419
10420
10421
10423
10425 {
10426 if (ScriptInputUserData.CanStoreInputUserData())
10427 {
10428 ScriptInputUserData ctx = new ScriptInputUserData;
10434 ctx.
Write(use_stack_max);
10437
10439 {
10440 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10441 }
10442 }
10443 }
10444 else if (!
GetGame().IsMultiplayer())
10445 {
10447 }
10448 }
10449
10451 {
10453 }
10454
10456 {
10458 }
10459
10461 {
10463 }
10464
10466 {
10467
10468 return false;
10469 }
10470
10472 {
10473 return false;
10474 }
10475
10479 {
10480 return false;
10481 }
10482
10484 {
10485 return "";
10486 }
10487
10489
10491 {
10492 return false;
10493 }
10494
10496 {
10497 return true;
10498 }
10499
10500
10501
10503 {
10504 return true;
10505 }
10506
10508 {
10509 return true;
10510 }
10511
10513 {
10514 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10516 }
10517
10519 {
10521 }
10522
10524 {
10526 if (!is_being_placed)
10528 SetSynchDirty();
10529 }
10530
10531
10533
10535 {
10537 }
10538
10540 {
10542 }
10543
10545 {
10546 return 1;
10547 }
10548
10550 {
10551 return false;
10552 }
10553
10555 {
10557 SetSynchDirty();
10558 }
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10595 {
10596 super.OnMovedInsideCargo(container);
10597
10598 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10599 }
10600
10601 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10602 {
10603 super.EEItemLocationChanged(oldLoc,newLoc);
10604
10605 PlayerBase new_player = null;
10606 PlayerBase old_player = null;
10607
10608 if (newLoc.GetParent())
10609 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10610
10611 if (oldLoc.GetParent())
10612 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10613
10615 {
10616 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10617
10618 if (r_index >= 0)
10619 {
10620 InventoryLocation r_il = new InventoryLocation;
10621 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10622
10623 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10626 {
10627 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10628 }
10630 {
10631 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10632 }
10633
10634 }
10635 }
10636
10638 {
10639 if (new_player)
10640 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10641
10642 if (new_player == old_player)
10643 {
10644
10645 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10646 {
10648 {
10649 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10650 {
10651 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10652 }
10653 }
10654 else
10655 {
10656 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10657 }
10658 }
10659
10660 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10661 {
10662 int type = oldLoc.GetType();
10664 {
10665 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10666 }
10668 {
10669 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10670 }
10671 }
10672 if (!m_OldLocation)
10673 {
10674 m_OldLocation = new InventoryLocation;
10675 }
10676 m_OldLocation.Copy(oldLoc);
10677 }
10678 else
10679 {
10680 if (m_OldLocation)
10681 {
10682 m_OldLocation.Reset();
10683 }
10684 }
10685
10687 }
10688 else
10689 {
10690 if (new_player)
10691 {
10692 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10693 if (res_index >= 0)
10694 {
10695 InventoryLocation il = new InventoryLocation;
10696 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10698 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10701 {
10702 il.
GetParent().GetOnReleaseLock().Invoke(it);
10703 }
10705 {
10707 }
10708
10709 }
10710 }
10712 {
10713
10715 }
10716
10717 if (m_OldLocation)
10718 {
10719 m_OldLocation.Reset();
10720 }
10721 }
10722 }
10723
10724 override void EOnContact(IEntity other, Contact extra)
10725 {
10727 {
10728 int liquidType = -1;
10730 if (impactSpeed > 0.0)
10731 {
10733 #ifndef SERVER
10735 #else
10737 SetSynchDirty();
10738 #endif
10740 }
10741 }
10742
10743 #ifdef SERVER
10744 if (GetCompEM() && GetCompEM().IsPlugged())
10745 {
10746 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10747 GetCompEM().UnplugThis();
10748 }
10749 #endif
10750 }
10751
10753
10755 {
10757 }
10758
10760 {
10761
10762 }
10763
10765 {
10766 super.OnItemLocationChanged(old_owner, new_owner);
10767
10768 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10769 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10770
10771 if (!relatedPlayer && playerNew)
10772 relatedPlayer = playerNew;
10773
10774 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10775 {
10777 if (actionMgr)
10778 {
10779 ActionBase currentAction = actionMgr.GetRunningAction();
10780 if (currentAction)
10782 }
10783 }
10784
10785 Man ownerPlayerOld = null;
10786 Man ownerPlayerNew = null;
10787
10788 if (old_owner)
10789 {
10790 if (old_owner.
IsMan())
10791 {
10792 ownerPlayerOld = Man.Cast(old_owner);
10793 }
10794 else
10795 {
10796 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10797 }
10798 }
10799 else
10800 {
10802 {
10804
10805 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10806 {
10807 GetCompEM().UnplugThis();
10808 }
10809 }
10810 }
10811
10812 if (new_owner)
10813 {
10814 if (new_owner.
IsMan())
10815 {
10816 ownerPlayerNew = Man.Cast(new_owner);
10817 }
10818 else
10819 {
10820 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10821 }
10822 }
10823
10824 if (ownerPlayerOld != ownerPlayerNew)
10825 {
10826 if (ownerPlayerOld)
10827 {
10828 array<EntityAI> subItemsExit = new array<EntityAI>;
10830 for (int i = 0; i < subItemsExit.Count(); i++)
10831 {
10834 }
10835 }
10836
10837 if (ownerPlayerNew)
10838 {
10839 array<EntityAI> subItemsEnter = new array<EntityAI>;
10841 for (int j = 0; j < subItemsEnter.Count(); j++)
10842 {
10845 }
10846 }
10847 }
10848 else if (ownerPlayerNew != null)
10849 {
10850 PlayerBase nplayer;
10851 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10852 {
10853 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10855 for (int k = 0; k < subItemsUpdate.Count(); k++)
10856 {
10858 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10859 }
10860 }
10861 }
10862
10863 if (old_owner)
10864 old_owner.OnChildItemRemoved(this);
10865 if (new_owner)
10866 new_owner.OnChildItemReceived(this);
10867 }
10868
10869
10871 {
10872 super.EEDelete(parent);
10873 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10874 if (player)
10875 {
10877
10878 if (player.IsAlive())
10879 {
10880 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10881 if (r_index >= 0)
10882 {
10883 InventoryLocation r_il = new InventoryLocation;
10884 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10885
10886 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10889 {
10890 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10891 }
10893 {
10894 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10895 }
10896
10897 }
10898
10899 player.RemoveQuickBarEntityShortcut(this);
10900 }
10901 }
10902 }
10903
10905 {
10906 super.EEKilled(killer);
10907
10910 {
10911 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10912 {
10913 if (IsMagazine())
10914 {
10915 if (Magazine.Cast(this).GetAmmoCount() > 0)
10916 {
10918 }
10919 }
10920 else
10921 {
10923 }
10924 }
10925 }
10926 }
10927
10929 {
10930 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10931
10932 super.OnWasAttached(parent, slot_id);
10933
10936
10938 }
10939
10941 {
10942 super.OnWasDetached(parent, slot_id);
10943
10946 }
10947
10949 {
10950 int idx;
10953
10954 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10955 if (inventory_slots.Count() < 1)
10956 {
10957 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10958 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10959 }
10960 else
10961 {
10962 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10963 }
10964
10965 idx = inventory_slots.Find(slot);
10966 if (idx < 0)
10967 return "";
10968
10969 return attach_types.Get(idx);
10970 }
10971
10973 {
10974 int idx = -1;
10975 string slot;
10976
10979
10980 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10981 if (inventory_slots.Count() < 1)
10982 {
10983 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10984 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10985 }
10986 else
10987 {
10988 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10989 if (detach_types.Count() < 1)
10990 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10991 }
10992
10993 for (int i = 0; i < inventory_slots.Count(); i++)
10994 {
10995 slot = inventory_slots.Get(i);
10996 }
10997
10998 if (slot != "")
10999 {
11000 if (detach_types.Count() == 1)
11001 idx = 0;
11002 else
11003 idx = inventory_slots.Find(slot);
11004 }
11005 if (idx < 0)
11006 return "";
11007
11008 return detach_types.Get(idx);
11009 }
11010
11012 {
11013
11015
11016
11017 float min_time = 1;
11018 float max_time = 3;
11019 float delay = Math.RandomFloat(min_time, max_time);
11020
11021 explode_timer.Run(delay, this, "DoAmmoExplosion");
11022 }
11023
11025 {
11026 Magazine magazine = Magazine.Cast(this);
11027 int pop_sounds_count = 6;
11028 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11029
11030
11031 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11032 string sound_name = pop_sounds[ sound_idx ];
11034
11035
11036 magazine.ServerAddAmmoCount(-1);
11037
11038
11039 float min_temp_to_explode = 100;
11040
11041 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
11042 {
11044 }
11045 }
11046
11047
11048 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11049 {
11050 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11051
11052 const int CHANCE_DAMAGE_CARGO = 4;
11053 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11054 const int CHANCE_DAMAGE_NOTHING = 2;
11055
11057 {
11058 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11059 int chances;
11060 int rnd;
11061
11062 if (GetInventory().GetCargo())
11063 {
11064 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11065 rnd = Math.RandomInt(0,chances);
11066
11067 if (rnd < CHANCE_DAMAGE_CARGO)
11068 {
11070 }
11071 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11072 {
11074 }
11075 }
11076 else
11077 {
11078 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11079 rnd = Math.RandomInt(0,chances);
11080
11081 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11082 {
11084 }
11085 }
11086 }
11087 }
11088
11090 {
11091 if (GetInventory().GetCargo())
11092 {
11093 int item_count = GetInventory().GetCargo().GetItemCount();
11094 if (item_count > 0)
11095 {
11096 int random_pick = Math.RandomInt(0, item_count);
11098 if (!item.IsExplosive())
11099 {
11100 item.AddHealth("","",damage);
11101 return true;
11102 }
11103 }
11104 }
11105 return false;
11106 }
11107
11109 {
11110 int attachment_count = GetInventory().AttachmentCount();
11111 if (attachment_count > 0)
11112 {
11113 int random_pick = Math.RandomInt(0, attachment_count);
11114 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
11115 if (!attachment.IsExplosive())
11116 {
11117 attachment.AddHealth("","",damage);
11118 return true;
11119 }
11120 }
11121 return false;
11122 }
11123
11125 {
11127 }
11128
11130 {
11132 return GetInventory().CanRemoveEntity();
11133
11134 return false;
11135 }
11136
11138 {
11139
11141 return false;
11142
11143
11145 return false;
11146
11147
11148
11150 if (delta == 0)
11151 return false;
11152
11153
11154 return true;
11155 }
11156
11158 {
11160 {
11161 if (ScriptInputUserData.CanStoreInputUserData())
11162 {
11163 ScriptInputUserData ctx = new ScriptInputUserData;
11168 ctx.
Write(destination_entity);
11170 ctx.
Write(slot_id);
11172 }
11173 }
11174 else if (!
GetGame().IsMultiplayer())
11175 {
11177 }
11178 }
11179
11181 {
11182 float split_quantity_new;
11186 InventoryLocation loc = new InventoryLocation;
11187
11188 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11189 {
11191 split_quantity_new = stack_max;
11192 else
11194
11196 {
11197 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11198 if (new_item)
11199 {
11200 new_item.SetResultOfSplit(true);
11201 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11203 new_item.
SetQuantity(split_quantity_new,
false,
true);
11204 }
11205 }
11206 }
11207 else if (destination_entity && slot_id == -1)
11208 {
11209 if (quantity > stack_max)
11210 split_quantity_new = stack_max;
11211 else
11212 split_quantity_new = quantity;
11213
11215 {
11217 {
11220 }
11221
11222 if (new_item)
11223 {
11224 new_item.SetResultOfSplit(true);
11225 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11227 new_item.
SetQuantity(split_quantity_new,
false,
true);
11228 }
11229 }
11230 }
11231 else
11232 {
11233 if (stack_max != 0)
11234 {
11236 {
11238 }
11239
11240 if (split_quantity_new == 0)
11241 {
11242 if (!
GetGame().IsMultiplayer())
11243 player.PhysicalPredictiveDropItem(this);
11244 else
11245 player.ServerDropEntity(this);
11246 return;
11247 }
11248
11250 {
11252
11253 if (new_item)
11254 {
11255 new_item.SetResultOfSplit(true);
11256 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11259 new_item.PlaceOnSurface();
11260 }
11261 }
11262 }
11263 }
11264 }
11265
11267 {
11268 float split_quantity_new;
11272 InventoryLocation loc = new InventoryLocation;
11273
11274 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11275 {
11277 split_quantity_new = stack_max;
11278 else
11280
11282 {
11283 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11284 if (new_item)
11285 {
11286 new_item.SetResultOfSplit(true);
11287 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11289 new_item.
SetQuantity(split_quantity_new,
false,
true);
11290 }
11291 }
11292 }
11293 else if (destination_entity && slot_id == -1)
11294 {
11295 if (quantity > stack_max)
11296 split_quantity_new = stack_max;
11297 else
11298 split_quantity_new = quantity;
11299
11301 {
11303 {
11306 }
11307
11308 if (new_item)
11309 {
11310 new_item.SetResultOfSplit(true);
11311 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11313 new_item.
SetQuantity(split_quantity_new,
false,
true);
11314 }
11315 }
11316 }
11317 else
11318 {
11319 if (stack_max != 0)
11320 {
11322 {
11324 }
11325
11327 {
11329
11330 if (new_item)
11331 {
11332 new_item.SetResultOfSplit(true);
11333 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11336 new_item.PlaceOnSurface();
11337 }
11338 }
11339 }
11340 }
11341 }
11342
11344 {
11346 {
11347 if (ScriptInputUserData.CanStoreInputUserData())
11348 {
11349 ScriptInputUserData ctx = new ScriptInputUserData;
11354 dst.WriteToContext(ctx);
11356 }
11357 }
11358 else if (!
GetGame().IsMultiplayer())
11359 {
11361 }
11362 }
11363
11365 {
11367 {
11368 if (ScriptInputUserData.CanStoreInputUserData())
11369 {
11370 ScriptInputUserData ctx = new ScriptInputUserData;
11375 ctx.
Write(destination_entity);
11381 }
11382 }
11383 else if (!
GetGame().IsMultiplayer())
11384 {
11386 }
11387 }
11388
11390 {
11392 }
11393
11395 {
11397 float split_quantity_new;
11399 if (dst.IsValid())
11400 {
11401 int slot_id = dst.GetSlot();
11403
11404 if (quantity > stack_max)
11405 split_quantity_new = stack_max;
11406 else
11407 split_quantity_new = quantity;
11408
11410 {
11412
11413 if (new_item)
11414 {
11415 new_item.SetResultOfSplit(true);
11416 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11418 new_item.
SetQuantity(split_quantity_new,
false,
true);
11419 }
11420
11421 return new_item;
11422 }
11423 }
11424
11425 return null;
11426 }
11427
11429 {
11431 float split_quantity_new;
11433 if (destination_entity)
11434 {
11436 if (quantity > stackable)
11437 split_quantity_new = stackable;
11438 else
11439 split_quantity_new = quantity;
11440
11442 {
11443 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11444 if (new_item)
11445 {
11446 new_item.SetResultOfSplit(true);
11447 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11449 new_item.
SetQuantity(split_quantity_new,
false,
true);
11450 }
11451 }
11452 }
11453 }
11454
11456 {
11458 {
11459 if (ScriptInputUserData.CanStoreInputUserData())
11460 {
11461 ScriptInputUserData ctx = new ScriptInputUserData;
11466 ItemBase destination_entity =
this;
11467 ctx.
Write(destination_entity);
11471 }
11472 }
11473 else if (!
GetGame().IsMultiplayer())
11474 {
11476 }
11477 }
11478
11480 {
11482 float split_quantity_new;
11484 if (player)
11485 {
11487 if (quantity > stackable)
11488 split_quantity_new = stackable;
11489 else
11490 split_quantity_new = quantity;
11491
11493 {
11494 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11495 new_item =
ItemBase.Cast(in_hands);
11496 if (new_item)
11497 {
11498 new_item.SetResultOfSplit(true);
11499 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11501 new_item.SetQuantity(split_quantity_new, false, true);
11502 }
11503 }
11504 }
11505 }
11506
11508 {
11510 float split_quantity_new = Math.Floor(quantity * 0.5);
11511
11513 return;
11514
11516
11517 if (new_item)
11518 {
11519 if (new_item.GetQuantityMax() < split_quantity_new)
11520 {
11521 split_quantity_new = new_item.GetQuantityMax();
11522 }
11523
11524 new_item.SetResultOfSplit(true);
11525 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11526
11528 {
11531 }
11532 else
11533 {
11535 new_item.
SetQuantity(split_quantity_new,
false,
true);
11536 }
11537 }
11538 }
11539
11541 {
11543 float split_quantity_new = Math.Floor(quantity / 2);
11544
11546 return;
11547
11548 InventoryLocation invloc = new InventoryLocation;
11550
11552 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11553
11554 if (new_item)
11555 {
11556 if (new_item.GetQuantityMax() < split_quantity_new)
11557 {
11558 split_quantity_new = new_item.GetQuantityMax();
11559 }
11561 {
11564 }
11565 else if (split_quantity_new > 1)
11566 {
11568 new_item.
SetQuantity(split_quantity_new,
false,
true);
11569 }
11570 }
11571 }
11572
11575 {
11576 SetWeightDirty();
11578
11579 if (parent)
11580 parent.OnAttachmentQuantityChangedEx(this, delta);
11581
11583 {
11585 {
11587 }
11589 {
11590 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11592 }
11593 }
11594
11595 }
11596
11599 {
11600
11601 }
11602
11605 {
11607 }
11608
11610 {
11611 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11612
11614 {
11615 if (newLevel == GameConstants.STATE_RUINED)
11616 {
11618 EntityAI parent = GetHierarchyParent();
11619 if (parent && parent.IsFireplace())
11620 {
11621 CargoBase cargo = GetInventory().GetCargo();
11622 if (cargo)
11623 {
11625 {
11627 }
11628 }
11629 }
11630 }
11631
11633 {
11634
11636 return;
11637 }
11638
11639 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11640 {
11642 }
11643 }
11644 }
11645
11646
11648 {
11649 super.OnRightClick();
11650
11652 {
11654 {
11655 if (ScriptInputUserData.CanStoreInputUserData())
11656 {
11657 EntityAI root = GetHierarchyRoot();
11658 Man playerOwner = GetHierarchyRootPlayer();
11659 InventoryLocation dst = new InventoryLocation;
11660
11661
11662 if (!playerOwner && root && root == this)
11663 {
11665 }
11666 else
11667 {
11668
11669 GetInventory().GetCurrentInventoryLocation(dst);
11671 {
11674 {
11676 }
11677 else
11678 {
11680
11681
11682 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11683 {
11685 }
11686 else
11687 {
11688 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11689 }
11690 }
11691 }
11692 }
11693
11694 ScriptInputUserData ctx = new ScriptInputUserData;
11702 }
11703 }
11704 else if (!
GetGame().IsMultiplayer())
11705 {
11707 }
11708 }
11709 }
11710
11712 {
11713 if (root)
11714 {
11715 vector m4[4];
11716 root.GetTransform(m4);
11717 dst.SetGround(this, m4);
11718 }
11719 else
11720 {
11721 GetInventory().GetCurrentInventoryLocation(dst);
11722 }
11723 }
11724
11725 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11726 {
11727
11728 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11729 return false;
11730
11731 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11732 return false;
11733
11734
11736 return false;
11737
11738
11739 Magazine mag = Magazine.Cast(this);
11740 if (mag)
11741 {
11742 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11743 return false;
11744
11745 if (stack_max_limit)
11746 {
11747 Magazine other_mag = Magazine.Cast(other_item);
11748 if (other_item)
11749 {
11750 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11751 return false;
11752 }
11753
11754 }
11755 }
11756 else
11757 {
11758
11760 return false;
11761
11763 return false;
11764 }
11765
11766 PlayerBase player = null;
11767 if (CastTo(player, GetHierarchyRootPlayer()))
11768 {
11769 if (player.GetInventory().HasAttachment(this))
11770 return false;
11771
11772 if (player.IsItemsToDelete())
11773 return false;
11774 }
11775
11776 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11777 return false;
11778
11779 int slotID;
11781 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11782 return false;
11783
11784 return true;
11785 }
11786
11788 {
11790 }
11791
11793 {
11794 return m_IsResultOfSplit;
11795 }
11796
11798 {
11799 m_IsResultOfSplit = value;
11800 }
11801
11803 {
11805 }
11806
11808 {
11809 float other_item_quantity = other_item.GetQuantity();
11810 float this_free_space;
11811
11813
11815
11816 if (other_item_quantity > this_free_space)
11817 {
11818 return this_free_space;
11819 }
11820 else
11821 {
11822 return other_item_quantity;
11823 }
11824 }
11825
11827 {
11829 }
11830
11832 {
11834 return;
11835
11836 if (!IsMagazine() && other_item)
11837 {
11839 if (quantity_used != 0)
11840 {
11841 float hp1 = GetHealth01("","");
11842 float hp2 = other_item.GetHealth01("","");
11843 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11844 hpResult = hpResult / (
GetQuantity() + quantity_used);
11845
11846 hpResult *= GetMaxHealth();
11847 Math.Round(hpResult);
11848 SetHealth("", "Health", hpResult);
11849
11851 other_item.AddQuantity(-quantity_used);
11852 }
11853 }
11855 }
11856
11858 {
11859 #ifdef SERVER
11860 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11861 GetHierarchyParent().IncreaseLifetimeUp();
11862 #endif
11863 };
11864
11866 {
11867 PlayerBase p = PlayerBase.Cast(player);
11868
11869 array<int> recipesIds = p.m_Recipes;
11870 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11871 if (moduleRecipesManager)
11872 {
11873 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11874 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11875 }
11876
11877 for (int i = 0;i < recipesIds.Count(); i++)
11878 {
11879 int key = recipesIds.Get(i);
11880 string recipeName = moduleRecipesManager.GetRecipeName(key);
11882 }
11883 }
11884
11885
11886 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11887 {
11888 super.GetDebugActions(outputList);
11889
11890
11896
11897
11902
11907
11908
11912
11913
11915 {
11919 }
11920
11923
11924
11928
11930
11931 InventoryLocation loc = new InventoryLocation();
11932 GetInventory().GetCurrentInventoryLocation(loc);
11934 {
11935 if (Gizmo_IsSupported())
11938 }
11939
11941 }
11942
11943
11944
11945
11947 {
11948 super.OnAction(action_id, player, ctx);
11949
11951 {
11952 switch (action_id)
11953 {
11956 return true;
11959 return true;
11960 }
11961 }
11962
11964 {
11965 switch (action_id)
11966 {
11968 Delete();
11969 return true;
11970 }
11971 }
11972
11973 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11974 {
11975 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11976 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11977 PlayerBase p = PlayerBase.Cast(player);
11978 if (
EActions.RECIPES_RANGE_START < 1000)
11979 {
11980 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11981 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11982 }
11983 }
11984 #ifndef SERVER
11985 else if (action_id ==
EActions.WATCH_PLAYER)
11986 {
11987 PluginDeveloper.SetDeveloperItemClientEx(player);
11988 }
11989 #endif
11991 {
11992 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11993 {
11994 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11995 OnDebugButtonPressServer(id + 1);
11996 }
11997
11998 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11999 {
12000 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
12002 }
12003
12004 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
12005 {
12006 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
12008 }
12009
12010 else if (action_id ==
EActions.ADD_QUANTITY)
12011 {
12012 if (IsMagazine())
12013 {
12014 Magazine mag = Magazine.Cast(this);
12015 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
12016 }
12017 else
12018 {
12020 }
12021
12022 if (m_EM)
12023 {
12024 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
12025 }
12026
12027 }
12028
12029 else if (action_id ==
EActions.REMOVE_QUANTITY)
12030 {
12031 if (IsMagazine())
12032 {
12033 Magazine mag2 = Magazine.Cast(this);
12034 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
12035 }
12036 else
12037 {
12039 }
12040 if (m_EM)
12041 {
12042 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12043 }
12044
12045 }
12046
12047 else if (action_id ==
EActions.SET_QUANTITY_0)
12048 {
12050
12051 if (m_EM)
12052 {
12053 m_EM.SetEnergy(0);
12054 }
12055 }
12056
12057 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12058 {
12060
12061 if (m_EM)
12062 {
12063 m_EM.SetEnergy(m_EM.GetEnergyMax());
12064 }
12065 }
12066
12067 else if (action_id ==
EActions.ADD_HEALTH)
12068 {
12069 AddHealth("","",GetMaxHealth("","Health")/5);
12070 }
12071 else if (action_id ==
EActions.REMOVE_HEALTH)
12072 {
12073 AddHealth("","",-GetMaxHealth("","Health")/5);
12074 }
12075 else if (action_id ==
EActions.DESTROY_HEALTH)
12076 {
12077 SetHealth01("","",0);
12078 }
12079 else if (action_id ==
EActions.WATCH_ITEM)
12080 {
12082 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12083 #ifdef DEVELOPER
12084 SetDebugDeveloper_item(this);
12085 #endif
12086 }
12087
12088 else if (action_id ==
EActions.ADD_TEMPERATURE)
12089 {
12090 AddTemperature(20);
12091
12092 }
12093
12094 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12095 {
12096 AddTemperature(-20);
12097
12098 }
12099
12100 else if (action_id ==
EActions.FLIP_FROZEN)
12101 {
12102 SetFrozen(!GetIsFrozen());
12103
12104 }
12105
12106 else if (action_id ==
EActions.ADD_WETNESS)
12107 {
12109
12110 }
12111
12112 else if (action_id ==
EActions.REMOVE_WETNESS)
12113 {
12115
12116 }
12117
12118 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12119 {
12122
12123
12124 }
12125
12126 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12127 {
12130 }
12131
12132 else if (action_id ==
EActions.MAKE_SPECIAL)
12133 {
12134 auto debugParams = DebugSpawnParams.WithPlayer(player);
12135 OnDebugSpawnEx(debugParams);
12136 }
12137
12138 }
12139
12140
12141 return false;
12142 }
12143
12144
12145
12146
12150
12153
12154
12155
12157 {
12158 return false;
12159 }
12160
12161
12163 {
12164 return true;
12165 }
12166
12167
12169 {
12170 return true;
12171 }
12172
12173
12174
12176 {
12177 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12179 }
12180
12183 {
12184 return null;
12185 }
12186
12188 {
12189 return false;
12190 }
12191
12193 {
12194 return false;
12195 }
12196
12200
12201
12203 {
12204 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12205 return module_repairing.CanRepair(this, item_repair_kit);
12206 }
12207
12208
12209 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12210 {
12211 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12212 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12213 }
12214
12215
12217 {
12218
12219
12220
12221
12222
12223
12224
12225
12226 return 1;
12227 }
12228
12229
12230
12232 {
12234 }
12235
12236
12237
12239 {
12241 }
12242
12243
12252 {
12253 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12254
12255 if (player)
12256 {
12257 player.MessageStatus(text);
12258 }
12259 }
12260
12261
12270 {
12271 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12272
12273 if (player)
12274 {
12275 player.MessageAction(text);
12276 }
12277 }
12278
12279
12288 {
12289 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12290
12291 if (player)
12292 {
12293 player.MessageFriendly(text);
12294 }
12295 }
12296
12297
12306 {
12307 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12308
12309 if (player)
12310 {
12311 player.MessageImportant(text);
12312 }
12313 }
12314
12316 {
12317 return true;
12318 }
12319
12320
12321 override bool KindOf(
string tag)
12322 {
12323 bool found = false;
12324 string item_name = this.
GetType();
12327
12328 int array_size = item_tag_array.Count();
12329 for (int i = 0; i < array_size; i++)
12330 {
12331 if (item_tag_array.Get(i) == tag)
12332 {
12333 found = true;
12334 break;
12335 }
12336 }
12337 return found;
12338 }
12339
12340
12342 {
12343
12344 super.OnRPC(sender, rpc_type,ctx);
12345
12346
12347 switch (rpc_type)
12348 {
12349 #ifndef SERVER
12350 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12351 Param2<bool, string> p = new Param2<bool, string>(false, "");
12352
12354 return;
12355
12356 bool play = p.param1;
12357 string soundSet = p.param2;
12358
12359 if (play)
12360 {
12362 {
12364 {
12366 }
12367 }
12368 else
12369 {
12371 }
12372 }
12373 else
12374 {
12376 }
12377
12378 break;
12379 #endif
12380
12381 }
12382
12384 {
12386 }
12387 }
12388
12389
12390
12391
12393 {
12394 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12395 return plugin.GetID(
name);
12396 }
12397
12399 {
12400 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12401 return plugin.GetName(id);
12402 }
12403
12406 {
12407
12408
12409 int varFlags;
12410 if (!ctx.
Read(varFlags))
12411 return;
12412
12413 if (varFlags & ItemVariableFlags.FLOAT)
12414 {
12416 }
12417 }
12418
12420 {
12421
12422 super.SerializeNumericalVars(floats_out);
12423
12424
12425
12427 {
12429 }
12430
12432 {
12434 }
12435
12437 {
12439 }
12440
12442 {
12447 }
12448
12450 {
12452 }
12453 }
12454
12456 {
12457
12458 super.DeSerializeNumericalVars(floats);
12459
12460
12461 int index = 0;
12462 int mask = Math.Round(floats.Get(index));
12463
12464 index++;
12465
12467 {
12469 {
12471 }
12472 else
12473 {
12474 float quantity = floats.Get(index);
12475 SetQuantity(quantity,
true,
false,
false,
false);
12476 }
12477 index++;
12478 }
12479
12481 {
12482 float wet = floats.Get(index);
12484 index++;
12485 }
12486
12488 {
12489 int liquidtype = Math.Round(floats.Get(index));
12491 index++;
12492 }
12493
12495 {
12497 index++;
12499 index++;
12501 index++;
12503 index++;
12504 }
12505
12507 {
12508 int cleanness = Math.Round(floats.Get(index));
12510 index++;
12511 }
12512 }
12513
12515 {
12516 super.WriteVarsToCTX(ctx);
12517
12518
12520 {
12522 }
12523
12525 {
12527 }
12528
12530 {
12532 }
12533
12535 {
12536 int r,g,b,a;
12542 }
12543
12545 {
12547 }
12548 }
12549
12551 {
12552 if (!super.ReadVarsFromCTX(ctx,version))
12553 return false;
12554
12555 int intValue;
12556 float value;
12557
12558 if (version < 140)
12559 {
12560 if (!ctx.
Read(intValue))
12561 return false;
12562
12563 m_VariablesMask = intValue;
12564 }
12565
12567 {
12568 if (!ctx.
Read(value))
12569 return false;
12570
12572 {
12574 }
12575 else
12576 {
12578 }
12579 }
12580
12581 if (version < 140)
12582 {
12584 {
12585 if (!ctx.
Read(value))
12586 return false;
12587 SetTemperatureDirect(value);
12588 }
12589 }
12590
12592 {
12593 if (!ctx.
Read(value))
12594 return false;
12596 }
12597
12599 {
12600 if (!ctx.
Read(intValue))
12601 return false;
12603 }
12604
12606 {
12607 int r,g,b,a;
12609 return false;
12611 return false;
12613 return false;
12615 return false;
12616
12618 }
12619
12621 {
12622 if (!ctx.
Read(intValue))
12623 return false;
12625 }
12626
12627 if (version >= 138 && version < 140)
12628 {
12630 {
12631 if (!ctx.
Read(intValue))
12632 return false;
12633 SetFrozen(intValue);
12634 }
12635 }
12636
12637 return true;
12638 }
12639
12640
12642 {
12645 {
12647 }
12648
12649 if (!super.OnStoreLoad(ctx, version))
12650 {
12652 return false;
12653 }
12654
12655 if (version >= 114)
12656 {
12657 bool hasQuickBarIndexSaved;
12658
12659 if (!ctx.
Read(hasQuickBarIndexSaved))
12660 {
12662 return false;
12663 }
12664
12665 if (hasQuickBarIndexSaved)
12666 {
12667 int itmQBIndex;
12668
12669
12670 if (!ctx.
Read(itmQBIndex))
12671 {
12673 return false;
12674 }
12675
12676 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12677 if (itmQBIndex != -1 && parentPlayer)
12678 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12679 }
12680 }
12681 else
12682 {
12683
12684 PlayerBase player;
12685 int itemQBIndex;
12686 if (version ==
int.
MAX)
12687 {
12688 if (!ctx.
Read(itemQBIndex))
12689 {
12691 return false;
12692 }
12693 }
12694 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12695 {
12696
12697 if (!ctx.
Read(itemQBIndex))
12698 {
12700 return false;
12701 }
12702 if (itemQBIndex != -1 && player)
12703 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12704 }
12705 }
12706
12707 if (version < 140)
12708 {
12709
12710 if (!LoadVariables(ctx, version))
12711 {
12713 return false;
12714 }
12715 }
12716
12717
12719 {
12721 return false;
12722 }
12723 if (version >= 132)
12724 {
12726 if (raib)
12727 {
12729 {
12731 return false;
12732 }
12733 }
12734 }
12735
12737 return true;
12738 }
12739
12740
12741
12743 {
12744 super.OnStoreSave(ctx);
12745
12746 PlayerBase player;
12747 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12748 {
12750
12751 int itemQBIndex = -1;
12752 itemQBIndex = player.FindQuickBarEntityIndex(this);
12753 ctx.
Write(itemQBIndex);
12754 }
12755 else
12756 {
12758 }
12759
12761
12763 if (raib)
12764 {
12766 }
12767 }
12768
12769
12771 {
12772 super.AfterStoreLoad();
12773
12775 {
12777 }
12778
12780 {
12783 }
12784 }
12785
12787 {
12788 super.EEOnAfterLoad();
12789
12791 {
12793 }
12794
12797 }
12798
12800 {
12801 return false;
12802 }
12803
12804
12805
12807 {
12809 {
12810 #ifdef PLATFORM_CONSOLE
12811
12813 {
12815 if (menu)
12816 {
12818 }
12819 }
12820 #endif
12821 }
12822
12824 {
12827 }
12828
12830 {
12831 SetWeightDirty();
12833 }
12835 {
12838 }
12839
12841 {
12844 }
12846 {
12849 }
12850
12851 super.OnVariablesSynchronized();
12852 }
12853
12854
12855
12857 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12858 {
12859 if (!IsServerCheck(allow_client))
12860 return false;
12861
12863 return false;
12864
12867
12868 if (value <= (min + 0.001))
12869 value = min;
12870
12871 if (value == min)
12872 {
12873 if (destroy_config)
12874 {
12875 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12876 if (dstr)
12877 {
12879 this.Delete();
12880 return true;
12881 }
12882 }
12883 else if (destroy_forced)
12884 {
12886 this.Delete();
12887 return true;
12888 }
12889
12891 }
12892
12895
12897 {
12899
12900 if (delta)
12902 }
12903
12905
12906 return false;
12907 }
12908
12909
12911 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12912 {
12914 }
12915
12917 {
12920 }
12921
12923 {
12926 }
12927
12929 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12930 {
12931 float value_clamped = Math.Clamp(value, 0, 1);
12933 SetQuantity(result, destroy_config, destroy_forced);
12934 }
12935
12936
12939 {
12941 }
12942
12944 {
12946 }
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12958 {
12959 int slot = -1;
12960 if (GetInventory())
12961 {
12962 InventoryLocation il = new InventoryLocation;
12963 GetInventory().GetCurrentInventoryLocation(il);
12965 }
12966
12968 }
12969
12971 {
12972 float quantity_max = 0;
12973
12975 {
12976 if (attSlotID != -1)
12977 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12978
12979 if (quantity_max <= 0)
12981 }
12982
12983 if (quantity_max <= 0)
12985
12986 return quantity_max;
12987 }
12988
12990 {
12992 }
12993
12995 {
12997 }
12998
12999
13001 {
13003 }
13004
13006 {
13008 }
13009
13011 {
13013 }
13014
13015
13017 {
13018
13019 float weightEx = GetWeightEx();
13020 float special = GetInventoryAndCargoWeight();
13021 return weightEx - special;
13022 }
13023
13024
13026 {
13028 }
13029
13031 {
13033 {
13034 #ifdef DEVELOPER
13035 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13036 {
13037 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13039 }
13040 #endif
13041
13042 return GetQuantity() * GetConfigWeightModified();
13043 }
13044 else if (HasEnergyManager())
13045 {
13046 #ifdef DEVELOPER
13047 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13048 {
13049 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13050 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13051 }
13052 #endif
13053 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13054 }
13055 else
13056 {
13057 #ifdef DEVELOPER
13058 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13059 {
13060 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13061 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13062 }
13063 #endif
13064 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13065 }
13066 }
13067
13070 {
13071 int item_count = 0;
13073
13074 if (GetInventory().GetCargo() != NULL)
13075 {
13076 item_count = GetInventory().GetCargo().GetItemCount();
13077 }
13078
13079 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
13080 {
13081 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
13082 if (item)
13083 item_count += item.GetNumberOfItems();
13084 }
13085 return item_count;
13086 }
13087
13090 {
13091 float weight = 0;
13092 float wetness = 1;
13093 if (include_wetness)
13096 {
13097 weight = wetness * m_ConfigWeight;
13098 }
13100 {
13101 weight = 1;
13102 }
13103 return weight;
13104 }
13105
13106
13107
13109 {
13110 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
13111 {
13112 GameInventory inv = GetInventory();
13113 array<EntityAI> items = new array<EntityAI>;
13115 for (int i = 0; i < items.Count(); i++)
13116 {
13118 if (item)
13119 {
13121 }
13122 }
13123 }
13124 }
13125
13126
13127
13128
13130 {
13131 float energy = 0;
13132 if (HasEnergyManager())
13133 {
13134 energy = GetCompEM().GetEnergy();
13135 }
13136 return energy;
13137 }
13138
13139
13141 {
13142 super.OnEnergyConsumed();
13143
13145 }
13146
13148 {
13149 super.OnEnergyAdded();
13150
13152 }
13153
13154
13156 {
13157 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13158 {
13160 {
13161 float energy_0to1 = GetCompEM().GetEnergy0To1();
13163 }
13164 }
13165 }
13166
13167
13169 {
13170 return ConfigGetFloat("heatIsolation");
13171 }
13172
13174 {
13176 }
13177
13179 {
13180 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13181 if (
GetGame().ConfigIsExisting(paramPath))
13183
13184 return 0.0;
13185 }
13186
13188 {
13189 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13190 if (
GetGame().ConfigIsExisting(paramPath))
13192
13193 return 0.0;
13194 }
13195
13196 override void SetWet(
float value,
bool allow_client =
false)
13197 {
13198 if (!IsServerCheck(allow_client))
13199 return;
13200
13203
13205
13206 m_VarWet = Math.Clamp(value, min, max);
13207
13209 {
13212 }
13213 }
13214
13215 override void AddWet(
float value)
13216 {
13218 }
13219
13221 {
13223 }
13224
13226 {
13228 }
13229
13231 {
13233 }
13234
13236 {
13238 }
13239
13241 {
13243 }
13244
13245 override void OnWetChanged(
float newVal,
float oldVal)
13246 {
13249 if (newLevel != oldLevel)
13250 {
13252 }
13253 }
13254
13256 {
13257 SetWeightDirty();
13258 }
13259
13261 {
13262 return GetWetLevelInternal(
m_VarWet);
13263 }
13264
13265
13266
13268 {
13270 }
13271
13273 {
13275 }
13276
13278 {
13280 }
13281
13283 {
13285 }
13286
13287
13288
13290 {
13291 if (ConfigIsExisting("itemModelLength"))
13292 {
13293 return ConfigGetFloat("itemModelLength");
13294 }
13295 return 0;
13296 }
13297
13299 {
13300 if (ConfigIsExisting("itemAttachOffset"))
13301 {
13302 return ConfigGetFloat("itemAttachOffset");
13303 }
13304 return 0;
13305 }
13306
13307 override void SetCleanness(
int value,
bool allow_client =
false)
13308 {
13309 if (!IsServerCheck(allow_client))
13310 return;
13311
13313
13315
13318 }
13319
13321 {
13323 }
13324
13326 {
13327 return true;
13328 }
13329
13330
13331
13332
13334 {
13336 }
13337
13339 {
13341 }
13342
13343
13344
13345
13346 override void SetColor(
int r,
int g,
int b,
int a)
13347 {
13353 }
13355 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13356 {
13361 }
13362
13364 {
13366 }
13367
13370 {
13371 int r,g,b,a;
13373 r = r/255;
13374 g = g/255;
13375 b = b/255;
13376 a = a/255;
13377 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13378 }
13379
13380
13381
13382 override void SetLiquidType(
int value,
bool allow_client =
false)
13383 {
13384 if (!IsServerCheck(allow_client))
13385 return;
13386
13391 }
13392
13394 {
13395 return ConfigGetInt("varLiquidTypeInit");
13396 }
13397
13399 {
13401 }
13402
13404 {
13406 SetFrozen(false);
13407 }
13408
13411 {
13412 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13413 }
13414
13415
13418 {
13419 PlayerBase nplayer;
13420 if (PlayerBase.CastTo(nplayer, player))
13421 {
13423
13424 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13425 }
13426 }
13427
13428
13431 {
13432 PlayerBase nplayer;
13433 if (PlayerBase.CastTo(nplayer,player))
13434 {
13435
13436 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13437
13438 }
13439
13440
13441 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13442
13443
13444 if (HasEnergyManager())
13445 {
13446 GetCompEM().UpdatePlugState();
13447 }
13448 }
13449
13450
13452 {
13453 super.OnPlacementStarted(player);
13454
13456 }
13457
13458 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13459 {
13461 {
13462 m_AdminLog.OnPlacementComplete(player,
this);
13463 }
13464
13465 super.OnPlacementComplete(player, position, orientation);
13466 }
13467
13468
13469
13470
13471
13473 {
13475 {
13476 return true;
13477 }
13478 else
13479 {
13480 return false;
13481 }
13482 }
13483
13484
13486 {
13488 {
13490 }
13491 }
13492
13493
13495 {
13497 }
13498
13500 {
13502 }
13503
13504 override void InsertAgent(
int agent,
float count = 1)
13505 {
13506 if (count < 1)
13507 return;
13508
13510 }
13511
13514 {
13516 }
13517
13518
13520 {
13522 }
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13566 {
13568 return false;
13569 return true;
13570 }
13571
13573 {
13574
13576 }
13577
13578
13581 {
13582 super.CheckForRoofLimited(timeTresholdMS);
13583
13585 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13586 {
13587 m_PreviousRoofTestTime = time;
13588 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13589 }
13590 }
13591
13592
13594 {
13596 {
13597 return 0;
13598 }
13599
13600 if (GetInventory().GetAttachmentSlotsCount() != 0)
13601 {
13602 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13603 if (filter)
13604 return filter.GetProtectionLevel(type, false, system);
13605 else
13606 return 0;
13607 }
13608
13609 string subclassPath, entryName;
13610
13611 switch (type)
13612 {
13614 entryName = "biological";
13615 break;
13617 entryName = "chemical";
13618 break;
13619 default:
13620 entryName = "biological";
13621 break;
13622 }
13623
13624 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13625
13627 }
13628
13629
13630
13633 {
13634 if (!IsMagazine())
13636
13638 }
13639
13640
13641
13642
13643
13648 {
13649 return true;
13650 }
13651
13653 {
13655 }
13656
13657
13658
13659
13660
13662 {
13663 if (parent)
13664 {
13665 if (parent.IsInherited(DayZInfected))
13666 return true;
13667
13668 if (!parent.IsRuined())
13669 return true;
13670 }
13671
13672 return true;
13673 }
13674
13676 {
13677 if (!super.CanPutAsAttachment(parent))
13678 {
13679 return false;
13680 }
13681
13682 if (!IsRuined() && !parent.IsRuined())
13683 {
13684 return true;
13685 }
13686
13687 return false;
13688 }
13689
13691 {
13692
13693
13694
13695
13696 return super.CanReceiveItemIntoCargo(item);
13697 }
13698
13700 {
13701
13702
13703
13704
13705 GameInventory attachmentInv = attachment.GetInventory();
13707 {
13708 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13709 return false;
13710 }
13711
13712 InventoryLocation loc = new InventoryLocation();
13713 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13714 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13715 return false;
13716
13717 return super.CanReceiveAttachment(attachment, slotId);
13718 }
13719
13721 {
13722 if (!super.CanReleaseAttachment(attachment))
13723 return false;
13724
13725 return GetInventory().AreChildrenAccessible();
13726 }
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13749 {
13750 int id = muzzle_owner.GetMuzzleID();
13751 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13752
13753 if (WPOF_array)
13754 {
13755 for (int i = 0; i < WPOF_array.Count(); i++)
13756 {
13757 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13758
13759 if (WPOF)
13760 {
13761 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13762 }
13763 }
13764 }
13765 }
13766
13767
13769 {
13770 int id = muzzle_owner.GetMuzzleID();
13772
13773 if (WPOBE_array)
13774 {
13775 for (int i = 0; i < WPOBE_array.Count(); i++)
13776 {
13777 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13778
13779 if (WPOBE)
13780 {
13781 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13782 }
13783 }
13784 }
13785 }
13786
13787
13789 {
13790 int id = muzzle_owner.GetMuzzleID();
13791 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13792
13793 if (WPOOH_array)
13794 {
13795 for (int i = 0; i < WPOOH_array.Count(); i++)
13796 {
13797 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13798
13799 if (WPOOH)
13800 {
13801 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13802 }
13803 }
13804 }
13805 }
13806
13807
13809 {
13810 int id = muzzle_owner.GetMuzzleID();
13811 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13812
13813 if (WPOOH_array)
13814 {
13815 for (int i = 0; i < WPOOH_array.Count(); i++)
13816 {
13817 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13818
13819 if (WPOOH)
13820 {
13821 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13822 }
13823 }
13824 }
13825 }
13826
13827
13829 {
13830 int id = muzzle_owner.GetMuzzleID();
13831 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13832
13833 if (WPOOH_array)
13834 {
13835 for (int i = 0; i < WPOOH_array.Count(); i++)
13836 {
13837 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13838
13839 if (WPOOH)
13840 {
13841 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13842 }
13843 }
13844 }
13845 }
13846
13847
13848
13850 {
13852 {
13853 return true;
13854 }
13855
13856 return false;
13857 }
13858
13860 {
13862 {
13863 return true;
13864 }
13865
13866 return false;
13867 }
13868
13870 {
13872 {
13873 return true;
13874 }
13875
13876 return false;
13877 }
13878
13880 {
13881 return false;
13882 }
13883
13886 {
13887 return UATimeSpent.DEFAULT_DEPLOY;
13888 }
13889
13890
13891
13892
13894 {
13896 SetSynchDirty();
13897 }
13898
13900 {
13902 }
13903
13904
13906 {
13907 return false;
13908 }
13909
13912 {
13913 string att_type = "None";
13914
13915 if (ConfigIsExisting("soundAttType"))
13916 {
13917 att_type = ConfigGetString("soundAttType");
13918 }
13919
13921 }
13922
13924 {
13926 }
13927
13928
13929
13930
13931
13937
13939 {
13942
13944 }
13945
13946
13948 {
13950 return;
13951
13953
13956
13959
13960 SoundParameters params = new SoundParameters();
13964 }
13965
13966
13968 {
13970 return;
13971
13973 SetSynchDirty();
13974
13977 }
13978
13979
13981 {
13983 return;
13984
13986 SetSynchDirty();
13987
13990 }
13991
13993 {
13995 }
13996
13998 {
14000 }
14001
14004 {
14005 if (!
GetGame().IsDedicatedServer())
14006 {
14007 if (ConfigIsExisting("attachSoundSet"))
14008 {
14009 string cfg_path = "";
14010 string soundset = "";
14011 string type_name =
GetType();
14012
14015 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14016 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14017
14018 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14019 {
14020 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14021 {
14022 if (cfg_slot_array[i] == slot_type)
14023 {
14024 soundset = cfg_soundset_array[i];
14025 break;
14026 }
14027 }
14028 }
14029
14030 if (soundset != "")
14031 {
14032 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14034 }
14035 }
14036 }
14037 }
14038
14040 {
14041
14042 }
14043
14044 void OnApply(PlayerBase player);
14045
14047 {
14048 return 1.0;
14049 };
14050
14052 {
14054 }
14055
14057 {
14059 }
14060
14062
14064 {
14065 SetDynamicPhysicsLifeTime(0.01);
14067 }
14068
14070 {
14071 array<string> zone_names = new array<string>;
14072 GetDamageZones(zone_names);
14073 for (int i = 0; i < zone_names.Count(); i++)
14074 {
14075 SetHealthMax(zone_names.Get(i),"Health");
14076 }
14077 SetHealthMax("","Health");
14078 }
14079
14082 {
14083 float global_health = GetHealth01("","Health");
14084 array<string> zones = new array<string>;
14085 GetDamageZones(zones);
14086
14087 for (int i = 0; i < zones.Count(); i++)
14088 {
14089 SetHealth01(zones.Get(i),"Health",global_health);
14090 }
14091 }
14092
14095 {
14096 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14097 }
14098
14100 {
14101 if (!hasRootAsPlayer)
14102 {
14103 if (refParentIB)
14104 {
14105
14106 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14107 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14108
14109 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14110 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14111
14114 }
14115 else
14116 {
14117
14120 }
14121 }
14122 }
14123
14125 {
14127 {
14128 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14129 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14130 {
14131 float heatPermCoef = 1.0;
14133 while (ent)
14134 {
14135 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14136 ent = ent.GetHierarchyParent();
14137 }
14138
14139 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14140 }
14141 }
14142 }
14143
14145 {
14146
14147 EntityAI parent = GetHierarchyParent();
14148 if (!parent)
14149 {
14150 hasParent = false;
14151 hasRootAsPlayer = false;
14152 }
14153 else
14154 {
14155 hasParent = true;
14156 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14157 refParentIB =
ItemBase.Cast(parent);
14158 }
14159 }
14160
14161 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14162 {
14163
14164 }
14165
14167 {
14168
14169 return false;
14170 }
14171
14173 {
14174
14175
14176 return false;
14177 }
14178
14180 {
14181
14182 return false;
14183 }
14184
14187 {
14188 return !GetIsFrozen() &&
IsOpen();
14189 }
14190
14192 {
14193 bool hasParent = false, hasRootAsPlayer = false;
14195
14196 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14197 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14198
14199 if (wwtu || foodDecay)
14200 {
14204
14205 if (processWetness || processTemperature || processDecay)
14206 {
14208
14209 if (processWetness)
14210 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14211
14212 if (processTemperature)
14214
14215 if (processDecay)
14216 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14217 }
14218 }
14219 }
14220
14223 {
14225 }
14226
14228 {
14231
14232 return super.GetTemperatureFreezeThreshold();
14233 }
14234
14236 {
14239
14240 return super.GetTemperatureThawThreshold();
14241 }
14242
14244 {
14247
14248 return super.GetItemOverheatThreshold();
14249 }
14250
14252 {
14254 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14255
14256 return super.GetTemperatureFreezeTime();
14257 }
14258
14260 {
14262 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14263
14264 return super.GetTemperatureThawTime();
14265 }
14266
14271
14273 {
14274 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14275 }
14276
14278 {
14279 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14280 }
14281
14284 {
14286 }
14287
14289 {
14291 }
14292
14294 {
14296 }
14297
14300 {
14301 return null;
14302 }
14303
14306 {
14307 return false;
14308 }
14309
14311 {
14313 {
14316 if (!trg)
14317 {
14319 explosive = this;
14320 }
14321
14322 explosive.PairRemote(trg);
14324
14325 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14326 trg.SetPersistentPairID(persistentID);
14327 explosive.SetPersistentPairID(persistentID);
14328
14329 return true;
14330 }
14331 return false;
14332 }
14333
14336 {
14337 float ret = 1.0;
14340 ret *= GetHealth01();
14341
14342 return ret;
14343 }
14344
14345 #ifdef DEVELOPER
14346 override void SetDebugItem()
14347 {
14348 super.SetDebugItem();
14349 _itemBase = this;
14350 }
14351
14353 {
14354 string text = super.GetDebugText();
14355
14357 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14358
14359 return text;
14360 }
14361 #endif
14362
14364 {
14365 return true;
14366 }
14367
14369
14371
14373 {
14376 }
14377
14378
14386
14402}
14403
14405{
14407 if (entity)
14408 {
14409 bool is_item = entity.IsInherited(
ItemBase);
14410 if (is_item && full_quantity)
14411 {
14414 }
14415 }
14416 else
14417 {
14419 return NULL;
14420 }
14421 return entity;
14422}
14423
14425{
14426 if (item)
14427 {
14428 if (health > 0)
14429 item.SetHealth("", "", health);
14430
14431 if (item.CanHaveTemperature())
14432 {
14434 if (item.CanFreeze())
14435 item.SetFrozen(false);
14436 }
14437
14438 if (item.HasEnergyManager())
14439 {
14440 if (quantity >= 0)
14441 {
14442 item.GetCompEM().SetEnergy0To1(quantity);
14443 }
14444 else
14445 {
14447 }
14448 }
14449 else if (item.IsMagazine())
14450 {
14451 Magazine mag = Magazine.Cast(item);
14452 if (quantity >= 0)
14453 {
14454 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14455 }
14456 else
14457 {
14459 }
14460
14461 }
14462 else
14463 {
14464 if (quantity >= 0)
14465 {
14466 item.SetQuantityNormalized(quantity, false);
14467 }
14468 else
14469 {
14471 }
14472
14473 }
14474 }
14475}
14476
14477#ifdef DEVELOPER
14479#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
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...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
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...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
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()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
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)
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()
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)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
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)
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
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
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.