|
|
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
|
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
|
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
|
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
|
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
|
|
// Magicbane Emulator Project © 2013 - 2022
|
|
|
|
// www.magicbane.com
|
|
|
|
|
|
|
|
|
|
|
|
package engine.devcmd.cmds;
|
|
|
|
|
|
|
|
import engine.Enum.BuildingGroup;
|
|
|
|
import engine.Enum.DbObjectType;
|
|
|
|
import engine.Enum.GameObjectType;
|
|
|
|
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.Vector3fImmutable;
|
|
|
|
import engine.objects.*;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class RemoveObjectCmd extends AbstractDevCmd {
|
|
|
|
|
|
|
|
public RemoveObjectCmd() {
|
|
|
|
//set to Player access level so it can be run by non-admins on production.
|
|
|
|
//Actual access level is set in _doCmd.
|
|
|
|
super("remove");
|
|
|
|
this.addCmdString("delete");
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void _doCmd(PlayerCharacter player, String[] words, AbstractGameObject target) {
|
|
|
|
|
|
|
|
int targetID;
|
|
|
|
DbObjectType targetObjType;
|
|
|
|
Building targetBuilding;
|
|
|
|
NPC targetNPC;
|
|
|
|
Mob targetMob;
|
|
|
|
|
|
|
|
if (target == null && words.length != 1) {
|
|
|
|
this.sendUsage(player);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete the targeted building
|
|
|
|
|
|
|
|
if (target != null) {
|
|
|
|
|
|
|
|
switch (target.getObjectType()) {
|
|
|
|
|
|
|
|
case Building:
|
|
|
|
removeBuilding(player, (Building) target);
|
|
|
|
break;
|
|
|
|
case NPC:
|
|
|
|
removeNPC(player, (NPC) target);
|
|
|
|
break;
|
|
|
|
case Mob:
|
|
|
|
removeMob(player, (Mob) target);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throwbackError(player, "Target " + target.getObjectType()
|
|
|
|
+ " is not a valid object type");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Attempt to delete object based upon parsed UUID from input
|
|
|
|
|
|
|
|
// Parse Target UUID
|
|
|
|
|
|
|
|
try {
|
|
|
|
targetID = Integer.parseInt(words[0]);
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
throwbackError(player, "Supplied object ID " + words[0]
|
|
|
|
+ " failed to parse to an Integer");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Determine object type of given UUID
|
|
|
|
|
|
|
|
targetObjType = DbManager.BuildingQueries.GET_UID_ENUM(targetID);
|
|
|
|
|
|
|
|
// Process accordingly
|
|
|
|
|
|
|
|
switch (targetObjType) {
|
|
|
|
case BUILDING:
|
|
|
|
targetBuilding = BuildingManager.getBuilding(targetID);
|
|
|
|
removeBuilding(player, targetBuilding);
|
|
|
|
break;
|
|
|
|
case NPC:
|
|
|
|
targetNPC = NPC.getNPC(targetID);
|
|
|
|
removeNPC(player, targetNPC);
|
|
|
|
break;
|
|
|
|
case MOB:
|
|
|
|
targetMob = Mob.getMob(targetID);
|
|
|
|
removeMob(player, targetMob);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throwbackError(player, "Invalid UUID: Not found in database");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String _getHelpString() {
|
|
|
|
return "Removes targeted or specified object";
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String _getUsageString() {
|
|
|
|
return "' /remove [objectID]' || ' /delete [objectID]'";
|
|
|
|
}
|
|
|
|
|
|
|
|
private void removeBuilding(PlayerCharacter pc, Building building) {
|
|
|
|
|
|
|
|
Zone currentZone = ZoneManager.findSmallestZone(pc.getLoc());
|
|
|
|
|
|
|
|
if (currentZone == null) {
|
|
|
|
this.throwbackError(pc, "Could not locate zone for player.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((building.getBlueprint() != null) && (building.getBlueprint().getBuildingGroup() == BuildingGroup.SPIRE))
|
|
|
|
building.disableSpire(false);
|
|
|
|
|
|
|
|
if ((building.getBlueprint() != null) && (building.getBlueprint().getBuildingGroup() == BuildingGroup.WAREHOUSE)) {
|
|
|
|
City city = City.getCity(building.getParentZone().getPlayerCityUUID());
|
|
|
|
if (city != null) {
|
|
|
|
city.setWarehouseBuildingID(0);
|
|
|
|
}
|
|
|
|
Warehouse.warehouseByBuildingUUID.remove(building.getObjectUUID());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//remove cached shrines.
|
|
|
|
if ((building.getBlueprintUUID() != 0)
|
|
|
|
&& (building.getBlueprint().getBuildingGroup() == BuildingGroup.SHRINE))
|
|
|
|
Shrine.RemoveShrineFromCacheByBuilding(building);
|
|
|
|
|
|
|
|
for (AbstractCharacter ac : building.getHirelings().keySet()) {
|
|
|
|
NPC npc = null;
|
|
|
|
Mob mobA = null;
|
|
|
|
|
|
|
|
if (ac.getObjectType() == GameObjectType.NPC)
|
|
|
|
npc = (NPC) ac;
|
|
|
|
else if (ac.getObjectType() == GameObjectType.Mob)
|
|
|
|
mobA = (Mob) ac;
|
|
|
|
|
|
|
|
if (npc != null) {
|
|
|
|
|
|
|
|
for (Integer minionUUID : npc.minions) {
|
|
|
|
Mob minionMob = Mob.getMob(minionUUID);
|
|
|
|
WorldGrid.RemoveWorldObject(minionMob);
|
|
|
|
WorldGrid.removeObject(minionMob, pc);
|
|
|
|
|
|
|
|
if (minionMob.getParentZone() != null)
|
|
|
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
|
|
|
}
|
|
|
|
|
|
|
|
DbManager.NPCQueries.DELETE_NPC(npc);
|
|
|
|
DbManager.removeFromCache(npc);
|
|
|
|
WorldGrid.RemoveWorldObject(npc);
|
|
|
|
WorldGrid.removeObject(npc, pc);
|
|
|
|
} else if (mobA != null) {
|
|
|
|
|
|
|
|
for (Integer minionUUID : mobA.minions) {
|
|
|
|
Mob minionMob = Mob.getMob(minionUUID);
|
|
|
|
WorldGrid.RemoveWorldObject(minionMob);
|
|
|
|
WorldGrid.removeObject(minionMob, pc);
|
|
|
|
|
|
|
|
if (minionMob.getParentZone() != null)
|
|
|
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
|
|
|
}
|
|
|
|
DbManager.MobQueries.DELETE_MOB(mobA);
|
|
|
|
DbManager.removeFromCache(mobA);
|
|
|
|
WorldGrid.RemoveWorldObject(mobA);
|
|
|
|
WorldGrid.removeObject(mobA, pc);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
Zone zone = building.getParentZone();
|
|
|
|
DbManager.BuildingQueries.DELETE_FROM_DATABASE(building);
|
|
|
|
DbManager.removeFromCache(building);
|
|
|
|
zone.zoneBuildingSet.remove(building);
|
|
|
|
if (building.getBlueprint() != null && building.getBlueprint().getBuildingGroup().equals(BuildingGroup.BARRACK)) {
|
|
|
|
building.RemoveFromBarracksList();
|
|
|
|
}
|
|
|
|
WorldGrid.RemoveWorldObject(building);
|
|
|
|
WorldGrid.removeObject(building, pc);
|
|
|
|
|
|
|
|
ChatManager.chatSayInfo(pc,
|
|
|
|
"Building with ID " + building.getObjectUUID() + " removed");
|
|
|
|
this.setResult(String.valueOf(building.getObjectUUID()));
|
|
|
|
}
|
|
|
|
|
|
|
|
private void removeNPC(PlayerCharacter pc, NPC npc) {
|
|
|
|
|
|
|
|
Zone currentZone = ZoneManager.findSmallestZone(pc.getLoc());
|
|
|
|
if (currentZone == null) {
|
|
|
|
this.throwbackError(pc, "Could not locate zone for player.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove npc from hirelings list.
|
|
|
|
|
|
|
|
if (npc.building != null)
|
|
|
|
npc.building.getHirelings().remove(npc);
|
|
|
|
|
|
|
|
for (Integer minionUUID : npc.minions) {
|
|
|
|
Mob minionMob = Mob.getMob(minionUUID);
|
|
|
|
WorldGrid.RemoveWorldObject(minionMob);
|
|
|
|
WorldGrid.removeObject(minionMob, pc);
|
|
|
|
|
|
|
|
if (minionMob.getParentZone() != null)
|
|
|
|
minionMob.getParentZone().zoneMobSet.remove(minionMob);
|
|
|
|
}
|
|
|
|
|
|
|
|
DbManager.NPCQueries.DELETE_NPC(npc);
|
|
|
|
DbManager.removeFromCache(npc);
|
|
|
|
WorldGrid.RemoveWorldObject(npc);
|
|
|
|
WorldGrid.removeObject(npc, pc);
|
|
|
|
ChatManager.chatSayInfo(pc,
|
|
|
|
"NPC with ID " + npc.getDBID() + " removed");
|
|
|
|
this.setResult(String.valueOf(npc.getDBID()));
|
|
|
|
}
|
|
|
|
|
|
|
|
private void removeMob(PlayerCharacter pc, Mob mob) {
|
|
|
|
|
|
|
|
Zone currentZone = ZoneManager.findSmallestZone(pc.getLoc());
|
|
|
|
|
|
|
|
if (currentZone == null) {
|
|
|
|
this.throwbackError(pc, "Could not locate zone for player.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mob.getParentZone() != null && mob.getParentZone() != currentZone && !mob.isPet() && !mob.isNecroPet()) {
|
|
|
|
this.throwbackError(pc, "Error 376954: Could not Remove Mob.Mob is not in the same zone as player.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove npc from hirelings list.
|
|
|
|
|
|
|
|
if (mob.building != null)
|
|
|
|
mob.building.getHirelings().remove(mob);
|
|
|
|
|
|
|
|
mob.setLoc(Vector3fImmutable.ZERO); //Move it off the plane..
|
|
|
|
mob.setBindLoc(Vector3fImmutable.ZERO); //Reset the bind loc..
|
|
|
|
//mob.setHealth(-1, pc); //Kill it!
|
|
|
|
|
|
|
|
DbManager.MobQueries.DELETE_MOB(mob);
|
|
|
|
|
|
|
|
DbManager.removeFromCache(mob);
|
|
|
|
WorldGrid.RemoveWorldObject(mob);
|
|
|
|
WorldGrid.removeObject(mob, pc);
|
|
|
|
|
|
|
|
if (mob.getParentZone() != null)
|
|
|
|
mob.getParentZone().zoneMobSet.remove(mob);
|
|
|
|
|
|
|
|
ChatManager.chatSayInfo(pc,
|
|
|
|
"Mob with ID " + mob.getDBID() + " removed");
|
|
|
|
this.setResult(String.valueOf(mob.getDBID()));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|