From ad5cdf1c649feea850cbb7538be209f6ba24406d Mon Sep 17 00:00:00 2001 From: xiaobai Date: Mon, 16 Feb 2026 17:43:39 +0800 Subject: [PATCH] =?UTF-8?q?2.2.0-1.20.4=20=E5=B0=86=E7=94=9F=E5=91=BD?= =?UTF-8?q?=E6=96=B9=E5=9D=97=E7=94=B1=E7=8E=A9=E5=AE=B6=E5=A4=B4=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=E5=85=B6=E4=BB=96=E5=8E=9F=E7=89=88=E5=A4=9A=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E6=96=B9=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- build.gradle | 2 +- .../com/playerblocklife/AdminCommands.class | Bin 0 -> 7315 bytes .../playerblocklife/BlockBreakListener.class | Bin 0 -> 7686 bytes .../CheckLifeBlocksCommand.class | Bin 0 -> 4463 bytes .../com/playerblocklife/ConfigManager.class | Bin 0 -> 7927 bytes .../main/com/playerblocklife/LifeSystem.class | Bin 0 -> 7545 bytes .../com/playerblocklife/MessageManager.class | Bin 0 -> 6251 bytes .../com/playerblocklife/PlayerBlockLife.class | Bin 0 -> 7404 bytes .../PlayerBlockManager$1.class | Bin 0 -> 1168 bytes .../playerblocklife/PlayerBlockManager.class | Bin 0 -> 20378 bytes .../playerblocklife/PlayerJoinListener.class | Bin 0 -> 7721 bytes .../playerblocklife/PlayerQuitListener.class | Bin 0 -> 1532 bytes .../SetLifeBlocksCommand.class | Bin 0 -> 2121 bytes .../com/playerblocklife/SkinManager.class | Bin 0 -> 17750 bytes build/docs/javadoc/allclasses-index.html | 120 ++ build/docs/javadoc/allpackages-index.html | 62 + .../com/playerblocklife/AdminCommands.html | 207 +++ .../playerblocklife/BlockBreakListener.html | 221 +++ .../CheckLifeBlocksCommand.html | 200 +++ .../com/playerblocklife/ConfigManager.html | 872 +++++++++++ .../com/playerblocklife/LifeSystem.html | 250 ++++ .../com/playerblocklife/MessageManager.html | 356 +++++ .../com/playerblocklife/PlayerBlockLife.html | 471 ++++++ .../playerblocklife/PlayerBlockManager.html | 465 ++++++ .../playerblocklife/PlayerJoinListener.html | 207 +++ .../playerblocklife/PlayerQuitListener.html | 183 +++ .../playerblocklife/SetLifeBlocksCommand.html | 194 +++ .../com/playerblocklife/SkinManager.html | 290 ++++ .../com/playerblocklife/package-summary.html | 145 ++ .../com/playerblocklife/package-tree.html | 100 ++ build/docs/javadoc/copy.svg | 33 + build/docs/javadoc/element-list | 1 + build/docs/javadoc/help-doc.html | 176 +++ build/docs/javadoc/index-all.html | 665 +++++++++ build/docs/javadoc/index.html | 25 + .../javadoc/legal/ADDITIONAL_LICENSE_INFO | 1 + build/docs/javadoc/legal/ASSEMBLY_EXCEPTION | 1 + build/docs/javadoc/legal/LICENSE | 1 + build/docs/javadoc/legal/jquery.md | 26 + build/docs/javadoc/legal/jqueryUI.md | 49 + build/docs/javadoc/link.svg | 31 + build/docs/javadoc/member-search-index.js | 1 + build/docs/javadoc/module-search-index.js | 1 + build/docs/javadoc/overview-tree.html | 104 ++ build/docs/javadoc/package-search-index.js | 1 + build/docs/javadoc/resources/glass.png | Bin 0 -> 499 bytes build/docs/javadoc/resources/x.png | Bin 0 -> 394 bytes .../javadoc/script-dir/jquery-3.7.1.min.js | 2 + .../docs/javadoc/script-dir/jquery-ui.min.css | 6 + .../docs/javadoc/script-dir/jquery-ui.min.js | 6 + build/docs/javadoc/script.js | 253 ++++ build/docs/javadoc/search-page.js | 284 ++++ build/docs/javadoc/search.html | 70 + build/docs/javadoc/search.js | 458 ++++++ build/docs/javadoc/stylesheet.css | 1272 +++++++++++++++++ build/docs/javadoc/tag-search-index.js | 1 + build/docs/javadoc/type-search-index.js | 1 + ...PlayerBlockLife-1.0.0-1.20.4-2026_2_13.jar | Bin 0 -> 634822 bytes build/libs/PlayerBlockLife-1.0.1-1.20.4.jar | Bin 0 -> 634564 bytes build/libs/PlayerBlockLife-2.0.0-1.20.4.jar | Bin 0 -> 646041 bytes build/libs/PlayerBlockLife-2.0.1-1.20.4.jar | Bin 0 -> 646041 bytes build/libs/PlayerBlockLife-2.1.0-1.20.4.jar | Bin 0 -> 647068 bytes build/libs/PlayerBlockLife-2.2.0-1.20.4.jar | Bin 0 -> 661891 bytes .../PlayerBlockLife-2.2.0-alpha-1.20.4.jar | Bin 0 -> 661903 bytes ...yerBlockLife-2.2.0-experimental-1.20.4.jar | Bin 0 -> 648836 bytes build/resources/main/config.yml | 97 ++ build/resources/main/messages.yml | 108 ++ build/resources/main/plugin.yml | 84 ++ .../compileJava/previous-compilation-data.bin | Bin 0 -> 47378 bytes build/tmp/jar/MANIFEST.MF | 4 + build/tmp/javadoc/javadoc.options | 20 + build/tmp/shadowJar/MANIFEST.MF | 4 + gradle.properties | 2 +- javadoc/allclasses-index.html | 2 +- javadoc/allpackages-index.html | 2 +- .../com/playerblocklife/AdminCommands.html | 2 +- .../playerblocklife/BlockBreakListener.html | 2 +- .../CheckLifeBlocksCommand.html | 2 +- .../com/playerblocklife/ConfigManager.html | 11 +- javadoc/com/playerblocklife/LifeSystem.html | 2 +- .../com/playerblocklife/MessageManager.html | 2 +- .../com/playerblocklife/PlayerBlockLife.html | 2 +- .../playerblocklife/PlayerBlockManager.html | 2 +- .../playerblocklife/PlayerJoinListener.html | 2 +- .../playerblocklife/PlayerQuitListener.html | 2 +- .../playerblocklife/SetLifeBlocksCommand.html | 2 +- javadoc/com/playerblocklife/SkinManager.html | 2 +- .../class-use/AdminCommands.html | 2 +- .../class-use/BlockBreakListener.html | 2 +- .../class-use/CheckLifeBlocksCommand.html | 2 +- .../class-use/ConfigManager.html | 2 +- .../playerblocklife/class-use/LifeSystem.html | 2 +- .../class-use/MessageManager.html | 2 +- .../class-use/PlayerBlockLife.html | 2 +- .../class-use/PlayerBlockManager.html | 2 +- .../class-use/PlayerJoinListener.html | 2 +- .../class-use/PlayerQuitListener.html | 2 +- .../class-use/SetLifeBlocksCommand.html | 2 +- .../class-use/SkinManager.html | 2 +- .../com/playerblocklife/package-summary.html | 2 +- javadoc/com/playerblocklife/package-tree.html | 2 +- javadoc/com/playerblocklife/package-use.html | 2 +- javadoc/help-doc.html | 2 +- javadoc/index-files/index-1.html | 2 +- javadoc/index-files/index-10.html | 2 +- javadoc/index-files/index-11.html | 2 +- javadoc/index-files/index-12.html | 2 +- javadoc/index-files/index-13.html | 2 +- javadoc/index-files/index-2.html | 2 +- javadoc/index-files/index-3.html | 2 +- javadoc/index-files/index-4.html | 2 +- javadoc/index-files/index-5.html | 2 +- javadoc/index-files/index-6.html | 2 +- javadoc/index-files/index-7.html | 2 +- javadoc/index-files/index-8.html | 2 +- javadoc/index-files/index-9.html | 2 +- javadoc/index.html | 2 +- javadoc/overview-tree.html | 2 +- javadoc/search.html | 2 +- .../com/playerblocklife/AdminCommands.java | 195 +-- .../playerblocklife/BlockBreakListener.java | 133 +- .../CheckLifeBlocksCommand.java | 139 +- .../com/playerblocklife/ConfigManager.java | 223 ++- .../com/playerblocklife/GameStateManager.java | 883 ++++++++++++ .../java/com/playerblocklife/LifeSystem.java | 12 +- .../com/playerblocklife/MessageManager.java | 59 + .../java/com/playerblocklife/PBLCommands.java | 139 ++ .../com/playerblocklife/PlayerBlockLife.java | 97 +- .../playerblocklife/PlayerBlockManager.java | 11 +- .../playerblocklife/PlayerJoinListener.java | 153 +- .../playerblocklife/PlayerQuitListener.java | 10 + .../playerblocklife/SetLifeBlocksCommand.java | 175 +-- .../java/com/playerblocklife/SkinManager.java | 8 +- src/main/resources/config.yml | 44 - src/main/resources/plugin.yml | 17 +- 136 files changed, 9850 insertions(+), 686 deletions(-) create mode 100644 build/classes/java/main/com/playerblocklife/AdminCommands.class create mode 100644 build/classes/java/main/com/playerblocklife/BlockBreakListener.class create mode 100644 build/classes/java/main/com/playerblocklife/CheckLifeBlocksCommand.class create mode 100644 build/classes/java/main/com/playerblocklife/ConfigManager.class create mode 100644 build/classes/java/main/com/playerblocklife/LifeSystem.class create mode 100644 build/classes/java/main/com/playerblocklife/MessageManager.class create mode 100644 build/classes/java/main/com/playerblocklife/PlayerBlockLife.class create mode 100644 build/classes/java/main/com/playerblocklife/PlayerBlockManager$1.class create mode 100644 build/classes/java/main/com/playerblocklife/PlayerBlockManager.class create mode 100644 build/classes/java/main/com/playerblocklife/PlayerJoinListener.class create mode 100644 build/classes/java/main/com/playerblocklife/PlayerQuitListener.class create mode 100644 build/classes/java/main/com/playerblocklife/SetLifeBlocksCommand.class create mode 100644 build/classes/java/main/com/playerblocklife/SkinManager.class create mode 100644 build/docs/javadoc/allclasses-index.html create mode 100644 build/docs/javadoc/allpackages-index.html create mode 100644 build/docs/javadoc/com/playerblocklife/AdminCommands.html create mode 100644 build/docs/javadoc/com/playerblocklife/BlockBreakListener.html create mode 100644 build/docs/javadoc/com/playerblocklife/CheckLifeBlocksCommand.html create mode 100644 build/docs/javadoc/com/playerblocklife/ConfigManager.html create mode 100644 build/docs/javadoc/com/playerblocklife/LifeSystem.html create mode 100644 build/docs/javadoc/com/playerblocklife/MessageManager.html create mode 100644 build/docs/javadoc/com/playerblocklife/PlayerBlockLife.html create mode 100644 build/docs/javadoc/com/playerblocklife/PlayerBlockManager.html create mode 100644 build/docs/javadoc/com/playerblocklife/PlayerJoinListener.html create mode 100644 build/docs/javadoc/com/playerblocklife/PlayerQuitListener.html create mode 100644 build/docs/javadoc/com/playerblocklife/SetLifeBlocksCommand.html create mode 100644 build/docs/javadoc/com/playerblocklife/SkinManager.html create mode 100644 build/docs/javadoc/com/playerblocklife/package-summary.html create mode 100644 build/docs/javadoc/com/playerblocklife/package-tree.html create mode 100644 build/docs/javadoc/copy.svg create mode 100644 build/docs/javadoc/element-list create mode 100644 build/docs/javadoc/help-doc.html create mode 100644 build/docs/javadoc/index-all.html create mode 100644 build/docs/javadoc/index.html create mode 100644 build/docs/javadoc/legal/ADDITIONAL_LICENSE_INFO create mode 100644 build/docs/javadoc/legal/ASSEMBLY_EXCEPTION create mode 100644 build/docs/javadoc/legal/LICENSE create mode 100644 build/docs/javadoc/legal/jquery.md create mode 100644 build/docs/javadoc/legal/jqueryUI.md create mode 100644 build/docs/javadoc/link.svg create mode 100644 build/docs/javadoc/member-search-index.js create mode 100644 build/docs/javadoc/module-search-index.js create mode 100644 build/docs/javadoc/overview-tree.html create mode 100644 build/docs/javadoc/package-search-index.js create mode 100644 build/docs/javadoc/resources/glass.png create mode 100644 build/docs/javadoc/resources/x.png create mode 100644 build/docs/javadoc/script-dir/jquery-3.7.1.min.js create mode 100644 build/docs/javadoc/script-dir/jquery-ui.min.css create mode 100644 build/docs/javadoc/script-dir/jquery-ui.min.js create mode 100644 build/docs/javadoc/script.js create mode 100644 build/docs/javadoc/search-page.js create mode 100644 build/docs/javadoc/search.html create mode 100644 build/docs/javadoc/search.js create mode 100644 build/docs/javadoc/stylesheet.css create mode 100644 build/docs/javadoc/tag-search-index.js create mode 100644 build/docs/javadoc/type-search-index.js create mode 100644 build/libs/PlayerBlockLife-1.0.0-1.20.4-2026_2_13.jar create mode 100644 build/libs/PlayerBlockLife-1.0.1-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.0.0-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.0.1-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.1.0-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.2.0-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.2.0-alpha-1.20.4.jar create mode 100644 build/libs/PlayerBlockLife-2.2.0-experimental-1.20.4.jar create mode 100644 build/resources/main/config.yml create mode 100644 build/resources/main/messages.yml create mode 100644 build/resources/main/plugin.yml create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 build/tmp/jar/MANIFEST.MF create mode 100644 build/tmp/javadoc/javadoc.options create mode 100644 build/tmp/shadowJar/MANIFEST.MF create mode 100644 src/main/java/com/playerblocklife/GameStateManager.java create mode 100644 src/main/java/com/playerblocklife/PBLCommands.java diff --git a/.gitignore b/.gitignore index 81c66a7..ad02672 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .gradle -build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ @@ -42,3 +41,6 @@ bin/ ### Mac OS ### .DS_Store /AIedit.txt + +### Website ### +webside/ diff --git a/build.gradle b/build.gradle index 0934e8f..9b70568 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'com.playerblocklife' -version = '3.0.0-experimental-1.20.4' +version = '2.2.0-1.20.4' sourceCompatibility = 17 targetCompatibility = 17 diff --git a/build/classes/java/main/com/playerblocklife/AdminCommands.class b/build/classes/java/main/com/playerblocklife/AdminCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..1f43818c2f3e9c431c443c813c068fb56b7541c8 GIT binary patch literal 7315 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 b?)fxn8NWoBw*&}_+htR3p7cmWdJ*_PSSyAn literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/playerblocklife/CheckLifeBlocksCommand.class b/build/classes/java/main/com/playerblocklife/CheckLifeBlocksCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..b705a7bca66ae6def16e5472374063aeea5c7cb2 GIT binary patch literal 4463 zcma)AYgAO%75)wabAj?I9xQgO)H5u z5>u^FV>D79(OQjKLJT5^CQWOT^!-lXO~cIK%8&L(f8>WNtKYeEkpZSIS!?e7?mqkM zz0ZD~bNJx1zUu&%;Z`DIFu{UYE8-9@FlDp4Rn7CL-iExgy3LwP7l>c#_PX`u0uwT` zY7(Fz!Gc69l3*3ccKMp~T0H7@&0pv7xtcugOGh4~UN1ye1sSuqXC0?844 zMUARnVCJkLBO(A^|Wban*<)rbd2>( zK~@AQJfpxyr>0qPAMO{J(X2LUMLw@f)oa~)BT=iadiB;Z!pxabge4&zb1ax^#RJF? zNRLt_wFcG;{d>->@BSlqv-CNo;J9END5r$*ibhjt3 zy4t>qVR;w}EO^9Iu6v_y%6nHX*wgh1etd-Q$A9aj}3U=8dRthHht90Iw~92>oMGZqLe z$*A1s)?JOIYKsg>#+a%f(PO5^2tgobqdgH$lvz-2#p9?Dm>*5~9aE!-u=xD-Zm;Sw z+K}Cb2}qOCskWj||-uc^j8T2v}tVWK(gn3t-iV&_uV@uCZ4Y%SPC2g%>^n#pUzrtRl9l*^$<=sroB5 zR;|~i6=ZEtu!SWNIx;ZS(XD{Y@nsc-&XQsUZN$NIM-2Klw$ReTl4567p@QuK34sIc zp}teb*w+LS9rltnRZp#SRCC@l91dPNIdq`Y7=BE_4obS!zti}9mWy%NOUbvBe58i@ zZx{pL;y}6GxlX}uX;62EL0zg~kNj-!GCse3N0+Q>1^dFfhKKi4M$!60r-B1gW#>!A zq(j8z)fMFqDm^TPU4Gr5A0cX<`Oll^12 zHDRX$9wv0g?BS?!`Tw1i0+YgO&1N_~QulD{AlF20G_EFgdovG|X0t7_mMVR1ewVh| zEt6(;^c^nd7 z+(78y8=<}D0+)J%9cPD5zWDEJ?ZLfg1G{?y`?`XMPXymQ6g++=bZk#x*OkG617Xh4 z(Vd}#$0;QE^3_1+;m`{`!5!@%?|4?huLb6aWy_YO4-TA&%9YMR1-})zPXs#74GtU$ ziwGX-y7m0N{B$8idS1F%q~P~ltO)k@26yiZ%g;{_UF-;4-xavFBXD+)f zZEw+{ut(;1_~J0?cx;L&QazqZx2`e0tah(g^A~y4)>ch6hdUW-L4Y@eaqEj_wgn-9 z`|r-mDhsa>bGVzw@T_-%KbyS1@T@+8I1ZOc{{g>N^Bu!?V)hk??3}k?d4pdu=;Ct{ zd4bvTfPn-CL5`$^xzUX``NesLRDsLHam;@b78%T6l*~(FASwBzbYmHx z)8mJ~!Xj6gT&AcV6y;mGQIblzrSs3zF#dgsKf#||SQ>u|_**T-N`ZZ-G)0_6wj@>= z#M(Q=>5>>$MnQ&2W9?p_ucRtBF)uq+>A{ov2_q)UrKBeGK{aQ_UNG#Cj&|}w2L_85 zAI#*Ab5fL=MlwxoG0aZX0bqM#?2T%0Mi}yFAX{#1edn<@kih_5WZ6K1HFh zVU-c6P4xSxlyn8X3?3se95SM-=#yR`>c=%1P@)0y(JMsPaf2aG$A9rQ-eIaN#7Foc z^~KYMPW%Wzrk$VAx|{e3)9XE2o`U#UpP}7?iNXSBa`M#MSYm-@B*oNNssj~)DnQ{f zyLh}b6QqG}8I1RGdQe}QYunrd&k@AiTDo#=eiQ4&TTT2l@mEd!b>eTB_?yJ-CVq~1 zmx-Sz?lAES#4nn7FY$Lw{1Wj&6TeLSiiwXBA2acHiBFjLB=Kt|K27{R6Mw(Uc3y^a zf>AwdA#cX(=s*XiqLlUHq|?f<2<0f`ji3}2SkH{pP=zh1#xp$Ccc2!Bn4~8;auFNo zxs7!96GlMO!+shLBOU)f10ZYpU7m+~=|>rg8JKcg{*xdjY4qQ4fxb_kSbV@|41S8A z8DD~zq@NSzGO&N8#9tWCUm4He7|-7s&p#N?4~^%a@h{GpMVp*V&W~55QU?E~C>TT# HLrDD}E~_@= literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/playerblocklife/ConfigManager.class b/build/classes/java/main/com/playerblocklife/ConfigManager.class new file mode 100644 index 0000000000000000000000000000000000000000..f73650dbd9052bc84dc1d0aa7608fb8c95c86b99 GIT binary patch literal 7927 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 E1NQ_K@c;k- literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/playerblocklife/MessageManager.class b/build/classes/java/main/com/playerblocklife/MessageManager.class new file mode 100644 index 0000000000000000000000000000000000000000..2f897918ed8ce098159ec74cb6a087c98889f51e GIT binary patch literal 6251 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

