MesdagPortLib

MesdagPortLib

将模组从一个版本移植到另一个版本

MesdagPortLib

一个向前移植的库,将现代 Minecraft(1.21+)的 API 功能带回到 Forge 1.20.1。可以把它看作一座桥梁,让模组开发者能够在针对稳定的 1.20.1 Forge 生态系统的同时,使用 NeoForge 风格的 API。


✨ 主要特性

♜ 17 个新的玩家与实体属性

所有属性均已网络化并自动同步。每个属性都有一个情感指示器(正面/中性/负面),并带有彩色提示文本:

属性 默认值 描述
player.block_break_speed 1.0 方块破坏速度倍率
generic.burning_time 1.0 燃烧时间倍率
generic.explosion_knockback_resistance 0.0 爆炸击退抗性
generic.fall_damage_multiplier 1.0 摔落伤害倍率
generic.flying_speed 0.4 创造模式飞行速度
generic.jump_strength 0.42 跳跃高度
generic.max_absorption 0.0 最大伤害吸收生命值
player.mining_efficiency 0.0 挖掘速度修正
generic.movement_efficiency 0.0 移动效率
generic.oxygen_bonus 0.0 水下呼吸加成
generic.safe_fall_distance 3.0 安全摔落距离
generic.scale 1.0 实体缩放(0.0625 ~ 16.0)
player.sneaking_speed 0.3 潜行移动速度
player.submerged_mining_speed 0.2 水下挖掘速度
player.sweeping_damage_ratio 0.0 横扫之刃伤害比率
generic.water_movement_efficiency 0.0 水中移动效率
player.creative_flight false 布尔值:启用创造飞行

属性通过 PortEntityAttributeModificationEvent 自动添加到所有生物实体上。

📊 数据映射系统

从 1.21 移植过来的 JSON 驱动数据系统——将类型化、基于编解码器的值附加到任何注册表条目上:

  • 数据驱动——在 data/<namespace>/data_maps/ JSON 文件中定义值
  • 标签与条件支持——可应用于标签,使用条件谓词
  • 合并与移除——支持多来源合并及移除策略
  • 网络同步——自动的客户端-服务器协商与同步

内置数据映射:

  • 堆肥物品(portlib:compostables)——覆盖堆肥几率与村民行为
  • 熔炉燃料(portlib:furnace_fuels)——定义自定义燃料燃烧时间

📦 数据组件系统

ItemStack 上的类型安全持久化数据,仿照 1.21 的数据组件设计:

  • 基于 Codec 的持久化 + 基于 StreamCodec 的网络同步
  • 基于补丁的部分更新
  • PortModifyDefaultComponentsEvent 用于设置默认组件

🔗 附加系统

面向实体、方块实体和世界等级的 NeoForge 风格数据附加:

  • 可序列化的附加数据,支持死亡时复制
  • 通过 StreamCodec 进行按玩家同步
  • 世界等级附加数据持久化到存档数据中

🎯 220+ 个移植事件

一个全面的事件系统,将 Forge 事件封装成干净、调用者隔离的 API:

  • 玩家(34 个):PortPlayerHeartTypeEvent、PortSweepAttackEvent、PortCriticalHitEvent、PortArrowLooseEvent、PortItemTooltipEvent、PortAnvilRepairEvent、PortTradeWithVillagerEvent 等。
  • 生物实体(33 个):PortLivingShieldBlockEvent、PortLivingIncomingDamageEvent、PortLivingDrownEvent、PortLivingUseTotemEvent、PortMobDespawnEvent、PortBabyEntitySpawnEvent 等。
  • 客户端(60+ 个):PortRenderLevelStageEvent、PortRenderTooltipEvent、PortRenderHandEvent、PortRenderArmEvent、PortRegisterGuiLayersEvent、PortRegisterKeyMappingsEvent、PortComputeFovModifierEvent、PortSelectMusicEvent 等。
  • 世界/方块/物品:PortBlockDropsEvent、PortExplosionKnockbackEvent、PortPistonEvent、PortItemExpireEvent、PortChunkWatchEvent 等。
  • 酿造/附魔:PortPotionBrewEvent、PortEnchantmentLevelSetEvent
  • 村庄:PortVillagerTradesEvent、PortWandererTradesEvent

事件在调用者自身模组的事件总线上分发,保持模组隔离的干净整洁。

🌐 网络系统

  • 捆绑数据包——多个逻辑数据包合并为一个物理消息
  • 丰富的发送目标(追踪实体、追踪区块、维度、附近玩家)
  • 注册表感知的 FriendlyByteBuf 扩展
  • VarInt/VarLong/UTF-8 编解码器工具

🧩 接口注入

通过接口注入和 coremods,45 个以上的原版类获得了新方法:

  • Holder<T> → is()、getKey()、getRegisteredName()、getData()
  • ItemStack → setData()、getData()、数据组件操作
  • LivingEntity → getAttribute(Holder<Attribute>)、removeEffectsCuredBy()
  • Registry / IForgeRegistry → 扩展查找方法
  • Entity / Player / Block / Item → 各种扩展方法

🏷 通用标签生成

c: 命名空间标签(箱子、圆石、矿石、沙子、存储方块等),用于跨模组兼容。


🎮 面向玩家

PortLib 本身不添加任何游戏内容——它是一个库模组。如果其他模组需要它,请安装它。你会在你的玩家和实体上看到 17 个新属性,但它们只有在其他模组修改时才会生效。