Cubot respawns on death. ElectricBox damages near objects

This commit is contained in:
simon 2018-03-10 15:22:11 -05:00
parent 2565d3338c
commit cbb07891fc
8 changed files with 143 additions and 11 deletions

View File

@ -10,9 +10,11 @@ import net.simon987.server.logging.LogManager;
import net.simon987.server.user.User;
import org.json.simple.JSONObject;
import java.awt.*;
import java.util.ArrayList;
import java.util.Random;
public class Cubot extends GameObject implements Updatable, ControllableUnit, Programmable, Attackable {
public class Cubot extends GameObject implements Updatable, ControllableUnit, Programmable, Attackable, Rechargeable {
private static final char MAP_INFO = 0x0080;
public static final int ID = 1;
@ -233,20 +235,19 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
this.energy = energy;
}
public boolean spendEnergy(int spent) {
public boolean spendEnergy(int amount) {
if (energy - spent < 0) {
if (energy - amount < 0) {
return false;
} else {
energy -= spent;
energy -= amount;
return true;
}
}
public void storeEnergy(int qty) {
energy = Math.min(energy + qty, maxEnergy);
public void storeEnergy(int amount) {
energy = Math.min(energy + amount, maxEnergy);
}
public void setMaxEnergy(int maxEnergy) {
@ -420,9 +421,46 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
}
}
public void reset() {
setDead(false);
setHp(maxHp);
setShield(0);
setHeldItem(0);
setEnergy(maxEnergy);
clearKeyboardBuffer();
consoleMessagesBuffer.clear();
lastConsoleMessagesBuffer.clear();
hologramColor = 0;
currentStatus = 0;
lastStatus = 0;
addStatus(CubotStatus.FACTORY_NEW);
}
@Override
public boolean onDeadCallback() {
LogManager.LOGGER.severe("Cubot death");
return true; //always cancelled
LogManager.LOGGER.info(getParent().getUsername() + "'s Cubot died");
reset();
//Teleport to spawn point
this.getWorld().removeObject(this);
this.getWorld().decUpdatable();
ServerConfiguration config = GameServer.INSTANCE.getConfig();
Random random = new Random();
int spawnX = config.getInt("new_user_worldX") + random.nextInt(5);
int spawnY = config.getInt("new_user_worldY") + random.nextInt(5);
String dimension = config.getString("new_user_dimension");
this.setWorld(GameServer.INSTANCE.getGameUniverse().getWorld(spawnX, spawnY, true, dimension));
Point point = this.getWorld().getRandomPassableTile();
this.setX(point.x);
this.setY(point.y);
this.getWorld().addObject(this);
this.getWorld().incUpdatable();
return true;
}
}

View File

@ -7,7 +7,8 @@ public enum CubotStatus {
DEFAULT(0),
RADIATED(1),
DAMAGED(2);
DAMAGED(2),
FACTORY_NEW(3);
public char val;

View File

@ -1,6 +1,7 @@
package net.simon987.cubotplugin.event;
import net.simon987.cubotplugin.Cubot;
import net.simon987.cubotplugin.CubotStatus;
import net.simon987.server.GameServer;
import net.simon987.server.ServerConfiguration;
import net.simon987.server.event.GameEvent;
@ -25,6 +26,7 @@ public class UserCreationListener implements GameEventListener {
User user = (User) event.getSource();
Cubot cubot = new Cubot();
cubot.addStatus(CubotStatus.FACTORY_NEW);
cubot.setObjectId(GameServer.INSTANCE.getGameUniverse().getNextObjectId());
ServerConfiguration config = GameServer.INSTANCE.getConfig();

View File

@ -3,22 +3,28 @@ package net.simon987.npcplugin;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import net.simon987.server.GameServer;
import net.simon987.server.assembly.Util;
import net.simon987.server.game.Attackable;
import net.simon987.server.game.GameObject;
import net.simon987.server.game.Rechargeable;
import net.simon987.server.game.Updatable;
import net.simon987.server.logging.LogManager;
import org.json.simple.JSONObject;
import java.util.ArrayList;
public class ElectricBox extends GameObject implements Updatable, Attackable {
public static final int ID = 7;
private static final int maxHp = GameServer.INSTANCE.getConfig().getInt("electric_box_hp");
private static final int damage = GameServer.INSTANCE.getConfig().getInt("electric_box_damage");
private static final int damageDealt = GameServer.INSTANCE.getConfig().getInt("electric_box_damage");
private static final int energyGiven = GameServer.INSTANCE.getConfig().getInt("electric_box_energy_given");
private int hp;
private ArrayList<Attackable> nearObjects = new ArrayList<>();
public ElectricBox() {
this.hp = maxHp;
@ -71,9 +77,31 @@ public class ElectricBox extends GameObject implements Updatable, Attackable {
return Obstacle.MAP_INFO;
}
private void updateNearObjects() {
nearObjects.clear();
for (GameObject object : getWorld().getGameObjects()) {
if (object != this && object instanceof Attackable && Util.manhattanDist(object.getX(), object.getY(),
getX(), getY()) <= 1) {
nearObjects.add((Attackable) object);
}
}
}
@Override
public void update() {
updateNearObjects();
for (Attackable obj : nearObjects) {
obj.damage(damageDealt);
if (obj instanceof Rechargeable) {
((Rechargeable) obj).storeEnergy(energyGiven);
}
}
}
@Override

View File

@ -92,6 +92,7 @@ public class GameServer implements Runnable {
eventDispatcher.getListeners().add(new UserInfoCommandListener());
eventDispatcher.getListeners().add(new HealObjCommandListener());
eventDispatcher.getListeners().add(new DamageObjCommandListener());
eventDispatcher.getListeners().add(new SetEnergyCommandListener());
}

View File

@ -0,0 +1,16 @@
package net.simon987.server.game;
public interface Rechargeable {
int getEnergy();
void setEnergy(int energy);
boolean spendEnergy(int spent);
void storeEnergy(int amount);
void setMaxEnergy(int maxEnergy);
int getMaxEnergy();
}

View File

@ -160,6 +160,8 @@ public class World implements MongoSerialisable {
if (!object.onDeadCallback()) {
removeObject(object);
//LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId());
} else if (object instanceof Updatable) {
((Updatable) object).update();
}
} else if (object instanceof Updatable) {

View File

@ -0,0 +1,44 @@
package net.simon987.server.game.debug;
import net.simon987.server.GameServer;
import net.simon987.server.event.DebugCommandEvent;
import net.simon987.server.event.GameEvent;
import net.simon987.server.event.GameEventListener;
import net.simon987.server.game.GameObject;
import net.simon987.server.game.Rechargeable;
public class SetEnergyCommandListener implements GameEventListener {
@Override
public Class getListenedEventType() {
return DebugCommandEvent.class;
}
@Override
public void handle(GameEvent event) {
DebugCommandEvent e = (DebugCommandEvent) event;
if (e.getName().equals("setEnergy")) {
GameObject object = GameServer.INSTANCE.getGameUniverse().getObject(e.getLong("objectId"));
if (object != null) {
if (object instanceof Rechargeable) {
int oldEnergy = ((Rechargeable) object).getEnergy();
((Rechargeable) object).setEnergy(e.getInt("amount"));
e.reply("Success: " + oldEnergy + " -> " + e.getInt("amount"));
} else {
e.reply("Object is not Rechargeable");
}
} else {
e.reply("Object not found: " + e.getLong("objectId"));
}
}
}
}