
能源存储
一个轻量级且可扩展的Hytale能量API,为方块、机器和模组提供统一的能量存储、传输和管理系统。
📦 EnergyStorage API
Energy Storage API 是一个面向 Hytale 模组开发者的轻量级库。它提供了一个功能完善、基于组件的能量系统,其他模组可以轻松将其集成到机器、方块、实体或自定义的游戏系统中。此模组本身不会添加任何游戏内容。相反,它围绕 Hytale 官方的 Component 系统 ECS 提供了一个简洁且可扩展的 API,以确保模组间的最大兼容性和稳定性。当您希望以可预测且标准化的方式,让机器具备存储、接收或提取能量的能力时,请使用此库。
⚡ 特性
EnergyStorageBlockComponent,基于 Hytale 官方的Component系统 ECSEnergyStorageEntityComponent,基于 Hytale 官方的Component系统 ECS- 自动序列化与验证
- 可配置的容量、最大接收速率和最大提取速率
- 安全且确定性的能量传输逻辑
- 设计为其他模组的共享依赖项
🧩 作为依赖项安装
repositories {
maven ("https://cursemaven.com")
}dependencies {
compileOnly(libs.jetbrains.annotations)
compileOnly(libs.jspecify)
runtimeOnly(libs.bettermodlist)
//implementation("curse.maven:EnergyStorage-1429355:7515395")
// or
//implementation(files("libs/EnergyStorage-1.0.5.jar"))
}
🧩 使用示例
1. 为方块实体添加能量组件
- EnergyStored - 机器创建时初始存储的能量值。
- MaxEnergy - 机器可容纳的最大能量容量。
- MaxReceive - 机器每 tick 能接收的最大能量(设为 0 以禁用接收)。
- MaxExtract - 机器每 tick 能提取的最大能量(设为 0 以禁用提取)。
添加组件
"Components": {
"EnergyStorageComponent": {
"EnergyStored": 0,
"MaxEnergy": 80000,
"MaxReceive": 0,
"MaxExtract": 1000
}
}
SolarGenerator.json
{
"TranslationProperties": {
"Name": "items.Solar_Generator.name"
},
"ItemLevel": 10,
"MaxStack": 100,
"Icon": "Icons/ItemsGenerated/Solar_Generator_Block.png",
"Categories": [
"Blocks.Rocks"
],
"PlayerAnimationsId": "Block",
"Set": "SolarGenerator",
"BlockType": {
"State": {},
"Material": "Solid",
"DrawType": "Cube",
"Group": "Stone",
"Flags": {},
"VariantRotation": "NESW",
"Gathering": {
"Breaking": {
"GatherType": "Rocks",
"ItemId": "SolarGenerator"
}
},
"Interactions":{
"Use": {
"Interactions": []
}
},
"BlockEntity": {
"Components": {
"EnergyStorageComponent": {
"EnergyStored": 0,
"MaxEnergy": 80000,
"MaxReceive": 0,
"MaxExtract": 1000
},
"examplemod:solar_generator": {
"ProductionPerTick": 80,
"RequiresDaylight": true
}
}
},
"BlockParticleSetId": "Stone",
"ParticleColor": "#737055",
"BlockSoundSetId": "Stone",
"Aliases": [
"stone",
"stone00"
],
"BlockBreakingDecalId": "Breaking_Decals_Rock",
"Textures": [
{
"Up": "BlockTextures/SolarGenerator/top.png",
"Side": "BlockTextures/SolarGenerator/side.png",
"Down": "BlockTextures/SolarGenerator/bottom.png"
}
]
},
"ResourceTypes": [
{
"Id": "Rock"
},
{
"Id": "Rock_Stone"
}
],
"Tags": {
"Type": [
"Rock"
]
},
"ItemSoundSetId": "ISS_Blocks_Stone"
}
ExampleMod.java
package dev.zkiller.exemplemod;import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import dev.zkiller.examplemod.generators.solar.SolarGeneratorComponent;
import dev.zkiller.examplemod.generators.solar.SolarGeneratorSystem;
import javax.annotation.Nonnull;
public class ExampleMod extends JavaPlugin {
private static ExampleMod instance;
private static final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
private ComponentType<ChunkStore, SolarGeneratorComponent> solarGeneratorType;
public ExampleMod(@Nonnull JavaPluginInit init) {
super(init);
instance = this;
}
@Override
protected void setup() {
this.solarGeneratorType = this.getChunkStoreRegistry().registerComponent(
SolarGeneratorComponent.class,
"examplemod:solar_generator",
SolarGeneratorComponent.CODEC
);
this.getChunkStoreRegistry().registerSystem(
new SolarGeneratorSystem(this.solarGeneratorType)
);
LOGGER.atInfo().log("Solar Generator component and system registered successfully!");
}
public static ExampleMod getInstance() {
return instance;
}
public ComponentType<ChunkStore, SolarGeneratorComponent> getSolarGeneratorType() {
return solarGeneratorType;
}
}
SolarGeneratorComponent.java
package dev.zkiller.examplemod.generators.solar;import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.component.Component;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public final class SolarGeneratorComponent implements Component<ChunkStore> {
public long productionPerTick = 80;
@Nonnull
public static final BuilderCodec<SolarGeneratorComponent> CODEC =
BuilderCodec.builder(SolarGeneratorComponent.class, SolarGeneratorComponent::new)
.append(new KeyedCodec<>("ProductionPerTick", Codec.LONG),
(c, v) -> c.productionPerTick = v,
c -> c.productionPerTick)
.addValidator(Validators.greaterThanOrEqual(0L))
.documentation("Energy produced per tick.")
.add()
.build();
public SolarGeneratorComponent() {}
public SolarGeneratorComponent(SolarGeneratorComponent other) {
this.productionPerTick = other.productionPerTick;
}
@Nullable
@Override
public Component<ChunkStore> clone() {
return new SolarGeneratorComponent(this);
}
}
SolarGeneratorSystem.java
package dev.zkiller.exemplemod.generators.solar;import com.hypixel.hytale.component.*;
import com.hypixel.hytale.component.query.Query;
import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import dev.zkiller.energystorage.components.EnergyStorageBlockComponent;
import javax.annotation.Nonnull;
public final class SolarGeneratorSystem extends EntityTickingSystem<ChunkStore> {
private final ComponentType<ChunkStore, SolarGeneratorComponent> solarType;
public SolarGeneratorSystem(ComponentType<ChunkStore, SolarGeneratorComponent> solarType) {
this.solarType = solarType;
}
@Nonnull
@Override
public Query<ChunkStore> getQuery() {
// 系统仅对同时拥有 SolarGeneratorComponent 和 EnergyStorageBlockComponent 的实体进行 tick
return Query.and(EnergyStorageBlockComponent.getComponentType(), this.solarType);
}
@Override
public void tick(
float dt,
int index,
@Nonnull ArchetypeChunk<ChunkStore> chunk,
@Nonnull Store<ChunkStore> store,
@Nonnull CommandBuffer<ChunkStore> cmd
) {
SolarGeneratorComponent solar = chunk.getComponent(index, this.solarType);
EnergyStorageBlockComponent energy = chunk.getComponent(index, EnergyStorageBlockComponent.getComponentType());
if (solar == null || energy == null) return;
long produced = solar.productionPerTick;
long inserted = energy.receiveEnergyInternal(produced, false);
// 控制台调试
System.out.println("[ExampleMod] Inserted: " + inserted +
" FE | Stored: " + energy.getEnergyStored() +
"/" + energy.getMaxEnergyStored());
}
}
🛠️ 适用对象
此库专为以下需求的开发者设计:
- 构建存储或传输能量的机器
- 创建自动化系统
- 实现发电机、电池、电缆或电力网络
- 在多个模组间共享一个通用的能量标准
如果你的模组需要能量系统,这个 API 将为你提供一个干净、稳定的基础。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。