Skip to content
Draft
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
7 changes: 7 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,13 @@ dependencies {
implementation "mekanism:Mekanism:1.21.1-10.7.4.60:api"

implementation "curse.maven:spark-361579:5759671" // spark-1.10.109-neoforge.jar

implementation "curse.maven:cloth-config-348521:5729127" // cloth-config-15.0.140-neoforge.jar
implementation "curse.maven:powah-rearchitected-633483:5735677" // Powah-6.1.2.jar

implementation "curse.maven:sophisticated-core-618298:5810072" // sophisticatedcore-1.21-0.6.45.722.jar
implementation "curse.maven:sophisticated-backpacks-422301:5787622" // sophisticatedbackpacks-1.21-3.20.17.1113.jar
implementation "curse.maven:sophisticated-storage-619320:5801696" // sophisticatedstorage-1.21-0.10.45.910.jar
}

// This block of code expands all declared replace properties in the specified resource targets.
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/ca/teamdman/sfm/client/gui/screen/ProxyScreen.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ca.teamdman.sfm.client.gui.screen;

import ca.teamdman.sfm.SFM;
import ca.teamdman.sfm.common.containermenu.ProxyContainerMenu;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory;

public class ProxyScreen extends AbstractContainerScreen<ProxyContainerMenu> {
private static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(
SFM.MOD_ID,
"textures/gui/container/proxy.png"
);

public ProxyScreen(
ProxyContainerMenu menu,
Inventory inv,
Component title
) {
super(menu, inv, title);
}

@Override
protected void init() {
super.init();
this.imageWidth = 176;
this.imageHeight = 209;
this.topPos /= 2;
this.inventoryLabelY = 80;
}

@Override
protected void renderBg(GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) {
pGuiGraphics.blit(TEXTURE, this.leftPos, this.topPos, 0, 0, this.imageWidth, this.imageHeight);
}

@Override
public void render(GuiGraphics graphics, int mx, int my, float partialTicks) {
super.render(graphics, mx, my, partialTicks);
this.renderTooltip(graphics, mx, my);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import ca.teamdman.sfm.SFM;
import ca.teamdman.sfm.client.gui.screen.ManagerScreen;
import ca.teamdman.sfm.client.gui.screen.ProxyScreen;
import ca.teamdman.sfm.common.registry.SFMMenus;
import net.minecraft.client.gui.screens.MenuScreens;
import net.neoforged.bus.api.SubscribeEvent;
Expand All @@ -13,5 +14,6 @@ public class SFMMenuScreens {
@SubscribeEvent
public static void register(RegisterMenuScreensEvent event) {
event.register(SFMMenus.MANAGER_MENU.get(), ManagerScreen::new);
event.register(SFMMenus.PROXY_MENU.get(), ProxyScreen::new);
}
}
72 changes: 72 additions & 0 deletions src/main/java/ca/teamdman/sfm/common/block/ProxyBlock.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package ca.teamdman.sfm.common.block;

import ca.teamdman.sfm.common.blockentity.ProxyBlockEntity;
import ca.teamdman.sfm.common.containermenu.ProxyContainerMenu;
import ca.teamdman.sfm.common.registry.SFMBlockEntities;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BaseEntityBlock;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import org.apache.commons.lang3.NotImplementedException;
import org.jetbrains.annotations.Nullable;

public class ProxyBlock extends BaseEntityBlock implements EntityBlock {
public ProxyBlock() {
super(Properties.of()
.destroyTime(2)
.sound(SoundType.METAL));
}

@Override
protected MapCodec<? extends BaseEntityBlock> codec() {
throw new NotImplementedException("This isn't used until 1.20.5 apparently");
}

public RenderShape getRenderShape(BlockState state) {
return RenderShape.MODEL;
}

@Override
public @Nullable BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) {
return SFMBlockEntities.PROXY_BLOCK_ENTITY.get()
.create(pPos, pState);
}

@Override
protected InteractionResult useWithoutItem(
BlockState pState,
Level level,
BlockPos pos,
Player player,
BlockHitResult pHitResult
) {
if (level.getBlockEntity(pos) instanceof ProxyBlockEntity pbe && player instanceof ServerPlayer sp) {
sp.openMenu(pbe, buf -> ProxyContainerMenu.encode(pbe, buf));
return InteractionResult.CONSUME;
}
return InteractionResult.SUCCESS;
}

@Override
@SuppressWarnings("deprecation")
public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) {
if (!state.is(newState.getBlock())) {
if (level.getBlockEntity(pos) instanceof Container container) {
Containers.dropContents(level, pos, container);
level.updateNeighbourForOutputSignal(pos, this);
}
super.onRemove(state, level, pos, newState, isMoving);
}
}
}
166 changes: 166 additions & 0 deletions src/main/java/ca/teamdman/sfm/common/blockentity/ProxyBlockEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
package ca.teamdman.sfm.common.blockentity;

import ca.teamdman.sfm.common.containermenu.ProxyContainerMenu;
import ca.teamdman.sfm.common.registry.SFMBlockEntities;
import ca.teamdman.sfm.common.util.SFMContainerUtil;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.capabilities.BlockCapability;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.capabilities.ItemCapability;
import net.neoforged.neoforge.items.wrapper.InvWrapper;
import org.jetbrains.annotations.Nullable;

import java.util.Map;

