// // $Id: JabberClient.java 3283 2004-12-22 19:23:00Z ray $ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved // http://www.threerings.net/code/narya/ // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published // by the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA package com.threerings.jme.client; import com.jme.bui.BRootNode; import com.jme.input.InputHandler; import com.jme.renderer.Camera; import com.jme.renderer.Renderer; import com.jme.scene.Node; import com.jme.system.DisplaySystem; import com.samskivert.util.Config; import com.threerings.util.MessageManager; import com.threerings.presents.client.Client; import com.threerings.presents.client.SessionObserver; import com.threerings.presents.dobj.DObjectManager; import com.threerings.crowd.chat.client.ChatDirector; import com.threerings.crowd.client.LocationDirector; import com.threerings.crowd.client.OccupantDirector; import com.threerings.crowd.client.PlaceView; import com.threerings.crowd.util.CrowdContext; import com.threerings.jme.JmeContext; /** * The Jabber client takes care of instantiating all of the proper * managers and loading up all of the necessary configuration and getting * the client bootstrapped. It can be extended by games that require an * extended context implementation. */ public class JabberClient implements SessionObserver { /** * Initializes a new client and provides it with a frame in which to * display everything. */ public void init (JabberApp app) { _app = app; // create our context _ctx = createContextImpl(); // create the directors/managers/etc. provided by the context createContextServices(app); // for test purposes, hardcode the server info _client.setServer("localhost", 4007); _client.addClientObserver(this); } /** * Returns a reference to the context in effect for this client. This * reference is valid for the lifetime of the application. */ public CrowdContext getContext () { return _ctx; } // documentation inherited from interface SessionObserver public void clientDidLogon (Client client) { // enter the one and only chat room; giant hack warning: we know // that the place we're headed to is ID 2 because there's only one // place on the whole server; a normal client would either issue // an invocation service request at this point or look at // something in the BootstrapData to figure out what to do _ctx.getLocationDirector().moveTo(2); } // documentation inherited from interface SessionObserver public void clientObjectDidChange (Client client) { // nada } // documentation inherited from interface SessionObserver public void clientDidLogoff (Client client) { System.exit(0); } /** * Creates the {@link JabberContext} implementation that will be * passed around to all of the client code. Derived classes may wish * to override this and create some extended context implementation. */ protected CrowdContext createContextImpl () { return new JabberContextImpl(); } /** * Creates and initializes the various services that are provided by * the context. Derived classes that provide an extended context * should override this method and create their own extended * services. They should be sure to call * super.createContextServices. */ protected void createContextServices (JabberApp app) { // create the handles on our various services _client = new Client(null, app); // create our managers and directors _locdir = new LocationDirector(_ctx); _occdir = new OccupantDirector(_ctx); _msgmgr = new MessageManager(MESSAGE_MANAGER_PREFIX); _chatdir = new ChatDirector(_ctx, _msgmgr, null); } /** * The context implementation. This provides access to all of the * objects and services that are needed by the operating client. */ protected class JabberContextImpl implements CrowdContext, JmeContext { /** * Apparently the default constructor has default access, rather * than protected access, even though this class is declared to be * protected. Why, I don't know, but we need to be able to extend * this class elsewhere, so we need this. */ protected JabberContextImpl () { } public Client getClient () { return _client; } public DObjectManager getDObjectManager () { return _client.getDObjectManager(); } public Config getConfig () { return _config; } public LocationDirector getLocationDirector () { return _locdir; } public OccupantDirector getOccupantDirector () { return _occdir; } public ChatDirector getChatDirector () { return _chatdir; } public void setPlaceView (PlaceView view) { // TBD } public void clearPlaceView (PlaceView view) { // we'll just let the next place view replace our old one } public Renderer getRenderer () { return _app.getContext().getRenderer(); } public DisplaySystem getDisplay () { return _app.getContext().getDisplay(); } public Camera getCamera () { return _app.getContext().getCamera(); } public Node getGeometry () { return _app.getContext().getGeometry(); } public Node getInterface () { return _app.getContext().getInterface(); } public InputHandler getInputHandler () { return _app.getContext().getInputHandler(); } // public InputHandler getBufferedInputHandler () { // return _app.getContext().getBufferedInputHandler(); // } public BRootNode getRootNode () { return _app.getContext().getRootNode(); } } protected CrowdContext _ctx; protected JabberApp _app; protected Config _config = new Config("jabber"); protected Client _client; protected LocationDirector _locdir; protected OccupantDirector _occdir; protected ChatDirector _chatdir; protected MessageManager _msgmgr; /** The prefix prepended to localization bundle names before looking * them up in the classpath. */ protected static final String MESSAGE_MANAGER_PREFIX = "rsrc.i18n"; }