魔力网络(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 → 被此节点服务的节点列表
节点查找流程
- 调用
VisNetHandler.drainVis() - 计算附近节点(缓存机制)
- 按距离排序节点
- 逐个尝试抽取,直到满足数量或耗尽
实现自定义节点
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- 元素容器接口