9672{
9674 {
9675 return true;
9676 }
9677};
9678
9680{
9681
9682};
9683
9684
9685
9687{
9691
9693
9696
9697
9698
9699
9700
9709
9715
9720
9725
9746 protected bool m_IsResultOfSplit
9747
9749
9754
9755
9756
9758
9762
9763
9764
9766
9769
9770
9771
9777
9778
9786
9789
9790
9792
9793
9795
9796
9801
9802
9807
9809
9810
9812
9813
9815 {
9820
9821 if (!
g_Game.IsDedicatedServer())
9822 {
9824 {
9826
9828 {
9830 }
9831 }
9832
9835 }
9836
9837 m_OldLocation = null;
9838
9840 {
9842 }
9843
9844 if (ConfigIsExisting("headSelectionsToHide"))
9845 {
9848 }
9849
9851 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9852 {
9854 }
9855
9857
9858 m_IsResultOfSplit = false;
9859
9861 }
9862
9864 {
9865 super.InitItemVariables();
9866
9872 m_Count = ConfigGetInt(
"count");
9873
9876
9881
9884
9889
9901
9905
9906
9909 if (ConfigIsExisting("canBeSplit"))
9910 {
9913 }
9914
9916 if (ConfigIsExisting("itemBehaviour"))
9918
9919
9922 RegisterNetSyncVariableInt("m_VarLiquidType");
9923 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9924
9925 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9926 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9927 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9928
9929 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9930 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9931 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9932 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9933
9934 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9935 RegisterNetSyncVariableBool("m_IsTakeable");
9936 RegisterNetSyncVariableBool("m_IsHologram");
9937
9940 {
9943 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9944 }
9945
9947
9949 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9951
9953 }
9954
9956 {
9958 }
9959
9961 {
9964 {
9969 }
9970 }
9971
9972 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9973 {
9975 {
9978 }
9979
9981 }
9982
9984 {
9990 }
9991
9993
9995 {
9997
9998 if (!action)
9999 {
10000 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
10001 return;
10002 }
10003
10005 if (!ai)
10006 {
10008 return;
10009 }
10010
10012 if (!action_array)
10013 {
10014 action_array = new array<ActionBase_Basic>;
10016 }
10017 if (LogManager.IsActionLogEnable())
10018 {
10019 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
10020 }
10021
10022 if (action_array.Find(action) != -1)
10023 {
10024 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
10025 }
10026 else
10027 {
10028 action_array.Insert(action);
10029 }
10030 }
10031
10033 {
10034 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10035 ActionBase action = player.GetActionManager().GetAction(actionName);
10038
10039 if (action_array)
10040 {
10041 action_array.RemoveItem(action);
10042 }
10043 }
10044
10045
10046
10048 {
10049 ActionOverrideData overrideData = new ActionOverrideData();
10053
10055 if (!actionMap)
10056 {
10059 }
10060
10061 actionMap.Insert(this.
Type(), overrideData);
10062
10063 }
10064
10066
10068
10069
10071 {
10074
10077
10078 string config_to_search = "CfgVehicles";
10079 string muzzle_owner_config;
10080
10082 {
10083 if (IsInherited(Weapon))
10084 config_to_search = "CfgWeapons";
10085
10086 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10087
10088 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
10089
10090 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
10091
10092 if (config_OnFire_subclass_count > 0)
10093 {
10094 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
10095
10096 for (int i = 0; i < config_OnFire_subclass_count; i++)
10097 {
10098 string particle_class = "";
10099 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
10100 string config_OnFire_entry = config_OnFire_class + particle_class;
10101 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
10102 WPOF_array.Insert(WPOF);
10103 }
10104
10105
10107 }
10108 }
10109
10111 {
10112 config_to_search = "CfgWeapons";
10113 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10114
10115 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
10116
10117 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
10118
10119 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
10120 {
10121 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
10122
10123 for (i = 0; i < config_OnBulletCasingEject_count; i++)
10124 {
10125 string particle_class2 = "";
10126 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
10127 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
10128 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
10129 WPOBE_array.Insert(WPOBE);
10130 }
10131
10132
10134 }
10135 }
10136 }
10137
10138
10140 {
10143
10145 {
10146 string config_to_search = "CfgVehicles";
10147
10148 if (IsInherited(Weapon))
10149 config_to_search = "CfgWeapons";
10150
10151 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10152 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10153
10154 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
10155 {
10156
10158
10160 {
10162 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10164 return;
10165 }
10166
10169
10170
10171
10172 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
10173 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10174
10175 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10176 {
10177 string particle_class = "";
10178 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
10179 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10180 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
10181
10182 if (entry_type == CT_CLASS)
10183 {
10184 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10185 WPOOH_array.Insert(WPOF);
10186 }
10187 }
10188
10189
10191 }
10192 }
10193 }
10194
10196 {
10198 }
10199
10201 {
10203 {
10205
10208
10211
10212 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10213 }
10214 }
10215
10217 {
10219 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10220
10222 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10223
10225 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10226
10228 {
10230 }
10231 }
10232
10234 {
10236 }
10237
10239 {
10242 else
10244
10246 {
10249 }
10250 else
10251 {
10254
10257 }
10258
10260 }
10261
10263 {
10265 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10266 }
10267
10269 {
10271 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10273 }
10274
10276 {
10278 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10279 }
10280
10282 {
10285
10286 OverheatingParticle OP = new OverheatingParticle();
10291
10293 }
10294
10296 {
10299
10300 return -1;
10301 }
10302
10304 {
10306 {
10309
10310 for (int i = count; i > 0; --i)
10311 {
10312 int id = i - 1;
10315
10318
10319 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10320 {
10321 if (p)
10322 {
10325 }
10326 }
10327 }
10328 }
10329 }
10330
10332 {
10334 {
10336 {
10337 int id = i - 1;
10339
10340 if (OP)
10341 {
10343
10344 if (p)
10345 {
10347 }
10348
10349 delete OP;
10350 }
10351 }
10352
10355 }
10356 }
10357
10360 {
10361 return 0.0;
10362 }
10363
10364
10366 {
10367 return 250;
10368 }
10369
10371 {
10372 return 0;
10373 }
10374
10377 {
10379 return true;
10380
10381 return false;
10382 }
10383
10386 {
10389
10391 {
10393 }
10394 else
10395 {
10396
10398 }
10399
10401 }
10402
10409 {
10410 return -1;
10411 }
10412
10413
10414
10415
10417 {
10419 {
10420 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10421 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10422
10423 if (r_index >= 0)
10424 {
10425 InventoryLocation r_il = new InventoryLocation;
10426 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10427
10428 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10431 {
10432 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10433 }
10435 {
10436 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10437 }
10438
10439 }
10440
10441 player.GetHumanInventory().ClearUserReservedLocation(this);
10442 }
10443
10446 }
10447
10448
10449
10450
10452 {
10453 return ItemBase.m_DebugActionsMask;
10454 }
10455
10457 {
10458 return ItemBase.m_DebugActionsMask & mask;
10459 }
10460
10462 {
10463 ItemBase.m_DebugActionsMask = mask;
10464 }
10465
10467 {
10468 ItemBase.m_DebugActionsMask |= mask;
10469 }
10470
10472 {
10473 ItemBase.m_DebugActionsMask &= ~mask;
10474 }
10475
10477 {
10479 {
10481 }
10482 else
10483 {
10485 }
10486 }
10487
10488
10490 {
10491 if (GetEconomyProfile())
10492 {
10493 float q_max = GetEconomyProfile().GetQuantityMax();
10494 if (q_max > 0)
10495 {
10496 float q_min = GetEconomyProfile().GetQuantityMin();
10497 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10498
10500 {
10501 ComponentEnergyManager comp = GetCompEM();
10503 {
10505 }
10506 }
10508 {
10510
10511 }
10512
10513 }
10514 }
10515 }
10516
10519 {
10520 EntityAI parent = GetHierarchyParent();
10521
10522 if (parent)
10523 {
10524 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10525 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10526 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10527 }
10528 }
10529
10532 {
10533 EntityAI parent = GetHierarchyParent();
10534
10535 if (parent)
10536 {
10537 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10538 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10539 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10540 }
10541 }
10542
10544 {
10545
10546
10547
10548
10550
10552 {
10553 if (ScriptInputUserData.CanStoreInputUserData())
10554 {
10555 ScriptInputUserData ctx = new ScriptInputUserData;
10561 ctx.
Write(use_stack_max);
10564
10566 {
10567 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10568 }
10569 }
10570 }
10571 else if (!
g_Game.IsMultiplayer())
10572 {
10574 }
10575 }
10576
10578 {
10580 }
10581
10583 {
10585 }
10586
10588 {
10590 }
10591
10593 {
10594
10595 return false;
10596 }
10597
10599 {
10600 return false;
10601 }
10602
10606 {
10607 return false;
10608 }
10609
10611 {
10612 return "";
10613 }
10614
10616
10618 {
10619 return false;
10620 }
10621
10623 {
10624 return true;
10625 }
10626
10627
10628
10630 {
10631 return true;
10632 }
10633
10635 {
10636 return true;
10637 }
10638
10640 {
10641 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10643 }
10644
10646 {
10648 }
10649
10651 {
10653 if (!is_being_placed)
10655 SetSynchDirty();
10656 }
10657
10658
10660
10662 {
10664 }
10665
10667 {
10669 }
10670
10672 {
10673 return 1;
10674 }
10675
10677 {
10678 return false;
10679 }
10680
10682 {
10684 SetSynchDirty();
10685 }
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10722 {
10723 super.OnMovedInsideCargo(container);
10724
10725 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10726 }
10727
10728 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10729 {
10730 super.EEItemLocationChanged(oldLoc, newLoc);
10731
10732 PlayerBase newPlayer = null;
10733 PlayerBase oldPlayer = null;
10734
10735 if (newLoc.GetParent())
10736 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10737
10738 if (oldLoc.GetParent())
10739 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10740
10742 {
10743 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10744
10745 if (rIndex >= 0)
10746 {
10747 InventoryLocation rIl = new InventoryLocation;
10748 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10749
10750 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10753 {
10754 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10755 }
10757 {
10759 }
10760
10761 }
10762 }
10763
10765 {
10766 if (newPlayer)
10767 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10768
10769 if (newPlayer == oldPlayer)
10770 {
10771 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10772 {
10774 {
10775 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10776 {
10777 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10778 }
10779 }
10780 else
10781 {
10782 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10783 }
10784 }
10785
10786 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10787 {
10788 int type = oldLoc.GetType();
10790 {
10791 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10792 }
10794 {
10795 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10796 }
10797 }
10798 if (!m_OldLocation)
10799 {
10800 m_OldLocation = new InventoryLocation;
10801 }
10802 m_OldLocation.Copy(oldLoc);
10803 }
10804 else
10805 {
10806 if (m_OldLocation)
10807 {
10808 m_OldLocation.Reset();
10809 }
10810 }
10811
10812 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10813 }
10814 else
10815 {
10816 if (newPlayer)
10817 {
10818 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10819 if (resIndex >= 0)
10820 {
10821 InventoryLocation il = new InventoryLocation;
10822 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10824 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10827 {
10828 il.
GetParent().GetOnReleaseLock().Invoke(it);
10829 }
10831 {
10833 }
10834
10835 }
10836 }
10838 {
10839
10841 }
10842
10843 if (m_OldLocation)
10844 {
10845 m_OldLocation.Reset();
10846 }
10847 }
10848
10850 {
10851 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10852 }
10853
10855 {
10856 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10857 }
10858 }
10859
10860 override void EOnContact(IEntity other, Contact extra)
10861 {
10863 {
10864 int liquidType = -1;
10866 if (impactSpeed > 0.0)
10867 {
10869 #ifndef SERVER
10871 #else
10873 SetSynchDirty();
10874 #endif
10876 }
10877 }
10878
10879 #ifdef SERVER
10880 if (GetCompEM() && GetCompEM().IsPlugged())
10881 {
10882 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10883 GetCompEM().UnplugThis();
10884 }
10885 #endif
10886 }
10887
10889
10891 {
10893 }
10894
10896 {
10897
10898 }
10899
10901 {
10902 super.OnItemLocationChanged(old_owner, new_owner);
10903
10904 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10905 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10906
10907 if (!relatedPlayer && playerNew)
10908 relatedPlayer = playerNew;
10909
10910 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10911 {
10913 if (actionMgr)
10914 {
10915 ActionBase currentAction = actionMgr.GetRunningAction();
10916 if (currentAction)
10918 }
10919 }
10920
10921 Man ownerPlayerOld = null;
10922 Man ownerPlayerNew = null;
10923
10924 if (old_owner)
10925 {
10926 if (old_owner.
IsMan())
10927 {
10928 ownerPlayerOld = Man.Cast(old_owner);
10929 }
10930 else
10931 {
10932 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10933 }
10934 }
10935 else
10936 {
10938 {
10940
10941 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10942 {
10943 GetCompEM().UnplugThis();
10944 }
10945 }
10946 }
10947
10948 if (new_owner)
10949 {
10950 if (new_owner.
IsMan())
10951 {
10952 ownerPlayerNew = Man.Cast(new_owner);
10953 }
10954 else
10955 {
10956 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10957 }
10958 }
10959
10960 if (ownerPlayerOld != ownerPlayerNew)
10961 {
10962 if (ownerPlayerOld)
10963 {
10964 array<EntityAI> subItemsExit = new array<EntityAI>;
10966 for (int i = 0; i < subItemsExit.Count(); i++)
10967 {
10970 }
10971 }
10972
10973 if (ownerPlayerNew)
10974 {
10975 array<EntityAI> subItemsEnter = new array<EntityAI>;
10977 for (int j = 0; j < subItemsEnter.Count(); j++)
10978 {
10981 }
10982 }
10983 }
10984 else if (ownerPlayerNew != null)
10985 {
10986 PlayerBase nplayer;
10987 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10988 {
10989 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10991 for (int k = 0; k < subItemsUpdate.Count(); k++)
10992 {
10994 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10995 }
10996 }
10997 }
10998
10999 if (old_owner)
11000 old_owner.OnChildItemRemoved(this);
11001 if (new_owner)
11002 new_owner.OnChildItemReceived(this);
11003 }
11004
11005
11007 {
11008 super.EEDelete(parent);
11009 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
11010 if (player)
11011 {
11013
11014 if (player.IsAlive())
11015 {
11016 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
11017 if (r_index >= 0)
11018 {
11019 InventoryLocation r_il = new InventoryLocation;
11020 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
11021
11022 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
11025 {
11026 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
11027 }
11029 {
11030 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
11031 }
11032
11033 }
11034
11035 player.RemoveQuickBarEntityShortcut(this);
11036 }
11037 }
11038 }
11039
11041 {
11042 super.EEKilled(killer);
11043
11046 {
11047 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
11048 {
11049 if (IsMagazine())
11050 {
11051 if (Magazine.Cast(this).GetAmmoCount() > 0)
11052 {
11054 }
11055 }
11056 else
11057 {
11059 }
11060 }
11061 }
11062 }
11063
11065 {
11066 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
11067
11068 super.OnWasAttached(parent, slot_id);
11069
11072
11075 }
11076
11078 {
11079 super.OnWasDetached(parent, slot_id);
11080
11083
11086 }
11087
11089 {
11090 int idx;
11093
11094 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
11095 if (inventory_slots.Count() < 1)
11096 {
11097 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
11098 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
11099 }
11100 else
11101 {
11102 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
11103 }
11104
11105 idx = inventory_slots.Find(slot);
11106 if (idx < 0)
11107 return "";
11108
11109 return attach_types.Get(idx);
11110 }
11111
11113 {
11114 int idx = -1;
11115 string slot;
11116
11119
11120 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
11121 if (inventory_slots.Count() < 1)
11122 {
11123 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
11124 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11125 }
11126 else
11127 {
11128 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
11129 if (detach_types.Count() < 1)
11130 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
11131 }
11132
11133 for (int i = 0; i < inventory_slots.Count(); i++)
11134 {
11135 slot = inventory_slots.Get(i);
11136 }
11137
11138 if (slot != "")
11139 {
11140 if (detach_types.Count() == 1)
11141 idx = 0;
11142 else
11143 idx = inventory_slots.Find(slot);
11144 }
11145 if (idx < 0)
11146 return "";
11147
11148 return detach_types.Get(idx);
11149 }
11150
11152 {
11153
11155
11156
11157 float min_time = 1;
11158 float max_time = 3;
11159 float delay = Math.RandomFloat(min_time, max_time);
11160
11161 explode_timer.Run(delay, this, "DoAmmoExplosion");
11162 }
11163
11165 {
11166 Magazine magazine = Magazine.Cast(this);
11167 int pop_sounds_count = 6;
11168 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11169
11170
11171 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11172 string sound_name = pop_sounds[ sound_idx ];
11173 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
11174
11175
11176 magazine.ServerAddAmmoCount(-1);
11177
11178
11179 float min_temp_to_explode = 100;
11180
11181 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
11182 {
11184 }
11185 }
11186
11187
11188 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11189 {
11190 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11191
11192 const int CHANCE_DAMAGE_CARGO = 4;
11193 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11194 const int CHANCE_DAMAGE_NOTHING = 2;
11195
11197 {
11198 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11199 int chances;
11200 int rnd;
11201
11202 if (GetInventory().GetCargo())
11203 {
11204 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11205 rnd = Math.RandomInt(0,chances);
11206
11207 if (rnd < CHANCE_DAMAGE_CARGO)
11208 {
11210 }
11211 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11212 {
11214 }
11215 }
11216 else
11217 {
11218 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11219 rnd = Math.RandomInt(0,chances);
11220
11221 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11222 {
11224 }
11225 }
11226 }
11227 }
11228
11230 {
11231 CargoBase cargo = GetInventory().GetCargo();
11232 if (cargo)
11233 {
11235 if (item_count > 0)
11236 {
11237 int random_pick = Math.RandomInt(0, item_count);
11239 if (!item.IsExplosive())
11240 {
11241 item.AddHealth("","",damage);
11242 return true;
11243 }
11244 }
11245 }
11246 return false;
11247 }
11248
11250 {
11251 GameInventory inventory = GetInventory();
11253 if (attachment_count > 0)
11254 {
11255 int random_pick = Math.RandomInt(0, attachment_count);
11257 if (!attachment.IsExplosive())
11258 {
11259 attachment.AddHealth("","",damage);
11260 return true;
11261 }
11262 }
11263 return false;
11264 }
11265
11267 {
11269 }
11270
11272 {
11274 return GetInventory().CanRemoveEntity();
11275
11276 return false;
11277 }
11278
11280 {
11281
11283 return false;
11284
11285
11287 return false;
11288
11289
11290
11292 if (delta == 0)
11293 return false;
11294
11295
11296 return true;
11297 }
11298
11300 {
11302 {
11303 if (ScriptInputUserData.CanStoreInputUserData())
11304 {
11305 ScriptInputUserData ctx = new ScriptInputUserData;
11310 ctx.
Write(destination_entity);
11312 ctx.
Write(slot_id);
11314 }
11315 }
11316 else if (!
g_Game.IsMultiplayer())
11317 {
11319 }
11320 }
11321
11323 {
11324 float split_quantity_new;
11328 InventoryLocation loc = new InventoryLocation;
11329
11330 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11331 {
11333 split_quantity_new = stack_max;
11334 else
11336
11338 {
11339 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11340 if (new_item)
11341 {
11342 new_item.SetResultOfSplit(true);
11343 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11345 new_item.
SetQuantity(split_quantity_new,
false,
true);
11346 }
11347 }
11348 }
11349 else if (destination_entity && slot_id == -1)
11350 {
11351 if (quantity > stack_max)
11352 split_quantity_new = stack_max;
11353 else
11354 split_quantity_new = quantity;
11355
11357 {
11358 GameInventory destinationInventory = destination_entity.GetInventory();
11360 {
11363 }
11364
11365 if (new_item)
11366 {
11367 new_item.SetResultOfSplit(true);
11368 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11370 new_item.
SetQuantity(split_quantity_new,
false,
true);
11371 }
11372 }
11373 }
11374 else
11375 {
11376 if (stack_max != 0)
11377 {
11379 {
11381 }
11382
11383 if (split_quantity_new == 0)
11384 {
11385 if (!
g_Game.IsMultiplayer())
11386 player.PhysicalPredictiveDropItem(this);
11387 else
11388 player.ServerDropEntity(this);
11389 return;
11390 }
11391
11393 {
11395
11396 if (new_item)
11397 {
11398 new_item.SetResultOfSplit(true);
11399 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11402 new_item.PlaceOnSurface();
11403 }
11404 }
11405 }
11406 }
11407 }
11408
11410 {
11411 float split_quantity_new;
11415 InventoryLocation loc = new InventoryLocation;
11416
11417 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11418 {
11420 split_quantity_new = stack_max;
11421 else
11423
11425 {
11426 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11427 if (new_item)
11428 {
11429 new_item.SetResultOfSplit(true);
11430 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11432 new_item.
SetQuantity(split_quantity_new,
false,
true);
11433 }
11434 }
11435 }
11436 else if (destination_entity && slot_id == -1)
11437 {
11438 if (quantity > stack_max)
11439 split_quantity_new = stack_max;
11440 else
11441 split_quantity_new = quantity;
11442
11444 {
11445 GameInventory destinationInventory = destination_entity.GetInventory();
11447 {
11450 }
11451
11452 if (new_item)
11453 {
11454 new_item.SetResultOfSplit(true);
11455 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11457 new_item.
SetQuantity(split_quantity_new,
false,
true);
11458 }
11459 }
11460 }
11461 else
11462 {
11463 if (stack_max != 0)
11464 {
11466 {
11468 }
11469
11471 {
11473
11474 if (new_item)
11475 {
11476 new_item.SetResultOfSplit(true);
11477 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11480 new_item.PlaceOnSurface();
11481 }
11482 }
11483 }
11484 }
11485 }
11486
11488 {
11490 {
11491 if (ScriptInputUserData.CanStoreInputUserData())
11492 {
11493 ScriptInputUserData ctx = new ScriptInputUserData;
11498 dst.WriteToContext(ctx);
11500 }
11501 }
11502 else if (!
g_Game.IsMultiplayer())
11503 {
11505 }
11506 }
11507
11509 {
11511 {
11512 if (ScriptInputUserData.CanStoreInputUserData())
11513 {
11514 ScriptInputUserData ctx = new ScriptInputUserData;
11519 ctx.
Write(destination_entity);
11525 }
11526 }
11527 else if (!
g_Game.IsMultiplayer())
11528 {
11530 }
11531 }
11532
11534 {
11536 }
11537
11539 {
11541 float split_quantity_new;
11543 if (dst.IsValid())
11544 {
11545 int slot_id = dst.GetSlot();
11547
11548 if (quantity > stack_max)
11549 split_quantity_new = stack_max;
11550 else
11551 split_quantity_new = quantity;
11552
11554 {
11556
11557 if (new_item)
11558 {
11559 new_item.SetResultOfSplit(true);
11560 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11562 new_item.
SetQuantity(split_quantity_new,
false,
true);
11563 }
11564
11565 return new_item;
11566 }
11567 }
11568
11569 return null;
11570 }
11571
11573 {
11575 float split_quantity_new;
11577 if (destination_entity)
11578 {
11580 if (quantity > stackable)
11581 split_quantity_new = stackable;
11582 else
11583 split_quantity_new = quantity;
11584
11586 {
11587 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11588 if (new_item)
11589 {
11590 new_item.SetResultOfSplit(true);
11591 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11593 new_item.
SetQuantity(split_quantity_new,
false,
true);
11594 }
11595 }
11596 }
11597 }
11598
11600 {
11602 {
11603 if (ScriptInputUserData.CanStoreInputUserData())
11604 {
11605 ScriptInputUserData ctx = new ScriptInputUserData;
11610 ItemBase destination_entity =
this;
11611 ctx.
Write(destination_entity);
11615 }
11616 }
11617 else if (!
g_Game.IsMultiplayer())
11618 {
11620 }
11621 }
11622
11624 {
11626 float split_quantity_new;
11628 if (player)
11629 {
11631 if (quantity > stackable)
11632 split_quantity_new = stackable;
11633 else
11634 split_quantity_new = quantity;
11635
11637 {
11638 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11639 new_item =
ItemBase.Cast(in_hands);
11640 if (new_item)
11641 {
11642 new_item.SetResultOfSplit(true);
11643 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11645 new_item.SetQuantity(split_quantity_new, false, true);
11646 }
11647 }
11648 }
11649 }
11650
11652 {
11654 float split_quantity_new = Math.Floor(quantity * 0.5);
11655
11657 return;
11658
11660
11661 if (new_item)
11662 {
11663 if (new_item.GetQuantityMax() < split_quantity_new)
11664 {
11665 split_quantity_new = new_item.GetQuantityMax();
11666 }
11667
11668 new_item.SetResultOfSplit(true);
11669 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11670
11672 {
11675 }
11676 else
11677 {
11679 new_item.
SetQuantity(split_quantity_new,
false,
true);
11680 }
11681 }
11682 }
11683
11685 {
11687 float split_quantity_new = Math.Floor(quantity / 2);
11688
11690 return;
11691
11692 InventoryLocation invloc = new InventoryLocation;
11694
11696 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11697
11698 if (new_item)
11699 {
11700 if (new_item.GetQuantityMax() < split_quantity_new)
11701 {
11702 split_quantity_new = new_item.GetQuantityMax();
11703 }
11705 {
11708 }
11709 else if (split_quantity_new > 1)
11710 {
11712 new_item.
SetQuantity(split_quantity_new,
false,
true);
11713 }
11714 }
11715 }
11716
11719 {
11720 SetWeightDirty();
11722
11723 if (parent)
11724 parent.OnAttachmentQuantityChangedEx(this, delta);
11725
11727 {
11729 {
11731 }
11733 {
11734 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11736 }
11737 }
11738 }
11739
11742 {
11743
11744 }
11745
11748 {
11750 }
11751
11753 {
11754 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11755
11757 {
11758 if (newLevel == GameConstants.STATE_RUINED)
11759 {
11761 EntityAI parent = GetHierarchyParent();
11762 if (parent && parent.IsFireplace())
11763 {
11764 CargoBase cargo = GetInventory().GetCargo();
11765 if (cargo)
11766 {
11768 {
11770 }
11771 }
11772 }
11773 }
11774
11776 {
11777
11779 return;
11780 }
11781
11782 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11783 {
11785 }
11786 }
11787 }
11788
11789
11791 {
11792 super.OnRightClick();
11793
11795 {
11797 {
11798 if (ScriptInputUserData.CanStoreInputUserData())
11799 {
11800 EntityAI root = GetHierarchyRoot();
11801 Man playerOwner = GetHierarchyRootPlayer();
11802 InventoryLocation dst = new InventoryLocation;
11803
11804
11805 if (!playerOwner && root && root == this)
11806 {
11808 }
11809 else
11810 {
11811
11812 GetInventory().GetCurrentInventoryLocation(dst);
11814 {
11815 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11817 {
11819 }
11820 else
11821 {
11823
11824
11825 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11826 {
11828 }
11829 else
11830 {
11831 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11832 }
11833 }
11834 }
11835 }
11836
11837 ScriptInputUserData ctx = new ScriptInputUserData;
11845 }
11846 }
11847 else if (!
g_Game.IsMultiplayer())
11848 {
11850 }
11851 }
11852 }
11853
11855 {
11856 if (root)
11857 {
11858 vector m4[4];
11859 root.GetTransform(m4);
11860 dst.SetGround(this, m4);
11861 }
11862 else
11863 {
11864 GetInventory().GetCurrentInventoryLocation(dst);
11865 }
11866 }
11867
11868 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11869 {
11870
11871 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11872 return false;
11873
11874 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11875 return false;
11876
11877
11879 return false;
11880
11881
11882 Magazine mag = Magazine.Cast(this);
11883 if (mag)
11884 {
11885 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11886 return false;
11887
11888 if (stack_max_limit)
11889 {
11890 Magazine other_mag = Magazine.Cast(other_item);
11891 if (other_item)
11892 {
11893 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11894 return false;
11895 }
11896
11897 }
11898 }
11899 else
11900 {
11901
11903 return false;
11904
11906 return false;
11907 }
11908
11909 PlayerBase player = null;
11910 if (CastTo(player, GetHierarchyRootPlayer()))
11911 {
11912 if (player.GetInventory().HasAttachment(this))
11913 return false;
11914
11915 if (player.IsItemsToDelete())
11916 return false;
11917 }
11918
11919 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11920 return false;
11921
11922 int slotID;
11924 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11925 return false;
11926
11927 return true;
11928 }
11929
11931 {
11933 }
11934
11936 {
11937 return m_IsResultOfSplit;
11938 }
11939
11941 {
11942 m_IsResultOfSplit = value;
11943 }
11944
11946 {
11948 }
11949
11951 {
11952 float other_item_quantity = other_item.GetQuantity();
11953 float this_free_space;
11954
11956
11958
11959 if (other_item_quantity > this_free_space)
11960 {
11961 return this_free_space;
11962 }
11963 else
11964 {
11965 return other_item_quantity;
11966 }
11967 }
11968
11970 {
11972 }
11973
11975 {
11977 return;
11978
11979 if (!IsMagazine() && other_item)
11980 {
11982 if (quantity_used != 0)
11983 {
11984 float hp1 = GetHealth01("","");
11985 float hp2 = other_item.GetHealth01("","");
11986 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11987 hpResult = hpResult / (
GetQuantity() + quantity_used);
11988
11989 hpResult *= GetMaxHealth();
11990 Math.Round(hpResult);
11991 SetHealth("", "Health", hpResult);
11992
11994 other_item.AddQuantity(-quantity_used);
11995 }
11996 }
11998 }
11999
12001 {
12002 #ifdef SERVER
12003 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
12004 GetHierarchyParent().IncreaseLifetimeUp();
12005 #endif
12006 };
12007
12009 {
12010 PlayerBase p = PlayerBase.Cast(player);
12011
12012 array<int> recipesIds = p.m_Recipes;
12013 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
12014 if (moduleRecipesManager)
12015 {
12016 EntityAI itemInHands = player.GetEntityInHands();
12017 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
12018 }
12019
12020 for (int i = 0;i < recipesIds.Count(); i++)
12021 {
12022 int key = recipesIds.Get(i);
12023 string recipeName = moduleRecipesManager.GetRecipeName(key);
12025 }
12026 }
12027
12028
12029 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
12030 {
12031 super.GetDebugActions(outputList);
12032
12033
12039
12040
12045
12050
12051
12055
12056
12058 {
12062 }
12063
12066
12067
12071
12073
12074 InventoryLocation loc = new InventoryLocation();
12075 GetInventory().GetCurrentInventoryLocation(loc);
12077 {
12078 if (Gizmo_IsSupported())
12081 }
12082
12084 }
12085
12086
12087
12088
12090 {
12091 super.OnAction(action_id, player, ctx);
12092
12094 {
12095 switch (action_id)
12096 {
12100 return true;
12104 return true;
12105 }
12106 }
12107
12109 {
12110 switch (action_id)
12111 {
12113 Delete();
12114 return true;
12115 }
12116 }
12117
12118 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
12119 {
12120 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
12121 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
12122 PlayerBase p = PlayerBase.Cast(player);
12123 if (
EActions.RECIPES_RANGE_START < 1000)
12124 {
12125 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
12126 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
12127 }
12128 }
12129 #ifndef SERVER
12130 else if (action_id ==
EActions.WATCH_PLAYER)
12131 {
12132 PluginDeveloper.SetDeveloperItemClientEx(player);
12133 }
12134 #endif
12136 {
12137 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
12138 {
12139 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
12140 OnDebugButtonPressServer(id + 1);
12141 }
12142
12143 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
12144 {
12145 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
12147 }
12148
12149 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
12150 {
12151 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
12153 }
12154
12155 else if (action_id ==
EActions.ADD_QUANTITY)
12156 {
12157 if (IsMagazine())
12158 {
12159 Magazine mag = Magazine.Cast(this);
12160 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
12161 }
12162 else
12163 {
12165 }
12166
12167 if (m_EM)
12168 {
12169 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
12170 }
12171
12172 }
12173
12174 else if (action_id ==
EActions.REMOVE_QUANTITY)
12175 {
12176 if (IsMagazine())
12177 {
12178 Magazine mag2 = Magazine.Cast(this);
12179 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
12180 }
12181 else
12182 {
12184 }
12185 if (m_EM)
12186 {
12187 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12188 }
12189
12190 }
12191
12192 else if (action_id ==
EActions.SET_QUANTITY_0)
12193 {
12195
12196 if (m_EM)
12197 {
12198 m_EM.SetEnergy(0);
12199 }
12200 }
12201
12202 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12203 {
12205
12206 if (m_EM)
12207 {
12208 m_EM.SetEnergy(m_EM.GetEnergyMax());
12209 }
12210 }
12211
12212 else if (action_id ==
EActions.ADD_HEALTH)
12213 {
12214 AddHealth("","",GetMaxHealth("","Health")/5);
12215 }
12216 else if (action_id ==
EActions.REMOVE_HEALTH)
12217 {
12218 AddHealth("","",-GetMaxHealth("","Health")/5);
12219 }
12220 else if (action_id ==
EActions.DESTROY_HEALTH)
12221 {
12222 SetHealth01("","",0);
12223 }
12224 else if (action_id ==
EActions.WATCH_ITEM)
12225 {
12227 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12228 #ifdef DEVELOPER
12229 SetDebugDeveloper_item(this);
12230 #endif
12231 }
12232
12233 else if (action_id ==
EActions.ADD_TEMPERATURE)
12234 {
12235 AddTemperature(20);
12236
12237 }
12238
12239 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12240 {
12241 AddTemperature(-20);
12242
12243 }
12244
12245 else if (action_id ==
EActions.FLIP_FROZEN)
12246 {
12247 SetFrozen(!GetIsFrozen());
12248
12249 }
12250
12251 else if (action_id ==
EActions.ADD_WETNESS)
12252 {
12254
12255 }
12256
12257 else if (action_id ==
EActions.REMOVE_WETNESS)
12258 {
12260
12261 }
12262
12263 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12264 {
12267
12268
12269 }
12270
12271 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12272 {
12275 }
12276
12277 else if (action_id ==
EActions.MAKE_SPECIAL)
12278 {
12279 auto debugParams = DebugSpawnParams.WithPlayer(player);
12280 OnDebugSpawnEx(debugParams);
12281 }
12282
12283 }
12284
12285
12286 return false;
12287 }
12288
12289
12290
12291
12295
12298
12299
12300
12302 {
12303 return false;
12304 }
12305
12306
12308 {
12309 return true;
12310 }
12311
12312
12314 {
12315 return true;
12316 }
12317
12318
12319
12321 {
12322 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12323 return g_Game.ConfigIsExisting(config_path);
12324 }
12325
12328 {
12329 return null;
12330 }
12331
12333 {
12334 return false;
12335 }
12336
12338 {
12339 return false;
12340 }
12341
12345
12346
12348 {
12349 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12350 return module_repairing.CanRepair(this, item_repair_kit);
12351 }
12352
12353
12354 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12355 {
12356 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12357 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12358 }
12359
12360
12362 {
12363
12364
12365
12366
12367
12368
12369
12370
12371 return 1;
12372 }
12373
12374
12375
12377 {
12379 }
12380
12381
12382
12384 {
12386 }
12387
12388
12397 {
12398 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12399
12400 if (player)
12401 {
12402 player.MessageStatus(text);
12403 }
12404 }
12405
12406
12415 {
12416 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12417
12418 if (player)
12419 {
12420 player.MessageAction(text);
12421 }
12422 }
12423
12424
12433 {
12434 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12435
12436 if (player)
12437 {
12438 player.MessageFriendly(text);
12439 }
12440 }
12441
12442
12451 {
12452 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12453
12454 if (player)
12455 {
12456 player.MessageImportant(text);
12457 }
12458 }
12459
12461 {
12462 return true;
12463 }
12464
12465
12466 override bool KindOf(
string tag)
12467 {
12468 bool found = false;
12469 string item_name = this.
GetType();
12471 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12472
12473 int array_size = item_tag_array.Count();
12474 for (int i = 0; i < array_size; i++)
12475 {
12476 if (item_tag_array.Get(i) == tag)
12477 {
12478 found = true;
12479 break;
12480 }
12481 }
12482 return found;
12483 }
12484
12485
12487 {
12488
12489 super.OnRPC(sender, rpc_type,ctx);
12490
12491
12492 switch (rpc_type)
12493 {
12494 #ifndef SERVER
12495 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12496 Param2<bool, string> p = new Param2<bool, string>(false, "");
12497
12499 return;
12500
12501 bool play = p.param1;
12502 string soundSet = p.param2;
12503
12504 if (play)
12505 {
12507 {
12509 {
12511 }
12512 }
12513 else
12514 {
12516 }
12517 }
12518 else
12519 {
12521 }
12522
12523 break;
12524 #endif
12525
12526 }
12527
12529 {
12531 }
12532 }
12533
12534
12535
12536
12538 {
12539 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12540 return plugin.GetID(
name);
12541 }
12542
12544 {
12545 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12546 return plugin.GetName(id);
12547 }
12548
12551 {
12552
12553
12554 int varFlags;
12555 if (!ctx.
Read(varFlags))
12556 return;
12557
12558 if (varFlags & ItemVariableFlags.FLOAT)
12559 {
12561 }
12562 }
12563
12565 {
12566
12567 super.SerializeNumericalVars(floats_out);
12568
12569
12570
12572 {
12574 }
12575
12577 {
12579 }
12580
12582 {
12584 }
12585
12587 {
12592 }
12593
12595 {
12597 }
12598 }
12599
12601 {
12602
12603 super.DeSerializeNumericalVars(floats);
12604
12605
12606 int index = 0;
12607 int mask = Math.Round(floats.Get(index));
12608
12609 index++;
12610
12612 {
12614 {
12616 }
12617 else
12618 {
12619 float quantity = floats.Get(index);
12620 SetQuantity(quantity,
true,
false,
false,
false);
12621 }
12622 index++;
12623 }
12624
12626 {
12627 float wet = floats.Get(index);
12629 index++;
12630 }
12631
12633 {
12634 int liquidtype = Math.Round(floats.Get(index));
12636 index++;
12637 }
12638
12640 {
12642 index++;
12644 index++;
12646 index++;
12648 index++;
12649 }
12650
12652 {
12653 int cleanness = Math.Round(floats.Get(index));
12655 index++;
12656 }
12657 }
12658
12660 {
12661 super.WriteVarsToCTX(ctx);
12662
12663
12665 {
12667 }
12668
12670 {
12672 }
12673
12675 {
12677 }
12678
12680 {
12681 int r,g,b,a;
12687 }
12688
12690 {
12692 }
12693 }
12694
12696 {
12697 if (!super.ReadVarsFromCTX(ctx,version))
12698 return false;
12699
12700 int intValue;
12701 float value;
12702
12703 if (version < 140)
12704 {
12705 if (!ctx.
Read(intValue))
12706 return false;
12707
12708 m_VariablesMask = intValue;
12709 }
12710
12712 {
12713 if (!ctx.
Read(value))
12714 return false;
12715
12717 {
12719 }
12720 else
12721 {
12723 }
12724 }
12725
12726 if (version < 140)
12727 {
12729 {
12730 if (!ctx.
Read(value))
12731 return false;
12732 SetTemperatureDirect(value);
12733 }
12734 }
12735
12737 {
12738 if (!ctx.
Read(value))
12739 return false;
12741 }
12742
12744 {
12745 if (!ctx.
Read(intValue))
12746 return false;
12748 }
12749
12751 {
12752 int r,g,b,a;
12754 return false;
12756 return false;
12758 return false;
12760 return false;
12761
12763 }
12764
12766 {
12767 if (!ctx.
Read(intValue))
12768 return false;
12770 }
12771
12772 if (version >= 138 && version < 140)
12773 {
12775 {
12776 if (!ctx.
Read(intValue))
12777 return false;
12778 SetFrozen(intValue);
12779 }
12780 }
12781
12782 return true;
12783 }
12784
12785
12787 {
12790 {
12792 }
12793
12794 if (!super.OnStoreLoad(ctx, version))
12795 {
12797 return false;
12798 }
12799
12800 if (version >= 114)
12801 {
12802 bool hasQuickBarIndexSaved;
12803
12804 if (!ctx.
Read(hasQuickBarIndexSaved))
12805 {
12807 return false;
12808 }
12809
12810 if (hasQuickBarIndexSaved)
12811 {
12812 int itmQBIndex;
12813
12814
12815 if (!ctx.
Read(itmQBIndex))
12816 {
12818 return false;
12819 }
12820
12821 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12822 if (itmQBIndex != -1 && parentPlayer)
12823 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12824 }
12825 }
12826 else
12827 {
12828
12829 PlayerBase player;
12830 int itemQBIndex;
12831 if (version ==
int.
MAX)
12832 {
12833 if (!ctx.
Read(itemQBIndex))
12834 {
12836 return false;
12837 }
12838 }
12839 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12840 {
12841
12842 if (!ctx.
Read(itemQBIndex))
12843 {
12845 return false;
12846 }
12847 if (itemQBIndex != -1 && player)
12848 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12849 }
12850 }
12851
12852 if (version < 140)
12853 {
12854
12855 if (!LoadVariables(ctx, version))
12856 {
12858 return false;
12859 }
12860 }
12861
12862
12864 {
12866 return false;
12867 }
12868 if (version >= 132)
12869 {
12871 if (raib)
12872 {
12874 {
12876 return false;
12877 }
12878 }
12879 }
12880
12882 return true;
12883 }
12884
12885
12886
12888 {
12889 super.OnStoreSave(ctx);
12890
12891 PlayerBase player;
12892 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12893 {
12895
12896 int itemQBIndex = -1;
12897 itemQBIndex = player.FindQuickBarEntityIndex(this);
12898 ctx.
Write(itemQBIndex);
12899 }
12900 else
12901 {
12903 }
12904
12906
12908 if (raib)
12909 {
12911 }
12912 }
12913
12914
12916 {
12917 super.AfterStoreLoad();
12918
12920 {
12922 }
12923
12925 {
12928 }
12929 }
12930
12932 {
12933 super.EEOnAfterLoad();
12934
12936 {
12938 }
12939
12942 }
12943
12945 {
12946 return false;
12947 }
12948
12949
12950
12952 {
12954 {
12955 #ifdef PLATFORM_CONSOLE
12956
12958 {
12960 if (menu)
12961 {
12963 }
12964 }
12965 #endif
12966 }
12967
12969 {
12972 }
12973
12975 {
12976 SetWeightDirty();
12978 }
12980 {
12983 }
12984
12986 {
12989
12992 }
12994 {
12998 }
12999
13000 super.OnVariablesSynchronized();
13001 }
13002
13003
13004
13006 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
13007 {
13008 if (!IsServerCheck(allow_client))
13009 return false;
13010
13012 return false;
13013
13016
13017 if (value <= (min + 0.001))
13018 value = min;
13019
13020 if (value == min)
13021 {
13022 if (destroy_config)
13023 {
13024 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
13025 if (dstr)
13026 {
13028 this.Delete();
13029 return true;
13030 }
13031 }
13032 else if (destroy_forced)
13033 {
13035 this.Delete();
13036 return true;
13037 }
13038
13040 }
13041
13044
13046 {
13047 EntityAI parent = GetHierarchyRoot();
13048 InventoryLocation iLoc = new InventoryLocation();
13049 GetInventory().GetCurrentInventoryLocation(iLoc);
13051 {
13052 int iLocSlot = iLoc.
GetSlot();
13054 {
13056 }
13058 {
13060 }
13061 }
13062 }
13063
13065 {
13067
13068 if (delta)
13070 }
13071
13073
13074 return false;
13075 }
13076
13077
13079 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
13080 {
13082 }
13083
13085 {
13088 }
13089
13091 {
13094 }
13095
13097 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
13098 {
13099 float value_clamped = Math.Clamp(value, 0, 1);
13101 SetQuantity(result, destroy_config, destroy_forced);
13102 }
13103
13104
13107 {
13109 }
13110
13112 {
13114 }
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13126 {
13127 int slot = -1;
13128 GameInventory inventory = GetInventory();
13129 if (inventory)
13130 {
13131 InventoryLocation il = new InventoryLocation;
13134 }
13135
13137 }
13138
13140 {
13141 float quantity_max = 0;
13142
13144 {
13145 if (attSlotID != -1)
13146 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
13147
13148 if (quantity_max <= 0)
13150 }
13151
13152 if (quantity_max <= 0)
13154
13155 return quantity_max;
13156 }
13157
13159 {
13161 }
13162
13164 {
13166 }
13167
13168
13170 {
13172 }
13173
13175 {
13177 }
13178
13180 {
13182 }
13183
13184
13186 {
13187
13188 float weightEx = GetWeightEx();
13189 float special = GetInventoryAndCargoWeight();
13190 return weightEx - special;
13191 }
13192
13193
13195 {
13197 }
13198
13200 {
13202 {
13203 #ifdef DEVELOPER
13204 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13205 {
13206 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13208 }
13209 #endif
13210
13211 return GetQuantity() * GetConfigWeightModified();
13212 }
13213 else if (HasEnergyManager())
13214 {
13215 #ifdef DEVELOPER
13216 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13217 {
13218 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13219 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13220 }
13221 #endif
13222 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13223 }
13224 else
13225 {
13226 #ifdef DEVELOPER
13227 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13228 {
13229 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13230 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13231 }
13232 #endif
13233 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13234 }
13235 }
13236
13239 {
13240 int item_count = 0;
13242
13243 GameInventory inventory = GetInventory();
13244 CargoBase cargo = inventory.
GetCargo();
13245 if (cargo != NULL)
13246 {
13248 }
13249
13251 for (int i = 0; i < nAttachments; ++i)
13252 {
13254 if (item)
13255 item_count += item.GetNumberOfItems();
13256 }
13257 return item_count;
13258 }
13259
13262 {
13263 float weight = 0;
13264 float wetness = 1;
13265 if (include_wetness)
13268 {
13269 weight = wetness * m_ConfigWeight;
13270 }
13272 {
13273 weight = 1;
13274 }
13275 return weight;
13276 }
13277
13278
13279
13281 {
13282 GameInventory inventory = GetInventory();
13283 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13284 {
13285 array<EntityAI> items = new array<EntityAI>;
13287 for (int i = 0; i < items.Count(); ++i)
13288 {
13290 if (item)
13291 {
13292 g_Game.ObjectDelete(item);
13293 }
13294 }
13295 }
13296 }
13297
13298
13299
13300
13302 {
13303 float energy = 0;
13304 if (HasEnergyManager())
13305 {
13306 energy = GetCompEM().GetEnergy();
13307 }
13308 return energy;
13309 }
13310
13311
13313 {
13314 super.OnEnergyConsumed();
13315
13317 }
13318
13320 {
13321 super.OnEnergyAdded();
13322
13324 }
13325
13326
13328 {
13329 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13330 {
13332 {
13333 float energy_0to1 = GetCompEM().GetEnergy0To1();
13335 }
13336 }
13337 }
13338
13339
13341 {
13342 return ConfigGetFloat("heatIsolation");
13343 }
13344
13346 {
13348 }
13349
13351 {
13352 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13353 if (
g_Game.ConfigIsExisting(paramPath))
13354 return g_Game.ConfigGetFloat(paramPath);
13355
13356 return 0.0;
13357 }
13358
13360 {
13361 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13362 if (
g_Game.ConfigIsExisting(paramPath))
13363 return g_Game.ConfigGetFloat(paramPath);
13364
13365 return 0.0;
13366 }
13367
13368 override void SetWet(
float value,
bool allow_client =
false)
13369 {
13370 if (!IsServerCheck(allow_client))
13371 return;
13372
13375
13377
13378 m_VarWet = Math.Clamp(value, min, max);
13379
13381 {
13384 }
13385 }
13386
13387 override void AddWet(
float value)
13388 {
13390 }
13391
13393 {
13395 }
13396
13398 {
13400 }
13401
13403 {
13405 }
13406
13408 {
13410 }
13411
13413 {
13415 }
13416
13417 override void OnWetChanged(
float newVal,
float oldVal)
13418 {
13421 if (newLevel != oldLevel)
13422 {
13424 }
13425 }
13426
13428 {
13429 SetWeightDirty();
13430 }
13431
13433 {
13434 return GetWetLevelInternal(
m_VarWet);
13435 }
13436
13437
13438
13440 {
13442 }
13443
13445 {
13447 }
13448
13450 {
13452 }
13453
13455 {
13457 }
13458
13459
13460
13462 {
13463 if (ConfigIsExisting("itemModelLength"))
13464 {
13465 return ConfigGetFloat("itemModelLength");
13466 }
13467 return 0;
13468 }
13469
13471 {
13472 if (ConfigIsExisting("itemAttachOffset"))
13473 {
13474 return ConfigGetFloat("itemAttachOffset");
13475 }
13476 return 0;
13477 }
13478
13479 override void SetCleanness(
int value,
bool allow_client =
false)
13480 {
13481 if (!IsServerCheck(allow_client))
13482 return;
13483
13485
13487
13490 }
13491
13493 {
13495 }
13496
13498 {
13499 return true;
13500 }
13501
13502
13503
13504
13506 {
13508 }
13509
13511 {
13513 }
13514
13515
13516
13517
13518 override void SetColor(
int r,
int g,
int b,
int a)
13519 {
13525 }
13527 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13528 {
13533 }
13534
13536 {
13538 }
13539
13542 {
13543 int r,g,b,a;
13545 r = r/255;
13546 g = g/255;
13547 b = b/255;
13548 a = a/255;
13549 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13550 }
13551
13552
13553
13554 override void SetLiquidType(
int value,
bool allow_client =
false)
13555 {
13556 if (!IsServerCheck(allow_client))
13557 return;
13558
13563 }
13564
13566 {
13567 return ConfigGetInt("varLiquidTypeInit");
13568 }
13569
13571 {
13573 }
13574
13576 {
13578 SetFrozen(false);
13579 }
13580
13583 {
13584 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13585 }
13586
13587
13590 {
13591 PlayerBase nplayer;
13592 if (PlayerBase.CastTo(nplayer, player))
13593 {
13595 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13596 }
13597 }
13598
13599
13602 {
13603 PlayerBase nplayer;
13604 if (PlayerBase.CastTo(nplayer,player))
13605 {
13606 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13607 }
13608
13609 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13610
13611 if (HasEnergyManager())
13612 {
13613 GetCompEM().UpdatePlugState();
13614 }
13615 }
13616
13617
13619 {
13620 super.OnPlacementStarted(player);
13621
13623 }
13624
13625 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13626 {
13628 {
13629 m_AdminLog.OnPlacementComplete(player,
this);
13630 }
13631
13632 super.OnPlacementComplete(player, position, orientation);
13633 }
13634
13635
13636
13637
13638
13640 {
13642 {
13643 return true;
13644 }
13645 else
13646 {
13647 return false;
13648 }
13649 }
13650
13651
13653 {
13655 {
13657 }
13658 }
13659
13660
13662 {
13664 }
13665
13667 {
13669 }
13670
13671 override void InsertAgent(
int agent,
float count = 1)
13672 {
13673 if (count < 1)
13674 return;
13675
13677 }
13678
13681 {
13683 }
13684
13685
13687 {
13689 }
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13733 {
13735 return false;
13736 return true;
13737 }
13738
13740 {
13741
13743 }
13744
13745
13748 {
13749 super.CheckForRoofLimited(timeTresholdMS);
13750
13751 float time =
g_Game.GetTime();
13752 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13753 {
13754 m_PreviousRoofTestTime = time;
13755 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13756 }
13757 }
13758
13759
13761 {
13763 {
13764 return 0;
13765 }
13766
13767 if (GetInventory().GetAttachmentSlotsCount() != 0)
13768 {
13769 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13770 if (filter)
13771 return filter.GetProtectionLevel(type, false, system);
13772 else
13773 return 0;
13774 }
13775
13776 string subclassPath, entryName;
13777
13778 switch (type)
13779 {
13781 entryName = "biological";
13782 break;
13784 entryName = "chemical";
13785 break;
13786 default:
13787 entryName = "biological";
13788 break;
13789 }
13790
13791 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13792
13793 return g_Game.ConfigGetFloat(subclassPath + entryName);
13794 }
13795
13796
13797
13800 {
13801 if (!IsMagazine())
13803
13805 }
13806
13807
13808
13809
13810
13815 {
13816 return true;
13817 }
13818
13820 {
13822 }
13823
13824
13825
13826
13827
13829 {
13830 if (parent)
13831 {
13832 if (parent.IsInherited(DayZInfected))
13833 return true;
13834
13835 if (!parent.IsRuined())
13836 return true;
13837 }
13838
13839 return true;
13840 }
13841
13843 {
13844 if (!super.CanPutAsAttachment(parent))
13845 {
13846 return false;
13847 }
13848
13849 if (!IsRuined() && !parent.IsRuined())
13850 {
13851 return true;
13852 }
13853
13854 return false;
13855 }
13856
13858 {
13859
13860
13861
13862
13863 return super.CanReceiveItemIntoCargo(item);
13864 }
13865
13867 {
13868
13869
13870
13871
13872 GameInventory attachmentInv = attachment.GetInventory();
13874 {
13875 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13876 return false;
13877 }
13878
13879 InventoryLocation loc = new InventoryLocation();
13880 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13881 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13882 return false;
13883
13884 return super.CanReceiveAttachment(attachment, slotId);
13885 }
13886
13888 {
13889 if (!super.CanReleaseAttachment(attachment))
13890 return false;
13891
13892 return GetInventory().AreChildrenAccessible();
13893 }
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
13909
13910
13911
13912
13913
13914
13916 {
13917 int id = muzzle_owner.GetMuzzleID();
13918 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13919
13920 if (WPOF_array)
13921 {
13922 for (int i = 0; i < WPOF_array.Count(); i++)
13923 {
13924 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13925
13926 if (WPOF)
13927 {
13928 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13929 }
13930 }
13931 }
13932 }
13933
13934
13936 {
13937 int id = muzzle_owner.GetMuzzleID();
13939
13940 if (WPOBE_array)
13941 {
13942 for (int i = 0; i < WPOBE_array.Count(); i++)
13943 {
13944 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13945
13946 if (WPOBE)
13947 {
13948 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13949 }
13950 }
13951 }
13952 }
13953
13954
13956 {
13957 int id = muzzle_owner.GetMuzzleID();
13958 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13959
13960 if (WPOOH_array)
13961 {
13962 for (int i = 0; i < WPOOH_array.Count(); i++)
13963 {
13964 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13965
13966 if (WPOOH)
13967 {
13968 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13969 }
13970 }
13971 }
13972 }
13973
13974
13976 {
13977 int id = muzzle_owner.GetMuzzleID();
13978 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13979
13980 if (WPOOH_array)
13981 {
13982 for (int i = 0; i < WPOOH_array.Count(); i++)
13983 {
13984 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13985
13986 if (WPOOH)
13987 {
13988 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13989 }
13990 }
13991 }
13992 }
13993
13994
13996 {
13997 int id = muzzle_owner.GetMuzzleID();
13998 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13999
14000 if (WPOOH_array)
14001 {
14002 for (int i = 0; i < WPOOH_array.Count(); i++)
14003 {
14004 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
14005
14006 if (WPOOH)
14007 {
14008 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
14009 }
14010 }
14011 }
14012 }
14013
14014
14015
14017 {
14019 {
14020 return true;
14021 }
14022
14023 return false;
14024 }
14025
14027 {
14029 {
14030 return true;
14031 }
14032
14033 return false;
14034 }
14035
14037 {
14039 {
14040 return true;
14041 }
14042
14043 return false;
14044 }
14045
14047 {
14048 return false;
14049 }
14050
14053 {
14054 return UATimeSpent.DEFAULT_DEPLOY;
14055 }
14056
14057
14058
14059
14061 {
14063 SetSynchDirty();
14064 }
14065
14067 {
14069 }
14070
14071
14073 {
14074 return false;
14075 }
14076
14079 {
14080 string att_type = "None";
14081
14082 if (ConfigIsExisting("soundAttType"))
14083 {
14084 att_type = ConfigGetString("soundAttType");
14085 }
14086
14088 }
14089
14091 {
14093 }
14094
14095
14096
14097
14098
14104
14106 {
14109
14111 }
14112
14113
14115 {
14117 return;
14118
14120
14123
14126
14127 SoundParameters params = new SoundParameters();
14131 }
14132
14133
14135 {
14137 {
14140
14141 SetSynchDirty();
14142
14145 }
14146 }
14147
14149 {
14151 }
14152
14153
14155 {
14157 return;
14158
14160 SetSynchDirty();
14161
14164 }
14165
14167 {
14170 }
14171
14173 {
14175 }
14176
14177 void OnApply(PlayerBase player);
14178
14180 {
14181 return 1.0;
14182 };
14183
14185 {
14187 }
14188
14190 {
14192 }
14193
14195
14197 {
14198 SetDynamicPhysicsLifeTime(0.01);
14200 }
14201
14203 {
14204 array<string> zone_names = new array<string>;
14205 GetDamageZones(zone_names);
14206 for (int i = 0; i < zone_names.Count(); i++)
14207 {
14208 SetHealthMax(zone_names.Get(i),"Health");
14209 }
14210 SetHealthMax("","Health");
14211 }
14212
14215 {
14216 float global_health = GetHealth01("","Health");
14217 array<string> zones = new array<string>;
14218 GetDamageZones(zones);
14219
14220 for (int i = 0; i < zones.Count(); i++)
14221 {
14222 SetHealth01(zones.Get(i),"Health",global_health);
14223 }
14224 }
14225
14228 {
14229 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14230 }
14231
14233 {
14234 if (!hasRootAsPlayer)
14235 {
14236 if (refParentIB)
14237 {
14238
14239 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14240 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14241
14242 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14243 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14244
14247 }
14248 else
14249 {
14250
14253 }
14254 }
14255 }
14256
14258 {
14260 {
14261 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14262 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14263 {
14264 float heatPermCoef = 1.0;
14266 while (ent)
14267 {
14268 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14269 ent = ent.GetHierarchyParent();
14270 }
14271
14272 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14273 }
14274 }
14275 }
14276
14278 {
14279
14280 EntityAI parent = GetHierarchyParent();
14281 if (!parent)
14282 {
14283 hasParent = false;
14284 hasRootAsPlayer = false;
14285 }
14286 else
14287 {
14288 hasParent = true;
14289 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14290 refParentIB =
ItemBase.Cast(parent);
14291 }
14292 }
14293
14294 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14295 {
14296
14297 }
14298
14300 {
14301
14302 return false;
14303 }
14304
14306 {
14307
14308
14309 return false;
14310 }
14311
14313 {
14314
14315 return false;
14316 }
14317
14320 {
14321 return !GetIsFrozen() &&
IsOpen();
14322 }
14323
14325 {
14326 bool hasParent = false, hasRootAsPlayer = false;
14328
14329 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14330 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14331
14332 if (wwtu || foodDecay)
14333 {
14337
14338 if (processWetness || processTemperature || processDecay)
14339 {
14341
14342 if (processWetness)
14343 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14344
14345 if (processTemperature)
14347
14348 if (processDecay)
14349 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14350 }
14351 }
14352 }
14353
14356 {
14358 }
14359
14361 {
14364
14365 return super.GetTemperatureFreezeThreshold();
14366 }
14367
14369 {
14372
14373 return super.GetTemperatureThawThreshold();
14374 }
14375
14377 {
14380
14381 return super.GetItemOverheatThreshold();
14382 }
14383
14385 {
14387 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14388
14389 return super.GetTemperatureFreezeTime();
14390 }
14391
14393 {
14395 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14396
14397 return super.GetTemperatureThawTime();
14398 }
14399
14404
14406 {
14407 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14408 }
14409
14411 {
14412 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14413 }
14414
14417 {
14419 }
14420
14422 {
14424 }
14425
14427 {
14429 }
14430
14433 {
14434 return null;
14435 }
14436
14439 {
14440 return false;
14441 }
14442
14444 {
14446 {
14449 if (!trg)
14450 {
14452 explosive = this;
14453 }
14454
14455 explosive.PairRemote(trg);
14457
14458 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14459 trg.SetPersistentPairID(persistentID);
14460 explosive.SetPersistentPairID(persistentID);
14461
14462 return true;
14463 }
14464 return false;
14465 }
14466
14469 {
14470 float ret = 1.0;
14473 ret *= GetHealth01();
14474
14475 return ret;
14476 }
14477
14478 #ifdef DEVELOPER
14479 override void SetDebugItem()
14480 {
14481 super.SetDebugItem();
14482 _itemBase = this;
14483 }
14484
14486 {
14487 string text = super.GetDebugText();
14488
14490 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14491
14492 return text;
14493 }
14494 #endif
14495
14497 {
14498 return true;
14499 }
14500
14502
14504
14506 {
14509 }
14510
14511
14519
14535
14536 [
Obsolete(
"Use ItemSoundHandler instead")]
14539 {
14540 if (!
g_Game.IsDedicatedServer())
14541 {
14542 if (ConfigIsExisting("attachSoundSet"))
14543 {
14544 string cfg_path = "";
14545 string soundset = "";
14546 string type_name =
GetType();
14547
14550 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14551 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14552
14553 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14554 {
14555 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14556 {
14557 if (cfg_slot_array[i] == slot_type)
14558 {
14559 soundset = cfg_soundset_array[i];
14560 break;
14561 }
14562 }
14563 }
14564
14565 if (soundset != "")
14566 {
14567 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14569 }
14570 }
14571 }
14572 }
14573
14575}
14576
14578{
14580 if (entity)
14581 {
14582 bool is_item = entity.IsInherited(
ItemBase);
14583 if (is_item && full_quantity)
14584 {
14587 }
14588 }
14589 else
14590 {
14592 return NULL;
14593 }
14594 return entity;
14595}
14596
14598{
14599 if (item)
14600 {
14601 if (health > 0)
14602 item.SetHealth("", "", health);
14603
14604 if (item.CanHaveTemperature())
14605 {
14607 if (item.CanFreeze())
14608 item.SetFrozen(false);
14609 }
14610
14611 if (item.HasEnergyManager())
14612 {
14613 if (quantity >= 0)
14614 {
14615 item.GetCompEM().SetEnergy0To1(quantity);
14616 }
14617 else
14618 {
14620 }
14621 }
14622 else if (item.IsMagazine())
14623 {
14624 Magazine mag = Magazine.Cast(item);
14625 if (quantity >= 0)
14626 {
14627 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14628 }
14629 else
14630 {
14632 }
14633
14634 }
14635 else
14636 {
14637 if (quantity >= 0)
14638 {
14639 item.SetQuantityNormalized(quantity, false);
14640 }
14641 else
14642 {
14644 }
14645
14646 }
14647 }
14648}
14649
14650#ifdef DEVELOPER
14652#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.