EasyWebMap

EasyWebMap

Hytale 服务器的实时网页地图。在浏览器中查看您的世界,支持实时玩家追踪、方向箭头和点击定位功能。可通过 iframe 嵌入您的网站,或使用 REST API 构建自定义工具。采用 Hytale 原生地图渲染技术。

生活质量

EasyWebMap

专为欧洲 Hytale 生存服务器 play.hyfyve.net 构建

为你的 Hytale 服务器提供实时网页地图。在浏览器中查看你的世界,实时追踪玩家,并轻松集成到你的社区网站。


快速开始

  1. 发布页面下载最新的 EasyWebMap.jar
  2. 将其放入服务器的 mods 文件夹
  3. 重启你的服务器
  4. 在浏览器中打开 http://localhost:8080

你能做什么

实时世界地图

  • 在网页浏览器中查看整个世界的渲染图
  • 地形随着玩家建造或破坏方块自动更新
  • 自由缩放和平移
  • 使用 Hytale 原生的地图渲染(与游戏内地图相同)

实时玩家追踪

  • 在地图上看到所有在线玩家,并带有箭头标记
  • 箭头会旋转,显示玩家面对的方向
  • 点击侧边栏中的任何玩家,跳转到他们的位置
  • 玩家位置通过 WebSocket 每秒更新一次

网站集成

使用 iframe 将地图直接嵌入你的社区网站:

<iframe src="http://your-server-ip:8080" width="100%" height="600"></iframe>

或者从你的服务器网站、Discord 或论坛链接到它。

REST API

使用内置 API 构建自定义工具:

端点 返回内容
GET /api/worlds 可用世界列表
GET /api/players/{world} 世界中所有玩家(名称、位置、方向)
GET /api/tiles/{world}/{z}/{x}/{y}.png 地图瓦片图像
WS /ws 实时玩家位置更新

示例:获取玩家位置

const response = await fetch('http://your-server:8080/api/players/world');
const players = await response.json();
// [{ name: "Steve", x: 100, y: 64, z: -200, yaw: 1.57 }, ...]

示例:用于实时更新的 WebSocket

const ws = new WebSocket('ws://your-server:8080/ws');
ws.onmessage = (e) => {
  const data = JSON.parse(e.data);
  console.log(data.worlds); // 按世界划分的所有玩家位置
};

多世界支持

  • 使用下拉菜单在世界之间切换
  • 配置哪些世界可见
  • 每个世界都有自己的瓦片缓存

命令

命令 功能
/easywebmap status 显示连接数、缓存信息、SSL 状态和服务器状态
/easywebmap reload 重新加载配置文件
/easywebmap clearcache 清除所有缓存(内存 + 磁盘)
/easywebmap pregenerate <radius> 在当前位置周围预生成瓦片
/easywebmap renewssl 强制立即更新 SSL 证书

所有命令都需要 easywebmap.admin 权限。


使用 Let's Encrypt 的 HTTPS(免费 SSL)

EasyWebMap 可以自动从 Let's Encrypt 获取和更新 SSL 证书。无需手动管理证书!

快速设置

  1. 将你的域名指向你的服务器 - 确保 map.yourserver.com(或你选择的任何域名)指向你服务器的 IP 地址。

  2. 打开端口 80 - Let's Encrypt 需要通过连接端口 80 来验证你拥有该域名。确保你的防火墙允许此操作。

  3. 添加到你的 config.json:

{
  "enableHttps": true,
  "httpsPort": 8443,
  "domain": "map.yourserver.com",
  "acmeEmail": "admin@yourserver.com"
}
  1. 重启你的服务器 - 插件将自动:
    • 向 Let's Encrypt 注册
    • 为你的域名请求证书
    • 开始在 8443 端口上提供 HTTPS 服务

就是这样!你的地图现在可以在 https://map.yourserver.com:8443 上访问

工作原理

启用 HTTPS 后,插件会:

  1. 在 Let's Encrypt 创建一个账号(存储在 ssl/account.key 中)
  2. 为你的域名请求证书
  3. 在端口 80 上响应 Let's Encrypt 的 HTTP-01 验证挑战
  4. 将证书存储在 ssl/domain.crt 中,密钥存储在 ssl/domain.key
  5. 启动 HTTPS 服务器
  6. 每天检查证书是否需要更新(在到期前 30 天续期)
  7. 无需重启即可自动重新加载证书

HTTPS 配置选项

