Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
1.21.1-2.0.1

- Complete Codebase Overhaul: Refactored and modernized the entire source structure for better maintainability
- Major UI Performance Overhaul: Replaced legacy texture-based rendering with optimized realtime code-based rendering
- Implemented smooth interpolation (lerping) for all UI bars, providing fluid visuals at high refresh rates
- Switched to native Minecraft furnace flame sprites (lit_progress) for improved visual consistency
- Enhanced Magmatic Generator with precise fluid color detection and lava-specific rendering fixes
- Optimized GPU overhead by reducing texture-binding calls, specifically targeting performance gains for integrated graphics (APUs)

1.21.1-1.6.3

- Fixed fuel validation for fluid generators
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ minecraft_version=1.21.1
# as they do not follow standard versioning conventions.
minecraft_version_range=[1.21.1, 1.22)
# The Neo version must agree with the Minecraft version to get a valid artifact
neo_version=21.1.176
neo_version=21.1.217
# The Neo version range can use any version of Neo as bounds
neo_version_range=[21.1.0,)
# The loader version range can only use the major version of FML as bounds
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
4,101 changes: 4,101 additions & 0 deletions overhaul_code.txt

Large diffs are not rendered by default.

129 changes: 73 additions & 56 deletions src/main/java/cy/jdkdigital/generatorgalore/GeneratorGalore.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package cy.jdkdigital.generatorgalore;

import com.mojang.logging.LogUtils;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import cy.jdkdigital.generatorgalore.common.conditions.GeneratorExistsCondition;
import cy.jdkdigital.generatorgalore.common.datamap.FluidFuelMap;
import cy.jdkdigital.generatorgalore.common.datamap.PotionComponentIngredient;
import cy.jdkdigital.generatorgalore.common.datamap.SolidFuelMap;
import cy.jdkdigital.generatorgalore.registry.GeneratorRegistry;
import cy.jdkdigital.generatorgalore.util.GeneratorUtil;
import cy.jdkdigital.generatorgalore.network.ModPackets;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.CreativeModeTab;
Expand All @@ -23,53 +26,56 @@
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.neoforged.neoforge.common.crafting.IngredientType;
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
import net.neoforged.neoforge.fluids.FluidStack;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.NeoForgeRegistries;
import net.neoforged.neoforge.registries.datamaps.DataMapType;
import net.neoforged.neoforge.registries.datamaps.RegisterDataMapTypesEvent;
import org.slf4j.Logger;

import java.util.function.Supplier;

@Mod(GeneratorGalore.MODID)
public class GeneratorGalore
{
public class GeneratorGalore {
public static final String MODID = "generatorgalore";
public static final Logger LOGGER = LogUtils.getLogger();

public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(Registries.BLOCK, GeneratorGalore.MODID);
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(Registries.ITEM, GeneratorGalore.MODID);
public static final DeferredRegister<MenuType<?>> CONTAINER_TYPES = DeferredRegister.create(Registries.MENU, GeneratorGalore.MODID);
public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, GeneratorGalore.MODID);
public static final DeferredRegister<RecipeSerializer<?>> RECIPE_SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, GeneratorGalore.MODID);
public static final DeferredRegister<RecipeType<?>> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, GeneratorGalore.MODID);
public static final DeferredRegister<ParticleType<?>> PARTICLE_TYPES = DeferredRegister.create(Registries.PARTICLE_TYPE, GeneratorGalore.MODID);
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, GeneratorGalore.MODID);
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(Registries.BLOCK, MODID);
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(Registries.ITEM, MODID);
public static final DeferredRegister<MenuType<?>> CONTAINER_TYPES = DeferredRegister.create(Registries.MENU, MODID);
public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITIES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, MODID);
public static final DeferredRegister<RecipeSerializer<?>> RECIPE_SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, MODID);
public static final DeferredRegister<RecipeType<?>> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, MODID);
public static final DeferredRegister<ParticleType<?>> PARTICLE_TYPES = DeferredRegister.create(Registries.PARTICLE_TYPE, MODID);
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
public static final DeferredRegister<MapCodec<? extends ICondition>> CONDITION_CODECS = DeferredRegister.create(NeoForgeRegistries.Keys.CONDITION_CODECS, MODID);
public static final DeferredRegister<IngredientType<?>> INGREDIENT_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.INGREDIENT_TYPES, MODID);
public static final DeferredRegister<DataComponentType<?>> DATA_COMPONENTS = DeferredRegister.create(Registries.DATA_COMPONENT_TYPE, MODID);

