Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
6.4 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.devcmd.cmds;
import engine.Enum.GameObjectType;
import engine.devcmd.AbstractDevCmd;
import engine.gameManager.DbManager;
import engine.gameManager.SessionManager;
import engine.math.Vector3fImmutable;
import engine.objects.*;
import engine.server.MBServerStatics;
import java.util.concurrent.ThreadLocalRandom;
public class GotoCmd extends AbstractDevCmd {
public GotoCmd() {
super("goto");
}
@Override
protected void _doCmd(PlayerCharacter pc, String[] words,
AbstractGameObject target) {
Vector3fImmutable loc = null;
// Arg Count Check
if (target != null && words[0].isEmpty()) {
AbstractWorldObject targetAgo = (AbstractWorldObject) target;
pc.teleport(targetAgo.getLoc());
return;
}
if (words[0].isEmpty()) {
this.sendUsage(pc);
return;
}
if (words[0].equalsIgnoreCase("playground")) {
if (target instanceof AbstractCharacter) {
loc = new Vector3fImmutable(63276, 0, -54718);
}
if (loc != null)
pc.teleport(loc);
return;
}
if (words[0].equalsIgnoreCase("coc")) {
if (target instanceof AbstractCharacter) {
loc = new Vector3fImmutable(98561.656f, 0, -13353.778f);
}
if (loc != null)
pc.teleport(loc);
return;
}
String cityName = "";
for (String partial : words) {
cityName += partial + ' ';
}
cityName = cityName.substring(0, cityName.length() - 1);
for (AbstractGameObject cityAgo : DbManager.getList(GameObjectType.City)) {
City city = (City) cityAgo;
if (city == null)
continue;
if (!city.getCityName().equalsIgnoreCase(cityName))
continue;
Zone zone = city.getParent();
if (zone != null) {
if (zone.isNPCCity() || zone.isPlayerCity())
loc = Vector3fImmutable.getRandomPointOnCircle(zone.getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
else
loc = zone.getLoc();
int random = ThreadLocalRandom.current().nextInt(5);
if (random == 1)
break;
}
}
if (loc == null) {
for (AbstractGameObject zoneAgo : DbManager.getList(GameObjectType.Zone)) {
Zone zone = (Zone) zoneAgo;
if (zone == null)
continue;
if (!zone.getName().equalsIgnoreCase(cityName))
continue;
if (zone != null) {
if (zone.isNPCCity() || zone.isPlayerCity())
loc = Vector3fImmutable.getRandomPointOnCircle(zone.getLoc(), MBServerStatics.TREE_TELEPORT_RADIUS);
else
loc = zone.getLoc();
int random = ThreadLocalRandom.current().nextInt(5);
if (random == 1)
break;
}
}
}
if (loc == null && words.length == 1) {
try {
PlayerCharacter pcDest = SessionManager
.getPlayerCharacterByLowerCaseName(words[0]);
if (pcDest == null) {
this.throwbackError(pc, "Player or Zone not found by name: "
+ words[0]);
this.throwbackInfo(pc, "If you have spaces in the zone name, replace them with '_'");
return;
}
if (pcDest.getCombinedName().equals(pc.getCombinedName())) {
this
.throwbackError(pc,
"Cannot goto yourself. Well, you can, but you wont go anywhere.");
return;
}
loc = pcDest.getLoc();
} catch (Exception e) {
this.throwbackError(pc,
"An unknown exception occurred while attempting to goto a character named '"
+ words[0] + '\'');
return;
}
}
if (loc == null) { // lat lon mode
if (words.length != 2) {
throwbackError(pc, this.getUsageString());
return;
}
float lat = 0.0f, lon = 0.0f;
String latLong = '\'' + words[0] + ", " + words[1] + '\'';
try {
lat = Float.parseFloat(words[0]);
lon = Float.parseFloat(words[1]);
loc = new Vector3fImmutable(lat, 0f, -lon);
} catch (NumberFormatException e) {
this.throwbackError(pc, "Supplied LatLong: " + latLong
+ " failed to parse to Floats");
return;
} catch (Exception e) {
this.throwbackError(pc,
"An unknown exception occurred while attempting to goto LatLong of "
+ latLong);
return;
}
}
if (loc != null) {
pc.teleport(loc);
}
}
@Override
protected String _getHelpString() {
return "Alters your characters position TO 'lat' and 'long', or TO the position of 'characterName'. This does not transport you BY 'lat' and 'long', but rather TO 'lat' and 'long' ";
}
@Override
protected String _getUsageString() {
return "'[ /goto lat lon] || [ /goto characterName] || [/goto zoneName \replace spaces with `_`]`";
}
}