设置 默认值 功能
enableHttps false 启用/禁用 HTTPS
httpsPort 8443 HTTPS 端口(如果有权限,可使用 443)
domain "" 你的域名(HTTPS 必需)
acmeEmail "" 用于 Let's Encrypt 通知的邮箱(可选但推荐)
useProductionAcme true 设置为 false 用于测试(使用测试服务器,避免速率限制)

SSL 命令

命令 功能
/easywebmap status 显示 HTTPS 状态、域名和证书到期日期
/easywebmap renewssl 强制立即更新证书

要求

  • 域名 - 你需要一个指向你服务器的域名(IP 地址无法与 Let's Encrypt 配合使用)
  • 端口 80 可访问 - Let's Encrypt 通过 HTTP 在端口 80 上验证域名所有权
  • 端口 8443(或 443)可访问 - 用于提供 HTTPS 流量

先进行测试

在正式上线前,使用 Let's Encrypt 的测试服务器进行测试,以避免速率限制:

{
  "enableHttps": true,
  "domain": "map.yourserver.com",
  "useProductionAcme": false
}

测试服务器会颁发浏览器不信任的测试证书,但这可以证明一切正常工作。验证后,将 useProductionAcme 设置回 true 并重启。

使用 443 端口(标准 HTTPS)

默认情况下,HTTPS 运行在 8443 端口。如果你想使用标准的 HTTPS 端口(443):

{
  "httpsPort": 443
}

注意:绑定到 443 端口可能需要以 root/管理员身份运行服务器,或使用反向代理。

在反向代理后面运行

如果你使用 nginx 或 Apache 作为反向代理,可以让代理处理 SSL,EasyWebMap 仅使用 HTTP。示例 nginx 配置:

server {
    listen 443 ssl;
    server_name map.yourserver.com;

    ssl_certificate /etc/letsencrypt/live/map.yourserver.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/map.yourserver.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

配置

配置文件:mods/cryptobench_EasyWebMap/config.json

{
  "httpPort": 8080,
  "updateIntervalMs": 1000,
  "tileCacheSize": 20000,
  "enabledWorlds": [],
  "tileSize": 256,
  "maxZoom": 4,
  "renderExploredChunksOnly": true,
  "chunkIndexCacheMs": 30000,
  "useDiskCache": true,
  "tileRefreshRadius": 5,
  "tileRefreshIntervalMs": 60000,
  "enableHttps": false,
  "httpsPort": 8443,
  "domain": "",
  "acmeEmail": "",
  "useProductionAcme": true
}
设置 默认值 功能
httpPort 8080 网络服务器端口
updateIntervalMs 1000 玩家更新频率(毫秒)
tileCacheSize 20000 内存中最多缓存的瓦片数(约 200MB,每瓦片 10KB)
enabledWorlds [] 世界白名单(空 = 全部)
renderExploredChunksOnly true 仅渲染玩家探索过的区块(防止卡顿/滥用)
chunkIndexCacheMs 30000 已探索区块索引的缓存时间(毫秒)
useDiskCache true 将瓦片保存到磁盘,以便在重启后持久化
tileRefreshRadius 5 玩家必须在 N 个区块内,瓦片才会刷新
tileRefreshIntervalMs 60000 瓦片刷新的最小间隔时间(毫秒)
enableHttps false 启用 Let's Encrypt 自动 HTTPS
httpsPort 8443 HTTPS 连接端口
domain "" 你的 SSL 证书域名
acmeEmail "" 用于 Let's Encrypt 通知的邮箱
useProductionAcme true 使用生产环境 Let's Encrypt(false = 测试环境)

区块索引缓存(chunkIndexCacheMs

renderExploredChunksOnly 启用时,插件需要检查哪些区块已被探索。这需要从磁盘读取索引。为避免每次瓦片请求都读取磁盘,索引会被缓存。

权衡:

  • 较低的值(例如 5000ms):新探索的区域在地图上显示更快,但磁盘读取更多
  • 较高的值(例如 60000ms):磁盘读取更少,但新探索的区域需要更长时间才能显示

实际意义:

缓存时间 磁盘读取次数 地图新鲜度
5000(5秒) 约每分钟 12 次/世界 新区块在 5 秒内可见
30000(30秒) 约每分钟 2 次/世界 新区块在 30 秒内可见
60000(1分钟) 约每分钟 1 次/世界 新区块在 1 分钟内可见

示例场景: 玩家探索了一个新区域。如果 chunkIndexCacheMs: 30000,新的区块在缓存过期前(最多 30 秒)不会出现在网页地图上。在此期间,瓦片将显示为空。

注意: 这仅影响探索的区块。已探索的区块始终可见。如有需要,/easywebmap clearcache 命令可以立即清除此缓存。

磁盘缓存与智能刷新

插件使用智能缓存系统来最小化服务器负载:

  1. 磁盘缓存:瓦片作为 PNG 文件保存到 mods/cryptobench_EasyWebMap/tilecache/。这些文件在服务器重启后仍然存在,因此重启后的第一个访问者不会触发大量瓦片生成。

  2. 智能刷新:仅在以下情况下重新生成瓦片:

    • 瓦片的时间早于 tileRefreshIntervalMs(默认:60 秒),且
    • 玩家在 tileRefreshRadius 区块内(默认:5 个区块)

为什么这很重要:

  • 如果附近没有玩家,地形不可能发生变化,因此缓存的瓦片始终有效
  • 这意味着 99% 的瓦片请求会立即从缓存中提供,服务器负载为零
  • 只有活跃游玩的区域才会重新生成,且最多每分钟一次

流程:

瓦片请求 → 内存缓存? → 立即提供
                  ↓ 否
           磁盘缓存? → 足够新? → 从磁盘提供
                  ↓ 否       ↓ 旧
           生成新的  玩家在附近? → 否:提供过期版本(地形未变化)
                                 ↓ 是
                         重新生成瓦片

预生成

使用 /easywebmap pregenerate <radius> 预热缓存:

  • 在你的位置周围的正方形区域内生成瓦片
  • 跳过已缓存的瓦片和未探索的区块
  • 在后台运行,瓦片之间延迟 50ms 以避免卡顿
  • 示例:/easywebmap pregenerate 50 最多生成 10,201 个瓦片
  • 没有最大限制 - 根据需要设置(较大的数值需要更多时间)

常见用例

公开服务器地图 - 让玩家看到每个人在哪里探索

网站小部件 - 嵌入到你的服务器主页,显示实时活动

直播叠加 - 在你的 Twitch/YouTube 直播中显示地图

Discord 机器人 - 使用 API 发布玩家位置或截图

管理工具 - 监控你服务器上的玩家活动


常见问题

问:如何从另一台电脑访问地图? 使用你服务器的 IP 而不是 localhosthttp://192.168.1.100:8080

问:如何将其嵌入到我的网站? 使用 iframe:<iframe src="http://your-server:8080" width="800" height="600"></iframe>

问:我可以隐藏某些世界吗? 可以,在配置的 enabledWorlds 中添加特定的世界名称。空数组表示显示所有世界。

问:如何将其放在反向代理后面? 将 nginx/Apache 指向 8080 端口。WebSocket 路径为 /ws

问:为什么地图上的某些区域显示为空? 默认情况下,仅渲染探索过的区块(renderExploredChunksOnly: true)。这可以防止服务器卡顿和用户滚动到未探索区域导致的滥用。如果希望渲染所有区块(不推荐用于公共服务器),可以在配置中将其设置为 false

问:用户会利用地图使我的服务器卡顿吗? 使用默认设置不会。renderExploredChunksOnly 选项(默认启用)阻止渲染未探索的区块,因此滚动不会触发区块生成。

问:如何启用 HTTPS? 在配置中添加 "enableHttps": true"domain": "your-domain.com"。插件会自动从 Let's Encrypt 获取免费的 SSL 证书。详情请参见上面的 HTTPS 部分。

问:为什么我的 SSL 证书不工作? 常见问题:

  1. 域名未指向你服务器的 IP 地址
  2. 端口 80 被防火墙阻止(Let's Encrypt 需要通过此端口进行验证)
  3. 其他服务正在使用端口 80 请检查服务器日志以获取具体的错误信息。

问:我需要手动更新证书吗? 不需要!插件每天自动检查,并在证书到期前 30 天更新。你无需手动操作。

问:我可以使用自己的 SSL 证书代替 Let's Encrypt 吗? 目前仅支持自动 Let's Encrypt 证书。如果你需要使用自己的证书,请将 EasyWebMap 放在处理 SSL 的反向代理(nginx/Apache)后面。

问:如果 Let's Encrypt 不可用或受速率限制怎么办? 插件将继续正常提供 HTTP 服务。它会重试证书请求并记录任何错误。一旦 Let's Encrypt 恢复可用,证书将自动获取。


从源代码构建

mvn clean package
cp target/EasyWebMap-1.0.0.jar /path/to/Server/mods/

需要 Java 25+ 和 Maven 3.8+。


许可证

MIT - 随心所欲!