Add more legacy player support
This commit is contained in:
parent
0f664153ec
commit
ddbc7c7eac
|
@ -2,6 +2,7 @@ package tc.oc.commons.bukkit.freeze;
|
|||
|
||||
import java.time.Duration;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.WeakHashMap;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
@ -15,10 +16,15 @@ import org.bukkit.event.EventPriority;
|
|||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.world.WorldUnloadEvent;
|
||||
import tc.oc.commons.bukkit.event.CoarsePlayerMoveEvent;
|
||||
import tc.oc.commons.bukkit.util.NMSHacks;
|
||||
import tc.oc.commons.core.collection.WeakHashSet;
|
||||
import tc.oc.commons.core.plugin.PluginFacet;
|
||||
import tc.oc.minecraft.api.scheduler.Tickable;
|
||||
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.lessThan;
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.MINECRAFT_1_8;
|
||||
|
||||
/**
|
||||
* Freezes players by mounting them on an invisible minecart.
|
||||
*/
|
||||
|
@ -27,6 +33,7 @@ public class PlayerFreezer implements PluginFacet, Listener, Tickable {
|
|||
|
||||
private final Map<World, NMSHacks.FakeArmorStand> armorStands = new WeakHashMap<>();
|
||||
private final SetMultimap<Player, FrozenPlayer> frozenPlayers = HashMultimap.create();
|
||||
private final Set<Player> legacyFrozenPlayers = new WeakHashSet<>();
|
||||
|
||||
@Inject PlayerFreezer() {}
|
||||
|
||||
|
@ -53,6 +60,9 @@ public class PlayerFreezer implements PluginFacet, Listener, Tickable {
|
|||
player.leaveVehicle(); // TODO: Put them back in the vehicle when thawed?
|
||||
armorStand(player).spawn(player, player.getLocation());
|
||||
sendAttach(player);
|
||||
if(lessThan(MINECRAFT_1_8, player.getProtocolVersion())) {
|
||||
legacyFrozenPlayers.add(player);
|
||||
}
|
||||
}
|
||||
|
||||
return frozenPlayer;
|
||||
|
@ -70,9 +80,17 @@ public class PlayerFreezer implements PluginFacet, Listener, Tickable {
|
|||
armorStand(player).ride(player, player);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onMove(CoarsePlayerMoveEvent event) {
|
||||
if(isFrozen(event.getPlayer()) && legacyFrozenPlayers.contains(event.getPlayer())) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
frozenPlayers.removeAll(event.getPlayer());
|
||||
legacyFrozenPlayers.remove(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
|
@ -96,6 +114,7 @@ public class PlayerFreezer implements PluginFacet, Listener, Tickable {
|
|||
if(frozenPlayers.remove(player, this) && !isFrozen(player) && player.isOnline()) {
|
||||
armorStand(player).destroy(player);
|
||||
player.setPaused(false);
|
||||
legacyFrozenPlayers.remove(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,9 @@ import org.bukkit.entity.Player;
|
|||
import tc.oc.commons.bukkit.chat.ComponentRenderContext;
|
||||
import tc.oc.commons.bukkit.util.NMSHacks;
|
||||
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.atLeast;
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.MINECRAFT_1_8;
|
||||
|
||||
public class TabRender {
|
||||
|
||||
@Inject private static ComponentRenderContext componentRenderContext;
|
||||
|
@ -38,7 +41,10 @@ public class TabRender {
|
|||
}
|
||||
|
||||
private void send(Packet packet) {
|
||||
NMSHacks.sendPacket(this.view.getViewer(), packet);
|
||||
// Legacy players will be unable to see custom tab rendering code
|
||||
if(atLeast(MINECRAFT_1_8, this.view.getViewer().getProtocolVersion())) {
|
||||
NMSHacks.sendPacket(this.view.getViewer(), packet);
|
||||
}
|
||||
}
|
||||
|
||||
private PacketPlayOutPlayerInfo createPlayerInfoPacket(PacketPlayOutPlayerInfo.EnumPlayerInfoAction action) {
|
||||
|
|
|
@ -246,7 +246,7 @@ public class MapRatingsMatchModule extends MatchModule implements Listener {
|
|||
}
|
||||
|
||||
if(oldScore != null && score == oldScore) {
|
||||
player.sendWarning(PGMTranslations.t("rating.sameRating", player, score));
|
||||
player.sendWarning(PGMTranslations.t("rating.sameRating", player, score), true);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ import tc.oc.api.docs.PlayerId;
|
|||
import tc.oc.api.docs.Server;
|
||||
import tc.oc.api.docs.User;
|
||||
import tc.oc.commons.bukkit.attribute.AttributeUtils;
|
||||
import tc.oc.commons.bukkit.chat.BukkitAudiences;
|
||||
import tc.oc.commons.bukkit.chat.BukkitSound;
|
||||
import tc.oc.commons.bukkit.chat.ComponentRenderers;
|
||||
import tc.oc.commons.bukkit.chat.NameStyle;
|
||||
|
@ -44,6 +45,7 @@ import tc.oc.commons.bukkit.settings.SettingManagerProvider;
|
|||
import tc.oc.commons.bukkit.util.PlayerStates;
|
||||
import tc.oc.commons.core.chat.Audience;
|
||||
import tc.oc.commons.core.chat.Component;
|
||||
import tc.oc.commons.core.chat.ForwardingAudience;
|
||||
import tc.oc.commons.core.chat.Sound;
|
||||
import tc.oc.commons.core.logging.Loggers;
|
||||
import tc.oc.commons.core.util.Optionals;
|
||||
|
@ -64,7 +66,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
* MatchPlayer stores all information that is necessary for the core plugin.
|
||||
*/
|
||||
public class MatchPlayer extends MatchFacetContext<MatchPlayerFacet> implements InventoryHolder,
|
||||
Audience,
|
||||
ForwardingAudience,
|
||||
Named,
|
||||
IPlayerQuery,
|
||||
Listener,
|
||||
|
@ -92,9 +94,11 @@ public class MatchPlayer extends MatchFacetContext<MatchPlayerFacet> implements
|
|||
|
||||
private Logger logger;
|
||||
private SettingManager settings;
|
||||
@Inject private void init(Loggers loggers, SettingManagerProvider settingManagerProvider, Player player) {
|
||||
private Audience audience;
|
||||
@Inject private void init(Loggers loggers, SettingManagerProvider settingManagerProvider, BukkitAudiences audiences, Player player) {
|
||||
this.logger = loggers.get(match.getLogger(), getClass(), getName());
|
||||
this.settings = settingManagerProvider.getManager(player);
|
||||
this.audience = audiences.get(player);
|
||||
}
|
||||
|
||||
protected @Nullable Party party;
|
||||
|
@ -519,41 +523,19 @@ public class MatchPlayer extends MatchFacetContext<MatchPlayerFacet> implements
|
|||
}
|
||||
|
||||
@Override
|
||||
public void sendMessage(String message) {
|
||||
getBukkit().sendMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMessage(BaseComponent message) {
|
||||
getBukkit().sendMessage(ComponentRenderers.render(checkNotNull(message), getBukkit()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendHotbarMessage(BaseComponent message) {
|
||||
getBukkit().sendMessage(ChatMessageType.ACTION_BAR, ComponentRenderers.render(message, getBukkit()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showTitle(BaseComponent title, BaseComponent subtitle, int inTicks, int stayTicks, int outTicks) {
|
||||
title = title == null ? new Component("") : ComponentRenderers.render(title, getBukkit());
|
||||
subtitle = subtitle == null ? new Component("") : ComponentRenderers.render(subtitle, getBukkit());
|
||||
getBukkit().showTitle(title, subtitle, inTicks, stayTicks, outTicks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideTitle() {
|
||||
getBukkit().hideTitle();
|
||||
public Audience audience() {
|
||||
return audience;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendWarning(String message, boolean audible) {
|
||||
getBukkit().sendMessage(ChatColor.YELLOW + " \u26a0 " + ChatColor.RED + message); // The character is '⚠'
|
||||
audience().sendWarning(message, audible);
|
||||
if(audible) playWarningSound();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendWarning(BaseComponent message, boolean audible) {
|
||||
sendMessage(new Component(net.md_5.bungee.api.ChatColor.RED).extra(new Component(" \u26a0 ", net.md_5.bungee.api.ChatColor.YELLOW), message));
|
||||
audience().sendWarning(message, audible);
|
||||
if(audible) playWarningSound();
|
||||
}
|
||||
|
||||
|
@ -562,16 +544,6 @@ public class MatchPlayer extends MatchFacetContext<MatchPlayerFacet> implements
|
|||
this.playSound(sound, getBukkit().getLocation());
|
||||
}
|
||||
|
||||
public void sendMessage(List<String> lines) {
|
||||
for(String line : lines) {
|
||||
this.sendMessage(line);
|
||||
}
|
||||
}
|
||||
|
||||
public void sendWarning(String message) {
|
||||
this.sendWarning(message, false);
|
||||
}
|
||||
|
||||
public void sendWarning(BaseComponent message) {
|
||||
this.sendWarning(message, false);
|
||||
}
|
||||
|
|
|
@ -11,16 +11,23 @@ import tc.oc.pgm.events.ObserverInteractEvent;
|
|||
import tc.oc.pgm.match.MatchPlayer;
|
||||
import tc.oc.pgm.spawns.Spawn;
|
||||
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.lessThan;
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.MINECRAFT_1_8;
|
||||
|
||||
/**
|
||||
* Player is waiting to spawn as a participant
|
||||
*/
|
||||
public abstract class Spawning extends Participating {
|
||||
|
||||
protected boolean legacy;
|
||||
protected boolean spawnRequested;
|
||||
protected boolean seenTitle;
|
||||
|
||||
public Spawning(MatchPlayer player) {
|
||||
super(player);
|
||||
this.spawnRequested = options.auto;
|
||||
this.legacy = lessThan(MINECRAFT_1_8, player.getBukkit().getProtocolVersion());
|
||||
this.spawnRequested = options.auto || legacy;
|
||||
this.seenTitle = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -74,7 +81,10 @@ public abstract class Spawning extends Participating {
|
|||
}
|
||||
|
||||
public void updateTitle() {
|
||||
if(legacy && seenTitle) return;
|
||||
|
||||
player.showTitle(getTitle(), new Component(getSubtitle(), ChatColor.GREEN), 0, 3, 3);
|
||||
seenTitle = true;
|
||||
}
|
||||
|
||||
protected abstract BaseComponent getTitle();
|
||||
|
|
|
@ -9,6 +9,9 @@ import tc.oc.commons.core.chat.Audience;
|
|||
import tc.oc.commons.core.chat.MinecraftAudiences;
|
||||
import tc.oc.commons.core.chat.NullAudience;
|
||||
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.lessThan;
|
||||
import static tc.oc.minecraft.protocol.MinecraftVersion.MINECRAFT_1_8;
|
||||
|
||||
@Singleton
|
||||
public class BukkitAudiences extends MinecraftAudiences<CommandSender> implements Audiences {
|
||||
|
||||
|
@ -17,7 +20,12 @@ public class BukkitAudiences extends MinecraftAudiences<CommandSender> implement
|
|||
if(sender == null) {
|
||||
return NullAudience.INSTANCE;
|
||||
} if(sender instanceof Player) {
|
||||
return new PlayerAudience((Player) sender);
|
||||
Player player = (Player) sender;
|
||||
if(lessThan(MINECRAFT_1_8, player.getProtocolVersion())) {
|
||||
return new LegacyPlayerAudience(player);
|
||||
} else {
|
||||
return new PlayerAudience(player);
|
||||
}
|
||||
} else if(sender instanceof ConsoleCommandSender) {
|
||||
return new ConsoleAudience(sender.getServer());
|
||||
} else {
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package tc.oc.commons.bukkit.chat;
|
||||
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
import tc.oc.commons.core.chat.Component;
|
||||
import tc.oc.commons.core.chat.Components;
|
||||
|
||||
public class LegacyPlayerAudience extends PlayerAudience {
|
||||
|
||||
private BaseComponent recentHotbarMessage;
|
||||
|
||||
public LegacyPlayerAudience(Player player) {
|
||||
super(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendHotbarMessage(BaseComponent message) {
|
||||
// Do not spam hot bar messages, as the protocol converts
|
||||
// them to regular chat messages.
|
||||
if(!Components.equals(message, recentHotbarMessage)) {
|
||||
super.sendHotbarMessage(message);
|
||||
recentHotbarMessage = message;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showTitle(BaseComponent title, BaseComponent subtitle, int inTicks, int stayTicks, int outTicks) {
|
||||
super.sendMessage(new Component(title).extra(" ").extra(subtitle));
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ import com.google.common.collect.ImmutableMap;
|
|||
|
||||
public enum MinecraftVersion {
|
||||
|
||||
MINECRAFT_1_7_5(4, "1.7.5"),
|
||||
MINECRAFT_1_7_2(4, "1.7.2"),
|
||||
MINECRAFT_1_7_10(5, "1.7.10"),
|
||||
MINECRAFT_1_8(47, "1.8"),
|
||||
MINECRAFT_1_9(107, "1.9"),
|
||||
|
@ -16,7 +16,8 @@ public enum MinecraftVersion {
|
|||
MINECRAFT_1_9_4(110, "1.9.4"),
|
||||
MINECRAFT_1_10(210, "1.10"),
|
||||
MINECRAFT_1_11(315, "1.11"),
|
||||
MINECRAFT_1_11_1(316, "1.11.1");
|
||||
MINECRAFT_1_11_1(316, "1.11.1"),
|
||||
MINECRAFT_1_12(335, "1.12");
|
||||
|
||||
private final int protocol;
|
||||
private final String version;
|
||||
|
@ -44,6 +45,15 @@ public enum MinecraftVersion {
|
|||
return byProtocol.get(protocol);
|
||||
}
|
||||
|
||||
public static boolean atLeast(MinecraftVersion version, int protocol) {
|
||||
MinecraftVersion other = byProtocol(protocol);
|
||||
return other == null || other.protocol() >= version.protocol();
|
||||
}
|
||||
|
||||
public static boolean lessThan(MinecraftVersion version, int protocol) {
|
||||
return !atLeast(version, protocol);
|
||||
}
|
||||
|
||||
private static final Map<Integer, MinecraftVersion> byProtocol;
|
||||
|
||||
static {
|
||||
|
|
Loading…
Reference in New Issue