From b18559b4dba7d33d7ff08b72776a9c4cdf2c81fc Mon Sep 17 00:00:00 2001 From: godotg Date: Thu, 5 Oct 2023 17:41:43 +0800 Subject: [PATCH] feat[gdscript]: compatible filed support gdscript --- .../serializer/gdscript/GenerateGdUtils.java | 18 ++++++++++++++---- .../resources/gdscript/ProtocolTemplate.gd | 10 ++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java index df78ff93..75e21bf9 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/gdscript/GenerateGdUtils.java @@ -95,7 +95,6 @@ public abstract class GenerateGdUtils { FileUtils.writeStringToFile(byteBufferFile, StringUtils.format(byteBufferTemplate, protocolOutputRootPath), false); var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("gdscript/ProtocolManagerTemplate.gd"); - // 生成ProtocolManager.gd文件 var importBuilder = new StringBuilder(); var initList = new ArrayList(); for (var protocol : protocolList) { @@ -170,7 +169,7 @@ public abstract class GenerateGdUtils { gdBuilder.append(StringUtils.format("var {}: {}", fieldName, fieldType)); if (fieldType.equals("Dictionary") || fieldType.equals("Array")) { var typeNote = GenerateTsUtils.toTsClassName(field.getGenericType().toString()); - gdBuilder.append(StringUtils.format(TAB_ASCII + "# {}", typeNote)); + gdBuilder.append(StringUtils.format(TAB_ASCII + "# {}", typeNote)); } gdBuilder.append(LS); } @@ -198,11 +197,20 @@ public abstract class GenerateGdUtils { var fields = registration.getFields(); var fieldRegistrations = registration.getFieldRegistrations(); var gdBuilder = new StringBuilder(); + if (registration.isCompatible()) { + gdBuilder.append("var beforeWriteIndex = buffer.getWriteOffset()").append(LS); + gdBuilder.append(TAB_ASCII).append(StringUtils.format("buffer.writeInt({})", registration.getPredictionLength())).append(LS); + } else { + gdBuilder.append(TAB_ASCII).append("buffer.writeInt(-1)").append(LS); + } for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; gdSerializer(fieldRegistration.serializer()).writeObject(gdBuilder, "packet." + field.getName(), 1, field, fieldRegistration); } + if (registration.isCompatible()) { + gdBuilder.append(TAB_ASCII).append(StringUtils.format("buffer.adjustPadding({}, beforeWriteIndex)", registration.getPredictionLength())).append(LS); + } return gdBuilder.toString(); } @@ -214,8 +222,10 @@ public abstract class GenerateGdUtils { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; if (field.isAnnotationPresent(Compatible.class)) { - gdBuilder.append(TAB_ASCII).append("if (!buffer.isReadable()):").append(LS); - gdBuilder.append(TAB_ASCII + TAB_ASCII).append("return packet").append(LS); + gdBuilder.append(TAB_ASCII).append("if buffer.compatibleRead(beforeReadIndex, length):").append(LS); + var compatibleReadObject = gdSerializer(fieldRegistration.serializer()).readObject(gdBuilder, 2, field, fieldRegistration); + gdBuilder.append(TAB_ASCII + TAB_ASCII).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); + continue; } var readObject = gdSerializer(fieldRegistration.serializer()).readObject(gdBuilder, 1, field, fieldRegistration); gdBuilder.append(TAB_ASCII).append(StringUtils.format("packet.{} = {}", field.getName(), readObject)).append(LS); diff --git a/protocol/src/main/resources/gdscript/ProtocolTemplate.gd b/protocol/src/main/resources/gdscript/ProtocolTemplate.gd index f1922e18..626825df 100644 --- a/protocol/src/main/resources/gdscript/ProtocolTemplate.gd +++ b/protocol/src/main/resources/gdscript/ProtocolTemplate.gd @@ -10,13 +10,19 @@ func _to_string() -> String: return JSON.stringify(m) static func write(buffer, packet): - if (buffer.writePacketFlag(packet)): + if (packet == null): + buffer.writeInt(0) return {} + pass static func read(buffer): - if (!buffer.readBool()): + var length = buffer.readInt() + if (length == 0): return null + var beforeReadIndex = buffer.getReadOffset() var packet = buffer.newInstance(PROTOCOL_ID) {} + if (length > 0): + buffer.setReadOffset(beforeReadIndex + length) return packet