Implemented shield hardware. Added heal, damage and charge shield debug commands.

This commit is contained in:
simon 2018-03-10 13:54:43 -05:00
parent e4269b83c4
commit 2565d3338c
9 changed files with 159 additions and 13 deletions

View File

@ -265,12 +265,12 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
this.shield = shield; this.shield = shield;
} }
public boolean chargeShield(int qty) { public boolean chargeShield(int amount) {
qty = Math.min(qty, maxShield - shield); amount = Math.min(amount, maxShield - shield);
int cost = GameServer.INSTANCE.getConfig().getInt("shield_energy_cost");
int energySpent = qty * cost; int energySpent = amount * CubotShield.COST;
if(spendEnergy(energySpent)) { if(spendEnergy(energySpent)) {
shield += qty; shield += amount;
return true; return true;
} else { } else {
return false; return false;
@ -278,12 +278,12 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
} }
/** /**
* Damages shield by qty. * Damages shield by amount.
* *
* Return damage that broke through the shield. * Return damage that broke through the shield.
*/ */
public int damageShield(int qty) { public int damageShield(int amount) {
int after = shield - qty; int after = shield - amount;
if(after < 0) { if(after < 0) {
shield = 0; shield = 0;
return -after; return -after;
@ -409,7 +409,11 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Pr
@Override @Override
public void damage(int amount) { public void damage(int amount) {
hp -= amount;
//Damage shield first
int hullDamage = damageShield(amount);
hp -= hullDamage;
if (hp <= 0) { if (hp <= 0) {
setDead(true); setDead(true);

View File

@ -1,6 +1,7 @@
package net.simon987.cubotplugin; package net.simon987.cubotplugin;
import com.mongodb.DBObject; import com.mongodb.DBObject;
import net.simon987.cubotplugin.event.ChargeShieldCommandListener;
import net.simon987.cubotplugin.event.CpuInitialisationListener; import net.simon987.cubotplugin.event.CpuInitialisationListener;
import net.simon987.cubotplugin.event.UserCreationListener; import net.simon987.cubotplugin.event.UserCreationListener;
import net.simon987.server.ServerConfiguration; import net.simon987.server.ServerConfiguration;
@ -18,6 +19,7 @@ public class CubotPlugin extends ServerPlugin implements GameObjectDeserializer,
public void init(ServerConfiguration config) { public void init(ServerConfiguration config) {
listeners.add(new CpuInitialisationListener()); listeners.add(new CpuInitialisationListener());
listeners.add(new UserCreationListener()); listeners.add(new UserCreationListener());
listeners.add(new ChargeShieldCommandListener());
LogManager.LOGGER.info("Initialised Cubot plugin"); LogManager.LOGGER.info("Initialised Cubot plugin");
} }

View File

@ -16,6 +16,8 @@ public class CubotShield extends CpuHardware {
private static final int SHIELD_POLL = 2; private static final int SHIELD_POLL = 2;
private Cubot cubot; private Cubot cubot;
public static final int COST = GameServer.INSTANCE.getConfig().getInt("shield_energy_cost");
public CubotShield(Cubot cubot) { public CubotShield(Cubot cubot) {
this.cubot = cubot; this.cubot = cubot;
} }

View File

@ -0,0 +1,45 @@
package net.simon987.cubotplugin.event;
import net.simon987.cubotplugin.Cubot;
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;
public class ChargeShieldCommandListener implements GameEventListener {
@Override
public Class getListenedEventType() {
return DebugCommandEvent.class;
}
@Override
public void handle(GameEvent event) {
DebugCommandEvent e = (DebugCommandEvent) event;
if (e.getName().equals("chargeShield")) {
GameObject cubot = GameServer.INSTANCE.getGameUniverse().getObject(e.getLong("objectId"));
if (cubot != null) {
if (cubot instanceof Cubot) {
String hp = ((Cubot) cubot).getHp() + "/" + ((Cubot) cubot).getMaxHp();
int oldShield = ((Cubot) cubot).getShield();
((Cubot) cubot).chargeShield(e.getInt("amount"));
e.reply("Success: " + hp + " (" + oldShield + ") -> " + hp + "(" + ((Cubot) cubot).getShield() +
")");
} else {
e.reply("Object is not a Cubot");
}
} else {
e.reply("Object not found: " + e.getLong("objectId"));
}
}
}
}

View File

@ -90,6 +90,8 @@ public class GameServer implements Runnable {
eventDispatcher.getListeners().add(new SpawnObjCommandListener()); eventDispatcher.getListeners().add(new SpawnObjCommandListener());
eventDispatcher.getListeners().add(new TpObjectCommandListener()); eventDispatcher.getListeners().add(new TpObjectCommandListener());
eventDispatcher.getListeners().add(new UserInfoCommandListener()); eventDispatcher.getListeners().add(new UserInfoCommandListener());
eventDispatcher.getListeners().add(new HealObjCommandListener());
eventDispatcher.getListeners().add(new DamageObjCommandListener());
} }
@ -184,7 +186,7 @@ public class GameServer implements Runnable {
socketServer.tick(); socketServer.tick();
LogManager.LOGGER.info("Processed " + gameUniverse.getWorldCount() + " worlds (" + updatedWorlds + LogManager.LOGGER.info("Processed " + gameUniverse.getWorldCount() + " worlds (" + updatedWorlds +
") updated"); " updated)");
} }

View File

@ -0,0 +1,46 @@
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.Attackable;
import net.simon987.server.game.GameObject;
public class DamageObjCommandListener implements GameEventListener {
@Override
public Class getListenedEventType() {
return DebugCommandEvent.class;
}
@Override
public void handle(GameEvent event) {
DebugCommandEvent e = (DebugCommandEvent) event;
if (e.getName().equals("damageObj")) {
GameObject object = GameServer.INSTANCE.getGameUniverse().getObject(e.getLong("objectId"));
if (object != null) {
if (object instanceof Attackable) {
int oldHp = ((Attackable) object).getHp();
int maxHp = ((Attackable) object).getMaxHp();
((Attackable) object).damage(e.getInt("amount"));
e.reply("Success: " + oldHp + "/" + maxHp + " -> " + ((Attackable) object).getHp() + "/" + maxHp);
} else {
e.reply("Object is not Attackable");
}
} else {
e.reply("Object not found: " + e.getLong("objectId"));
}
}
}
}

View File

@ -0,0 +1,46 @@
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.Attackable;
import net.simon987.server.game.GameObject;
public class HealObjCommandListener implements GameEventListener {
@Override
public Class getListenedEventType() {
return DebugCommandEvent.class;
}
@Override
public void handle(GameEvent event) {
DebugCommandEvent e = (DebugCommandEvent) event;
if (e.getName().equals("healObj")) {
GameObject object = GameServer.INSTANCE.getGameUniverse().getObject(e.getLong("objectId"));
if (object != null) {
if (object instanceof Attackable) {
int oldHp = ((Attackable) object).getHp();
int maxHp = ((Attackable) object).getMaxHp();
((Attackable) object).heal(e.getInt("amount"));
e.reply("Success: " + oldHp + "/" + maxHp + " -> " + ((Attackable) object).getHp() + "/" + maxHp);
} else {
e.reply("Object is not Attackable");
}
} else {
e.reply("Object not found: " + e.getLong("objectId"));
}
}
}
}

View File

@ -13,9 +13,8 @@ public class DebugCommandHandler implements MessageHandler {
if (json.get("t").equals("debug") && user.isModerator()) { if (json.get("t").equals("debug") && user.isModerator()) {
DebugCommandEvent e = new DebugCommandEvent(json, user); DebugCommandEvent e = new DebugCommandEvent(json, user);
GameServer.INSTANCE.getEventDispatcher().dispatch(e); GameServer.INSTANCE.getEventDispatcher().dispatch(e); //Ignore cancellation
} }
} }
} }

View File

@ -18,7 +18,7 @@ public class TerrainRequestHandler implements MessageHandler {
try { try {
world = GameServer.INSTANCE.getGameUniverse().getWorld( world = GameServer.INSTANCE.getGameUniverse().getWorld(
Long.valueOf((long) json.get("x")).intValue(), Long.valueOf((long) json.get("x")).intValue(),
Long.valueOf((long) json.get("y")).intValue(), false, Long.valueOf((long) json.get("y")).intValue(), true,
(String) json.get("dimension")); (String) json.get("dimension"));
} catch (NullPointerException e) { } catch (NullPointerException e) {
LogManager.LOGGER.severe("FIXME: handle TerrainRequestHandler"); LogManager.LOGGER.severe("FIXME: handle TerrainRequestHandler");