From 7b534ef0bd2de16e4bb93753ca59602dcf64c424 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 21 Oct 2024 09:30:58 -0700 Subject: [PATCH] Update Paper --- build.gradle.kts | 2 +- gradle.properties | 2 +- ...to-be-explicitly-marked-as-Folia-sup.patch | 8 +- ...king-ownership-of-region-by-position.patch | 4 +- patches/server/0001-Build-changes.patch | 673 ++++++++--------- patches/server/0003-Threaded-Regions.patch | 703 +++++++----------- patches/server/0004-Max-pending-logins.patch | 6 +- ...-getHandle-and-overrides-perform-thr.patch | 30 +- ...edOperationException-for-broken-APIs.patch | 6 +- .../0008-Fix-tests-by-removing-them.patch | 4 +- ...dates-in-non-loaded-or-non-owned-chu.patch | 4 +- ...access-when-waking-players-up-during.patch | 6 +- ...ition-to-player-position-on-player-d.patch | 2 +- patches/server/0017-Region-profiler.patch | 30 +- .../server/0018-Disable-spark-profiler.patch | 6 +- 15 files changed, 665 insertions(+), 821 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 04a164b..aa1f6dc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import io.papermc.paperweight.tasks.RebuildGitPatches plugins { java `maven-publish` - id("io.papermc.paperweight.patcher") version "1.7.1" + id("io.papermc.paperweight.patcher") version "1.7.3" } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" diff --git a/gradle.properties b/gradle.properties index 4d1fc22..11a56b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=dev.folia version=1.21.1-R0.1-SNAPSHOT mcVersion=1.21.1 -paperRef=25621248d3f30f35c3458b4b13a2474ffd0bee0e +paperRef=14a48cda408dc49db65b345b2e02cd71d9a7aae9 org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch b/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch index f992d10..77c6b43 100644 --- a/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch +++ b/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch @@ -14,12 +14,12 @@ more helpful than some random error log caused by a breakage. diff --git a/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java -index bcf91d048d84144f6acf9bfd2095df9ada2e585f..3072f95dc1cafb47c1820dc67c8d24991540fc4a 100644 +index 3c768d5ccf490e962d9638e92d4ea7c85670bad8..2dbc9fc268850c85e4e8d38da05586a004862c76 100644 --- a/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java +++ b/src/main/java/io/papermc/paper/plugin/configuration/PluginMeta.java -@@ -200,4 +200,12 @@ public interface PluginMeta { - @Nullable - String getAPIVersion(); +@@ -183,4 +183,12 @@ public interface PluginMeta { + */ + @Nullable String getAPIVersion(); + // Folia start - block plugins not marked as supported + /** diff --git a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch index e47a0cb..a6cb57f 100644 --- a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch +++ b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch @@ -11,7 +11,7 @@ the schedulers depending on the result of the ownership check. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 419c056faf0d49d9b0435feb01252e87e227b9a9..63eb35aebc4551355ea1ea5cd1305d93502f0dbc 100644 +index e20e4239a5a1f952e1c70e899549989d5e42f73c..60ac226b58981155649b7d67c11385a0c105eca0 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -2916,6 +2916,14 @@ public final class Bukkit { @@ -30,7 +30,7 @@ index 419c056faf0d49d9b0435feb01252e87e227b9a9..63eb35aebc4551355ea1ea5cd1305d93 @NotNull public static Server.Spigot spigot() { diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 5aa64ea39ebd92e5067c53cea49a8685c0b9eee4..8a7ba7d14f20b8169854daaf26e8f4da4563f166 100644 +index 6246251caf2c6f025c824b8e7a944b8d48751fa1..10f6eb1756de71960f1c0565366d5f262c7641f1 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -2554,4 +2554,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index c61fc4d..498d298 100644 --- a/patches/server/0001-Build-changes.patch +++ b/patches/server/0001-Build-changes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Build changes diff --git a/build.gradle.kts b/build.gradle.kts -index 3588770a9ea6ee0a9508b218758650f43d994715..a663cfec76f4deddb7cf8d2f134bedfa1a3cde66 100644 +index de0474b8dce58cb419c00b7614d7dd66be832a02..c2f2ba1df68e9823c56287f1bea23fb6d6a781a2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { @@ -17,7 +17,7 @@ index 3588770a9ea6ee0a9508b218758650f43d994715..a663cfec76f4deddb7cf8d2f134bedfa // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -84,14 +84,14 @@ tasks.jar { +@@ -85,14 +85,14 @@ tasks.jar { val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", @@ -36,7 +36,7 @@ index 3588770a9ea6ee0a9508b218758650f43d994715..a663cfec76f4deddb7cf8d2f134bedfa "Build-Number" to (build ?: ""), "Build-Time" to Instant.now().toString(), "Git-Branch" to gitBranch, // Paper -@@ -148,7 +148,7 @@ fun TaskContainer.registerRunTask( +@@ -153,7 +153,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -127,7 +127,7 @@ diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png index 8b924977b7886df9ab8790b1e4ff9b1c04a2af45..c06126b92e36566c93b901637926703bbfcc42ff 100644 GIT binary patch literal 36428 -zcmV)lK%c*fP);WtinuKj$t4c@tAY?f!f62s6;MC~ znNkH6{%4hvv=wF*(`jJlm}#XowOPBrp69ve$2S>_KnR2`;q?1DZ~)Hv_k9kBgUgr@ zLI@#*5JCtcgb+dqAw+LqufauxkTAGcZ9Bes^|l{36fjN*fpzp%39^xH2qSzrj^@(84$Mh|k>J_NC;Ly=6UHXuVu#{b~ZpbpNVj?N;6dr)2k8$xa|%aRh3kV2sV3By2uK*GRK02oHHq(lgrGT}3F z0%EAZQFI~=3`Pv{P_%rW<#>r@j?;Cw@gK{XKmaa(pbHzMC5~hR+GYb+81tH8F zanGqu``%|>&eAAz{v`+PiLd)h&OYx;S=o6&jb(BUEsS<@>dud{J}Xw{_8<=wLV~0U zav|Y}2;oX#EkXn$5Dik2s5qcDC$4Z-H0-;JeYv=drZo -zLXtHmgpn*|SX|u2(VO4K*2aW7e>Nqs2nZ!mGM5wKif}v}S;Cc(9EGSVDhfb^SA-)B -zw@mR$m=h65hRB4nVVO`E<^Yg{A&}!<&3#Jo84P02oz3}j1*4wpsQ7VH^p;e -z*sid!bQZgIoy+{<0k-eFjFq|b7%y&jx&FNNYhTDe>Wqf}0B*nM>R+21?)rvBOApR! -zXsEV4n4LjOxp?=yo_@s++rDQ`AHMmt{ly*IIOoELGa9sDAdK)p3K_DM +zNRXSBrWs+@0s$iq-0>##KW%^uhyWY`;1&q85yd;2WCjgwJ2Ll5QHSM$LjOxp?=yo_@s++rDQ`AHMmt{ly*IIOoELGa9sDAdK)p3K_DM z)&YqSx>QrZRcYrZ$yHSLx>b^9swb$J1(b5W4X2ng-L;jfFPm}?n1@PhVtqr ziI5W^03s?6Ocf=$2>=&_nJQ9{%?MRyUB{rw7Ct4Hj%@@F-`;cX0Ci2r`g+)%jJYd@ zY|M;}%|o~sk<5mJv5GeO$%(a>!}JaO-#Wwi4`T0y58YMoIdTkw>dr&YU*U@`-OKmA @@ -830,327 +830,328 @@ zBq)Y_UrzM}lhm^PIRFB#2ma}vTKd{uO*4J_Kj`Zc4OO48rwD-Gw*(Xv_UIGaL4*?7e3`t5-R2lSh^xqd84Cs4}W^FDQn9zijsF13M{zVR~<`0dB -z;hww3Rk_uLO*yyZ^N(arMN#SjFcHEi60E_fZug`IjtJ^LVtno=lKj+Jze{_WszRIN1X*HUTCH>C_wc;+D)6YYT -z*RWmTUi`Puu_Uwkj6-qwu_Ue*kO&$%=o%J?6*rej_Ock3znkGIb6 -zWm&yS2Z9LS7slFgUx+?ilDgQBdj7`ruw|IVzJ@wV{&tD)G@SPTMW@9Wl5lcsuU~6` -z7raw|%Or|@Pnlh`7!!rA1H$`p;zz}+92Tp2bFmKDAL`nrC>)<{qBHso -zvJ6|o^vMxL?frh4XZ`3WdH7s_NI0p@{EElbnX*!yp;Vtx&K&w$&to`sW -z79>enm;xWhu;ZKKIN}-h!eBKZM6j$9~*Q(SlE*i_bHS0o#tPY -z5-j+ww|x>h9%`RLUixM!e%f0qVAe5GH83X6?!#^_j-M@lO@*-aD%NMF2;Hg^Wgh@}elrPA3o_&(- -zeNyws4es~%;K1o+pfG(Z!G-nFWzl7)ejRNxY?M~uI=I&MYuz@4>GLH*ptjlQJ`LYr -z*KIIVzBhKHIDwe`X2hc@gsdjzXxX%b<_#kc$vIHFi2)-XM1=fs(`g?0)M{lcJXwp< -zBgIdDXM&n-=+_%;1a?sE$oeN{r%w=8tFfAlQopAk -z%wrVN=r>)oZ0w7^M~Xi~qp6lEaABgF(ck7V3Un;@cg|ODuD7@fw~OZ;^TQV -z$&4AiUj}-4;o`6JV$Y4C2G -z8hVweUdzl78hWzD|&J_)oRr2JdJP -zA&lca);^P(q@hQb9-kqNXVo9An7Q3NoAtyRQw-@JUDD$oluryjE -z3{zzbZhStP-K;xw@Yxf-B=4h(p=4f`k8p2DH$>qQLPR!szD!2|vJ}J`C6=EoRwG^+ -z;`ZDv1SGVO+?IqSxpxSM^_V~@2E+~dZQdl+oz;TP1MX+XXwugMy?Z5AoZ7#R33Y@T -zM)w4;9L0szO3>6i#4fV3q49@wu&`zcvQ!d8!m*dpn&7pp0Y=;QbiyOzhC7)Ki7tDt -zXaIqysWqx53ZgHlO)|YRDG**$7&F{0a8VEECY`3;yx)F>2;4Xr&gC;Iqiqx;orWkF -z8xk0Ty-mK&z`^~Fbs#S;;Qd@1ZFJh4R`+H>Wx$xgn>^oka;w9~QfR>rS7lYHG?D#o -z6Jo`Qg_-DP -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 -zw1mJ8tVoSO-(}absB6M8b$Zqe)Ok0$OkaA#I -z48@e8TAlv;PmB6dbP|{7<%qt@Ea>I;PRL4)=M`_G!A40Y$Xy1Mum)I0#!3<77H4)u -zI6c{)TUsy&o^*@2H9Bp>QJA#S8$`zN?+@z^IIQL|VxYEQfVw~Oc}Wq!FS`G2T=aDu -z-DMYe(1$x=331oN(i#yV%?Q)lcY`}FpGRp*74@@$fX%pE+dAGOh5QRhJ&mcaXOhk4 -zLi_pirw^Zws;d9n^#IE8T1ypZDX|crNABquU?iL2;Ql%4Vg5cNBt}OJdbLKnEi|`g2q%v70%eM&7 -z5gdFefu8Ix3n54MC -zW40SGT11ajrrm5AI24T?-2$|VMsU%VX}AMmt>Pr~B}#An{>%QG>_1FQYV^)CExzx2 -z&7E_9c!fpiCLci|F3H*eM2DQQRtQp4>V2RP=KX3ZVw#OXuFxj$VDmM&HQD{*dc7301976VQyI69%EFvxxn>qC&Lo-`%ImvM -zCv>AXKPcD26Z_;m`1pw)uF6Mp=RnShU^yM81!?jbl!v#-kSa#RLhSOG0?yp1YB6Jr -zW=GrO|0zIRSHiH?DYiO+$EpdMkwz#4I6V(J12-W0+dAo4J*?nDQrFI<*}a92Y%1bU -z`RC_4tyg7>R(8{ -zA8*g?PWv##WoF+p0bJe>whg#+(1_+A+)9HS$|n?k;(r=Le*vR;57rn)2& -zEkD8KBSZm#3Drt?t!*#s#>0+yUNysIKRg=t`KSOcSHieiUP0z8F_$tZ(ciPnq_o~@ -z%-{zhbs{i7 -zt~8q8%WO|MF(FE_ye*bl_-@NcA!S9$IMb6x0`e_oNF!hy5a)H^H)5)t(}ek4a1Nc~FF4@f;5aO%aB&3O%B8NuMWWCzYb`d> -zQ-&3)G|5M|pzcLy>pA(p=?3&XKn+v0^`HNsS?M0eb+60BxF|&Y{?>MI^x``)Vp}1V -z;<0N$BUc(0=p=y>zD3k_I~ -zMC>T|rn!T!wN%lqT@ -z&Afsj|04$m&CH2M?F|6yeqb+e`&JWTP^~~z(;c>5;z6RuFKe)%3j|YzeZB9c)5E08 -zvX9?L9%?PT7Vu(RAIXR}s*=I*@Qp<*vA{&7B2uwdBH$_I`33U5di9weG|3 -zx-Iy`1L`R>G-q<+w-{f5qc<7ls}^cT4Y^Qi+meHXFIDgqkt0wpdBZGY?LB+q9&o`T -zd18L5%R+44Ml^UNbEw58BXP#{+I#J1$;VGO`#6Grd<=RWgP+T+ktE6H^>C;%(}szj -zK;wt^oW!yG4Fz=zm4zKw@$Wdo`VJm=879kp$F&$uMP_qiKSB4L@SV)g55F9Rb=3ocrK>iqIRR9n!X0Do*Ldi{9M&^sg&T_TZz~>`tbXc$p%%BI% -z#MahUA?U0t#2ZA4_41*w&52#TXU^_G4)$#uGOnpIb{Gs?Bge_xP|beH;cUSBec^gk -zu;a`And#3j5LZ)LALL9lQ0{$A?tzx&K6M(;#M))7n&`7KTkT>KvjI7O4?mTa;X`81yn7WAir6 -z^Dv#2{~#3{X=5gyP*2v`3yoLJl)--n2rC2}*3n8(L~4ohHzT6QbyEu{!K3q#&p9Lp -z?3#RrZR0JWoh5V%Au%m2?uSB&RO!i99khjDd#7P;NaxJ<_f>mYXQOtXqBZifoWn1d5WC&hmG;&Gv(>!l)|)selJ-m-pz9Og@*rA -z%Xl~n+gHI_Rjy513U_dEaq-~ZLm%H7RpVbREoW=Zu*D?n%JFyy6(v}{RCOy -z>_wu--o5bv-4rRuWG0oN3a2+(f)C6nR0%>9HdI1mB`d{jE6Q4vSf>>{@~N-bGMc6~ -zn=1MB2?XIjZuOC!s@-pN5{60UUw-L4f1L-3Ohud?4)I$4Y&#w^A*ij(1$$3|Vskv} -z#YKCOBnHKh5QN8fd|k)wI{^HZj_1!`{L&>R(m@P^tYk*J)5>eCrio9{j>kWLDCGrM -z*O<)utCbjQiH>aHzD!~>SNyzV|B?uyizaR*!v`(g6N5ks=aSqWHk#wzbQOx2Ehc(>s -zfl`oSK+EzLOKDeK?n#pu;5qF1g-8bXyN##%K`x2R14CxOh8w&P-kz4U}>3Q=A& -zwAa>sCXe?|fR^Y+S9_jW;=!_GK`1Bc2HY6Y)*s}A##+#}239~LV&Q~wL&4n_6^@vW -z;nGUYJ$5-C#kJr2EtD&Ty$t-H)#GyT->}39LWB1gdo%LwqR8{YbRBL*-FCEc5iY{; -z#TpZ~y8yolNKuWi&enqz%<*)Y)j#ff)9q1ezkI|N7|zr3b=T|b>+m?)d% -zKJ;1@L~w8ZQn0MxZS*{ew-;Ohn^Jl!+U{m|QvgB~tai**t#d>0E=CMjN*SZ+36QnO -z4NrSN!Cd>9SLf?=!Hjh+ek}c}ND_U`vvi9(MS>7nGZ*lPm%4(7(bhfuTHod8y%;N{YO_KMV}N<7D)x5snD;XG -zzCOH#WK2$4mAvQWFCCZW#F8TRInJ+=$6eR`V~dES6+!6-=6lkVCHyCW^Bb-$@=b%3 -zi%hxQwAp^EOp|zR61~UikJsM89qE@P3@X5J>+K)hO6K`Z$80UqhLV&|mVt3wQ#G4H -zi4>T}s*jr9pkN+B@=LbuMW8^kzEFQde*yOdnXiUws9u#OD8dYzm?0F`qCm7pBCNNz -zOJB@PR!5?2&9Zw_Jg~i=TwmStKiYq1_@$ -zZKB*^u}y2o({7rV#Nl+8$2T5 -zthMF3X`+*;4Q-~&-*4NzrU=7>#}h=jB}<^tsAch7Ac~Vq;V7 -ziknpCHOP}_P8F&VE%6e`WG~EVa?$ra`knKZrYWbIZ_w@4vO+{B!(Pb&!YhY8pCfe= -zjxF8x>Zh3;#gw`fu})grVJcf=Ohg_Xc9m?(57$!NXQ#N%;Q{V}EjtmA$m<@Ie2(h2j9T2Xq=0<2R#daW&$ -z85=lCIqjn+?h$SF4u|?#DOOKg9>2c{9GSdlh{<(WR;Mb+bxH>u95roevUiqSmcdG* -zEL`{Qv+mA#hjLxuC*l?ROBgDsPYkDNU%;m09$2^ni=SVA=kS_) -z_h->URCbhQr89T-a-Gg9Dk?P`CT8-=f%@A28AYMmma&Ks#DNDsr^|eI%nHBQ0Nps* -z<{@u^G-9krSD|^{Vm?_nRkW_T!;E*n95To#4sxn;9FH2W%&T043S^Vg_Bk^^&J9*H -z=-^Zd6GYUG(CMkA?hy<&4Tc5fn4$3ys+ZiGw!07qHH1zPDzAJY;{8Oj#B1-LTAZ>D -zKqX)c%j0#o|H%z2zdkxYKaV6<&nEMgP`q%2&v+2dsa++rFeWoOnf$VkCAY6|8|kw{ -zdwe(maC?oeGlx#HVClH?)W&QZ`+=l3PIeQ%9cb~nWxJ9)YD|MPt`v?0-3bMcbZ<2Z -zG7xSnH{QoOr#C@?R{C$168|JMfCxcPAVuEhewgQpYO@AfbP3Fw+|Vi7h~L@$6ydj5 -zyf7_h9Rp$0Gii0mkT9xddqw>hIVCXV203~$D~swIj_)TV=zX)@-tK6Hb66mM;EywH -zsMV;{!i^8fvae3b)iz7_f6$4yU2i-b%Bh|o@eU2$RD^G(AtWlyl0^8dxd<9 -zCi_xU0%&wFugtmc%-uOk=xMY?lR%{7BQRZ~b8}1<=DQI)v2*#3|70VNVV*?SK4O}0 -z-HEICfCoyTwy@{F=Ac>4KISQEgQLDcj|>j}hzn(*RSn -zZw&u6!^Z2~7ae&u`+{IHYm_vxJJ@RRZ!LoCjQ2ecK6E;AqeyJZxfuAC -zaFBgBIQO4DawgA~vN)BCS%`;S38kn@9kWOTMq)$V$+z&4nDQvH*{(1#N58$C)v2#; -zJW|ch#FaXRBNNj6mX)HNV{_ScADWB7#Jn(Th}B15lvrI|-2fj-=SL1AY -zQrI&y#`tyxRIyenc$G7)m}|d;5&h;8q8?ap1~7v{vEXIAhojO|^XI$6=K!f+>;5yx -zJJXiq*Z?mW;Ak{?4<=)9$$a@6Q*=1_%}Nx&bGA3oqS%{I)k3y{#DALAzrPw)h(FU -zj}8a8Xte($dBpT -z_ZLeg50aO#zhmy?M*+dS#c4NyP>CZSyS+OOi>@2;)lr;&A$)(OEO;kV+bz6O57by -zyW>9>Ij2^Du|A83(r~$46%S7?Ancv(6R -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 -LFIp>X81%mY^Bg|U +zcmaf)RZtymu&!}kXmDLfg1h^|-QC?ixG&s2I0Sch5AG1$U4m2?7EFMOsQs1p)$M^xuU52LS<5tyS|A0z!B~T1;5Y)8HZp +zUh9YE!*I`C!>au1!lt}?^7%)ymXa9F0E8%U6cA@Hs@r2|t2YjT?MMEK&sF!xR;P(1 +zJxFf8OgT_&`%_^18f74-j~9B>_v*F_4QG7P$=~I&{g0k-!dKZ;dhG_Yv84aKQ7`JU +zJ^ehid=1+b=_P#o97{5v??~H!^zyIS&U_=f-+Z&XS28Q#IuJUNE}ApzE+z8$!_(s%I3_!)=jTdGmXzz2p&3&czvSwVkj_PR|SM`xDjT-m<)@wFKtJ!fY +z+A9f&c$RQF&Z%Ui9@S9nRjlxMs@)Z5_OxNu^|5JS^tNFPeEv!Mp+fj^Yc}Scf482J +z_jv2_UYgabd?1AMePOH(|ApkUIjM`|sON7?4||4r>}#l#)Nj}LPNV67U-a5cAqgk9 +z4hA)b1i?G`_{?Is2NgH3=G*Y_oV4G*#y>w?4I7fSpx2h|vD&hsqdFVmofnVkNpM8o +zEDOkF7WVse0CrXXeH^X&Y+X5Ugeg(@8XVq_7ngH%kQ4q8to@(w`VD%+t{VjBlZzMA{89 +z;%$e2aiD==VT$}%!%lBbY3xicyog$jB!Djxd7vpR6bXArR{Oqv(5MfWsJg3Yy +zcUpf*M1f-z9ik)^?H|-}` +zxbJl0Xc<(adaW`;Xc^eA&$kJ4EZWH)dOO+mFzw;MBfNjA5<1ZP>E3RWzD|&L1WdK! +z2k&T-AdM3|);yD$reQ{x9G{_#6R5f}9%tdjf-W#_wS$qa(*X;ot*Gkja`g1Q_eN^= +z`0%;Ho3r-6zU-m(+)f%v8KxzXfn20UBXua$j&hd^L+a{0lv^F@IS92IL#!_sffCl2&zHVp_~j(J1np!W5n69+~xPAJ6}_zBa%4jtFt9W +z{@f*=wRJ|ZitBopGm@A{J`xa&M +z)PY`TF0^X2?f!}827nOWNuI-}Ne-gU_A_rT89Qjihq3d_{Ugx}ge|kRq}v@?<-}sM1htR5<=} +zI1L1)$lG(bP|&c#@>`Np6h0xGHe-S%SWq_O*_rH`M&)M5xj9Un#*HS!PqE5 +zISo-XF(NX8c$<8iK|uH&>qt?Q&-b}D+Tgr7t>MFp&WJTZFnPZ1>|RTVqu7iauEwTX +zVJi3CHpH3>2eq__Ox+k#@Bzl=K|7STdhX7MT{c8Ce71~q9Y&PXH}*iaRuCUgMZj4H +z)QyHub +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 +zAbfu?@{0+Il12eRII46kiNKmt05>iU=h +z$)Irsw!hHw5wf7*gjxln_O`c8!(m4}pSsbqKLIVrd=!}5jW}+WPlzQ;+_e-& +z?Dy<48J&+h3*@LUmFxqzh_g>rb^`iEl)hiDf5($dZZJpaL!%i&d@Buf3+M~(|w0IKfQ +za3X0Srk%nLvE~Ab9|gBtt2_H<(fw_Zha@}t^K>=dbE+8{uYX2|#N=bmI)Wc;T*rwV +zwd5A@i2kamPB6hHF1AG?W!pUo_~vz+3wdlN<%QSGe!5}^qJ59h?#udS@qUf7 +zv-9ZWcl%ZgYEV62Ov?klP4Ypq+COVB +zzbpQbKJ4p#FTFlCeU?M~M)FWg!L^__)A~q8ym6&0c0f4_^d1Qsf;q;YQPHwFTKQaY +z@}^_vfdLrw7oSN5$O~22BEUPFgd#kF2FBsIH_Toz2Nw=v^=tZBu!NT|Lp7qp(fZ&&7q@7C0rFJD6; +z(%|4PztN>6GF#&@{I1tbNIIaALQ8ulFL8_Y1vGk-QMPKSZe0HpMtxgqkoct%kuq`w +z#x-}Cb*!ytPr?%+STtAMUu{{K-N%@g062$UWI7UOQm3=mc9wknbhD2qEj-!b^P +z%oYhuwx~lumz_3B^a7bYyyq-71@Fw*7ULPhNJocwr5CvLRsE<~sh>maF=R1p!hO** +zh+7MfH?17kb@`xEls`270@5OICG>$(UstdYt%lJ^wwiJK8I1@$5SE2?UF-^CtL8@; +zs4{#zGZBM@8f^QW&S9I{2Bl9>kdJkdQs6??R6c{5q%l*?6D-aNSM(>Zc4);q<1&7n +zVSb1AZyvYG&77Xtb`dpP1hGZw+U_-uc%-;be&gSUcbi*hJ9V!?LnI5O4d&1TOrlrE +z11&b|=uC!5&O5GB^zm!T#ncJ-bmy8|`YuXV_zy3)jPFmR0m +zFLy&N`z42~p5XU|+fn|GAIE2AfPi3JbxB>QXQ+7$3m_ug7v}~qfMAh#5*_)0mSKO^ +z)R>_thix1PNC=^T>X5@o5Ik^s!>_0nb%0+Qu?l@fMu||fRMI8(eq@a06~$a6goXp4 +zTc(!CW&GU`Z?7*~C%0!|`Po;Y-B>bq8(=^Pt0w>CW3cOKf|^OmN3o|I)zb~mlpR!VZRWgf3r$DjB6U@% +zJ!v9xOZ<+LBarT*ahaknq^miC#W^ANPQ%<$&RHDpEBCU_M(sbvsugC-mYh-fO{Sw9 +z2eEARzci;On#5;xRA{kHL-zc9^rxh(B6&XXZ*i0bo|+5(tR}B*i$>CjH@i(J`<5N< +zm*!QawcKB`2qVVWN|!2bmCj+qMz_>lyQe41Uc6GYo8|ZmgRouOWH<`fPtitAzEwsVe{gYe@!;OmfY1hA^J^GP2Zh7jc0#tW +zV;K{f-a2?ll{FjAo&kmu**_ByBXvrN+H7%pUgwrk*v>}T<%nfg$(O1#f`vAf;$Wwj +zK4OU>ekZ7*cXG`zK^{1Jk?6U1Z!$nXMaDUqNo}Oc<%5yn3pWZ=j1+|nlh9DXMmgJp +zw$>=#X^n__>Lz7RpGg`FbOM{jMF-I&Mx~Gtq{nwcJ*VwE0OFOdSNksknPO9!AjUy9a^u}; +zl{GfA#HVPd@8C*|vf;gcdLXrJL?MukrGr%c^ +z`dR^O=T^5*G@CU0fpX=d2?dv}l#Z}rvrURI+yrK9#ndWZg69>4-LW#tEa5!`s{Zgq +z8R@zhQOojaXAAXjJW6}a5>uV1LhgG$u5JQ_EBF0C=A-S5S2BuoH^CBy68!ST^VMKp +z5t!x0xnCI*Lk$t%?=aM?bAC5Sk&8&Qiu@hZj7DiJ;6#WZd1Z764c#+#;>O(U9%lfW +z>suxqZ)SVz&lYoFmEAcgM7u2vPU$2e-Hjzv>AJy1PeOk$DMk`K`~^i^seLl#HX2s@ +z&vS?_kECyji(-+eKdk1750r)$2U(RhTgkZT@l<$kC`GSck-TzG(h{pKG1aJhxkqgZ +zItykNw;mTU?xiP8Q;PAKW4yNPGkd;&0<^_8y4rHh6AzZ1@@Og1z$t3+RoVK`LOEWpvj)dqZ+bn-ZI_R@g2TDm +zUOXS$8{AioF8c*Kd%YqEKoqkyqA= +z;h>9H=F|lLAffO3sj^3_YLHV~t7o60Afgf+&g?fx9El~tAP}$YS=MFe#gI{HMPF+3A4XgD2y6V7pZ8*{ +zm8;APEKL9wC2F|aO=CXGJo^TSmQpb}X_X3Im%nsfn-Yr)Ip(;&N*#Ay_m3?ila&Xh +zA6V?kP!$WD1kP``H7hg@QY|w7?54~1UuB*oXqD_ePJg`i3GPV0EM`;%joWPh;8C{7 +zYdmIemNAl|da??P+nTE06i%eXK303w@_~!CLz4QEZFdnUm~0^2U*Dh4GePdBsTQhV +zsihVr6*e(LETK(_Y=c5vXJenfn3=4BLe-LG|E6?ccR#tlx)pG=|6cC;SaBt^!li5R +zcPgX&c2MsDL}~N-O+3=a0$|oiwZm$c)<&SyI4_0A@|JEcP=7FY3^?#Of0zNSfD^&A$%$p{mSW|9&i*6 +zj(_qDpxvBQ=^ptttH-vj$9~Va*80<33lpe5w3*6)d5BABGb>2&T7!J8KM%t$O}n*W +zJo+7yk8gR<_bN{XJ|u{lon5UfZc>HMFjulERk&KL*jqG{qadfz)xhuQcg|aymb_Y? +zVYhel3JJX|M+K*)DQMX1IZ`*_*vfscZkpLiT)9gL=cKs}uA(KzRP<4d8#RxOLcE#D +zJP9@OB>kt#JaeOXaqm4Kc^GYiehxcy4(-(f*^`-a9<3OAl0lXjMU1hK=(Co4O{$8%UM|E#&*;l(B?QsiT24bqlr*B{Z7V`VuFjMMHlGAysOT^==1z=5qZQ_2R +z-1qLb)#p6A6j}B#jg`CWg~=F5uJg4=mk4 +zMbEFlbNEc>OXUCT5piF*6@<3E+@D1YQ`=LOmdxBa$alJ^s;X9Vnwl%91RCi4CyD~~ +zEfY~;r~^+zF4y_)m=yu>0s3+B%|pI?8RS^ct^$kP#XRzE>S#R+#~GhIc~p)Cii4cW +z9H*m(D~n23;e5HIw0*7&$Qv-cSkS?#GB%E4^9a4Zdg>n0VB=s|P>wkUFR@1Py;++p +zX;6LW6tT+67ZSct6f1(Z{;9<&8!$Q%dsr@?heJCLyu$kE{QNwMcpba!S7M2R5q^_F +z1m`x@%z~KAD3f^-kF`7BW3BU>kYEeLw+hLBNDUxD$O}Z7ySX3c +zb)wd!i4k24wW1_C2@tbyw%f-8qhJmP`&caiZ`w$^LAjZS5Sn#m^9yX>OCkC~g$Cc7>RooBAs^cU +zIlTk#)OXQ82-Til1rliQ85sNCA>X3OzZ4b&8XPSua_&2S?i?lbG}vKCBGdB|nXS>g +zJ0*+o--w^syM8BpvQ@ycNTP2WG0U^*#8-MC0N=cB;m&`}!LXiv%vI8XM1O%D865l( +z{g6XRuw=jeOMjz9WK|@yzj!yA9i}KA0|SHG1bi12L)S{x7e=_kAN~FN)m7xbSP^arS9Rd{|t-bdQUEl`8{54zNMvQ +zmVu~1GPeH>P7JxwZV*CX5cIQzmo3E{siDMziZ%E7Tl9Q4KN4`#}D9_*vX?k}pO!=)gn7_4Bb4bJT +zqDaOnV(7U1_j;to@cwADU9mBc-@BdBUmAHSzyI{7YGVPi_y~b*r-e;$%CQnDe?9;8 +zfw~{4mSb>(|FgeRQE<@@i1>JZxfuACaFBgBIQO3(xsqo~Se?tnEhWOPgi|!6k69%H +zBXMEw6q@;gX1q%5b}P&*(QhwjwHm7%kJPg>aV1XSsKm6t<)rE6*j;x$hUQ|hu`kT) +zV+}ADC0AEh_W-HRr1Y}-%^FExK~@Y^t(ANZuuEJ`p#^k<`-MWnN77L2@X=9jV+>R; +zXOQ`#-WMm65hugihkOgXY4OID(WpNU{=B$ZDs8X^hCKKCdranviTkKK>$2J_;-Ga6 +z>WBEX7GD$0K(CoP7J96eYCwj_U5&HrOXJSWm=N0MQ^#7X5>(8zV6XiWLH3_ZhnV9@qF1Eb95#jw+CTK +zcnC_X6?w!ouwb8!t?ZeXbU*`_*tn=L1`tKaPq~o#XH-LT(pdaeEr(+5o7_BF^YP^9 +z=s=xqrRelm)Z^rj$VCV;RnXkG!NaMn=)gAL=kN77LMYwzIqFtY;-;Q!9U{UKkl*Z; +zxmwdAck=k)YYlsT2UM!0spVa*x7IFL)Qt{!?hIJJcZxQPc`eiw~~Oj@Tz_oM0xtx3Lb{5kxu +zyBD?uz>WN#g_E*U&crG80;MCX-DnFuJuz_nIeOw6$6c?&s+F|L2zU?5G!ekeS!llo +zFPgW-3Pcj`}O?5W?ab_h%Gy97f=v~(o +zy&qFFhNcAIGR5-l!~O!ti+&6tBv?y$VCZ!G*COZC^Rd=v3DD{VK&YZV`0rM0q-=5@nOTtcx@ +z-`GfyVTF_)=xoTY-xG)BHAl-#;@k>0Kap5G)B~X77JGh`U;(W#+Xleny2|+?3X~v9 +z@j4(Oa(GxV=hv@n1U4Y(PY6pg$c&Ot;)efq)~zTw>;uHy`pS!hYaNUHxEYhbgRg4R +z+}+}7o`g)4OPEQ|;tiYeawTA$%HmQyClOH{QqjoI$3uxnpv;6|Hoy*8NC^3e-^$N* +zqqby_w*0S5T>t%`@v?z_`@m;FByBE`COSJ7m_~uq^-Bim*HTzq_chCA9jeHpXN(2n +zwRqW7h)`1w=SY~Q#F+#wWc43wU)ql>D-{W#MMi*+Rc<(sqj$1IsI?*Vo~~JX4iGFY +zSjVn{Ia}(<$;mhGkK6li&$laGUX5+PgyS=U#yks+rN3QUeb1{R0P)Mr;duDNP0Yns +zOl80yG--mz(9cLJmrW%6skc}}J*KYlL*%B2MMfm>8W3{uoeA1tCC=;U0l+}4z>%rz1`1Gu3qlk(DUqGWSub-M#qTbUB+d9M069OLgJ6ct8Id?;aM)g-r9s^V6BrQ}Q;SCiP`udh7DC +zQX$nG;n1i3pom{#4@R?{E?z&>^3sL?I2rH<%HigVl9la73e4N^TR>PE}F +zsi3VDlCxI}2NOm!ndIQSbW~gNZ4rN(jki^a>Fbq! +zqTN5 +zzb`nx8&_h%Jrt7lQxR^o;6yE0jUGfj6BHagGKnEIbC?*Yeh-mN_p6 +zlPomN>R(3=k&0Ki-xElR=54S +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 +zqSFt2_caUMO6L4Xk>1Be-C +zNHX4bgVd8eU&h^$7@$FnL%%Qp$e+fZ(4dAotr#y7!RrZ>u)-F!F&*jOE8kA5rqU|| +zkg!kLmDxaol3FWgZ=YGJwHYE#cf7j}8z24RotEJKC)?r64}@x}^89m-1nf0~ +z*_bz@JP+Ml3hd*HWuOR@sNVh74L-Sw?LaYKwKo+rvy}#|aFc!~jT1o|KFR)cI+)Bn +z7Gg?S>|0zfR!%gT?WBBV*!!8j6W>|lJse7F&5>m#;ooWbRQhP@izf8nK?3n;AClTI +z6#M340iQgXluMzeY19}<(0FQ=O$wq@ql-?Y9&<2A-S>4Nw#z1Z-(eOaL`iCMI&1sAHP4i1wfU%}{TH10ti=qYU +zDz0-eM;$$6p`VP-jrsMCM}MB&A!(m3WE#f9F_{oZS)?8^0-?^g11w23S(X*2v9^k* +zKU)$N`g+?WLff<~UDFNP<{vgF`ivNrY!#|!D3|%nvN;axyiKQdEH}n|UAvW!JH2@P +z6TzqIA6}zL<{b4pMQp)4ffz(REKD*y3@}3^xF7ui{>6upo0Tm&dOIrt&>JXx_VQrn +z?-nhZdK!u;m!%$urT+S%i$tA>aj?l1`%j#jH%{|kdYyAos^NAM25jH<6TePW$nes= +z1!HeZ;$v}XEv4u4(RnINU~U}A*?wwCqU9m|k--nxsx^vf5AeRn$pVh?0Mnuc`C!uLu2;Vg{7)wfw`U +zX;*Wa;BHUq-TwcZ=lb=LAJ!W;9=uX-aQwln)6svvPf%SQ<1JdhQIPpzpQJ_KDid+% +z!(xv_|7G`-+M9p4uk#~(Mx)cG<|di_EPs|%wf~Qb+;nQM%q9N4&z7FNB6Z+G+^+MR +zj)|=QD8BER{dSeRdtd$LH*1N?VC!qI+*y}-;)|d!tvt|0N +zm5Vlct%>!zH1~C#{PXnRXO%R17-p8ep7o3QUvcWms)tYH$`9TvKIF>&@BVzZ?VI=h +zpErH+ydwvGOs@R*Hs)&kpXVngrCvTXb;0-d@xj~oPM7_l|L;HY`3dlY6p$IBU;poR +XXyugpZ1#qMfq}u()z4*}Q$iB}^Bg|U diff --git a/patches/server/0003-Threaded-Regions.patch b/patches/server/0003-Threaded-Regions.patch index 4be9f43..4e525f0 100644 --- a/patches/server/0003-Threaded-Regions.patch +++ b/patches/server/0003-Threaded-Regions.patch @@ -973,10 +973,10 @@ index 9f17170179cc99d84ad25a1e838aff3d8cc66f93..780c31121ea62d986fe6918c095f6179 // The variable 'k' holds the maximum redstone power value of any adjacent blocks. // If 'k' has the highest level of all neighbors, then the power level of this diff --git a/src/main/java/io/papermc/paper/SparksFly.java b/src/main/java/io/papermc/paper/SparksFly.java -index 19ee43e1ca053574a0151b4c43b01972183657e6..c7c396a7a94c35d973eb0796f8aba6e669ed5b7c 100644 +index 2955b7ec9832a5752ea4aff9fc9d34ae2f9ee83e..19c4aa20617f555d02f9c1c5a93b7204ab7251d8 100644 --- a/src/main/java/io/papermc/paper/SparksFly.java +++ b/src/main/java/io/papermc/paper/SparksFly.java -@@ -46,7 +46,7 @@ public final class SparksFly { +@@ -47,7 +47,7 @@ public final class SparksFly { @Override public void executeSync(final Runnable runnable) { @@ -1120,10 +1120,10 @@ index bd68139ae635f2ad7ec8e7a21e0056a139c4c62e..48a43341b17247355a531164019d5cc9 } diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 690086adcb1f87adc0b3ab664fde735ad3e1093a..155ea12a82c94e513fbb6090b209b14a8df5ef97 100644 +index a9dd0e5216e95afd98fd2200d110e2cc0b1b0dca..a7757603bef0686b3f0debe4a94602f27373534f 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -357,4 +357,18 @@ public class GlobalConfiguration extends ConfigurationPart { +@@ -364,4 +364,18 @@ public class GlobalConfiguration extends ConfigurationPart { public boolean disableChorusPlantUpdates = false; public boolean disableMushroomBlockUpdates = false; } @@ -1143,10 +1143,10 @@ index 690086adcb1f87adc0b3ab664fde735ad3e1093a..155ea12a82c94e513fbb6090b209b14a + // Folia end - threaded regions } diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index aa3624fb8aaaf2720aaef7800f537dd4b906797f..aa0f756aac5b9119aaf0070095953402f82bbbc5 100644 +index fd3b1c10695634f65c7291016bf671c084bc4d57..412f75af328c65eaccd52570915289d6d411b6fd 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -494,6 +494,14 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -497,6 +497,14 @@ public class WorldConfiguration extends ConfigurationPart { public Chunks chunks; public class Chunks extends ConfigurationPart { @@ -7492,7 +7492,7 @@ index 2d344df35d47b4b1ecddf32ccaa4dae41e5f58cb..8263a1134582675e67afd5ee07c6d3d0 protected CommandSourceStack(CommandSource output, Vec3 pos, Vec2 rot, ServerLevel world, int level, String name, Component displayName, MinecraftServer server, @Nullable Entity entity, boolean silent, CommandResultCallback resultStorer, EntityAnchorArgument.Anchor entityAnchor, CommandSigningContext signedArguments, TaskChainer messageChainTaskQueue) { diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 1d1e76de60e40224f5cb81893f9ee50fe987badb..460786301818da923664057c4cc0f5a76fcddd2c 100644 +index 5af48400f87500166dd889c57a8df0aadb08d43d..442a5b557e5867038fcddf597951584faeedda80 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -159,13 +159,13 @@ public class Commands { @@ -7587,7 +7587,7 @@ index 1d1e76de60e40224f5cb81893f9ee50fe987badb..460786301818da923664057c4cc0f5a7 SaveOffCommand.register(this.dispatcher); SaveOnCommand.register(this.dispatcher); SetPlayerIdleTimeoutCommand.register(this.dispatcher); -@@ -507,9 +507,12 @@ public class Commands { +@@ -501,9 +501,12 @@ public class Commands { } // Paper start - Perf: Async command map building new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper - Brigadier API @@ -7829,7 +7829,7 @@ index cb308808906a8cdb127df8284e106e00553473ca..05bc1f010b50e673e9a185d96e338bae } diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index 3e550f8e7cd4f4e16f499a8a2a4b95420270f07a..b0136591a37734493a310332b1f56f1259f913af 100644 +index 4a8356a714ed50d4a32bcf046a2e16491bef014b..cf160825199374f2c99ac200b371da95c612043c 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -93,7 +93,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -8089,7 +8089,7 @@ index 3e550f8e7cd4f4e16f499a8a2a4b95420270f07a..b0136591a37734493a310332b1f56f12 } -@@ -887,10 +944,10 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -895,10 +952,10 @@ public class Connection extends SimpleChannelInboundHandler> { public void handleDisconnection() { if (this.channel != null && !this.channel.isOpen()) { @@ -8102,7 +8102,7 @@ index 3e550f8e7cd4f4e16f499a8a2a4b95420270f07a..b0136591a37734493a310332b1f56f12 PacketListener packetlistener = this.getPacketListener(); PacketListener packetlistener1 = packetlistener != null ? packetlistener : this.disconnectListener; -@@ -922,6 +979,22 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -930,6 +987,22 @@ public class Connection extends SimpleChannelInboundHandler> { } } // Paper end - Add PlayerConnectionCloseEvent @@ -8125,7 +8125,7 @@ index 3e550f8e7cd4f4e16f499a8a2a4b95420270f07a..b0136591a37734493a310332b1f56f12 } } -@@ -942,15 +1015,25 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -950,15 +1023,25 @@ public class Connection extends SimpleChannelInboundHandler> { // Paper start - Optimize network public void clearPacketQueue() { final net.minecraft.server.level.ServerPlayer player = getPlayer(); @@ -8196,7 +8196,7 @@ index e2c24813f59c2fd075c740ac1842a38f20ed8554..fbc619a132c6ca6b1abab51ac230be29 } } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 23ddd26af762c1cd7fb3920669abb96b3213ab37..eda5f0d099f9f8621de8ad7808098abf6f5cb544 100644 +index 696d075ca2883f3c37e35f983c4d020e5db89d16..9e5c063d1371d766c9e34dc8a6758fb760c164bd 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -210,7 +210,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; // Paper - don't store the vanilla dispatcher -@@ -317,13 +316,41 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); Thread thread = new ca.spottedleaf.moonrise.common.util.TickThread(() -> { // Paper - rewrite chunk system -@@ -357,46 +384,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 ? Mth.square(ChunkProgressListener.calculateDiameter(i)) : 0; @@ -8407,7 +8399,7 @@ index 23ddd26af762c1cd7fb3920669abb96b3213ab37..eda5f0d099f9f8621de8ad7808098abf // Iterator iterator = this.levels.values().iterator(); if (true) { -@@ -922,7 +945,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { String s = String.valueOf(worldserver); -@@ -1803,7 +1877,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop getBlockTicks() { @@ -11605,7 +11593,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } @Nonnull -@@ -1859,7 +2015,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1861,7 +2017,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public int sendParticles(ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { // Paper start - Particle API @@ -11614,7 +11602,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } public int sendParticles(List receivers, @Nullable ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { // Paper end - Particle API -@@ -1912,7 +2068,14 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1914,7 +2070,14 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public Entity getEntityOrPart(int id) { Entity entity = (Entity) this.getEntities().get(id); @@ -11630,7 +11618,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } @Nullable -@@ -1967,6 +2130,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1969,6 +2132,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. // Paper start - Call missing map initialize event and set id final DimensionDataStorage storage = this.getServer().overworld().getDataStorage(); @@ -11638,7 +11626,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e final net.minecraft.world.level.saveddata.SavedData existing = storage.cache.get(id.key()); if (existing == null && !storage.cache.containsKey(id.key())) { final MapItemSavedData worldmap = (MapItemSavedData) this.getServer().overworld().getDataStorage().get(MapItemSavedData.factory(), id.key()); -@@ -1981,6 +2145,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1983,6 +2147,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } return existing instanceof MapItemSavedData data ? data : null; @@ -11646,7 +11634,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e // Paper end - Call missing map initialize event and set id } -@@ -2030,6 +2195,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2032,6 +2197,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } public boolean setChunkForced(int x, int z, boolean forced) { @@ -11654,7 +11642,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e ForcedChunksSavedData forcedchunk = (ForcedChunksSavedData) this.getDataStorage().computeIfAbsent(ForcedChunksSavedData.factory(), "chunks"); ChunkPos chunkcoordintpair = new ChunkPos(x, z); long k = chunkcoordintpair.toLong(); -@@ -2038,7 +2204,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2040,7 +2206,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. if (forced) { flag1 = forcedchunk.getChunks().add(k); if (flag1) { @@ -11663,7 +11651,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } } else { flag1 = forcedchunk.getChunks().remove(k); -@@ -2066,13 +2232,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2068,13 +2234,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. BlockPos blockposition1 = pos.immutable(); optional.ifPresent((holder) -> { @@ -11685,7 +11673,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e // Paper start - Remove stale POIs if (optional.isEmpty() && this.getPoiManager().exists(blockposition1, poiType -> true)) { this.getPoiManager().remove(blockposition1); -@@ -2080,7 +2251,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2082,7 +2253,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. // Paper end - Remove stale POIs this.getPoiManager().add(blockposition1, holder); DebugPackets.sendPoiAddedPacket(this, blockposition1); @@ -11699,7 +11687,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e }); } } -@@ -2127,7 +2303,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2129,7 +2305,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. BufferedWriter bufferedwriter = Files.newBufferedWriter(path.resolve("stats.txt")); try { @@ -11708,7 +11696,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e NaturalSpawner.SpawnState spawnercreature_d = this.getChunkSource().getLastSpawnState(); if (spawnercreature_d != null) { -@@ -2141,7 +2317,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2143,7 +2319,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } bufferedwriter.write(String.format(Locale.ROOT, "entities: %s\n", this.moonrise$getEntityLookup().getDebugInfo())); // Paper - rewrite chunk system @@ -11717,7 +11705,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e bufferedwriter.write(String.format(Locale.ROOT, "block_ticks: %d\n", this.getBlockTicks().count())); bufferedwriter.write(String.format(Locale.ROOT, "fluid_ticks: %d\n", this.getFluidTicks().count())); bufferedwriter.write("distance_manager: " + playerchunkmap.getDistanceManager().getDebugStatus() + "\n"); -@@ -2287,7 +2463,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2289,7 +2465,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. private void dumpBlockEntityTickers(Writer writer) throws IOException { CsvOutput csvwriter = CsvOutput.builder().addColumn("x").addColumn("y").addColumn("z").addColumn("type").build(writer); @@ -11726,7 +11714,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e while (iterator.hasNext()) { TickingBlockEntity tickingblockentity = (TickingBlockEntity) iterator.next(); -@@ -2300,7 +2476,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2302,7 +2478,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @VisibleForTesting public void clearBlockEvents(BoundingBox box) { @@ -11735,7 +11723,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e return box.isInside(blockactiondata.pos()); }); } -@@ -2309,7 +2485,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2311,7 +2487,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public void blockUpdated(BlockPos pos, Block block) { if (!this.isDebug()) { // CraftBukkit start @@ -11744,7 +11732,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e return; } // CraftBukkit end -@@ -2352,9 +2528,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2354,9 +2530,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @VisibleForTesting public String getWatchdogStats() { @@ -11755,7 +11743,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } private static String getTypeCount(Iterable items, Function classifier) { -@@ -2404,17 +2578,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2406,17 +2580,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } public void startTickingChunk(LevelChunk chunk) { @@ -11779,7 +11767,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } @Override -@@ -2434,7 +2609,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2436,7 +2611,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. return this.moonrise$getAnyChunkIfLoaded(ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(chunkPos), ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(chunkPos)) != null; // Paper - rewrite chunk system } @@ -11788,7 +11776,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e // Paper start - rewrite chunk system final ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder chunkHolder = this.moonrise$getChunkTaskScheduler().chunkHolderManager.getChunkHolder(chunkPos); // isTicking implies the chunk is loaded, and the chunk is loaded now implies the entities are loaded -@@ -2494,7 +2669,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2496,7 +2671,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. // Paper start - optimize redstone (Alternate Current) @Override public alternate.current.wire.WireHandler getWireHandler() { @@ -11797,7 +11785,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } // Paper end - optimize redstone (Alternate Current) -@@ -2505,16 +2680,16 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2507,16 +2682,16 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public void onCreated(Entity entity) {} public void onDestroyed(Entity entity) { @@ -11817,7 +11805,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e // Paper start - Reset pearls when they stop being ticked if (paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) { pearl.cachedOwner = null; -@@ -2525,6 +2700,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2527,6 +2702,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public void onTrackingStart(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot @@ -11825,7 +11813,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true if (entity instanceof ServerPlayer entityplayer) { ServerLevel.this.players.add(entityplayer); -@@ -2538,7 +2714,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2540,7 +2716,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -11834,7 +11822,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } if (entity instanceof EnderDragon entityenderdragon) { -@@ -2548,7 +2724,9 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2550,7 +2726,9 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -11844,7 +11832,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } } -@@ -2570,16 +2748,24 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2572,16 +2750,24 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public void onTrackingEnd(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot @@ -11870,7 +11858,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e map.carriedByPlayers.remove( (Player) entity ); for ( Iterator iter = (Iterator) map.carriedBy.iterator(); iter.hasNext(); ) { -@@ -2589,6 +2775,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2591,6 +2777,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. iter.remove(); } } @@ -11878,7 +11866,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } } } ); -@@ -2619,7 +2806,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2621,7 +2808,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -11887,7 +11875,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e } if (entity instanceof EnderDragon entityenderdragon) { -@@ -2629,13 +2816,16 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2631,13 +2818,16 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -11905,7 +11893,7 @@ index 2fe9d9b38c01d04416843fdd48d3e33899b7de63..489b0019a859462756634a144952eb7e for (ServerPlayer player : ServerLevel.this.players) { player.getBukkitEntity().onEntityRemove(entity); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 6c280abdef5f80b668d6090f9d35283a33e21e0c..9f379fd5f3999e64c9b37851316ecd9069e19201 100644 +index c396580a9cfd86ff261bed439bb4662ae88010b5..2f55541136976a8a04a657d87a658b11a1e1db2f 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -15,6 +15,7 @@ import java.util.Objects; @@ -12412,7 +12400,7 @@ index 6c280abdef5f80b668d6090f9d35283a33e21e0c..9f379fd5f3999e64c9b37851316ecd90 @Nullable @Override public Entity changeDimension(DimensionTransition teleportTarget) { -@@ -2365,6 +2837,12 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2369,6 +2841,12 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple public void setCamera(@Nullable Entity entity) { Entity entity1 = this.getCamera(); @@ -12425,7 +12413,7 @@ index 6c280abdef5f80b668d6090f9d35283a33e21e0c..9f379fd5f3999e64c9b37851316ecd90 this.camera = (Entity) (entity == null ? this : entity); if (entity1 != this.camera) { // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity -@@ -2918,7 +3396,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2922,7 +3400,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.experienceLevel = this.newLevel; this.totalExperience = this.newTotalExp; this.experienceProgress = 0; @@ -12435,7 +12423,7 @@ index 6c280abdef5f80b668d6090f9d35283a33e21e0c..9f379fd5f3999e64c9b37851316ecd90 this.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DEATH); this.effectsDirty = true; diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index cc01ead133cc6859ca5d7a1d0ac3c12955e590da..41fe0aeb3b74499ebce944fd43c3b4e9aec8b821 100644 +index ee9e4521079137d7b72194e8789810e7a89b8e75..3669dbb613570feb953178389e098f0eb1376d47 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -133,7 +133,7 @@ public class ServerPlayerGameMode { @@ -12523,10 +12511,10 @@ index 5a8a33638ceb1d980ffc3e6dd86e7eb11dfd9375..67b45f2916fa061e7430c6f3987bdb25 public boolean isOldChunkAround(ChunkPos chunkPos, int checkRadius) { diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..d766bb360eb98bab1e067cad032b54fa6455f386 100644 +index 7174f8c89a7cdcf40ff28f6636ecfb23b13ccdaa..ea99a4e39cdfb4eeebc299030f7768b9c684df4e 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -108,6 +108,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -113,6 +113,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } @@ -12537,7 +12525,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..d766bb360eb98bab1e067cad032b54fa @Override public void onDisconnect(DisconnectionDetails info) { // Paper start - Fix kick event leave message not being sent -@@ -115,10 +119,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -120,10 +124,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void onDisconnect(DisconnectionDetails info, @Nullable net.kyori.adventure.text.Component quitMessage) { // Paper end - Fix kick event leave message not being sent @@ -12556,19 +12544,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..d766bb360eb98bab1e067cad032b54fa } -@@ -132,9 +144,9 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack - this.keepAlivePending = false; - } else if (!this.isSingleplayerOwner()) { - // Paper start - This needs to be handled on the main thread for plugins -- server.submit(() -> { -+ // Folia - region threading - do not schedule to main anymore, there is no main - this.disconnect(ServerCommonPacketListenerImpl.TIMEOUT_DISCONNECTION_MESSAGE, PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause -- }); -+ // Folia - region threading - do not schedule to main anymore, there is no main - // Paper end - This needs to be handled on the main thread for plugins - } - -@@ -346,24 +358,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -347,24 +359,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack if (this.processedDisconnect) { return; } @@ -12595,7 +12571,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..d766bb360eb98bab1e067cad032b54fa return; } -@@ -396,7 +392,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -397,7 +393,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack Objects.requireNonNull(this.connection); // CraftBukkit - Don't wait @@ -12603,7 +12579,27 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..d766bb360eb98bab1e067cad032b54fa + // Folia - region threading } - protected boolean isSingleplayerOwner() { + // Paper start - add proper async disconnect +@@ -410,18 +406,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + } + + public void disconnectAsync(DisconnectionDetails disconnectionInfo, PlayerKickEvent.Cause cause) { +- if (this.cserver.isPrimaryThread()) { +- this.disconnect(disconnectionInfo, cause); +- return; +- } +- this.connection.setReadOnly(); +- this.server.scheduleOnMain(() -> { +- ServerCommonPacketListenerImpl.this.disconnect(disconnectionInfo, cause); +- if (ServerCommonPacketListenerImpl.this.player.quitReason == null) { +- // cancelled +- ServerCommonPacketListenerImpl.this.connection.enableAutoRead(); +- } +- }); ++ this.disconnect(disconnectionInfo, cause); // Folia - threaded regions + } + // Paper end - add proper async disconnect + diff --git a/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java index 880e5c52746e9e3a9a1f42ec6461be54e3ee136c..34c7fbf154c42d07b3b317b13632243a81904e3c 100644 --- a/src/main/java/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java @@ -12677,10 +12673,10 @@ index 880e5c52746e9e3a9a1f42ec6461be54e3ee136c..34c7fbf154c42d07b3b317b13632243a ServerConfigurationPacketListenerImpl.LOGGER.error("Couldn't place player in world", exception); // Paper start - Debugging diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -index 8aff5129f85ab5729b3da2e465871be62d15bdf2..8044271ff01dfc6808f5a3b60be74f6ddeee1e8f 100644 +index 3a9e25b436f366fffe08c3b0c1fce11ed42ee646..ae88c6e2635b1608383f8c74813d723f7c6ffaf8 100644 --- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java +++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -@@ -161,10 +161,13 @@ public class ServerConnectionListener { +@@ -167,10 +167,13 @@ public class ServerConnectionListener { }); } // Paper end - Add support for proxy protocol @@ -12695,7 +12691,7 @@ index 8aff5129f85ab5729b3da2e465871be62d15bdf2..8044271ff01dfc6808f5a3b60be74f6d } }).group(eventloopgroup).localAddress(address)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit // Paper - Unix domain socket support } -@@ -226,7 +229,7 @@ public class ServerConnectionListener { +@@ -232,7 +235,7 @@ public class ServerConnectionListener { // Spigot Start this.addPending(); // Paper - prevent blocking on adding a new connection while the server is ticking // This prevents players from 'gaming' the server, and strategically relogging to increase their position in the tick order @@ -12705,7 +12701,7 @@ index 8aff5129f85ab5729b3da2e465871be62d15bdf2..8044271ff01dfc6808f5a3b60be74f6d Collections.shuffle( this.connections ); } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67e74eed00 100644 +index 064d52d4479727c6a32bf357be8da32d1760e7fc..18d9e92f2fdc2cb25229005ffc08bffe555e0583 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -300,7 +300,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -12843,24 +12839,6 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 return; } -@@ -791,7 +826,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async - // CraftBukkit start - if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper - configurable tab spam limits -- this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause -+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Folia - region threading - return; - } - // CraftBukkit end -@@ -803,7 +838,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - // Paper start - final int index; - if (packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) { -- this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); -+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Folia - region threading - return; - } - // Paper end @@ -828,7 +863,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } @@ -12876,7 +12854,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 // CraftBukkit start - if (this.lastBookTick + 20 > MinecraftServer.currentTick) { + if (this.lastBookTick + 20 > this.lastTick) { // Folia - region threading - this.disconnect(Component.literal("Book edited too quickly!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause + this.disconnectAsync(Component.literal("Book edited too quickly!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect return; } - this.lastBookTick = MinecraftServer.currentTick; @@ -12884,19 +12862,22 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 // CraftBukkit end int i = packet.slot(); -@@ -1220,7 +1255,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1220,7 +1255,22 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.updateBookContents(list1, i); }; - this.filterTextPacket((List) list).thenAcceptAsync(consumer, this.server); -+ this.filterTextPacket(list).thenAcceptAsync(consumer, // Folia start - region threading ++ // Folia start - region threading ++ this.filterTextPacket(list).thenAcceptAsync( ++ consumer, + (Runnable run) -> { + this.player.getBukkitEntity().taskScheduler.schedule( + (player) -> { + run.run(); + }, + null, 1L); -+ }).whenComplete((Object res, Throwable thr) -> { ++ } ++ ).whenComplete((Object res, Throwable thr) -> { + if (thr != null) { + LOGGER.error("Failed to handle book update packet", thr); + } @@ -12905,7 +12886,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 } } -@@ -1368,9 +1415,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1368,9 +1418,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int i = this.receivedMovePacketCount - this.knownMovePacketCount; // CraftBukkit start - handle custom speeds and skipped ticks @@ -12918,7 +12899,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 if (i > Math.max(this.allowedPlayerTicks, 5)) { ServerGamePacketListenerImpl.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName().getString(), i); -@@ -1562,7 +1610,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1562,7 +1613,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -12927,7 +12908,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 return; } -@@ -1570,7 +1618,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1570,7 +1621,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // We only do this if the Event was not cancelled. if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { @@ -12936,7 +12917,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 return; } -@@ -1814,9 +1862,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1814,9 +1865,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!this.player.isSpectator()) { // limit how quickly items can be dropped // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. @@ -12948,7 +12929,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 } else { // Else we increment the drop count and check the amount. this.dropCount++; -@@ -1844,7 +1892,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1844,7 +1895,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl case ABORT_DESTROY_BLOCK: case STOP_DESTROY_BLOCK: // Paper start - Don't allow digging into unloaded chunks @@ -12957,7 +12938,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 this.player.connection.ackBlockChangesUpTo(packet.getSequence()); return; } -@@ -1927,7 +1975,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1927,7 +1978,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Paper end - improve distance check BlockPos blockposition = movingobjectpositionblock.getBlockPos(); @@ -12966,7 +12947,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 Vec3 vec3d1 = vec3d.subtract(Vec3.atCenterOf(blockposition)); double d0 = 1.0000001D; -@@ -2049,7 +2097,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2049,7 +2100,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Entity entity = packet.getEntity(worldserver); if (entity != null) { @@ -12975,7 +12956,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 return; } } -@@ -2084,7 +2132,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2084,7 +2135,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // CraftBukkit end ServerGamePacketListenerImpl.LOGGER.info("{} lost connection: {}", this.player.getName().getString(), info.reason().getString()); @@ -12984,7 +12965,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 super.onDisconnect(info, quitMessage); // Paper - Fix kick event leave message not being sent } -@@ -2093,6 +2141,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2093,6 +2144,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.removePlayerFromWorld(null); } @@ -12993,7 +12974,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 private void removePlayerFromWorld(@Nullable net.kyori.adventure.text.Component quitMessage) { // Paper end - Fix kick event leave message not being sent this.chatMessageChain.close(); -@@ -2105,6 +2155,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2105,6 +2158,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.disconnect(); // Paper start - Adventure quitMessage = quitMessage == null ? this.server.getPlayerList().remove(this.player) : this.server.getPlayerList().remove(this.player, quitMessage); // Paper - pass in quitMessage to fix kick message not being used @@ -13002,7 +12983,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) { this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false); // Paper end -@@ -2353,7 +2405,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2361,7 +2416,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetLastActionTime(); // CraftBukkit start if (sync) { @@ -13011,7 +12992,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 } else { runnable.run(); } -@@ -2411,7 +2463,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2419,7 +2474,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl String originalFormat = event.getFormat(), originalMessage = event.getMessage(); this.cserver.getPluginManager().callEvent(event); @@ -13020,7 +13001,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 // Evil plugins still listening to deprecated event final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); queueEvent.setCancelled(event.isCancelled()); -@@ -2509,6 +2561,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2517,6 +2572,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (s.isEmpty()) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); } else if (this.getCraftPlayer().isConversing()) { @@ -13028,7 +13009,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 final String conversationInput = s; this.server.processQueue.add(new Runnable() { @Override -@@ -2744,8 +2797,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2752,8 +2808,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Spigot End public void switchToConfig() { @@ -13055,7 +13036,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 this.send(ClientboundStartConfigurationPacket.INSTANCE); this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND); } -@@ -2771,7 +2841,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2779,7 +2852,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetLastActionTime(); this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); @@ -13064,7 +13045,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { return; } -@@ -2915,6 +2985,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2923,6 +2996,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl switch (packetplayinclientcommand_enumclientcommand) { case PERFORM_RESPAWN: if (this.player.wonGame) { @@ -13077,7 +13058,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 this.player.wonGame = false; this.player = this.server.getPlayerList().respawn(this.player, true, Entity.RemovalReason.CHANGED_DIMENSION, RespawnReason.END_PORTAL); // CraftBukkit CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD); -@@ -2923,6 +2999,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2931,6 +3010,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return; } @@ -13095,7 +13076,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 this.player = this.server.getPlayerList().respawn(this.player, false, Entity.RemovalReason.KILLED, RespawnReason.DEATH); // CraftBukkit if (this.server.isHardcore()) { this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent -@@ -3475,7 +3562,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3483,7 +3573,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.filterTextPacket(list).thenAcceptAsync((list1) -> { this.updateSignText(packet, list1); @@ -13116,10 +13097,10 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..804166bf2da81927ab449811be9fcf67 private void updateSignText(ServerboundSignUpdatePacket packet, List signText) { diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index b0f7a378f19b9837c060c891002cd5db756cdae1..bc9956d36ce3adabd50dc4b6467a0fd24386e4e0 100644 +index 40638b439966619e9c70a18a32abd95b2178fe9f..9451cccebf7acee3bd9f28f4f9d60412d1554ff4 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -106,7 +106,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -111,7 +111,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, } // Paper end - Do not allow logins while the server is shutting down if (this.state == ServerLoginPacketListenerImpl.State.VERIFYING) { @@ -13132,7 +13113,7 @@ index b0f7a378f19b9837c060c891002cd5db756cdae1..bc9956d36ce3adabd50dc4b6467a0fd2 this.verifyLoginAndFinishConnectionSetup((GameProfile) Objects.requireNonNull(this.authenticatedProfile)); } // Paper - prevent logins to be processed even though disconnect was called } -@@ -252,7 +256,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -257,7 +261,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, })); } @@ -13141,7 +13122,7 @@ index b0f7a378f19b9837c060c891002cd5db756cdae1..bc9956d36ce3adabd50dc4b6467a0fd2 if (flag) { this.state = ServerLoginPacketListenerImpl.State.WAITING_FOR_DUPE_DISCONNECT; -@@ -372,7 +376,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -377,7 +381,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, uniqueId = gameprofile.getId(); // Paper end - Add more fields to AsyncPlayerPreLoginEvent @@ -13216,7 +13197,7 @@ index 653856d0b8dcf2baf4cc77a276f17c8cc1fa717e..3f5639f26f249ca10e03826231d087ab date1 = fallback; } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d61c8cfad 100644 +index 5e2c4969e77c669acbb4a13c07033cb267c3d586..444f363e577344e962ffc515f6a052e349a0466d 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -134,10 +134,10 @@ public abstract class PlayerList { @@ -13496,7 +13477,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d entityplayer.stopRiding(); // CraftBukkit this.players.remove(entityplayer); this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot -@@ -974,10 +1052,10 @@ public abstract class PlayerList { +@@ -980,10 +1058,10 @@ public abstract class PlayerList { public void tick() { if (++this.sendAllPlayerInfoIn > 600) { // CraftBukkit start @@ -13510,7 +13491,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d @Override public boolean test(ServerPlayer input) { return target.getBukkitEntity().canSee(input.getBukkitEntity()); -@@ -1003,18 +1081,17 @@ public abstract class PlayerList { +@@ -1009,18 +1087,17 @@ public abstract class PlayerList { // CraftBukkit start - add a world/entity limited version public void broadcastAll(Packet packet, net.minecraft.world.entity.player.Player entityhuman) { @@ -13533,7 +13514,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d } } -@@ -1058,8 +1135,7 @@ public abstract class PlayerList { +@@ -1064,8 +1141,7 @@ public abstract class PlayerList { if (scoreboardteam == null) { this.broadcastSystemMessage(message, false); } else { @@ -13543,7 +13524,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d if (entityplayer.getTeam() != scoreboardteam) { entityplayer.sendSystemMessage(message); -@@ -1070,10 +1146,12 @@ public abstract class PlayerList { +@@ -1076,10 +1152,12 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { @@ -13559,7 +13540,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d } return astring; -@@ -1092,7 +1170,9 @@ public abstract class PlayerList { +@@ -1098,7 +1176,9 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -13569,7 +13550,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d } } -@@ -1102,7 +1182,10 @@ public abstract class PlayerList { +@@ -1108,7 +1188,10 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -13580,7 +13561,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d } } -@@ -1164,8 +1247,7 @@ public abstract class PlayerList { +@@ -1171,8 +1254,7 @@ public abstract class PlayerList { } public void broadcast(@Nullable net.minecraft.world.entity.player.Player player, double x, double y, double z, double distance, ResourceKey worldKey, Packet packet) { @@ -13590,7 +13571,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d // CraftBukkit start - Test if player receiving packet can see the source of the packet if (player != null && !entityplayer.getBukkitEntity().canSee(player.getBukkitEntity())) { -@@ -1195,12 +1277,21 @@ public abstract class PlayerList { +@@ -1202,12 +1284,21 @@ public abstract class PlayerList { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main MinecraftTimings.savePlayers.startTiming(); // Paper int numSaved = 0; @@ -13617,7 +13598,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d } // Paper end - Incremental chunk and player saving } -@@ -1319,6 +1410,20 @@ public abstract class PlayerList { +@@ -1326,6 +1417,20 @@ public abstract class PlayerList { } public void removeAll(boolean isRestarting) { @@ -13638,7 +13619,7 @@ index 0368d6ba9cc9fe557d3c7172a87a7a5b15445e47..4e484a111fc8d7a98e89aa06042bcd1d // Paper end // CraftBukkit start - disconnect safely for (ServerPlayer player : this.players) { -@@ -1328,7 +1433,7 @@ public abstract class PlayerList { +@@ -1335,7 +1440,7 @@ public abstract class PlayerList { // CraftBukkit end // Paper start - Configurable player collision; Remove collideRule team if it exists @@ -13833,7 +13814,7 @@ index e9df8f8541b8a1b85c7d2925ff3cba813007a1ef..d3f2775a68121ca80ef55ea4c280a0c9 return blockToFallLocation(blockState); } else { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898e8c59aaa 100644 +index 4b54d0ea31062972e68ee8fafe3cfaf68f65a5cd..4aefadd491f1c0c541d23fcaeaf03fd2ae995f3e 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -178,7 +178,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -13911,7 +13892,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -1128,8 +1140,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1130,8 +1142,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } else { this.wasOnFire = this.isOnFire(); if (movementType == MoverType.PISTON) { @@ -13922,7 +13903,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; -@@ -1421,7 +1433,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1423,7 +1435,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (movement.lengthSqr() <= 1.0E-7D) { return movement; } else { @@ -13931,7 +13912,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 if (i != this.pistonDeltasGameTime) { Arrays.fill(this.pistonDeltas, 0.0D); -@@ -3124,7 +3136,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3126,7 +3138,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.passengers = ImmutableList.copyOf(list); } @@ -13940,7 +13921,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 } } -@@ -3172,7 +3184,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3174,7 +3186,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } entity.boardingCooldown = 60; @@ -13949,7 +13930,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 } return true; // CraftBukkit } -@@ -3255,7 +3267,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3257,7 +3269,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } } @@ -13958,7 +13939,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 Level world = this.level(); if (world instanceof ServerLevel worldserver) { -@@ -3264,23 +3276,21 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3266,23 +3278,21 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (this.portalProcess.processPortalTeleportation(worldserver, this, this.canUsePortal(false))) { worldserver.getProfiler().push("portal"); this.setPortalCooldown(); @@ -13990,7 +13971,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 } public int getDimensionChangingDelay() { -@@ -3421,6 +3431,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3423,6 +3433,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @Nullable public PlayerTeam getTeam() { @@ -14002,7 +13983,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper - Perf: Disable Scoreboards for non players by default return this.level().getScoreboard().getPlayersTeam(this.getScoreboardName()); } -@@ -3710,8 +3725,751 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3712,8 +3727,751 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.portalProcess = original.portalProcess; } @@ -14754,7 +14735,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 Level world = this.level(); // Paper start - Fix item duplication and teleport issues -@@ -3828,6 +4586,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3832,6 +4590,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } @@ -14767,7 +14748,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 protected void removeAfterChangingDimensions() { this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION, null); // CraftBukkit - add Bukkit remove cause if (this instanceof Leashable leashable && leashable.isLeashed()) { // Paper - only call if it is leashed -@@ -4699,7 +5463,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4703,7 +5467,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } } // Paper end - Fix MC-4 @@ -14777,7 +14758,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -4720,7 +5485,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4724,7 +5489,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // Paper start - Block invalid positions and bounding box; don't allow desync of pos and AABB // hanging has its own special logic @@ -14786,7 +14767,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 this.setBoundingBox(this.makeBoundingBox()); } // Paper end - Block invalid positions and bounding box -@@ -4805,6 +5570,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4809,6 +5574,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.removalReason != null; } @@ -14799,7 +14780,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -4827,6 +5598,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4831,6 +5602,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess CraftEventFactory.callEntityRemoveEvent(this, cause); // CraftBukkit end final boolean alreadyRemoved = this.removalReason != null; // Paper - Folia schedulers @@ -14809,7 +14790,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 if (this.removalReason == null) { this.removalReason = entity_removalreason; } -@@ -4849,6 +5623,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4853,6 +5627,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.removalReason = null; } @@ -14821,7 +14802,7 @@ index e0827d8bb3fa17d4f590a5342ff41a514f623e68..d1a8e8a7f03f1769431b6711cf842898 /** * Invoked only when the entity is truly removed from the server, never to be added to any world. diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index ccd9dff20a60f019e0c320acfb526b8bf3e5f806..6e2ce383bb4d52702dfcb8823ce0c5dce7c81b5f 100644 +index 2aa6374cd4a96efd85899be8cd3172a8257bfe6b..551ad6757e76ec9c731488f0355d4950ad1b0bd4 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -265,7 +265,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -14946,7 +14927,7 @@ index ccd9dff20a60f019e0c320acfb526b8bf3e5f806..6e2ce383bb4d52702dfcb8823ce0c5dc if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -@@ -4249,7 +4268,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4252,7 +4271,7 @@ public abstract class LivingEntity extends Entity implements Attackable { BlockPos blockposition = BlockPos.containing(d0, d1, d2); Level world = this.level(); @@ -15472,74 +15453,10 @@ index b83be9bbb9f348da83c0fd1ecc7f65c8a58b45b9..5d6b1a63a2a213f8a4e81c5e57484700 BlockPos blockposition = this.blockPosition(); boolean flag = this.blockState.getBlock() instanceof ConcretePowderBlock; diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 607f1a9802eb0ff4865af4c53f302128a6e6fe02..8fb07f303b62292c01d77162272d8cca9c8afd29 100644 +index 4423973d4d9a2c3879d98d1d4c8b8c117c677ac5..9955d553dc016751edc50d9c8134cc1bb16c025e 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -60,7 +60,7 @@ public class ItemEntity extends Entity implements TraceableEntity { - @Nullable - public UUID target; - public final float bobOffs; -- private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit -+ //private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit // Folia - region threading - public boolean canMobPickup = true; // Paper - Item#canEntityPickup - private int despawnRate = -1; // Paper - Alternative item-despawn-rate - public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API -@@ -153,13 +153,11 @@ public class ItemEntity extends Entity implements TraceableEntity { - this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause - } else { - super.tick(); -- // CraftBukkit start - Use wall time for pickup and despawn timers -- int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -- if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks; -- this.pickupDelay = Math.max(0, this.pickupDelay); // Paper - don't go below 0 -- if (this.age != -32768) this.age += elapsedTicks; -- this.lastTick = MinecraftServer.currentTick; -- // CraftBukkit end -+ // Folia start - region threading - restore original timers -+ if (this.pickupDelay > 0 && this.pickupDelay != 32767) { -+ --this.pickupDelay; -+ } -+ // Folia end - region threading - restore original timers - - this.xo = this.getX(); - this.yo = this.getY(); -@@ -212,11 +210,11 @@ public class ItemEntity extends Entity implements TraceableEntity { - this.mergeWithNeighbours(); - } - -- /* CraftBukkit start - moved up -+ // Folia - region threading - restore original timers - if (this.age != -32768) { - ++this.age; - } -- // CraftBukkit end */ -+ // Folia - region threading - restore original timers - - this.hasImpulse |= this.updateInWaterStateAndDoFluidPushing(); - if (!this.level().isClientSide) { -@@ -243,13 +241,14 @@ public class ItemEntity extends Entity implements TraceableEntity { - // Spigot start - copied from above - @Override - public void inactiveTick() { -- // CraftBukkit start - Use wall time for pickup and despawn timers -- int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -- if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks; -- this.pickupDelay = Math.max(0, this.pickupDelay); // Paper - don't go below 0 -- if (this.age != -32768) this.age += elapsedTicks; -- this.lastTick = MinecraftServer.currentTick; -- // CraftBukkit end -+ // Folia start - region threading - restore original timers -+ if (this.pickupDelay > 0 && this.pickupDelay != 32767) { -+ --this.pickupDelay; -+ } -+ if (this.age != -32768) { -+ ++this.age; -+ } -+ // Folia end - region threading - restore original timers - - if (!this.level().isClientSide && this.age >= this.despawnRate) { // Spigot // Paper - Alternative item-despawn-rate - // CraftBukkit start - fire ItemDespawnEvent -@@ -561,14 +560,22 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -560,14 +560,22 @@ public class ItemEntity extends Entity implements TraceableEntity { return false; } @@ -15602,49 +15519,6 @@ index 2985296a9a034e535157f55e322fc8c107827752..d9ae587c5d3ef67d5ee8c9238c39a823 blockposition = Vex.this.blockPosition(); } -diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 2280004638fd19ed018cb3e77d53a018b34ec516..9460ffdede40a2e3601d3c97b1d1ca4e62dcbf29 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -96,7 +96,7 @@ public class Zombie extends Monster { - private boolean canBreakDoors; - private int inWaterTime; - public int conversionTime; -- private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field -+ //private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field // Folia - region threading - restore original timers - private boolean shouldBurnInDay = true; // Paper - Add more Zombie API - - public Zombie(EntityType type, Level world) { -@@ -219,10 +219,7 @@ public class Zombie extends Monster { - public void tick() { - if (!this.level().isClientSide && this.isAlive() && !this.isNoAi()) { - if (this.isUnderWaterConverting()) { -- // CraftBukkit start - Use wall time instead of ticks for conversion -- int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -- this.conversionTime -= elapsedTicks; -- // CraftBukkit end -+ --this.conversionTime; // Folia - region threading - restore original timers - if (this.conversionTime < 0) { - this.doUnderWaterConversion(); - } -@@ -239,7 +236,7 @@ public class Zombie extends Monster { - } - - super.tick(); -- this.lastTick = MinecraftServer.currentTick; // CraftBukkit -+ //this.lastTick = MinecraftServer.currentTick; // CraftBukkit // Folia - region threading - restore original timers - } - - @Override -@@ -280,7 +277,7 @@ public class Zombie extends Monster { - } - // Paper end - Add more Zombie API - public void startUnderWaterConversion(int ticksUntilWaterConversion) { -- this.lastTick = MinecraftServer.currentTick; // CraftBukkit -+ // Folia - region threading - restore original timers - this.conversionTime = ticksUntilWaterConversion; - this.getEntityData().set(Zombie.DATA_DROWNED_CONVERSION_ID, true); - } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java index e0dabbf6d7a87b8722769c78ef0d2ba4353ed2cb..90627c6a0c0e0f03a20cd32a7f15a0cfab7e592e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -15680,10 +15554,10 @@ index e0dabbf6d7a87b8722769c78ef0d2ba4353ed2cb..90627c6a0c0e0f03a20cd32a7f15a0cf @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java -index 49b35fab8ee98a384ee12d36bbe2ac813342f1d6..5f3104b2a46d4b47cf505012438f848e3b744315 100644 +index d28ebcae036168dd65a5f3236d12ee416308c23f..4153d16c3fc6b16315b3822251e4f740cf7dbd98 100644 --- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java -@@ -226,10 +226,18 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -224,10 +224,18 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa this.readInventoryFromTag(nbt, this.registryAccess()); } @@ -15890,10 +15764,10 @@ index 9ca29b3d4bf8bca5f51f3644e12fcbec2cb5d35e..b5edbd36a1114449fe5f9bf1018bff79 Vec3 vec3d = this.getDeltaMovement(); diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -index 3107ad04dda9f43976a385976d6952e2f2af3939..dc075e777055508c17ac4fa4d46e51e1721cb2e8 100644 +index f79fc0ed58af2cf55e8642b6d7fc9e4f57d0ba20..f70905fde2591cbabf15d47ff3c87b6662b966d5 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -@@ -80,6 +80,11 @@ public abstract class AbstractHurtingProjectile extends Projectile { +@@ -79,6 +79,11 @@ public abstract class AbstractHurtingProjectile extends Projectile { this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause } else { super.tick(); @@ -15991,7 +15865,7 @@ index 8575941fd238750c5d56843989a48bcbde2d8a88..185501a2daea0351281c578bff79dc50 HitResult movingobjectposition = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index de64de5d1328d3e0826c9990eb7c7eca5088cb9c..420531643a486da9d99f011a93461e54d0d9032b 100644 +index 10ade433c083851d9ea4797c6ec618db122229f9..0e831070fe7a9ac58de4b25b74a53b38334c695a 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -38,7 +38,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @@ -16062,7 +15936,7 @@ index de64de5d1328d3e0826c9990eb7c7eca5088cb9c..420531643a486da9d99f011a93461e54 } } -@@ -367,7 +383,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -364,7 +380,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -16433,7 +16307,7 @@ index 647a4601deace52f8d855f512a73671f82b4762a..255f6e720ebe0f76954fdba03cd2aae0 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index b6a2f3e4f22f36e75a1630bd456c2f471edbb398..0b802cd958d7a7087933f5d21dc16f9ee51426b6 100644 +index 522b817f23f08eb720fe9d05eec7f548d2761603..176ff4c3f367f2359303f7cd09d65b6adbc00a40 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -421,31 +421,32 @@ public final class ItemStack implements DataComponentHolder { @@ -16798,10 +16672,10 @@ index 141b748abe80402731cdaf14a3d36aa7cef4f4bd..95938efe2282a024d9d428dedd16cbe1 return player; } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index ad57bf49476192dea6a7367cbd0ad3f11e142e1b..d95d9b2ee7de56627d146cc898bc9d37171c5030 100644 +index f696afd7e241bf1966a2d505b5d59bff824b43e4..e642638f70dffab027f8c538889e3b17da1c29df 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java -@@ -844,17 +844,18 @@ public class Explosion { +@@ -845,17 +845,18 @@ public class Explosion { if (!this.level.paperConfig().environment.optimizeExplosions) { return this.getSeenFraction(vec3d, entity, blockCache, blockPos); // Paper - optimise collisions } @@ -16824,7 +16698,7 @@ index ad57bf49476192dea6a7367cbd0ad3f11e142e1b..d95d9b2ee7de56627d146cc898bc9d37 private final double posX, posY, posZ; private final double minX, minY, minZ; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03e1c60122 100644 +index 507671476c3d2d92a2fdb05be24443af27d26dcf..d518487433088f090edb0d12e222b85f0c93b792 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -116,10 +116,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @@ -17134,7 +17008,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 // Paper end - Prevent block entity and entity crashes } this.moonrise$midTickTasks(); // Paper - rewrite chunk system -@@ -1527,9 +1566,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1544,9 +1583,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Nullable public BlockEntity getBlockEntity(BlockPos blockposition, boolean validate) { @@ -17150,7 +17024,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 return blockEntity; } // Paper end - Perf: Optimize capturedTileEntities lookup -@@ -1542,8 +1586,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1559,8 +1603,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl if (!this.isOutsideBuildHeight(blockposition)) { // CraftBukkit start @@ -17161,7 +17035,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 return; } // CraftBukkit end -@@ -1623,6 +1667,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1640,6 +1684,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -17169,7 +17043,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 this.getProfiler().incrementCounter("getEntities"); // Paper start - rewrite chunk system final List ret = new java.util.ArrayList<>(); -@@ -1649,6 +1694,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1666,6 +1711,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void getEntities(final EntityTypeTest entityTypeTest, final AABB boundingBox, final Predicate predicate, final List into, final int maxCount) { @@ -17177,7 +17051,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 this.getProfiler().incrementCounter("getEntities"); if (entityTypeTest instanceof net.minecraft.world.entity.EntityType byType) { -@@ -1734,13 +1780,30 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1751,13 +1797,30 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void disconnect() {} @@ -17210,7 +17084,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 public boolean mayInteract(Player player, BlockPos pos) { return true; -@@ -1933,8 +1996,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1950,8 +2013,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public abstract RecipeManager getRecipeManager(); public BlockPos getBlockRandomPos(int x, int y, int z, int l) { @@ -17220,7 +17094,7 @@ index e2a0487089eb5a7bdc1433e4c75f69d8e9f9d5f9..b0ad25daf2d3c1727c61686e35eb4c03 return new BlockPos(x + (i1 & 15), y + (i1 >> 16 & l), z + (i1 >> 8 & 15)); } -@@ -1964,7 +2026,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1981,7 +2043,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public long nextSubTickCount() { @@ -17422,7 +17296,7 @@ index 26ec4838c476b8091f80aeac61db8041d5c89e88..82d333b2644c7af7137f155bfd10e03e } diff --git a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java -index f6edfea463b3725d3a79aca38825e86dbf82175c..92cab51f6b3eeb07b574bd3ba82d736e8880acae 100644 +index e1021d8be840f378568f28639c259182055c78ac..640887a47048f938c3e12634207182ceba68bdcc 100644 --- a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java @@ -51,7 +51,7 @@ public class DispenserBlock extends BaseEntityBlock { @@ -17434,7 +17308,7 @@ index f6edfea463b3725d3a79aca38825e86dbf82175c..92cab51f6b3eeb07b574bd3ba82d736e @Override public MapCodec codec() { -@@ -111,7 +111,7 @@ public class DispenserBlock extends BaseEntityBlock { +@@ -110,7 +110,7 @@ public class DispenserBlock extends BaseEntityBlock { if (idispensebehavior != DispenseItemBehavior.NOOP) { if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockPreDispenseEvent(world, pos, itemstack, i)) return; // Paper - Add BlockPreDispenseEvent @@ -17936,33 +17810,6 @@ index 7dfabb11d3c8112f6daef35d204a2e324f4ddb5e..b7c1c8e3701fc2d67df34aaf5cebdf78 BlockEntity.setChanged(this.level, this.worldPosition, this.blockState); } -diff --git a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -index a2fafef89d5354e2cb02f5672810909950a57777..46011ababdadaafd72a8717911e49f6581ab5688 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -@@ -54,7 +54,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - public int fuel; - protected final ContainerData dataAccess; - // CraftBukkit start - add fields and methods -- private int lastTick = MinecraftServer.currentTick; -+ //private int lastTick = MinecraftServer.currentTick; // Folia - region ticking - restore original timers - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - -@@ -170,11 +170,10 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - ItemStack itemstack1 = (ItemStack) blockEntity.items.get(3); - - // CraftBukkit start - Use wall time instead of ticks for brewing -- int elapsedTicks = MinecraftServer.currentTick - blockEntity.lastTick; -- blockEntity.lastTick = MinecraftServer.currentTick; -+ // Folia - region ticking - restore original timers - - if (flag1) { -- blockEntity.brewTime -= elapsedTicks; -+ --blockEntity.brewTime; // Folia - region ticking - restore original timers - boolean flag2 = blockEntity.brewTime <= 0; // == -> <= - // CraftBukkit end - diff --git a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java index 6c484f3f8f37a19992ebbfe30aba399cac21acfe..47c32e2639fdb6bac0df935822fff1a54c805aa4 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java @@ -18890,22 +18737,18 @@ index 1b1b475ca27e799e251d6f8a8c9fe1a4fd8bae83..3085658976345d095e7c38a0edab42cb while (iterator.hasNext()) { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java -index 8aa5445e38622cd7cf4b3e42e9be8760827639fa..cbd75e4e53649a19d9e8cabb20359749ff315cdb 100644 +index b92c40352e4f1af05a2f90701b3f74c235ae57cf..8b5a88fae6afaf7da25e670f32b107f37a954714 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java +++ b/src/main/java/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java -@@ -60,11 +60,7 @@ public class EndPlatformFeature extends Feature { - return; +@@ -55,7 +55,7 @@ public class EndPlatformFeature extends Feature { } + // CraftBukkit start + // SPIGOT-7746: Entity will only be null during world generation, which is async, so just generate without event +- if (entity != null) { ++ if (false) { // Folia - region threading + org.bukkit.World bworld = worldaccess.getLevel().getWorld(); + PortalCreateEvent portalEvent = new PortalCreateEvent((List) (List) blockList.getList(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM); -- org.bukkit.World bworld = worldaccess.getLevel().getWorld(); -- PortalCreateEvent portalEvent = new PortalCreateEvent((List) (List) blockList.getList(), bworld, entity.getBukkitEntity(), org.bukkit.event.world.PortalCreateEvent.CreateReason.END_PLATFORM); -- -- worldaccess.getLevel().getCraftServer().getPluginManager().callEvent(portalEvent); -- if (!portalEvent.isCancelled()) { -+ if (true) { // Folia - region threading - // Paper start - Properly destroy placed blocks on the end platform - if (flag) { - for (org.bukkit.craftbukkit.block.CraftBlockState state : blockList.getList()) { diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureStart.java b/src/main/java/net/minecraft/world/level/levelgen/structure/StructureStart.java index c92a2c5bba1525eff39d9a3cad70fdacd426e8cb..04274f48627c40d3ac722e3ec595182d6d44b167 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/structure/StructureStart.java @@ -19039,7 +18882,7 @@ index 763b315b1d761bc3bd82d9b847ed3f64fd5ce991..7a044d337df8a14150a695d539a8e5c8 } } diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -index 17f33c83c6033564d6bf4fbd388b0b847c68adb3..684a0a4c7583da882687e010e2f2e051804b6602 100644 +index 6794466051dd4b725d579b2136c37844995a648e..9af0c40e5509b10775c51014f6f739a9f0476a6b 100644 --- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java @@ -212,7 +212,7 @@ public class MapItemSavedData extends SavedData { @@ -19381,7 +19224,7 @@ index 7a69564572357a7acc043e35b9c113beeb738951..ea161048b68de3c8cdcba5f4cb66eb15 LevelChunkTicks levelChunkTicks = this.allContainers.get(l); if (levelChunkTicks == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 1b36e94617d4e777c419660936460d5cf8a4b3e8..454cac11619fc1e8317db0b95a174f6747af6e60 100644 +index c7df339aeb62ee627edaf1bb4c8474b61e357ba6..f9b399214848098149eb1f3a4043028d242dd454 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -312,7 +312,7 @@ public final class CraftServer implements Server { @@ -19406,7 +19249,7 @@ index 1b36e94617d4e777c419660936460d5cf8a4b3e8..454cac11619fc1e8317db0b95a174f67 static { ConfigurationSerialization.registerClass(CraftOfflinePlayer.class); -@@ -972,6 +978,9 @@ public final class CraftServer implements Server { +@@ -973,6 +979,9 @@ public final class CraftServer implements Server { // NOTE: Should only be called from DedicatedServer.ah() public boolean dispatchServerCommand(CommandSender sender, ConsoleInput serverCommand) { @@ -19416,7 +19259,7 @@ index 1b36e94617d4e777c419660936460d5cf8a4b3e8..454cac11619fc1e8317db0b95a174f67 if (sender instanceof Conversable) { Conversable conversable = (Conversable) sender; -@@ -991,12 +1000,46 @@ public final class CraftServer implements Server { +@@ -992,12 +1001,46 @@ public final class CraftServer implements Server { } } @@ -19463,7 +19306,7 @@ index 1b36e94617d4e777c419660936460d5cf8a4b3e8..454cac11619fc1e8317db0b95a174f67 if (this.commandMap.dispatch(sender, commandLine)) { return true; } -@@ -3194,7 +3237,7 @@ public final class CraftServer implements Server { +@@ -3193,7 +3236,7 @@ public final class CraftServer implements Server { @Override public int getCurrentTick() { @@ -19473,10 +19316,10 @@ index 1b36e94617d4e777c419660936460d5cf8a4b3e8..454cac11619fc1e8317db0b95a174f67 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9d172db84 100644 +index e76186d580a2d7f1a83af4600b0bdd435b67eba3..e6e83eb3974f0963916b36281b5e2ab647ae7cb8 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -192,7 +192,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -227,7 +227,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getTickableTileEntityCount() { @@ -19485,7 +19328,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } @Override -@@ -257,7 +257,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -302,7 +302,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start - per world spawn limits for (SpawnCategory spawnCategory : SpawnCategory.values()) { if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { @@ -19494,7 +19337,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } } // Paper end - per world spawn limits -@@ -321,6 +321,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -372,6 +372,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public Chunk getChunkAt(int x, int z) { @@ -19502,7 +19345,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 warnUnsafeChunk("getting a faraway chunk", x, z); // Paper // Paper start - add ticket to hold chunk for a little while longer if plugin accesses it net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); -@@ -344,7 +345,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -395,7 +396,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start private void addTicket(int x, int z) { @@ -19511,7 +19354,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } // Paper end -@@ -363,10 +364,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -414,10 +415,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkGenerated(int x, int z) { // Paper start - Fix this method @@ -19524,7 +19367,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); if (chunk != null) { -@@ -423,7 +424,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -474,7 +475,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { @@ -19533,7 +19376,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 if (!this.isChunkLoaded(x, z)) { return true; } -@@ -438,7 +439,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -489,7 +490,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean regenerateChunk(int x, int z) { @@ -19542,7 +19385,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 throw new UnsupportedOperationException("Not supported in this Minecraft version! Unless you can fix it, this is not a bug :)"); /* if (!unloadChunk0(x, z, false)) { -@@ -465,6 +466,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -516,6 +517,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { @@ -19550,7 +19393,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -525,7 +527,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -576,7 +578,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -19559,7 +19402,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 warnUnsafeChunk("loading a faraway chunk", x, z); // Paper ChunkAccess chunk = this.world.getChunkSource().getChunk(x, z, generate || isChunkGenerated(x, z) ? ChunkStatus.FULL : ChunkStatus.EMPTY, true); // Paper -@@ -566,7 +568,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -617,7 +619,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { DistanceManager chunkDistanceManager = this.world.getChunkSource().chunkMap.distanceManager; if (chunkDistanceManager.addRegionTicketAtDistance(TicketType.PLUGIN_TICKET, new ChunkPos(x, z), 2, plugin)) { // keep in-line with force loading, add at level 31 @@ -19568,7 +19411,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 return true; } -@@ -777,13 +779,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -828,13 +830,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -19589,7 +19432,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 BlockPos position = ((CraftBlockState) blockstate).getPosition(); net.minecraft.world.level.block.state.BlockState oldBlock = this.world.getBlockState(position); int flag = ((CraftBlockState) blockstate).getFlag(); -@@ -791,10 +795,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -842,10 +846,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { net.minecraft.world.level.block.state.BlockState newBlock = this.world.getBlockState(position); this.world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flag, 512); } @@ -19602,7 +19445,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 return false; } } -@@ -828,6 +832,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -879,6 +883,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setTime(long time) { @@ -19610,7 +19453,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 long margin = (time - this.getFullTime()) % 24000; if (margin < 0) margin += 24000; this.setFullTime(this.getFullTime() + margin); -@@ -840,6 +845,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -891,6 +896,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setFullTime(long time) { @@ -19618,7 +19461,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 // Notify anyone who's listening TimeSkipEvent event = new TimeSkipEvent(this, TimeSkipEvent.SkipReason.CUSTOM, time - this.world.getDayTime()); this.server.getPluginManager().callEvent(event); -@@ -867,7 +873,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -918,7 +924,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public long getGameTime() { @@ -19627,7 +19470,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } @Override -@@ -896,11 +902,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -947,11 +953,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.MOB; // Respect mobGriefing gamerule } @@ -19636,12 +19479,12 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 } // Paper start @Override - public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks) { + public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks, boolean excludeSourceFromDamage) { + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.world, loc.getX(), loc.getZ(), "Cannot create explosion asynchronously"); // Folia - region threading - return !world.explode(source != null ? ((org.bukkit.craftbukkit.entity.CraftEntity) source).getHandle() : null, loc.getX(), loc.getY(), loc.getZ(), power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled; - } - // Paper end -@@ -977,6 +985,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { + return !world.explode(source != null ? ((org.bukkit.craftbukkit.entity.CraftEntity) source).getHandle() : null, loc.getX(), loc.getY(), loc.getZ(), power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE, explosion -> { + explosion.excludeSourceFromDamage = excludeSourceFromDamage; + }).wasCanceled; +@@ -1030,6 +1038,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -19649,7 +19492,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); -@@ -1007,6 +1016,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1060,6 +1069,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); @@ -19657,7 +19500,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -1317,6 +1327,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1370,6 +1380,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setStorm(boolean hasStorm) { @@ -19665,7 +19508,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1329,6 +1340,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1382,6 +1393,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setWeatherDuration(int duration) { @@ -19673,7 +19516,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.setRainTime(duration); } -@@ -1339,6 +1351,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1392,6 +1404,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThundering(boolean thundering) { @@ -19681,7 +19524,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1351,6 +1364,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1404,6 +1417,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThunderDuration(int duration) { @@ -19689,7 +19532,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.setThunderTime(duration); } -@@ -1361,6 +1375,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1414,6 +1428,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setClearWeatherDuration(int duration) { @@ -19697,7 +19540,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.setClearWeatherTime(duration); } -@@ -1555,6 +1570,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1608,6 +1623,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setKeepSpawnInMemory(boolean keepLoaded) { @@ -19705,7 +19548,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 if (keepLoaded) { this.setGameRule(GameRule.SPAWN_CHUNK_RADIUS, this.getGameRuleDefault(GameRule.SPAWN_CHUNK_RADIUS)); } else { -@@ -1623,6 +1639,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1676,6 +1692,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setHardcore(boolean hardcore) { @@ -19713,7 +19556,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.world.serverLevelData.settings.hardcore = hardcore; } -@@ -1635,6 +1652,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1688,6 +1705,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { @@ -19721,7 +19564,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setTicksPerSpawns(SpawnCategory.ANIMAL, ticksPerAnimalSpawns); } -@@ -1647,6 +1665,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1700,6 +1718,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { @@ -19729,7 +19572,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setTicksPerSpawns(SpawnCategory.MONSTER, ticksPerMonsterSpawns); } -@@ -1659,6 +1678,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1712,6 +1731,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { @@ -19737,7 +19580,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setTicksPerSpawns(SpawnCategory.WATER_ANIMAL, ticksPerWaterSpawns); } -@@ -1671,6 +1691,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1724,6 +1744,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterAmbientSpawns(int ticksPerWaterAmbientSpawns) { @@ -19745,7 +19588,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setTicksPerSpawns(SpawnCategory.WATER_AMBIENT, ticksPerWaterAmbientSpawns); } -@@ -1683,6 +1704,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1736,6 +1757,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterUndergroundCreatureSpawns(int ticksPerWaterUndergroundCreatureSpawns) { @@ -19753,7 +19596,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setTicksPerSpawns(SpawnCategory.WATER_UNDERGROUND_CREATURE, ticksPerWaterUndergroundCreatureSpawns); } -@@ -1695,11 +1717,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1748,11 +1770,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { @@ -19767,7 +19610,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); -@@ -1716,21 +1740,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1769,21 +1793,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { @@ -19793,7 +19636,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.server.getWorldMetadata().removeMetadata(this, metadataKey, owningPlugin); } -@@ -1743,6 +1771,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1796,6 +1824,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setMonsterSpawnLimit(int limit) { @@ -19801,7 +19644,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.MONSTER, limit); } -@@ -1755,6 +1784,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1808,6 +1837,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAnimalSpawnLimit(int limit) { @@ -19809,7 +19652,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.ANIMAL, limit); } -@@ -1767,6 +1797,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1820,6 +1850,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAnimalSpawnLimit(int limit) { @@ -19817,7 +19660,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.WATER_ANIMAL, limit); } -@@ -1779,6 +1810,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1832,6 +1863,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAmbientSpawnLimit(int limit) { @@ -19825,7 +19668,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.WATER_AMBIENT, limit); } -@@ -1791,6 +1823,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1844,6 +1876,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterUndergroundCreatureSpawnLimit(int limit) { @@ -19833,7 +19676,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.WATER_UNDERGROUND_CREATURE, limit); } -@@ -1803,6 +1836,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1856,6 +1889,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAmbientSpawnLimit(int limit) { @@ -19841,7 +19684,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 this.setSpawnLimit(SpawnCategory.AMBIENT, limit); } -@@ -1825,6 +1859,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1878,6 +1912,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setSpawnLimit(SpawnCategory spawnCategory, int limit) { @@ -19849,7 +19692,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); -@@ -1907,7 +1942,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1960,7 +1995,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -19858,7 +19701,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1919,7 +1954,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1972,7 +2007,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(ResourceLocation.parse(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -19867,7 +19710,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -2008,6 +2043,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2061,6 +2096,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRuleValue(String rule, String value) { @@ -19875,7 +19718,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 // No null values allowed if (rule == null || value == null) return false; -@@ -2050,6 +2086,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2103,6 +2139,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRule(GameRule rule, T newValue) { @@ -19883,7 +19726,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 Preconditions.checkArgument(rule != null, "GameRule cannot be null"); Preconditions.checkArgument(newValue != null, "GameRule value cannot be null"); -@@ -2276,6 +2313,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2329,6 +2366,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { @@ -19896,7 +19739,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.getHolder(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())).orElseThrow(), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); } // Paper end -@@ -2404,7 +2447,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2454,7 +2497,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start public java.util.concurrent.CompletableFuture getChunkAtAsync(int x, int z, boolean gen, boolean urgent) { warnUnsafeChunk("getting a faraway chunk async", x, z); // Paper @@ -19905,7 +19748,7 @@ index ffd284f0e25c6f20672f7225aafd37e6c87ccf03..6b535d154e33947a85a2fe5b40a241a9 net.minecraft.world.level.chunk.LevelChunk immediate = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); if (immediate != null) { return java.util.concurrent.CompletableFuture.completedFuture(new CraftChunk(immediate)); -@@ -2421,7 +2464,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2471,7 +2514,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { java.util.concurrent.CompletableFuture ret = new java.util.concurrent.CompletableFuture<>(); ca.spottedleaf.moonrise.common.util.ChunkSystem.scheduleChunkLoad(this.getHandle(), x, z, gen, ChunkStatus.FULL, true, priority, (c) -> { @@ -20145,7 +19988,7 @@ index fa63a6cfcfcc4eee4503a82d85333c139c8c8b2b..def7749e6dc4ae8351b72deefc759366 net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item); diff --git a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java -index 3e93a6c489972ff2b4ecff3d83cc72b2d5c970f8..66dc7e20544c7000f4824b02cc3a31bc5c87f74c 100644 +index a45e658996e483e9a21cfd8178153ddb7b87ae69..25303f144422469350fdc6f84320b16bcc9f6e0c 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java +++ b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java @@ -50,7 +50,7 @@ public class ConsoleCommandCompleter implements Completer { @@ -20167,7 +20010,7 @@ index 3e93a6c489972ff2b4ecff3d83cc72b2d5c970f8..66dc7e20544c7000f4824b02cc3a31bc List offers = waitable.get(); if (offers == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index cd789c235acf740ec29c30b180e7fbe1a140caa9..f05e9a36cbb8476c355fc79da2c670c8a362cdb0 100644 +index 89c8713d2c2206d1b0d8c0a392c9d13b3e736f0c..88dd653f3c7871cae5983f4a0f62af0f3dd1bd99 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -79,6 +79,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -20295,19 +20138,19 @@ index cd789c235acf740ec29c30b180e7fbe1a140caa9..f05e9a36cbb8476c355fc79da2c670c8 return java.util.Collections.emptySet(); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index a0d5082590ee03060f0dbb4770d196efc316c328..0e3eed03f307a414effdd30414b8d01797349908 100644 +index 42d7660efe5baa6f796f2a7606686c765b6f2478..149f442304b6af17b483822d4db1b8e760ecd556 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -649,7 +649,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -651,7 +651,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void kickPlayer(String message) { - org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot + //org.spigotmc.AsyncCatcher.catchOp("player kick"); // Spigot // Folia - thread-safe now, as it will simply delay the kick - if (this.getHandle().connection == null) return; + this.getHandle().transferCookieConnection.kickPlayer(CraftChatMessage.fromStringOrEmpty(message, true), org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause + } - this.getHandle().connection.disconnect(CraftChatMessage.fromStringOrEmpty(message, true), org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause -@@ -1408,6 +1408,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1412,6 +1412,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean teleport(Location location, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause, io.papermc.paper.entity.TeleportFlag... flags) { @@ -20319,7 +20162,7 @@ index a0d5082590ee03060f0dbb4770d196efc316c328..0e3eed03f307a414effdd30414b8d017 Set relativeArguments; Set allFlags; if (flags.length == 0) { -@@ -2060,7 +2065,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2064,7 +2069,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private void unregisterEntity(Entity other) { // Paper end ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap; @@ -20328,7 +20171,7 @@ index a0d5082590ee03060f0dbb4770d196efc316c328..0e3eed03f307a414effdd30414b8d017 if (entry != null) { entry.removePlayer(this.getHandle()); } -@@ -2157,7 +2162,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2161,7 +2166,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (original != null) otherPlayer.setUUID(original); // Paper - uuid override } @@ -20337,7 +20180,7 @@ index a0d5082590ee03060f0dbb4770d196efc316c328..0e3eed03f307a414effdd30414b8d017 if (entry != null && !entry.seenBy.contains(this.getHandle().connection)) { entry.updatePlayer(this.getHandle()); } -@@ -3353,7 +3358,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3357,7 +3362,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { { if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() ) { @@ -20347,7 +20190,7 @@ index a0d5082590ee03060f0dbb4770d196efc316c328..0e3eed03f307a414effdd30414b8d017 } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 77ef27f9254235180a8596c6c8c4af750dc759d1..f2a3cb4be886bd81d795b57b97536306534c5973 100644 +index 4632eb883e9f5efde520ee543bcad25827c0da2c..d1de8ce4b479affaa6aa493ad2c2a86d3e03deb3 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -953,7 +953,7 @@ public class CraftEventFactory { @@ -20390,10 +20233,10 @@ index 2f4d6b56301195f8d39ed50dffe842464065bfe1..5a24902b735cbd64dd5cd5ad46b096c4 if (!this.isAsyncScheduler && !task.isSync()) { this.asyncScheduler.handle(task, delay); diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 28dbe30a98a6730839949bc9a6a90b78619ff84d..c9e31dcdde9d96edfc12e694065f1f4643bb9db3 100644 +index d06aab9bd5cd901c8367f9680f5d27ddb17b3dc4..7948267b6b91100a2fd2dcb24817037c75f6953c 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -369,6 +369,12 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -375,6 +375,12 @@ public final class CraftMagicNumbers implements UnsafeValues { throw new InvalidPluginException("Unsupported API version " + pdf.getAPIVersion()); } diff --git a/patches/server/0004-Max-pending-logins.patch b/patches/server/0004-Max-pending-logins.patch index e9e288a..6f0751f 100644 --- a/patches/server/0004-Max-pending-logins.patch +++ b/patches/server/0004-Max-pending-logins.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Max pending logins Should help the floodgates on launch diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index bc9956d36ce3adabd50dc4b6467a0fd24386e4e0..d0f8a81ed0363764d185682c3de667703d30e8eb 100644 +index 9451cccebf7acee3bd9f28f4f9d60412d1554ff4..8098b1a447a7c054e15edc09d2fa50e48f73e926 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -112,7 +112,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -117,7 +117,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, if (this.server.getPlayerList().pushPendingJoin(name, uniqueId, this.connection)) { // Folia end - region threading - rewrite login process this.verifyLoginAndFinishConnectionSetup((GameProfile) Objects.requireNonNull(this.authenticatedProfile)); @@ -19,7 +19,7 @@ index bc9956d36ce3adabd50dc4b6467a0fd24386e4e0..d0f8a81ed0363764d185682c3de66770 // CraftBukkit start diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 4e484a111fc8d7a98e89aa06042bcd1d61c8cfad..cc0c75340cc366f07a5bf169b4de50ba2d9ce366 100644 +index 444f363e577344e962ffc515f6a052e349a0466d..7503afc82ec13a7f5732d32d70ce47900a747352 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -175,6 +175,17 @@ public abstract class PlayerList { diff --git a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index bf20e25..12fda0d 100644 --- a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -29,10 +29,10 @@ index 41bf71d116ffc5431586ce54abba7f8def6c1dcf..1cf9a7677449ab8f03fb23d835e3fadc } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index d1a8e8a7f03f1769431b6711cf842898e8c59aaa..0dce7e72a2c5f7360a43b662b43b47603e2aa213 100644 +index 4aefadd491f1c0c541d23fcaeaf03fd2ae995f3e..2ccc358daae43dcebf03db64526f17fbd9df23f8 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3044,6 +3044,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3046,6 +3046,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (!force && (!this.canRide(entity) || !entity.canAddPassenger(this))) { return false; } else { @@ -40,7 +40,7 @@ index d1a8e8a7f03f1769431b6711cf842898e8c59aaa..0dce7e72a2c5f7360a43b662b43b4760 // CraftBukkit start if (entity.getBukkitEntity() instanceof Vehicle && this.getBukkitEntity() instanceof LivingEntity) { VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.getBukkitEntity()); -@@ -3065,6 +3066,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3067,6 +3068,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -48,7 +48,7 @@ index d1a8e8a7f03f1769431b6711cf842898e8c59aaa..0dce7e72a2c5f7360a43b662b43b4760 if (this.isPassenger()) { this.stopRiding(); } -@@ -3148,6 +3150,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3150,6 +3152,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { // CraftBukkit start @@ -56,7 +56,7 @@ index d1a8e8a7f03f1769431b6711cf842898e8c59aaa..0dce7e72a2c5f7360a43b662b43b4760 CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -3175,6 +3178,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3177,6 +3180,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -153,10 +153,10 @@ index 5beaa2bb0d58fe477ce8d2de8b77600d3b416d8c..c8406f2d83f4c8b60efec0de546f4576 } // Paper end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java -index 34e4c763c7ec971885147ab2509281fad56e1ca6..7fb2e28c12dba743d8c2fb0a8a4e2f3e76d151f6 100644 +index 3199f04d00836a0a51547c679f3f3c80d00da502..a1959919109fe04d4b829dcd2d244842ab05fe13 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java -@@ -17,8 +17,16 @@ public class CraftAbstractVillager extends CraftAgeable implements AbstractVilla +@@ -15,8 +15,16 @@ public class CraftAbstractVillager extends CraftAgeable implements CraftMerchant super(server, entity); } @@ -979,7 +979,7 @@ index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..399ef60ab5f1bf02b638c8c46a72d297 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index f05e9a36cbb8476c355fc79da2c670c8a362cdb0..ed840f7c36265354ebf07c9fbe2c42155ea1fc4b 100644 +index 88dd653f3c7871cae5983f4a0f62af0f3dd1bd99..7be80f2774b5ec3d0bede096da8f2b6d1cf7b09b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -498,7 +498,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -1441,10 +1441,10 @@ index 9b6ff0f64966c78a3233860bb0840182b52f01bc..fb34651a9e4ed0cb05721d15524a26f8 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index c1bad887d1340ebc7c63fda3dceff929e4a44517..37c8bd3dc3e539ca92216ae5c2896b037d9af21e 100644 +index 7dcfb45c24d7743956be514c7d554e06aac77b3e..6a052ed8d66a62b42c98a3b1d60263dd8018fed1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -@@ -290,8 +290,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { +@@ -298,8 +298,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { this.mode = mode; } @@ -1677,10 +1677,10 @@ index e9f471e60af0725ec34e2985d63ae9ea9f88590a..cd824fc65ac2b1fe55710da4700f7c31 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index beb6ad312028adb14053e3f019a4fcf6c9149373..90939123cd749321d3846f0970aa75417c1a0f52 100644 +index 57b71a3894638253c6d24d4967a96768834bb02b..a82e2be0d104fefbf9a213256b82b3354fd1c098 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -477,6 +477,13 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -478,6 +478,13 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { this.getHandle().invulnerableTime = ticks; } @@ -1694,7 +1694,7 @@ index beb6ad312028adb14053e3f019a4fcf6c9149373..90939123cd749321d3846f0970aa7541 @Override public int getNoActionTicks() { return this.getHandle().getNoActionTime(); -@@ -490,6 +497,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -491,6 +498,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @Override public net.minecraft.world.entity.LivingEntity getHandle() { @@ -2234,7 +2234,7 @@ index 2638c341bc02f201f7ab17fdebcdbdf3a7ec05bf..074b2919be2b5544b0a46e6cd32f6c57 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 0e3eed03f307a414effdd30414b8d01797349908..28c6923c90ca106256ca75769828cd62d5542ca7 100644 +index 149f442304b6af17b483822d4db1b8e760ecd556..12a2da086f249b3dbd61e5749b9856a2fce9ac7b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -669,7 +669,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2246,7 +2246,7 @@ index 0e3eed03f307a414effdd30414b8d01797349908..28c6923c90ca106256ca75769828cd62 final ServerGamePacketListenerImpl connection = this.getHandle().connection; if (connection != null) { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause); -@@ -2311,9 +2311,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2315,9 +2315,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this; } diff --git a/patches/server/0007-Throw-UnsupportedOperationException-for-broken-APIs.patch b/patches/server/0007-Throw-UnsupportedOperationException-for-broken-APIs.patch index 611d5a7..0f19cc5 100644 --- a/patches/server/0007-Throw-UnsupportedOperationException-for-broken-APIs.patch +++ b/patches/server/0007-Throw-UnsupportedOperationException-for-broken-APIs.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Throw UnsupportedOperationException() for broken APIs diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 454cac11619fc1e8317db0b95a174f6747af6e60..39e4493ef5c7d4bfd903da18b76e14235a535ab5 100644 +index f9b399214848098149eb1f3a4043028d242dd454..dee23b4b96b7f2c6af54a6affe385b183479f8cc 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1310,6 +1310,7 @@ public final class CraftServer implements Server { +@@ -1312,6 +1312,7 @@ public final class CraftServer implements Server { @Override public World createWorld(WorldCreator creator) { @@ -16,7 +16,7 @@ index 454cac11619fc1e8317db0b95a174f6747af6e60..39e4493ef5c7d4bfd903da18b76e1423 Preconditions.checkState(this.console.getAllLevels().iterator().hasNext(), "Cannot create additional worlds on STARTUP"); //Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot create a world while worlds are being ticked"); // Paper - Cat - Temp disable. We'll see how this goes. Preconditions.checkArgument(creator != null, "WorldCreator cannot be null"); -@@ -1488,6 +1489,7 @@ public final class CraftServer implements Server { +@@ -1490,6 +1491,7 @@ public final class CraftServer implements Server { @Override public boolean unloadWorld(World world, boolean save) { diff --git a/patches/server/0008-Fix-tests-by-removing-them.patch b/patches/server/0008-Fix-tests-by-removing-them.patch index 7d915f7..8021ba1 100644 --- a/patches/server/0008-Fix-tests-by-removing-them.patch +++ b/patches/server/0008-Fix-tests-by-removing-them.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix tests by removing them We don't care about this one, some commands just need to be removed. diff --git a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -index ca71c688b37ce2c8b712a4f9216cf872c8edf78e..d2298f423a289b8a4df815d04bd8218faafb5e30 100644 +index 75ed5050f72c001d6eab117a2c0b352a413548bd..2b036e80fbc1c873b47fe947dee7175a93586a90 100644 --- a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java +++ b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -@@ -36,6 +36,7 @@ public class MinecraftCommandPermissionsTest extends AbstractTestingBase { +@@ -37,6 +37,7 @@ public class MinecraftCommandPermissionsTest { @Test public void test() { diff --git a/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch b/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch index 1cab7be..f3bbeb7 100644 --- a/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch +++ b/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch @@ -9,10 +9,10 @@ add explicit block update suppression techniques, it's better than the server crashing. diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index b0ad25daf2d3c1727c61686e35eb4c03e1c60122..d963e8a6a498232a9ae760b2befaa17578a192f8 100644 +index d518487433088f090edb0d12e222b85f0c93b792..db232ac0cc27ddff4bc25ba9b9a5f3a1996fc4e8 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1919,7 +1919,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1936,7 +1936,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl Direction enumdirection = (Direction) iterator.next(); BlockPos blockposition1 = pos.relative(enumdirection); diff --git a/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch b/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch index f5c4e80..0d03372 100644 --- a/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch +++ b/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch @@ -9,7 +9,7 @@ data deserialization and is racey even in Vanilla. But in Folia, some accesses may throw and as such we need to fix this directly. diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 9f379fd5f3999e64c9b37851316ecd9069e19201..d681ec617590a3718f926cd5a9749952d5ac52bd 100644 +index 2f55541136976a8a04a657d87a658b11a1e1db2f..673d94f56882e86545e5e435ecb39caf8a8d43fe 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -709,7 +709,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple @@ -22,10 +22,10 @@ index 9f379fd5f3999e64c9b37851316ecd9069e19201..d681ec617590a3718f926cd5a9749952 // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 6e2ce383bb4d52702dfcb8823ce0c5dce7c81b5f..bd544eee8d7439a466f0f82e7d7a51a63b7294c0 100644 +index 551ad6757e76ec9c731488f0355d4950ad1b0bd4..9b8fd458c851d72901568845d973330ed58260a9 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -4448,6 +4448,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4451,6 +4451,11 @@ public abstract class LivingEntity extends Entity implements Attackable { } }); diff --git a/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch b/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch index 9419b90..62bd7d8 100644 --- a/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch +++ b/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch @@ -7,7 +7,7 @@ This allows the player to be re-positioned before logging into the world without causing thread checks to trip on Folia. diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index cc0c75340cc366f07a5bf169b4de50ba2d9ce366..5b68d16ef099285482e66a714d2e2f4c54e011ab 100644 +index 7503afc82ec13a7f5732d32d70ce47900a747352..77164bd5d562a72d5936dc84a41071472421eeb5 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -516,7 +516,13 @@ public abstract class PlayerList { diff --git a/patches/server/0017-Region-profiler.patch b/patches/server/0017-Region-profiler.patch index 8db3b3c..6299977 100644 --- a/patches/server/0017-Region-profiler.patch +++ b/patches/server/0017-Region-profiler.patch @@ -1375,10 +1375,10 @@ index fbc619a132c6ca6b1abab51ac230be29367e9c6e..97817400b70b2579f3a8750f7f33197a if (exception instanceof ReportedException) { ReportedException reportedexception = (ReportedException) exception; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index eda5f0d099f9f8621de8ad7808098abf6f5cb544..ac56b02498eb38883ae462be6ef3d15cb2a855aa 100644 +index 9e5c063d1371d766c9e34dc8a6758fb760c164bd..511992c31d70e806bba68737048ca760bef1def0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1656,6 +1656,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() % autosavePeriod == 0; // Folia - region threading @@ -1423,7 +1423,7 @@ index eda5f0d099f9f8621de8ad7808098abf6f5cb544..ac56b02498eb38883ae462be6ef3d15c try { this.isSaving = true; if (playerSaveInterval > 0) { -@@ -1736,6 +1747,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading entityplayer.connection.suspendFlushing(); -@@ -1877,7 +1890,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Paper - Ensure main @@ -1796,7 +1796,7 @@ index 5b68d16ef099285482e66a714d2e2f4c54e011ab..0bc623397576fc7c95fdeebf86b660b7 MinecraftTimings.savePlayers.startTiming(); // Paper int numSaved = 0; long now = System.nanoTime(); // Folia - region threading -@@ -1303,7 +1304,9 @@ public abstract class PlayerList { +@@ -1310,7 +1311,9 @@ public abstract class PlayerList { } // Folia end - region threading if (interval == -1 || now - entityplayer.lastSave >= timeInterval) { // Folia - region threading @@ -1838,7 +1838,7 @@ index cb61462d4691a055a4b25f7b953609d8a154fdfe..c74a01a8551457507441d266b6923b42 this.factory = factory; this.category = spawnGroup; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index d963e8a6a498232a9ae760b2befaa17578a192f8..4bb14874912557008fab7361754f2d2eb98fc5aa 100644 +index db232ac0cc27ddff4bc25ba9b9a5f3a1996fc4e8..3e739362046d624dd46412f7c50a7220d26593cf 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -203,6 +203,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl diff --git a/patches/server/0018-Disable-spark-profiler.patch b/patches/server/0018-Disable-spark-profiler.patch index 9610611..bc8978e 100644 --- a/patches/server/0018-Disable-spark-profiler.patch +++ b/patches/server/0018-Disable-spark-profiler.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Disable spark profiler It's not thread-safe. The plugin instead needs to be used. diff --git a/src/main/java/io/papermc/paper/SparksFly.java b/src/main/java/io/papermc/paper/SparksFly.java -index c7c396a7a94c35d973eb0796f8aba6e669ed5b7c..5e1eb6e1853ff19f26ca6f01dac77a05c804f539 100644 +index 19c4aa20617f555d02f9c1c5a93b7204ab7251d8..4b30b05dcd99176715d49133fb99b96383a0ecbc 100644 --- a/src/main/java/io/papermc/paper/SparksFly.java +++ b/src/main/java/io/papermc/paper/SparksFly.java -@@ -108,7 +108,7 @@ public final class SparksFly { +@@ -109,7 +109,7 @@ public final class SparksFly { private void enable() { if (!this.enabled) { @@ -18,7 +18,7 @@ index c7c396a7a94c35d973eb0796f8aba6e669ed5b7c..5e1eb6e1853ff19f26ca6f01dac77a05 this.enabled = true; this.spark.enable(); } else { -@@ -160,7 +160,7 @@ public final class SparksFly { +@@ -161,7 +161,7 @@ public final class SparksFly { } public static boolean isPluginPreferred() {