public static final DeferredHolder<CreativeModeTab, CreativeModeTab> TAB = CREATIVE_MODE_TABS.register(MODID, () -> CreativeModeTab.builder()
.withTabsBefore(CreativeModeTabs.SPAWN_EGGS)
.icon(() -> new ItemStack(GeneratorRegistry.generators.get(ResourceLocation.fromNamespaceAndPath(MODID, "iron")).getBlockSupplier().get()))
.title(Component.literal("Generator Galore"))
.build());

public static DeferredHolder<CreativeModeTab, CreativeModeTab> TAB = CREATIVE_MODE_TABS.register(MODID, () -> {
return CreativeModeTab.builder()
.withTabsBefore(CreativeModeTabs.SPAWN_EGGS)
.icon(() -> new ItemStack(BuiltInRegistries.ITEM.get(ResourceLocation.fromNamespaceAndPath(MODID, "iron_generator"))))
.title(Component.literal("Generator Galore"))
.build();
});
public static final DeferredHolder<MapCodec<? extends ICondition>, MapCodec<GeneratorExistsCondition>> GENERATOR_EXISTS_CONDITION = CONDITION_CODECS.register("generator_exists", () -> GeneratorExistsCondition.CODEC);
public static final DataMapType<Block, FluidFuelMap> FLUID_FUEL_MAP = DataMapType.builder(ResourceLocation.fromNamespaceAndPath(MODID, "fluid_fuel_map"), Registries.BLOCK, FluidFuelMap.CODEC).synced(FluidFuelMap.CODEC, false).build();
public static final DataMapType<Block, SolidFuelMap> SOLID_FUEL_MAP = DataMapType.builder(ResourceLocation.fromNamespaceAndPath(MODID, "solid_fuel_map"), Registries.BLOCK, SolidFuelMap.CODEC).synced(SolidFuelMap.CODEC, false).build();

public static final DeferredHolder<IngredientType<?>, IngredientType<PotionComponentIngredient>> POTIOM_INGREDIENT_TYPE = INGREDIENT_TYPES.register("component", () -> new IngredientType<>(PotionComponentIngredient.CODEC));

public static final Supplier<DataComponentType<Integer>> ENERGY_COMPONENT = DATA_COMPONENTS.register("energy_storage", () -> DataComponentType.<Integer>builder().persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT).build());
public static final Supplier<DataComponentType<FluidStack>> FLUID_COMPONENT = DATA_COMPONENTS.register("fluid_storage", () -> DataComponentType.<FluidStack>builder().persistent(FluidStack.CODEC).networkSynchronized(FluidStack.STREAM_CODEC).build());

