能源存储

能源存储

一个轻量级且可扩展的Hytale能量API,为方块、机器和模组提供统一的能量存储、传输和管理系统。

图书馆

📦 EnergyStorage API

Energy Storage API 是一个面向 Hytale 模组开发者的轻量级库。它提供了一个功能完善、基于组件的能量系统,其他模组可以轻松将其集成到机器、方块、实体或自定义的游戏系统中。此模组本身不会添加任何游戏内容。相反,它围绕 Hytale 官方的 Component 系统 ECS 提供了一个简洁且可扩展的 API,以确保模组间的最大兼容性和稳定性。当您希望以可预测且标准化的方式,让机器具备存储、接收或提取能量的能力时,请使用此库。


⚡ 特性

  • EnergyStorageBlockComponent,基于 Hytale 官方的 Component 系统 ECS
  • EnergyStorageEntityComponent,基于 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&lt;SolarGeneratorComponent&gt; CODEC =
        BuilderCodec.builder(SolarGeneratorComponent.class, SolarGeneratorComponent::new)

                .append(new KeyedCodec&lt;&gt;("ProductionPerTick", Codec.LONG),
                        (c, v) -&gt; c.productionPerTick = v,
                        c -&gt; 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&lt;ChunkStore&gt; 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&lt;ChunkStore, SolarGeneratorComponent&gt; solarType;

public SolarGeneratorSystem(ComponentType&lt;ChunkStore, SolarGeneratorComponent&gt; solarType) {
    this.solarType = solarType;
}

@Nonnull
@Override
public Query&lt;ChunkStore&gt; getQuery() {
    // 系统仅对同时拥有 SolarGeneratorComponent 和 EnergyStorageBlockComponent 的实体进行 tick
    return Query.and(EnergyStorageBlockComponent.getComponentType(), this.solarType);
}

@Override
public void tick(
        float dt,
        int index,
        @Nonnull ArchetypeChunk&lt;ChunkStore&gt; chunk,
        @Nonnull Store&lt;ChunkStore&gt; store,
        @Nonnull CommandBuffer&lt;ChunkStore&gt; 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 将为你提供一个干净、稳定的基础。