/*
* https://github.com/CyclopsMC/CapabilityProxy/blob/master-1.21/loader-neoforge/src/main/java/org/cyclops/capabilityproxy/blockentity/BlockEntityItemCapabilityProxyNeoForge.java
*/
public class ProxyBlockEntity extends BaseContainerBlockEntity {
private static final Component TITLE = Component.literal("Item Capability Proxy");

public static Map<BlockCapability<?, ?>, ItemCapability<?, ?>> BLOCK_TO_ITEM_CAPABILITIES = Map.of();

private NonNullList<ItemStack> inventory = NonNullList.withSize(4, ItemStack.EMPTY);

public ProxyBlockEntity(BlockPos pPos, BlockState pBlockState) {
super(SFMBlockEntities.PROXY_BLOCK_ENTITY.get(), pPos, pBlockState);
}

@Nullable
public static <T, C1, C2> ItemCapability<T, C2> blockCapabilityToItemCapability(BlockCapability<T, C1> capability) {
return (ItemCapability<T, C2>) BLOCK_TO_ITEM_CAPABILITIES.get(capability);
}

@Override
public void setChanged() {
super.setChanged();
invalidateCapabilities();
}

@Override
protected AbstractContainerMenu createMenu(int windowId, Inventory inventory) {
return new ProxyContainerMenu(windowId, inventory, this);
}

@Override
public int getMaxStackSize() {
return 1;
}

@Override
protected Component getDefaultName() {
return TITLE;
}

@Override
protected NonNullList<ItemStack> getItems() {
return inventory;
}

@Override
protected void setItems(NonNullList<ItemStack> nonNullList) {
inventory = nonNullList;
}

@Override
public int getContainerSize() {
return inventory.size();
}

@Override
public boolean isEmpty() {
return inventory.isEmpty();
}

@Override
public ItemStack getItem(int slotId) {
if (slotId < 0 || slotId >= getContainerSize()) return ItemStack.EMPTY;
return inventory.get(slotId);
}

@Override
public ItemStack removeItem(int slotId, int amount) {
ItemStack result = ContainerHelper.removeItem(inventory, slotId, amount);
setChanged();
return result;
}

@Override
public ItemStack removeItemNoUpdate(int slotId) {
ItemStack result = ContainerHelper.takeItem(inventory, slotId);
setChanged();
return result;
}

@Override
public void setItem(int slotId, ItemStack itemStack) {
if (slotId < 0 || slotId >= getContainerSize()) return;
inventory.set(slotId, itemStack);
setChanged();
}

@Override
public boolean stillValid(Player player) {
return SFMContainerUtil.stillValid(this, player);
}

@Override
public void clearContent() {
inventory.clear();
}

@Override
protected void saveAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) {
super.saveAdditional(pTag, pRegistries);
ContainerHelper.saveAllItems(pTag, inventory, pRegistries);
}

@Override
protected void loadAdditional(CompoundTag pTag, HolderLookup.Provider pRegistries) {
super.loadAdditional(pTag, pRegistries);
ContainerHelper.loadAllItems(pTag, inventory, pRegistries);
}

@Nullable
public <T, C1, C2> T getCapability(BlockCapability<T, C1> blockCapability, @Nullable C1 context) {
if (!(context instanceof Direction ctx)) {
return null;
}

if (ctx == Direction.UP | ctx == Direction.DOWN) {
if (blockCapability == Capabilities.ItemHandler.BLOCK) {
return (T) new InvWrapper(this);
}
return null;
}

int slot = switch (ctx) {
case DOWN, UP -> throw new IllegalStateException("Trying to read UP or DOWN direction of capabilities");
case NORTH -> 0;
case EAST -> 1;
case SOUTH -> 2;
case WEST -> 3;
};

ItemStack itemStack = getItem(slot);
ItemCapability<T, C2> itemCapability = blockCapabilityToItemCapability(blockCapability);
if (itemCapability == null) {
return null;
}
T cap = itemStack.getCapability(itemCapability, null);

return cap;
}
}
29 changes: 27 additions & 2 deletions src/main/java/ca/teamdman/sfm/common/compat/SFMCompat.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,48 @@
package ca.teamdman.sfm.common.compat;

import ca.teamdman.sfm.common.resourcetype.ChemicalResourceType;
import com.google.common.collect.Maps;
import net.minecraft.core.Direction;
import net.neoforged.fml.ModList;
import net.neoforged.neoforge.capabilities.BlockCapability;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.capabilities.ItemCapability;
import org.jetbrains.annotations.Nullable;

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

public class SFMCompat {
public static boolean isMekanismLoaded() {
return ModList.get().getModContainerById("mekanism").isPresent();
}

public static List<BlockCapability<?, @Nullable Direction>> getCapabilities() {
return List.of(
ArrayList<BlockCapability<?, @Nullable Direction>> capabilities = new ArrayList<>(List.of(
Capabilities.ItemHandler.BLOCK,
Capabilities.FluidHandler.BLOCK,
Capabilities.EnergyStorage.BLOCK
);
));

if (isMekanismLoaded()) {
capabilities.add(ChemicalResourceType.CAP);
}

return capabilities;
}

public static Map<BlockCapability<?, ?>, ItemCapability<?, ?>> getCapabilityMap() {
Map<BlockCapability<?, ?>, ItemCapability<?, ?>> capabilityMap = Maps.newIdentityHashMap();
capabilityMap.put(Capabilities.ItemHandler.BLOCK, Capabilities.ItemHandler.ITEM);
capabilityMap.put(Capabilities.FluidHandler.BLOCK, Capabilities.FluidHandler.ITEM);
capabilityMap.put(Capabilities.EnergyStorage.BLOCK, Capabilities.EnergyStorage.ITEM);

if (isMekanismLoaded()) {
capabilityMap.put(ChemicalResourceType.CAP, mekanism.common.capabilities.Capabilities.CHEMICAL.item());
}

return capabilityMap;
}

}
Loading