简介

该日志已经不再更新,新的内容请查看 《现代工业更新计划》

  这里讲罗列出“现代工业”所有的更新记录以及更新内容的介绍。

  目前所有更新日志代号均以“#”开头,以后可能会有变更。

  关于项目的有关内容,可以查看爱发电 中的介绍。


功能开发顺序

(顺序由内测组投票决定)

序号功能难度进度
1更舒适的合成表查看3完成
2管道系统5编写中
3高级配置系统2待机
4红石能衰退?待机
5储能器3待机
6完整的金属冶炼4待机
7精制工具4待机
8更多的电器3待机

新的更新

#88.更多类型的管道

  目前已有三种类型的管道:直线型、直角拐弯型、十字型,后续可能会添加T字型。

#89.修复管道已知问题

  1. 玩家复活后复活点附近管道渲染异常
  2. 管道竖直放置时膨胀箱判定错误
  3. 道放置连接时已存在的管道时服务端数据更新错误
  4. blockstates书写错误
  5. 直角管道放置时方向判定错误
  6. 管道连接时模型闪烁
  7. 管道修改连接时有几率导致游戏崩溃
  8. 管道水平放置时选择框渲染错误
  9. 直角管道多方向无法正确连接
  10. 客户端数据更新后选择框渲染错误
  11. 管道运输流体后不触发离线存储
  12. 十字管道转向错误
  13. 在两个管道中间放置管道显示效果不更新
  14. 十字管道数据重复

#90.优化管道算法

  全面重写管道运输算法,尽量避免递归,防止超长管道运输时迭代过多导致堆栈溢出。

#91.修复优化算法带来的漏洞

  • 直线管道与直角管道数据方向不更新
  • 放置直角管道导致游戏崩溃
  • 管道连接时水平流体数据管理器内部错误
  • 字管道连接时方向数据同步异常

#92.修复dor的漏洞

  修复DataReader无法正确读取VarInt的漏洞。

#93.新的GUI控件

  添加翻页控件,GUI支持显示多页内容,可以上下翻页也可左右翻页。

#94.移除老旧的GUI设计

  老旧的GUI渲染设计采用“静态+动态”的绘制方式,这导致诸如滑动框翻页等功能实现苦难,故换用新的渲染设计。新的渲染设计采用“纯动态绘制”的绘制方式,并且将控件的坐标设置改为控件在控件组中的坐标而非在GUI中的坐标,减少控件内部和GUI的接触。

#95.修复新的渲染的漏洞

  • 进度条绘制错误(完全无法正常显示)
  • 画笔坐标错误
  • 画笔剪切超出显示范围导致后台报错
  • 控件在多控件组嵌套时渲染错误
  • MSlot在多控件组嵌套时Slot坐标计算错误
  • 合成表按钮和GUI冲突导致后台报错
  • 鼠标坐标判定错误
  • 滚动条渲染错误
  • 按钮文字渲染错误
  • GL设置错误引起的图像绘制异常

#96.新的鼠标事件触发方式

  老旧的触发方式已经无法满足新式GUI设计的功能需求,故改用新的鼠标事件触发方式。

  旧触发方式采用:开始触发事件 -> 扫描控件 -> 触发指定控件的事件

  新触发方式采用:开始触发事件 -> 分配任务至控件组 -> 控件组扫描并触发事件

#97.修复新的事件触发方式带来的漏洞

  • 鼠标事件无法触发
  • 触发鼠标事件过程中坐标发生偏移
  • 鼠标事件对象判断失误的漏洞
  • 全局鼠标按键当鼠标在控件外时无法触发
  • 鼠标离开事件判定错误

历史记录:

#1 项目的起点

  建立现代工业(ModernIndustry)项目,并建立主类以及完成最为基础的架设,此时MI没有任何代码层面及用户层面的功能。

#2 建立电力体系

  简单建立电力系统中的基础概念:发电机、用电器、导线。

分类介绍
发电机制造能量的机器全部归类于发电机
用电器消耗能量的机器全部归类与用电器
导线因为导线采用了和机器不同的算法,所以导线单独分类,用于传输能量
补充储电器同时属于发电机与用电器分类,不属于导线

#3 一切的开端—第一个电器

  创建了MI中的第一个机器——压缩机,不过其在电力系统完工之前不需要电能就可以运行,前期主要用于测试代码功能,在电力系统制作时为其添加了消耗电能的功能。

#4 构建电力系统的基本框架

  构建了电力系统的基本内容与规范,包括:电能概念、电压概念、EleWorker……

分类介绍
电能用于表示能量数量的一个指示数字
电压用于表示电压等级的一个指示数字,理论上支持所有非负整数,电压与电能无直接联系
EleWorker电力系统的“工作核心”,系统的所有操作都封装在该类中
计数器用于在用电器输入电压不符合需求电压时计数并在计数器达到阈值时执行指令的工具
线路缓存用于存储线路计算的缓存信息,以此减少线路计算的时间和成本(可以选择不实现缓存功能)

