<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Minecraft on icebear&#39;s blog</title>
    <link>https://sfclub.cc/~icybear/tags/minecraft/</link>
    <description>Recent content in Minecraft on icebear&#39;s blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 17 Jul 2024 16:39:11 +0000</lastBuildDate>
    <atom:link href="https://sfclub.cc/~icybear/tags/minecraft/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>一种使用 /transfer 的轻量化子服方案</title>
      <link>https://sfclub.cc/~icybear/posts/multiserver-based-on-one-utilizing-transfer/</link>
      <pubDate>Wed, 17 Jul 2024 16:39:11 +0000</pubDate>
      <guid>https://sfclub.cc/~icybear/posts/multiserver-based-on-one-utilizing-transfer/</guid>
      <description>&lt;p&gt;李华是一个生电服的玩家，他总是在想，要是服务器里面有创造实验室就好了。&lt;/p&gt;
&lt;p&gt;小叶是一个喜欢 PvP 的玩家，他总是在想，要是服务器里面有一个能干脆利落开启决斗的地方就好了。&lt;/p&gt;
&lt;p&gt;作为这个服务器的 OP，这些场景对你来说不陌生。如果把这两个问题抛在 Minecraft 服务器社区里，相信绝大多数的回答都是「开一个新的子服务器并且建立跨服群组」，但是，这真的值得吗？&lt;/p&gt;
&lt;p&gt;显然，这不值得。如果只是为了这两样功能启动一个跨服群组，你将会面临以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;额外的维护成本：&lt;/strong&gt; 使用群组服则基本排除了面板服务器部署方案的可能性，并且一个没有适当配置过的群组服务器会引起诸多问题，例如：玩家使用 &lt;code&gt;/server&lt;/code&gt; 跳过验证关卡，子服务器的端口意外的暴露在外网等等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源需求上升&lt;/strong&gt;： 启动额外的子服 + 代理程序则意味着你需要更多的资源。Java 主流 GC 的策略通常都会为了速度而将堆所占的空间悉数预分配，这导致即使程序使用的内存并没有那么多也会造成较高的 RSS.&lt;/li&gt;
&lt;li&gt;**资源分配不灵活：**上一个问题并不能简单的通过减少堆的大小解决。就以创造实验室为例，平时服务器内的人并不多，但一旦到了演示/大型机器实验时，较小的堆空间将会给 GC 带来相当的压力，并且无法利用到分配到其他（类似情况的，比如 PvP 竞技场）子服的空闲资源。&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光是想到从单端变群组，大多数服主就已经汗流浃背了。那么，本文所述的基于 &lt;code&gt;transfer&lt;/code&gt; 机制的方案是如何规避这些问题的呢，他与其他类似方案又有何优劣之分呢？&lt;/p&gt;
&lt;h1 id=&#34;基于世界的子服划分方式&#34;&gt;基于世界的子服划分方式&lt;/h1&gt;
&lt;p&gt;这个情境中使用群组方案，归根结底是为了做服务器区域之间的划分。而 Minecraft 自带的多世界机制就已经很好的解决了活动空间的划分问题：没有传送门的情况下，玩家并不能随意大小跨。&lt;/p&gt;
&lt;p&gt;早在 2013 年，&lt;a href=&#34;https://www.spigotmc.org/resources/perworldplugins.96161/&#34;&gt;PerWorldPlugins&lt;/a&gt; 就已经实现了将插件的生效范围降级到世界层次。通过切割插件在整个服务器中的作用域，这些世界得以模拟「服务器的子服」，使用此插件的用户可以通过限定不同世界里启用的插件来模拟多服务器的效果。而在约 2020 年，&lt;a href=&#34;https://afdian.com/a/Valorin&#34;&gt;Valorin 的 DuelTime / Dantiao (付费)&lt;/a&gt; 将这个概念进一步推进，完全实现了本文引入部分时提到的「干脆利落开启决斗的地方」的设想。&lt;/p&gt;
&lt;p&gt;然而，这样实现引入了许多需要额外维护的状态：生存服的玩家不能将物品带到创造服，他们也不希望在 PvP 服丢掉自己一身的好装备。插件需要小心翼翼的维护好这些状态，在跨世界转移的时候将他们的背包数据暂存起来，甚至有必要储存到硬盘上以防 崩服/断电/插件自身异常 导致&lt;strong&gt;数据丢失&lt;/strong&gt;（数据无价！）。&lt;/p&gt;
&lt;p&gt;并且，除了物品数据，还有许多问题需要考虑，比如玩家身上的 scoreboard / team 数据，其他插件储存的玩家相关的状态数据都可能会导致数据切割不干净。甚至如果这些插件涉及到储存功能，例如类末影箱类插件，邮箱等，被滥用的后果不堪设想。&lt;/p&gt;
&lt;p&gt;而本文所述的方案使用 &lt;code&gt;transfer&lt;/code&gt; 特性解决这些问题。&lt;/p&gt;
&lt;h1 id=&#34;transfer-是什么&#34;&gt;Transfer 是什么&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://minecraft.wiki/w/Commands/transfer&#34;&gt;/transfer 命令&lt;/a&gt; 是一项在 1.20.5 才被加入的新特性。如果你不知道他，只需要看这条命令的语法就可略知一二：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/transfer &amp;lt;hostname&amp;gt; &amp;lt;port&amp;gt; [players]&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>上手 Minestom: 新时代 Minecraft 服务端实现</title>
      <link>https://sfclub.cc/~icybear/posts/getting-started-with-minestom/</link>
      <pubDate>Mon, 19 Dec 2022 21:20:35 +0000</pubDate>
      <guid>https://sfclub.cc/~icybear/posts/getting-started-with-minestom/</guid>
      <description>&lt;p&gt;笔者观望 &lt;a href=&#34;https://github.com/Minestom/Minestom&#34;&gt;Minestom&lt;/a&gt; 已经有一段时间了. 以前他的线程模型还不够成熟, 曾经联系 @TheMode 想帮他翻译那块的文档结果鸽了.
