diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftCreativeCategoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftCreativeCategoryMixin.java new file mode 100644 index 00000000..57dfac81 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftCreativeCategoryMixin.java @@ -0,0 +1,17 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import net.minecraft.world.item.CreativeModeTab; +import org.bukkit.craftbukkit.v.inventory.CraftCreativeCategory; +import org.bukkit.inventory.CreativeCategory; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@Mixin(CraftCreativeCategory.class) +public class CraftCreativeCategoryMixin { + + @Shadow @Final @Mutable private static Map NMS_TO_BUKKIT; +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java index f61ba95d..f33b8d63 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java @@ -241,6 +241,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } s = event.getReason(); + ArclightCaptures.captureQuitMessage(s); Component textComponent = CraftChatMessage.fromString(s, true)[0]; this.connection.send(new ClientboundDisconnectPacket(textComponent), future -> this.connection.disconnect(textComponent)); this.onDisconnect(textComponent); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index 3050d4b4..cf76a929 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -191,7 +191,8 @@ public abstract class PlayerListMixin implements PlayerListBridge { if (playerIn.inventoryMenu != playerIn.containerMenu) { ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().closeInventory(); } - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(), "\u00A7e" + playerIn.getScoreboardName() + " left the game"); + var quitMessage = ArclightCaptures.getQuitMessage(); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(), quitMessage != null ? quitMessage : "\u00A7e" + playerIn.getScoreboardName() + " left the game"); cserver.getPluginManager().callEvent(playerQuitEvent); ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); playerIn.doTick(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin.java index 74f5590f..52c67464 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ChorusFlowerBlockMixin.java @@ -3,6 +3,7 @@ package io.izzel.arclight.common.mixin.core.world.level.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; @@ -11,11 +12,15 @@ import net.minecraft.world.level.block.ChorusFlowerBlock; import net.minecraft.world.level.block.ChorusPlantBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.phys.BlockHitResult; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; import java.util.Random; @@ -109,4 +114,11 @@ public abstract class ChorusFlowerBlockMixin extends BlockMixin { } } } + + @Inject(method = "onProjectileHit", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;destroyBlock(Lnet/minecraft/core/BlockPos;ZLnet/minecraft/world/entity/Entity;)Z")) + private void arclight$hitByProjectile(Level p_51654_, BlockState p_51655_, BlockHitResult result, Projectile projectile, CallbackInfo ci) { + if (CraftEventFactory.callEntityChangeBlockEvent(projectile, result.getBlockPos(), Blocks.AIR.defaultBlockState()).isCancelled()) { + ci.cancel(); + } + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index 30406dd6..4238ad08 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -24,6 +24,7 @@ import net.minecraft.stats.Stats; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.decoration.Motive; import net.minecraft.world.entity.npc.VillagerProfession; +import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; @@ -41,21 +42,25 @@ import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.craftbukkit.v.CraftCrashReport; import org.bukkit.craftbukkit.v.CraftStatistic; +import org.bukkit.craftbukkit.v.inventory.CraftCreativeCategory; import org.bukkit.craftbukkit.v.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; +import org.bukkit.inventory.CreativeCategory; import org.bukkit.potion.PotionEffectType; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; @SuppressWarnings({"ConstantConditions", "deprecation"}) public class BukkitRegistry { @@ -90,6 +95,31 @@ public class BukkitRegistry { loadBiomes(); loadArts(); loadStats(); + loadCreativeTab(); + } + + private static void loadCreativeTab() { + var id = new AtomicInteger(CreativeCategory.values().length); + var newTypes = new ArrayList(); + var tabs = CreativeModeTab.TABS; + var map = new HashMap(Unsafe.getStatic(CraftCreativeCategory.class, "NMS_TO_BUKKIT")); + for (var tab : tabs) { + map.computeIfAbsent(tab, k -> { + var name = "MOD_" + k.getId(); + var newTab = EnumHelper.makeEnum(CreativeCategory.class, name, id.getAndIncrement(), List.of(), List.of()); + newTypes.add(newTab); + ArclightMod.LOGGER.debug("Registered {} as creative tab {}", k, newTab); + return newTab; + }); + } + EnumHelper.addEnums(CreativeCategory.class, newTypes); + try { + var field = CraftCreativeCategory.class.getDeclaredField("NMS_TO_BUKKIT"); + field.setAccessible(true); + field.set(null, map); + } catch (Exception e) { + throw new RuntimeException(e); + } } private static void loadStats() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java index 922221e2..75f2cb83 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/ArclightCaptures.java @@ -69,11 +69,7 @@ public class ArclightCaptures { private static String quitMessage; public static void captureQuitMessage(String quitMessage) { - if (ArclightCaptures.quitMessage == null) { - ArclightCaptures.quitMessage = quitMessage; - } else { - recapture("quit message"); - } + ArclightCaptures.quitMessage = quitMessage; } public static String getQuitMessage() { diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index 78b0d9e6..f6eb446d 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -17,6 +17,7 @@ "CraftBlockMixin", "CraftBlockStateMixin", "CraftConsoleCommandSenderMixin", + "CraftCreativeCategoryMixin", "CraftEntityMixin", "CraftEventFactoryMixin", "CraftHumanEntityMixin",