MoparClassic/GameServer/src/org/moparscape/msc/gs/model/Mob.java

334 lines
7.1 KiB
Java

package org.moparscape.msc.gs.model;
import org.moparscape.msc.gs.Instance;
import org.moparscape.msc.gs.core.GameEngine;
import org.moparscape.msc.gs.event.DelayedEvent;
import org.moparscape.msc.gs.event.DuelEvent;
import org.moparscape.msc.gs.event.FightEvent;
import org.moparscape.msc.gs.states.Action;
import org.moparscape.msc.gs.states.CombatState;
import org.moparscape.msc.gs.util.Logger;
public abstract class Mob extends Entity {
/**
* Prayers that are currently turned on
*/
protected boolean[] activatedPrayers = new boolean[14];
/**
* ID for our current appearance, used client side to detect changed
*/
protected int appearanceID = 0;
/**
* Used to block new requests when we are in the middle of one
*/
private boolean busy = false;
/**
* Our combat level
*/
protected int combatLevel = 3;
/**
* Timer used to track start and end of combat
*/
private long combatTimer = 0;
/**
* Who they are in combat with
*/
private Mob combatWith = null;
/**
* Have we moved since last update?
*/
protected boolean hasMoved;
/**
* How many times we have hit our opponent
*/
private int hitsMade = 0;
/**
* The end state of the last combat encounter
*/
private CombatState lastCombatState = CombatState.WAITING;
/**
* Amount of damage last dealt to the player
*/
private int lastDamage = 0;
/**
* Time of last movement, used for timeout
*/
protected long lastMovement = GameEngine.getTime();
public long lastTimeShot = GameEngine.getTime();
protected int mobSprite = 1;
private int[][] mobSprites = new int[][] { { 3, 2, 1 }, { 4, -1, 0 },
{ 5, 6, 7 } };
/**
* Has our appearance changed since last update?
*/
protected boolean ourAppearanceChanged = true;
/**
* The path we are walking
*/
public PathHandler pathHandler = new PathHandler(this);
/**
* Set when the mob has been destroyed to alert players
*/
protected boolean removed = false;
/**
* Has the sprite changed?
*/
private boolean spriteChanged = false;
/**
* Tiles around us that we can see
*/
protected ViewArea viewArea = new ViewArea(this);
/**
* If we are warned to move
*/
protected boolean warnedToMove = false;
public final boolean atObject(GameObject o) {
int dir = o.getDirection();
int width, height;
if (o.getType() == 1) {
width = height = 1;
} else if (dir == 0 || dir == 4) {
width = o.getGameObjectDef().getWidth();
height = o.getGameObjectDef().getHeight();
} else {
height = o.getGameObjectDef().getWidth();
width = o.getGameObjectDef().getHeight();
}
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Point p = Point.location(o.getX() + x, o.getY() + y);
int xDist = Math.abs(location.getX() - p.getX());
int yDist = Math.abs(location.getY() - p.getY());
int tDist = xDist + yDist;
if (tDist <= 1) {
return true;
}
}
}
return false;
}
public boolean finishedPath() {
return pathHandler.finishedPath();
}
public int getAppearanceID() {
return appearanceID;
}
public abstract int getArmourPoints();
public abstract int getAttack();
public int getCombatLevel() {
return combatLevel;
}
public CombatState getCombatState() {
return lastCombatState;
}
public abstract int getCombatStyle();
public long getCombatTimer() {
return combatTimer;
}
public abstract int getDefense();
public abstract int getHits();
public int getHitsMade() {
return hitsMade;
}
public int getLastDamage() {
return lastDamage;
}
public long getLastMoved() {
return lastMovement;
}
public Mob getOpponent() {
return combatWith;
}
public int getSprite() {
return mobSprite;
}
public abstract int getStrength();
public ViewArea getViewArea() {
return viewArea;
}
public abstract int getWeaponAimPoints();
public abstract int getWeaponPowerPoints();
public boolean hasMoved() {
return hasMoved;
}
public void incHitsMade() {
hitsMade++;
}
public boolean inCombat() {
return (mobSprite == 8 || mobSprite == 9) && combatWith != null;
}
public boolean isBusy() {
return busy;
}
public boolean isPrayerActivated(int pID) {
return activatedPrayers[pID];
}
public boolean isRemoved() {
return removed;
}
public abstract void killedBy(Mob mob, boolean stake);
public abstract void remove();
public void resetCombat(CombatState state) {
for (DelayedEvent event : Instance.getDelayedEventHandler().getEvents()) {
if (event instanceof FightEvent) {
FightEvent fighting = (FightEvent) event;
if (fighting.getOwner().equals(this)
|| fighting.getAffectedMob().equals(this)) {
fighting.stop();
break;
}
} else if (event instanceof DuelEvent) {
DuelEvent dueling = (DuelEvent) event;
if (dueling.getOwner().equals(this)
|| dueling.getAffectedPlayer().equals(this)) {
dueling.stop();
break;
}
}
}
setBusy(false);
setSprite(4);
setOpponent(null);
setCombatTimer();
hitsMade = 0;
if (this instanceof Player) {
Player player = (Player) this;
player.setStatus(Action.IDLE);
}
lastCombatState = state;
}
public void resetMoved() {
hasMoved = false;
}
public void resetPath() {
pathHandler.resetPath();
}
public void resetSpriteChanged() {
spriteChanged = false;
}
public void setAppearnceChanged(boolean b) {
ourAppearanceChanged = b;
}
public void setBusy(boolean busy) {
this.busy = busy;
}
public void setCombatLevel(int level) {
combatLevel = level;
ourAppearanceChanged = true;
}
public void setCombatTimer() {
combatTimer = GameEngine.getTime();
}
public abstract void setHits(int lvl);
public void setLastDamage(int d) {
lastDamage = d;
}
public void setLastMoved() {
lastMovement = GameEngine.getTime();
}
public void setLocation(Point p) {
setLocation(p, false);
}
public void setLocation(Point p, boolean teleported) {
if (!teleported) {
updateSprite(p);
hasMoved = true;
}
setLastMoved();
warnedToMove = false;
super.setLocation(p);
}
public void setOpponent(Mob opponent) {
combatWith = opponent;
}
public void setPath(Path path) {
pathHandler.setPath(path);
}
public void setPrayer(int pID, boolean b) {
activatedPrayers[pID] = b;
}
public void setSprite(int x) {
spriteChanged = true;
mobSprite = x;
}
public boolean spriteChanged() {
return spriteChanged;
}
public void updateAppearanceID() {
if (ourAppearanceChanged) {
appearanceID++;
}
}
public void updatePosition() {
pathHandler.updatePosition();
}
protected void updateSprite(Point newLocation) {
try {
int xIndex = getLocation().getX() - newLocation.getX() + 1;
int yIndex = getLocation().getY() - newLocation.getY() + 1;
setSprite(mobSprites[xIndex][yIndex]);
} catch (Exception e) {
Logger.error(e.getMessage());
}
}
public boolean warnedToMove() {
return warnedToMove;
}
public void warnToMove() {
warnedToMove = true;
}
}