#5 第一个导线

  创建了MI中的第一种导线——粗制导线,也是开发前期阶段唯一可用的导线。导线中实现了信息存储、渲染、缓存三大功能,而线路计算则写入了缓存中。

线路计算原理:

  在线路计算中,包含三大流程:寻找线路、计算线路、反馈信息。

  其中前两个流程可以用等价的方法替换,顺序也可以调整,但反馈信息必须在最后进行。

分类介绍
寻找线路寻找指定用电器到非指定发电机的路径
计算线路计算线路上损耗的电能及发电机最终输出的电能和电压
反馈信息向电力系统反馈计算结果,系统将根据结果进行数据更新
路径表示线路中指定起点到指定终点经过的所有导线方块,包含起点与终点,不包含机器方块
非指定发电机MI采用被动式电能运输,所以寻找线路时一般并不知道目标发电机的位置
被动式电能运输用电器主动向电力系统发起传输电能的请求,然后由电力系统负责完成其余工作

  不过MI中的粗制导线没有完全按照上述方法进行,而是按照:读取缓存 -> 计算线路 -> 反馈信息的流程工作。

分类介绍
读取缓存从发电机列表中直接寻找目标发电机,然后读取缓存
计算线路若缓存不存在则计算起点到终点的最短路径并写入缓存
发电机列表一条线路中所有导线共享同一个缓存,每一根导线都负责维护缓存中的发电机列表

  上述列出的第一种方式为粗制导线最初使用的工作流程,后因为技术原因替换为第二种。

#6 发电机的出现

  添加了第一个发电机方块——无线电能方块,用于测试电力系统是否可以正常工作,也用于给玩家提供一个万能的创造模式用发电机。

#7 完善电力系统框架

  这是对电力系统第N次重构,完善了电力系统的功能,删除了不需要的部分。从该版本起,缓存彻底被排除在电力系统规范外,是否实现缓存与电力系统工作没有任何关系。

#8 合成表模块的第一次开发

  原版的合成表本人并不会使用,所以干脆写了一个独立的合成表模块,其中所有内容都是可变的,拓展性较强,但存在结构混乱的缺陷。

#9 加入自动化概念

  建立了registry包,用于自动化注册方块、物品等内容,摆脱手动编码的烦恼。

#10 自动化的推进

  除方块、物品的自动化注册外,又新提供了部分内容,此时自动化系统变得较为完善,包括以下内容:

分类介绍
方块、物品、TileEntity的注册基本游戏内容
网络通讯封装了网络通讯相关的代码,使服务端与客户端的沟通更加简便
数据存储支持部分数据类型的自动存储,拜托手动编码的烦恼,不过目前仍存在一些限制
GUI绘制支持运行时绘制GUI材质,拜托手动绘制材质及寻找组件坐标的烦恼
JSON生成自动生成方块、物品的JSON文件

#11 BUG修复

  修复部分BUG。

#12 GUI绘制

  完善GUI绘制的功能。

#13 新的功能——属性

  在工具使用时提供额外效果的玩意,有点类似于附魔。

#14 工具类

  提供了一系列Util类,封装了一些常用操作,缩减了代码量。

#15 时刻表

  用于在指定时间后执行指定操作,因为某些功能限制,在#38时被移除。

#16 添加一系列物品及机器

#17 GUI绘制的完善

  解决了GUI绘制坐标点寻找烧脑的问题,彻底摆脱思考,同时优化了性能。

#18 重写合成表模块

  因为合成表模块结构过于混乱,没有任何易用性及美观性,所以重新设计、编写了合成表模块:

分类介绍
CraftGuide<T, R>创建、管理合成表,数据可变
ItemSol存储物品列表,可有序可无序,数据不可变
ItemElement存储单个物品,数据不可变
IShape合成表,内部存储原料列表和产物列表,可有序可无序,数据不可变

#19 修复线路计算中的问题

  将线路计算方式换为#5中的第二种方式。

#24 优化自动数据存储

  减少了存储类名需要的成本

#34 优化扳手的玩法

  扳手玩法改为右键不同区域转向不同的方向,shift + 右键拆除方块,暂时没有耐久。

#35 完善自动注册的功能

  使自动注册支持对物品、方块列表进行排序,保证在每次创建存档时创造模式物品栏中的排列顺序不变化。

#36 第一次材质扩充

#37 增强合成表模块

  修改了MC原版注册JSON合成表的方法,在其中加入了注册MI的JSON合成表的代码,自此注册合成表可以不再面对繁杂的代码编写。

#38 修复服务端支持

  修复因代码问题导致的服务端启动崩溃。