s?*dd 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 Rs&@_brn!c>g07Ji{C}Ol%?bbj literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/playerblocklife/PlayerJoinListener.class b/build/classes/java/main/com/playerblocklife/PlayerJoinListener.class new file mode 100644 index 0000000000000000000000000000000000000000..2e4bfa8ba79b554cb6a5fadee44160d97d4df03a GIT binary patch literal 7721 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 WwZ3DmL2Erl9&!2@1~H5?sQDM#+P5Yoj<1f^ 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 literal 0 HcmV?d00001 diff --git a/build/docs/javadoc/allclasses-index.html b/build/docs/javadoc/allclasses-index.html new file mode 100644 index 0000000..fc5b123 --- /dev/null +++ b/build/docs/javadoc/allclasses-index.html @@ -0,0 +1,120 @@ + + + + +所有类和接口 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + +

您的浏览器已禁用 JavaScript。
+ +
+ +
+
+
+

所有类和接口

+
+
+
+
+
+
+
说明
+ +
+
AdminCommands - PBL游戏模式的管理员命令处理器
+
+ +
+
BlockBreakListener - PBL游戏模式下的方块破坏和放置监听器
+
+ +
+
CheckLifeBlocksCommand - 显示玩家在PBL游戏模式下的生命方块状态
+
+ +
+
配置管理器 - 负责加载、保存和管理插件的配置文件
+
+ +
+
游戏状态管理器 - PBL生存游戏模式的核心管理器
+
+ +
 
+ +
+
生命值系统 - 负责管理玩家生命值和状态效果
+
+ +
 
+ +
+
PBL命令执行器 - 处理PBL游戏模式的专用命令
+
+ +
+
PlayerBlockLife插件主类 - PBL生存游戏模式的核心控制器
+
+ +
+
玩家方块管理器 - 负责管理玩家生命方块的核心组件
+
+ +
+
PlayerJoinListener - PBL游戏模式下的玩家加入和重生监听器
+
+ +
+
PlayerQuitListener - PBL游戏模式下的玩家退出监听器
+
+ +
+
SetLifeBlocksCommand - 在新模式下提示命令不可用
+
+ +
+
皮肤管理器 - 负责玩家皮肤的获取、缓存和应用
+
+
+
+
+
+
+
+ + diff --git a/build/docs/javadoc/allpackages-index.html b/build/docs/javadoc/allpackages-index.html new file mode 100644 index 0000000..30f35f8 --- /dev/null +++ b/build/docs/javadoc/allpackages-index.html @@ -0,0 +1,62 @@ + + + + +所有程序包 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+
+

所有程序包

+
+
程序包概要
+
+
程序包
+
说明
+ +
 
