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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions