package org.pokenet.server.backend.entity;
import java.util.Timer;
import java.util.TimerTask;
import org.pokenet.server.GameServer;
/**
* Represents HM Objects such as trees, boulders, whirlpools, etc.
* @author ZombieBear
*
*/
public class HMObject extends NonPlayerChar {
public enum objectType {
ROCKSMASH_ROCK, CUT_TREE, STRENGTH_BOULDER, WHIRLPOOL
}
private static int HMObjectID = 0;
private boolean addToMovementManager = true;
private int originalX, originalY;
private Timer timer = new Timer();
public static objectType parseHMObject(String name) throws Exception{
for (objectType oT : objectType.values()){
if (name.equalsIgnoreCase(oT.name()))
return oT;
}
throw new Exception("The HMObject requested is invalid.");
}
private objectType m_HMType;
private int m_objId;
final HMObject hmObj = this;
public objectType getType() {
return m_HMType;
}
public void setOriginalX(int x){
originalX = x;
}
public void setOriginalY(int y){
originalY = y;
}
public int getObjId(){
return m_objId;
}
public void setType(objectType oT) {
m_HMType = oT;
if (oT == objectType.STRENGTH_BOULDER){
HMObjectID++;
m_objId = HMObjectID;
}
switch (oT){
case ROCKSMASH_ROCK:
setSprite(-4);
break;
case CUT_TREE:
setSprite(-2);
break;
case STRENGTH_BOULDER:
setSprite(-3);
break;
case WHIRLPOOL:
setSprite(-5);
break;
}
}
public int getNecessaryTrainerLevel(objectType oT) {
switch (oT) {
case ROCKSMASH_ROCK:
return 30;
case CUT_TREE:
return 15;
case STRENGTH_BOULDER:
return 35;
case WHIRLPOOL:
return 40;
}
return 0;
}
@Override
public void talkToPlayer(PlayerChar p) {
// Handle event
if (p.getTrainingLevel() >= getNecessaryTrainerLevel(getType())) {
switch (m_HMType){
case STRENGTH_BOULDER :
queueMovement(p.getFacing());
if (addToMovementManager) {
GameServer.getServiceManager().getMovementService().getMovementManager().addHMObject(this);
addToMovementManager = false;
}
// Return to original position 30 seconds after last movement
timer.schedule(
new TimerTask(){
public void run(){
hmObj.setX(originalX);
hmObj.setY(originalY);
}
}, 30000);
break;
case CUT_TREE:
case ROCKSMASH_ROCK:
case WHIRLPOOL:
getMap().removeChar(this);
// Regrow tree after 30 seconds
timer.schedule(
new TimerTask(){
public void run(){
m_map.addChar(hmObj);
}
}, 30000);
break;
}
} else {
// The player isn't strong enough to do this. Alert client
p.getTcpSession().write("ch" + getNecessaryTrainerLevel(m_HMType));
}
}
}