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 net.simon987.server.user.User;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import java.awt.*;
import java.util.ArrayList; 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; private static final char MAP_INFO = 0x0080;
public static final int ID = 1; public static final int ID = 1;
@ -233,20 +235,19 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
this.energy = energy; this.energy = energy;
} }
public boolean spendEnergy(int spent) { public boolean spendEnergy(int amount) {
if (energy - spent < 0) { if (energy - amount < 0) {
return false; return false;
} else { } else {
energy -= spent; energy -= amount;
return true; return true;
} }
} }
public void storeEnergy(int qty) { public void storeEnergy(int amount) {
energy = Math.min(energy + qty, maxEnergy);
energy = Math.min(energy + amount, maxEnergy);
} }
public void setMaxEnergy(int 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 @Override
public boolean onDeadCallback() { public boolean onDeadCallback() {
LogManager.LOGGER.severe("Cubot death"); LogManager.LOGGER.info(getParent().getUsername() + "'s Cubot died");
return true; //always cancelled
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), DEFAULT(0),
RADIATED(1), RADIATED(1),
DAMAGED(2); DAMAGED(2),
FACTORY_NEW(3);
public char val; public char val;

View File

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

View File

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

View File

@ -92,6 +92,7 @@ public class GameServer implements Runnable {
eventDispatcher.getListeners().add(new UserInfoCommandListener()); eventDispatcher.getListeners().add(new UserInfoCommandListener());
eventDispatcher.getListeners().add(new HealObjCommandListener()); eventDispatcher.getListeners().add(new HealObjCommandListener());
eventDispatcher.getListeners().add(new DamageObjCommandListener()); 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()) { if (!object.onDeadCallback()) {
removeObject(object); removeObject(object);
//LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId()); //LogManager.LOGGER.fine("Removed object " + object + " id: " + object.getObjectId());
} else if (object instanceof Updatable) {
((Updatable) object).update();
} }
} else if (object instanceof Updatable) { } 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"));
}
}
}
}