Skip to content

Commit

Permalink
Update to 1.20
Browse files Browse the repository at this point in the history
  • Loading branch information
Brokkonaut committed Jun 9, 2023
1 parent cdc9391 commit ceaff87
Show file tree
Hide file tree
Showing 11 changed files with 934 additions and 2 deletions.
1 change: 1 addition & 0 deletions nmsutils-plugin/pom.xml
Expand Up @@ -56,6 +56,7 @@
<exclude>de.cubeside.nmsutils:nmsutils-v1_19_R1_1</exclude>
<exclude>de.cubeside.nmsutils:nmsutils-v1_19_R2</exclude>
<exclude>de.cubeside.nmsutils:nmsutils-v1_19_R3</exclude>
<exclude>de.cubeside.nmsutils:nmsutils-v1_20_R1</exclude>
</excludes>
</artifactSet>
</configuration>
Expand Down
100 changes: 100 additions & 0 deletions nmsutils-v1_20_R1/pom.xml
@@ -0,0 +1,100 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>nmsutils-v1_20_R1</artifactId>
<parent>
<groupId>de.cubeside.nmsutils</groupId>
<artifactId>nmsutils-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-server</artifactId>
<version>1.20-R0.1-SNAPSHOT</version>
<classifier>mojang-mapped</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>nmsutils-core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.fabricmc</groupId>
<artifactId>mapping-io</artifactId>
<version>0.3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>datafixerupper</artifactId>
<version>5.0.28</version>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>minecraft-repo</id>
<url>https://libraries.minecraft.net/</url>
</repository>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
<repository>
<id>fabric-repo</id>
<url>https://maven.fabricmc.net/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
<remappedArtifactAttached>true</remappedArtifactAttached>
<remappedClassifierName>remapped-obf</remappedClassifierName>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-spigot</id>
<configuration>
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
<srgIn>org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,154 @@
package de.cubeside.nmsutils.v1_20_R1;

import com.mojang.serialization.Lifecycle;
import de.cubeside.nmsutils.BiomeUtils;
import de.cubeside.nmsutils.NMSUtils;
import de.cubeside.nmsutils.biome.CustomBiome;
import de.cubeside.nmsutils.util.ReobfHelper;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.Holder.Reference;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.AmbientMoodSettings;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biome.BiomeBuilder;
import net.minecraft.world.level.biome.Biome.TemperatureModifier;
import net.minecraft.world.level.biome.BiomeSpecialEffects;
import net.minecraft.world.level.biome.BiomeSpecialEffects.Builder;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.chunk.LevelChunk;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.Server;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;

