Files
2006Scape/2006Scape Server/src/main/java/com/rs2/game/players/Player.java
T
Qweqker 8ee88848a3 Astraeus Dialogue System Port (#512)
* - Marked As Deprecated
- Reorganized DialogueOptions.java so that option buttons are grouped with each interface
- Added temporary Dialogue Executor to make new Dialogue System function
- Remove Man, Woman, and Banker Dialogue and Dialogue Options

* - Refactored Dialogue.java into DialoguePacket.java
- Moved DialoguePacket.java into impl packets package
- Added Astraeus dialogue executor

* - Removed useless file
- Reorganized the Misc.java file

* - Ported Astraeus Dialogue System
- Rewrote Man, Woman, and Banker Dialogues
- Added line splitter in AstraeusDialogueFactory.java

* - Renamed Astraeus* classes to *Plugin
- Fixed an issue where the Dialogue Option buttons were not executed through the Kotlin file

(cherry picked from commit 6deaa4162a)
2021-12-14 05:53:33 +00:00

3239 lines
88 KiB
Java

package com.rs2.game.players;
import com.everythingrs.hiscores.Hiscores;
import com.rs2.GameConstants;
import com.rs2.GameEngine;
import com.rs2.event.*;
import com.rs2.game.content.BankPin;
import com.rs2.game.content.EmoteHandler;
import com.rs2.game.content.combat.CombatAssistant;
import com.rs2.game.content.combat.CombatConstants;
import com.rs2.game.content.combat.Specials;
import com.rs2.game.content.combat.magic.Enchanting;
import com.rs2.game.content.combat.prayer.PrayerData;
import com.rs2.game.content.combat.prayer.PrayerDrain;
import com.rs2.game.content.combat.range.DwarfCannon;
import com.rs2.game.content.combat.range.RangeData;
import com.rs2.game.content.consumables.Potions;
import com.rs2.game.content.guilds.impl.RangersGuild;
import com.rs2.game.content.minigames.Barrows;
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;
import com.rs2.game.content.skills.agility.*;
import com.rs2.game.content.skills.cooking.Potatoes;
import com.rs2.game.content.skills.core.Mining;
import com.rs2.game.content.skills.crafting.GlassBlowing;
import com.rs2.game.content.skills.farming.*;
import com.rs2.game.content.skills.fletching.LogCuttingInterface;
import com.rs2.game.content.skills.runecrafting.Runecrafting;
import com.rs2.game.content.skills.slayer.Slayer;
import com.rs2.game.content.skills.smithing.Smithing;
import com.rs2.game.content.skills.smithing.SmithingInterface;
import com.rs2.game.content.traveling.DesertCactus;
import com.rs2.game.content.traveling.DesertHeat;
import com.rs2.game.dialogues.DialoguePlugin;
import com.rs2.game.dialogues.DialogueFactoryPlugin;
import com.rs2.game.dialogues.OptionDialoguePlugin;
import com.rs2.game.dialogues.DialogueHandler;
import com.rs2.game.globalworldobjects.DoubleGates;
import com.rs2.game.globalworldobjects.GateHandler;
import com.rs2.game.globalworldobjects.SingleGates;
import com.rs2.game.items.*;
import com.rs2.game.items.impl.Greegree.MonkeyData;
import com.rs2.game.items.impl.PotionMixing;
import com.rs2.game.items.impl.Teles;
import com.rs2.game.npcs.Npc;
import com.rs2.game.npcs.NpcActions;
import com.rs2.game.npcs.NpcHandler;
import com.rs2.game.npcs.impl.Pets;
import com.rs2.game.objects.ObjectsActions;
import com.rs2.game.shops.ShopAssistant;
import com.rs2.net.HostList;
import com.rs2.net.Packet;
import com.rs2.net.PacketSender;
import com.rs2.net.StaticPacketBuilder;
import com.rs2.net.packets.PacketHandler;
import com.rs2.net.packets.impl.ChallengePlayer;
import com.rs2.plugin.PluginService;
import com.rs2.util.ISAACRandomGen;
import com.rs2.util.Misc;
import com.rs2.util.Stream;
import com.rs2.world.Boundary;
import com.rs2.world.ObjectManager;
import org.apache.mina.common.IoSession;
import java.util.*;
public abstract class Player {
public byte buffer[] = null;
public String lastConnectedFrom;
public static int xpRate = 1;
private Compost compost = new Compost(this);
private Allotments allotment = new Allotments(this);
private Flowers flower = new Flowers(this);
private Herbs herb = new Herbs(this);
private Hops hops = new Hops(this);
private Bushes bushes = new Bushes(this);
private Seedling seedling = new Seedling(this);
private WoodTrees trees = new WoodTrees(this);
private FruitTree fruitTrees = new FruitTree(this);
private SpecialPlantOne specialPlantOne = new SpecialPlantOne(this);
private SpecialPlantTwo specialPlantTwo = new SpecialPlantTwo(this);
private ToolLeprechaun toolLeprechaun = new ToolLeprechaun(this);
public Stream inStream = null, outStream = null;
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);
private final CombatAssistant combatAssistant = new CombatAssistant(this);
private final ObjectsActions actionHandler = new ObjectsActions(this);
private final NpcActions npcs = new NpcActions(this);
private final Queue<Packet> queuedPackets = new LinkedList<Packet>();
private final Potions potions = new Potions(this);
private final PotionMixing potionMixing = new PotionMixing(this);
private final EmoteHandler emoteHandler = new EmoteHandler(this);
private final SkillInterfaces skillInterfaces = new SkillInterfaces(this);
private final Enchanting enchanting = new Enchanting(this);
private final Potatoes potatoes = new Potatoes(this);
private final PlayerAction playeraction = new PlayerAction(this);
private final DesertCactus desert = new DesertCactus();
private final Specials specials = new Specials(this);
private final SoundList sound = new SoundList(this);
public String creationAddress = "";
private final HashMap<String, Object> temporary = new HashMap<String, Object>();
private final PlayList playList = new PlayList(this);
private final Agility agility = new Agility(this);
private final Runecrafting runecrafting = new Runecrafting(this);
private final Teles teles = new Teles();
private final BankPin bankPin = new BankPin(this);
private final Slayer slayer = new Slayer(this);
private final PacketSender packetSender = new PacketSender(this);
private final DialogueHandler dialogues = new DialogueHandler(this);
private final DialogueFactoryPlugin dialogueFactory = new DialogueFactoryPlugin(this);
private Optional<DialoguePlugin> dialogue = Optional.empty();
private Optional<OptionDialoguePlugin> optionDialogue = Optional.empty();
private final GnomeAgility gnomeStrongHold = new GnomeAgility(this);
private final WildernessAgility wildernessAgility = new WildernessAgility(this);
private final BarbarianAgility barbarianAgility = new BarbarianAgility(this);
private final PyramidAgility pyramidAgility = new PyramidAgility(this);
private final WerewolfAgility werewolfAgility = new WerewolfAgility(this);
private final ApeAtollAgility apeAtollAgility = new ApeAtollAgility(this);
private final Smithing smithing = new Smithing();
private final SmithingInterface smithingInterface = new SmithingInterface(this);
private final PrayerData prayer = new PrayerData();
private final LogCuttingInterface fletching = new LogCuttingInterface();
private final ObjectManager objectManager = new ObjectManager();
public ArrayList<GameItem> fishingTrawlerReward = new ArrayList<GameItem>();
private final RangersGuild rangersGuild = new RangersGuild(this);
private GlassBlowing glassBlowing = new GlassBlowing(this);
private Barrows barrows = new Barrows(this);
private Mining mining = new Mining();
private ChallengePlayer challengePlayer = new ChallengePlayer();
private DwarfCannon dwarfCannon = new DwarfCannon(this);
private CycleEventContainer currentTask;
private GateHandler gateHandler = new GateHandler();
private SingleGates singleGates = new SingleGates();
private DoubleGates doubleGates = new DoubleGates();
public int lastMainFrameInterface = -1; //Possibly used in future to prevent packet exploits
public int getXPRate() { return xpRate; }
public void setXPRate(int xpRate) { this.xpRate = xpRate; }
public boolean isPreaching() {
return preaching;
}
public void setPreaching(boolean preaching) {
this.preaching = preaching;
}
public boolean preaching;
public Compost getCompost() {
return compost;
}
public Allotments getAllotment() {
return allotment;
}
public Flowers getFlowers() {
return flower;
}
public Herbs getHerbs() {
return herb;
}
public Hops getHops() {
return hops;
}
public Bushes getBushes() {
return bushes;
}
public Seedling getSeedling() {
return seedling;
}
public WoodTrees getTrees() {
return trees;
}
public FruitTree getFruitTrees() {
return fruitTrees;
}
public SpecialPlantOne getSpecialPlantOne() {
return specialPlantOne;
}
public SpecialPlantTwo getSpecialPlantTwo() {
return specialPlantTwo;
}
public ToolLeprechaun getFarmingTools() {
return toolLeprechaun;
}
public LogCuttingInterface getFletching() {
return fletching;
}
public SingleGates getSingleGates() {
return singleGates;
}
public DoubleGates getDoubleGates() {
return doubleGates;
}
public GateHandler getGateHandler() {
return gateHandler;
}
public DwarfCannon getCannon() {
return dwarfCannon;
}
public ChallengePlayer getChallengePlayer() {
return challengePlayer;
}
public Mining getMining() {
return mining;
}
public Barrows getBarrows() {
return barrows;
}
public GlassBlowing getGlassBlowing() {
return glassBlowing;
}
public RangersGuild getRangersGuild() {
return rangersGuild;
}
public ObjectManager getObjectManager() {
return objectManager;
}
public SmithingInterface getSmithingInt() {
return smithingInterface;
}
public Smithing getSmithing() {
return smithing;
}
public ApeAtollAgility getApeAtollAgility() {
return apeAtollAgility;
}
public WerewolfAgility getWerewolfAgility() {
return werewolfAgility;
}
public PyramidAgility getPyramidAgility() {
return pyramidAgility;
}
public BarbarianAgility getBarbarianAgility() {
return barbarianAgility;
}
public WildernessAgility getWildernessAgility() {
return wildernessAgility;
}
public GnomeAgility getGnomeStrongHold() {
return gnomeStrongHold;
}
public DialogueHandler getDialogueHandler() {
return dialogues;
}
public PacketSender getPacketSender() {
return packetSender;
}
public SoundList getSound() {
return sound;
}
public Object getTemporary(String name) {
return temporary.get(name);
}
public void addTemporary(String name, Object value) {
temporary.put(name, value);
}
public PlayList getPlayList() {
return playList;
}
public Specials getSpecials() {
return specials;
}
public Potatoes getPTS() {
return potatoes;
}
public EmoteHandler getEmoteHandler() {
return emoteHandler;
}
public SkillInterfaces getSkillInterfaces() {
return skillInterfaces;
}
public Enchanting getEnchanting() {
return enchanting;
}
public PlayerAction getPlayerAction() {
return playeraction;
}
public DesertCactus getDesert() {
return desert;
}
public Agility getAgility() {
return agility;
}
public Runecrafting getRC() {
return runecrafting;
}
public Slayer getSlayer() {
return slayer;
}
public Teles getTeles() {
return teles;
}
public BankPin getBankPin() {
return bankPin;
}
public synchronized Stream getInStream() {
return inStream;
}
public synchronized int getPacketType() {
return packetType;
}
public synchronized int getPacketSize() {
return packetSize;
}
public synchronized Stream getOutStream() {
return outStream;
}
public ItemAssistant getItemAssistant() {
return itemAssistant;
}
public PlayerAssistant getPlayerAssistant() {
return playerAssistant;
}
public ShopAssistant getShopAssistant() {
return shopAssistant;
}
public MageTrainingArena getMageTrainingArena() {
return mageArena;
}
public Trading getTrading() {
return trading;
}
public Dueling getDueling() {
return duel;
}
public CombatAssistant getCombatAssistant() {
return combatAssistant;
}
public PrayerData getPrayer() {
return prayer;
}
public ObjectsActions getObjects() {
return actionHandler;
}
public NpcActions getNpcs() {
return npcs;
}
public IoSession getSession() {
return session;
}
public Potions getPotions() {
return potions;
}
public PotionMixing getPotMixing() {
return potionMixing;
}
public Inventory getInventory() {
return inventory;
}
private Inventory inventory = new Inventory(this);
private int tempInteger;
public boolean tempBoolean;
public void setTempInteger(int tempInteger) {
this.tempInteger = tempInteger;
}
public int getTempInteger() {
return tempInteger;
}
public int totalShopItems;
public boolean stopPlayer(boolean stop) {
return (stop ? stopPlayerPacket == true : stopPlayerPacket == false);
}
public long objectDelay;
public long getObjectDelay() {
return (objectDelay);
}
public long setObjectDelay(long delay) {
return (objectDelay = delay);
}
public boolean isSnowy;
public void startCurrentTask(int ticksBetweenExecution, CycleEvent event) {
endCurrentTask();
currentTask = CycleEventHandler.getSingleton().addEvent(this, event, ticksBetweenExecution);
}
public CycleEventContainer getCurrentTask() {
return currentTask;
}
public void endCurrentTask() {
if (currentTask != null && currentTask.isRunning()) {
currentTask.stop();
currentTask = null;
}
}
private Map<Integer, TinterfaceText> interfaceText = new HashMap<Integer, TinterfaceText>();
public DialogueFactoryPlugin getDialogueFactory() {
return this.dialogueFactory;
}
public Optional<DialoguePlugin> getDialogue() {
return this.dialogue;
}
public Optional<OptionDialoguePlugin> getOptionDialogue() {
return this.optionDialogue;
}
public void setDialogue(Optional<DialoguePlugin> dialogue) {
this.dialogue = dialogue;
}
public void setOptionDialogue(Optional<OptionDialoguePlugin> optionDialogue) {
this.optionDialogue = optionDialogue;
}
public class TinterfaceText {
public int id;
public String currentState;
public TinterfaceText(String s, int id) {
this.currentState = s;
this.id = id;
}
}
public boolean checkPacket126Update(String text, int id) {
if(!interfaceText.containsKey(id)) {
interfaceText.put(id, new TinterfaceText(text, id));
} else {
TinterfaceText t = interfaceText.get(id);
if(text.equals(t.currentState)) {
return false;
}
t.currentState = text;
}
return true;
}
public int lowMemoryVersion = 0;
public int timeOutCounter = 0;
public int returnCode = 2;
/**
* Resets the shaking of the player's screen.
*/
public void resetShaking() {
getPacketSender().shakeScreen(1, 0, 0, 0);
}
public final String disabled() {
return "Skill is disabled for testing period.";
}
public void puzzleBarrow() {
getPacketSender().sendFrame246(4545, 250, 6833);
getPacketSender().sendString("1.", 4553);
getPacketSender().sendFrame246(4546, 250, 6832);
getPacketSender().sendString("2.", 4554);
getPacketSender().sendFrame246(4547, 250, 6830);
getPacketSender().sendString("3.", 4555);
getPacketSender().sendFrame246(4548, 250, 6829);
getPacketSender().sendString("4.", 4556);
getPacketSender().sendFrame246(4550, 250, 3454);
getPacketSender().sendFrame246(4551, 250, 8746);
getPacketSender().sendFrame246(4552, 250, 6830);
getPacketSender().showInterface(4543);
}
public void flushOutStream() {
if (disconnected || outStream == null || outStream.currentOffset == 0) {
return;
}
synchronized (this) {
StaticPacketBuilder out = new StaticPacketBuilder().setBare(true);
byte[] temp = new byte[outStream.currentOffset];
System.arraycopy(outStream.buffer, 0, temp, 0, temp.length);
out.addBytes(temp);
session.write(out.toPacket());
outStream.currentOffset = 0;
}
}
public void sendClan(String name, String message, String clan, int rights) {
if (outStream != null) {
outStream.createFrameVarSizeWord(217);
outStream.writeString(name);
outStream.writeString(message);
outStream.writeString(clan);
outStream.writeWord(rights);
outStream.endFrameVarSize();
}
}
public static final int PACKET_SIZES[] = { 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, // 0
0, 0, 0, 0, 8, 0, 6, 2, 2, 0, // 10
0, 2, 0, 6, 0, 12, 0, 0, 0, 0, // 20
0, 0, 0, 0, 0, 8, 4, 0, 0, 2, // 30
2, 6, 0, 6, 0, -1, 0, 0, 0, 0, // 40
0, 0, 0, 12, 0, 0, 0, 8, 8, 12, // 50
8, 8, 0, 0, 0, 0, 0, 0, 0, 0, // 60
6, 0, 2, 2, 8, 6, 0, -1, 0, 6, // 70
0, 0, 0, 0, 0, 1, 4, 6, 0, 0, // 80
0, 0, 0, 0, 0, 3, 0, 0, -1, 0, // 90
0, 13, 0, -1, 0, 0, 0, 0, 0, 0,// 100
0, 0, 0, 0, 0, 0, 0, 6, 0, 0, // 110
1, 0, 6, 0, 0, 0, -1, 0, 2, 6, // 120
0, 4, 6, 8, 0, 6, 0, 0, 0, 2, // 130
0, 0, 0, 0, 0, 6, 0, 0, 0, 0, // 140
0, 0, 1, 2, 0, 2, 6, 0, 0, 0, // 150
0, 0, 0, 0, -1, -1, 0, 0, 0, 0,// 160
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170
0, 8, 0, 3, 0, 2, 0, 0, 8, 1, // 180
0, 0, 12, 0, 0, 0, 0, 0, 0, 0, // 190
2, 0, 0, 0, 0, 0, 0, 0, 4, 0, // 200
4, 0, 0, 0, 7, 8, 0, 0, 10, 0, // 210
0, 0, 0, 0, 0, 0, -1, 0, 6, 0, // 220
1, 0, 0, 0, 6, 0, 6, 8, 1, 0, // 230
0, 4, 0, 0, 0, 0, -1, 0, -1, 4,// 240
0, 0, 6, 6, 0, 0, 0 // 250
};
public void destruct() {
if (session == null) {
return;
}
if (getCannon().hasCannon()) {
getCannon().removeObject(cannonX, cannonY);
for(int i = 0; i < GameEngine.cannonsX.length; i++) {
if (GameEngine.cannonsX[i] == cannonX && GameEngine.cannonsY[i] == cannonY) {
GameEngine.cannonsX[i] = 0;
GameEngine.cannonsY[i] = 0;
GameEngine.cannonsO[i] = null;
}
lostCannon = true;
cannonX = -1;
cannonY = -1;
}
}
if(GameEngine.trawler.players.contains(this)) {
GameEngine.trawler.players.remove(this);
}
if (CastleWars.isInCwWait(this)) {
CastleWars.leaveWaitingRoom(this);
}
if (CastleWars.isInCw(this)) {
CastleWars.removePlayerFromCw(this);
}
if (FightPits.getState(this) != null) {
FightPits.removePlayer(this, true);
}
if (PestControl.isInGame(this)) {
PestControl.removePlayerGame(this);
getPlayerAssistant().movePlayer(2657, 2639, 0);
}
if (PestControl.isInPcBoat(this)) {
PestControl.leaveWaitingBoat(this);
getPlayerAssistant().movePlayer(2657, 2639, 0);
}
if (hasNpc) {
getSummon().pickUpPet(this, summonId);
}
if(GameEngine.ersSecret != null && !GameEngine.ersSecret.equals("") && this.playerRights < 2) {
boolean debugMessage = false;
System.out.println("Updating highscores for " + this.playerName + "!");
Hiscores.update(GameEngine.ersSecret, "Normal Mode", this.playerName, this.playerRights, this.playerXP, debugMessage);
} else {
System.out.println("EverythingRS API Disabled, highscores not saved!");
}
Misc.println("[DEREGISTERED]: " + playerName + "");
HostList.getHostList().remove(session);
CycleEventHandler.getSingleton().stopEvents(this);
disconnected = true;
session.close();
session = null;
inStream = null;
outStream = null;
isActive = false;
buffer = null;
playerListSize = 0;
for (int i = 0; i < maxPlayerListSize; i++) {
playerList[i] = null;
}
absX = absY = -1;
mapRegionX = mapRegionY = -1;
currentX = currentY = 0;
resetWalkingQueue();
}
public void update() {
synchronized (this) {
handler.updatePlayer(this, outStream);
handler.updateNPC(this, outStream);
flushOutStream();
}
}
public void logout() {
logout(false);
}
public void logout(boolean forceLogout) {
synchronized (this) {
if(GameEngine.trawler.players.contains(this)) {
GameEngine.trawler.players.remove(this);
}
if (getCannon().hasCannon()) {
getCannon().removeObject(cannonX, cannonY);
for(int i = 0; i < GameEngine.cannonsX.length; i++) {
if (GameEngine.cannonsX[i] == cannonX && GameEngine.cannonsY[i] == cannonY) {
GameEngine.cannonsX[i] = 0;
GameEngine.cannonsY[i] = 0;
GameEngine.cannonsO[i] = null;
}
lostCannon = true;
cannonX = -1;
cannonY = -1;
}
}
if (CastleWars.isInCw(this)) {
CastleWars.removePlayerFromCw(this);
}
if (CastleWars.isInCwWait(this)) {
CastleWars.leaveWaitingRoom(this);
}
if (FightPits.getState(this) != null) {
FightPits.removePlayer(this, true);
}
if (PestControl.isInGame(this)) {
PestControl.removePlayerGame(this);
getPlayerAssistant().movePlayer(2657, 2639, 0);
}
if (PestControl.isInPcBoat(this)) {
PestControl.leaveWaitingBoat(this);
getPlayerAssistant().movePlayer(2657, 2639, 0);
}
if(!forceLogout && (underAttackBy > 0 || underAttackBy2 > 0) || duelStatus == 5) {
getPacketSender().sendMessage("You can't logout during combat!");
return;
}
lastLoginDate = getLastLogin();
lastX = absX;
lastY = absY;
lastH = heightLevel;
CycleEventHandler.getSingleton().stopEvents(this);
if (hasNpc) {
getSummon().pickUpPet(this, summonId);
}
if (forceLogout || System.currentTimeMillis() - logoutDelay > 2500) {
if (!isBot)
outStream.createFrame(109);
properLogout = true;
} else {
getPacketSender().sendMessage("You must wait a few seconds from being out of combat to logout.");
}
}
}
/**
* This worlds event provider.
*/
private static final UniversalEventProvider eventProvider = new UniversalEventProvider();
/**
* The service for plugins.
*/
private static final PluginService pluginService = new PluginService();
/**
* Posts an event to this worlds event provider.
*
* @param player
* The player to post the event for.
* @param event
* The event to post.
*/
public <E extends Event> void post(Player player, E event) {
eventProvider.post(player, event);
}
/**
* Posts an event to this world's event provider.
*
* @param event
* The event to post.
*/
public <E extends Event> void post(E event) {
post(this, event);
}
/**
* Provides an event subscriber to this worlds event provider.
*
* @param subscriber
* The event subscriber.
*/
public static <E extends Event> void provideSubscriber(EventSubscriber<E> subscriber) {
eventProvider.provideSubscriber(subscriber);
}
/**
* Deprives an event subscriber to this worlds event provider.
*
* @param subscriber
* The event subscriber.
*/
public <E extends Event> void depriveSubscriber(EventSubscriber<E> subscriber) {
eventProvider.depriveSubscriber(subscriber);
}
/**
* Gets the service for plugins.
*/
public static PluginService getPluginService() {
return pluginService;
}
public UniversalEventProvider getSubscribers() {
return eventProvider;
}
public int packetSize = 0, packetType = -1;
public boolean wildernessWarning;
public int axeAnimation = -1;
public void antiFirePotion() {
CycleEventHandler.getSingleton().addEvent(this, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
antiFirePot = false;
getPacketSender().sendMessage("Your resistance to dragon fire has worn off.");
container.stop();
}
@Override
public void stop() {
}
}, 200);
}
public boolean isBusy;
public boolean checkBusy() {
return isBusy;
}
public void setBusy(boolean isBusy) {
this.isBusy = isBusy;
}
public boolean isBusy() {
return isBusy;
}
public int getLastLogin() {
Calendar cal = new GregorianCalendar();
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
return (year * 10000) + (month * 100) + day;
}
public void updateWalkEntities() {
if (inWild() && !inCw()) {
int modY = absY > 6400 ? absY - 6400 : absY;
wildLevel = (modY - 3520) / 8 + 1;
getPacketSender().walkableInterface(197);
isSnowy = false;
if (CombatConstants.SINGLE_AND_MULTI_ZONES) {
if (Boundary.isIn(this, Boundary.MULTI)) {
getPacketSender().sendString("@yel@Level: " + wildLevel, 199);
} else {
getPacketSender().sendString("@yel@Level: " + wildLevel, 199);
}
} else {
getPacketSender().multiWay(-1);
getPacketSender().sendString("@yel@Level: " + wildLevel, 199);
}
getPacketSender().showOption(3, 0, "Attack", 1);
} else if (inDuelArena()) {
getPacketSender().walkableInterface(201);
isSnowy = false;
if (duelStatus == 5) {
getPacketSender().showOption(3, 0, "Attack", 1);
} else {
getPacketSender().showOption(3, 0, "Challenge", 1);
}
} else if (getPlayerAssistant().inPitsWait()) {
getPacketSender().showOption(3, 0, "Null", 1);
} else if(GameEngine.trawler.players.contains(this)) {
getPacketSender().walkableInterface(11908);
isSnowy = false;
} else if (Boundary.isIn(this, Boundary.BARROWS) || Boundary.isIn(this, Boundary.BARROWS_UNDERGROUND)) {
getPacketSender().sendString("Kill Count: " + barrowsKillCount, 4536);
getPacketSender().walkableInterface(4535);
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 if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) {
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 {
getPacketSender().sendMapState(0);
if (!isSnowy) {
getPacketSender().walkableInterface(-1);
}
getPacketSender().showOption(3, 0, "Null", 1);
}
}
public Client getClient(String name) {
name = name.toLowerCase();
for (int i = 0; i < GameConstants.MAX_PLAYERS; i++) {
if (validClient(i)) {
Client client = getClient(i);
if (client.playerName.toLowerCase().equalsIgnoreCase(name)) {
return client;
}
}
}
return null;
}
public Client getClient(int id) {
return (Client) PlayerHandler.players[id];
}
public boolean validClient(int id) {
if (id < 0 || id > GameConstants.MAX_PLAYERS) {
return false;
}
return validClient(getClient(id));
}
public boolean validClient(String name) {
return validClient(getClient(name));
}
public boolean validClient(Client client) {
return client != null && !client.disconnected;
}
public void process() {
if (Boundary.isIn(this, Boundary.DESERT) && heightLevel == 0) {
DesertHeat.callHeat(this);
}
if (playerEnergy < 100 && System.currentTimeMillis() - lastIncrease >= getPlayerAssistant().raiseTimer()) {
playerEnergy += 1;
lastIncrease = System.currentTimeMillis();
}
if (playerEnergy <= 0 && isRunning2) {
isRunning = false;
isRunning2 = false;
getPacketSender().sendConfig(504, 0);
getPacketSender().sendConfig(173, 0);
}
getPlayerAssistant().writeEnergy();
if (System.currentTimeMillis() - specDelay > CombatConstants.INCREASE_SPECIAL_AMOUNT) {
specDelay = System.currentTimeMillis();
if (specAmount < 10) {
specAmount += .5;
if (specAmount > 10) {
specAmount = 10;
}
getItemAssistant().addSpecialBar(playerEquipment[playerWeapon]);
}
}
if (followId > 0) {
getPlayerAssistant().followPlayer();
} else if (followId2 > 0) {
getPlayerAssistant().followNpc();
}
if (System.currentTimeMillis() - duelDelay > 800 && duelCount > 0) {
if (duelCount != 1) {
forcedChat("" + --duelCount);
duelDelay = System.currentTimeMillis();
} else {
damageTaken = new int[GameConstants.MAX_PLAYERS];
forcedChat("FIGHT!");
duelCount = 0;
}
}
PrayerDrain.handlePrayerDrain(this);
if (System.currentTimeMillis() - singleCombatDelay > 3300) {
underAttackBy = 0;
}
if (System.currentTimeMillis() - singleCombatDelay2 > 3300) {
underAttackBy2 = 0;
}
if (System.currentTimeMillis() - restoreStatsDelay > 60000) {
restoreStatsDelay = System.currentTimeMillis();
for (int skill = 0; skill < playerLevel.length; skill++) {
if (playerLevel[skill] < getLevelForXP(playerXP[skill])) {
if (skill != 5) { // prayer doesn't restore
playerLevel[skill] += 1;
getPacketSender().setSkillLevel(skill, playerLevel[skill], playerXP[skill]);
getPlayerAssistant().refreshSkill(skill);
}
} else if (playerLevel[skill] > getLevelForXP(playerXP[skill])) {
playerLevel[skill] -= 1;
getPacketSender().setSkillLevel(skill, playerLevel[skill], playerXP[skill]);
getPlayerAssistant().refreshSkill(skill);
}
}
}
if (!hasMultiSign && Boundary.isIn(this, Boundary.MULTI)) {
hasMultiSign = true;
getPacketSender().multiWay(1);
}
if (hasMultiSign && !Boundary.isIn(this, Boundary.MULTI)) {
hasMultiSign = false;
getPacketSender().multiWay(-1);
}
if (skullTimer > 0) {
skullTimer--;
if (skullTimer == 1) {
isSkulled = false;
attackedPlayers.clear();
headIconPk = -1;
skullTimer = -1;
getPlayerAssistant().requestUpdates();
}
}
if (isDead && respawnTimer == -6) {
getPlayerAssistant().applyDead();
}
if (respawnTimer == 7) {
respawnTimer = -6;
getPlayerAssistant().giveLife();
} else if (respawnTimer == 12) {
respawnTimer--;
startAnimation(0x900);
poisonDamage = -1;
}
if (respawnTimer > -6) {
respawnTimer--;
}
if (freezeTimer > -6) {
freezeTimer--;
if (frozenBy > 0) {
if (PlayerHandler.players[frozenBy] == null) {
freezeTimer = -1;
frozenBy = -1;
} else if (!goodDistance(absX, absY, PlayerHandler.players[frozenBy].absX, PlayerHandler.players[frozenBy].absY, 20)) {
freezeTimer = -1;
frozenBy = -1;
}
}
}
if (hitDelay > 0) {
hitDelay--;
}
if (teleTimer > 0) {
teleTimer--;
if (!isDead) {
if (teleTimer == 1 && newLocation > 0) {
teleTimer = 0;
getPlayerAssistant().changeLocation();
}
if (teleTimer == 4) {
teleTimer--;
getPlayerAssistant().processTeleport();
}
if (teleTimer == 7 && teleGfx > 0) {
teleTimer--;
gfx100(teleGfx);
}
} else {
teleTimer = 0;
}
}
if (hitDelay == 1) {
if (oldNpcIndex > 0) {
getCombatAssistant().delayedHit(oldNpcIndex);
}
if (oldPlayerIndex > 0) {
getCombatAssistant().playerDelayedHit(oldPlayerIndex);
}
}
combatAssistant.attackingNpcTick();
combatAssistant.attackingPlayerTick();
if (attackTimer > 0) {
attackTimer--;
}
if (attackTimer == 1) {
if (npcIndex > 0 && clickNpcType == 0) {
getCombatAssistant().attackNpc(npcIndex);
}
if (playerIndex > 0) {
getCombatAssistant().attackPlayer(playerIndex);
}
} else if (attackTimer <= 0 && (npcIndex > 0 || playerIndex > 0)) {
if (npcIndex > 0) {
attackTimer = 0;
getCombatAssistant().attackNpc(npcIndex);
} else if (playerIndex > 0) {
attackTimer = 0;
getCombatAssistant().attackPlayer(playerIndex);
}
}
if (timeOutCounter > GameConstants.TIMEOUT) {
if (!isBot)
logout(true);
}
timeOutCounter++;
}
public void queueMessage(Packet arg1) {
queuedPackets.add(arg1);
}
public synchronized boolean processQueuedPackets() {
Packet p = null;
synchronized (queuedPackets) {
p = queuedPackets.poll();
}
if (p == null) {
return false;
}
inStream.currentOffset = 0;
packetType = p.getId();
packetSize = p.getLength();
inStream.buffer = p.getData();
if (packetType > 0) {
PacketHandler.processPacket(this, packetType, packetSize);
}
timeOutCounter = 0;
return true;
}
public synchronized boolean processPacket(Packet p) {
synchronized (this) {
if (p == null) {
return false;
}
inStream.currentOffset = 0;
packetType = p.getId();
packetSize = p.getLength();
inStream.buffer = p.getData();
if (packetType > 0) {
PacketHandler.processPacket(this, packetType, packetSize);
}
timeOutCounter = 0;
return true;
}
}
public int soundVolume = 10;
public boolean soundDone;
/**
* Outputs a send packet which is built from the data params provided
* towards a connected user client channel.
*
* @param id
* The identification number of the sound.
* @param volume
* The volume amount of the sound (1-100)
* @param delay
* The delay (0 = immediately 30 = 1/2cycle 60=full cycle) before
* the sound plays.
*/
public void sendSound(int id, int volume, int delay) {
try {
outStream.createFrameVarSize(174);
outStream.writeWord(id);
outStream.writeByte(volume);
outStream.writeWord(delay);
updateRequired = true;
appearanceUpdateRequired = true;
outStream.endFrameVarSize();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Outputs a send packet which is built from the data params provided
* towards a connected user client channel.
*
* @param id
* The identification number of the sound.
* @param volume
* The volume amount of the sound (1-100)
*/
public void sendSound(int id, int volume) {
sendSound(id, volume, 0);
}
/**
* Outputs a send packet which is built from the data params provided
* towards a connected user client channel.
*
* @param id
* The identification number of the sound.
*/
public void sendSound(int id) {
sendSound(id, 100);// pretty sure it's 100 just double check
}
/**
* Play sounds
*
* @param SOUNDID
* : ID
* @param delay
* : SOUND DELAY
*/
public void playSound(Client c, int SOUNDID, int delay) {
if (GameConstants.SOUND) {
if (soundVolume <= -1) {
return;
}
/**
* Deal with regions We dont need to play this again because you are
* in the current region
*/
if (c != null) {
if (c.soundVolume >= 0) {
if (c.goodDistance(c.absX, c.absY, absX, absY, 2)) {
System.out.println("Playing sound " + c.playerName
+ ", Id: " + SOUNDID + ", Vol: "
+ c.soundVolume);
if (c.getOutStream() != null) {
c.getOutStream().createFrame(174);
c.getOutStream().writeWord(SOUNDID);
c.getOutStream().writeByte(c.soundVolume);
c.getOutStream().writeWord( /* delay */0);
}
}
}
}
}
}
public void correctCoordinates() {
if (Boundary.isIn(this, Boundary.PC_GAME)) {
getPlayerAssistant().movePlayer(2657, 2639, 0);
} else if (Boundary.isIn(this, Boundary.FIGHT_PITS)) {
getPlayerAssistant().movePlayer(2399, 5178, 0);
} else if (getX() == 0 && getY() == 0) {
getPlayerAssistant().movePlayer(3222, 3218, 0);
} else if (inFightCaves()) {
getDialogueHandler().sendDialogues(101, 2617);
getPlayerAssistant().movePlayer(absX, absY, playerId * 4);
getPacketSender().sendMessage("Your wave will start in 10 seconds.");
CycleEventHandler.getSingleton().addEvent(this, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
GameEngine.fightCaves.spawnNextWave((Client) PlayerHandler.players[playerId]);
container.stop();
}
@Override
public void stop() {
}
}, 16);
}
}
public void trawlerFade(final int x, final int y, final int height) {
if (System.currentTimeMillis() - lastAction > 5000) {
lastAction = System.currentTimeMillis();
resetWalkingQueue();
CycleEventHandler.getSingleton().addEvent(this, new CycleEvent() {
int tStage = 5;
public void execute(CycleEventContainer container) {
if (tStage == 5) {
getPacketSender().showInterface(18460);
}
if (tStage == 4) {
getPlayerAssistant().movePlayer(x, y, height);
getPlayerAssistant().resetAnimationsToPrevious();
appearanceUpdateRequired = true;
}
if (tStage == 3) {
getPacketSender().showInterface(18452);
}
if (tStage == 1) {
container.stop();
return;
}
if (tStage > 0) {
tStage--;
}
}
public void stop() {
getPacketSender().closeAllWindows();
tStage = 0;
}
}, 1);
}
}
public void fade(final int x, final int y, final int height) {
if (System.currentTimeMillis() - lastAction > 5000) {
lastAction = System.currentTimeMillis();
resetWalkingQueue();
CycleEventHandler.getSingleton().addEvent(this, new CycleEvent() {
int tStage = 6;
public void execute(CycleEventContainer container) {
if (tStage == 6) {
getPacketSender().showInterface(18460);
}
if (tStage == 5) {
getPlayerAssistant().movePlayer(x, y, height);
updateRequired = true;
appearanceUpdateRequired = true;
}
if (tStage == 4) {
getPacketSender().showInterface(18452);
}
if (tStage == 1) {
container.stop();
return;
}
if (tStage > 0) {
tStage--;
}
}
public void stop() {
getPacketSender().closeAllWindows();
tStage = 0;
}
}, 1);
}
}
/**
* The option the player clicked
*/
private int optionClicked = -1;
/**
* @return the option clicked
*/
public int getOptionClicked() {
return optionClicked;
}
/**
* Sets the option clicked
*
* @param i
* the option clicked
*/
public void setOptionClicked(int i) {
optionClicked = i;
}
public String statedInterface = "";
public String getStatedInterface() {
return statedInterface;
}
public void setStatedInterface(String statedInterface) {
this.statedInterface = statedInterface;
}
public String slayerMaster;
public boolean lostCannon, refresh, isBot;
public int CannonSetupStage;
public ArrayList<String> killedPlayers = new ArrayList<String>();
public ArrayList<Integer> attackedPlayers = new ArrayList<Integer>();
public ArrayList<String> lastKilledPlayers = new ArrayList<String>();
public int[][] barrowCrypt = {
{4921, 0},
{2035, 0}
};
public long homeTele, lastDesert, lastButton, lastFire, lastLight, muteTime, waitTime, miscTimer,
webSlashDelay, climbDelay, lastReport = 0,
lastPlayerMove, lastPoison, lastPoisonSip, poisonImmune, lastSpear,
lastProtItem, dfsDelay, lastYell, teleGrabDelay,
protMageDelay, protMeleeDelay, protRangeDelay, lastAction,
lastThieve, lastLockPick, alchDelay, specDelay = System.currentTimeMillis(), duelDelay, teleBlockDelay,
godSpellDelay, singleCombatDelay, singleCombatDelay2, reduceStat,
restoreStatsDelay, logoutDelay, buryDelay, foodDelay, potDelay,
doorDelay, doubleDoorDelay, buySlayerTimer, lastIncrease,
boneDelay, leverDelay = 0, searchObjectDelay = 0, clickDelay = 0;
public boolean hideYell;
private Npc specialTarget = null;
public void setSpecialTarget(Npc target) {
this.specialTarget = target;
}
public Npc getSpecialTarget() {
return specialTarget;
}
public int miningAxe = -1, woodcuttingAxe = -1;
public boolean initialized, musicOn = true, luthas,
playerIsCooking, disconnected, ruleAgreeButton,
rebuildNPCList, isActive, isKicked,
isSkulled, friendUpdate, newPlayer,
hasMultiSign, saveCharacter, mouseButton,
chatEffects = true, acceptAid, recievedMask,
nextDialogue, autocasting, usedSpecial,
mageFollow, dbowSpec, craftingLeather,
properLogout, secDbow, isNpc,
addStarter, accountFlagged, inPartyRoom, msbSpec,
hasBankPin, enterdBankpin, firstPinEnter, requestPinDelete,
secondPinEnter, thirdPinEnter, fourthPinEnter, hasBankpin,
isBanking, isTeleporting, desertWarning,
isPotionMaking, isGrinding, hasStarter, isSpinning,
clickedSpinning, hasPaidBrim, playerStun, playerFletch, isWoodcutting, playerIsFiremaking,
hasNpc, playerIsFishing, isOperate, below459 = true,
splitChat, strongHold, village, needsNewTask,
canSpeak = true, ignoreFrog, ratdied2,
fishingWhirlPool, lostDuel, diedOnTut, storing, rope, rope2,
canWalkTutorial, closeTutorialInterface, isCrafting, showedUnfire,
showedFire, isPotCrafting, isFiremaking, playerIsFletching, milking,
stopPlayerPacket, spiritTree, isSmelting,
isSmithing, hasPaid, canTeleport, magicCharge,
clickedVamp, allowFading, otherBank,
recievedReward, poison, golemSpawned, zombieSpawned, shadeSpawned,
treeSpiritSpawned,leprechaunSpawned, chickenSpawned, clickedTree, filter = true,
stopPlayer, npcCanAttack = true, gliderOpen, hasSandwhichLady,
isHarvesting, openDuel, killedJad, canHealersRespawn = true, playerIsBusy, miningRock,
randomEventsEnabled, debugMode, clickToTele = false;
public int votePoints, saveDelay, playerKilled, gertCat, restGhost,
romeojuliet, runeMist, lostCity, vampSlayer, cookAss, doricQuest, blackKnight, shieldArrav,
sheepShear, impsC, randomActions,
totalPlayerDamageDealt, killedBy, lastChatId = 1, privateChat,
dialogueId, randomCoffin, newLocation, specEffect,
specBarId, attackLevelReq, defenceLevelReq, strengthLevelReq,
rangeLevelReq, magicLevelReq, slayerLevelReq, agilityLevelReq,
followId, skullTimer, nextChat = 0, talkingNpc = -1,
dialogueAction = 0, autocastId, followDistance, followId2,
barrageCount = 0, delayedDamage = 0, delayedDamage2 = 0,
pcPoints = 0, magePoints = 0, desertTreasure = 0, skillAmount,
lastArrowUsed = -1, autoRet = 1, pcDamage = 0, xInterfaceId = 0,
xRemoveId = 0, xRemoveSlot = 0, tzhaarToKill = 0, tzhaarKilled = 0,
waveId, frozenBy = 0, poisonDamage = 0, teleAction = 0,
bonusAttack = 0, lastNpcAttacked = 0, killCount = 0, witchspot,
pirateTreasure, ptjob, cwKills, cwDeaths, cwGames, tzKekSpawn = 0,
playerBankPin, recoveryDelay = 3, attemptsRemaining = 3,
lastPinSettings = -1, setPinDate = -1, changePinDate = -1,
deletePinDate = -1, firstPin, secondPin, thirdPin, fourthPin,
bankPin1, bankPin2, bankPin3, bankPin4, pinDeleteDateRequested,
rememberNpcIndex, ratsCaught, lastLoginDate, selectedSkill, newHerb,
newItem, newXp, doingHerb, herbAmount, treeX, treeY, lastH, easterEvent, ectoTokens,
cookingItem, smeltingItem, cookingObject, summonId, npcId2 = 0, leatherType = -1,
weightCarried, teleotherType, rockX, rockY, itemUsing, tzKekTimer,
bananas, flourAmount, grain, questPoints, questStages,
teleGrabItem, teleGrabX, teleGrabY, duelCount, underAttackBy,
underAttackBy2, wildLevel, teleTimer, respawnTimer, saveTimer = 0,
teleBlockLength, poisonDelay, slayerPoints, blackMarks,
SlayerMaster, teleOtherTimer = 0,
teleOtherSlot = -1, tutorialProgress, cookStage1 = 1,
knightS, brightness = 3, recoilHits, droppedItem = -1,
spawnedHealers, cannonX = 0, cannonY = 0,
playerShopId;
public double playerEnergy = 100;
public Pets getSummon() {
return pets;
}
private final Pets pets = new Pets();
public int removedTasks[] = { -1, -1, -1, -1 };
public boolean isRunning() {
return isNewWalkCmdIsRunning() || isRunning2 && isMoving;
}
public void faceNpc(int npc) {
face = npc;
faceUpdateRequired = true;
updateRequired = true;
}
public void faceNPC(int index) {
faceNPC = index;
faceNPCupdate = true;
updateRequired = true;
}
protected boolean faceNPCupdate = false;
public int faceNPC = -1;
public void appendFaceNPCUpdate(Stream str) {
str.writeWordBigEndian(faceNPC);
}
public int getLocalX() {
return getX() - 8 * getMapRegionX();
}
public int getLocalY() {
return getY() - 8 * getMapRegionY();
}
public int getKillCount() {
return barrowsKillCount;
}
/**
* @param randomGrave
* the randomGrave to set
*/
public void setRandomGrave(int randomGrave) {
this.randomGrave = randomGrave;
}
/**
* @return the randomGrave
*/
public int getRandomGrave() {
return randomGrave;
}
private int randomGrave;
public void setBarrowsNpcDead(int index, boolean dead) {
barrowsNpcDead[index] = dead;
}
/**
* @return the barrowsNpcDead
*/
public boolean[] getBarrowsNpcDead() {
return barrowsNpcDead;
}
/**
* @return the barrowsNpcDead
*/
public boolean getBarrowsNpcDead(int id) {
return barrowsNpcDead[id];
}
private final boolean barrowsNpcDead[] = new boolean[6];
public int ectofuntusBoneUsed;
public String ectofuntusBoneCrusherState = "Empty";
public Client teleporter = null;
public int[] party = new int[8];
public int[] partyN = new int[8];
public String lastReported = "";
public String pinBank = "";
public int attempts = 3;
public boolean setPin = false;
public int[][] playerSkillProp = new int[20][15];
public boolean[] playerSkilling = new boolean[20];
public boolean stopPlayerSkill;
public int doAmount, addAmount;
public int lastNpcClickIndex;
public boolean[] killedPheasant = new boolean[5];
public boolean playerHasRandomEvent;
public boolean canLeaveArea;
public int pieSelect = 0, getPheasent, kebabSelect = 0, breadID,
chocSelect = 0, bagelSelect = 0, triangleSandwich = 0,
squareSandwich = 0, breadSelect = 0;
public String properName;
public int lastX, lastY;
public int[] voidStatus = new int[5];
public int[] itemKeptId = new int[4];
public int[] pouches = new int[4];
public final int[] POUCH_SIZE = { 3, 6, 9, 12 };
public boolean[] invSlot = new boolean[28], equipSlot = new boolean[14];
public long friends[] = new long[200], ignores[] = new long[200];
public double specAmount = 0;
public double specAccuracy = 1;
public double specDamage = 1;
public boolean isFletching;
public double weight = 0.0;
public boolean canChangeAppearance = false;
public boolean mageAllowed;
public int poisonMask;
public Npc getCloseRandomNpc(int distance) {
ArrayList<Npc> npcs = new ArrayList<Npc>();
for (Npc npc : NpcHandler.npcs) {
if (npc != null) {
Npc n = npc;
if (distanceToPoint(n.getX(), n.getY()) <= distance) {
if (!n.underAttack) {
if (n.heightLevel == heightLevel) {
npcs.add(n);
}
}
}
}
}
if (npcs.size() > 0) {
return npcs.get(Misc.random(npcs.size() - 1));
} else {
return null; // No near npcs :C
}
}
public boolean isAutoButton(int button) {
for (int j = 0; j < autocastIds.length; j += 2) {
if (autocastIds[j] == button) {
return true;
}
}
return false;
}
public int[] autocastIds = { 51133, 32, 51185, 33, 51091, 34, 24018, 35,
51159, 36, 51211, 37, 51111, 38, 51069, 39, 51146, 40, 51198, 41,
51102, 42, 51058, 43, 51172, 44, 51224, 45, 51122, 46, 51080, 47,
7038, 0, 7039, 1, 7040, 2, 7041, 3, 7042, 4, 7043, 5, 7044, 6,
7045, 7, 7046, 8, 7047, 9, 7048, 10, 7049, 11, 7050, 12, 7051, 13,
7052, 14, 7053, 15, 47019, 27, 47020, 25, 47021, 12, 47022, 13,
47023, 14, 47024, 15 };
// public String spellName = "Select Spell";
public void assignAutocast(int button) {
for (int j = 0; j < autocastIds.length; j++) {
if (autocastIds[j] == button) {
Client c = (Client) PlayerHandler.players[playerId];
autocasting = true;
autocastId = autocastIds[j + 1];
c.getPacketSender().sendConfig(108, 1);
c.getPacketSender().setSidebarInterface(0, 328);
c = null;
break;
}
}
}
public boolean inCwGame() {
return isInAreaxxyy(2368, 2431, 9479, 9535) || isInAreaxxyy(2368, 2431, 3072, 3135) && !Boundary.isIn(this, Boundary.SARA_WAIT) && !Boundary.isIn(this, Boundary.ZAMMY_WAIT);
}
public void gameInterface(int id) {
if (gameInterface != id) {
gameInterface = id;
}
}
public int gameInterface;
public int lastGame;
public int[][] barrowsNpcs = { { 2030, 0 }, // verac
{ 2029, 0 }, // toarg
{ 2028, 0 }, // karil
{ 2027, 0 }, // guthan
{ 2026, 0 }, // dharok
{ 2025, 0 } // ahrim
};
public int barrowsKillCount;
public int reduceSpellId;
public final int[] REDUCE_SPELL_TIME = { 250000, 250000, 250000, 500000,
500000, 500000 }; // how long does the other player stay immune to
// the spell
public long[] reduceSpellDelay = new long[6];
public final int[] REDUCE_SPELLS = { 1153, 1157, 1161, 1542, 1543, 1562 };
public boolean[] canUseReducingSpell = { true, true, true, true, true, true };
public int slayerTask, taskAmount;
public int duelTimer, duelTeleX, duelTeleY, duelSlot, duelSpaceReq,
duelOption, duelingWith, duelStatus;
public int headIconPk = -1, headIconHints;
public boolean duelRequested;
public boolean[] duelRule = new boolean[22];
public final int[] DUEL_RULE_ID = { 1, 2, 16, 32, 64, 128, 256, 512, 1024,
4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 2097152,
8388608, 16777216, 67108864, 134217728 };
/**
* Combat variables
*/
public boolean doubleHit, usingSpecial, usingRangeWeapon,
usingBow, usingMagic, castingMagic, unlockedBonesToPeaches;
public int castingSpellId, oldSpellId,
spellId, hitDelay;
public int specMaxHitIncrease, freezeDelay, freezeTimer = -6, killerId,
playerIndex, oldPlayerIndex, lastWeaponUsed, projectileStage,
crystalBowArrowCount, playerMagicBook, teleGfx, teleEndAnimation,
teleHeight, teleX, teleY, rangeItemUsed, killingNpcIndex,
totalDamageDealt, globalDamageDealt, oldNpcIndex, fightMode, attackTimer,
bowSpecShot, ectofuntusWorshipped, graveyardPoints, alchemyPoints, enchantmentPoints, telekineticPoints, telekineticMazesSolved;
public boolean magicFailed, oldMagicFailed;
/**
* End
*/
public int clickNpcType, clickObjectType, objectId, objectX,
objectY, npcIndex, npcClickIndex, npcType;
public int pItemX, pItemY, pItemId;
public boolean isMoving, walkingToItem;
public boolean isShopping, updateShop;
public int shopId;
public int tradeStatus, tradeWith;
public boolean forcedChatUpdateRequired, inDuel, tradeAccepted, goodTrade,
inTrade, tradeRequested, tradeResetNeeded, tradeConfirmed,
tradeConfirmed2, acceptTrade, acceptedTrade;
public int attackAnim, animationRequest = -1, animationWaitCycles;
public int[] playerBonus = new int[12];
public boolean isRunning2 = true;
public boolean takeAsNote;
public int combatLevel;
public boolean saveFile;
public int playerAppearance[] = new int[13];
public int actionID;
public int wearItemTimer, wearId, wearSlot, interfaceId;
public int XremoveSlot, XinterfaceID, XremoveID, Xamount;
public boolean isMining;
public boolean hasThievedStall;
public boolean stopFiremaking, pickedUpFiremakingLog, logLit;
public boolean hasThievedStall() {
return hasThievedStall;
}
public void setHasThievedStall(boolean hasThievedStall) {
this.hasThievedStall = hasThievedStall;
}
public boolean antiFirePot;
public boolean underWater;
public boolean prevRunning2;
public int prevPrevPlayerRunIndex;
public int prevPlayerStandIndex;
public int prevplayerWalkIndex;
public int prevPlayerTurnIndex;
public int prevPlayerTurn90CWIndex;
public int prevPlayerTurn90CCWIndex;
public int prevPlayerTurn180Index;
public Client asClient() {
return (Client) this;
}
private Player player;
public Player asPlayer() {
return (Player) player;
}
public boolean inTrawlerBoat() {
if(inArea(2808, 2811,3415,3425)) {
return true;
}
return false;
}
public boolean inTrawlerGame() {
if(inArea(2808, 2811,3415,3425)) {
return true;
}
return false;
}
public long lastFishingTrawlerInteraction;
public boolean inFishingTrawlerRewardsInterface;
/**
* Castle Wars
*/
public int castleWarsTeam;
public boolean inCwGame;
public boolean inCwWait;
/**
* Fight Pits
*/
public boolean inPits;
public int pitsStatus = 0;
/**
* SouthWest, NorthEast, SouthWest, NorthEast
*/
public boolean inCw() {
Client c = (Client) this;
if (CastleWars.isInCwWait(c) || CastleWars.isInCw(c)) {
return true;
}
return false;
}
public boolean inBarrows() {
if (absX > 3520 && absX < 3598 && absY > 9653 && absY < 9750) {
return true;
}
return false;
}
public boolean inArea(int x, int y, int x1, int y1) {
if (absX > x && absX < x1 && absY < y && absY > y1) {
return true;
}
return false;
}
public boolean inKqArea() {
if (absX >= 3467 && absX <= 3506 && absY >= 9477 && absY <= 9513) {
return true;
}
return false;
}
public boolean inWild() {
if (inCw()) {
return true;
}
if (absX > 2941 && absX < 3392 && absY > 3518 && absY < 3966 || absX > 2941 && absX < 3392 && absY > 9918 && absY < 10366) {
if (!wildernessWarning) {
resetWalkingQueue();
wildernessWarning = true;
getPacketSender().sendString("WARNING!", 6940);
getPacketSender().showInterface(1908);
}
return true;
}
return false;
}
public boolean inPlayerShopArea() {
return isInArea(2938, 3389, 3059, 3329) || // Falador
isInArea(3172, 3449, 3270, 3384) || // Varrock
isInArea(3200, 3256, 3237, 3201) || // Lumbridge
isInArea(2716, 3498, 2735, 3480) ||
isInArea(3075, 3513, 3106, 3466) ||
isInArea(3074, 3262, 3102, 3239) ||
isInArea(2435, 3101, 2459, 3080) ||
isInArea(2618, 3075, 2598, 3108) ||
isInArea(2678, 3267, 2601, 3341) ||
isInArea(3265, 3157, 3324, 3215) ||
isInArea(3386, 3264, 3348, 3286) ||
isInArea(2797, 3454, 2838, 3430) ||
isInArea(2546, 3157, 2512, 3176) ||
isInArea(2451, 3408, 2425, 3437) ||
false;
}
public boolean duelingArena() {
if (absX > 3331 && absX < 3391 && absY > 3242 && absY < 3260) {
return true;
}
return false;
}
public boolean playerIsBusy() {
if (isShopping || inTrade || openDuel || isBanking || duelStatus == 1) {
return true;
}
return false;
}
public boolean inDuelArena() {
if (absX > 3322 && absX < 3394 && absY > 3195 && absY < 3291 || absX > 3311 && absX < 3323 && absY > 3223 && absY < 3248) {
return true;
}
return false;
}
public boolean isInArea(final int x1, final int y1, final int x2, final int y2) {
return (absX >= x1 && absX <= x2 || absX <= x1 && absX >= x2) && (absY >= y1 && absY <= y2 || absY <= y1 && absY >= y2);
}
public boolean isInAreaxxyy(final int x1, final int x2, final int y1, final int y2) {
return absX >= x1 && absX <= x2 && absY >= y1 && absY <= y2;
}
public boolean altars() {
return safeAreas(3090, 3506, 3097, 3506);
}
public boolean safeAreas(int x, int y, int x1, int y1) {
return absX >= x && absX <= x1 && absY >= y && absY <= y1;
}
public boolean inFightCaves() {
return absX >= 2360 && absX <= 2445 && absY >= 5045 && absY <= 5125;
}
public boolean inPirateHouse() {
return absX >= 3038 && absX <= 3044 && absY >= 3949 && absY <= 3959;
}
public String connectedFrom = "";
public String globalMessage = "";
public int playerId = -1;
public String playerName = null;
public String playerName2 = null;
public String playerPass = null;
public int playerRights;
public PlayerHandler handler = null;
public int playerItems[] = new int[28];
public int playerItemsN[] = new int[28];
public int bankItems[] = new int[ItemConstants.BANK_SIZE];
public int bankItemsN[] = new int[ItemConstants.BANK_SIZE];
// used for player owned shops
public int bankItemsV[] = new int[ItemConstants.BANK_SIZE];
public boolean bankNotes = false;
public boolean shouldSave = false;
public int playerStandIndex = 0x328;
public int playerTurnIndex = 0x337;
public int playerWalkIndex = 0x333;
public int playerTurn180Index = 0x334;
public int playerTurn90CWIndex = 0x335;
public int playerTurn90CCWIndex = 0x336;
public int playerRunIndex = 0x338;
public int playerHat = 0;
public int playerCape = 1;
public int playerAmulet = 2;
public int playerWeapon = 3;
public int playerChest = 4;
public int playerShield = 5;
public int playerLegs = 7;
public int playerHands = 9;
public int playerFeet = 10;
public int playerRing = 12;
public int playerArrows = 13;
public int[] playerEquipment = new int[14];
public int[] playerEquipmentN = new int[14];
public int[] playerLevel = new int[25];
public int[] playerXP = new int[25];
public void updateShop(int i) {
Client p = (Client) PlayerHandler.players[playerId];
p.getShopAssistant().resetShop(i);
}
public void println_debug(String str) {
System.out.println("[player-" + playerId + "]: " + str);
}
public void println(String str) {
System.out.println("[player-" + playerId + "]: " + str);
}
public Player(int _playerId) {
playerId = _playerId;
playerRights = 0;
for (int i = 0; i < playerItems.length; i++) {
playerItems[i] = 0;
}
for (int i = 0; i < playerItemsN.length; i++) {
playerItemsN[i] = 0;
}
for (int i = 0; i < playerLevel.length; i++) {
if (i == 3) {
playerLevel[i] = 10;
} else {
playerLevel[i] = 1;
}
}
for (int i = 0; i < playerXP.length; i++) {
if (i == 3) {
playerXP[i] = 1300;
} else {
playerXP[i] = 0;
}
}
for (int i = 0; i < ItemConstants.BANK_SIZE; i++) {
bankItems[i] = 0;
}
for (int i = 0; i < ItemConstants.BANK_SIZE; i++) {
bankItemsN[i] = 0;
}
playerAppearance[0] = 0; // gender
playerAppearance[1] = 7; // head
playerAppearance[2] = 25;// Torso
playerAppearance[3] = 29; // arms
playerAppearance[4] = 35; // hands
playerAppearance[5] = 39; // legs
playerAppearance[6] = 44; // feet
playerAppearance[7] = 14; // beard
playerAppearance[8] = 7; // hair colour
playerAppearance[9] = 8; // torso colour
playerAppearance[10] = 9; // legs colour
playerAppearance[11] = 5; // feet colour
playerAppearance[12] = 0; // skin colour
actionID = 0;
playerEquipment[playerHat] = -1;
playerEquipment[playerCape] = -1;
playerEquipment[playerAmulet] = -1;
playerEquipment[playerChest] = -1;
playerEquipment[playerShield] = -1;
playerEquipment[playerLegs] = -1;
playerEquipment[playerHands] = -1;
playerEquipment[playerFeet] = -1;
playerEquipment[playerRing] = -1;
playerEquipment[playerArrows] = -1;
playerEquipment[playerWeapon] = -1;
heightLevel = 0;
if (GameConstants.TUTORIAL_ISLAND) {
teleportToX = 3094;
teleportToY = 3107;
} else {
teleportToX = 3233;
teleportToY = 3229;
}
absX = absY = -1;
mapRegionX = mapRegionY = -1;
currentX = currentY = 0;
resetWalkingQueue();
}
public static final int maxPlayerListSize = GameConstants.MAX_PLAYERS;
public Player playerList[] = new Player[maxPlayerListSize];
public int playerListSize = 0;
public byte playerInListBitmap[] = new byte[GameConstants.MAX_PLAYERS + 7 >> 3];
public static final int maxNPCListSize = NpcHandler.MAX_NPCS;
public Npc npcList[] = new Npc[maxNPCListSize];
public int npcListSize = 0;
public byte npcInListBitmap[] = new byte[NpcHandler.MAX_NPCS + 7 >> 3];
public boolean withinDistance(Player otherPlr) {
if (heightLevel != otherPlr.heightLevel) {
return false;
}
int deltaX = otherPlr.absX - absX, deltaY = otherPlr.absY - absY;
return deltaX <= 15 && deltaX >= -16 && deltaY <= 15 && deltaY >= -16;
}
public boolean withinDistance(Npc npc) {
if (heightLevel != npc.heightLevel) {
return false;
}
if (npc.needRespawn) {
return false;
}
int deltaX = npc.absX - absX, deltaY = npc.absY - absY;
return deltaX <= 15 && deltaX >= -16 && deltaY <= 15 && deltaY >= -16;
}
public boolean withinDistance(int absX, int getY, int getHeightLevel) {
if (heightLevel != getHeightLevel) {
return false;
}
if (objectId == 2242) {
System.out.println("not within distance");
return false;
}
int deltaX = getX() - absX, deltaY = getY() - getY;
return deltaX <= 15 && deltaX >= -16 && deltaY <= 15 && deltaY >= -16;
}
public int distanceToPoint(int pointX, int pointY) {
return (int) Math.sqrt(Math.pow(absX - pointX, 2) + Math.pow(absY - pointY, 2));
}
public int mapRegionX, mapRegionY;
public int absX;
public int absY;
public int currentX, currentY;
public int heightLevel;
public int playerSE = 0x328;
public int playerSEW = 0x333;
public int playerSER = 0x334;
public boolean updateRequired = true;
public final int walkingQueueSize = 50;
public int walkingQueueX[] = new int[walkingQueueSize],
walkingQueueY[] = new int[walkingQueueSize];
public int wQueueReadPtr = 0;
public int wQueueWritePtr = 0;
public boolean isRunning = true;
public int teleportToX = -1, teleportToY = -1;
public void resetWalkingQueue() {
wQueueReadPtr = wQueueWritePtr = 0;
for (int i = 0; i < walkingQueueSize; i++) {
walkingQueueX[i] = currentX;
walkingQueueY[i] = currentY;
}
}
public void addToWalkingQueue(int x, int y) {
int next = (wQueueWritePtr + 1) % walkingQueueSize;
if (next == wQueueWritePtr) {
return;
}
walkingQueueX[wQueueWritePtr] = x;
walkingQueueY[wQueueWritePtr] = y;
wQueueWritePtr = next;
}
public boolean checkRangeDistance() {
return (usingRangeWeapon || usingBow);
}
public int gatherRangeDistance(int distance) {
//dart (non long range)
if (usingRangeWeapon && RangeData.usingDart(this) && fightMode != 3) {
distance = 3;
//longbow (long range)
} else if (usingBow && fightMode == 3 && RangeData.usingLongbow(this)) {
distance = 10;
//longbow (non long range)
} else if (usingBow && fightMode != 3 && RangeData.usingLongbow(this)) {
distance = RangeData.usingCrystalBow(this) ? 10 : 8;
//dart, knife, throwing axe (long range)
} else if (usingRangeWeapon && fightMode == 3) {
distance = RangeData.usingDart(this) ? 5 : 6;
//short bow
} else if (usingBow && !RangeData.usingLongbow(this)) {
distance = fightMode == 3 ? 7 : 9;
}
return distance;
}
public boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
if (checkRangeDistance()) {
distance = gatherRangeDistance(distance);
}
return ((objectX-playerX <= distance && objectX-playerX >= -distance) && (objectY-playerY <= distance && objectY-playerY >= -distance));
}
public boolean goodObjectDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
return ((objectX-playerX <= distance && objectX-playerX >= -distance) && (objectY-playerY <= distance && objectY-playerY >= -distance));
}
public int getNextWalkingDirection() {
if (wQueueReadPtr == wQueueWritePtr) {
return -1;
}
int dir;
do {
dir = Misc.direction(currentX, currentY, walkingQueueX[wQueueReadPtr], walkingQueueY[wQueueReadPtr]);
if (dir == -1) {
wQueueReadPtr = (wQueueReadPtr + 1) % walkingQueueSize;
} else if ((dir & 1) != 0) {
println_debug("Invalid waypoint in walking queue!");
resetWalkingQueue();
return -1;
}
} while (dir == -1 && wQueueReadPtr != wQueueWritePtr);
if (dir == -1) {
return -1;
}
dir >>= 1;
currentX += Misc.directionDeltaX[dir];
currentY += Misc.directionDeltaY[dir];
/*if (!Region.canMove(absX, absY, (absX + Misc.directionDeltaX[dir]), (absY + Misc.directionDeltaY[dir]), heightLevel, 1, 1))
return -1;*/
absX += Misc.directionDeltaX[dir];
absY += Misc.directionDeltaY[dir];
updateWalkEntities();
return dir;
}
public boolean didTeleport = false;
public boolean mapRegionDidChange = false;
public int dir1 = -1, dir2 = -1;
public boolean createItems = false;
public int poimiX = 0, poimiY = 0;
public synchronized void getNextPlayerMovement() {
mapRegionDidChange = false;
didTeleport = false;
dir1 = dir2 = -1;
if (teleportToX != -1 && teleportToY != -1) {
mapRegionDidChange = true;
if (mapRegionX != -1 && mapRegionY != -1) {
int relX = teleportToX - mapRegionX * 8, relY = teleportToY
- mapRegionY * 8;
if (relX >= 2 * 8 && relX < 11 * 8 && relY >= 2 * 8
&& relY < 11 * 8) {
mapRegionDidChange = false;
}
}
if (mapRegionDidChange) {
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();
}
if (Boundary.isIn(this, Boundary.MAGE_TRAINING_ARENA_ENCHANTING) && !Boundary.isIn(teleportToX, teleportToY, teleHeight, Boundary.MAGE_TRAINING_ARENA_ENCHANTING)) {
// remove any enchanting training items
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;
currentY = teleportToY - 8 * mapRegionY;
absX = teleportToX;
absY = teleportToY;
int newHeight = teleHeight >= 0 ? teleHeight : heightLevel >= 0 ? heightLevel : 0;
if (heightLevel != newHeight)
GameEngine.itemHandler.reloadItems(this);
heightLevel = newHeight;
resetWalkingQueue();
teleportToX = teleportToY = teleHeight = -1;
didTeleport = true;
updateWalkEntities();
} else {
dir1 = getNextWalkingDirection();
if (dir1 == -1) {
return;
}
if (isRunning) {
dir2 = getNextWalkingDirection();
}
int deltaX = 0, deltaY = 0;
if (currentX < 2 * 8) {
deltaX = 4 * 8;
mapRegionX -= 4;
mapRegionDidChange = true;
} else if (currentX >= 11 * 8) {
deltaX = -4 * 8;
mapRegionX += 4;
mapRegionDidChange = true;
}
if (currentY < 2 * 8) {
deltaY = 4 * 8;
mapRegionY -= 4;
mapRegionDidChange = true;
} else if (currentY >= 11 * 8) {
deltaY = -4 * 8;
mapRegionY += 4;
mapRegionDidChange = true;
}
if (mapRegionDidChange) {
currentX += deltaX;
currentY += deltaY;
for (int i = 0; i < walkingQueueSize; i++) {
walkingQueueX[i] += deltaX;
walkingQueueY[i] += deltaY;
}
}
}
}
public void updateThisPlayerMovement(Stream str) {
if (str != null) {
if (mapRegionDidChange) {
str.createFrame(73);
str.writeWordA(mapRegionX + 6);
str.writeWord(mapRegionY + 6);
}
if (didTeleport) {
str.createFrameVarSizeWord(81);
str.initBitAccess();
str.writeBits(1, 1);
str.writeBits(2, 3);
str.writeBits(2, heightLevel);
str.writeBits(1, 1);
str.writeBits(1, updateRequired ? 1 : 0);
str.writeBits(7, currentY);
str.writeBits(7, currentX);
return;
}
}
if (dir1 == -1) {
// don't have to update the character position, because we're just standing
if (str != null){
str.createFrameVarSizeWord(81);
str.initBitAccess();
isMoving = false;
if (updateRequired) {
// tell client there's an update block appended at the end
str.writeBits(1, 1);
str.writeBits(2, 0);
} else {
str.writeBits(1, 0);
}
}
if (DirectionCount < 50) {
DirectionCount++;
}
} else {
DirectionCount = 0;
if (str != null) {
str.createFrameVarSizeWord(81);
str.initBitAccess();
str.writeBits(1, 1);
}
if (dir2 == -1) {
isMoving = true;
if (str != null) {
str.writeBits(2, 1);
str.writeBits(3, Misc.xlateDirectionToClient[dir1]);
if (updateRequired) {
str.writeBits(1, 1);
} else {
str.writeBits(1, 0);
}
}
} else {
isMoving = true;
if (str != null) {
str.writeBits(2, 2);
str.writeBits(3, Misc.xlateDirectionToClient[dir1]);
str.writeBits(3, Misc.xlateDirectionToClient[dir2]);
if (updateRequired) {
str.writeBits(1, 1);
} else {
str.writeBits(1, 0);
}
}
if (playerEnergy > 0 && playerRights < 2) {
// calculations from https://oldschool.runescape.wiki/w/Energy
playerEnergy -= 0.64;
if (weight > 0.0)
playerEnergy -= Math.min(weight, 64) / 100;
} else if (playerRights >= 2) {
playerEnergy = 100;
isRunning2 = true;
} else if (playerEnergy <= 0) {
playerEnergy = 0;
isRunning2 = false;
}
}
}
}
public void updatePlayerMovement(Stream str) {
if (str == null)
return;
if (dir1 == -1) {
if (updateRequired || isChatTextUpdateRequired()) {
str.writeBits(1, 1);
str.writeBits(2, 0);
} else {
str.writeBits(1, 0);
}
} else if (dir2 == -1) {
str.writeBits(1, 1);
str.writeBits(2, 1);
str.writeBits(3, Misc.xlateDirectionToClient[dir1]);
str.writeBits(1, updateRequired || isChatTextUpdateRequired() ? 1 : 0);
} else {
str.writeBits(1, 1);
str.writeBits(2, 2);
str.writeBits(3, Misc.xlateDirectionToClient[dir1]);
str.writeBits(3, Misc.xlateDirectionToClient[dir2]);
str.writeBits(1, updateRequired || isChatTextUpdateRequired() ? 1 : 0);
}
}
public byte cachedPropertiesBitmap[] = new byte[GameConstants.MAX_PLAYERS + 7 >> 3];
public void addNewNPC(Npc npc, Stream str, Stream updateBlock) {
int id = npc.npcId;
npcInListBitmap[id >> 3] |= 1 << (id & 7);
npcList[npcListSize++] = npc;
if (str != null) {
str.writeBits(14, id);
}
int z = npc.absY - absY;
if (z < 0) {
z += 32;
}
if (str != null) {
str.writeBits(5, z);
}
z = npc.absX - absX;
if (z < 0) {
z += 32;
}
if (str != null) {
str.writeBits(5, z);
str.writeBits(1, 0);
str.writeBits(12, npc.npcType);
}
boolean savedUpdateRequired = npc.updateRequired;
npc.updateRequired = true;
npc.appendNPCUpdateBlock(updateBlock);
npc.updateRequired = savedUpdateRequired;
if (str != null) {
str.writeBits(1, 1);
}
}
public void addNewPlayer(Player plr, Stream str, Stream updateBlock) {
int id = plr.playerId;
playerInListBitmap[id >> 3] |= 1 << (id & 7);
playerList[playerListSize++] = plr;
if (str != null) {
str.writeBits(11, id);
str.writeBits(1, 1);
}
boolean savedFlag = plr.isAppearanceUpdateRequired();
boolean savedUpdateRequired = plr.updateRequired;
plr.setAppearanceUpdateRequired(true);
plr.updateRequired = true;
plr.appendPlayerUpdateBlock(updateBlock);
plr.setAppearanceUpdateRequired(savedFlag);
plr.updateRequired = savedUpdateRequired;
if (str != null) {
str.writeBits(1, 1);
}
int z = plr.absY - absY;
if (z < 0) {
z += 32;
}
if (str != null) {
str.writeBits(5, z);
}
z = plr.absX - absX;
if (z < 0) {
z += 32;
}
if (str != null) {
str.writeBits(5, z);
}
}
public int headIcon = -1, bountyIcon = 0;
public int DirectionCount = 0;
public boolean appearanceUpdateRequired = true;
public int hitDiff2;
public int hitDiff = 0;
public boolean hitUpdateRequired2;
public boolean hitUpdateRequired = false;
public boolean isDead = false;
protected static Stream playerProps;
static {
playerProps = new Stream(new byte[100]);
}
protected void appendPlayerAppearance(Stream str) {
playerProps.currentOffset = 0;
playerProps.writeByte(playerAppearance[0]);
playerProps.writeByte(headIcon);
playerProps.writeByte(headIconPk);
if(!isNpc) {
if (playerEquipment[ItemConstants.HAT] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.HAT]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.CAPE] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.CAPE]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.AMULET] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.AMULET]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.WEAPON] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.WEAPON]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.CHEST] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.CHEST]);
} else {
playerProps.writeWord(0x100 + playerAppearance[2]);
}
if (playerEquipment[ItemConstants.SHIELD] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.SHIELD]);
} else {
playerProps.writeByte(0);
}
if (!ItemData.isFullBody(playerEquipment[ItemConstants.CHEST])) {
playerProps.writeWord(0x100 + playerAppearance[3]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.LEGS] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.LEGS]);
} else {
playerProps.writeWord(0x100 + playerAppearance[5]);
}
if (!ItemData.isFullHelm(playerEquipment[ItemConstants.HAT])
&& !ItemData.isFullMask(playerEquipment[ItemConstants.HAT])) {
playerProps.writeWord(0x100 + playerAppearance[1]);
} else {
playerProps.writeByte(0);
}
if (playerEquipment[ItemConstants.HANDS] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.HANDS]);
} else {
playerProps.writeWord(0x100 + playerAppearance[4]);
}
if (playerEquipment[ItemConstants.FEET] > 1) {
playerProps.writeWord(0x200 + playerEquipment[ItemConstants.FEET]);
} else {
playerProps.writeWord(0x100 + playerAppearance[6]);
}
if (playerAppearance[0] != 1 && !ItemData.isFullMask(playerEquipment[ItemConstants.HAT])) {
playerProps.writeWord(0x100 + playerAppearance[7]);
} else {
playerProps.writeByte(0);
}
} else {//send npc data
playerProps.writeWord(-1);//Tells client that were being a npc
playerProps.writeWord(npcId2);//send NpcID
}
playerProps.writeByte(playerAppearance[8]);
playerProps.writeByte(playerAppearance[9]);
playerProps.writeByte(playerAppearance[10]);
playerProps.writeByte(playerAppearance[11]);
playerProps.writeByte(playerAppearance[12]);
playerProps.writeWord(playerStandIndex); // standAnimIndex
playerProps.writeWord(playerTurnIndex); // standTurnAnimIndex
playerProps.writeWord(playerWalkIndex); // walkAnimIndex
playerProps.writeWord(playerTurn180Index); // turn180AnimIndex
playerProps.writeWord(playerTurn90CWIndex); // turn90CWAnimIndex
playerProps.writeWord(playerTurn90CCWIndex); // turn90CCWAnimIndex
playerProps.writeWord(playerRunIndex); // runAnimIndex
playerProps.writeQWord(Misc.playerNameToInt64(playerName));
combatLevel = calculateCombatLevel();
playerProps.writeByte(combatLevel); // combat level
playerProps.writeWord(0);
str.writeByteC(playerProps.currentOffset);
str.writeBytes(playerProps.buffer, playerProps.currentOffset, 0);
}
public int calculateCombatLevel() {
// Show the bots as level 0 combat
if (isBot) {
return 0;
}
int j = getLevelForXP(playerXP[GameConstants.ATTACK]);
int k = getLevelForXP(playerXP[GameConstants.DEFENCE]);
int l = getLevelForXP(playerXP[GameConstants.STRENGTH]);
int i1 = getLevelForXP(playerXP[GameConstants.HITPOINTS]);
int j1 = getLevelForXP(playerXP[GameConstants.PRAYER]);
int k1 = getLevelForXP(playerXP[GameConstants.RANGED]);
int l1 = getLevelForXP(playerXP[GameConstants.MAGIC]);
int combatLevel = (int) ((k + i1 + Math.floor(j1 / 2)) * 0.25D) + 1;
double d = (j + l) * 0.32500000000000001D;
double d1 = Math.floor(k1 * 1.5D) * 0.32500000000000001D;
double d2 = Math.floor(l1 * 1.5D) * 0.32500000000000001D;
if (d >= d1 && d >= d2) {
combatLevel += d;
} else if (d1 >= d && d1 >= d2) {
combatLevel += d1;
} else if (d2 >= d && d2 >= d1) {
combatLevel += d2;
}
return combatLevel;
}
public int getLevelForXP(int exp) {
if (exp > 13034430) {
return 99;
} else {
int points = 0;
for (int lvl = 1; lvl <= 99; ++lvl) {
points = (int) (points + Math.floor(lvl + 300.0D
* Math.pow(2.0D, lvl / 7.0D)));
int var5 = (int) Math.floor(points / 4);
if (var5 >= exp) {
return lvl;
}
}
return 99;
}
}
private boolean chatTextUpdateRequired = false;
private byte chatText[] = new byte[4096];
private byte chatTextSize = 0;
private int chatTextColor = 0;
private int chatTextEffects = 0;
protected void appendPlayerChatText(Stream str) {
if (str == null) return;
str.writeWordBigEndian(((getChatTextColor() & 0xFF) << 8) + (getChatTextEffects() & 0xFF));
str.writeByte(playerRights);
str.writeByteC(getChatTextSize());
str.writeBytes_reverse(getChatText(), getChatTextSize(), 0);
}
public void forcedChat(String text) {
forcedText = text;
forcedChatUpdateRequired = true;
updateRequired = true;
setAppearanceUpdateRequired(true);
}
public String forcedText = "null";
public void appendForcedChat(Stream str) {
if (str != null)
str.writeString(forcedText);
}
/**
* Graphics
**/
public int mask100var1 = 0;
public int mask100var2 = 0;
protected boolean mask100update = false;
public void appendMask100Update(Stream str) {
str.writeWordBigEndian(mask100var1);
str.writeDWord(mask100var2);
}
public void gfx100(int gfx) {
mask100var1 = gfx;
mask100var2 = 6553600;
mask100update = true;
updateRequired = true;
}
public void gfx0(int gfx) {
mask100var1 = gfx;
mask100var2 = 65536;
mask100update = true;
updateRequired = true;
}
public boolean wearing2h() {
Client c = (Client) this;
String s = ItemAssistant.getItemName(c.playerEquipment[c.playerWeapon]);
if (s.contains("2h")) {
return true;
}
return false;
}
/**
* Animations
**/
public void startAnimation(int animId) {
if (MonkeyData.isWearingGreegree(this) && !MonkeyData.isAnim(animId) || (wearing2h() && animId == 829)) {
return;
}
if (animId == -1) {
animId = 65535;
}
animationRequest = animId;
animationWaitCycles = 0;
updateRequired = true;
}
public void startAnimation(int animId, int time) {
animationRequest = animId;
animationWaitCycles = time;
updateRequired = true;
}
public void appendAnimationRequest(Stream str) {
str.writeWordBigEndian(animationRequest == -1 ? 65535
: animationRequest);
str.writeByteC(animationWaitCycles);
}
/**
* Face Update
**/
protected boolean faceUpdateRequired = false;
public int face = -1;
public int FocusPointX = -1, FocusPointY = -1;
public void faceUpdate(int index) {
face = index;
faceUpdateRequired = true;
updateRequired = true;
}
public void appendFaceUpdate(Stream str) {
str.writeWordBigEndian(face);
}
public void turnPlayerTo(int pointX, int pointY) {
FocusPointX = 2 * pointX + 1;
FocusPointY = 2 * pointY + 1;
updateRequired = true;
}
private void appendSetFocusDestination(Stream str) {
str.writeWordBigEndianA(FocusPointX);
str.writeWordBigEndian(FocusPointY);
}
/**
* Hit Update
**/
protected void appendHitUpdate(Stream str) {
str.writeByte(getHitDiff()); // What the person got 'hit' for
if (poisonMask == 1) {
str.writeByteA(2);
} else if (getHitDiff() > 0) {
str.writeByteA(1); // 0: red hitting - 1: blue hitting
} else {
str.writeByteA(0); // 0: red hitting - 1: blue hitting
}
if (playerLevel[GameConstants.HITPOINTS] <= 0) {
playerLevel[GameConstants.HITPOINTS] = 0;
isDead = true;
}
str.writeByteC(playerLevel[GameConstants.HITPOINTS]); // Their current hp, for HP bar
str.writeByte(getLevelForXP(playerXP[GameConstants.HITPOINTS]));
}
protected void appendHitUpdate2(Stream str) {
str.writeByte(hitDiff2); // What the perseon got 'hit' for
if (poisonMask == 2) {
str.writeByteS(2);
poisonMask = -1;
} else if (hitDiff2 > 0) {
str.writeByteS(1); // 0: red hitting - 1: blue hitting
} else {
str.writeByteS(0); // 0: red hitting - 1: blue hitting
}
if (playerLevel[GameConstants.HITPOINTS] <= 0) {
playerLevel[GameConstants.HITPOINTS] = 0;
isDead = true;
}
str.writeByte(playerLevel[GameConstants.HITPOINTS]); // Their current hp, for HP bar
str.writeByteC(getLevelForXP(playerXP[GameConstants.HITPOINTS])); // Their max hp, for HP
}
public void appendPlayerUpdateBlock(Stream str) {
if (!updateRequired && !isChatTextUpdateRequired()) {
return; // nothing required
}
int updateMask = 0;
if (mask100update) {
updateMask |= 0x100;
}
if (animationRequest != -1) {
updateMask |= 8;
}
if (forcedChatUpdateRequired) {
updateMask |= 4;
}
if (isChatTextUpdateRequired()) {
updateMask |= 0x80;
}
if (isAppearanceUpdateRequired()) {
updateMask |= 0x10;
}
if (faceUpdateRequired) {
updateMask |= 1;
}
if (FocusPointX != -1) {
updateMask |= 2;
}
if (isHitUpdateRequired()) {
updateMask |= 0x20;
}
if (hitUpdateRequired2) {
updateMask |= 0x200;
}
if (updateMask >= 0x100) {
updateMask |= 0x40;
str.writeByte(updateMask & 0xFF);
str.writeByte(updateMask >> 8);
} else {
str.writeByte(updateMask);
}
// now writing the various update blocks itself - note that their
// order crucial
if (mask100update) {
appendMask100Update(str);
}
if (animationRequest != -1) {
appendAnimationRequest(str);
}
if (forcedChatUpdateRequired) {
appendForcedChat(str);
}
if (isChatTextUpdateRequired()) {
appendPlayerChatText(str);
}
if (faceUpdateRequired) {
appendFaceUpdate(str);
}
if (isAppearanceUpdateRequired()) {
appendPlayerAppearance(str);
}
if (FocusPointX != -1) {
appendSetFocusDestination(str);
}
if (isHitUpdateRequired()) {
appendHitUpdate(str);
}
if (hitUpdateRequired2) {
appendHitUpdate2(str);
}
}
public void clearUpdateFlags() {
updateRequired = false;
setChatTextUpdateRequired(false);
setAppearanceUpdateRequired(false);
setHitUpdateRequired(false);
hitUpdateRequired2 = false;
forcedChatUpdateRequired = false;
mask100update = false;
animationRequest = -1;
FocusPointX = -1;
FocusPointY = -1;
poisonMask = -1;
faceUpdateRequired = false;
face = 65535;
}
public void stopMovement() {
if (teleportToX <= 0 && teleportToY <= 0) {
teleportToX = absX;
teleportToY = absY;
}
newWalkCmdSteps = 0;
getNewWalkCmdX()[0] = getNewWalkCmdY()[0] = travelBackX[0] = travelBackY[0] = 0;
getNextPlayerMovement();
}
private int newWalkCmdX[] = new int[walkingQueueSize];
private int newWalkCmdY[] = new int[walkingQueueSize];
public int newWalkCmdSteps = 0;
private boolean newWalkCmdIsRunning = false;
protected int travelBackX[] = new int[walkingQueueSize];
protected int travelBackY[] = new int[walkingQueueSize];
protected int numTravelBackSteps = 0;
public void preProcessing() {
newWalkCmdSteps = 0;
}
public void postProcessing() {
if (newWalkCmdSteps > 0) {
int firstX = getNewWalkCmdX()[0];
int firstY = getNewWalkCmdY()[0];
boolean found = false;
numTravelBackSteps = 0;
int ptr = wQueueReadPtr;
int dir = Misc.direction(currentX, currentY, firstX, firstY);
if (dir != -1 && (dir & 1) != 0) {
do {
int var13 = dir;
--ptr;
if (ptr < 0) {
ptr = 49;
}
travelBackX[numTravelBackSteps] = walkingQueueX[ptr];
travelBackY[numTravelBackSteps++] = walkingQueueY[ptr];
dir = Misc.direction(walkingQueueX[ptr],
walkingQueueY[ptr], firstX, firstY);
if (var13 != dir) {
found = true;
break;
}
} while (ptr != wQueueWritePtr);
} else {
found = true;
}
if (found) {
wQueueWritePtr = wQueueReadPtr;
addToWalkingQueue(currentX, currentY);
int i;
if (dir != -1 && (dir & 1) != 0) {
for (i = 0; i < numTravelBackSteps - 1; ++i) {
addToWalkingQueue(travelBackX[i], travelBackY[i]);
}
i = travelBackX[numTravelBackSteps - 1];
int wayPointY2 = travelBackY[numTravelBackSteps - 1];
int wayPointX1;
int wayPointY1;
if (numTravelBackSteps == 1) {
wayPointX1 = currentX;
wayPointY1 = currentY;
} else {
wayPointX1 = travelBackX[numTravelBackSteps - 2];
wayPointY1 = travelBackY[numTravelBackSteps - 2];
}
dir = Misc.direction(wayPointX1, wayPointY1, i, wayPointY2);
if (dir != -1 && (dir & 1) == 0) {
dir >>= 1;
found = false;
int x = wayPointX1;
int y = wayPointY1;
while (x != i || y != wayPointY2) {
x += Misc.directionDeltaX[dir];
y += Misc.directionDeltaY[dir];
if ((Misc.direction(x, y, firstX, firstY) & 1) == 0) {
found = true;
break;
}
}
if (!found) {
println_debug("Fatal: Internal error: unable to determine connection vertex! wp1=("
+ wayPointX1
+ ", "
+ wayPointY1
+ "), wp2=("
+ i
+ ", "
+ wayPointY2
+ "), "
+ "first=("
+ firstX
+ ", "
+ firstY + ")");
} else {
addToWalkingQueue(wayPointX1, wayPointY1);
}
} else {
println_debug("Fatal: The walking queue is corrupt! wp1=("
+ wayPointX1
+ ", "
+ wayPointY1
+ "), "
+ "wp2=(" + i + ", " + wayPointY2 + ")");
}
} else {
for (i = 0; i < numTravelBackSteps; ++i) {
addToWalkingQueue(travelBackX[i], travelBackY[i]);
}
}
for (i = 0; i < newWalkCmdSteps; ++i) {
addToWalkingQueue(getNewWalkCmdX()[i], getNewWalkCmdY()[i]);
}
}
isRunning = isNewWalkCmdIsRunning() || isRunning2;
}
}
public int getMapRegionX() {
return mapRegionX;
}
public int getMapRegionY() {
return mapRegionY;
}
public int getX() {
return absX;
}
public int getY() {
return absY;
}
public int getH() {
return heightLevel;
}
public int getId() {
return playerId;
}
public void setHitDiff(int hitDiff) {
this.hitDiff = hitDiff;
}
public void setHitDiff2(int hitDiff2) {
this.hitDiff2 = hitDiff2;
}
public int getHitDiff() {
return hitDiff;
}
public void setHitUpdateRequired(boolean hitUpdateRequired) {
this.hitUpdateRequired = hitUpdateRequired;
}
public void setHitUpdateRequired2(boolean hitUpdateRequired2) {
this.hitUpdateRequired2 = hitUpdateRequired2;
}
public boolean isHitUpdateRequired() {
return hitUpdateRequired;
}
public boolean getHitUpdateRequired() {
return hitUpdateRequired;
}
public boolean getHitUpdateRequired2() {
return hitUpdateRequired2;
}
public void setAppearanceUpdateRequired(boolean appearanceUpdateRequired) {
this.appearanceUpdateRequired = appearanceUpdateRequired;
}
public boolean isAppearanceUpdateRequired() {
return appearanceUpdateRequired;
}
public void setChatTextEffects(int chatTextEffects) {
this.chatTextEffects = chatTextEffects;
}
public int getChatTextEffects() {
return chatTextEffects;
}
public void setChatTextSize(byte chatTextSize) {
this.chatTextSize = chatTextSize;
}
public byte getChatTextSize() {
return chatTextSize;
}
public void setChatTextUpdateRequired(boolean chatTextUpdateRequired) {
this.chatTextUpdateRequired = chatTextUpdateRequired;
}
public boolean isChatTextUpdateRequired() {
return chatTextUpdateRequired;
}
public void setChatText(byte chatText[]) {
this.chatText = chatText;
}
public byte[] getChatText() {
return chatText;
}
public void setChatTextColor(int chatTextColor) {
this.chatTextColor = chatTextColor;
}
public int getChatTextColor() {
return chatTextColor;
}
public void setNewWalkCmdX(int newWalkCmdX[]) {
this.newWalkCmdX = newWalkCmdX;
}
public int[] getNewWalkCmdX() {
return newWalkCmdX;
}
public void setNewWalkCmdY(int newWalkCmdY[]) {
this.newWalkCmdY = newWalkCmdY;
}
public int[] getNewWalkCmdY() {
return newWalkCmdY;
}
public void setNewWalkCmdIsRunning(boolean newWalkCmdIsRunning) {
this.newWalkCmdIsRunning = newWalkCmdIsRunning;
}
public boolean isNewWalkCmdIsRunning() {
return newWalkCmdIsRunning;
}
public void setInStreamDecryption(ISAACRandomGen inStreamDecryption) {
}
public void setOutStreamDecryption(ISAACRandomGen outStreamDecryption) {
}
public boolean samePlayer() {
for (int j = 0; j < PlayerHandler.players.length; j++) {
if (j == playerId) {
continue;
}
if (PlayerHandler.players[j] != null) {
if (PlayerHandler.players[j].playerName.equalsIgnoreCase(playerName)) {
disconnected = true;
return true;
}
}
}
return false;
}
public void putInCombat(int attacker) {
underAttackBy = attacker;
logoutDelay = System.currentTimeMillis();
singleCombatDelay = System.currentTimeMillis();
}
public void dealDamage(int damage) {
if (teleTimer <= 0) {
playerLevel[GameConstants.HITPOINTS] -= damage;
int difference = playerLevel[GameConstants.HITPOINTS] - damage;
if (difference <= getLevelForXP(playerXP[GameConstants.HITPOINTS]) / 10 && difference > 0)
appendRedemption();
getPlayerAssistant().handleROL();
} else {
if (hitUpdateRequired) {
hitUpdateRequired = false;
}
if (hitUpdateRequired2) {
hitUpdateRequired2 = false;
}
}
getPlayerAssistant().refreshSkill(GameConstants.HITPOINTS);
}
public void appendRedemption() {
Client c = (Client) PlayerHandler.players[playerId];
if (c.getPrayer().prayerActive[22]) {
int added = c.playerLevel[GameConstants.HITPOINTS] += (int)(c.getLevelForXP(c.playerXP[GameConstants.PRAYER]) * .25);
if (added > c.getLevelForXP(c.playerXP[GameConstants.HITPOINTS])) {
c.playerLevel[GameConstants.HITPOINTS] = c.getLevelForXP(c.playerXP[GameConstants.HITPOINTS]);
} else {
c.playerLevel[GameConstants.HITPOINTS] += (int)(getLevelForXP(c.playerXP[GameConstants.PRAYER]) * .25);
}
c.playerLevel[GameConstants.PRAYER] = 0;
c.getPlayerAssistant().refreshSkill(GameConstants.HITPOINTS);
c.getPlayerAssistant().refreshSkill(GameConstants.PRAYER);
c.gfx0(436);
PrayerDrain.resetPrayers(c);
}
}
public int[] damageTaken = new int[PlayerHandler.players.length];
public void handleHitMask(int damage) {
if (!hitUpdateRequired) {
hitUpdateRequired = true;
hitDiff = damage;
} else if (!hitUpdateRequired2) {
hitUpdateRequired2 = true;
hitDiff2 = damage;
}
updateRequired = true;
}
}