Skip to content

Commit

Permalink
Sync changes & Fix build
Browse files Browse the repository at this point in the history
  • Loading branch information
HaHaWTH committed Dec 16, 2024
1 parent 18904e5 commit aabb1c9
Show file tree
Hide file tree
Showing 30 changed files with 447 additions and 60 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ buildscript {
}
}
dependencies {
classpath "net.minecraftforge.gradle:ForgeGradle:6.10.+"
classpath "net.minecraftforge.gradle:ForgeGradle:6.0.+"
}
}

Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@
+ widths[0] = lineWidth;
+ formats[0] = format.toString();
+ continue;
+ case '鎼�':
+ case '§':
+ if (i + 1 < chars.length) { // Prevent out of bound
+ f = chars[i + 1];
+ boolean isC = func_78272_b(f);
Expand All @@ -244,8 +244,8 @@
+ } else {
+ bold = true;
+ }
+ format.append('').append(f); // Add to current format code
+ line.append('').append(f);
+ format.append('§').append(f); // Add to current format code
+ line.append('§').append(f);
+ widths[i - fed] = lineWidth;
+ widths[i - fed + 1] = lineWidth;
+ formats[i - fed] = format.toString();
Expand Down
2 changes: 1 addition & 1 deletion patches/minecraft/net/minecraft/entity/Entity.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -993,7 +993,7 @@
}
}
-
+ catserver.server.utils.ModFixUtils.func_145775_I(); // CatServer - fix Quark
+ catserver.server.utils.ModFixUtils.doBlockCollisions(); // CatServer - fix Quark
+ // Move to the top of the method
+ /*
try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
+ // private int chatSpamThresholdCount;
+ // CraftBukkit start - multithreaded fields
+ private volatile int field_147374_l;
+ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(NetHandlerPlayServer.class, FMLLaunchHandler.isDeobfuscatedEnvironment() ? "chatSpamThresholdCount" : "chatSpamThresholdCount");
+ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(NetHandlerPlayServer.class, FMLLaunchHandler.isDeobfuscatedEnvironment() ? "chatSpamThresholdCount" : new String(new char[]{'f', 'i', 'e', 'l', 'd', '_', '1', '4', '7', '3', '7', '4', '_', 'l'}));
+ // CraftBukkit end
private int field_147375_m;
- private final IntHashMap<Short> field_147372_n = new IntHashMap<>();
Expand Down
12 changes: 7 additions & 5 deletions patches/minecraft/net/minecraft/world/Explosion.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@
private final double field_77285_c;
private final double field_77282_d;
- private final Entity field_77283_e;
+ public final Entity field_77283_e;
private final float field_77280_f;
- private final float field_77280_f;
- private final List<BlockPos> field_77281_g = Lists.newArrayList();
- private final Map<EntityPlayer, Vec3d> field_77288_k = Maps.newHashMap();
+ public final Entity field_77283_e;
+ public float field_77280_f; // CatRoom - private final -> public
+ private final List<BlockPos> field_77281_g;
+ private final Map<EntityPlayer, Vec3d> field_77288_k;
+ private final Vec3d position;
Expand Down Expand Up @@ -188,12 +189,13 @@
- d5 /= d13;
- d7 /= d13;
- d9 /= d13;
- double d14 = (double)this.field_77287_j.func_72842_a(vec3d, entity.func_174813_aQ());
- double d10 = (1.0 - d12) * d14;
- entity.func_70097_a(DamageSource.func_94539_a(this), (float)((int)((d10 * d10 + d10) / 2.0 * 7.0 * (double)f3 + 1.0)));
+ d5 = d5 / d13;
+ d7 = d7 / d13;
+ d9 = d9 / d13;
double d14 = (double)this.field_77287_j.func_72842_a(vec3d, entity.func_174813_aQ());
- double d10 = (1.0 - d12) * d14;
- entity.func_70097_a(DamageSource.func_94539_a(this), (float)((int)((d10 * d10 + d10) / 2.0 * 7.0 * (double)f3 + 1.0)));
+ double d14 = this.getBlockDensity(vec3d, entity.func_174813_aQ()); // Paper - Optimize explosions
+ double d10 = (1.0D - d12) * d14;
+ // entity.attackEntityFrom(DamageSource.causeExplosionDamage(this), (float)((int)((d10 * d10 + d10) / 2.0D * 7.0D * (double)f3 + 1.0D)));
+ CraftEventFactory.entityDamage = field_77283_e;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/catserver/server/CatServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static String getNativeVersion() {

public static void onServerStart() {
RealtimeThread.INSTANCE.start();
new VersionCheck();
// new VersionCheck(); // CatRoom
}

public static void onServerStop() {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/catserver/server/CatServerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public class CatServerConfig {

public boolean waitForgeServerChatEvent = false;

public boolean bridgeForgeExplosionEventToBukkit = true; // CatRoom

public int craftRequestThrottle = 20;
public int itemNBTThrottle = 200;
public boolean limitFastClickGUI = false;
Expand Down Expand Up @@ -109,6 +111,9 @@ public void loadConfig() {
releaseUseItemThrottle = getOrWriteIntConfig("network.packetLimit.releaseUseItemThrottle", releaseUseItemThrottle);
disableFMLHandshake = getOrWriteBooleanConfig("network.fml.disableHandshake", config.getBoolean("disableFMLHandshake", disableFMLHandshake));
disableFMLStatusModInfo = getOrWriteBooleanConfig("network.fml.disableStatusModInfo", config.getBoolean("disableFMLStatusModInfo", disableFMLStatusModInfo));
// Event bridge // CatRoom start - Handle mod explosion event
bridgeForgeExplosionEventToBukkit = getOrWriteBooleanConfig("event-bridge.bridgeForgeExplosionEventToBukkit", bridgeForgeExplosionEventToBukkit);
// CatRoom end - Handle mod explosion event
// general
disableUpdateGameProfile = getOrWriteBooleanConfig("disableUpdateGameProfile", disableUpdateGameProfile);
disableAsyncCatchWarn = getOrWriteBooleanConfig("disableAsyncCatchWarn", disableAsyncCatchWarn);
Expand Down
62 changes: 62 additions & 0 deletions src/main/java/catserver/server/CatServerEventHandler.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,35 @@
package catserver.server;

import com.google.common.collect.Lists;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.Explosion;
import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.event.world.ExplosionEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlockState;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory;
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockExplodeEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;

import java.util.ArrayList;
Expand All @@ -40,6 +51,57 @@ public void onBlockBreak(BlockEvent.BreakEvent event) {
bukkitBlockBreakEventCapture.put(bukkitEvent);
}

// CatRoom start - Handle mod explosion event
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onExplode(ExplosionEvent.Detonate event) {
if (!CatServer.getConfig().bridgeForgeExplosionEventToBukkit) return;
Explosion explosion = event.getExplosion();
if (explosion.getClass() != Explosion.class) {
Entity exploder = explosion.exploder;
World bworld = event.getWorld().getWorld();
Vec3d explosionPos = explosion.getPosition();
Location location = new Location(bworld, explosionPos.x, explosionPos.y, explosionPos.z);
List<Block> bukkitBlocks;
boolean cancelled;
float yield;
final List<Block> blockList = Lists.newArrayList();
List<BlockPos> affectedBlockPositions = event.getAffectedBlocks();
for (int i1 = affectedBlockPositions.size() - 1; i1 >= 0; i1--) {
BlockPos cpos = affectedBlockPositions.get(i1);
Block bblock = bworld.getBlockAt(cpos.getX(), cpos.getY(), cpos.getZ());
if (bblock.getType() != Material.AIR) {
blockList.add(bblock);
}
}
if (exploder != null) {
EntityExplodeEvent bukkitEvent = new EntityExplodeEvent(exploder.getBukkitEntity(), location , blockList, 1.0F / explosion.size);
Bukkit.getServer().getPluginManager().callEvent(bukkitEvent);
cancelled = bukkitEvent.isCancelled();
bukkitBlocks = bukkitEvent.blockList();
yield = bukkitEvent.getYield();
} else {
BlockExplodeEvent bukkitEvent = new BlockExplodeEvent(location.getBlock(), blockList, 1.0F / explosion.size);
Bukkit.getServer().getPluginManager().callEvent(bukkitEvent);
cancelled = bukkitEvent.isCancelled();
bukkitBlocks = bukkitEvent.blockList();
yield = bukkitEvent.getYield();
}
explosion.getAffectedBlockPositions().clear();

if (cancelled) {
event.getAffectedEntities().clear();
explosion.wasCanceled = true;
} else {
for (Block bblock : bukkitBlocks) {
BlockPos coords = new BlockPos(bblock.getX(), bblock.getY(), bblock.getZ());
explosion.getAffectedBlockPositions().add(coords);
}
explosion.size = yield * explosion.size;
}
}
}
// CatRoom end - Handle mod explosion event

@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onBlockPlace(BlockEvent.PlaceEvent event) {
BlockPos clickPos = event.direction != null ? event.getBlockSnapshot().getPos().offset(event.direction.getOpposite()) : event.getPos();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
package catserver.server.command.internal;

import catserver.server.CatServer;
// CatRoom start - Dump item command
import catserver.server.utils.ItemStackUtils;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.minecraft.item.ItemStack;
// CatRoom end - Dump item command
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_12_R1.CraftServer;
// CatRoom start - Dump item command
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
// CatRoom end - Dump item command

public class CommandCatserver extends Command {
public CommandCatserver(String name) {
super(name);
this.description = "CatServer related commands";
this.usageMessage = "/catserver worlds|reload|reloadall";
this.usageMessage = "/catserver worlds|reload|reloadall|dumpitem"; // CatRoom - Dump item command
setPermission("catserver.command.catserver");
}

Expand All @@ -40,6 +50,22 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
CatServer.getConfig().loadConfig();
((CraftServer) Bukkit.getServer()).reloadConfig();
sender.sendMessage(ChatColor.GREEN + "Configuration reload complete.");
} else if (args[0].equals("dumpitem")) { // CatRoom start - Dump item command
if (!(sender instanceof Player player)) {
sender.sendMessage(ChatColor.RED + "Only players can use this command.");
return true;
}
var itemInHand = ((CraftPlayer) player).getHandle().getHeldItemMainhand();
if (itemInHand == ItemStack.EMPTY) {
sender.sendMessage(ChatColor.RED + "You are not holding any item.");
return true;
}
sender.sendMessage(ItemStackUtils.formatItemStackToPrettyString(itemInHand));
TextComponent message = new TextComponent("[Click to insert give command]");
message.setColor(net.md_5.bungee.api.ChatColor.GREEN);
message.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, ItemStackUtils.itemStackToGiveCommand(itemInHand)));
sender.spigot().sendMessage(message);
// CatRoom end - Dump item command
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,15 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)

sender.sendMessage("Chunks Time:");
for (ChunkTime chunkTime : chunkList) {
if (chunkTime.chunk == null) continue;
int chunkX = chunkTime.chunk.x;
int chunkZ = chunkTime.chunk.z;
int posX = chunkX << 4;
int posZ = chunkZ << 4;
int time = (int) (chunkTime.time / 1000 / 1000);
int avg = totalTick > 0 ? time / totalTick : 0;

TextComponent component = new TextComponent(String.format("[%s: %d,%d at chunk %d,%d] has running time: %d ms (Arg %d ms/tick)", chunkTime.chunk.world.getWorld().getName(), posX, posZ, chunkX, chunkZ, time, avg));
TextComponent component = new TextComponent(String.format("[%s: %d,%d at chunk %d,%d] has running time: %d ms (Avg %d ms/tick)", chunkTime.chunk.world.getWorld().getName(), posX, posZ, chunkX, chunkZ, time, avg));
component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/minecraft:tp %d 128 %d", posX, posZ)));
component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(String.format("Execute command: /minecraft:tp %d 128 %d", posX, posZ))}));
sender.spigot().sendMessage(component);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;

@Deprecated // CatRoom - We have hidden class executors :3
public class MethodHandleEventExecutor implements EventExecutor {
private final Class<? extends Event> eventClass;
private final MethodHandle handle;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

@Deprecated // CatRoom - We have hidden class executors :3
public class StaticMethodHandleEventExecutor implements EventExecutor {
private final Class<? extends Event> eventClass;
private final MethodHandle handle;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import static org.objectweb.asm.Opcodes.*;

@Deprecated // CatRoom - We have hidden class executors :3
public class ASMEventExecutorGenerator {
public static byte[] generateEventExecutor(Method m, String name) {
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package catserver.server.executor.asm;

@Deprecated // CatRoom - We have hidden class executors :3
public interface ClassDefiner {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.util.concurrent.ConcurrentMap;

@Deprecated // CatRoom - We have hidden class executors :3
public class SafeClassDefiner implements ClassDefiner {
/* default */ static final SafeClassDefiner INSTANCE = new SafeClassDefiner();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package catserver.server.executor.hiddenclass;

