Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cdc9391
commit ceaff87
Showing
11 changed files
with
934 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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> |
154 changes: 154 additions & 0 deletions
154
nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/BiomeUtilsImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} |
49 changes: 49 additions & 0 deletions
49
nmsutils-v1_20_R1/src/main/java/de/cubeside/nmsutils/v1_20_R1/CustomBiomeImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
} |
Oops, something went wrong.