|
|
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
|
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
|
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
|
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
|
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
|
|
// Magicbane Emulator Project © 2013 - 2022
|
|
|
|
// www.magicbane.com
|
|
|
|
|
|
|
|
|
|
|
|
package engine.devcmd.cmds;
|
|
|
|
|
|
|
|
import engine.Enum.ProtectionState;
|
|
|
|
import engine.InterestManagement.WorldGrid;
|
|
|
|
import engine.devcmd.AbstractDevCmd;
|
|
|
|
import engine.gameManager.BuildingManager;
|
|
|
|
import engine.gameManager.ChatManager;
|
|
|
|
import engine.gameManager.DbManager;
|
|
|
|
import engine.gameManager.ZoneManager;
|
|
|
|
import engine.math.Vector3f;
|
|
|
|
import engine.math.Vector3fImmutable;
|
|
|
|
import engine.objects.*;
|
|
|
|
import org.pmw.tinylog.Logger;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Eighty
|
|
|
|
*/
|
|
|
|
public class MakeBaneCmd extends AbstractDevCmd {
|
|
|
|
|
|
|
|
public MakeBaneCmd() {
|
|
|
|
super("makebane");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void _doCmd(PlayerCharacter pc, String[] words,
|
|
|
|
AbstractGameObject target) {
|
|
|
|
if (words.length < 1 || words.length > 2) {
|
|
|
|
this.sendUsage(pc);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
int attackerID = 0;
|
|
|
|
int rank = 8;
|
|
|
|
|
|
|
|
if (words.length == 2) {
|
|
|
|
try {
|
|
|
|
attackerID = Integer.parseInt(words[0]);
|
|
|
|
rank = Integer.parseInt(words[1]);
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
throwbackError(pc, "AttackerGuildID must be a number, " + words[0] + " is invalid");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else if (words.length == 1) {
|
|
|
|
if (target == null) {
|
|
|
|
throwbackError(pc, "No target specified");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(target instanceof PlayerCharacter)) {
|
|
|
|
throwbackError(pc, "Target is not a player");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
attackerID = target.getObjectUUID();
|
|
|
|
|
|
|
|
try {
|
|
|
|
rank = Integer.parseInt(words[0]);
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
throwbackError(pc, "Rank must be specified, 1 through 8");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rank < 1 || rank > 8) {
|
|
|
|
throwbackError(pc, "Rank must be 1 through 8");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PlayerCharacter player = PlayerCharacter.getPlayerCharacter(attackerID);
|
|
|
|
|
|
|
|
|
|
|
|
if (player.getGuild().isEmptyGuild()) {
|
|
|
|
throwbackError(pc, "Errant's can not place banes");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
AbstractCharacter attackerAGL = Guild.GetGL(player.getGuild());
|
|
|
|
|
|
|
|
if (attackerAGL == null) {
|
|
|
|
throwbackError(pc, "No guild leader found for attacking guild.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(attackerAGL instanceof PlayerCharacter)) {
|
|
|
|
throwbackError(pc, "Attacking guild leader is an NPC.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (player.getGuild().isNPCGuild()) {
|
|
|
|
throwbackError(pc, "The guild used is an npc guild. They can not bane.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (player.getGuild().getOwnedCity() != null) {
|
|
|
|
// throwbackError(pc, "The attacking guild already has a city.");
|
|
|
|
// return;
|
|
|
|
// }
|
|
|
|
|
|
|
|
Zone zone = ZoneManager.findSmallestZone(pc.getLoc());
|
|
|
|
|
|
|
|
if (zone == null) {
|
|
|
|
throwbackError(pc, "Unable to find the zone you're in.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!zone.guild_zone) {
|
|
|
|
throwbackError(pc, "This is not a player city.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
City city = City.getCity(zone.playerCityUUID);
|
|
|
|
if (city == null) {
|
|
|
|
throwbackError(pc, "Unable to find the city associated with this zone.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (city.getTOL() == null) {
|
|
|
|
throwbackError(pc, "Unable to find the tree of life for this city.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (city.getBane() != null) {
|
|
|
|
throwbackError(pc, "This city is already baned.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Bane.getBaneByAttackerGuild(player.getGuild()) != null) {
|
|
|
|
throwbackError(pc, "This guild is already baning someone.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Blueprint blueprint = Blueprint.getBlueprint(24300);
|
|
|
|
|
|
|
|
if (blueprint == null) {
|
|
|
|
throwbackError(pc, "Unable to find building set for banestone.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector3f rot = new Vector3f(0, 0, 0);
|
|
|
|
|
|
|
|
// *** Refactor : Overlap test goes here
|
|
|
|
|
|
|
|
//Let's drop a banestone!
|
|
|
|
Vector3fImmutable localLocation = ZoneManager.worldToLocal(pc.getLoc(), zone);
|
|
|
|
|
|
|
|
if (localLocation == null) {
|
|
|
|
ChatManager.chatSystemError(pc, "Failed to convert world location to zone location. Contact a CCR.");
|
|
|
|
Logger.info("Failed to Convert World coordinates to local zone coordinates");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Building stone = DbManager.BuildingQueries.CREATE_BUILDING(
|
|
|
|
zone.getObjectUUID(), pc.getObjectUUID(), blueprint.getName(), blueprint.getBlueprintUUID(),
|
|
|
|
localLocation, 1.0f, blueprint.getMaxHealth(rank), ProtectionState.PROTECTED, 0, rank,
|
|
|
|
null, blueprint.getBlueprintUUID(), 1, 0.0f);
|
|
|
|
|
|
|
|
if (stone == null) {
|
|
|
|
ChatManager.chatSystemError(pc, "Failed to create banestone.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
stone.addEffectBit((1 << 19));
|
|
|
|
BuildingManager.setRank(stone, (byte) rank);
|
|
|
|
stone.setMaxHitPoints(blueprint.getMaxHealth(stone.getRank()));
|
|
|
|
stone.setCurrentHitPoints(stone.getMaxHitPoints());
|
|
|
|
BuildingManager.setUpgradeDateTime(stone, null, 0);
|
|
|
|
|
|
|
|
//Make the bane
|
|
|
|
|
|
|
|
Bane bane = Bane.makeBane(player, city, stone);
|
|
|
|
|
|
|
|
if (bane == null) {
|
|
|
|
|
|
|
|
//delete bane stone, failed to make bane object
|
|
|
|
DbManager.BuildingQueries.DELETE_FROM_DATABASE(stone);
|
|
|
|
|
|
|
|
throwbackError(pc, "Failed to create bane.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
WorldGrid.addObject(stone, pc);
|
|
|
|
|
|
|
|
//Add baned effect to TOL
|
|
|
|
city.getTOL().addEffectBit((1 << 16));
|
|
|
|
city.getTOL().updateEffects();
|
|
|
|
|
|
|
|
Vector3fImmutable movePlayerOutsideStone = player.getLoc();
|
|
|
|
movePlayerOutsideStone = movePlayerOutsideStone.setX(movePlayerOutsideStone.x + 10);
|
|
|
|
movePlayerOutsideStone = movePlayerOutsideStone.setZ(movePlayerOutsideStone.z + 10);
|
|
|
|
player.teleport(movePlayerOutsideStone);
|
|
|
|
|
|
|
|
throwbackInfo(pc, "The city has been succesfully baned.");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String _getHelpString() {
|
|
|
|
return "Creates an bane.";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String _getUsageString() {
|
|
|
|
return "'./makebane playerUUID baneRank'";
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|