hebbinkpro/pocketmap

PocketMine-MP服务器动态基于网页的世界地图。

0.6.0 2024-03-20 13:38 UTC

README

PocketMine-MP服务器动态基于网页的世界地图。
要了解插件的所有功能,请参阅文档

v0.5版本的新功能

  • /pocketmap(或/pmap)命令现在可用,之前的命令(/render/reload)现在是子命令!
    • 要列出所有可用命令,请使用:/pmap help
  • 标记 - 现在您可以使用命令(/pmap marker)使用图标在地图上标记地点。

查看变更日志

如何安装

  1. Poggit CI下载插件的最新版本

  2. 将插件放入您的PocketMine-MP服务器插件文件夹中

  3. 重新启动您的服务器,这将加载插件数据。

    • 如果您没有在本地托管您的服务器,您必须为您的服务器分配一个新的端口。
    1. 为您的服务器分配一个新的端口。如果您不知道如何操作,请联系您的托管提供商。
    2. 转到config.yml并将web-server.port更改为您的新分配端口(替换3000)。
    3. 再次重新启动您的服务器。
  4. 转到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类添加更好的文档,以便插件能够利用内置的标记系统。

致谢

文档

这是许多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]
    • 使用pos1pos2作为角落创建一个矩形区域
  • 线条标记:/pmap marker add line <name> <pos1> {pos2} {world} [id]
    • pos1pos2之间创建一条线

删除标记命令

您可以使用标记删除命令删除任何标记。用法:/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.ymlweb/config.json中更改这些项的一些内容

纹理

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内置的标记系统。

  1. 将PocketMap添加到您的plugin.yml文件中的softdepend列表。(不要使用depend列表,因为这要求所有用户都必须使用PocketMap,否则他们无法使用您的插件)。
softdepend: [
  ..., # Other plugins
  PocketMap
]
  1. 在您想添加标记的位置包含use Hebbinkpro\PocketMap\PocketMap;
  2. 添加您的标记
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

存储的标记

  1. 打开文件markers/markers.json
  2. 转到您的标记需要显示的世界
  3. 将以下内容添加到该世界的标记中
{
  "<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
}