public GeneratorGalore(IEventBus modEventBus, ModContainer modContainer) {
GeneratorRegistry.discoverGenerators();

Expand All @@ -83,48 +89,59 @@ public GeneratorGalore(IEventBus modEventBus, ModContainer modContainer) {
CREATIVE_MODE_TABS.register(modEventBus);
CONDITION_CODECS.register(modEventBus);
INGREDIENT_TYPES.register(modEventBus);
DATA_COMPONENTS.register(modEventBus);

modEventBus.addListener(this::registerPayloadHandlers);
modEventBus.addListener(this::addCreative);
modEventBus.addListener(this::registerDataMap);
modEventBus.addListener(this::registerCapabilities);

modContainer.registerConfig(ModConfig.Type.SERVER, Config.SERVER_CONFIG);
modContainer.registerConfig(ModConfig.Type.CLIENT, Config.CLIENT_CONFIG);
}

@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD, modid = MODID)
public static class EventHandler
{
@SubscribeEvent
public static void buildContents(BuildCreativeModeTabContentsEvent event) {
if (event.getTab().equals(TAB.get())) {
for (DeferredHolder<Item, ? extends Item> item: GeneratorGalore.ITEMS.getEntries()) {
event.accept(item.get());
private void registerPayloadHandlers(RegisterPayloadHandlersEvent event) {
ModPackets.registerPackets(event);
}

private void addCreative(BuildCreativeModeTabContentsEvent event) {
if (event.getTabKey().equals(TAB.getKey())) {
// Wir nutzen NUR ITEMS, da dort ALLES (Generatoren + Upgrades) landet.
// Das verhindert Doppeleinträge und wir können zentral filtern.
ITEMS.getEntries().forEach(itemHolder -> {
String path = itemHolder.getId().getPath();

// Wir schmeißen nur die 8x und 64x GENERATOREN raus.
// Upgrades (wie "upgrade_8x") bleiben drin, falls sie nicht exakt so enden.
if (!path.endsWith("_8x") && !path.endsWith("_64x")) {
event.accept(itemHolder.get());
}
}
});
}
}

@SubscribeEvent
private static void registerDataMap(final RegisterDataMapTypesEvent event) {
event.register(FLUID_FUEL_MAP);
event.register(SOLID_FUEL_MAP);
}
private void registerDataMap(final RegisterDataMapTypesEvent event) {
event.register(FLUID_FUEL_MAP);
event.register(SOLID_FUEL_MAP);
}

@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
GeneratorRegistry.generators.values().forEach(generatorObject -> {
event.registerBlockEntity(
Capabilities.ItemHandler.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.generator.getFuelType().equals(GeneratorUtil.FuelType.FLUID) ? null : myBlockEntity.inventoryHandler
);
event.registerBlockEntity(
Capabilities.EnergyStorage.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.energyHandler
);
event.registerBlockEntity(
Capabilities.FluidHandler.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.generator.getFuelType().equals(GeneratorUtil.FuelType.FLUID) ? myBlockEntity.fluidInventory : null
);
});
}
private void registerCapabilities(RegisterCapabilitiesEvent event) {
GeneratorRegistry.generators.values().forEach(generatorObject -> {
event.registerBlockEntity(
Capabilities.ItemHandler.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.generator.getFuelType().equals(GeneratorUtil.FuelType.FLUID) ? null : myBlockEntity.inventoryHandler
);
event.registerBlockEntity(
Capabilities.EnergyStorage.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.energyHandler
);
event.registerBlockEntity(
Capabilities.FluidHandler.BLOCK,
generatorObject.getBlockEntityType().get(),
(myBlockEntity, side) -> myBlockEntity.generator.getFuelType().equals(GeneratorUtil.FuelType.FLUID) ? myBlockEntity.fluidInventory : null
);
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public class Generator extends BaseEntityBlock
.apply(builder, Generator::new)
);

GeneratorObject generator;
private final GeneratorObject generator;
private final int modifier;

public Generator(Properties properties, GeneratorObject generator, int modifier) {
Expand Down Expand Up @@ -120,31 +120,13 @@ protected ItemInteractionResult useItemOn(ItemStack pStack, BlockState pState, L
protected InteractionResult useWithoutItem(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, BlockHitResult pHitResult) {
if (pLevel.getBlockEntity(pPos) instanceof GeneratorBlockEntity generatorBlockEntity) {
if (!pLevel.isClientSide) {
generatorBlockEntity.refreshConnectedTileEntityCache();
pPlayer.openMenu(generatorBlockEntity, packetBuffer -> packetBuffer.writeBlockPos(pPos));
}
return InteractionResult.SUCCESS_NO_ITEM_USED;
}
return super.useWithoutItem(pState, pLevel, pPos, pPlayer, pHitResult);
}

@Override
public void onPlace(BlockState state, Level level, BlockPos pos, BlockState newState, boolean something) {
BlockEntity generatorTile = level.getBlockEntity(pos);
if (generatorTile instanceof GeneratorBlockEntity generatorBlockEntity) {
generatorBlockEntity.refreshConnectedTileEntityCache();
}
super.onPlace(state, level, pos, newState, something);
}

@Override
public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor level, BlockPos pos, BlockPos facingPos) {
BlockEntity generatorTile = level.getBlockEntity(pos);
if (generatorTile instanceof GeneratorBlockEntity generatorBlockEntity) {
generatorBlockEntity.refreshConnectedTileEntityCache();
}
return super.updateShape(state, direction, newState, level, pos, facingPos);
}

@Override
public void animateTick(BlockState pState, Level level, BlockPos pos, RandomSource random) {
Expand All @@ -161,7 +143,7 @@ public void animateTick(BlockState pState, Level level, BlockPos pos, RandomSour
level.addParticle(ParticleTypes.SMOKE, d0, d1, d2, 0.0D, 0.0D, 0.0D);
break;
case ENCHANTMENT:
// level.addParticle(ModParticles.RISING_ENCHANT_PARTICLE.get(), (double) pos.getX() + 0.5D, (double) pos.getY() + 1.0D, (double) pos.getZ() + 0.5D, random.nextFloat() / 2.0F, 5.0E-5D, random.nextFloat() / 2.0F);
// Enchantment particle effect disabled for now
break;
default:
level.addParticle(ParticleTypes.LAVA, (double) pos.getX() + 0.5D, (double) pos.getY() + 1.0D, (double) pos.getZ() + 0.5D, random.nextFloat() / 2.0F, 5.0E-5D, random.nextFloat() / 2.0F);
Expand Down
Loading