Skip to content

🔄 符文门传送系统完整升级 - 基于MITE研究的多维度传送与视觉反馈系统 #4

@Inf1nlty

Description

@Inf1nlty

📋 升级概述

基于 MITE_Research Issue #13 中的深度分析,对现有的 RunePortalBlock 进行全面升级,实现完整的符文门传送系统。

🎯 核心功能升级

1. 🌐 多维度传送系统

  • 维度检测: 智能检测传送门所在维度
  • 跨维度传送: 支持主世界 ↔ 地狱 ↔ 末地的完整传送
  • 传送方向记录: 实现 teleportDirection 变量保存传送历史
  • 返回机制: 支持传送历史回溯和"返回上一个位置"功能

2. 🎨 视觉反馈系统(基于MITE GuiIngame分析)

  • 维度颜色编码:
    • 主世界: RGB(53,159,255) - 清爽蓝色调
    • 地狱: RGB(228,123,78) - 炽热橙红调
    • 末地: RGB(68,1,180) - 神秘紫色调
  • 20帧渐变动画: 标准化的1秒传送过渡效果
  • 全屏沉浸效果: Z深度-90.0F的最前层渲染
  • runegate_counter机制: 客户端传送状态计时器

3. 🛡️ 玩家状态检查系统

  • 环境安全检测:
    • 地面稳定性验证
    • 液体环境检测
    • 障碍物扫描(蜘蛛网等)
  • 玩家状态验证:
    • 生理条件检查
    • 装备兼容性验证
    • 载具状态处理
  • 权限管理: 特殊状态下的传送权限控制

4. 📊 数据追踪与成就系统

  • 使用统计: 客户端-服务端双重记录
  • 传送距离追踪: 用于成就解锁
  • 世界级数据: 按维度分别记录使用数据
  • 成就集成: 多人环境下的成就协调

🔧 技术实现方案

A. 核心类扩展

1. RunePortalBlock 升级

// 新增字段
private static final Map<UUID, Vec3> TELEPORT_DIRECTION = new HashMap<>();
private static final Map<UUID, ResourceKey<Level>> LAST_DIMENSION = new HashMap<>();
private static final Map<UUID, Long> TELEPORT_STATISTICS = new HashMap<>();

// 维度颜色定义
public static final Map<ResourceKey<Level>, DustParticleOptions> DIMENSION_PARTICLES = Map.of(
    Level.OVERWORLD, new DustParticleOptions(new Vector3f(53/255f, 159/255f, 255/255f), 1.0F),
    Level.NETHER, new DustParticleOptions(new Vector3f(228/255f, 123/255f, 78/255f), 1.0F),
    Level.END, new DustParticleOptions(new Vector3f(68/255f, 1/255f, 180/255f), 1.0F)
);

2. 新增客户端渲染类

public class RunePortalRenderer {
    private static int runegate_counter = 0;
    
    public static void renderRunegateEffect(GuiGraphics guiGraphics, Player player) {
        if (runegate_counter > 0) {
            ResourceKey<Level> dimension = player.level().dimension();
            Vector3f color = getDimensionColor(dimension);
            float alpha = Math.min(runegate_counter / 20.0F, 1.0F);
            renderFullscreenOverlay(guiGraphics, color, alpha);
            runegate_counter--;
        }
    }
}

B. 传送逻辑重构

1. 智能目标选择

private BlockPos calculateTeleportDestination(ServerPlayer player, ServerLevel currentLevel) {
    ResourceKey<Level> currentDim = currentLevel.dimension();
    ResourceKey<Level> targetDim = getTargetDimension(currentDim);
    
    // 记录传送方向
    TELEPORT_DIRECTION.put(player.getUUID(), player.position());
    LAST_DIMENSION.put(player.getUUID(), currentDim);
    
    return findSafeDestination(player.server.getLevel(targetDim), player);
}

2. 安全传送验证

private boolean canPlayerTeleport(ServerPlayer player, BlockPos destination) {
    // 环境安全检查
    if (!isGroundStable(player.level(), destination)) return false;
    if (isInLiquid(player.level(), destination)) return false;
    if (hasObstacles(player.level(), destination)) return false;
    
    // 玩家状态检查
    if (player.isInBed()) return false;
    if (player.isSpectator()) return false;
    
    return true;
}

