diff --git a/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form b/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form index 1cf55c8..27c513d 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form +++ b/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form @@ -338,7 +338,7 @@ - + @@ -1784,7 +1784,9 @@ + + diff --git a/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java b/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java index c0d88e5..198d2e9 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java @@ -201,11 +201,11 @@ public class LauncherGUI implements Observer { fileChecker.addObserver(this); syncer.addObserver(this); - if (Parameters.ARMA_PATH.toStringParameter().getConfigValue() == null || Parameters.ARMA_PATH.toStringParameter().getConfigValue().isEmpty()) { + if (Parameters.ARMA_PATH.toParameter().getConfigValue() == null || ((String) Parameters.ARMA_PATH.toParameter().getConfigValue()).isEmpty()) { final Path installationPath = ArmaUtils.getInstallationPath(); if (installationPath != null) { - Parameters.ARMA_PATH.toStringParameter().save(installationPath.toAbsolutePath().toString()); - Parameters.MOD_PATH.toStringParameter().save(Paths.get( + Parameters.ARMA_PATH.toParameter().save(installationPath.toAbsolutePath().toString()); + Parameters.MOD_PATH.toParameter().save(Paths.get( installationPath.toAbsolutePath().toString(), ArmA3Launcher.config.getString("name") + " Mods" ).toAbsolutePath().toString()); techCheck(); @@ -250,7 +250,8 @@ public class LauncherGUI implements Observer { playPresetButton.setMargin(new Insets(10, 10, 10, 10)); - serverTable.setModel(new ServerTableModel()); + final ServerTableModel serverTableModel = new ServerTableModel(); + serverTable.setModel(serverTableModel); presetList.setModel(new PresetTableModel()); presetList.setCellRenderer(new PresetListRenderer()); @@ -301,11 +302,41 @@ public class LauncherGUI implements Observer { updateTreeScrolPane.getVerticalScrollBar().setUnitIncrement(16); splitView.setDividerLocation(-1); + ListSelectionModel selectionModel = serverTable.getSelectionModel(); + selectionModel.addListSelectionListener(e -> { + if (serverTable.getSelectedRow() == -1) { + playButton.setEnabled(false); + parameterText.setText(""); + return; + } + ServerTableModel m = (ServerTableModel) serverTable.getModel(); + Server server = m.getServer(serverTable.getSelectedRow()); + + parameterText.setText(ArmaUtils.getGameParameter(server.getPreset())); + techCheck(); + }); + + playButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (serverTable.getSelectedRow() == -1) { + playButton.setEnabled(false); + parameterText.setText(""); + return; + } + ServerTableModel m = (ServerTableModel) serverTable.getModel(); + Server server = m.getServer(serverTable.getSelectedRow()); + + ArmaUtils.start(server.getPreset(), server.getStartparameter().stream().toArray(String[]::new)); + } + }); + presetList.addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { PresetTableModel m = (PresetTableModel) presetList.getModel(); Object elementAt = m.getElementAt(presetList.getSelectedIndex()); Modset modset = (Modset) elementAt; + if (modset == null) return; if (modset.getType() == Modset.Type.SERVER || modset.getType() == Modset.Type.PLACEHOLDER) { renamePresetButton.setEnabled(false); @@ -315,8 +346,34 @@ public class LauncherGUI implements Observer { removePresetButtom.setEnabled(true); } clonePresetButton.setEnabled(modset.getType() != Modset.Type.PLACEHOLDER); + if (modset.getType() == Modset.Type.PLACEHOLDER) { + modList.setModel(new DefaultListModel()); + presetNotePane.setVisible(false); + presetList.clearSelection(); + } updateModList(modset); + techCheck(); + } + }); + + playPresetButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (presetList.getSelectedIndex() == -1) { + playPresetButton.setEnabled(false); + parameterText.setText(""); + return; + } + + PresetTableModel model1 = (PresetTableModel) presetList.getModel(); + if (presetList.getSelectedIndex() == -1) return; + Object elementAt = model1.getElementAt(presetList.getSelectedIndex()); + Modset selectedModset = (Modset) elementAt; + + if(selectedModset.getType() == Modset.Type.PLACEHOLDER) return; + + ArmaUtils.start(selectedModset); } }); @@ -598,10 +655,12 @@ public class LauncherGUI implements Observer { } public void techCheck() { - boolean pathSet = Parameters.ARMA_PATH.toStringParameter().getConfigValue() != null && Parameters.ARMA_PATH.toStringParameter().getConfigValue() != null; + boolean pathSet = Parameters.ARMA_PATH.toParameter().getConfigValue() != null && Parameters.ARMA_PATH.toParameter().getConfigValue() != null; + + playButton.setEnabled(false); + playPresetButton.setEnabled(false); + if (SteamTimer.arma_running) { - playButton.setEnabled(false); - playPresetButton.setEnabled(false); syncIntensiveCheckButton.setEnabled(false); syncFastCheckButton.setEnabled(false); refreshRepoButton.setEnabled(false); @@ -614,22 +673,20 @@ public class LauncherGUI implements Observer { } else { if (SteamTimer.steam_running) { if (pathSet) { - playButton.setEnabled(true); - playPresetButton.setEnabled(true); + if (serverTable.getSelectedRow() != -1) { + playButton.setEnabled(true); + playButton.setToolTipText(null); + } - playButton.setToolTipText(null); - playPresetButton.setToolTipText(null); + if (presetList.getSelectedIndex() != -1) { + playPresetButton.setEnabled(true); + playPresetButton.setToolTipText(null); + } } else { - playButton.setEnabled(false); - playPresetButton.setEnabled(false); - playButton.setToolTipText(LangUtils.getInstance().getString("path_not_set")); playPresetButton.setToolTipText(LangUtils.getInstance().getString("path_not_set")); } } else { - playButton.setEnabled(false); - playPresetButton.setEnabled(false); - playButton.setToolTipText(LangUtils.getInstance().getString("steam_not_running")); playPresetButton.setToolTipText(LangUtils.getInstance().getString("steam_not_running")); } @@ -673,7 +730,7 @@ public class LauncherGUI implements Observer { for (int i = 0; i < directories.length; i++) { try { readableDirectories[i] = URLDecoder.decode(directories[i], StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { + } catch (UnsupportedEncodingException | IllegalArgumentException e) { readableDirectories[i] = directories[i]; } } @@ -681,7 +738,7 @@ public class LauncherGUI implements Observer { ((JComboBox) settingsProfileCombo).setModel(new DefaultComboBoxModel<>(readableDirectories)); - initFolderChooser(settingsArmaPathText, settingsArmaPathBtn, Parameters.ARMA_PATH.toStringParameter(), new Callback.JFileSelectCallback() { + initFolderChooser(settingsArmaPathText, settingsArmaPathBtn, Parameters.ARMA_PATH.toParameter(), new Callback.JFileSelectCallback() { @Override public boolean allowSelection(File path) { String sPath = path.getAbsolutePath(); @@ -702,7 +759,7 @@ public class LauncherGUI implements Observer { } }); - initFolderChooser(settingsModsPathText, settingsModsPathBtn, Parameters.MOD_PATH.toStringParameter(), new Callback.JFileSelectCallback() { + initFolderChooser(settingsModsPathText, settingsModsPathBtn, Parameters.MOD_PATH.toParameter(), new Callback.JFileSelectCallback() { @Override public boolean allowSelection(File path) { String sPath = path.getAbsolutePath(); @@ -721,39 +778,39 @@ public class LauncherGUI implements Observer { // -------------------------------- COMBO BOXES -------------------------------- - initComboBox(settingsLanguageCombo, Parameters.LANGUAGE.toStringParameter()); - initComboBox(settingsBehaviorStartCombo, Parameters.BEHAVIOUR_AFTER_START.toStringParameter()); + initComboBox(settingsLanguageCombo, Parameters.LANGUAGE.toParameter()); + initComboBox(settingsBehaviorStartCombo, Parameters.BEHAVIOUR_AFTER_START.toParameter()); - initComboBox(settingsProfileCombo, Parameters.PROFILE.toStringParameter(directories)); - initComboBox(settingsExThreadsCombo, Parameters.EXTRA_THREADS.toStringParameter()); - initComboBox(settingsMallocCombo, Parameters.MALLOC.toStringParameter()); + initComboBox(settingsProfileCombo, Parameters.PROFILE.toParameter(readableDirectories)); + initComboBox(settingsExThreadsCombo, Parameters.EXTRA_THREADS.toParameter()); + initComboBox(settingsMallocCombo, Parameters.MALLOC.toParameter()); // -------------------------------- CHECK BOXES -------------------------------- - initCheckBox(settingsShowParameterBox, Parameters.SHOW_START_PARAMETER.toBooolParameter()); + initCheckBox(settingsShowParameterBox, Parameters.SHOW_START_PARAMETER.toParameter()); settingsShowParameterBox.addItemListener(e -> parameterText.setVisible(e.getStateChange() == ItemEvent.SELECTED)); - initCheckBox(settingsCheckModsBox, Parameters.CHECK_MODSET.toBooolParameter()); + initCheckBox(settingsCheckModsBox, Parameters.CHECK_MODSET.toParameter()); - initCheckBox(settingsUseWorkshopBox, Parameters.USE_WORKSHOP.toBooolParameter()); + initCheckBox(settingsUseWorkshopBox, Parameters.USE_WORKSHOP.toParameter()); settingsUseWorkshopBox.addItemListener(e -> { if (e.getStateChange() == ItemEvent.SELECTED) { SwingUtilities.invokeLater(() -> warnBox(LangUtils.getInstance().getString("warning_workshop"), LangUtils.getInstance().getString("warning"))); } }); - initCheckBox(settingsUseSixtyFourBitBox, Parameters.USE_64_BIT_CLIENT.toBooolParameter()); - initCheckBox(settingsNoSplashBox, Parameters.NO_SPLASH.toBooolParameter()); - initCheckBox(settingsSkipIntroBox, Parameters.SKIP_INTRO.toBooolParameter()); - initCheckBox(settingsNoCBBox, Parameters.NO_CB.toBooolParameter()); - initCheckBox(settingsNoLogsBox, Parameters.NO_LOGS.toBooolParameter()); - initCheckBox(settingsEnableHTBox, Parameters.ENABLE_HT.toBooolParameter()); - initCheckBox(settingsHugeoagesBox, Parameters.HUGEPAGES.toBooolParameter()); - initCheckBox(settingsNoPauseBox, Parameters.NO_PAUSE.toBooolParameter()); - initCheckBox(settingsShowScriptErrorsBox, Parameters.SHOW_SCRIPT_ERRORS.toBooolParameter()); - initCheckBox(settingsFilePatchingBox, Parameters.FILE_PATCHING.toBooolParameter()); - initCheckBox(settingsCrashDiagBox, Parameters.CRASH_DIAG.toBooolParameter()); - initCheckBox(settingsWindowBox, Parameters.WINDOW.toBooolParameter()); + initCheckBox(settingsUseSixtyFourBitBox, Parameters.USE_64_BIT_CLIENT.toParameter()); + initCheckBox(settingsNoSplashBox, Parameters.NO_SPLASH.toParameter()); + initCheckBox(settingsSkipIntroBox, Parameters.SKIP_INTRO.toParameter()); + initCheckBox(settingsNoCBBox, Parameters.NO_CB.toParameter()); + initCheckBox(settingsNoLogsBox, Parameters.NO_LOGS.toParameter()); + initCheckBox(settingsEnableHTBox, Parameters.ENABLE_HT.toParameter()); + initCheckBox(settingsHugeoagesBox, Parameters.HUGEPAGES.toParameter()); + initCheckBox(settingsNoPauseBox, Parameters.NO_PAUSE.toParameter()); + initCheckBox(settingsShowScriptErrorsBox, Parameters.SHOW_SCRIPT_ERRORS.toParameter()); + initCheckBox(settingsFilePatchingBox, Parameters.FILE_PATCHING.toParameter()); + initCheckBox(settingsCrashDiagBox, Parameters.CRASH_DIAG.toParameter()); + initCheckBox(settingsWindowBox, Parameters.WINDOW.toParameter()); // -------------------------------- SPINNER -------------------------------- @@ -761,33 +818,33 @@ public class LauncherGUI implements Observer { OperatingSystemMXBean mxbean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); int memorySize = (int) (mxbean.getTotalPhysicalMemorySize() / 1024); - initSpinner(settingsMaxMemSpinner, Parameters.MAX_MEM.toStringParameter(), -1, memorySize); - initSpinner(settingsMaxVRamSpinner, Parameters.MAX_VRAM.toStringParameter(), -1, 99999); - initSpinner(settingsCpuCountSpinner, Parameters.CPU_COUNT.toStringParameter(), 0, Runtime.getRuntime().availableProcessors()); - initSpinner(settingsPosXSpinner, Parameters.POS_X.toStringParameter(), -1, 99999); - initSpinner(settingsPosYSpinner, Parameters.POS_Y.toStringParameter(), -1, 99999); + initSpinner(settingsMaxMemSpinner, Parameters.MAX_MEM.toParameter(), -1, memorySize); + initSpinner(settingsMaxVRamSpinner, Parameters.MAX_VRAM.toParameter(), -1, 99999); + initSpinner(settingsCpuCountSpinner, Parameters.CPU_COUNT.toParameter(), 0, Runtime.getRuntime().availableProcessors()); + initSpinner(settingsPosXSpinner, Parameters.POS_X.toParameter(), -1, 99999); + initSpinner(settingsPosYSpinner, Parameters.POS_Y.toParameter(), -1, 99999); // -------------------------------- -------------------------------- -------------------------------- } - private void initCheckBox(JCheckBox cb, Parameter paraObj) { - cb.setSelected(paraObj.getValue()); + private void initCheckBox(JCheckBox cb, Parameter paraObj) { + cb.setSelected((Boolean) paraObj.getValue()); cb.addItemListener(new SettingsHandler.CheckBoxListener(paraObj)); } - private void initComboBox(JComboBox cb, Parameter paraObj) { + private void initComboBox(JComboBox cb, Parameter paraObj) { cb.setSelectedIndex(paraObj.getIndex()); if (cb.getItemListeners().length == 1) cb.addItemListener(new SettingsHandler.ComboBoxListener(paraObj)); } - private void initFolderChooser(JTextField showText, JButton actionButton, Parameter paraObj, Callback.JFileSelectCallback check) { - showText.setText(paraObj.getValue()); + private void initFolderChooser(JTextField showText, JButton actionButton, Parameter paraObj, Callback.JFileSelectCallback check) { + showText.setText((String) paraObj.getValue()); if (actionButton.getActionListeners().length == 0) actionButton.addActionListener(new SettingsHandler.Fileistener(mainPanel, paraObj, check)); } - public void initSpinner(JSpinner spinner, Parameter paraObj, int min, int max) { - SpinnerNumberModel RAMModel = new SpinnerNumberModel(Integer.parseInt(paraObj.getValue()), min, max, 1); + public void initSpinner(JSpinner spinner, Parameter paraObj, int min, int max) { + SpinnerNumberModel RAMModel = new SpinnerNumberModel(Integer.parseInt((String) paraObj.getValue()), min, max, 1); spinner.setModel(RAMModel); JComponent comp = spinner.getEditor(); JFormattedTextField field = (JFormattedTextField) comp.getComponent(0); @@ -844,6 +901,8 @@ public class LauncherGUI implements Observer { if (modset.getType() == Modset.Type.PLACEHOLDER) return; int[] select = new int[modset.getMods().size()]; + parameterText.setText(ArmaUtils.getGameParameter(modset)); + AtomicInteger selectCounter = new AtomicInteger(0); RepositoryManger.MOD_LIST.stream() .filter((am) -> am instanceof Mod) @@ -1061,9 +1120,9 @@ public class LauncherGUI implements Observer { refreshRepoButton.setEnabled(true); updateRepoTree(); - final Parameter checkModsetParameter = Parameters.CHECK_MODSET.toBooolParameter(); - if(checkModsetParameter.getValue() != null && checkModsetParameter.getValue()) { - if(!fileChecker.isChecked()) { + final Parameter checkModsetParameter = Parameters.CHECK_MODSET.toParameter(); + if (checkModsetParameter.getValue() != null && (boolean) checkModsetParameter.getValue()) { + if (!fileChecker.isChecked()) { SwingUtilities.invokeLater(() -> fileCheck(false)); Logger.getLogger(getClass().getName()).log(Level.INFO, "Started file check on launch"); } @@ -1130,8 +1189,8 @@ public class LauncherGUI implements Observer { lastSynclist = null; } else if (s.equals("syncStopped")) { - final Parameter workshopParameter = Parameters.USE_WORKSHOP.toBooolParameter(); - new Thread(() -> fileChecker.check(!(workshopParameter.getValue() != null && workshopParameter.getValue()))).start(); + final Parameter workshopParameter = Parameters.USE_WORKSHOP.toParameter(); + new Thread(() -> fileChecker.check(!(workshopParameter.getValue() != null && (boolean) workshopParameter.getValue()))).start(); SwingUtilities.invokeLater(() -> { syncDownloadButton.setEnabled(false); syncDownloadAbortButton.setEnabled(false); @@ -1142,8 +1201,8 @@ public class LauncherGUI implements Observer { TaskBarUtils.getInstance().off(); }); } else if (s.equals("syncComplete")) { - final Parameter workshopParameter = Parameters.USE_WORKSHOP.toBooolParameter(); - new Thread(() -> fileChecker.check(!(workshopParameter.getValue() != null && workshopParameter.getValue()))).start(); + final Parameter workshopParameter = Parameters.USE_WORKSHOP.toParameter(); + new Thread(() -> fileChecker.check(!(workshopParameter.getValue() != null && (boolean) workshopParameter.getValue()))).start(); SwingUtilities.invokeLater(() -> { syncDownloadButton.setEnabled(false); syncDownloadAbortButton.setEnabled(false); @@ -1234,6 +1293,9 @@ public class LauncherGUI implements Observer { switch (tab) { case PLAY: playPanelButton.setBackground(focusBackgroundColor); + + parameterText.setText(""); + serverTable.clearSelection(); break; case UPDATE: @@ -1247,6 +1309,14 @@ public class LauncherGUI implements Observer { case PRESET: presetPanelButton.setBackground(focusBackgroundColor); + + presetList.clearSelection(); + modList.setModel(new DefaultListModel()); + presetNotePane.setVisible(false); + + clonePresetButton.setEnabled(false); + renamePresetButton.setEnabled(false); + removePresetButtom.setEnabled(false); break; case SETTING: @@ -1276,6 +1346,7 @@ public class LauncherGUI implements Observer { } tabbedPane1.setSelectedIndex(tab.getIndex()); + techCheck(); } { @@ -1462,7 +1533,7 @@ public class LauncherGUI implements Observer { panel6.add(playButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); parameterText = new JTextField(); parameterText.setEditable(false); - parameterText.setText("-noInit -noLogs"); + parameterText.setText(""); panel6.add(parameterText, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); updateTab = new JPanel(); updateTab.setLayout(new GridLayoutManager(2, 2, new Insets(0, 0, 5, 0), -1, -1)); @@ -2042,7 +2113,9 @@ public class LauncherGUI implements Observer { final DefaultComboBoxModel defaultComboBoxModel2 = new DefaultComboBoxModel(); defaultComboBoxModel2.addElement(""); defaultComboBoxModel2.addElement("tbb4malloc_bi"); + defaultComboBoxModel2.addElement("tbb4malloc_bi_x64"); defaultComboBoxModel2.addElement("jemalloc_bi"); + defaultComboBoxModel2.addElement("jemalloc_bi_x64"); defaultComboBoxModel2.addElement("system"); settingsMallocCombo.setModel(defaultComboBoxModel2); panel35.add(settingsMallocCombo, new GridConstraints(23, 2, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); diff --git a/gui/src/main/java/de/mc8051/arma3launcher/Parameter.java b/gui/src/main/java/de/mc8051/arma3launcher/Parameter.java index 43f60a9..ff4465e 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/Parameter.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/Parameter.java @@ -11,23 +11,23 @@ import java.util.logging.Logger; /** * Created by gurkengewuerz.de on 24.03.2020. */ -public class Parameter { +public class Parameter { private String name; private ParameterType pType; - private Class persistentClass; + private Class persistentClass; private String[] values = null; private String startParameter = ""; - public Parameter(String name, ParameterType pType, Class persistentClass) { + public Parameter(String name, ParameterType pType, Class persistentClass) { this(name, pType, persistentClass, null, ""); } - public Parameter(String name, ParameterType pType, Class persistentClass, String startParameter) { + public Parameter(String name, ParameterType pType, Class persistentClass, String startParameter) { this(name, pType, persistentClass, null, startParameter); } - public Parameter(String name, ParameterType pType, Class persistentClass, String[] values, String startParameter) { + public Parameter(String name, ParameterType pType, Class persistentClass, String[] values, String startParameter) { this.name = name; this.pType = pType; this.persistentClass = persistentClass; @@ -45,8 +45,8 @@ public class Parameter { return ""; } - public void save(T data) { - T def = getDefault(); + public void save(Object data) { + Object def = getDefault(); if (data == def || (persistentClass.getTypeName().equals("java.lang.String") && String.valueOf(data).equals(String.valueOf(def)))) { // remove entry from user config @@ -75,7 +75,7 @@ public class Parameter { public void save(int index) { if(values == null) throw new IllegalAccessError("call of save(int index) is only allowed for ComboBoxes"); if(index > values.length - 1) throw new IndexOutOfBoundsException("index " + index + " is out of bound. Max: " + (values.length -1)); - save((T) values[index]); + save(values[index]); } public String getParameter() { @@ -83,7 +83,7 @@ public class Parameter { return startParameter; } - public T getConfigValue() { + public Object getConfigValue() { // Get User Value else Default else null Ini.Section section = ArmA3Launcher.user_config.get(getUserConfigSectionName()); if (section != null) { @@ -91,16 +91,16 @@ public class Parameter { String val = section.get(name); if (persistentClass.getTypeName().equals("java.lang.Boolean")) { - return (T) (Boolean) Boolean.valueOf(val.toLowerCase()); - } else return (T) val; + return Boolean.valueOf(val.toLowerCase()); + } else return val; } } return null; } - public T getValue() { - final T configValue = getConfigValue(); + public Object getValue() { + final Object configValue = getConfigValue(); if(configValue != null) return configValue; return getDefault(); } @@ -114,11 +114,11 @@ public class Parameter { return -1; } - public T getDefault() { + public Object getDefault() { if (persistentClass.getTypeName().equals("java.lang.Boolean")) { - return (T) (Boolean) ArmA3Launcher.config.getBoolean( getUserConfigSectionName() + "." + name); + return ArmA3Launcher.config.getBoolean( getUserConfigSectionName() + "." + name); } else if (persistentClass.getTypeName().equals("java.lang.String")) - return (T) ArmA3Launcher.config.getString(getUserConfigSectionName()+ "." + name); + return ArmA3Launcher.config.getString(getUserConfigSectionName()+ "." + name); else return null; } @@ -126,7 +126,7 @@ public class Parameter { return startParameter; } - enum ParameterType { + public enum ParameterType { ARMA, CLIENT } diff --git a/gui/src/main/java/de/mc8051/arma3launcher/Parameters.java b/gui/src/main/java/de/mc8051/arma3launcher/Parameters.java index e3fe99f..20addab 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/Parameters.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/Parameters.java @@ -5,68 +5,70 @@ package de.mc8051.arma3launcher; */ public enum Parameters { - LANGUAGE("language", Parameter.ParameterType.CLIENT, "", new String[]{"system", "en_US", "de_DE"}), - BEHAVIOUR_AFTER_START("behaviourAfterStart", Parameter.ParameterType.CLIENT, "", new String[]{"nothing", "minimize", "exit"}), - SHOW_START_PARAMETER("ShowStartParameter", Parameter.ParameterType.CLIENT), - CHECK_MODSET("CheckModset", Parameter.ParameterType.CLIENT), - USE_WORKSHOP("UseWorkshop", Parameter.ParameterType.CLIENT), - ARMA_PATH("armaPath", Parameter.ParameterType.CLIENT), - MOD_PATH("modPath", Parameter.ParameterType.CLIENT), + LANGUAGE("language", Parameter.ParameterType.CLIENT, String.class, "", new String[]{"system", "en_US", "de_DE"}), + BEHAVIOUR_AFTER_START("behaviourAfterStart", Parameter.ParameterType.CLIENT, String.class, "", new String[]{"nothing", "minimize", "exit"}), + SHOW_START_PARAMETER("ShowStartParameter", Parameter.ParameterType.CLIENT, Boolean.class), + CHECK_MODSET("CheckModset", Parameter.ParameterType.CLIENT, Boolean.class), + USE_WORKSHOP("UseWorkshop", Parameter.ParameterType.CLIENT, Boolean.class), + ARMA_PATH("armaPath", Parameter.ParameterType.CLIENT, String.class), + MOD_PATH("modPath", Parameter.ParameterType.CLIENT, String.class), - PROFILE("Profile", Parameter.ParameterType.ARMA, "name"), - USE_64_BIT_CLIENT("Use64BitClient", Parameter.ParameterType.ARMA, "Use64BitClient"), - NO_SPLASH("NoSplash", Parameter.ParameterType.ARMA, "noSplash"), - SKIP_INTRO("SkipIntro", Parameter.ParameterType.ARMA, "skipIntro"), - WORLD("World", Parameter.ParameterType.ARMA, "world"), - MAX_MEM("MaxMem", Parameter.ParameterType.ARMA, "maxMem"), - MAX_VRAM("MaxVRAM", Parameter.ParameterType.ARMA, "maxVRAM"), - NO_CB("NoCB", Parameter.ParameterType.ARMA, "noCB"), - CPU_COUNT("CpuCount", Parameter.ParameterType.ARMA, "cpuCount"), - EXTRA_THREADS("ExThreads", Parameter.ParameterType.ARMA, "exThreads", new String[]{"", "3", "7"}), - MALLOC("Malloc", Parameter.ParameterType.ARMA, "malloc", new String[]{"", "tbb4malloc_bi", "jemalloc_bi", "system"}), - NO_LOGS("NoLogs", Parameter.ParameterType.ARMA, "noLogs"), - ENABLE_HT("EnableHT", Parameter.ParameterType.ARMA, "enableHT"), - HUGEPAGES("Hugepages", Parameter.ParameterType.ARMA, "hugepages"), - NO_PAUSE("NoPause", Parameter.ParameterType.ARMA, "noPause"), - SHOW_SCRIPT_ERRORS("ShowScriptErrors", Parameter.ParameterType.ARMA, "showScriptErrors"), - FILE_PATCHING("FilePatching", Parameter.ParameterType.ARMA, "filePatching"), - INIT("Init", Parameter.ParameterType.ARMA, "init"), - BETA("Beta", Parameter.ParameterType.ARMA, "beta"), - CRASH_DIAG("CrashDiag", Parameter.ParameterType.ARMA, "crashDiag"), - WINDOW("Window", Parameter.ParameterType.ARMA, "window"), - POS_X("PosX", Parameter.ParameterType.ARMA, "posX"), - POS_Y("PosY", Parameter.ParameterType.ARMA, "posY"); + PROFILE("Profile", Parameter.ParameterType.ARMA, String.class, "name"), + USE_64_BIT_CLIENT("Use64BitClient", Parameter.ParameterType.ARMA, Boolean.class), + NO_SPLASH("NoSplash", Parameter.ParameterType.ARMA, Boolean.class, "noSplash"), + SKIP_INTRO("SkipIntro", Parameter.ParameterType.ARMA, Boolean.class, "skipIntro"), + WORLD("World", Parameter.ParameterType.ARMA, String.class, "world"), + MAX_MEM("MaxMem", Parameter.ParameterType.ARMA, String.class, "maxMem"), + MAX_VRAM("MaxVRAM", Parameter.ParameterType.ARMA, String.class, "maxVRAM"), + NO_CB("NoCB", Parameter.ParameterType.ARMA, Boolean.class, "noCB"), + CPU_COUNT("CpuCount", Parameter.ParameterType.ARMA, String.class, "cpuCount"), + EXTRA_THREADS("ExThreads", Parameter.ParameterType.ARMA, String.class, "exThreads", new String[]{"", "3", "7"}), + MALLOC("Malloc", Parameter.ParameterType.ARMA, String.class, "malloc", new String[]{"", "tbb4malloc_bi", "tbb4malloc_bi_x64", "jemalloc_bi", "jemalloc_bi_x64", "system"}), + NO_LOGS("NoLogs", Parameter.ParameterType.ARMA, Boolean.class, "noLogs"), + ENABLE_HT("EnableHT", Parameter.ParameterType.ARMA, Boolean.class, "enableHT"), + HUGEPAGES("Hugepages", Parameter.ParameterType.ARMA, Boolean.class, "hugepages"), + NO_PAUSE("NoPause", Parameter.ParameterType.ARMA, Boolean.class, "noPause"), + SHOW_SCRIPT_ERRORS("ShowScriptErrors", Parameter.ParameterType.ARMA, Boolean.class, "showScriptErrors"), + FILE_PATCHING("FilePatching", Parameter.ParameterType.ARMA, Boolean.class, "filePatching"), + INIT("Init", Parameter.ParameterType.ARMA, String.class, "init"), + BETA("Beta", Parameter.ParameterType.ARMA, String.class, "beta"), + CRASH_DIAG("CrashDiag", Parameter.ParameterType.ARMA, Boolean.class, "crashDiag"), + WINDOW("Window", Parameter.ParameterType.ARMA, Boolean.class, "window"), + POS_X("PosX", Parameter.ParameterType.ARMA, String.class, "posX"), + POS_Y("PosY", Parameter.ParameterType.ARMA, String.class, "posY"); private String name; private Parameter.ParameterType type; private String[] values; private String startParameter; + private Class clazz; - Parameters(String name, Parameter.ParameterType type) { - this(name, type, ""); + Parameters(String name, Parameter.ParameterType type, Class clazz) { + this(name, type, clazz, ""); } - Parameters(String name, Parameter.ParameterType type, String startParameter) { - this(name, type, startParameter, null); + Parameters(String name, Parameter.ParameterType type, Class clazz, String startParameter) { + this(name, type, clazz, startParameter, null); } - Parameters(String name, Parameter.ParameterType type, String startParameter, String[] values) { + Parameters(String name, Parameter.ParameterType type, Class clazz, String startParameter, String[] values) { this.name = name; this.type = type; this.startParameter = startParameter; - this. values = values; + this.values = values; + this.clazz = clazz; } - public Parameter toStringParameter() { - return new Parameter(name, type, String.class, values, startParameter); + public Parameter toParameter() { + return new Parameter(name, type, clazz, values, startParameter); } - public Parameter toStringParameter(String... values) { - return new Parameter(name, type, String.class, values, startParameter); + public Parameter toParameter(String... values) { + return new Parameter(name, type, clazz, values, startParameter); } - public Parameter toBooolParameter() { - return new Parameter<>(name, type, Boolean.class); + public Class getClazz() { + return clazz; } public String getName() { diff --git a/gui/src/main/java/de/mc8051/arma3launcher/SettingsHandler.java b/gui/src/main/java/de/mc8051/arma3launcher/SettingsHandler.java index a6201b5..2cb74b4 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/SettingsHandler.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/SettingsHandler.java @@ -18,9 +18,9 @@ import java.io.File; public class SettingsHandler { public static class CheckBoxListener implements ItemListener { - private Parameter parameter; + private Parameter parameter; - public CheckBoxListener(Parameter parameter) { + public CheckBoxListener(Parameter parameter) { this.parameter = parameter; } @@ -32,9 +32,9 @@ public class SettingsHandler { public static class ComboBoxListener implements ItemListener { - private Parameter parameter; + private Parameter parameter; - public ComboBoxListener(Parameter parameter) { + public ComboBoxListener(Parameter parameter) { this.parameter = parameter; } @@ -50,10 +50,10 @@ public class SettingsHandler { public static class Fileistener implements ActionListener { private JPanel parent; - private Parameter parameter; + private Parameter parameter; private Callback.JFileSelectCallback check; - public Fileistener(JPanel parent, Parameter parameter, Callback.JFileSelectCallback check) { + public Fileistener(JPanel parent, Parameter parameter, Callback.JFileSelectCallback check) { this.parent = parent; this.parameter = parameter; this.check = check; @@ -82,9 +82,9 @@ public class SettingsHandler { public static class SpinnerListener implements ChangeListener { private static long lastChange = -1; - private Parameter parameter; + private Parameter parameter; - public SpinnerListener(Parameter parameter) { + public SpinnerListener(Parameter parameter) { this.parameter = parameter; } diff --git a/gui/src/main/java/de/mc8051/arma3launcher/model/PresetTableModel.java b/gui/src/main/java/de/mc8051/arma3launcher/model/PresetTableModel.java index 7732fb9..d8faaf1 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/model/PresetTableModel.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/model/PresetTableModel.java @@ -29,6 +29,7 @@ public class PresetTableModel extends AbstractListModel { @Override public Object getElementAt(int index) { + if(index == -1) return null; return data.get(index); } } diff --git a/gui/src/main/java/de/mc8051/arma3launcher/model/ServerTableModel.java b/gui/src/main/java/de/mc8051/arma3launcher/model/ServerTableModel.java index 6f1dbb9..54d4878 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/model/ServerTableModel.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/model/ServerTableModel.java @@ -39,6 +39,10 @@ public class ServerTableModel extends AbstractTableModel { return columnNames.length; } + public Server getServer(int row) { + return data.get(row); + } + @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) return data.get(rowIndex).getName(); diff --git a/gui/src/main/java/de/mc8051/arma3launcher/objects/Modset.java b/gui/src/main/java/de/mc8051/arma3launcher/objects/Modset.java index b1b28de..a74b771 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/objects/Modset.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/objects/Modset.java @@ -1,12 +1,16 @@ package de.mc8051.arma3launcher.objects; import de.mc8051.arma3launcher.ArmA3Launcher; +import de.mc8051.arma3launcher.Parameter; +import de.mc8051.arma3launcher.Parameters; import org.ini4j.Ini; import org.json.JSONArray; import org.json.JSONObject; +import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.logging.Level; @@ -108,8 +112,10 @@ public class Modset implements Comparable { return type; } - public void play() { - // TODO: Implement play with this Modset + public List getStartParamter() { + return mods.stream() + .map(m -> new File((String) Parameters.MOD_PATH.toParameter().getValue(), m.getName()).getAbsolutePath()) + .collect(Collectors.toList()); } public Modset clone(String newName, Type newType) { diff --git a/gui/src/main/java/de/mc8051/arma3launcher/objects/Server.java b/gui/src/main/java/de/mc8051/arma3launcher/objects/Server.java index 6c6f9a7..580b313 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/objects/Server.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/objects/Server.java @@ -2,7 +2,9 @@ package de.mc8051.arma3launcher.objects; import org.json.JSONObject; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; /** * Created by gurkengewuerz.de on 25.03.2020. @@ -28,13 +30,13 @@ public class Server { } public Server(JSONObject o) { - if(!o.has("name") || !o.has("password") || !o.has("ipaddress") || !o.has("port") || !o.has("preset")) return; + if (!o.has("name") || !o.has("password") || !o.has("ipaddress") || !o.has("port") || !o.has("preset")) return; name = o.getString("name"); password = o.getString("password"); ip = o.getString("ipaddress"); port = o.getInt("port"); - if(!Modset.MODSET_LIST.containsKey(o.getString("preset"))) return; + if (!Modset.MODSET_LIST.containsKey(o.getString("preset"))) return; preset = Modset.MODSET_LIST.get(o.getString("preset")); SERVER_LIST.put(name, this); @@ -59,4 +61,13 @@ public class Server { public Modset getPreset() { return preset; } + + public ArrayList getStartparameter() { + ArrayList list = new ArrayList<>(); + list.add("-connect=" + ip); + list.add("-port=" + port); + if (password.isEmpty()) + list.add("-password=" + ip); + return list; + } } diff --git a/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/Syncer.java b/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/Syncer.java index 6bbc0e6..bf0bf1d 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/Syncer.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/Syncer.java @@ -98,8 +98,8 @@ public class Syncer implements Observable, SyncListener { TaskBarUtils.getInstance().normal(); }); - final Parameter workshopParameter = Parameters.USE_WORKSHOP.toBooolParameter(); - if(workshopParameter.getValue() != null && workshopParameter.getValue()) workshopFiles = WorkshopUtil.workshopFiles(); + final Parameter workshopParameter = Parameters.USE_WORKSHOP.toParameter(); + if(workshopParameter.getValue() != null && (Boolean) workshopParameter.getValue()) workshopFiles = WorkshopUtil.workshopFiles(); boolean lastPause = false; while (running) { diff --git a/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/WorkshopUtil.java b/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/WorkshopUtil.java index c4a6a56..4aa5f6e 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/WorkshopUtil.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/repo/sync/WorkshopUtil.java @@ -18,7 +18,7 @@ public class WorkshopUtil { public static Map workshopFiles() { Map fileMap = new HashMap<>(); - final String armaPath = Parameters.ARMA_PATH.toStringParameter().getValue(); + final String armaPath = (String) Parameters.ARMA_PATH.toParameter().getValue(); if(armaPath == null) return fileMap; final Path workshopPath = Paths.get(armaPath, "!Workshop"); diff --git a/gui/src/main/java/de/mc8051/arma3launcher/utils/ArmaUtils.java b/gui/src/main/java/de/mc8051/arma3launcher/utils/ArmaUtils.java index 195502e..8ae53cf 100644 --- a/gui/src/main/java/de/mc8051/arma3launcher/utils/ArmaUtils.java +++ b/gui/src/main/java/de/mc8051/arma3launcher/utils/ArmaUtils.java @@ -1,5 +1,8 @@ package de.mc8051.arma3launcher.utils; +import de.mc8051.arma3launcher.Parameter; +import de.mc8051.arma3launcher.Parameters; +import de.mc8051.arma3launcher.objects.Modset; import de.ralleytn.simple.registry.Key; import de.ralleytn.simple.registry.Registry; @@ -9,8 +12,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; /** * Created by gurkengewuerz.de on 30.03.2020. @@ -31,7 +36,7 @@ public class ArmaUtils { if (regKey == null) return null; final Path main = Paths.get(regKey.getValueByName("main").getRawValue()); - if(!checkArmaPath(main)) return null; + if (!checkArmaPath(main)) return null; return main; } @@ -54,4 +59,56 @@ public class ArmaUtils { } return false; } + + public static String getGameParameter(Modset modset) { + StringBuilder sb = new StringBuilder(); + + List parameters = Arrays.stream(Parameters.values()) + .filter(p -> p.getType() == Parameter.ParameterType.ARMA) + .filter(p -> !p.getStartParameter().isEmpty()) + .filter(p -> { + if (p.getClazz() == Boolean.class) { + boolean b = (boolean) p.toParameter().getValue(); + return b; + } + String paraVal = (String) p.toParameter().getValue(); + return !(paraVal == null || paraVal.isEmpty() || paraVal.equals("-1") || paraVal.equals("0")); + }) + .map(parameter -> { + final Class clazz = parameter.getClazz(); + if (clazz == Boolean.class) { + return "-" + parameter.getStartParameter(); + } + return "\"-" + parameter.getStartParameter() + "=" + parameter.toParameter().getValue() + "\""; + }) + .collect(Collectors.toList()); + sb.append(String.join(" ", parameters)).append(" "); + + final List modParameter = modset.getStartParamter(); + if (!modParameter.isEmpty()) + sb.append("\"-mod=").append(String.join(";", modParameter)).append("\""); + + return sb.toString(); + } + + public static void start(Modset modset) { + start(modset, new String[]{}); + } + + public static void start(Modset modset, String... additionalParams) { + final Parameter armaPathParameter = Parameters.ARMA_PATH.toParameter(); + File arma3battleye = new File((String) armaPathParameter.getValue(), "arma3battleye.exe"); + final Parameter use64Bit = Parameters.USE_64_BIT_CLIENT.toParameter(); + + String gameParameters = getGameParameter(modset); + String additionalParameters = String.join(" ", additionalParams); + String battleEye = "\"" + arma3battleye.getAbsolutePath() + "\" 2 1 1 -exe " + ((Boolean) use64Bit.getValue() ? "arma3_x64.exe" : "arma3.exe"); + String command = battleEye + " " + gameParameters + " " + additionalParameters; + Logger.getLogger(ArmaUtils.class.getName()).log(Level.INFO, command); + try { + Runtime.getRuntime().exec(command); + } catch (IOException e) { + Logger.getLogger(ArmaUtils.class.getName()).log(Level.INFO, "Starting failed!", e); + } + } }