diff --git a/sources/src/main/java/io/akarin/server/mixin/optimization/MixinBlockStationary.java b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinBlockStationary.java new file mode 100644 index 000000000..087245994 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinBlockStationary.java @@ -0,0 +1,30 @@ +package io.akarin.server.mixin.optimization; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import net.minecraft.server.BlockFluids; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.BlockStationary; +import net.minecraft.server.IBlockData; +import net.minecraft.server.Material; +import net.minecraft.server.World; + +@Mixin(value = BlockStationary.class, remap = false) +public abstract class MixinBlockStationary extends BlockFluids { + protected MixinBlockStationary(Material material) { + super(material); + } + @Overwrite + private boolean d(World world, BlockPosition blockposition) { + if (blockposition.getY() >= 0 && blockposition.getY() < 256) { + IBlockData blockData = world.getTypeIfLoaded(blockposition); + + if (blockData != null) { + return blockData.getMaterial().isBurnable(); + } + } + + return false; + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/optimization/MixinMathHelper.java b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinMathHelper.java new file mode 100644 index 000000000..c565f364b --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinMathHelper.java @@ -0,0 +1,51 @@ +package io.akarin.server.mixin.optimization; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import net.minecraft.server.MathHelper; + +@Mixin(value = MathHelper.class, remap = false) +public abstract class MixinMathHelper { + private static final int[] SINE_TABLE_INT = new int[16384 + 1]; + private static final float SINE_TABLE_MIDPOINT; + @Overwrite + public static float sin(float f) { + return lookup((int) (f * 10430.38) & 0xFFFF); + } + @Overwrite + public static float cos(float f) { + return lookup((int) (f * 10430.38 + 16384.0) & 0xFFFF); + } + private static float lookup(int index) { + if (index == 32768) { + return SINE_TABLE_MIDPOINT; + } + int neg = (index & 0x8000) << 16; + int mask = (index << 17) >> 31; + int pos = (0x8001 & mask) + (index ^ mask); + pos &= 0x7fff; + return Float.intBitsToFloat(SINE_TABLE_INT[pos] ^ neg); + } + static { + int i; + + final float[] SINE_TABLE = new float[65536]; + for (i = 0; i < 65536; ++i) { + SINE_TABLE[i] = (float) Math.sin((double) i * 3.141592653589793D * 2.0D / 65536.0D); + } + for (i = 0; i < SINE_TABLE_INT.length; i++) { + SINE_TABLE_INT[i] = Float.floatToRawIntBits(SINE_TABLE[i]); + } + + SINE_TABLE_MIDPOINT = SINE_TABLE[SINE_TABLE.length / 2]; + for (i = 0; i < SINE_TABLE.length; i++) { + float expected = SINE_TABLE[i]; + float value = lookup(i); + + if (expected != value) { + throw new IllegalArgumentException(String.format("LUT error at index %d (expected: %s, found: %s)", i, expected, value)); + } + } + } +} diff --git a/sources/src/main/java/net/minecraft/server/BlockStationary.java b/sources/src/main/java/net/minecraft/server/BlockStationary.java deleted file mode 100644 index 31ffc3ac5..000000000 --- a/sources/src/main/java/net/minecraft/server/BlockStationary.java +++ /dev/null @@ -1,118 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockStationary extends BlockFluids { - - protected BlockStationary(Material material) { - super(material); - this.a(false); - if (material == Material.LAVA) { - this.a(true); - } - - } - - public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) { - if (!this.e(world, blockposition, iblockdata)) { - this.f(world, blockposition, iblockdata); - } - - } - - private void f(World world, BlockPosition blockposition, IBlockData iblockdata) { - BlockFlowing blockflowing = a(this.material); - - world.setTypeAndData(blockposition, blockflowing.getBlockData().set(BlockStationary.LEVEL, iblockdata.get(BlockStationary.LEVEL)), 2); - world.a(blockposition, (Block) blockflowing, this.a(world)); - } - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (this.material == Material.LAVA) { - if (world.getGameRules().getBoolean("doFireTick")) { - int i = random.nextInt(3); - - if (i > 0) { - BlockPosition blockposition1 = blockposition; - - for (int j = 0; j < i; ++j) { - blockposition1 = blockposition1.a(random.nextInt(3) - 1, 1, random.nextInt(3) - 1); - if (blockposition1.getY() >= 0 && blockposition1.getY() < 256 && !world.isLoaded(blockposition1)) { - return; - } - - Block block = world.getType(blockposition1).getBlock(); - - if (block.material == Material.AIR) { - if (this.c(world, blockposition1)) { - // CraftBukkit start - Prevent lava putting something on fire - if (world.getType(blockposition1) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { - continue; - } - } - // CraftBukkit end - world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); - return; - } - } else if (block.material.isSolid()) { - return; - } - } - } else { - for (int k = 0; k < 3; ++k) { - BlockPosition blockposition2 = blockposition.a(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); - - if (blockposition2.getY() >= 0 && blockposition2.getY() < 256 && !world.isLoaded(blockposition2)) { - return; - } - - if (world.isEmpty(blockposition2.up()) && this.d(world, blockposition2)) { - // CraftBukkit start - Prevent lava putting something on fire - BlockPosition up = blockposition2.up(); - if (world.getType(up) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, up.getX(), up.getY(), up.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { - continue; - } - } - // CraftBukkit end - world.setTypeUpdate(blockposition2.up(), Blocks.FIRE.getBlockData()); - } - } - } - - } - } - } - - protected boolean c(World world, BlockPosition blockposition) { - EnumDirection[] aenumdirection = EnumDirection.values(); - int i = aenumdirection.length; - - for (int j = 0; j < i; ++j) { - EnumDirection enumdirection = aenumdirection[j]; - - if (this.d(world, blockposition.shift(enumdirection))) { - return true; - } - } - - return false; - } - - private boolean d(World world, BlockPosition blockposition) { - // Dionysus start - improve fire spread checks - if (blockposition.getY() >= 0 && blockposition.getY() < 256) { - IBlockData blockData = world.getTypeIfLoaded(blockposition); - - if (blockData != null) { - return blockData.getMaterial().isBurnable(); - } - } - - return false; - // Dionysus end - } -} diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index 3e6c653c8..090661739 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -42,6 +42,8 @@ "optimization.MixinBlockChest", "optimization.MixinEntityMushroomCow", "optimization.MixinContainerHorse", - "optimization.MixinExplosion" + "optimization.MixinExplosion", + "optimization.MixinMathHelper", + "optimization.MixinBlockStationary" ] }