From bbe1587e20c39251438922e7a1a5631d9ea884a2 Mon Sep 17 00:00:00 2001 From: Danial Date: Fri, 1 Oct 2021 10:25:48 +1300 Subject: [PATCH] Mage Training Arena and stuff (#504) * Fixup door/stairs in mage training arena * Fixup bedsheets, should be worn on head, not weapon slot * [Mage Training Arena] spawn rewards guardian * [Mage Training Arena] Add arena teleports (non functioning) * Just adding some comments * [Mage Training Arena] Basic mage training arena stuff * [Mage Training Arena] Allow shop to open and show items correctly * [Mage Training Arena] Show shop prices when clicked * noclip * [Mage Training Arena] Add 2nd option handler (filler) * [Mage Training Arena] Be able to purchase stuff, lock bones to peaches * Update MageArena.java * [Mage Training Arena] setup boundary * Readability * Tidy up enchanting * MageArena -> MageTrainingArena * Create Alchemy.java * Update RSInterface.java * [Mage Training Arena] Spawn entrance npcs * [Mage Training Arena] Initial Alchemy * [Mage Training Arena] Add comments * [Mage Training Arena] Handle alchemy while in arena * [Mage Training Arena] Show interface for alchemy room * [Mage Training Arena] Display values, Search cupboards * [Mage Training Arena] Don't allow the player to wear items from the Alchemy game * [Mage Training Arena] Announce when items are changing * Don't allow the player to bring any coins with them * Sort by values * [Mage Training Arena] Allow alching items etc * Update method name * Show magic tab after using alch even if can't alch * [Mage Training Arena] Coin collector - temp * [Mage Training Arena] Give player points, take items, add bonus xp, add bank items * [Mage Training Arena] Remove items when player leaves the alchemy training area * Fixup staffs for runes, Tidy up checks Was missing all Mystic staff --- .../src/main/java/CollisionMap.java | 2 + 2006Scape Client/src/main/java/Game.java | 6 + 2006Scape Server/data/cfg/spawns.json | 52 +++- .../src/main/java/com/rs2/GameEngine.java | 2 + .../game/content/combat/magic/Enchanting.java | 62 ++-- .../combat/magic/MagicRequirements.java | 43 +-- .../rs2/game/content/minigames/MageArena.java | 267 ---------------- .../minigames/magetrainingarena/Alchemy.java | 148 +++++++++ .../magetrainingarena/Enchanting.java | 36 +++ .../magetrainingarena/MageTrainingArena.java | 288 ++++++++++++++++++ .../content/skills/smithing/Superheat.java | 2 +- .../com/rs2/game/items/ItemAssistant.java | 3 + .../java/com/rs2/game/items/ItemData.java | 11 +- .../java/com/rs2/game/npcs/NpcActions.java | 6 +- .../com/rs2/game/objects/ObjectsActions.java | 60 +++- .../java/com/rs2/game/players/Player.java | 19 +- .../com/rs2/game/players/PlayerAssistant.java | 172 ++++++----- .../java/com/rs2/game/players/PlayerSave.java | 26 ++ .../main/java/com/rs2/net/PacketSender.java | 4 +- .../java/com/rs2/net/packets/impl/Bank5.java | 4 + .../rs2/net/packets/impl/ClickingButtons.java | 12 +- .../com/rs2/net/packets/impl/RemoveItem.java | 3 + .../src/main/java/com/rs2/world/Boundary.java | 11 + 23 files changed, 821 insertions(+), 418 deletions(-) delete mode 100644 2006Scape Server/src/main/java/com/rs2/game/content/minigames/MageArena.java create mode 100644 2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Alchemy.java create mode 100644 2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Enchanting.java create mode 100644 2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/MageTrainingArena.java diff --git a/2006Scape Client/src/main/java/CollisionMap.java b/2006Scape Client/src/main/java/CollisionMap.java index 5cfba680..a51ef2d4 100644 --- a/2006Scape Client/src/main/java/CollisionMap.java +++ b/2006Scape Client/src/main/java/CollisionMap.java @@ -525,6 +525,8 @@ final class CollisionMap { return false; } + // Something to do with moving to objects/npcs etc when clicked on + // Maybe checking distance? public boolean method221(int i, int j, int k, int l, int i1, int j1, int k1) { int l1 = j + j1 - 1; int i2 = i + l - 1; diff --git a/2006Scape Client/src/main/java/Game.java b/2006Scape Client/src/main/java/Game.java index 92c29a5f..59042944 100644 --- a/2006Scape Client/src/main/java/Game.java +++ b/2006Scape Client/src/main/java/Game.java @@ -5015,11 +5015,17 @@ public class Game extends RSApplet { definitionSearch(searchString, searchType); } } + // submitted string if ((j == 13 || j == 10) && inputString.length() > 0) { if (inputString.equals("::gfxtgl") || inputString.equals("::tglgfx") || inputString.equals("::togglerender") || inputString.equals("::togglegfx")) { graphicsEnabled = !graphicsEnabled; } if (myPrivilege >= 0) { + if(inputString.equals("::noclip")) + for(int k1 = 0; k1 < 4; k1++) + for(int i2 = 1; i2 < 103; i2++) + for(int k2 = 1; k2 < 103; k2++) + aClass11Array1230[k1].anIntArrayArray294[i2][k2] = 0; if (inputString.equals("::clientdrop")) { dropClient(); } diff --git a/2006Scape Server/data/cfg/spawns.json b/2006Scape Server/data/cfg/spawns.json index 7877ba72..1194b20a 100644 --- a/2006Scape Server/data/cfg/spawns.json +++ b/2006Scape Server/data/cfg/spawns.json @@ -24103,7 +24103,7 @@ "walk": 1, "height": 0 }, - { + { "maxHit": 0, "strength": 0, "attack": 0, @@ -24112,5 +24112,55 @@ "id": 1320, "walk": 1, "height": 0 + }, + { + "maxHit": 0, + "strength": 0, + "attack": 0, + "x": 3363, + "y": 3318, + "id": 3103, + "walk": 1, + "height": 1 + }, + { + "maxHit": 0, + "strength": 0, + "attack": 0, + "x": 3363, + "y": 3304, + "id": 3097, + "walk": 1, + "height": 0 + }, + { + "maxHit": 0, + "strength": 0, + "attack": 0, + "x": 3363, + "y": 3306, + "id": 3095, + "walk": 1, + "height": 0 + }, + { + "maxHit": 0, + "strength": 0, + "attack": 0, + "x": 3363, + "y": 3302, + "id": 3094, + "walk": 1, + "height": 0 + }, + { + "maxHit": 0, + "strength": 0, + "attack": 0, + "x": 3365, + "y": 9627, + "id": 3099, + "walk": 1, + "height": 2 } ] diff --git a/2006Scape Server/src/main/java/com/rs2/GameEngine.java b/2006Scape Server/src/main/java/com/rs2/GameEngine.java index 98da5729..5903abb1 100644 --- a/2006Scape Server/src/main/java/com/rs2/GameEngine.java +++ b/2006Scape Server/src/main/java/com/rs2/GameEngine.java @@ -22,6 +22,7 @@ import com.rs2.game.content.minigames.FightCaves; import com.rs2.game.content.minigames.FightPits; import com.rs2.game.content.minigames.PestControl; import com.rs2.game.content.minigames.castlewars.CastleWars; +import com.rs2.game.content.minigames.magetrainingarena.MageTrainingArena; import com.rs2.game.content.minigames.trawler.Trawler; import com.rs2.game.globalworldobjects.Doors; import com.rs2.game.globalworldobjects.DoubleDoors; @@ -232,6 +233,7 @@ public class GameEngine { FightPits.process(); pestControl.process(); objectHandler.process(); + MageTrainingArena.process(); CycleEventHandler.getSingleton().process(); PlayersOnlineWebsite.addUpdatePlayersOnlineTask(); if(GameConstants.WEBSITE_TOTAL_CHARACTERS_INTEGRATION) { diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/Enchanting.java b/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/Enchanting.java index 8e8f4c20..73c995a3 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/Enchanting.java +++ b/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/Enchanting.java @@ -97,11 +97,12 @@ public class Enchanting { } private enum EnchantSpell { - - SAPPHIRE(1155, 555, 1, 564, 1, -1, 0), EMERALD(1165, 556, 3, 564, 1, - -1, 0), RUBY(1176, 554, 5, 564, 1, -1, 0), DIAMOND(1180, 557, - 10, 564, 1, -1, 0), DRAGONSTONE(1187, 555, 15, 557, 15, 564, 1), ONYX( - 6003, 557, 20, 554, 20, 564, 1); + SAPPHIRE(1155, 555, 1, 564, 1, -1, 0), + EMERALD(1165, 556, 3, 564, 1, -1, 0), + RUBY(1176, 554, 5, 564, 1, -1, 0), + DIAMOND(1180, 557, 10, 564, 1, -1, 0), + DRAGONSTONE(1187, 555, 15, 557, 15, 564, 1), + ONYX(6003, 557, 20, 554, 20, 564, 1); int spell, reqRune1, reqAmtRune1, reqRune2, reqAmtRune2, reqRune3, reqAmtRune3; @@ -195,36 +196,33 @@ public class Enchanting { Enchant enc = Enchant.forId(itemID); EnchantSpell ens = EnchantSpell.forId(spellID); if (enc == null || ens == null) { - return; } - if (c.playerLevel[GameConstants.MAGIC] >= enc.getLevelReq()) { - if (c.getItemAssistant().playerHasItem(enc.getUnenchanted(), 1)) { - if(CastRequirements.hasRunes(c, getRequiredRunes(ens))){ - if (getEnchantmentLevel(spellID) == enc.getELevel()) { - c.getItemAssistant().deleteItem(enc.getUnenchanted(), 1); - c.getItemAssistant().addItem(enc.getEnchanted(), 1); - c.getPlayerAssistant().addSkillXP(enc.getXp(), - GameConstants.MAGIC); - CastRequirements.deleteRunes(c, getRequiredRunes(ens)); - c.startAnimation(enc.getAnim()); - c.gfx100(enc.getGFX()); - c.getPacketSender().sendFrame106(6); - } else { - c.getPacketSender().sendMessage( - "You can only enchant this jewelery using a level-" - + enc.getELevel() - + " enchantment spell!"); - } - } else { - c.getPacketSender().sendMessage( - "You do not have enough runes to cast this spell."); - } - } - } else { + if (c.playerLevel[GameConstants.MAGIC] < enc.getLevelReq()) { c.getPacketSender().sendMessage( - "You need a magic level of at least " + enc.getLevelReq() - + " to cast this spell."); + "You need a magic level of at least " + + enc.getLevelReq() + " to cast this spell."); + return; } + if (!c.getItemAssistant().playerHasItem(enc.getUnenchanted(), 1)) { + return; + } + if(!CastRequirements.hasRunes(c, getRequiredRunes(ens))){ + c.getPacketSender().sendMessage("You do not have enough runes to cast this spell."); + return; + } + if (getEnchantmentLevel(spellID) != enc.getELevel()) { + c.getPacketSender().sendMessage( + "You can only enchant this jewelery using a level-" + + enc.getELevel() + " enchantment spell!"); + return; + } + // Everything is fine, Enchant the item + c.getItemAssistant().replaceItem(enc.getUnenchanted(), enc.getEnchanted()); + c.getPlayerAssistant().addSkillXP(enc.getXp(), GameConstants.MAGIC); + CastRequirements.deleteRunes(c, getRequiredRunes(ens)); + c.startAnimation(enc.getAnim()); + c.gfx100(enc.getGFX()); + c.getPacketSender().sendShowTab(6); } } diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/MagicRequirements.java b/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/MagicRequirements.java index 3da49653..efb6845b 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/MagicRequirements.java +++ b/2006Scape Server/src/main/java/com/rs2/game/content/combat/magic/MagicRequirements.java @@ -10,23 +10,23 @@ public class MagicRequirements { public static boolean wearingStaff(Player player, int runeId) { int wep = player.playerEquipment[player.playerWeapon]; switch (runeId) { - case 554: - if (wep == 1387 || wep == 1393 || wep == 3053) { + case 554: // Fire runes + if (wep == 1387 || wep == 1393 || wep == 1401 || wep == 3053 || wep == 3054) { return true; } break; - case 555: - if (wep == 1383 || wep == 1395 || wep == 6562) { + case 555: // Water runes + if (wep == 1383 || wep == 1395 || wep == 1403 || wep == 6562 || wep == 6563) { return true; } break; - case 556: - if (wep == 1381 || wep == 1397) { + case 556: // Air runes + if (wep == 1381 || wep == 1397 || wep == 1405) { return true; } break; - case 557: - if (wep == 1385 || wep == 1399 || wep == 3053 || wep == 6562) { + case 557: // Earth runes + if (wep == 1385 || wep == 1399 || wep == 3053 || wep == 3054 || wep == 6562 || wep == 6563) { return true; } break; @@ -35,26 +35,15 @@ public class MagicRequirements { } public static boolean checkMagicReqs(Player c, int spell) { + int[] spellData = MagicData.MAGIC_SPELLS[spell]; if (c.usingMagic && MagicTeleports.RUNES_REQUIRED) { // check for runes - if (!c.getItemAssistant().playerHasItem( - MagicData.MAGIC_SPELLS[spell][8], - MagicData.MAGIC_SPELLS[spell][9]) - && !wearingStaff(c, MagicData.MAGIC_SPELLS[spell][8]) - || !c.getItemAssistant().playerHasItem( - MagicData.MAGIC_SPELLS[spell][10], - MagicData.MAGIC_SPELLS[spell][11]) - && !wearingStaff(c, MagicData.MAGIC_SPELLS[spell][10]) - || !c.getItemAssistant().playerHasItem( - MagicData.MAGIC_SPELLS[spell][12], - MagicData.MAGIC_SPELLS[spell][13]) - && !wearingStaff(c, MagicData.MAGIC_SPELLS[spell][12]) - || !c.getItemAssistant().playerHasItem( - MagicData.MAGIC_SPELLS[spell][14], - MagicData.MAGIC_SPELLS[spell][15]) - && !wearingStaff(c, MagicData.MAGIC_SPELLS[spell][14])) { - c.getPacketSender() - .sendMessage( - "You don't have the required runes to cast this spell."); + if ( + !c.getItemAssistant().playerHasItem(spellData[8], spellData[9]) && !wearingStaff(c, spellData[8]) + || !c.getItemAssistant().playerHasItem(spellData[10], spellData[11]) && !wearingStaff(c, spellData[10]) + || !c.getItemAssistant().playerHasItem(spellData[12], spellData[13]) && !wearingStaff(c, spellData[12]) + || !c.getItemAssistant().playerHasItem(spellData[14], spellData[15]) && !wearingStaff(c, spellData[14]) + ) { + c.getPacketSender().sendMessage("You don't have the required runes to cast this spell."); return false; } } diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/minigames/MageArena.java b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/MageArena.java deleted file mode 100644 index ba9e3c47..00000000 --- a/2006Scape Server/src/main/java/com/rs2/game/content/minigames/MageArena.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * To change this template, choose Tools | Templates and open the template in - * the editor. - */ - -package com.rs2.game.content.minigames; - -import com.rs2.game.items.ItemAssistant; -import com.rs2.game.players.Client; - -/** - * @author D - */ -public class MageArena { - - private final Client c; - - public MageArena(Client c) { - this.c = c; - } - - private final int telePoints = 0; - private final int enchantPoints = 0; - private final int gravePoints = 0; - private final int alchPoints = 0; - - private final int[] shopItems = { 6908, 6910, 6912, 6914, 6916, 6918, 6920, - 6922, 6924, 6889, 6926, 1391, 4695, 4696, 4698, 4697, 4694, 4699, - 564, 561, 560, 563, 565, 6891 }; - - private final String[] interfaceText = { "Magic Training Arena Shop", - "Telekinetic Pizazz Points", "Enchantment Pizazz Points", - "Graveyard Pizazz Points", "Alchemist Pizazz Points" }; - - public void openShop() { - - for (int i = 0; i < shopItems.length; i++) { - c.getPacketSender().sendFrame34(15948, shopItems[i], i, 100); - } - - for (int i = 15950; i < interfaceText.length; i++) { - c.getPacketSender().sendString(interfaceText[i - 15950], i); - } - - c.getPacketSender().sendString(Integer.toString(telePoints), 15955); - c.getPacketSender().sendString(Integer.toString(enchantPoints), - 15956); - c.getPacketSender().sendString(Integer.toString(gravePoints), 15957); - c.getPacketSender().sendString(Integer.toString(alchPoints), 15958); - c.getPacketSender().showInterface(15944); - } - - public int getTelVal(int itemId) { - - switch (itemId) { - case 6922: - return 175; - case 6918: - return 350; - case 6916: - return 400; - case 6924: - return 450; - case 6920: - return 120; - case 1391: - return 1; - case 6908: - return 30; - case 6910: - return 60; - case 6912: - return 60; - case 6914: - return 150; - case 6889: - return 500; - case 6926: - return 200; - - case 4695: - case 4694: - case 4696: - case 4697: - case 4698: - case 4699: - return 1; - - case 564: - case 561: - return 0; - - case 560: - case 563: - case 565: - return 2; - - default: - return 1; - - } - } - - public int getAlchVal(int itemId) { - - switch (itemId) { - case 6922: - return 225; - case 6918: - return 400; - case 6916: - return 450; - case 6924: - return 500; - case 6920: - return 120; - case 1391: - return 2; - case 6908: - return 30; - case 6910: - return 60; - case 6912: - return 200; - case 6914: - return 240; - case 6889: - return 550; - case 6926: - return 300; - - case 4695: - case 4694: - case 4696: - case 4697: - case 4698: - case 4699: - return 1; - - case 564: - case 561: - return 1; - - case 560: - case 563: - case 565: - return 2; - - default: - return 1; - - } - } - - public int getEnchVal(int itemId) { - - switch (itemId) { - case 6922: - return 1300; - case 6918: - return 3000; - case 6916: - return 4000; - case 6924: - return 5000; - case 6920: - return 1200; - case 1391: - return 20; - case 6908: - return 300; - case 6910: - return 600; - case 6912: - return 1500; - case 6914: - return 2400; - case 6889: - return 6000; - case 6926: - return 2000; - - case 4695: - case 4694: - case 4696: - case 4697: - case 4698: - case 4699: - return 15; - - case 564: - case 561: - return 5; - - case 560: - case 563: - case 565: - return 25; - - default: - return 1; - - } - } - - public int getGraveValue(int itemId) { - - switch (itemId) { - case 6922: - return 175; - case 6918: - return 350; - case 6916: - return 400; - case 6924: - return 450; - case 6920: - return 120; - case 1391: - return 2; - case 6908: - return 30; - case 6910: - return 60; - case 6912: - return 150; - case 6914: - return 240; - case 6889: - return 500; - case 6926: - return 200; - - case 4695: - case 4694: - case 4696: - case 4697: - case 4698: - case 4699: - return 1; - - case 564: - case 561: - return 1; - - case 560: - case 563: - case 565: - return 2; - - default: - return 1; - - } - } - - public void sendMessage(int itemId) { - c.getPacketSender().sendMessage( - ItemAssistant.getItemName(itemId) + " costs " - + getGraveValue(itemId) + " Graveyard points, " - + getAlchVal(itemId) + " Alchemy points,"); - c.getPacketSender().sendMessage( - "" + getEnchVal(itemId) + " Enchantment points, and " - + getTelVal(itemId) + " Telekinetic points."); - } - -} diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Alchemy.java b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Alchemy.java new file mode 100644 index 00000000..8d051811 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Alchemy.java @@ -0,0 +1,148 @@ +package com.rs2.game.content.minigames.magetrainingarena; + +import java.util.Random; + +import com.rs2.GameConstants; +import com.rs2.game.content.combat.magic.MagicData; +import com.rs2.game.content.music.sound.SoundList; +import com.rs2.game.npcs.NpcHandler; +import com.rs2.game.players.Player; +import com.rs2.game.players.PlayerHandler; +import com.rs2.world.Boundary; + +public class Alchemy { + + private final Player player; + + public Alchemy(Player c) { + this.player = c; + } + + public void searchCupboard(int objectID) { + int index = (objectID - firstCupboard) / 2; + int item = Alchemy.items[(index + offset) % Alchemy.items.length]; + if (item < 0) { + player.getPacketSender().sendMessage("The cupboard is empty."); + } else { + player.getItemAssistant().addItem(item, 1); + } + } + + public void alchItem(int itemID, int spellID) { + if (System.currentTimeMillis() - player.alchDelay <= 1000) { + return; + } + int index = -1; + for (int i = 0; i < items.length; i++) { + if (items[i] == itemID) { + index = i; + } + } + // Item not found, player trying to alch a different item + if (index < 0) { + player.getPacketSender().sendMessage("You cannot alch that item while here."); + return; + } + int value = values[(index + valueOffset) % values.length]; + player.getItemAssistant().deleteItem(itemID, 1); + player.getItemAssistant().addItem(995, value); + player.alchDelay = System.currentTimeMillis(); + if (spellID == 1162) { + player.startAnimation(MagicData.MAGIC_SPELLS[49][2]); + player.gfx100(MagicData.MAGIC_SPELLS[49][3]); + player.getPlayerAssistant().addSkillXP(31, 6); + player.getPacketSender().sendSound(SoundList.LOW_ALCHEMY, 100, 0); + } else if (spellID == 1178) { + player.startAnimation(MagicData.MAGIC_SPELLS[50][2]); + player.gfx100(MagicData.MAGIC_SPELLS[50][3]); + player.alchDelay = System.currentTimeMillis(); + player.getPlayerAssistant().addSkillXP(65, 6); + player.getPacketSender().sendSound(SoundList.HIGH_ALCHEMY, 100, 0); + } + player.getPacketSender().sendShowTab(6); + player.getPlayerAssistant().refreshSkill(6); + } + + public void collectCoins() { + int coins = player.getItemAssistant().getItemAmount(995); + if (coins < 100) { + player.getPacketSender().sendMessage("You need to deposit at least 100 coins."); + return; + } + int points = (int) Math.floor(coins / 100); + int bonusExp = coins * 2; + int toBank = points * 10; + player.getPacketSender().sendMessage("Coins: " + coins + ", Points: " + points + ", Banked: " + toBank + ", EXP: " + bonusExp); + player.getItemAssistant().deleteItem(995, coins); + player.alchemyPoints += points; + player.getItemAssistant().addItemToBank(995, toBank); + player.getPlayerAssistant().addSkillXP(bonusExp, GameConstants.MAGIC); + } + + public void clearItems() { + for (int item: items) { + player.getItemAssistant().deleteItem(item, Integer.MAX_VALUE); + } + player.getItemAssistant().deleteItem(995, Integer.MAX_VALUE); + } + + /* ITEMS */ + // 6893 - Leather boots + // 6894 - Adamant Kiteshield + // 6895 - Adamant Med Helm + // 6896 - Emerald + // 6897 - Rune Sword + public static int[] items = {6893, 6894, 6895, 6896, 6897, -1, -1, -1}; + public static int[] values = {30, 15, 8, 5, 1}; + + public static int ticks = 0; + public static int offset = 0; + public static int valueOffset = 0; + public static int firstCupboard = 10783; + private static Random random = new Random(); + + /* OBJECTS */ + // 10734 - Coin Collector + // 10783 - 1st Cupboard (+2 for the next 7 cupboards) + + /* INTERFACES */ + // 15892 - Alchemy training arena interface + + public static void process() { + for (Player p : PlayerHandler.players) { + if (p == null) { + continue; + } + updateInterface(p); + } + if (++ticks < 71) { + return; + } + ticks = 0; + offset = random.nextInt(items.length); + valueOffset = random.nextInt(values.length); + for (int i = 0; i < NpcHandler.MAX_NPCS; i ++) { + if (NpcHandler.npcs[i] != null && NpcHandler.npcs[i].npcType == 3099) { + NpcHandler.npcs[i].forceChat("Items are changing!"); + } + } + for (Player p : PlayerHandler.players) { + if (p == null) { + continue; + } + updateInterface(p); + } + } + + public static void updateInterface(Player player) { + if (!Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA_ALCHEMY)) { + return; + } + int startInterface = 15902; + for (int i = 0; i < values.length; i++) { + player.getPacketSender().sendString("" + values[(i + valueOffset) % values.length], startInterface + i); + } + player.getPacketSender().sendString("" + player.alchemyPoints, 15896); + player.getPacketSender().walkableInterface(15892); + } +} diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Enchanting.java b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Enchanting.java new file mode 100644 index 00000000..33d84bc6 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/Enchanting.java @@ -0,0 +1,36 @@ +package com.rs2.game.content.minigames.magetrainingarena; + +import com.rs2.game.players.Player; + +public class Enchanting { + /* ITEMS */ + // 6898 - Green Cylinder + // 6899 - Yellow Cube + // 6900 - Blue Icosahedron + // 6901 - Red Pentamid + // 6902 - Orb + + /* OBJECTS */ + // 10799 - Yellow Cube Pile + // 10800 - Green Cylinder Pile + // 10801 - Blue Icosahedron Pile + // 10802 - Red Pentamid Pile + // 10803 - Deposit Hole + + /* INTERFACES */ + // 15917 - Enchantment training arena interface + // 15930 - Bonus text + // 15921 - How many enchantment points they have + // 15922 -> 15925 - Bonus object frame (not sure how to get it to show) + // 15926 -> 15929 - Bonus object (not sure how to get it to show) + + private final Player player; + + public Enchanting(Player c) { + this.player = c; + } + + + public void enchantItem(int itemID, int spellID) { + } +} diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/MageTrainingArena.java b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/MageTrainingArena.java new file mode 100644 index 00000000..fa236a40 --- /dev/null +++ b/2006Scape Server/src/main/java/com/rs2/game/content/minigames/magetrainingarena/MageTrainingArena.java @@ -0,0 +1,288 @@ +/* + * To change this template, choose Tools | Templates and open the template in + * the editor. + */ + +package com.rs2.game.content.minigames.magetrainingarena; + +import com.rs2.game.items.ItemAssistant; +import com.rs2.game.players.Player; + +/** + * @author RedSparr0w + */ +public class MageTrainingArena { + public static void process() { + Alchemy.process(); + } + + private final Player player; + public final Enchanting enchanting; + public final Alchemy alchemy; + + public MageTrainingArena(Player c) { + this.player = c; + this.enchanting = new Enchanting(c); + this.alchemy = new Alchemy(c); + } + + private final int[] shopItems = { + 6908, 6910, 6912, 6914, 6916, 6918, + 6920, 6922, 6924, 6889, 6926, 1391, + 4695, 4696, 4698, 4697, 4694, 4699, + 564, 561, 560, 563, 565, 6891 + }; + + private final int[] shopItemsN = { + 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100 + }; + + private final String[] interfaceText = { "Magic Training Arena Shop", + "Telekinetic Pizazz Points", "Enchantment Pizazz Points", + "Graveyard Pizazz Points", "Alchemist Pizazz Points" }; + + public void openShop() { + + for (int i = 0; i < shopItems.length; i++) { + player.getPacketSender().sendUpdateItems(15948, shopItems, shopItemsN); + } + + for (int i = 15950; i < interfaceText.length; i++) { + player.getPacketSender().sendString(interfaceText[i - 15950], i); + } + + player.getPacketSender().sendString(Integer.toString(player.telekineticPoints), 15955); + player.getPacketSender().sendString(Integer.toString(player.enchantmentPoints), 15956); + player.getPacketSender().sendString(Integer.toString(player.graveyardPoints), 15957); + player.getPacketSender().sendString(Integer.toString(player.alchemyPoints), 15958); + player.getPacketSender().showInterface(15944); + } + + public int getTelekineticPointValue(int itemId) { + switch (itemId) { + case 564: + case 561: + return 0; + case 1391: + case 4695: + case 4694: + case 4696: + case 4697: + case 4698: + case 4699: + return 1; + case 560: + case 563: + case 565: + return 2; + case 6908: + return 30; + case 6910: + case 6912: + return 60; + case 6920: + return 120; + case 6914: + return 150; + case 6922: + return 175; + case 6926: + return 200; + case 6918: + return 350; + case 6916: + return 400; + case 6924: + return 450; + case 6889: + return 500; + default: + return 1; + } + } + + public int getAlchemyPointValue(int itemId) { + switch (itemId) { + case 4695: + case 4694: + case 4696: + case 4697: + case 4698: + case 4699: + case 564: + case 561: + return 1; + case 560: + case 563: + case 565: + case 1391: + return 2; + case 6908: + return 30; + case 6910: + return 60; + case 6920: + return 120; + case 6912: + return 200; + case 6922: + return 225; + case 6914: + return 240; + case 6926: + return 300; + case 6918: + return 400; + case 6916: + return 450; + case 6924: + return 500; + case 6889: + return 550; + default: + return 1; + } + } + + public int getEnchantmentPointValue(int itemId) { + switch (itemId) { + case 564: + case 561: + return 5; + case 4695: + case 4694: + case 4696: + case 4697: + case 4698: + case 4699: + return 15; + case 1391: + return 20; + case 560: + case 563: + case 565: + return 25; + case 6908: + return 300; + case 6910: + return 600; + case 6920: + return 1200; + case 6922: + return 1300; + case 6912: + return 1500; + case 6926: + return 2000; + case 6914: + return 2400; + case 6918: + return 3000; + case 6916: + return 4000; + case 6924: + return 5000; + case 6889: + return 6000; + default: + return 1; + } + } + + public int getGraveyardPointValue(int itemId) { + switch (itemId) { + case 4695: + case 4694: + case 4696: + case 4697: + case 4698: + case 4699: + case 564: + case 561: + return 1; + case 560: + case 563: + case 565: + case 1391: + return 2; + case 6908: + return 30; + case 6910: + return 60; + case 6920: + return 120; + case 6912: + return 150; + case 6922: + return 175; + case 6926: + return 200; + case 6914: + return 240; + case 6918: + return 350; + case 6916: + return 400; + case 6924: + return 450; + case 6889: + return 500; + default: + return 1; + } + } + + public void sendItemValue(int itemId) { + player.getPacketSender().sendMessage( + ItemAssistant.getItemName(itemId) + " costs " + + getGraveyardPointValue(itemId) + " Graveyard points, " + + getAlchemyPointValue(itemId) + " Alchemy points,"); + player.getPacketSender().sendMessage( + "" + getEnchantmentPointValue(itemId) + " Enchantment points, and " + + getTelekineticPointValue(itemId) + " Telekinetic points."); + } + + public void buyItem(int itemId) { + // If player already unlocked bones to peaches spell + if (itemId == 6926 && player.unlockedBonesToPeaches) { + player.getPacketSender().sendMessage("You've already unlocked this spell."); + return; + } + + int graveValue = getGraveyardPointValue(itemId); + int alchValue = getAlchemyPointValue(itemId); + int enchantValue = getEnchantmentPointValue(itemId); + int teleValue = getTelekineticPointValue(itemId); + + if ( + graveValue > player.graveyardPoints || + alchValue > player.alchemyPoints || + enchantValue > player.enchantmentPoints || + teleValue > player.telekineticPoints + ) { + player.getPacketSender().sendMessage("You don't have enough Pizazz Points to buy that."); + return; + } + + player.graveyardPoints -= graveValue; + player.alchemyPoints -= alchValue; + player.enchantmentPoints -= enchantValue; + player.telekineticPoints -= teleValue; + if (itemId == 6926) { + player.unlockedBonesToPeaches = true; + } else { + player.getItemAssistant().addItem(itemId, 1); + } + } + + public void enchantItem(int itemID, int spellID) { + enchanting.enchantItem(itemID, spellID); + } + + public void alchItem(int itemID, int spellID) { + alchemy.alchItem(itemID, spellID); + } +} diff --git a/2006Scape Server/src/main/java/com/rs2/game/content/skills/smithing/Superheat.java b/2006Scape Server/src/main/java/com/rs2/game/content/skills/smithing/Superheat.java index a0bd9136..59d0f563 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/content/skills/smithing/Superheat.java +++ b/2006Scape Server/src/main/java/com/rs2/game/content/skills/smithing/Superheat.java @@ -63,7 +63,7 @@ public class Superheat { if (itemID != 444) { player.getPlayerAssistant().addSkillXP(smelt[7], GameConstants.SMITHING); } - player.getPacketSender().sendFrame106(6); + player.getPacketSender().sendShowTab(6); return true; } } diff --git a/2006Scape Server/src/main/java/com/rs2/game/items/ItemAssistant.java b/2006Scape Server/src/main/java/com/rs2/game/items/ItemAssistant.java index e3a48b35..3225132c 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/items/ItemAssistant.java +++ b/2006Scape Server/src/main/java/com/rs2/game/items/ItemAssistant.java @@ -1246,6 +1246,9 @@ public class ItemAssistant { if (!playerHasItem(wearID, 1, slot)) { return false; } + if (slot < 0) { + return false; + } boolean greegree = Greegree.attemptGreegree(player, wearID); if (!greegree) { return false; diff --git a/2006Scape Server/src/main/java/com/rs2/game/items/ItemData.java b/2006Scape Server/src/main/java/com/rs2/game/items/ItemData.java index 39ceb6e1..6440e188 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/items/ItemData.java +++ b/2006Scape Server/src/main/java/com/rs2/game/items/ItemData.java @@ -72,7 +72,7 @@ public class ItemData { 6128, 6131, 6137, 6182, 6188, 6335, 6337, 6339, 6345, 6355, 6365, 6375, 6382, 6392, 6400, 6918, 6656, 2581, 7539, 7394, 7396, 7534, 5574, 6885, 6858, 6860, 6862, 6856, 6326, 6128, 6137, 7400, 7323, - 7325, 7327, 7003, 4168, 7112, 7124, 7130, 7136 }; + 7325, 7327, 7003, 4168, 7112, 7124, 7130, 7136, 4284, 4285 }; public static int amulets[] = { 1654, 1656, 1658, 1660, 1662, 1664, 8081, 8033, 7968, 6585, 86, 87, 295, 421, 552, 589, 1478, 1692, 1694, 1696, 1698, 1700, 1702, 1704, 1706, 1708, 1710, 1712, 1725, 1727, @@ -295,6 +295,8 @@ public class ItemData { case 5543: case 5545: case 5547: + case 4284: + case 4285: slot = ItemConstants.HAT; break; // Cape @@ -361,6 +363,13 @@ public class ItemData { case 776: slot = ItemConstants.HANDS; break; + case 6893: + case 6894: + case 6895: + case 6896: + case 6897: + slot = -1; + break; default: slot = c; } diff --git a/2006Scape Server/src/main/java/com/rs2/game/npcs/NpcActions.java b/2006Scape Server/src/main/java/com/rs2/game/npcs/NpcActions.java index c4925d5d..f9562466 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/npcs/NpcActions.java +++ b/2006Scape Server/src/main/java/com/rs2/game/npcs/NpcActions.java @@ -1,6 +1,7 @@ package com.rs2.game.npcs; import com.rs2.GameConstants; +import com.rs2.game.content.minigames.magetrainingarena.MageTrainingArena; import com.rs2.game.content.quests.QuestAssistant; import com.rs2.game.content.skills.core.Fishing; import com.rs2.game.content.skills.crafting.Tanning; @@ -1078,7 +1079,7 @@ public class NpcActions { } } switch (npcType) { - case 3021 : + case 3021: player.getFarmingTools().loadInterfaces(); break; @@ -1277,6 +1278,9 @@ public class NpcActions { player.getPlayerAssistant().spellTeleport(3027, 4852, 0); break; + case 3103: // Mage arena point shop + player.getMageTrainingArena().openShop(); + default: if (player.playerRights == 3) { Misc.println("Third Click NPC : " + npcType); diff --git a/2006Scape Server/src/main/java/com/rs2/game/objects/ObjectsActions.java b/2006Scape Server/src/main/java/com/rs2/game/objects/ObjectsActions.java index cbb6081d..4079d87a 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/objects/ObjectsActions.java +++ b/2006Scape Server/src/main/java/com/rs2/game/objects/ObjectsActions.java @@ -716,7 +716,7 @@ public class ObjectsActions { "You pass through the energy barrier."); player.getPlayerAssistant().movePlayer(player.absX, player.absY - 2, 0); } - break; + break; case 5262: if (player.heightLevel == 0) @@ -2629,6 +2629,54 @@ public class ObjectsActions { player.getPlayerAssistant().walkTo(0, -1); } break; + + case 10721: + if (player.absY == 3298) + player.getPlayerAssistant().movePlayer(player.absX, player.absY + 2, 0); + else if (player.absY == 3300) + player.getPlayerAssistant().movePlayer(player.absX, player.absY - 2, 0); + break; + case 10734: // Coin Collector + player.getMageTrainingArena().alchemy.collectCoins(); + break; + case 10771: + player.getPlayerAssistant().movePlayer(3369, 3307, 1); + break; + case 10773: + player.getPlayerAssistant().movePlayer(3366, 3306, 0); + break; + case 10775: + player.getPlayerAssistant().movePlayer(3357, 3307, 1); + break; + case 10776: + player.getPlayerAssistant().movePlayer(3360, 3306, 0); + break; + case 10778: + // TODO: Require Pizazz progress hat equiped + player.getDialogueHandler().sendStatement("This area is currently closed."); + // player.getPlayerAssistant().startTeleport2(3336, 9718, 0); // Telekinetic floor 0 + break; + case 10779: + // TODO: Require Pizazz progress hat equiped + player.getDialogueHandler().sendStatement("This area is currently closed."); + // player.getPlayerAssistant().startTeleport2(3363, 9639, 0); // Enchantment training + break; + case 10780: + // TODO: Require Pizazz progress hat equiped + if (player.getItemAssistant().playerHasItem(995)) { + player.getDialogueHandler().sendStatement("You cannot bring coins with you."); + return; + } + player.getPlayerAssistant().startTeleport2(3365, 9624, 2); // Alchemy training + break; + case 10781: + // TODO: Require Pizazz progress hat equiped + player.getDialogueHandler().sendStatement("This area is currently closed."); + // player.getPlayerAssistant().startTeleport2(3364, 9639, 1); // Graveyard training + break; + case 10782: // Leave mage training rooms + player.getPlayerAssistant().startTeleport2(3363, 3318, 0); + break; case 2873: if (player.getItemAssistant().hasFreeSlots(1)) player.getItemAssistant().addItem(2412, 1); @@ -2685,6 +2733,16 @@ public class ObjectsActions { if (objectX == 3678 && objectY == 2948) player.getPlayerAssistant().movePlayer(3677, 2948, 0); break; + case 10783: + case 10785: + case 10787: + case 10789: + case 10791: + case 10793: + case 10795: + case 10797: + player.getMageTrainingArena().alchemy.searchCupboard(objectType); + break; } } diff --git a/2006Scape Server/src/main/java/com/rs2/game/players/Player.java b/2006Scape Server/src/main/java/com/rs2/game/players/Player.java index 7c707812..3378908f 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/players/Player.java +++ b/2006Scape Server/src/main/java/com/rs2/game/players/Player.java @@ -32,6 +32,7 @@ import com.rs2.game.content.minigames.Dueling; import com.rs2.game.content.minigames.FightPits; import com.rs2.game.content.minigames.PestControl; import com.rs2.game.content.minigames.castlewars.CastleWars; +import com.rs2.game.content.minigames.magetrainingarena.MageTrainingArena; import com.rs2.game.content.music.PlayList; import com.rs2.game.content.music.sound.SoundList; import com.rs2.game.content.skills.SkillInterfaces; @@ -114,6 +115,7 @@ public abstract class Player { public IoSession session; private final ItemAssistant itemAssistant = new ItemAssistant(this); private final ShopAssistant shopAssistant = new ShopAssistant(this); + private final MageTrainingArena mageArena = new MageTrainingArena(this); private final Trading trading = new Trading(this); private final Dueling duel = new Dueling(this); private final PlayerAssistant playerAssistant = new PlayerAssistant(this); @@ -400,6 +402,10 @@ public abstract class Player { return shopAssistant; } + public MageTrainingArena getMageTrainingArena() { + return mageArena; + } + public Trading getTrading() { return trading; } @@ -814,6 +820,8 @@ public abstract class Player { isSnowy = false; } else if (inCw() || inPits) { getPacketSender().showOption(3, 0, "Attack", 1); + } else if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ALCHEMY)) { + getPacketSender().walkableInterface(15892); } else { getPacketSender().sendMapState(0); if (!isSnowy) { @@ -1624,7 +1632,7 @@ public abstract class Player { * Combat variables */ public boolean doubleHit, usingSpecial, usingRangeWeapon, - usingBow, usingMagic, castingMagic; + usingBow, usingMagic, castingMagic, unlockedBonesToPeaches; public int castingSpellId, oldSpellId, spellId, hitDelay; public int specMaxHitIncrease, freezeDelay, freezeTimer = -6, killerId, @@ -1632,7 +1640,7 @@ public abstract class Player { crystalBowArrowCount, playerMagicBook, teleGfx, teleEndAnimation, teleHeight, teleX, teleY, rangeItemUsed, killingNpcIndex, totalDamageDealt, globalDamageDealt, oldNpcIndex, fightMode, attackTimer, - bowSpecShot, ectofuntusWorshipped; + bowSpecShot, ectofuntusWorshipped, graveyardPoints, alchemyPoints, enchantmentPoints, telekineticPoints; public boolean magicFailed, oldMagicFailed; /** * End @@ -2145,13 +2153,18 @@ public abstract class Player { mapRegionX = (teleportToX >> 3) - 6; mapRegionY = (teleportToY >> 3) - 6; } + if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ALCHEMY) && !Boundary.isIn(teleportToX, teleportToY, teleHeight, Boundary.MAGE_TRAINING_ARENA_ALCHEMY)) { + // remove any alchemy training items + getMageTrainingArena().alchemy.clearItems(); + } currentX = teleportToX - 8 * mapRegionX; currentY = teleportToY - 8 * mapRegionY; absX = teleportToX; absY = teleportToY; + heightLevel = teleHeight >= 0 ? teleHeight : heightLevel >= 0 ? heightLevel : 0; resetWalkingQueue(); - teleportToX = teleportToY = -1; + teleportToX = teleportToY = teleHeight = -1; didTeleport = true; updateWalkEntities(); } else { diff --git a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java index 98c1d4a2..544d45d9 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java +++ b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerAssistant.java @@ -845,7 +845,6 @@ public class PlayerAssistant { public void processTeleport() { player.teleportToX = player.teleX; player.teleportToY = player.teleY; - player.heightLevel = player.teleHeight; if (player.teleEndAnimation > 0) { player.startAnimation(player.teleEndAnimation); } @@ -859,7 +858,7 @@ public class PlayerAssistant { if(player.heightLevel != h) { player.refresh = true; } - player.heightLevel = h; + player.teleHeight = h; player.getPlayerAssistant().requestUpdates(); } @@ -1165,53 +1164,60 @@ public class PlayerAssistant { || itemId == 995) { return; } + boolean canAlch = true; switch (spellId) { case 1162: // low alch + player.getPacketSender().sendShowTab(6); if (player.inTrade) { player.getPacketSender().sendMessage("You can't alch while in a trade!"); return; } - if (System.currentTimeMillis() - player.alchDelay > 1000) { - if (!player.getCombatAssistant().checkMagicReqs(49)) { - break; + if (System.currentTimeMillis() - player.alchDelay <= 1000) { + return; + } + if (!player.getCombatAssistant().checkMagicReqs(49)) { + return; + } + if (Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA)) { + player.getMageTrainingArena().alchItem(itemId, spellId); + return; + } + canAlch = true; + for (int i : ItemConstants.ITEM_UNALCHABLE) { + if (itemId == i) { + player.getPacketSender().sendMessage("You can't alch that item!"); + canAlch = false; + return; } - boolean canAlch = true; - for (int i : ItemConstants.ITEM_UNALCHABLE) { - if (itemId == i) { - player.getPacketSender().sendMessage("You can't alch that item!"); - canAlch = false; - return; - } + } + if (canAlch) { + int value = (int) Math.floor(player.getShopAssistant().getItemShopValue(itemId) * 0.4); + String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); + if (player.getPlayerAssistant().isPlayer()) { + GameLogger.writeLog(player.playerName, "alchemy", player.playerName + " cast Low Alchemy on " + itemName + " for " + GameLogger.formatCurrency(value) + " coins"); } - if (canAlch) { - int value = (int) Math.floor(player.getShopAssistant().getItemShopValue(itemId) * 0.4); - String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); - if (player.getPlayerAssistant().isPlayer()) { - GameLogger.writeLog(player.playerName, "alchemy", player.playerName + " cast Low Alchemy on " + itemName + " for " + GameLogger.formatCurrency(value) + " coins"); - } - player.getItemAssistant().deleteItem(itemId, slot, 1); - //855 - 858 - if (itemId > 854 && itemId < 857) { - player.getItemAssistant().addItem(995, 512); - } else if (itemId > 856 && itemId < 859) { - player.getItemAssistant().addItem(995, 320); - } else if (itemId > 860 && itemId < 863) { - player.getItemAssistant().addItem(995, 640); - } else if (itemId > 858 && itemId < 861) { - player.getItemAssistant().addItem(995, 1024); - } else { - player.getItemAssistant().addItem(995, value); - } - player.startAnimation(MagicData.MAGIC_SPELLS[49][2]); - player.gfx100(MagicData.MAGIC_SPELLS[49][3]); - player.alchDelay = System.currentTimeMillis(); - player.getPacketSender().sendFrame106(6); - addSkillXP(31, 6); - player.getPacketSender().sendSound( - SoundList.LOW_ALCHEMY, 100, 0); - RandomEventHandler.addRandom(player); - refreshSkill(6); + player.getItemAssistant().deleteItem(itemId, slot, 1); + //855 - 858 + if (itemId > 854 && itemId < 857) { + player.getItemAssistant().addItem(995, 512); + } else if (itemId > 856 && itemId < 859) { + player.getItemAssistant().addItem(995, 320); + } else if (itemId > 860 && itemId < 863) { + player.getItemAssistant().addItem(995, 640); + } else if (itemId > 858 && itemId < 861) { + player.getItemAssistant().addItem(995, 1024); + } else { + player.getItemAssistant().addItem(995, value); } + player.startAnimation(MagicData.MAGIC_SPELLS[49][2]); + player.gfx100(MagicData.MAGIC_SPELLS[49][3]); + player.alchDelay = System.currentTimeMillis(); + player.getPacketSender().sendShowTab(6); + addSkillXP(31, 6); + player.getPacketSender().sendSound( + SoundList.LOW_ALCHEMY, 100, 0); + RandomEventHandler.addRandom(player); + refreshSkill(6); } break; @@ -1227,54 +1233,64 @@ public class PlayerAssistant { case 1180: // Lvl-4 enchant diamond case 1187: // Lvl-5 enchant dragonstone case 6003: // Lvl-6 enchant onyx - player.getEnchanting().enchantItem(itemId, spellId); + if (Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA)) { + player.getMageTrainingArena().enchantItem(itemId, spellId); + } else { + player.getEnchanting().enchantItem(itemId, spellId); + } break; case 1178: // high alch + player.getPacketSender().sendShowTab(6); if (player.inTrade) { player.getPacketSender().sendMessage("You can't alch while in a trade!"); return; } - if (System.currentTimeMillis() - player.alchDelay > 1000) { - if (!player.getCombatAssistant().checkMagicReqs(50)) { - break; + if (System.currentTimeMillis() - player.alchDelay <= 1000) { + return; + } + if (!player.getCombatAssistant().checkMagicReqs(50)) { + break; + } + if (Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA)) { + player.getMageTrainingArena().alchItem(itemId, spellId); + return; + } + canAlch = true; + for (int i : ItemConstants.ITEM_UNALCHABLE) { + if (itemId == i) { + player.getPacketSender().sendMessage("You can't alch that item!"); + canAlch = false; + return; } - boolean canAlch = true; - for (int i : ItemConstants.ITEM_UNALCHABLE) { - if (itemId == i) { - player.getPacketSender().sendMessage("You can't alch that item!"); - canAlch = false; - return; - } + } + if (canAlch) { + int value = (int) Math.floor(player.getShopAssistant().getItemShopValue(itemId) * 0.75); + String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); + if (player.getPlayerAssistant().isPlayer()) { + GameLogger.writeLog(player.playerName, "alchemy", player.playerName + " cast High Alchemy on " + itemName + " for" + GameLogger.formatCurrency(value) + " coins"); } - if (canAlch) { - int value = (int) Math.floor(player.getShopAssistant().getItemShopValue(itemId) * 0.75); - String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); - if (player.getPlayerAssistant().isPlayer()) { - GameLogger.writeLog(player.playerName, "alchemy", player.playerName + " cast High Alchemy on " + itemName + " for" + GameLogger.formatCurrency(value) + " coins"); - } - player.getItemAssistant().deleteItem(itemId, slot, 1); - if (itemId > 854 && itemId < 857) { - player.getItemAssistant().addItem(995, 768); - } else if (itemId > 856 && itemId < 859) { - player.getItemAssistant().addItem(995, 480); - } else if (itemId > 858 && itemId < 861) { - player.getItemAssistant().addItem(995, 1536); - } else if (itemId > 860 && itemId < 863) { - player.getItemAssistant().addItem(995, 960); - } else { - player.getItemAssistant().addItem(995, (int) (player.getShopAssistant().getItemShopValue(itemId) * .75)); - } - player.startAnimation(MagicData.MAGIC_SPELLS[50][2]); - player.gfx100(MagicData.MAGIC_SPELLS[50][3]); - player.alchDelay = System.currentTimeMillis(); - player.getPacketSender().sendFrame106(6); - RandomEventHandler.addRandom(player); - addSkillXP(65, 6); - player.getPacketSender().sendSound( - SoundList.HIGH_ALCHEMY, 100, 0); - refreshSkill(6); + player.getItemAssistant().deleteItem(itemId, slot, 1); + if (itemId > 854 && itemId < 857) { + player.getItemAssistant().addItem(995, 768); + } else if (itemId > 856 && itemId < 859) { + player.getItemAssistant().addItem(995, 480); + } else if (itemId > 858 && itemId < 861) { + player.getItemAssistant().addItem(995, 1536); + } else if (itemId > 860 && itemId < 863) { + player.getItemAssistant().addItem(995, 960); + } else { + player.getItemAssistant().addItem(995, (int) (player.getShopAssistant().getItemShopValue(itemId) * .75)); } + player.startAnimation(MagicData.MAGIC_SPELLS[50][2]); + player.gfx100(MagicData.MAGIC_SPELLS[50][3]); + player.alchDelay = System.currentTimeMillis(); + player.getPacketSender().sendShowTab(6); + RandomEventHandler.addRandom(player); + addSkillXP(65, 6); + player.getPacketSender().sendSound( + SoundList.HIGH_ALCHEMY, 100, 0); + refreshSkill(6); } break; } diff --git a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java index ce196133..6fdbccd9 100644 --- a/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java +++ b/2006Scape Server/src/main/java/com/rs2/game/players/PlayerSave.java @@ -81,6 +81,7 @@ public class PlayerSave { switch (token) { case "character-height": player.heightLevel = Integer.parseInt(token2); + player.teleHeight = Integer.parseInt(token2); break; case "character-posx": player.teleportToX = Integer.parseInt(token2) <= 0 ? player.lastX : Integer.parseInt(token2); @@ -412,6 +413,21 @@ public class PlayerSave { case "ectofuntusWorshipped": player.ectofuntusWorshipped = Integer.parseInt(token2); break; + case "graveyard-points": + player.graveyardPoints = Integer.parseInt(token2); + break; + case "alchemy-points": + player.alchemyPoints = Integer.parseInt(token2); + break; + case "enchantment-points": + player.enchantmentPoints = Integer.parseInt(token2); + break; + case "telekinetic-points": + player.telekineticPoints = Integer.parseInt(token2); + break; + case "unlocked-bones-to-peaches": + player.unlockedBonesToPeaches = Boolean.parseBoolean(token2); + break; } break; case 3: @@ -782,6 +798,16 @@ public class PlayerSave { characterfile.newLine(); characterfile.write("ectofuntusWorshipped = " + player.ectofuntusWorshipped); characterfile.newLine(); + characterfile.write("graveyard-points = " + player.graveyardPoints); + characterfile.newLine(); + characterfile.write("alchemy-points = " + player.alchemyPoints); + characterfile.newLine(); + characterfile.write("enchantment-points = " + player.enchantmentPoints); + characterfile.newLine(); + characterfile.write("telekinetic-points = " + player.telekineticPoints); + characterfile.newLine(); + characterfile.write("unlocked-bones-to-peaches = " + player.unlockedBonesToPeaches); + characterfile.newLine(); String voidStatus = ""; for (int voidS : player.voidStatus){ voidStatus += voidS + "\t"; diff --git a/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java b/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java index a033ef4e..2a7da085 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java +++ b/2006Scape Server/src/main/java/com/rs2/net/PacketSender.java @@ -14,7 +14,6 @@ import com.rs2.game.items.ItemConstants; import com.rs2.game.items.Weight; import com.rs2.game.items.impl.LightSources; import com.rs2.game.players.Client; -import com.rs2.game.players.MainFrameIDs; import com.rs2.game.players.Player; import com.rs2.game.players.PlayerHandler; import com.rs2.util.Misc; @@ -430,7 +429,8 @@ public class PacketSender { return this; } - public PacketSender sendFrame106(int sideIcon) { //Something to do with magic + // Show a certain tab + public PacketSender sendShowTab(int sideIcon) { if (player.getOutStream() != null && player != null) { player.getOutStream().createFrame(106); player.getOutStream().writeByteC(sideIcon); diff --git a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Bank5.java b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Bank5.java index 7851631b..151ef121 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Bank5.java +++ b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/Bank5.java @@ -98,6 +98,10 @@ public class Bank5 implements PacketType { case 1123: player.getSmithing().readInput(player, player.playerLevel[GameConstants.SMITHING], removeId, 5); break; + + case 15948: // Mage Training Arena Shop + player.getMageTrainingArena().buyItem(removeId); + break; } } diff --git a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/ClickingButtons.java b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/ClickingButtons.java index 56ba03e7..c31c2ca7 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/ClickingButtons.java +++ b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/ClickingButtons.java @@ -153,7 +153,7 @@ public class ClickingButtons implements PacketType { player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC); player.startAnimation(722); player.gfx100(141); - player.getPacketSender().sendFrame106(6); + player.getPacketSender().sendShowTab(6); player.getPacketSender().sendSound( SoundList.BONES_TO_BANNAS, 100, 0); player.boneDelay = System.currentTimeMillis(); @@ -175,9 +175,13 @@ public class ClickingButtons implements PacketType { player.getPacketSender().sendChatInterface(356); return; } + if (!player.unlockedBonesToPeaches) { + player.getPacketSender().sendString("You haven't unlocked this spell yet.", 357); + player.getPacketSender().sendChatInterface(356); + return; + } if (!player.getItemAssistant().playerHasItem(526, 1)) { - player.getPacketSender().sendMessage( - "You don't have any bones!"); + player.getPacketSender().sendMessage("You don't have any bones!"); return; } if (!player.getItemAssistant().playerHasItem(561, 2) @@ -197,7 +201,7 @@ public class ClickingButtons implements PacketType { player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC); player.startAnimation(722); player.gfx100(311); - player.getPacketSender().sendFrame106(6); + player.getPacketSender().sendShowTab(6); player.boneDelay = System.currentTimeMillis(); do { player.getItemAssistant().deleteItem(526, 1); diff --git a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/RemoveItem.java b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/RemoveItem.java index 106fae90..b8c24c28 100644 --- a/2006Scape Server/src/main/java/com/rs2/net/packets/impl/RemoveItem.java +++ b/2006Scape Server/src/main/java/com/rs2/net/packets/impl/RemoveItem.java @@ -101,6 +101,9 @@ public class RemoveItem implements PacketType { player.getSmithing().readInput(player, player.playerLevel[GameConstants.SMITHING], removeId, 1); break; + case 15948: // Mage Training Arena Shop + player.getMageTrainingArena().sendItemValue(removeId); + break; } Weight.updateWeight(player); } diff --git a/2006Scape Server/src/main/java/com/rs2/world/Boundary.java b/2006Scape Server/src/main/java/com/rs2/world/Boundary.java index 28595b26..91e12da1 100644 --- a/2006Scape Server/src/main/java/com/rs2/world/Boundary.java +++ b/2006Scape Server/src/main/java/com/rs2/world/Boundary.java @@ -110,6 +110,15 @@ public class Boundary { return x >= boundaries.minX && x <= boundaries.highX && y >= boundaries.minY && y <= boundaries.highY; } + public static boolean isIn(int x, int y, int h, Boundary boundaries) { + if (boundaries.height >= 0) { + if (h != boundaries.height) { + return false; + } + } + return x >= boundaries.minX && x <= boundaries.highX && y >= boundaries.minY && y <= boundaries.highY; + } + /** * * @param npc @@ -303,5 +312,7 @@ public class Boundary { public static final Boundary[] FIGHT_PITS = new Boundary[] { new Boundary(2378, 3415, 5133, 5167), new Boundary(2394, 2404, 5169, 5174) }; public static final Boundary PARTY_ROOM = new Boundary(2727, 2746, 3460, 3479); public static final Boundary PARTY_ROOM_TABLE = new Boundary(2735, 2740, 3467, 3468); + public static final Boundary MAGE_TRAINING_ARENA = new Boundary(3330, 3388, 9614, 9727); + public static final Boundary MAGE_TRAINING_ARENA_ALCHEMY = new Boundary(3350, 3379, 9616, 9655, 2); } \ No newline at end of file