Use hashed seed for sky generation (seed dependent, available in both internal server and multiplayer)

This commit is contained in:
KosmX 2022-12-16 17:28:17 +01:00
parent 1276ead89b
commit 6f62d57ab2
No known key found for this signature in database
GPG key ID: E49D7729B4AD2A98
5 changed files with 49 additions and 15 deletions

View file

@ -0,0 +1,5 @@
package codes.ztereohype.nicerskies;
public interface IClientLevelAccessor {
long nicerSkies_getHashedSeed();
}

View file

@ -1,18 +1,16 @@
package codes.ztereohype.nicerskies.core;
import codes.ztereohype.nicerskies.IClientLevelAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.world.level.Level;
import java.util.Objects;
public class NebulaSeedManager {
public static long getSeed() {
if (Minecraft.getInstance().hasSingleplayerServer()) {
// calculate seed from overworld seed
return Objects.hash(Minecraft.getInstance().getSingleplayerServer().getLevel(Level.OVERWORLD).getSeed());
} else {
return Objects.requireNonNull(Minecraft.getInstance().getCurrentServer()).ip.hashCode();
// Use hashed seed. This is available in
if (Minecraft.getInstance().level != null) {
return ((IClientLevelAccessor) Minecraft.getInstance().level).nicerSkies_getHashedSeed();
}
return 0;
}
public static boolean canGetSeed() {

View file

@ -0,0 +1,32 @@
package codes.ztereohype.nicerskies.mixin;
import codes.ztereohype.nicerskies.IClientLevelAccessor;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceKey;
import org.spongepowered.asm.mixin.Mixin;
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 java.util.function.Supplier;
@Mixin(ClientLevel.class)
public class ClientLevelMixin implements IClientLevelAccessor {
@Unique
private long hashedSeed;
@Inject(method = "<init>", at = @At("TAIL"))
private void generateSkies(ClientPacketListener clientPacketListener, ClientLevel.ClientLevelData clientLevelData, ResourceKey resourceKey, Holder holder, int i, int j, Supplier supplier, LevelRenderer levelRenderer, boolean bl, long hashedSeed, CallbackInfo ci) {
this.hashedSeed = hashedSeed;
}
@Override
public long nicerSkies_getHashedSeed() {
return hashedSeed;
}
}