mirror of
https://github.com/FatherToast/SpecialMobs.git
synced 2025-08-05 18:01:51 +00:00
Made ninja disguises more sneaky
This commit is contained in:
parent
f975d9f5c1
commit
c7c847aa71
7 changed files with 9 additions and 126 deletions
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue