package net.sourceforge.pain.logic.fn;
import net.sourceforge.pain.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.network.console.*;
import net.sourceforge.pain.util.*;
public final class ConsoleFn {
public static void logoutUser(Console console) {
_logoutUser(console, false);
}
private static void _logoutUser(Console console, boolean silent) {
Player p = console.getPlayer();
removePlayerFromActive(p);
final Located ploc = p.asLocated();
p.setQuitSpace(ploc.getLocation());
RelocateFn.relocate(ploc, Core.getWorld().getPlayersQuitSpace());
if (!silent) {
MessageOutFn.outln(console, "Good bye!");
MessageOutFn.outSpace(p, "$n leaves the game", p, null);
}
console.setPlayer(null);
ConsoleManager.closeConsole(console);
}
private static void removePlayerFromActive(Player p) {
Player prev = p.getPrevActivePlayer();
Player next = p.getNextActivePlayer();
final World world = Core.getWorld();
final Player firstActivePlayer = world.getFirstActivePlayer();
if (prev != p) {//prev is never null, if prev ==p that was last active player
if (next != null) {
next.setPrevActivePlayer(prev);
} else { //p is last in list
firstActivePlayer.setPrevActivePlayer(prev);
}
if (p != firstActivePlayer) {
prev.setNextActivePlayer(next);
} else {
world.setFirstActivePlayer(next);
}
} else {
world.setFirstActivePlayer(null);
}
p.setPrevActivePlayer(null);
p.setNextActivePlayer(null);
}
public static void loginUser(final Console console, final Player player) {
if (console.getPlayer() != null || ConsoleFn.getConsole(player) != null) {
throw new RuntimeException("console.getPlayer() == null && ConsoleFn.getConsole(player) == null violated");
}
Log.debug("ConsoleFn: logging user in:" + player.getLogin());
final World world = Core.getWorld();
Player firstActive = world.getFirstActivePlayer();
player.setNextActivePlayer(null);
if (firstActive == null) {
player.setPrevActivePlayer(player);
world.setFirstActivePlayer(player);
} else {
final Player prev = firstActive.getPrevActivePlayer();
firstActive.setPrevActivePlayer(player);
player.setPrevActivePlayer(prev);
prev.setNextActivePlayer(player);
}
// relocation playe from default logout-players container
// to the player quit space
final Located ploc = player.asLocated();
final Space quitSpace = player.getQuitSpace();
if (quitSpace != null) {
RelocateFn.relocate(ploc, quitSpace);
} else { //player was disconnected with rollback -> todo: disconnect post checker to be sure that disconnected player in world.quitSpace
//do nothing
}
// player.setQuitSpace(null);
console.setPlayer(player);
console.setCommandMode();
MessageOutFn.outln(console, "Hello {w" + player.getName() + "{x !\n ");
MessageOutFn.outSpace(player, "$n enters the game", player);
ShowFn.showSpace(player.asReceptive(), player.asLocated().getLocation());
Log.debug("ConsoleFn: user logged in:" + player.getLogin());
}
/** forces console to disconnect */
public static void forceDisconnect(Console c) {
Player p = c.getPlayer();
if (p != null) {
_logoutUser(c, true);
} else {
ConsoleManager.closeConsole(c);
}
}
public static Console getConsole(LogicalObject obj) {
Player p = (Player) obj.getRole(Player.class);
if (p == null) {
return null;
}
return Console.getConsoleByOwner(p);
}
}