import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.EventExecutor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.constant.ConstantDescs;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Objects;

public final class BukkitEventExecutorFactory {
private static final byte[] TEMPLATE_CLASS_BYTES;

static {
try (final InputStream is = BukkitEventExecutorFactory.class.getResourceAsStream("MethodHandleEventExecutorTemplate.class")) {
TEMPLATE_CLASS_BYTES = Objects.requireNonNull(is, "template class is missing").readAllBytes();
} catch (IOException e) {
throw new AssertionError(e);
}
}

private BukkitEventExecutorFactory() {
}

/**
* @return an {@link EventExecutor} implemented by a hidden class calling a method handle
*
* @param method the method to be invoked by the created event executor
* @param eventClass the class of the event to handle
*/
public static EventExecutor create(final Method method, final Class<? extends Event> eventClass) {
final List<?> classData = List.of(method, eventClass);
try {
final MethodHandles.Lookup newClass = MethodHandles.lookup().defineHiddenClassWithClassData(TEMPLATE_CLASS_BYTES, classData, true);
return newClass.lookupClass().asSubclass(EventExecutor.class).getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException e) {
throw new AssertionError(e);
}
}

record ClassData(Method method, MethodHandle methodHandle, Class<? extends Event> eventClass) {

}

/**
* Extracts the class data and creates an adjusted MethodHandle directly usable by the lookup class.
* The logic is kept here to minimize memory usage per created class.
*/
static ClassData classData(final MethodHandles.Lookup lookup) {
try {
final Method method = MethodHandles.classDataAt(lookup, ConstantDescs.DEFAULT_NAME, Method.class, 0);
MethodHandle mh = lookup.unreflect(method);
if (Modifier.isStatic(method.getModifiers())) {
mh = MethodHandles.dropArguments(mh, 0, Listener.class);
}
mh = mh.asType(MethodType.methodType(void.class, Listener.class, Event.class));
final Class<?> eventClass = MethodHandles.classDataAt(lookup, ConstantDescs.DEFAULT_NAME, Class.class, 1);
return new ClassData(method, mh, eventClass.asSubclass(Event.class));
} catch (ReflectiveOperationException e) {
throw new AssertionError(e);
}
}
}
Loading

0 comments on commit aabb1c9

Please sign in to comment.