From df47451f9fa3ff6460b1c749ce625ce3767ad881 Mon Sep 17 00:00:00 2001 From: thispixel Date: Mon, 16 Feb 2015 14:37:08 +0000 Subject: [PATCH 1/5] Correct and add the missing npc options. --- .../message/impl/FifthNpcActionMessage.java | 19 +++++++++++++++ .../message/impl/FourthNpcActionMessage.java | 19 +++++++++++++++ .../r317/FifthNpcActionMessageDecoder.java | 24 +++++++++++++++++++ .../r317/FourthNpcActionMessageDecoder.java | 23 ++++++++++++++++++ .../apollo/net/release/r317/Release317.java | 9 ++++--- .../r317/SecondNpcActionMessageDecoder.java | 2 +- .../r317/ThirdNpcActionMessageDecoder.java | 6 ++--- 7 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 src/org/apollo/game/message/impl/FifthNpcActionMessage.java create mode 100644 src/org/apollo/game/message/impl/FourthNpcActionMessage.java create mode 100644 src/org/apollo/net/release/r317/FifthNpcActionMessageDecoder.java create mode 100644 src/org/apollo/net/release/r317/FourthNpcActionMessageDecoder.java diff --git a/src/org/apollo/game/message/impl/FifthNpcActionMessage.java b/src/org/apollo/game/message/impl/FifthNpcActionMessage.java new file mode 100644 index 00000000..9f5331b0 --- /dev/null +++ b/src/org/apollo/game/message/impl/FifthNpcActionMessage.java @@ -0,0 +1,19 @@ +package org.apollo.game.message.impl; + +/** + * The third {@link NpcActionMessage}. + * + * @author Stuart + */ +public final class FifthNpcActionMessage extends NpcActionMessage { + + /** + * Creates a new third npc action message. + * + * @param index The index of the npc. + */ + public FifthNpcActionMessage(int index) { + super(5, index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/message/impl/FourthNpcActionMessage.java b/src/org/apollo/game/message/impl/FourthNpcActionMessage.java new file mode 100644 index 00000000..952f06f7 --- /dev/null +++ b/src/org/apollo/game/message/impl/FourthNpcActionMessage.java @@ -0,0 +1,19 @@ +package org.apollo.game.message.impl; + +/** + * The third {@link NpcActionMessage}. + * + * @author Stuart + */ +public final class FourthNpcActionMessage extends NpcActionMessage { + + /** + * Creates a new third npc action message. + * + * @param index The index of the npc. + */ + public FourthNpcActionMessage(int index) { + super(4, index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/FifthNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/FifthNpcActionMessageDecoder.java new file mode 100644 index 00000000..7490bd39 --- /dev/null +++ b/src/org/apollo/net/release/r317/FifthNpcActionMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r317; + +import org.apollo.game.message.impl.FifthNpcActionMessage; +import org.apollo.net.codec.game.DataOrder; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.FifthNpcActionMessage}. + * + * @author Stuart + */ +public final class FifthNpcActionMessageDecoder extends MessageDecoder { + + @Override + public FifthNpcActionMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + int index = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE); + return new FifthNpcActionMessage(index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/FourthNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/FourthNpcActionMessageDecoder.java new file mode 100644 index 00000000..a77bea34 --- /dev/null +++ b/src/org/apollo/net/release/r317/FourthNpcActionMessageDecoder.java @@ -0,0 +1,23 @@ +package org.apollo.net.release.r317; + +import org.apollo.game.message.impl.FourthNpcActionMessage; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.FourthNpcActionMessage}. + * + * @author Stuart + */ +public final class FourthNpcActionMessageDecoder extends MessageDecoder { + + @Override + public FourthNpcActionMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + int index = (int) reader.getSigned(DataType.SHORT); + return new FourthNpcActionMessage(index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/Release317.java b/src/org/apollo/net/release/r317/Release317.java index 4d4a48ea..fbeabca2 100644 --- a/src/org/apollo/net/release/r317/Release317.java +++ b/src/org/apollo/net/release/r317/Release317.java @@ -143,9 +143,12 @@ public final class Release317 extends Release { register(121, spamMessageDecoder); register(155, new FirstNpcActionMessageDecoder()); - register(17, new SecondNpcActionMessageDecoder()); - register(21, new ThirdNpcActionMessageDecoder()); - register(236, new TakeTileItemMessageDecoder()); + register(72, new SecondNpcActionMessageDecoder()); + register(17, new ThirdNpcActionMessageDecoder()); + register(21, new FourthNpcActionMessageDecoder()); + register(18, new FifthNpcActionMessageDecoder()); + + register(236, new TakeTileItemMessageDecoder()); register(192, new ItemOnObjectMessageDecoder()); register(128, new FirstPlayerActionMessageDecoder()); diff --git a/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java b/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java index 25ca164a..bb8d3f32 100644 --- a/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java +++ b/src/org/apollo/net/release/r317/SecondNpcActionMessageDecoder.java @@ -14,7 +14,7 @@ public final class SecondNpcActionMessageDecoder extends MessageDecoder Date: Mon, 16 Feb 2015 17:26:21 +0000 Subject: [PATCH 2/5] Npc action messages for 377 release. --- .../r377/FifthNpcActionMessageDecoder.java | 24 +++++++++++++++++++ .../r377/FirstNpcActionMessageDecoder.java | 17 ++++++------- .../r377/FourthNpcActionMessageDecoder.java | 23 ++++++++++++++++++ .../apollo/net/release/r377/Release377.java | 7 ++++-- .../r377/SecondNpcActionMessageDecoder.java | 11 ++++----- .../r377/ThirdNpcActionMessageDecoder.java | 6 ++--- 6 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 src/org/apollo/net/release/r377/FifthNpcActionMessageDecoder.java create mode 100644 src/org/apollo/net/release/r377/FourthNpcActionMessageDecoder.java diff --git a/src/org/apollo/net/release/r377/FifthNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/FifthNpcActionMessageDecoder.java new file mode 100644 index 00000000..8cc8c0b1 --- /dev/null +++ b/src/org/apollo/net/release/r377/FifthNpcActionMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.message.impl.FifthNpcActionMessage; +import org.apollo.net.codec.game.DataOrder; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.FifthNpcActionMessage}. + * + * @author Stuart + */ +public final class FifthNpcActionMessageDecoder extends MessageDecoder { + + @Override + public FifthNpcActionMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + int index = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE); + return new FifthNpcActionMessage(index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java index c2842fc1..089d91af 100644 --- a/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java +++ b/src/org/apollo/net/release/r377/FirstNpcActionMessageDecoder.java @@ -1,10 +1,7 @@ package org.apollo.net.release.r377; import org.apollo.game.message.impl.FirstNpcActionMessage; -import org.apollo.net.codec.game.DataTransformation; -import org.apollo.net.codec.game.DataType; -import org.apollo.net.codec.game.GamePacket; -import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.codec.game.*; import org.apollo.net.release.MessageDecoder; /** @@ -14,11 +11,11 @@ import org.apollo.net.release.MessageDecoder; */ public final class FirstNpcActionMessageDecoder extends MessageDecoder { - @Override - public FirstNpcActionMessage decode(GamePacket packet) { - GamePacketReader reader = new GamePacketReader(packet); - int index = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD); - return new FirstNpcActionMessage(index); - } + @Override + public FirstNpcActionMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + int index = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE); + return new FirstNpcActionMessage(index); + } } \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/FourthNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/FourthNpcActionMessageDecoder.java new file mode 100644 index 00000000..af9fb49d --- /dev/null +++ b/src/org/apollo/net/release/r377/FourthNpcActionMessageDecoder.java @@ -0,0 +1,23 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.message.impl.FourthNpcActionMessage; +import org.apollo.net.codec.game.DataType; +import org.apollo.net.codec.game.GamePacket; +import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.FourthNpcActionMessage}. + * + * @author Stuart + */ +public final class FourthNpcActionMessageDecoder extends MessageDecoder { + + @Override + public FourthNpcActionMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + int index = (int) reader.getSigned(DataType.SHORT); + return new FourthNpcActionMessage(index); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/Release377.java b/src/org/apollo/net/release/r377/Release377.java index 9b368738..2cbdf829 100644 --- a/src/org/apollo/net/release/r377/Release377.java +++ b/src/org/apollo/net/release/r377/Release377.java @@ -137,9 +137,12 @@ public final class Release377 extends Release { register(40, spamMessageDecoder); register(244, spamMessageDecoder); - register(67, new FirstNpcActionMessageDecoder()); - register(112, new SecondNpcActionMessageDecoder()); + register(112, new FirstNpcActionMessageDecoder()); + register(67, new SecondNpcActionMessageDecoder()); register(13, new ThirdNpcActionMessageDecoder()); + register(42, new FourthNpcActionMessageDecoder()); + register(8, new FifthNpcActionMessageDecoder()); + register(71, new TakeTileItemMessageDecoder()); register(152, new ItemOnObjectMessageDecoder()); diff --git a/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java b/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java index 6874cf3b..58949385 100644 --- a/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java +++ b/src/org/apollo/net/release/r377/SecondNpcActionMessageDecoder.java @@ -1,10 +1,7 @@ package org.apollo.net.release.r377; import org.apollo.game.message.impl.SecondNpcActionMessage; -import org.apollo.net.codec.game.DataOrder; -import org.apollo.net.codec.game.DataType; -import org.apollo.net.codec.game.GamePacket; -import org.apollo.net.codec.game.GamePacketReader; +import org.apollo.net.codec.game.*; import org.apollo.net.release.MessageDecoder; /** @@ -16,9 +13,9 @@ public final class SecondNpcActionMessageDecoder extends MessageDecoder Date: Tue, 17 Feb 2015 16:01:34 +0000 Subject: [PATCH 3/5] Add support for the MagicOnPlayer and MagicOnNpc frames. --- .../game/message/impl/MagicOnMobMessage.java | 66 +++++++++++++++++++ .../game/message/impl/MagicOnNpcMessage.java | 23 +++++++ .../message/impl/MagicOnPlayerMessage.java | 22 +++++++ .../r317/MagicOnNpcMessageDecoder.java | 24 +++++++ .../r317/MagicOnPlayerMessageDecoder.java | 24 +++++++ .../apollo/net/release/r317/Release317.java | 1 + .../r377/MagicOnNpcMessageDecoder.java | 24 +++++++ .../r377/MagicOnPlayerMessageDecoder.java | 24 +++++++ .../apollo/net/release/r377/Release377.java | 2 + 9 files changed, 210 insertions(+) create mode 100644 src/org/apollo/game/message/impl/MagicOnMobMessage.java create mode 100644 src/org/apollo/game/message/impl/MagicOnNpcMessage.java create mode 100644 src/org/apollo/game/message/impl/MagicOnPlayerMessage.java create mode 100644 src/org/apollo/net/release/r317/MagicOnNpcMessageDecoder.java create mode 100644 src/org/apollo/net/release/r317/MagicOnPlayerMessageDecoder.java create mode 100644 src/org/apollo/net/release/r377/MagicOnNpcMessageDecoder.java create mode 100644 src/org/apollo/net/release/r377/MagicOnPlayerMessageDecoder.java diff --git a/src/org/apollo/game/message/impl/MagicOnMobMessage.java b/src/org/apollo/game/message/impl/MagicOnMobMessage.java new file mode 100644 index 00000000..eb30e23c --- /dev/null +++ b/src/org/apollo/game/message/impl/MagicOnMobMessage.java @@ -0,0 +1,66 @@ +package org.apollo.game.message.impl; + +import org.apollo.game.message.Message; +import org.apollo.game.model.entity.Entity; + +/** + * A {@link Message} sent by the client representing when a player uses any type of magic spell on a mob. + * + * @author Stuart + */ +public abstract class MagicOnMobMessage extends Message { + + /** + * The type of the mob + */ + private final Entity.EntityType type; + /** + * The index of the mob + */ + private final int index; + /** + * The spell if used + */ + private final int spellId; + + /** + * Creates a magic on mob message + * + * @param type The mob type + * @param index The mob index + * @param spellId The spell id + */ + public MagicOnMobMessage(Entity.EntityType type, int index, int spellId) { + this.type = type; + this.index = index; + this.spellId = spellId; + } + + /** + * Gets the type of the mob the spell is being used on + * + * @return The mob type + */ + public Entity.EntityType getType() { + return type; + } + + /** + * Gets the index of the mob the spell is being used on + * + * @return The mob index + */ + public int getIndex() { + return index; + } + + /** + * Gets the spell id that is being used + * + * @return The spell id + */ + public int getSpellId() { + return spellId; + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/message/impl/MagicOnNpcMessage.java b/src/org/apollo/game/message/impl/MagicOnNpcMessage.java new file mode 100644 index 00000000..f6acb656 --- /dev/null +++ b/src/org/apollo/game/message/impl/MagicOnNpcMessage.java @@ -0,0 +1,23 @@ +package org.apollo.game.message.impl; + +import org.apollo.game.model.entity.Entity; +import org.apollo.game.model.entity.Npc; + +/** + * The magic on npc {@link org.apollo.game.message.impl.MagicOnNpcMessage} + * + * @author Stuart + */ +public final class MagicOnNpcMessage extends MagicOnMobMessage { + + /** + * Creates the magic on npc message + * + * @param index The npc index + * @param spellId The spell id used + */ + public MagicOnNpcMessage(int index, int spellId) { + super(Entity.EntityType.NPC, index, spellId); + } + +} diff --git a/src/org/apollo/game/message/impl/MagicOnPlayerMessage.java b/src/org/apollo/game/message/impl/MagicOnPlayerMessage.java new file mode 100644 index 00000000..d0517f1f --- /dev/null +++ b/src/org/apollo/game/message/impl/MagicOnPlayerMessage.java @@ -0,0 +1,22 @@ +package org.apollo.game.message.impl; + +import org.apollo.game.model.entity.Entity; + +/** + * The magic on player {@link org.apollo.game.message.impl.MagicOnMobMessage + * + * @author Stuart + */ +public final class MagicOnPlayerMessage extends MagicOnMobMessage { + + /** + * Creates the magic on player message + * + * @param index The player index + * @param spellId The spell id used + */ + public MagicOnPlayerMessage(int index, int spellId) { + super(Entity.EntityType.PLAYER, index, spellId); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/MagicOnNpcMessageDecoder.java b/src/org/apollo/net/release/r317/MagicOnNpcMessageDecoder.java new file mode 100644 index 00000000..4d8babcb --- /dev/null +++ b/src/org/apollo/net/release/r317/MagicOnNpcMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r317; + +import org.apollo.game.message.impl.MagicOnNpcMessage; +import org.apollo.net.codec.game.*; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.MagicOnNpcMessage} + * + * @author Stuart + */ +public final class MagicOnNpcMessageDecoder extends MessageDecoder { + + @Override + public MagicOnNpcMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + + int index = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD); + int spellId = (int) reader.getSigned(DataType.SHORT, DataTransformation.ADD); + + return new MagicOnNpcMessage(index, spellId); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/MagicOnPlayerMessageDecoder.java b/src/org/apollo/net/release/r317/MagicOnPlayerMessageDecoder.java new file mode 100644 index 00000000..81311901 --- /dev/null +++ b/src/org/apollo/net/release/r317/MagicOnPlayerMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r317; + +import org.apollo.game.message.impl.MagicOnPlayerMessage; +import org.apollo.net.codec.game.*; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.MagicOnPlayerMessage} + * + * @author Stuart + */ +public final class MagicOnPlayerMessageDecoder extends MessageDecoder { + + @Override + public MagicOnPlayerMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + + int index = (int) reader.getSigned(DataType.SHORT, DataTransformation.ADD); + int spellId = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE); + + return new MagicOnPlayerMessage(index, spellId); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r317/Release317.java b/src/org/apollo/net/release/r317/Release317.java index fbeabca2..24312f09 100644 --- a/src/org/apollo/net/release/r317/Release317.java +++ b/src/org/apollo/net/release/r317/Release317.java @@ -126,6 +126,7 @@ public final class Release317 extends Release { register(53, new ItemOnItemMessageDecoder()); register(237, new MagicOnItemMessageDecoder()); + register(249, new MagicOnPlayerMessageDecoder()); register(3, new FocusUpdateMessageDecoder()); register(45, new FlaggedMouseEventMessageDecoder()); diff --git a/src/org/apollo/net/release/r377/MagicOnNpcMessageDecoder.java b/src/org/apollo/net/release/r377/MagicOnNpcMessageDecoder.java new file mode 100644 index 00000000..6ee99adb --- /dev/null +++ b/src/org/apollo/net/release/r377/MagicOnNpcMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.message.impl.MagicOnNpcMessage; +import org.apollo.net.codec.game.*; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.MagicOnNpcMessage} + * + * @author Stuart + */ +public final class MagicOnNpcMessageDecoder extends MessageDecoder { + + @Override + public MagicOnNpcMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + + int index = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD); + int spellId = (int) reader.getSigned(DataType.SHORT, DataTransformation.ADD); + + return new MagicOnNpcMessage(index, spellId); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/MagicOnPlayerMessageDecoder.java b/src/org/apollo/net/release/r377/MagicOnPlayerMessageDecoder.java new file mode 100644 index 00000000..31999b11 --- /dev/null +++ b/src/org/apollo/net/release/r377/MagicOnPlayerMessageDecoder.java @@ -0,0 +1,24 @@ +package org.apollo.net.release.r377; + +import org.apollo.game.message.impl.MagicOnPlayerMessage; +import org.apollo.net.codec.game.*; +import org.apollo.net.release.MessageDecoder; + +/** + * A {@link org.apollo.net.release.MessageDecoder} for the {@link org.apollo.game.message.impl.MagicOnPlayerMessage} + * + * @author Stuart + */ +public final class MagicOnPlayerMessageDecoder extends MessageDecoder { + + @Override + public MagicOnPlayerMessage decode(GamePacket packet) { + GamePacketReader reader = new GamePacketReader(packet); + + int index = (int) reader.getSigned(DataType.SHORT, DataTransformation.ADD); + int spellId = (int) reader.getSigned(DataType.SHORT, DataOrder.LITTLE); + + return new MagicOnPlayerMessage(index, spellId); + } + +} \ No newline at end of file diff --git a/src/org/apollo/net/release/r377/Release377.java b/src/org/apollo/net/release/r377/Release377.java index 2cbdf829..0681f56f 100644 --- a/src/org/apollo/net/release/r377/Release377.java +++ b/src/org/apollo/net/release/r377/Release377.java @@ -126,6 +126,8 @@ public final class Release377 extends Release { register(1, new ItemOnItemMessageDecoder()); register(36, new MagicOnItemMessageDecoder()); + register(31, new MagicOnPlayerMessageDecoder()); + register(104, new MagicOnNpcMessageDecoder()); register(187, new FocusUpdateMessageDecoder()); register(19, new MouseClickedMessageDecoder()); From 87ff14c4d7a46bc7644bbbb971f77ab672f066cc Mon Sep 17 00:00:00 2001 From: Ryley Kimmel Date: Wed, 25 Feb 2015 15:17:41 -0500 Subject: [PATCH 4/5] Inventory improvements: (expand commit for details). - Fixed a bug with Inventory#add(Item) not handling integer overflow properly. - Fixed a bug with Inventory#add(Item) returning an Item object with an amount of 0 instead of null. - Inventory#add(Item) now returns an Optional object and cleaned up portions of the method. - code clean-up to Inventory#remove(int, int). - Inventory#remove(int, int) now supports stopping and refiring of listeners while the inventory is being updated (prevents flickering and unnecessary updating of the inventory for batch updates). --- src/org/apollo/game/model/inv/Inventory.java | 129 +++++++++++-------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/src/org/apollo/game/model/inv/Inventory.java b/src/org/apollo/game/model/inv/Inventory.java index 9a455fa2..d39e7ac6 100644 --- a/src/org/apollo/game/model/inv/Inventory.java +++ b/src/org/apollo/game/model/inv/Inventory.java @@ -3,6 +3,7 @@ package org.apollo.game.model.inv; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import org.apollo.game.model.Item; import org.apollo.game.model.def.ItemDefinition; @@ -116,84 +117,92 @@ public final class Inventory { * @return The amount that remains. */ public int add(int id, int amount) { - Item item = add(new Item(id, amount)); - return (item != null) ? item.getAmount() : 0; + Optional optionalItem = add(new Item(id, amount)); + return optionalItem.map(item -> optionalItem.isPresent() ? item.getAmount() : 0).get(); } /** - * Adds an item to this inventory. This will attempt to add as much of the item that is possible. If the item - * remains, it will be returned (in the case of stackable items, any quantity that remains in the stack is - * returned). If nothing remains, the method will return {@code null}. If something remains, the listener will also - * be notified which could be used, for example, to send a message to the player. - * + * Attempts to add as much of the specified {@code item} to this inventory + * as possible. If any of the item remains, an {@link Item item with the + * remainder} will be returned (in the case of stack-able items, any + * quantity that remains in the stack is returned). If nothing remains, the + * method will return {@link Optional#empty an empty Optional}. + * + *

+ * If anything remains at all, the listener will be notified which could be + * used for notifying a player that their inventory is full, for example. + * * @param item The item to add to this inventory. - * @return The item that remains if there is not enough room in the inventory. If nothing remains, {@code null}. + * @return The item that may remain, if nothing remains, + * {@link Optional#empty an empty Optional} is returned. */ - public Item add(Item item) { + public Optional add(Item item) { int id = item.getId(); boolean stackable = isStackable(item.getDefinition()); if (stackable) { - for (int slot = 0; slot < capacity; slot++) { + int slot = slotOf(id); + + if (slot != -1) { Item other = items[slot]; - if (other != null && other.getId() == id) { - long total = item.getAmount() + other.getAmount(); - int amount, remaining; + long total = (long) item.getAmount() + other.getAmount(); + int amount, remaining; - if (total > Integer.MAX_VALUE) { - amount = (int) (total - Integer.MAX_VALUE); - remaining = (int) (total - amount); - notifyCapacityExceeded(); - } else { - amount = (int) total; - remaining = 0; - } - - set(slot, new Item(id, amount)); - return remaining > 0 ? new Item(id, remaining) : null; + if (total > Integer.MAX_VALUE) { + amount = (int) (total - Integer.MAX_VALUE); + remaining = (int) (total - amount); + notifyCapacityExceeded(); + } else { + amount = (int) total; + remaining = 0; } + + set(slot, new Item(id, amount)); + return remaining > 0 ? Optional.of(new Item(id, remaining)) : Optional.empty(); } - for (int slot = 0; slot < capacity; slot++) { - Item other = items[slot]; - if (other == null) { + for (slot = 0; slot < capacity; slot++) { + if (items[slot] == null) { set(slot, item); - return null; + return Optional.empty(); } } notifyCapacityExceeded(); - return item; + return Optional.of(item); } int remaining = item.getAmount(); + if (remaining == 0) { + return Optional.empty(); + } + stopFiringEvents(); try { Item single = new Item(item.getId(), 1); + for (int slot = 0; slot < capacity; slot++) { if (items[slot] == null) { - remaining--; set(slot, single); // share the instances - if (remaining <= 0) { - break; + if (--remaining <= 0) { + return Optional.empty(); } } } } finally { startFiringEvents(); + + if (remaining != item.getAmount()) { + notifyItemsUpdated(); + } } - if (remaining != item.getAmount()) { - notifyItemsUpdated(); - } - if (remaining > 0) { - notifyCapacityExceeded(); - } + notifyCapacityExceeded(); - return new Item(item.getId(), remaining); + return Optional.of(new Item(item.getId(), remaining)); } /** @@ -442,19 +451,19 @@ public final class Inventory { * @return The amount that was removed. */ public int remove(int id, int amount) { - ItemDefinition definition = ItemDefinition.lookup(id); - boolean stackable = isStackable(definition); + ItemDefinition def = ItemDefinition.lookup(id); + boolean stackable = isStackable(def); if (stackable) { - for (int slot = 0; slot < capacity; slot++) { + int slot = slotOf(id); + + if (slot != -1) { Item item = items[slot]; - if (item != null && item.getId() == id) { - if (amount >= item.getAmount()) { - set(slot, null); - return item.getAmount(); - } - + if (amount >= item.getAmount()) { + set(slot, null); + return item.getAmount(); + } else { set(slot, new Item(item.getId(), item.getAmount() - amount)); return amount; } @@ -464,16 +473,26 @@ public final class Inventory { } int removed = 0; - for (int slot = 0; slot < capacity; slot++) { - Item item = items[slot]; - if (item != null && item.getId() == id) { - set(slot, null); - removed++; + stopFiringEvents(); + + try { + for (int slot = 0; slot < capacity; slot++) { + Item item = items[slot]; + if (item != null && item.getId() == id) { + set(slot, null); + + if (++removed >= amount) { + break; + } + } } - if (removed >= amount) { - break; + } finally { + startFiringEvents(); + + if (removed > 0) { + notifyItemsUpdated(); } } From edd7b483afc01011ba9a5fc71443f7088f746070 Mon Sep 17 00:00:00 2001 From: Ryley Kimmel Date: Wed, 25 Feb 2015 15:30:46 -0500 Subject: [PATCH 5/5] Don't map item amount in Inventory#add(int, int). --- src/org/apollo/game/model/inv/Inventory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/apollo/game/model/inv/Inventory.java b/src/org/apollo/game/model/inv/Inventory.java index d39e7ac6..b94a8ed5 100644 --- a/src/org/apollo/game/model/inv/Inventory.java +++ b/src/org/apollo/game/model/inv/Inventory.java @@ -117,8 +117,8 @@ public final class Inventory { * @return The amount that remains. */ public int add(int id, int amount) { - Optional optionalItem = add(new Item(id, amount)); - return optionalItem.map(item -> optionalItem.isPresent() ? item.getAmount() : 0).get(); + Optional item = add(new Item(id, amount)); + return item.isPresent() ? item.get().getAmount() : 0; } /**