2 Commits

Author SHA1 Message Date
xiaobai
032ef02ec8 2.2.2-1.20.4
可以通过配置文件修改方块生成的范围
2026-02-16 19:00:54 +08:00
xiaobai
f8c8b1141d 2.2.0-1.20.4
将生命方块由玩家头换为其他原版多颜色方块
2026-02-16 17:53:43 +08:00
56 changed files with 1083 additions and 26 deletions

View File

@@ -0,0 +1,8 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavadocReference" enabled="true" level="ERROR" enabled_by_default="true">
<option name="REPORT_INACCESSIBLE" value="false" />
</inspection_tool>
</profile>
</component>

View File

@@ -4,7 +4,7 @@ plugins {
}
group = 'com.playerblocklife'
version = '2.2.0-1.20.4'
version = '2.2.2-1.20.4'
sourceCompatibility = 17
targetCompatibility = 17

View File

@@ -0,0 +1,241 @@
<!DOCTYPE HTML>
<html lang="zh">
<head>
<!-- Generated by javadoc (21) -->
<title>GameStateManager.GameState (PlayerBlockLife 2.2.0-alpha-1.20.4 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="declaration: package: com.playerblocklife, class: GameStateManager, enum: GameState">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../";
loadScripts(document, 'script');</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="切换导航链接"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="跳过导航链接">跳过导航链接</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="导航">
<li><a href="package-summary.html">程序包</a></li>
<li class="nav-bar-cell1-rev"></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../index-all.html">索引</a></li>
<li><a href="../../help-doc.html#class">帮助</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>概要:</p>
<ul>
<li><a href="#nested-class-summary">嵌套</a></li>
<li><a href="#enum-constant-summary">枚举常量</a></li>
<li>字段</li>
<li><a href="#method-summary">方法</a></li>
</ul>
</li>
<li>
<p>详细资料:</p>
<ul>
<li><a href="#enum-constant-detail">枚举常量</a></li>
<li>字段</li>
<li><a href="#method-detail">方法</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>概要:&nbsp;</li>
<li><a href="#nested-class-summary">嵌套</a>&nbsp;|&nbsp;</li>
<li><a href="#enum-constant-summary">枚举常量</a>&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#method-summary">方法</a></li>
</ul>
<ul class="sub-nav-list">
<li>详细资料:&nbsp;</li>
<li><a href="#enum-constant-detail">枚举常量</a>&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#method-detail">方法</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="搜索">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">程序包</span>&nbsp;<a href="package-summary.html">com.playerblocklife</a></div>
<h1 title="枚举类 GameStateManager.GameState" class="title">枚举类 GameStateManager.GameState</h1>
</div>
<div class="inheritance" title="继承树"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">java.lang.Object</a>
<div class="inheritance"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html" title="java.lang中的类或接口" class="external-link">java.lang.Enum</a>&lt;<a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>&gt;
<div class="inheritance">com.playerblocklife.GameStateManager.GameState</div>
</div>
</div>
<section class="class-description" id="class-description">
<dl class="notes">
<dt>所有已实现的接口:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/Serializable.html" title="java.io中的类或接口" class="external-link">Serializable</a></code>, <code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Comparable.html" title="java.lang中的类或接口" class="external-link">Comparable</a>&lt;<a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>&gt;</code>, <code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/constant/Constable.html" title="java.lang.constant中的类或接口" class="external-link">Constable</a></code></dd>
</dl>
<dl class="notes">
<dt>封闭类:</dt>
<dd><code><a href="GameStateManager.html" title="com.playerblocklife中的类">GameStateManager</a></code></dd>
</dl>
<hr>
<div class="type-signature"><span class="modifiers">public static enum </span><span class="element-name type-name-label">GameStateManager.GameState</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html" title="java.lang中的类或接口" class="external-link">Enum</a>&lt;<a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>&gt;</span></div>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<li>
<section class="nested-class-summary" id="nested-class-summary">
<h2>嵌套类概要</h2>
<div class="inherited-list">
<h2 id="nested-classes-inherited-from-class-java.lang.Enum">从类继承的嵌套类/接口&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html" title="java.lang中的类或接口" class="external-link">Enum</a></h2>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.EnumDesc.html" title="java.lang中的类或接口" class="external-link">Enum.EnumDesc</a>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.EnumDesc.html" title="java.lang中的类或接口" class="external-link">E</a> extends <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html" title="java.lang中的类或接口" class="external-link">Enum</a>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.EnumDesc.html" title="java.lang中的类或接口" class="external-link">E</a>&gt;&gt;</code></div>
</section>
</li>
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
<li>
<section class="constants-summary" id="enum-constant-summary">
<h2>枚举常量概要</h2>
<div class="caption"><span>枚举常量</span></div>
<div class="summary-table two-column-summary">
<div class="table-header col-first">枚举常量</div>
<div class="table-header col-last">说明</div>
<div class="col-first even-row-color"><code><a href="#FINISHED" class="member-name-link">FINISHED</a></code></div>
<div class="col-last even-row-color">&nbsp;</div>
<div class="col-first odd-row-color"><code><a href="#STARTED" class="member-name-link">STARTED</a></code></div>
<div class="col-last odd-row-color">&nbsp;</div>
<div class="col-first even-row-color"><code><a href="#WAITING" class="member-name-link">WAITING</a></code></div>
<div class="col-last even-row-color">&nbsp;</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>方法概要</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">所有方法</button><button id="method-summary-table-tab1" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab1', 3)" class="table-tab">静态方法</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">具体方法</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel" aria-labelledby="method-summary-table-tab0">
<div class="summary-table three-column-summary">
<div class="table-header col-first">修饰符和类型</div>
<div class="table-header col-second">方法</div>
<div class="table-header col-last">说明</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#valueOf(java.lang.String)" class="member-name-link">valueOf</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>&nbsp;name)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
<div class="block">返回带有指定名称的该类的枚举常量。</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code>static <a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>[]</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4"><code><a href="#values()" class="member-name-link">values</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab1 method-summary-table-tab4">
<div class="block">返回包含该枚举类的常量的数组,
顺序与声明这些常量的顺序相同</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Enum">从类继承的方法&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html" title="java.lang中的类或接口" class="external-link">Enum</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#clone()" title="java.lang中的类或接口" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#compareTo(E)" title="java.lang中的类或接口" class="external-link">compareTo</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#describeConstable()" title="java.lang中的类或接口" class="external-link">describeConstable</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#equals(java.lang.Object)" title="java.lang中的类或接口" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#finalize()" title="java.lang中的类或接口" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#getDeclaringClass()" title="java.lang中的类或接口" class="external-link">getDeclaringClass</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#hashCode()" title="java.lang中的类或接口" class="external-link">hashCode</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#name()" title="java.lang中的类或接口" class="external-link">name</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#ordinal()" title="java.lang中的类或接口" class="external-link">ordinal</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#toString()" title="java.lang中的类或接口" class="external-link">toString</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Enum.html#valueOf(java.lang.Class,java.lang.String)" title="java.lang中的类或接口" class="external-link">valueOf</a></code></div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Object">从类继承的方法&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#getClass()" title="java.lang中的类或接口" class="external-link">getClass</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notify()" title="java.lang中的类或接口" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notifyAll()" title="java.lang中的类或接口" class="external-link">notifyAll</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait()" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long)" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="java.lang中的类或接口" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ ENUM CONSTANT DETAIL =========== -->
<li>
<section class="constant-details" id="enum-constant-detail">
<h2>枚举常量详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="WAITING">
<h3>WAITING</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></span>&nbsp;<span class="element-name">WAITING</span></div>
</section>
</li>
<li>
<section class="detail" id="STARTED">
<h3>STARTED</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></span>&nbsp;<span class="element-name">STARTED</span></div>
</section>
</li>
<li>
<section class="detail" id="FINISHED">
<h3>FINISHED</h3>
<div class="member-signature"><span class="modifiers">public static final</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></span>&nbsp;<span class="element-name">FINISHED</span></div>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>方法详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="values()">
<h3>values</h3>
<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>[]</span>&nbsp;<span class="element-name">values</span>()</div>
<div class="block">返回包含该枚举类的常量的数组,
顺序与声明这些常量的顺序相同</div>
<dl class="notes">
<dt>返回:</dt>
<dd>包含该枚举类的常量的数组,顺序与声明这些常量的顺序相同</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="valueOf(java.lang.String)">
<h3>valueOf</h3>
<div class="member-signature"><span class="modifiers">public static</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></span>&nbsp;<span class="element-name">valueOf</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>&nbsp;name)</span></div>
<div class="block">返回带有指定名称的该类的枚举常量。
字符串必须与用于声明该类的枚举常量的
标识符<i>完全</i>匹配。(不允许有多余
的空格字符。)</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>name</code> - 要返回的枚举常量的名称。</dd>
<dt>返回:</dt>
<dd>返回带有指定名称的枚举常量</dd>
<dt>抛出:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/IllegalArgumentException.html" title="java.lang中的类或接口" class="external-link">IllegalArgumentException</a></code> - 如果该枚举类没有带有指定名称的常量</dd>
<dd><code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/NullPointerException.html" title="java.lang中的类或接口" class="external-link">NullPointerException</a></code> - 如果参数为空值</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,503 @@
<!DOCTYPE HTML>
<html lang="zh">
<head>
<!-- Generated by javadoc (21) -->
<title>GameStateManager (PlayerBlockLife 2.2.0-alpha-1.20.4 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="declaration: package: com.playerblocklife, class: GameStateManager">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../";
loadScripts(document, 'script');</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="切换导航链接"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="跳过导航链接">跳过导航链接</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="导航">
<li><a href="package-summary.html">程序包</a></li>
<li class="nav-bar-cell1-rev"></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../index-all.html">索引</a></li>
<li><a href="../../help-doc.html#class">帮助</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>概要:</p>
<ul>
<li><a href="#nested-class-summary">嵌套</a></li>
<li>字段</li>
<li><a href="#constructor-summary">构造器</a></li>
<li><a href="#method-summary">方法</a></li>
</ul>
</li>
<li>
<p>详细资料:</p>
<ul>
<li>字段</li>
<li><a href="#constructor-detail">构造器</a></li>
<li><a href="#method-detail">方法</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>概要:&nbsp;</li>
<li><a href="#nested-class-summary">嵌套</a>&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor-summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method-summary">方法</a></li>
</ul>
<ul class="sub-nav-list">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor-detail">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method-detail">方法</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="搜索">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">程序包</span>&nbsp;<a href="package-summary.html">com.playerblocklife</a></div>
<h1 title="类 GameStateManager" class="title">类 GameStateManager</h1>
</div>
<div class="inheritance" title="继承树"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">java.lang.Object</a>
<div class="inheritance">com.playerblocklife.GameStateManager</div>
</div>
<section class="class-description" id="class-description">
<hr>
<div class="type-signature"><span class="modifiers">public class </span><span class="element-name type-name-label">GameStateManager</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">Object</a></span></div>
<div class="block">游戏状态管理器 - PBL生存游戏模式的核心管理器
<p>主要功能包括:
<ul>
<li>管理游戏状态(等待中/游戏中/已结束)</li>
<li>为非OP玩家分配独特颜色的生命方块</li>
<li>处理游戏开始时的生命方块生成</li>
<li>控制游戏开始和结束逻辑</li>
<li>管理实时计分板显示(游戏状态、剩余方块、限时等)</li>
<li>处理游戏重置和玩家淘汰</li>
<li>监控游戏结束条件(仅剩一名存活玩家或限时结束)</li>
</ul>
<p><b>游戏模式特性:</b>
<ul>
<li>OP玩家始终处于观察者模式不参与游戏</li>
<li>非OP玩家在等待时处于冒险模式手中持有对应颜色方块</li>
<li>游戏开始后非OP玩家转为生存模式并清空背包</li>
<li>使用不同颜色的羊毛、玻璃、水泥方块作为生命方块</li>
<li>支持限时游戏模式</li>
<li>游戏结束时显示胜利玩家</li>
</ul></div>
<dl class="notes">
<dt>从以下版本开始:</dt>
<dd>4.0.0</dd>
</dl>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<li>
<section class="nested-class-summary" id="nested-class-summary">
<h2>嵌套类概要</h2>
<div class="caption"><span>嵌套类</span></div>
<div class="summary-table three-column-summary">
<div class="table-header col-first">修饰符和类型</div>
<div class="table-header col-second"></div>
<div class="table-header col-last">说明</div>
<div class="col-first even-row-color"><code>static enum&nbsp;</code></div>
<div class="col-second even-row-color"><code><a href="GameStateManager.GameState.html" class="type-name-link" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></code></div>
<div class="col-last even-row-color">&nbsp;</div>
</div>
</section>
</li>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<li>
<section class="constructor-summary" id="constructor-summary">
<h2>构造器概要</h2>
<div class="caption"><span>构造器</span></div>
<div class="summary-table two-column-summary">
<div class="table-header col-first">构造器</div>
<div class="table-header col-last">说明</div>
<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(com.playerblocklife.PlayerBlockLife)" class="member-name-link">GameStateManager</a><wbr>(<a href="PlayerBlockLife.html" title="com.playerblocklife中的类">PlayerBlockLife</a>&nbsp;plugin)</code></div>
<div class="col-last even-row-color">&nbsp;</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>方法概要</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">所有方法</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">实例方法</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">具体方法</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel" aria-labelledby="method-summary-table-tab0">
<div class="summary-table three-column-summary">
<div class="table-header col-first">修饰符和类型</div>
<div class="table-header col-second">方法</div>
<div class="table-header col-last">说明</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#assignPlayerColor(org.bukkit.entity.Player)" class="member-name-link">assignPlayerColor</a><wbr>(org.bukkit.entity.Player&nbsp;player)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">为玩家分配颜色</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#checkGameEnd()" class="member-name-link">checkGameEnd</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">检查游戏是否结束</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#clearPlayerBlocks(java.util.UUID)" class="member-name-link">clearPlayerBlocks</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">清除指定玩家的方块</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#generateLifeBlocksForPlayer(org.bukkit.entity.Player)" class="member-name-link">generateLifeBlocksForPlayer</a><wbr>(org.bukkit.entity.Player&nbsp;player)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">为玩家生成生命方块</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html" title="java.util中的类或接口" class="external-link">List</a><wbr>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&gt;</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getAlivePlayers()" class="member-name-link">getAlivePlayers</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取所有存活玩家</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getAlivePlayersCount()" class="member-name-link">getAlivePlayersCount</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取存活玩家数量</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getCurrentState()" class="member-name-link">getCurrentState</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getGameDuration()" class="member-name-link">getGameDuration</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取游戏持续时间(分钟)</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>long</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getGameStartTime()" class="member-name-link">getGameStartTime</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取游戏开始时间戳</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Map.html" title="java.util中的类或接口" class="external-link">Map</a><wbr>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html" title="java.util中的类或接口" class="external-link">List</a>&lt;org.bukkit.Location&gt;&gt;</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getPlayerBlocks()" class="member-name-link">getPlayerBlocks</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取所有玩家的方块位置</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>org.bukkit.Material</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getPlayerColor(java.util.UUID)" class="member-name-link">getPlayerColor</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取玩家颜色</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>int</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getRemainingBlocks(java.util.UUID)" class="member-name-link">getRemainingBlocks</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">获取玩家剩余方块数量</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isLimitedTime()" class="member-name-link">isLimitedTime</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">检查是否为限时游戏</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#removeBlock(org.bukkit.Location,org.bukkit.entity.Player)" class="member-name-link">removeBlock</a><wbr>(org.bukkit.Location&nbsp;location,
org.bukkit.entity.Player&nbsp;breaker)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">移除被破坏的生命方块</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#resetGame()" class="member-name-link">resetGame</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">重置游戏</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#setCurrentState(com.playerblocklife.GameStateManager.GameState)" class="member-name-link">setCurrentState</a><wbr>(<a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>&nbsp;state)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#startGame()" class="member-name-link">startGame</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">开始游戏</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#startTimedGame(int)" class="member-name-link">startTimedGame</a><wbr>(int&nbsp;minutes)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">开始限时游戏</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#updatePlayerScoreboard(org.bukkit.entity.Player)" class="member-name-link">updatePlayerScoreboard</a><wbr>(org.bukkit.entity.Player&nbsp;player)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">更新玩家特定的计分板信息</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#updateScoreboard()" class="member-name-link">updateScoreboard</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">更新计分板</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Object">从类继承的方法&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#clone()" title="java.lang中的类或接口" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="java.lang中的类或接口" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#finalize()" title="java.lang中的类或接口" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#getClass()" title="java.lang中的类或接口" class="external-link">getClass</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#hashCode()" title="java.lang中的类或接口" class="external-link">hashCode</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notify()" title="java.lang中的类或接口" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notifyAll()" title="java.lang中的类或接口" class="external-link">notifyAll</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#toString()" title="java.lang中的类或接口" class="external-link">toString</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait()" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long)" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="java.lang中的类或接口" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<li>
<section class="constructor-details" id="constructor-detail">
<h2>构造器详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="&lt;init&gt;(com.playerblocklife.PlayerBlockLife)">
<h3>GameStateManager</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name">GameStateManager</span><wbr><span class="parameters">(<a href="PlayerBlockLife.html" title="com.playerblocklife中的类">PlayerBlockLife</a>&nbsp;plugin)</span></div>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>方法详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="getCurrentState()">
<h3>getCurrentState</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a></span>&nbsp;<span class="element-name">getCurrentState</span>()</div>
</section>
</li>
<li>
<section class="detail" id="setCurrentState(com.playerblocklife.GameStateManager.GameState)">
<h3>setCurrentState</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">setCurrentState</span><wbr><span class="parameters">(<a href="GameStateManager.GameState.html" title="com.playerblocklife 中的枚举类">GameStateManager.GameState</a>&nbsp;state)</span></div>
</section>
</li>
<li>
<section class="detail" id="assignPlayerColor(org.bukkit.entity.Player)">
<h3>assignPlayerColor</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">assignPlayerColor</span><wbr><span class="parameters">(org.bukkit.entity.Player&nbsp;player)</span></div>
<div class="block">为玩家分配颜色</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>player</code> - 要分配颜色的玩家</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="generateLifeBlocksForPlayer(org.bukkit.entity.Player)">
<h3>generateLifeBlocksForPlayer</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">generateLifeBlocksForPlayer</span><wbr><span class="parameters">(org.bukkit.entity.Player&nbsp;player)</span></div>
<div class="block">为玩家生成生命方块</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>player</code> - 要生成生命方块的玩家</dd>
<dt>返回:</dt>
<dd>生成成功返回true否则返回false</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="removeBlock(org.bukkit.Location,org.bukkit.entity.Player)">
<h3>removeBlock</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">removeBlock</span><wbr><span class="parameters">(org.bukkit.Location&nbsp;location,
org.bukkit.entity.Player&nbsp;breaker)</span></div>
<div class="block">移除被破坏的生命方块</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>location</code> - 方块位置</dd>
<dd><code>breaker</code> - 破坏方块的玩家</dd>
<dt>返回:</dt>
<dd>移除成功返回true否则返回false</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="checkGameEnd()">
<h3>checkGameEnd</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">checkGameEnd</span>()</div>
<div class="block">检查游戏是否结束</div>
</section>
</li>
<li>
<section class="detail" id="startTimedGame(int)">
<h3>startTimedGame</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">startTimedGame</span><wbr><span class="parameters">(int&nbsp;minutes)</span></div>
<div class="block">开始限时游戏</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>minutes</code> - 游戏限时(分钟)</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="startGame()">
<h3>startGame</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">startGame</span>()</div>
<div class="block">开始游戏</div>
</section>
</li>
<li>
<section class="detail" id="resetGame()">
<h3>resetGame</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">resetGame</span>()</div>
<div class="block">重置游戏</div>
</section>
</li>
<li>
<section class="detail" id="getRemainingBlocks(java.util.UUID)">
<h3>getRemainingBlocks</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name">getRemainingBlocks</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</span></div>
<div class="block">获取玩家剩余方块数量</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>playerId</code> - 玩家UUID</dd>
<dt>返回:</dt>
<dd>玩家剩余方块数量</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getPlayerColor(java.util.UUID)">
<h3>getPlayerColor</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">org.bukkit.Material</span>&nbsp;<span class="element-name">getPlayerColor</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</span></div>
<div class="block">获取玩家颜色</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>playerId</code> - 玩家UUID</dd>
<dt>返回:</dt>
<dd>玩家的颜色材料</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="updateScoreboard()">
<h3>updateScoreboard</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">updateScoreboard</span>()</div>
<div class="block">更新计分板</div>
</section>
</li>
<li>
<section class="detail" id="updatePlayerScoreboard(org.bukkit.entity.Player)">
<h3>updatePlayerScoreboard</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">updatePlayerScoreboard</span><wbr><span class="parameters">(org.bukkit.entity.Player&nbsp;player)</span></div>
<div class="block">更新玩家特定的计分板信息</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>player</code> - 要更新计分板的玩家</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getAlivePlayersCount()">
<h3>getAlivePlayersCount</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name">getAlivePlayersCount</span>()</div>
<div class="block">获取存活玩家数量</div>
<dl class="notes">
<dt>返回:</dt>
<dd>存活玩家数量</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getAlivePlayers()">
<h3>getAlivePlayers</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html" title="java.util中的类或接口" class="external-link">List</a>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&gt;</span>&nbsp;<span class="element-name">getAlivePlayers</span>()</div>
<div class="block">获取所有存活玩家</div>
<dl class="notes">
<dt>返回:</dt>
<dd>存活玩家UUID列表</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getPlayerBlocks()">
<h3>getPlayerBlocks</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Map.html" title="java.util中的类或接口" class="external-link">Map</a>&lt;<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>,<wbr><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html" title="java.util中的类或接口" class="external-link">List</a>&lt;org.bukkit.Location&gt;&gt;</span>&nbsp;<span class="element-name">getPlayerBlocks</span>()</div>
<div class="block">获取所有玩家的方块位置</div>
<dl class="notes">
<dt>返回:</dt>
<dd>玩家UUID到方块位置列表的映射</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="clearPlayerBlocks(java.util.UUID)">
<h3>clearPlayerBlocks</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">clearPlayerBlocks</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/UUID.html" title="java.util中的类或接口" class="external-link">UUID</a>&nbsp;playerId)</span></div>
<div class="block">清除指定玩家的方块</div>
<dl class="notes">
<dt>参数:</dt>
<dd><code>playerId</code> - 要清除方块的玩家UUID</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getGameDuration()">
<h3>getGameDuration</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">int</span>&nbsp;<span class="element-name">getGameDuration</span>()</div>
<div class="block">获取游戏持续时间(分钟)</div>
<dl class="notes">
<dt>返回:</dt>
<dd>游戏持续时间(分钟)</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getGameStartTime()">
<h3>getGameStartTime</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">long</span>&nbsp;<span class="element-name">getGameStartTime</span>()</div>
<div class="block">获取游戏开始时间戳</div>
<dl class="notes">
<dt>返回:</dt>
<dd>游戏开始时间戳</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="isLimitedTime()">
<h3>isLimitedTime</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">isLimitedTime</span>()</div>
<div class="block">检查是否为限时游戏</div>
<dl class="notes">
<dt>返回:</dt>
<dd>如果是限时游戏返回true否则返回false</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,198 @@
<!DOCTYPE HTML>
<html lang="zh">
<head>
<!-- Generated by javadoc (21) -->
<title>PBLCommands (PlayerBlockLife 2.2.0-alpha-1.20.4 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="declaration: package: com.playerblocklife, class: PBLCommands">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../script-dir/jquery-ui.min.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../";
loadScripts(document, 'script');</script>
<noscript>
<div>您的浏览器已禁用 JavaScript。</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="切换导航链接"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="跳过导航链接">跳过导航链接</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="导航">
<li><a href="package-summary.html">程序包</a></li>
<li class="nav-bar-cell1-rev"></li>
<li><a href="package-tree.html"></a></li>
<li><a href="../../index-all.html">索引</a></li>
<li><a href="../../help-doc.html#class">帮助</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>概要:</p>
<ul>
<li>嵌套</li>
<li>字段</li>
<li><a href="#constructor-summary">构造器</a></li>
<li><a href="#method-summary">方法</a></li>
</ul>
</li>
<li>
<p>详细资料:</p>
<ul>
<li>字段</li>
<li><a href="#constructor-detail">构造器</a></li>
<li><a href="#method-detail">方法</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor-summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method-summary">方法</a></li>
</ul>
<ul class="sub-nav-list">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor-detail">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method-detail">方法</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="搜索">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">程序包</span>&nbsp;<a href="package-summary.html">com.playerblocklife</a></div>
<h1 title="类 PBLCommands" class="title">类 PBLCommands</h1>
</div>
<div class="inheritance" title="继承树"><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">java.lang.Object</a>
<div class="inheritance">com.playerblocklife.PBLCommands</div>
</div>
<section class="class-description" id="class-description">
<dl class="notes">
<dt>所有已实现的接口:</dt>
<dd><code>org.bukkit.command.CommandExecutor</code></dd>
</dl>
<hr>
<div class="type-signature"><span class="modifiers">public class </span><span class="element-name type-name-label">PBLCommands</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">Object</a>
implements org.bukkit.command.CommandExecutor</span></div>
<div class="block">PBL命令执行器 - 处理PBL游戏模式的专用命令
<p>提供PBL游戏模式的核心控制命令包括
<ul>
<li>/PBL start [时间] - 开始游戏,支持可选的限时模式</li>
<li>/PBL rstgm - 重置游戏,重新分配玩家颜色</li>
</ul>
<p>这些命令仅允许服务器管理员OP执行用于控制PBL游戏的生命周期。</p></div>
<dl class="notes">
<dt>从以下版本开始:</dt>
<dd>4.0.0</dd>
</dl>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<li>
<section class="constructor-summary" id="constructor-summary">
<h2>构造器概要</h2>
<div class="caption"><span>构造器</span></div>
<div class="summary-table two-column-summary">
<div class="table-header col-first">构造器</div>
<div class="table-header col-last">说明</div>
<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(com.playerblocklife.PlayerBlockLife)" class="member-name-link">PBLCommands</a><wbr>(<a href="PlayerBlockLife.html" title="com.playerblocklife中的类">PlayerBlockLife</a>&nbsp;plugin)</code></div>
<div class="col-last even-row-color">&nbsp;</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>方法概要</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">所有方法</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">实例方法</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">具体方法</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel" aria-labelledby="method-summary-table-tab0">
<div class="summary-table three-column-summary">
<div class="table-header col-first">修饰符和类型</div>
<div class="table-header col-second">方法</div>
<div class="table-header col-last">说明</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String%5B%5D)" class="member-name-link">onCommand</a><wbr>(org.bukkit.command.CommandSender&nbsp;sender,
org.bukkit.command.Command&nbsp;command,
<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>&nbsp;label,
<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>[]&nbsp;args)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-java.lang.Object">从类继承的方法&nbsp;java.lang.<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html" title="java.lang中的类或接口" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#clone()" title="java.lang中的类或接口" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="java.lang中的类或接口" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#finalize()" title="java.lang中的类或接口" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#getClass()" title="java.lang中的类或接口" class="external-link">getClass</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#hashCode()" title="java.lang中的类或接口" class="external-link">hashCode</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notify()" title="java.lang中的类或接口" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#notifyAll()" title="java.lang中的类或接口" class="external-link">notifyAll</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#toString()" title="java.lang中的类或接口" class="external-link">toString</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait()" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long)" title="java.lang中的类或接口" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="java.lang中的类或接口" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<li>
<section class="constructor-details" id="constructor-detail">
<h2>构造器详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="&lt;init&gt;(com.playerblocklife.PlayerBlockLife)">
<h3>PBLCommands</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name">PBLCommands</span><wbr><span class="parameters">(<a href="PlayerBlockLife.html" title="com.playerblocklife中的类">PlayerBlockLife</a>&nbsp;plugin)</span></div>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>方法详细资料</h2>
<ul class="member-list">
<li>
<section class="detail" id="onCommand(org.bukkit.command.CommandSender,org.bukkit.command.Command,java.lang.String,java.lang.String[])">
<h3>onCommand</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">onCommand</span><wbr><span class="parameters">(org.bukkit.command.CommandSender&nbsp;sender,
org.bukkit.command.Command&nbsp;command,
<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>&nbsp;label,
<a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html" title="java.lang中的类或接口" class="external-link">String</a>[]&nbsp;args)</span></div>
<dl class="notes">
<dt>指定者:</dt>
<dd><code>onCommand</code>&nbsp;在接口中&nbsp;<code>org.bukkit.command.CommandExecutor</code></dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
</div>
</div>
</body>
</html>

