Skip to content

Commit

Permalink
Make some improvements to the Cell Dock
Browse files Browse the repository at this point in the history
  • Loading branch information
62832 committed Jan 12, 2025
1 parent 21aa43f commit 1fb5ee9
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 6 deletions.
60 changes: 55 additions & 5 deletions src/main/java/gripe/_90/megacells/item/part/CellDockPart.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.mojang.blaze3d.vertex.PoseStack;

import gripe._90.megacells.mixin.SpinMappingAccessor;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -17,7 +18,9 @@
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand All @@ -43,6 +46,7 @@
import appeng.api.storage.cells.StorageCell;
import appeng.blockentity.inventory.AppEngCellInventory;
import appeng.client.render.BakedModelUnwrapper;
import appeng.client.render.model.AEModelData;
import appeng.client.render.model.DriveBakedModel;
import appeng.client.render.tesr.CellLedRenderer;
import appeng.core.definitions.AEBlocks;
Expand All @@ -54,6 +58,7 @@
import appeng.menu.locator.MenuLocators;
import appeng.parts.AEBasePart;
import appeng.parts.PartModel;
import appeng.util.InteractionUtil;
import appeng.util.inv.AppEngInternalInventory;
import appeng.util.inv.InternalInventoryHost;
import appeng.util.inv.filter.IAEItemFilter;
Expand All @@ -80,6 +85,7 @@ public class CellDockPart extends AEBasePart
// when a dock comes into view
private Item clientCell = Items.AIR;
private CellState clientCellState = CellState.ABSENT;
private byte spin;

public CellDockPart(IPartItem<?> partItem) {
super(partItem);
Expand All @@ -95,13 +101,15 @@ public void readFromNBT(CompoundTag data, HolderLookup.Provider registries) {
super.readFromNBT(data, registries);
cellInventory.setItemDirect(0, ItemStack.parseOptional(registries, data.getCompound("cell")));
priority = data.getInt("priority");
spin = data.getByte("spin");
}

@Override
public void writeToNBT(CompoundTag data, HolderLookup.Provider registries) {
super.writeToNBT(data, registries);
data.put("cell", getCell().saveOptional(registries));
data.putInt("priority", priority);
data.putByte("spin", spin);
}

@Override
Expand All @@ -110,18 +118,21 @@ public boolean readFromStream(RegistryFriendlyByteBuf data) {

var oldCell = clientCell;
var oldCellState = clientCellState;
var oldSpin = spin;

clientCell = BuiltInRegistries.ITEM.get(data.readResourceLocation());
clientCellState = data.readEnum(CellState.class);
spin = data.readByte();

return changed || oldCell != clientCell || oldCellState != clientCellState;
return changed || oldCell != clientCell || oldCellState != clientCellState || oldSpin != spin;
}

@Override
public void writeToStream(RegistryFriendlyByteBuf data) {
super.writeToStream(data);
data.writeResourceLocation(BuiltInRegistries.ITEM.getKey(getCell().getItem()));
data.writeEnum(clientCellState = getCellStatus(0));
data.writeByte(spin);
}

@Override
Expand Down Expand Up @@ -174,13 +185,38 @@ protected void onMainNodeStateChanged(IGridNodeListener.State reason) {

@Override
public boolean onUseWithoutItem(Player player, Vec3 pos) {
if (!player.getCommandSenderWorld().isClientSide()) {
if (!isClientSide()) {
MenuOpener.open(MEGAMenus.CELL_DOCK.get(), player, MenuLocators.forPart(this));
}

return true;
}

@Override
public boolean onUseItemOn(ItemStack heldItem, Player player, InteractionHand hand, Vec3 pos) {
if (InteractionUtil.canWrenchRotate(heldItem)) {
if (!isClientSide()) {
spin = (byte) ((spin + 1) % 4);
getHost().markForSave();
getHost().markForUpdate();
}

return true;
} else {
return super.onUseItemOn(heldItem, player, hand, pos);
}
}

@Override
public void onPlacement(Player player) {
super.onPlacement(player);
var rotation = (byte) (Mth.floor(player.getYRot() * 4F / 360F + 2.5D) & 3);

if (getSide() == Direction.UP || getSide() == Direction.DOWN) {
spin = rotation;
}
}

@Override
public void returnToMainMenu(Player player, ISubMenu subMenu) {
MenuOpener.returnTo(MEGAMenus.CELL_DOCK.get(), player, MenuLocators.forPart(this));
Expand Down Expand Up @@ -351,9 +387,7 @@ public void renderDynamic(
poseStack.pushPose();
poseStack.translate(0.5, 0.5, 0.5);

var front = getSide() == Direction.UP || getSide() == Direction.DOWN ? Direction.NORTH : Direction.UP;
var orientation = BlockOrientation.get(front, getSide());

var orientation = BlockOrientation.get(getUpFromSpin(getSide(), spin), getSide());
poseStack.mulPose(orientation.getQuaternion());
poseStack.translate(-3F / 16, 5F / 16, -4F / 16);

Expand All @@ -374,10 +408,26 @@ public void renderDynamic(
ModelData.EMPTY,
null);
CellLedRenderer.renderLed(this, 0, buffers.getBuffer(CellLedRenderer.RENDER_LAYER), poseStack, partialTicks);
poseStack.popPose();

poseStack.pushPose();
poseStack.translate(0.5, 0.5, 0.5);
poseStack.mulPose(BlockOrientation.get(getSide(), spin).getQuaternion());
poseStack.translate(-8F / 16, -3F / 16, -8F / 16);
CellLedRenderer.renderLed(this, 0, buffers.getBuffer(CellLedRenderer.RENDER_LAYER), poseStack, partialTicks);
poseStack.popPose();
}

// FIXME (AE2): This is what SpinMapping::getUpFromSpin is meant to be rather than a duplicate of getSpinFromUp
private Direction getUpFromSpin(Direction facing, int spin) {
return SpinMappingAccessor.getSpinDirections()[facing.ordinal()][spin];
}

@Override
public ModelData getModelData() {
return ModelData.builder().with(AEModelData.SPIN, spin).build();
}

private static class Filter implements IAEItemFilter {
@Override
public boolean allowInsert(InternalInventory inv, int slot, ItemStack stack) {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/gripe/_90/megacells/mixin/SpinMappingAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package gripe._90.megacells.mixin;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import net.minecraft.core.Direction;

import appeng.block.orientation.SpinMapping;

@Mixin(SpinMapping.class)
public interface SpinMappingAccessor {
@Accessor(value = "SPIN_DIRECTIONS")
static Direction[][] getSpinDirections() {
throw new AssertionError();
}
}
Binary file modified src/main/resources/assets/megacells/textures/part/cell_dock.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion src/main/resources/megacells.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"CraftingBlockItemMixin",
"ItemEntityMixin",
"ItemMenuHostMixin",
"PatternProviderMenuAccessor"
"PatternProviderMenuAccessor",
"SpinMappingAccessor"
],
"client": [
"client.BuiltInModelHooksAccessor",
Expand Down

0 comments on commit 1fb5ee9

Please sign in to comment.