Skip to content

Commit

Permalink
[#220] Add support for 1.19 (#221)
Browse files Browse the repository at this point in the history
* feat: add support for 1.19
  • Loading branch information
Ingrim4 committed Jun 8, 2022
1 parent a781e87 commit ee9343e
Show file tree
Hide file tree
Showing 12 changed files with 675 additions and 4 deletions.
1 change: 1 addition & 0 deletions .github/workflows/buildtools.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ elif [ $1 = "java-16" ]; then
elif [ $1 = "java-17" ]; then
checkVersion 1.18.1
checkVersion 1.18.2
checkVersion 1.19
fi
2 changes: 1 addition & 1 deletion orebfuscator-nms/orebfuscator-nms-v1_17_R1/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.2</version>
<version>${plugin.specialsource.version}</version>
<executions>
<execution>
<phase>package</phase>
Expand Down
2 changes: 1 addition & 1 deletion orebfuscator-nms/orebfuscator-nms-v1_18_R1/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>1.2.3</version>
<version>${plugin.specialsource.version}</version>
<executions>
<execution>
<phase>package</phase>
Expand Down
72 changes: 72 additions & 0 deletions orebfuscator-nms/orebfuscator-nms-v1_19_R1/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>net.imprex</groupId>
<artifactId>orebfuscator-nms</artifactId>
<version>${revision}</version>
</parent>

<artifactId>orebfuscator-nms-v1_19_R1</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>net.imprex</groupId>
<artifactId>orebfuscator-nms-api</artifactId>
<version>${revision}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.19-R0.1-SNAPSHOT</version>
<classifier>remapped-mojang</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib-API</artifactId>
<version>${dependency.protocollib.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>net.md-5</groupId>
<artifactId>specialsource-maven-plugin</artifactId>
<version>${plugin.specialsource.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>remap</goal>
</goals>
<id>remap-obf</id>
<configuration>
<srgIn>org.spigotmc:minecraft-server:1.19-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
<reverse>true</reverse>
<remappedDependencies>org.spigotmc:spigot:1.19-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.19-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
<remappedDependencies>org.spigotmc:spigot:1.19-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package net.imprex.orebfuscator.nms.v1_19_R1;

import org.bukkit.World;
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;

import net.imprex.orebfuscator.nms.AbstractBlockState;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.state.BlockState;

public class BlockStateWrapper extends AbstractBlockState<BlockState> {

public BlockStateWrapper(int x, int y, int z, World world, BlockState state) {
super(x, y, z, world, state);
}

@Override
public int getBlockId() {
return NmsManager.getBlockId(this.state);
}

@Override
public void notifyBlockChange() {
ServerLevel serverLevel = ((CraftWorld) this.world).getHandle();
serverLevel.getChunkSource().blockChanged(new BlockPos(this.getX(), this.getY(), this.getZ()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package net.imprex.orebfuscator.nms.v1_19_R1;

import java.util.Optional;

import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R1.util.CraftMagicNumbers;
import org.bukkit.entity.Player;

import net.imprex.orebfuscator.config.CacheConfig;
import net.imprex.orebfuscator.config.Config;
import net.imprex.orebfuscator.nms.AbstractBlockState;
import net.imprex.orebfuscator.nms.AbstractNmsManager;
import net.imprex.orebfuscator.nms.AbstractRegionFileCache;
import net.imprex.orebfuscator.nms.ReadOnlyChunk;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk;

public class NmsManager extends AbstractNmsManager {

private static ServerLevel level(World world) {
return ((CraftWorld) world).getHandle();
}

private static ServerPlayer player(Player player) {
return ((CraftPlayer) player).getHandle();
}

private static boolean isChunkLoaded(ServerLevel level, int chunkX, int chunkZ) {
return level.getChunkSource().isChunkLoaded(chunkX, chunkZ);
}

private static BlockState getBlockData(World world, int x, int y, int z, boolean loadChunk) {
ServerLevel level = level(world);
ServerChunkCache serverChunkCache = level.getChunkSource();

if (isChunkLoaded(level, x >> 4, z >> 4) || loadChunk) {
// will load chunk if not loaded already
LevelChunk chunk = serverChunkCache.getChunk(x >> 4, z >> 4, true);
return chunk != null ? chunk.getBlockState(new BlockPos(x, y, z)) : null;
}
return null;
}

static int getBlockId(BlockState blockData) {
if (blockData == null) {
return 0;
} else {
int id = Block.BLOCK_STATE_REGISTRY.getId(blockData);
return id == -1 ? 0 : id;
}
}

public NmsManager(Config config) {
super(config);

for (BlockState blockData : Block.BLOCK_STATE_REGISTRY) {
Material material = CraftBlockData.fromData(blockData).getMaterial();
int blockId = getBlockId(blockData);
this.registerMaterialId(material, blockId);
this.setBlockFlags(blockId, blockData.isAir(), material.isOccluding(), blockData.hasBlockEntity());
}
}

@Override
protected AbstractRegionFileCache<?> createRegionFileCache(CacheConfig cacheConfig) {
return new RegionFileCache(cacheConfig);
}

@Override
public int getBitsPerBlock() {
return Mth.ceillog2(Block.BLOCK_STATE_REGISTRY.size());
}

@Override
public int getTotalBlockCount() {
return Block.BLOCK_STATE_REGISTRY.size();
}

@Override
public Optional<Material> getMaterialByName(String name) {
Optional<Block> block = Registry.BLOCK.getOptional(new ResourceLocation(name));
if (block.isPresent()) {
return Optional.ofNullable(CraftMagicNumbers.getMaterial(block.get()));
}
return Optional.empty();
}

@Override
public Optional<String> getNameByMaterial(Material material) {
ResourceLocation resourceLocation = Registry.BLOCK.getKey(CraftMagicNumbers.getBlock(material));
if (resourceLocation != null) {
return Optional.of(resourceLocation.toString());
}
return Optional.empty();
}

@Override
public boolean isHoe(Material material) {
switch (material) {
case WOODEN_HOE:
case STONE_HOE:
case IRON_HOE:
case GOLDEN_HOE:
case DIAMOND_HOE:
case NETHERITE_HOE:
return true;

default:
return false;
}
}

@Override
public ReadOnlyChunk getReadOnlyChunk(World world, int chunkX, int chunkZ) {
ServerChunkCache serverChunkCache = level(world).getChunkSource();
LevelChunk chunk = serverChunkCache.getChunk(chunkX, chunkZ, true);
return new ReadOnlyChunkWrapper(chunk);
}

@Override
public AbstractBlockState<?> getBlockState(World world, int x, int y, int z) {
BlockState blockData = getBlockData(world, x, y, z, false);
return blockData != null ? new BlockStateWrapper(x, y, z, world, blockData) : null;
}

@Override
public boolean sendBlockChange(Player player, int x, int y, int z) {
ServerPlayer serverPlayer = player(player);
ServerLevel level = serverPlayer.getLevel();
if (!isChunkLoaded(level, x >> 4, z >> 4)) {
return false;
}

BlockPos position = new BlockPos(x, y, z);
ClientboundBlockUpdatePacket packet = new ClientboundBlockUpdatePacket(level, position);
serverPlayer.connection.send(packet);
updateBlockEntity(serverPlayer, position, packet.blockState);

return true;
}

private void updateBlockEntity(ServerPlayer player, BlockPos position, BlockState blockData) {
if (blockData.hasBlockEntity()) {
ServerLevel serverLevel = player.getLevel();
BlockEntity blockEntity = serverLevel.getBlockEntity(position);
if (blockEntity != null) {
player.connection.send(blockEntity.getUpdatePacket());
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.imprex.orebfuscator.nms.v1_19_R1;

import net.imprex.orebfuscator.nms.ReadOnlyChunk;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.LevelChunkSection;

public class ReadOnlyChunkWrapper implements ReadOnlyChunk {

private final LevelChunk chunk;

ReadOnlyChunkWrapper(LevelChunk chunk) {
this.chunk = chunk;
}

private BlockState getState(int x, int y, int z) {
int sectionIndex = chunk.getSectionIndex(y);
LevelChunkSection[] sections = chunk.getSections();
if (sectionIndex >= 0 && sectionIndex < sections.length) {
LevelChunkSection section = sections[sectionIndex];
if (sections != null && !section.hasOnlyAir()) {
return section.getBlockState(x & 0xF, y & 0xF, z & 0xF);
}
}
return Blocks.AIR.defaultBlockState();
}

@Override
public int getBlockState(int x, int y, int z) {
return NmsManager.getBlockId(getState(x, y, z));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package net.imprex.orebfuscator.nms.v1_19_R1;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.file.Path;

import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_19_R1.CraftServer;

import net.imprex.orebfuscator.config.CacheConfig;
import net.imprex.orebfuscator.nms.AbstractRegionFileCache;
import net.imprex.orebfuscator.util.ChunkPosition;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.chunk.storage.RegionFile;
import net.minecraft.world.level.chunk.storage.RegionFileVersion;

public class RegionFileCache extends AbstractRegionFileCache<RegionFile> {

public RegionFileCache(CacheConfig cacheConfig) {
super(cacheConfig);
}

@Override
protected RegionFile createRegionFile(Path path) throws IOException {
boolean isSyncChunkWrites = ((CraftServer) Bukkit.getServer()).getServer().forceSynchronousWrites();
return new RegionFile(path, path.getParent(), RegionFileVersion.VERSION_DEFLATE, isSyncChunkWrites);
}

@Override
protected void closeRegionFile(RegionFile t) throws IOException {
t.close();
}

@Override
protected DataInputStream createInputStream(RegionFile t, ChunkPosition key) throws IOException {
return t.getChunkDataInputStream(new ChunkPos(key.getX(), key.getZ()));
}

@Override
protected DataOutputStream createOutputStream(RegionFile t, ChunkPosition key) throws IOException {
return t.getChunkDataOutputStream(new ChunkPos(key.getX(), key.getZ()));
}
}
1 change: 1 addition & 0 deletions orebfuscator-nms/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@
<module>orebfuscator-nms-v1_17_R1</module>
<module>orebfuscator-nms-v1_18_R1</module>
<module>orebfuscator-nms-v1_18_R2</module>
<module>orebfuscator-nms-v1_19_R1</module>
</modules>
</project>
6 changes: 6 additions & 0 deletions orebfuscator-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,5 +139,11 @@
<version>${revision}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.imprex</groupId>
<artifactId>orebfuscator-nms-v1_19_R1</artifactId>
<version>${revision}</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Loading

0 comments on commit ee9343e

Please sign in to comment.