CustomMapX开发日志

关于BDS的一个小插件开发过程

注:本文只是记录个人开发过程,可能有部分操作很奇怪或者不对,请见谅!

这不是教程!这不是教程!这不是教程!

2年前适配过一款用于BDS的自定义地图插件,后来因为一部分原因停更了,后来圈内也有人接坑,最近又想使用的时候发现并没有那么方便,旧版的需要依靠外置工具实现,及其不方便,就像试试实现直接创建……

开发环境

这里采用目前较为流行的LiteLoaderBDS加载器,提供了大量API使开发变得容易

当然VS也是必不可少的一部分

实现过程

之前的自定义地图需要玩家手持地图才能实现更改成图片,要做升级那就应该实现直接生成。

那么首先应该想到的就是原版地图是如何从空地图变成地图的,打开IDA,寻找答案~

  1. 首先搜索关键字mapitem::

  1. 通过查看,可以找到Emptymapitem::use,也就是空地图使用。然后F5看伪代码

如图1-2,可以发现在玩家使用空地图后,执行了如红框区域的函数,也就是获取mapiD的唯一ID,然后通过+1保存,最后设置新生成地图的mapiD。

大致代码如下:

此时如果直接将这个mapitem添加到玩家手中,他会是一个没有任何像素的地图(放展示框为透明)

  1. 那改如何修改这个地图的数据?继续在Emptymapitem::use的伪代码中寻找

我们查找到红框内的相关函数 Level::createMapSavedData()

但是这个函数需要很多参数,而我们需要的是直接通过mapiD(ActorUniqueID)生成,那就看看 Level::createMapSavedData 的实现。

从此得知,BDS内部调用了Level的一个私有函数Level::_createMapSavedData(),正好它也只需要mapiD,正符合我们的意图。

注:setLocked是必须的,(锁定地图不会被修改)

  1. 随后设置像素(MC中地图为128x128)这里不详细讲解如何切割图片与rgba的转换!(详细情况CustomMapX源代码)

5.设置完毕后,我们需要将地图数据保存至游戏中,

6. 此时你应该发现,我们并没有与mapitem进行绑定,那该如何绑定呢?看(图1-4)最后一个红框,给Item设置了Map数据,由此大功告成

附加:如何将地图给予玩家呢?这里有几种方法!

  • 通过Player::giveItem()给予 

  • 通过Level::spawnItem()生成一个掉落物(推荐,如果分割图片进行批量生成,使用giveItem会导致如果背包空间不足,部分地图无法生成在背包内)

上述两种方法均为LIAPI(LiteLoaderBDS封装)详细实现看源代码

相关链接

LiteLoaderBDS: https://github.com/LiteLDev/LiteLoaderBDS

CustomMapX: https://github.com/dreamguxiang/CustomMapX

comments powered by Disqus