This should be possible with callbacks. instead of passing the arguments like this:
class_name Packet extends RawPacket
func _init(state: State, id: int, fields: Array, compressed = true) -> void:
pass
func _init(raw: PackedByteArray) -> void:
pass
instead have your chosen function as the arguement with the other arguements bound:
class_name Packet extends RawPacket
func _init(init_name: String, args: Array) -> void:
var chosen_init = Callable(self, init_name)
chosen_init.call(args)
func init1(args: Array) -> void:
var state : State = args[0]
var id :int = args[1]
var fields :Array = args[2]
var compressed:bool
if args.size() == 4:
compressed = args[3]
else:
compressed = true
[code]
func init2(args: Array) -> void:
var raw: PackedByteArray = args[0]
[code]
usage would look like this:
var maypacket = Packet.new("init1", [<state>, <id>, <fields>, <compressed>])