Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-27 16:40:10 +01:00
Abstract the BossBar for multi-platform support
Dieser Commit ist enthalten in:
Ursprung
dc01fb59b8
Commit
b146257b1a
@ -7,6 +7,7 @@ import us.myles.ViaVersion.api.boss.BossColor;
|
|||||||
import us.myles.ViaVersion.api.boss.BossStyle;
|
import us.myles.ViaVersion.api.boss.BossStyle;
|
||||||
import us.myles.ViaVersion.api.command.ViaVersionCommand;
|
import us.myles.ViaVersion.api.command.ViaVersionCommand;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
|
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
|
||||||
|
import us.myles.ViaVersion.boss.ViaBossBar;
|
||||||
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -80,7 +81,7 @@ public interface ViaVersionAPI {
|
|||||||
* @param title The title
|
* @param title The title
|
||||||
* @param color The color
|
* @param color The color
|
||||||
* @param style The style
|
* @param style The style
|
||||||
* @return Bossbar instance
|
* @return BossBar instance
|
||||||
*/
|
*/
|
||||||
BossBar createBossBar(String title, BossColor color, BossStyle style);
|
BossBar createBossBar(String title, BossColor color, BossStyle style);
|
||||||
|
|
||||||
@ -91,7 +92,7 @@ public interface ViaVersionAPI {
|
|||||||
* @param health Number between 0 and 1
|
* @param health Number between 0 and 1
|
||||||
* @param color The color
|
* @param color The color
|
||||||
* @param style The style
|
* @param style The style
|
||||||
* @return Bossbar instance
|
* @return BossBar instance
|
||||||
*/
|
*/
|
||||||
BossBar createBossBar(String title, float health, BossColor color, BossStyle style);
|
BossBar createBossBar(String title, float health, BossColor color, BossStyle style);
|
||||||
|
|
||||||
|
@ -1,237 +1,42 @@
|
|||||||
package us.myles.ViaVersion.boss;
|
package us.myles.ViaVersion.boss;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.apache.commons.lang.Validate;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import us.myles.ViaVersion.api.ViaVersion;
|
|
||||||
import us.myles.ViaVersion.api.boss.BossBar;
|
import us.myles.ViaVersion.api.boss.BossBar;
|
||||||
import us.myles.ViaVersion.api.boss.BossColor;
|
import us.myles.ViaVersion.api.boss.BossColor;
|
||||||
import us.myles.ViaVersion.api.boss.BossFlag;
|
|
||||||
import us.myles.ViaVersion.api.boss.BossStyle;
|
import us.myles.ViaVersion.api.boss.BossStyle;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
|
||||||
import us.myles.ViaVersion.api.type.Type;
|
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
public class ViaBossBar implements BossBar {
|
public class ViaBossBar extends CommonBoss {
|
||||||
private UUID uuid;
|
|
||||||
private String title;
|
|
||||||
private float health;
|
|
||||||
private BossColor color;
|
|
||||||
private BossStyle style;
|
|
||||||
private Set<UUID> players;
|
|
||||||
private boolean visible;
|
|
||||||
private Set<BossFlag> flags;
|
|
||||||
|
|
||||||
public ViaBossBar(String title, float health, BossColor color, BossStyle style) {
|
public ViaBossBar(String title, float health, BossColor color, BossStyle style) {
|
||||||
Validate.notNull(title, "Title cannot be null");
|
super(title, health, color, style);
|
||||||
Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1");
|
|
||||||
this.uuid = UUID.randomUUID();
|
|
||||||
this.title = title;
|
|
||||||
this.health = health;
|
|
||||||
this.color = color == null ? BossColor.PURPLE : color;
|
|
||||||
this.style = style == null ? BossStyle.SOLID : style;
|
|
||||||
this.players = new HashSet<>();
|
|
||||||
this.flags = new HashSet<>();
|
|
||||||
visible = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BossBar setTitle(@NonNull String title) {
|
public BossBar addPlayer(Object player) {
|
||||||
this.title = title;
|
if (player instanceof Player){
|
||||||
sendPacket(UpdateAction.UPDATE_TITLE);
|
addPlayer(((Player) player).getUniqueId());
|
||||||
return this;
|
} else {
|
||||||
}
|
throw new IllegalArgumentException("The addPlayer argument has to be a Bukkit player on this platform");
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar setHealth(float health) {
|
|
||||||
Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1");
|
|
||||||
this.health = health;
|
|
||||||
sendPacket(UpdateAction.UPDATE_HEALTH);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossColor getColor() {
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar setColor(@NonNull BossColor color) {
|
|
||||||
this.color = color;
|
|
||||||
sendPacket(UpdateAction.UPDATE_STYLE);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar setStyle(@NonNull BossStyle style) {
|
|
||||||
this.style = style;
|
|
||||||
sendPacket(UpdateAction.UPDATE_STYLE);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar addPlayer(@NonNull Player player) {
|
|
||||||
return addPlayer(player.getUniqueId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar addPlayer(UUID player) {
|
|
||||||
if (!players.contains(player)) {
|
|
||||||
players.add(player);
|
|
||||||
if (visible)
|
|
||||||
sendPacket(player, getPacket(UpdateAction.ADD));
|
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BossBar removePlayer(@NonNull Player player) {
|
public BossBar addPlayers(Object... players) {
|
||||||
if (players.contains(player.getUniqueId())) {
|
for (Object p : players)
|
||||||
players.remove(player.getUniqueId());
|
|
||||||
sendPacket(player.getUniqueId(), getPacket(UpdateAction.REMOVE));
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar addPlayers(@NonNull Player... players) {
|
|
||||||
for (Player p : players)
|
|
||||||
addPlayer(p);
|
addPlayer(p);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BossBar addFlag(@NonNull BossFlag flag) {
|
public BossBar removePlayer(Object player) {
|
||||||
if (!hasFlag(flag))
|
if (player instanceof Player){
|
||||||
flags.add(flag);
|
removePlayer(((Player) player).getUniqueId());
|
||||||
sendPacket(UpdateAction.UPDATE_FLAGS);
|
} else {
|
||||||
|
throw new IllegalArgumentException("The removePlayer argument has to be a Bukkit player on this platform");
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar removeFlag(@NonNull BossFlag flag) {
|
|
||||||
if (hasFlag(flag))
|
|
||||||
flags.remove(flag);
|
|
||||||
sendPacket(UpdateAction.UPDATE_FLAGS);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasFlag(@NonNull BossFlag flag) {
|
|
||||||
return flags.contains(flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<UUID> getPlayers() {
|
|
||||||
return Collections.unmodifiableSet(players);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar show() {
|
|
||||||
setVisible(true);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BossBar hide() {
|
|
||||||
setVisible(false);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVisible() {
|
|
||||||
return visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setVisible(boolean value) {
|
|
||||||
if (visible != value) {
|
|
||||||
visible = value;
|
|
||||||
sendPacket(value ? UpdateAction.ADD : UpdateAction.REMOVE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendPacket(UpdateAction action) {
|
|
||||||
for (UUID uuid : new ArrayList<>(players)) {
|
|
||||||
ByteBuf buf = getPacket(action);
|
|
||||||
sendPacket(uuid, buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendPacket(UUID uuid, ByteBuf buf) {
|
|
||||||
if (!ViaVersion.getInstance().isPorted(uuid) || !(ViaVersion.getInstance().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) {
|
|
||||||
players.remove(uuid);
|
|
||||||
buf.release();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ViaVersion.getInstance().sendRawPacket(uuid, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ByteBuf getPacket(UpdateAction action) {
|
|
||||||
try {
|
|
||||||
ByteBuf buf = Unpooled.buffer();
|
|
||||||
Type.VAR_INT.write(buf, 0x0C); // Boss bar packet
|
|
||||||
Type.UUID.write(buf, uuid);
|
|
||||||
Type.VAR_INT.write(buf, action.getId());
|
|
||||||
switch (action) {
|
|
||||||
case ADD:
|
|
||||||
Type.STRING.write(buf, fixJson(title));
|
|
||||||
buf.writeFloat(health);
|
|
||||||
Type.VAR_INT.write(buf, color.getId());
|
|
||||||
Type.VAR_INT.write(buf, style.getId());
|
|
||||||
buf.writeByte(flagToBytes());
|
|
||||||
break;
|
|
||||||
case REMOVE:
|
|
||||||
break;
|
|
||||||
case UPDATE_HEALTH:
|
|
||||||
buf.writeFloat(health);
|
|
||||||
break;
|
|
||||||
case UPDATE_TITLE:
|
|
||||||
Type.STRING.write(buf, fixJson(title));
|
|
||||||
break;
|
|
||||||
case UPDATE_STYLE:
|
|
||||||
Type.VAR_INT.write(buf, color.getId());
|
|
||||||
Type.VAR_INT.write(buf, style.getId());
|
|
||||||
break;
|
|
||||||
case UPDATE_FLAGS:
|
|
||||||
buf.writeByte(flagToBytes());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int flagToBytes() {
|
|
||||||
int bitmask = 0;
|
|
||||||
for (BossFlag flag : flags)
|
|
||||||
bitmask |= flag.getId();
|
|
||||||
return bitmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String fixJson(String text) {
|
|
||||||
return Protocol1_9TO1_8.fixJson(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Getter
|
|
||||||
private enum UpdateAction {
|
|
||||||
ADD(0),
|
|
||||||
REMOVE(1),
|
|
||||||
UPDATE_HEALTH(2),
|
|
||||||
UPDATE_TITLE(3),
|
|
||||||
UPDATE_STYLE(4),
|
|
||||||
UPDATE_FLAGS(5);
|
|
||||||
|
|
||||||
private final int id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
package us.myles.ViaVersion.api.boss;
|
package us.myles.ViaVersion.api.boss;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
import org.apache.commons.lang.NotImplementedException;
|
||||||
|
import us.myles.ViaVersion.api.Via;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface BossBar {
|
public abstract class BossBar {
|
||||||
/**
|
/**
|
||||||
* Get the current title
|
* Get the current title
|
||||||
*
|
*
|
||||||
* @return the title
|
* @return the title
|
||||||
*/
|
*/
|
||||||
String getTitle();
|
public abstract String getTitle();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the title
|
* Change the title
|
||||||
@ -19,14 +20,14 @@ public interface BossBar {
|
|||||||
* @param title Title can be in either JSON or just text
|
* @param title Title can be in either JSON or just text
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar setTitle(String title);
|
public abstract BossBar setTitle(String title);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the health
|
* Get the health
|
||||||
*
|
*
|
||||||
* @return float between 0F - 1F
|
* @return float between 0F - 1F
|
||||||
*/
|
*/
|
||||||
float getHealth();
|
public abstract float getHealth();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the health
|
* Change the health
|
||||||
@ -34,14 +35,14 @@ public interface BossBar {
|
|||||||
* @param health this float has to be between 0F - 1F
|
* @param health this float has to be between 0F - 1F
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar setHealth(float health);
|
public abstract BossBar setHealth(float health);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the bossbar color
|
* Get the bossbar color
|
||||||
*
|
*
|
||||||
* @return The colour
|
* @return The colour
|
||||||
*/
|
*/
|
||||||
BossColor getColor();
|
public abstract BossColor getColor();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Yay colors!
|
* Yay colors!
|
||||||
@ -49,14 +50,14 @@ public interface BossBar {
|
|||||||
* @param color Whatever color you want!
|
* @param color Whatever color you want!
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar setColor(BossColor color);
|
public abstract BossBar setColor(BossColor color);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the bosbar style
|
* Get the bosbar style
|
||||||
*
|
*
|
||||||
* @return BossStyle
|
* @return BossStyle
|
||||||
*/
|
*/
|
||||||
BossStyle getStyle();
|
public abstract BossStyle getStyle();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the bosbar style
|
* Change the bosbar style
|
||||||
@ -64,7 +65,7 @@ public interface BossBar {
|
|||||||
* @param style BossStyle
|
* @param style BossStyle
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar setStyle(BossStyle style);
|
public abstract BossBar setStyle(BossStyle style);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the bossbar to a player.
|
* Show the bossbar to a player.
|
||||||
@ -72,7 +73,9 @@ public interface BossBar {
|
|||||||
* @param player The player
|
* @param player The player
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar addPlayer(Player player);
|
public BossBar addPlayer(Object player){
|
||||||
|
throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the bossbar to a player (uuid)
|
* Show the bossbar to a player (uuid)
|
||||||
@ -80,7 +83,7 @@ public interface BossBar {
|
|||||||
* @param player uuid of the player
|
* @param player uuid of the player
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar addPlayer(UUID player);
|
public abstract BossBar addPlayer(UUID player);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* add multiple players
|
* add multiple players
|
||||||
@ -88,7 +91,9 @@ public interface BossBar {
|
|||||||
* @param players list of players
|
* @param players list of players
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar addPlayers(Player... players);
|
public BossBar addPlayers(Object... players){
|
||||||
|
throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the bossbar from a player
|
* Remove the bossbar from a player
|
||||||
@ -96,7 +101,11 @@ public interface BossBar {
|
|||||||
* @param player The player
|
* @param player The player
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar removePlayer(Player player);
|
public BossBar removePlayer(Object player){
|
||||||
|
throw new NotImplementedException("This method is not implemented for the platform " + Via.getPlatform().getPlatformName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract BossBar removePlayer(UUID uuid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add flags
|
* Add flags
|
||||||
@ -104,7 +113,7 @@ public interface BossBar {
|
|||||||
* @param flag The flag to add
|
* @param flag The flag to add
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar addFlag(BossFlag flag);
|
public abstract BossBar addFlag(BossFlag flag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove flags.
|
* Remove flags.
|
||||||
@ -112,39 +121,39 @@ public interface BossBar {
|
|||||||
* @param flag The flag to remove
|
* @param flag The flag to remove
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar removeFlag(BossFlag flag);
|
public abstract BossBar removeFlag(BossFlag flag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param flag The flag to check against
|
* @param flag The flag to check against
|
||||||
* @return True if it has the flag
|
* @return True if it has the flag
|
||||||
*/
|
*/
|
||||||
boolean hasFlag(BossFlag flag);
|
public abstract boolean hasFlag(BossFlag flag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get players
|
* Get players
|
||||||
*
|
*
|
||||||
* @return UUIDS from players (sorry I lied)
|
* @return UUIDS from players (sorry I lied)
|
||||||
*/
|
*/
|
||||||
Set<UUID> getPlayers();
|
public abstract Set<UUID> getPlayers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the bossbar to everyone (In the getPlayer set)
|
* Show the bossbar to everyone (In the getPlayer set)
|
||||||
*
|
*
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar show();
|
public abstract BossBar show();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hide the bossbar from everyone (In the getPlayer set)
|
* Hide the bossbar from everyone (In the getPlayer set)
|
||||||
*
|
*
|
||||||
* @return The BossBar object
|
* @return The BossBar object
|
||||||
*/
|
*/
|
||||||
BossBar hide();
|
public abstract BossBar hide();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is it visible?
|
* Is it visible?
|
||||||
*
|
*
|
||||||
* @return visibility changable with show() and hide()
|
* @return visibility changable with show() and hide()
|
||||||
*/
|
*/
|
||||||
boolean isVisible();
|
public abstract boolean isVisible();
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import io.netty.channel.ChannelHandler;
|
|||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.ViaVersion;
|
import us.myles.ViaVersion.api.ViaVersion;
|
||||||
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
|
|
||||||
@ -144,10 +145,10 @@ public class UserConnection {
|
|||||||
pendingDisconnect = true;
|
pendingDisconnect = true;
|
||||||
if (get(ProtocolInfo.class).getUuid() != null) {
|
if (get(ProtocolInfo.class).getUuid() != null) {
|
||||||
final UUID uuid = get(ProtocolInfo.class).getUuid();
|
final UUID uuid = get(ProtocolInfo.class).getUuid();
|
||||||
ViaVersion.getPlatform().runSync(new Runnable() {
|
Via.getPlatform().runSync(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!ViaVersion.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) {
|
if (!Via.getPlatform().kickPlayer(uuid, ChatColor.translateAlternateColorCodes('&', reason))) {
|
||||||
getChannel().close(); // =)
|
getChannel().close(); // =)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,13 @@
|
|||||||
package us.myles.ViaVersion.api.minecraft.metadata;
|
package us.myles.ViaVersion.api.minecraft.metadata;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.*;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import us.myles.ViaVersion.api.type.Type;
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Getter
|
@Data
|
||||||
@Setter
|
|
||||||
public class Metadata {
|
public class Metadata {
|
||||||
private int id;
|
private int id;
|
||||||
private int typeID;
|
private int typeID;
|
||||||
private Type type;
|
private Type type;
|
||||||
private Object value;
|
private Object value;
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Metadata{" +
|
|
||||||
"id=" + id +
|
|
||||||
", typeID=" + typeID +
|
|
||||||
", type=" + type +
|
|
||||||
", value=" + value +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
225
common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java
Normale Datei
225
common/src/main/java/us/myles/ViaVersion/boss/CommonBoss.java
Normale Datei
@ -0,0 +1,225 @@
|
|||||||
|
package us.myles.ViaVersion.boss;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import us.myles.ViaVersion.api.ViaVersion;
|
||||||
|
import us.myles.ViaVersion.api.boss.BossBar;
|
||||||
|
import us.myles.ViaVersion.api.boss.BossColor;
|
||||||
|
import us.myles.ViaVersion.api.boss.BossFlag;
|
||||||
|
import us.myles.ViaVersion.api.boss.BossStyle;
|
||||||
|
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
||||||
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public abstract class CommonBoss extends BossBar {
|
||||||
|
private UUID uuid;
|
||||||
|
private String title;
|
||||||
|
private float health;
|
||||||
|
private BossColor color;
|
||||||
|
private BossStyle style;
|
||||||
|
private Set<UUID> players;
|
||||||
|
private boolean visible;
|
||||||
|
private Set<BossFlag> flags;
|
||||||
|
|
||||||
|
public CommonBoss(String title, float health, BossColor color, BossStyle style) {
|
||||||
|
Validate.notNull(title, "Title cannot be null");
|
||||||
|
Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1");
|
||||||
|
|
||||||
|
this.uuid = UUID.randomUUID();
|
||||||
|
this.title = title;
|
||||||
|
this.health = health;
|
||||||
|
this.color = color == null ? BossColor.PURPLE : color;
|
||||||
|
this.style = style == null ? BossStyle.SOLID : style;
|
||||||
|
this.players = new HashSet<>();
|
||||||
|
this.flags = new HashSet<>();
|
||||||
|
visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar setTitle(@NonNull String title) {
|
||||||
|
this.title = title;
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_TITLE);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar setHealth(float health) {
|
||||||
|
Validate.isTrue((health >= 0 && health <= 1), "Health must be between 0 and 1");
|
||||||
|
this.health = health;
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_HEALTH);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossColor getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar setColor(@NonNull BossColor color) {
|
||||||
|
this.color = color;
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar setStyle(@NonNull BossStyle style) {
|
||||||
|
this.style = style;
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_STYLE);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar addPlayer(UUID player) {
|
||||||
|
if (!players.contains(player)) {
|
||||||
|
players.add(player);
|
||||||
|
if (visible)
|
||||||
|
sendPacket(player, getPacket(ViaBossBar.UpdateAction.ADD));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar removePlayer(UUID uuid) {
|
||||||
|
if (players.contains(uuid)) {
|
||||||
|
players.remove(uuid);
|
||||||
|
sendPacket(uuid, getPacket(UpdateAction.REMOVE));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar addFlag(@NonNull BossFlag flag) {
|
||||||
|
if (!hasFlag(flag))
|
||||||
|
flags.add(flag);
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar removeFlag(@NonNull BossFlag flag) {
|
||||||
|
if (hasFlag(flag))
|
||||||
|
flags.remove(flag);
|
||||||
|
sendPacket(ViaBossBar.UpdateAction.UPDATE_FLAGS);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasFlag(@NonNull BossFlag flag) {
|
||||||
|
return flags.contains(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<UUID> getPlayers() {
|
||||||
|
return Collections.unmodifiableSet(players);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar show() {
|
||||||
|
setVisible(true);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BossBar hide() {
|
||||||
|
setVisible(false);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVisible() {
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setVisible(boolean value) {
|
||||||
|
if (visible != value) {
|
||||||
|
visible = value;
|
||||||
|
sendPacket(value ? ViaBossBar.UpdateAction.ADD : ViaBossBar.UpdateAction.REMOVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendPacket(UpdateAction action) {
|
||||||
|
for (UUID uuid : new ArrayList<>(players)) {
|
||||||
|
ByteBuf buf = getPacket(action);
|
||||||
|
sendPacket(uuid, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendPacket(UUID uuid, ByteBuf buf) {
|
||||||
|
if (!ViaVersion.getInstance().isPorted(uuid) || !(ViaVersion.getInstance().getPlayerVersion(uuid) >= ProtocolVersion.v1_9.getId())) {
|
||||||
|
players.remove(uuid);
|
||||||
|
buf.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ViaVersion.getInstance().sendRawPacket(uuid, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ByteBuf getPacket(UpdateAction action) {
|
||||||
|
try {
|
||||||
|
ByteBuf buf = Unpooled.buffer();
|
||||||
|
Type.VAR_INT.write(buf, 0x0C); // Boss bar packet
|
||||||
|
Type.UUID.write(buf, uuid);
|
||||||
|
Type.VAR_INT.write(buf, action.getId());
|
||||||
|
switch (action) {
|
||||||
|
case ADD:
|
||||||
|
Type.STRING.write(buf, fixJson(title));
|
||||||
|
buf.writeFloat(health);
|
||||||
|
Type.VAR_INT.write(buf, color.getId());
|
||||||
|
Type.VAR_INT.write(buf, style.getId());
|
||||||
|
buf.writeByte(flagToBytes());
|
||||||
|
break;
|
||||||
|
case REMOVE:
|
||||||
|
break;
|
||||||
|
case UPDATE_HEALTH:
|
||||||
|
buf.writeFloat(health);
|
||||||
|
break;
|
||||||
|
case UPDATE_TITLE:
|
||||||
|
Type.STRING.write(buf, fixJson(title));
|
||||||
|
break;
|
||||||
|
case UPDATE_STYLE:
|
||||||
|
Type.VAR_INT.write(buf, color.getId());
|
||||||
|
Type.VAR_INT.write(buf, style.getId());
|
||||||
|
break;
|
||||||
|
case UPDATE_FLAGS:
|
||||||
|
buf.writeByte(flagToBytes());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int flagToBytes() {
|
||||||
|
int bitmask = 0;
|
||||||
|
for (BossFlag flag : flags)
|
||||||
|
bitmask |= flag.getId();
|
||||||
|
return bitmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String fixJson(String text) {
|
||||||
|
return Protocol1_9TO1_8.fixJson(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Getter
|
||||||
|
private enum UpdateAction {
|
||||||
|
ADD(0),
|
||||||
|
REMOVE(1),
|
||||||
|
UPDATE_HEALTH(2),
|
||||||
|
UPDATE_TITLE(3),
|
||||||
|
UPDATE_STYLE(4),
|
||||||
|
UPDATE_FLAGS(5);
|
||||||
|
|
||||||
|
private final int id;
|
||||||
|
}
|
||||||
|
}
|
@ -17,7 +17,7 @@
|
|||||||
<defaultGoal>clean install</defaultGoal>
|
<defaultGoal>clean install</defaultGoal>
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<targetPath>.</targetPath>
|
<targetPath>.</targetPath>https://github.com/MylesIsCool/ViaVersion/blob/master/ISSUE_TEMPLATE.md
|
||||||
<filtering>false</filtering>
|
<filtering>false</filtering>
|
||||||
<directory>.</directory>
|
<directory>.</directory>
|
||||||
<includes>
|
<includes>
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren