/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
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);
    }
}