Code:
package org.dementhium.model.player;
import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.Queue;
import org.dementhium.content.skills.Prayer;
import org.dementhium.event.impl.PlayerRestorationTick;
import org.dementhium.model.Item;
import org.dementhium.model.Location;
import org.dementhium.model.Mob;
import org.dementhium.model.World;
import org.dementhium.model.combat.CombatUtils;
import org.dementhium.model.combat.Combat.FightType;
import org.dementhium.model.definition.ItemDefinition;
import org.dementhium.model.definition.PlayerDefinition;
import org.dementhium.model.mask.Appearance;
import org.dementhium.model.mask.ForceText;
import org.dementhium.model.mask.Heal;
import org.dementhium.model.mask.Hits;
import org.dementhium.model.mask.Hits.Hit;
import org.dementhium.model.mask.Hits.HitType;
import org.dementhium.model.npc.impl.summoning.BeastOfBurden;
import org.dementhium.net.ActionSender;
import org.dementhium.net.GameSession;
import org.dementhium.task.impl.MessageExecutionTask;
import org.dementhium.util.BufferUtils;
import org.dementhium.util.Misc;
import org.jboss.netty.buffer.ChannelBuffer;
/**
*
* @author 'Mystic Flow
* @author `Discardedx2
* @author Steve
*/
public final class Player extends Mob {
private final PlayerDefinition definition;
private final Appearance appearance = new Appearance();
private final FriendManager friendManager = new FriendManager(this);
private final Inventory inventory = new Inventory(this);
private final Equipment equipment = new Equipment(this);
private final Skills skills = new Skills(this);
private final Bank bank = new Bank(this);
private final Bonuses bonuses = new Bonuses(this);
private final PlayerUpdate gpi = new PlayerUpdate(this);
private final Gni gni = new Gni(this);
private final Settings settings = new Settings();
private final Queue<Hit> queuedHits = new LinkedList<Hit>();
private final Hits hits = new Hits();
private final Prayer prayer = new Prayer(this);
private final RegionData region = new RegionData(this);
private GameSession connection;
private TradeSession currentTradeSession;
private Player tradePartner;
private BeastOfBurden bob;
private final Queue<MessageExecutionTask> packetQueue = new LinkedList<MessageExecutionTask>();
private boolean isOnline;
public Player(GameSession connection, PlayerDefinition definition) {
super();
this.definition = definition;
this.connection = connection;
}
public void loadPlayer() {
if(!connection.isInLobby()) {
this.EntityLoad();
ActionSender.loginResponse(this);
ActionSender.sendLoginInterfaces(this);
ActionSender.sendLoginConfigurations(this);
ActionSender.sendOtherLoginPackets(this);
if (isDead()) {
skills.sendDead();
}
World.getWorld().submit(new PlayerRestorationTick(this));
setOnline(true);
} else {
ActionSender.sendLobbyResponse(this);
}
String name = Misc.formatPlayerNameForDisplay(getUsername());
for(Player player : World.getWorld().getPlayers()) {
if(player.getFriendManager().getFriends().contains(name)) {
player.getFriendManager().updateFriend(name, this);
}
}
for(Player player : World.getWorld().getLobbyPlayers()) {
if(player.getFriendManager().getFriends().contains(name)) {
player.getFriendManager().updateFriend(name, this);
}
}
loadFriendList();
}
private void loadFriendList() {
ActionSender.sendUnlockIgnoreList(this);
friendManager.loadIgnoreList();
friendManager.loadFriendList();
}
public GameSession getConnection() {
return connection;
}
public String getUsername() {
return definition.getName();
}
public String getPassword() {
return definition.getPassword();
}
public int getRights() {
return definition.getRights();
}
public String load(ByteBuffer buffer) {
String password = BufferUtils.readRS2String(buffer);
System.out.println(password);
setLocation(Location.create(buffer.getShort(), buffer.getShort(), buffer.get()));
skills.setHitPoints(buffer.getShort());
settings.setSpellBook(buffer.getShort());
prayer.setAncientBook(buffer.get() == 1);
for (int i = 0; i < Skills.SKILL_COUNT; i++) {
skills.setLevelAndXP(i, buffer.get(), buffer.getInt());
}
for (int i = 0; i < Inventory.SIZE; i++) {
int id = buffer.getShort();
if (id == -1) {
continue;
}
inventory.getContainer().set(i, new Item(id, buffer.getInt()));
}
for (int i = 0; i < Equipment.SIZE; i++) {
int id = buffer.getShort();
if (id == -1) {
continue;
}
equipment.getEquipment().set(i, new Item(id, buffer.getInt()));
}
for (int i = 0; i < Bank.SIZE; i++) {
int id = buffer.getShort();
if (id == -1) {
continue;
}
bank.getContainer().set(i, new Item(id, buffer.getInt()));
}
for (int i = 0; i < Bank.TAB_SIZE; i ++) {
bank.getTab()[i] = buffer.getShort();
}
if(buffer.remaining() > 0) {
settings.setPrivateTextColor(buffer.get());
int friendLoop = buffer.get() & 0xFF;
for(int i = 0; i < friendLoop; i++) {
friendManager.getFriends().add(BufferUtils.readRS2String(buffer));
}
}
if(buffer.remaining() > 0) {
for(int i = 0; i < 4; i++){
int value = buffer.get();
if(value == -1){
continue;
}
bank.setPin(i, value);
}
bank.setPinSet(buffer.get() == 1);
}
return password;
}
public void save(ChannelBuffer buffer) { // we use a dynamic buffer
BufferUtils.writeRS2String(buffer, definition.getPassword());
buffer.writeShort((short) getLocation().getX());
buffer.writeShort((short) getLocation().getY());
buffer.writeByte((byte) getLocation().getZ());
buffer.writeShort((short) skills.getHitPoints());
buffer.writeShort((short) settings.getSpellBook());
buffer.writeByte((byte) (prayer.isAncientCurses() ? 1 : 0));
for (int i = 0; i < Skills.SKILL_COUNT; i++) {
buffer.writeByte((byte) skills.getLevel(i));
buffer.writeInt((int) skills.getXp(i));
}
for (int i = 0; i < Inventory.SIZE; i++) {
Item item = inventory.get(i);
if (item == null) {
buffer.writeShort((short) -1);
} else {
buffer.writeShort((short) item.getId());
buffer.writeInt(item.getAmount());
}
}
for (int i = 0; i < Equipment.SIZE; i++) {
Item item = equipment.get(i);
if (item == null) {
buffer.writeShort((short) -1);
} else {
buffer.writeShort((short) item.getId());
buffer.writeInt(item.getAmount());
}
}
for (int i = 0; i < Bank.SIZE; i++) {
Item item = bank.getContainer().get(i);
if (item == null) {
buffer.writeShort((short) -1);
} else {
buffer.writeShort((short) item.getId());
buffer.writeInt(item.getAmount());
}
}
for (int i = 0; i < Bank.TAB_SIZE; i++) {
buffer.writeShort((short) bank.getTab()[i]);
}
buffer.writeByte((byte) settings.getPrivateTextColor());
buffer.writeByte((byte) friendManager.getFriends().size());
for(String string : friendManager.getFriends()) {
BufferUtils.writeRS2String(buffer, string);
}
for(int i = 0; i < 4; i++){
buffer.writeByte((byte) bank.getPin(i));
}
buffer.writeByte(bank.getPinSet() ? 1 : 0);
}
public void setSpecialAmount(int amt) {
settings.setSpecialAmount(amt);
ActionSender.sendConfig2(this, 300, amt);
}
public void reverseSpecialActive() {
settings.setUsingSpecial(!settings.isUsingSpecial());
ActionSender.sendConfig(this, 301, settings.isUsingSpecial() ? 1 : 0);
}
public void deductSpecial(int amt) {
setSpecialAmount(settings.getSpecialAmount() - amt);
}
public int getSpecialAmount() {
return settings.getSpecialAmount();
}
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
}
public boolean isOnline() {
return isOnline;
}
@Override
public void heal(int amount) {
getMask().setLastHeal(new Heal((short) amount, (byte) 0, (byte) 0));
}
public void processQueuedHits() {
if (hits.getPrimaryHit() == null) {
if (queuedHits.size() > 0) {
Hit h = queuedHits.poll();
this.hit(h.getDamage(), h.getType());
}
}
if (hits.getSecondaryHit() == null) {
if (queuedHits.size() > 0) {
Hit h = queuedHits.poll();
this.hit(h.getDamage(), h.getType());
}
}
}
public void hit(int damage, Hits.HitType type) {
if (skills.getHitPoints() <= 0) {
damage = 0;
}
if (hits.getPrimaryHit() == null) {
hits.setHit1(new Hit(damage, type));
skills.hit(damage);
} else if (hits.getSecondaryHit() == null) {
hits.setHit2(new Hit(damage, type));
skills.hit(damage);
} else {
queuedHits.add(new Hit(damage, type));
}
}
@Override
public void hit(int damage) {
if (damage > skills.getHitPoints()) {
damage = skills.getHitPoints();
}
if (damage == 0) {
hit(damage, Hits.HitType.NO_DAMAGE);
} else if (damage >= 100) {
hit(damage, Hits.HitType.NORMAL_BIG_DAMAGE);
} else {
hit(damage, Hits.HitType.NORMAL_DAMAGE);
}
}
@Override
public void hit(Mob victim, int damage) {
if (damage > skills.getHitPoints())
damage = skills.getHitPoints();
if (damage == 0) {
hit(damage, Hits.HitType.NO_DAMAGE);
} else if (damage >= 100) {
hit(damage, Hits.HitType.NORMAL_BIG_DAMAGE);
} else {
hit(damage, Hits.HitType.NORMAL_DAMAGE);
}
}
public void hitType(int damage, HitType hitType) {
if (damage > skills.getHitPoints()) {
damage = skills.getHitPoints();
}
hit(damage, hitType);
}
public void forceText(String text) {
mask.setLastForceText(new ForceText(text));
}
public Appearance getAppearence() {
return appearance;
}
public Inventory getInventory() {
return inventory;
}
public Equipment getEquipment() {
return equipment;
}
public Skills getSkills() {
return skills;
}
public Prayer getPrayer() {
return prayer;
}
public Queue<Hit> getQueuedHits() {
return queuedHits;
}
public Hits getHits() {
return hits;
}
public PlayerUpdate getGpi() {
return gpi;
}
public Bank getBank() {
return bank;
}
public Gni getGni() {
return gni;
}
public boolean itemName(String string) {
if (equipment.get(Equipment.SLOT_WEAPON) == null) {
return false;
}
return this.getEquipment().get(Equipment.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains(string);
}
@Override
public FightType getFightType() {
if(getAttribute("autoCastSpell") != null) {
return FightType.MAGIC;
} else if (equipment.usingRanged()) {
return FightType.RANGE;
}
return FightType.MELEE;
}
@Override
public int getAttackAnimation() {
return CombatUtils.getAttackAnimation(this);
}
@Override
public int getAttackDelay() {
int sword = equipment.get(3) != null ? equipment.get(3).getId() : -1;
if(sword == -1) {
return 5;
}
ItemDefinition def = ItemDefinition.forId(sword);
if (def.getAttackSpeed() <= 0) {
//sendMessage("Attack speed for [ "+sword+", "+def.getName()+" ] not added. Set speed too 5.");
return 5;
}
return def.getAttackSpeed();
}
public int bestDefence() {
int bonus = 0;
for(int i = 5; i < 8; i++) {
if(bonuses.getBonus(i) > bonus) {
bonus = bonuses.getBonus(i);
}
}
return bonus;
}
@Override
public int getDefenceAnimation() {
Item shield = equipment.get(Equipment.SLOT_SHIELD);
if(shield != null) {
String name = shield.getDefinition().getName().toLowerCase();
if(name.endsWith("shield"))
return 1156;
else if(name.endsWith("defender"))
return 4177;
}
Item weapon = equipment.get(Equipment.SLOT_WEAPON);
if(weapon != null) {
String name = weapon.getDefinition().getName();
if (name.contains("scimitar"))
return 12030;
if (name.contains("2h"))
return 7050;
if (name.contains("rapier"))
return 388;
if (name.contains("longsword"))
return 13042;
if (name.contains("warhammer"))
return 403;
switch(weapon.getId()) {
case 19784: //korasi's
return 12030;
case 11694:
case 11696:
case 11698:
case 11700:
return 7050;
case 14484:
return 404;
case 4151:
case 15441:
case 15442:
case 15443:
case 15444:
return 11974;
case 13867:
case 13869:
case 13941:
case 13943:
return 404;
case 15486:
return 12806;
case 18353:
return 13054;
case 14679:
return 403;
case 4068:
case 4503:
case 4508:
case 18705:
return 388;
case 6908:
case 6910:
case 6912:
case 6914:
case 6526:
return 420;
case 6528:
return 1666;
case 11716:
return 12008;
case 15241:
return 12156;
}
}
return 424;
}
public Bonuses getBonuses() {
return bonuses;
}
public Settings getSettings() {
return settings;
}
public FriendManager getFriendManager() {
return friendManager;
}
public RegionData getRegion() {
return region;
}
public PlayerDefinition getDefinition() {
return definition;
}
public void appendPacket(MessageExecutionTask task) {
packetQueue.add(task);
}
public void processPackets() {
MessageExecutionTask task;
while((task = packetQueue.poll()) != null) {
try {
task.execute();
} catch(Exception e) {
e.printStackTrace();
}
}
}
public TradeSession getTradeSession() {
return this.currentTradeSession;
}
public void setTradeSession(TradeSession newSession) {
currentTradeSession = newSession;
}
public void setTradePartner(Player tradePartner) {
this.tradePartner = tradePartner;
}
public Player getTradePartner() {
return tradePartner;
}
public void setSpellBook(int book) {
settings.setSpellBook(book);
ActionSender.sendInterface(this, 1, connection.getDisplayMode() < 2 ? 548 : 746, connection.getDisplayMode() < 2 ? 205 : 93, settings.getSpellBook());
ActionSender.organizeSpells(this);
}
public void requestPath(int x, int y, boolean flag) {
ActionSender.requestPath(this, x, y, flag);
}
public void sendMessage(String string) {
if(connection.isInLobby()) {
ActionSender.sendChatMessage(this, 11, string);
} else {
ActionSender.sendMessage(this, string);
}
}
public BeastOfBurden getBob() {
return bob;
}
public void setBob(BeastOfBurden bob) {
this.bob = bob;
}
public boolean refreshAttackOptions() {
/**
* 1 - Multicombat
* 3 - No Skull
* 6 - Skull
*/
if (World.getWorld().getAreaManager().getAreaByName("Wilderness").contains(getLocation())) {
if (World.getWorld().getAreaManager().getAreaByName("Edgeville").contains(getLocation())) {
ActionSender.sendInterfaceConfig(this, 745, 1, true);
ActionSender.sendInterfaceConfig(this, 745, 3, true);
ActionSender.sendInterfaceConfig(this, 745, 6, true);
} else {
ActionSender.sendInterfaceConfig(this, 745, 1, false);
ActionSender.sendInterfaceConfig(this, 745, 3, true);
ActionSender.sendInterfaceConfig(this, 745, 6, true);
}
ActionSender.sendPlayerOption(this, "Attack", 1, true);
ActionSender.sendOverlay(this, 381);
ActionSender.sendInterfaceConfig(this, 381, 1, false);
ActionSender.sendInterfaceConfig(this, 381, 2, false);
return true;
} else {
if (World.getWorld().getAreaManager().getAreaByName("Nex").contains(getLocation())) {
ActionSender.sendInterfaceConfig(this, 745, 1, false);
ActionSender.sendInterfaceConfig(this, 745, 3, true);
ActionSender.sendInterfaceConfig(this, 745, 6, true);
} else {
ActionSender.sendInterfaceConfig(this, 745, 3, true);
ActionSender.sendInterfaceConfig(this, 745, 6, true);
ActionSender.sendInterfaceConfig(this, 745, 1, true);
}
ActionSender.sendInterfaceConfig(this, 381, 1, true);
ActionSender.sendInterfaceConfig(this, 381, 2, true);
ActionSender.sendPlayerOption(this, "null", 1, false);
return false;
}
}
public void reverseAutoRetaliate() {
settings.setAutoRetaliate(!isAutoRetaliating());
ActionSender.sendConfig(this, 172, isAutoRetaliating() ? 0 : 1);
}
@Override
public Player getPlayer() {
return this;
}
@Override
public boolean isPlayer() {
return true;
}
@Override
public boolean isAggressive() {
return false;
}
}