Items cannot be consumed if frozen by default. Override for exceptions.
9548{
9550 {
9551 return true;
9552 }
9553};
9554
9556{
9557
9558};
9559
9560
9561
9563{
9567
9569
9572
9573
9574
9575
9576
9585
9591
9596
9601
9622 protected bool m_IsResultOfSplit
9623
9625
9630
9631
9632
9634
9638
9639
9640
9642
9645
9646
9647
9653
9654
9662
9665
9666
9668
9669
9671
9672
9677
9678
9683
9685
9686
9688
9689
9691 {
9696
9697 if (!
g_Game.IsDedicatedServer())
9698 {
9700 {
9702
9704 {
9706 }
9707 }
9708
9711 }
9712
9713 m_OldLocation = null;
9714
9716 {
9718 }
9719
9720 if (ConfigIsExisting("headSelectionsToHide"))
9721 {
9724 }
9725
9727 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9728 {
9730 }
9731
9733
9734 m_IsResultOfSplit = false;
9735
9737 }
9738
9740 {
9741 super.InitItemVariables();
9742
9748 m_Count = ConfigGetInt(
"count");
9749
9752
9757
9760
9765
9777
9781
9782
9785 if (ConfigIsExisting("canBeSplit"))
9786 {
9789 }
9790
9792 if (ConfigIsExisting("itemBehaviour"))
9794
9795
9798 RegisterNetSyncVariableInt("m_VarLiquidType");
9799 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9800
9801 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9802 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9803 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9804
9805 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9806 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9807 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9808 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9809
9810 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9811 RegisterNetSyncVariableBool("m_IsTakeable");
9812 RegisterNetSyncVariableBool("m_IsHologram");
9813
9816 {
9819 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9820 }
9821
9823
9825 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9827
9829 }
9830
9832 {
9834 }
9835
9837 {
9840 {
9845 }
9846 }
9847
9848 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9849 {
9851 {
9854 }
9855
9857 }
9858
9860 {
9866 }
9867
9869
9871 {
9873
9874 if (!action)
9875 {
9876 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9877 return;
9878 }
9879
9881 if (!ai)
9882 {
9884 return;
9885 }
9886
9888 if (!action_array)
9889 {
9890 action_array = new array<ActionBase_Basic>;
9892 }
9893 if (LogManager.IsActionLogEnable())
9894 {
9895 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9896 }
9897
9898 if (action_array.Find(action) != -1)
9899 {
9900 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9901 }
9902 else
9903 {
9904 action_array.Insert(action);
9905 }
9906 }
9907
9909 {
9910 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9911 ActionBase action = player.GetActionManager().GetAction(actionName);
9914
9915 if (action_array)
9916 {
9917 action_array.RemoveItem(action);
9918 }
9919 }
9920
9921
9922
9924 {
9925 ActionOverrideData overrideData = new ActionOverrideData();
9929
9931 if (!actionMap)
9932 {
9935 }
9936
9937 actionMap.Insert(this.
Type(), overrideData);
9938
9939 }
9940
9942
9944
9945
9947 {
9950
9953
9954 string config_to_search = "CfgVehicles";
9955 string muzzle_owner_config;
9956
9958 {
9959 if (IsInherited(Weapon))
9960 config_to_search = "CfgWeapons";
9961
9962 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9963
9964 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9965
9966 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9967
9968 if (config_OnFire_subclass_count > 0)
9969 {
9970 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9971
9972 for (int i = 0; i < config_OnFire_subclass_count; i++)
9973 {
9974 string particle_class = "";
9975 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9976 string config_OnFire_entry = config_OnFire_class + particle_class;
9977 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9978 WPOF_array.Insert(WPOF);
9979 }
9980
9981
9983 }
9984 }
9985
9987 {
9988 config_to_search = "CfgWeapons";
9989 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9990
9991 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9992
9993 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9994
9995 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9996 {
9997 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9998
9999 for (i = 0; i < config_OnBulletCasingEject_count; i++)
10000 {
10001 string particle_class2 = "";
10002 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
10003 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
10004 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
10005 WPOBE_array.Insert(WPOBE);
10006 }
10007
10008
10010 }
10011 }
10012 }
10013
10014
10016 {
10019
10021 {
10022 string config_to_search = "CfgVehicles";
10023
10024 if (IsInherited(Weapon))
10025 config_to_search = "CfgWeapons";
10026
10027 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10028 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10029
10030 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
10031 {
10032
10034
10036 {
10038 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10040 return;
10041 }
10042
10045
10046
10047
10048 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
10049 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10050
10051 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10052 {
10053 string particle_class = "";
10054 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
10055 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10056 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
10057
10058 if (entry_type == CT_CLASS)
10059 {
10060 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10061 WPOOH_array.Insert(WPOF);
10062 }
10063 }
10064
10065
10067 }
10068 }
10069 }
10070
10072 {
10074 }
10075
10077 {
10079 {
10081
10084
10087
10088 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10089 }
10090 }
10091
10093 {
10095 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10096
10098 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10099
10101 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10102
10104 {
10106 }
10107 }
10108
10110 {
10112 }
10113
10115 {
10118 else
10120
10122 {
10125 }
10126 else
10127 {
10130
10133 }
10134
10136 }
10137
10139 {
10141 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10142 }
10143
10145 {
10147 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10149 }
10150
10152 {
10154 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10155 }
10156
10158 {
10161
10162 OverheatingParticle OP = new OverheatingParticle();
10167
10169 }
10170
10172 {
10175
10176 return -1;
10177 }
10178
10180 {
10182 {
10185
10186 for (int i = count; i > 0; --i)
10187 {
10188 int id = i - 1;
10191
10194
10195 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10196 {
10197 if (p)
10198 {
10201 }
10202 }
10203 }
10204 }
10205 }
10206
10208 {
10210 {
10212 {
10213 int id = i - 1;
10215
10216 if (OP)
10217 {
10219
10220 if (p)
10221 {
10223 }
10224
10225 delete OP;
10226 }
10227 }
10228
10231 }
10232 }
10233
10236 {
10237 return 0.0;
10238 }
10239
10240
10242 {
10243 return 250;
10244 }
10245
10247 {
10248 return 0;
10249 }
10250
10253 {
10255 return true;
10256
10257 return false;
10258 }
10259
10262 {
10265
10267 {
10269 }
10270 else
10271 {
10272
10274 }
10275
10277 }
10278
10285 {
10286 return -1;
10287 }
10288
10289
10290
10291
10293 {
10295 {
10296 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10297 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10298
10299 if (r_index >= 0)
10300 {
10301 InventoryLocation r_il = new InventoryLocation;
10302 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10303
10304 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10307 {
10308 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10309 }
10311 {
10312 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10313 }
10314
10315 }
10316
10317 player.GetHumanInventory().ClearUserReservedLocation(this);
10318 }
10319
10322 }
10323
10324
10325
10326
10328 {
10329 return ItemBase.m_DebugActionsMask;
10330 }
10331
10333 {
10334 return ItemBase.m_DebugActionsMask & mask;
10335 }
10336
10338 {
10339 ItemBase.m_DebugActionsMask = mask;
10340 }
10341
10343 {
10344 ItemBase.m_DebugActionsMask |= mask;
10345 }
10346
10348 {
10349 ItemBase.m_DebugActionsMask &= ~mask;
10350 }
10351
10353 {
10355 {
10357 }
10358 else
10359 {
10361 }
10362 }
10363
10364
10366 {
10367 if (GetEconomyProfile())
10368 {
10369 float q_max = GetEconomyProfile().GetQuantityMax();
10370 if (q_max > 0)
10371 {
10372 float q_min = GetEconomyProfile().GetQuantityMin();
10373 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10374
10376 {
10377 ComponentEnergyManager comp = GetCompEM();
10379 {
10381 }
10382 }
10384 {
10386
10387 }
10388
10389 }
10390 }
10391 }
10392
10395 {
10396 EntityAI parent = GetHierarchyParent();
10397
10398 if (parent)
10399 {
10400 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10401 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10402 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10403 }
10404 }
10405
10408 {
10409 EntityAI parent = GetHierarchyParent();
10410
10411 if (parent)
10412 {
10413 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10414 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10415 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10416 }
10417 }
10418
10420 {
10421
10422
10423
10424
10426
10428 {
10429 if (ScriptInputUserData.CanStoreInputUserData())
10430 {
10431 ScriptInputUserData ctx = new ScriptInputUserData;
10437 ctx.
Write(use_stack_max);
10440
10442 {
10443 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10444 }
10445 }
10446 }
10447 else if (!
g_Game.IsMultiplayer())
10448 {
10450 }
10451 }
10452
10454 {
10456 }
10457
10459 {
10461 }
10462
10464 {
10466 }
10467
10469 {
10470
10471 return false;
10472 }
10473
10475 {
10476 return false;
10477 }
10478
10482 {
10483 return false;
10484 }
10485
10487 {
10488 return "";
10489 }
10490
10492
10494 {
10495 return false;
10496 }
10497
10499 {
10500 return true;
10501 }
10502
10503
10504
10506 {
10507 return true;
10508 }
10509
10511 {
10512 return true;
10513 }
10514
10516 {
10517 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10519 }
10520
10522 {
10524 }
10525
10527 {
10529 if (!is_being_placed)
10531 SetSynchDirty();
10532 }
10533
10534
10536
10538 {
10540 }
10541
10543 {
10545 }
10546
10548 {
10549 return 1;
10550 }
10551
10553 {
10554 return false;
10555 }
10556
10558 {
10560 SetSynchDirty();
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
10594
10595
10596
10598 {
10599 super.OnMovedInsideCargo(container);
10600
10601 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10602 }
10603
10604 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10605 {
10606 super.EEItemLocationChanged(oldLoc, newLoc);
10607
10608 PlayerBase newPlayer = null;
10609 PlayerBase oldPlayer = null;
10610
10611 if (newLoc.GetParent())
10612 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10613
10614 if (oldLoc.GetParent())
10615 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10616
10618 {
10619 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10620
10621 if (rIndex >= 0)
10622 {
10623 InventoryLocation rIl = new InventoryLocation;
10624 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10625
10626 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10629 {
10630 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10631 }
10633 {
10635 }
10636
10637 }
10638 }
10639
10641 {
10642 if (newPlayer)
10643 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10644
10645 if (newPlayer == oldPlayer)
10646 {
10647 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10648 {
10650 {
10651 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10652 {
10653 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10654 }
10655 }
10656 else
10657 {
10658 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10659 }
10660 }
10661
10662 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10663 {
10664 int type = oldLoc.GetType();
10666 {
10667 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10668 }
10670 {
10671 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10672 }
10673 }
10674 if (!m_OldLocation)
10675 {
10676 m_OldLocation = new InventoryLocation;
10677 }
10678 m_OldLocation.Copy(oldLoc);
10679 }
10680 else
10681 {
10682 if (m_OldLocation)
10683 {
10684 m_OldLocation.Reset();
10685 }
10686 }
10687
10688 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10689 }
10690 else
10691 {
10692 if (newPlayer)
10693 {
10694 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10695 if (resIndex >= 0)
10696 {
10697 InventoryLocation il = new InventoryLocation;
10698 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10700 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10703 {
10704 il.
GetParent().GetOnReleaseLock().Invoke(it);
10705 }
10707 {
10709 }
10710
10711 }
10712 }
10714 {
10715
10717 }
10718
10719 if (m_OldLocation)
10720 {
10721 m_OldLocation.Reset();
10722 }
10723 }
10724
10726 {
10727 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10728 }
10729
10731 {
10732 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10733 }
10734 }
10735
10736 override void EOnContact(IEntity other, Contact extra)
10737 {
10739 {
10740 int liquidType = -1;
10742 if (impactSpeed > 0.0)
10743 {
10745 #ifndef SERVER
10747 #else
10749 SetSynchDirty();
10750 #endif
10752 }
10753 }
10754
10755 #ifdef SERVER
10756 if (GetCompEM() && GetCompEM().IsPlugged())
10757 {
10758 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10759 GetCompEM().UnplugThis();
10760 }
10761 #endif
10762 }
10763
10765
10767 {
10769 }
10770
10772 {
10773
10774 }
10775
10777 {
10778 super.OnItemLocationChanged(old_owner, new_owner);
10779
10780 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10781 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10782
10783 if (!relatedPlayer && playerNew)
10784 relatedPlayer = playerNew;
10785
10786 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10787 {
10789 if (actionMgr)
10790 {
10791 ActionBase currentAction = actionMgr.GetRunningAction();
10792 if (currentAction)
10794 }
10795 }
10796
10797 Man ownerPlayerOld = null;
10798 Man ownerPlayerNew = null;
10799
10800 if (old_owner)
10801 {
10802 if (old_owner.
IsMan())
10803 {
10804 ownerPlayerOld = Man.Cast(old_owner);
10805 }
10806 else
10807 {
10808 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10809 }
10810 }
10811 else
10812 {
10814 {
10816
10817 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10818 {
10819 GetCompEM().UnplugThis();
10820 }
10821 }
10822 }
10823
10824 if (new_owner)
10825 {
10826 if (new_owner.
IsMan())
10827 {
10828 ownerPlayerNew = Man.Cast(new_owner);
10829 }
10830 else
10831 {
10832 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10833 }
10834 }
10835
10836 if (ownerPlayerOld != ownerPlayerNew)
10837 {
10838 if (ownerPlayerOld)
10839 {
10840 array<EntityAI> subItemsExit = new array<EntityAI>;
10842 for (int i = 0; i < subItemsExit.Count(); i++)
10843 {
10846 }
10847 }
10848
10849 if (ownerPlayerNew)
10850 {
10851 array<EntityAI> subItemsEnter = new array<EntityAI>;
10853 for (int j = 0; j < subItemsEnter.Count(); j++)
10854 {
10857 }
10858 }
10859 }
10860 else if (ownerPlayerNew != null)
10861 {
10862 PlayerBase nplayer;
10863 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10864 {
10865 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10867 for (int k = 0; k < subItemsUpdate.Count(); k++)
10868 {
10870 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10871 }
10872 }
10873 }
10874
10875 if (old_owner)
10876 old_owner.OnChildItemRemoved(this);
10877 if (new_owner)
10878 new_owner.OnChildItemReceived(this);
10879 }
10880
10881
10883 {
10884 super.EEDelete(parent);
10885 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10886 if (player)
10887 {
10889
10890 if (player.IsAlive())
10891 {
10892 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10893 if (r_index >= 0)
10894 {
10895 InventoryLocation r_il = new InventoryLocation;
10896 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10897
10898 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10901 {
10902 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10903 }
10905 {
10906 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10907 }
10908
10909 }
10910
10911 player.RemoveQuickBarEntityShortcut(this);
10912 }
10913 }
10914 }
10915
10917 {
10918 super.EEKilled(killer);
10919
10922 {
10923 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10924 {
10925 if (IsMagazine())
10926 {
10927 if (Magazine.Cast(this).GetAmmoCount() > 0)
10928 {
10930 }
10931 }
10932 else
10933 {
10935 }
10936 }
10937 }
10938 }
10939
10941 {
10942 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10943
10944 super.OnWasAttached(parent, slot_id);
10945
10948
10951 }
10952
10954 {
10955 super.OnWasDetached(parent, slot_id);
10956
10959
10962 }
10963
10965 {
10966 int idx;
10969
10970 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10971 if (inventory_slots.Count() < 1)
10972 {
10973 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10974 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10975 }
10976 else
10977 {
10978 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10979 }
10980
10981 idx = inventory_slots.Find(slot);
10982 if (idx < 0)
10983 return "";
10984
10985 return attach_types.Get(idx);
10986 }
10987
10989 {
10990 int idx = -1;
10991 string slot;
10992
10995
10996 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10997 if (inventory_slots.Count() < 1)
10998 {
10999 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
11000 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11001 }
11002 else
11003 {
11004 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
11005 if (detach_types.Count() < 1)
11006 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11007 }
11008
11009 for (int i = 0; i < inventory_slots.Count(); i++)
11010 {
11011 slot = inventory_slots.Get(i);
11012 }
11013
11014 if (slot != "")
11015 {
11016 if (detach_types.Count() == 1)
11017 idx = 0;
11018 else
11019 idx = inventory_slots.Find(slot);
11020 }
11021 if (idx < 0)
11022 return "";
11023
11024 return detach_types.Get(idx);
11025 }
11026
11028 {
11029
11031
11032
11033 float min_time = 1;
11034 float max_time = 3;
11035 float delay = Math.RandomFloat(min_time, max_time);
11036
11037 explode_timer.Run(delay, this, "DoAmmoExplosion");
11038 }
11039
11041 {
11042 Magazine magazine = Magazine.Cast(this);
11043 int pop_sounds_count = 6;
11044 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11045
11046
11047 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11048 string sound_name = pop_sounds[ sound_idx ];
11049 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
11050
11051
11052 magazine.ServerAddAmmoCount(-1);
11053
11054
11055 float min_temp_to_explode = 100;
11056
11057 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
11058 {
11060 }
11061 }
11062
11063
11064 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11065 {
11066 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11067
11068 const int CHANCE_DAMAGE_CARGO = 4;
11069 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11070 const int CHANCE_DAMAGE_NOTHING = 2;
11071
11073 {
11074 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11075 int chances;
11076 int rnd;
11077
11078 if (GetInventory().GetCargo())
11079 {
11080 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11081 rnd = Math.RandomInt(0,chances);
11082
11083 if (rnd < CHANCE_DAMAGE_CARGO)
11084 {
11086 }
11087 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11088 {
11090 }
11091 }
11092 else
11093 {
11094 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11095 rnd = Math.RandomInt(0,chances);
11096
11097 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11098 {
11100 }
11101 }
11102 }
11103 }
11104
11106 {
11107 CargoBase cargo = GetInventory().GetCargo();
11108 if (cargo)
11109 {
11111 if (item_count > 0)
11112 {
11113 int random_pick = Math.RandomInt(0, item_count);
11115 if (!item.IsExplosive())
11116 {
11117 item.AddHealth("","",damage);
11118 return true;
11119 }
11120 }
11121 }
11122 return false;
11123 }
11124
11126 {
11127 GameInventory inventory = GetInventory();
11129 if (attachment_count > 0)
11130 {
11131 int random_pick = Math.RandomInt(0, attachment_count);
11133 if (!attachment.IsExplosive())
11134 {
11135 attachment.AddHealth("","",damage);
11136 return true;
11137 }
11138 }
11139 return false;
11140 }
11141
11143 {
11145 }
11146
11148 {
11150 return GetInventory().CanRemoveEntity();
11151
11152 return false;
11153 }
11154
11156 {
11157
11159 return false;
11160
11161
11163 return false;
11164
11165
11166
11168 if (delta == 0)
11169 return false;
11170
11171
11172 return true;
11173 }
11174
11176 {
11178 {
11179 if (ScriptInputUserData.CanStoreInputUserData())
11180 {
11181 ScriptInputUserData ctx = new ScriptInputUserData;
11186 ctx.
Write(destination_entity);
11188 ctx.
Write(slot_id);
11190 }
11191 }
11192 else if (!
g_Game.IsMultiplayer())
11193 {
11195 }
11196 }
11197
11199 {
11200 float split_quantity_new;
11204 InventoryLocation loc = new InventoryLocation;
11205
11206 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11207 {
11209 split_quantity_new = stack_max;
11210 else
11212
11214 {
11215 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11216 if (new_item)
11217 {
11218 new_item.SetResultOfSplit(true);
11219 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11221 new_item.
SetQuantity(split_quantity_new,
false,
true);
11222 }
11223 }
11224 }
11225 else if (destination_entity && slot_id == -1)
11226 {
11227 if (quantity > stack_max)
11228 split_quantity_new = stack_max;
11229 else
11230 split_quantity_new = quantity;
11231
11233 {
11234 GameInventory destinationInventory = destination_entity.GetInventory();
11236 {
11239 }
11240
11241 if (new_item)
11242 {
11243 new_item.SetResultOfSplit(true);
11244 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11246 new_item.
SetQuantity(split_quantity_new,
false,
true);
11247 }
11248 }
11249 }
11250 else
11251 {
11252 if (stack_max != 0)
11253 {
11255 {
11257 }
11258
11259 if (split_quantity_new == 0)
11260 {
11261 if (!
g_Game.IsMultiplayer())
11262 player.PhysicalPredictiveDropItem(this);
11263 else
11264 player.ServerDropEntity(this);
11265 return;
11266 }
11267
11269 {
11271
11272 if (new_item)
11273 {
11274 new_item.SetResultOfSplit(true);
11275 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11278 new_item.PlaceOnSurface();
11279 }
11280 }
11281 }
11282 }
11283 }
11284
11286 {
11287 float split_quantity_new;
11291 InventoryLocation loc = new InventoryLocation;
11292
11293 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11294 {
11296 split_quantity_new = stack_max;
11297 else
11299
11301 {
11302 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11303 if (new_item)
11304 {
11305 new_item.SetResultOfSplit(true);
11306 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11308 new_item.
SetQuantity(split_quantity_new,
false,
true);
11309 }
11310 }
11311 }
11312 else if (destination_entity && slot_id == -1)
11313 {
11314 if (quantity > stack_max)
11315 split_quantity_new = stack_max;
11316 else
11317 split_quantity_new = quantity;
11318
11320 {
11321 GameInventory destinationInventory = destination_entity.GetInventory();
11323 {
11326 }
11327
11328 if (new_item)
11329 {
11330 new_item.SetResultOfSplit(true);
11331 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11333 new_item.
SetQuantity(split_quantity_new,
false,
true);
11334 }
11335 }
11336 }
11337 else
11338 {
11339 if (stack_max != 0)
11340 {
11342 {
11344 }
11345
11347 {
11349
11350 if (new_item)
11351 {
11352 new_item.SetResultOfSplit(true);
11353 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11356 new_item.PlaceOnSurface();
11357 }
11358 }
11359 }
11360 }
11361 }
11362
11364 {
11366 {
11367 if (ScriptInputUserData.CanStoreInputUserData())
11368 {
11369 ScriptInputUserData ctx = new ScriptInputUserData;
11374 dst.WriteToContext(ctx);
11376 }
11377 }
11378 else if (!
g_Game.IsMultiplayer())
11379 {
11381 }
11382 }
11383
11385 {
11387 {
11388 if (ScriptInputUserData.CanStoreInputUserData())
11389 {
11390 ScriptInputUserData ctx = new ScriptInputUserData;
11395 ctx.
Write(destination_entity);
11401 }
11402 }
11403 else if (!
g_Game.IsMultiplayer())
11404 {
11406 }
11407 }
11408
11410 {
11412 }
11413
11415 {
11417 float split_quantity_new;
11419 if (dst.IsValid())
11420 {
11421 int slot_id = dst.GetSlot();
11423
11424 if (quantity > stack_max)
11425 split_quantity_new = stack_max;
11426 else
11427 split_quantity_new = quantity;
11428
11430 {
11432
11433 if (new_item)
11434 {
11435 new_item.SetResultOfSplit(true);
11436 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11438 new_item.
SetQuantity(split_quantity_new,
false,
true);
11439 }
11440
11441 return new_item;
11442 }
11443 }
11444
11445 return null;
11446 }
11447
11449 {
11451 float split_quantity_new;
11453 if (destination_entity)
11454 {
11456 if (quantity > stackable)
11457 split_quantity_new = stackable;
11458 else
11459 split_quantity_new = quantity;
11460
11462 {
11463 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11464 if (new_item)
11465 {
11466 new_item.SetResultOfSplit(true);
11467 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11469 new_item.
SetQuantity(split_quantity_new,
false,
true);
11470 }
11471 }
11472 }
11473 }
11474
11476 {
11478 {
11479 if (ScriptInputUserData.CanStoreInputUserData())
11480 {
11481 ScriptInputUserData ctx = new ScriptInputUserData;
11486 ItemBase destination_entity =
this;
11487 ctx.
Write(destination_entity);
11491 }
11492 }
11493 else if (!
g_Game.IsMultiplayer())
11494 {
11496 }
11497 }
11498
11500 {
11502 float split_quantity_new;
11504 if (player)
11505 {
11507 if (quantity > stackable)
11508 split_quantity_new = stackable;
11509 else
11510 split_quantity_new = quantity;
11511
11513 {
11514 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11515 new_item =
ItemBase.Cast(in_hands);
11516 if (new_item)
11517 {
11518 new_item.SetResultOfSplit(true);
11519 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11521 new_item.SetQuantity(split_quantity_new, false, true);
11522 }
11523 }
11524 }
11525 }
11526
11528 {
11530 float split_quantity_new = Math.Floor(quantity * 0.5);
11531
11533 return;
11534
11536
11537 if (new_item)
11538 {
11539 if (new_item.GetQuantityMax() < split_quantity_new)
11540 {
11541 split_quantity_new = new_item.GetQuantityMax();
11542 }
11543
11544 new_item.SetResultOfSplit(true);
11545 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11546
11548 {
11551 }
11552 else
11553 {
11555 new_item.
SetQuantity(split_quantity_new,
false,
true);
11556 }
11557 }
11558 }
11559
11561 {
11563 float split_quantity_new = Math.Floor(quantity / 2);
11564
11566 return;
11567
11568 InventoryLocation invloc = new InventoryLocation;
11570
11572 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11573
11574 if (new_item)
11575 {
11576 if (new_item.GetQuantityMax() < split_quantity_new)
11577 {
11578 split_quantity_new = new_item.GetQuantityMax();
11579 }
11581 {
11584 }
11585 else if (split_quantity_new > 1)
11586 {
11588 new_item.
SetQuantity(split_quantity_new,
false,
true);
11589 }
11590 }
11591 }
11592
11595 {
11596 SetWeightDirty();
11598
11599 if (parent)
11600 parent.OnAttachmentQuantityChangedEx(this, delta);
11601
11603 {
11605 {
11607 }
11609 {
11610 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11612 }
11613 }
11614 }
11615
11618 {
11619
11620 }
11621
11624 {
11626 }
11627
11629 {
11630 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11631
11633 {
11634 if (newLevel == GameConstants.STATE_RUINED)
11635 {
11637 EntityAI parent = GetHierarchyParent();
11638 if (parent && parent.IsFireplace())
11639 {
11640 CargoBase cargo = GetInventory().GetCargo();
11641 if (cargo)
11642 {
11644 {
11646 }
11647 }
11648 }
11649 }
11650
11652 {
11653
11655 return;
11656 }
11657
11658 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11659 {
11661 }
11662 }
11663 }
11664
11665
11667 {
11668 super.OnRightClick();
11669
11671 {
11673 {
11674 if (ScriptInputUserData.CanStoreInputUserData())
11675 {
11676 EntityAI root = GetHierarchyRoot();
11677 Man playerOwner = GetHierarchyRootPlayer();
11678 InventoryLocation dst = new InventoryLocation;
11679
11680
11681 if (!playerOwner && root && root == this)
11682 {
11684 }
11685 else
11686 {
11687
11688 GetInventory().GetCurrentInventoryLocation(dst);
11690 {
11691 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11693 {
11695 }
11696 else
11697 {
11699
11700
11701 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11702 {
11704 }
11705 else
11706 {
11707 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11708 }
11709 }
11710 }
11711 }
11712
11713 ScriptInputUserData ctx = new ScriptInputUserData;
11721 }
11722 }
11723 else if (!
g_Game.IsMultiplayer())
11724 {
11726 }
11727 }
11728 }
11729
11731 {
11732 if (root)
11733 {
11734 vector m4[4];
11735 root.GetTransform(m4);
11736 dst.SetGround(this, m4);
11737 }
11738 else
11739 {
11740 GetInventory().GetCurrentInventoryLocation(dst);
11741 }
11742 }
11743
11744 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11745 {
11746
11747 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11748 return false;
11749
11750 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11751 return false;
11752
11753
11755 return false;
11756
11757
11758 Magazine mag = Magazine.Cast(this);
11759 if (mag)
11760 {
11761 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11762 return false;
11763
11764 if (stack_max_limit)
11765 {
11766 Magazine other_mag = Magazine.Cast(other_item);
11767 if (other_item)
11768 {
11769 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11770 return false;
11771 }
11772
11773 }
11774 }
11775 else
11776 {
11777
11779 return false;
11780
11782 return false;
11783 }
11784
11785 PlayerBase player = null;
11786 if (CastTo(player, GetHierarchyRootPlayer()))
11787 {
11788 if (player.GetInventory().HasAttachment(this))
11789 return false;
11790
11791 if (player.IsItemsToDelete())
11792 return false;
11793 }
11794
11795 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11796 return false;
11797
11798 int slotID;
11800 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11801 return false;
11802
11803 return true;
11804 }
11805
11807 {
11809 }
11810
11812 {
11813 return m_IsResultOfSplit;
11814 }
11815
11817 {
11818 m_IsResultOfSplit = value;
11819 }
11820
11822 {
11824 }
11825
11827 {
11828 float other_item_quantity = other_item.GetQuantity();
11829 float this_free_space;
11830
11832
11834
11835 if (other_item_quantity > this_free_space)
11836 {
11837 return this_free_space;
11838 }
11839 else
11840 {
11841 return other_item_quantity;
11842 }
11843 }
11844
11846 {
11848 }
11849
11851 {
11853 return;
11854
11855 if (!IsMagazine() && other_item)
11856 {
11858 if (quantity_used != 0)
11859 {
11860 float hp1 = GetHealth01("","");
11861 float hp2 = other_item.GetHealth01("","");
11862 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11863 hpResult = hpResult / (
GetQuantity() + quantity_used);
11864
11865 hpResult *= GetMaxHealth();
11866 Math.Round(hpResult);
11867 SetHealth("", "Health", hpResult);
11868
11870 other_item.AddQuantity(-quantity_used);
11871 }
11872 }
11874 }
11875
11877 {
11878 #ifdef SERVER
11879 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11880 GetHierarchyParent().IncreaseLifetimeUp();
11881 #endif
11882 };
11883
11885 {
11886 PlayerBase p = PlayerBase.Cast(player);
11887
11888 array<int> recipesIds = p.m_Recipes;
11889 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11890 if (moduleRecipesManager)
11891 {
11892 EntityAI itemInHands = player.GetEntityInHands();
11893 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11894 }
11895
11896 for (int i = 0;i < recipesIds.Count(); i++)
11897 {
11898 int key = recipesIds.Get(i);
11899 string recipeName = moduleRecipesManager.GetRecipeName(key);
11901 }
11902 }
11903
11904
11905 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11906 {
11907 super.GetDebugActions(outputList);
11908
11909
11915
11916
11921
11926
11927
11931
11932
11934 {
11938 }
11939
11942
11943
11947
11949
11950 InventoryLocation loc = new InventoryLocation();
11951 GetInventory().GetCurrentInventoryLocation(loc);
11953 {
11954 if (Gizmo_IsSupported())
11957 }
11958
11960 }
11961
11962
11963
11964
11966 {
11967 super.OnAction(action_id, player, ctx);
11968
11970 {
11971 switch (action_id)
11972 {
11976 return true;
11980 return true;
11981 }
11982 }
11983
11985 {
11986 switch (action_id)
11987 {
11989 Delete();
11990 return true;
11991 }
11992 }
11993
11994 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11995 {
11996 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11997 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11998 PlayerBase p = PlayerBase.Cast(player);
11999 if (
EActions.RECIPES_RANGE_START < 1000)
12000 {
12001 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
12002 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
12003 }
12004 }
12005 #ifndef SERVER
12006 else if (action_id ==
EActions.WATCH_PLAYER)
12007 {
12008 PluginDeveloper.SetDeveloperItemClientEx(player);
12009 }
12010 #endif
12012 {
12013 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
12014 {
12015 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
12016 OnDebugButtonPressServer(id + 1);
12017 }
12018
12019 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
12020 {
12021 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
12023 }
12024
12025 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
12026 {
12027 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
12029 }
12030
12031 else if (action_id ==
EActions.ADD_QUANTITY)
12032 {
12033 if (IsMagazine())
12034 {
12035 Magazine mag = Magazine.Cast(this);
12036 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
12037 }
12038 else
12039 {
12041 }
12042
12043 if (m_EM)
12044 {
12045 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
12046 }
12047
12048 }
12049
12050 else if (action_id ==
EActions.REMOVE_QUANTITY)
12051 {
12052 if (IsMagazine())
12053 {
12054 Magazine mag2 = Magazine.Cast(this);
12055 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
12056 }
12057 else
12058 {
12060 }
12061 if (m_EM)
12062 {
12063 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12064 }
12065
12066 }
12067
12068 else if (action_id ==
EActions.SET_QUANTITY_0)
12069 {
12071
12072 if (m_EM)
12073 {
12074 m_EM.SetEnergy(0);
12075 }
12076 }
12077
12078 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12079 {
12081
12082 if (m_EM)
12083 {
12084 m_EM.SetEnergy(m_EM.GetEnergyMax());
12085 }
12086 }
12087
12088 else if (action_id ==
EActions.ADD_HEALTH)
12089 {
12090 AddHealth("","",GetMaxHealth("","Health")/5);
12091 }
12092 else if (action_id ==
EActions.REMOVE_HEALTH)
12093 {
12094 AddHealth("","",-GetMaxHealth("","Health")/5);
12095 }
12096 else if (action_id ==
EActions.DESTROY_HEALTH)
12097 {
12098 SetHealth01("","",0);
12099 }
12100 else if (action_id ==
EActions.WATCH_ITEM)
12101 {
12103 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12104 #ifdef DEVELOPER
12105 SetDebugDeveloper_item(this);
12106 #endif
12107 }
12108
12109 else if (action_id ==
EActions.ADD_TEMPERATURE)
12110 {
12111 AddTemperature(20);
12112
12113 }
12114
12115 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12116 {
12117 AddTemperature(-20);
12118
12119 }
12120
12121 else if (action_id ==
EActions.FLIP_FROZEN)
12122 {
12123 SetFrozen(!GetIsFrozen());
12124
12125 }
12126
12127 else if (action_id ==
EActions.ADD_WETNESS)
12128 {
12130
12131 }
12132
12133 else if (action_id ==
EActions.REMOVE_WETNESS)
12134 {
12136
12137 }
12138
12139 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12140 {
12143
12144
12145 }
12146
12147 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12148 {
12151 }
12152
12153 else if (action_id ==
EActions.MAKE_SPECIAL)
12154 {
12155 auto debugParams = DebugSpawnParams.WithPlayer(player);
12156 OnDebugSpawnEx(debugParams);
12157 }
12158
12159 }
12160
12161
12162 return false;
12163 }
12164
12165
12166
12167
12171
12174
12175
12176
12178 {
12179 return false;
12180 }
12181
12182
12184 {
12185 return true;
12186 }
12187
12188
12190 {
12191 return true;
12192 }
12193
12194
12195
12197 {
12198 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12199 return g_Game.ConfigIsExisting(config_path);
12200 }
12201
12204 {
12205 return null;
12206 }
12207
12209 {
12210 return false;
12211 }
12212
12214 {
12215 return false;
12216 }
12217
12221
12222
12224 {
12225 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12226 return module_repairing.CanRepair(this, item_repair_kit);
12227 }
12228
12229
12230 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12231 {
12232 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12233 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12234 }
12235
12236
12238 {
12239
12240
12241
12242
12243
12244
12245
12246
12247 return 1;
12248 }
12249
12250
12251
12253 {
12255 }
12256
12257
12258
12260 {
12262 }
12263
12264
12273 {
12274 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12275
12276 if (player)
12277 {
12278 player.MessageStatus(text);
12279 }
12280 }
12281
12282
12291 {
12292 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12293
12294 if (player)
12295 {
12296 player.MessageAction(text);
12297 }
12298 }
12299
12300
12309 {
12310 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12311
12312 if (player)
12313 {
12314 player.MessageFriendly(text);
12315 }
12316 }
12317
12318
12327 {
12328 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12329
12330 if (player)
12331 {
12332 player.MessageImportant(text);
12333 }
12334 }
12335
12337 {
12338 return true;
12339 }
12340
12341
12342 override bool KindOf(
string tag)
12343 {
12344 bool found = false;
12345 string item_name = this.
GetType();
12347 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12348
12349 int array_size = item_tag_array.Count();
12350 for (int i = 0; i < array_size; i++)
12351 {
12352 if (item_tag_array.Get(i) == tag)
12353 {
12354 found = true;
12355 break;
12356 }
12357 }
12358 return found;
12359 }
12360
12361
12363 {
12364
12365 super.OnRPC(sender, rpc_type,ctx);
12366
12367
12368 switch (rpc_type)
12369 {
12370 #ifndef SERVER
12371 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12372 Param2<bool, string> p = new Param2<bool, string>(false, "");
12373
12375 return;
12376
12377 bool play = p.param1;
12378 string soundSet = p.param2;
12379
12380 if (play)
12381 {
12383 {
12385 {
12387 }
12388 }
12389 else
12390 {
12392 }
12393 }
12394 else
12395 {
12397 }
12398
12399 break;
12400 #endif
12401
12402 }
12403
12405 {
12407 }
12408 }
12409
12410
12411
12412
12414 {
12415 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12416 return plugin.GetID(
name);
12417 }
12418
12420 {
12421 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12422 return plugin.GetName(id);
12423 }
12424
12427 {
12428
12429
12430 int varFlags;
12431 if (!ctx.
Read(varFlags))
12432 return;
12433
12434 if (varFlags & ItemVariableFlags.FLOAT)
12435 {
12437 }
12438 }
12439
12441 {
12442
12443 super.SerializeNumericalVars(floats_out);
12444
12445
12446
12448 {
12450 }
12451
12453 {
12455 }
12456
12458 {
12460 }
12461
12463 {
12468 }
12469
12471 {
12473 }
12474 }
12475
12477 {
12478
12479 super.DeSerializeNumericalVars(floats);
12480
12481
12482 int index = 0;
12483 int mask = Math.Round(floats.Get(index));
12484
12485 index++;
12486
12488 {
12490 {
12492 }
12493 else
12494 {
12495 float quantity = floats.Get(index);
12496 SetQuantity(quantity,
true,
false,
false,
false);
12497 }
12498 index++;
12499 }
12500
12502 {
12503 float wet = floats.Get(index);
12505 index++;
12506 }
12507
12509 {
12510 int liquidtype = Math.Round(floats.Get(index));
12512 index++;
12513 }
12514
12516 {
12518 index++;
12520 index++;
12522 index++;
12524 index++;
12525 }
12526
12528 {
12529 int cleanness = Math.Round(floats.Get(index));
12531 index++;
12532 }
12533 }
12534
12536 {
12537 super.WriteVarsToCTX(ctx);
12538
12539
12541 {
12543 }
12544
12546 {
12548 }
12549
12551 {
12553 }
12554
12556 {
12557 int r,g,b,a;
12563 }
12564
12566 {
12568 }
12569 }
12570
12572 {
12573 if (!super.ReadVarsFromCTX(ctx,version))
12574 return false;
12575
12576 int intValue;
12577 float value;
12578
12579 if (version < 140)
12580 {
12581 if (!ctx.
Read(intValue))
12582 return false;
12583
12584 m_VariablesMask = intValue;
12585 }
12586
12588 {
12589 if (!ctx.
Read(value))
12590 return false;
12591
12593 {
12595 }
12596 else
12597 {
12599 }
12600 }
12601
12602 if (version < 140)
12603 {
12605 {
12606 if (!ctx.
Read(value))
12607 return false;
12608 SetTemperatureDirect(value);
12609 }
12610 }
12611
12613 {
12614 if (!ctx.
Read(value))
12615 return false;
12617 }
12618
12620 {
12621 if (!ctx.
Read(intValue))
12622 return false;
12624 }
12625
12627 {
12628 int r,g,b,a;
12630 return false;
12632 return false;
12634 return false;
12636 return false;
12637
12639 }
12640
12642 {
12643 if (!ctx.
Read(intValue))
12644 return false;
12646 }
12647
12648 if (version >= 138 && version < 140)
12649 {
12651 {
12652 if (!ctx.
Read(intValue))
12653 return false;
12654 SetFrozen(intValue);
12655 }
12656 }
12657
12658 return true;
12659 }
12660
12661
12663 {
12666 {
12668 }
12669
12670 if (!super.OnStoreLoad(ctx, version))
12671 {
12673 return false;
12674 }
12675
12676 if (version >= 114)
12677 {
12678 bool hasQuickBarIndexSaved;
12679
12680 if (!ctx.
Read(hasQuickBarIndexSaved))
12681 {
12683 return false;
12684 }
12685
12686 if (hasQuickBarIndexSaved)
12687 {
12688 int itmQBIndex;
12689
12690
12691 if (!ctx.
Read(itmQBIndex))
12692 {
12694 return false;
12695 }
12696
12697 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12698 if (itmQBIndex != -1 && parentPlayer)
12699 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12700 }
12701 }
12702 else
12703 {
12704
12705 PlayerBase player;
12706 int itemQBIndex;
12707 if (version ==
int.
MAX)
12708 {
12709 if (!ctx.
Read(itemQBIndex))
12710 {
12712 return false;
12713 }
12714 }
12715 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12716 {
12717
12718 if (!ctx.
Read(itemQBIndex))
12719 {
12721 return false;
12722 }
12723 if (itemQBIndex != -1 && player)
12724 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12725 }
12726 }
12727
12728 if (version < 140)
12729 {
12730
12731 if (!LoadVariables(ctx, version))
12732 {
12734 return false;
12735 }
12736 }
12737
12738
12740 {
12742 return false;
12743 }
12744 if (version >= 132)
12745 {
12747 if (raib)
12748 {
12750 {
12752 return false;
12753 }
12754 }
12755 }
12756
12758 return true;
12759 }
12760
12761
12762
12764 {
12765 super.OnStoreSave(ctx);
12766
12767 PlayerBase player;
12768 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12769 {
12771
12772 int itemQBIndex = -1;
12773 itemQBIndex = player.FindQuickBarEntityIndex(this);
12774 ctx.
Write(itemQBIndex);
12775 }
12776 else
12777 {
12779 }
12780
12782
12784 if (raib)
12785 {
12787 }
12788 }
12789
12790
12792 {
12793 super.AfterStoreLoad();
12794
12796 {
12798 }
12799
12801 {
12804 }
12805 }
12806
12808 {
12809 super.EEOnAfterLoad();
12810
12812 {
12814 }
12815
12818 }
12819
12821 {
12822 return false;
12823 }
12824
12825
12826
12828 {
12830 {
12831 #ifdef PLATFORM_CONSOLE
12832
12834 {
12836 if (menu)
12837 {
12839 }
12840 }
12841 #endif
12842 }
12843
12845 {
12848 }
12849
12851 {
12852 SetWeightDirty();
12854 }
12856 {
12859 }
12860
12862 {
12865
12868 }
12870 {
12874 }
12875
12876 super.OnVariablesSynchronized();
12877 }
12878
12879
12880
12882 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12883 {
12884 if (!IsServerCheck(allow_client))
12885 return false;
12886
12888 return false;
12889
12892
12893 if (value <= (min + 0.001))
12894 value = min;
12895
12896 if (value == min)
12897 {
12898 if (destroy_config)
12899 {
12900 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12901 if (dstr)
12902 {
12904 this.Delete();
12905 return true;
12906 }
12907 }
12908 else if (destroy_forced)
12909 {
12911 this.Delete();
12912 return true;
12913 }
12914
12916 }
12917
12920
12922 {
12923 EntityAI parent = GetHierarchyRoot();
12924 InventoryLocation iLoc = new InventoryLocation();
12925 GetInventory().GetCurrentInventoryLocation(iLoc);
12927 {
12928 int iLocSlot = iLoc.
GetSlot();
12930 {
12932 }
12934 {
12936 }
12937 }
12938 }
12939
12941 {
12943
12944 if (delta)
12946 }
12947
12949
12950 return false;
12951 }
12952
12953
12955 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12956 {
12958 }
12959
12961 {
12964 }
12965
12967 {
12970 }
12971
12973 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12974 {
12975 float value_clamped = Math.Clamp(value, 0, 1);
12977 SetQuantity(result, destroy_config, destroy_forced);
12978 }
12979
12980
12983 {
12985 }
12986
12988 {
12990 }
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13002 {
13003 int slot = -1;
13004 GameInventory inventory = GetInventory();
13005 if (inventory)
13006 {
13007 InventoryLocation il = new InventoryLocation;
13010 }
13011
13013 }
13014
13016 {
13017 float quantity_max = 0;
13018
13020 {
13021 if (attSlotID != -1)
13022 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
13023
13024 if (quantity_max <= 0)
13026 }
13027
13028 if (quantity_max <= 0)
13030
13031 return quantity_max;
13032 }
13033
13035 {
13037 }
13038
13040 {
13042 }
13043
13044
13046 {
13048 }
13049
13051 {
13053 }
13054
13056 {
13058 }
13059
13060
13062 {
13063
13064 float weightEx = GetWeightEx();
13065 float special = GetInventoryAndCargoWeight();
13066 return weightEx - special;
13067 }
13068
13069
13071 {
13073 }
13074
13076 {
13078 {
13079 #ifdef DEVELOPER
13080 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13081 {
13082 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13084 }
13085 #endif
13086
13087 return GetQuantity() * GetConfigWeightModified();
13088 }
13089 else if (HasEnergyManager())
13090 {
13091 #ifdef DEVELOPER
13092 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13093 {
13094 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13095 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13096 }
13097 #endif
13098 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13099 }
13100 else
13101 {
13102 #ifdef DEVELOPER
13103 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13104 {
13105 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13106 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13107 }
13108 #endif
13109 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13110 }
13111 }
13112
13115 {
13116 int item_count = 0;
13118
13119 GameInventory inventory = GetInventory();
13120 CargoBase cargo = inventory.
GetCargo();
13121 if (cargo != NULL)
13122 {
13124 }
13125
13127 for (int i = 0; i < nAttachments; ++i)
13128 {
13130 if (item)
13131 item_count += item.GetNumberOfItems();
13132 }
13133 return item_count;
13134 }
13135
13138 {
13139 float weight = 0;
13140 float wetness = 1;
13141 if (include_wetness)
13144 {
13145 weight = wetness * m_ConfigWeight;
13146 }
13148 {
13149 weight = 1;
13150 }
13151 return weight;
13152 }
13153
13154
13155
13157 {
13158 GameInventory inventory = GetInventory();
13159 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13160 {
13161 array<EntityAI> items = new array<EntityAI>;
13163 for (int i = 0; i < items.Count(); ++i)
13164 {
13166 if (item)
13167 {
13168 g_Game.ObjectDelete(item);
13169 }
13170 }
13171 }
13172 }
13173
13174
13175
13176
13178 {
13179 float energy = 0;
13180 if (HasEnergyManager())
13181 {
13182 energy = GetCompEM().GetEnergy();
13183 }
13184 return energy;
13185 }
13186
13187
13189 {
13190 super.OnEnergyConsumed();
13191
13193 }
13194
13196 {
13197 super.OnEnergyAdded();
13198
13200 }
13201
13202
13204 {
13205 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13206 {
13208 {
13209 float energy_0to1 = GetCompEM().GetEnergy0To1();
13211 }
13212 }
13213 }
13214
13215
13217 {
13218 return ConfigGetFloat("heatIsolation");
13219 }
13220
13222 {
13224 }
13225
13227 {
13228 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13229 if (
g_Game.ConfigIsExisting(paramPath))
13230 return g_Game.ConfigGetFloat(paramPath);
13231
13232 return 0.0;
13233 }
13234
13236 {
13237 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13238 if (
g_Game.ConfigIsExisting(paramPath))
13239 return g_Game.ConfigGetFloat(paramPath);
13240
13241 return 0.0;
13242 }
13243
13244 override void SetWet(
float value,
bool allow_client =
false)
13245 {
13246 if (!IsServerCheck(allow_client))
13247 return;
13248
13251
13253
13254 m_VarWet = Math.Clamp(value, min, max);
13255
13257 {
13260 }
13261 }
13262
13263 override void AddWet(
float value)
13264 {
13266 }
13267
13269 {
13271 }
13272
13274 {
13276 }
13277
13279 {
13281 }
13282
13284 {
13286 }
13287
13289 {
13291 }
13292
13293 override void OnWetChanged(
float newVal,
float oldVal)
13294 {
13297 if (newLevel != oldLevel)
13298 {
13300 }
13301 }
13302
13304 {
13305 SetWeightDirty();
13306 }
13307
13309 {
13310 return GetWetLevelInternal(
m_VarWet);
13311 }
13312
13313
13314
13316 {
13318 }
13319
13321 {
13323 }
13324
13326 {
13328 }
13329
13331 {
13333 }
13334
13335
13336
13338 {
13339 if (ConfigIsExisting("itemModelLength"))
13340 {
13341 return ConfigGetFloat("itemModelLength");
13342 }
13343 return 0;
13344 }
13345
13347 {
13348 if (ConfigIsExisting("itemAttachOffset"))
13349 {
13350 return ConfigGetFloat("itemAttachOffset");
13351 }
13352 return 0;
13353 }
13354
13355 override void SetCleanness(
int value,
bool allow_client =
false)
13356 {
13357 if (!IsServerCheck(allow_client))
13358 return;
13359
13361
13363
13366 }
13367
13369 {
13371 }
13372
13374 {
13375 return true;
13376 }
13377
13378
13379
13380
13382 {
13384 }
13385
13387 {
13389 }
13390
13391
13392
13393
13394 override void SetColor(
int r,
int g,
int b,
int a)
13395 {
13401 }
13403 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13404 {
13409 }
13410
13412 {
13414 }
13415
13418 {
13419 int r,g,b,a;
13421 r = r/255;
13422 g = g/255;
13423 b = b/255;
13424 a = a/255;
13425 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13426 }
13427
13428
13429
13430 override void SetLiquidType(
int value,
bool allow_client =
false)
13431 {
13432 if (!IsServerCheck(allow_client))
13433 return;
13434
13439 }
13440
13442 {
13443 return ConfigGetInt("varLiquidTypeInit");
13444 }
13445
13447 {
13449 }
13450
13452 {
13454 SetFrozen(false);
13455 }
13456
13459 {
13460 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13461 }
13462
13463
13466 {
13467 PlayerBase nplayer;
13468 if (PlayerBase.CastTo(nplayer, player))
13469 {
13471 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13472 }
13473 }
13474
13475
13478 {
13479 PlayerBase nplayer;
13480 if (PlayerBase.CastTo(nplayer,player))
13481 {
13482 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13483 }
13484
13485 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13486
13487 if (HasEnergyManager())
13488 {
13489 GetCompEM().UpdatePlugState();
13490 }
13491 }
13492
13493
13495 {
13496 super.OnPlacementStarted(player);
13497
13499 }
13500
13501 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13502 {
13504 {
13505 m_AdminLog.OnPlacementComplete(player,
this);
13506 }
13507
13508 super.OnPlacementComplete(player, position, orientation);
13509 }
13510
13511
13512
13513
13514
13516 {
13518 {
13519 return true;
13520 }
13521 else
13522 {
13523 return false;
13524 }
13525 }
13526
13527
13529 {
13531 {
13533 }
13534 }
13535
13536
13538 {
13540 }
13541
13543 {
13545 }
13546
13547 override void InsertAgent(
int agent,
float count = 1)
13548 {
13549 if (count < 1)
13550 return;
13551
13553 }
13554
13557 {
13559 }
13560
13561
13563 {
13565 }
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
13609 {
13611 return false;
13612 return true;
13613 }
13614
13616 {
13617
13619 }
13620
13621
13624 {
13625 super.CheckForRoofLimited(timeTresholdMS);
13626
13627 float time =
g_Game.GetTime();
13628 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13629 {
13630 m_PreviousRoofTestTime = time;
13631 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13632 }
13633 }
13634
13635
13637 {
13639 {
13640 return 0;
13641 }
13642
13643 if (GetInventory().GetAttachmentSlotsCount() != 0)
13644 {
13645 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13646 if (filter)
13647 return filter.GetProtectionLevel(type, false, system);
13648 else
13649 return 0;
13650 }
13651
13652 string subclassPath, entryName;
13653
13654 switch (type)
13655 {
13657 entryName = "biological";
13658 break;
13660 entryName = "chemical";
13661 break;
13662 default:
13663 entryName = "biological";
13664 break;
13665 }
13666
13667 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13668
13669 return g_Game.ConfigGetFloat(subclassPath + entryName);
13670 }
13671
13672
13673
13676 {
13677 if (!IsMagazine())
13679
13681 }
13682
13683
13684
13685
13686
13691 {
13692 return true;
13693 }
13694
13696 {
13698 }
13699
13700
13701
13702
13703
13705 {
13706 if (parent)
13707 {
13708 if (parent.IsInherited(DayZInfected))
13709 return true;
13710
13711 if (!parent.IsRuined())
13712 return true;
13713 }
13714
13715 return true;
13716 }
13717
13719 {
13720 if (!super.CanPutAsAttachment(parent))
13721 {
13722 return false;
13723 }
13724
13725 if (!IsRuined() && !parent.IsRuined())
13726 {
13727 return true;
13728 }
13729
13730 return false;
13731 }
13732
13734 {
13735
13736
13737
13738
13739 return super.CanReceiveItemIntoCargo(item);
13740 }
13741
13743 {
13744
13745
13746
13747
13748 GameInventory attachmentInv = attachment.GetInventory();
13750 {
13751 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13752 return false;
13753 }
13754
13755 InventoryLocation loc = new InventoryLocation();
13756 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13757 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13758 return false;
13759
13760 return super.CanReceiveAttachment(attachment, slotId);
13761 }
13762
13764 {
13765 if (!super.CanReleaseAttachment(attachment))
13766 return false;
13767
13768 return GetInventory().AreChildrenAccessible();
13769 }
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13792 {
13793 int id = muzzle_owner.GetMuzzleID();
13794 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13795
13796 if (WPOF_array)
13797 {
13798 for (int i = 0; i < WPOF_array.Count(); i++)
13799 {
13800 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13801
13802 if (WPOF)
13803 {
13804 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13805 }
13806 }
13807 }
13808 }
13809
13810
13812 {
13813 int id = muzzle_owner.GetMuzzleID();
13815
13816 if (WPOBE_array)
13817 {
13818 for (int i = 0; i < WPOBE_array.Count(); i++)
13819 {
13820 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13821
13822 if (WPOBE)
13823 {
13824 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13825 }
13826 }
13827 }
13828 }
13829
13830
13832 {
13833 int id = muzzle_owner.GetMuzzleID();
13834 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13835
13836 if (WPOOH_array)
13837 {
13838 for (int i = 0; i < WPOOH_array.Count(); i++)
13839 {
13840 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13841
13842 if (WPOOH)
13843 {
13844 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13845 }
13846 }
13847 }
13848 }
13849
13850
13852 {
13853 int id = muzzle_owner.GetMuzzleID();
13854 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13855
13856 if (WPOOH_array)
13857 {
13858 for (int i = 0; i < WPOOH_array.Count(); i++)
13859 {
13860 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13861
13862 if (WPOOH)
13863 {
13864 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13865 }
13866 }
13867 }
13868 }
13869
13870
13872 {
13873 int id = muzzle_owner.GetMuzzleID();
13874 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13875
13876 if (WPOOH_array)
13877 {
13878 for (int i = 0; i < WPOOH_array.Count(); i++)
13879 {
13880 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13881
13882 if (WPOOH)
13883 {
13884 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13885 }
13886 }
13887 }
13888 }
13889
13890
13891
13893 {
13895 {
13896 return true;
13897 }
13898
13899 return false;
13900 }
13901
13903 {
13905 {
13906 return true;
13907 }
13908
13909 return false;
13910 }
13911
13913 {
13915 {
13916 return true;
13917 }
13918
13919 return false;
13920 }
13921
13923 {
13924 return false;
13925 }
13926
13929 {
13930 return UATimeSpent.DEFAULT_DEPLOY;
13931 }
13932
13933
13934
13935
13937 {
13939 SetSynchDirty();
13940 }
13941
13943 {
13945 }
13946
13947
13949 {
13950 return false;
13951 }
13952
13955 {
13956 string att_type = "None";
13957
13958 if (ConfigIsExisting("soundAttType"))
13959 {
13960 att_type = ConfigGetString("soundAttType");
13961 }
13962
13964 }
13965
13967 {
13969 }
13970
13971
13972
13973
13974
13980
13982 {
13985
13987 }
13988
13989
13991 {
13993 return;
13994
13996
13999
14002
14003 SoundParameters params = new SoundParameters();
14007 }
14008
14009
14011 {
14013 {
14016
14017 SetSynchDirty();
14018
14021 }
14022 }
14023
14025 {
14027 }
14028
14029
14031 {
14033 return;
14034
14036 SetSynchDirty();
14037
14040 }
14041
14043 {
14046 }
14047
14049 {
14051 }
14052
14053 void OnApply(PlayerBase player);
14054
14056 {
14057 return 1.0;
14058 };
14059
14061 {
14063 }
14064
14066 {
14068 }
14069
14071
14073 {
14074 SetDynamicPhysicsLifeTime(0.01);
14076 }
14077
14079 {
14080 array<string> zone_names = new array<string>;
14081 GetDamageZones(zone_names);
14082 for (int i = 0; i < zone_names.Count(); i++)
14083 {
14084 SetHealthMax(zone_names.Get(i),"Health");
14085 }
14086 SetHealthMax("","Health");
14087 }
14088
14091 {
14092 float global_health = GetHealth01("","Health");
14093 array<string> zones = new array<string>;
14094 GetDamageZones(zones);
14095
14096 for (int i = 0; i < zones.Count(); i++)
14097 {
14098 SetHealth01(zones.Get(i),"Health",global_health);
14099 }
14100 }
14101
14104 {
14105 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14106 }
14107
14109 {
14110 if (!hasRootAsPlayer)
14111 {
14112 if (refParentIB)
14113 {
14114
14115 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14116 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14117
14118 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14119 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14120
14123 }
14124 else
14125 {
14126
14129 }
14130 }
14131 }
14132
14134 {
14136 {
14137 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14138 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14139 {
14140 float heatPermCoef = 1.0;
14142 while (ent)
14143 {
14144 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14145 ent = ent.GetHierarchyParent();
14146 }
14147
14148 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14149 }
14150 }
14151 }
14152
14154 {
14155
14156 EntityAI parent = GetHierarchyParent();
14157 if (!parent)
14158 {
14159 hasParent = false;
14160 hasRootAsPlayer = false;
14161 }
14162 else
14163 {
14164 hasParent = true;
14165 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14166 refParentIB =
ItemBase.Cast(parent);
14167 }
14168 }
14169
14170 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14171 {
14172
14173 }
14174
14176 {
14177
14178 return false;
14179 }
14180
14182 {
14183
14184
14185 return false;
14186 }
14187
14189 {
14190
14191 return false;
14192 }
14193
14196 {
14197 return !GetIsFrozen() &&
IsOpen();
14198 }
14199
14201 {
14202 bool hasParent = false, hasRootAsPlayer = false;
14204
14205 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14206 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14207
14208 if (wwtu || foodDecay)
14209 {
14213
14214 if (processWetness || processTemperature || processDecay)
14215 {
14217
14218 if (processWetness)
14219 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14220
14221 if (processTemperature)
14223
14224 if (processDecay)
14225 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14226 }
14227 }
14228 }
14229
14232 {
14234 }
14235
14237 {
14240
14241 return super.GetTemperatureFreezeThreshold();
14242 }
14243
14245 {
14248
14249 return super.GetTemperatureThawThreshold();
14250 }
14251
14253 {
14256
14257 return super.GetItemOverheatThreshold();
14258 }
14259
14261 {
14263 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14264
14265 return super.GetTemperatureFreezeTime();
14266 }
14267
14269 {
14271 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14272
14273 return super.GetTemperatureThawTime();
14274 }
14275
14280
14282 {
14283 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14284 }
14285
14287 {
14288 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14289 }
14290
14293 {
14295 }
14296
14298 {
14300 }
14301
14303 {
14305 }
14306
14309 {
14310 return null;
14311 }
14312
14315 {
14316 return false;
14317 }
14318
14320 {
14322 {
14325 if (!trg)
14326 {
14328 explosive = this;
14329 }
14330
14331 explosive.PairRemote(trg);
14333
14334 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14335 trg.SetPersistentPairID(persistentID);
14336 explosive.SetPersistentPairID(persistentID);
14337
14338 return true;
14339 }
14340 return false;
14341 }
14342
14345 {
14346 float ret = 1.0;
14349 ret *= GetHealth01();
14350
14351 return ret;
14352 }
14353
14354 #ifdef DEVELOPER
14355 override void SetDebugItem()
14356 {
14357 super.SetDebugItem();
14358 _itemBase = this;
14359 }
14360
14362 {
14363 string text = super.GetDebugText();
14364
14366 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14367
14368 return text;
14369 }
14370 #endif
14371
14373 {
14374 return true;
14375 }
14376
14378
14380
14382 {
14385 }
14386
14387
14395
14411
14412 [
Obsolete(
"Use ItemSoundHandler instead")]
14415 {
14416 if (!
g_Game.IsDedicatedServer())
14417 {
14418 if (ConfigIsExisting("attachSoundSet"))
14419 {
14420 string cfg_path = "";
14421 string soundset = "";
14422 string type_name =
GetType();
14423
14426 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14427 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14428
14429 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14430 {
14431 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14432 {
14433 if (cfg_slot_array[i] == slot_type)
14434 {
14435 soundset = cfg_soundset_array[i];
14436 break;
14437 }
14438 }
14439 }
14440
14441 if (soundset != "")
14442 {
14443 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14445 }
14446 }
14447 }
14448 }
14449
14451}
14452
14454{
14456 if (entity)
14457 {
14458 bool is_item = entity.IsInherited(
ItemBase);
14459 if (is_item && full_quantity)
14460 {
14463 }
14464 }
14465 else
14466 {
14468 return NULL;
14469 }
14470 return entity;
14471}
14472
14474{
14475 if (item)
14476 {
14477 if (health > 0)
14478 item.SetHealth("", "", health);
14479
14480 if (item.CanHaveTemperature())
14481 {
14483 if (item.CanFreeze())
14484 item.SetFrozen(false);
14485 }
14486
14487 if (item.HasEnergyManager())
14488 {
14489 if (quantity >= 0)
14490 {
14491 item.GetCompEM().SetEnergy0To1(quantity);
14492 }
14493 else
14494 {
14496 }
14497 }
14498 else if (item.IsMagazine())
14499 {
14500 Magazine mag = Magazine.Cast(item);
14501 if (quantity >= 0)
14502 {
14503 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14504 }
14505 else
14506 {
14508 }
14509
14510 }
14511 else
14512 {
14513 if (quantity >= 0)
14514 {
14515 item.SetQuantityNormalized(quantity, false);
14516 }
14517 else
14518 {
14520 }
14521
14522 }
14523 }
14524}
14525
14526#ifdef DEVELOPER
14528#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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 IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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)
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()
override int GetLiquidType()
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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.