Binary file not shown.

Binary file not shown.

View File

@@ -9,6 +9,12 @@ game:
become_spectator: true
# 是否启用生命值系统
health_system: true
# 方块生成设置
# 生成方块范围(以玩家为中心的半径)
spread_range: 5
# 生成方块距离玩家的最小距离
min_distance: 2
# 广播设置
broadcast:

View File

@@ -1,5 +1,5 @@
name: PlayerBlockLife
version: 2.2.0-1.20.4
version: 2.2.2-1.20.4
main: com.playerblocklife.PlayerBlockLife
api-version: 1.20
author: xiaobai

View File

@@ -1,4 +1,4 @@
Manifest-Version: 1.0
Implementation-Version: 2.2.0-alpha-1.20.4
Implementation-Version: 2.2.1-1.20.4
Main-Class: com.playerblocklife.PlayerBlockLife

View File

@@ -1,4 +1,4 @@
Manifest-Version: 1.0
Implementation-Version: 2.2.0-1.20.4
Implementation-Version: 2.2.2-1.20.4
Main-Class: com.playerblocklife.PlayerBlockLife

View File

@@ -5,5 +5,5 @@ org.gradle.caching=true
org.gradle.daemon=true
# ????
pluginVersion=2.2.0-1.20.4
pluginVersion=2.2.2-1.20.4
mcVersion=1.20.4

View File

@@ -23,7 +23,7 @@ import java.util.UUID;
* <p>这些命令在新模式下会与GameStateManager交互以正确管理游戏状态。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class AdminCommands implements CommandExecutor {

View File

@@ -31,7 +31,7 @@ import java.util.UUID;
* <p>此监听器与GameStateManager协作确保游戏规则正确执行。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class BlockBreakListener implements Listener {

View File

@@ -13,7 +13,7 @@ import org.bukkit.entity.Player;
* 与旧模式不同,此命令不再显示生命方块的具体位置,而是提供当前游戏状态信息。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class CheckLifeBlocksCommand implements CommandExecutor {

View File

@@ -31,7 +31,7 @@ import java.nio.charset.StandardCharsets;
* </ul>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version -1.20.4
* @since 1.0.0
*/
public class ConfigManager {
@@ -323,6 +323,24 @@ public class ConfigManager {
return getConfig().getBoolean("protection.protect_from_pistons", true);
}
/**
* 获取方块生成范围(以玩家为中心的半径)
*
* @return 生成范围方块默认为5
*/
public int getSpreadRange() {
return getConfig().getInt("game.spread_range", 5);
}
/**
* 获取方块生成距离玩家的最小距离
*
* @return 最小距离方块默认为2
*/
public int getMinDistance() {
return getConfig().getInt("game.min_distance", 2);
}
// 命令启用配置获取方法

View File

@@ -45,7 +45,7 @@ import java.util.UUID;
* </ul>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version -1.20.4
* @since 4.0.0
*/
public class GameStateManager {
@@ -253,7 +253,8 @@ public class GameStateManager {
Material color = playerColors.get(player.getUniqueId());
ConfigManager config = plugin.getConfigManager();
int blockAmount = 5; // 使用固定值,因为配置已移除
int spreadRange = 5; // 使用固定值,因为配置已移除
int spreadRange = config.getSpreadRange(); // 从配置获取范围
int minDistance = config.getMinDistance(); // 从配置获取最小距离
List<Location> blocks = new ArrayList<>();
int blocksPlaced = 0;
@@ -266,6 +267,13 @@ public class GameStateManager {
int x = random.nextInt(spreadRange * 2 + 1) - spreadRange;
int z = random.nextInt(spreadRange * 2 + 1) - spreadRange;
// 检查与玩家的距离是否满足最小距离要求
double distance = Math.sqrt(x * x + z * z);
if (distance < minDistance) {
attempts++;
continue;
}
Location testLoc = center.clone().add(x, 0, z);
World world = testLoc.getWorld();
if (world == null) continue;
@@ -608,6 +616,14 @@ public class GameStateManager {
* 重置游戏
*/
public void resetGame() {
// 删除世界中所有未被破坏的生命方块(新模式)
removeGameBlocksFromWorld();
// 删除旧模式的生命方块
if (plugin.getBlockManager() != null) {
plugin.getBlockManager().resetGameBlocks();
}
// 清空所有数据
playerColors.clear();
playerBlocks.clear();
@@ -631,6 +647,33 @@ public class GameStateManager {
setCurrentState(GameState.WAITING);
}
/**
* 从世界中删除所有游戏生命方块
*/
private void removeGameBlocksFromWorld() {
// 遍历所有玩家的生命方块位置并将其设置为空气
for (List<Location> blocks : playerBlocks.values()) {
for (Location location : blocks) {
if (location.getWorld() != null) {
Block block = location.getBlock();
// 只删除生命方块(彩色羊毛、玻璃或混凝土)
if (isLifeBlockMaterial(block.getType())) {
block.setType(Material.AIR);
}
}
}
}
}
/**
* 检查材料是否为生命方块材料
*/
private boolean isLifeBlockMaterial(Material material) {
return material.name().endsWith("_WOOL") ||
material.name().endsWith("_STAINED_GLASS") ||
material.name().endsWith("_CONCRETE");
}
/**
* 获取玩家剩余方块数量
*/

View File

@@ -33,7 +33,7 @@ import java.util.UUID;
* </pre>
*
* @author xiaobai
* @version 2.2.0
* @version
* @since 1.0.0
*/
public class LifeSystem {

View File

@@ -18,7 +18,7 @@ import org.bukkit.entity.Player;
* <p>这些命令仅允许服务器管理员OP执行用于控制PlayerBlockLife游戏的生命周期。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 4.0.0
*/
public class PBLCommands implements CommandExecutor {

View File

@@ -24,7 +24,7 @@ import java.util.logging.Level;
* </ul>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class PlayerBlockLife extends JavaPlugin {

View File

@@ -42,7 +42,7 @@ import java.util.concurrent.ConcurrentHashMap;
* <p>使用并发安全的数据结构确保多线程环境下的数据一致性。</p>
*
* @author xiaobai
* @version 2.2.0
* @version 2.2.2
* @since 1.0.0
*/
public class PlayerBlockManager {
@@ -67,8 +67,10 @@ public class PlayerBlockManager {
ConfigManager config = plugin.getConfigManager();
boolean requireOpenSky = true; // 使用默认值,因为配置已移除
int maxAttempts = 50; // 使用默认值,因为配置已移除
int spreadRange = config.getSpreadRange(); // 从配置获取范围
int minDistance = config.getMinDistance(); // 从配置获取最小距离
return generateLifeBlocksForPlayer(player, 5, 5, requireOpenSky, maxAttempts);
return generateLifeBlocksForPlayer(player, 5, spreadRange, minDistance, requireOpenSky, maxAttempts);
}
/**
@@ -96,14 +98,15 @@ public class PlayerBlockManager {
*
* @param player 目标玩家
* @param blockAmount 要生成的方块数量
* @param spreadRange 生成范围(以玩家为中心的正方形边长的一半)
* @param spreadRange 生成范围(以玩家为中心的半
* @param minDistance 生成方块距离玩家的最小距离
* @param requireOpenSky 是否需要开阔天空(上方无方块覆盖)
* @param maxAttempts 寻找合适位置的最大尝试次数
* @return 生成成功返回true失败返回false
* @see SkinManager#isSkinLoaded(UUID)
* @see SkinManager#getSkinFromSkinsRestorer(Player)
*/
public boolean generateLifeBlocksForPlayer(Player player, int blockAmount, int spreadRange, boolean requireOpenSky, int maxAttempts) {
public boolean generateLifeBlocksForPlayer(Player player, int blockAmount, int spreadRange, int minDistance, boolean requireOpenSky, int maxAttempts) {
UUID playerId = player.getUniqueId();
String playerName = player.getName();
@@ -123,7 +126,7 @@ public class PlayerBlockManager {
// 尝试生成指定数量的方块
while (blocksPlaced < blockAmount && attempts < maxAttempts) {
Location blockLoc = findSurfaceLocation(player.getLocation(), spreadRange, requireOpenSky);
Location blockLoc = findSurfaceLocation(player.getLocation(), spreadRange, minDistance, requireOpenSky);
attempts++;
if (blockLoc != null && placePlayerHead(blockLoc, playerId, playerName)) {
@@ -148,11 +151,18 @@ public class PlayerBlockManager {
/**
* 寻找地表位置(放宽条件,只要是露天地面就可以)
*/
private Location findSurfaceLocation(Location center, int spreadRange, boolean requireOpenSky) {
private Location findSurfaceLocation(Location center, int spreadRange, int minDistance, boolean requireOpenSky) {
for (int i = 0; i < 20; i++) { // 增加尝试次数
int x = random.nextInt(spreadRange * 2 + 1) - spreadRange;
int z = random.nextInt(spreadRange * 2 + 1) - spreadRange;
// 检查与玩家的距离是否满足最小距离要求
double distance = Math.sqrt(x * x + z * z);
if (distance < minDistance) {
// 如果距离太近,重新生成坐标
continue;
}
// 以玩家坐标为中心,但高度从世界最高点开始寻找
Location testLoc = center.clone().add(x, 0, z);
World world = testLoc.getWorld();
@@ -755,6 +765,30 @@ public class PlayerBlockManager {
return nearest;
}
/**
* 重置游戏时删除所有未被破坏的生命方块
*/
public void resetGameBlocks() {
// 遍历所有生命方块位置并将其设置为空气
for (Location location : blockOwners.keySet()) {
if (location.getWorld() != null) {
Block block = location.getBlock();
// 只删除玩家头颅方块
if (block.getType() == Material.PLAYER_HEAD || block.getType() == Material.PLAYER_WALL_HEAD) {
block.setType(Material.AIR);
}
}
}
// 清空内部数据结构
playerBlocks.clear();
blockOwners.clear();
playerBlockTypes.clear();
// 保存数据更新
saveData();
}
/**
* 获取所有生命方块的统计信息
*/

View File

@@ -28,7 +28,7 @@ import java.util.UUID;
* <p>此监听器与GameStateManager协作确保玩家正确加入PlayerBlockLife游戏模式。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class PlayerJoinListener implements Listener {
@@ -90,7 +90,7 @@ public class PlayerJoinListener implements Listener {
// 调用方块管理器生成方块
boolean success = plugin.getBlockManager().generateLifeBlocksForPlayer(
player, 5, 5, requireOpenSky, maxAttempts
player, 5, config.getSpreadRange(), config.getMinDistance(), requireOpenSky, maxAttempts
);
if (success) {

View File

@@ -11,7 +11,7 @@ import org.bukkit.event.player.PlayerQuitEvent;
* 其生命方块状态,因为方块位置信息仅在服务器运行期间维护。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class PlayerQuitListener implements Listener {

View File

@@ -14,7 +14,7 @@ import org.bukkit.entity.Player;
* 玩家应等待管理员使用 /PlayerBlockLife start 命令开始游戏。</p>
*
* @author xiaobai
* @version 2.2.0-1.20.4
* @version 2.2.2-1.20.4
* @since 1.0.0
*/
public class SetLifeBlocksCommand implements CommandExecutor {

View File

@@ -52,7 +52,7 @@ import java.util.concurrent.ConcurrentHashMap;
* <p>皮肤缓存默认保留7天过期后自动重新获取。</p>
*
* @author xiaobai
* @version 2.2.0
* @version 2.2.2
* @since 1.0.0
*/
public class SkinManager {

View File

@@ -9,6 +9,12 @@ game:
become_spectator: true
# 是否启用生命值系统
health_system: true
# 方块生成设置
# 生成方块范围(以玩家为中心的半径)
spread_range: 5
# 生成方块距离玩家的最小距离
min_distance: 2
# 广播设置
broadcast:

View File

@@ -1,5 +1,5 @@
name: PlayerBlockLife
version: 2.2.0-1.20.4
version: 2.2.2-1.20.4
main: com.playerblocklife.PlayerBlockLife
api-version: 1.20
author: xiaobai