From fc126566affd4282affa25937e0bbf92d35fa474 Mon Sep 17 00:00:00 2001 From: sleet01 Date: Fri, 1 Sep 2023 22:42:17 -0700 Subject: [PATCH 1/3] Initial fix for ProtoMekBay/ProtoMechBay output and loading issue causing load issues with custom dropships. --- megamek/src/megamek/common/ProtomechBay.java | 8 ++++---- megamek/src/megamek/common/loaders/BLKFile.java | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/megamek/src/megamek/common/ProtomechBay.java b/megamek/src/megamek/common/ProtomechBay.java index d7e9139ff03..aa35ac12c8d 100644 --- a/megamek/src/megamek/common/ProtomechBay.java +++ b/megamek/src/megamek/common/ProtomechBay.java @@ -67,7 +67,7 @@ public boolean canLoad(Entity unit) { if (doors <= loadedThisTurn) { result = false; } - + // Return our result. return result; } @@ -96,7 +96,7 @@ public int getPersonnel(boolean clan) { @Override public String toString() { - String bayType = "ProtoMekBay"; + String bayType = "ProtoMechBay"; return this.bayString( bayType, totalSpace, @@ -104,14 +104,14 @@ public String toString() { bayNumber ); } - + public static TechAdvancement techAdvancement() { return new TechAdvancement(TECH_BASE_CLAN).setClanAdvancement(3060, 3066, 3070) .setClanApproximate(true, false, false).setTechRating(RATING_C) .setAvailability(RATING_X, RATING_X, RATING_D, RATING_D) .setStaticTechLevel(SimpleTechLevel.STANDARD); } - + @Override public TechAdvancement getTechAdvancement() { return ProtomechBay.techAdvancement(); diff --git a/megamek/src/megamek/common/loaders/BLKFile.java b/megamek/src/megamek/common/loaders/BLKFile.java index a7f3bce5811..6438c8f1f13 100644 --- a/megamek/src/megamek/common/loaders/BLKFile.java +++ b/megamek/src/megamek/common/loaders/BLKFile.java @@ -1193,6 +1193,7 @@ protected void addTransports(Entity e) throws EntityLoadingException { pbi = new ParsedBayInfo(numbers, usedBayNumbers); e.addTransporter(new Bay(pbi.getSize(), pbi.getDoors(), pbi.getBayNumber()), isPod); break; + // case "protomekbay": case "protomechbay": pbi = new ParsedBayInfo(numbers, usedBayNumbers); e.addTransporter(new ProtomechBay(pbi.getSize(), pbi.getDoors(), pbi.getBayNumber()), isPod); From c23daaa9bc63d40b7dc08ec50af61b58e1c23494 Mon Sep 17 00:00:00 2001 From: sleet01 Date: Fri, 1 Sep 2023 23:08:29 -0700 Subject: [PATCH 2/3] Revert some changes, add dual compatibility and comments --- megamek/src/megamek/common/ProtomechBay.java | 2 +- megamek/src/megamek/common/loaders/BLKFile.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/megamek/src/megamek/common/ProtomechBay.java b/megamek/src/megamek/common/ProtomechBay.java index aa35ac12c8d..a0d1059ce43 100644 --- a/megamek/src/megamek/common/ProtomechBay.java +++ b/megamek/src/megamek/common/ProtomechBay.java @@ -96,7 +96,7 @@ public int getPersonnel(boolean clan) { @Override public String toString() { - String bayType = "ProtoMechBay"; + String bayType = "ProtoMekBay"; return this.bayString( bayType, totalSpace, diff --git a/megamek/src/megamek/common/loaders/BLKFile.java b/megamek/src/megamek/common/loaders/BLKFile.java index 6438c8f1f13..fee0c2482ca 100644 --- a/megamek/src/megamek/common/loaders/BLKFile.java +++ b/megamek/src/megamek/common/loaders/BLKFile.java @@ -1193,8 +1193,10 @@ protected void addTransports(Entity e) throws EntityLoadingException { pbi = new ParsedBayInfo(numbers, usedBayNumbers); e.addTransporter(new Bay(pbi.getSize(), pbi.getDoors(), pbi.getBayNumber()), isPod); break; - // case "protomekbay": + case "protomekbay": + // Newer custom BLK handling case "protomechbay": + // Backward compatibility pbi = new ParsedBayInfo(numbers, usedBayNumbers); e.addTransporter(new ProtomechBay(pbi.getSize(), pbi.getDoors(), pbi.getBayNumber()), isPod); break; From 4b02ca8aa95f4899a53e4e498724f74165d15ed6 Mon Sep 17 00:00:00 2001 From: sleet01 Date: Sun, 3 Sep 2023 00:36:47 -0700 Subject: [PATCH 3/3] Final part of fix for #4739: add dropships as ProtoMek loaders It looks like the ProtoMek-specific loading submenu is still very rough: - logic error prevented checking if non-mechs could load Protos - even if entities with bays could load Protos, they weren't getting added to the menu. I cribbed some code from the general Load menu builder to add options other than just Mek Front or Mek Rear as ProtoMek load targets; honestly this should all get combined back into the loadMenu at some point. Testing: - Added regular ProtoMeks to a dropship with ProtoMekBays in MM: works now. - Loaded same ProtoMeks back into the dropship after landing it in a game: works fine. - Confirmed Protos with Magnetic Clamp System can also be loaded onto Meks, and unloaded during games. TODO: add unit tests to validate various ProtoMek loading/unloading options, separate from UI. --- .../client/ui/swing/lobby/LobbyMekPopup.java | 78 +++++++++++-------- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/megamek/src/megamek/client/ui/swing/lobby/LobbyMekPopup.java b/megamek/src/megamek/client/ui/swing/lobby/LobbyMekPopup.java index 9bbf745487f..58f69a91c1a 100644 --- a/megamek/src/megamek/client/ui/swing/lobby/LobbyMekPopup.java +++ b/megamek/src/megamek/client/ui/swing/lobby/LobbyMekPopup.java @@ -210,7 +210,7 @@ static ScalingPopup getPopup(List entities, List forces, ActionLi popup.add(squadronMenu(clientGui, true, listener, joinedEntities)); } - if (accessibleProtomeks) { + if (allProtomeks) { popup.add(protoMenu(clientGui, allProtomeks, listener, joinedEntities)); } @@ -326,40 +326,56 @@ private static JMenu loadMenu(ClientGUI cg, boolean enabled, ActionListener list private static JMenu protoMenu(ClientGUI cg, boolean enabled, ActionListener listener, Collection entities) { JMenu menu = new JMenu("Load ProtoMek"); - if (enabled && entities.stream().anyMatch(e -> e.hasETypeFlag(Entity.ETYPE_PROTOMECH))) { - Entity entity = entities.stream().filter(e -> e.hasETypeFlag(Entity.ETYPE_PROTOMECH)).findAny().get(); - for (Entity loader: cg.getClient().getGame().getEntitiesVector()) { - if (!loader.hasETypeFlag(Entity.ETYPE_MECH) || !loader.canLoad(entity, false)) { - continue; - } - Transporter front = null; - Transporter rear = null; - for (Transporter t : loader.getTransports()) { - if (t instanceof ProtomechClampMount) { - if (((ProtomechClampMount) t).isRear()) { - rear = t; - } else { - front = t; - } + if(!(enabled || entities.stream().allMatch(e -> e.hasETypeFlag(Entity.ETYPE_PROTOMECH)))){ + return menu; + } + + Game game = cg.getClient().getGame(); + Entity entity = entities.stream().filter(e -> e.hasETypeFlag(Entity.ETYPE_PROTOMECH)).findAny().get(); + List loaders = game.getEntitiesVector(); + + // Handle front and rear Magnetic Clamp Mounts + for (Entity loader: loaders) { + if (!loader.hasETypeFlag(Entity.ETYPE_MECH)) { + continue; + } + Transporter front = null; + Transporter rear = null; + for (Transporter t : loader.getTransports()) { + if (t instanceof ProtomechClampMount) { + if (((ProtomechClampMount) t).isRear()) { + rear = t; + } else { + front = t; } } - JMenu loaderMenu = new JMenu(loader.getShortName()); - if ((front != null) && front.canLoad(entity) - && ((entity.getWeightClass() < EntityWeightClass.WEIGHT_SUPER_HEAVY) - || (rear == null) || rear.getLoadedUnits().isEmpty())) { - loaderMenu.add(menuItem("Onto Front", LMP_LOAD + "|" + loader.getId() + ":0" + enToken(entities), enabled, listener)); - } - boolean frontUltra = (front != null) - && front.getLoadedUnits().stream() - .anyMatch(l -> l.getWeightClass() == EntityWeightClass.WEIGHT_SUPER_HEAVY); - if ((rear != null) && rear.canLoad(entity) && !frontUltra) { - loaderMenu.add(menuItem("Onto Rear", LMP_LOAD + "|" + loader.getId() + ":1" + enToken(entities), enabled, listener)); - } - if (loaderMenu.getItemCount() > 0) { - menu.add(loaderMenu); - } + } + JMenu loaderMenu = new JMenu(loader.getShortName()); + if ((front != null) && front.canLoad(entity) + && ((entity.getWeightClass() < EntityWeightClass.WEIGHT_SUPER_HEAVY) + || (rear == null) || rear.getLoadedUnits().isEmpty())) { + loaderMenu.add(menuItem("Onto Front", LMP_LOAD + "|" + loader.getId() + ":0" + enToken(entities), enabled, listener)); + } + boolean frontUltra = (front != null) + && front.getLoadedUnits().stream() + .anyMatch(l -> l.getWeightClass() == EntityWeightClass.WEIGHT_SUPER_HEAVY); + if ((rear != null) && rear.canLoad(entity) && !frontUltra) { + loaderMenu.add(menuItem("Onto Rear", LMP_LOAD + "|" + loader.getId() + ":1" + enToken(entities), enabled, listener)); + } + if (loaderMenu.getItemCount() > 0) { + menu.add(loaderMenu); } } + + // Handle all other valid loaders, such as Dropships + loaders.stream() + .filter(e -> !e.isCapitalFighter(true)) + .filter(e -> !entities.contains(e)) + .filter(e -> canLoadAll(e, entities)) + .forEach(e -> menu.add(menuItem( + "" + e.getShortNameRaw() + idString(game, e.getId()), + LMP_LOAD + "|" + e.getId() + ":-1" + enToken(entities), enabled, listener))); + menu.setEnabled(enabled && (menu.getItemCount() > 0)); return menu; }