diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 7c52c25c14..dcb0559407 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -251,6 +251,7 @@ "block.gtceu.ev_macerator": "ɹ§III ɹoʇɐɹǝɔɐW pǝɔuɐʌpⱯϛ§", "block.gtceu.ev_machine_casing": "buısɐƆ ǝuıɥɔɐW ΛƎ", "block.gtceu.ev_machine_hull": "ןןnH ǝuıɥɔɐWɟ§ ΛƎϛ§", + "block.gtceu.ev_magic_energy_absorber": "ɹǝqɹosqⱯ ʎbɹǝuƎ ɔıbɐW", "block.gtceu.ev_mixer": "ɹ§III ɹǝxıW pǝɔuɐʌpⱯϛ§", "block.gtceu.ev_muffler_hatch": "ΛƎϛ§ ɥɔʇɐH ɹǝןɟɟnW", "block.gtceu.ev_ore_washer": "ɹ§III ɹǝɥsɐM ǝɹO pǝɔuɐʌpⱯϛ§", @@ -2853,6 +2854,14 @@ "gtceu.machine.machine_hatch.locked": "pǝʞɔoꞀ ǝɔɐɟɹǝʇuI ǝuıɥɔɐW", "gtceu.machine.machine_hatch.processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı ʞɹoʍ ʇɐɥʇ sǝuıɥɔɐɯ spןoɥ ʎןuo 'ㄥ§ʎɐɹɹⱯ buıssǝɔoɹԀǝ§ ǝɥʇ uı uǝɥM", "gtceu.machine.machine_hatch.tooltip": "sɯǝʇı pıןɐʌ spןoɥ ʎןuo ʇɐɥʇ snᗺ ssǝɔɔⱯ pǝzıןɐıɔǝdS", + "gtceu.machine.magic_energy_absorber.name": "ɹǝqɹosqⱯ ʎbɹǝuƎ ɔıbɐW", + "gtceu.machine.magic_energy_absorber.tooltip.0": "", + "gtceu.machine.magic_energy_absorber.tooltip.1": "˙sʞɔoןq ㄥ§ㄣ9ɹ§ uıɥʇıʍ puƎ ǝɥʇ uı sɹɐןןıd uɐıpısqo pǝʇɐɹǝuǝb ʎןןɐɹnʇɐu uoㄥ§ ɹ§sןɐʇsʎɹƆ puƎq§ ɯoɹɟ ʎbɹǝuǝ sʇɔǝןןoƆㄥ§", + "gtceu.machine.magic_energy_absorber.tooltip.2": "ʇndʇno oʇ ㄥ§ʇ/∩Ǝ ᄅƐɹ§ sppɐㄥ§ ɹ§ןɐʇsʎɹƆ puƎq§ ɥɔɐƎㄥ§", + "gtceu.machine.magic_energy_absorber.tooltip.3": "ʇndʇno ʎɟıןdɯɐ oʇ doʇ uoㄥ§ ɹ§bbƎ uobɐɹᗡp§ ǝɔɐןԀㄥ§", + "gtceu.machine.magic_energy_absorber.tooltip.4": "", + "gtceu.machine.magic_energy_absorber.tooltip.5": ":pǝıɟıןdɯɐ uǝɥMㄥ§", + "gtceu.machine.magic_energy_absorber.tooltip.6": "ʇ/∩Ǝ 8ᄅƖɹ§ sppɐㄥ§ ɹ§ןɐʇsʎɹƆ puƎq§ ɥɔɐƎㄥ§", "gtceu.machine.maintenance_hatch.tooltip": "sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ɹoℲ", "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.0": "¡buıuɐǝןƆ ɥʇıʍ sʞɔoןqıʇןnW buıuıɐʇuıɐɯ ʎןןɐɔıʇɐɯoʇnɐ ɹoℲ", "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.1": ":sɐ suɐǝןƆ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6c8d4c0ec4..46b96e5072 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -251,6 +251,7 @@ "block.gtceu.ev_macerator": "§5Advanced Macerator III§r", "block.gtceu.ev_machine_casing": "EV Machine Casing", "block.gtceu.ev_machine_hull": "§5EV §fMachine Hull", + "block.gtceu.ev_magic_energy_absorber": "Magic Energy Absorber", "block.gtceu.ev_mixer": "§5Advanced Mixer III§r", "block.gtceu.ev_muffler_hatch": "Muffler Hatch §5EV", "block.gtceu.ev_ore_washer": "§5Advanced Ore Washer III§r", @@ -2853,6 +2854,14 @@ "gtceu.machine.machine_hatch.locked": "Machine Interface Locked", "gtceu.machine.machine_hatch.processing_array": "When in the §eProcessing Array§7, only holds machines that work in the §eProcessing Array", "gtceu.machine.machine_hatch.tooltip": "Specialized Access Bus that only holds valid items", + "gtceu.machine.magic_energy_absorber.name": "Magic Energy Absorber", + "gtceu.machine.magic_energy_absorber.tooltip.0": "", + "gtceu.machine.magic_energy_absorber.tooltip.1": "§7Collects energy from §bEnd Crystals§r §7on naturally generated obsidian pillars in the End within §r64§7 blocks.", + "gtceu.machine.magic_energy_absorber.tooltip.2": "§7Each §bEnd Crystal§r §7adds §r32 EU/t§7 to output", + "gtceu.machine.magic_energy_absorber.tooltip.3": "§7Place §dDragon Egg§r §7on top to amplify output", + "gtceu.machine.magic_energy_absorber.tooltip.4": "", + "gtceu.machine.magic_energy_absorber.tooltip.5": "§7When amplified:", + "gtceu.machine.magic_energy_absorber.tooltip.6": "§7Each §bEnd Crystal§r §7adds §r128 EU/t", "gtceu.machine.maintenance_hatch.tooltip": "For maintaining Multiblocks", "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.0": "For automatically maintaining Multiblocks with Cleaning!", "gtceu.machine.maintenance_hatch_cleanroom_auto.tooltip.1": "Cleans as:", diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index bf33252a42..1c7b9d7a1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -473,6 +473,24 @@ public class GTMachines { .register(), LV, MV, HV, EV); + public static final MachineDefinition[] MAGIC_ENERGY_ABSORBER = registerTieredMachines("magic_energy_absorber", + MagicEnergyAbsorberMachine::new, + (tier, builder) -> builder + .rotationState(RotationState.NONE) + .langValue("Magic Energy Absorber") + .workableTieredHullRenderer(GTCEu.id("block/machines/magic_energy_absorber")) + .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier]), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 0), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 1), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 2), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 3), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 4), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 5), + LangHandler.getFromMultiLang("gtceu.machine.magic_energy_absorber.tooltip", 6)) + .register(), + EV); + ////////////////////////////////////// // ********* Storage *********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MagicEnergyAbsorberMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MagicEnergyAbsorberMachine.java new file mode 100644 index 0000000000..0de7289d5f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MagicEnergyAbsorberMachine.java @@ -0,0 +1,279 @@ +package com.gregtechceu.gtceu.common.machine.electric; + +import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.enderdragon.phases.DragonChargePlayerPhase; +import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.DragonEggBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.SpikeFeature; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class MagicEnergyAbsorberMachine extends TieredEnergyMachine implements IWorkable { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MagicEnergyAbsorberMachine.class, + TieredEnergyMachine.MANAGED_FIELD_HOLDER); + private static final double DRAGON_DISTANCE_THRESHOLD = 5; + + @Persisted + @Getter + @Setter + protected long baseEUPerFeature; + @Persisted + @Getter + @Setter + protected long amplifierMultiplier; + @Persisted + @Getter + @Setter + protected boolean hasAmplifier; + @Getter + protected IntList connectedFeatures; + @DescSynced + @RequireRerender + protected int numFeatures; + @Getter + @Setter + @Persisted + @DescSynced + @RequireRerender + protected boolean workingEnabled = true; + + // subscriptions + protected TickableSubscription onServerTickSubscription; + + public MagicEnergyAbsorberMachine(IMachineBlockEntity holder, int tier, Object... args) { + this(holder, tier, 32, 4, args); + } + + protected MagicEnergyAbsorberMachine(IMachineBlockEntity holder, int tier, long baseEUPerFeature, + long amplifierMultiplier, Object... args) { + super(holder, tier, args); + this.baseEUPerFeature = baseEUPerFeature; + this.amplifierMultiplier = amplifierMultiplier; + this.connectedFeatures = new IntArrayList(); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + protected boolean isEnergyEmitter() { + return true; + } + + @Override + protected long getMaxInputOutputAmperage() { + return 1; + } + + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) { + updateServerTickSubscription(); + onServerTick(true); + } + } + + protected void updateServerTickSubscription() { + onServerTickSubscription = this.subscribeServerTick(onServerTickSubscription, () -> onServerTick(false)); + } + + @Override + public void onUnload() { + super.onUnload(); + if (!isRemote()) { + resetConnectedFeatures(); + if (onServerTickSubscription != null) + this.unsubscribe(onServerTickSubscription); + } + } + + protected void onServerTick(boolean force) { + if (!workingEnabled || !(getLevel() instanceof ServerLevel serverLevel) || + serverLevel.dimension() != Level.END) { + return; + } + + if (force || getOffsetTimer() % 20 == 0) { + updateAmplifierStatus(); + } + + if (force || getOffsetTimer() % 200 == 0) { + updateConnectedFeatures(); + } + + if (force || !serverLevel.getDragons().isEmpty()) { + updateCrystalTargets(); + } + + if (connectedFeatures.isEmpty()) { + return; + } + + long energyPer = this.baseEUPerFeature * (hasAmplifier ? this.amplifierMultiplier : 1); + long energyGenerated = 0; + // double check end crystals + for (int i = 0; i < connectedFeatures.size(); i++) { + if (getLevel().getEntity(connectedFeatures.getInt(i)) instanceof EndCrystal) + energyGenerated += energyPer; + } + + if (energyGenerated > 0) { + energyContainer.changeEnergy(energyGenerated); + } + } + + protected void updateAmplifierStatus() { + if (getLevel() == null) { + this.hasAmplifier = false; + return; + } + + BlockState blockState = getLevel().getBlockState(getPos().above()); + this.hasAmplifier = blockState.getBlock() instanceof DragonEggBlock; + } + + protected void updateConnectedFeatures() { + this.connectedFeatures.clear(); + if (getLevel() == null) { + return; + } + + // get all natural end crystals + final double maxDistance = 4096; // (64^2) + List endCrystals = SpikeFeature.getSpikesForLevel((WorldGenLevel) getLevel()).stream() + .map(spike -> getLevel().getEntitiesOfClass(EndCrystal.class, spike.getTopBoundingBox(), + crystal -> crystal.distanceToSqr(getPos().getCenter()) < maxDistance)) + .reduce(new ArrayList<>(), (lst, crystalList) -> { + if (!crystalList.isEmpty()) + lst.add(crystalList.get(0)); + return lst; + }); + + // set end crystals beam target to this generator + endCrystals.forEach(endCrystal -> { + BlockPos beamTarget = endCrystal.getBeamTarget(); + if (getPos().equals(beamTarget)) { + this.connectedFeatures.add(endCrystal.getId()); + } else if (beamTarget == null) { + endCrystal.setBeamTarget(getPos()); + this.connectedFeatures.add(endCrystal.getId()); + } + }); + numFeatures = this.connectedFeatures.size(); + } + + protected void checkDragonProximity(EnderDragon dragon) { + if (getPos().getCenter().distanceTo(dragon.position()) < DRAGON_DISTANCE_THRESHOLD) { + this.doExplosion(GTUtil.getExplosionPower(tier)); + } + } + + protected void updateCrystalTargets() { + if (getLevel() == null) { + return; + } + // ender dragon check + List dragonsInRange = ((ServerLevel) getLevel()).getDragons(); + + for (EnderDragon dragon : dragonsInRange) { + checkDragonProximity(dragon); + if (dragon.nearestCrystal != null && connectedFeatures.contains(dragon.nearestCrystal.getId())) { + dragon.nearestCrystal = null; + + if (dragon.getPhaseManager().getCurrentPhase().getPhase() == EnderDragonPhase.HOLDING_PATTERN) { + dragon.hurt(dragon.damageSources().explosion(dragon, dragon), 10.0f); + dragon.getPhaseManager().setPhase(EnderDragonPhase.CHARGING_PLAYER); + ((DragonChargePlayerPhase) dragon.getPhaseManager().getCurrentPhase()) + .setTarget(getPos().below(2).getCenter()); + } + } + } + } + + protected void resetConnectedFeatures() { + if (getLevel() == null) { + connectedFeatures.clear(); + return; + } + + for (int id : connectedFeatures) { + Entity entity = getLevel().getEntity(id); + + if (!(entity instanceof EndCrystal endCrystal)) { + continue; + } + + if (getPos().equals(endCrystal.getBeamTarget())) { + endCrystal.setBeamTarget(null); + } + } + + connectedFeatures.clear(); + } + + @Override + @SideOnly(Side.CLIENT) + public void animateTick(RandomSource random) { + if (getLevel() == null || !isActive() || this.hasAmplifier) { + return; + } + BlockPos pos = getPos(); + for (int i = 0; i < 4; i++) { + getLevel().addParticle(ParticleTypes.PORTAL, pos.getX(), pos.getY(), pos.getZ(), + (random.nextFloat() - 0.5f) * 0.5f, (random.nextFloat() - 0.5f) * 0.5f, + (random.nextFloat() - 0.5f) * 0.5f); + } + } + + @Override + public int getProgress() { + return 1; + } + + @Override + public int getMaxProgress() { + return 1; + } + + @Override + public boolean isActive() { + return isWorkingEnabled() && numFeatures > 0; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index 367d156e20..33a2db77ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -410,6 +410,11 @@ protected static void init(RegistrateLangProvider provider) { provider.add("gtceu.forming_press.naming.to_name", "§oItem to Name"); provider.add("gtceu.forming_press.naming.named", "§oNamed Item"); + // magic energy absorber + provider.add("gtceu.machine.magic_energy_absorber.name", "Magic Energy Absorber"); + multilineLang(provider, "gtceu.machine.magic_energy_absorber.tooltip", + "\n§7Collects energy from §bEnd Crystals§r §7on naturally generated obsidian pillars in the End within §r64§7 blocks.\n§7Each §bEnd Crystal§r §7adds §r32 EU/t§7 to output\n§7Place §dDragon Egg§r §7on top to amplify output\n\n§7When amplified:\n§7Each §bEnd Crystal§r §7adds §r128 EU/t"); + // Scanner provider.add("gtceu.scanner.copy_stick_from", "§oStick to Copy"); provider.add("gtceu.scanner.copy_stick_empty", "§oEmpty Stick"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index dab0320afd..d284cde6a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -856,6 +856,8 @@ public static void init(Consumer provider) { CIRCUIT, 'W', CABLE, 'S', Tags.Items.CHESTS_WOODEN, 'G', GRINDER); registerMachineRecipe(provider, GTMachines.MINER, "MMM", "WHW", "CSC", 'M', MOTOR, 'W', CABLE, 'H', HULL, 'C', CIRCUIT, 'S', SENSOR); + registerMachineRecipe(provider, GTMachines.MAGIC_ENERGY_ABSORBER, "PCP", "PMP", "PCP", 'M', HULL, 'P', SENSOR, + 'C', CIRCUIT); registerMachineRecipe(provider, GTMachines.MUFFLER_HATCH, "HM", "PR", 'H', HULL, 'M', MOTOR, 'P', PIPE_NORMAL, 'R', ROTOR); diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/side.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/side.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/side.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_active.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/side.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_active.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/side_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_active_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/side_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_active_emissive.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/side_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/side_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_back_emissive.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/bottom.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/bottom.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/bottom.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_active.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/bottom.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_active.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/bottom_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_active_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/bottom_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_active_emissive.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/bottom_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/bottom_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_bottom_emissive.png diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front.png new file mode 100644 index 0000000000..94b136274b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active.png new file mode 100644 index 0000000000..c05bbc4f82 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active_emissive.png new file mode 100644 index 0000000000..cbe43d8712 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_emissive.png new file mode 100644 index 0000000000..1dafef6832 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side.png new file mode 100644 index 0000000000..94b136274b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active.png new file mode 100644 index 0000000000..c05bbc4f82 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active_emissive.png new file mode 100644 index 0000000000..cbe43d8712 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_active_emissive.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_emissive.png new file mode 100644 index 0000000000..1dafef6832 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_side_emissive.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/top.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/top.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/top.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_active.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/top.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_active.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/top_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_active_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/active/top_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_active_emissive.png diff --git a/src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/top_emissive.png b/src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_emissive.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/casings/magic/absorber/normal/top_emissive.png rename to src/main/resources/assets/gtceu/textures/block/machines/magic_energy_absorber/overlay_top_emissive.png