Skip to content

Commit

Permalink
EditorPanel
Browse files Browse the repository at this point in the history
  • Loading branch information
ofek2608 committed Jan 3, 2025
1 parent 8ab39cc commit 9534139
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 22 deletions.
11 changes: 11 additions & 0 deletions src/main/java/com/infinite_parkour/infinite_parkour/IPKUtils.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package com.infinite_parkour.infinite_parkour;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings;
Expand Down Expand Up @@ -55,4 +59,11 @@ public static void intToPos(int posInt, BlockPos.MutableBlockPos pos) {
pos.setY((posInt >> 6) & 0x3F);
pos.setZ((posInt >> 12) & 0x3F);
}

public static void setAttribute(ServerPlayer player, Holder<Attribute> blockBreakSpeed, double value) {
var instance = player.getAttributes().getInstance(Attributes.BLOCK_BREAK_SPEED);
if (instance != null) {
instance.setBaseValue(value);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.infinite_parkour.infinite_parkour.environment;

import com.mojang.math.Transformation;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Display;
Expand All @@ -10,29 +12,31 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.EntityHitResult;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.function.Consumer;

public abstract class BaseEnvironment extends Environment {
private final Map<UUID, Runnable> actions = new HashMap<>();
private final Map<UUID, Consumer<ServerPlayer>> actions = new HashMap<>();

protected BaseEnvironment() {}

@Override
public InteractionResult onUseEntity(Player player, InteractionHand interactionHand, Entity entity, @Nullable EntityHitResult entityHitResult) {
Runnable action = actions.get(entity.getUUID());
Consumer<ServerPlayer> action = actions.get(entity.getUUID());
if (action == null) {
return InteractionResult.PASS;
}
if (entityHitResult == null) {
action.run();
action.accept((ServerPlayer)player);
}
return InteractionResult.SUCCESS;
}

protected void createInteraction(double x, double y, double z, float width, float height, Runnable action) {
public void createInteraction(double x, double y, double z, float width, float height, Consumer<ServerPlayer> action) {
Interaction interaction = new Interaction(EntityType.INTERACTION, level);
interaction.setPos(x, y, z);
interaction.setWidth(width);
Expand All @@ -41,19 +45,31 @@ protected void createInteraction(double x, double y, double z, float width, floa
actions.put(interaction.getUUID(), action);
}

protected void createTextDisplay(double x, double y, double z, float yRot, Component text) {
public UUID createTextDisplay(double x, double y, double z, float yRot, Component text) {
Display.TextDisplay display = new Display.TextDisplay(EntityType.TEXT_DISPLAY, level);
display.setPos(x, y, z);
display.setText(text);
display.setYRot(yRot);
level.addFreshEntity(display);
return display.getUUID();
}

protected void createTextDisplay(double x, double y, double z, Component text) {
public UUID createTextDisplay(double x, double y, double z, float yRot, float scale, Component text) {
Display.TextDisplay display = new Display.TextDisplay(EntityType.TEXT_DISPLAY, level);
display.setPos(x, y, z);
display.setText(text);
display.setYRot(yRot);
display.setTransformation(new Transformation(null, null, new Vector3f(scale), null));
level.addFreshEntity(display);
return display.getUUID();
}

public UUID createTextDisplay(double x, double y, double z, Component text) {
Display.TextDisplay display = new Display.TextDisplay(EntityType.TEXT_DISPLAY, level);
display.setPos(x, y, z);
display.setText(text);
display.setBillboardConstraints(Display.BillboardConstraints.VERTICAL);
level.addFreshEntity(display);
return display.getUUID();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ private void createBuilder(double x, double z, float yRot, String name, String t
createTextDisplay(x, -5.45, z, yRot, Component.literal(title).withStyle(ChatFormatting.GRAY));
createInteraction(x, -7.0, z, 1.1f, 2.0f, name.equals("Join us!") ?
this::showDiscord :
() -> player.displayClientMessage(Component.literal("Thanks to " + name), false)
player -> player.displayClientMessage(Component.literal("Thanks to " + name), false)
);
}

Expand All @@ -92,16 +92,16 @@ private void createBuilder(double x, double z, float yRot, String name, String t
.withHoverEvent(HOVER_CLICK)
);

private void showYoutube() {
private void showYoutube(ServerPlayer player) {
player.displayClientMessage(YOUTUBE_COMPONENT, false);

}

private void showDiscord() {
private void showDiscord(ServerPlayer player) {
player.displayClientMessage(DISCORD_COMPONENT, false);
}

private void teleportEditor() {
private void teleportEditor(ServerPlayer player) {
delete();
new EditorEnvironment(player);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.infinite_parkour.infinite_parkour.environment.editor;

import com.infinite_parkour.infinite_parkour.IPKUtils;
import com.infinite_parkour.infinite_parkour.environment.SinglePlayerEnvironment;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
Expand All @@ -19,12 +20,14 @@ public class EditorEnvironment extends SinglePlayerEnvironment {
private final EditorItemsManager items;
private final EditorCanvas canvas;
private final EditorHolograms holograms;
private final EditorPanel panel;

public EditorEnvironment(ServerPlayer player) {
super(player);
this.items = new EditorItemsManager(player);
this.canvas = new EditorCanvas(level);
this.holograms = new EditorHolograms(level, canvas);
this.panel = new EditorPanel(this, holograms);
respawn();
}

Expand Down Expand Up @@ -74,8 +77,8 @@ private void giveAbilities() {
player.getAbilities().mayfly = true;
player.getAbilities().instabuild = true;
player.onUpdateAbilities();
player.getAttributes().getInstance(Attributes.BLOCK_BREAK_SPEED).setBaseValue(0);
player.getAttributes().getInstance(Attributes.BLOCK_INTERACTION_RANGE).setBaseValue(10);
IPKUtils.setAttribute(player, Attributes.BLOCK_BREAK_SPEED, 0);
IPKUtils.setAttribute(player, Attributes.BLOCK_INTERACTION_RANGE, 10);
}

private void respawn() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ public class EditorHolograms {
private static final int[] POS_X = {18, 22, 26, 36, 40, 44};
private static final int POS_Y = 33;
private static final int[] POS_Z = {-20, -16, -12, -8, -4};
private static final int COUNT = POS_X.length * POS_Z.length;
private final ServerLevel level;
private final List<JumpData> jumps = new ArrayList<>();
private final List<UUID> hologramBases = new ArrayList<>();
private final EditorCanvas canvas;
private int page = 0;
private int loadingI = 0;

public EditorHolograms(ServerLevel level, EditorCanvas canvas) {
this.level = level;
Expand Down Expand Up @@ -101,15 +103,15 @@ public boolean onUseBlock(Player player, BlockPos pos) {

@Nullable
private JumpData getJump(int i) {
i += page * 30;
i += page * COUNT;
if (i >= jumps.size()) {
return null;
}
return jumps.get(i);
}

private void setJump(int i, @Nullable JumpData data) {
i += page * 30;
i += page * COUNT;
while (i >= jumps.size()) {
jumps.add(null);
}
Expand All @@ -121,20 +123,27 @@ private Entity getHologramBase(int i) {
return level.getEntity(hologramBases.get(i));
}

private void cleanupHologram(int i) {
Entity entity = getHologramBase(i);
if (entity != null) {
entity.getPassengers().forEach(e -> e.remove(Entity.RemovalReason.DISCARDED));
level.setBlockAndUpdate(entity.blockPosition(), Blocks.ORANGE_STAINED_GLASS.defaultBlockState());
private void cleanupHologram(Entity base) {
base.getPassengers().forEach(e -> e.remove(Entity.RemovalReason.DISCARDED));
level.setBlockAndUpdate(base.blockPosition(), Blocks.ORANGE_STAINED_GLASS.defaultBlockState());
}

private void cleanupAll() {
for (int i = 0; i < COUNT; i++) {
Entity base = getHologramBase(i);
if (base != null) {
cleanupHologram(base);
}
}
loadingI = 0;
}

private void updateHologram(int i) {
cleanupHologram(i);
Entity base = getHologramBase(i);
if (base == null) {
return;
}
cleanupHologram(base);
JumpData jumpData = getJump(i);
if (jumpData == null) {
level.setBlockAndUpdate(base.blockPosition(), Blocks.BLACK_STAINED_GLASS.defaultBlockState());
Expand Down Expand Up @@ -191,15 +200,15 @@ private void updateHologram(int i) {
blockDisplay.setBlockState(blockData.state());
blockDisplay.setPos(base.getX(), base.getY(), base.getZ());
blockDisplay.setViewRange(10 / 64.0f); // 10 blocks
blockDisplay.setYRot(getHologramYaw());
blockDisplay.setYRot(yaw);
level.addFreshEntity(blockDisplay);
blockDisplay.startRiding(base, true);
}
}

public void tick() {
float yaw = getHologramYaw();
for (int i = 0; i < 30; i++) {
for (int i = 0; i < COUNT; i++) {
Entity entity = getHologramBase(i);
if (entity == null) {
continue;
Expand All @@ -209,9 +218,42 @@ public void tick() {
passenger.setYRot(yaw);
}
}
if (loadingI < COUNT) {
updateHologram(loadingI);
loadingI++;
}
}

private float getHologramYaw() {
return (float) ((level.getGameTime() % 180) * 2);
}

public int getPage() {
return page;
}

public boolean setPage(int page) {
if (canSetPage(page)) {
this.page = page;
cleanupAll();
return true;
}
return false;
}

public boolean canSetPage(int page) {
if (page < 0 || page == this.page) {
return false;
}
int pageStart = page * COUNT;
if (page == 0 || pageStart < jumps.size()) {
return true;
}
for (int i = pageStart - COUNT; i < jumps.size(); i++) {
if (jumps.get(i) != null) {
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.infinite_parkour.infinite_parkour.environment.editor;

import com.mojang.math.Transformation;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Display;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.block.Blocks;
import org.joml.Vector3f;

import java.util.UUID;

public class EditorPanel {
private final ServerLevel level;
private final EditorHolograms holograms;
private final UUID pageText;

public EditorPanel(EditorEnvironment env, EditorHolograms holograms) {
this.level = env.level;
this.holograms = holograms;
env.createTextDisplay(31.5, 37.0, -30.99, 0, 2, Component.literal("Editor Controls").withStyle(ChatFormatting.GOLD));
env.createTextDisplay(31.5, 36.0, -30.99, 0, 1.5f, Component.literal("Pack").withStyle(ChatFormatting.YELLOW));
env.createTextDisplay(31.5, 35.5, -30.99, 0, 1.5f, Component.literal("my_pack").withStyle(ChatFormatting.WHITE));
env.createTextDisplay(31.5, 34.5, -30.99, 0, 1.5f, Component.literal("Page").withStyle(ChatFormatting.YELLOW));
pageText = env.createTextDisplay(31.5, 34.0, -30.99, 0, 1.5f, Component.literal("0").withStyle(ChatFormatting.WHITE));

env.createInteraction(31.5, 35.4, -33.49, 5, 0.5f, this::openSelectPack);
createPageArrow(env, true);
createPageArrow(env, false);
}

private void createPageArrow(EditorEnvironment env, boolean prev) {
var nextPage = new Display.BlockDisplay(EntityType.BLOCK_DISPLAY, level);
nextPage.setPos(prev ? 30.5 : 32.5, 34.2, prev ? -30.99 : -31.49);
nextPage.setTransformation(new Transformation(null, null, new Vector3f(0.5f), null));
nextPage.setBlockState(Blocks.SMOOTH_QUARTZ_STAIRS.defaultBlockState());
nextPage.setYRot(prev ? -90 : 90);
nextPage.setXRot(45);
level.addFreshEntity(nextPage);

int offset = prev ? -1 : 1;
env.createInteraction(prev ? 30.75 : 32.25, 33.8, -31.29, 0.6f, 0.8f, player -> movePage(offset));
}

private void openSelectPack(ServerPlayer player) {
// TODO open GUI
player.displayClientMessage(Component.literal("TODO Select Pack"), false);
}

private void movePage(int offset) {
int newPage = holograms.getPage() + offset;
if (holograms.setPage(newPage)) {
if (level.getEntity(pageText) instanceof Display.TextDisplay display) {
display.setText(Component.literal("" + newPage));
}
}
}
}

0 comments on commit 9534139

Please sign in to comment.