Made ninja disguises more sneaky

This commit is contained in:
Sarinsa 2022-06-30 14:44:24 +02:00 committed by Sarinsa
parent f975d9f5c1
commit c7c847aa71
7 changed files with 9 additions and 126 deletions

View file

@ -1,28 +0,0 @@
package fathertoast.specialmobs.client;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Here we cache model data for ninja block disguises
* in order to avoid refreshing model data each frame.
*/
public class NinjaModelDataHolder {
private static final Map<Integer, IModelData> MODEL_DATA = new ConcurrentHashMap<>();
public static void putModelData(int entityId, @Nullable IModelData modelData) {
MODEL_DATA.put(entityId, modelData == null ? EmptyModelData.INSTANCE : modelData);
}
@Nonnull
public static IModelData getModelData(int entityId) {
return MODEL_DATA.getOrDefault(entityId, EmptyModelData.INSTANCE);
}
}

View file

@ -1,27 +1,23 @@
package fathertoast.specialmobs.client.renderer.entity;
import com.mojang.blaze3d.matrix.MatrixStack;
import fathertoast.specialmobs.client.NinjaModelDataHolder;
import fathertoast.specialmobs.common.entity.ai.INinja;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.entity.monster.AbstractSkeletonEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.IBlockDisplayReader;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.model.ModelDataManager;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData;
import org.apache.commons.lang3.ThreadUtils;
import javax.annotation.ParametersAreNonnullByDefault;
import java.util.Random;
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@ -44,16 +40,15 @@ public class NinjaSkeletonRenderer extends SpecialSkeletonRenderer {
}
else {
shadowRadius = 0.0F;
renderBlockDisguise( entity.getId(), disguiseBlock, matrixStack, buffer, packedLight );
renderBlockDisguise( disguiseBlock, entity.blockPosition(), entity.level, matrixStack, buffer, entity.getRandom() );
}
}
private void renderBlockDisguise( int entityId, BlockState block, MatrixStack matrixStack, IRenderTypeBuffer buffer, int packedLight ) {
private void renderBlockDisguise( BlockState block, BlockPos pos, IBlockDisplayReader displayReader, MatrixStack matrixStack, IRenderTypeBuffer buffer, Random random ) {
matrixStack.pushPose();
matrixStack.translate( -0.5, 0.0, -0.5 );
IModelData modelData = NinjaModelDataHolder.getModelData( entityId );
blockRenderer.renderBlock( block, matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, modelData );
blockRenderer.renderModel( block, pos, displayReader, matrixStack, buffer.getBuffer(RenderType.cutout()), false, random, EmptyModelData.INSTANCE );
matrixStack.popPose();
}

View file

@ -13,6 +13,8 @@ import fathertoast.specialmobs.datagen.loot.LootTableBuilder;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.renderer.BlockRendererDispatcher;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
@ -250,7 +252,6 @@ public class NinjaSkeletonEntity extends _SpecialSkeletonEntity implements INinj
@Override
public void setHiddenDragon( @Nullable BlockState block ) {
getEntityData().set( HIDING_BLOCK, Optional.ofNullable( block ) );
NetworkHelper.updateNinjaModelData( level, getId(), blockPosition().below() );
canHide = false;
// Smoke puff when emerging from disguise

View file

@ -1,22 +1,5 @@
package fathertoast.specialmobs.common.network;
import fathertoast.specialmobs.common.core.SpecialMobs;
import fathertoast.specialmobs.common.network.message.S2CUpdateNinjaModelData;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import java.util.List;
public class NetworkHelper {
public static void updateNinjaModelData(World world, int entityId, BlockPos pos) {
if (world.isClientSide) {
SpecialMobs.LOG.warn("Attempted to send ninja block model data packet from client side. What?");
return;
}
List<ServerPlayerEntity> recipients = ((ServerWorld)world).players();
recipients.forEach(player -> PacketHandler.sendToClient(new S2CUpdateNinjaModelData(entityId, pos), player));
}
}

View file

@ -1,7 +1,6 @@
package fathertoast.specialmobs.common.network;
import fathertoast.specialmobs.common.core.SpecialMobs;
import fathertoast.specialmobs.common.network.message.S2CUpdateNinjaModelData;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
@ -34,7 +33,7 @@ public class PacketHandler {
}
public final void registerMessages() {
registerMessage(S2CUpdateNinjaModelData.class, S2CUpdateNinjaModelData::encode, S2CUpdateNinjaModelData::decode, S2CUpdateNinjaModelData::handle);
}
public <MSG> void registerMessage(Class<MSG> messageType, BiConsumer<MSG, PacketBuffer> encoder, Function<PacketBuffer, MSG> decoder, BiConsumer<MSG, Supplier<NetworkEvent.Context>> messageConsumer) {

View file

@ -1,37 +0,0 @@
package fathertoast.specialmobs.common.network.message;
import fathertoast.specialmobs.common.network.work.ClientWork;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.network.NetworkEvent;
import java.util.function.Supplier;
public class S2CUpdateNinjaModelData {
public final int entityId;
public final BlockPos pos;
public S2CUpdateNinjaModelData(int entityId, BlockPos pos) {
this.entityId = entityId;
this.pos = pos;
}
public static void handle(S2CUpdateNinjaModelData message, Supplier<NetworkEvent.Context> contextSupplier) {
NetworkEvent.Context context = contextSupplier.get();
if (context.getDirection().getReceptionSide().isClient()) {
context.enqueueWork(() -> ClientWork.updateNinjaModelData(message));
}
context.setPacketHandled(true);
}
public static S2CUpdateNinjaModelData decode(PacketBuffer buffer) {
return new S2CUpdateNinjaModelData(buffer.readInt(), buffer.readBlockPos());
}
public static void encode(S2CUpdateNinjaModelData message, PacketBuffer buffer) {
buffer.writeInt(message.entityId);
buffer.writeBlockPos(message.pos);
}
}

View file

@ -1,34 +1,4 @@
package fathertoast.specialmobs.common.network.work;
import fathertoast.specialmobs.client.NinjaModelDataHolder;
import fathertoast.specialmobs.common.core.SpecialMobs;
import fathertoast.specialmobs.common.entity.ai.INinja;
import fathertoast.specialmobs.common.network.message.S2CUpdateNinjaModelData;
import net.minecraft.client.Minecraft;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity;
import net.minecraftforge.client.model.ModelDataManager;
import net.minecraftforge.client.model.data.IModelData;
public class ClientWork {
public static void updateNinjaModelData(S2CUpdateNinjaModelData message) {
ClientWorld world = Minecraft.getInstance().level;
if (world == null)
return;
Entity entity = world.getEntity(message.entityId);
if (entity == null)
return;
if (entity instanceof INinja) {
IModelData modelData = ModelDataManager.getModelData(world, message.pos);
NinjaModelDataHolder.putModelData(message.entityId, modelData);
}
else {
SpecialMobs.LOG.warn("Attempted to update block model data for entity with id \"{}\" and of type \"{}\", but the entity was not a ninja!", message.entityId, entity.getType().getRegistryName());
}
}
}