Pocket and limbo sky renderin

This commit is contained in:
SD 2021-03-23 11:42:03 +05:30
parent 8eccb31f95
commit 4f309acfea
13 changed files with 235 additions and 38 deletions

View file

@ -32,6 +32,8 @@ public class MyRenderLayer extends RenderLayer {
VertexFormats.POSITION_COLOR,
VertexFormat.DrawMode.QUADS,
256,
false,
false,
MultiPhaseParameters.builder()
.cull(DISABLE_CULLING)
.lightmap(RenderPhase.DISABLE_LIGHTMAP)
@ -53,6 +55,8 @@ public class MyRenderLayer extends RenderLayer {
VertexFormats.POSITION_COLOR_TEXTURE,
VertexFormat.DrawMode.QUADS,
256,
false,
false,
MultiPhaseParameters.builder()
.cull(DISABLE_CULLING)
.lightmap(RenderPhase.DISABLE_LIGHTMAP)

View file

@ -6,8 +6,7 @@ import net.minecraft.client.util.math.MatrixStack;
* A Transformer is a matrix stack consumer.
*
* <p>It modifies the matrices' transformations.
* It is not recommended to push/pop in any of
* the methods</p>
* It is not recommended to push/pop</p>
*/
public interface Transformer {
void transform(MatrixStack matrices);

View file

@ -58,7 +58,9 @@ public class RiftConfigurationToolItem extends ModItem {
EntityUtils.chat(player, Text.of("Id: " + ((IdMarker) rift.getDestination()).getId()));
} else {
int id = counter.increment();
sync(stack, player, hand);
ServerPacketHandler.get((ServerPlayerEntity) player).sync(stack, hand);
EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: " + id));
rift.setDestination(new IdMarker(id));
@ -95,7 +97,8 @@ public class RiftConfigurationToolItem extends ModItem {
}
} else if (CounterComponent.get(stack).count() != 0) {
CounterComponent.get(stack).reset();
sync(stack, player, hand);
ServerPacketHandler.get((ServerPlayerEntity) player).sync(stack, hand);
EntityUtils.chat(player, Text.of("Counter has been reset."));
return TypedActionResult.success(false);
@ -112,15 +115,4 @@ public class RiftConfigurationToolItem extends ModItem {
list.add(new TranslatableText(this.getTranslationKey() + ".info"));
}
}
// TODO: put in ServerPacketHandler
private void sync(ItemStack stack, PlayerEntity player, Hand hand) {
ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;
if (hand == Hand.OFF_HAND) {
ServerPacketHandler.sendPacket(serverPlayer, new PlayerInventorySlotUpdateS2CPacket(45, stack));
} else {
ServerPacketHandler.sendPacket(serverPlayer, new PlayerInventorySlotUpdateS2CPacket(serverPlayer.getInventory().selectedSlot, stack));
}
}
}

View file

@ -9,6 +9,7 @@ import org.dimdev.dimdoors.block.RiftProvider;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.mixin.accessor.ListTagAccessor;
import org.dimdev.dimdoors.network.ServerPacketHandler;
import org.dimdev.dimdoors.rift.registry.Rift;
import org.dimdev.dimdoors.util.EntityUtils;
import org.dimdev.dimdoors.util.Location;
@ -17,15 +18,20 @@ import org.jetbrains.annotations.Nullable;
import net.minecraft.block.BlockState;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.nbt.IntArrayTag;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.dynamic.DynamicSerializableUuid;
import net.minecraft.world.World;
@ -41,8 +47,6 @@ public class RiftKeyItem extends Item {
if (isEmpty(stack)) {
tooltip.add(new TranslatableText("item.dimdoors.rift_key.no_links"));
} else if (context.isAdvanced()) {
tooltip.add(LiteralText.EMPTY);
tooltip.add(new TranslatableText("item.dimdoors.rift_key.ids"));
for (UUID id : getIds(stack)) {
tooltip.add(new LiteralText(" " + id.toString()));
}
@ -65,6 +69,11 @@ public class RiftKeyItem extends Item {
return 30;
}
@Override
public void onCraft(ItemStack stack, World world, PlayerEntity player) {
stack.setTag(this.getDefaultStack().getTag());
}
@Override
public ItemStack getDefaultStack() {
ItemStack stack = super.getDefaultStack();
@ -91,6 +100,7 @@ public class RiftKeyItem extends Item {
entranceRiftBlockEntity.setLocked(false);
entranceRiftBlockEntity.markDirty();
EntityUtils.chat(player, new TranslatableText("rifts.unlocked"));
ServerPacketHandler.get((ServerPlayerEntity) player).sync(context.getStack(), context.getHand());
return ActionResult.SUCCESS;
} else {
EntityUtils.chat(player, new TranslatableText("rifts.cantUnlock"));
@ -100,6 +110,7 @@ public class RiftKeyItem extends Item {
add(context.getStack(), rift.getId());
entranceRiftBlockEntity.markDirty();
EntityUtils.chat(player, new TranslatableText("rifts.locked"));
ServerPacketHandler.get((ServerPlayerEntity) player).sync(context.getStack(), context.getHand());
return ActionResult.SUCCESS;
}
}
@ -108,7 +119,7 @@ public class RiftKeyItem extends Item {
public static boolean tryRemove(ItemStack stack, UUID id) {
IntArrayTag arrayTag = new IntArrayTag(DynamicSerializableUuid.toIntArray(id));
return stack.getOrCreateTag().getList("Ids", NbtType.LIST).remove(arrayTag);
return stack.getTag().getList("Ids", NbtType.LIST).remove(arrayTag);
}
public static void add(ItemStack stack, UUID id) {
@ -134,4 +145,11 @@ public class RiftKeyItem extends Item {
.map(DynamicSerializableUuid::toUuid)
.collect(Collectors.toList());
}
@Override
public void appendStacks(ItemGroup group, DefaultedList<ItemStack> stacks) {
if (this.isIn(group)) {
stacks.add(this.getDefaultStack());
}
}
}

View file

@ -26,8 +26,8 @@ public class ClientPlayNetworkHandlerMixin {
@Inject(method = "onPlayerPositionLook", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILHARD)
public void onPlayerLookPositionPacket(PlayerPositionLookS2CPacket packet, CallbackInfo ci, PlayerEntity playerEntity, Vec3d vec3d, boolean bl, boolean bl2, boolean bl3, double f, double g, double j, double k, double n, double o, float p, float q) {
if (ModDimensions.isLimboDimension(this.world)) {
this.world.addParticle(ModParticleTypes.MONOLITH, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), 0.0D, 0.0D, 0.0D);
}
// if (ModDimensions.isLimboDimension(this.world)) {
// this.world.addParticle(ModParticleTypes.MONOLITH, playerEntity.getX(), playerEntity.getY(), playerEntity.getZ(), 0.0D, 0.0D, 0.0D);
// }
}
}

View file

@ -25,7 +25,7 @@ public abstract class GameRendererMixin {
@Shadow
protected abstract class_5944 method_34522(ResourceFactory arg, String string, VertexFormat vertexFormat) throws IOException;
@Inject(method = "method_34538", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/client/render/GameRenderer;method_34522(Lnet/minecraft/class_5912;Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;)Lnet/minecraft/class_5944;"))
@Inject(method = "method_34538", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/client/render/GameRenderer;method_34522(Lnet/minecraft/resource/ResourceFactory;Ljava/lang/String;Lnet/minecraft/client/render/VertexFormat;)Lnet/minecraft/class_5944;"))
public void onReload(ResourceManager resourceManager, CallbackInfo ci) throws IOException {
ModShaders.setDimensionalPortal(this.method_34522(resourceManager, "dimensional_portal", VertexFormats.POSITION));
}

View file

@ -0,0 +1,168 @@
package org.dimdev.dimdoors.mixin.client;
import com.mojang.blaze3d.systems.RenderSystem;
import org.dimdev.dimdoors.world.ModDimensions;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.math.Vec3f;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Mixin(WorldRenderer.class)
@Environment(EnvType.CLIENT)
public class WorldRendererMixin {
@Unique
private static final Identifier MOON_RENDER_PATH = new Identifier("dimdoors:textures/other/limbo_moon.png");
@Unique
private static final Identifier SUN_RENDER_PATH = new Identifier("dimdoors:textures/other/limbo_sun.png");
@Shadow
private ClientWorld world;
@Shadow
@Final
private static Identifier END_SKY;
@Inject(method = "renderSky", at = @At("HEAD"), cancellable = true)
public void beforeRenderSky(MatrixStack matrices, Matrix4f matrix4f, float f, CallbackInfo ci) {
if (ModDimensions.isLimboDimension(this.world)) {
renderLimboSky(matrices);
ci.cancel();
} else if (ModDimensions.isPrivatePocketDimension(this.world)) {
this.renderPocketSky(matrices, 255, 255, 255);
ci.cancel();
} else if (ModDimensions.isPocketDimension(this.world)) {
this.renderPocketSky(matrices, 0, 0, 0);
ci.cancel();
}
}
@Unique
private void renderLimboSky(MatrixStack matrices) {
Matrix4f matrix4f = matrices.peek().getModel();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferBuilder = tessellator.getBuffer();
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.depthMask(false);
RenderSystem.setShader(GameRenderer::method_34543);
RenderSystem.setShaderColor(1, 1, 1, 1);
for(int i = 0; i < 6; ++i) {
matrices.push();
if (i == 1) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90.0F));
}
if (i == 2) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-90.0F));
}
if (i == 3) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(180.0F));
}
if (i == 4) {
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(90.0F));
}
if (i == 5) {
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(-90.0F));
}
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
bufferBuilder.vertex(matrix4f, -100.0F, -100.0F, -100.0F).color(40, 40, 40, 255).next();
bufferBuilder.vertex(matrix4f, -100.0F, -100.0F, 100.0F).color(40, 40, 40, 255).next();
bufferBuilder.vertex(matrix4f, 100.0F, -100.0F, 100.0F).color(40, 40, 40, 255).next();
bufferBuilder.vertex(matrix4f, 100.0F, -100.0F, -100.0F).color(40, 40, 40, 255).next();
tessellator.draw();
matrices.pop();
}
float s = 30.0F;
RenderSystem.setShader(GameRenderer::method_34542);
RenderSystem.setShaderTexture(0, SUN_RENDER_PATH);
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE);
bufferBuilder.vertex(matrix4f, -s, 100.0F, -s).texture(0.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, s, 100.0F, -s).texture(1.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, s, 100.0F, s).texture(1.0F, 1.0F).next();
bufferBuilder.vertex(matrix4f, -s, 100.0F, s).texture(0.0F, 1.0F).next();
bufferBuilder.end();
BufferRenderer.draw(bufferBuilder);
RenderSystem.setShaderTexture(0, MOON_RENDER_PATH);
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE);
bufferBuilder.vertex(matrix4f, -s, -100.0F, -s).texture(0.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, s, -100.0F, -s).texture(1.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, s, -100.0F, s).texture(1.0F, 1.0F).next();
bufferBuilder.vertex(matrix4f, -s, -100.0F, s).texture(0.0F, 1.0F).next();
bufferBuilder.end();
BufferRenderer.draw(bufferBuilder);
RenderSystem.depthMask(true);
RenderSystem.enableTexture();
RenderSystem.disableBlend();
}
private void renderPocketSky(MatrixStack matrices, int r, int g, int b) {
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.depthMask(false);
RenderSystem.setShader(GameRenderer::method_34540);
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferBuilder = tessellator.getBuffer();
for(int i = 0; i < 6; ++i) {
matrices.push();
if (i == 1) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90.0F));
}
if (i == 2) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-90.0F));
}
if (i == 3) {
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(180.0F));
}
if (i == 4) {
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(90.0F));
}
if (i == 5) {
matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(-90.0F));
}
Matrix4f matrix4f = matrices.peek().getModel();
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
bufferBuilder.vertex(matrix4f, -100.0F, -100.0F, -100.0F).color(r, g, b, 255).next();
bufferBuilder.vertex(matrix4f, -100.0F, -100.0F, 100.0F).color(r, g, b, 255).next();
bufferBuilder.vertex(matrix4f, 100.0F, -100.0F, 100.0F).color(r, g, b, 255).next();
bufferBuilder.vertex(matrix4f, 100.0F, -100.0F, -100.0F).color(r, g, b, 255).next();
tessellator.draw();
matrices.pop();
}
RenderSystem.depthMask(true);
RenderSystem.enableTexture();
RenderSystem.disableBlend();
}
}

