Skip to content

Commit

Permalink
Update to 1.20.6
Browse files Browse the repository at this point in the history
  • Loading branch information
Patbox committed May 14, 2024
1 parent 6b89ac8 commit 22af288
Show file tree
Hide file tree
Showing 14 changed files with 158 additions and 84 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
matrix:
# Use these Java versions
java: [
17 # Minimum supported by Minecraft
21 # Minimum supported by Minecraft
]
# and run on both Linux and Windows
os: [ubuntu-20.04]
Expand All @@ -32,7 +32,7 @@ jobs:
- name: Build and publish with Gradle
run: ./gradlew build
- name: capture build artifacts
if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS
if: ${{ runner.os == 'Linux' && matrix.java == '21' }} # Only upload artifacts built from latest java on one OS
uses: actions/upload-artifact@v2
with:
name: Artifacts
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: 17
java-version: 21

- name: Grant execute permission for gradlew
run: chmod +x gradlew
Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
plugins {
id 'fabric-loom' version '1.4-SNAPSHOT'
id 'fabric-loom' version '1.6-SNAPSHOT'
id 'maven-publish'
id "com.modrinth.minotaur" version "2.+"
}

sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21

archivesBaseName = project.archives_base_name
version = project.mod_version
Expand Down
14 changes: 7 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ org.gradle.jvmargs=-Xmx1G

# Fabric Properties
# check these on https://fabricmc.net/versions.html
minecraft_version=1.20.4
yarn_mappings=1.20.4+build.3
loader_version=0.15.3
minecraft_version=1.20.6
yarn_mappings=1.20.6+build.1
loader_version=0.15.10

# Mod Properties
mod_version = 0.5.0+1.20.4
mod_version = 0.6.0+1.20.6
maven_group = space.essem
archives_base_name = image2map

# Dependencies
fabric_version=0.91.2+1.20.4
mapcanvas_version=0.2.2+1.19.4
sgui_version=1.4.0+1.20.4
fabric_version=0.97.6+1.20.6
mapcanvas_version=0.3.0+1.20.6
sgui_version=1.5.1+1.20.5
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
46 changes: 34 additions & 12 deletions src/main/java/space/essem/image2map/CardboardWarning.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
package space.essem.image2map;

import com.mojang.logging.LogUtils;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
import org.slf4j.Logger;

import java.util.List;

