Skip to content

Commit

Permalink
feat: Update to Minecraft 1.20.4
Browse files Browse the repository at this point in the history
  • Loading branch information
BlayTheNinth committed Dec 20, 2023
1 parent f8bc6b1 commit 15457c8
Show file tree
Hide file tree
Showing 12 changed files with 97 additions and 126 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import net.blay09.mods.balm.api.BalmHooks;
import net.blay09.mods.balm.api.BalmRegistries;
import net.blay09.mods.balm.api.BalmRuntime;
import net.blay09.mods.balm.api.EmptyLoadContext;
import net.blay09.mods.balm.api.block.BalmBlockEntities;
import net.blay09.mods.balm.api.block.BalmBlocks;
import net.blay09.mods.balm.api.command.BalmCommands;
Expand Down Expand Up @@ -52,7 +53,7 @@
import java.util.concurrent.Executor;
import java.util.function.Consumer;

public class FabricBalmRuntime implements BalmRuntime {
public class FabricBalmRuntime implements BalmRuntime<EmptyLoadContext> {
private final BalmWorldGen worldGen = new FabricBalmWorldGen();
private final BalmBlocks blocks = new FabricBalmBlocks();
private final BalmBlockEntities blockEntities = new FabricBalmBlockEntities();
Expand Down Expand Up @@ -188,6 +189,11 @@ public <T> SidedProxy<T> sidedProxy(String commonName, String clientName) {

@Override
public void initialize(String modId, Runnable initializer) {
initialize(modId, EmptyLoadContext.INSTANCE, initializer);
}

@Override
public void initialize(String modId, EmptyLoadContext context, Runnable initializer) {
initializer.run();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import net.blay09.mods.balm.api.BalmHooks;
import net.blay09.mods.balm.api.BalmRegistries;
import net.blay09.mods.balm.api.BalmRuntime;
import net.blay09.mods.balm.api.EmptyLoadContext;
import net.blay09.mods.balm.api.block.BalmBlockEntities;
import net.blay09.mods.balm.api.block.BalmBlocks;
import net.blay09.mods.balm.api.command.BalmCommands;
Expand Down Expand Up @@ -51,7 +52,7 @@
import java.util.List;
import java.util.function.Consumer;

public class ForgeBalmRuntime implements BalmRuntime {
public class ForgeBalmRuntime implements BalmRuntime<EmptyLoadContext> {
private final BalmWorldGen worldGen = new ForgeBalmWorldGen();
private final BalmBlocks blocks = new ForgeBalmBlocks();
private final BalmBlockEntities blockEntities = new ForgeBalmBlockEntities();
Expand Down Expand Up @@ -173,6 +174,11 @@ public String getModName(String modId) {

@Override
public void initialize(String modId, Runnable initializer) {
initialize(modId, EmptyLoadContext.INSTANCE, initializer);
}

@Override
public void initialize(String modId, EmptyLoadContext context, Runnable initializer) {
((ForgeBalmItems) items).register();
((ForgeBalmEntities) entities).register();
((ForgeBalmWorldGen) worldGen).register();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,98 +1,17 @@
package net.blay09.mods.balm.api.block.entity;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.mojang.datafixers.util.Pair;
import net.blay09.mods.balm.api.Balm;
import net.blay09.mods.balm.api.energy.EnergyStorage;
import net.blay09.mods.balm.api.fluid.FluidTank;
import net.blay09.mods.balm.api.provider.BalmProvider;
import net.blay09.mods.balm.api.provider.BalmProviderHolder;
import net.blay09.mods.balm.neoforge.container.BalmInvWrapper;
import net.blay09.mods.balm.neoforge.energy.NeoForgeEnergyStorage;
import net.blay09.mods.balm.neoforge.fluid.NeoForgeFluidTank;
import net.blay09.mods.balm.neoforge.provider.NeoForgeBalmProviders;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.Container;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.common.capabilities.Capabilities;
import net.neoforged.neoforge.common.capabilities.Capability;
import net.neoforged.neoforge.common.util.LazyOptional;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class BalmBlockEntityBase extends BlockEntity {

private final Map<Capability<?>, LazyOptional<?>> capabilities = new HashMap<>();
private final Table<Capability<?>, Direction, LazyOptional<?>> sidedCapabilities = HashBasedTable.create();
private boolean capabilitiesInitialized;

public BalmBlockEntityBase(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}

private void addCapabilities(BalmProvider<?> provider, Map<Capability<?>, LazyOptional<?>> capabilities) {
NeoForgeBalmProviders forgeProviders = (NeoForgeBalmProviders) Balm.getProviders();
Capability<?> capability = forgeProviders.getCapability(provider.getProviderClass());
capabilities.put(capability, LazyOptional.of(provider::getInstance));

if (provider.getProviderClass() == Container.class) {
capabilities.put(Capabilities.ITEM_HANDLER, LazyOptional.of(() -> new BalmInvWrapper((Container) provider.getInstance())));
} else if (provider.getProviderClass() == FluidTank.class) {
capabilities.put(Capabilities.FLUID_HANDLER, LazyOptional.of(() -> new NeoForgeFluidTank((FluidTank) provider.getInstance())));
} else if (provider.getProviderClass() == EnergyStorage.class) {
capabilities.put(Capabilities.ENERGY, LazyOptional.of(() -> new NeoForgeEnergyStorage((EnergyStorage) provider.getInstance())));
}
}

@SuppressWarnings("unchecked")
public <T> T getProvider(Class<T> clazz) {
NeoForgeBalmProviders forgeProviders = (NeoForgeBalmProviders) Balm.getProviders();
Capability<?> capability = forgeProviders.getCapability(clazz);
return (T) getCapability(capability).resolve().orElse(null);
}

@NotNull
@Override
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
if (!capabilitiesInitialized) {
List<Object> providers = new ArrayList<>();
buildProviders(providers);

for (Object holder : providers) {
BalmProviderHolder providerHolder = (BalmProviderHolder) holder;
for (BalmProvider<?> provider : providerHolder.getProviders()) {
addCapabilities(provider, capabilities);
}

for (Pair<Direction, BalmProvider<?>> pair : providerHolder.getSidedProviders()) {
Direction direction = pair.getFirst();
BalmProvider<?> provider = pair.getSecond();
Map<Capability<?>, LazyOptional<?>> sidedCapabilities = this.sidedCapabilities.column(direction);
addCapabilities(provider, sidedCapabilities);
}
}
capabilitiesInitialized = true;
}

LazyOptional<?> result = null;
if (side != null) {
result = sidedCapabilities.get(cap, side);
}
if (result == null) {
result = capabilities.get(cap);
}
return result != null ? result.cast() : super.getCapability(cap, side);
}

protected abstract void buildProviders(List<Object> providers);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@

import net.blay09.mods.balm.api.Balm;
import net.blay09.mods.balm.api.config.AbstractBalmConfig;
import net.blay09.mods.balm.api.energy.EnergyStorage;
import net.blay09.mods.balm.api.fluid.FluidTank;
import net.blay09.mods.balm.config.ExampleConfig;
import net.blay09.mods.balm.neoforge.client.NeoForgeBalmClient;
import net.blay09.mods.balm.neoforge.provider.NeoForgeBalmProviders;
import net.blay09.mods.balm.neoforge.world.NeoForgeBalmWorldGen;
import net.minecraft.world.Container;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;
import net.neoforged.neoforge.common.capabilities.CapabilityToken;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.energy.IEnergyStorage;
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem;
Expand All @@ -20,28 +17,18 @@
@Mod("balm")
public class NeoForgeBalm {

public NeoForgeBalm() {
public NeoForgeBalm(IEventBus modBus) {
((AbstractBalmConfig) Balm.getConfig()).initialize();
ExampleConfig.initialize();

NeoForgeBalmWorldGen.initializeBalmBiomeModifiers();
FMLJavaModLoadingContext.get().getModEventBus().addListener(NeoForgeBalmClient::onInitializeClient);
modBus.addListener(NeoForgeBalmClient::onInitializeClient);

NeoForgeBalmProviders providers = (NeoForgeBalmProviders) Balm.getProviders();
providers.register(IItemHandler.class, new CapabilityToken<>() {
});
providers.register(IFluidHandler.class, new CapabilityToken<>() {
});
providers.register(IFluidHandlerItem.class, new CapabilityToken<>() {
});
providers.register(IEnergyStorage.class, new CapabilityToken<>() {
});
providers.register(Container.class, new CapabilityToken<>() {
});
providers.register(FluidTank.class, new CapabilityToken<>() {
});
providers.register(EnergyStorage.class, new CapabilityToken<>() {
});
providers.registerBlockProvider(IItemHandler.class, Capabilities.ItemHandler.BLOCK);
providers.registerBlockProvider(IFluidHandler.class, Capabilities.FluidHandler.BLOCK);
providers.registerItemProvider(IFluidHandlerItem.class, Capabilities.FluidHandler.ITEM);
providers.registerBlockProvider(IEnergyStorage.class, Capabilities.EnergyStorage.BLOCK);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
import net.minecraft.world.item.BoneMealItem;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.phys.BlockHitResult;
import net.neoforged.bus.api.Event;
import net.neoforged.neoforge.common.CommonHooks;
import net.neoforged.neoforge.common.EffectCures;
import net.neoforged.neoforge.common.ToolActions;
import net.neoforged.neoforge.common.util.FakePlayer;
import net.neoforged.neoforge.event.EventHooks;
Expand Down Expand Up @@ -67,7 +69,11 @@ public CompoundTag getPersistentData(Entity entity) {

@Override
public void curePotionEffects(LivingEntity entity, ItemStack curativeItem) {
entity.curePotionEffects(curativeItem);
if (curativeItem.getItem() == Items.MILK_BUCKET) {
entity.removeEffectsCuredBy(EffectCures.MILK);
} else if (curativeItem.getItem() == Items.HONEY_BOTTLE) {
entity.removeEffectsCuredBy(EffectCures.HONEY);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModList;
import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;
Expand All @@ -53,7 +52,7 @@
import java.util.List;
import java.util.function.Consumer;

public class NeoForgeBalmRuntime implements BalmRuntime {
public class NeoForgeBalmRuntime implements BalmRuntime<NeoForgeLoadContext> {
private final BalmWorldGen worldGen = new NeoForgeBalmWorldGen();
private final BalmBlocks blocks = new NeoForgeBalmBlocks();
private final BalmBlockEntities blockEntities = new NeoForgeBalmBlockEntities();
Expand Down Expand Up @@ -175,16 +174,20 @@ public String getModName(String modId) {

@Override
public void initialize(String modId, Runnable initializer) {
initialize(modId, new NeoForgeLoadContext(FMLJavaModLoadingContext.get().getModEventBus()), initializer);
}

@Override
public void initialize(String modId, NeoForgeLoadContext context, Runnable initializer) {
((NeoForgeBalmItems) items).register();
((NeoForgeBalmEntities) entities).register();
((NeoForgeBalmWorldGen) worldGen).register();
((NeoForgeBalmStats) stats).register();

initializer.run();

IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
modEventBus.addListener((FMLLoadCompleteEvent event) -> initializeAddons());
DeferredRegisters.register(modId, modEventBus);
final var modBus = context.modBus();
modBus.addListener((FMLLoadCompleteEvent event) -> initializeAddons());
DeferredRegisters.register(modId, modBus);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.blay09.mods.balm.neoforge;

import net.blay09.mods.balm.api.BalmRuntimeLoadContext;
import net.neoforged.bus.api.IEventBus;

public record NeoForgeLoadContext(IEventBus modBus) implements BalmRuntimeLoadContext {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,41 +4,63 @@
import net.minecraft.core.Direction;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.neoforged.neoforge.common.capabilities.Capability;
import net.neoforged.neoforge.common.capabilities.CapabilityManager;
import net.neoforged.neoforge.common.capabilities.CapabilityToken;
import net.neoforged.neoforge.capabilities.BaseCapability;
import net.neoforged.neoforge.capabilities.BlockCapability;
import net.neoforged.neoforge.capabilities.EntityCapability;
import net.neoforged.neoforge.capabilities.ItemCapability;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;

public class NeoForgeBalmProviders implements BalmProviders {

private final Map<Class<?>, Capability<?>> capabilities = new HashMap<>();
private final Map<Class<?>, BaseCapability<?, ?>> blockCapabilities = new HashMap<>();
private final Map<Class<?>, ItemCapability<?, ?>> itemCapabilities = new HashMap<>();
private final Map<Class<?>, EntityCapability<?, ?>> entityCapabilities = new HashMap<>();

@Override
public <T> T getProvider(BlockEntity blockEntity, Class<T> clazz) {
return getProvider(blockEntity, null, clazz);
}

@Override
@SuppressWarnings("unchecked")
public <T> T getProvider(BlockEntity blockEntity, @Nullable Direction direction, Class<T> clazz) {
Capability<T> capability = getCapability(clazz);
return blockEntity.getCapability(capability, direction).resolve().orElse(null);
final var capability = (BlockCapability<T, Direction>) getBlockCapability(clazz);
return blockEntity.getLevel().getCapability(capability, blockEntity.getBlockPos(), blockEntity.getBlockState(), blockEntity, direction);
}

@Override
public <T> T getProvider(Entity entity, Class<T> clazz) {
Capability<T> capability = getCapability(clazz);
return entity.getCapability(capability).resolve().orElse(null);
final var capability = getEntityCapability(clazz);
return entity.getCapability(capability, null);
}

public <T> void registerBlockProvider(Class<T> clazz, BlockCapability<T, ?> capability) {
blockCapabilities.put(clazz, capability);
}

public <T> void register(Class<T> clazz, CapabilityToken<T> token) {
capabilities.put(clazz, CapabilityManager.get(token));
public <T> void registerItemProvider(Class<T> clazz, ItemCapability<T, ?> capability) {
itemCapabilities.put(clazz, capability);
}

public <T> void registerEntityProvider(Class<T> clazz, EntityCapability<T, ?> capability) {
entityCapabilities.put(clazz, capability);
}

@SuppressWarnings("unchecked")
public <T> BlockCapability<T, ?> getBlockCapability(Class<T> clazz) {
return (BlockCapability<T, ?>) blockCapabilities.get(clazz);
}

@SuppressWarnings("unchecked")
public <T> ItemCapability<T, ?> getItemCapability(Class<T> clazz) {
return (ItemCapability<T, ?>) itemCapabilities.get(clazz);
}

@SuppressWarnings("unchecked")
public <T> Capability<T> getCapability(Class<T> clazz) {
return (Capability<T>) capabilities.get(clazz);
public <T> EntityCapability<T, ?> getEntityCapability(Class<T> clazz) {
return (EntityCapability<T, ?>) entityCapabilities.get(clazz);
}
}
4 changes: 2 additions & 2 deletions neoforge/src/main/resources/META-INF/mods.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ config = "${mod_id}.mixins.json"
config = "${mod_id}.neoforge.mixins.json"
[[dependencies.${mod_id}]]
modId="neoforge"
mandatory=true
type="required"
versionRange="${neoforge_version_range}"
ordering="NONE"
side="BOTH"
[[dependencies.${mod_id}]]
modId="minecraft"
mandatory=true
type="required"
versionRange="${minecraft_version_range}"
ordering="NONE"
side="BOTH"
Loading

0 comments on commit 15457c8

Please sign in to comment.