正好, 今天摸鱼的时候看了一眼 Minestom 官方, 发觉现在或许是时候上手尝试一下了.&lt;/p&gt;
&lt;p&gt;简中圈子里吹 Minestom 的很多, 然而真正上手 / 普及 Minestom 开发的很少. 官方文档已经足够详尽, 因此本篇博文只作引路贴, 希望对 Minestom 感兴趣的你自己上手尝试.&lt;/p&gt;
&lt;h1 id=&#34;配置环境&#34;&gt;配置环境&lt;/h1&gt;
&lt;p&gt;Minestom 主要托管在 &lt;a href=&#34;https://jitpack.io&#34;&gt;JitPack&lt;/a&gt; 上.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;build.gradle:&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e06c75&#34;&gt;repositories&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e06c75&#34;&gt;maven&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e06c75&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#98c379&#34;&gt;&amp;#39;JitPack&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e06c75&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#98c379&#34;&gt;&amp;#39;https://jitpack.io&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#56b6c2&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#56b6c2&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e06c75&#34;&gt;dependencies&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e06c75&#34;&gt;implementation&lt;/span&gt; &lt;span style=&#34;color:#98c379&#34;&gt;&amp;#39;com.github.Minestom:Minestom:VERSION&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#7f848e&#34;&gt;// 版本号自己去 JitPack 上面找
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#56b6c2&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;静静等待依赖图下载完成, 下载的过程中, 我们不难发现一些老熟人.&lt;/p&gt;
&lt;h1 id=&#34;启动&#34;&gt;启动&lt;/h1&gt;
&lt;p&gt;Minestom 启动&lt;code&gt;实现&lt;/code&gt;很简单, 只需要两行就搞定了.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c678dd&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#c678dd&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#e5c07b&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#61afef;font-weight:bold&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#e06c75&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#56b6c2&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c678dd&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;mc&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;MinecraftServer&lt;/span&gt;.&lt;span style=&#34;color:#e06c75&#34;&gt;init&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e06c75&#34;&gt;mc&lt;/span&gt;.&lt;span style=&#34;color:#e06c75&#34;&gt;start&lt;/span&gt;(&lt;span style=&#34;color:#98c379&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e06c75&#34;&gt;25565&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个空的 Minestom &lt;code&gt;实现&lt;/code&gt;在一秒钟内就能初始化完毕.
打开 Minecraft, 添加一个 &lt;code&gt;localhost&lt;/code&gt; 到服务器列表中就能看到你的新 Minestom 服务器.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Minestom in ServerList&#34; loading=&#34;lazy&#34; src=&#34;https://i.ibb.co/m0j5BN8/image.png?80&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意: Minestom 语境下的 &lt;code&gt;实例&lt;/code&gt; 和 &lt;code&gt;实现&lt;/code&gt; 可能和你想象中的不一样
例如: &lt;code&gt;实现/Implementation&lt;/code&gt; 是基于 Minestom 开发的服务端软件, 而 &lt;code&gt;实例/Instance&lt;/code&gt; 不只指对象.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