C. 客户端集成

1. Mixin注入GUI渲染

@Mixin(Gui.class)
public class GuiMixin {
    @Inject(method = "render", at = @At("TAIL"))
    private void renderRunePortalEffects(GuiGraphics guiGraphics, float partialTick, CallbackInfo ci) {
        RunePortalRenderer.renderRunegateEffect(guiGraphics, Minecraft.getInstance().player);
    }
}

2. 网络数据包

public class RunePortalPacket {
    public static void sendTeleportStart(ServerPlayer player, ResourceKey<Level> targetDim) {
        // 发送客户端开始传送效果
    }
    
    public static void sendTeleportComplete(ServerPlayer player) {
        // 发送传送完成,重置效果
    }
}

📁 文件结构

新增文件

src/main/java/huix/infinity/
├── common/world/block/
│   └── RunePortalBlock.java (升级)
├── common/client/
│   ├── renderer/RunePortalRenderer.java (新增)
│   └── gui/RunePortalOverlay.java (新增)
├── common/network/
│   └── packet/RunePortalPacket.java (新增)
├── mixin/client/
│   └── GuiMixin.java (新增)
└── common/util/
    └── TeleportUtil.java (新增)

资源文件

src/main/resources/
├── assets/infinityway/
│   ├── textures/gui/
│   │   └── rune_portal_overlay.png (新增)
│   └── sounds/
│       ├── rune_portal_activate.ogg (新增)
│       └── rune_portal_complete.ogg (新增)
└── data/infinityway/
    └── advancements/
        └── rune_portal_explorer.json (新增)

🎮 用户体验升级

1. 传送过程

  1. 激活检测: 玩家进入传送门 → 安全检查 → 开始传送序列
  2. 视觉反馈: 维度色彩覆盖屏幕 → 20帧渐变动画 → 沉浸式体验
  3. 传送执行: 记录方向 → 跨维度传送 → 安全着陆验证
  4. 完成效果: 到达特效 → 统计更新 → 成就检查

2. 多维度支持

  • 主世界 → 地狱: 蓝色 → 橙红色过渡,火焰粒子效果
  • 地狱 → 末地: 橙红色 → 紫色过渡,虚空粒子效果
  • 末地 → 主世界: 紫色 → 蓝色过渡,星光粒子效果

3. 返回机制

  • 传送历史: 自动记录最近3次传送位置
  • 快速返回: 潜行+右键传送门可返回上一位置
  • 方向指示: 传送门会显示指向上次传送方向的粒子

🏆 成就系统

新增成就

  • 🌟 初次传送: 首次使用符文门传送
  • 🌍 维度旅行者: 使用符文门访问所有三个维度
  • 🔄 归途: 使用返回功能回到起始位置
  • 📏 远征: 单次传送距离超过10000格
  • ⏱️ 频繁旅行者: 24小时内传送50次

📊 兼容性保证

现有功能保留

  • ✅ 保持现有的传送门结构检测
  • ✅ 兼容现有的粒子效果系统
  • ✅ 保留传送延迟和冷却机制
  • ✅ 保持与PortalInterceptHandler的集成

配置选项

public class RunePortalConfig {
    public static boolean ENABLE_DIMENSION_COLORS = true;
    public static boolean ENABLE_FULLSCREEN_EFFECTS = true;
    public static boolean ENABLE_TELEPORT_HISTORY = true;
    public static int MAX_TELEPORT_HISTORY = 3;
    public static int TELEPORT_COOLDOWN_TICKS = 60;
}

🔮 未来扩展

计划功能

  • 符文组合: 不同符文石组合影响传送目标
  • 传送网络: 多个传送门之间的连接网络
  • 能量系统: 传送消耗特定资源或经验
  • 坐标绑定: 绑定特定坐标的精确传送

这个升级将把简单的传送门系统转变为一个功能完整、视觉震撼的跨维度传送网络,为玩家提供沉浸式的传送体验。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions