test[gdscript]: gdscript protocol test

This commit is contained in:
godotg
2024-07-17 14:03:42 +08:00
parent d4f6ae7707
commit ea5388cd39
9 changed files with 3533 additions and 3520 deletions
@@ -70,6 +70,9 @@ func isReadable() -> bool:
func toBytes() -> PackedByteArray:
return buffer.data_array.slice(0, writeOffset)
func newInstance(protocolId: int):
return ProtocolManager.newInstance(protocolId)
# -------------------------------------------------write/read-------------------------------------------------
func writeBytes(value: PackedByteArray):
var length: int = value.size()
@@ -8,30 +8,22 @@ const SimpleObject = preload("res://zfoogd/packet/SimpleObject.gd")
static var protocols: Dictionary = {}
static var protocolClassMap: Dictionary = {}
static var protocolIdMap: Dictionary = {}
static func initProtocol():
protocols[0] = EmptyObject.EmptyObjectRegistration.new()
protocolClassMap[0] = EmptyObject.EmptyObject
protocolIdMap[EmptyObject.EmptyObject] = 0
protocolClassMap[0] = EmptyObject
protocols[1] = VeryBigObject.VeryBigObjectRegistration.new()
protocolClassMap[1] = VeryBigObject.VeryBigObject
protocolIdMap[VeryBigObject.VeryBigObject] = 1
protocolClassMap[1] = VeryBigObject
protocols[100] = ComplexObject.ComplexObjectRegistration.new()
protocolClassMap[100] = ComplexObject.ComplexObject
protocolIdMap[ComplexObject.ComplexObject] = 100
protocolClassMap[100] = ComplexObject
protocols[101] = NormalObject.NormalObjectRegistration.new()
protocolClassMap[101] = NormalObject.NormalObject
protocolIdMap[NormalObject.NormalObject] = 101
protocolClassMap[101] = NormalObject
protocols[102] = ObjectA.ObjectARegistration.new()
protocolClassMap[102] = ObjectA.ObjectA
protocolIdMap[ObjectA.ObjectA] = 102
protocolClassMap[102] = ObjectA
protocols[103] = ObjectB.ObjectBRegistration.new()
protocolClassMap[103] = ObjectB.ObjectB
protocolIdMap[ObjectB.ObjectB] = 103
protocolClassMap[103] = ObjectB
protocols[104] = SimpleObject.SimpleObjectRegistration.new()
protocolClassMap[104] = SimpleObject.SimpleObject
protocolIdMap[SimpleObject.SimpleObject] = 104
protocolClassMap[104] = SimpleObject
pass
static func getProtocol(protocolId: int):
@@ -40,8 +32,12 @@ static func getProtocol(protocolId: int):
static func getProtocolClass(protocolId: int):
return protocolClassMap[protocolId]
static func newInstance(protocolId: int):
var protocol = protocolClassMap[protocolId]
return protocol.new()
static func write(buffer, packet):
var protocolId: int = protocolIdMap[packet.get_script()]
var protocolId: int = packet.protocolId()
buffer.writeShort(protocolId)
var protocol = protocols[protocolId]
protocol.write(buffer, packet)
@@ -1,73 +1,75 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
const ObjectA = preload("res://zfoogd/packet/ObjectA.gd").ObjectA
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd").ObjectB
const ObjectA = preload("res://zfoogd/packet/ObjectA.gd")
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd")
# 复杂的对象,包括了各种复杂的结构,数组,List,Set,Map
class ComplexObject:
# byte类型,最简单的整形
var a: int
# byte的包装类型,优先使用基础类型,包装类型会有装箱拆箱
var aa: int
# 数组类型
var aaa: Array[int]
var aaaa: Array[int]
var b: int
var bb: int
var bbb: Array[int]
var bbbb: Array[int]
var c: int
var cc: int
var ccc: Array[int]
var cccc: Array[int]
var d: int
var dd: int
var ddd: Array[int]
var dddd: Array[int]
var e: float
var ee: float
var eee: Array[float]
var eeee: Array[float]
var f: float
var ff: float
var fff: Array[float]
var ffff: Array[float]
var g: bool
var gg: bool
var ggg: Array[bool]
var gggg: Array[bool]
var jj: String
var jjj: Array[String]
var kk: ObjectA
var kkk: Array[ObjectA]
var l: Array[int]
var ll: Array # Array<Array<Array<number>>>
var lll: Array # Array<Array<ObjectA>>
var llll: Array[String]
var lllll: Array # Array<Map<number, string>>
var m: Dictionary # Map<number, string>
var mm: Dictionary # Map<number, ObjectA>
var mmm: Dictionary # Map<ObjectA, Array<number>>
var mmmm: Dictionary # Map<Array<Array<ObjectA>>, Array<Array<Array<number>>>>
var mmmmm: Dictionary # Map<Array<Map<number, string>>, Set<Map<number, string>>>
var s: Array[int]
var ss: Array # Set<Set<Array<number>>>
var sss: Array # Set<Set<ObjectA>>
var ssss: Array[String]
var sssss: Array # Set<Map<number, string>>
# 如果要修改协议并且兼容老协议,需要加上Compatible注解,保持Compatible注解的value自增
var myCompatible: int
var myObject: ObjectA
# byte类型,最简单的整形
var a: int
# byte的包装类型,优先使用基础类型,包装类型会有装箱拆箱
var aa: int
# 数组类型
var aaa: Array[int]
var aaaa: Array[int]
var b: int
var bb: int
var bbb: Array[int]
var bbbb: Array[int]
var c: int
var cc: int
var ccc: Array[int]
var cccc: Array[int]
var d: int
var dd: int
var ddd: Array[int]
var dddd: Array[int]
var e: float
var ee: float
var eee: Array[float]
var eeee: Array[float]
var f: float
var ff: float
var fff: Array[float]
var ffff: Array[float]
var g: bool
var gg: bool
var ggg: Array[bool]
var gggg: Array[bool]
var jj: String
var jjj: Array[String]
var kk: ObjectA
var kkk: Array[ObjectA]
var l: Array[int]
var ll: Array # Array<Array<Array<number>>>
var lll: Array # Array<Array<ObjectA>>
var llll: Array[String]
var lllll: Array # Array<Map<number, string>>
var m: Dictionary # Map<number, string>
var mm: Dictionary # Map<number, ObjectA>
var mmm: Dictionary # Map<ObjectA, Array<number>>
var mmmm: Dictionary # Map<Array<Array<ObjectA>>, Array<Array<Array<number>>>>
var mmmmm: Dictionary # Map<Array<Map<number, string>>, Set<Map<number, string>>>
var s: Array[int]
var ss: Array # Set<Set<Array<number>>>
var sss: Array # Set<Set<ObjectA>>
var ssss: Array[String]
var sssss: Array # Set<Map<number, string>>
# 如果要修改协议并且兼容老协议,需要加上Compatible注解,保持Compatible注解的value自增
var myCompatible: int
var myObject: ObjectA
func _to_string() -> String:
const jsonTemplate = "{a:{}, aa:{}, aaa:{}, aaaa:{}, b:{}, bb:{}, bbb:{}, bbbb:{}, c:{}, cc:{}, ccc:{}, cccc:{}, d:{}, dd:{}, ddd:{}, dddd:{}, e:{}, ee:{}, eee:{}, eeee:{}, f:{}, ff:{}, fff:{}, ffff:{}, g:{}, gg:{}, ggg:{}, gggg:{}, jj:'{}', jjj:{}, kk:{}, kkk:{}, l:{}, ll:{}, lll:{}, llll:{}, lllll:{}, m:{}, mm:{}, mmm:{}, mmmm:{}, mmmmm:{}, s:{}, ss:{}, sss:{}, ssss:{}, sssss:{}, myCompatible:{}, myObject:{}}"
var params = [self.a, self.aa, JSON.stringify(self.aaa), JSON.stringify(self.aaaa), self.b, self.bb, JSON.stringify(self.bbb), JSON.stringify(self.bbbb), self.c, self.cc, JSON.stringify(self.ccc), JSON.stringify(self.cccc), self.d, self.dd, JSON.stringify(self.ddd), JSON.stringify(self.dddd), self.e, self.ee, JSON.stringify(self.eee), JSON.stringify(self.eeee), self.f, self.ff, JSON.stringify(self.fff), JSON.stringify(self.ffff), self.g, self.gg, JSON.stringify(self.ggg), JSON.stringify(self.gggg), self.jj, JSON.stringify(self.jjj), self.kk, JSON.stringify(self.kkk), JSON.stringify(self.l), JSON.stringify(self.ll), JSON.stringify(self.lll), JSON.stringify(self.llll), JSON.stringify(self.lllll), JSON.stringify(self.m), JSON.stringify(self.mm), JSON.stringify(self.mmm), JSON.stringify(self.mmmm), JSON.stringify(self.mmmmm), JSON.stringify(self.s), JSON.stringify(self.ss), JSON.stringify(self.sss), JSON.stringify(self.ssss), JSON.stringify(self.sssss), self.myCompatible, self.myObject]
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 100
func get_class_name() -> String:
return "ComplexObject"
func _to_string() -> String:
const jsonTemplate = "{a:{}, aa:{}, aaa:{}, aaaa:{}, b:{}, bb:{}, bbb:{}, bbbb:{}, c:{}, cc:{}, ccc:{}, cccc:{}, d:{}, dd:{}, ddd:{}, dddd:{}, e:{}, ee:{}, eee:{}, eeee:{}, f:{}, ff:{}, fff:{}, ffff:{}, g:{}, gg:{}, ggg:{}, gggg:{}, jj:'{}', jjj:{}, kk:{}, kkk:{}, l:{}, ll:{}, lll:{}, llll:{}, lllll:{}, m:{}, mm:{}, mmm:{}, mmmm:{}, mmmmm:{}, s:{}, ss:{}, sss:{}, ssss:{}, sssss:{}, myCompatible:{}, myObject:{}}"
var params = [self.a, self.aa, JSON.stringify(self.aaa), JSON.stringify(self.aaaa), self.b, self.bb, JSON.stringify(self.bbb), JSON.stringify(self.bbbb), self.c, self.cc, JSON.stringify(self.ccc), JSON.stringify(self.cccc), self.d, self.dd, JSON.stringify(self.ddd), JSON.stringify(self.dddd), self.e, self.ee, JSON.stringify(self.eee), JSON.stringify(self.eeee), self.f, self.ff, JSON.stringify(self.fff), JSON.stringify(self.ffff), self.g, self.gg, JSON.stringify(self.ggg), JSON.stringify(self.gggg), self.jj, JSON.stringify(self.jjj), self.kk, JSON.stringify(self.kkk), JSON.stringify(self.l), JSON.stringify(self.ll), JSON.stringify(self.lll), JSON.stringify(self.llll), JSON.stringify(self.lllll), JSON.stringify(self.m), JSON.stringify(self.mm), JSON.stringify(self.mmm), JSON.stringify(self.mmmm), JSON.stringify(self.mmmmm), JSON.stringify(self.s), JSON.stringify(self.ss), JSON.stringify(self.sss), JSON.stringify(self.ssss), JSON.stringify(self.sssss), self.myCompatible, self.myObject]
return jsonTemplate.format(params, "{}")
class ComplexObjectRegistration:
func getProtocolId():
return 100
func write(buffer: ByteBuffer, packet: ComplexObject):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -216,7 +218,7 @@ class ComplexObjectRegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = ComplexObject.new()
var packet = buffer.newInstance(100)
var result0 = buffer.readByte()
packet.a = result0
var result1 = buffer.readByte()
@@ -1,19 +1,21 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
class EmptyObject:
func _to_string() -> String:
const jsonTemplate = "{}"
var params = []
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 0
func get_class_name() -> String:
return "EmptyObject"
func _to_string() -> String:
const jsonTemplate = "{}"
var params = []
return jsonTemplate.format(params, "{}")
class EmptyObjectRegistration:
func getProtocolId():
return 0
func write(buffer: ByteBuffer, packet: EmptyObject):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -25,7 +27,7 @@ class EmptyObjectRegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = EmptyObject.new()
var packet = buffer.newInstance(0)
if (length > 0):
buffer.setReadOffset(beforeReadIndex + length)
@@ -1,41 +1,43 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
const ObjectA = preload("res://zfoogd/packet/ObjectA.gd").ObjectA
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd").ObjectB
const ObjectA = preload("res://zfoogd/packet/ObjectA.gd")
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd")
# 常规的对象,取所有语言语法的交集,基本上所有语言都支持下面的语法
class NormalObject:
var a: int
var aaa: Array[int]
var b: int
# 整数类型
var c: int
var d: int
var e: float
var f: float
var g: bool
var jj: String
var kk: ObjectA
var l: Array[int]
var ll: Array[int]
var lll: Array[ObjectA]
var llll: Array[String]
var m: Dictionary # Map<number, string>
var mm: Dictionary # Map<number, ObjectA>
var s: Array[int]
var ssss: Array[String]
var outCompatibleValue: int
var outCompatibleValue2: int
var a: int
var aaa: Array[int]
var b: int
# 整数类型
var c: int
var d: int
var e: float
var f: float
var g: bool
var jj: String
var kk: ObjectA
var l: Array[int]
var ll: Array[int]
var lll: Array[ObjectA]
var llll: Array[String]
var m: Dictionary # Map<number, string>
var mm: Dictionary # Map<number, ObjectA>
var s: Array[int]
var ssss: Array[String]
var outCompatibleValue: int
var outCompatibleValue2: int
func _to_string() -> String:
const jsonTemplate = "{a:{}, aaa:{}, b:{}, c:{}, d:{}, e:{}, f:{}, g:{}, jj:'{}', kk:{}, l:{}, ll:{}, lll:{}, llll:{}, m:{}, mm:{}, s:{}, ssss:{}, outCompatibleValue:{}, outCompatibleValue2:{}}"
var params = [self.a, JSON.stringify(self.aaa), self.b, self.c, self.d, self.e, self.f, self.g, self.jj, self.kk, JSON.stringify(self.l), JSON.stringify(self.ll), JSON.stringify(self.lll), JSON.stringify(self.llll), JSON.stringify(self.m), JSON.stringify(self.mm), JSON.stringify(self.s), JSON.stringify(self.ssss), self.outCompatibleValue, self.outCompatibleValue2]
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 101
func get_class_name() -> String:
return "NormalObject"
func _to_string() -> String:
const jsonTemplate = "{a:{}, aaa:{}, b:{}, c:{}, d:{}, e:{}, f:{}, g:{}, jj:'{}', kk:{}, l:{}, ll:{}, lll:{}, llll:{}, m:{}, mm:{}, s:{}, ssss:{}, outCompatibleValue:{}, outCompatibleValue2:{}}"
var params = [self.a, JSON.stringify(self.aaa), self.b, self.c, self.d, self.e, self.f, self.g, self.jj, self.kk, JSON.stringify(self.l), JSON.stringify(self.ll), JSON.stringify(self.lll), JSON.stringify(self.llll), JSON.stringify(self.m), JSON.stringify(self.mm), JSON.stringify(self.s), JSON.stringify(self.ssss), self.outCompatibleValue, self.outCompatibleValue2]
return jsonTemplate.format(params, "{}")
class NormalObjectRegistration:
func getProtocolId():
return 101
func write(buffer: ByteBuffer, packet: NormalObject):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -69,7 +71,7 @@ class NormalObjectRegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = NormalObject.new()
var packet = buffer.newInstance(101)
var result0 = buffer.readByte()
packet.a = result0
var array1 = buffer.readByteArray()
@@ -1,23 +1,25 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd").ObjectB
const ObjectB = preload("res://zfoogd/packet/ObjectB.gd")
class ObjectA:
var a: int
var m: Dictionary # Map<number, string>
var objectB: ObjectB
var innerCompatibleValue: int
var a: int
var m: Dictionary # Map<number, string>
var objectB: ObjectB
var innerCompatibleValue: int
func _to_string() -> String:
const jsonTemplate = "{a:{}, m:{}, objectB:{}, innerCompatibleValue:{}}"
var params = [self.a, JSON.stringify(self.m), self.objectB, self.innerCompatibleValue]
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 102
func get_class_name() -> String:
return "ObjectA"
func _to_string() -> String:
const jsonTemplate = "{a:{}, m:{}, objectB:{}, innerCompatibleValue:{}}"
var params = [self.a, JSON.stringify(self.m), self.objectB, self.innerCompatibleValue]
return jsonTemplate.format(params, "{}")
class ObjectARegistration:
func getProtocolId():
return 102
func write(buffer: ByteBuffer, packet: ObjectA):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -35,7 +37,7 @@ class ObjectARegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = ObjectA.new()
var packet = buffer.newInstance(102)
var result0 = buffer.readInt()
packet.a = result0
var map1 = buffer.readIntStringMap()
@@ -1,20 +1,22 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
class ObjectB:
var flag: bool
var innerCompatibleValue: int
var flag: bool
var innerCompatibleValue: int
func _to_string() -> String:
const jsonTemplate = "{flag:{}, innerCompatibleValue:{}}"
var params = [self.flag, self.innerCompatibleValue]
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 103
func get_class_name() -> String:
return "ObjectB"
func _to_string() -> String:
const jsonTemplate = "{flag:{}, innerCompatibleValue:{}}"
var params = [self.flag, self.innerCompatibleValue]
return jsonTemplate.format(params, "{}")
class ObjectBRegistration:
func getProtocolId():
return 103
func write(buffer: ByteBuffer, packet: ObjectB):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -30,7 +32,7 @@ class ObjectBRegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = ObjectB.new()
var packet = buffer.newInstance(103)
var result0 = buffer.readBool()
packet.flag = result0
if buffer.compatibleRead(beforeReadIndex, length):
@@ -1,20 +1,22 @@
const ByteBuffer = preload("res://zfoogd/ByteBuffer.gd")
class SimpleObject:
var c: int
var g: bool
var c: int
var g: bool
func _to_string() -> String:
const jsonTemplate = "{c:{}, g:{}}"
var params = [self.c, self.g]
return jsonTemplate.format(params, "{}")
func protocolId() -> int:
return 104
func get_class_name() -> String:
return "SimpleObject"
func _to_string() -> String:
const jsonTemplate = "{c:{}, g:{}}"
var params = [self.c, self.g]
return jsonTemplate.format(params, "{}")
class SimpleObjectRegistration:
func getProtocolId():
return 104
func write(buffer: ByteBuffer, packet: SimpleObject):
func write(buffer: ByteBuffer, packet: Object):
if (packet == null):
buffer.writeInt(0)
return
@@ -28,7 +30,7 @@ class SimpleObjectRegistration:
if (length == 0):
return null
var beforeReadIndex = buffer.getReadOffset()
var packet = SimpleObject.new()
var packet = buffer.newInstance(104)
var result0 = buffer.readInt()
packet.c = result0
var result1 = buffer.readBool()
File diff suppressed because one or more lines are too long