⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
    //Should be private?    public String receiveReport(Vector v) {        boolean doubleBlind = false;                if (v == null) {            return "[null report vector]";        }        StringBuffer report = new StringBuffer();        for (int i = 0; i < v.size(); i++) {            report.append(((Report)v.elementAt(i)).getText());        }        /*         * This make Double blind fully blind.         *          * Its best to do this here as at the server level you can have         * two lines merged, i.e. no new line, and the second line doesn't          * have any obsuring data. This way once the line gets to the client          * we filter it. --Torren         */        while ( game.getOptions().booleanOption("supress_all_double_blind_messages")                 && report.indexOf(Report.OBSCURED_STRING) != -1 ){            doubleBlind = true;            int startPos = report.indexOf(Report.OBSCURED_STRING);            int endPos = report.indexOf("\n",startPos);            if ( report.lastIndexOf("\n",startPos) != -1)                startPos = report.lastIndexOf("\n",startPos);                        //In case we get obscured reports but not final \n            if ( endPos <= 0 )                endPos = report.length();            if ( startPos < 0 )                startPos = 0;                       report.delete(startPos,endPos);        }                String endReport = report.toString();         //Get rid of some extra double spaces that the pasing can sometimes cause.        while ( endReport.indexOf("\n\n") != -1 && doubleBlind){            //Looks silly but it slows the proccess down enough to keep an            //Inf Loop from happening. -- Torren            endReport = endReport.replaceAll("\n\n","\n");        }                return endReport;    }    /**     * Saves server entity status data to a local file     */    private void saveEntityStatus(String sStatus) {        try {            String sLogDir = PreferenceManager.getClientPreferences().getLogDirectory();            File logDir = new File(sLogDir);            if (!logDir.exists()) {                logDir.mkdir();            }            String fileName = "entitystatus.txt";            if (PreferenceManager.getClientPreferences().stampFilenames()) {                fileName = StringUtil.addDateTimeStamp(fileName);            }            FileWriter fw = new FileWriter(sLogDir + File.separator + fileName); //$NON-NLS-1$            fw.write(sStatus);            fw.flush();            fw.close();        } catch (Exception e) {            e.printStackTrace();        }    }        /**     * send the message to the server     */    protected void send(Packet packet) {                connection.send(packet);    }    protected void handlePacket(Packet c) {        if (c == null) {            System.out.println("client: got null packet"); //$NON-NLS-1$            return;        }        switch (c.getCommand()) {            case Packet.COMMAND_CLOSE_CONNECTION :                disconnected();                break;            case Packet.COMMAND_SERVER_GREETING :                connected = true;                send(new Packet(Packet.COMMAND_CLIENT_NAME, name));                break;            case Packet.COMMAND_SERVER_CORRECT_NAME :                correctName(c);                break;            case Packet.COMMAND_LOCAL_PN :                this.local_pn = c.getIntValue(0);                break;            case Packet.COMMAND_PLAYER_UPDATE :                receivePlayerInfo(c);                break;            case Packet.COMMAND_PLAYER_READY :                getPlayer(c.getIntValue(0)).setDone(c.getBooleanValue(1));                break;            case Packet.COMMAND_PLAYER_ADD :                receivePlayerInfo(c);                break;            case Packet.COMMAND_PLAYER_REMOVE :                game.removePlayer(c.getIntValue(0));                break;            case Packet.COMMAND_CHAT :                if (log == null)                    initGameLog();                if (log != null && keepGameLog()) {                    log.append( (String) c.getObject(0) );                }                game.processGameEvent(new GamePlayerChatEvent(this,null, (String) c.getObject(0)));                break;            case Packet.COMMAND_ENTITY_ADD :                receiveEntityAdd(c);                break;            case Packet.COMMAND_ENTITY_UPDATE :                receiveEntityUpdate(c);                break;            case Packet.COMMAND_ENTITY_REMOVE :                receiveEntityRemove(c);                break;            case Packet.COMMAND_ENTITY_VISIBILITY_INDICATOR :                receiveEntityVisibilityIndicator(c);                break;            case Packet.COMMAND_SENDING_MINEFIELDS :                receiveSendingMinefields(c);                break;            case Packet.COMMAND_DEPLOY_MINEFIELDS :                receiveDeployMinefields(c);                break;            case Packet.COMMAND_REVEAL_MINEFIELD :                receiveRevealMinefield(c);                break;            case Packet.COMMAND_REMOVE_MINEFIELD :                receiveRemoveMinefield(c);                break;            case Packet.COMMAND_CHANGE_HEX :                game.getBoard().setHex((Coords) c.getObject(0), (IHex) c.getObject(1));                break;            case Packet.COMMAND_BLDG_UPDATE_CF :                receiveBuildingUpdateCF(c);                break;            case Packet.COMMAND_BLDG_COLLAPSE :                receiveBuildingCollapse(c);                break;            case Packet.COMMAND_PHASE_CHANGE :                changePhase(c.getIntValue(0));                break;            case Packet.COMMAND_TURN :                changeTurnIndex(c.getIntValue(0));                break;            case Packet.COMMAND_ROUND_UPDATE :                game.setRoundCount(c.getIntValue(0));                break;            case Packet.COMMAND_SENDING_TURNS :                receiveTurns(c);                break;            case Packet.COMMAND_SENDING_BOARD :                receiveBoard(c);                break;            case Packet.COMMAND_SENDING_ENTITIES :                receiveEntities(c);                break;            case Packet.COMMAND_SENDING_REPORTS :            case Packet.COMMAND_SENDING_REPORTS_TACTICAL_GENIUS :                phaseReport = receiveReport((Vector) c.getObject(0));                if (keepGameLog()) {                    if (log == null && game.getRoundCount() == 1)                        initGameLog();                    if (log != null)                        log.append(phaseReport);                }                game.addReports((Vector) c.getObject(0));                roundReport = receiveReport(game.getReports(game.getRoundCount()));                if (c.getCommand() ==                    Packet.COMMAND_SENDING_REPORTS_TACTICAL_GENIUS) {                    game.processGameEvent(new GameReportEvent(this, null));                }                break;            case Packet.COMMAND_SENDING_REPORTS_SPECIAL :                game.processGameEvent(new GameReportEvent(this, receiveReport((Vector) c.getObject(0))));                break;            case Packet.COMMAND_SENDING_REPORTS_ALL :                Vector allReports = (Vector) c.getObject(0);                game.setAllReports(allReports);                if (keepGameLog()) {                    //Re-write gamelog.txt from scratch                    initGameLog();                    if (log != null) {                        for (int i = 0; i < allReports.size(); i++) {                            log.append(receiveReport((Vector)allReports.elementAt(i)));                        }                    }                }                roundReport = receiveReport(game.getReports(game.getRoundCount()));                //We don't really have a copy of the phase report at                // this point, so I guess we'll just use the round report                // until the next phase actually completes.                phaseReport = roundReport;                break;            case Packet.COMMAND_ENTITY_ATTACK :                receiveAttack(c);                break;            case Packet.COMMAND_SENDING_GAME_SETTINGS :                game.setOptions((GameOptions) c.getObject(0));                break;            case Packet.COMMAND_SENDING_MAP_SETTINGS :                mapSettings = (MapSettings) c.getObject(0);                game.processGameEvent(new GameSettingsChangeEvent(this));                break;            case Packet.COMMAND_QUERY_MAP_SETTINGS :                game.processGameEvent(new GameMapQueryEvent(this, (MapSettings)c.getObject(0)));                break;            case Packet.COMMAND_END_OF_GAME :                String sEntityStatus = (String) c.getObject(0);                game.end(c.getIntValue(1), c.getIntValue(2));                // save victory report                saveEntityStatus(sEntityStatus);                break;            case Packet.COMMAND_SENDING_ARTILLERYATTACKS :                Vector v = (Vector)c.getObject(0);                game.setArtilleryVector(v);                break;            case Packet.COMMAND_SENDING_FLARES :                Vector v2 = (Vector)c.getObject(0);                game.setFlares(v2);                break;            case Packet.COMMAND_SEND_SAVEGAME:                String sFinalFile = (String)c.getObject(0);                String localFile = "savegames" + File.separator + sFinalFile;                                try {                    File sDir = new File("savegames");                    if (!sDir.exists()) {                        sDir.mkdir();                    }                } catch (Exception e) {                    System.err.println("Unable to create savegames directory");                }                try {                    ObjectOutputStream oos = new ObjectOutputStream(                        new FileOutputStream(localFile));                    oos.writeObject(c.getObject(1));                    oos.flush();                    oos.close();                } catch (Exception e) {                    System.err.println("Unable to save file: " + sFinalFile);                    e.printStackTrace();                }                break;        }    }    /**     * Perform a dump of the current memory usage.     * <p/>     * This method is useful in tracking performance issues on various     * player's systems.  You can activate it by changing the "memorydumpon"     * setting to "true" in the MegaMek.cfg file.     *     * @param   where - a <code>String</code> indicating which part of the     *          game is making this call.     *     * @see     megamek.common.Settings#memoryDumpOn     * @see     megamek.client.Client#changePhase(int)     */    private void memDump(String where) {        if (PreferenceManager.getClientPreferences().memoryDumpOn()) {            StringBuffer buf = new StringBuffer();            final long total = Runtime.getRuntime().totalMemory();            final long free = Runtime.getRuntime().freeMemory();            final long used = total - free;            buf.append("Memory dump ").append(where); //$NON-NLS-1$            for (int loop = where.length(); loop < 25; loop++) {                buf.append(' ');            }            buf.append(": used (").append(used).append(") + free (").append(free).append(") = ").append(total); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$            System.out.println(buf.toString());        }    }        public String getName() {        return name;    }    public int getPort() {        return port;    }    public String getHost() {        return host;    }    private void correctName(Packet inP) {        setName((String)(inP.getObject(0)));    }    public void setName(String newN) {        name = newN;    }    //Before we officially "add" this unit to the game, check and see    // if this client (player) already has a unit in the game with the    // same name.  If so, add an identifier to the units name.    private void checkDuplicateNamesDuringAdd(Entity entity) {        if (duplicateNameHash.get(entity.getShortName()) == null) {            duplicateNameHash.put(entity.getShortName(), new Integer(1));        } else {            int count = ((Integer)duplicateNameHash.get(entity.getShortName())).intValue();            count++;            duplicateNameHash.put(entity.getShortName(), new Integer(count));            entity.duplicateMarker = count;            entity.generateShortName();            entity.generateDisplayName();        }    }    //If we remove an entity, we may need to update the duplicate identifier.    //TODO: This function is super slow :(    private void checkDuplicateNamesDuringDelete(int id) {        Entity entity = game.getEntity(id);        Object o = duplicateNameHash.get(entity.getShortNameRaw());        if (o != null) {            int count = ((Integer)o).intValue();            if (count > 1) {                Vector myEntities = game.getPlayerEntities(game.getPlayer(local_pn));                for (int i = 0; i < myEntities.size(); i++) {                    Entity e = (Entity)myEntities.elementAt(i);                    if (e.getShortNameRaw().equals(entity.getShortNameRaw())                        && e.duplicateMarker > entity.duplicateMarker) {                        e.duplicateMarker--;                        e.generateShortName();                        e.generateDisplayName();                        sendUpdateEntity(e);                    }                }                duplicateNameHash.put(entity.getShortNameRaw(), new Integer(count - 1));            } else {                duplicateNameHash.remove(entity.getShortNameRaw());            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -