Telekinetic grab and stuff (#508)

* tidy up

* Tidy up check for space

* Telekinetic base

* Don't allow player to pickup statue

* Tidy up item pickup

* fixup, statue spawn

* Update telekinetic grab

* 2nd option for guardian statue

* handle telegrab on statue

* Allow picking up global drops with telekinetic grab

* Check if player can see/reach item

* Update PickupItem.java

* Allow pasting into chatbox

* camera stuff

* fixup clipboard stuff

* Update PlayerAssistant.java

* Update Commands.java

* Add mazes initial

* Tidy up the clipboard pasting

* Update mazes

* Calculate new position of statue

* fixup telegrab

* More tidy up, remove constant running of container

* more tidy up..

* Handle moving statues

* remove the statue from global drops

* Update MagicOnFloorItems.java

* Show telekinetic interface

* Make public accessable

* Only show items to player that are on the same height level

* Moving statues around, Spawning

* Reward exp, points, law runes

* Show points, mazes completed

* Add comment

* Add observable statue (still needs work)

* Fixup where camera focuses

* Load items when player changes level

* Graveyard base

* Add a couple more checks

* Update Player.java

* Update Commands.java

* Make sure statue is visible when player appears at maze

* [Mage training arena] Graveyard

* Update MageTrainingArena.java

* Update MageTrainingArena.java

* Update ItemHandler.java
This commit is contained in:
Danial
2021-10-05 16:01:16 +13:00
committed by GitHub
parent c526aa5f4d
commit 2d8ae82086
22 changed files with 719 additions and 193 deletions
+39 -5
View File
@@ -6,6 +6,7 @@
import javax.swing.*; import javax.swing.*;
import java.applet.AppletContext; import java.applet.AppletContext;
import java.awt.*; import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelEvent;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -9177,12 +9178,14 @@ public class Game extends RSApplet {
} }
public int method121() { public int method121() {
int j = method42(plane, yCameraPos, xCameraPos); // Hide other planes when using fixed camera
if (j - zCameraPos < 800 && (byteGroundArray[plane][xCameraPos >> 7][yCameraPos >> 7] & 4) != 0) {
return plane; return plane;
} else { // int j = method42(plane, yCameraPos, xCameraPos);
return 3; // if (j - zCameraPos < 800 && (byteGroundArray[plane][xCameraPos >> 7][yCameraPos >> 7] & 4) != 0) {
} // return plane;
// } else {
// return 3;
// }
} }
public void delIgnore(long l) { public void delIgnore(long l) {
@@ -12599,6 +12602,14 @@ public class Game extends RSApplet {
if (zoom < (WorldController.drawDistance / 3)) if (zoom < (WorldController.drawDistance / 3))
zoom++; zoom++;
break; break;
case KeyEvent.VK_V:
if (keyevent.isControlDown()) {
inputString += getClipBoard();
if (inputString.length() > 80) {
inputString = inputString.substring(0, 80);
}
inputTaken = true;
}
} }
} }
@@ -12782,4 +12793,27 @@ public class Game extends RSApplet {
} }
} }
} }
public String getClipBoard(){
String myString = "";
try {
myString = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
} catch (HeadlessException e) {
e.printStackTrace();
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String output = "";
for(int i = 0; i < myString.length(); i++) {
int j = (int) myString.charAt(i);
if (j >= 32 && j <= 122) {
output += (char) j;
}
}
return output;
}
} }
@@ -149,7 +149,9 @@ public class MagicData {
// alch // alch
{ -1, 55, 713, 113, 0, 0, 0, 20, 554, 5, 561, 1, 0, 0, 0, 0, 0 }, // high { -1, 55, 713, 113, 0, 0, 0, 20, 554, 5, 561, 1, 0, 0, 0, 0, 0 }, // high
// alch // alch
{ -1, 33, 728, 142, 143, 144, 0, 35, 556, 1, 563, 1, 0, 0, 0, 0, 0 } // telegrab { -1, 33, 728, 142, 143, 144, 0, 35, 556, 1, 563, 1, 0, 0, 0, 0, 0 }, // telegrab
{ -1, 15, 722, 141, 0, 0, 0, 25, 561, 1, 557, 2, 555, 2, 0, 0, 0, 0 }, // bones to bananas
{ -1, 60, 722, 311, 0, 0, 0, 35, 561, 2, 557, 4, 555, 4, 0, 0, 0, 0 } // bones to peaches
}; };
@@ -40,7 +40,7 @@ public class MagicRequirements {
public static boolean checkMagicReqs(Player c, int spell, boolean runesRequired) { public static boolean checkMagicReqs(Player c, int spell, boolean runesRequired) {
int[] spellData = MagicData.MAGIC_SPELLS[spell]; int[] spellData = MagicData.MAGIC_SPELLS[spell];
if (c.usingMagic && runesRequired) { // check for runes if (runesRequired) { // check for runes
if ( if (
!c.getItemAssistant().playerHasItem(spellData[8], spellData[9]) && !wearingStaff(c, spellData[8]) !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[10], spellData[11]) && !wearingStaff(c, spellData[10])
@@ -52,7 +52,7 @@ public class MagicRequirements {
} }
} }
if (c.usingMagic && c.playerIndex > 0) { if (c.playerIndex > 0) {
if (PlayerHandler.players[c.playerIndex] != null) { if (PlayerHandler.players[c.playerIndex] != null) {
for (int r = 0; r < c.REDUCE_SPELLS.length; r++) { // reducing for (int r = 0; r < c.REDUCE_SPELLS.length; r++) { // reducing
// spells, // spells,
@@ -81,7 +81,7 @@ public class MagicRequirements {
} }
int staffRequired = getStaffNeeded(c); int staffRequired = getStaffNeeded(c);
if (c.usingMagic && staffRequired > 0 && runesRequired) { // staff if (staffRequired > 0 && runesRequired) { // staff
// required // required
if (c.playerEquipment[c.playerWeapon] != staffRequired) { if (c.playerEquipment[c.playerWeapon] != staffRequired) {
c.getPacketSender() c.getPacketSender()
@@ -94,7 +94,7 @@ public class MagicRequirements {
} }
} }
if (c.usingMagic) { // check magic level // check magic level
if (c.playerLevel[GameConstants.MAGIC] < MagicData.MAGIC_SPELLS[spell][1]) { if (c.playerLevel[GameConstants.MAGIC] < MagicData.MAGIC_SPELLS[spell][1]) {
c.getPacketSender().sendMessage( c.getPacketSender().sendMessage(
"You need to have a magic level of " "You need to have a magic level of "
@@ -102,8 +102,7 @@ public class MagicRequirements {
+ " to cast this spell."); + " to cast this spell.");
return false; return false;
} }
} if (runesRequired) {
if (c.usingMagic && runesRequired) {
if (MagicData.MAGIC_SPELLS[spell][8] > 0) { // deleting runes if (MagicData.MAGIC_SPELLS[spell][8] > 0) { // deleting runes
if (!wearingStaff(c, MagicData.MAGIC_SPELLS[spell][8])) { if (!wearingStaff(c, MagicData.MAGIC_SPELLS[spell][8])) {
c.getItemAssistant().deleteItem( c.getItemAssistant().deleteItem(
@@ -13,7 +13,7 @@ import com.rs2.world.Boundary;
public class Alchemy { public class Alchemy {
private final Player player; private Player player;
public Alchemy(Player c) { public Alchemy(Player c) {
this.player = c; this.player = c;
@@ -14,7 +14,7 @@ import com.rs2.world.Boundary;
public class Enchanting { public class Enchanting {
// TODO: Add dragonstone drops occasionally, double points when enchanted // TODO: Add dragonstone drops occasionally, double points when enchanted
private final Player player; private Player player;
private int itemsEnchanted = 0; private int itemsEnchanted = 0;
private int orbsDeposited = 0; private int orbsDeposited = 0;
@@ -0,0 +1,129 @@
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.combat.magic.MagicRequirements;
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 Graveyard {
private Player player;
private int bonesCollected = 0;
private int fruitDeposited = 0;
public Graveyard(Player c) {
this.player = c;
}
public void searchBonePile(int objectID) {
int index = (int) Math.floor(bonesCollected / 4);
if (player.getItemAssistant().freeSlots(items[index], 1) <= 0) {
player.getPacketSender().sendMessage("You don't have enough space in your inventory.");
return;
}
player.getItemAssistant().addItem(items[index], 1);
bonesCollected = (bonesCollected + 1) % (items.length * 4);
}
public void bonesToFood(int spellID) {
if (!player.getCombatAssistant().checkMagicReqs(spellID)) {
return;
}
player.boneDelay = System.currentTimeMillis();
player.startAnimation(MagicData.MAGIC_SPELLS[spellID][2]);
player.gfx100(MagicData.MAGIC_SPELLS[spellID][3]);
player.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[spellID][7], GameConstants.MAGIC);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.getPacketSender().sendShowTab(6);
player.getPacketSender().sendSound(SoundList.BONES_TO_BANNAS, 100, 0);
int amount = 0;
for (int i = 0; i < items.length; i++) {
amount = player.getItemAssistant().getItemAmount(items[i]);
if (amount > 0) {
player.getItemAssistant().deleteItem(items[i], amount);
player.getItemAssistant().addItem(spellID == 52 ? 1963 : 6883, amount * values[i]);
}
}
}
public void depositFood() {
int amount = player.getItemAssistant().getItemAmount(1963);
amount += player.getItemAssistant().getItemAmount(6883);
// remove all peaches and bananas
player.getItemAssistant().deleteItem(1963, Integer.MAX_VALUE);
player.getItemAssistant().deleteItem(6883, Integer.MAX_VALUE);
fruitDeposited += amount;
while (fruitDeposited >= 16) {
int reward = random.nextInt(rewards.length);
player.getItemAssistant().addOrDropItem(rewards[reward], 1);
player.graveyardPoints++;
fruitDeposited -= 16;
}
}
public void clearItems() {
for (int item: items) {
player.getItemAssistant().deleteItem(item, Integer.MAX_VALUE);
}
player.getItemAssistant().deleteItem(1963, Integer.MAX_VALUE);
player.getItemAssistant().deleteItem(6883, Integer.MAX_VALUE);
}
/* ITEMS */
// 6904 - Animal Bones
// 6905 - Animal Bones
// 6906 - Animal Bones
// 6907 - Animal Bones
public static int[] items = {6904, 6905, 6906, 6907};
public static int[] values = {1, 2, 3, 4};
public static int[] rewards = {555, 557, 561, 560, 565};
public static int ticks = 0;
private static Random random = new Random();
/* OBJECTS */
// 10735 - Food Chute
/* INTERFACES */
// 15931 - Main interface
public static void process() {
for (Player p : PlayerHandler.players) {
if (p == null) {
continue;
}
updateInterface(p);
}
// Every 12 ticks deal 2 damage to player (50% chance)
if (++ticks % 12 == 0) {
for (Player p : PlayerHandler.players) {
if (p == null) {
continue;
}
if (!Boundary.isIn(p, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
return;
}
// TODO: Find falling bones animation/gfx ID
if (random.nextInt(1) == 0) {
p.dealDamage(2);
p.handleHitMask(2);
}
updateInterface(p);
}
}
}
public static void updateInterface(Player player) {
if (!Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
return;
}
player.getPacketSender().sendString("" + player.graveyardPoints, 15935);
player.getPacketSender().walkableInterface(15931);
}
}
@@ -15,16 +15,22 @@ public class MageTrainingArena {
public static void process() { public static void process() {
Alchemy.process(); Alchemy.process();
Enchanting.process(); Enchanting.process();
Telekinetic.process();
Graveyard.process();
} }
private final Player player; private Player player;
public final Enchanting enchanting; public Enchanting enchanting;
public final Alchemy alchemy; public Alchemy alchemy;
public Telekinetic telekinetic;
public Graveyard graveyard;
public MageTrainingArena(Player c) { public MageTrainingArena(Player c) {
this.player = c; this.player = c;
this.enchanting = new Enchanting(c); this.enchanting = new Enchanting(c);
this.alchemy = new Alchemy(c); this.alchemy = new Alchemy(c);
this.telekinetic = new Telekinetic(c);
this.graveyard = new Graveyard(c);
} }
private final int[] shopItems = { private final int[] shopItems = {
@@ -277,6 +283,8 @@ public class MageTrainingArena {
} else { } else {
player.getItemAssistant().addItem(itemId, 1); player.getItemAssistant().addItem(itemId, 1);
} }
// Update point amounts
openShop();
} }
public void enchantItem(int itemID, int spellID) { public void enchantItem(int itemID, int spellID) {
@@ -0,0 +1,271 @@
package com.rs2.game.content.minigames.magetrainingarena;
import java.awt.Point;
import java.util.Random;
import com.rs2.GameConstants;
import com.rs2.GameEngine;
import com.rs2.event.CycleEvent;
import com.rs2.event.CycleEventContainer;
import com.rs2.event.CycleEventHandler;
import com.rs2.game.content.combat.magic.MagicData;
import com.rs2.game.items.GroundItem;
import com.rs2.game.players.Player;
import com.rs2.game.players.PlayerHandler;
import com.rs2.world.Boundary;
import com.rs2.world.clip.Region;
public class Telekinetic {
public static enum Maze {
MAZE_0(3338, 9705, 0,
3343, 9705,
3347, 9714),
MAZE_1(3366, 9711, 0,
3375, 9715,
3367, 9720),
MAZE_2(3338, 9675, 0,
3343, 9680,
3342, 9684),
MAZE_3(3369, 9673, 0,
3373, 9678,
3375, 9682),
MAZE_4(3374, 9713, 1,
3374, 9713,
3383, 9713),
MAZE_5(3341, 9708, 1,
3350, 9717,
3341, 9708),
MAZE_6(3346, 9680, 1,
3351, 9684,
3353, 9680),
MAZE_7(3376, 9677, 1,
3376, 9686,
3385, 9686),
MAZE_8(3339, 9674, 2,
3348, 9674,
3339, 9683),
MAZE_9(3343, 9709, 2,
3346, 9718,
3345, 9718);
public int minX, maxX, minY, maxY, height, startX, startY, endX, endY;
public Boundary mazeArea, mazeUp, mazeRight, mazeDown, mazeLeft;
public GroundItem statue;
public boolean initialized = false;
private Maze(int minX, int minY, int height, int startX, int startY, int endX, int endY) {
this.minX = minX;
this.maxX = minX + 9;
this.minY = minY;
this.maxY = minY + 9;
this.height = height;
this.startX = startX;
this.startY = startY;
this.endX = endX;
this.endY = endY;
this.mazeArea = new Boundary(minX, maxX, minY, maxY, height);
this.mazeUp = new Boundary(minX, maxX, maxY + 1, maxY + 2, height);
this.mazeRight = new Boundary(maxX + 1, maxX + 2, minY, maxY, height);
this.mazeDown = new Boundary(minX, maxX, minY - 2, minY - 1, height);
this.mazeLeft = new Boundary(minX - 2, minX - 1, minY, maxY, height);
this.statue = new GroundItem(6888, startX, startY, height, 1, -1, 0, "");
}
public static Maze getMaze(int x, int y, int h) {
for (Maze maze : values()){
if (Boundary.isIn(x, y, h, maze.mazeArea)) {
return maze;
}
}
return null;
}
public Point calcDirection(Player player) {
if (Boundary.isIn(player, mazeUp)) {
return new Point(0, 1);
}
if (Boundary.isIn(player, mazeRight)) {
return new Point(1, 0);
}
if (Boundary.isIn(player, mazeDown)) {
return new Point(0, -1);
}
if (Boundary.isIn(player, mazeLeft)) {
return new Point(-1, 0);
}
return new Point(0, 0);
}
public Point getNewPos(int curX, int curY, int dirX, int dirY) {
if (dirX != 0) {
while(curX >= minX && curX <= maxX && Region.getClipping(curX + dirX, curY, this.height, dirX, dirY)) {
curX += dirX;
}
}
if (dirY != 0) {
while(curY >= minY && curY <= maxY && Region.getClipping(curX, curY + dirY, this.height, dirX, dirY)) {
curY += dirY;
}
}
return new Point(curX, curY);
}
}
private Player player;
private Random random = new Random();
private boolean observingStatue = false;
public Telekinetic(Player c) {
this.player = c;
}
public void moveStatue(int itemX, int itemY) {
// Play animation, Award XP
player.walkingToItem = true;
int offY = (player.getX() - itemX) * -1;
int offX = (player.getY() - itemY) * -1;
player.teleGrabX = itemX;
player.teleGrabY = itemY;
player.turnPlayerTo(itemX, itemY);
player.teleGrabDelay = System.currentTimeMillis();
player.startAnimation(MagicData.MAGIC_SPELLS[51][2]);
player.gfx100(MagicData.MAGIC_SPELLS[51][3]);
player.getPlayerAssistant().createPlayersStillGfx(144, itemX, itemY, 0, 72);
player.getPlayerAssistant().createPlayersProjectile(player.getX(), player.getY(), offX, offY, 50, 70, MagicData.MAGIC_SPELLS[51][4], 50, 10, 0, 50);
player.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[51][7], GameConstants.MAGIC);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.stopMovement();
Maze maze = Maze.getMaze(itemX, itemY, player.heightLevel);
if (maze == null) {
return;
}
Point direction = maze.calcDirection(player);
Point newPosition = maze.getNewPos(itemX, itemY, direction.x, direction.y);
CycleEventHandler.getSingleton().addEvent(player, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (!player.walkingToItem) {
container.stop();
} else if (System.currentTimeMillis() - player.teleGrabDelay > 1550) {
if (GameEngine.itemHandler.itemExists(6888, itemX, itemY)) {
GameEngine.itemHandler.moveItem(maze.statue, newPosition.x, newPosition.y);
if (newPosition.x == maze.endX && newPosition.y == maze.endY) {
player.telekineticPoints += 2;
player.telekineticMazesSolved++;
// Every 5 solves, give the player 8 extra points, 10 law runes, 1000 magic experience
if (player.telekineticMazesSolved % 5 == 0) {
player.telekineticPoints += 8;
player.getItemAssistant().addOrDropItem(563, 10);
player.getPlayerAssistant().addSkillXP(1000, GameConstants.MAGIC);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
}
resetStatue(newPosition.x, newPosition.y);
if (observingStatue) {
observingStatue = false;
player.getPlayerAssistant().sendCameraReset();
}
goToMaze();
}
}
stop();
}
}
@Override
public void stop() {
player.usingMagic = false;
player.walkingToItem = false;
}
}, 1);
}
public void goToMaze() {
int r = random.nextInt(Maze.values().length);
Maze maze = Maze.values()[r];
player.getPlayerAssistant().startTeleport2(maze.minX - 1, maze.minY - 1, maze.height);
CycleEventHandler.getSingleton().addEvent(player, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
GameEngine.itemHandler.reloadItems(player);
container.stop();
}
@Override
public void stop() {}
}, 8);
}
public void observeStatue(int itemX, int itemY) {
Maze maze = Maze.getMaze(itemX, itemY, player.heightLevel);
if (maze == null) {
return;
}
if (!observingStatue) {
observingStatue = true;
player.getPlayerAssistant().sendCameraCutscene((maze.minX + 5) - 8 * player.getMapRegionX(), (maze.minY - 1) - 8 * player.getMapRegionY(), 10, 25, 0);
player.getPlayerAssistant().sendCameraCutscene2((maze.minX + 5) - 8 * player.getMapRegionX(), (maze.minY + 5) - 8 * player.getMapRegionY() - 8, 2400, 25, 0);
player.getPacketSender().sendMessage("You overlook the maze..");
player.getPacketSender().sendMessage("Click the statue again to leave this view.");
} else {
observingStatue = false;
player.getPlayerAssistant().sendCameraReset();
}
// TODO: Figure out how to get this working correctly
// not sure exactly where the camera is supposed to be facing etc
}
public void resetStatue(int itemX, int itemY) {
Maze maze = Maze.getMaze(itemX, itemY, player.heightLevel);
if (maze == null) {
return;
}
// reset statue to start position
GameEngine.itemHandler.moveItem(maze.statue, maze.startX, maze.startY);
}
/* ITEMS */
// 6888 - Guardian Statue
/* OBJECTS */
/* INTERFACES */
// 15962 - Main interface
// 15966 - Pizazz points
// 15968 - Mazes solved
public static int ticks = 0;
public static void process() {
for (Maze maze: Maze.values()) {
if (!maze.initialized) {
maze.initialized = true;
GameEngine.itemHandler.createGlobalItem(maze.statue);
}
}
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_TELEKINETIC)) {
return;
}
player.getPacketSender().sendString("" + player.telekineticPoints, 15966);
player.getPacketSender().sendString("" + player.telekineticMazesSolved, 15968);
}
}
@@ -2,7 +2,7 @@ package com.rs2.game.items;
public class GroundItem { public class GroundItem {
public int itemId, itemX, itemY, itemAmount, itemController, hideTicks, removeTicks; public int itemId, itemX, itemY, itemH, itemAmount, itemController, hideTicks, removeTicks;
public String ownerName; public String ownerName;
@@ -11,6 +11,7 @@ public class GroundItem {
itemId = id; itemId = id;
itemX = x; itemX = x;
itemY = y; itemY = y;
itemH = h;
itemAmount = amount; itemAmount = amount;
itemController = controller; itemController = controller;
this.hideTicks = hideTicks; this.hideTicks = hideTicks;
@@ -29,6 +30,10 @@ public class GroundItem {
return itemY; return itemY;
} }
public int getItemH() {
return itemH;
}
public int getItemAmount() { public int getItemAmount() {
return itemAmount; return itemAmount;
} }
@@ -2636,9 +2636,18 @@ public class ObjectsActions {
else if (player.absY == 3300) else if (player.absY == 3300)
player.getPlayerAssistant().movePlayer(player.absX, player.absY - 2, 0); player.getPlayerAssistant().movePlayer(player.absX, player.absY - 2, 0);
break; break;
case 10725: // Bone Pile
case 10726: // Bone Pile
case 10727: // Bone Pile
case 10728: // Bone Pile
player.getMageTrainingArena().graveyard.searchBonePile(objectType);
break;
case 10734: // Coin Collector case 10734: // Coin Collector
player.getMageTrainingArena().alchemy.collectCoins(); player.getMageTrainingArena().alchemy.collectCoins();
break; break;
case 10735: // Food Chute
player.getMageTrainingArena().graveyard.depositFood();
break;
case 10771: case 10771:
player.getPlayerAssistant().movePlayer(3369, 3307, 1); player.getPlayerAssistant().movePlayer(3369, 3307, 1);
break; break;
@@ -2653,8 +2662,7 @@ public class ObjectsActions {
break; break;
case 10778: case 10778:
// TODO: Require Pizazz progress hat equiped // TODO: Require Pizazz progress hat equiped
player.getDialogueHandler().sendStatement("This area is currently closed."); player.getMageTrainingArena().telekinetic.goToMaze();
// player.getPlayerAssistant().startTeleport2(3336, 9718, 0); // Telekinetic floor 0
break; break;
case 10779: case 10779:
// TODO: Require Pizazz progress hat equiped // TODO: Require Pizazz progress hat equiped
@@ -2670,8 +2678,7 @@ public class ObjectsActions {
break; break;
case 10781: case 10781:
// TODO: Require Pizazz progress hat equiped // TODO: Require Pizazz progress hat equiped
player.getDialogueHandler().sendStatement("This area is currently closed."); player.getPlayerAssistant().startTeleport2(3364, 9639, 1); // Graveyard training
// player.getPlayerAssistant().startTeleport2(3364, 9639, 1); // Graveyard training
break; break;
case 10782: // Leave mage training rooms case 10782: // Leave mage training rooms
player.getPlayerAssistant().startTeleport2(3363, 3318, 0); player.getPlayerAssistant().startTeleport2(3363, 3318, 0);
@@ -824,6 +824,10 @@ public abstract class Player {
getPacketSender().walkableInterface(15892); getPacketSender().walkableInterface(15892);
} else if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) { } else if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) {
getPacketSender().walkableInterface(15917); getPacketSender().walkableInterface(15917);
} else if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_TELEKINETIC)) {
getPacketSender().walkableInterface(15962);
} else if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
getPacketSender().walkableInterface(15931);
} else { } else {
getPacketSender().sendMapState(0); getPacketSender().sendMapState(0);
if (!isSnowy) { if (!isSnowy) {
@@ -1642,7 +1646,7 @@ public abstract class Player {
crystalBowArrowCount, playerMagicBook, teleGfx, teleEndAnimation, crystalBowArrowCount, playerMagicBook, teleGfx, teleEndAnimation,
teleHeight, teleX, teleY, rangeItemUsed, killingNpcIndex, teleHeight, teleX, teleY, rangeItemUsed, killingNpcIndex,
totalDamageDealt, globalDamageDealt, oldNpcIndex, fightMode, attackTimer, totalDamageDealt, globalDamageDealt, oldNpcIndex, fightMode, attackTimer,
bowSpecShot, ectofuntusWorshipped, graveyardPoints, alchemyPoints, enchantmentPoints, telekineticPoints; bowSpecShot, ectofuntusWorshipped, graveyardPoints, alchemyPoints, enchantmentPoints, telekineticPoints, telekineticMazesSolved;
public boolean magicFailed, oldMagicFailed; public boolean magicFailed, oldMagicFailed;
/** /**
* End * End
@@ -2160,14 +2164,21 @@ public abstract class Player {
getMageTrainingArena().alchemy.clearItems(); getMageTrainingArena().alchemy.clearItems();
} }
if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING) && !Boundary.isIn(teleportToX, teleportToY, teleHeight, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) { if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING) && !Boundary.isIn(teleportToX, teleportToY, teleHeight, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) {
// remove any alchemy training items // remove any enchanting training items
getMageTrainingArena().enchanting.clearItems(); getMageTrainingArena().enchanting.clearItems();
} }
if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD) && !Boundary.isIn(teleportToX, teleportToY, teleHeight, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
// remove any enchanting training items
getMageTrainingArena().graveyard.clearItems();
}
currentX = teleportToX - 8 * mapRegionX; currentX = teleportToX - 8 * mapRegionX;
currentY = teleportToY - 8 * mapRegionY; currentY = teleportToY - 8 * mapRegionY;
absX = teleportToX; absX = teleportToX;
absY = teleportToY; absY = teleportToY;
heightLevel = teleHeight >= 0 ? teleHeight : heightLevel >= 0 ? heightLevel : 0; int newHeight = teleHeight >= 0 ? teleHeight : heightLevel >= 0 ? heightLevel : 0;
if (heightLevel != newHeight)
GameEngine.itemHandler.reloadItems(this);
heightLevel = newHeight;
resetWalkingQueue(); resetWalkingQueue();
teleportToX = teleportToY = teleHeight = -1; teleportToX = teleportToY = teleHeight = -1;
@@ -769,6 +769,9 @@ public class PlayerAssistant {
player.npcIndex = 0; player.npcIndex = 0;
player.playerIndex = 0; player.playerIndex = 0;
player.faceUpdate(0); player.faceUpdate(0);
if (player.heightLevel != height) {
player.refresh = true;
}
player.teleHeight = height; player.teleHeight = height;
player.startAnimation(714); player.startAnimation(714);
player.teleTimer = 11; player.teleTimer = 11;
@@ -833,6 +836,9 @@ public class PlayerAssistant {
player.npcIndex = 0; player.npcIndex = 0;
player.playerIndex = 0; player.playerIndex = 0;
player.faceUpdate(0); player.faceUpdate(0);
if (player.heightLevel != height) {
player.refresh = true;
}
player.teleHeight = height; player.teleHeight = height;
player.startAnimation(714); player.startAnimation(714);
player.teleTimer = 11; player.teleTimer = 11;
@@ -2302,8 +2308,25 @@ public class PlayerAssistant {
*/ */
public void sendCameraCutscene(int x, int y, int height, int speed, int angle) { public void sendCameraCutscene(int x, int y, int height, int speed, int angle) {
player.getOutStream().createFrame(177); player.getOutStream().createFrame(177);
player.getOutStream().writeByte(x / 64); // player.getOutStream().writeByte(x); // divided by 64 apparently allows real world coords
player.getOutStream().writeByte(y / 64); // player.getOutStream().writeByte(y); // divided by 64 apparently allows real world coords
player.getOutStream().writeWord(height); //
player.getOutStream().writeByte(speed); //
player.getOutStream().writeByte(angle);
}
/**
* anchors the camera to a specific view (for cutscenes)
* @param x The X Coordinate (Within the player's loaded area)
* @param y The Y Coordinate (Within the player's loaded area)
* @param height The Height of Camera (not relative to the game world height)
* @param speed The Camera Speed (Speed at which the camera turns to where it should point?)
* @param angle The Camera Angle
*/
public void sendCameraCutscene2(int x, int y, int height, int speed, int angle) {
player.getOutStream().createFrame(166);
player.getOutStream().writeByte(x); //
player.getOutStream().writeByte(y); //
player.getOutStream().writeWord(height); // player.getOutStream().writeWord(height); //
player.getOutStream().writeByte(speed); // player.getOutStream().writeByte(speed); //
player.getOutStream().writeByte(angle); player.getOutStream().writeByte(angle);
@@ -399,6 +399,7 @@ public class PlayerHandler {
if (plr.refresh) { if (plr.refresh) {
GlobalDropsHandler.reset((Client)plr); GlobalDropsHandler.reset((Client)plr);
GameEngine.itemHandler.reloadItems(plr);
plr.refresh = false; plr.refresh = false;
} }
} }
@@ -425,6 +425,9 @@ public class PlayerSave {
case "telekinetic-points": case "telekinetic-points":
player.telekineticPoints = Integer.parseInt(token2); player.telekineticPoints = Integer.parseInt(token2);
break; break;
case "telekinetic-mazes-solved":
player.telekineticMazesSolved = Integer.parseInt(token2);
break;
case "unlocked-bones-to-peaches": case "unlocked-bones-to-peaches":
player.unlockedBonesToPeaches = Boolean.parseBoolean(token2); player.unlockedBonesToPeaches = Boolean.parseBoolean(token2);
break; break;
@@ -806,6 +809,8 @@ public class PlayerSave {
characterfile.newLine(); characterfile.newLine();
characterfile.write("telekinetic-points = " + player.telekineticPoints); characterfile.write("telekinetic-points = " + player.telekineticPoints);
characterfile.newLine(); characterfile.newLine();
characterfile.write("telekinetic-mazes-solved = " + player.telekineticMazesSolved);
characterfile.newLine();
characterfile.write("unlocked-bones-to-peaches = " + player.unlockedBonesToPeaches); characterfile.write("unlocked-bones-to-peaches = " + player.unlockedBonesToPeaches);
characterfile.newLine(); characterfile.newLine();
String voidStatus = ""; String voidStatus = "";
@@ -35,6 +35,7 @@ import com.rs2.game.players.Player;
import com.rs2.game.players.PlayerHandler; import com.rs2.game.players.PlayerHandler;
import com.rs2.net.packets.PacketType; import com.rs2.net.packets.PacketType;
import com.rs2.util.Misc; import com.rs2.util.Misc;
import com.rs2.world.Boundary;
/** /**
* Clicking most buttons * Clicking most buttons
@@ -121,6 +122,9 @@ public class ClickingButtons implements PacketType {
case 4135: case 4135:
if (System.currentTimeMillis() - player.boneDelay < 2000) {
return;
}
if (player.inTrade) { if (player.inTrade) {
player.getPacketSender().sendMessage( player.getPacketSender().sendMessage(
"You can't do this in trade!"); "You can't do this in trade!");
@@ -133,9 +137,12 @@ public class ClickingButtons implements PacketType {
player.getPacketSender().sendChatInterface(356); player.getPacketSender().sendChatInterface(356);
return; return;
} }
if (Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
player.getMageTrainingArena().graveyard.bonesToFood(52);
return;
}
if (!player.getItemAssistant().playerHasItem(526, 1)) { if (!player.getItemAssistant().playerHasItem(526, 1)) {
player.getPacketSender().sendMessage( player.getPacketSender().sendMessage("You don't have any bones!");
"You don't have any bones!");
return; return;
} }
if (!player.getItemAssistant().playerHasItem(561, 1) if (!player.getItemAssistant().playerHasItem(561, 1)
@@ -149,22 +156,23 @@ public class ClickingButtons implements PacketType {
player.getItemAssistant().deleteItem(561, 1); player.getItemAssistant().deleteItem(561, 1);
player.getItemAssistant().deleteItem(557, 2); player.getItemAssistant().deleteItem(557, 2);
player.getItemAssistant().deleteItem(555, 2); player.getItemAssistant().deleteItem(555, 2);
player.getPlayerAssistant().addSkillXP(40, 6); player.getPlayerAssistant().addSkillXP(25, 6);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC); player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.startAnimation(722); player.startAnimation(722);
player.gfx100(141); player.gfx100(141);
player.getPacketSender().sendShowTab(6); player.getPacketSender().sendShowTab(6);
player.getPacketSender().sendSound( player.getPacketSender().sendSound(SoundList.BONES_TO_BANNAS, 100, 0);
SoundList.BONES_TO_BANNAS, 100, 0);
player.boneDelay = System.currentTimeMillis(); player.boneDelay = System.currentTimeMillis();
do { do {
player.getItemAssistant().deleteItem(526, 1); player.getItemAssistant().replaceItem(526, 1963);
player.getItemAssistant().addItem(1963, 1);
} while (player.getItemAssistant().playerHasItem(526, 1)); } while (player.getItemAssistant().playerHasItem(526, 1));
} }
break; break;
case 62005: case 62005:
if (System.currentTimeMillis() - player.boneDelay < 2000) {
return;
}
if (player.inTrade) { if (player.inTrade) {
player.getPacketSender().sendMessage( player.getPacketSender().sendMessage(
"You can't do this in trade!"); "You can't do this in trade!");
@@ -180,6 +188,10 @@ public class ClickingButtons implements PacketType {
player.getPacketSender().sendChatInterface(356); player.getPacketSender().sendChatInterface(356);
return; return;
} }
if (Boundary.isIn(player, Boundary.MAGE_TRAINING_ARENA_GRAVEYARD)) {
player.getMageTrainingArena().graveyard.bonesToFood(53);
return;
}
if (!player.getItemAssistant().playerHasItem(526, 1)) { 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; return;
@@ -197,15 +209,14 @@ public class ClickingButtons implements PacketType {
player.getItemAssistant().deleteItem(561, 2); player.getItemAssistant().deleteItem(561, 2);
player.getItemAssistant().deleteItem(557, 4); player.getItemAssistant().deleteItem(557, 4);
player.getItemAssistant().deleteItem(555, 4); player.getItemAssistant().deleteItem(555, 4);
player.getPlayerAssistant().addSkillXP(40, 6); player.getPlayerAssistant().addSkillXP(35.5, 6);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC); player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.startAnimation(722); player.startAnimation(722);
player.gfx100(311); player.gfx100(311);
player.getPacketSender().sendShowTab(6); player.getPacketSender().sendShowTab(6);
player.boneDelay = System.currentTimeMillis(); player.boneDelay = System.currentTimeMillis();
do { do {
player.getItemAssistant().deleteItem(526, 1); player.getItemAssistant().replaceItem(526, 6883);
player.getItemAssistant().addItem(6883, 1);
} while (player.getItemAssistant().playerHasItem(526, 1)); } while (player.getItemAssistant().playerHasItem(526, 1));
} }
break; break;
@@ -118,6 +118,7 @@ public class Commands implements PacketType {
case "pos": case "pos":
case "loc": case "loc":
player.getPacketSender().sendMessage("Your coords are [" + player.absX + ", " + player.absY + ", " + player.heightLevel + "]"); player.getPacketSender().sendMessage("Your coords are [" + player.absX + ", " + player.absY + ", " + player.heightLevel + "]");
player.getPacketSender().sendMessage("local coord are [" + player.getLocalX() + ", " + player.getLocalY() + "]");
break; break;
case "energy": case "energy":
player.getPacketSender().sendMessage(String.format("Run energy: %d", (int) player.playerEnergy)); player.getPacketSender().sendMessage(String.format("Run energy: %d", (int) player.playerEnergy));
@@ -685,16 +686,16 @@ public class Commands implements PacketType {
player.getPlayerAssistant().movePlayer(Integer.parseInt(arguments[0]), Integer.parseInt(arguments[1]), Integer.parseInt(arguments[2])); player.getPlayerAssistant().movePlayer(Integer.parseInt(arguments[0]), Integer.parseInt(arguments[1]), Integer.parseInt(arguments[2]));
break; break;
case "up": case "up":
player.getPacketSender().sendMessage("You are now on height level " + (player.heightLevel + 1) + ".");
player.getPlayerAssistant().movePlayer(player.absX, player.absY, player.heightLevel + 1); player.getPlayerAssistant().movePlayer(player.absX, player.absY, player.heightLevel + 1);
player.getPacketSender().sendMessage("You are now on height level " + player.heightLevel + ".");
break; break;
case "up2": case "up2":
player.getPlayerAssistant().movePlayer(player.absX, player.absY - 6400, player.heightLevel); player.getPlayerAssistant().movePlayer(player.absX, player.absY - 6400, player.heightLevel);
player.getPacketSender().sendMessage("You are now on height level " + player.heightLevel + "."); player.getPacketSender().sendMessage("You are now on height level " + player.heightLevel + ".");
break; break;
case "down": case "down":
player.getPacketSender().sendMessage("You are now on height level " + (player.heightLevel - 1) + ".");
player.getPlayerAssistant().movePlayer(player.absX, player.absY, player.heightLevel - 1); player.getPlayerAssistant().movePlayer(player.absX, player.absY, player.heightLevel - 1);
player.getPacketSender().sendMessage("You are now on height level " + player.heightLevel + ".");
break; break;
case "down2": case "down2":
player.getPlayerAssistant().movePlayer(player.absX, player.absY + 6400, player.heightLevel); player.getPlayerAssistant().movePlayer(player.absX, player.absY + 6400, player.heightLevel);
@@ -795,12 +796,24 @@ public class Commands implements PacketType {
player.getPacketSender().sendMessage("Sound could not be sent."); player.getPacketSender().sendMessage("Sound could not be sent.");
} }
break; break;
case "ccs":
case "cameracutscene": case "cameracutscene":
player.getPlayerAssistant().sendCameraCutscene(player.getX(), player.getY(), 10, 10, 10); //Test numbers if (arguments.length < 5) {
return;
}
player.getPlayerAssistant().sendCameraCutscene(Integer.parseInt(arguments[0]), Integer.parseInt(arguments[1]), Integer.parseInt(arguments[2]), Integer.parseInt(arguments[3]), Integer.parseInt(arguments[4])); //Test numbers
break;
case "ccs2":
case "cameracutscene2":
if (arguments.length < 5) {
return;
}
player.getPlayerAssistant().sendCameraCutscene2(Integer.parseInt(arguments[0]), Integer.parseInt(arguments[1]), Integer.parseInt(arguments[2]), Integer.parseInt(arguments[3]), Integer.parseInt(arguments[4])); //Test numbers
break; break;
case "camerashake": case "camerashake":
player.getPlayerAssistant().sendCameraShake(1, 9, 1, 9); //these are just test numbers player.getPlayerAssistant().sendCameraShake(1, 9, 1, 9); //these are just test numbers
break; break;
case "cr":
case "camerareset": case "camerareset":
player.getPlayerAssistant().sendCameraReset(); //Resets the camera to the normal player view player.getPlayerAssistant().sendCameraReset(); //Resets the camera to the normal player view
break; break;
@@ -13,6 +13,11 @@ public class ItemClick2OnGroundItem implements PacketType {
final int itemY = player.getInStream().readSignedWordBigEndianA(); final int itemY = player.getInStream().readSignedWordBigEndianA();
final int itemId = player.getInStream().readUnsignedWordA(); final int itemId = player.getInStream().readUnsignedWordA();
System.out.println("ItemClick2OnGroundItem - " + player.playerName + " - " + itemId + " - " + itemX + " - " + itemY); System.out.println("ItemClick2OnGroundItem - " + player.playerName + " - " + itemId + " - " + itemX + " - " + itemY);
// Reset position for the telekinetic guardian statue
if (itemId == 6888) {
player.getMageTrainingArena().telekinetic.resetStatue(itemX, itemY);
return;
}
if (player.absX != itemX || player.absY != itemY) { if (player.absX != itemX || player.absY != itemY) {
player.getPacketSender().sendMessage("You can't do that there!"); player.getPacketSender().sendMessage("You can't do that there!");
return; return;
@@ -6,9 +6,10 @@ import com.rs2.event.CycleEvent;
import com.rs2.event.CycleEventContainer; import com.rs2.event.CycleEventContainer;
import com.rs2.event.CycleEventHandler; import com.rs2.event.CycleEventHandler;
import com.rs2.game.content.combat.magic.MagicData; import com.rs2.game.content.combat.magic.MagicData;
import com.rs2.game.items.ItemData;
import com.rs2.game.players.Player; import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType; import com.rs2.net.packets.PacketType;
import com.rs2.world.GlobalDropsHandler;
import com.rs2.world.clip.PathFinder;
/** /**
* Magic on floor items * Magic on floor items
@@ -22,24 +23,38 @@ public class MagicOnFloorItems implements PacketType {
int itemId = player.getInStream().readUnsignedWord(); int itemId = player.getInStream().readUnsignedWord();
final int itemX = player.getInStream().readSignedWordBigEndian(); final int itemX = player.getInStream().readSignedWordBigEndian();
player.getInStream().readUnsignedWordA(); player.getInStream().readUnsignedWordA();
player.stopMovement();
if (!GameEngine.itemHandler.itemExists(itemId, itemX, itemY)) { if (!GameEngine.itemHandler.itemExists(itemId, itemX, itemY)) {
player.stopMovement(); player.getPacketSender().sendMessage("This item no longer exist.");
return; return;
} }
player.usingMagic = true; if (System.currentTimeMillis() - player.teleGrabDelay <= 1550) {
player.endCurrentTask(); return;
if (!player.getCombatAssistant().checkMagicReqs(51)) { }
player.stopMovement(); if (player.getItemAssistant().freeSlots(itemId, 1) <= 0) {
player.getPacketSender().sendMessage("You don't have enough space in your inventory.");
return;
}
if (!player.goodDistance(player.getX(), player.getY(), itemX, itemY, 12)) {
return;
}
if (!PathFinder.isProjectilePathClear(player.getX(), player.getY(), player.heightLevel, itemX, itemY)) {
player.getPacketSender().sendMessage("You can't see this item.");
return;
}
player.endCurrentTask();
player.usingMagic = true;
if (!player.getCombatAssistant().checkMagicReqs(51)) {
return;
}
if (itemId == 6888 && player.goodDistance(player.getX(), player.getY(), itemX, itemY, 20)) {
player.getMageTrainingArena().telekinetic.moveStatue(itemX, itemY);
return; return;
} }
if ((player.getItemAssistant().freeSlots() >= 1 || player.getItemAssistant()
.playerHasItem(itemId, 1))
&& ItemData.itemStackable[itemId]
|| player.getItemAssistant().freeSlots() > 0
&& !ItemData.itemStackable[itemId]) {
if (player.goodDistance(player.getX(), player.getY(), itemX, itemY, 12)) {
player.walkingToItem = true; player.walkingToItem = true;
int offY = (player.getX() - itemX) * -1; int offY = (player.getX() - itemX) * -1;
int offX = (player.getY() - itemY) * -1; int offX = (player.getY() - itemY) * -1;
@@ -50,67 +65,32 @@ public class MagicOnFloorItems implements PacketType {
player.teleGrabDelay = System.currentTimeMillis(); player.teleGrabDelay = System.currentTimeMillis();
player.startAnimation(MagicData.MAGIC_SPELLS[51][2]); player.startAnimation(MagicData.MAGIC_SPELLS[51][2]);
player.gfx100(MagicData.MAGIC_SPELLS[51][3]); player.gfx100(MagicData.MAGIC_SPELLS[51][3]);
player.getPlayerAssistant().createPlayersStillGfx(144, itemX, itemY, player.getPlayerAssistant().createPlayersStillGfx(144, itemX, itemY, 0, 72);
0, 72);
player.getPlayerAssistant().createPlayersProjectile(player.getX(), player.getPlayerAssistant().createPlayersProjectile(player.getX(),
player.getY(), offX, offY, 50, 70, player.getY(), offX, offY, 50, 70,
MagicData.MAGIC_SPELLS[51][4], 50, 10, 0, 50); MagicData.MAGIC_SPELLS[51][4], 50, 10, 0, 50);
player.getPlayerAssistant().addSkillXP( player.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[51][7], 6);
MagicData.MAGIC_SPELLS[51][7], 6);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC); player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.stopMovement(); player.stopMovement();
CycleEventHandler.getSingleton().addEvent(player, new CycleEvent() { CycleEventHandler.getSingleton().addEvent(player, new CycleEvent() {
@Override @Override
public void execute(CycleEventContainer container) { public void execute(CycleEventContainer container) {
if (!player.walkingToItem) { if (!player.walkingToItem) {
stop();
}
if (System.currentTimeMillis() - player.teleGrabDelay > 1550
&& player.usingMagic) {
if (GameEngine.itemHandler.itemExists(player.teleGrabItem,
player.teleGrabX, player.teleGrabY)
&& player.goodDistance(player.getX(), player.getY(),
itemX, itemY, 12)) {
GameEngine.itemHandler.removeGroundItem(player,
player.teleGrabItem, player.teleGrabX,
player.teleGrabY, true);
player.usingMagic = false;
container.stop(); container.stop();
} else if (System.currentTimeMillis() - player.teleGrabDelay > 1550) {
if (GameEngine.itemHandler.itemExists(player.teleGrabItem, player.teleGrabX, player.teleGrabY)) {
GameEngine.itemHandler.removeGroundItem(player, player.teleGrabItem, player.teleGrabX, player.teleGrabY, true);
GlobalDropsHandler.pickup(player, player.teleGrabItem, player.teleGrabX, player.teleGrabY);
} }
stop();
} }
} }
@Override @Override
public void stop() { public void stop() {
player.usingMagic = false;
player.walkingToItem = false; player.walkingToItem = false;
} }
}, 1); }, 1);
} }
} else {
player.getPacketSender().sendMessage(
"You don't have enough space in your inventory.");
player.stopMovement();
}
if (player.goodDistance(player.getX(), player.getY(), itemX, itemY, 12)) {
int offY = (player.getX() - itemX) * -1;
int offX = (player.getY() - itemY) * -1;
player.teleGrabX = itemX;
player.teleGrabY = itemY;
player.teleGrabItem = itemId;
player.turnPlayerTo(itemX, itemY);
player.teleGrabDelay = System.currentTimeMillis();
player.startAnimation(MagicData.MAGIC_SPELLS[51][2]);
player.gfx100(MagicData.MAGIC_SPELLS[51][3]);
player.getPlayerAssistant().createPlayersStillGfx(144, itemX, itemY, 0,
72);
player.getPlayerAssistant().createPlayersProjectile(player.getX(), player.getY(),
offX, offY, 50, 70, MagicData.MAGIC_SPELLS[51][4], 50, 10,
0, 50);
player.getPlayerAssistant().addSkillXP(MagicData.MAGIC_SPELLS[51][7], 6);
player.getPlayerAssistant().refreshSkill(GameConstants.MAGIC);
player.stopMovement();
}
}
} }
@@ -13,7 +13,9 @@ import com.rs2.game.items.impl.RareProtection;
import com.rs2.game.players.Player; import com.rs2.game.players.Player;
import com.rs2.net.packets.PacketType; import com.rs2.net.packets.PacketType;
import com.rs2.util.GameLogger; import com.rs2.util.GameLogger;
import com.rs2.world.Boundary;
import com.rs2.world.GlobalDropsHandler; import com.rs2.world.GlobalDropsHandler;
import com.rs2.world.clip.PathFinder;
/** /**
* Pickup Item * Pickup Item
@@ -26,13 +28,19 @@ public class PickupItem implements PacketType {
player.pItemY = player.getInStream().readSignedWordBigEndian(); player.pItemY = player.getInStream().readSignedWordBigEndian();
player.pItemId = player.getInStream().readUnsignedWord(); player.pItemId = player.getInStream().readUnsignedWord();
player.pItemX = player.getInStream().readSignedWordBigEndian(); player.pItemX = player.getInStream().readSignedWordBigEndian();
if (player.getItemAssistant().freeSlots() < 1) // Cannot pickup the telekinetic guardian statue, should show overview of current maze
{ if (player.pItemId == 6888) {
if (!(player.getItemAssistant().playerHasItem(player.pItemId) && player.getItemAssistant().isStackable(player.pItemId))) player.getMageTrainingArena().telekinetic.observeStatue(player.pItemX, player.pItemY);
{
player.getPacketSender().sendMessage("Not enough space in your inventory.");
return; return;
} }
// Disabled for now, doesn't detect open doors etc
// if (!PathFinder.getPathFinder().accessible(player.getX(), player.getY(), player.heightLevel, player.pItemX, player.pItemY)) {
// player.getPacketSender().sendMessage("You can't reach this item.");
// return;
// }
if (player.getItemAssistant().freeSlots(player.pItemId, 1) <= 0) {
player.getPacketSender().sendMessage("Not enough space in your inventory.");
return;
} }
if (Math.abs(player.getX() - player.pItemX) > 25 || Math.abs(player.getY() - player.pItemY) > 25) { if (Math.abs(player.getX() - player.pItemX) > 25 || Math.abs(player.getY() - player.pItemY) > 25) {
player.resetWalkingQueue(); player.resetWalkingQueue();
@@ -53,7 +61,8 @@ public class PickupItem implements PacketType {
if (!RareProtection.removeItemOtherActions(player, player.pItemId)) { if (!RareProtection.removeItemOtherActions(player, player.pItemId)) {
return; return;
} }
if (player.pItemY > 9817 && player.pItemY < 9825 && player.pItemX > 3186 && player.pItemX < 3197 || player.pItemX > 3107 && player.pItemX < 3113 && player.pItemY > 3155 && player.pItemY < 3159 && player.heightLevel == 2) { if (Boundary.isIn(player.pItemX, player.pItemY, player.heightLevel, Boundary.VARROCK_BANK_BASEMENT)
|| Boundary.isIn(player.pItemX, player.pItemY, player.heightLevel, Boundary.MAGE_TOWER_CAGE)) {
player.getPacketSender().sendMessage("You can't pick up these items!"); player.getPacketSender().sendMessage("You can't pick up these items!");
return; return;
} }
@@ -79,12 +88,7 @@ public class PickupItem implements PacketType {
if (!player.walkingToItem) { if (!player.walkingToItem) {
container.stop(); container.stop();
} }
if ((player.getX() == player.pItemX && player.getY() == player.pItemY if (player.goodDistance(player.getX(), player.getY(), player.pItemX, player.pItemY, 1) && player.walkingToItem) {
|| player.getX() - 1 == player.pItemX && player.getY() == player.pItemY
|| player.getY() - 1 == player.pItemY && player.getX() == player.pItemX
|| player.getX() + 1 == player.pItemX && player.getY() == player.pItemY
|| player.getY() + 1 == player.pItemY && player.getX() == player.pItemX
||player.getX() == player.pItemX && player.getY() == player.pItemY) && player.walkingToItem) {
container.stop(); container.stop();
} }
} }
@@ -14,17 +14,16 @@ import com.rs2.game.players.PlayerHandler;
public class Boundary { public class Boundary {
int minX, highX, minY, highY; public int minX, highX, minY, highY, height;
int height;
/** /**
* *
* @param minX * @param minX
* The south-west x coordinate * The south-west x coordinate
* @param minY
* The south-west y coordinate
* @param highX * @param highX
* The north-east x coordinate * The north-east x coordinate
* @param minY
* The south-west y coordinate
* @param highY * @param highY
* The north-east y coordinate * The north-east y coordinate
*/ */
@@ -40,10 +39,10 @@ public class Boundary {
* *
* @param minX * @param minX
* The south-west x coordinate * The south-west x coordinate
* @param minY
* The south-west y coordinate
* @param highX * @param highX
* The north-east x coordinate * The north-east x coordinate
* @param minY
* The south-west y coordinate
* @param highY * @param highY
* The north-east y coordinate * The north-east y coordinate
* @param height * @param height
@@ -301,6 +300,8 @@ public class Boundary {
new Boundary(3087, 3094, 3251, 3255), new Boundary(3121, 3130, 3240, 3246), new Boundary(3102, 3112, 3162, 3165), new Boundary(3107, 3111, 3166, 3166), new Boundary(3103, 3115, 3157, 3161), new Boundary(3087, 3094, 3251, 3255), new Boundary(3121, 3130, 3240, 3246), new Boundary(3102, 3112, 3162, 3165), new Boundary(3107, 3111, 3166, 3166), new Boundary(3103, 3115, 3157, 3161),
new Boundary(3105, 3114, 3156, 3156), new Boundary(3105, 3113, 3155, 3155), new Boundary(3106, 3112, 3154, 3154), new Boundary(3092, 3097, 3240, 3246) }; new Boundary(3105, 3114, 3156, 3156), new Boundary(3105, 3113, 3155, 3155), new Boundary(3106, 3112, 3154, 3154), new Boundary(3092, 3097, 3240, 3246) };
public static final Boundary VARROCK_BANK_BASEMENT = new Boundary(3186, 3197, 9817, 9824, 0);
public static final Boundary MAGE_TOWER_CAGE = new Boundary(3108, 3112, 3156, 3158, 2);
public static final Boundary ARDOUGNE_ZOO = new Boundary(2593, 2639, 3265, 3288); public static final Boundary ARDOUGNE_ZOO = new Boundary(2593, 2639, 3265, 3288);
public static final Boundary APE_ATOLL = new Boundary(2694, 2811, 2691, 2805); public static final Boundary APE_ATOLL = new Boundary(2694, 2811, 2691, 2805);
public static final Boundary BARROWS = new Boundary(3543, 3584, 3265, 3311); public static final Boundary BARROWS = new Boundary(3543, 3584, 3265, 3311);
@@ -313,7 +314,9 @@ public class Boundary {
public static final Boundary PARTY_ROOM = new Boundary(2727, 2746, 3460, 3479); 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 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 = new Boundary(3330, 3388, 9614, 9727);
public static final Boundary MAGE_TRAINING_ARENA_ALCHEMY = new Boundary(3350, 3379, 9616, 9655, 2);
public static final Boundary MAGE_TRAINING_ARENA_ENCHANTING = new Boundary(3341, 3386, 9618, 9662, 0); public static final Boundary MAGE_TRAINING_ARENA_ENCHANTING = new Boundary(3341, 3386, 9618, 9662, 0);
public static final Boundary MAGE_TRAINING_ARENA_GRAVEYARD = new Boundary(3340, 3386, 9616, 9662, 1);
public static final Boundary MAGE_TRAINING_ARENA_ALCHEMY = new Boundary(3350, 3379, 9616, 9655, 2);
public static final Boundary MAGE_TRAINING_ARENA_TELEKINETIC = new Boundary(3329, 3390, 9665, 9726);
} }
@@ -146,9 +146,9 @@ public class GlobalDropsHandler {
return null; return null;
} }
public static boolean itemExists(int a, int b, int c, boolean yes) { public static boolean itemExists(int itemID, int itemX, int itemY, boolean yes) {
for (GlobalDrop drop : spawnedDrops) { for (GlobalDrop drop : spawnedDrops) {
if (drop.getId() == a && drop.getX() == b && drop.getY() == c) { if (drop.getId() == itemID && drop.getX() == itemX && drop.getY() == itemY) {
return true; return true;
} }
} }
@@ -159,12 +159,12 @@ public class GlobalDropsHandler {
* Pick up an item at the given location * Pick up an item at the given location
* *
* @param player the Player * @param player the Player
* @param a item id * @param itemID item id
* @param b cord x * @param itemX cord x
* @param c cord y * @param itemY cord y
*/ */
public static void pickup(Player player, int a, int b, int c) { public static void pickup(Player player, int itemID, int itemX, int itemY) {
GlobalDrop drop = itemExists(a, b, c); GlobalDrop drop = itemExists(itemID, itemX, itemY);
if (drop == null) { if (drop == null) {
return; return;
} }
@@ -58,11 +58,7 @@ public class ItemHandler {
public int itemAmount(String name, int itemId, int itemX, int itemY) { public int itemAmount(String name, int itemId, int itemX, int itemY) {
for (GroundItem i : items) { for (GroundItem i : items) {
if (i.hideTicks >= 1 && i.getName().equalsIgnoreCase(name)) { if (i.getName().equalsIgnoreCase(name)) {
if (i.getItemId() == itemId && i.getItemX() == itemX && i.getItemY() == itemY) {
return i.getItemAmount();
}
} else if (i.hideTicks < 1) {
if (i.getItemId() == itemId && i.getItemX() == itemX && i.getItemY() == itemY) { if (i.getItemId() == itemId && i.getItemX() == itemX && i.getItemY() == itemY) {
return i.getItemAmount(); return i.getItemAmount();
} }
@@ -76,25 +72,42 @@ public class ItemHandler {
**/ **/
public boolean itemExists(int itemId, int itemX, int itemY) { public boolean itemExists(int itemId, int itemX, int itemY) {
for (GroundItem i : items) { for (GroundItem i : items) {
if (i.getItemId() == itemId && i.getItemX() == itemX if (i.getItemId() == itemId && i.getItemX() == itemX && i.getItemY() == itemY) {
&& i.getItemY() == itemY) {
return true; return true;
} }
} }
if (GlobalDropsHandler.itemExists(itemId, itemX, itemY, true)) {
return true;
}
return false; return false;
} }
public void moveItem(GroundItem item, int itemX, int itemY) {
if (items.remove(item)) {
int oldX = item.itemX;
int oldY = item.itemY;
item.itemX = itemX;
item.itemY = itemY;
items.add(item);
for (Player p: PlayerHandler.players) {
if (p == null) continue;
p.getPacketSender().removeGroundItem(item.itemId, oldX, oldY, item.itemAmount);
reloadItems(p);
}
}
}
/** /**
* Reloads any items if you enter a new region * Reloads any items if you enter a new region
**/ **/
public void reloadItems(Player c) { public void reloadItems(Player c) {
for (GroundItem i : items) { for (GroundItem i : items) {
if (c != null) { if (c != null) {
if (c.getItemAssistant().tradeable(i.getItemId()) // If it's a players item or tradeable
|| i.getName().equalsIgnoreCase(c.playerName)) { if (c.getItemAssistant().tradeable(i.getItemId()) || i.getName().equalsIgnoreCase(c.playerName)) {
if (c.distanceToPoint(i.getItemX(), i.getItemY()) <= 60) { // Make sure item on the same height and within 60 blocks
if (i.hideTicks > 0 if (c.getH() == i.getItemH() && c.distanceToPoint(i.getItemX(), i.getItemY()) <= 60) {
&& i.getName().equalsIgnoreCase(c.playerName)) { if (i.hideTicks > 0 && i.getName().equalsIgnoreCase(c.playerName)) {
c.getPacketSender().removeGroundItem( c.getPacketSender().removeGroundItem(
i.getItemId(), i.getItemX(), i.getItemY(), i.getItemId(), i.getItemX(), i.getItemY(),
i.getItemAmount()); i.getItemAmount());
@@ -175,7 +188,6 @@ public class ItemHandler {
} }
if (!com.rs2.game.items.ItemData.itemStackable[itemId] && itemAmount > 0) { if (!com.rs2.game.items.ItemData.itemStackable[itemId] && itemAmount > 0) {
for (int j = 0; j < itemAmount; j++) { for (int j = 0; j < itemAmount; j++) {
c.getPacketSender().createGroundItem(itemId, itemX, itemY, 1);
GroundItem item = new GroundItem(itemId, itemX, itemY, c.getH(), 1, c.playerId, HIDE_TICKS, PlayerHandler.players[playerId].playerName); GroundItem item = new GroundItem(itemId, itemX, itemY, c.getH(), 1, c.playerId, HIDE_TICKS, PlayerHandler.players[playerId].playerName);
addItem(item); addItem(item);
String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); String itemName = ItemAssistant.getItemName(itemId).toLowerCase();
@@ -186,7 +198,6 @@ public class ItemHandler {
} }
} }
} else { } else {
c.getPacketSender().createGroundItem(itemId, itemX, itemY, itemAmount);
GroundItem item = new GroundItem(itemId, itemX, itemY, c.getH(), itemAmount, c.playerId, HIDE_TICKS, PlayerHandler.players[playerId].playerName); GroundItem item = new GroundItem(itemId, itemX, itemY, c.getH(), itemAmount, c.playerId, HIDE_TICKS, PlayerHandler.players[playerId].playerName);
addItem(item); addItem(item);
String itemName = ItemAssistant.getItemName(itemId).toLowerCase(); String itemName = ItemAssistant.getItemName(itemId).toLowerCase();
@@ -196,6 +207,7 @@ public class ItemHandler {
} }
} }
} }
reloadItems(c);
} }
} }
@@ -203,6 +215,9 @@ public class ItemHandler {
* Shows items for everyone who is within 60 squares * Shows items for everyone who is within 60 squares
**/ **/
public void createGlobalItem(GroundItem i) { public void createGlobalItem(GroundItem i) {
if (!itemExists(i.getItemId(), i.getItemX(), i.getItemY())) {
addItem(i);
}
for (Player p : PlayerHandler.players) { for (Player p : PlayerHandler.players) {
if (p != null) { if (p != null) {
Client person = (Client) p; Client person = (Client) p;
@@ -212,7 +227,7 @@ public class ItemHandler {
&& person.playerId != i.getItemController()) { && person.playerId != i.getItemController()) {
continue; continue;
} }
if (person.distanceToPoint(i.getItemX(), i.getItemY()) <= 60) { if (person.getH() == i.getItemH() && person.distanceToPoint(i.getItemX(), i.getItemY()) <= 60) {
person.getPacketSender().createGroundItem( person.getPacketSender().createGroundItem(
i.getItemId(), i.getItemX(), i.getItemY(), i.getItemId(), i.getItemX(), i.getItemY(),
i.getItemAmount()); i.getItemAmount());
@@ -293,8 +308,7 @@ public class ItemHandler {
Client person = (Client) p; Client person = (Client) p;
if (person != null) { if (person != null) {
if (person.distanceToPoint(itemX, itemY) <= 60) { if (person.distanceToPoint(itemX, itemY) <= 60) {
person.getPacketSender().removeGroundItem(itemId, person.getPacketSender().removeGroundItem(itemId, itemX, itemY, itemAmount);
itemX, itemY, itemAmount);
} }
} }
} }
@@ -460,6 +474,7 @@ public class ItemHandler {
try { try {
FileWriter fileWriter = new FileWriter("item-dump.json"); FileWriter fileWriter = new FileWriter("item-dump.json");
fileWriter.write(array.toString()); fileWriter.write(array.toString());
fileWriter.close();
characterfile.close(); characterfile.close();
} catch (IOException e) { } catch (IOException e) {
} }