Implement PlayerSpawnLocationEvent

This commit is contained in:
IzzelAliz 2021-07-05 23:00:59 +08:00
parent ec3cb7a2da
commit dd92ceb7c8

View File

@ -44,6 +44,7 @@ import net.minecraft.server.management.PlayerList;
import net.minecraft.server.management.ProfileBanEntry; import net.minecraft.server.management.ProfileBanEntry;
import net.minecraft.stats.ServerStatisticsManager; import net.minecraft.stats.ServerStatisticsManager;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.util.RegistryKey;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents; import net.minecraft.util.SoundEvents;
import net.minecraft.util.Util; import net.minecraft.util.Util;
@ -65,6 +66,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.craftbukkit.v.CraftWorld;
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
import org.bukkit.craftbukkit.v.util.CraftChatMessage; import org.bukkit.craftbukkit.v.util.CraftChatMessage;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerChangedWorldEvent;
@ -73,6 +75,7 @@ import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.spigotmc.SpigotConfig; import org.spigotmc.SpigotConfig;
import org.spigotmc.event.player.PlayerSpawnLocationEvent;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Mutable;
@ -136,6 +139,18 @@ public abstract class PlayerListMixin implements PlayerListBridge {
cserver = ArclightServer.createOrLoad((DedicatedServer) minecraftServer, (PlayerList) (Object) this); cserver = ArclightServer.createOrLoad((DedicatedServer) minecraftServer, (PlayerList) (Object) this);
} }
@Redirect(method = "initializeConnectionToPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getWorld(Lnet/minecraft/util/RegistryKey;)Lnet/minecraft/world/server/ServerWorld;"))
private ServerWorld arclight$spawnLocationEvent(MinecraftServer minecraftServer, RegistryKey<World> dimension, NetworkManager netManager, ServerPlayerEntity playerIn) {
CraftPlayer player = ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity();
PlayerSpawnLocationEvent event = new PlayerSpawnLocationEvent(player, player.getLocation());
cserver.getPluginManager().callEvent(event);
Location loc = event.getSpawnLocation();
ServerWorld world = ((CraftWorld) loc.getWorld()).getHandle();
playerIn.setWorld(world);
playerIn.setPositionAndRotation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
return world;
}
@Redirect(method = "initializeConnectionToPlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/server/management/PlayerList;viewDistance:I")) @Redirect(method = "initializeConnectionToPlayer", at = @At(value = "FIELD", target = "Lnet/minecraft/server/management/PlayerList;viewDistance:I"))
private int arclight$spigotViewDistance(PlayerList playerList, NetworkManager netManager, ServerPlayerEntity playerIn) { private int arclight$spigotViewDistance(PlayerList playerList, NetworkManager netManager, ServerPlayerEntity playerIn) {
return ((WorldBridge) playerIn.getServerWorld()).bridge$spigotConfig().viewDistance; return ((WorldBridge) playerIn.getServerWorld()).bridge$spigotConfig().viewDistance;