Skip to content

Commit

Permalink
add discovery installed maps.
Browse files Browse the repository at this point in the history
add visualisation of installed maps' resources.
auto-download missing maps that are known by taf server.
  • Loading branch information
Axle1975 committed Feb 20, 2021
1 parent 905327f commit 56feb94
Show file tree
Hide file tree
Showing 59 changed files with 1,035 additions and 486 deletions.
8 changes: 3 additions & 5 deletions src/main/java/com/faforever/client/chat/ChatController.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class ChatController extends AbstractViewController<Node> {
private final EventBus eventBus;
private final GameService gameService;
public Node chatRoot;
public HBox chatContainer;
public VBox chatContainer;
public TabPane tabPane;
public Pane connectingProgressPane;
public VBox noOpenTabsContainer;
Expand Down Expand Up @@ -291,15 +291,13 @@ protected void onDisplay(NavigateEvent navigateEvent) {
if (navigateEvent instanceof JoinChannelEvent) {
String channelName = ((JoinChannelEvent) navigateEvent).getChannel();
chatService.joinChannel(channelName);

AbstractChatTabController controller = nameToChatTabController.get(channelName);
if (controller != null) {
this.tabPane.getSelectionModel().select(controller.getRoot());
}

return;
}
if (!tabPane.getTabs().isEmpty()) {

else if (!tabPane.getTabs().isEmpty()) {
Tab tab = tabPane.getSelectionModel().getSelectedItem();
nameToChatTabController.get(tab.getId()).onDisplay();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import com.faforever.client.fx.PlatformService;
import com.faforever.client.i18n.I18n;
import com.faforever.client.map.MapService;
import com.faforever.client.map.MapService.PreviewSize;
import com.faforever.client.map.MapService.PreviewType;
import com.faforever.client.player.Player;
import com.faforever.client.player.PlayerService;
import com.faforever.client.preferences.ChatPrefs;
Expand Down Expand Up @@ -492,7 +492,7 @@ private void updateGameStatus() {
playerStatusIndicator.setImage(getPlayerStatusIcon(player.getStatus()));
playerMapImage.setVisible(true);
if (player.getGame() != null) {
playerMapImage.setImage(mapService.loadPreview(player.getGame().getFeaturedMod(), player.getGame().getMapFolderName(), PreviewSize.SMALL));
playerMapImage.setImage(mapService.loadPreview(player.getGame().getFeaturedMod(), player.getGame().getMapName(), PreviewType.MINI, 10));
}
}
}
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/com/faforever/client/coop/CoopController.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,10 @@
import com.faforever.client.game.NewGameInfo;
import com.faforever.client.i18n.I18n;
import com.faforever.client.map.MapService;
import com.faforever.client.map.MapService.PreviewSize;
import com.faforever.client.map.MapService.PreviewType;
import com.faforever.client.mod.ModService;
import com.faforever.client.notification.ImmediateErrorNotification;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.remote.domain.GameStatus;
import com.faforever.client.replay.ReplayService;
import com.faforever.client.reporting.ReportingService;
import com.faforever.client.theme.UiService;
Expand Down Expand Up @@ -252,7 +251,7 @@ private CoopMission getSelectedMission() {
private void setSelectedMission(CoopMission mission) {
Platform.runLater(() -> {
descriptionWebView.getEngine().loadContent(mission.getDescription());
mapImageView.setImage(mapService.loadPreview(COOP.getTechnicalName(), mission.getMapFolderName(), PreviewSize.SMALL));
mapImageView.setImage(mapService.loadPreview(COOP.getTechnicalName(), mission.getMapFolderName(), PreviewType.MINI, 10));
});

loadLeaderboard();
Expand Down
122 changes: 122 additions & 0 deletions src/main/java/com/faforever/client/fa/MapTool.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.faforever.client.fa;

import com.faforever.client.map.MapBean;
import com.faforever.client.map.MapBean.Type;
import com.faforever.client.map.MapService.PreviewType;
import com.faforever.client.map.MapSize;
import com.faforever.client.update.ClientConfiguration.Downloadable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.invoke.MethodHandles;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class MapTool {

public static final Integer MAP_DETAIL_COLUMN_NAME = 0;
public static final Integer MAP_DETAIL_COLUMN_ARCHIVE = 1;
public static final Integer MAP_DETAIL_COLUMN_CRC = 2;
public static final Integer MAP_DETAIL_COLUMN_DESCRIPTION = 3;
public static final Integer MAP_DETAIL_COLUMN_SIZE = 4;
public static final Integer MAP_DETAIL_COLUMN_NUM_PLAYERS = 5;
public static final Integer MAP_DETAIL_COLUMN_WIND = 6;
public static final Integer MAP_DETAIL_COLUMN_TIDAL = 7;
public static final Integer MAP_DETAIL_COLUMN_GRAVITY = 8;

private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static public List<String[]> listMaps(Path gamePath, String mapNameSpec, Path mapCacheDirectory, boolean doCrc) {
String nativeDir = System.getProperty("nativeDir", "lib");
Path exe = Paths.get(nativeDir).resolve("gpgnet4ta").resolve("maptool.exe");
Path workingDirectory = exe.getParent();

String QUOTED = "\"%s\"";
List<String> command = new ArrayList<>();
command.add(String.format(QUOTED, exe.toAbsolutePath()));
command.add("--gamepath");
command.add(String.format(QUOTED, gamePath));
if (mapCacheDirectory != null) {
command.add("--featurescachedir");
command.add(String.format(QUOTED, mapCacheDirectory));
}
if (mapNameSpec != null) {
command.add("--mapname");
command.add(String.format(QUOTED, mapNameSpec));
}
if (doCrc) {
command.add("--hash");
}

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(workingDirectory.toFile());
processBuilder.command(command);
logger.info("Enumerating maps: {}", String.join(" ", processBuilder.command()));

List<String[]> mapList = new ArrayList<>();
try {
final String UNIT_SEPARATOR = Character.toString((char)0x1f);
Process process = processBuilder.start();
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
mapList.add(line.split(UNIT_SEPARATOR));
}
input.close();
}
catch (IOException e)
{
logger.error("unable to enumerate maps: {}", e.getMessage());
}

return mapList;
}

public static void generatePreview(Path gamePath, String mapName, Path mapCacheDirectory, PreviewType previewType, int maxPositions) {
String nativeDir = System.getProperty("nativeDir", "lib");
Path exe = Paths.get(nativeDir).resolve("gpgnet4ta").resolve("maptool.exe");
Path workingDirectory = exe.getParent();

String QUOTED = "\"%s\"";
List<String> command = new ArrayList<>();
command.add(String.format(QUOTED, exe.toAbsolutePath()));
command.add("--gamepath");
command.add(String.format(QUOTED, gamePath));
command.add("--mapname");
command.add(String.format(QUOTED, mapName + "$"));
command.add("--thumb");
command.add(String.format(QUOTED, mapCacheDirectory));
command.add("--featurescachedir");
command.add(String.format(QUOTED, mapCacheDirectory));
command.add("--thumbtypes");
command.add(previewType.toString().toLowerCase());
command.add("--maxpositions");
command.add(String.valueOf(maxPositions));

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.directory(workingDirectory.toFile());
processBuilder.command(command);
logger.info("Generating map preview: {}", String.join(" ", processBuilder.command()));
try {
Process process = processBuilder.start();
process.waitFor();
}
catch (IOException e)
{
logger.error("unable to generate preview: {}", e.getMessage());
}
catch (InterruptedException e)
{
logger.error("unable to generate preview: {}", e.getMessage());
}
}

}
4 changes: 2 additions & 2 deletions src/main/java/com/faforever/client/fa/OnGameFullNotifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import com.faforever.client.game.GameService;
import com.faforever.client.i18n.I18n;
import com.faforever.client.map.MapService;
import com.faforever.client.map.MapService.PreviewSize;
import com.faforever.client.map.MapService.PreviewType;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.notification.TransientNotification;
import com.faforever.client.util.ProgrammingError;
Expand Down Expand Up @@ -82,7 +82,7 @@ public void onGameFull(GameFullEvent event) {
}

notificationService.addNotification(new TransientNotification(i18n.get("game.full"), i18n.get("game.full.action"),
mapService.loadPreview(currentGame.getFeaturedMod(), currentGame.getMapFolderName(), PreviewSize.SMALL),
mapService.loadPreview(currentGame.getFeaturedMod(), currentGame.getMapName(), PreviewType.MINI, 10),
v -> platformService.focusWindow(faWindowTitle)));
}
}
Loading

0 comments on commit 56feb94

Please sign in to comment.