尝试开发Minecraft RPG服务器所得到的经验

大家好,我是在一个名为Atlantis Server的Minecraft RPG服务器上担任开发者的ReyAD。
我从2016年12月开始进行RPG服务器的开发。在这篇文章中,我将总结我在开发过程中所获得的经验。

Minecraft是什么?

《我的世界》是Notch(马库斯·佩尔松)和他的公司(Mojang AB)的员工开发的沙盒游戏。玩家可以将方块放置在地面或空中,自由构建各种建筑和其他物品。在日本,通常简称为“我的世界”。

最近ではものづくりができるということで、教育用にフォーカスされて注目されていますが、
PvP、アドベンチャー等といった楽しみ方もあります。

Minecraft有两种主要的类型。

    • Java Edition

 

    Bedrock Edition

とあります。
Java EditionとはMinecraft最初のバージョンです。2017年に呼び方が変わりました。(一部の界隈では批判的な意見がありました。)
Bedrock EditionとはMicrosoftがMinecraftを買収した後に、ゼロから作り直したバージョンです。PS4やXboxなどのコンソール版やWin10版がこちらとなります。
認識としては、世の中に最初に出たバージョンがJava、最近のものがBedrockとなっています。

Minecraft服务器

在Minecraft中创建一个服务器,并访问该服务器的地址,就可以让多个人在同一个Minecraft世界中一起玩。无论是Java版还是基岩版,都可以搭建服务器。

服务器的MOD(插件)

マインクラフトサーバーでもMODを使って遊ぶことができます。
これらのMODはプラグインと呼ばれています。
以下のような種類があります。

    • Java Editon

Spigot
Sponge

Bedrock Edition

Pocket Mine
Nukkit

亞特蘭提斯是

ここで私がやっているプロジェクトについて説明します。
アーキエイジや黒い砂漠のようなMMORPGの世界をMinecraftで実現する事が目的です。
そこではPvPや生産、経済というような要素が作られる予定です。
対象のプラットフォームはJava Editionです。

需求的要求

    • MinecraftワールドにRPGの世界を建築する

 

    • 経済や生産などMinecraftにはないシステムをサーバーMODで実現させる

データベース、インフラなど色々と考える必要がある

これらを複数人のチームをマネジメントしながら完成させる

これらの要求を効率的に実現するために、開発環境、建築ツール、チームマネジメント等色々行いました。

关于团队

目前,參加開發的成員都是「免費工作,志願者」,且條件是「互相不認識」,因此出現了以下問題。

    • 作業の強要がしにくい

 

    • 個人の成長などを意識して仕事を割り振ったりできない

いつでもやめられる状況であるため

ボランティア集団にありがちな問題ですが、現状これの明確な解決方法はよくわからないです。
いまのところ、いい雰囲気にする、ロードマップを明確にするというような方法をとっています。

Discord

メンバーの情報共有はDiscordを導入しました。
Slackと迷いましたが、導入した人がゲーマーだったので選定する間もなくDiscordを使っています。

メリット
* 無料で使える
* メッセージ上限がない

デメリット
* Integrationのサポートが少ない
* Slackはこのあたりは優秀
* 返信機能、引用機能、スレッドなどの機能が無い

如果有资金可以使用的情况下,我认为Slack是唯一的选择。
由于这个项目没有资金支持,我们使用Discord。

待办事项

只有Discord会出现以下问题。

    • 誰が何やってるかわからない

わからないから何も作業しないというメンバーが多発

議論に結論がついたのかがわからない

非同期コミュニケーションなので、いつまでたっても議論が終わらないということがありました

ログを追うのが大変

何を見ればいいのかわからなくなってしまうことがありました

スケジュール管理ができない

存在一些问题,主要是建筑团队(稍后会提到)的工作进展不顺利,形成了严重的情况。

基于这样的背景,我们引入了BackLog。

タイトルなし.png

虽然仍处于试验阶段,但我认为我们已经在一定程度上知道谁在做什么了。

关于开发

我使用Spigot进行开发。
作者自己进行了开发相关的整理工作。

关于Minecraft插件开发领域的现状。

マインクラフトの開発コミュニティは以下のようになっています

    • 殆どのプロジェクトはJavaが主流

レガシーなJavaが多いです

Mavenが主流
Eclipseが主流
日本、海外問わず、ドキュメントが不足している

フォーラムにかかれているってのがおおい
オープンソースのプロジェクトも少ない

Minecraftのコード自体に負債が多いため、Spigotなどのフレームワークにも負債があり、使いにくいところが多々ある
モダンなライブラリを導入されていない

情况变得如此

建立开发环境

我已经安装了以下的开发环境和库。

    • 開発言語はKotlin

 

    • Gradleを使ってビルドする

 

    • GitHubをつかって開発をする

 

    • IntelliJ IDEAで統一する

 

    Retrofit、Dagger、RxJavaなどモダンなライブラリを導入した

GitHub是一个基于Web的代码托管平台。

由于几乎所有成员都不理解git,我们决定让他们先学习。我们正在采用基于GitHub流程的拉取请求形式进行开发。

