From 437a664f002df3834755b244f52421b8a2620b8b Mon Sep 17 00:00:00 2001 From: atomicint Date: Thu, 11 Feb 2016 01:48:21 -0500 Subject: [PATCH] Rebase HintIconMessage - Split HintIconMessage into two separate classes (PositionHintIconMessage and MobHintIconMessage) - Split HintIconMessageEncoder into two separate encoders (PositionHintIconMessageEncoder and MobHintIconMessageEncoder) This resolves #179 Add PositionHintIconMessage#reset Fix parse errors introduced in e799577 This also resolves #181 Order enumerators by value Clean up PositionHintIconHintMessageEncoder for 377/317 --- .../plugins/location/tutorial-island/guide.rb | 11 +- .../game/message/impl/HintIconMessage.java | 110 +++++------------- .../game/message/impl/MobHintIconMessage.java | 73 ++++++++++++ .../message/impl/PositionHintIconMessage.java | 80 +++++++++++++ ...er.java => MobHintIconMessageEncoder.java} | 7 +- .../r317/PositionHintIconMessageEncoder.java | 36 ++++++ .../apollo/game/release/r317/Release317.java | 6 +- ...er.java => MobHintIconMessageEncoder.java} | 7 +- .../r377/PositionHintIconMessageEncoder.java | 38 ++++++ .../apollo/game/release/r377/Release377.java | 6 +- 10 files changed, 279 insertions(+), 95 deletions(-) create mode 100644 game/src/main/org/apollo/game/message/impl/MobHintIconMessage.java create mode 100644 game/src/main/org/apollo/game/message/impl/PositionHintIconMessage.java rename game/src/main/org/apollo/game/release/r317/{HintIconMessageEncoder.java => MobHintIconMessageEncoder.java} (74%) create mode 100644 game/src/main/org/apollo/game/release/r317/PositionHintIconMessageEncoder.java rename game/src/main/org/apollo/game/release/r377/{HintIconMessageEncoder.java => MobHintIconMessageEncoder.java} (74%) create mode 100644 game/src/main/org/apollo/game/release/r377/PositionHintIconMessageEncoder.java diff --git a/data/plugins/location/tutorial-island/guide.rb b/data/plugins/location/tutorial-island/guide.rb index ca30270e..a03de11e 100644 --- a/data/plugins/location/tutorial-island/guide.rb +++ b/data/plugins/location/tutorial-island/guide.rb @@ -1,7 +1,11 @@ require 'java' java_import 'org.apollo.game.message.impl.HintIconMessage' +java_import 'org.apollo.game.message.impl.MobHintIconMessage' +java_import 'org.apollo.game.message.impl.PositionHintIconMessage' java_import 'org.apollo.game.message.impl.SwitchTabInterfaceMessage' +java_import 'org.apollo.game.model.entity.EntityType' +java_import 'org.apollo.game.model.Position' private @@ -92,7 +96,8 @@ conversation :tutorial_runescape_guide do close do |player| if player.tutorial_island_progress < :runescape_guide_finished reset_hint_icon(player) - # TODO: door hint icon + # TODO: Maybe move this, define a constant for the Position and height + player.send(PositionHintIconMessage.new(HintIconMessage::Type::SOUTH, Position.new(3097, 3107), 120)) player.tutorial_island_progress = :runescape_guide_finished end @@ -103,10 +108,10 @@ end # Enables the hint icon above the Runescape guide. def show_hint_icon(player) - player.send(HintIconMessage.for_npc(@runescape_guide.index)) + player.send(MobHintIconMessage.create(@runescape_guide)) end # Resets the hint icon. def reset_hint_icon(player) - player.send(HintIconMessage.reset_npc) + player.send(MobHintIconMessage.reset(EntityType::NPC)) end diff --git a/game/src/main/org/apollo/game/message/impl/HintIconMessage.java b/game/src/main/org/apollo/game/message/impl/HintIconMessage.java index 42744b8b..6c71c4fc 100644 --- a/game/src/main/org/apollo/game/message/impl/HintIconMessage.java +++ b/game/src/main/org/apollo/game/message/impl/HintIconMessage.java @@ -1,10 +1,5 @@ package org.apollo.game.message.impl; -import java.util.NoSuchElementException; -import java.util.Optional; -import java.util.OptionalInt; - -import org.apollo.game.model.Position; import org.apollo.net.message.Message; /** @@ -12,9 +7,7 @@ import org.apollo.net.message.Message; * * @author Major */ -public final class HintIconMessage extends Message { - - // TODO identify the other types. +public abstract class HintIconMessage extends Message { /** * The type of a HintIcon. @@ -26,6 +19,31 @@ public final class HintIconMessage extends Message { */ NPC(1), + /** + * A HintIcon that hovers directly over a Position. + */ + CENTER(2), + + /** + * A HintIcon that hovers north over a Position. + */ + NORTH(3), + + /** + * A HintIcon that hovers south over a Position. + */ + SOUTH(4), + + /** + * A HintIcon that hovers east over a Position. + */ + EAST(5), + + /** + * A HintIcon that hovers west over a Position. + */ + WEST(6), + /** * A HintIcon that hovers over a Player. */ @@ -56,54 +74,6 @@ public final class HintIconMessage extends Message { } - /** - * Creates a HintIconMessage for the Npc with the specified index. - * - * @param index The index of the Npc. - * @return The HintIconMessage. - */ - public static HintIconMessage forNpc(int index) { - return new HintIconMessage(Type.NPC, OptionalInt.of(index), Optional.empty()); - } - - /** - * Creates a HintIconMessage for the Player with the specified index. - * - * @param index The index of the Player. - * @return The HintIconMessage. - */ - public static HintIconMessage forPlayer(int index) { - return new HintIconMessage(Type.PLAYER, OptionalInt.of(index), Optional.empty()); - } - - /** - * Creates a HintIconMessage that removes the current Npc hint icon. - * - * @return The HintIconMessage. - */ - public static HintIconMessage resetNpc() { - return forNpc(-1); - } - - /** - * Creates a HintIconMessage that removes the current Player hint icon. - * - * @return The HintIconMessage. - */ - public static HintIconMessage resetPlayer() { - return forPlayer(-1); - } - - /** - * The index of the Mob, if applicable. - */ - private final OptionalInt index; - - /** - * The Position of the tile, if applicable. - */ - private final Optional position; - /** * The Type of entity this HintIconMessage is directed at. */ @@ -113,33 +83,9 @@ public final class HintIconMessage extends Message { * Creates the HintIconMessage. * * @param type The {@link Type} of this HintIconMessage. - * @param index The index of the Mob, if applicable. - * @param position The Position of the tile, if applicable. */ - private HintIconMessage(Type type, OptionalInt index, Optional position) { + protected HintIconMessage(Type type) { this.type = type; - this.index = index; - this.position = position; - } - - /** - * Gets the index of the entity, if applicable. - * - * @return The index. - * @throws NoSuchElementException If no index is available for this HintIcon. - */ - public int getIndex() { - return index.getAsInt(); - } - - /** - * Gets the {@link Position} of the tile, if applicable. - * - * @return The Position. - * @throws NoSuchElementException If no Position is available for this HintIcon. - */ - public Position getPosition() { - return position.get(); } /** @@ -147,7 +93,7 @@ public final class HintIconMessage extends Message { * * @return The type. */ - public Type getType() { + public final Type getType() { return type; } diff --git a/game/src/main/org/apollo/game/message/impl/MobHintIconMessage.java b/game/src/main/org/apollo/game/message/impl/MobHintIconMessage.java new file mode 100644 index 00000000..5d95164c --- /dev/null +++ b/game/src/main/org/apollo/game/message/impl/MobHintIconMessage.java @@ -0,0 +1,73 @@ +package org.apollo.game.message.impl; + +import org.apollo.game.model.entity.EntityType; +import org.apollo.game.model.entity.Mob; + +/** + * A {@link HintIconMessage} which displays a hint over an Npc or Player. + */ +public final class MobHintIconMessage extends HintIconMessage { + + /** + * Gets the Type of HintIcon for the specified EntityType. + * + * @param entityType The EntityType. + * @return The HintIcon Type for the EntityType. + */ + private static Type fromEntityType(EntityType entityType) { + switch (entityType) { + case NPC: + return Type.NPC; + case PLAYER: + return Type.PLAYER; + default: + throw new UnsupportedOperationException("Only Mob entities are supported."); + } + } + + /** + * Creates a new {@link MobHintIconMessage} for the specified Mob. + * + * @param mob The Mob who will have the HintIcon. + * @return The new {@link MobHintIconMessage}, never {@code null}. + */ + public static MobHintIconMessage create(Mob mob) { + return new MobHintIconMessage(fromEntityType(mob.getEntityType()), mob.getIndex()); + } + + /** + * Resets the HintIcon for the specified EntityType. + * + * @param type The EntityType to reset the HintIcon for. + * @return The new {@link MobHintIconMessage}, never {@code null}. + */ + public static MobHintIconMessage reset(EntityType type) { + return new MobHintIconMessage(fromEntityType(type), -1); + } + + /** + * The index of the Mob. + */ + private final int index; + + /** + * Constructs a new {@link MobHintIconMessage} with the specified type. + * + * @param type The type of HintIcon. + * @param index The index of the Mob. + */ + private MobHintIconMessage(Type type, int index) { + super(type); + this.index = index; + } + + /** + * Gets the index of the Mob. + * + * @return The index of the Mob. + */ + public int getIndex() { + return index; + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/message/impl/PositionHintIconMessage.java b/game/src/main/org/apollo/game/message/impl/PositionHintIconMessage.java new file mode 100644 index 00000000..428f6806 --- /dev/null +++ b/game/src/main/org/apollo/game/message/impl/PositionHintIconMessage.java @@ -0,0 +1,80 @@ +package org.apollo.game.message.impl; + +import org.apollo.game.model.Position; + +import com.google.common.base.Preconditions; + +/** + * A {@link HintIconMessage} which displays a hint over a Position. + */ +public final class PositionHintIconMessage extends HintIconMessage { + + /** + * Represents the default Position a HintIcon is reset to. + */ + private static final Position DEFAULT_POSITION = new Position(0, 0); + + /** + * Tests if the specified Type if valid for a Position HintIcon. + * + * @param type The Type to test. + * @return The Type if it was valid. + */ + private static Type testType(Type type) { + Preconditions.checkArgument(type != Type.NPC && type != Type.PLAYER, + "Hint icons over a Position may not have a type of Player or Npc."); + return type; + } + + /** + * Creates a new {@link PositionHintIconMessage} which resets the current + * HintIcon. + * + * @return The new {@link PositionHintIconMessage}, never {@code null}. + */ + public static PositionHintIconMessage reset() { + return new PositionHintIconMessage(Type.CENTER, DEFAULT_POSITION, 0); + } + + /** + * The Position of the HintIcon. + */ + private final Position position; + + /** + * The display height of the HintIcon. + */ + private final int height; + + /** + * Constructs a new {@link PositionHintIconMessage}. + * + * @param type The Type of the HintIcon. + * @param position The Position of the hint icon. + * @param height The display height of the hint icon. + */ + public PositionHintIconMessage(Type type, Position position, int height) { + super(testType(type)); + this.position = position; + this.height = height; + } + + /** + * Gets the Position of the HintIcon. + * + * @return The Position of the HintIcon. + */ + public Position getPosition() { + return position; + } + + /** + * Gets the display height of the HintIcon. + * + * @return The display height of the HintIcon. + */ + public int getHeight() { + return height; + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/release/r317/HintIconMessageEncoder.java b/game/src/main/org/apollo/game/release/r317/MobHintIconMessageEncoder.java similarity index 74% rename from game/src/main/org/apollo/game/release/r317/HintIconMessageEncoder.java rename to game/src/main/org/apollo/game/release/r317/MobHintIconMessageEncoder.java index 3f19ea92..7ad60c39 100644 --- a/game/src/main/org/apollo/game/release/r317/HintIconMessageEncoder.java +++ b/game/src/main/org/apollo/game/release/r317/MobHintIconMessageEncoder.java @@ -1,20 +1,21 @@ package org.apollo.game.release.r317; import org.apollo.game.message.impl.HintIconMessage; +import org.apollo.game.message.impl.MobHintIconMessage; import org.apollo.net.codec.game.DataType; import org.apollo.net.codec.game.GamePacket; import org.apollo.net.codec.game.GamePacketBuilder; import org.apollo.net.release.MessageEncoder; /** - * A {@link MessageEncoder} for the {@link HintIconMessage}. + * A {@link MessageEncoder} for the {@link MobHintIconMessage}. * * @author Major */ -public final class HintIconMessageEncoder extends MessageEncoder { +public final class MobHintIconMessageEncoder extends MessageEncoder { @Override - public GamePacket encode(HintIconMessage message) { + public GamePacket encode(MobHintIconMessage message) { GamePacketBuilder builder = new GamePacketBuilder(254); HintIconMessage.Type type = message.getType(); builder.put(DataType.BYTE, type.getValue()); diff --git a/game/src/main/org/apollo/game/release/r317/PositionHintIconMessageEncoder.java b/game/src/main/org/apollo/game/release/r317/PositionHintIconMessageEncoder.java new file mode 100644 index 00000000..73df34df --- /dev/null +++ b/game/src/main/org/apollo/game/release/r317/PositionHintIconMessageEncoder.java @@ -0,0 +1,36 @@ +package org.apollo.game.release.r317; + +import org.apollo.game.message.impl.HintIconMessage; +import org.apollo.game.message.impl.PositionHintIconMessage; +import org.apollo.game.message.impl.HintIconMessage.Type; +import org.apollo.game.model.Position; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketBuilder; +import org.apollo.net.release.MessageEncoder; + +/** + * A {@link MessageEncoder} for the {@link PositionHintIconMessage}. + */ +public final class PositionHintIconMessageEncoder extends MessageEncoder { + + @Override + public GamePacket encode(PositionHintIconMessage message) { + GamePacketBuilder builder = new GamePacketBuilder(254); + HintIconMessage.Type type = message.getType(); + + if (type == Type.PLAYER || type == Type.NPC) { + throw new IllegalStateException("Unsupported hint icon type " + type + "."); + } + + builder.put(DataType.BYTE, type.getValue()); + + Position position = message.getPosition(); + builder.put(DataType.SHORT, position.getX()); + builder.put(DataType.SHORT, position.getY()); + builder.put(DataType.BYTE, message.getHeight()); + + return builder.toGamePacket(); + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/release/r317/Release317.java b/game/src/main/org/apollo/game/release/r317/Release317.java index da0b6c5a..68dcf375 100644 --- a/game/src/main/org/apollo/game/release/r317/Release317.java +++ b/game/src/main/org/apollo/game/release/r317/Release317.java @@ -10,10 +10,10 @@ import org.apollo.game.message.impl.FlashTabInterfaceMessage; import org.apollo.game.message.impl.ForwardPrivateChatMessage; import org.apollo.game.message.impl.FriendServerStatusMessage; import org.apollo.game.message.impl.GroupedRegionUpdateMessage; -import org.apollo.game.message.impl.HintIconMessage; import org.apollo.game.message.impl.IdAssignmentMessage; import org.apollo.game.message.impl.IgnoreListMessage; import org.apollo.game.message.impl.LogoutMessage; +import org.apollo.game.message.impl.MobHintIconMessage; import org.apollo.game.message.impl.NpcSynchronizationMessage; import org.apollo.game.message.impl.OpenDialogueInterfaceMessage; import org.apollo.game.message.impl.OpenDialogueOverlayMessage; @@ -22,6 +22,7 @@ import org.apollo.game.message.impl.OpenInterfaceSidebarMessage; import org.apollo.game.message.impl.OpenOverlayMessage; import org.apollo.game.message.impl.OpenSidebarMessage; import org.apollo.game.message.impl.PlayerSynchronizationMessage; +import org.apollo.game.message.impl.PositionHintIconMessage; import org.apollo.game.message.impl.PrivacyOptionMessage; import org.apollo.game.message.impl.RegionChangeMessage; import org.apollo.game.message.impl.RemoveObjectMessage; @@ -218,7 +219,8 @@ public final class Release317 extends Release { register(FriendServerStatusMessage.class, new FriendServerStatusMessageEncoder()); register(IgnoreListMessage.class, new IgnoreListMessageEncoder()); register(SendFriendMessage.class, new SendFriendMessageEncoder()); - register(HintIconMessage.class, new HintIconMessageEncoder()); + register(MobHintIconMessage.class, new MobHintIconMessageEncoder()); + register(PositionHintIconMessage.class, new PositionHintIconMessageEncoder()); register(FlashTabInterfaceMessage.class, new FlashTabInterfaceMessageEncoder()); register(OpenSidebarMessage.class, new OpenSidebarMessageEncoder()); register(OpenOverlayMessage.class, new OpenOverlayMessageEncoder()); diff --git a/game/src/main/org/apollo/game/release/r377/HintIconMessageEncoder.java b/game/src/main/org/apollo/game/release/r377/MobHintIconMessageEncoder.java similarity index 74% rename from game/src/main/org/apollo/game/release/r377/HintIconMessageEncoder.java rename to game/src/main/org/apollo/game/release/r377/MobHintIconMessageEncoder.java index 34dee9e4..8d86f89b 100644 --- a/game/src/main/org/apollo/game/release/r377/HintIconMessageEncoder.java +++ b/game/src/main/org/apollo/game/release/r377/MobHintIconMessageEncoder.java @@ -1,20 +1,21 @@ package org.apollo.game.release.r377; import org.apollo.game.message.impl.HintIconMessage; +import org.apollo.game.message.impl.MobHintIconMessage; import org.apollo.net.codec.game.DataType; import org.apollo.net.codec.game.GamePacket; import org.apollo.net.codec.game.GamePacketBuilder; import org.apollo.net.release.MessageEncoder; /** - * A {@link MessageEncoder} for the {@link HintIconMessage}. + * A {@link MessageEncoder} for the {@link MobHintIconMessage}. * * @author Major */ -public final class HintIconMessageEncoder extends MessageEncoder { +public final class MobHintIconMessageEncoder extends MessageEncoder { @Override - public GamePacket encode(HintIconMessage message) { + public GamePacket encode(MobHintIconMessage message) { GamePacketBuilder builder = new GamePacketBuilder(199); HintIconMessage.Type type = message.getType(); builder.put(DataType.BYTE, type.getValue()); diff --git a/game/src/main/org/apollo/game/release/r377/PositionHintIconMessageEncoder.java b/game/src/main/org/apollo/game/release/r377/PositionHintIconMessageEncoder.java new file mode 100644 index 00000000..562d7b24 --- /dev/null +++ b/game/src/main/org/apollo/game/release/r377/PositionHintIconMessageEncoder.java @@ -0,0 +1,38 @@ +package org.apollo.game.release.r377; + +import org.apollo.game.message.impl.HintIconMessage; +import org.apollo.game.message.impl.PositionHintIconMessage; +import org.apollo.game.message.impl.HintIconMessage.Type; +import org.apollo.game.model.Position; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketBuilder; +import org.apollo.net.release.MessageEncoder; + +/** + * A {@link MessageEncoder} for the {@link PositionHintIconMessage}. + * + * @author Major + */ +public final class PositionHintIconMessageEncoder extends MessageEncoder { + + @Override + public GamePacket encode(PositionHintIconMessage message) { + GamePacketBuilder builder = new GamePacketBuilder(199); + HintIconMessage.Type type = message.getType(); + + if (type == Type.PLAYER || type == Type.NPC) { + throw new IllegalStateException("Unsupported hint icon type " + type + "."); + } + + builder.put(DataType.BYTE, type.getValue()); + + Position position = message.getPosition(); + builder.put(DataType.SHORT, position.getX()); + builder.put(DataType.SHORT, position.getY()); + builder.put(DataType.BYTE, message.getHeight()); + + return builder.toGamePacket(); + } + +} \ No newline at end of file diff --git a/game/src/main/org/apollo/game/release/r377/Release377.java b/game/src/main/org/apollo/game/release/r377/Release377.java index ca7ea891..c176b621 100644 --- a/game/src/main/org/apollo/game/release/r377/Release377.java +++ b/game/src/main/org/apollo/game/release/r377/Release377.java @@ -13,10 +13,10 @@ import org.apollo.game.message.impl.FlashTabInterfaceMessage; import org.apollo.game.message.impl.ForwardPrivateChatMessage; import org.apollo.game.message.impl.FriendServerStatusMessage; import org.apollo.game.message.impl.GroupedRegionUpdateMessage; -import org.apollo.game.message.impl.HintIconMessage; import org.apollo.game.message.impl.IdAssignmentMessage; import org.apollo.game.message.impl.IgnoreListMessage; import org.apollo.game.message.impl.LogoutMessage; +import org.apollo.game.message.impl.MobHintIconMessage; import org.apollo.game.message.impl.NpcSynchronizationMessage; import org.apollo.game.message.impl.OpenDialogueInterfaceMessage; import org.apollo.game.message.impl.OpenDialogueOverlayMessage; @@ -25,6 +25,7 @@ import org.apollo.game.message.impl.OpenInterfaceSidebarMessage; import org.apollo.game.message.impl.OpenOverlayMessage; import org.apollo.game.message.impl.OpenSidebarMessage; import org.apollo.game.message.impl.PlayerSynchronizationMessage; +import org.apollo.game.message.impl.PositionHintIconMessage; import org.apollo.game.message.impl.PrivacyOptionMessage; import org.apollo.game.message.impl.RegionChangeMessage; import org.apollo.game.message.impl.RegionUpdateMessage; @@ -237,7 +238,8 @@ public final class Release377 extends Release { register(FriendServerStatusMessage.class, new FriendServerStatusMessageEncoder()); register(IgnoreListMessage.class, new IgnoreListMessageEncoder()); register(SendFriendMessage.class, new SendFriendMessageEncoder()); - register(HintIconMessage.class, new HintIconMessageEncoder()); + register(MobHintIconMessage.class, new MobHintIconMessageEncoder()); + register(PositionHintIconMessage.class, new PositionHintIconMessageEncoder()); register(FlashTabInterfaceMessage.class, new FlashTabInterfaceMessageEncoder()); register(OpenSidebarMessage.class, new OpenSidebarMessageEncoder()); register(OpenOverlayMessage.class, new OpenOverlayMessageEncoder());