Skip to content

Commit

Permalink
Add BlockEntityTypeBlockSupportCallback
Browse files Browse the repository at this point in the history
  • Loading branch information
FirstMegaGame4 committed Nov 15, 2023
1 parent 28c1deb commit 909c7b2
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mmodding.mmodding_lib.ducks;

import com.mmodding.mmodding_lib.library.blockentities.BlockEntityTypeBlockSupportCallback;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import org.quiltmc.qsl.base.api.event.Event;

public interface BlockEntityTypeDuckInterface {

Event<BlockEntityTypeBlockSupportCallback> mmodding_lib$supportBlocksCallback();

static <T extends BlockEntity> BlockEntityTypeDuckInterface get(BlockEntityType<T> blockEntityType) {
if (!(blockEntityType instanceof BlockEntityTypeDuckInterface)) {
throw new IllegalArgumentException("Unsupported BlockEntityType: " + blockEntityType);
}
return (BlockEntityTypeDuckInterface) blockEntityType;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mmodding.mmodding_lib.library.blockentities;

import com.mmodding.mmodding_lib.ducks.BlockEntityTypeDuckInterface;
import net.minecraft.block.Block;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import org.quiltmc.qsl.base.api.event.Event;

import java.util.List;

public interface BlockEntityTypeBlockSupportCallback {

void onSupportedBlocks(List<Block> supportedBlocks);

static <T extends BlockEntity> Event<BlockEntityTypeBlockSupportCallback> blockEntityType(BlockEntityType<T> blockEntityType) {
return BlockEntityTypeDuckInterface.get(blockEntityType).mmodding_lib$supportBlocksCallback();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.mmodding.mmodding_lib.mixin.injectors;

import com.mmodding.mmodding_lib.ducks.BlockEntityTypeDuckInterface;
import com.mmodding.mmodding_lib.library.blockentities.BlockEntityTypeBlockSupportCallback;
import com.mojang.datafixers.types.Type;
import net.minecraft.block.Block;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import org.quiltmc.qsl.base.api.event.Event;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Mixin(BlockEntityType.class)
public class BlockEntityTypeMixin<T extends BlockEntity> implements BlockEntityTypeDuckInterface {

@Unique
private final Event<BlockEntityTypeBlockSupportCallback> supportBlocksCallBack = Event.create(BlockEntityTypeBlockSupportCallback.class, callbacks -> supportedBlocks -> {
for (BlockEntityTypeBlockSupportCallback callback : callbacks) {
callback.onSupportedBlocks(supportedBlocks);
}
});

@Shadow
private Set<Block> blocks;

@Inject(method = "<init>", at = @At("TAIL"))
private void init(BlockEntityType.BlockEntityFactory<T> factory, Set<Block> blocks, Type<?> type, CallbackInfo ci) {
Set<Block> previousBlocks = new HashSet<>(this.blocks);
List<Block> eventBlocks = new ArrayList<>(previousBlocks.stream().toList());
this.mmodding_lib$supportBlocksCallback().invoker().onSupportedBlocks(eventBlocks);
previousBlocks.addAll(eventBlocks);
this.blocks = previousBlocks;
}

@Override
public Event<BlockEntityTypeBlockSupportCallback> mmodding_lib$supportBlocksCallback() {
return this.supportBlocksCallBack;
}
}
1 change: 1 addition & 0 deletions src/main/resources/mmodding_lib.accesswidener
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ extendable class net/minecraft/client/render/RenderLayer$MultiPhase
extendable class net/minecraft/client/render/RenderLayer$MultiPhaseParameters
extendable class net/minecraft/world/gen/chunk/NoiseChunkGenerator

mutable field net/minecraft/block/entity/BlockEntityType blocks Ljava/util/Set;
mutable field net/minecraft/world/dimension/AreaHelper width I
mutable field net/minecraft/world/gen/chunk/ChunkNoiseSampler blockStateSampler Lnet/minecraft/world/gen/chunk/ChunkNoiseSampler$BlockStateSampler;

Expand Down
1 change: 1 addition & 0 deletions src/main/resources/mmodding_lib.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"injectors.AbstractFireBlockMixin",
"injectors.AnimalEntityMixin",
"injectors.AnvilScreenHandlerMixin",
"injectors.BlockEntityTypeMixin",
"injectors.BlockMixin",
"injectors.BootstrapMixin",
"injectors.BowItemMixin",
Expand Down

0 comments on commit 909c7b2

Please sign in to comment.