mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-03 00:38:21 +00:00
Implement various fixes from Major-/Apollo.
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
This version of Apollo contains code from the following people:
|
||||
Graham and the rest of the Apollo team
|
||||
Chris Fletcher (http://www.rune-server.org/members/chris%20fletcher)
|
||||
Major (http://www.rune-server.org/members/major)
|
||||
The Wanderer (http://www.rune-server.org/members/the%20wanderer)
|
||||
|
||||
Current fixes include:
|
||||
317 ChatEventDecoder fix (data read incorrectly) - http://www.rune-server.org/runescape-development/rs2-server/snippets/420815-apollo-317-chat-event-decoder-bug-fix.html.
|
||||
Player region changing fix (appeared to teleport) - http://www.rune-server.org/runescape-development/rs2-server/snippets/420865-apollo-players-changing-regions-appear-teleport-bug.html
|
||||
Walking height level fix (always set to 0)
|
||||
ThirdObjectActionEvent fix (data read incorrectly)
|
||||
Combat level formula fix (calculated incorrectly)
|
||||
Item equipping fix (wasn't removing them correctly)
|
||||
2-handed weapon equip fix
|
||||
SwitchItemEventDecoder fix (data read incorrectly)
|
||||
SetInterfaceTextEventencoder fix (entire class was missing from 317)
|
||||
317 and 377 packet length fixes.
|
||||
Archive decoding fix (data wasn't being extracted properly)
|
||||
Mining plugin: JRuby name clash with 'Gem'
|
||||
@@ -1,6 +1,6 @@
|
||||
GEMS = {}
|
||||
GEMSTONES = {}
|
||||
|
||||
class Gem
|
||||
class Gemstone
|
||||
attr_reader :id, :chance
|
||||
|
||||
def initialize(id, chance)
|
||||
@@ -10,10 +10,10 @@ class Gem
|
||||
end
|
||||
|
||||
def append_gem(gem)
|
||||
GEMS[gem.id] = gem
|
||||
GEMSTONES[gem.id] = gem
|
||||
end
|
||||
|
||||
append_gem(Gem.new(1623, 0)) # uncut sapphire
|
||||
append_gem(Gem.new(1605, 0)) # uncut emerald
|
||||
append_gem(Gem.new(1619, 0)) # uncut ruby
|
||||
append_gem(Gem.new(1617, 0)) # uncut diamond
|
||||
append_gem(Gemstone.new(1623, 0)) # uncut sapphire
|
||||
append_gem(Gemstone.new(1605, 0)) # uncut emerald
|
||||
append_gem(Gemstone.new(1619, 0)) # uncut ruby
|
||||
append_gem(Gemstone.new(1617, 0)) # uncut diamond
|
||||
|
||||
@@ -45,7 +45,7 @@ class MiningAction < DistancedAction
|
||||
|
||||
def executeAction
|
||||
skills = character.skill_set
|
||||
level = skills.get_skill(Skill::MINING).maximum_level # TODO: is using max level correct?
|
||||
level = skills.get_skill(Skill::MINING).current_level
|
||||
pickaxe = find_pickaxe
|
||||
|
||||
# verify the player can mine with their pickaxe
|
||||
|
||||
@@ -9,21 +9,24 @@ import org.apollo.util.CompressionUtil;
|
||||
|
||||
/**
|
||||
* Represents an archive.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class Archive {
|
||||
|
||||
/**
|
||||
* Decodes the archive in the specified buffer.
|
||||
* @param buffer The buffer.
|
||||
*
|
||||
* @param buffer
|
||||
* The buffer.
|
||||
* @return The archive.
|
||||
* @throws IOException if an I/O error occurs.
|
||||
* @throws IOException
|
||||
* if an I/O error occurs.
|
||||
*/
|
||||
public static Archive decode(ByteBuffer buffer) throws IOException {
|
||||
int extractedSize = ByteBufferUtil.readUnsignedTriByte(buffer);
|
||||
int size = ByteBufferUtil.readUnsignedTriByte(buffer);
|
||||
boolean extracted = false;
|
||||
|
||||
if (size != extractedSize) {
|
||||
byte[] compressed = new byte[size];
|
||||
byte[] uncompressed = new byte[extractedSize];
|
||||
@@ -32,32 +35,31 @@ public final class Archive {
|
||||
buffer = ByteBuffer.wrap(uncompressed);
|
||||
extracted = true;
|
||||
}
|
||||
|
||||
int entries = buffer.getShort() & 0xFFFF;
|
||||
int[] identifiers = new int[entries];
|
||||
int[] extractedSizes = new int[entries];
|
||||
int[] sizes = new int[entries];
|
||||
|
||||
for (int i = 0; i < entries; i++) {
|
||||
identifiers[i] = buffer.getInt();
|
||||
extractedSizes[i] = ByteBufferUtil.readUnsignedTriByte(buffer);
|
||||
sizes[i] = ByteBufferUtil.readUnsignedTriByte(buffer);
|
||||
}
|
||||
|
||||
ArchiveEntry[] entry = new ArchiveEntry[entries];
|
||||
|
||||
for (int i = 0; i < entries; i++) {
|
||||
ByteBuffer entryBuffer = ByteBuffer.allocate(extractedSizes[i]);
|
||||
ByteBuffer entryBuffer;
|
||||
if (!extracted) {
|
||||
byte[] compressed = new byte[sizes[i]];
|
||||
byte[] uncompressed = new byte[extractedSizes[i]];
|
||||
buffer.get(compressed);
|
||||
CompressionUtil.unbzip2(compressed, uncompressed);
|
||||
entryBuffer = ByteBuffer.wrap(uncompressed);
|
||||
} else {
|
||||
byte[] buf = new byte[extractedSizes[i]];
|
||||
buffer.get(buf);
|
||||
entryBuffer = ByteBuffer.wrap(buf);
|
||||
}
|
||||
entry[i] = new ArchiveEntry(identifiers[i], entryBuffer);
|
||||
}
|
||||
|
||||
return new Archive(entry);
|
||||
}
|
||||
|
||||
@@ -68,7 +70,9 @@ public final class Archive {
|
||||
|
||||
/**
|
||||
* Creates a new archive.
|
||||
* @param entries The entries in this archive.
|
||||
*
|
||||
* @param entries
|
||||
* The entries in this archive.
|
||||
*/
|
||||
public Archive(ArchiveEntry[] entries) {
|
||||
this.entries = entries;
|
||||
@@ -76,9 +80,12 @@ public final class Archive {
|
||||
|
||||
/**
|
||||
* Gets an entry by its name.
|
||||
* @param name The name.
|
||||
*
|
||||
* @param name
|
||||
* The name.
|
||||
* @return The entry.
|
||||
* @throws FileNotFoundException if the file could not be found.
|
||||
* @throws FileNotFoundException
|
||||
* if the file could not be found.
|
||||
*/
|
||||
public ArchiveEntry getEntry(String name) throws FileNotFoundException {
|
||||
int hash = 0;
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.apollo.util.ByteBufferUtil;
|
||||
|
||||
/**
|
||||
* A class which parses item definitions.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class ItemDefinitionParser {
|
||||
@@ -21,7 +22,9 @@ public final class ItemDefinitionParser {
|
||||
|
||||
/**
|
||||
* Creates the item definition parser.
|
||||
* @param fs The indexed file system.
|
||||
*
|
||||
* @param fs
|
||||
* The indexed file system.
|
||||
*/
|
||||
public ItemDefinitionParser(IndexedFileSystem fs) {
|
||||
this.fs = fs;
|
||||
@@ -29,8 +32,10 @@ public final class ItemDefinitionParser {
|
||||
|
||||
/**
|
||||
* Parses the item definitions.
|
||||
*
|
||||
* @return The item definitions.
|
||||
* @throws IOException if an I/O error occurs.
|
||||
* @throws IOException
|
||||
* if an I/O error occurs.
|
||||
*/
|
||||
public ItemDefinition[] parse() throws IOException {
|
||||
Archive config = Archive.decode(fs.getFile(0, 2));
|
||||
@@ -56,65 +61,54 @@ public final class ItemDefinitionParser {
|
||||
|
||||
/**
|
||||
* Parses a single definition.
|
||||
* @param id The item's id.
|
||||
* @param buffer The buffer.
|
||||
*
|
||||
* @param id
|
||||
* The item's id.
|
||||
* @param buffer
|
||||
* The buffer.
|
||||
* @return The definition.
|
||||
*/
|
||||
private ItemDefinition parseDefinition(int id, ByteBuffer buffer) {
|
||||
ItemDefinition def = new ItemDefinition(id);
|
||||
|
||||
while (true) {
|
||||
int code = buffer.get() & 0xFF;
|
||||
|
||||
if (code == 0) {
|
||||
return def;
|
||||
} else if (code == 1) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelId = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort();// & 0xFFFF; // model Id
|
||||
} else if (code == 2) {
|
||||
def.setName(ByteBufferUtil.readString(buffer));
|
||||
} else if (code == 3) {
|
||||
def.setDescription(ByteBufferUtil.readString(buffer));
|
||||
} else if (code == 4) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelScale = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort();// & 0xFFFF; // sprite scale
|
||||
} else if (code == 5) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelRotationX = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort();// & 0xFFFF; // sprite pitch
|
||||
} else if (code == 6) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelRotationY = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort();// & 0xFFFF; //sprite camera roll
|
||||
} else if (code == 7) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelTransformationX = buffer.getShort();
|
||||
buffer.getShort(); // sprite dX
|
||||
} else if (code == 8) {
|
||||
@SuppressWarnings("unused")
|
||||
int modelTransformationY = buffer.getShort();
|
||||
buffer.getShort(); // sprite dY
|
||||
} else if (code == 10) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort();// & 0xFFFF;
|
||||
} else if (code == 11) {
|
||||
def.setStackable(true);
|
||||
} else if (code == 12) {
|
||||
def.setValue(buffer.getInt());
|
||||
buffer.getInt(); // model height
|
||||
} else if (code == 16) {
|
||||
def.setMembersOnly(true);
|
||||
} else if (code == 23) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknownShort = buffer.getShort() & 0xFFFF;
|
||||
@SuppressWarnings("unused")
|
||||
int unknownByte = buffer.get();
|
||||
buffer.getShort(); // & 0xFFFF; //primaryMaleEquipModelId
|
||||
buffer.get(); // maleEquipYTranslation
|
||||
} else if (code == 24) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknownShort = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // secondaryMaleEquipModelId
|
||||
} else if (code == 25) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknownShort = buffer.getShort() & 0xFFFF;
|
||||
@SuppressWarnings("unused")
|
||||
int unknownByte = buffer.get();
|
||||
buffer.getShort(); // & 0xFFFF; // primaryFemaleEquipModelId
|
||||
buffer.get(); // femaleEquipYTranslation
|
||||
} else if (code == 26) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknownShort = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // secondaryFemaleEquipModelId
|
||||
} else if (code >= 30 && code < 35) {
|
||||
String str = ByteBufferUtil.readString(buffer);
|
||||
if (str.equalsIgnoreCase("hidden")) {
|
||||
@@ -125,34 +119,25 @@ public final class ItemDefinitionParser {
|
||||
String str = ByteBufferUtil.readString(buffer);
|
||||
def.setInventoryAction(code - 35, str);
|
||||
} else if (code == 40) {
|
||||
int colorCount = buffer.get() & 0xFF;
|
||||
for (int i = 0; i < colorCount; i++) {
|
||||
@SuppressWarnings("unused")
|
||||
int oldColor = buffer.getShort() & 0xFFFF;
|
||||
@SuppressWarnings("unused")
|
||||
int newColor = buffer.getShort() & 0xFFFF;
|
||||
int colourCount = buffer.get() & 0xFF;
|
||||
for (int i = 0; i < colourCount; i++) {
|
||||
buffer.getShort(); // & 0xFFFF; // original colour
|
||||
buffer.getShort(); // & 0xFFFF; // replacement colour
|
||||
}
|
||||
} else if (code == 78) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // tertiaryMaleEquipModelId
|
||||
} else if (code == 79) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // tertiaryFemaleEquipModelId
|
||||
} else if (code == 90) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // primaryMaleHeadPiece
|
||||
} else if (code == 91) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // primaryFemaleHeadPiece
|
||||
} else if (code == 92) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // secondaryMaleHeadPiece
|
||||
} else if (code == 93) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // secondaryFemaleHeadPiece
|
||||
} else if (code == 95) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // spriteCameraYaw
|
||||
} else if (code == 97) {
|
||||
int noteInfoId = buffer.getShort() & 0xFFFF;
|
||||
def.setNoteInfoId(noteInfoId);
|
||||
@@ -160,25 +145,20 @@ public final class ItemDefinitionParser {
|
||||
int noteGraphicId = buffer.getShort() & 0xFFFF;
|
||||
def.setNoteGraphicId(noteGraphicId);
|
||||
} else if (code >= 100 && code < 110) {
|
||||
@SuppressWarnings("unused")
|
||||
int stackId = buffer.getShort() & 0xFFFF;
|
||||
@SuppressWarnings("unused")
|
||||
int stackAmount = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // stack id
|
||||
buffer.getShort(); // & 0xFFFF; // stack size
|
||||
} else if (code == 110) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // groundScaleX
|
||||
} else if (code == 111) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // groundScaleY
|
||||
} else if (code == 112) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() & 0xFFFF;
|
||||
buffer.getShort(); // & 0xFFFF; // groundScaleZ
|
||||
} else if (code == 113) {
|
||||
buffer.get(); // light ambiance
|
||||
} else if (code == 114) {
|
||||
@SuppressWarnings("unused")
|
||||
int unknown = buffer.getShort() * 5;
|
||||
buffer.getShort(); // * 5; // light diffusion
|
||||
} else if (code == 115) {
|
||||
@SuppressWarnings("unused")
|
||||
int team = buffer.get() & 0xFF;
|
||||
buffer.get(); // & 0xFF; // team
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ public final class EventHandlerChain<E extends Event> {
|
||||
* Creates the event handler chain.
|
||||
* @param handlers The handlers.
|
||||
*/
|
||||
@SafeVarargs
|
||||
public EventHandlerChain(EventHandler<E>... handlers) {
|
||||
this.handlers = handlers;
|
||||
}
|
||||
|
||||
@@ -77,16 +77,12 @@ public final class EquipEventHandler extends EventHandler<EquipEvent> {
|
||||
// TODO: put all this into another method somewhere
|
||||
|
||||
// check if there is enough space for a two handed weapon
|
||||
if (equipDef.isTwoHanded()) {
|
||||
Item currentShield = equipment.get(EquipmentConstants.SHIELD);
|
||||
if (currentShield != null) {
|
||||
if (inventory.freeSlots() < 1) {
|
||||
inventory.forceCapacityExceeded();
|
||||
ctx.breakHandlerChain();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (equipDef.isTwoHanded()) {
|
||||
if(equipment.get(EquipmentConstants.SHIELD) != null){
|
||||
Item shield = equipment.reset(EquipmentConstants.SHIELD);
|
||||
inventory.add(shield);
|
||||
}
|
||||
}
|
||||
|
||||
// check if a shield is being added with a two handed weapon
|
||||
boolean removeWeapon = false;
|
||||
|
||||
@@ -10,16 +10,29 @@ import org.apollo.game.model.inv.SynchronizationInventoryListener;
|
||||
|
||||
/**
|
||||
* An event handler which removes equipped items.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class RemoveEventHandler extends EventHandler<ItemActionEvent> {
|
||||
|
||||
@Override
|
||||
public void handle(EventHandlerContext ctx, Player player, ItemActionEvent event) {
|
||||
if (event.getOption() == 1 && event.getInterfaceId() == SynchronizationInventoryListener.EQUIPMENT_ID) {
|
||||
public void handle(EventHandlerContext ctx, Player player,
|
||||
ItemActionEvent event) {
|
||||
|
||||
if (event.getOption() == 1
|
||||
&& event.getInterfaceId() == SynchronizationInventoryListener.EQUIPMENT_ID) {
|
||||
Inventory inventory = player.getInventory();
|
||||
Inventory equipment = player.getEquipment();
|
||||
|
||||
if (inventory.freeSlots() < 1) { // TODO what if the item is
|
||||
// stackable and the player has
|
||||
// the item in his inventory
|
||||
// already.
|
||||
inventory.forceCapacityExceeded();
|
||||
ctx.breakHandlerChain();
|
||||
return;
|
||||
}
|
||||
|
||||
int slot = event.getSlot();
|
||||
if (slot < 0 || slot >= equipment.capacity()) {
|
||||
ctx.breakHandlerChain();
|
||||
@@ -39,10 +52,11 @@ public final class RemoveEventHandler extends EventHandler<ItemActionEvent> {
|
||||
|
||||
try {
|
||||
equipment.set(slot, null);
|
||||
Item tmp = inventory.add(item);
|
||||
if (tmp != null) {
|
||||
Item copy = item;
|
||||
inventory.add(item.getId(), item.getAmount());
|
||||
if (copy != null) {
|
||||
removed = false;
|
||||
equipment.set(slot, tmp);
|
||||
equipment.set(slot, copy);
|
||||
}
|
||||
} finally {
|
||||
inventory.startFiringEvents();
|
||||
@@ -50,12 +64,13 @@ public final class RemoveEventHandler extends EventHandler<ItemActionEvent> {
|
||||
}
|
||||
|
||||
if (removed) {
|
||||
inventory.forceRefresh(); // TODO find out the specific slot that got used?
|
||||
equipment.forceRefresh(slot);
|
||||
inventory.forceRefresh(); // TODO find out the specific slot
|
||||
// that got used?
|
||||
equipment.forceRefresh();
|
||||
} else {
|
||||
inventory.forceCapacityExceeded();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import org.apollo.game.model.skill.SkillListener;
|
||||
|
||||
/**
|
||||
* Represents the set of the player's skills.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class SkillSet {
|
||||
@@ -45,6 +46,7 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Gets the number of skills.
|
||||
*
|
||||
* @return The number of skills.
|
||||
*/
|
||||
public int size() {
|
||||
@@ -67,9 +69,12 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Gets a skill by its id.
|
||||
* @param id The id.
|
||||
*
|
||||
* @param id
|
||||
* The id.
|
||||
* @return The skill.
|
||||
* @throws IndexOutOfBoundsException if the id is out of bounds.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if the id is out of bounds.
|
||||
*/
|
||||
public Skill getSkill(int id) {
|
||||
checkBounds(id);
|
||||
@@ -78,8 +83,11 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Adds experience to the specified skill.
|
||||
* @param id The skill id.
|
||||
* @param experience The amount of experience.
|
||||
*
|
||||
* @param id
|
||||
* The skill id.
|
||||
* @param experience
|
||||
* The amount of experience.
|
||||
*/
|
||||
public void addExperience(int id, double experience) {
|
||||
checkBounds(id);
|
||||
@@ -110,11 +118,12 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Gets the total level for this skill set.
|
||||
*
|
||||
* @return The total level.
|
||||
*/
|
||||
public int getTotalLevel() {
|
||||
int total = 0;
|
||||
for(int i = 0; i < skills.length; i++) {
|
||||
for (int i = 0; i < skills.length; i++) {
|
||||
total += skills[i].getMaximumLevel();
|
||||
}
|
||||
return total;
|
||||
@@ -122,6 +131,12 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Gets the combat level for this skill set.
|
||||
*
|
||||
* @return The combat level.
|
||||
*/
|
||||
/**
|
||||
* Gets the combat level for this skill set.
|
||||
*
|
||||
* @return The combat level.
|
||||
*/
|
||||
public int getCombatLevel() {
|
||||
@@ -133,26 +148,22 @@ public final class SkillSet {
|
||||
int ranged = skills[Skill.RANGED].getMaximumLevel();
|
||||
int magic = skills[Skill.MAGIC].getMaximumLevel();
|
||||
|
||||
int combat = (int) (((defence + hitpoints + prayer / 2) * 0.235) + 1);
|
||||
double combatLevel = (defence + hitpoints + Math.floor(prayer / 2)) * 0.25;
|
||||
|
||||
double melee = (attack + strength) * 0.325;
|
||||
double ranger = Math.floor(ranged * 1.5) * 0.325;
|
||||
double mage = Math.floor(magic * 1.5) * 0.325;
|
||||
|
||||
if (melee >= ranger && melee >= mage) {
|
||||
combat += melee;
|
||||
} else if (ranger >= melee && ranger >= mage) {
|
||||
combat += ranger;
|
||||
} else if (mage >= melee && mage >= ranger) {
|
||||
combat += mage;
|
||||
}
|
||||
double range = ranged * 0.4875;
|
||||
|
||||
return combat < 126 ? combat : 126;
|
||||
double mage = magic * 0.4875;
|
||||
|
||||
return (int) (combatLevel + Math.max(melee, Math.max(range, mage)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the minimum experience required for the specified level.
|
||||
* @param level The level.
|
||||
*
|
||||
* @param level
|
||||
* The level.
|
||||
* @return The minimum experience.
|
||||
*/
|
||||
public static double getExperienceForLevel(int level) {
|
||||
@@ -170,7 +181,9 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Gets the minimum level to get the specified experience.
|
||||
* @param experience The experience.
|
||||
*
|
||||
* @param experience
|
||||
* The experience.
|
||||
* @return The minimum level.
|
||||
*/
|
||||
public static int getLevelForExperience(double experience) {
|
||||
@@ -209,9 +222,13 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Sets a skill.
|
||||
* @param id The id.
|
||||
* @param skill The skill.
|
||||
* @throws IndexOutOfBoundsException if the id is out of bounds.
|
||||
*
|
||||
* @param id
|
||||
* The id.
|
||||
* @param skill
|
||||
* The skill.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if the id is out of bounds.
|
||||
*/
|
||||
public void setSkill(int id, Skill skill) {
|
||||
checkBounds(id);
|
||||
@@ -221,8 +238,11 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Checks the bounds of the id.
|
||||
* @param id The id.
|
||||
* @throws IndexOutOfBoundsException if the id is out of bounds.
|
||||
*
|
||||
* @param id
|
||||
* The id.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if the id is out of bounds.
|
||||
*/
|
||||
private void checkBounds(int id) {
|
||||
if (id < 0 || id >= skills.length) {
|
||||
@@ -232,8 +252,11 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Notifies listeners that a skill has been levelled up.
|
||||
* @param id The skill's id.
|
||||
* @throws IndexOutOfBoundsException if the id is out of bounds.
|
||||
*
|
||||
* @param id
|
||||
* The skill's id.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if the id is out of bounds.
|
||||
*/
|
||||
private void notifyLevelledUp(int id) {
|
||||
checkBounds(id);
|
||||
@@ -246,8 +269,11 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Notifies listeners that a skill has been updated.
|
||||
* @param id The skill's id.
|
||||
* @throws IndexOutOfBoundsException if the id is out of bounds.
|
||||
*
|
||||
* @param id
|
||||
* The skill's id.
|
||||
* @throws IndexOutOfBoundsException
|
||||
* if the id is out of bounds.
|
||||
*/
|
||||
private void notifySkillUpdated(int id) {
|
||||
checkBounds(id);
|
||||
@@ -292,7 +318,9 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Adds a listener.
|
||||
* @param listener The listener to add.
|
||||
*
|
||||
* @param listener
|
||||
* The listener to add.
|
||||
*/
|
||||
public void addListener(SkillListener listener) {
|
||||
listeners.add(listener);
|
||||
@@ -300,7 +328,9 @@ public final class SkillSet {
|
||||
|
||||
/**
|
||||
* Removes a listener.
|
||||
* @param listener The listener to remove.
|
||||
*
|
||||
* @param listener
|
||||
* The listener to remove.
|
||||
*/
|
||||
public void removeListener(SkillListener listener) {
|
||||
listeners.remove(listener);
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.util.Queue;
|
||||
|
||||
/**
|
||||
* A queue of {@link Direction}s which a {@link Character} will follow.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class WalkingQueue {
|
||||
@@ -18,6 +19,7 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Represents a single point in the queue.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
private static final class Point {
|
||||
@@ -34,8 +36,11 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Creates a point.
|
||||
* @param position The position.
|
||||
* @param direction The direction.
|
||||
*
|
||||
* @param position
|
||||
* The position.
|
||||
* @param direction
|
||||
* The direction.
|
||||
*/
|
||||
public Point(Position position, Direction direction) {
|
||||
this.position = position;
|
||||
@@ -44,7 +49,8 @@ public final class WalkingQueue {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Point.class.getName() + " [direction=" + direction + ", position=" + position + "]";
|
||||
return Point.class.getName() + " [direction=" + direction
|
||||
+ ", position=" + position + "]";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -71,7 +77,9 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Creates a walking queue for the specified character.
|
||||
* @param character The character.
|
||||
*
|
||||
* @param character
|
||||
* The character.
|
||||
*/
|
||||
public WalkingQueue(Character character) {
|
||||
this.character = character;
|
||||
@@ -106,7 +114,9 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Sets the running queue flag.
|
||||
* @param running The running queue flag.
|
||||
*
|
||||
* @param running
|
||||
* The running queue flag.
|
||||
*/
|
||||
public void setRunningQueue(boolean running) {
|
||||
this.runningQueue = running;
|
||||
@@ -115,9 +125,11 @@ public final class WalkingQueue {
|
||||
/**
|
||||
* Adds the first step to the queue, attempting to connect the server and
|
||||
* client position by looking at the previous queue.
|
||||
* @param clientConnectionPosition The first step.
|
||||
*
|
||||
* @param clientConnectionPosition
|
||||
* The first step.
|
||||
* @return {@code true} if the queues could be connected correctly,
|
||||
* {@code false} if not.
|
||||
* {@code false} if not.
|
||||
*/
|
||||
public boolean addFirstStep(Position clientConnectionPosition) {
|
||||
Position serverPosition = character.getPosition();
|
||||
@@ -163,7 +175,9 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Adds a step to the queue.
|
||||
* @param step The step to add.
|
||||
*
|
||||
* @param step
|
||||
* The step to add.
|
||||
*/
|
||||
public void addStep(Position step) {
|
||||
Point last = getLast();
|
||||
@@ -195,8 +209,11 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Adds a step.
|
||||
* @param x The x coordinate of this step.
|
||||
* @param y The y coordinate of this step.
|
||||
*
|
||||
* @param x
|
||||
* The x coordinate of this step.
|
||||
* @param y
|
||||
* The y coordinate of this step.
|
||||
*/
|
||||
private void addStep(int x, int y) {
|
||||
if (points.size() >= MAXIMUM_SIZE) {
|
||||
@@ -211,7 +228,8 @@ public final class WalkingQueue {
|
||||
Direction direction = Direction.fromDeltas(deltaX, deltaY);
|
||||
|
||||
if (direction != Direction.NONE) {
|
||||
Point p = new Point(new Position(x, y), direction);
|
||||
Point p = new Point(new Position(x, y, character.getPosition()
|
||||
.getHeight()), direction);
|
||||
points.add(p);
|
||||
oldPoints.add(p);
|
||||
}
|
||||
@@ -219,6 +237,7 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Gets the last point.
|
||||
*
|
||||
* @return The last point.
|
||||
*/
|
||||
private Point getLast() {
|
||||
@@ -239,6 +258,7 @@ public final class WalkingQueue {
|
||||
|
||||
/**
|
||||
* Gets the size of the queue.
|
||||
*
|
||||
* @return The size of the queue.
|
||||
*/
|
||||
public int size() {
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.apollo.game.model.def.StaticObjectDefinition;
|
||||
|
||||
/**
|
||||
* Represents a static object in the game world.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class StaticObject {
|
||||
@@ -11,14 +12,25 @@ public final class StaticObject {
|
||||
/**
|
||||
* The object definition.
|
||||
*/
|
||||
private final StaticObjectDefinition def;
|
||||
private final StaticObjectDefinition definition;
|
||||
|
||||
/**
|
||||
* Creates the game object.
|
||||
* @param def The object's definition.
|
||||
*
|
||||
* @param definition
|
||||
* The object's definition.
|
||||
*/
|
||||
public StaticObject(StaticObjectDefinition def) {
|
||||
this.def = def;
|
||||
public StaticObject(StaticObjectDefinition definition) {
|
||||
this.definition = definition;
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Gets the object's definition.
|
||||
*
|
||||
* @return The definition.
|
||||
*/
|
||||
public StaticObjectDefinition getDefinition() {
|
||||
return definition;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -20,17 +20,17 @@ import org.apollo.game.sync.seg.TeleportSegment;
|
||||
import org.apollo.util.CharacterRepository;
|
||||
|
||||
/**
|
||||
* A {@link SynchronizationTask} which synchronizes the specified
|
||||
* {@link Player}.
|
||||
* A {@link SynchronizationTask} which synchronizes the specified {@link Player}
|
||||
* .
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
|
||||
/**
|
||||
* The maximum number of players to load per cycle. This prevents the
|
||||
* update packet from becoming too large (the client uses a 5000 byte
|
||||
* buffer) and also stops old spec PCs from crashing when they login or
|
||||
* teleport.
|
||||
* The maximum number of players to load per cycle. This prevents the update
|
||||
* packet from becoming too large (the client uses a 5000 byte buffer) and
|
||||
* also stops old spec PCs from crashing when they login or teleport.
|
||||
*/
|
||||
private static final int NEW_PLAYERS_PER_CYCLE = 20;
|
||||
|
||||
@@ -41,7 +41,9 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
|
||||
/**
|
||||
* Creates the {@link PlayerSynchronizationTask} for the specified player.
|
||||
* @param player The player.
|
||||
*
|
||||
* @param player
|
||||
* The player.
|
||||
*/
|
||||
public PlayerSynchronizationTask(Player player) {
|
||||
this.player = player;
|
||||
@@ -59,7 +61,7 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
blockSet.remove(ChatBlock.class);
|
||||
}
|
||||
|
||||
if (player.isTeleporting()) {
|
||||
if (player.isTeleporting() || player.hasRegionChanged()) {
|
||||
segment = new TeleportSegment(blockSet, player.getPosition());
|
||||
} else {
|
||||
segment = new MovementSegment(blockSet, player.getDirections());
|
||||
@@ -69,20 +71,25 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
int oldLocalPlayers = localPlayers.size();
|
||||
List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>();
|
||||
|
||||
for (Iterator<Player> it = localPlayers.iterator(); it.hasNext(); ) {
|
||||
for (Iterator<Player> it = localPlayers.iterator(); it.hasNext();) {
|
||||
Player p = it.next();
|
||||
if (!p.isActive() || p.isTeleporting() || p.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
|
||||
if (!p.isActive()
|
||||
|| p.isTeleporting()
|
||||
|| p.getPosition().getLongestDelta(player.getPosition()) > player
|
||||
.getViewingDistance()) {
|
||||
it.remove();
|
||||
segments.add(new RemoveCharacterSegment());
|
||||
} else {
|
||||
segments.add(new MovementSegment(p.getBlockSet(), p.getDirections()));
|
||||
segments.add(new MovementSegment(p.getBlockSet(), p
|
||||
.getDirections()));
|
||||
}
|
||||
}
|
||||
|
||||
int added = 0;
|
||||
|
||||
CharacterRepository<Player> repository = World.getWorld().getPlayerRepository();
|
||||
for (Iterator<Player> it = repository.iterator(); it.hasNext(); ) {
|
||||
CharacterRepository<Player> repository = World.getWorld()
|
||||
.getPlayerRepository();
|
||||
for (Iterator<Player> it = repository.iterator(); it.hasNext();) {
|
||||
Player p = it.next();
|
||||
if (localPlayers.size() >= 255) {
|
||||
player.flagExcessivePlayers();
|
||||
@@ -90,8 +97,12 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
} else if (added >= NEW_PLAYERS_PER_CYCLE) {
|
||||
break;
|
||||
}
|
||||
// we do not check p.isActive() here, since if they are active they must be in the repository
|
||||
if (p != player && p.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance()) && !localPlayers.contains(p)) {
|
||||
// we do not check p.isActive() here, since if they are active they
|
||||
// must be in the repository
|
||||
if (p != player
|
||||
&& p.getPosition().isWithinDistance(player.getPosition(),
|
||||
player.getViewingDistance())
|
||||
&& !localPlayers.contains(p)) {
|
||||
localPlayers.add(p);
|
||||
added++;
|
||||
|
||||
@@ -102,11 +113,14 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
blockSet.add(SynchronizationBlock.createAppearanceBlock(p));
|
||||
}
|
||||
|
||||
segments.add(new AddCharacterSegment(blockSet, p.getIndex(), p.getPosition()));
|
||||
segments.add(new AddCharacterSegment(blockSet, p.getIndex(), p
|
||||
.getPosition()));
|
||||
}
|
||||
}
|
||||
|
||||
PlayerSynchronizationEvent event = new PlayerSynchronizationEvent(lastKnownRegion, player.getPosition(), regionChanged, segment, oldLocalPlayers, segments);
|
||||
PlayerSynchronizationEvent event = new PlayerSynchronizationEvent(
|
||||
lastKnownRegion, player.getPosition(), regionChanged, segment,
|
||||
oldLocalPlayers, segments);
|
||||
player.send(event);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,6 @@ public final class PrePlayerSynchronizationTask extends SynchronizationTask {
|
||||
}
|
||||
|
||||
if (!player.hasLastKnownRegion() || isRegionUpdateRequired()) {
|
||||
player.setTeleporting(true);
|
||||
player.setRegionChanged(true);
|
||||
|
||||
Position position = player.getPosition();
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.xml.sax.SAXException;
|
||||
/**
|
||||
* A class which parses the {@code events.xml} file to produce
|
||||
* {@link EventHandlerChainGroup}s.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class EventHandlerChainParser {
|
||||
@@ -34,8 +35,11 @@ public final class EventHandlerChainParser {
|
||||
|
||||
/**
|
||||
* Creates the event chain parser.
|
||||
* @param is The source {@link InputStream}.
|
||||
* @throws SAXException if a SAX error occurs.
|
||||
*
|
||||
* @param is
|
||||
* The source {@link InputStream}.
|
||||
* @throws SAXException
|
||||
* if a SAX error occurs.
|
||||
*/
|
||||
public EventHandlerChainParser(InputStream is) throws SAXException {
|
||||
this.parser = new XmlParser();
|
||||
@@ -44,15 +48,23 @@ public final class EventHandlerChainParser {
|
||||
|
||||
/**
|
||||
* Parses the XML and produces a group of {@link EventHandlerChain}s.
|
||||
* @throws IOException if an I/O error occurs.
|
||||
* @throws SAXException if a SAX error occurs.
|
||||
* @throws ClassNotFoundException if a class was not found.
|
||||
* @throws IllegalAccessException if a class was accessed illegally.
|
||||
* @throws InstantiationException if a class could not be instantiated.
|
||||
*
|
||||
* @throws IOException
|
||||
* if an I/O error occurs.
|
||||
* @throws SAXException
|
||||
* if a SAX error occurs.
|
||||
* @throws ClassNotFoundException
|
||||
* if a class was not found.
|
||||
* @throws IllegalAccessException
|
||||
* if a class was accessed illegally.
|
||||
* @throws InstantiationException
|
||||
* if a class could not be instantiated.
|
||||
* @return An {@link EventHandlerChainGroup}.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public EventHandlerChainGroup parse() throws IOException, SAXException, ClassNotFoundException, InstantiationException, IllegalAccessException {
|
||||
public EventHandlerChainGroup parse() throws IOException, SAXException,
|
||||
ClassNotFoundException, InstantiationException,
|
||||
IllegalAccessException {
|
||||
XmlNode rootNode = parser.parse(is);
|
||||
if (!rootNode.getName().equals("events")) {
|
||||
throw new IOException("root node name is not 'events'");
|
||||
@@ -62,16 +74,19 @@ public final class EventHandlerChainParser {
|
||||
|
||||
for (XmlNode eventNode : rootNode) {
|
||||
if (!eventNode.getName().equals("event")) {
|
||||
throw new IOException("only expected nodes named 'event' beneath the root node");
|
||||
throw new IOException(
|
||||
"only expected nodes named 'event' beneath the root node");
|
||||
}
|
||||
|
||||
XmlNode typeNode = eventNode.getChild("type");
|
||||
if (typeNode == null) {
|
||||
throw new IOException("no node named 'type' beneath current event node");
|
||||
throw new IOException(
|
||||
"no node named 'type' beneath current event node");
|
||||
}
|
||||
XmlNode chainNode = eventNode.getChild("chain");
|
||||
if (chainNode == null) {
|
||||
throw new IOException("no node named 'chain' beneath current event node");
|
||||
throw new IOException(
|
||||
"no node named 'chain' beneath current event node");
|
||||
}
|
||||
|
||||
String eventClassName = typeNode.getValue();
|
||||
@@ -79,12 +94,14 @@ public final class EventHandlerChainParser {
|
||||
throw new IOException("type node must have a value");
|
||||
}
|
||||
|
||||
Class<? extends Event> eventClass = (Class<? extends Event>) Class.forName(eventClassName);
|
||||
Class<? extends Event> eventClass = (Class<? extends Event>) Class
|
||||
.forName(eventClassName);
|
||||
List<EventHandler<?>> handlers = new ArrayList<EventHandler<?>>();
|
||||
|
||||
for (XmlNode handlerNode : chainNode) {
|
||||
if (!handlerNode.getName().equals("handler")) {
|
||||
throw new IOException("only expected nodes named 'handler' beneath the root node");
|
||||
throw new IOException(
|
||||
"only expected nodes named 'handler' beneath the root node");
|
||||
}
|
||||
|
||||
String handlerClassName = handlerNode.getValue();
|
||||
@@ -92,12 +109,15 @@ public final class EventHandlerChainParser {
|
||||
throw new IOException("handler node must have a value");
|
||||
}
|
||||
|
||||
Class<? extends EventHandler<?>> handlerClass = (Class<? extends EventHandler<?>>) Class.forName(handlerClassName);
|
||||
Class<? extends EventHandler<?>> handlerClass = (Class<? extends EventHandler<?>>) Class
|
||||
.forName(handlerClassName);
|
||||
EventHandler<?> handler = handlerClass.newInstance();
|
||||
handlers.add(handler);
|
||||
}
|
||||
|
||||
EventHandler<?>[] handlersArray = handlers.toArray(new EventHandler<?>[handlers.size()]);
|
||||
EventHandler<?>[] handlersArray = handlers
|
||||
.toArray(new EventHandler<?>[handlers.size()]);
|
||||
@SuppressWarnings("rawtypes")
|
||||
EventHandlerChain<?> chain = new EventHandlerChain(handlersArray);
|
||||
|
||||
chains.put(eventClass, chain);
|
||||
@@ -106,4 +126,4 @@ public final class EventHandlerChainParser {
|
||||
return new EventHandlerChainGroup(chains);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import org.apollo.util.TextUtil;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link ChatEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class ChatEventDecoder extends EventDecoder<ChatEvent> {
|
||||
@@ -18,8 +19,10 @@ public final class ChatEventDecoder extends EventDecoder<ChatEvent> {
|
||||
public ChatEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
|
||||
int effects = (int) reader.getUnsigned(DataType.BYTE, DataTransformation.ADD);
|
||||
int color = (int) reader.getUnsigned(DataType.BYTE, DataTransformation.ADD);
|
||||
int effects = (int) reader.getUnsigned(DataType.BYTE,
|
||||
DataTransformation.SUBTRACT);
|
||||
int color = (int) reader.getUnsigned(DataType.BYTE,
|
||||
DataTransformation.SUBTRACT);
|
||||
int length = packet.getLength() - 2;
|
||||
|
||||
byte[] originalCompressed = new byte[length];
|
||||
@@ -30,9 +33,10 @@ public final class ChatEventDecoder extends EventDecoder<ChatEvent> {
|
||||
uncompressed = TextUtil.capitalize(uncompressed);
|
||||
|
||||
byte[] recompressed = new byte[length];
|
||||
TextUtil.compress(uncompressed, recompressed); // in case invalid data gets sent, this effectively verifies it
|
||||
TextUtil.compress(uncompressed, recompressed);
|
||||
// in case invalid data gets sent, this effectively verifies it
|
||||
|
||||
return new ChatEvent(uncompressed, recompressed, color, effects);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package org.apollo.net.release.r317;
|
||||
|
||||
import org.apollo.game.event.impl.FifthItemActionEvent;
|
||||
import org.apollo.game.event.impl.FourthItemActionEvent;
|
||||
import org.apollo.net.codec.game.DataOrder;
|
||||
import org.apollo.net.codec.game.DataTransformation;
|
||||
import org.apollo.net.codec.game.DataType;
|
||||
@@ -10,18 +9,21 @@ import org.apollo.net.codec.game.GamePacketReader;
|
||||
import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link FourthItemActionEvent}.
|
||||
* An {@link EventDecoder} for the {@link FifthItemActionEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class FifthItemActionEventDecoder extends EventDecoder<FifthItemActionEvent> {
|
||||
public final class FifthItemActionEventDecoder extends
|
||||
EventDecoder<FifthItemActionEvent> {
|
||||
|
||||
@Override
|
||||
public FifthItemActionEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
return new FifthItemActionEvent(interfaceId, id, slot);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -11,17 +11,20 @@ import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link FirstObjectActionEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class FirstObjectActionEventDecoder extends EventDecoder<FirstObjectActionEvent> {
|
||||
public final class FirstObjectActionEventDecoder extends
|
||||
EventDecoder<FirstObjectActionEvent> {
|
||||
|
||||
@Override
|
||||
public FirstObjectActionEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int x = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int y = (int) reader.getUnsigned(DataType.SHORT);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int x = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE,
|
||||
DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT);
|
||||
int y = (int) reader
|
||||
.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
return new FirstObjectActionEvent(id, new Position(x, y));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -32,13 +32,16 @@ import org.apollo.net.release.EventEncoder;
|
||||
|
||||
/**
|
||||
* An {@link EventEncoder} for the {@link PlayerSynchronizationEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class PlayerSynchronizationEventEncoder extends EventEncoder<PlayerSynchronizationEvent> {
|
||||
public final class PlayerSynchronizationEventEncoder extends
|
||||
EventEncoder<PlayerSynchronizationEvent> {
|
||||
|
||||
@Override
|
||||
public GamePacket encode(PlayerSynchronizationEvent event) {
|
||||
GamePacketBuilder builder = new GamePacketBuilder(81, PacketType.VARIABLE_SHORT);
|
||||
GamePacketBuilder builder = new GamePacketBuilder(81,
|
||||
PacketType.VARIABLE_SHORT);
|
||||
builder.switchToBitAccess();
|
||||
|
||||
GamePacketBuilder blockBuilder = new GamePacketBuilder();
|
||||
@@ -53,7 +56,8 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
if (type == SegmentType.REMOVE_CHARACTER) {
|
||||
putRemoveCharacterUpdate(builder);
|
||||
} else if (type == SegmentType.ADD_CHARACTER) {
|
||||
putAddCharacterUpdate((AddCharacterSegment) segment, event, builder);
|
||||
putAddCharacterUpdate((AddCharacterSegment) segment, event,
|
||||
builder);
|
||||
putBlocks(segment, blockBuilder);
|
||||
} else {
|
||||
putMovementUpdate(segment, event, builder);
|
||||
@@ -74,7 +78,9 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
|
||||
/**
|
||||
* Puts a remove character update.
|
||||
* @param builder The builder.
|
||||
*
|
||||
* @param builder
|
||||
* The builder.
|
||||
*/
|
||||
private void putRemoveCharacterUpdate(GamePacketBuilder builder) {
|
||||
builder.putBits(1, 1);
|
||||
@@ -83,11 +89,16 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
|
||||
/**
|
||||
* Puts an add character update.
|
||||
* @param seg The segment.
|
||||
* @param event The event.
|
||||
* @param builder The builder.
|
||||
*
|
||||
* @param seg
|
||||
* The segment.
|
||||
* @param event
|
||||
* The event.
|
||||
* @param builder
|
||||
* The builder.
|
||||
*/
|
||||
private void putAddCharacterUpdate(AddCharacterSegment seg, PlayerSynchronizationEvent event, GamePacketBuilder builder) {
|
||||
private void putAddCharacterUpdate(AddCharacterSegment seg,
|
||||
PlayerSynchronizationEvent event, GamePacketBuilder builder) {
|
||||
boolean updateRequired = seg.getBlockSet().size() > 0;
|
||||
Position player = event.getPosition();
|
||||
Position other = seg.getPosition();
|
||||
@@ -100,11 +111,16 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
|
||||
/**
|
||||
* Puts a movement update for the specified segment.
|
||||
* @param seg The segment.
|
||||
* @param event The event.
|
||||
* @param builder The builder.
|
||||
*
|
||||
* @param seg
|
||||
* The segment.
|
||||
* @param event
|
||||
* The event.
|
||||
* @param builder
|
||||
* The builder.
|
||||
*/
|
||||
private void putMovementUpdate(SynchronizationSegment seg, PlayerSynchronizationEvent event, GamePacketBuilder builder) {
|
||||
private void putMovementUpdate(SynchronizationSegment seg,
|
||||
PlayerSynchronizationEvent event, GamePacketBuilder builder) {
|
||||
boolean updateRequired = seg.getBlockSet().size() > 0;
|
||||
if (seg.getType() == SegmentType.TELEPORT) {
|
||||
Position pos = ((TeleportSegment) seg).getDestination();
|
||||
@@ -140,10 +156,14 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
|
||||
/**
|
||||
* Puts the blocks for the specified segment.
|
||||
* @param segment The segment.
|
||||
* @param blockBuilder The block builder.
|
||||
*
|
||||
* @param segment
|
||||
* The segment.
|
||||
* @param blockBuilder
|
||||
* The block builder.
|
||||
*/
|
||||
private void putBlocks(SynchronizationSegment segment, GamePacketBuilder blockBuilder) {
|
||||
private void putBlocks(SynchronizationSegment segment,
|
||||
GamePacketBuilder blockBuilder) {
|
||||
SynchronizationBlockSet blockSet = segment.getBlockSet();
|
||||
if (blockSet.size() > 0) {
|
||||
int mask = 0;
|
||||
@@ -152,7 +172,7 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
mask |= 0x100;
|
||||
}
|
||||
|
||||
if (blockSet.contains(AnimationBlock.class)){
|
||||
if (blockSet.contains(AnimationBlock.class)) {
|
||||
mask |= 0x8;
|
||||
}
|
||||
|
||||
@@ -180,7 +200,8 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
}
|
||||
|
||||
if (blockSet.contains(AnimationBlock.class)) {
|
||||
putAnimationBlock(blockSet.get(AnimationBlock.class), blockBuilder);
|
||||
putAnimationBlock(blockSet.get(AnimationBlock.class),
|
||||
blockBuilder);
|
||||
}
|
||||
|
||||
if (blockSet.contains(ChatBlock.class)) {
|
||||
@@ -188,67 +209,93 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
}
|
||||
|
||||
if (blockSet.contains(AppearanceBlock.class)) {
|
||||
putAppearanceBlock(blockSet.get(AppearanceBlock.class), blockBuilder);
|
||||
putAppearanceBlock(blockSet.get(AppearanceBlock.class),
|
||||
blockBuilder);
|
||||
}
|
||||
|
||||
if (blockSet.contains(TurnToPositionBlock.class)) {
|
||||
putTurnToPositionBlock(blockSet.get(TurnToPositionBlock.class), blockBuilder);
|
||||
putTurnToPositionBlock(blockSet.get(TurnToPositionBlock.class),
|
||||
blockBuilder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a turn to position block into the specified builder.
|
||||
* @param block The block.
|
||||
* @param blockBuilder The builder.
|
||||
*
|
||||
* @param block
|
||||
* The block.
|
||||
* @param blockBuilder
|
||||
* The builder.
|
||||
*/
|
||||
private void putTurnToPositionBlock(TurnToPositionBlock block, GamePacketBuilder blockBuilder) {
|
||||
private void putTurnToPositionBlock(TurnToPositionBlock block,
|
||||
GamePacketBuilder blockBuilder) {
|
||||
Position pos = block.getPosition();
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD, pos.getX() * 2 + 1);
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE,
|
||||
DataTransformation.ADD, pos.getX() * 2 + 1);
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE, pos.getY() * 2 + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a graphic block into the specified builder.
|
||||
* @param block The block.
|
||||
* @param blockBuilder The builder.
|
||||
*
|
||||
* @param block
|
||||
* The block.
|
||||
* @param blockBuilder
|
||||
* The builder.
|
||||
*/
|
||||
private void putGraphicBlock(GraphicBlock block, GamePacketBuilder blockBuilder) {
|
||||
private void putGraphicBlock(GraphicBlock block,
|
||||
GamePacketBuilder blockBuilder) {
|
||||
Graphic graphic = block.getGraphic();
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE, graphic.getId());
|
||||
blockBuilder.put(DataType.INT, ((graphic.getHeight() >> 16) & 0x0000FFFF) | (graphic.getDelay() & 0xFFFF));
|
||||
blockBuilder.put(DataType.INT,
|
||||
(graphic.getHeight() << 16) | (graphic.getDelay() & 0xFFFF));
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts an animation block into the specified builder.
|
||||
* @param block The block.
|
||||
* @param blockBuilder The builder.
|
||||
*
|
||||
* @param block
|
||||
* The block.
|
||||
* @param blockBuilder
|
||||
* The builder.
|
||||
*/
|
||||
private void putAnimationBlock(AnimationBlock block, GamePacketBuilder blockBuilder) {
|
||||
private void putAnimationBlock(AnimationBlock block,
|
||||
GamePacketBuilder blockBuilder) {
|
||||
Animation animation = block.getAnimation();
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE, animation.getId());
|
||||
blockBuilder.put(DataType.BYTE, DataTransformation.NEGATE, animation.getDelay());
|
||||
blockBuilder.put(DataType.BYTE, DataTransformation.NEGATE,
|
||||
animation.getDelay());
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a chat block into the specified builder.
|
||||
* @param block The block.
|
||||
* @param blockBuilder The builder.
|
||||
*
|
||||
* @param block
|
||||
* The block.
|
||||
* @param blockBuilder
|
||||
* The builder.
|
||||
*/
|
||||
private void putChatBlock(ChatBlock block, GamePacketBuilder blockBuilder) {
|
||||
byte[] bytes = block.getCompressedMessage();
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE, (block.getTextColor() << 8) | block.getTextEffects());
|
||||
blockBuilder.put(DataType.SHORT, DataOrder.LITTLE,
|
||||
(block.getTextColor() << 8) | block.getTextEffects());
|
||||
blockBuilder.put(DataType.BYTE, block.getPrivilegeLevel().toInteger());
|
||||
blockBuilder.put(DataType.BYTE, DataTransformation.NEGATE, bytes.length);
|
||||
blockBuilder
|
||||
.put(DataType.BYTE, DataTransformation.NEGATE, bytes.length);
|
||||
blockBuilder.putBytesReverse(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts an appearance block into the specified builder.
|
||||
* @param block The block.
|
||||
* @param blockBuilder The builder.
|
||||
*
|
||||
* @param block
|
||||
* The block.
|
||||
* @param blockBuilder
|
||||
* The builder.
|
||||
*/
|
||||
private void putAppearanceBlock(AppearanceBlock block, GamePacketBuilder blockBuilder) {
|
||||
private void putAppearanceBlock(AppearanceBlock block,
|
||||
GamePacketBuilder blockBuilder) {
|
||||
Appearance appearance = block.getAppearance();
|
||||
GamePacketBuilder playerProperties = new GamePacketBuilder();
|
||||
|
||||
@@ -323,7 +370,8 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
if (helm != null) {
|
||||
def = EquipmentDefinition.forId(helm.getId());
|
||||
}
|
||||
if ((def != null && (def.isFullHat() || def.isFullMask())) || appearance.getGender() == Gender.FEMALE) {
|
||||
if ((def != null && (def.isFullHat() || def.isFullMask()))
|
||||
|| appearance.getGender() == Gender.FEMALE) {
|
||||
playerProperties.put(DataType.BYTE, 0);
|
||||
} else {
|
||||
playerProperties.put(DataType.SHORT, 0x100 + style[1]);
|
||||
@@ -343,10 +391,14 @@ public final class PlayerSynchronizationEventEncoder extends EventEncoder<Player
|
||||
playerProperties.put(DataType.SHORT, 0x338); // run
|
||||
|
||||
playerProperties.put(DataType.LONG, block.getName());
|
||||
playerProperties.put(DataType.BYTE, block.getCombatLevel()); // combat level
|
||||
playerProperties.put(DataType.SHORT, block.getSkillLevel()); // total skill level
|
||||
playerProperties.put(DataType.BYTE, block.getCombatLevel()); // combat
|
||||
// level
|
||||
playerProperties.put(DataType.SHORT, block.getSkillLevel()); // total
|
||||
// skill
|
||||
// level
|
||||
|
||||
blockBuilder.put(DataType.BYTE, DataTransformation.NEGATE, playerProperties.getLength());
|
||||
blockBuilder.put(DataType.BYTE, DataTransformation.NEGATE,
|
||||
playerProperties.getLength());
|
||||
blockBuilder.putRawBuilder(playerProperties);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.apollo.game.event.impl.OpenInterfaceSidebarEvent;
|
||||
import org.apollo.game.event.impl.PlayerSynchronizationEvent;
|
||||
import org.apollo.game.event.impl.RegionChangeEvent;
|
||||
import org.apollo.game.event.impl.ServerMessageEvent;
|
||||
import org.apollo.game.event.impl.SetInterfaceTextEvent;
|
||||
import org.apollo.game.event.impl.SwitchTabInterfaceEvent;
|
||||
import org.apollo.game.event.impl.UpdateItemsEvent;
|
||||
import org.apollo.game.event.impl.UpdateSkillEvent;
|
||||
@@ -103,6 +104,7 @@ public final class Release317 extends Release {
|
||||
register(UpdateSkillEvent.class, new UpdateSkillEventEncoder());
|
||||
register(OpenInterfaceSidebarEvent.class, new OpenInterfaceSidebarEventEncoder());
|
||||
register(EnterAmountEvent.class, new EnterAmountEventEncoder());
|
||||
register(SetInterfaceTextEvent.class, new SetInterfaceTextEventEncoder());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -10,17 +10,21 @@ import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link SecondItemActionEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class SecondItemActionEventDecoder extends EventDecoder<SecondItemActionEvent> {
|
||||
public final class SecondItemActionEventDecoder extends
|
||||
EventDecoder<SecondItemActionEvent> {
|
||||
|
||||
@Override
|
||||
public SecondItemActionEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE,
|
||||
DataTransformation.ADD);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
return new SecondItemActionEvent(interfaceId, id, slot);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package org.apollo.net.release.r317;
|
||||
|
||||
import org.apollo.game.event.impl.SetInterfaceTextEvent;
|
||||
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.GamePacketBuilder;
|
||||
import org.apollo.net.meta.PacketType;
|
||||
import org.apollo.net.release.EventEncoder;
|
||||
|
||||
/**
|
||||
* An {@link EventEncoder} for the {@link SetInterfaceTextEvent}.
|
||||
*
|
||||
* @author The Wanderer
|
||||
*/
|
||||
public final class SetInterfaceTextEventEncoder extends
|
||||
EventEncoder<SetInterfaceTextEvent> {
|
||||
|
||||
@Override
|
||||
public GamePacket encode(SetInterfaceTextEvent event) {
|
||||
GamePacketBuilder builder = new GamePacketBuilder(126,
|
||||
PacketType.VARIABLE_SHORT);
|
||||
builder.putString(event.getText());
|
||||
builder.put(DataType.SHORT, DataTransformation.ADD,
|
||||
event.getInterfaceId());
|
||||
|
||||
return builder.toGamePacket();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link SwitchItemEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class SwitchItemEventDecoder extends EventDecoder<SwitchItemEvent> {
|
||||
@@ -17,10 +18,14 @@ public final class SwitchItemEventDecoder extends EventDecoder<SwitchItemEvent>
|
||||
@Override
|
||||
public SwitchItemEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
boolean inserting = reader.getUnsigned(DataType.BYTE, DataTransformation.NEGATE) == 1;
|
||||
int oldSlot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int newSlot = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataOrder.LITTLE, DataTransformation.ADD);
|
||||
boolean inserting = reader.getUnsigned(DataType.BYTE,
|
||||
DataTransformation.NEGATE) == 1;
|
||||
int oldSlot = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int newSlot = (int) reader
|
||||
.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
return new SwitchItemEvent(interfaceId, inserting, oldSlot, newSlot);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,17 +10,22 @@ import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link ThirdItemActionEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class ThirdItemActionEventDecoder extends EventDecoder<ThirdItemActionEvent> {
|
||||
public final class ThirdItemActionEventDecoder extends
|
||||
EventDecoder<ThirdItemActionEvent> {
|
||||
|
||||
@Override
|
||||
public ThirdItemActionEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int interfaceId = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataOrder.LITTLE);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataTransformation.ADD);
|
||||
int slot = (int) reader.getUnsigned(DataType.SHORT,
|
||||
DataTransformation.ADD);
|
||||
return new ThirdItemActionEvent(interfaceId, id, slot);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import org.apollo.net.release.Release;
|
||||
|
||||
/**
|
||||
* An implementation of {@link Release} for the 377 protocol.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class Release377 extends Release {
|
||||
@@ -26,94 +27,33 @@ public final class Release377 extends Release {
|
||||
/**
|
||||
* The incoming packet lengths array.
|
||||
*/
|
||||
public static final int[] PACKET_LENGTHS = new int[256];
|
||||
|
||||
/**
|
||||
* Initialises the {@link #PACKET_LENGTHS} array.
|
||||
* TODO make it like the 317 one.
|
||||
*/
|
||||
static {
|
||||
PACKET_LENGTHS[1] = 12;
|
||||
PACKET_LENGTHS[3] = 6;
|
||||
PACKET_LENGTHS[4] = 6;
|
||||
PACKET_LENGTHS[6] = 0;
|
||||
PACKET_LENGTHS[8] = 2;
|
||||
PACKET_LENGTHS[13] = 2;
|
||||
PACKET_LENGTHS[19] = 4;
|
||||
PACKET_LENGTHS[22] = 2;
|
||||
PACKET_LENGTHS[24] = 6;
|
||||
PACKET_LENGTHS[28] = -1;
|
||||
PACKET_LENGTHS[31] = 4;
|
||||
PACKET_LENGTHS[36] = 8;
|
||||
PACKET_LENGTHS[40] = 0;
|
||||
PACKET_LENGTHS[42] = 2;
|
||||
PACKET_LENGTHS[45] = 2;
|
||||
PACKET_LENGTHS[49] = -1;
|
||||
PACKET_LENGTHS[50] = 6;
|
||||
PACKET_LENGTHS[54] = 6;
|
||||
PACKET_LENGTHS[55] = 6;
|
||||
PACKET_LENGTHS[56] = -1;
|
||||
PACKET_LENGTHS[57] = 8;
|
||||
PACKET_LENGTHS[67] = 2;
|
||||
PACKET_LENGTHS[71] = 6;
|
||||
PACKET_LENGTHS[75] = 4;
|
||||
PACKET_LENGTHS[77] = 6;
|
||||
PACKET_LENGTHS[78] = 4;
|
||||
PACKET_LENGTHS[79] = 2;
|
||||
PACKET_LENGTHS[80] = 2;
|
||||
PACKET_LENGTHS[83] = 8;
|
||||
PACKET_LENGTHS[91] = 6;
|
||||
PACKET_LENGTHS[95] = 4;
|
||||
PACKET_LENGTHS[100] = 6;
|
||||
PACKET_LENGTHS[104] = 4;
|
||||
PACKET_LENGTHS[110] = 0;
|
||||
PACKET_LENGTHS[112] = 2;
|
||||
PACKET_LENGTHS[116] = 2;
|
||||
PACKET_LENGTHS[119] = 1;
|
||||
PACKET_LENGTHS[120] = 8;
|
||||
PACKET_LENGTHS[123] = 7;
|
||||
PACKET_LENGTHS[126] = 1;
|
||||
PACKET_LENGTHS[136] = 6;
|
||||
PACKET_LENGTHS[140] = 4;
|
||||
PACKET_LENGTHS[141] = 8;
|
||||
PACKET_LENGTHS[143] = 8;
|
||||
PACKET_LENGTHS[152] = 12;
|
||||
PACKET_LENGTHS[157] = 4;
|
||||
PACKET_LENGTHS[158] = 6;
|
||||
PACKET_LENGTHS[160] = 8;
|
||||
PACKET_LENGTHS[161] = 6;
|
||||
PACKET_LENGTHS[163] = 13;
|
||||
PACKET_LENGTHS[165] = 1;
|
||||
PACKET_LENGTHS[168] = 0;
|
||||
PACKET_LENGTHS[171] = -1;
|
||||
PACKET_LENGTHS[173] = 3;
|
||||
PACKET_LENGTHS[176] = 3;
|
||||
PACKET_LENGTHS[177] = 6;
|
||||
PACKET_LENGTHS[181] = 6;
|
||||
PACKET_LENGTHS[184] = 10;
|
||||
PACKET_LENGTHS[187] = 1;
|
||||
PACKET_LENGTHS[194] = 2;
|
||||
PACKET_LENGTHS[197] = 4;
|
||||
PACKET_LENGTHS[202] = 0;
|
||||
PACKET_LENGTHS[203] = 6;
|
||||
PACKET_LENGTHS[206] = 8;
|
||||
PACKET_LENGTHS[210] = 8;
|
||||
PACKET_LENGTHS[211] = 12;
|
||||
PACKET_LENGTHS[213] = -1;
|
||||
PACKET_LENGTHS[217] = 8;
|
||||
PACKET_LENGTHS[222] = 3;
|
||||
PACKET_LENGTHS[226] = 2;
|
||||
PACKET_LENGTHS[227] = 9;
|
||||
PACKET_LENGTHS[228] = 6;
|
||||
PACKET_LENGTHS[230] = 6;
|
||||
PACKET_LENGTHS[231] = 6;
|
||||
PACKET_LENGTHS[233] = 2;
|
||||
PACKET_LENGTHS[241] = 6;
|
||||
PACKET_LENGTHS[244] = -1;
|
||||
PACKET_LENGTHS[245] = 2;
|
||||
PACKET_LENGTHS[247] = -1;
|
||||
PACKET_LENGTHS[248] = 0;
|
||||
}
|
||||
public static final int[] PACKET_LENGTHS = { 0, 12, 0, 6, 6, 0, 0, 0, 2, 0, // 0
|
||||
0, 0, 0, 2, 0, 0, 0, 0, 0, 4, // 10
|
||||
0, 0, 2, 0, 6, 0, 0, 0, -1, 0, // 20
|
||||
0, 4, 0, 0, 0, 0, 8, 0, 0, 0, // 30
|
||||
0, 0, 2, 0, 0, 2, 0, 0, 0, -1, // 40
|
||||
6, 0, 0, 0, 6, 6, -1, 8, 0, 0, // 50
|
||||
0, 0, 0, 0, 0, 0, 0, 2, 0, 0, // 60
|
||||
0, 6, 0, 0, 0, 4, 0, 6, 4, 2, // 70
|
||||
2, 0, 0, 8, 0, 0, 0, 0, 0, 0, // 80
|
||||
0, 6, 0, 0, 0, 4, 0, 0, 0, 0, // 90
|
||||
6, 0, 0, 0, 4, 0, 0, 0, 0, 0, // 100
|
||||
0, 0, 2, 0, 0, 0, 2, 0, 0, 1, // 110
|
||||
8, 0, 0, 7, 0, 0, 1, 0, 0, 0, // 120
|
||||
0, 0, 0, 0, 0, 0, 6, 0, 0, 0, // 130
|
||||
4, 8, 0, 8, 0, 0, 0, 0, 0, 0, // 140
|
||||
0, 0, 12, 0, 0, 0, 0, 4, 6, 0, // 150
|
||||
8, 6, 0, 13, 0, 1, 0, 0, 0, 0, // 160
|
||||
0, -1, 0, 3, 0, 0, 3, 6, 0, 0, // 170
|
||||
0, 6, 0, 0, 10, 0, 0, 1, 0, 0, // 180
|
||||
0, 0, 0, 0, 2, 0, 0, 4, 0, 0, // 190
|
||||
0, 0, 0, 6, 0, 0, 8, 0, 0, 0, // 200
|
||||
8, 12, 0, -1, 0, 0, 0, 8, 0, 0, // 210
|
||||
0, 0, 3, 0, 0, 0, 2, 9, 6, 0, // 220
|
||||
6, 6, 0, 2, 0, 0, 0, 0, 0, 0, // 230
|
||||
0, 6, 0, 0, -1, 2, 0, -1, 0, 0, // 240
|
||||
0, 0, 0, 0, 0, 0 // 250
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates and initialises this release.
|
||||
@@ -154,17 +94,22 @@ public final class Release377 extends Release {
|
||||
register(IdAssignmentEvent.class, new IdAssignmentEventEncoder());
|
||||
register(RegionChangeEvent.class, new RegionChangeEventEncoder());
|
||||
register(ServerMessageEvent.class, new ServerMessageEventEncoder());
|
||||
register(PlayerSynchronizationEvent.class, new PlayerSynchronizationEventEncoder());
|
||||
register(PlayerSynchronizationEvent.class,
|
||||
new PlayerSynchronizationEventEncoder());
|
||||
register(OpenInterfaceEvent.class, new OpenInterfaceEventEncoder());
|
||||
register(CloseInterfaceEvent.class, new CloseInterfaceEventEncoder());
|
||||
register(SwitchTabInterfaceEvent.class, new SwitchTabInterfaceEventEncoder());
|
||||
register(SwitchTabInterfaceEvent.class,
|
||||
new SwitchTabInterfaceEventEncoder());
|
||||
register(LogoutEvent.class, new LogoutEventEncoder());
|
||||
register(UpdateItemsEvent.class, new UpdateItemsEventEncoder());
|
||||
register(UpdateSlottedItemsEvent.class, new UpdateSlottedItemsEventEncoder());
|
||||
register(UpdateSlottedItemsEvent.class,
|
||||
new UpdateSlottedItemsEventEncoder());
|
||||
register(UpdateSkillEvent.class, new UpdateSkillEventEncoder());
|
||||
register(OpenInterfaceSidebarEvent.class, new OpenInterfaceSidebarEventEncoder());
|
||||
register(OpenInterfaceSidebarEvent.class,
|
||||
new OpenInterfaceSidebarEventEncoder());
|
||||
register(EnterAmountEvent.class, new EnterAmountEventEncoder());
|
||||
register(SetInterfaceTextEvent.class, new SetInterfaceTextEventEncoder());
|
||||
register(SetInterfaceTextEvent.class,
|
||||
new SetInterfaceTextEventEncoder());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,16 +11,20 @@ import org.apollo.net.release.EventDecoder;
|
||||
|
||||
/**
|
||||
* An {@link EventDecoder} for the {@link ThirdObjectActionEvent}.
|
||||
*
|
||||
* @author Graham
|
||||
*/
|
||||
public final class ThirdObjectActionEventDecoder extends EventDecoder<ThirdObjectActionEvent> {
|
||||
public final class ThirdObjectActionEventDecoder extends
|
||||
EventDecoder<ThirdObjectActionEvent> {
|
||||
|
||||
@Override
|
||||
public ThirdObjectActionEvent decode(GamePacket packet) {
|
||||
GamePacketReader reader = new GamePacketReader(packet);
|
||||
int y = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int x = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE, DataTransformation.ADD);
|
||||
int y = (int) reader
|
||||
.getUnsigned(DataType.SHORT, DataTransformation.ADD);
|
||||
int id = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE);
|
||||
int x = (int) reader.getUnsigned(DataType.SHORT, DataOrder.LITTLE,
|
||||
DataTransformation.ADD);
|
||||
return new ThirdObjectActionEvent(id, new Position(x, y));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.apollo.tools;
|
||||
|
||||
/**
|
||||
* Contains equipment name constants.
|
||||
*
|
||||
* @author Graham
|
||||
* @author Palidino76
|
||||
*/
|
||||
@@ -10,75 +11,100 @@ public final class EquipmentConstants {
|
||||
/**
|
||||
* Capes.
|
||||
*/
|
||||
public static final String[] CAPES = {"cape","Cape"};
|
||||
public static final String[] CAPES = { "cape", "Cape" };
|
||||
|
||||
/**
|
||||
* Hats.
|
||||
*/
|
||||
public static final String[] HATS = {"helm","hood","coif","Coif","hat","partyhat","Hat","full helm (t)","full helm (g)","hat (t)","hat (g)","cav","boater","helmet","mask","Helm of neitiznot"};
|
||||
public static final String[] HATS = { "helm", "hood", "coif", "Coif",
|
||||
"hat", "partyhat", "Hat", "full helm (t)", "full helm (g)",
|
||||
"hat (t)", "hat (g)", "cav", "boater", "helmet", "mask",
|
||||
"Helm of neitiznot" };
|
||||
|
||||
/**
|
||||
* Boots.
|
||||
*/
|
||||
public static final String[] BOOTS = {"boots","Boots"};
|
||||
public static final String[] BOOTS = { "boots", "Boots" };
|
||||
|
||||
/**
|
||||
* Gloves.
|
||||
*/
|
||||
public static final String[] GLOVES = {"gloves","gauntlets","Gloves","vambraces","vamb","bracers"};
|
||||
public static final String[] GLOVES = { "gloves", "gauntlets", "Gloves",
|
||||
"vambraces", "vamb", "bracers" };
|
||||
|
||||
/**
|
||||
* Shields.
|
||||
*/
|
||||
public static final String[] SHIELDS = {"kiteshield","sq shield","Toktz-ket","books","book","kiteshield (t)","kiteshield (g)","kiteshield(h)","defender","shield"};
|
||||
public static final String[] SHIELDS = { "kiteshield", "sq shield",
|
||||
"Toktz-ket", "books", "book", "kiteshield (t)", "kiteshield (g)",
|
||||
"kiteshield(h)", "defender", "shield" };
|
||||
|
||||
/**
|
||||
* Amulets.
|
||||
*/
|
||||
public static final String[] AMULETS = {"amulet","necklace","Amulet of"};
|
||||
public static final String[] AMULETS = { "amulet", "necklace", "Amulet of" };
|
||||
|
||||
/**
|
||||
* Arrows.
|
||||
*/
|
||||
public static final String[] ARROWS = {"arrow","arrows","arrow(p)","arrow(+)","arrow(s)","bolt","Bolt rack","Opal bolts","Dragon bolts"};
|
||||
public static final String[] ARROWS = { "arrow", "arrows", "arrow(p)",
|
||||
"arrow(+)", "arrow(s)", "bolt", "Bolt rack", "Opal bolts",
|
||||
"Dragon bolts" };
|
||||
|
||||
/**
|
||||
* Rings.
|
||||
*/
|
||||
public static final String[] RINGS = {"ring"};
|
||||
public static final String[] RINGS = { "ring", "Ring of" };
|
||||
|
||||
/**
|
||||
* Bodies.
|
||||
*/
|
||||
public static final String[] BODY = {"platebody","chainbody","robetop","leathertop","platemail","top","brassard","Robe top","body","platebody (t)","platebody (g)","body(g)","body_(g)","chestplate","torso","shirt"};
|
||||
public static final String[] BODY = { "platebody", "chainbody", "robetop",
|
||||
"leathertop", "platemail", "top", "brassard", "Robe top", "body",
|
||||
"platebody (t)", "platebody (g)", "body(g)", "body_(g)",
|
||||
"chestplate", "torso", "shirt" };
|
||||
|
||||
/**
|
||||
* Legs.
|
||||
*/
|
||||
public static final String[] LEGS = {"platelegs","plateskirt","skirt","bottoms","chaps","platelegs (t)","platelegs (g)","bottom","skirt","skirt (g)","skirt (t)","chaps (g)","chaps (t)","tassets","legs","Flared trousers"};
|
||||
public static final String[] LEGS = { "platelegs", "plateskirt", "skirt",
|
||||
"bottoms", "chaps", "platelegs (t)", "platelegs (g)", "bottom",
|
||||
"skirt", "skirt (g)", "skirt (t)", "chaps (g)", "chaps (t)",
|
||||
"tassets", "legs", "Flared trousers" };
|
||||
|
||||
/**
|
||||
* Weapons.
|
||||
*/
|
||||
public static final String[] WEAPONS = {"scimitar","longsword","sword","longbow","shortbow","dagger","mace","halberd","spear",
|
||||
"Abyssal whip","axe","flail","crossbow","Torags hammers","dagger(p)","dagger(+)","dagger(s)","spear(p)","spear(+)",
|
||||
"spear(s)","spear(kp)","maul","dart","dart(p)","javelin","javelin(p)","knife","knife(p)","Longbow","Shortbow",
|
||||
"Crossbow","Toktz-xil","Toktz-mej","Tzhaar-ket","staff","Staff","godsword","c'bow","Crystal bow","Dark bow", "Magic butterfly net"};
|
||||
public static final String[] WEAPONS = { "scimitar", "longsword", "sword",
|
||||
"longbow", "shortbow", "dagger", "mace", "halberd", "spear",
|
||||
"Abyssal whip", "axe", "flail", "crossbow", "Torags hammers",
|
||||
"dagger(p)", "dagger(+)", "dagger(s)", "spear(p)", "spear(+)",
|
||||
"spear(s)", "spear(kp)", "maul", "dart", "dart(p)", "javelin",
|
||||
"javelin(p)", "knife", "knife(p)", "Longbow", "Shortbow",
|
||||
"Crossbow", "Toktz-xil", "Toktz-mej", "Tzhaar-ket", "staff",
|
||||
"Staff", "godsword", "c'bow", "Crystal bow", "Dark bow",
|
||||
"Magic butterfly net" };
|
||||
|
||||
/**
|
||||
* Full bodies.
|
||||
*/
|
||||
public static final String[] FULL_BODIES = {"top","shirt","platebody","Ahrims robetop","Karils leathertop","brassard","Robe top","robetop","platebody (t)","platebody (g)","chestplate","torso"};
|
||||
public static final String[] FULL_BODIES = { "top", "shirt", "platebody",
|
||||
"Ahrims robetop", "Karils leathertop", "brassard", "Robe top",
|
||||
"robetop", "platebody (t)", "platebody (g)", "chestplate", "torso" };
|
||||
|
||||
/**
|
||||
* Full hats.
|
||||
*/
|
||||
public static final String[] FULL_HATS = {"med helm","coif","Dharoks helm","hood","Initiate helm","Coif","Helm of neitiznot"};
|
||||
public static final String[] FULL_HATS = { "med helm", "coif",
|
||||
"Dharoks helm", "hood", "Initiate helm", "Coif",
|
||||
"Helm of neitiznot" };
|
||||
|
||||
/**
|
||||
* Full masks.
|
||||
*/
|
||||
public static final String[] FULL_MASKS = {"full helm","mask","Veracs helm","Guthans helm","Torags helm","Karils coif","full helm (t)","full helm (g)","mask"};
|
||||
public static final String[] FULL_MASKS = { "full helm", "mask",
|
||||
"Veracs helm", "Guthans helm", "Torags helm", "Karils coif",
|
||||
"full helm (t)", "full helm (g)", "mask" };
|
||||
|
||||
/**
|
||||
* Default private construcotr to prevent instantiation.
|
||||
|
||||
Reference in New Issue
Block a user