#39 GUI添加鼠标事件

  GUI支持鼠标事件,在鼠标移出、移入、按下、松开或点击控件时会自动调用控件的方法(前提是控件注册了相关事件)。一个控件可以重复注册同一种事件,在事件被触发时所有相同事件都会被触发,不会被遗漏。

#40 优化自动化网络传输结构

  自动化网络传输采用“注册”结构,添加新的网络传输方式变得更加方便。同时网络传输不再主动询问用户是否需要发送信息,更加偏向半自动化,采用用户主动向网络传输系统发送请求的方式,减少了运行开支。

#41.添加合成表显示

  预期设计是点击机器的进度条可以查看该机器所有的合成表,不过目前由于网络通信的原因还未添加触发合成表显示的机制。以后还会为合成表添加更多的功能,例如:自动装填。

#42.修复导线网络通信漏洞

  修复导线的网络通信中由于IDEA“重命名”功能的BUG出现的一些神奇的代码。

#43.网络通信新功能——GUI通信

  网络通信支持客户端与服务端GUI之间的互相通信。

#44.GUI支持事件进行网络通信

  MIFrame添加了用于支持注册的事件进行网路单向通信的接口,由于一些设计缺陷以及考虑到代码简洁性的原因,事件的网络通信暂时只支持客户端到服务端的通信(即只能由客户端发送信息到服务端)。

#45-修复GUI根据鼠标坐标获取组件错误的问题

  原本获取组件的算法有问题,这次修改了算法。

#46-修复Group内添加的组件鼠标事件错误的问题

  原本的事件触发方式导致Group内的鼠标事件无法触发,这次修改了触发方式,使Group内组件的鼠标事件也可以正确触发。

#47-修复GUI按钮响应错误的问题

  修复GUI按钮鼠标事件的错误响应,以及为鼠标点击添加了音效。

#48-修复GUI组件onAddToGUI方法运行两次

  StaticFrameClient构造函数中的错误用法导致客户端onAddToGUI运行两次。

#49.修复Group的错误算法

  Group类获取鼠标指向的组件时没有调用组件的判断方法直接返回了组件,导致判断结果异常。

#50.添加合成表按钮

  添加了隐形的合成表按钮,支持全自动调整坐标和尺寸。部分功能依赖MComponent执行,所以从该版本开始要求MComponent的子类重写onAddToGUI方法时必须调用父类对应的方法。

#49-修复Group的错误算法

  Group类获取鼠标指向的组件时没有调用组件的判断方法直接返回了组件,导致判断结果异常。

#50.添加合成表按钮

  添加了隐形的合成表按钮,支持全自动调整坐标和尺寸。部分功能依赖MComponent执行,所以从该版本开始要求MComponent的子类重写onAddToGUI方法时必须调用父类对应的方法。

#51-添加对已有所有合成表类型的显示支持

  自动合成表显示目前已经支持对已有四种类型的合成表进行显示:

合成表类型特点介绍
OrderlyShapeOnly原料列表有序,产物仅有一种
UnorderlyShapeOnly原料列表无序,产物仅有一种
OrderlyShape原料列表有序,产物有多种(无序)
UnorderlyShape原料列表无序,产物有多种(无序)

注:原料列表有序即相当于有序合成表,无序则为无序合成表

#52-修复打开空的合成表时游戏崩溃

  修复打开空的合成表时抛出IndexOutOfBoundExceptionIllegalArgumentException导致的程序崩溃。

#53.修复GUI网络通信时客户端服务端窗体对象可能不一致的漏洞

  以往GUI进行网络通信时,通信内容中并没有存储发送信息的GUI的窗体信息,导致接收端无法判断窗体是否一致,该更新在通讯信息中加入了GUI窗体校验信息,辅助信息正确性校验。

#54.修复点击合成表按钮响应多次的BUG

  以往按钮注册事件的代码位置错误,导致同一个事件被多次注册,从而使按钮响应多次,该更新修改了注册机制,添加了专门的初始化接口,修正了该BUG。

#55.添加配置功能

  支持简单的配置功能,预备后续重新写一遍更高级的。

#56.重写方块JSON生成器

  重写了BlockJsonBuilder类,提供了更加高级的功能,支持多种方块的JSON生成,同时支持快捷的模板添加。

#57.GUI显示调整

  GUI中玩家背包上方添加“物品栏”文字。

#58.修复自动读写崩溃问题

  当需要存储的值为null时会导致存储失败并放弃剩余数据,该问题出现的原因是大部分情况下客户端的TE中并没有存储有效数据。解决方案:客户端不再触发自动读写。

#59.实现本地GUI渲染

  实现了本地子GUI渲染,允许玩家在已打开的GUI上再打开一个GUI。打开子GUI时会拦截原GUI的所有操作,当玩家尝试关闭GUI时只会关闭子GUI,而原GUI保持开启。