public class BiomeUtilsImpl implements BiomeUtils {
private final NMSUtilsImpl nmsUtils;

private HashMap<NamespacedKey, CustomBiomeImpl> customBiomes;
private HashMap<Biome, CustomBiomeImpl> customBiomesByBiome;
private Collection<? extends CustomBiome> unmodifiableCustomBiomes;

private static final Field FIELD_MAPPED_REGISTRY_FROZEN = ReobfHelper.getFieldByMojangName(MappedRegistry.class, "frozen");
private static final Field FIELD_MAPPED_REGISTRY_UNREGISTERED_INTRUSIVE_HOLDERS = ReobfHelper.getFieldByMojangName(MappedRegistry.class, "unregisteredIntrusiveHolders");

public BiomeUtilsImpl(NMSUtilsImpl nmsUtils) {
this.nmsUtils = nmsUtils;
this.customBiomes = new HashMap<>();
this.customBiomesByBiome = new HashMap<>();
this.unmodifiableCustomBiomes = Collections.unmodifiableCollection(customBiomes.values());
}

public NMSUtils getNMSUtils() {
return nmsUtils;
}

@Override
public CustomBiome registerCustomBiome(NamespacedKey id, float downfall, float temperature, de.cubeside.nmsutils.biome.Precipitation precipitation, Integer fogColor, Integer waterColor, Integer waterFogColor, Integer skyColor, Integer foliageColor, Integer grassColor) {
Server server = nmsUtils.getPlugin().getServer();
CraftServer craftserver = (CraftServer) server;
DedicatedServer dedicatedserver = craftserver.getServer();
ResourceKey<Biome> newKey = ResourceKey.create(Registries.BIOME, new ResourceLocation(id.getNamespace(), id.getKey()));

ResourceKey<Biome> oldKey = Biomes.FOREST;
WritableRegistry<Biome> registrywritable = (WritableRegistry<Biome>) dedicatedserver.registryAccess().registryOrThrow(Registries.BIOME);

try {
FIELD_MAPPED_REGISTRY_FROZEN.set(registrywritable, false);
FIELD_MAPPED_REGISTRY_UNREGISTERED_INTRUSIVE_HOLDERS.set(registrywritable, new IdentityHashMap<>());
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
}

Biome forestbiome = registrywritable.get(oldKey);

BiomeBuilder builder = new Biome.BiomeBuilder();
builder.downfall(downfall);
builder.temperature(temperature);
boolean mojangPrecipitation = false;

if (precipitation == de.cubeside.nmsutils.biome.Precipitation.RAIN) {
mojangPrecipitation = true;
} else if (precipitation == de.cubeside.nmsutils.biome.Precipitation.SNOW) {
mojangPrecipitation = true;
}
builder.hasPrecipitation(mojangPrecipitation);
builder.mobSpawnSettings(forestbiome.getMobSettings());
builder.generationSettings(forestbiome.getGenerationSettings());
builder.temperatureAdjustment(TemperatureModifier.NONE);
Builder effects = new BiomeSpecialEffects.Builder();
effects.waterColor(waterColor == null ? forestbiome.getWaterColor() : waterColor);
effects.waterFogColor(waterFogColor == null ? forestbiome.getWaterFogColor() : waterFogColor);
effects.fogColor(fogColor == null ? forestbiome.getFogColor() : fogColor);
effects.skyColor(skyColor == null ? forestbiome.getSkyColor() : skyColor);
if (foliageColor != null) {
effects.foliageColorOverride(foliageColor);
}
if (grassColor != null) {
effects.grassColorOverride(grassColor);
}
effects.ambientMoodSound(AmbientMoodSettings.LEGACY_CAVE_SETTINGS);
builder.specialEffects(effects.build());

Biome newbiome = builder.build();

registrywritable.createIntrusiveHolder(newbiome);
Reference<Biome> biomeHolder = registrywritable.register(newKey, newbiome, Lifecycle.stable());

try {
FIELD_MAPPED_REGISTRY_UNREGISTERED_INTRUSIVE_HOLDERS.set(registrywritable, null);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new RuntimeException(e);
}
CustomBiomeImpl impl = new CustomBiomeImpl(id, newKey, newbiome, biomeHolder);
customBiomes.put(id, impl);
customBiomesByBiome.put(newbiome, impl);

return new CustomBiomeImpl(id, newKey, newbiome, biomeHolder);
}

@Override
public Collection<? extends CustomBiome> getAllCustomBiomes() {
return unmodifiableCustomBiomes;
}

@Override
public CustomBiome getCustomBiome(NamespacedKey id) {
return customBiomes.get(id);
}

@Override
public CustomBiome getCustomBiomeAt(Location location) {
location.getWorld().getChunkAt(location);
Level level = ((CraftWorld) location.getWorld()).getHandle();
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();

BlockPos pos = new BlockPos(x, 0, z);
if (level.isLoaded(pos)) {
LevelChunk chunk = level.getChunkAt(pos);
if (chunk != null) {

Holder<Biome> biomeHolder = chunk.getNoiseBiome(x >> 2, y >> 2, z >> 2);
if (biomeHolder.isBound()) {
Biome biome = biomeHolder.value();
return customBiomesByBiome.get(biome);
}
}
}
return null;
}
}
@@ -0,0 +1,49 @@
package de.cubeside.nmsutils.v1_20_R1;

import de.cubeside.nmsutils.biome.CustomBiome;
import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.Holder.Reference;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.LevelChunk;
import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;

public class CustomBiomeImpl implements CustomBiome {
private NamespacedKey bukkitKey;
private Reference<Biome> biomeHolder;
private MutableBlockPos pos = new MutableBlockPos();

public CustomBiomeImpl(NamespacedKey bukkitKey, ResourceKey<Biome> key, Biome biome, Reference<Biome> biomeHolder) {
this.bukkitKey = bukkitKey;
this.biomeHolder = biomeHolder;
}

@Override
public NamespacedKey getId() {
return bukkitKey;
}

@Override
public boolean setBiome(Location location) {
location.getWorld().getChunkAt(location);
Level level = ((CraftWorld) location.getWorld()).getHandle();
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();

pos.set(x, 0, z);
if (level.isLoaded(pos)) {
LevelChunk chunk = level.getChunkAt(pos);
if (chunk != null) {

chunk.setBiome(x >> 2, y >> 2, z >> 2, biomeHolder);
chunk.setUnsaved(true);
return true;
}
}
return false;
}
}

0 comments on commit ceaff87

Please sign in to comment.