Port to 1.19 (mostly)

- BufferBuilder manipulation code has not been ported
This commit is contained in:
PepperCode1 2022-07-12 14:44:31 -07:00
parent 0a671b8f43
commit b5ea5f561e
18 changed files with 144 additions and 135 deletions

View file

@ -34,8 +34,8 @@ java.toolchain.languageVersion = JavaLanguageVersion.of(17)
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
minecraft {
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}"
// mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}"
mappings channel: 'official', version: "${minecraft_version}"
runs {
client {
@ -199,6 +199,6 @@ curseforge {
changelog = file('changelog.txt')
releaseType = project.curse_type
mainArtifact jar
addGameVersion '1.18.2'
addGameVersion '1.19'
}
}

View file

@ -3,9 +3,9 @@ org.gradle.daemon = false
# mod version info
mod_version = 0.6.4
mc_update_version = 1.18
minecraft_version = 1.18.2
forge_version = 40.1.60
mc_update_version = 1.19
minecraft_version = 1.19
forge_version = 41.0.94
# build dependency versions
forgegradle_version = 5.1.+

View file

@ -17,8 +17,9 @@ import com.jozufozu.flywheel.mixin.PausedPartialTickAccessor;
import com.jozufozu.flywheel.vanilla.VanillaInstances;
import com.mojang.logging.LogUtils;
import net.minecraft.commands.synchronization.ArgumentTypes;
import net.minecraft.commands.synchronization.EmptyArgumentSerializer;
import net.minecraft.commands.synchronization.ArgumentTypeInfos;
import net.minecraft.commands.synchronization.SingletonArgumentInfo;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge;
@ -28,9 +29,9 @@ import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.network.NetworkConstants;
import net.minecraftforge.registries.RegisterEvent;
@Mod(Flywheel.ID)
public class Flywheel {
@ -50,7 +51,7 @@ public class Flywheel {
IEventBus forgeEventBus = MinecraftForge.EVENT_BUS;
IEventBus modEventBus = FMLJavaModLoadingContext.get()
.getModEventBus();
modEventBus.addListener(Flywheel::setup);
modEventBus.addListener(Flywheel::registerArgumentTypes);
FlwConfig.init();
@ -87,8 +88,10 @@ public class Flywheel {
LOGGER.debug("Successfully loaded {}", PausedPartialTickAccessor.class.getName());
}
private static void setup(final FMLCommonSetupEvent event) {
ArgumentTypes.register(rl("engine").toString(), BackendTypeArgument.class, new EmptyArgumentSerializer<>(BackendTypeArgument::getInstance));
private static void registerArgumentTypes(RegisterEvent event) {
event.register(Registry.COMMAND_ARGUMENT_TYPE_REGISTRY, rl("engine"), () -> {
return ArgumentTypeInfos.registerByClass(BackendTypeArgument.class, SingletonArgumentInfo.contextFree(BackendTypeArgument::getInstance));
});
}
public static ArtifactVersion getVersion() {

View file

@ -1,6 +1,6 @@
package com.jozufozu.flywheel.backend;
import java.util.Collection;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
@ -93,13 +93,11 @@ public class Loader implements ResourceManagerReloadListener {
private void loadProgramSpecs(ResourceManager manager) {
programs.clear();
Collection<ResourceLocation> programSpecs = manager.listResources(PROGRAM_DIR, s -> s.endsWith(".json"));
Map<ResourceLocation, Resource> programSpecs = manager.listResources(PROGRAM_DIR, loc -> loc.getPath().endsWith(".json"));
for (ResourceLocation location : programSpecs) {
try {
Resource file = manager.getResource(location);
String s = StringUtil.readToString(file.getInputStream());
programSpecs.forEach((location, resource) -> {
try (InputStream inputStream = resource.open()) {
String s = StringUtil.readToString(inputStream);
ResourceLocation specName = ResourceUtil.trim(location, PROGRAM_DIR, ".json");
@ -119,7 +117,7 @@ public class Loader implements ResourceManagerReloadListener {
} catch (Exception e) {
Backend.LOGGER.error("Could not load program " + location, e);
}
}
});
}
}

View file

@ -12,14 +12,14 @@ import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.network.chat.Component;
public enum BackendTypeArgument implements ArgumentType<BackendType> {
INSTANCE;
private static final Dynamic2CommandExceptionType INVALID = new Dynamic2CommandExceptionType((found, constants) -> {
// TODO: don't steal lang
return new TranslatableComponent("commands.forge.arguments.enum.invalid", constants, found);
return Component.translatable("commands.forge.arguments.enum.invalid", constants, found);
});
@Override

View file

@ -16,10 +16,8 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.TextComponent;
import net.minecraftforge.client.event.RegisterClientCommandsEvent;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import net.minecraftforge.fml.ModList;
public class FlwCommands {
public static void registerClientCommands(RegisterClientCommandsEvent event) {
@ -56,14 +54,14 @@ public class FlwCommands {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return;
Component text = new TextComponent("Normal debug mode is currently: ").append(boolToText(bool));
Component text = Component.literal("Normal debug mode is currently: ").append(boolToText(bool));
player.displayClientMessage(text, false);
},
(source, bool) -> {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return;
Component text = boolToText(bool).append(new TextComponent(" normal debug mode").withStyle(ChatFormatting.WHITE));
Component text = boolToText(bool).append(Component.literal(" normal debug mode").withStyle(ChatFormatting.WHITE));
player.displayClientMessage(text, false);
}
));
@ -73,14 +71,14 @@ public class FlwCommands {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return;
Component text = new TextComponent("Update limiting is currently: ").append(boolToText(bool));
Component text = Component.literal("Update limiting is currently: ").append(boolToText(bool));
player.displayClientMessage(text, false);
},
(source, bool) -> {
LocalPlayer player = Minecraft.getInstance().player;
if (player == null) return;
Component text = boolToText(bool).append(new TextComponent(" update limiting.").withStyle(ChatFormatting.WHITE));
Component text = boolToText(bool).append(Component.literal(" update limiting.").withStyle(ChatFormatting.WHITE));
player.displayClientMessage(text, false);
Backend.reloadWorldRenderers();
@ -111,14 +109,14 @@ public class FlwCommands {
}
public static MutableComponent boolToText(boolean b) {
return b ? new TextComponent("enabled").withStyle(ChatFormatting.DARK_GREEN) : new TextComponent("disabled").withStyle(ChatFormatting.RED);
return b ? Component.literal("enabled").withStyle(ChatFormatting.DARK_GREEN) : Component.literal("disabled").withStyle(ChatFormatting.RED);
}
public static Component getEngineMessage(@NotNull BackendType type) {
return switch (type) {
case OFF -> new TextComponent("Disabled Flywheel").withStyle(ChatFormatting.RED);
case INSTANCING -> new TextComponent("Using Instancing Engine").withStyle(ChatFormatting.GREEN);
case BATCHING -> new TextComponent("Using Batching Engine").withStyle(ChatFormatting.GREEN);
case OFF -> Component.literal("Disabled Flywheel").withStyle(ChatFormatting.RED);
case INSTANCING -> Component.literal("Using Instancing Engine").withStyle(ChatFormatting.GREEN);
case BATCHING -> Component.literal("Using Batching Engine").withStyle(ChatFormatting.GREEN);
};
}

View file

@ -6,9 +6,7 @@ import java.util.Map;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ForgeModelBakery;
import net.minecraftforge.client.event.ModelEvent;
/**
* A helper class for loading and accessing json models.
@ -30,23 +28,23 @@ public class PartialModel {
protected BakedModel bakedModel;
public PartialModel(ResourceLocation modelLocation) {
if (tooLate) throw new RuntimeException("PartialModel '" + modelLocation + "' loaded after ModelRegistryEvent");
if (tooLate) throw new RuntimeException("PartialModel '" + modelLocation + "' loaded after ModelEvent.RegisterAdditional");
this.modelLocation = modelLocation;
ALL.add(this);
}
public static void onModelRegistry(ModelRegistryEvent event) {
public static void onModelRegistry(ModelEvent.RegisterAdditional event) {
for (PartialModel partial : ALL)
ForgeModelBakery.addSpecialModel(partial.getLocation());
event.register(partial.getLocation());
tooLate = true;
}
public static void onModelBake(ModelBakeEvent event) {
Map<ResourceLocation, BakedModel> modelRegistry = event.getModelRegistry();
public static void onModelBake(ModelEvent.BakingCompleted event) {
Map<ResourceLocation, BakedModel> models = event.getModels();
for (PartialModel partial : ALL)
partial.set(modelRegistry.get(partial.getLocation()));
partial.set(models.get(partial.getLocation()));
}
protected void set(BakedModel bakedModel) {

View file

@ -1,10 +1,7 @@
package com.jozufozu.flywheel.core.model;
import java.util.Random;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyModelData;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
@ -12,6 +9,7 @@ import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
@ -42,7 +40,7 @@ public final class BakedModelBuilder implements Bufferable {
}
@Override
public void bufferInto(ModelBlockRenderer blockRenderer, VertexConsumer consumer, Random random) {
blockRenderer.tesselateBlock(renderWorld, model, referenceState, BlockPos.ZERO, poseStack, consumer, false, random, 42, OverlayTexture.NO_OVERLAY, VirtualEmptyModelData.INSTANCE);
public void bufferInto(ModelBlockRenderer blockRenderer, VertexConsumer consumer, RandomSource random) {
blockRenderer.tesselateBlock(renderWorld, model, referenceState, BlockPos.ZERO, poseStack, consumer, false, random, 42, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, null);
}
}

View file

@ -1,17 +1,16 @@
package com.jozufozu.flywheel.core.model;
import java.util.Random;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.util.RandomSource;
/**
* An interface for objects that can "rendered" into a BufferBuilder.
*/
public interface Bufferable {
void bufferInto(ModelBlockRenderer renderer, VertexConsumer consumer, Random random);
void bufferInto(ModelBlockRenderer renderer, VertexConsumer consumer, RandomSource random);
default ShadeSeparatedBufferBuilder build() {
return ModelUtil.getBufferBuilder(this);

View file

@ -2,7 +2,6 @@ package com.jozufozu.flywheel.core.model;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Random;
import java.util.function.Supplier;
import com.jozufozu.flywheel.Flywheel;
@ -18,9 +17,12 @@ import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.ModelProperty;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
public class ModelUtil {
@ -30,6 +32,9 @@ public class ModelUtil {
*/
public static final BlockRenderDispatcher VANILLA_RENDERER = createVanillaRenderer();
public static final ModelProperty<Boolean> VIRTUAL_PROPERTY = new ModelProperty<>();
public static final ModelData VIRTUAL_DATA = ModelData.builder().with(VIRTUAL_PROPERTY, true).build();
private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new);
private static BlockRenderDispatcher createVanillaRenderer() {
@ -99,7 +104,7 @@ public class ModelUtil {
}
private static class ThreadLocalObjects {
public final Random random = new Random();
public final RandomSource random = RandomSource.create();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final ShadeSeparatedBufferBuilder separatedBufferBuilder = new ShadeSeparatedBufferBuilder(512);
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);

View file

@ -3,30 +3,28 @@ package com.jozufozu.flywheel.core.model;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Random;
import com.jozufozu.flywheel.core.virtual.VirtualEmptyBlockGetter;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.data.ModelData;
public final class WorldModelBuilder implements Bufferable {
private final RenderType layer;
private PoseStack poseStack = new PoseStack();
private Map<BlockPos, IModelData> modelData = Collections.emptyMap();
private Map<BlockPos, ModelData> modelData = Collections.emptyMap();
private BlockAndTintGetter renderWorld = VirtualEmptyBlockGetter.INSTANCE;
private Collection<StructureTemplate.StructureBlockInfo> blocks = Collections.emptyList();
@ -35,26 +33,25 @@ public final class WorldModelBuilder implements Bufferable {
}
@Override
public void bufferInto(ModelBlockRenderer modelRenderer, VertexConsumer consumer, Random random) {
ForgeHooksClient.setRenderType(this.layer);
public void bufferInto(ModelBlockRenderer modelRenderer, VertexConsumer consumer, RandomSource random) {
ModelBlockRenderer.enableCaching();
for (StructureTemplate.StructureBlockInfo info : this.blocks) {
BlockState state = info.state;
if (state.getRenderShape() != RenderShape.MODEL) continue;
if (!ItemBlockRenderTypes.canRenderInLayer(state, this.layer)) continue;
BlockPos pos = info.pos;
IModelData data = this.modelData.getOrDefault(pos, EmptyModelData.INSTANCE);
long randomSeed = state.getSeed(pos);
BakedModel model = ModelUtil.VANILLA_RENDERER.getBlockModel(state);
ModelData data = this.modelData.getOrDefault(pos, ModelData.EMPTY);
random.setSeed(randomSeed);
if (!model.getRenderTypes(state, random, data).contains(this.layer)) continue;
poseStack.pushPose();
poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
modelRenderer.tesselateBlock(this.renderWorld, ModelUtil.VANILLA_RENDERER.getBlockModel(state), state, pos, poseStack, consumer, true, random, 42, OverlayTexture.NO_OVERLAY, data);
modelRenderer.tesselateBlock(this.renderWorld, model, state, pos, poseStack, consumer, true, random, randomSeed, OverlayTexture.NO_OVERLAY, data, this.layer);
poseStack.popPose();
}
ModelBlockRenderer.clearCache();
ForgeHooksClient.setRenderType(null);
}
/**
@ -70,7 +67,7 @@ public final class WorldModelBuilder implements Bufferable {
return this;
}
public WorldModelBuilder withModelData(Map<BlockPos, IModelData> modelData) {
public WorldModelBuilder withModelData(Map<BlockPos, ModelData> modelData) {
this.modelData = modelData;
return this;
}

View file

@ -1,8 +1,8 @@
package com.jozufozu.flywheel.core.source;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@ -28,18 +28,17 @@ public class ShaderSources implements SourceFinder {
public final Index index;
public ShaderSources(ResourceManager manager) {
Collection<ResourceLocation> allShaders = manager.listResources(SHADER_DIR, s -> {
Map<ResourceLocation, Resource> allShaders = manager.listResources(SHADER_DIR, loc -> {
String path = loc.getPath();
for (String ext : EXTENSIONS) {
if (s.endsWith(ext)) return true;
if (path.endsWith(ext)) return true;
}
return false;
});
for (ResourceLocation location : allShaders) {
try {
Resource resource = manager.getResource(location);
String source = StringUtil.readToString(resource.getInputStream());
allShaders.forEach((location, resource) -> {
try (InputStream inputStream = resource.open()) {
String source = StringUtil.readToString(inputStream);
ResourceLocation name = ResourceUtil.removePrefixUnchecked(location, SHADER_DIR);
@ -47,7 +46,7 @@ public class ShaderSources implements SourceFinder {
} catch (IOException e) {
}
}
});
index = new Index(shaderSources);
}

View file

@ -28,7 +28,7 @@ import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.chunk.UpgradeData;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureStart;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.FluidState;
@ -192,41 +192,78 @@ public class VirtualChunk extends ChunkAccess {
return null;
}
// @Override
// @Nullable
// public StructureStart getStartForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
// return null;
// }
//
// @Override
// public void setStartForFeature(ConfiguredStructureFeature<?, ?> pStructure, StructureStart pStart) {
// }
//
// @Override
// public Map<ConfiguredStructureFeature<?, ?>, StructureStart> getAllStarts() {
// return Collections.emptyMap();
// }
//
// @Override
// public void setAllStarts(Map<ConfiguredStructureFeature<?, ?>, StructureStart> pStructureStarts) {
// }
//
// @Override
// public LongSet getReferencesForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
// return LongSets.emptySet();
// }
//
// @Override
// public void addReferenceForFeature(ConfiguredStructureFeature<?, ?> pStructure, long pReference) {
// }
//
// @Override
// public Map<ConfiguredStructureFeature<?, ?>, LongSet> getAllReferences() {
// return Collections.emptyMap();
// }
//
// @Override
// public void setAllReferences(Map<ConfiguredStructureFeature<?, ?>, LongSet> pStructureReferences) {
// }
@Override
@Nullable
public StructureStart getStartForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
public StructureStart getStartForStructure(Structure structure) {
return null;
}
@Override
public void setStartForFeature(ConfiguredStructureFeature<?, ?> pStructure, StructureStart pStart) {
public void setStartForStructure(Structure structure, StructureStart start) {
}
@Override
public Map<ConfiguredStructureFeature<?, ?>, StructureStart> getAllStarts() {
public Map<Structure, StructureStart> getAllStarts() {
return Collections.emptyMap();
}
@Override
public void setAllStarts(Map<ConfiguredStructureFeature<?, ?>, StructureStart> pStructureStarts) {
public void setAllStarts(Map<Structure, StructureStart> structureStarts) {
}
@Override
public LongSet getReferencesForFeature(ConfiguredStructureFeature<?, ?> pStructure) {
public LongSet getReferencesForStructure(Structure structure) {
return LongSets.emptySet();
}
@Override
public void addReferenceForFeature(ConfiguredStructureFeature<?, ?> pStructure, long pReference) {
public void addReferenceForStructure(Structure structure, long reference) {
}
@Override
public Map<ConfiguredStructureFeature<?, ?>, LongSet> getAllReferences() {
public Map<Structure, LongSet> getAllReferences() {
return Collections.emptyMap();
}
@Override
public void setAllReferences(Map<ConfiguredStructureFeature<?, ?>, LongSet> pStructureReferences) {
public void setAllReferences(Map<Structure, LongSet> structureReferences) {
}
@Override

View file

@ -1,34 +0,0 @@
package com.jozufozu.flywheel.core.virtual;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.data.ModelProperty;
/**
* This model data instance is passed whenever a model is rendered without
* available in-world context. IBakedModel#getModelData can react accordingly
* and avoid looking for model data itself
**/
public enum VirtualEmptyModelData implements IModelData {
INSTANCE;
public static boolean is(IModelData data) {
return data == INSTANCE;
}
@Override
public boolean hasProperty(ModelProperty<?> prop) {
return false;
}
@Override
public <T> T getData(ModelProperty<T> prop) {
return null;
}
@Override
public <T> T setData(ModelProperty<T> prop, T data) {
return null;
}
}

View file

@ -36,10 +36,12 @@ import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.entity.LevelEntityGetter;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.gameevent.GameEvent.Context;
import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import net.minecraft.world.level.storage.WritableLevelData;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.ticks.LevelTickAccess;
@ -68,7 +70,7 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld {
public VirtualRenderWorld(Level level, Vec3i biomeOffset, int height, int minBuildHeight) {
super((WritableLevelData) level.getLevelData(), level.dimension(), level.dimensionTypeRegistration(), level::getProfiler,
true, false, 0);
true, false, 0, 0);
this.biomeOffset = biomeOffset;
this.level = level;
this.height = nextMultipleOf16(height);
@ -294,6 +296,17 @@ public class VirtualRenderWorld extends Level implements FlywheelWorld {
@Override
public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) {}
@Override
public void gameEvent(GameEvent p_220404_, Vec3 p_220405_, Context p_220406_) {}
@Override
public void playSeededSound(Player p_220363_, double p_220364_, double p_220365_, double p_220366_,
SoundEvent p_220367_, SoundSource p_220368_, float p_220369_, float p_220370_, long p_220371_) {}
@Override
public void playSeededSound(Player p_220372_, Entity p_220373_, SoundEvent p_220374_, SoundSource p_220375_,
float p_220376_, float p_220377_, long p_220378_) {}
@Override
public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent soundIn,
SoundSource category, float volume, float pitch) {}

View file

@ -4,8 +4,8 @@ import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.EntityLeaveWorldEvent;
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
import net.minecraftforge.event.entity.EntityLeaveLevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@ -13,14 +13,14 @@ import net.minecraftforge.fml.common.Mod;
public class EntityWorldHandler {
@SubscribeEvent
public static void onEntityJoinWorld(EntityJoinWorldEvent event) {
if (event.getWorld().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getWorld())
public static void onEntityJoinWorld(EntityJoinLevelEvent event) {
if (event.getLevel().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getLevel())
.queueAdd(event.getEntity());
}
@SubscribeEvent
public static void onEntityLeaveWorld(EntityLeaveWorldEvent event) {
if (event.getWorld().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getWorld())
public static void onEntityLeaveWorld(EntityLeaveLevelEvent event) {
if (event.getLevel().isClientSide && Backend.isOn()) InstancedRenderDispatcher.getEntities(event.getLevel())
.remove(event.getEntity());
}
}

View file

@ -7,9 +7,9 @@ import com.jozufozu.flywheel.util.WorldAttached;
import net.minecraft.client.Minecraft;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.CustomizeGuiOverlayEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@ -17,17 +17,15 @@ import net.minecraftforge.fml.common.Mod;
public class ForgeEvents {
@SubscribeEvent
public static void addToDebugScreen(RenderGameOverlayEvent.Text event) {
public static void addToDebugScreen(CustomizeGuiOverlayEvent.DebugText event) {
if (Minecraft.getInstance().options.renderDebug) {
InstancedRenderDispatcher.getDebugString(event.getRight());
}
}
@SubscribeEvent
public static void unloadWorld(WorldEvent.Unload event) {
WorldAttached.invalidateWorld(event.getWorld());
public static void unloadWorld(LevelEvent.Unload event) {
WorldAttached.invalidateWorld(event.getLevel());
}
@SubscribeEvent

View file

@ -1,6 +1,6 @@
package com.jozufozu.flywheel.util;
import net.minecraftforge.client.model.pipeline.LightUtil;
import net.minecraftforge.client.model.lighting.QuadLighter;
public class RenderMath {
@ -74,13 +74,13 @@ public class RenderMath {
if (!shaded) {
return 1f;
}
return LightUtil.diffuseLight(x, y, z);
return QuadLighter.calculateShade(x, y, z, false);
}
public static float diffuseLightNether(float x, float y, float z, boolean shaded) {
if (!shaded) {
return 0.9f;
}
return Math.min(x * x * 0.6f + y * y * 0.9f + z * z * 0.8f, 1f);
return QuadLighter.calculateShade(x, y, z, true);
}
}