#60.实现以玩家为凭借的双端通信

  允许以玩家为KEY进行服务端客户端双端通信,为保持安全以UUID为凭借。

#61.修复服务端SideOnly问题

  修复因SideOnly(CLIENT)导致的服务端BUG。

#62.修复两端数据不一致导致的BUG

  修复因客户端与服务端网络注册IDGUI ID不一致导致的问题。

#63.修复GUI渲染问题

  修复当传入数据为负值时导致的CommonProgress渲染异常。

#64.字节层次的数据操作——dor

  添加了自制的数据操作库dor,主要由IDataReader(读取器)和IDataWriter(写入器)组成。同时提供了两个默认实现:支持读写的ByteDataOperator以及只读的ReadOnlyDataOperator

#65.新的数据读写系统

  编写全新的数据读写系统,除原本的NBTTagCompound支持外,新加了对ByteBuf及自制的dor的支持。

#66.新的自动数据读写

  依靠新的数据读写系统编写了全新的自动化数据读写库,运行主要依靠IClassData,实现了对数据的自动存储,同时支持数据类型转换。

#67.完善合成表自动填充的功能

  修复了合成表填充时存在的所有已知BUG,优化合成表显示。

#68.网络通信换用dor系统

  自动化网络通信全面抛弃NBTTagCompound,使用dor读写系统。

#69.修复dor漏洞及优化功能

  • 修复读写数据时下标错误的更新
  • 修复读写占用多字节的数据时的错误移位操作
  • 修复读写VarInt时的错误移位操作
  • 优化不合理的写入顺序
### #70.移除“属性”功能

  由于属性功能与附魔玩法重复并且存在漏洞,所以决定将该功能删除。

#71.添加虚拟dor

  添加了VarDataReader类,用于在不复制任何数据的情况下进行data读取,优化了IDataReader#readData()的时间成本及空间成本。

#72.修复自动化网络通信的BUG

  修复基于方块的网络通信中可能存在的进行网络通信时客户端世界未构造完毕的BUG。

#73.修复合成表填充显示异常

  修复合成表填充后GUI显示异常,通过在填充合成表后代码触发数据同步来更新GUI显示。

#74.支持自动注册流体

  支持自动注册流体、流体物品、流体方块及流体桶。

#75.自动注册系统改用注册机制

  自动注册系统换用注册机制添加注册类型,拓展性更强。

#76.修复一些小漏洞

  • 生成本地名称时将"."误写为":"
  • 矿石生成器注册异常
  • Mixin编译报错
  • 新版自动注册不调用排序方法
  • 某些注册机错误处理本地名称
  • Json生成器对key的错误处理

#77.完善组件

  • 补充GUI材质
  • 扩充字典内容
  • 完善语言文件(中文简体)

#78.添加流体管道的接口

  添加了流体管道需要用到的接口(可能不全,后续调整),大致确定了流体管道工作方式。

#79.添加流体管道的TileEntity的默认实现

  默认的TIleEntity实现了对管道需要用到的数据的底层管理,包括渲染数据、连接数据、存储数据等。

#80.GUI自动绘制添加更多的事件

  GUI自动绘制添加了MouseLocationListener事件,该事件每Tick在组件绘制前被触发,用于记录鼠标坐标的更改。同时还修改了部分GUI鼠标事件的触发方式,让事件功能更加强大。

#81.GUI添加滚动条控件

  向自动化GUI系统添加滚动条控件,效果与创造模式背包右侧的滚动条类似。

#82.GUI添加更多事件

  支持控件监视键盘事件(包括按下和释放)以及鼠标滚轮滑动事件。

#83.添加类信息查看器

  添加类信息查看器,右键方块即可查看方块TileEntity中存储的信息。该物品是为了取代老旧的线缆信息查看器,故同时删除了线缆信息查看器。

#84.优化和完善自动化数据存储

  • 优化对枚举类的存储,占用更少的空间
  • 自动化数据存储类型转换默认支持到字符串的转换
  • 已有的类型添加更完善的类型转换功能

#85.修复并优化管道的部分功能

  • 修复:放置时不自动连接周围方块
  • 修复:数据读取时报错导致无法正确恢复存档内容
  • 修复:管道放置时朝向数据客户端服务端计算结果不一致
  • 修复:管道输出流体到世界后流体不会流动
  • 优化:移除多余的数据
  • 优化:细化碰撞箱
  • 优化:管道放置时的朝向判断
  • 优化:管道的网络资源占用
  • 添加:支持添加管塞

#86.修复功能优化带来的漏洞

  • 导线无法正常连接周围方块
  • 机器无法正常从导线获取能量

#87.优化包/类结构

  将BlockUtil合并到WorldUtil中,修改部分包名,修改部分包的包含结构。