📄 client.java
字号:
//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 + -