hebbinkpro / pocketmap
PocketMine-MP服务器动态基于网页的世界地图。
Requires
- hebbinkpro/pmmp-webserver: ^0.4.1
- muqsit/simple-packet-handler: dev-pm5
Requires (Dev)
- php: ^8.1
- himbeer/libskin: ^2.0.1
- paroxity/commando: ^3.1.0
- phpstan/extension-installer: ^1.2.0
- phpstan/phpstan: ^1.10.3
- phpstan/phpstan-strict-rules: ^1.5.0
- pocketmine/pocketmine-mp: ^5.13.0
README
PocketMine-MP服务器动态基于网页的世界地图。
要了解插件的所有功能,请参阅文档
v0.5版本的新功能
/pocketmap
(或/pmap
)命令现在可用,之前的命令(/render
和/reload
)现在是子命令!- 要列出所有可用命令,请使用:
/pmap help
- 要列出所有可用命令,请使用:
- 标记 - 现在您可以使用命令(
/pmap marker
)使用图标在地图上标记地点。
查看变更日志
如何安装
-
从Poggit CI下载插件的最新版本
-
将插件放入您的PocketMine-MP服务器插件文件夹中
-
重新启动您的服务器,这将加载插件数据。
- 如果您没有在本地托管您的服务器,您必须为您的服务器分配一个新的端口。
- 为您的服务器分配一个新的端口。如果您不知道如何操作,请联系您的托管提供商。
- 转到
config.yml
并将web-server.port
更改为您的新分配端口(替换3000
)。 - 再次重新启动您的服务器。
-
转到
http://<server_ip>:<web-server.port>
以查看地图。
- 默认Web服务器端口为
3000
,因此如果您没有更改它,请使用此端口。
如何使用
渲染整个世界
如果您已经创建了一个世界,并且它还没有在PocketMap上(完全)可见,请执行以下操作
- 执行
/pmap render full <world>
这将开始为给定世界进行完整世界渲染。在完整地图加载之前可能需要一段时间,如果在完整渲染过程中您的服务器停止/重启,您必须重新开始完整渲染。
渲染新的区块
当您在您的世界中加载尚未添加到地图的新区块时,这些区块将自动渲染。
如果仍然缺少区块,请通过执行/pmap render full <world>
来为世界执行完整渲染。
渲染更新的区块
当玩家破坏或放置方块时,地图将在一段时间后自动更新。
更改渲染速度
如果您觉得渲染速度太慢,或者您的服务器无法再处理,您可以在config.yml
中更改一些值以解决这个问题。
- 转到
config.yml
- 查看
renderer
下的设置 - 如果您想改变渲染速度,请更改
scheduler
中的某些值 - 如果您想改变更新区块的渲染速度,请更改
chunk-scheduler
中的值
问题
请在此处报告您遇到的所有问题此处。
待办事项
这是一份在v1.0.0版本发布之前必须添加的所有事项的清单
命令
- 创建Commando的分支以使用具有不同重载参数的命令
- 添加一个
x z
(向量2)参数类型,而不是x y z
(向量3)
网页
- 所有在线玩家的列表
- 隐藏地图图标选项
- 标记、玩家等
- 更简洁的用户界面
- 显示世界中的时间
渲染器
- 更好地可视化高度差异
- 方块照明
- 测试/添加对其他维度的支持
API
- 支持插件向PocketMap添加自己的API
- 允许插件将文件注册到
/api/<plugin_name>
- 允许插件将文件注册到
- 支持JS模块以扩展网页的功能。
- 这些模块可以用来访问网络服务器上的插件API端点。
- 为
MarkerManager
类添加更好的文档,以便插件能够利用内置的标记系统。
致谢
- PMMP WebServer 由我创建网站和API。
- LibSkin 由HimbeersaftLP为玩家头部。
- Commando 由Paroxity分叉,用于命令。
- SimplePacketHandler 由Muqsit为Commando编写。
- Bedrock Samples 由Mojang提供,用于地图中使用的最新方块纹理。
- Leaflet.js 用于交互式地图。
- OpenMoji 提供大量默认图标。
文档
这是许多PocketMap功能的文档。
命令
命令参数
一些命令也需要参数,以下是在本readme中提供的参数类型:
< ... >
: 必须提供{ ... }
: 对于玩家是可选的,但对于控制台是必需的,当未提供时,使用玩家的当前位置[ ... ]
: 可选,将使用默认值
帮助命令
获取所有命令的列表。用法:/pmap help
标记命令
用法:/pmap marker
常用命令参数
name
: 标记名称,必需。world
: 标记所在的世界的名称id
: 标记的自定义标识符position
: 位置 (x y z
)icon
: 定义在markers/icons.json
中的图标名称- 请参阅此处了解更多关于添加您自己的标记的信息。
pos1
: 第一个位置 (x y z
)pos2
: 第二个位置 (x y z
)
添加标记命令
将标记添加到您的地图中
- 图标标记:
/pmap marker add icon <name> <icon> {position} {world} [id]
- 在指定位置创建一个图标标记
- 圆形标记:
/pmap marker add circle <name> <radius> {position} {world} [id]
radius
: 圆的半径(以方块为单位),必需- 在指定位置创建一个具有给定半径的圆
- 区域标记:
/pmap marker add area <name> <pos1> {pos2} {world} [id]
- 使用
pos1
和pos2
作为角落创建一个矩形区域
- 使用
- 线条标记:
/pmap marker add line <name> <pos1> {pos2} {world} [id]
- 在
pos1
和pos2
之间创建一条线
- 在
删除标记命令
您可以使用标记删除命令删除任何标记。用法:/pmap marker remove <id> {world}
- 您只能删除在
markers/markers.json
中定义了id
的标记。
重新加载命令
重新加载插件数据的某些部分,这将应用运行中的插件中的大多数更改。
- 并非所有更改都将通过此命令应用,要确保所有更改都已应用,建议重新启动。
可用部分
config
: 重新加载插件配置data
: 重新加载文件夹结构web
: 重新加载Web配置
用法:/pmap reload <part>
渲染命令
您可以使用渲染命令来渲染地图的特定区域。
用法:/pmap render {x} {z} {world} {缩放级别}
x
:该区域的x坐标z
:该区域的z坐标world
:该区域的区域名称缩放级别
:该区域在[0,8]范围内的缩放级别,其中缩放级别
是面积为2缩放级别 * 2缩放级别
块的区域(0=1块,8=256*256块)
完整渲染命令
开始给定世界的完整世界渲染。
用法:/pmap render full {world}
渲染查找命令
查找给定世界位置的区块和区域坐标。
用法:/pmap render lookup {x y z} [缩放级别]
x y z
是世界中的位置缩放级别
是要获取的区域坐标的缩放区域数量。- 默认:
0
输出 - 坐标(x,z):给定的x和z坐标
- 区块(x,z):给定位置所在的区块x,z坐标
- 区域(缩放级别/x,z):[0,
缩放级别
]范围内的所有缩放区域列表
- 默认:
网络地图
在PocketMap(http://<服务器IP>:<pocketmap端口号>/
)网页上,您可以查看真实的地图。在地图上,您可以执行以下操作
- 查看所有在线玩家的位置
- 查看所有世界地图(目前仅测试过主世界)
- 您可以使用页面上的按钮选择要查看的世界
- 查看每个世界中创建的所有标记
- 查看您当前悬停的坐标
- 当您单击地图时,坐标将添加到URL中,可用于与他人共享位置。
- 放大和缩小地图。
- 这是通过世界的不同缩放级别来管理的,缩放级别在[0,8]范围内,默认缩放级别为4。您可以在
config.yml
或web/config.json
中更改这些项的一些内容
- 这是通过世界的不同缩放级别来管理的,缩放级别在[0,8]范围内,默认缩放级别为4。您可以在
纹理
PocketMap使用由bedrock-samples提供的标准资源包。为了使PocketMap与您的服务器保持一致,您在服务器上使用的所有资源包也会在PocketMap中使用。
- 尚未实现加密包
渲染
要在网页上显示地图,必须首先将Minecraft世界渲染为图像。这是一个复杂的过程,我正在不断改进渲染算法,使其更快、更高效。
从区块到图像
当渲染区块时,我们遍历区块中的所有x,z位置,并获取每个位置的最高方块。
对于每个方块,我们获取方块类型名称和方块状态。有了这些值,可以在resource_packs/terrain_textures.json
中找到正确的纹理并将其用作地图中的纹理。
并非所有方块都相同,PocketMap试图使所有方块看起来像在Minecraft世界中,例如
- 为草地和叶簇(叶子等)应用颜色图中的正确颜色
- 为水应用生物群落颜色
- 为栅栏、按钮等方块应用模型,使其在地图上有正确的位置和大小
- 为方块应用高度差
- 目前,
y%2 = 1
的方块会比y%2 = 0
的方块暗一些
- 目前,
- 使用正确的生物群落值应用水下方块的水透明度
- 不透明方块可以通过透明方块看到
标记
在PocketMap中,您可以使用不同类型的标记。您可以使用命令添加三种不同类型的标记,但也可以手动添加标记。在网页地图上可见的所有标记都在markers/markers.json
文件中定义。也可以手动添加标记。
标记类型
icon
:在指定位置显示的图标circle
:以指定位置为中心、给定半径(以方块为单位)的圆polygon
:具有给定顶点的区域,至少需要提供3个顶点。polyline
:具有多个点的线,线将在一个点和下一个点之间绘制。
命令标记
您可以使用命令添加一些标记。请访问标记命令文档以获取更多详细信息。
插件标记
插件可以充分利用PocketMaps内置的标记系统。
- 将PocketMap添加到您的
plugin.yml
文件中的softdepend
列表。(不要使用depend
列表,因为这要求所有用户都必须使用PocketMap,否则他们无法使用您的插件)。
softdepend: [ ..., # Other plugins PocketMap ]
- 在您想添加标记的位置包含
use Hebbinkpro\PocketMap\PocketMap;
。 - 添加您的标记
if (class_exists(PocketMap::class)) { $markers = PocketMap::getMarkers(); }
- 如果您没有在(软)依赖列表中包含PocketMap,您无法在插件
onEnable
函数中使用MarkerManager
。 - 您不能在插件
onLoad
函数中使用MarkerManager
。
可用函数
$markers->getIcons(): array $markers->getMarker(string $id, World $world): ?array $markers->removeMarker(string $id, World $world): bool $markers->addIconMarker(string $name, Position $pos, string $icon, ?string $id = null): bool $markers->addCircleMarker(string $name, Position $pos, int $radius, ?string $id = null, string $color = "red", bool $fill = false, ?string $fillColor = null): bool $markers->addPolygonMarker(string $name, array $positions, World $world, ?string $id = null, string $color = "red", bool $fill = false, ?string $fillColor = null): bool $markers->addPolylineMarker(string $name, array $positions, World $world, ?string $id = null, string $color = "red", bool $fill = false, ?string $fillColor = null): bool
存储的标记
- 打开文件
markers/markers.json
- 转到您的标记需要显示的世界
- 将以下内容添加到该世界的标记中
{ "<id>": { // replace <id> with the custom identifier for the marker "name": "string", // the name of the marker "data": { // ... the data fields of the marker } } }
标记类型数据
这些都是为前端使用Leaflet的标记系统实现的所有标记数据类型。
常见数据字段
以下是一些常见的数据类型字段
位置
{ "x": "int|float", // the x coordinate in the world "z": "int |float" // the z coordinate in the world }
选项
{ "color": "red", // the border color "fill": false, // if the marker is filled "fillColor": "red" // the color of the filled area }
图标
{ "type": "icon", // the data type "icon": string, // the name of the icon "pos": position // position of the marker }
圆
{ "type": "circle", // the data type "options": { // ... default options "radius": "int|float" // the radius (in blocks) of the circle }, "pos": position // postion of the marker }
多边形
{ "type": "polygon", // the data type "options": options, // options "positions": [] // list of all corner positions }
多段线
{ "type": "polyline", // the data type "options": options, // options "positions": [] // list of all positions of the line }