Kotlin – 只需要一个选项

通过使用Kotlin,您可以享受到以下的好处:

    • Null安全

 

    • 簡略化して記述できる

 

    Kotlin extensions

由于Spigot在历史上经历了很多技术上的累积问题,我们使用Kotlin扩展来定义自己的方法,以便能够简单地编写代码。

智能IDEA

我們決定在團隊中統一使用IntelliJ IDEA。

    • 何か詰まったりしたら、とりあえずレクチャーできるというのが大きいです

筆者がIntelliJ IDEAをつかってるから、ゴリ押しで使って欲しい的なお願いをしたわけでもない

リフォーマットのルールを合わせられるので、変なDiffが発生しない

RxJava: RxJava是一个流式异步编程库,它使得在Java中处理异步编程变得更加简单。

我使用RxJava来实现异步处理。我主要使用RxJava来编写技能效果等内容。

Observable.interval(10, TimeUnit.MILLISECONDS)
                .takeWhile { it < 130 }
                .subscribe { drawEffect(it) }
2017-09-13_00.48.09.png

魔法阵的例子

用粒子制作了一个魔法阵试试看。

以下是中文的翻译:
“图片链接:pic.twitter.com/lM2mE0e1JP— ReyAD (@ReyADayer) 2017年9月1日”

当我们选择敌人作为目标时,使用技能;当我们被攻击时,也使用技能。即使只有这样简单的AI,也能够实现类似的动作。但是要实现真正的自主性,我认为还需要考虑更多因素,例如地形的认知和敌人的偏差等参数。

曝光

我使用了Jetbrains制作的SQL库Exposed。

为了在制作角色扮演游戏时保存玩家信息,我们选择了使用MySQL进行引入。

class PlayerJob(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<PlayerJob>(PlayerJobs)

    var job by PlayerJobs.job
    var level by PlayerJobs.level
    var exp by PlayerJobs.exp
    var playerStatus by PlayerStatus referencedOn PlayerJobs.playerStatus
}

当初はJDBCをつかって実装していたのですが、関連付けのあたりが辛くなってきたので、Exposedは非常に便利でした。

Dagger

DIコンテナを使ってプラグインを書きました。Dagger導入しているところが他にないので、Androidのプロジェクトを参考に以下のように導入しています。

class SamplePlugin: JavaPlugin() {

    lateinit var component: PluginComponent

    override fun onEnable() {
        component = DaggerPluginComponent.builder().application(this).build()
    }
}
@Component(modules = [PluginModule::class])
interface PluginComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: JavaPlugin): Builder

        fun build(): PluginComponent
    }

    fun inject(plugin: SamplePlugin)
}

我們目前正在試驗性地引入這個功能,但我認為以下類別可以包含在組件中。

    • Retrofitの通信周り

 

    • ExposedをつかってSQL問い合わせ

 

    disposableなどのRxJavaのクラス

关于建筑

为了创建RPG世界,我将在Minecraft中建造建筑物。

2017-10-08_21.54.53.png

我們將使用方塊來建立城市和地形,然後將非玩家角色(NPC)和怪物(MOB)放置其中。

2017-10-28_16.17.12.png

世界编辑

sW4qN.png

这是一个可以复制粘贴方块的服务器MOD。
使用它可以大大提高建筑速度。

可以做的事情:
* 复制粘贴
* 生成立体图形
* 重复粘贴

像是这些。

体素狙击手

几乎所有的操作都可以通过WorldEdit完成,但在进行自然建筑时,使用VoxelSniper会更方便。

use-minecraft-world-editing-software-voxelsniper.w1456.jpg

因为可以堆积或者削减块状物,因此在塑造山脉、河流、湖泊等地形方面非常方便。

Discordで通知

スクリーンショット 2017-12-24 23.50.18.png

サーバー内で誰が作業をしているのか、どのようなコマンドを実行したのかをDiscordで表示するようにしました。
これによって次のようなメリットが有りました

    • メンバーのログイン率、何をしているかがある程度分かる

 

    • WorldEditのコマンドなどが間接的に学べる

//replace stone 60%181:8,20%159:1,20%159:14 等
WorldEditの使い方を教えるときにも便利

一応公開しています
https://github.com/AtlantisMinecraft/DiscordBot

基础设施

由于尚未完成,因此基础设施方面尚未确定。
由于缺乏相关经验,我们计划之后进行学习。

目前我正在使用AWS和Conoha等服务。

总结

要想制作一个简单的游戏,并不仅仅需要编程知识。

    • チームで進めるにあたり、情報共有しやすい環境

 

    • 技術的負債を残さないような言語選定、ライブラリ選定

 

    単純作業の効率化

これらがすごく重要なんだなと思いました。
またデータベースのことも考えながら負荷も意識して、ゲームのエフェクトやモブを作るという
一人でいろんなことを考えながら開発するってのも面白かったです。

虽然离完成还很远,但我想努力前进。

最终

由于正在招聘人员,如有兴趣,请通过下方的申请表提交申请。

广告
将在 10 秒后关闭
bannerAds