PacketTeams (1.9)

This commit is contained in:
Bixilon 2020-07-01 16:28:47 +02:00
parent a875bde2ac
commit 06d33d0f27
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 276 additions and 216 deletions

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.game.datatypes.scoreboard;
import java.util.HashMap;
public class ScoreboardManager {
final HashMap<String, ScoreboardTeam> teams;
final HashMap<String, Team> teams;
final HashMap<String, ScoreboardObjective> objectives;
@ -25,11 +25,11 @@ public class ScoreboardManager {
objectives = new HashMap<>();
}
public void addTeam(ScoreboardTeam team) {
public void addTeam(Team team) {
teams.put(team.getName(), team);
}
public ScoreboardTeam getTeam(String name) {
public Team getTeam(String name) {
return teams.get(name);
}

View File

@ -13,34 +13,35 @@
package de.bixilon.minosoft.game.datatypes.scoreboard;
import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketScoreboardTeams;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ScoreboardTeam {
public class Team {
final String name;
final List<String> players;
String displayName;
String prefix;
String suffix;
PacketScoreboardTeams.ScoreboardFriendlyFire friendlyFire;
final List<String> players;
boolean friendlyFire;
boolean seeFriendlyInvisibles;
public ScoreboardTeam(String name, String displayName, String prefix, String suffix, PacketScoreboardTeams.ScoreboardFriendlyFire friendlyFire, String[] players) {
public Team(String name, String displayName, String prefix, String suffix, boolean friendlyFire, boolean seeFriendlyInvisibles, String[] players) {
this.name = name;
this.displayName = displayName;
this.prefix = prefix;
this.suffix = suffix;
this.friendlyFire = friendlyFire;
this.seeFriendlyInvisibles = seeFriendlyInvisibles;
this.players = new ArrayList<>(Arrays.asList(players));
}
public void updateInformation(String displayName, String prefix, String suffix, PacketScoreboardTeams.ScoreboardFriendlyFire friendlyFire) {
public void updateInformation(String displayName, String prefix, String suffix, boolean friendlyFire, boolean seeFriendlyInvisibles) {
this.displayName = displayName;
this.prefix = prefix;
this.suffix = suffix;
this.friendlyFire = friendlyFire;
this.seeFriendlyInvisibles = seeFriendlyInvisibles;
}
public String getName() {
@ -59,10 +60,14 @@ public class ScoreboardTeam {
return suffix;
}
public PacketScoreboardTeams.ScoreboardFriendlyFire getFriendlyFire() {
public boolean isFriendlyFireEnabled() {
return friendlyFire;
}
public boolean isSeeingFriendlyInvisibles() {
return seeFriendlyInvisibles;
}
public void addPlayers(List<String> list) {
players.addAll(list);
}

View File

@ -60,15 +60,15 @@ public class PacketBlockAction implements ClientboundPacket {
clazz = ChestAction.class;
break;
case 138:
// chest
// beacon
clazz = BeaconAction.class;
break;
case 52:
// chest
// mob spawner
clazz = MobSpawnerAction.class;
break;
case 209:
// chest
// end gateway
clazz = EndGatewayAction.class;
break;
default:

View File

@ -1,197 +0,0 @@
/*
* Codename Minosoft
* Copyright (C) 2020 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.ChatColor;
import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InPacketBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
public class PacketScoreboardTeams implements ClientboundPacket {
String name;
ScoreboardTeamAction action;
String displayName;
String prefix;
String suffix;
ScoreboardFriendlyFire friendlyFire;
ScoreboardNameTagVisibility nameTagVisibility;
TextComponent.ChatAttributes color;
String[] playerNames;
@Override
public boolean read(InPacketBuffer buffer) {
switch (buffer.getVersion()) {
case VERSION_1_7_10:
name = buffer.readString();
action = ScoreboardTeamAction.byId(buffer.readByte());
if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.INFORMATION_UPDATE) {
displayName = buffer.readString();
prefix = buffer.readString();
suffix = buffer.readString();
friendlyFire = ScoreboardFriendlyFire.byId(buffer.readByte());
// default values
nameTagVisibility = ScoreboardNameTagVisibility.ALWAYS;
color = TextComponent.ChatAttributes.WHITE;
}
if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.PLAYER_ADD || action == ScoreboardTeamAction.PLAYER_REMOVE) {
short playerCount = buffer.readShort();
playerNames = new String[playerCount];
for (int i = 0; i < playerCount; i++) {
playerNames[i] = buffer.readString();
}
}
return true;
case VERSION_1_8:
name = buffer.readString();
action = ScoreboardTeamAction.byId(buffer.readByte());
if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.INFORMATION_UPDATE) {
displayName = buffer.readString();
prefix = buffer.readString();
suffix = buffer.readString();
friendlyFire = ScoreboardFriendlyFire.byId(buffer.readByte());
nameTagVisibility = ScoreboardNameTagVisibility.byName(buffer.readString());
color = TextComponent.ChatAttributes.byColor(ChatColor.byId(buffer.readByte()));
}
if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.PLAYER_ADD || action == ScoreboardTeamAction.PLAYER_REMOVE) {
int playerCount = buffer.readVarInt();
playerNames = new String[playerCount];
for (int i = 0; i < playerCount; i++) {
playerNames[i] = buffer.readString();
}
}
return true;
}
return false;
}
@Override
public void log() {
Log.protocol(String.format("Received scoreboard Team update (name=\"%s\", action=%s, displayName=\"%s\", prefix=\"%s\", suffix=\"%s\", friendlyFire=%s, playerCount=%s)", name, action.name(), displayName, prefix, suffix, (friendlyFire == null ? "null" : friendlyFire.name()), ((playerNames == null) ? "null" : playerNames.length)));
}
@Override
public void handle(PacketHandler h) {
h.handle(this);
}
public String getName() {
return name;
}
public ScoreboardTeamAction getAction() {
return action;
}
public String getDisplayName() {
return displayName;
}
public String getPrefix() {
return prefix;
}
public String getSuffix() {
return suffix;
}
public ScoreboardFriendlyFire getFriendlyFire() {
return friendlyFire;
}
public String[] getPlayerNames() {
return playerNames;
}
public enum ScoreboardTeamAction {
CREATE(0),
REMOVE(1),
INFORMATION_UPDATE(2),
PLAYER_ADD(3),
PLAYER_REMOVE(4);
final int id;
ScoreboardTeamAction(int id) {
this.id = id;
}
public static ScoreboardTeamAction byId(int id) {
for (ScoreboardTeamAction a : values()) {
if (a.getId() == id) {
return a;
}
}
return null;
}
public int getId() {
return id;
}
}
public enum ScoreboardFriendlyFire {
OFF(0),
ON(1),
SEE_FRIENDLY_INVISIBLES(3);
final int id;
ScoreboardFriendlyFire(int id) {
this.id = id;
}
public static ScoreboardFriendlyFire byId(int id) {
for (ScoreboardFriendlyFire f : values()) {
if (f.getId() == id) {
return f;
}
}
return null;
}
public int getId() {
return id;
}
}
public enum ScoreboardNameTagVisibility {
ALWAYS("always"),
HIDE_FOR_OTHER_TEAMS("hideForOtherTeams"),
HIDE_FOR_OWN_TEAM("hideForOwnTeam"),
NEVER("never");
final String name;
ScoreboardNameTagVisibility(String name) {
this.name = name;
}
public static ScoreboardNameTagVisibility byName(String name) {
for (ScoreboardNameTagVisibility v : values()) {
if (v.getName().equals(name)) {
return v;
}
}
return null;
}
public String getName() {
return name;
}
}
}

View File

@ -0,0 +1,252 @@
/*
* Codename Minosoft
* Copyright (C) 2020 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.protocol.packets.clientbound.play;
import de.bixilon.minosoft.game.datatypes.ChatColor;
import de.bixilon.minosoft.game.datatypes.TextComponent;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.protocol.InPacketBuffer;
import de.bixilon.minosoft.protocol.protocol.PacketHandler;
import de.bixilon.minosoft.util.BitByte;
public class PacketTeams implements ClientboundPacket {
String name;
TeamActions action;
String displayName;
String prefix;
String suffix;
boolean friendlyFire;
boolean seeFriendlyInvisibles;
TeamCollisionRules collisionRule = TeamCollisionRules.NEVER;
TeamNameTagVisibilities nameTagVisibility = TeamNameTagVisibilities.ALWAYS;
TextComponent.ChatAttributes color = TextComponent.ChatAttributes.WHITE;
String[] playerNames;
@Override
public boolean read(InPacketBuffer buffer) {
switch (buffer.getVersion()) {
case VERSION_1_7_10:
name = buffer.readString();
action = TeamActions.byId(buffer.readByte());
if (action == TeamActions.CREATE || action == TeamActions.INFORMATION_UPDATE) {
displayName = buffer.readString();
prefix = buffer.readString();
suffix = buffer.readString();
setFriendlyFireByLegacy(buffer.readByte());
}
if (action == TeamActions.CREATE || action == TeamActions.PLAYER_ADD || action == TeamActions.PLAYER_REMOVE) {
short playerCount = buffer.readShort();
playerNames = new String[playerCount];
for (int i = 0; i < playerCount; i++) {
playerNames[i] = buffer.readString();
}
}
return true;
case VERSION_1_8:
name = buffer.readString();
action = TeamActions.byId(buffer.readByte());
if (action == TeamActions.CREATE || action == TeamActions.INFORMATION_UPDATE) {
displayName = buffer.readString();
prefix = buffer.readString();
suffix = buffer.readString();
setFriendlyFireByLegacy(buffer.readByte());
nameTagVisibility = TeamNameTagVisibilities.byName(buffer.readString());
color = TextComponent.ChatAttributes.byColor(ChatColor.byId(buffer.readByte()));
}
if (action == TeamActions.CREATE || action == TeamActions.PLAYER_ADD || action == TeamActions.PLAYER_REMOVE) {
int playerCount = buffer.readVarInt();
playerNames = new String[playerCount];
for (int i = 0; i < playerCount; i++) {
playerNames[i] = buffer.readString();
}
}
return true;
case VERSION_1_9_4:
name = buffer.readString();
action = TeamActions.byId(buffer.readByte());
if (action == TeamActions.CREATE || action == TeamActions.INFORMATION_UPDATE) {
displayName = buffer.readString();
prefix = buffer.readString();
suffix = buffer.readString();
byte friendlyFireRaw = buffer.readByte();
friendlyFire = BitByte.isBitMask(friendlyFireRaw, 0x01);
seeFriendlyInvisibles = BitByte.isBitMask(friendlyFireRaw, 0x02);
nameTagVisibility = TeamNameTagVisibilities.byName(buffer.readString());
collisionRule = TeamCollisionRules.byName(buffer.readString());
color = TextComponent.ChatAttributes.byColor(ChatColor.byId(buffer.readByte()));
}
if (action == TeamActions.CREATE || action == TeamActions.PLAYER_ADD || action == TeamActions.PLAYER_REMOVE) {
int playerCount = buffer.readVarInt();
playerNames = new String[playerCount];
for (int i = 0; i < playerCount; i++) {
playerNames[i] = buffer.readString();
}
}
return true;
}
return false;
}
@Override
public void log() {
Log.protocol(String.format("Received scoreboard Team update (name=\"%s\", action=%s, displayName=\"%s\", prefix=\"%s\", suffix=\"%s\", friendlyFire=%s, seeFriendlyInvisibiles=%s, playerCount=%s)", name, action.name(), displayName, prefix, suffix, friendlyFire, seeFriendlyInvisibles, ((playerNames == null) ? "null" : playerNames.length)));
}
@Override
public void handle(PacketHandler h) {
h.handle(this);
}
public String getName() {
return name;
}
public TeamActions getAction() {
return action;
}
public String getDisplayName() {
return displayName;
}
public String getPrefix() {
return prefix;
}
public String getSuffix() {
return suffix;
}
public boolean isFriendlyFireEnabled() {
return friendlyFire;
}
public boolean isSeeingFriendlyInvisibles() {
return seeFriendlyInvisibles;
}
public TextComponent.ChatAttributes getColor() {
return color;
}
public TeamCollisionRules getCollisionRule() {
return collisionRule;
}
public TeamNameTagVisibilities getNameTagVisibility() {
return nameTagVisibility;
}
public String[] getPlayerNames() {
return playerNames;
}
private void setFriendlyFireByLegacy(byte raw) {
switch (raw) {
case 0:
friendlyFire = false;
break;
case 1:
friendlyFire = true;
break;
case 2:
friendlyFire = false;
seeFriendlyInvisibles = true;
break;
}
//ToDo: seeFriendlyInvisibles for case 0 and 1
}
public enum TeamActions {
CREATE(0),
REMOVE(1),
INFORMATION_UPDATE(2),
PLAYER_ADD(3),
PLAYER_REMOVE(4);
final int id;
TeamActions(int id) {
this.id = id;
}
public static TeamActions byId(int id) {
for (TeamActions a : values()) {
if (a.getId() == id) {
return a;
}
}
return null;
}
public int getId() {
return id;
}
}
public enum TeamNameTagVisibilities {
ALWAYS("always"),
HIDE_FOR_OTHER_TEAMS("hideForOtherTeams"),
HIDE_FOR_OWN_TEAM("hideForOwnTeam"),
NEVER("never");
final String name;
TeamNameTagVisibilities(String name) {
this.name = name;
}
public static TeamNameTagVisibilities byName(String name) {
for (TeamNameTagVisibilities v : values()) {
if (v.getName().equals(name)) {
return v;
}
}
return null;
}
public String getName() {
return name;
}
}
public enum TeamCollisionRules {
ALWAYS("always"),
PUSH_OTHER_TEAMS("pushOtherTeams"),
PUSH_OWN_TEAM("pushOwnOwnTeam"),
NEVER("never");
final String name;
TeamCollisionRules(String name) {
this.name = name;
}
public static TeamCollisionRules byName(String name) {
for (TeamCollisionRules rule : values()) {
if (rule.getName().equals(name)) {
return rule;
}
}
return null;
}
public String getName() {
return name;
}
}
}

View File

@ -21,7 +21,7 @@ import de.bixilon.minosoft.game.datatypes.player.PlayerInfo;
import de.bixilon.minosoft.game.datatypes.player.PlayerInfoBulk;
import de.bixilon.minosoft.game.datatypes.scoreboard.ScoreboardObjective;
import de.bixilon.minosoft.game.datatypes.scoreboard.ScoreboardScore;
import de.bixilon.minosoft.game.datatypes.scoreboard.ScoreboardTeam;
import de.bixilon.minosoft.game.datatypes.scoreboard.Team;
import de.bixilon.minosoft.game.datatypes.world.BlockPosition;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.network.Connection;
@ -474,13 +474,13 @@ public class PacketHandler {
//ToDo
}
public void handle(PacketScoreboardTeams pkg) {
public void handle(PacketTeams pkg) {
switch (pkg.getAction()) {
case CREATE:
connection.getPlayer().getScoreboardManager().addTeam(new ScoreboardTeam(pkg.getName(), pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.getFriendlyFire(), pkg.getPlayerNames()));
connection.getPlayer().getScoreboardManager().addTeam(new Team(pkg.getName(), pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.isFriendlyFireEnabled(), pkg.isSeeingFriendlyInvisibles(), pkg.getPlayerNames()));
break;
case INFORMATION_UPDATE:
connection.getPlayer().getScoreboardManager().getTeam(pkg.getName()).updateInformation(pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.getFriendlyFire());
connection.getPlayer().getScoreboardManager().getTeam(pkg.getName()).updateInformation(pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.isFriendlyFireEnabled(), pkg.isSeeingFriendlyInvisibles());
break;
case REMOVE:
connection.getPlayer().getScoreboardManager().removeTeam(pkg.getName());

View File

@ -127,7 +127,7 @@ public abstract class Protocol implements ProtocolInterface {
packetClassMapping.put(Packets.Clientbound.PLAY_EFFECT, PacketEffect.class);
packetClassMapping.put(Packets.Clientbound.PLAY_SCOREBOARD_OBJECTIVE, PacketScoreboardObjective.class);
packetClassMapping.put(Packets.Clientbound.PLAY_UPDATE_SCORE, PacketScoreboardUpdateScore.class);
packetClassMapping.put(Packets.Clientbound.PLAY_TEAMS, PacketScoreboardTeams.class);
packetClassMapping.put(Packets.Clientbound.PLAY_TEAMS, PacketTeams.class);
packetClassMapping.put(Packets.Clientbound.PLAY_DISPLAY_SCOREBOARD, PacketScoreboardDisplayScoreboard.class);
packetClassMapping.put(Packets.Clientbound.PLAY_MAP_DATA, PacketMapData.class);
packetClassMapping.put(Packets.Clientbound.PLAY_SERVER_DIFFICULTY, PacketServerDifficulty.class);