Skip to content

SimpleExample

ShrBox edited this page Jun 20, 2024 · 6 revisions

简单的维度创建(Xmake)

MoreDimensions 提供了基础的世界生成类型,这些api在src/more_dimensions/api/dimension/SimpleCustomDimension.h

这里面提供了一个简单的维度类,可以生成原版的Void,Flat,Overworld,Nether,TheEnd这几种类型的维度。

使用起来也非常简单,下面一步步开始怎么使用

本教程只涉及了基础的C++知识

准备阶段

确保你有以下环境

  • 安装了C++桌面开发的msbuild(v143)或者MS Studio
  • 一个你熟悉的文件编辑器,本教程使用vscode
  • Git(建议vscode里也安装对应插件)
  • xmake(vscode需要安装对应插件,同名直接搜)
  • clangd(vscode需要安装对应插件,同名直接搜)
  • 一个已经安装了levilamina的BDS

本教程全程使用xmake构建项目

插件模板下载

首先clone插件模板,在你任意文件夹内,使用以下指令clone插件模板到本地

git clone --depth 1 https://github.com/LiteLDev/levilamina-plugin-template.git

上面指令执行成功后,你可以在执行了clone的目录看到levilamina-plugin-template文件夹

(可选)重命名levilamina-plugin-templatesimple-dimensions,利于辨认

进入simple-dimensions文件夹

左键空白处,选择Open with Code,在vs code里面打开这个文件夹

插件加载依赖配置

由于本插件是依赖more-dimensions的,得配置插件的加载顺序,让我们写的插件加载比more-dimensions

在插件的根目录下,你会看到manifest.json这个文件,里面的初始内容大概如下:

{
    "name": "${pluginName}",
    "entry": "${pluginFile}",
    "type": "native"
}

type的下一行加入以下内容

"dependencies": [
    {
        "name": "more-dimensions"
    }
]

变成这样

{
    "name": "${pluginName}",
    "entry": "${pluginFile}",
    "type": "native",
    "dependencies": [
        {
            "name": "more-dimensions"
        }
    ]
}

配置xmake

如果你的vs code还没有安装xmake插件,请先安装

在文件列表里点击xmake.lua这个文件来,打开文件内容后,在里面添加more-dimensions依赖

add_requires("more-dimensions 0.2.1") -- 使用v0.2.1版本

在写本教程时最新发布是v0.2.1,结合看本教程的时候最新版本更改

target("my-plugin") 

改成

target("simple-dimensions") 

在target分层下面添加

add_packages("more-dimensions")

然后使用以下指令初次构建与下载依赖,等待时间可能会很长,可以先执行以下指令,让其后台跑,继续跟教程走

xmake -y

创建维度

在Vscode内打开MyPlugin.cpp文件

导入头文件

#include "ll/api/event/server/ServerStartedEvent.h"
#include "more_dimensions/api/dimension/CustomDimensionManager.h"
#include "more_dimensions/api/dimension/SimpleCustomDimension.h"

在文件的最后一行加入以下内容

static bool reg = [] {
    using namespace ll::event;
    // 使用ll提供的开服事件触发创建维度,你也可以使用指令在游戏内执行触发创建维度
    EventBus::getInstance().emplaceListener<ServerStartedEvent>([](ServerStartedEvent&) {

        // 使用345作为地形种子生成Overworld类型的维度
        more_dimensions::CustomDimensionManager::getInstance().addDimension<more_dimensions::SimpleCustomDimension>(
            "newDimension", 345
        );

        // 使用345作为地形种子生成Flat类型的维度
        more_dimensions::CustomDimensionManager::getInstance()
            .addDimension<more_dimensions::SimpleCustomDimension>("newFlatDimension", 345, GeneratorType::Flat);

        // 使用345作为地形种子生成Nether类型的维度
        more_dimensions::CustomDimensionManager::getInstance()
            .addDimension<more_dimensions::SimpleCustomDimension>("newNetherDimension", 345, GeneratorType::Nether);

        // 使用345作为地形种子生成TheEnd类型的维度
        more_dimensions::CustomDimensionManager::getInstance()
            .addDimension<more_dimensions::SimpleCustomDimension>("newTheEndDimension", 345, GeneratorType::TheEnd);

        // 使用345作为地形种子生成Void类型的维度,这里种子设置会是无效的,种子只对地形生效
        more_dimensions::CustomDimensionManager::getInstance()
            .addDimension<more_dimensions::SimpleCustomDimension>("newVoidDimension", 345, GeneratorType::Void);
    });
    return true;
}();

这个简单维度类注册接受三个参数,这个三个参数来自两个不同的函数组成,第一个name是SimpleCustomDimension构造函数的第一个参数,第二第三个参数是来自SimpleCustomDimension::generateNewData函数

这些查看CustomDimensionManager::addDimension(std::string const& dimName, Args&&... args)的实现即可明白

构建与使用

写好上面后,就已经完成创建新维度的步骤,现在我们可以放到有levilamina的BDS中体验

执行以下指令构建插件

xmake

如无意外在插件根目录下会有个bin文件夹,里面会有个simple-dimensions文件夹,这就是已经打包好的插件

直接复制nxn-border-terrain这个文件夹,放到BDS目录/plugins文件夹内,同时,也记得把more-dimensions也放进去

接下来启动BDS即可,关于ll的安装请看这里levilamina安装

启动BDS后,如果创建维度成功,会在存档目录里生成一个记录维度信息的json文件: 图6

此文件不要更改,手动修改极有可能损失存档数据

进入游戏后,你可以直接使用tp指令传送到自定义的维度,在tp指令里的维度参数会有对应的参数补全,这里拿其中一个示例

tp ~ 100 ~ new_dimension

不出意外,你可以成功传送到对应的维度。

种子说明

在SimpleCustomeDimension的构建维度中传入了seed参数,但这个只对维度的地形生效,在后续教程中也有体现。

那么为什么不能对维度中的结构生效呢?因为结构生成时是用服务器配置文件server.properties或者存档创建时随机生成的种子判断生成的。

本教程示例文件

本教程过于简单,故不提供示例文件

Clone this wiki locally