public class CardboardWarning implements PreLaunchEntrypoint {
public static final String MOD_NAME = "Brewery";
public static final Logger LOGGER = LogUtils.getLogger();
public static final boolean LOADED = FabricLoader.getInstance().isModLoaded("cardboard") || FabricLoader.getInstance().isModLoaded("banner");

// Overwrite heavy and generally problematic bukkit implementation
private static final List<String> BROKEN_BUKKIT_IMPL = List.of("cardboard", "banner", "arclight");

public static final String BUKKIT_NAME;
public static final boolean LOADED;

static {
var name = "";
var loaded = false;
for (var x : BROKEN_BUKKIT_IMPL) {
var m = FabricLoader.getInstance().getModContainer(x);
if (m.isPresent()) {
name = m.get().getMetadata().getName() + " (" + x + ")";
loaded = true;
break;
}
}

BUKKIT_NAME = name;
LOADED = loaded;
}

@Override
public void onPreLaunch() {
Expand All @@ -18,15 +41,14 @@ public void onPreLaunch() {
public static void checkAndAnnounce() {
if (LOADED) {
LOGGER.error("==============================================");
for (var i = 0; i < 4; i++) {
LOGGER.error("");
LOGGER.error("Cardboard/Banner detected! This mod doesn't work with it!");
LOGGER.error("You won't get any support as long as it's present!");
LOGGER.error("");
LOGGER.error("Read more at: https://gist.github.com/Patbox/e44844294c358b614d347d369b0fc3bf");
LOGGER.error("");
LOGGER.error("==============================================");
}
LOGGER.error("");
LOGGER.error(BUKKIT_NAME + " detected! This mod is known to cause issues!");
LOGGER.error(MOD_NAME + " might not work correctly because of it.");
LOGGER.error("You won't get any support as long as it's present!");
LOGGER.error("");
LOGGER.error("Read more at: https://gist.github.com/Patbox/e44844294c358b614d347d369b0fc3bf");
LOGGER.error("");
LOGGER.error("==============================================");
}
}
}
}
73 changes: 34 additions & 39 deletions src/main/java/space/essem/image2map/Image2Map.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.BundleContentsComponent;
import net.minecraft.component.type.LoreComponent;
import net.minecraft.component.type.NbtComponent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.decoration.ItemFrameEntity;
Expand Down Expand Up @@ -45,7 +49,6 @@
import java.io.File;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -210,33 +213,26 @@ public static void giveToPlayer(PlayerEntity player, List<ItemStack> items, Stri
player.giveItemStack(items.get(0));
} else {
var bundle = new ItemStack(Items.BUNDLE);
var list = new NbtList();
bundle.set(DataComponentTypes.BUNDLE_CONTENTS, new BundleContentsComponent(items));
bundle.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT.with(ImageData.CODEC,
ImageData.ofBundle(MathHelper.ceil(width / 128d), MathHelper.ceil(height / 128d))).getOrThrow());

for (var item : items) {
list.add(item.writeNbt(new NbtCompound()));
}
bundle.getOrCreateNbt().put("Items", list);
bundle.getOrCreateNbt().putBoolean("image2map:quick_place", true);
bundle.getOrCreateNbt().putInt("image2map:width", MathHelper.ceil(width / 128d));
bundle.getOrCreateNbt().putInt("image2map:height", MathHelper.ceil(height / 128d));

var lore = new NbtList();
lore.add(NbtString.of(Text.Serialization.toJsonString(Text.literal(input))));
bundle.getOrCreateSubNbt("display").put("Lore", lore);
bundle.setCustomName(Text.literal("Maps").formatted(Formatting.GOLD));
bundle.set(DataComponentTypes.LORE, new LoreComponent(List.of(Text.literal(input))));
bundle.set(DataComponentTypes.ITEM_NAME, Text.literal("Maps").formatted(Formatting.GOLD));

player.giveItemStack(bundle);
}
}

public static boolean clickItemFrame(PlayerEntity player, Hand hand, ItemFrameEntity itemFrameEntity) {
var stack = player.getStackInHand(hand);
var bundleData = stack.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).get(ImageData.CODEC);

if (stack.hasNbt() && stack.isOf(Items.BUNDLE) && stack.getNbt().getBoolean("image2map:quick_place")) {
if (stack.isOf(Items.BUNDLE) && bundleData.isSuccess() && bundleData.getOrThrow().quickPlace()) {
var world = itemFrameEntity.getWorld();
var start = itemFrameEntity.getBlockPos();
var width = stack.getNbt().getInt("image2map:width");
var height = stack.getNbt().getInt("image2map:height");
var width = bundleData.getOrThrow().width();
var height = bundleData.getOrThrow().height();

var frames = new ItemFrameEntity[width * height];

Expand Down Expand Up @@ -275,18 +271,15 @@ public static boolean clickItemFrame(PlayerEntity player, Hand hand, ItemFrameEn
}
}

for (var nbt : stack.getNbt().getList("Items", NbtElement.COMPOUND_TYPE)) {
var map = ItemStack.fromNbt((NbtCompound) nbt);
for (var map : stack.getOrDefault(DataComponentTypes.BUNDLE_CONTENTS, BundleContentsComponent.DEFAULT).iterate()) {
var mapData = map.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).get(ImageData.CODEC);

if (map.hasNbt()) {
var x = map.getNbt().getInt("image2map:x");
var y = map.getNbt().getInt("image2map:y");
if (mapData.isSuccess() && mapData.getOrThrow().isReal()) {
map = map.copy();
var newData = mapData.getOrThrow().withDirection(right, down, facing);
map.apply(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT, x -> x.with(ImageData.CODEC, newData).getOrThrow());

map.getNbt().putString("image2map:right", right.asString());
map.getNbt().putString("image2map:down", down.asString());
map.getNbt().putString("image2map:facing", facing.asString());

var frame = frames[x + y * width];
var frame = frames[mapData.getOrThrow().x() + mapData.getOrThrow().y() * width];

if (frame != null && frame.getHeldItemStack().isEmpty()) {
frame.setHeldItemStack(map);
Expand All @@ -306,20 +299,19 @@ public static boolean clickItemFrame(PlayerEntity player, Hand hand, ItemFrameEn

public static boolean destroyItemFrame(Entity player, ItemFrameEntity itemFrameEntity) {
var stack = itemFrameEntity.getHeldItemStack();
var tag = stack.getNbt();
var tag = stack.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).get(ImageData.CODEC);

String[] requiredTags = new String[] { "image2map:x", "image2map:y", "image2map:width", "image2map:height",
"image2map:right", "image2map:down", "image2map:facing" };

if (stack.getItem() == Items.FILLED_MAP && tag != null && Arrays.stream(requiredTags).allMatch(tag::contains)) {
var xo = tag.getInt("image2map:x");
var yo = tag.getInt("image2map:y");
var width = tag.getInt("image2map:width");
var height = tag.getInt("image2map:height");
if (stack.getItem() == Items.FILLED_MAP && tag.isSuccess() && tag.getOrThrow().right().isPresent()
&& tag.getOrThrow().down().isPresent() && tag.getOrThrow().facing().isPresent()) {
var xo = tag.getOrThrow().x();
var yo = tag.getOrThrow().y();
var width = tag.getOrThrow().width();
var height = tag.getOrThrow().height();

Direction right = Direction.byName(tag.getString("image2map:right"));
Direction down = Direction.byName(tag.getString("image2map:down"));
Direction facing = Direction.byName(tag.getString("image2map:facing"));
Direction right = tag.getOrThrow().right().get();
Direction down = tag.getOrThrow().down().get();
Direction facing = tag.getOrThrow().facing().get();

var world = itemFrameEntity.getWorld();
var start = itemFrameEntity.getBlockPos();
Expand All @@ -343,7 +335,10 @@ public static boolean destroyItemFrame(Entity player, ItemFrameEntity itemFrameE

// Only apply to frames that contain an image2map map
var frameStack = frame.getHeldItemStack();
if (frameStack.getItem() == Items.FILLED_MAP && tag != null && Arrays.stream(requiredTags).allMatch(tag::contains)) {
tag = frameStack.getOrDefault(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT).get(ImageData.CODEC);

if (frameStack.getItem() == Items.FILLED_MAP && tag.isSuccess() && tag.getOrThrow().right().isPresent()
&& tag.getOrThrow().down().isPresent() && tag.getOrThrow().facing().isPresent()) {
frame.setHeldItemStack(ItemStack.EMPTY, true);
frame.setInvisible(false);
}
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/space/essem/image2map/ImageData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package space.essem.image2map;

import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.util.math.Direction;

import java.util.Optional;

public record ImageData(int x, int y, int width, int height, boolean quickPlace, Optional<Direction> right, Optional<Direction> down, Optional<Direction> facing) {
public static final MapCodec<ImageData> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
Codec.INT.optionalFieldOf("image2map:x", 0).forGetter(ImageData::x),
Codec.INT.optionalFieldOf("image2map:y", 0).forGetter(ImageData::y),
Codec.INT.optionalFieldOf("image2map:width", 0).forGetter(ImageData::width),
Codec.INT.optionalFieldOf("image2map:height", 0).forGetter(ImageData::width),
Codec.BOOL.optionalFieldOf("image2map:quick_place", false).forGetter(ImageData::quickPlace),
Direction.CODEC.optionalFieldOf("image2map:right").forGetter(ImageData::right),
Direction.CODEC.optionalFieldOf("image2map:down").forGetter(ImageData::down),
Direction.CODEC.optionalFieldOf("image2map:facing").forGetter(ImageData::facing)
).apply(instance, ImageData::new));

public static ImageData ofSimple(int x, int y, int width, int height) {
return new ImageData(x, y ,width, height, false, Optional.empty(), Optional.empty(), Optional.empty());
}

public ImageData withDirection(Direction right, Direction down, Direction facing) {
return new ImageData(x, y, width, height, quickPlace, Optional.of(right), Optional.of(down), Optional.of(facing));
}

public static ImageData ofBundle(int width, int height) {
return new ImageData(0, 0, width, height, true, Optional.empty(), Optional.empty(), Optional.empty());
}

public boolean isReal() {
return this.width != 0 && this.height != 0;
}
}
3 changes: 2 additions & 1 deletion src/main/java/space/essem/image2map/gui/MapGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import java.util.EnumSet;

import org.jetbrains.annotations.Nullable;
import space.essem.image2map.mixin.EntityPassengersSetS2CPacketAccessor;


public class MapGui extends HotbarGui {
Expand Down Expand Up @@ -77,7 +78,7 @@ public MapGui(ServerPlayerEntity player, int width, int height) {
var buf = new PacketByteBuf(Unpooled.buffer());
buf.writeVarInt(this.entity.getId());
buf.writeIntArray(new int[]{player.getId()});
player.networkHandler.sendPacket(new EntityPassengersSetS2CPacket(buf));
player.networkHandler.sendPacket(EntityPassengersSetS2CPacketAccessor.createEntityPassengersSetS2CPacket(buf));
player.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.GAME_MODE_CHANGED, GameMode.SPECTATOR.getId()));
player.networkHandler.sendPacket(new EntityS2CPacket.Rotate(player.getId(), (byte) 0, (byte) 0, player.isOnGround()));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package space.essem.image2map.mixin;

import net.minecraft.component.DataComponentTypes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand All @@ -23,7 +24,7 @@ public class BundleItemMixin {
private void image2map$useBundle(World world, PlayerEntity user, Hand hand,
CallbackInfoReturnable<TypedActionResult<ItemStack>> cir) {
ItemStack itemStack = user.getStackInHand(hand);
var tag = itemStack.getNbt();
var tag = itemStack.get(DataComponentTypes.CUSTOM_DATA);

if (tag != null && tag.contains("image2map:quick_place") && !user.isCreative()) {
cir.setReturnValue(TypedActionResult.fail(itemStack));
Expand All @@ -34,7 +35,7 @@ public class BundleItemMixin {
@Inject(method = "onStackClicked", at = @At("HEAD"), cancellable = true)
private void image2map$addBundleItems(ItemStack bundle, Slot slot, ClickType clickType, PlayerEntity player,
CallbackInfoReturnable<Boolean> cir) {
var tag = bundle.getNbt();
var tag = bundle.get(DataComponentTypes.CUSTOM_DATA);

if (tag != null && tag.contains("image2map:quick_place") && !player.isCreative()) {
cir.setReturnValue(false);
Expand All @@ -46,7 +47,7 @@ public class BundleItemMixin {
private void image2map$removeBundleItems(ItemStack bundle, ItemStack otherStack, Slot slot, ClickType clickType,
PlayerEntity player, StackReference cursorStackReference,
CallbackInfoReturnable<Boolean> cir) {
var tag = bundle.getNbt();
var tag = bundle.get(DataComponentTypes.CUSTOM_DATA);

if (tag != null && tag.contains("image2map:quick_place") && !player.isCreative()) {
cir.setReturnValue(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package space.essem.image2map.mixin;

import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;

@Mixin(EntityPassengersSetS2CPacket.class)
public interface EntityPassengersSetS2CPacketAccessor {
@Invoker("<init>")
static EntityPassengersSetS2CPacket createEntityPassengersSetS2CPacket(PacketByteBuf buf) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ public ServerPlayNetworkHandlerMixin(MinecraftServer server, ClientConnection co
}
}

@Inject(method = "handleCommandExecution", at = @At("HEAD"), cancellable = true)
private void image2map$onCommandExecution(CommandExecutionC2SPacket packet, LastSeenMessageList lastSeenMessages, CallbackInfo ci) {
@Inject(method = "executeCommand", at = @At("HEAD"), cancellable = true)
private void image2map$onCommandExecution(String command, CallbackInfo ci) {
if (this.player.currentScreenHandler instanceof VirtualScreenHandlerInterface handler && handler.getGui() instanceof MapGui computerGui) {
computerGui.executeCommand(packet.command());
computerGui.executeCommand(command);
ci.cancel();
}
}
Expand Down
Loading

0 comments on commit 22af288

Please sign in to comment.