魔力网络(Vis Network)

基本信息

项目 值
来源 thaumcraft.api.visnet
核心类 VisNetHandler, TileVisNode
包 thaumcraft.api.visnet

概述

Vis Network(魔力网络)是 Thaumcraft 中的元素传输系统。元素(Vis)通过节点网络从源节点(如 Aura Node)传输到消耗节点(如 Infernal Furnace)。VisNetHandler 负责管理整个网络的路由和元素分配,TileVisNode 是节点在游戏世界中的方块实体实现。

VisNetHandler

VisNetHandler 是静态工具类,负责魔力网络的全局管理。

静态字段

字段 类型 说明
sources HashMap<Integer, HashMap<WorldCoordinates, WeakReference<TileVisNode>>> 按维度存储的源节点列表

核心方法

drainVis

public static int drainVis(World world, int x, int y, int z, Aspect aspect, int amount)

从指定位置附近的节点抽取元素。

参数:

  • world - 世界实例
  • x, y, z - 抽取位置
  • aspect - 要抽取的元素类型
  • amount - 要抽取的数量

返回:实际抽取到的数量(可能少于请求量)

addSource

public static void addSource(World world, TileVisNode vs)

将节点注册为源节点。

参数:

  • world - 世界实例
  • vs - 要注册的源节点

addNode

public static WeakReference<TileVisNode> addNode(World world, TileVisNode vn)

将节点添加到网络(作为中继或接收节点)。

参数:

  • world - 世界实例
  • vn - 要添加的节点

返回:节点的父节点引用

findClosestNodes

public static ArrayList<Object[]> findClosestNodes(TileVisNode target, TileVisNode parent, ArrayList<Object[]> in)

查找距离目标最近的节点列表。

generateVisEffect

public static void generateVisEffect(int dim, int x, int y, int z, int x2, int y2, int z2, int color)

生成元素流动的视觉粒子效果。

TileVisNode

TileVisNode 是节点的方块实体实现,继承自 TileThaumcraft。

核心抽象方法

方法 返回值 说明
getRange() int 返回节点搜索父节点的范围(方块数)
isSource() boolean 返回是否为源/根节点

父子关系

方法 返回值 说明
getParent() WeakReference<TileVisNode> 获取父节点引用
setParent(WeakReference<TileVisNode>) void 设置父节点
getRootSource() WeakReference<TileVisNode> 获取根源节点
getChildren() ArrayList<WeakReference<TileVisNode>> 获取所有子节点
parentChanged() void 父子关系改变时的回调(可重写)

元素操作

consumeVis

public int consumeVis(Aspect aspect, int vis)

消费/抽取元素。实际消耗的是父节点的元素。

参数:

  • aspect - 元素类型
  • vis - 数量

返回:实际消耗的数量

注意:此方法不应直接调用,应使用 VisNetHandler.drainVis()

节点管理

removeThisNode

public void removeThisNode()

从网络中移除此节点及其所有子节点。

效果回调

public void triggerConsumeEffect(Aspect aspect)

元素被抽取时的视觉效果回调,可重写实现自定义效果。

调谐类型

public byte getAttunement()

返回节点调谐的元素类型:

返回值 元素
-1 无调谐(大多数实现)
0 气(AER)
1 火(IGNIS)
2 水(AQUA)
3 土(TERRA)
4 秩序(ORDO)
5 混沌(PERDITIO)

网络重建

节点会自动检测网络变化并重建连接:

  • 每 40 tick 检查一次连接状态
  • 如果子节点不可见或父节点失效,触发刷新
  • 刷新时清空父子关系并重新查找

网络架构

VisNetHandler (静态管理)
    │
    ├── sources (源节点Map)
    │       └── TileVisNode (isSource = true)
    │
    └── TileVisNode
            ├── parent → 指向更近的节点
            └── children → 被此节点服务的节点列表

节点查找流程

  1. 调用 VisNetHandler.drainVis()
  2. 计算附近节点(缓存机制)
  3. 按距离排序节点
  4. 逐个尝试抽取,直到满足数量或耗尽

实现自定义节点

public class MyVisNode extends TileVisNode {
    
    @Override
    public int getRange() {
        return 8;  // 8格范围内查找父节点
    }
    
    @Override
    public boolean isSource() {
        return false;  // 中继节点,非源节点
    }
    
    @Override
    public void triggerConsumeEffect(Aspect aspect) {
        // 自定义视觉效果
        worldObj.spawnParticle("happyVillager", 
            xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 
            0, 0, 0);
    }
    
    @Override
    public void parentChanged() {
        // 父子关系改变时的逻辑
        worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
    }
}

相关接口

  • INode - 节点的核心接口
  • IEssentiaTransport - 元素传输接口
  • IAspectContainer - 元素容器接口