Skip to content

Commit

Permalink
done by all
Browse files Browse the repository at this point in the history
  • Loading branch information
KrLite committed Mar 9, 2024
1 parent cac8555 commit bf6f6e0
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 10 deletions.
15 changes: 15 additions & 0 deletions src/main/java/net/krlite/knowledges/KnowledgesClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,22 @@
import me.shedaniel.autoconfig.serializer.PartitioningSerializer;
import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.krlite.knowledges.api.entrypoint.ComponentProvider;
import net.krlite.knowledges.api.entrypoint.DataProvider;
import net.krlite.knowledges.api.representable.PacketByteBufWritable;
import net.krlite.knowledges.api.representable.Representable;
import net.krlite.knowledges.impl.component.AbstractInfoComponent;
import net.krlite.knowledges.config.KnowledgesConfig;
import net.krlite.knowledges.manager.KnowledgesComponentManager;
import net.krlite.knowledges.manager.KnowledgesDataManager;
import net.krlite.knowledges.networking.KnowledgesNetworking;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
Expand Down Expand Up @@ -52,6 +59,7 @@ public static MutableText localize(String category, String... paths) {
@Override
public void onInitializeClient() {
AbstractInfoComponent.Animation.registerEvents();
KnowledgesNetworking.registerClient();

// Components
FabricLoader.getInstance().getEntrypointContainers(KnowledgesCommon.ID, ComponentProvider.class).forEach(entrypoint -> {
Expand Down Expand Up @@ -133,8 +141,15 @@ public void onInitializeClient() {
));
}

ClientTickEvents.END_CLIENT_TICK.register(HUD::tick);
HudRenderCallback.EVENT.register(((context, tickDelta) -> {
HUD.render(context, COMPONENTS::render);
}));
}

public static void requestDataFor(PacketByteBufWritable writable, Identifier channel) {
PacketByteBuf buf = PacketByteBufs.create();
writable.writeToBuf(buf);
ClientPlayNetworking.send(channel, buf);
}
}
90 changes: 81 additions & 9 deletions src/main/java/net/krlite/knowledges/KnowledgesHud.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,63 @@

import com.mojang.blaze3d.systems.RenderSystem;
import net.krlite.equator.render.frame.FrameInfo;
import net.krlite.knowledges.api.component.Knowledge;
import net.krlite.knowledges.api.proxy.RenderProxy;
import net.krlite.knowledges.api.representable.BlockRepresentable;
import net.krlite.knowledges.api.representable.Representable;
import net.krlite.knowledges.impl.representable.EmptyRepresentable;
import net.krlite.knowledges.impl.representable.KnowledgesBlockRepresentable;
import net.krlite.knowledges.impl.representable.KnowledgesEntityRepresentable;
import net.krlite.knowledges.impl.representable.KnowledgesRepresentable;
import net.krlite.knowledges.mixin.client.InGameHudInvoker;
import net.krlite.knowledges.networking.KnowledgesNetworking;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.Identifier;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.GameMode;
import net.minecraft.world.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class KnowledgesHud {
private NbtCompound data = new NbtCompound();

@Nullable
private Representable<?> representable;

public void setRepresentable(@NotNull Representable<?> representable) {
this.representable = representable;
private boolean hasServer = false;

public void onReceiveData(NbtCompound data) {
this.data = data;
}

public void clearData() {
data = new NbtCompound();
}

public void clearRepresentable() {
this.representable = null;
public void setConnectionStatus(boolean hasServer) {
this.hasServer = hasServer;
}

public Optional<Representable<?>> getRepresentable() {
return Optional.ofNullable(representable);
public NbtCompound data() {
return data;
}

public boolean hasServer() {
return hasServer;
}

public void render(DrawContext context, BiConsumer<RenderProxy, Representable<?>> renderConsumer) {
getRepresentable().ifPresent(rep -> {
Optional.ofNullable(representable).ifPresent(rep -> {

RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
Expand Down Expand Up @@ -66,4 +90,52 @@ public void render(DrawContext context, BiConsumer<RenderProxy, Representable<?>
context.getMatrices().pop();
});
}

public void tick(MinecraftClient client) {
World world = client.world;
PlayerEntity player = client.player;
HitResult hitResult = client.crosshairTarget;
if (world == null || player == null || hitResult == null) return;

Representable<?> representable = null;
if (hitResult.getType() == HitResult.Type.MISS) {
representable = fillBuilder(client, EmptyRepresentable.Builder.create())
.hitResult(hitResult)
.build();
} else if (hitResult instanceof BlockHitResult blockHitResult) {
BlockPos blockPos = blockHitResult.getBlockPos();
representable = fillBuilder(client, KnowledgesBlockRepresentable.Builder.create())
.hitResult(blockHitResult)
.blockState(world.getBlockState(blockPos))
.blockEntity(world.getBlockEntity(blockPos))
.build();
} else if (hitResult instanceof EntityHitResult entityHitResult) {
representable = fillBuilder(client, KnowledgesEntityRepresentable.Builder.create())
.hitResult(entityHitResult)
.entity(entityHitResult.getEntity())
.build();
}

this.representable = representable;

if (representable != null && representable.hasServer()) {
Identifier channel = null;
switch (representable.type()) {
case BLOCK -> channel = KnowledgesNetworking.PACKET_PEEK_BLOCK;
case ENTITY -> channel = KnowledgesNetworking.PACKET_PEEK_ENTITY;
}

if (channel != null) {
KnowledgesClient.requestDataFor(representable, channel);
}
}
}

protected <B extends Representable.Builder<?, ?, B>> B fillBuilder(MinecraftClient client, B instance) {
return instance
.world(client.world)
.player(client.player)
.hasServer(hasServer())
.data(data());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.krlite.knowledges.api.representable;

import net.minecraft.network.PacketByteBuf;

public interface PacketByteBufWritable {
void writeToBuf(PacketByteBuf buf);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import java.util.function.Supplier;

public interface Representable<H extends HitResult> {
public interface Representable<H extends HitResult> extends PacketByteBufWritable {
default boolean hasHitResult() {
return hitResult() != null && hitResult().getType() != HitResult.Type.MISS;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import net.krlite.knowledges.api.representable.Representable;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;

Expand All @@ -18,6 +19,11 @@ public HitResult.Type type() {
return HitResult.Type.MISS;
}

@Override
public void writeToBuf(PacketByteBuf buf) {
// Nothing to write.
}

public static class Builder extends KnowledgesRepresentable.Builder<HitResult> implements Representable.Builder<HitResult, EmptyRepresentable, Builder> {
@Override
public Builder hitResultSupplier(Supplier<HitResult> hitResultSupplier) {
Expand Down

0 comments on commit bf6f6e0

Please sign in to comment.