Skip to content

Commit

Permalink
feat(sample-site): improved sample site rendering
Browse files Browse the repository at this point in the history
- Added Chunk sync packet for sample site map sync
- Cleaned logic on render event in favor of behaviour class
- Added sync step on player interaction
  • Loading branch information
D4RKAR117 committed Jun 7, 2024
1 parent 5e6ee4d commit b4a23d8
Show file tree
Hide file tree
Showing 12 changed files with 339 additions and 129 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ mod_name=Cog Works Engineering
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=PolyFormPerimeter-1.0
# The mod version. See https://semver.org/
mod_version=0.4.1
mod_version=0.4.2
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/darkar/cog_works/CogWorks.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.server.ServerStartingEvent;
import org.darkar.cog_works.net.NetworkHandler;
import org.slf4j.Logger;

// The value here should match an entry in the META-INF/neoforge.mods.toml file
Expand All @@ -31,6 +32,9 @@ public CogWorks(IEventBus modEventBus, ModContainer modContainer)
{
// Register the commonSetup method for modloading
modEventBus.addListener(this::commonSetup);

// Initialize Network Handling
modEventBus.addListener(NetworkHandler::onPayloadHandlersRegister);

// Initialize mod registries
Registry.initialize(modEventBus);
Expand Down
20 changes: 17 additions & 3 deletions src/main/java/org/darkar/cog_works/item/ProspectingPickItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.InteractionHand;
Expand All @@ -17,9 +19,11 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk;
import net.neoforged.neoforge.common.extensions.IItemExtension;
import net.neoforged.neoforge.network.PacketDistributor;
import org.darkar.cog_works.item.component.IsDiggingSample;
import org.darkar.cog_works.item.renderer.ProspectingPickItemRenderer;
import org.darkar.cog_works.level.chunk.attachment.ChunkSampleSiteMap;
import org.darkar.cog_works.net.payload.client.ClientSampleSiteMapUpdatePayload;
import org.darkar.cog_works.utils.enums.SampleSiteRegion;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.animatable.SingletonGeoAnimatable;
Expand Down Expand Up @@ -103,7 +107,7 @@ public boolean canAttackBlock(BlockState pState, Level pLevel, BlockPos pPos, Pl
return false;
}

public void handleLeftClickBlock(Player player, Level level, BlockPos pos) {
public void handleLeftClickBlock(Player player, Level level, BlockPos pos, Direction face) {
if (level instanceof ServerLevel serverLevel) {

BlockState blockState = serverLevel.getBlockState(pos);
Expand Down Expand Up @@ -155,8 +159,13 @@ public void handleLeftClickBlock(Player player, Level level, BlockPos pos) {

chunkSampleSiteMap = new ChunkSampleSiteMap(pos, chunkSampleSiteMap.deepPos(),
surfaceSiteState,
chunkSampleSiteMap.deepState());
chunkSampleSiteMap.deepState(),
face, chunkSampleSiteMap.deepFace());
chunk.setData(CHUNK_SAMPLE_SITE_MAP, chunkSampleSiteMap);
PacketDistributor.sendToPlayer((ServerPlayer) player, new ClientSampleSiteMapUpdatePayload(
chunkSampleSiteMap.surfacePos(), chunkSampleSiteMap.deepPos(),
chunkSampleSiteMap.surfaceState(), chunkSampleSiteMap.deepState(),
chunkSampleSiteMap.surfaceFace(), chunkSampleSiteMap.deepFace()));
}

case DEEP -> {
Expand All @@ -180,8 +189,13 @@ public void handleLeftClickBlock(Player player, Level level, BlockPos pos) {
triggerAnim(player, GeoItem.getOrAssignId(itemStack, serverLevel), "dig_sample_controller",
"dig_sample");
chunkSampleSiteMap = new ChunkSampleSiteMap(chunkSampleSiteMap.surfacePos(), pos,
chunkSampleSiteMap.surfaceState(), deepSiteState);
chunkSampleSiteMap.surfaceState(), deepSiteState,
chunkSampleSiteMap.surfaceFace(), face);
chunk.setData(CHUNK_SAMPLE_SITE_MAP, chunkSampleSiteMap);
PacketDistributor.sendToPlayer((ServerPlayer) player, new ClientSampleSiteMapUpdatePayload(
chunkSampleSiteMap.surfacePos(), chunkSampleSiteMap.deepPos(),
chunkSampleSiteMap.surfaceState(), chunkSampleSiteMap.deepState(),
chunkSampleSiteMap.surfaceFace(), chunkSampleSiteMap.deepFace()));

}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.darkar.cog_works.item.events;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand All @@ -23,6 +24,7 @@ public static void onPlayerLeftClickBlock(PlayerInteractEvent.LeftClickBlock eve
Level level = event.getLevel();
Player player = event.getEntity();
BlockPos pos = event.getPos();
Direction face = event.getFace();
LogicalSide side = event.getSide();
PlayerInteractEvent.LeftClickBlock.Action action = event.getAction();

Expand All @@ -31,7 +33,7 @@ public static void onPlayerLeftClickBlock(PlayerInteractEvent.LeftClickBlock eve
if (item instanceof ProspectingPickItem) {
if (side.isServer()) {
if(!player.isCreative() && action == PlayerInteractEvent.LeftClickBlock.Action.START) {
if(!event.isCanceled()) ((ProspectingPickItem) item).handleLeftClickBlock(player, level, pos);
if(!event.isCanceled()) ((ProspectingPickItem) item).handleLeftClickBlock(player, level, pos, face);
event.setCanceled(true);
}
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,40 @@

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import io.netty.buffer.ByteBuf;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;

public record ChunkSampleSiteMap(BlockPos surfacePos, BlockPos deepPos, BlockState surfaceState, BlockState deepState) {
public record ChunkSampleSiteMap(BlockPos surfacePos, BlockPos deepPos, BlockState surfaceState, BlockState deepState
, Direction surfaceFace, Direction deepFace) {

public static final ChunkSampleSiteMap DEFAULT =
new ChunkSampleSiteMap(BlockPos.ZERO, BlockPos.ZERO, Blocks.AIR.defaultBlockState(), Blocks.AIR.defaultBlockState());
new ChunkSampleSiteMap(BlockPos.ZERO, BlockPos.ZERO, Blocks.AIR.defaultBlockState(),
Blocks.AIR.defaultBlockState(), Direction.NORTH, Direction.NORTH);

public static final Codec<ChunkSampleSiteMap> CODEC = RecordCodecBuilder.create(instance -> instance.group(
BlockPos.CODEC.fieldOf("surfacePos").forGetter(ChunkSampleSiteMap::surfacePos),
BlockPos.CODEC.fieldOf("deepPos").forGetter(ChunkSampleSiteMap::deepPos),
BlockState.CODEC.fieldOf("surfaceState").forGetter(ChunkSampleSiteMap::surfaceState),
BlockState.CODEC.fieldOf("deepState").forGetter(ChunkSampleSiteMap::deepState)
BlockState.CODEC.fieldOf("deepState").forGetter(ChunkSampleSiteMap::deepState),
Direction.CODEC.fieldOf("surfaceFace").forGetter(ChunkSampleSiteMap::surfaceFace),
Direction.CODEC.fieldOf("deepFace").forGetter(ChunkSampleSiteMap::deepFace)
).apply(instance, ChunkSampleSiteMap::new)
);

@SuppressWarnings("deprecation")
public static final StreamCodec<ByteBuf, ChunkSampleSiteMap> STREAM_CODEC = StreamCodec.composite(
BlockPos.STREAM_CODEC, ChunkSampleSiteMap::surfacePos,
BlockPos.STREAM_CODEC, ChunkSampleSiteMap::deepPos,
ByteBufCodecs.idMapper(Block.BLOCK_STATE_REGISTRY), ChunkSampleSiteMap::surfaceState,
ByteBufCodecs.idMapper(Block.BLOCK_STATE_REGISTRY), ChunkSampleSiteMap::deepState,
Direction.STREAM_CODEC, ChunkSampleSiteMap::surfaceFace,
Direction.STREAM_CODEC, ChunkSampleSiteMap::deepFace,
ChunkSampleSiteMap::new
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.darkar.cog_works.level.events;

import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
import org.darkar.cog_works.level.renderer.SampleSiteRenderBehaviour;

import static org.darkar.cog_works.CogWorks.MOD_ID;

@EventBusSubscriber(modid = MOD_ID, value = Dist.CLIENT)
public class ClientLevelEvents {

@SubscribeEvent
public static void onRenderLevelStage(final RenderLevelStageEvent event) {
RenderLevelStageEvent.Stage stage = event.getStage();
Minecraft minecraft = Minecraft.getInstance();
if (stage == RenderLevelStageEvent.Stage.AFTER_PARTICLES) {
if (minecraft.player != null) {
Frustum frustum = event.getFrustum();
PoseStack poseStack = event.getPoseStack();
Camera camera = event.getCamera();
SampleSiteRenderBehaviour.render(frustum, poseStack, camera);

}
}
}
}
34 changes: 34 additions & 0 deletions src/main/java/org/darkar/cog_works/level/events/LevelEvents.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.darkar.cog_works.level.events;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.chunk.LevelChunk;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.level.ChunkWatchEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import org.darkar.cog_works.level.chunk.attachment.ChunkSampleSiteMap;
import org.darkar.cog_works.net.payload.client.ClientSampleSiteMapUpdatePayload;

import static org.darkar.cog_works.CogWorks.MOD_ID;
import static org.darkar.cog_works.Registry.DataAttachments.CHUNK_SAMPLE_SITE_MAP;

@EventBusSubscriber(modid = MOD_ID)
public class LevelEvents {

@SubscribeEvent
public static void onChunkSent(final ChunkWatchEvent.Sent event) {
LevelChunk chunk = event.getChunk();
ServerLevel serverLevel = event.getLevel();
ChunkPos pos = chunk.getPos();
if (chunk.hasAttachments() && chunk.hasData(CHUNK_SAMPLE_SITE_MAP)) {
ChunkSampleSiteMap chunkSampleSiteMap = chunk.getData(CHUNK_SAMPLE_SITE_MAP);
ClientSampleSiteMapUpdatePayload payload = new ClientSampleSiteMapUpdatePayload(
chunkSampleSiteMap.surfacePos(), chunkSampleSiteMap.deepPos(), chunkSampleSiteMap.surfaceState(),
chunkSampleSiteMap.deepState(), chunkSampleSiteMap.surfaceFace(), chunkSampleSiteMap.deepFace()
);
PacketDistributor.sendToPlayersTrackingChunk(serverLevel, pos, payload);
}
}

}
121 changes: 0 additions & 121 deletions src/main/java/org/darkar/cog_works/level/events/RenderEvents.java

This file was deleted.

Loading

0 comments on commit b4a23d8

Please sign in to comment.