View file

@ -12,9 +12,4 @@ public interface RenderLayerAccessor {
static RenderLayer.MultiPhase callOf(String name, VertexFormat vertexFormat, VertexFormat.DrawMode drawMode, int expectedBufferSize, boolean hasCrumbling, boolean translucent, RenderLayer.MultiPhaseParameters phases) {
throw new UnsupportedOperationException();
}
@Invoker
static RenderLayer.MultiPhase callOf(String name, VertexFormat vertexFormat, VertexFormat.DrawMode drawMode, int expectedBufferSize, RenderLayer.MultiPhaseParameters phaseData) {
throw new UnsupportedOperationException();
}
}

View file

@ -33,7 +33,6 @@ public class ClientPacketHandler {
private static final Logger LOGGER = LogManager.getLogger();
private final ClientPlayNetworkHandler networkHandler;
private final MinecraftClient client;
private boolean initialized = false;
private final Set<Identifier> registeredChannels = new HashSet<>();
@ -65,7 +64,6 @@ public class ClientPacketHandler {
public ClientPacketHandler(ClientPlayNetworkHandler networkHandler) {
this.networkHandler = networkHandler;
this.client = ((ExtendedClientPlayNetworkHandler) networkHandler).dimdoorsGetClient();
}
private void registerReceiver(Identifier channelName, Supplier<? extends SimplePacket<ClientPacketHandler>> supplier) {
@ -98,8 +96,8 @@ public class ClientPacketHandler {
}
public void onPlayerInventorySlotUpdate(int slot, ItemStack stack) {
if (client.player != null) {
client.player.getInventory().setStack(slot, stack);
if (MinecraftClient.getInstance().player != null) {
MinecraftClient.getInstance().player.getInventory().setStack(slot, stack);
}
}

View file

@ -3,7 +3,9 @@ package org.dimdev.dimdoors.network;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayNetworkHandler;
@ -19,6 +21,7 @@ import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.item.ModItem;
import org.dimdev.dimdoors.network.c2s.HitBlockWithItemC2SPacket;
import org.dimdev.dimdoors.network.c2s.NetworkHandlerInitializedC2SPacket;
import org.dimdev.dimdoors.network.s2c.PlayerInventorySlotUpdateS2CPacket;
import org.dimdev.dimdoors.network.s2c.SyncPocketAddonsS2CPacket;
import org.dimdev.dimdoors.world.ModDimensions;
import org.dimdev.dimdoors.world.level.registry.DimensionalRegistry;
@ -50,6 +53,14 @@ public class ServerPacketHandler {
registerReceiver(HitBlockWithItemC2SPacket.ID, HitBlockWithItemC2SPacket::new);
}
public static ServerPacketHandler get(ServerPlayerEntity player) {
return get(player.networkHandler);
}
public static ServerPacketHandler get(ServerPlayNetworkHandler networkHandler) {
return ((ExtendedServerPlayNetworkHandler) networkHandler).getDimDoorsPacketHandler();
}
public static boolean sendPacket(ServerPlayerEntity player, SimplePacket<?> packet) {
try {
ServerPlayNetworking.send(player, packet.channelId(), packet.write(PacketByteBufs.create()));
@ -60,6 +71,10 @@ public class ServerPacketHandler {
}
}
public boolean sendPacket(SimplePacket<?> packet) {
return sendPacket(getPlayer(), packet);
}
public ServerPacketHandler(ServerPlayNetworkHandler networkHandler) {
this.networkHandler = networkHandler;
this.server = ((ExtendedServerPlayNetworkHandler) networkHandler).dimdoorsGetServer();
@ -120,4 +135,12 @@ public class ServerPacketHandler {
public void markPocketSyncDirty(int id) {
if (lastSyncedPocketId == id) pocketSyncDirty = true;
}
public void sync(ItemStack stack, Hand hand) {
if (hand == Hand.OFF_HAND) {
sendPacket(new PlayerInventorySlotUpdateS2CPacket(45, stack));
} else {
sendPacket(new PlayerInventorySlotUpdateS2CPacket(getPlayer().getInventory().selectedSlot, stack));
}
}
}

View file

@ -1,9 +1,8 @@
package org.dimdev.dimdoors.particle;
import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes;
import org.dimdev.dimdoors.particle.client.RiftParticle;
import org.dimdev.dimdoors.mixin.accessor.DefaultParticleTypeAccessor;
import org.dimdev.dimdoors.particle.client.MonolithParticle;
import org.dimdev.dimdoors.particle.client.RiftParticle;
import org.dimdev.dimdoors.particle.client.RiftParticleEffect;
import net.minecraft.particle.DefaultParticleType;
import net.minecraft.particle.ParticleType;
@ -13,7 +12,7 @@ import net.minecraft.util.registry.Registry;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
import org.dimdev.dimdoors.particle.client.RiftParticleEffect;
import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes;
public class ModParticleTypes {
public static final DefaultParticleType MONOLITH = FabricParticleTypes.simple(true);

View file

@ -44,11 +44,11 @@ public final class ModDimensions {
}
public static boolean isLimbo(StructureWorldAccess world) {
return world != null && (world.getDimension() == LIMBO_TYPE || world == LIMBO_DIMENSION);
return world != null && world.getDimension() == LIMBO_TYPE;
}
public static boolean isLimboDimension(World world) {
return world != null && (world.getRegistryKey().equals(LIMBO) || world.getDimension() == LIMBO_TYPE || world == LIMBO_DIMENSION);
return world != null && world.getRegistryKey().equals(LIMBO);
}
public static void init() {

View file

@ -28,7 +28,8 @@
"client.ExtendedClientPlayNetworkHandlerMixin",
"client.GameRendererMixin",
"client.InGameHudMixin",
"client.accessor.RenderLayerAccessor"
"client.accessor.RenderLayerAccessor",
"client.WorldRendererMixin"
],
"injectors": {
"defaultRequire": 1