// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// 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 `_`]`" ;
}
}