+
+
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/AdminCommands.html b/build/docs/javadoc/com/playerblocklife/AdminCommands.html new file mode 100644 index 0000000..6cca54f --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/AdminCommands.html @@ -0,0 +1,207 @@ + + + + +AdminCommands (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 AdminCommands

+
+
java.lang.Object +
com.playerblocklife.AdminCommands
+
+
+
+
所有已实现的接口:
+
org.bukkit.command.CommandExecutor
+
+
+
public class AdminCommands +extends Object +implements org.bukkit.command.CommandExecutor
+
AdminCommands - PBL游戏模式的管理员命令处理器 + +

处理插件的传统管理员命令,适配新的PBL游戏模式:
+

    +
  • /pblreload - 重载插件配置
  • +
  • /pbldelete - 删除指定玩家的生命方块
  • +
  • /pblrevive - 复活被淘汰的玩家
  • +
  • /pblstats - 显示PBL游戏统计信息
  • +
+ +

这些命令在新模式下会与GameStateManager交互,以正确管理游戏状态。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      AdminCommands

      +
      public AdminCommands(PlayerBlockLife plugin)
      +
      构造一个新的管理员命令执行器
      +
      +
      参数:
      +
      plugin - 插件主类实例
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onCommand

      +
      public boolean onCommand(org.bukkit.command.CommandSender sender, + org.bukkit.command.Command command, + String label, + String[] args)
      +
      +
      指定者:
      +
      onCommand 在接口中 org.bukkit.command.CommandExecutor
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/BlockBreakListener.html b/build/docs/javadoc/com/playerblocklife/BlockBreakListener.html new file mode 100644 index 0000000..bcf50d4 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/BlockBreakListener.html @@ -0,0 +1,221 @@ + + + + +BlockBreakListener (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 BlockBreakListener

+
+
java.lang.Object +
com.playerblocklife.BlockBreakListener
+
+
+
+
所有已实现的接口:
+
org.bukkit.event.Listener
+
+
+
public class BlockBreakListener +extends Object +implements org.bukkit.event.Listener
+
BlockBreakListener - PBL游戏模式下的方块破坏和放置监听器 + +

监听玩家对生命方块的破坏行为,并在PBL游戏模式下进行相应处理: +

    +
  • 检查被破坏的方块是否为生命方块(羊毛、玻璃、水泥)
  • +
  • 验证破坏者是否有权限破坏该方块
  • +
  • 更新玩家剩余生命方块数量
  • +
  • 处理玩家淘汰逻辑
  • +
  • 在游戏未开始时阻止方块破坏
  • +
+ +

此监听器与GameStateManager协作,确保游戏规则正确执行。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      BlockBreakListener

      +
      public BlockBreakListener(PlayerBlockLife plugin)
      +
      构造一个新的方块破坏监听器
      +
      +
      参数:
      +
      plugin - 插件主类实例
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onBlockBreak

      +
      public void onBlockBreak(org.bukkit.event.block.BlockBreakEvent event)
      +
      处理方块被破坏的事件
      +
      +
      参数:
      +
      event - 方块破坏事件
      +
      +
      +
    • +
    • +
      +

      onBlockPlace

      +
      public void onBlockPlace(org.bukkit.event.block.BlockPlaceEvent event)
      +
      处理方块被放置的事件
      +
      +
      参数:
      +
      event - 方块放置事件
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/CheckLifeBlocksCommand.html b/build/docs/javadoc/com/playerblocklife/CheckLifeBlocksCommand.html new file mode 100644 index 0000000..2d3caeb --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/CheckLifeBlocksCommand.html @@ -0,0 +1,200 @@ + + + + +CheckLifeBlocksCommand (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 CheckLifeBlocksCommand

+
+
java.lang.Object +
com.playerblocklife.CheckLifeBlocksCommand
+
+
+
+
所有已实现的接口:
+
org.bukkit.command.CommandExecutor
+
+
+
public class CheckLifeBlocksCommand +extends Object +implements org.bukkit.command.CommandExecutor
+
CheckLifeBlocksCommand - 显示玩家在PBL游戏模式下的生命方块状态 + +

在PBL游戏模式下,此命令显示玩家当前的剩余生命方块数、游戏状态和分配的颜色。 + 与旧模式不同,此命令不再显示生命方块的具体位置,而是提供当前游戏状态信息。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      CheckLifeBlocksCommand

      +
      public CheckLifeBlocksCommand(PlayerBlockLife plugin)
      +
      构造一个新的检查生命方块命令执行器
      +
      +
      参数:
      +
      plugin - 插件主类实例
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onCommand

      +
      public boolean onCommand(org.bukkit.command.CommandSender sender, + org.bukkit.command.Command command, + String label, + String[] args)
      +
      +
      指定者:
      +
      onCommand 在接口中 org.bukkit.command.CommandExecutor
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/ConfigManager.html b/build/docs/javadoc/com/playerblocklife/ConfigManager.html new file mode 100644 index 0000000..2c67afc --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/ConfigManager.html @@ -0,0 +1,872 @@ + + + + +ConfigManager (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 ConfigManager

+
+
java.lang.Object +
com.playerblocklife.ConfigManager
+
+
+
+
public class ConfigManager +extends Object
+
配置管理器 - 负责加载、保存和管理插件的配置文件 + +

主要功能包括: +

    +
  • 加载和验证配置文件
  • +
  • 配置版本检查和自动更新
  • +
  • 提供类型安全的配置项访问方法
  • +
  • 处理配置文件的保存和重载
  • +
  • 管理SkinsRestorer插件集成配置
  • +
  • 支持多种皮肤来源的优先级配置
  • +
+ +

SkinsRestorer配置支持:

+
    +
  • skin.source:皮肤来源优先级(skinsrestorer/player_profile/local_cache)
  • +
  • skin.use-skinsrestorer:是否启用SkinsRestorer支持
  • +
  • skin.cache.expire_days:皮肤缓存过期时间
  • +
  • 默认配置已优化,优先使用SkinsRestorer以支持离线服务器
  • +
+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      ConfigManager

      +
      public ConfigManager(PlayerBlockLife plugin)
      +
      构造一个新的配置管理器
      +
      +
      参数:
      +
      plugin - 插件主类实例,用于访问插件相关功能
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      loadConfig

      +
      public void loadConfig()
      +
      加载插件配置 + +

      执行以下操作: +

        +
      1. 确保插件数据文件夹存在
      2. +
      3. 如果配置文件不存在,从JAR中复制默认配置
      4. +
      5. 调用reloadConfig()重新加载配置
      6. +
      +
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      reloadConfig

      +
      public void reloadConfig()
      +
      重新加载配置文件 + +

      执行以下操作: +

        +
      1. 从磁盘重新加载配置文件
      2. +
      3. 加载JAR中的默认配置作为后备
      4. +
      5. 检查配置版本并进行必要的更新
      6. +
      +
      +
      另请参阅:
      +
      +
        +
      • checkConfigVersion()
      • +
      +
      +
      +
      +
    • +
    • +
      +

      saveConfig

      +
      public void saveConfig()
      +
      保存当前配置到文件 + +

      将内存中的配置数据写入到config.yml文件中。 + 如果保存失败,会记录错误日志。

      +
      +
      抛出:
      +
      IOException - 如果文件写入失败
      +
      +
      +
    • +
    • +
      +

      getConfig

      +
      public org.bukkit.configuration.file.FileConfiguration getConfig()
      +
      获取配置对象 + +

      如果配置对象为null,会自动调用reloadConfig()加载配置。

      +
      +
      返回:
      +
      当前的FileConfiguration配置对象
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getBlocksPerPlayer

      +
      public int getBlocksPerPlayer()
      +
      +
    • +
    • +
      +

      getSpreadRange

      +
      public int getSpreadRange()
      +
      +
    • +
    • +
      +

      getMinDistance

      +
      public int getMinDistance()
      +
      +
    • +
    • +
      +

      getDepth

      +
      public int getDepth()
      +
      +
    • +
    • +
      +

      getBlockMaterial

      +
      public String getBlockMaterial()
      +
      获取方块材质配置
      +
      +
      返回:
      +
      方块材质配置值,默认为"player_head"
      +
      +
      +
    • +
    • +
      +

      isDieWhenBlocksGone

      +
      public boolean isDieWhenBlocksGone()
      +
      检查玩家方块被挖光时是否死亡
      +
      +
      返回:
      +
      如果玩家方块被挖光时死亡则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isBecomeSpectator

      +
      public boolean isBecomeSpectator()
      +
      检查玩家死亡后是否成为观察者
      +
      +
      返回:
      +
      如果玩家死亡后成为观察者则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isHealthSystemEnabled

      +
      public boolean isHealthSystemEnabled()
      +
      检查是否启用生命值系统
      +
      +
      返回:
      +
      如果启用生命值系统则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isSkinSystemEnabled

      +
      public boolean isSkinSystemEnabled()
      +
      检查是否启用皮肤系统
      +
      +
      返回:
      +
      如果启用皮肤系统则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getSkinSource

      +
      public String getSkinSource()
      +
      获取皮肤来源配置 + +

      支持的皮肤来源: +

        +
      • skinsrestorer:优先从SkinsRestorer插件获取皮肤纹理数据 +
          +
        • 推荐用于离线服务器
        • +
        • 支持玩家自定义皮肤
        • +
        • 避免默认Steve皮肤问题
        • +
        +
      • +
      • player_profile:优先使用Bukkit的PlayerProfile API +
          +
        • 需要玩家在线验证
        • +
        • 适合在线服务器
        • +
        • 支持Mojang官方皮肤
        • +
        +
      • +
      • local_cache:优先从本地缓存加载皮肤数据 +
          +
        • 减少网络请求
        • +
        • 提高加载速度
        • +
        • 支持离线使用
        • +
        +
      • +
      + +

      默认配置已将此值设为"skinsrestorer",以优化离线服务器体验。

      +
      +
      返回:
      +
      皮肤来源配置值
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      useSkinsRestorer

      +
      public boolean useSkinsRestorer()
      +
      检查是否启用SkinsRestorer插件支持 + +

      当此方法返回true时,插件将: +

        +
      • 优先从SkinsRestorer插件获取玩家皮肤纹理
      • +
      • 支持离线服务器获取玩家自定义皮肤
      • +
      • 避免方块总是显示默认Steve皮肤的问题
      • +
      • 使用反射安全调用SkinsRestorer API,无需硬依赖
      • +
      + +

      默认配置已将此值设为true,以优化离线服务器体验。

      +
      +
      返回:
      +
      如果启用SkinsRestorer支持返回true,否则返回false
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getCacheExpireDays

      +
      public int getCacheExpireDays()
      +
      获取皮肤缓存过期天数
      +
      +
      返回:
      +
      皮肤缓存过期天数,默认为7天
      +
      +
      +
    • +
    • +
      +

      isAutoSaveEnabled

      +
      public boolean isAutoSaveEnabled()
      +
      检查是否启用自动保存
      +
      +
      返回:
      +
      如果启用自动保存则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getAutoSaveInterval

      +
      public int getAutoSaveInterval()
      +
      获取自动保存间隔
      +
      +
      返回:
      +
      自动保存间隔(秒),默认为300秒(5分钟)
      +
      +
      +
    • +
    • +
      +

      getStorageType

      +
      public String getStorageType()
      +
      获取存储类型配置
      +
      +
      返回:
      +
      存储类型配置值,默认为"yaml"
      +
      +
      +
    • +
    • +
      +

      isBroadcastOnBlockBreak

      +
      public boolean isBroadcastOnBlockBreak()
      +
      检查是否在方块被破坏时广播消息
      +
      +
      返回:
      +
      如果在方块被破坏时广播消息则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isBroadcastOnPlayerDeath

      +
      public boolean isBroadcastOnPlayerDeath()
      +
      检查是否在玩家死亡时广播消息
      +
      +
      返回:
      +
      如果在玩家死亡时广播消息则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getBroadcastRange

      +
      public int getBroadcastRange()
      +
      获取广播范围
      +
      +
      返回:
      +
      广播范围(方块),默认为30
      +
      +
      +
    • +
    • +
      +

      isGiveExpReward

      +
      public boolean isGiveExpReward()
      +
      检查是否给予挖掘奖励经验
      +
      +
      返回:
      +
      如果给予挖掘奖励经验则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getExpRewardAmount

      +
      public int getExpRewardAmount()
      +
      获取奖励经验数量
      +
      +
      返回:
      +
      奖励经验数量,默认为5
      +
      +
      +
    • +
    • +
      +

      isProtectFromExplosions

      +
      public boolean isProtectFromExplosions()
      +
      检查是否保护方块免受爆炸破坏
      +
      +
      返回:
      +
      如果保护方块免受爆炸破坏则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isProtectFromFire

      +
      public boolean isProtectFromFire()
      +
      检查是否保护方块免受火灾破坏
      +
      +
      返回:
      +
      如果保护方块免受火灾破坏则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isProtectFromPistons

      +
      public boolean isProtectFromPistons()
      +
      检查是否保护方块免受活塞推动
      +
      +
      返回:
      +
      如果保护方块免受活塞推动则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isAutoGenerationEnabled

      +
      public boolean isAutoGenerationEnabled()
      +
      检查是否启用自动生成
      +
      +
      返回:
      +
      如果启用自动生成则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isRequireOpenSky

      +
      public boolean isRequireOpenSky()
      +
      检查是否需要开放天空
      +
      +
      返回:
      +
      如果需要开放天空则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getMaxAttempts

      +
      public int getMaxAttempts()
      +
      获取最大尝试次数
      +
      +
      返回:
      +
      最大尝试次数,默认为50
      +
      +
      +
    • +
    • +
      +

      getOnFailureAction

      +
      public String getOnFailureAction()
      +
      获取失败时的处理方式
      +
      +
      返回:
      +
      失败时的处理方式,默认为"notify"
      +
      +
      +
    • +
    • +
      +

      isCommandEnabled

      +
      public boolean isCommandEnabled(String commandName)
      +
      检查命令是否启用
      +
      +
      参数:
      +
      commandName - 命令名称
      +
      返回:
      +
      如果命令启用则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isSelfUseAllowed

      +
      public boolean isSelfUseAllowed(String commandName)
      +
      检查是否允许玩家自己使用命令
      +
      +
      参数:
      +
      commandName - 命令名称
      +
      返回:
      +
      如果允许玩家自己使用命令则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isAdminUseAllowed

      +
      public boolean isAdminUseAllowed(String commandName)
      +
      检查是否允许管理员使用命令
      +
      +
      参数:
      +
      commandName - 命令名称
      +
      返回:
      +
      如果允许管理员使用命令则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      isAdminOnly

      +
      public boolean isAdminOnly(String commandName)
      +
      检查命令是否仅管理员可用
      +
      +
      参数:
      +
      commandName - 命令名称
      +
      返回:
      +
      如果命令仅管理员可用则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      useExternalMessageFile

      +
      public boolean useExternalMessageFile()
      +
      检查是否使用外部消息文件
      +
      +
      返回:
      +
      如果使用外部消息文件则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getExternalMessageFileName

      +
      public String getExternalMessageFileName()
      +
      获取外部消息文件名
      +
      +
      返回:
      +
      外部消息文件名,默认为"messages.yml"
      +
      +
      +
    • +
    • +
      +

      getMessage

      +
      public String getMessage(String path, + String defaultValue)
      +
      获取消息
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      消息内容
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/LifeSystem.html b/build/docs/javadoc/com/playerblocklife/LifeSystem.html new file mode 100644 index 0000000..f1f55aa --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/LifeSystem.html @@ -0,0 +1,250 @@ + + + + +LifeSystem (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 LifeSystem

+
+
java.lang.Object +
com.playerblocklife.LifeSystem
+
+
+
+
public class LifeSystem +extends Object
+
生命值系统 - 负责管理玩家生命值和状态效果 + +

根据玩家剩余生命方块数量计算生命值,并应用相应的状态效果: +

    +
  • 监控玩家剩余方块数量变化
  • +
  • 计算对应的生命值比例
  • +
  • 应用虚弱、缓慢、失明等负面效果
  • +
  • 处理玩家淘汰和复活逻辑
  • +
  • 提供生命值相关的音效和视觉反馈
  • +
+ +

生命值计算公式: +

+ 5个方块 → 20点生命值(满血)
+ 4个方块 → 16点生命值
+ 3个方块 → 12点生命值
+ 2个方块 → 8点生命值
+ 1个方块 → 4点生命值
+ 0个方块 → 0点生命值(淘汰)
+ 
+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    + +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      checkAllPlayers

      +
      public void checkAllPlayers()
      +
      +
    • +
    • +
      +

      checkPlayerHealth

      +
      public void checkPlayerHealth(org.bukkit.entity.Player player)
      +
      +
    • +
    • +
      +

      handlePlayerDeath

      +
      public void handlePlayerDeath(UUID playerId)
      +
      +
    • +
    • +
      +

      getPlayerHealth

      +
      public Integer getPlayerHealth(UUID playerId)
      +
      +
    • +
    • +
      +

      setPlayerHealth

      +
      public void setPlayerHealth(UUID playerId, + int health)
      +
      +
    • +
    • +
      +

      isPlayerAlive

      +
      public boolean isPlayerAlive(UUID playerId)
      +
      +
    • +
    • +
      +

      revivePlayer

      +
      public void revivePlayer(org.bukkit.entity.Player player)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/MessageManager.html b/build/docs/javadoc/com/playerblocklife/MessageManager.html new file mode 100644 index 0000000..49edb67 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/MessageManager.html @@ -0,0 +1,356 @@ + + + + +MessageManager (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 MessageManager

+
+
java.lang.Object +
com.playerblocklife.MessageManager
+
+
+
+
public class MessageManager +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      MessageManager

      +
      public MessageManager(PlayerBlockLife plugin)
      +
      构造一个新的消息管理器
      +
      +
      参数:
      +
      plugin - 插件主类实例
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      loadMessages

      +
      public void loadMessages()
      +
      加载消息配置
      +
      +
    • +
    • +
      +

      reloadMessages

      +
      public void reloadMessages()
      +
      重新加载消息配置
      +
      +
    • +
    • +
      +

      getMessage

      +
      public String getMessage(String path, + String defaultValue)
      +
      获取消息
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      消息内容
      +
      +
      +
    • +
    • +
      +

      getFormattedMessage

      +
      public String getFormattedMessage(String path, + String defaultValue, + Map<String,String> variables)
      +
      获取格式化消息(替换变量)
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      variables - 变量映射
      +
      返回:
      +
      格式化后的消息内容
      +
      +
      +
    • +
    • +
      +

      getConsoleMessage

      +
      public String getConsoleMessage(String path, + String defaultValue)
      +
      获取控制台消息
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      控制台消息内容
      +
      +
      +
    • +
    • +
      +

      getGameMessage

      +
      public String getGameMessage(String path, + String defaultValue)
      +
      获取游戏内消息
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      游戏内消息内容
      +
      +
      +
    • +
    • +
      +

      getCommandMessage

      +
      public String getCommandMessage(String command, + String path, + String defaultValue)
      +
      获取命令消息
      +
      +
      参数:
      +
      command - 命令名称
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      命令消息内容
      +
      +
      +
    • +
    • +
      +

      getBroadcastMessage

      +
      public String getBroadcastMessage(String path, + String defaultValue)
      +
      获取广播消息
      +
      +
      参数:
      +
      path - 消息路径
      +
      defaultValue - 默认值
      +
      返回:
      +
      广播消息内容
      +
      +
      +
    • +
    • +
      +

      hasExternalMessageFile

      +
      public boolean hasExternalMessageFile()
      +
      检查消息文件是否存在
      +
      +
      返回:
      +
      如果外部消息文件存在则返回true,否则返回false
      +
      +
      +
    • +
    • +
      +

      getMessageFilePath

      +
      public String getMessageFilePath()
      +
      获取消息文件路径
      +
      +
      返回:
      +
      消息文件的绝对路径
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/PlayerBlockLife.html b/build/docs/javadoc/com/playerblocklife/PlayerBlockLife.html new file mode 100644 index 0000000..877677a --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/PlayerBlockLife.html @@ -0,0 +1,471 @@ + + + + +PlayerBlockLife (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 PlayerBlockLife

+
+
java.lang.Object +
org.bukkit.plugin.PluginBase +
org.bukkit.plugin.java.JavaPlugin +
com.playerblocklife.PlayerBlockLife
+
+
+
+
+
+
所有已实现的接口:
+
io.papermc.paper.plugin.lifecycle.event.LifecycleEventOwner, org.bukkit.command.CommandExecutor, org.bukkit.command.TabCompleter, org.bukkit.command.TabExecutor, org.bukkit.plugin.Plugin
+
+
+
public class PlayerBlockLife +extends org.bukkit.plugin.java.JavaPlugin
+
PlayerBlockLife插件主类 - PBL生存游戏模式的核心控制器 + +

这个插件为Minecraft服务器添加了一个独特的生存游戏模式:每个非OP玩家拥有一定数量的生命方块, + 这些方块使用不同颜色的羊毛、玻璃或水泥方块表示。当其他玩家挖光某个玩家的所有生命方块时,该玩家会被淘汰。 + 游戏需要管理员使用/PBL start命令开始,支持限时模式,最后存活的玩家获胜。

+ +

主要功能:

+
    +
  • 管理PBL游戏的完整生命周期(等待、进行、结束)
  • +
  • 为非OP玩家分配独特的颜色生命方块
  • +
  • 处理生命方块的生成和销毁
  • +
  • 监控游戏状态和玩家存活情况
  • +
  • 提供PBL专用命令系统(/PBL start, /PBL rstgm)
  • +
  • 支持游戏计分板显示
  • +
  • 管理员可使用传统命令进行管理
  • +
+
+
从以下版本开始:
+
1.0.0
+
+
+
+
    + +
  • +
    +

    构造器概要

    +
    构造器
    +
    +
    构造器
    +
    说明
    + +
     
    +
    +
    +
  • + +
  • +
    +

    方法概要

    +
    +
    +
    +
    +
    修饰符和类型
    +
    方法
    +
    说明
    + + +
    +
    获取方块管理器
    +
    + + +
    +
    获取配置管理器
    +
    + + +
    +
    获取游戏状态管理器
    +
    + + +
    +
    获取插件单例实例
    +
    + + +
    +
    获取生命值系统
    +
    + + +
    +
    获取消息管理器
    +
    + + +
    +
    获取皮肤管理器
    +
    +
    void
    +
    logError(String message, + Throwable throwable)
    +
    +
    记录错误级别日志
    +
    +
    void
    +
    logInfo(String message)
    +
    +
    记录信息级别日志
    +
    +
    void
    +
    logWarning(String message)
    +
    +
    记录警告级别日志
    +
    +
    void
    + +
    +
    插件禁用时调用,执行清理操作
    +
    +
    void
    + +
    +
    插件启用时调用,执行初始化操作
    +
    +
    void
    + +
    +
    重写 reloadConfig 方法,避免循环依赖
    +
    +
    void
    + +
    +
    插件的完整重载方法(用于命令)
    +
    +
    +
    +
    +
    +

    从类继承的方法 org.bukkit.plugin.java.JavaPlugin

    +getClassLoader, getCommand, getConfig, getDataFolder, getDefaultBiomeProvider, getDefaultWorldGenerator, getDescription, getFile, getLifecycleManager, getLogger, getPlugin, getPluginLoader, getPluginMeta, getProvidingPlugin, getResource, getServer, getTextResource, init, init, isEnabled, isNaggable, onCommand, onLoad, onTabComplete, saveConfig, saveDefaultConfig, saveResource, setEnabled, setNaggable, toString
    +
    +

    从类继承的方法 org.bukkit.plugin.PluginBase

    +equals, getName, hashCode
    +
    +

    从类继承的方法 java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +

    从接口继承的方法 org.bukkit.plugin.Plugin

    +getComponentLogger, getLog4JLogger, getSLF4JLogger
    +
    +
  • +
+
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      PlayerBlockLife

      +
      public PlayerBlockLife()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onEnable

      +
      public void onEnable()
      +
      插件启用时调用,执行初始化操作 + +

      初始化流程: +

        +
      1. 保存默认配置文件
      2. +
      3. 初始化所有管理器(注意依赖顺序)
      4. +
      5. 加载配置和消息数据
      6. +
      7. 注册事件监听器
      8. +
      9. 注册命令执行器
      10. +
      11. 加载玩家数据和皮肤缓存
      12. +
      13. 启动定时任务
      14. +
      +
      +
      指定者:
      +
      onEnable 在接口中 org.bukkit.plugin.Plugin
      +
      覆盖:
      +
      onEnable 在类中 org.bukkit.plugin.java.JavaPlugin
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      onDisable

      +
      public void onDisable()
      +
      插件禁用时调用,执行清理操作 + +

      执行以下清理操作: +

        +
      • 保存玩家方块数据到文件
      • +
      • 保存皮肤缓存数据
      • +
      • 记录插件禁用日志
      • +
      +
      +
      指定者:
      +
      onDisable 在接口中 org.bukkit.plugin.Plugin
      +
      覆盖:
      +
      onDisable 在类中 org.bukkit.plugin.java.JavaPlugin
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      reloadConfig

      +
      public void reloadConfig()
      +
      重写 reloadConfig 方法,避免循环依赖
      +
      +
      指定者:
      +
      reloadConfig 在接口中 org.bukkit.plugin.Plugin
      +
      覆盖:
      +
      reloadConfig 在类中 org.bukkit.plugin.java.JavaPlugin
      +
      +
      +
    • +
    • +
      +

      reloadPluginConfig

      +
      public void reloadPluginConfig()
      +
      插件的完整重载方法(用于命令) + +

      重新加载所有插件配置和数据,包括: +

        +
      • 主配置文件 (config.yml)
      • +
      • 消息配置文件 (messages.yml)
      • +
      • 玩家方块数据
      • +
      • 皮肤缓存数据
      • +
      + +

      这个方法通常由管理员通过/pblreload命令调用。

      +
      +
    • +
    • +
      +

      getInstance

      +
      public static PlayerBlockLife getInstance()
      +
      获取插件单例实例 + +

      提供全局访问点,允许其他类访问插件主实例。

      +
      +
      返回:
      +
      PlayerBlockLife插件实例
      +
      抛出:
      +
      IllegalStateException - 如果插件尚未启用(实例为null)
      +
      +
      +
    • +
    • +
      +

      getBlockManager

      +
      public PlayerBlockManager getBlockManager()
      +
      获取方块管理器
      +
      +
      返回:
      +
      方块管理器实例
      +
      +
      +
    • +
    • +
      +

      getSkinManager

      +
      public SkinManager getSkinManager()
      +
      获取皮肤管理器
      +
      +
      返回:
      +
      皮肤管理器实例
      +
      +
      +
    • +
    • +
      +

      getLifeSystem

      +
      public LifeSystem getLifeSystem()
      +
      获取生命值系统
      +
      +
      返回:
      +
      生命值系统实例
      +
      +
      +
    • +
    • +
      +

      getConfigManager

      +
      public ConfigManager getConfigManager()
      +
      获取配置管理器
      +
      +
      返回:
      +
      配置管理器实例
      +
      +
      +
    • +
    • +
      +

      getMessageManager

      +
      public MessageManager getMessageManager()
      +
      获取消息管理器
      +
      +
      返回:
      +
      消息管理器实例
      +
      +
      +
    • +
    • +
      +

      getGameStateManager

      +
      public GameStateManager getGameStateManager()
      +
      获取游戏状态管理器
      +
      +
      返回:
      +
      游戏状态管理器实例
      +
      +
      +
    • +
    • +
      +

      logInfo

      +
      public void logInfo(String message)
      +
      记录信息级别日志
      +
      +
      参数:
      +
      message - 日志消息
      +
      +
      +
    • +
    • +
      +

      logWarning

      +
      public void logWarning(String message)
      +
      记录警告级别日志
      +
      +
      参数:
      +
      message - 日志消息
      +
      +
      +
    • +
    • +
      +

      logError

      +
      public void logError(String message, + Throwable throwable)
      +
      记录错误级别日志
      +
      +
      参数:
      +
      message - 日志消息
      +
      throwable - 异常对象
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/PlayerBlockManager.html b/build/docs/javadoc/com/playerblocklife/PlayerBlockManager.html new file mode 100644 index 0000000..4003add --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/PlayerBlockManager.html @@ -0,0 +1,465 @@ + + + + +PlayerBlockManager (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 PlayerBlockManager

+
+
java.lang.Object +
com.playerblocklife.PlayerBlockManager
+
+
+
+
public class PlayerBlockManager +extends Object
+
玩家方块管理器 - 负责管理玩家生命方块的核心组件 + +

主要职责: +

    +
  • 生成和放置玩家生命方块
  • +
  • 管理方块位置和所有者映射关系
  • +
  • 处理方块破坏和恢复逻辑
  • +
  • 提供方块数据持久化存储
  • +
  • 支持方块位置查询和验证
  • +
  • 与SkinManager协同工作,确保方块正确显示玩家皮肤
  • +
+ +

SkinsRestorer集成特性: +

    +
  • 通过SkinManager获取SkinsRestorer提供的玩家皮肤纹理
  • +
  • 确保离线服务器上的方块显示正确的自定义皮肤
  • +
  • 支持异步皮肤加载,避免方块放置阻塞
  • +
  • 提供皮肤加载状态检查,确保皮肤就绪后再放置方块
  • +
+ +

使用并发安全的数据结构确保多线程环境下的数据一致性。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    + +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      setLifeBlocks

      +
      public boolean setLifeBlocks(org.bukkit.entity.Player player, + org.bukkit.Location center)
      +
      为玩家设置生命方块(兼容旧方法)
      +
      +
    • +
    • +
      +

      generateLifeBlocksForPlayer

      +
      public boolean generateLifeBlocksForPlayer(org.bukkit.entity.Player player, + int blockAmount, + int spreadRange, + boolean requireOpenSky, + int maxAttempts)
      +
      为玩家生成指定数量的生命方块 + +

      此方法负责生成玩家的生命方块,包括以下步骤: +

        +
      1. 检查玩家是否已有生命方块
      2. +
      3. 验证玩家皮肤是否已从SkinsRestorer或其他来源加载完成
      4. +
      5. 在指定范围内寻找合适的放置位置
      6. +
      7. 放置带有玩家皮肤纹理的玩家头颅方块
      8. +
      9. 记录方块位置和所有者关系
      10. +
      11. 保存数据并返回生成结果
      12. +
      +

      + +

      皮肤加载检查: +

        +
      • 调用skinManager.isSkinLoaded()检查皮肤是否就绪
      • +
      • 如果皮肤未加载,方块生成将失败
      • +
      • 确保离线服务器通过SkinsRestorer获取的皮肤能正确应用
      • +
      • 避免放置默认Steve皮肤的方块
      • +
      +

      +
      +
      参数:
      +
      player - 目标玩家
      +
      blockAmount - 要生成的方块数量
      +
      spreadRange - 生成范围(以玩家为中心的正方形边长的一半)
      +
      requireOpenSky - 是否需要开阔天空(上方无方块覆盖)
      +
      maxAttempts - 寻找合适位置的最大尝试次数
      +
      返回:
      +
      生成成功返回true,失败返回false
      +
      另请参阅:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      getBlockOwner

      +
      public UUID getBlockOwner(org.bukkit.Location location)
      +
      检查方块是否属于某个玩家
      +
      +
    • +
    • +
      +

      removeBlock

      +
      public boolean removeBlock(org.bukkit.Location location, + org.bukkit.entity.Player breaker)
      +
      移除方块(当被挖掘时)
      +
      +
    • +
    • +
      +

      getRemainingBlocks

      +
      public int getRemainingBlocks(UUID playerId)
      +
      获取玩家剩余方块数量
      +
      +
    • +
    • +
      +

      hasLifeBlocks

      +
      public boolean hasLifeBlocks(UUID playerId)
      +
      检查玩家是否有生命方块
      +
      +
    • +
    • +
      +

      getPlayerBlocks

      +
      public List<org.bukkit.Location> getPlayerBlocks(UUID playerId)
      +
      获取玩家的所有生命方块位置
      +
      +
    • +
    • +
      +

      clearPlayerBlocks

      +
      public void clearPlayerBlocks(UUID playerId)
      +
      清除玩家的所有生命方块
      +
      +
    • +
    • +
      +

      regeneratePlayerBlocks

      +
      public boolean regeneratePlayerBlocks(org.bukkit.entity.Player player)
      +
      重新生成玩家的生命方块
      +
      +
    • +
    • +
      +

      getPlayerBlocksCount

      +
      public int getPlayerBlocksCount()
      +
      获取已注册玩家的数量
      +
      +
    • +
    • +
      +

      getTotalBlocksCount

      +
      public int getTotalBlocksCount()
      +
      获取总方块数量
      +
      +
    • +
    • +
      +

      loadData

      +
      public void loadData()
      +
      加载数据
      +
      +
    • +
    • +
      +

      saveData

      +
      public void saveData()
      +
      保存数据
      +
      +
    • +
    • +
      +

      getAllPlayerBlocks

      +
      public Map<UUID,List<org.bukkit.Location>> getAllPlayerBlocks()
      +
      获取所有玩家的方块数据
      +
      +
    • +
    • +
      +

      getAllBlockOwners

      +
      public Map<org.bukkit.Location,UUID> getAllBlockOwners()
      +
      获取所有方块的位置和所有者
      +
      +
    • +
    • +
      +

      isLifeBlock

      +
      public boolean isLifeBlock(org.bukkit.Location location)
      +
      检查位置是否包含生命方块
      +
      +
    • +
    • +
      +

      getPlayerBlockLocations

      +
      public List<String> getPlayerBlockLocations(UUID playerId)
      +
      获取玩家的生命方块位置列表(用于显示)
      +
      +
    • +
    • +
      +

      getNearestBlock

      +
      public org.bukkit.Location getNearestBlock(org.bukkit.entity.Player player)
      +
      获取距离玩家最近的方块
      +
      +
    • +
    • +
      +

      getStats

      +
      public Map<String,Object> getStats()
      +
      获取所有生命方块的统计信息
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/PlayerJoinListener.html b/build/docs/javadoc/com/playerblocklife/PlayerJoinListener.html new file mode 100644 index 0000000..ebee303 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/PlayerJoinListener.html @@ -0,0 +1,207 @@ + + + + +PlayerJoinListener (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 PlayerJoinListener

+
+
java.lang.Object +
com.playerblocklife.PlayerJoinListener
+
+
+
+
所有已实现的接口:
+
org.bukkit.event.Listener
+
+
+
public class PlayerJoinListener +extends Object +implements org.bukkit.event.Listener
+
PlayerJoinListener - PBL游戏模式下的玩家加入和重生监听器 + +

处理玩家加入服务器和重生时的逻辑,包括: +

    +
  • 根据玩家权限设置游戏模式(OP玩家为观察者模式,非OP玩家为冒险模式)
  • +
  • 为非OP玩家分配独特的生命方块颜色
  • +
  • 给非OP玩家提供对应颜色的方块作为手持物品
  • +
  • 根据当前游戏状态显示相应信息
  • +
  • 处理玩家重生时的游戏状态恢复
  • +
+ +

此监听器与GameStateManager协作,确保玩家正确加入PBL游戏模式。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      PlayerJoinListener

      +
      public PlayerJoinListener(PlayerBlockLife plugin)
      +
      构造一个新的玩家加入监听器
      +
      +
      参数:
      +
      plugin - 插件主类实例
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onPlayerJoin

      +
      public void onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent event)
      +
      +
    • +
    • +
      +

      onPlayerRespawn

      +
      public void onPlayerRespawn(org.bukkit.event.player.PlayerRespawnEvent event)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/PlayerQuitListener.html b/build/docs/javadoc/com/playerblocklife/PlayerQuitListener.html new file mode 100644 index 0000000..c15b3d3 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/PlayerQuitListener.html @@ -0,0 +1,183 @@ + + + + +PlayerQuitListener (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 PlayerQuitListener

+
+
java.lang.Object +
com.playerblocklife.PlayerQuitListener
+
+
+
+
所有已实现的接口:
+
org.bukkit.event.Listener
+
+
+
public class PlayerQuitListener +extends Object +implements org.bukkit.event.Listener
+
PlayerQuitListener - PBL游戏模式下的玩家退出监听器 + +

处理玩家退出服务器时的日志记录。在PBL游戏模式中,玩家退出不会影响 + 其生命方块状态,因为方块位置信息仅在服务器运行期间维护。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      PlayerQuitListener

      +
      public PlayerQuitListener(PlayerBlockLife plugin)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onPlayerQuit

      +
      public void onPlayerQuit(org.bukkit.event.player.PlayerQuitEvent event)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/SetLifeBlocksCommand.html b/build/docs/javadoc/com/playerblocklife/SetLifeBlocksCommand.html new file mode 100644 index 0000000..90dc030 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/SetLifeBlocksCommand.html @@ -0,0 +1,194 @@ + + + + +SetLifeBlocksCommand (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 SetLifeBlocksCommand

+
+
java.lang.Object +
com.playerblocklife.SetLifeBlocksCommand
+
+
+
+
所有已实现的接口:
+
org.bukkit.command.CommandExecutor
+
+
+
public class SetLifeBlocksCommand +extends Object +implements org.bukkit.command.CommandExecutor
+
SetLifeBlocksCommand - 在新模式下提示命令不可用 + +

在PBL游戏模式下,此命令不再用于手动设置生命方块。 + 生命方块将在游戏开始时自动为每个非OP玩家生成。 + 玩家应等待管理员使用 /PBL start 命令开始游戏。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    +
      +
    • +
      +

      SetLifeBlocksCommand

      +
      public SetLifeBlocksCommand(PlayerBlockLife plugin)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      onCommand

      +
      public boolean onCommand(org.bukkit.command.CommandSender sender, + org.bukkit.command.Command command, + String label, + String[] args)
      +
      +
      指定者:
      +
      onCommand 在接口中 org.bukkit.command.CommandExecutor
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/SkinManager.html b/build/docs/javadoc/com/playerblocklife/SkinManager.html new file mode 100644 index 0000000..56971cf --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/SkinManager.html @@ -0,0 +1,290 @@ + + + + +SkinManager (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

类 SkinManager

+
+
java.lang.Object +
com.playerblocklife.SkinManager
+
+
+
+
public class SkinManager +extends Object
+
皮肤管理器 - 负责玩家皮肤的获取、缓存和应用 + +

主要功能: +

    +
  • 从多种来源获取玩家皮肤数据(SkinsRestorer插件、PlayerProfile、本地缓存)
  • +
  • 皮肤数据Base64编码和缓存管理
  • +
  • 自定义模型数据分配和管理
  • +
  • 异步皮肤加载避免阻塞主线程
  • +
  • 皮肤缓存过期清理
  • +
  • 完整的SkinsRestorer插件集成支持
  • +
+ +

皮肤获取优先级(根据配置的source字段): +

    +
  1. skinsrestorer:优先从SkinsRestorer插件获取皮肤纹理数据
  2. +
  3. player_profile:优先使用Bukkit的PlayerProfile API
  4. +
  5. local_cache:优先从本地缓存加载
  6. +
  7. 默认Steve皮肤(所有来源都失败时的备用)
  8. +
+ +

SkinsRestorer集成特性: +

    +
  • 自动检测SkinsRestorer插件是否安装
  • +
  • 使用反射安全调用SkinsRestorer API,避免硬依赖
  • +
  • 获取完整的皮肤纹理数据(value和signature)
  • +
  • 支持离线服务器,避免默认Steve皮肤问题
  • +
  • 优雅降级:SkinsRestorer失败时自动回退到其他来源
  • +
+ +

皮肤缓存默认保留7天,过期后自动重新获取。

+
+
从以下版本开始:
+
1.0.0
+
+
+
+ +
+
+
    + +
  • +
    +

    构造器详细资料

    + +
    +
  • + +
  • +
    +

    方法详细资料

    +
      +
    • +
      +

      loadAllSkins

      +
      public void loadAllSkins()
      +
      +
    • +
    • +
      +

      loadPlayerSkinAsync

      +
      public void loadPlayerSkinAsync(org.bukkit.entity.Player player)
      +
      +
    • +
    • +
      +

      createPlayerHead

      +
      public org.bukkit.inventory.ItemStack createPlayerHead(UUID playerId, + String playerName)
      +
      创建带有玩家皮肤的头颅物品 + +

      使用Base64纹理数据创建自定义玩家头颅,支持离线服务器皮肤显示。

      +
      +
      参数:
      +
      playerId - 玩家UUID
      +
      playerName - 玩家名称
      +
      返回:
      +
      带有玩家皮肤的玩家头颅物品
      +
      +
      +
    • +
    • +
      +

      isSkinLoaded

      +
      public boolean isSkinLoaded(UUID playerId)
      +
      +
    • +
    • +
      +

      getCustomModelData

      +
      public Integer getCustomModelData(UUID playerId)
      +
      +
    • +
    • +
      +

      getAllSkinData

      +
      public Map<UUID,String> getAllSkinData()
      +
      +
    • +
    • +
      +

      getAllCustomModelData

      +
      public Map<UUID,Integer> getAllCustomModelData()
      +
      +
    • +
    • +
      +

      saveSkinData

      +
      public void saveSkinData()
      +
      +
    • +
    • +
      +

      cleanupOldCache

      +
      public void cleanupOldCache()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/package-summary.html b/build/docs/javadoc/com/playerblocklife/package-summary.html new file mode 100644 index 0000000..e20d7c6 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/package-summary.html @@ -0,0 +1,145 @@ + + + + +com.playerblocklife (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+
+

程序包 com.playerblocklife

+
+
+
package com.playerblocklife
+
+
    +
  • +
    +
    +
    +
    +
    +
    说明
    + +
    +
    AdminCommands - PBL游戏模式的管理员命令处理器
    +
    + +
    +
    BlockBreakListener - PBL游戏模式下的方块破坏和放置监听器
    +
    + +
    +
    CheckLifeBlocksCommand - 显示玩家在PBL游戏模式下的生命方块状态
    +
    + +
    +
    配置管理器 - 负责加载、保存和管理插件的配置文件
    +
    + +
    +
    游戏状态管理器 - PBL生存游戏模式的核心管理器
    +
    + +
     
    + +
    +
    生命值系统 - 负责管理玩家生命值和状态效果
    +
    + +
     
    + +
    +
    PBL命令执行器 - 处理PBL游戏模式的专用命令
    +
    + +
    +
    PlayerBlockLife插件主类 - PBL生存游戏模式的核心控制器
    +
    + +
    +
    玩家方块管理器 - 负责管理玩家生命方块的核心组件
    +
    + +
    +
    PlayerJoinListener - PBL游戏模式下的玩家加入和重生监听器
    +
    + +
    +
    PlayerQuitListener - PBL游戏模式下的玩家退出监听器
    +
    + +
    +
    SetLifeBlocksCommand - 在新模式下提示命令不可用
    +
    + +
    +
    皮肤管理器 - 负责玩家皮肤的获取、缓存和应用
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/build/docs/javadoc/com/playerblocklife/package-tree.html b/build/docs/javadoc/com/playerblocklife/package-tree.html new file mode 100644 index 0000000..d234819 --- /dev/null +++ b/build/docs/javadoc/com/playerblocklife/package-tree.html @@ -0,0 +1,100 @@ + + + + +com.playerblocklife 类分层结构 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+
+

程序包com.playerblocklife的分层结构

+
+
+

类分层结构

+ +
+
+

枚举类分层结构

+ +
+
+
+
+ + diff --git a/build/docs/javadoc/copy.svg b/build/docs/javadoc/copy.svg new file mode 100644 index 0000000..7c46ab1 --- /dev/null +++ b/build/docs/javadoc/copy.svg @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/build/docs/javadoc/element-list b/build/docs/javadoc/element-list new file mode 100644 index 0000000..1922ff0 --- /dev/null +++ b/build/docs/javadoc/element-list @@ -0,0 +1 @@ +com.playerblocklife diff --git a/build/docs/javadoc/help-doc.html b/build/docs/javadoc/help-doc.html new file mode 100644 index 0000000..64c614b --- /dev/null +++ b/build/docs/javadoc/help-doc.html @@ -0,0 +1,176 @@ + + + + +API 帮助 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+

JavaDoc 帮助

+ +
+
+

导航

+从 概览 页开始,您可以使用每页中的链接以及每页顶部导航栏中的链接来浏览文档。 使用 索引 和搜索框可以导航到特定声明和概要页,包括:所有程序包, 所有类和接口 + +
+
+
+

页面类型

+以下各部分介绍了此集合中不同类型的页面。 +
+

程序包

+

每个程序包都有一页,其中包含它的类和接口的列表及其概要。这些页可以包含以下类别:

+
    +
  • 接口
  • +
  • +
  • 枚举类
  • +
  • 异常错误类
  • +
  • 批注接口
  • +
+
+
+

类或接口

+

每个类、接口、嵌套类和嵌套接口都有自己独立的页面。如果这些部分中每个部分的条目为空或不适用,则省略这些条目。

+
    +
  • 类继承图
  • +
  • 直接子类
  • +
  • 所有已知子接口
  • +
  • 所有已知实现类
  • +
  • 类或接口声明
  • +
  • 类或接口说明
  • +
+
+
    +
  • 嵌套类概要
  • +
  • 枚举常量概要
  • +
  • 字段概要
  • +
  • 属性概要
  • +
  • 构造器概要
  • +
  • 方法概要
  • +
  • 必需元素概要
  • +
  • 可选元素概要
  • +
+
+
    +
  • 枚举常量详细资料
  • +
  • 字段详细资料
  • +
  • 属性详细资料
  • +
  • 构造器详细资料
  • +
  • 方法详细资料
  • +
  • 元素详细资料
  • +
+

注: 批注接口有必需的元素和可选的元素,但没有方法。 只有枚举类有枚举常量。 记录类的组件显示为记录类声明的一部分。 属性是 JavaFX 的一个特性。

+

概要条目按字母顺序排列,而详细说明则按其在源代码中出现的顺序排列。这有助于保持程序员所建立的逻辑分组。

+
+
+

其他文件

+

程序包和模块所包含的页面中可能带有与附近声明相关的附加信息。

+
+
+

树 (类分层结构)

+

对于所有程序包,都有一个 类分层结构 页,以及每个程序包的分层结构。每个分层结构页都包含类的列表和接口的列表。从 java.lang.Object 开始,按继承结构对类进行排列。接口不从 java.lang.Object 继承。

+
    +
  • 查看“概览”页面时,单击“树”将显示所有程序包的分层结构。
  • +
  • 查看特定程序包、类或接口页时,单击“树”将仅显示该程序包的分层结构。
  • +
+
+
+

所有程序包

+

所有程序包 包含文档中所有程序包的按字母顺序排列的索引。

+
+
+

所有类和接口

+

所有类和接口 包含文档中所有类和接口(包括批注接口、枚举类和记录类)的按字母顺序排列的索引。

+
+
+

索引

+

索引 包含文档中所有类、接口、构造器、方法和字段的按字母顺序排列的索引,以及概要页(例如 所有程序包, 所有类和接口)。

+
+
+
+此帮助文件适用于由标准 doclet 生成的 API 文档。
+
+
+ + diff --git a/build/docs/javadoc/index-all.html b/build/docs/javadoc/index-all.html new file mode 100644 index 0000000..33f97f2 --- /dev/null +++ b/build/docs/javadoc/index-all.html @@ -0,0 +1,665 @@ + + + + +索引 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+
+

索引

+
+A B C F G H I L M O P R S U V W 
所有程序包|所有类和接口 +

A

+
+
AdminCommands - com.playerblocklife中的类
+
+
AdminCommands - PBL游戏模式的管理员命令处理器
+
+
AdminCommands(PlayerBlockLife) - 类的构造器 com.playerblocklife.AdminCommands
+
+
构造一个新的管理员命令执行器
+
+
assignPlayerColor(Player) - 类中的方法 com.playerblocklife.GameStateManager
+
+
为玩家分配颜色
+
+
+

B

+
+
BlockBreakListener - com.playerblocklife中的类
+
+
BlockBreakListener - PBL游戏模式下的方块破坏和放置监听器
+
+
BlockBreakListener(PlayerBlockLife) - 类的构造器 com.playerblocklife.BlockBreakListener
+
+
构造一个新的方块破坏监听器
+
+
+

C

+
+
checkAllPlayers() - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
checkGameEnd() - 类中的方法 com.playerblocklife.GameStateManager
+
+
检查游戏是否结束
+
+
CheckLifeBlocksCommand - com.playerblocklife中的类
+
+
CheckLifeBlocksCommand - 显示玩家在PBL游戏模式下的生命方块状态
+
+
CheckLifeBlocksCommand(PlayerBlockLife) - 类的构造器 com.playerblocklife.CheckLifeBlocksCommand
+
+
构造一个新的检查生命方块命令执行器
+
+
checkPlayerHealth(Player) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
cleanupOldCache() - 类中的方法 com.playerblocklife.SkinManager
+
 
+
clearPlayerBlocks(UUID) - 类中的方法 com.playerblocklife.GameStateManager
+
+
清除指定玩家的方块
+
+
clearPlayerBlocks(UUID) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
清除玩家的所有生命方块
+
+
com.playerblocklife - 程序包 com.playerblocklife
+
 
+
ConfigManager - com.playerblocklife中的类
+
+
配置管理器 - 负责加载、保存和管理插件的配置文件
+
+
ConfigManager(PlayerBlockLife) - 类的构造器 com.playerblocklife.ConfigManager
+
+
构造一个新的配置管理器
+
+
createPlayerHead(UUID, String) - 类中的方法 com.playerblocklife.SkinManager
+
+
创建带有玩家皮肤的头颅物品
+
+
+

F

+
+
FINISHED - 枚举类 中的枚举常量 com.playerblocklife.GameStateManager.GameState
+
 
+
+

G

+
+
GameStateManager - com.playerblocklife中的类
+
+
游戏状态管理器 - PBL生存游戏模式的核心管理器
+
+
GameStateManager(PlayerBlockLife) - 类的构造器 com.playerblocklife.GameStateManager
+
 
+
GameStateManager.GameState - com.playerblocklife中的枚举类
+
 
+
generateLifeBlocksForPlayer(Player) - 类中的方法 com.playerblocklife.GameStateManager
+
+
为玩家生成生命方块
+
+
generateLifeBlocksForPlayer(Player, int, int, boolean, int) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
为玩家生成指定数量的生命方块
+
+
getAlivePlayers() - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取所有存活玩家
+
+
getAlivePlayersCount() - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取存活玩家数量
+
+
getAllBlockOwners() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取所有方块的位置和所有者
+
+
getAllCustomModelData() - 类中的方法 com.playerblocklife.SkinManager
+
 
+
getAllPlayerBlocks() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取所有玩家的方块数据
+
+
getAllSkinData() - 类中的方法 com.playerblocklife.SkinManager
+
 
+
getAutoSaveInterval() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取自动保存间隔
+
+
getBlockManager() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取方块管理器
+
+
getBlockMaterial() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取方块材质配置
+
+
getBlockOwner(Location) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
检查方块是否属于某个玩家
+
+
getBlocksPerPlayer() - 类中的方法 com.playerblocklife.ConfigManager
+
 
+
getBroadcastMessage(String, String) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取广播消息
+
+
getBroadcastRange() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取广播范围
+
+
getCacheExpireDays() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取皮肤缓存过期天数
+
+
getCommandMessage(String, String, String) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取命令消息
+
+
getConfig() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取配置对象
+
+
getConfigManager() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取配置管理器
+
+
getConsoleMessage(String, String) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取控制台消息
+
+
getCurrentState() - 类中的方法 com.playerblocklife.GameStateManager
+
 
+
getCustomModelData(UUID) - 类中的方法 com.playerblocklife.SkinManager
+
 
+
getDepth() - 类中的方法 com.playerblocklife.ConfigManager
+
 
+
getExpRewardAmount() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取奖励经验数量
+
+
getExternalMessageFileName() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取外部消息文件名
+
+
getFormattedMessage(String, String, Map<String, String>) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取格式化消息(替换变量)
+
+
getGameDuration() - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取游戏持续时间(分钟)
+
+
getGameMessage(String, String) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取游戏内消息
+
+
getGameStartTime() - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取游戏开始时间戳
+
+
getGameStateManager() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取游戏状态管理器
+
+
getInstance() - 类中的静态方法 com.playerblocklife.PlayerBlockLife
+
+
获取插件单例实例
+
+
getLifeSystem() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取生命值系统
+
+
getMaxAttempts() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取最大尝试次数
+
+
getMessage(String, String) - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取消息
+
+
getMessage(String, String) - 类中的方法 com.playerblocklife.MessageManager
+
+
获取消息
+
+
getMessageFilePath() - 类中的方法 com.playerblocklife.MessageManager
+
+
获取消息文件路径
+
+
getMessageManager() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取消息管理器
+
+
getMinDistance() - 类中的方法 com.playerblocklife.ConfigManager
+
 
+
getNearestBlock(Player) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取距离玩家最近的方块
+
+
getOnFailureAction() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取失败时的处理方式
+
+
getPlayerBlockLocations(UUID) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取玩家的生命方块位置列表(用于显示)
+
+
getPlayerBlocks() - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取所有玩家的方块位置
+
+
getPlayerBlocks(UUID) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取玩家的所有生命方块位置
+
+
getPlayerBlocksCount() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取已注册玩家的数量
+
+
getPlayerColor(UUID) - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取玩家颜色
+
+
getPlayerHealth(UUID) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
getRemainingBlocks(UUID) - 类中的方法 com.playerblocklife.GameStateManager
+
+
获取玩家剩余方块数量
+
+
getRemainingBlocks(UUID) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取玩家剩余方块数量
+
+
getSkinManager() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
获取皮肤管理器
+
+
getSkinSource() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取皮肤来源配置
+
+
getSpreadRange() - 类中的方法 com.playerblocklife.ConfigManager
+
 
+
getStats() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取所有生命方块的统计信息
+
+
getStorageType() - 类中的方法 com.playerblocklife.ConfigManager
+
+
获取存储类型配置
+
+
getTotalBlocksCount() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
获取总方块数量
+
+
+

H

+
+
handlePlayerDeath(UUID) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
hasExternalMessageFile() - 类中的方法 com.playerblocklife.MessageManager
+
+
检查消息文件是否存在
+
+
hasLifeBlocks(UUID) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
检查玩家是否有生命方块
+
+
+

I

+
+
isAdminOnly(String) - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查命令是否仅管理员可用
+
+
isAdminUseAllowed(String) - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否允许管理员使用命令
+
+
isAutoGenerationEnabled() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否启用自动生成
+
+
isAutoSaveEnabled() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否启用自动保存
+
+
isBecomeSpectator() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查玩家死亡后是否成为观察者
+
+
isBroadcastOnBlockBreak() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否在方块被破坏时广播消息
+
+
isBroadcastOnPlayerDeath() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否在玩家死亡时广播消息
+
+
isCommandEnabled(String) - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查命令是否启用
+
+
isDieWhenBlocksGone() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查玩家方块被挖光时是否死亡
+
+
isGiveExpReward() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否给予挖掘奖励经验
+
+
isHealthSystemEnabled() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否启用生命值系统
+
+
isLifeBlock(Location) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
检查位置是否包含生命方块
+
+
isLimitedTime() - 类中的方法 com.playerblocklife.GameStateManager
+
+
检查是否为限时游戏
+
+
isPlayerAlive(UUID) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
isProtectFromExplosions() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否保护方块免受爆炸破坏
+
+
isProtectFromFire() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否保护方块免受火灾破坏
+
+
isProtectFromPistons() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否保护方块免受活塞推动
+
+
isRequireOpenSky() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否需要开放天空
+
+
isSelfUseAllowed(String) - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否允许玩家自己使用命令
+
+
isSkinLoaded(UUID) - 类中的方法 com.playerblocklife.SkinManager
+
 
+
isSkinSystemEnabled() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否启用皮肤系统
+
+
+

L

+
+
LifeSystem - com.playerblocklife中的类
+
+
生命值系统 - 负责管理玩家生命值和状态效果
+
+
LifeSystem(PlayerBlockLife) - 类的构造器 com.playerblocklife.LifeSystem
+
 
+
loadAllSkins() - 类中的方法 com.playerblocklife.SkinManager
+
 
+
loadConfig() - 类中的方法 com.playerblocklife.ConfigManager
+
+
加载插件配置
+
+
loadData() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
加载数据
+
+
loadMessages() - 类中的方法 com.playerblocklife.MessageManager
+
+
加载消息配置
+
+
loadPlayerSkinAsync(Player) - 类中的方法 com.playerblocklife.SkinManager
+
 
+
logError(String, Throwable) - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
记录错误级别日志
+
+
logInfo(String) - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
记录信息级别日志
+
+
logWarning(String) - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
记录警告级别日志
+
+
+

M

+
+
MessageManager - com.playerblocklife中的类
+
 
+
MessageManager(PlayerBlockLife) - 类的构造器 com.playerblocklife.MessageManager
+
+
构造一个新的消息管理器
+
+
+

O

+
+
onBlockBreak(BlockBreakEvent) - 类中的方法 com.playerblocklife.BlockBreakListener
+
+
处理方块被破坏的事件
+
+
onBlockPlace(BlockPlaceEvent) - 类中的方法 com.playerblocklife.BlockBreakListener
+
+
处理方块被放置的事件
+
+
onCommand(CommandSender, Command, String, String[]) - 类中的方法 com.playerblocklife.AdminCommands
+
 
+
onCommand(CommandSender, Command, String, String[]) - 类中的方法 com.playerblocklife.CheckLifeBlocksCommand
+
 
+
onCommand(CommandSender, Command, String, String[]) - 类中的方法 com.playerblocklife.PBLCommands
+
 
+
onCommand(CommandSender, Command, String, String[]) - 类中的方法 com.playerblocklife.SetLifeBlocksCommand
+
 
+
onDisable() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
插件禁用时调用,执行清理操作
+
+
onEnable() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
插件启用时调用,执行初始化操作
+
+
onPlayerJoin(PlayerJoinEvent) - 类中的方法 com.playerblocklife.PlayerJoinListener
+
 
+
onPlayerQuit(PlayerQuitEvent) - 类中的方法 com.playerblocklife.PlayerQuitListener
+
 
+
onPlayerRespawn(PlayerRespawnEvent) - 类中的方法 com.playerblocklife.PlayerJoinListener
+
 
+
+

P

+
+
PBLCommands - com.playerblocklife中的类
+
+
PBL命令执行器 - 处理PBL游戏模式的专用命令
+
+
PBLCommands(PlayerBlockLife) - 类的构造器 com.playerblocklife.PBLCommands
+
 
+
PlayerBlockLife - com.playerblocklife中的类
+
+
PlayerBlockLife插件主类 - PBL生存游戏模式的核心控制器
+
+
PlayerBlockLife() - 类的构造器 com.playerblocklife.PlayerBlockLife
+
 
+
PlayerBlockManager - com.playerblocklife中的类
+
+
玩家方块管理器 - 负责管理玩家生命方块的核心组件
+
+
PlayerBlockManager(PlayerBlockLife, SkinManager) - 类的构造器 com.playerblocklife.PlayerBlockManager
+
 
+
PlayerJoinListener - com.playerblocklife中的类
+
+
PlayerJoinListener - PBL游戏模式下的玩家加入和重生监听器
+
+
PlayerJoinListener(PlayerBlockLife) - 类的构造器 com.playerblocklife.PlayerJoinListener
+
+
构造一个新的玩家加入监听器
+
+
PlayerQuitListener - com.playerblocklife中的类
+
+
PlayerQuitListener - PBL游戏模式下的玩家退出监听器
+
+
PlayerQuitListener(PlayerBlockLife) - 类的构造器 com.playerblocklife.PlayerQuitListener
+
 
+
+

R

+
+
regeneratePlayerBlocks(Player) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
重新生成玩家的生命方块
+
+
reloadConfig() - 类中的方法 com.playerblocklife.ConfigManager
+
+
重新加载配置文件
+
+
reloadConfig() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
重写 reloadConfig 方法,避免循环依赖
+
+
reloadMessages() - 类中的方法 com.playerblocklife.MessageManager
+
+
重新加载消息配置
+
+
reloadPluginConfig() - 类中的方法 com.playerblocklife.PlayerBlockLife
+
+
插件的完整重载方法(用于命令)
+
+
removeBlock(Location, Player) - 类中的方法 com.playerblocklife.GameStateManager
+
+
移除被破坏的生命方块
+
+
removeBlock(Location, Player) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
移除方块(当被挖掘时)
+
+
resetGame() - 类中的方法 com.playerblocklife.GameStateManager
+
+
重置游戏
+
+
revivePlayer(Player) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
+

S

+
+
saveConfig() - 类中的方法 com.playerblocklife.ConfigManager
+
+
保存当前配置到文件
+
+
saveData() - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
保存数据
+
+
saveSkinData() - 类中的方法 com.playerblocklife.SkinManager
+
 
+
setCurrentState(GameStateManager.GameState) - 类中的方法 com.playerblocklife.GameStateManager
+
 
+
setLifeBlocks(Player, Location) - 类中的方法 com.playerblocklife.PlayerBlockManager
+
+
为玩家设置生命方块(兼容旧方法)
+
+
SetLifeBlocksCommand - com.playerblocklife中的类
+
+
SetLifeBlocksCommand - 在新模式下提示命令不可用
+
+
SetLifeBlocksCommand(PlayerBlockLife) - 类的构造器 com.playerblocklife.SetLifeBlocksCommand
+
 
+
setPlayerHealth(UUID, int) - 类中的方法 com.playerblocklife.LifeSystem
+
 
+
SkinManager - com.playerblocklife中的类
+
+
皮肤管理器 - 负责玩家皮肤的获取、缓存和应用
+
+
SkinManager(PlayerBlockLife) - 类的构造器 com.playerblocklife.SkinManager
+
 
+
STARTED - 枚举类 中的枚举常量 com.playerblocklife.GameStateManager.GameState
+
 
+
startGame() - 类中的方法 com.playerblocklife.GameStateManager
+
+
开始游戏
+
+
startTimedGame(int) - 类中的方法 com.playerblocklife.GameStateManager
+
+
开始限时游戏
+
+
+

U

+
+
updatePlayerScoreboard(Player) - 类中的方法 com.playerblocklife.GameStateManager
+
+
更新玩家特定的计分板信息
+
+
updateScoreboard() - 类中的方法 com.playerblocklife.GameStateManager
+
+
更新计分板
+
+
useExternalMessageFile() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否使用外部消息文件
+
+
useSkinsRestorer() - 类中的方法 com.playerblocklife.ConfigManager
+
+
检查是否启用SkinsRestorer插件支持
+
+
+

V

+
+
valueOf(String) - 枚举类中的静态方法 com.playerblocklife.GameStateManager.GameState
+
+
返回带有指定名称的该类的枚举常量。
+
+
values() - 枚举类中的静态方法 com.playerblocklife.GameStateManager.GameState
+
+
返回包含该枚举类的常量的数组, +顺序与声明这些常量的顺序相同
+
+
+

W

+
+
WAITING - 枚举类 中的枚举常量 com.playerblocklife.GameStateManager.GameState
+
 
+
+A B C F G H I L M O P R S U V W 
所有程序包|所有类和接口
+
+
+ + diff --git a/build/docs/javadoc/index.html b/build/docs/javadoc/index.html new file mode 100644 index 0000000..42d89f0 --- /dev/null +++ b/build/docs/javadoc/index.html @@ -0,0 +1,25 @@ + + + + +PlayerBlockLife 2.2.0-alpha-1.20.4 API + + + + + + + + + + +
+ +

com/playerblocklife/package-summary.html

+
+ + diff --git a/build/docs/javadoc/legal/ADDITIONAL_LICENSE_INFO b/build/docs/javadoc/legal/ADDITIONAL_LICENSE_INFO new file mode 100644 index 0000000..b62cc3e --- /dev/null +++ b/build/docs/javadoc/legal/ADDITIONAL_LICENSE_INFO @@ -0,0 +1 @@ +Please see ..\java.base\ADDITIONAL_LICENSE_INFO diff --git a/build/docs/javadoc/legal/ASSEMBLY_EXCEPTION b/build/docs/javadoc/legal/ASSEMBLY_EXCEPTION new file mode 100644 index 0000000..0d4cfb4 --- /dev/null +++ b/build/docs/javadoc/legal/ASSEMBLY_EXCEPTION @@ -0,0 +1 @@ +Please see ..\java.base\ASSEMBLY_EXCEPTION diff --git a/build/docs/javadoc/legal/LICENSE b/build/docs/javadoc/legal/LICENSE new file mode 100644 index 0000000..4ad9fe4 --- /dev/null +++ b/build/docs/javadoc/legal/LICENSE @@ -0,0 +1 @@ +Please see ..\java.base\LICENSE diff --git a/build/docs/javadoc/legal/jquery.md b/build/docs/javadoc/legal/jquery.md new file mode 100644 index 0000000..a763ec6 --- /dev/null +++ b/build/docs/javadoc/legal/jquery.md @@ -0,0 +1,26 @@ +## jQuery v3.7.1 + +### jQuery License +``` +jQuery v 3.7.1 +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/build/docs/javadoc/legal/jqueryUI.md b/build/docs/javadoc/legal/jqueryUI.md new file mode 100644 index 0000000..46bfbaa --- /dev/null +++ b/build/docs/javadoc/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.14.1 + +### jQuery UI License +``` +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/build/docs/javadoc/link.svg b/build/docs/javadoc/link.svg new file mode 100644 index 0000000..7ccc5ed --- /dev/null +++ b/build/docs/javadoc/link.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/build/docs/javadoc/member-search-index.js b/build/docs/javadoc/member-search-index.js new file mode 100644 index 0000000..9596706 --- /dev/null +++ b/build/docs/javadoc/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"com.playerblocklife","c":"AdminCommands","l":"AdminCommands(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"assignPlayerColor(Player)","u":"assignPlayerColor(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"BlockBreakListener","l":"BlockBreakListener(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"LifeSystem","l":"checkAllPlayers()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"checkGameEnd()"},{"p":"com.playerblocklife","c":"CheckLifeBlocksCommand","l":"CheckLifeBlocksCommand(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"LifeSystem","l":"checkPlayerHealth(Player)","u":"checkPlayerHealth(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"SkinManager","l":"cleanupOldCache()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"clearPlayerBlocks(UUID)","u":"clearPlayerBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"clearPlayerBlocks(UUID)","u":"clearPlayerBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"ConfigManager(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"SkinManager","l":"createPlayerHead(UUID, String)","u":"createPlayerHead(java.util.UUID,java.lang.String)"},{"p":"com.playerblocklife","c":"GameStateManager.GameState","l":"FINISHED"},{"p":"com.playerblocklife","c":"GameStateManager","l":"GameStateManager(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"generateLifeBlocksForPlayer(Player)","u":"generateLifeBlocksForPlayer(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"generateLifeBlocksForPlayer(Player, int, int, boolean, int)","u":"generateLifeBlocksForPlayer(org.bukkit.entity.Player,int,int,boolean,int)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getAlivePlayers()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getAlivePlayersCount()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getAllBlockOwners()"},{"p":"com.playerblocklife","c":"SkinManager","l":"getAllCustomModelData()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getAllPlayerBlocks()"},{"p":"com.playerblocklife","c":"SkinManager","l":"getAllSkinData()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getAutoSaveInterval()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getBlockManager()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getBlockMaterial()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getBlockOwner(Location)","u":"getBlockOwner(org.bukkit.Location)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getBlocksPerPlayer()"},{"p":"com.playerblocklife","c":"MessageManager","l":"getBroadcastMessage(String, String)","u":"getBroadcastMessage(java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getBroadcastRange()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getCacheExpireDays()"},{"p":"com.playerblocklife","c":"MessageManager","l":"getCommandMessage(String, String, String)","u":"getCommandMessage(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getConfig()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getConfigManager()"},{"p":"com.playerblocklife","c":"MessageManager","l":"getConsoleMessage(String, String)","u":"getConsoleMessage(java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getCurrentState()"},{"p":"com.playerblocklife","c":"SkinManager","l":"getCustomModelData(UUID)","u":"getCustomModelData(java.util.UUID)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getDepth()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getExpRewardAmount()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getExternalMessageFileName()"},{"p":"com.playerblocklife","c":"MessageManager","l":"getFormattedMessage(String, String, Map)","u":"getFormattedMessage(java.lang.String,java.lang.String,java.util.Map)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getGameDuration()"},{"p":"com.playerblocklife","c":"MessageManager","l":"getGameMessage(String, String)","u":"getGameMessage(java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getGameStartTime()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getGameStateManager()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getInstance()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getLifeSystem()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getMaxAttempts()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getMessage(String, String)","u":"getMessage(java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"MessageManager","l":"getMessage(String, String)","u":"getMessage(java.lang.String,java.lang.String)"},{"p":"com.playerblocklife","c":"MessageManager","l":"getMessageFilePath()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getMessageManager()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getMinDistance()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getNearestBlock(Player)","u":"getNearestBlock(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getOnFailureAction()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getPlayerBlockLocations(UUID)","u":"getPlayerBlockLocations(java.util.UUID)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getPlayerBlocks()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getPlayerBlocks(UUID)","u":"getPlayerBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getPlayerBlocksCount()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getPlayerColor(UUID)","u":"getPlayerColor(java.util.UUID)"},{"p":"com.playerblocklife","c":"LifeSystem","l":"getPlayerHealth(UUID)","u":"getPlayerHealth(java.util.UUID)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"getRemainingBlocks(UUID)","u":"getRemainingBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getRemainingBlocks(UUID)","u":"getRemainingBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"getSkinManager()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getSkinSource()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getSpreadRange()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getStats()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"getStorageType()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"getTotalBlocksCount()"},{"p":"com.playerblocklife","c":"LifeSystem","l":"handlePlayerDeath(UUID)","u":"handlePlayerDeath(java.util.UUID)"},{"p":"com.playerblocklife","c":"MessageManager","l":"hasExternalMessageFile()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"hasLifeBlocks(UUID)","u":"hasLifeBlocks(java.util.UUID)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isAdminOnly(String)","u":"isAdminOnly(java.lang.String)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isAdminUseAllowed(String)","u":"isAdminUseAllowed(java.lang.String)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isAutoGenerationEnabled()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isAutoSaveEnabled()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isBecomeSpectator()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isBroadcastOnBlockBreak()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isBroadcastOnPlayerDeath()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isCommandEnabled(String)","u":"isCommandEnabled(java.lang.String)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isDieWhenBlocksGone()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isGiveExpReward()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isHealthSystemEnabled()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"isLifeBlock(Location)","u":"isLifeBlock(org.bukkit.Location)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"isLimitedTime()"},{"p":"com.playerblocklife","c":"LifeSystem","l":"isPlayerAlive(UUID)","u":"isPlayerAlive(java.util.UUID)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isProtectFromExplosions()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isProtectFromFire()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isProtectFromPistons()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isRequireOpenSky()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isSelfUseAllowed(String)","u":"isSelfUseAllowed(java.lang.String)"},{"p":"com.playerblocklife","c":"SkinManager","l":"isSkinLoaded(UUID)","u":"isSkinLoaded(java.util.UUID)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"isSkinSystemEnabled()"},{"p":"com.playerblocklife","c":"LifeSystem","l":"LifeSystem(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"SkinManager","l":"loadAllSkins()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"loadConfig()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"loadData()"},{"p":"com.playerblocklife","c":"MessageManager","l":"loadMessages()"},{"p":"com.playerblocklife","c":"SkinManager","l":"loadPlayerSkinAsync(Player)","u":"loadPlayerSkinAsync(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"logError(String, Throwable)","u":"logError(java.lang.String,java.lang.Throwable)"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"logInfo(String)","u":"logInfo(java.lang.String)"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"logWarning(String)","u":"logWarning(java.lang.String)"},{"p":"com.playerblocklife","c":"MessageManager","l":"MessageManager(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"BlockBreakListener","l":"onBlockBreak(BlockBreakEvent)","u":"onBlockBreak(org.bukkit.event.block.BlockBreakEvent)"},{"p":"com.playerblocklife","c":"BlockBreakListener","l":"onBlockPlace(BlockPlaceEvent)","u":"onBlockPlace(org.bukkit.event.block.BlockPlaceEvent)"},{"p":"com.playerblocklife","c":"AdminCommands","l":"onCommand(CommandSender, Command, String, String[])","u":"onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String[])"},{"p":"com.playerblocklife","c":"CheckLifeBlocksCommand","l":"onCommand(CommandSender, Command, String, String[])","u":"onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String[])"},{"p":"com.playerblocklife","c":"PBLCommands","l":"onCommand(CommandSender, Command, String, String[])","u":"onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String[])"},{"p":"com.playerblocklife","c":"SetLifeBlocksCommand","l":"onCommand(CommandSender, Command, String, String[])","u":"onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String[])"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"onDisable()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"onEnable()"},{"p":"com.playerblocklife","c":"PlayerJoinListener","l":"onPlayerJoin(PlayerJoinEvent)","u":"onPlayerJoin(org.bukkit.event.player.PlayerJoinEvent)"},{"p":"com.playerblocklife","c":"PlayerQuitListener","l":"onPlayerQuit(PlayerQuitEvent)","u":"onPlayerQuit(org.bukkit.event.player.PlayerQuitEvent)"},{"p":"com.playerblocklife","c":"PlayerJoinListener","l":"onPlayerRespawn(PlayerRespawnEvent)","u":"onPlayerRespawn(org.bukkit.event.player.PlayerRespawnEvent)"},{"p":"com.playerblocklife","c":"PBLCommands","l":"PBLCommands(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"PlayerBlockLife()","u":"%3Cinit%3E()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"PlayerBlockManager(PlayerBlockLife, SkinManager)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife,com.playerblocklife.SkinManager)"},{"p":"com.playerblocklife","c":"PlayerJoinListener","l":"PlayerJoinListener(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"PlayerQuitListener","l":"PlayerQuitListener(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"regeneratePlayerBlocks(Player)","u":"regeneratePlayerBlocks(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"reloadConfig()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"reloadConfig()"},{"p":"com.playerblocklife","c":"MessageManager","l":"reloadMessages()"},{"p":"com.playerblocklife","c":"PlayerBlockLife","l":"reloadPluginConfig()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"removeBlock(Location, Player)","u":"removeBlock(org.bukkit.Location,org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"removeBlock(Location, Player)","u":"removeBlock(org.bukkit.Location,org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"resetGame()"},{"p":"com.playerblocklife","c":"LifeSystem","l":"revivePlayer(Player)","u":"revivePlayer(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"ConfigManager","l":"saveConfig()"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"saveData()"},{"p":"com.playerblocklife","c":"SkinManager","l":"saveSkinData()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"setCurrentState(GameStateManager.GameState)","u":"setCurrentState(com.playerblocklife.GameStateManager.GameState)"},{"p":"com.playerblocklife","c":"PlayerBlockManager","l":"setLifeBlocks(Player, Location)","u":"setLifeBlocks(org.bukkit.entity.Player,org.bukkit.Location)"},{"p":"com.playerblocklife","c":"SetLifeBlocksCommand","l":"SetLifeBlocksCommand(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"LifeSystem","l":"setPlayerHealth(UUID, int)","u":"setPlayerHealth(java.util.UUID,int)"},{"p":"com.playerblocklife","c":"SkinManager","l":"SkinManager(PlayerBlockLife)","u":"%3Cinit%3E(com.playerblocklife.PlayerBlockLife)"},{"p":"com.playerblocklife","c":"GameStateManager.GameState","l":"STARTED"},{"p":"com.playerblocklife","c":"GameStateManager","l":"startGame()"},{"p":"com.playerblocklife","c":"GameStateManager","l":"startTimedGame(int)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"updatePlayerScoreboard(Player)","u":"updatePlayerScoreboard(org.bukkit.entity.Player)"},{"p":"com.playerblocklife","c":"GameStateManager","l":"updateScoreboard()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"useExternalMessageFile()"},{"p":"com.playerblocklife","c":"ConfigManager","l":"useSkinsRestorer()"},{"p":"com.playerblocklife","c":"GameStateManager.GameState","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"com.playerblocklife","c":"GameStateManager.GameState","l":"values()"},{"p":"com.playerblocklife","c":"GameStateManager.GameState","l":"WAITING"}];updateSearchResults(); \ No newline at end of file diff --git a/build/docs/javadoc/module-search-index.js b/build/docs/javadoc/module-search-index.js new file mode 100644 index 0000000..0d59754 --- /dev/null +++ b/build/docs/javadoc/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/build/docs/javadoc/overview-tree.html b/build/docs/javadoc/overview-tree.html new file mode 100644 index 0000000..8022b46 --- /dev/null +++ b/build/docs/javadoc/overview-tree.html @@ -0,0 +1,104 @@ + + + + +类分层结构 (PlayerBlockLife 2.2.0-alpha-1.20.4 API) + + + + + + + + + + + + + +
+ +
+
+
+

所有程序包的分层结构

+
+程序包分层结构: + +
+

类分层结构

+ +
+
+

枚举类分层结构

+ +
+
+
+
+ + diff --git a/build/docs/javadoc/package-search-index.js b/build/docs/javadoc/package-search-index.js new file mode 100644 index 0000000..61da5d5 --- /dev/null +++ b/build/docs/javadoc/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"com.playerblocklife"},{"l":"所有程序包","u":"allpackages-index.html"}];updateSearchResults(); \ No newline at end of file diff --git a/build/docs/javadoc/resources/glass.png b/build/docs/javadoc/resources/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f591f467a1c0c949bbc510156a0c1afb860a6e GIT binary patch literal 499 zcmVJoRsvExf%rEN>jUL}qZ_~k#FbE+Q;{`;0FZwVNX2n-^JoI; zP;4#$8DIy*Yk-P>VN(DUKmPse7mx+ExD4O|;?E5D0Z5($mjO3`*anwQU^s{ZDK#Lz zj>~{qyaIx5K!t%=G&2IJNzg!ChRpyLkO7}Ry!QaotAHAMpbB3AF(}|_f!G-oI|uK6 z`id_dumai5K%C3Y$;tKS_iqMPHg<*|-@e`liWLAggVM!zAP#@l;=c>S03;{#04Z~5 zN_+ss=Yg6*hTr59mzMwZ@+l~q!+?ft!fF66AXT#wWavHt30bZWFCK%!BNk}LN?0Hg z1VF_nfs`Lm^DjYZ1(1uD0u4CSIr)XAaqW6IT{!St5~1{i=i}zAy76p%_|w8rh@@c0Axr!ns=D-X+|*sY6!@wacG9%)Qn*O zl0sa739kT-&_?#oVxXF6tOnqTD)cZ}2vi$`ZU8RLAlo8=_z#*P3xI~i!lEh+Pdu-L zx{d*wgjtXbnGX_Yf@Tc7Q3YhLhPvc8noGJs2DA~1DySiA&6V{5JzFt ojAY1KXm~va;tU{v7C?Xj0BHw!K;2aXV*mgE07*qoM6N<$f;4TDA^-pY literal 0 HcmV?d00001 diff --git a/build/docs/javadoc/script-dir/jquery-3.7.1.min.js b/build/docs/javadoc/script-dir/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/build/docs/javadoc/script-dir/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0{"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(x){x.ui=x.ui||{};x.ui.version="1.14.1";var n,s,C,k,o,l,a,r,u,i,h=0,c=Array.prototype.hasOwnProperty,d=Array.prototype.slice;x.cleanData=(n=x.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=x._data(i,"events"))&&e.remove&&x(i).triggerHandler("remove");n(t)}),x.widget=function(t,i,e){var s,n,o,l,a={},r=t.split(".")[0];return"__proto__"===(t=t.split(".")[1])||"constructor"===t?x.error("Invalid widget name: "+t):(l=r+"-"+t,e||(e=i,i=x.Widget),Array.isArray(e)&&(e=x.extend.apply(null,[{}].concat(e))),x.expr.pseudos[l.toLowerCase()]=function(t){return!!x.data(t,l)},x[r]=x[r]||{},s=x[r][t],n=x[r][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},x.extend(n,s,{version:e.version,_proto:x.extend({},e),_childConstructors:[]}),(o=new i).options=x.widget.extend({},o.options),x.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}a[e]="function"!=typeof s?s:function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}}),n.prototype=x.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},a,{constructor:n,namespace:r,widgetName:t,widgetFullName:l}),s?(x.each(s._childConstructors,function(t,e){var i=e.prototype;x.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),x.widget.bridge(t,n),n)},x.widget.extend=function(t){for(var e,i,s=d.call(arguments,1),n=0,o=s.length;n",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n{var i=[];n.element.each(function(t,e){x.map(l.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),l._on(x(i),{remove:"_untrackClassesElement"})})(),x(x.uniqueSort(i.get().concat(n.element.get())))):x(i.not(n.element).get()),l.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=x.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;x.each(s.classesElementLookup,function(t,e){-1!==x.inArray(i.target,e)&&(s.classesElementLookup[t]=x(e.not(i.target).get()))}),this._off(x(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,e={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return e.element.toggleClass(this._classes(e),s),this},_on:function(n,o,t){var l,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=l=x(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,l=this.widget()),x.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!x(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||x.guid++);var t=t.match(/^([\w:-]*)\s*(.*)$/),s=t[1]+a.eventNamespace,t=t[2];t?l.on(s,t,i):o.on(s,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=x(this.bindings.not(t).get()),this.focusable=x(this.focusable.not(t).get()),this.hoverable=x(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(x(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(x(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(x(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(x(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=x.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},x.each({show:"fadeIn",hide:"fadeOut"},function(o,l){x.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||l:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!x.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&x.effects&&x.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){x(this)[o](),i&&i.call(e[0]),t()})}}),x.widget;function E(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function T(t,e){return parseInt(x.css(t,e),10)||0}function W(t){return null!=t&&t===t.window}C=Math.max,k=Math.abs,o=/left|center|right/,l=/top|center|bottom/,a=/[\+\-]\d+(\.[\d]+)?%?/,r=/^\w+/,u=/%$/,i=x.fn.position,x.position={scrollbarWidth:function(){var t,e,i;return void 0!==s?s:(i=(e=x("
")).children()[0],x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i)},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(k(s),k(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})):i.apply(this,arguments)},x.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,s=s.width,o=t.left-e.collisionPosition.marginLeft,l=n-o,a=o+e.collisionWidth-s-n;s",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(this.document[0].activeElement);!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active)&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]!==i[0])||i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),t=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(t,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),e=(i=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(i,"ui-menu-item")._addClass(e,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(e=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,i=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-e-i,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&"true"===this.element.prop("contentEditable"),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)i=!1,this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault();else if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){n?(n=!1,t.preventDefault()):this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("