diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java index 115c8eb..da7b629 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java @@ -183,4 +183,7 @@ public class PacketInfoManager { hPacket.appendBoolean(packetInfo.getDestination() == HMessage.Direction.TOSERVER); } } + + + public static PacketInfoManager EMPTY = new PacketInfoManager(new ArrayList<>()); } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java index 30e9e13..8a197f2 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java @@ -3,8 +3,12 @@ package gearth.services.internal_extensions.blockreplacepackets; import gearth.Main; import gearth.extensions.ExtensionForm; import gearth.extensions.ExtensionInfo; +import gearth.extensions.OnConnectionListener; +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; import gearth.services.internal_extensions.blockreplacepackets.rules.BlockReplaceRule; import gearth.services.internal_extensions.blockreplacepackets.rules.RuleFactory; import gearth.ui.GEarthController; @@ -49,6 +53,8 @@ public class BlockAndReplacePackets extends ExtensionForm { List rules = new ArrayList<>(); + private PacketInfoManager packetInfoManager = PacketInfoManager.EMPTY; + // public static void main(String[] args) { // runExtensionForm(args, BlockAndReplacePackets.class); // } @@ -71,6 +77,26 @@ public class BlockAndReplacePackets extends ExtensionForm { } + private String getVal() { + String val = txt_value.getText(); + String type = cmb_type.getSelectionModel().getSelectedItem(); + String side = cmb_side.getSelectionModel().getSelectedItem(); + + if (type.endsWith("packet")) { + HMessage.Direction dir = side.equals("Outgoing") ? HMessage.Direction.TOSERVER : HMessage.Direction.TOCLIENT; + PacketInfo fromName = packetInfoManager.getPacketInfoFromName(dir, val); + PacketInfo fromHash = packetInfoManager.getPacketInfoFromHash(dir, val); + if (fromName != null) { + val = fromName.getHeaderId() +""; + } + else if (fromHash != null) { + val = fromHash.getHeaderId() +""; + } + } + + return val; + } + private void refreshOptions() { txt_replacement.setDisable(cmb_type.getSelectionModel().getSelectedItem().startsWith("Block")); if (cmb_side.getItems().size() == 2 && !cmb_type.getSelectionModel().getSelectedItem().endsWith("packet")) { @@ -84,7 +110,7 @@ public class BlockAndReplacePackets extends ExtensionForm { } boolean isValid = false; - String val = txt_value.getText(); + String val = getVal(); String repl = txt_replacement.getText(); String type = cmb_type.getSelectionModel().getSelectedItem(); String side = cmb_side.getSelectionModel().getSelectedItem(); @@ -155,7 +181,7 @@ public class BlockAndReplacePackets extends ExtensionForm { if (val.equals("")) { if (spl[1].equals("packet")) { - txt_value.setPromptText("Enter the headerID"); + txt_value.setPromptText("Enter headerID/name"); } else if (spl[1].equals("integer")) { txt_value.setPromptText("Enter an integer"); @@ -186,6 +212,10 @@ public class BlockAndReplacePackets extends ExtensionForm { intercept(HMessage.Direction.TOSERVER, messageListener); intercept(HMessage.Direction.TOCLIENT, messageListener); + + onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> { + this.packetInfoManager = packetInfoManager; + }); } @Override @@ -208,7 +238,8 @@ public class BlockAndReplacePackets extends ExtensionForm { } public void click_btnAddRule(ActionEvent actionEvent) { - BlockReplaceRule rule = RuleFactory.getRule(cmb_type.getSelectionModel().getSelectedItem(), cmb_side.getSelectionModel().getSelectedItem(), txt_value.getText(), txt_replacement.getText()); + BlockReplaceRule rule = RuleFactory.getRule(cmb_type.getSelectionModel().getSelectedItem(), + cmb_side.getSelectionModel().getSelectedItem(), getVal(), txt_replacement.getText(), packetInfoManager); rules.add(rule); rule.onDelete(observable -> rules.remove(rule)); new RuleContainer(rule, vbox); diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java index dc59f63..07171f3 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java @@ -1,5 +1,7 @@ package gearth.services.internal_extensions.blockreplacepackets.rules; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; import gearth.protocol.HPacket; /** @@ -7,7 +9,7 @@ import gearth.protocol.HPacket; */ public class RuleFactory { - public static BlockReplaceRule getRule(String type, String side, String value, String replacement) { + public static BlockReplaceRule getRule(String type, String side, String value, String replacement, PacketInfoManager packetInfoManager) { BlockReplaceRule.Option rOption = BlockReplaceRule.Option.valueOf(type.split(" ")[0].toUpperCase()); BlockReplaceRule.Type rType = BlockReplaceRule.Type.valueOf(type.split(" ")[1].toUpperCase()); BlockReplaceRule.Side rSide = BlockReplaceRule.Side.valueOf(side.toUpperCase()); @@ -24,7 +26,11 @@ public class RuleFactory { return new ReplaceIntegerRule(rSide, Integer.parseInt(value), Integer.parseInt(replacement)); } if (rType == BlockReplaceRule.Type.PACKET) { - return new ReplacePacketRule(rSide, Integer.parseInt(value), new HPacket(replacement)); + HPacket packet = new HPacket(replacement); + if (!packet.isPacketComplete()) { + packet.completePacket(rSide == BlockReplaceRule.Side.INCOMING ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER, packetInfoManager); + } + return new ReplacePacketRule(rSide, Integer.parseInt(value), packet); } if (rType == BlockReplaceRule.Type.STRING) { return new ReplaceStringRule(rSide, value, replacement);