diff --git a/README.md b/README.md index 274d1c5..d1fac8a 100644 --- a/README.md +++ b/README.md @@ -51,8 +51,8 @@ supported: - [x] ClientboundTeleportEntityPacket - [x] ClientboundRotateHeadPacket - [x] ClientboundSetEquipmentPacket -- [ ] ClientboundSetPlayerTeamPacket +- [x] ClientboundSetEntityDataPacket +- [x] ClientboundSetPlayerTeamPacket - [ ] ClientboundUpdateAttributesPacket -- [ ] ClientboundSetEntityDataPacket - [ ] ClientboundAnimatePacket - [ ] ClientboundSetPassengersPacket \ No newline at end of file diff --git a/api/src/main/java/de/oliver/fancysitula/api/packets/FS_ClientboundCreateOrUpdateTeamPacket.java b/api/src/main/java/de/oliver/fancysitula/api/packets/FS_ClientboundCreateOrUpdateTeamPacket.java new file mode 100644 index 0000000..9a9bf1e --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/packets/FS_ClientboundCreateOrUpdateTeamPacket.java @@ -0,0 +1,324 @@ +package de.oliver.fancysitula.api.packets; + +import de.oliver.fancysitula.api.teams.FS_CollisionRule; +import de.oliver.fancysitula.api.teams.FS_NameTagVisibility; +import net.kyori.adventure.text.Component; + +import java.util.List; + +public abstract class FS_ClientboundCreateOrUpdateTeamPacket extends FS_ClientboundPacket { + + protected Method method; + protected String teamName; + + protected CreateTeam createTeam; + protected RemoveTeam removeTeam; + protected UpdateTeam updateTeam; + protected AddEntity addEntity; + protected RemoveEntity removeEntity; + + public FS_ClientboundCreateOrUpdateTeamPacket(String teamName, CreateTeam createTeam) { + this.method = Method.CREATE_TEAM; + this.teamName = teamName; + this.createTeam = createTeam; + } + + public FS_ClientboundCreateOrUpdateTeamPacket(String teamName, RemoveTeam removeTeam) { + this.method = Method.REMOVE_TEAM; + this.teamName = teamName; + this.removeTeam = removeTeam; + } + + public FS_ClientboundCreateOrUpdateTeamPacket(String teamName, UpdateTeam updateTeam) { + this.method = Method.UPDATE_TEAM; + this.teamName = teamName; + this.updateTeam = updateTeam; + } + + public FS_ClientboundCreateOrUpdateTeamPacket(String teamName, AddEntity addEntity) { + this.method = Method.ADD_ENTITY; + this.teamName = teamName; + this.addEntity = addEntity; + } + + public FS_ClientboundCreateOrUpdateTeamPacket(String teamName, RemoveEntity removeEntity) { + this.method = Method.REMOVE_ENTITY; + this.teamName = teamName; + this.removeEntity = removeEntity; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public CreateTeam getCreateTeam() { + return createTeam; + } + + public void setCreateTeam(CreateTeam createTeam) { + this.createTeam = createTeam; + } + + public UpdateTeam getUpdateTeam() { + return updateTeam; + } + + public void setUpdateTeam(UpdateTeam updateTeam) { + this.updateTeam = updateTeam; + } + + public AddEntity getAddEntity() { + return addEntity; + } + + public void setAddEntity(AddEntity addEntity) { + this.addEntity = addEntity; + } + + public RemoveEntity getRemoveEntity() { + return removeEntity; + } + + public void setRemoveEntity(RemoveEntity removeEntity) { + this.removeEntity = removeEntity; + } + + public enum Method { + CREATE_TEAM, + REMOVE_TEAM, + UPDATE_TEAM, + ADD_ENTITY, + REMOVE_ENTITY; + } + + public static class CreateTeam { + private Component displayName; + private boolean allowFriendlyFire; + private boolean canSeeFriendlyInvisibles; + private FS_NameTagVisibility nameTagVisibility; + private FS_CollisionRule collisionRule; + private FS_Color color; + private Component prefix; + private Component suffix; + private List entities; + + public CreateTeam(Component displayName, boolean allowFriendlyFire, boolean canSeeFriendlyInvisibles, FS_NameTagVisibility nameTagVisibility, FS_CollisionRule collisionRule, FS_Color color, Component prefix, Component suffix, List entities) { + this.displayName = displayName; + this.allowFriendlyFire = allowFriendlyFire; + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + this.nameTagVisibility = nameTagVisibility; + this.collisionRule = collisionRule; + this.color = color; + this.prefix = prefix; + this.suffix = suffix; + this.entities = entities; + } + + public Component getDisplayName() { + return displayName; + } + + public void setDisplayName(Component displayName) { + this.displayName = displayName; + } + + public boolean isAllowFriendlyFire() { + return allowFriendlyFire; + } + + public void setAllowFriendlyFire(boolean allowFriendlyFire) { + this.allowFriendlyFire = allowFriendlyFire; + } + + public boolean isCanSeeFriendlyInvisibles() { + return canSeeFriendlyInvisibles; + } + + public void setCanSeeFriendlyInvisibles(boolean canSeeFriendlyInvisibles) { + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + } + + public FS_NameTagVisibility getNameTagVisibility() { + return nameTagVisibility; + } + + public void setNameTagVisibility(FS_NameTagVisibility nameTagVisibility) { + this.nameTagVisibility = nameTagVisibility; + } + + public FS_CollisionRule getCollisionRule() { + return collisionRule; + } + + public void setCollisionRule(FS_CollisionRule collisionRule) { + this.collisionRule = collisionRule; + } + + public FS_Color getColor() { + return color; + } + + public void setColor(FS_Color color) { + this.color = color; + } + + public Component getPrefix() { + return prefix; + } + + public void setPrefix(Component prefix) { + this.prefix = prefix; + } + + public Component getSuffix() { + return suffix; + } + + public void setSuffix(Component suffix) { + this.suffix = suffix; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } + } + + public static class RemoveTeam { + + } + + public static class UpdateTeam { + private Component displayName; + private boolean allowFriendlyFire; + private boolean canSeeFriendlyInvisibles; + private FS_NameTagVisibility nameTagVisibility; + private FS_CollisionRule collisionRule; + private FS_Color color; + private Component prefix; + private Component suffix; + + public UpdateTeam(Component displayName, boolean allowFriendlyFire, boolean canSeeFriendlyInvisibles, FS_NameTagVisibility nameTagVisibility, FS_CollisionRule collisionRule, FS_Color color, Component prefix, Component suffix) { + this.displayName = displayName; + this.allowFriendlyFire = allowFriendlyFire; + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + this.nameTagVisibility = nameTagVisibility; + this.collisionRule = collisionRule; + this.color = color; + this.prefix = prefix; + this.suffix = suffix; + } + + public Component getDisplayName() { + return displayName; + } + + public void setDisplayName(Component displayName) { + this.displayName = displayName; + } + + public boolean isAllowFriendlyFire() { + return allowFriendlyFire; + } + + public void setAllowFriendlyFire(boolean allowFriendlyFire) { + this.allowFriendlyFire = allowFriendlyFire; + } + + public boolean isCanSeeFriendlyInvisibles() { + return canSeeFriendlyInvisibles; + } + + public void setCanSeeFriendlyInvisibles(boolean canSeeFriendlyInvisibles) { + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + } + + public FS_NameTagVisibility getNameTagVisibility() { + return nameTagVisibility; + } + + public void setNameTagVisibility(FS_NameTagVisibility nameTagVisibility) { + this.nameTagVisibility = nameTagVisibility; + } + + public FS_CollisionRule getCollisionRule() { + return collisionRule; + } + + public void setCollisionRule(FS_CollisionRule collisionRule) { + this.collisionRule = collisionRule; + } + + public FS_Color getColor() { + return color; + } + + public void setColor(FS_Color color) { + this.color = color; + } + + public Component getPrefix() { + return prefix; + } + + public void setPrefix(Component prefix) { + this.prefix = prefix; + } + + public Component getSuffix() { + return suffix; + } + + public void setSuffix(Component suffix) { + this.suffix = suffix; + } + } + + public static class AddEntity { + private List entities; + + public AddEntity(List entities) { + this.entities = entities; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } + } + + public static class RemoveEntity { + private List entities; + + public RemoveEntity(List entities) { + this.entities = entities; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } + } + +} diff --git a/api/src/main/java/de/oliver/fancysitula/api/packets/FS_Color.java b/api/src/main/java/de/oliver/fancysitula/api/packets/FS_Color.java new file mode 100644 index 0000000..7fc2d9f --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/packets/FS_Color.java @@ -0,0 +1,31 @@ +package de.oliver.fancysitula.api.packets; + +public enum FS_Color { + BLACK(0), + DARK_BLUE(1), + DARK_GREEN(2), + DARK_AQUA(3), + DARK_RED(4), + DARK_PURPLE(5), + GOLD(6), + GRAY(7), + DARK_GRAY(8), + BLUE(9), + GREEN(10), + AQUA(11), + RED(12), + LIGHT_PURPLE(13), + YELLOW(14), + WHITE(15); + + + private final int id; + + FS_Color(int id) { + this.id = id; + } + + public int getId() { + return id; + } +} diff --git a/api/src/main/java/de/oliver/fancysitula/api/teams/FS_CollisionRule.java b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_CollisionRule.java new file mode 100644 index 0000000..d64ec06 --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_CollisionRule.java @@ -0,0 +1,18 @@ +package de.oliver.fancysitula.api.teams; + +public enum FS_CollisionRule { + ALWAYS("always"), + NEVER("never"), + PUSH_OTHER_TEAMS("pushOtherTeams"), + PUSH_OWN_TEAM("pushOwnTeam"); + + private final String name; + + FS_CollisionRule(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/api/src/main/java/de/oliver/fancysitula/api/teams/FS_NameTagVisibility.java b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_NameTagVisibility.java new file mode 100644 index 0000000..355026c --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_NameTagVisibility.java @@ -0,0 +1,18 @@ +package de.oliver.fancysitula.api.teams; + +public enum FS_NameTagVisibility { + ALWAYS("always"), + NEVER("never"), + HIDE_FOR_OTHER_TEAMS("hideForOtherTeams"), + HIDE_FOR_OWN_TEAM("hideForOwnTeam"); + + private final String name; + + FS_NameTagVisibility(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/api/src/main/java/de/oliver/fancysitula/api/teams/FS_Team.java b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_Team.java new file mode 100644 index 0000000..9302d3b --- /dev/null +++ b/api/src/main/java/de/oliver/fancysitula/api/teams/FS_Team.java @@ -0,0 +1,113 @@ +package de.oliver.fancysitula.api.teams; + +import de.oliver.fancysitula.api.packets.FS_Color; +import net.kyori.adventure.text.Component; + +import java.util.List; + +public class FS_Team { + + private String teamName; + private Component displayName; + private boolean allowFriendlyFire; + private boolean canSeeFriendlyInvisibles; + private FS_NameTagVisibility nameTagVisibility; + private FS_CollisionRule collisionRule; + private FS_Color color; + private Component prefix; + private Component suffix; + private List entities; + + public FS_Team(String teamName, Component displayName, boolean allowFriendlyFire, boolean canSeeFriendlyInvisibles, FS_NameTagVisibility nameTagVisibility, FS_CollisionRule collisionRule, FS_Color color, Component prefix, Component suffix, List entities) { + this.teamName = teamName; + this.displayName = displayName; + this.allowFriendlyFire = allowFriendlyFire; + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + this.nameTagVisibility = nameTagVisibility; + this.collisionRule = collisionRule; + this.color = color; + this.prefix = prefix; + this.suffix = suffix; + this.entities = entities; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public Component getDisplayName() { + return displayName; + } + + public void setDisplayName(Component displayName) { + this.displayName = displayName; + } + + public boolean isAllowFriendlyFire() { + return allowFriendlyFire; + } + + public void setAllowFriendlyFire(boolean allowFriendlyFire) { + this.allowFriendlyFire = allowFriendlyFire; + } + + public boolean isCanSeeFriendlyInvisibles() { + return canSeeFriendlyInvisibles; + } + + public void setCanSeeFriendlyInvisibles(boolean canSeeFriendlyInvisibles) { + this.canSeeFriendlyInvisibles = canSeeFriendlyInvisibles; + } + + public FS_NameTagVisibility getNameTagVisibility() { + return nameTagVisibility; + } + + public void setNameTagVisibility(FS_NameTagVisibility nameTagVisibility) { + this.nameTagVisibility = nameTagVisibility; + } + + public FS_CollisionRule getCollisionRule() { + return collisionRule; + } + + public void setCollisionRule(FS_CollisionRule collisionRule) { + this.collisionRule = collisionRule; + } + + public FS_Color getColor() { + return color; + } + + public void setColor(FS_Color color) { + this.color = color; + } + + public Component getPrefix() { + return prefix; + } + + public void setPrefix(Component prefix) { + this.prefix = prefix; + } + + public Component getSuffix() { + return suffix; + } + + public void setSuffix(Component suffix) { + this.suffix = suffix; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } +} diff --git a/build.gradle.kts b/build.gradle.kts index c397949..4927834 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { allprojects { group = "de.oliver" - version = "0.0.9" + version = "0.0.10" description = "Simple, lightweight and fast library for minecraft internals" repositories { diff --git a/factories/src/main/java/de/oliver/fancysitula/factories/FancySitula.java b/factories/src/main/java/de/oliver/fancysitula/factories/FancySitula.java index c5811a9..e16f4bd 100644 --- a/factories/src/main/java/de/oliver/fancysitula/factories/FancySitula.java +++ b/factories/src/main/java/de/oliver/fancysitula/factories/FancySitula.java @@ -4,4 +4,5 @@ public class FancySitula { public static final PacketFactory PACKET_FACTORY = new PacketFactory(); public static final EntityFactory ENTITY_FACTORY = new EntityFactory(); + public static final TeamFactory TEAM_FACTORY = new TeamFactory(); } diff --git a/factories/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java b/factories/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java index 103aea5..067fa3f 100644 --- a/factories/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java +++ b/factories/src/main/java/de/oliver/fancysitula/factories/PacketFactory.java @@ -316,4 +316,150 @@ public FS_ClientboundSetPassengersPacket createSetPassengersPacket( public FS_ClientboundSetPassengersPacket createSetPassengersPacket(int entityId, List passengers) { return createSetPassengersPacket(ServerVersion.getCurrentVersion(), entityId, passengers); } + + + /** + * Creates and returns a FS_ClientboundCreateOrUpdateTeamPacket based on the given server version and team information. + * + * @param serverVersion the version of the server for which the packet is to be created + * @param teamName the name of the team to be created or updated + * @param createTeam an instance of FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam containing the team creation or update details + * @return a FS_ClientboundCreateOrUpdateTeamPacket instance corresponding to the specified server version and team details + * @throws IllegalArgumentException if the provided server version is not supported + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam createTeam) { + switch (serverVersion) { + case v1_20_5, v1_20_6, v1_21, v1_21_1 -> { + return new de.oliver.fancysitula.versions.v1_20_6.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, createTeam); + } + default -> throw new IllegalArgumentException("Unsupported server version: " + serverVersion.getVersion()); + } + } + + /** + * Creates an FS_ClientboundCreateOrUpdateTeamPacket for the given team name and creation details. + * + * @param teamName The name of the team to create or update. + * @param createTeam The details of the team creation or update. + * @return An instance of FS_ClientboundCreateOrUpdateTeamPacket containing the creation or update details. + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(String teamName, FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam createTeam) { + return createCreateOrUpdateTeamPacket(ServerVersion.getCurrentVersion(), teamName, createTeam); + } + + /** + * Creates a packet for creating or updating a team based on the specified server version. + * + * @param serverVersion The version of the server. + * @param teamName The name of the team. + * @param removeTeam Information about whether to remove the team. + * @return The packet for creating or updating the team. + * @throws IllegalArgumentException if the server version is unsupported. + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam removeTeam) { + switch (serverVersion) { + case v1_20_5, v1_20_6, v1_21, v1_21_1 -> { + return new de.oliver.fancysitula.versions.v1_20_6.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeTeam); + } + default -> throw new IllegalArgumentException("Unsupported server version: " + serverVersion.getVersion()); + } + } + + /** + * Creates a packet to create or update a team with the specified name and removal flag. + * + * @param teamName the name of the team to create or update + * @param removeTeam the flag indicating whether to remove the team + * @return a packet for creating or updating the team + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam removeTeam) { + return createCreateOrUpdateTeamPacket(ServerVersion.getCurrentVersion(), teamName, removeTeam); + } + + /** + * Creates an instance of FS_ClientboundCreateOrUpdateTeamPacket based on the provided server version. + * + * @param serverVersion The server version for which the packet should be created. + * @param teamName The name of the team that is being created or updated. + * @param updateTeam The update team details which contain information about the team. + * @return A new instance of FS_ClientboundCreateOrUpdateTeamPacket tailored for the specified server version. + * @throws IllegalArgumentException If the provided server version is not supported. + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam updateTeam) { + switch (serverVersion) { + case v1_20_5, v1_20_6, v1_21, v1_21_1 -> { + return new de.oliver.fancysitula.versions.v1_20_6.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, updateTeam); + } + default -> throw new IllegalArgumentException("Unsupported server version: " + serverVersion.getVersion()); + } + } + + /** + * Creates a new FS_ClientboundCreateOrUpdateTeamPacket for creating or updating a team. + * + * @param teamName the name of the team to be created or updated + * @param updateTeam the update information for the team + * @return a new instance of FS_ClientboundCreateOrUpdateTeamPacket + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(String teamName, FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam updateTeam) { + return createCreateOrUpdateTeamPacket(ServerVersion.getCurrentVersion(), teamName, updateTeam); + } + + /** + * Creates a new instance of FS_ClientboundCreateOrUpdateTeamPacket based on the given server version, team name, and addEntity parameters. + * + * @param serverVersion the version of the server for which the packet will be created + * @param teamName the name of the team to be created or updated + * @param addEntity the add entity information needed for packet creation + * @return an instance of FS_ClientboundCreateOrUpdateTeamPacket appropriate for the specified server version + * @throws IllegalArgumentException if the server version is not supported + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.AddEntity addEntity) { + switch (serverVersion) { + case v1_20_5, v1_20_6, v1_21, v1_21_1 -> { + return new de.oliver.fancysitula.versions.v1_20_6.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, addEntity); + } + default -> throw new IllegalArgumentException("Unsupported server version: " + serverVersion.getVersion()); + } + } + + /** + * Creates a packet for creating or updating a team with the specified name and entity. + * + * @param teamName the name of the team to create or update + * @param addEntity the entity representing the addition details for the team + * @return the packet representing the create or update operation on the team + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(String teamName, FS_ClientboundCreateOrUpdateTeamPacket.AddEntity addEntity) { + return createCreateOrUpdateTeamPacket(ServerVersion.getCurrentVersion(), teamName, addEntity); + } + + /** + * Creates an instance of FS_ClientboundCreateOrUpdateTeamPacket based on the server version. + * + * @param serverVersion The version of the server. + * @param teamName The name of the team to create or update. + * @param removeEntity The entity removal configuration for the packet. + * @return A new instance of FS_ClientboundCreateOrUpdateTeamPacket for the specified server version. + * @throws IllegalArgumentException If the server version is unsupported. + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(ServerVersion serverVersion, String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity removeEntity) { + switch (serverVersion) { + case v1_20_5, v1_20_6, v1_21, v1_21_1 -> { + return new de.oliver.fancysitula.versions.v1_20_6.packets.ClientboundCreateOrUpdateTeamPacketImpl(teamName, removeEntity); + } + default -> throw new IllegalArgumentException("Unsupported server version: " + serverVersion.getVersion()); + } + } + + /** + * Creates a packet for creating or updating a team with the specified name and entity removal configuration. + * + * @param teamName the name of the team to create or update + * @param removeEntity the entity removal configuration for the team + * @return the packet for creating or updating the team + */ + public FS_ClientboundCreateOrUpdateTeamPacket createCreateOrUpdateTeamPacket(String teamName, FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity removeEntity) { + return createCreateOrUpdateTeamPacket(ServerVersion.getCurrentVersion(), teamName, removeEntity); + } } diff --git a/factories/src/main/java/de/oliver/fancysitula/factories/TeamFactory.java b/factories/src/main/java/de/oliver/fancysitula/factories/TeamFactory.java new file mode 100644 index 0000000..7141507 --- /dev/null +++ b/factories/src/main/java/de/oliver/fancysitula/factories/TeamFactory.java @@ -0,0 +1,77 @@ +package de.oliver.fancysitula.factories; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundCreateOrUpdateTeamPacket; +import de.oliver.fancysitula.api.teams.FS_Team; + +import java.util.List; + +public class TeamFactory { + + public void createTeamFor(FS_RealPlayer player, FS_Team team) { + FS_ClientboundCreateOrUpdateTeamPacket packet = FancySitula.PACKET_FACTORY.createCreateOrUpdateTeamPacket( + team.getTeamName(), + new FS_ClientboundCreateOrUpdateTeamPacket.CreateTeam( + team.getDisplayName(), + team.isAllowFriendlyFire(), + team.isCanSeeFriendlyInvisibles(), + team.getNameTagVisibility(), + team.getCollisionRule(), + team.getColor(), + team.getPrefix(), + team.getSuffix(), + team.getEntities() + ) + ); + + player.sendPacket(packet); + } + + public void removeTeamFor(FS_RealPlayer player, FS_Team team) { + FS_ClientboundCreateOrUpdateTeamPacket packet = FancySitula.PACKET_FACTORY.createCreateOrUpdateTeamPacket( + team.getTeamName(), + new FS_ClientboundCreateOrUpdateTeamPacket.RemoveTeam() + ); + + player.sendPacket(packet); + } + + /** + * Updates the team for the player. But does not add or remove entities. + */ + public void updateTeamFor(FS_RealPlayer player, FS_Team team) { + FS_ClientboundCreateOrUpdateTeamPacket packet = FancySitula.PACKET_FACTORY.createCreateOrUpdateTeamPacket( + team.getTeamName(), + new FS_ClientboundCreateOrUpdateTeamPacket.UpdateTeam( + team.getDisplayName(), + team.isAllowFriendlyFire(), + team.isCanSeeFriendlyInvisibles(), + team.getNameTagVisibility(), + team.getCollisionRule(), + team.getColor(), + team.getPrefix(), + team.getSuffix() + ) + ); + + player.sendPacket(packet); + } + + public void addEntitiesToTeamFor(FS_RealPlayer player, FS_Team team, List entities) { + FS_ClientboundCreateOrUpdateTeamPacket packet = FancySitula.PACKET_FACTORY.createCreateOrUpdateTeamPacket( + team.getTeamName(), + new FS_ClientboundCreateOrUpdateTeamPacket.AddEntity(entities) + ); + + player.sendPacket(packet); + } + + public void removeEntitiesFromTeamFor(FS_RealPlayer player, FS_Team team, List entities) { + FS_ClientboundCreateOrUpdateTeamPacket packet = FancySitula.PACKET_FACTORY.createCreateOrUpdateTeamPacket( + team.getTeamName(), + new FS_ClientboundCreateOrUpdateTeamPacket.RemoveEntity(entities) + ); + + player.sendPacket(packet); + } +} diff --git a/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundCreateOrUpdateTeamPacketImpl.java b/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundCreateOrUpdateTeamPacketImpl.java new file mode 100644 index 0000000..04aa823 --- /dev/null +++ b/implementations/1_20_6/src/main/java/de/oliver/fancysitula/versions/v1_20_6/packets/ClientboundCreateOrUpdateTeamPacketImpl.java @@ -0,0 +1,128 @@ +package de.oliver.fancysitula.versions.v1_20_6.packets; + +import de.oliver.fancysitula.api.entities.FS_RealPlayer; +import de.oliver.fancysitula.api.packets.FS_ClientboundCreateOrUpdateTeamPacket; +import de.oliver.fancysitula.versions.v1_20_6.utils.VanillaPlayerAdapter; +import io.papermc.paper.adventure.PaperAdventure; +import net.minecraft.ChatFormatting; +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Scoreboard; +import net.minecraft.world.scores.Team; + +public class ClientboundCreateOrUpdateTeamPacketImpl extends FS_ClientboundCreateOrUpdateTeamPacket { + + private static final Scoreboard SCOREBOARD = new Scoreboard(); + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, CreateTeam createTeam) { + super(teamName, createTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, RemoveTeam removeTeam) { + super(teamName, removeTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, UpdateTeam updateTeam) { + super(teamName, updateTeam); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, AddEntity addEntity) { + super(teamName, addEntity); + } + + public ClientboundCreateOrUpdateTeamPacketImpl(String teamName, RemoveEntity removeEntity) { + super(teamName, removeEntity); + } + + @Override + public Object createPacket() { + return switch (method) { + case CREATE_TEAM -> createCreateTeamPacket(); + case REMOVE_TEAM -> createRemoveTeamPacket(); + case UPDATE_TEAM -> createUpdateTeamPacket(); + case ADD_ENTITY -> createAddEntityPacket(); + case REMOVE_ENTITY -> createRemoveEntityPacket(); + }; + } + + private Object createCreateTeamPacket() { + if (createTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + playerTeam.setDisplayName(PaperAdventure.asVanilla(createTeam.getDisplayName())); + playerTeam.setAllowFriendlyFire(createTeam.isAllowFriendlyFire()); + playerTeam.setSeeFriendlyInvisibles(createTeam.isCanSeeFriendlyInvisibles()); + playerTeam.setNameTagVisibility(Team.Visibility.byName(createTeam.getNameTagVisibility().getName())); + playerTeam.setCollisionRule(PlayerTeam.CollisionRule.byName(createTeam.getCollisionRule().getName())); + playerTeam.setColor(ChatFormatting.getById(createTeam.getColor().getId())); + playerTeam.setPlayerPrefix(PaperAdventure.asVanilla(createTeam.getPrefix())); + playerTeam.setPlayerSuffix(PaperAdventure.asVanilla(createTeam.getSuffix())); + for (String entity : createTeam.getEntities()) { + playerTeam.getPlayers().add(entity); + } + + return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true); + } + + private Object createRemoveTeamPacket() { + if (removeTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + return ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam); + } + + private Object createUpdateTeamPacket() { + if (updateTeam == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + playerTeam.setDisplayName(PaperAdventure.asVanilla(updateTeam.getDisplayName())); + playerTeam.setAllowFriendlyFire(updateTeam.isAllowFriendlyFire()); + playerTeam.setSeeFriendlyInvisibles(updateTeam.isCanSeeFriendlyInvisibles()); + playerTeam.setNameTagVisibility(Team.Visibility.byName(updateTeam.getNameTagVisibility().getName())); + playerTeam.setCollisionRule(PlayerTeam.CollisionRule.byName(updateTeam.getCollisionRule().getName())); + playerTeam.setColor(ChatFormatting.getById(updateTeam.getColor().getId())); + playerTeam.setPlayerPrefix(PaperAdventure.asVanilla(updateTeam.getPrefix())); + playerTeam.setPlayerSuffix(PaperAdventure.asVanilla(updateTeam.getSuffix())); + + return ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, true); + } + + private Object createAddEntityPacket() { + if (addEntity == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + for (String entity : addEntity.getEntities()) { + playerTeam.getPlayers().add(entity); + } + return ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(playerTeam, addEntity.getEntities(), ClientboundSetPlayerTeamPacket.Action.ADD); + } + + private Object createRemoveEntityPacket() { + if (removeEntity == null) { + return null; + } + + PlayerTeam playerTeam = new PlayerTeam(SCOREBOARD, teamName); + for (String entity : removeEntity.getEntities()) { + playerTeam.getPlayers().add(entity); + } + return ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(playerTeam, removeEntity.getEntities(), ClientboundSetPlayerTeamPacket.Action.REMOVE); + } + + @Override + protected void sendPacketTo(FS_RealPlayer player) { + ClientboundSetPlayerTeamPacket packet = (ClientboundSetPlayerTeamPacket) createPacket(); + + ServerPlayer vanillaPlayer = VanillaPlayerAdapter.asVanilla(player.getBukkitPlayer()); + vanillaPlayer.connection.send(packet); + } +} diff --git a/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java b/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java index d3e566b..e302752 100644 --- a/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java +++ b/test_plugin/src/main/java/de/oliver/fancysitula/commands/FancySitulaCMD.java @@ -1,18 +1,19 @@ package de.oliver.fancysitula.commands; -import de.oliver.fancysitula.api.entities.FS_BlockDisplay; import de.oliver.fancysitula.api.entities.FS_RealPlayer; import de.oliver.fancysitula.api.packets.FS_ClientboundPlayerInfoUpdatePacket; +import de.oliver.fancysitula.api.packets.FS_Color; +import de.oliver.fancysitula.api.teams.FS_CollisionRule; +import de.oliver.fancysitula.api.teams.FS_NameTagVisibility; +import de.oliver.fancysitula.api.teams.FS_Team; import de.oliver.fancysitula.api.utils.FS_GameProfile; import de.oliver.fancysitula.api.utils.FS_GameType; import de.oliver.fancysitula.factories.FancySitula; import net.kyori.adventure.text.Component; -import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.joml.Vector3f; import java.util.EnumSet; import java.util.List; @@ -33,6 +34,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String s, @NotNul // Wrap the real player into an FS_Player instance FS_RealPlayer fsPlayer = new FS_RealPlayer(p); + testTeam(p); // FS_TextDisplay fakeTextDisplay = new FS_TextDisplay(); // fakeTextDisplay.setBillboardRenderConstraints((byte) 3); @@ -49,16 +51,39 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String s, @NotNul // fakeItemDisplay.setItem(p.getInventory().getItemInMainHand()); // FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeItemDisplay); - FS_BlockDisplay fakeBlockDisplay = new FS_BlockDisplay(); - fakeBlockDisplay.setBillboardRenderConstraints((byte) 3); - fakeBlockDisplay.setScale(new Vector3f(5f)); - fakeBlockDisplay.setLocation(p.getLocation()); - fakeBlockDisplay.setBlock(Material.DIAMOND_BLOCK.createBlockData().createBlockState()); - FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeBlockDisplay); +// FS_BlockDisplay fakeBlockDisplay = new FS_BlockDisplay(); +// fakeBlockDisplay.setBillboardRenderConstraints((byte) 3); +// fakeBlockDisplay.setScale(new Vector3f(5f)); +// fakeBlockDisplay.setLocation(p.getLocation()); +// fakeBlockDisplay.setBlock(Material.DIAMOND_BLOCK.createBlockData().createBlockState()); +// FancySitula.ENTITY_FACTORY.spawnEntityFor(fsPlayer, fakeBlockDisplay); return true; } + private void testTeam(Player to) { + FS_RealPlayer fsPlayer = new FS_RealPlayer(to); + + + FS_Team team = new FS_Team( + "myTeam", + Component.text("My Team"), + true, + true, + FS_NameTagVisibility.ALWAYS, + FS_CollisionRule.ALWAYS, + FS_Color.AQUA, + Component.text("Prefix"), + Component.text("Suffix"), + List.of("OliverHD", "OliverHD_2") + ); + + + FancySitula.TEAM_FACTORY.createTeamFor(fsPlayer, team); +// FancySitula.TEAM_FACTORY.updateTeamFor(fsPlayer, team); +// FancySitula.TEAM_FACTORY.addEntitiesToTeamFor(fsPlayer, team, List.of("OliverHD", "OliverHD_2")); + } + private void fakeTablistEntries(Player to) { // Wrap the real player into an FS_Player instance FS_RealPlayer fsPlayer = new FS_RealPlayer(to);