summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/funnyteleporters
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-22 20:25:33 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-22 20:25:33 +0100
commita8b2f2036a45b2d28cfc8a8f4df624aaf3259f5a (patch)
treec45d789f10594fed8e5e4490e0d8d73554cc24e7 /src/main/java/moe/nea/funnyteleporters
parent3fa4676bceabcb70339ce1f7d6f77160dc0f7912 (diff)
downloadfunny-teleporters-a8b2f2036a45b2d28cfc8a8f4df624aaf3259f5a.tar.gz
funny-teleporters-a8b2f2036a45b2d28cfc8a8f4df624aaf3259f5a.tar.bz2
funny-teleporters-a8b2f2036a45b2d28cfc8a8f4df624aaf3259f5a.zip
Add rename/delete support for nexus
Diffstat (limited to 'src/main/java/moe/nea/funnyteleporters')
-rw-r--r--src/main/java/moe/nea/funnyteleporters/TeleporterDestination.java8
-rw-r--r--src/main/java/moe/nea/funnyteleporters/TeleporterNexusBlockEntity.java42
-rw-r--r--src/main/java/moe/nea/funnyteleporters/TeleporterNexusEditorScreen.java52
-rw-r--r--src/main/java/moe/nea/funnyteleporters/TeleporterNexusNameEditorScreen.java29
-rw-r--r--src/main/java/moe/nea/funnyteleporters/TeleporterNexusScreen.java6
-rw-r--r--src/main/java/moe/nea/funnyteleporters/Utils.java10
6 files changed, 128 insertions, 19 deletions
diff --git a/src/main/java/moe/nea/funnyteleporters/TeleporterDestination.java b/src/main/java/moe/nea/funnyteleporters/TeleporterDestination.java
index b867fc4..163aeab 100644
--- a/src/main/java/moe/nea/funnyteleporters/TeleporterDestination.java
+++ b/src/main/java/moe/nea/funnyteleporters/TeleporterDestination.java
@@ -11,11 +11,13 @@ import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier;
+import net.minecraft.util.dynamic.Codecs;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
+import java.util.Optional;
import java.util.Set;
public record TeleporterDestination(
@@ -44,10 +46,12 @@ public record TeleporterDestination(
subject.teleport(destinationWorld, destPos.x, destPos.y, destPos.z, Set.of(), subject.getYaw(), subject.getPitch());
}
- public record Labeled(RegistryEntry<Item> item, TeleporterDestination destination) {
+ public record Labeled(RegistryEntry<Item> item, TeleporterDestination destination, Optional<String> name) {
public static Codec<Labeled> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Registries.ITEM.getEntryCodec().fieldOf("item").forGetter(Labeled::item),
- TeleporterDestination.CODEC.fieldOf("destination").forGetter(Labeled::destination)).apply(instance, Labeled::new));
+ TeleporterDestination.CODEC.fieldOf("destination").forGetter(Labeled::destination),
+ Codec.STRING.optionalFieldOf("name").forGetter(Labeled::name)
+ ).apply(instance, Labeled::new));
}
public ServerWorld getDestinationWorld(ServerWorld world) {
diff --git a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusBlockEntity.java b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusBlockEntity.java
index ba6808a..dbc8150 100644
--- a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusBlockEntity.java
+++ b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusBlockEntity.java
@@ -6,6 +6,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.item.Item;
+import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtOps;
@@ -14,6 +15,7 @@ import net.minecraft.registry.RegistryWrapper;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.math.BlockPos;
+import java.util.Optional;
import java.util.TreeMap;
public class TeleporterNexusBlockEntity extends BlockEntity {
@@ -23,21 +25,41 @@ public class TeleporterNexusBlockEntity extends BlockEntity {
super(type, pos, state);
}
- public TreeMap<TeleporterDestination, RegistryEntry<Item>> destinations = new TreeMap<>();
- private static final Codec<TreeMap<TeleporterDestination, RegistryEntry<Item>>> DESTINATION_CODEC =
+ public Optional<String> getName(TeleporterDestination dest) {
+ var label = destinations.get(dest);
+ return label != null ? (label.label) : Optional.empty();
+ }
+
+ public ItemConvertible getIcon(TeleporterDestination dest) {
+ var label = destinations.get(dest);
+ return (label != null ? label.item : getDefaultItem()).value();
+ }
+
+ public record Label(
+ RegistryEntry<Item> item,
+ Optional<String> label
+ ) {
+ }
+
+ public TreeMap<TeleporterDestination, Label> destinations = new TreeMap<>();
+ private static final Codec<TreeMap<TeleporterDestination, Label>> DESTINATION_CODEC =
TeleporterDestination.Labeled.CODEC
.listOf()
.xmap(
pairs -> {
- var hash = new TreeMap<TeleporterDestination, RegistryEntry<Item>>();
+ var hash = new TreeMap<TeleporterDestination, Label>();
for (TeleporterDestination.Labeled pair : pairs) {
- hash.put(pair.destination(), pair.item());
+ hash.put(pair.destination(), new Label(pair.item(), pair.name()));
}
return hash;
},
- map -> map.entrySet().stream().map(it -> new TeleporterDestination.Labeled(it.getValue(), it.getKey())).toList()
+ map -> map.entrySet().stream().map(it -> new TeleporterDestination.Labeled(it.getValue().item(), it.getKey(), it.getValue().label())).toList()
);
+ static RegistryEntry<Item> getDefaultItem() {
+ return Registries.ITEM.getEntry(Items.ENDER_PEARL);
+ }
+
@Override
protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
super.readNbt(nbt, registryLookup);
@@ -52,7 +74,7 @@ public class TeleporterNexusBlockEntity extends BlockEntity {
}
public void addDestination(TeleporterDestination destination) {
- destinations.putIfAbsent(destination, Registries.ITEM.getEntry(Items.ENDER_PEARL));
+ destinations.putIfAbsent(destination, new Label(getDefaultItem(), Optional.empty()));
markDirty();
}
@@ -62,7 +84,13 @@ public class TeleporterNexusBlockEntity extends BlockEntity {
}
public void setIcon(TeleporterDestination dest, Item item) {
- destinations.put(dest, Registries.ITEM.getEntry(item));
+ var entry = Registries.ITEM.getEntry(item);
+ destinations.compute(dest, (key, old) -> old == null ? new Label(entry, Optional.empty()) : new Label(entry, old.label()));
+ markDirty();
+ }
+
+ public void setName(TeleporterDestination dest, Optional<String> string) {
+ destinations.compute(dest, (key, old) -> old == null ? new Label(getDefaultItem(), string) : new Label(old.item(), string));
markDirty();
}
}
diff --git a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusEditorScreen.java b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusEditorScreen.java
index 582ffe5..7fe55a6 100644
--- a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusEditorScreen.java
+++ b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusEditorScreen.java
@@ -11,37 +11,75 @@ import net.minecraft.screen.ScreenHandlerType;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
public class TeleporterNexusEditorScreen extends SimpleGui {
- private final TeleporterNexusBlockEntity blockEntity;
- private final TeleporterDestination dest;
+ final TeleporterNexusBlockEntity blockEntity;
+ final TeleporterDestination dest;
public TeleporterNexusEditorScreen(TeleporterNexusBlockEntity blockEntity, TeleporterDestination dest, ServerPlayerEntity player) {
super(ScreenHandlerType.GENERIC_9X3, player, false);
this.blockEntity = blockEntity;
this.dest = dest;
- setTitle(Text.literal("Set Icon for Teleporter"));
setSlots();
}
void setSlots() {
+ setTitle(Text.literal("Set Icon for " + blockEntity.getName(dest).orElse("teleporter")));
for (int i = 0; i < width * height; i++) {
setSlot(i, Utils.createBlankBlack());
}
- setSlot(width * height / 2,
- GuiElementBuilder.from(new ItemStack(blockEntity.destinations.getOrDefault(dest, Registries.ITEM.getEntry(Items.ENDER_PEARL)).value()))
+ setSlot(4 + 9,
+ GuiElementBuilder.from(new ItemStack(blockEntity.getIcon(dest)))
.setName(Text.literal("Click item in your inventory to set icon.")));
+ setSlot(2 + 9,
+ GuiElementBuilder.from(new ItemStack(Items.OAK_SIGN))
+ .setName(Text.literal("Click here to change name"))
+ .addLoreLine(Text.literal("Click here to set a name for the teleport destination")
+ .setStyle(Utils.colouredLoreStyle(Formatting.AQUA)))
+ .setCallback(this::handleNameChange));
+ setSlot(9 + 6,
+ GuiElementBuilder.from(new ItemStack(Items.BARRIER))
+ .setName(Text.literal("Delete").withColor(0xFFFF0000))
+ .addLoreLine(Text.literal("Shift-Click here to remove this location")
+ .setStyle(Utils.colouredLoreStyle(Formatting.RED)))
+ .addLoreLine(Text.literal("from the teleport nexus")
+ .setStyle(Utils.colouredLoreStyle(Formatting.RED)))
+ .setCallback(this::handleDelete));
+ }
+
+ void handleNameChange() {
+ new TeleporterNexusNameEditorScreen(this).open();
+ }
+
+ void handleDelete(ClickType clickType) {
+ if (clickType == ClickType.MOUSE_LEFT_SHIFT) {
+ blockEntity.removeDestination(dest);
+ back();
+ } else {
+ player.sendMessage(Text.literal("You need to shift click to delete locations."));
+ }
+ }
+
+ @Override
+ public void onClose() {
+ back();
+ }
+
+ void back() {
+ new TeleporterNexusScreen(blockEntity, player).open();
}
@Override
public boolean onAnyClick(int index, ClickType type, SlotActionType action) {
- System.out.println("Index: " + index);
var slot = getSlotRedirectOrPlayer(index);
if (slot == null) return true;
var stack = slot.getStack();
if (!stack.isEmpty()) {
blockEntity.setIcon(dest, stack.getItem());
- new TeleporterNexusScreen(blockEntity, player).open();
+ setSlots();
+ if (screenHandler != null)
+ screenHandler.syncState();
}
return false;
}
diff --git a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusNameEditorScreen.java b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusNameEditorScreen.java
new file mode 100644
index 0000000..f4d33ea
--- /dev/null
+++ b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusNameEditorScreen.java
@@ -0,0 +1,29 @@
+package moe.nea.funnyteleporters;
+
+import eu.pb4.sgui.api.elements.GuiElementBuilder;
+import eu.pb4.sgui.api.gui.AnvilInputGui;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.text.Text;
+
+import java.util.Optional;
+
+public class TeleporterNexusNameEditorScreen extends AnvilInputGui {
+ private final TeleporterNexusEditorScreen previous;
+
+ public TeleporterNexusNameEditorScreen(TeleporterNexusEditorScreen previous) {
+ super(previous.getPlayer(), false);
+ this.previous = previous;
+ setTitle(Text.literal("Edit Name"));
+ setSlot(2, GuiElementBuilder.from(new ItemStack(Items.OAK_SIGN))
+ .setName(Text.literal("Click here to save"))
+ .setCallback(this::save));
+ setDefaultInputValue(previous.blockEntity.getName(previous.dest).orElse(""));
+ }
+
+ void save() {
+ previous.blockEntity.setName(previous.dest, Optional.of(getInput()));
+ previous.setSlots();
+ previous.open();
+ }
+}
diff --git a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusScreen.java b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusScreen.java
index 302d630..1413519 100644
--- a/src/main/java/moe/nea/funnyteleporters/TeleporterNexusScreen.java
+++ b/src/main/java/moe/nea/funnyteleporters/TeleporterNexusScreen.java
@@ -40,10 +40,10 @@ public class TeleporterNexusScreen extends SimpleGui {
}
}
- private GuiElementBuilderInterface<?> getHandlerForEntry(Map.Entry<TeleporterDestination, RegistryEntry<Item>> entry) {
+ private GuiElementBuilderInterface<?> getHandlerForEntry(Map.Entry<TeleporterDestination, TeleporterNexusBlockEntity.Label> entry) {
var dest = entry.getKey();
- return GuiElementBuilder.from(new ItemStack(entry.getValue()))
- .setName(Text.literal("Teleport to"))
+ return GuiElementBuilder.from(new ItemStack(entry.getValue().item()))
+ .setName(Text.literal("Teleport to" + entry.getValue().label().map(it -> " " + it).orElse("")))
.hideDefaultTooltip()
.addLoreLine(Text.literal(String.format("x: %d, y: %d, z: %d", dest.blockPos().getX(), dest.blockPos().getY(), dest.blockPos().getZ()))
.setStyle(Style.EMPTY.withItalic(false).withColor(Formatting.AQUA)))
diff --git a/src/main/java/moe/nea/funnyteleporters/Utils.java b/src/main/java/moe/nea/funnyteleporters/Utils.java
index 9fae3d1..b0a1649 100644
--- a/src/main/java/moe/nea/funnyteleporters/Utils.java
+++ b/src/main/java/moe/nea/funnyteleporters/Utils.java
@@ -3,7 +3,9 @@ package moe.nea.funnyteleporters;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
+import net.minecraft.text.Style;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
import net.minecraft.util.Unit;
import java.util.Iterator;
@@ -21,4 +23,12 @@ public class Utils {
it.next();
}
}
+
+ public static Style emptyLoreStyle() {
+ return Style.EMPTY.withItalic(false);
+ }
+
+ public static Style colouredLoreStyle(Formatting formatting) {
+ return emptyLoreStyle().withColor(formatting);
+ }
}