package net.sourceforge.pain.logic.fn; import net.sourceforge.pain.*; import net.sourceforge.pain.network.console.*; import net.sourceforge.pain.data.*; import net.sourceforge.pain.data.type.*; 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); } Core.consoleByOwner.remove(p); 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 shure that disconnected player in world.quitSpace //do nothing } // player.setQuitSpace(null); Core.consoleByOwner.put(player, console); 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) { return (Console) Core.consoleByOwner.get(obj.getRole(Player.class)); } }