From 384005879218fca2e9c900b94e5bc35455f4648a Mon Sep 17 00:00:00 2001 From: Cyril Bissey <53737317+Cykyrios@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:08:19 +0100 Subject: [PATCH] Update to InSim 10 for LFS 0.8B WIP, tests are broken until the first LFS test patch is out. --- addons/godot_insim/src/insim/insim.gd | 169 ++++++------- .../src/insim/packet/insim_con_packet.gd | 10 +- .../src/insim/packet/insim_csc_packet.gd | 2 +- .../src/insim/packet/insim_hlv_packet.gd | 10 +- .../src/insim/packet/insim_obh_packet.gd | 19 +- .../src/insim/packet/insim_plh_packet.gd | 2 +- .../src/insim/packet/insim_reo_packet.gd | 16 +- .../src/insim/packet/insim_rip_packet.gd | 6 +- .../src/insim/packet/insim_small_packet.gd | 3 +- .../src/insim/packet/insim_tiny_packet.gd | 7 +- .../src/insim/packet/insim_uco_packet.gd | 2 +- .../src/insim/struct/car_contact.gd | 2 +- addons/godot_insim/src/lyt/lyt_file.gd | 13 +- addons/godot_insim/src/lyt/lyt_object.gd | 222 +++++++++--------- addons/godot_insim/src/utils/gis_time.gd | 2 +- .../insim/packet/test_insim_con_packet.gd | 23 +- .../insim/packet/test_insim_hlv_packet.gd | 20 +- .../insim/packet/test_insim_obh_packet.gd | 35 ++- .../test/insim/packet/test_insim_packet.gd | 8 +- .../insim/packet/test_insim_reo_packet.gd | 23 +- .../godot_insim/test/utils/test_gis_time.gd | 8 +- 21 files changed, 307 insertions(+), 295 deletions(-) diff --git a/addons/godot_insim/src/insim/insim.gd b/addons/godot_insim/src/insim/insim.gd index 8d5301e..d838b49 100644 --- a/addons/godot_insim/src/insim/insim.gd +++ b/addons/godot_insim/src/insim/insim.gd @@ -107,6 +107,9 @@ signal isp_vtn_received(packet: InSimVTNPacket) ## Emitted when an [InSimVTNPac ## to [constant InSim.Small.SMALL_ALC]. signal small_alc_received(packet: InSimSmallPacket) ## Emitted when an [InSimSmallPacket] is received with a [member InSimSmallPacket.sub_type] equal +## to [constant InSim.Small.SMALL_LCL]. +signal small_lcl_received(packet: InSimSmallPacket) +## Emitted when an [InSimSmallPacket] is received with a [member InSimSmallPacket.sub_type] equal ## to [constant InSim.Small.SMALL_RTP]. signal small_rtp_received(packet: InSimSmallPacket) ## Emitted when an [InSimSmallPacket] is received with a [member InSimSmallPacket.sub_type] equal @@ -228,9 +231,9 @@ enum Tiny { TINY_VTC, ## 5 - both ways: game vote cancel (info or request) TINY_SCP, ## 6 - info request: send camera pos TINY_SST, ## 7 - info request: send state info - TINY_GTH, ## 8 - info request: get time in hundredths (i.e. SMALL_RTP) + TINY_GTM, ## 8 - info request: get time in hundredths (i.e. SMALL_RTP) TINY_MPE, ## 9 - info: multi player end - TINY_ISM, ## 10 - info request: get multiplayer info (i.e. ISP_ISM) + TINY_ISM, ## 10 - info request: get multiplayer info (in ISP_ISM) TINY_REN, ## 11 - info: race end (return to race setup screen) TINY_CLR, ## 12 - info: all players cleared from race TINY_NCN, ## 13 - info request: get NCN for all connections @@ -250,6 +253,7 @@ enum Tiny { TINY_MAL, ## 27 - info request: send IS_MAL listing the currently allowed mods TINY_PLH, ## 28 - info request: send IS_PLH listing player handicaps TINY_IPB, ## 29 - info request: send IS_IPB listing the IP bans + TINY_LCL, ## 30 - info request: send a SMALL_LCL for local car's lights } enum Small { SMALL_NONE, ## 0: not used @@ -258,11 +262,11 @@ enum Small { SMALL_VTA, ## 3 - report: vote action SMALL_TMS, ## 4 - instruction: time stop SMALL_STP, ## 5 - instruction: time step - SMALL_RTP, ## 6 - info: race time packet (reply to GTH) + SMALL_RTP, ## 6 - info: race time packet (reply to TINY_GTM) SMALL_NLI, ## 7 - instruction: set node lap interval - SMALL_ALC, ## 8 - both ways: set or get allowed cars (TINY_ALC) + SMALL_ALC, ## 8 - both ways: set or get allowed cars (reply to TINY_ALC) SMALL_LCS, ## 9 - instruction: set local car switches (flash, horn, siren) - SMALL_LCL, ## 10 - instruction: set local car lights + SMALL_LCL, ## 10 - both ways: set or get local car lights (reply to TINY_LCL) SMALL_AII, ## 11 - info request: get local AI info } enum TTC { @@ -305,11 +309,6 @@ enum AIFlags { AIFLAGS_CHUP = 4, ## upshift lever currently held AIFLAGS_CHDN = 8, ## downshift lever currently held } -enum AutoCrossObject { - AXO_START_LIGHTS1 = 149, - AXO_START_LIGHTS2 = 150, - AXO_START_LIGHTS3 = 151, -} enum AXOIndex { AXO_NULL, AXO_1, @@ -327,34 +326,34 @@ enum AXOIndex { AXO_CHALK_RIGHT3, AXO_14, AXO_15, - AXO_16, - AXO_17, + AXO_PAINT_LETTERS, + AXO_PAINT_ARROWS, AXO_18, AXO_19, - AXO_CONE_RED, - AXO_CONE_RED2, - AXO_CONE_RED3, - AXO_CONE_BLUE, - AXO_CONE_BLUE2, - AXO_CONE_GREEN, - AXO_CONE_GREEN2, - AXO_CONE_ORANGE, - AXO_CONE_WHITE, - AXO_CONE_YELLOW, - AXO_CONE_YELLOW2, + AXO_CONE1, + AXO_CONE2, + AXO_22, + AXO_23, + AXO_24, + AXO_25, + AXO_26, + AXO_27, + AXO_28, + AXO_29, + AXO_30, AXO_31, - AXO_32, - AXO_33, + AXO_CONE_TALL1, + AXO_CONE_TALL2, AXO_34, AXO_35, AXO_36, AXO_37, AXO_38, AXO_39, - AXO_CONE_PTR_RED, - AXO_CONE_PTR_BLUE, - AXO_CONE_PTR_GREEN, - AXO_CONE_PTR_YELLOW, + AXO_CONE_POINTER, + AXO_41, + AXO_42, + AXO_43, AXO_44, AXO_45, AXO_46, @@ -375,36 +374,36 @@ enum AXOIndex { AXO_61, AXO_62, AXO_63, - AXO_MARKER_CURVE_L, - AXO_MARKER_CURVE_R, - AXO_MARKER_L, - AXO_MARKER_R, - AXO_MARKER_HARD_L, - AXO_MARKER_HARD_R, - AXO_MARKER_L_R, - AXO_MARKER_R_L, - AXO_MARKER_S_L, - AXO_MARKER_S_R, - AXO_MARKER_S2_L, - AXO_MARKER_S2_R, - AXO_MARKER_U_L, - AXO_MARKER_U_R, + AXO_MARKER_CORNER, + AXO_65, + AXO_66, + AXO_67, + AXO_68, + AXO_69, + AXO_70, + AXO_71, + AXO_72, + AXO_73, + AXO_74, + AXO_75, + AXO_76, + AXO_77, AXO_78, AXO_79, AXO_80, AXO_81, AXO_82, AXO_83, - AXO_DIST25, - AXO_DIST50, - AXO_DIST75, - AXO_DIST100, - AXO_DIST125, - AXO_DIST150, - AXO_DIST200, - AXO_DIST250, - AXO_92, - AXO_93, + AXO_MARKER_DISTANCE, + AXO_85, + AXO_86, + AXO_87, + AXO_88, + AXO_89, + AXO_90, + AXO_91, + AXO_LETTER_BOARD_WY, + AXO_LETTER_BOARD_RB, AXO_94, AXO_95, AXO_ARMCO1, @@ -423,8 +422,8 @@ enum AXOIndex { AXO_109, AXO_110, AXO_111, - AXO_BANNER1, - AXO_BANNER2, + AXO_BANNER, + AXO_113, AXO_114, AXO_115, AXO_116, @@ -435,34 +434,34 @@ enum AXOIndex { AXO_RAMP2, AXO_122, AXO_123, - AXO_124, - AXO_125, - AXO_126, - AXO_127, + AXO_VEH_SUV, + AXO_VEH_VAN, + AXO_VEH_TRUCK, + AXO_VEH_AMBULANCE, AXO_SPEED_HUMP_10M, AXO_SPEED_HUMP_6M, - AXO_130, - AXO_131, - AXO_132, + AXO_SPEED_HUMP_2M, + AXO_SPEED_HUMP_1M, + AXO_KERB, AXO_133, AXO_134, AXO_135, - AXO_POST_GREEN, - AXO_POST_ORANGE, - AXO_POST_RED, - AXO_POST_WHITE, - AXO_140, + AXO_POST, + AXO_137, + AXO_138, + AXO_139, + AXO_MARQUEE, AXO_141, AXO_142, AXO_143, AXO_BALE, - AXO_145, - AXO_146, - AXO_147, - AXO_RAILING, - AXO_START_LIGHTS, - AXO_150, - AXO_151, + AXO_BIN1, + AXO_BIN2, + AXO_RAILING1, + AXO_RAILING2, + AXO_START_LIGHTS1, + AXO_START_LIGHTS2, + AXO_START_LIGHTS3, AXO_152, AXO_153, AXO_154, @@ -471,16 +470,16 @@ enum AXOIndex { AXO_157, AXO_158, AXO_159, - AXO_SIGN_KEEP_LEFT, - AXO_SIGN_KEEP_RIGHT, + AXO_SIGN_METAL, + AXO_161, AXO_162, AXO_163, - AXO_164, - AXO_165, + AXO_CHEVRON_LEFT, + AXO_CHEVRON_RIGHT, AXO_166, AXO_167, - AXO_SIGN_SPEED_80, - AXO_SIGN_SPEED_50, + AXO_SIGN_SPEED, + AXO_169, AXO_170, AXO_171, AXO_CONCRETE_SLAB, @@ -503,9 +502,10 @@ enum AXOIndex { AXO_189, AXO_190, AXO_191, + AXO_MARSHAL = 240, AXO_IS_CP = 252, AXO_IS_AREA, - AXO_MARSHAL, + AXO_RESTRICTED, AXO_ROUTE, } enum ButtonClick { @@ -573,6 +573,7 @@ enum Car { enum CompCarInfo { CCI_BLUE = 1, ## This car is being lapped. CCI_YELLOW = 2, ## This car is causing a yellow flag. + CCI_OOB = 4, ## This car is outside the path. CCI_LAG = 32, ## This player is lagging. CCI_FIRST = 64, ## This is the first [CompCar] in this set of [InSimMCIPacket]s. CCI_LAST = 128, ## This is the last [CompCar] in this set of [InSimMCIPacket]s. @@ -817,7 +818,7 @@ enum PlayerFlag { PIF_RESERVED_4 = 4, PIF_AUTOGEARS = 8, PIF_SHIFTER = 16, - PIF_RESERVED_32 = 32, + PIF_FLEXIBLE_STEER = 32, PIF_HELP_B = 64, PIF_AXIS_CLUTCH = 128, PIF_INPITS = 256, @@ -927,7 +928,7 @@ enum Vote { VOTE_NUM } -const VERSION := 9 ## Current supported InSim version +const VERSION := 10 ## Current supported InSim version const PING_INTERVAL := 31 ## Interval between pings, if no packet is received before that. const TIMEOUT_DELAY := 10 ## Timeout if no reply to ping within this delay. @@ -1789,6 +1790,8 @@ func _on_small_packet_received(packet: InSimSmallPacket) -> void: small_rtp_received.emit(packet) Small.SMALL_ALC: small_alc_received.emit(packet) + Small.SMALL_LCL: + small_lcl_received.emit(packet) _: _push_error_unknown_packet_subtype(packet.type, packet.sub_type) diff --git a/addons/godot_insim/src/insim/packet/insim_con_packet.gd b/addons/godot_insim/src/insim/packet/insim_con_packet.gd index 0f580ed..34fd691 100644 --- a/addons/godot_insim/src/insim/packet/insim_con_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_con_packet.gd @@ -9,14 +9,13 @@ const _CLOSING_SPEED_MASK := 0x0fff ## Conversion factor between standard units and LFS-encoded values. const CLOSING_SPEED_MULTIPLIER := 10.0 ## Conversion factor between standard units and LFS-encoded values. -const TIME_MULTIPLIER := 100.0 +const TIME_MULTIPLIER := 1000.0 -const PACKET_SIZE := 40 ## Packet size +const PACKET_SIZE := 44 ## Packet size const PACKET_TYPE := InSim.Packet.ISP_CON ## The packet's type, see [enum InSim.Packet]. var sp_close := 0 ## high 4 bits: reserved / low 12 bits: closing speed (10 = 1 m/s) -## looping time stamp (hundredths - time since reset - like [constant InSim.Tiny.TINY_GTH] -var time := 0 +var time := 0 ## time stamp var car_a := CarContact.new() ## Car contact data for the first car. var car_b := CarContact.new() ## Car contact data for the second car. @@ -39,7 +38,8 @@ func _decode_packet(packet: PackedByteArray) -> void: super(packet) var _zero := read_byte() sp_close = read_word() - time = read_word() + var _spw := read_word() + time = read_unsigned() var struct_size := CarContact.STRUCT_SIZE car_a.set_from_buffer(packet.slice(data_offset, data_offset + struct_size)) data_offset += struct_size diff --git a/addons/godot_insim/src/insim/packet/insim_csc_packet.gd b/addons/godot_insim/src/insim/packet/insim_csc_packet.gd index bde88a6..1f05165 100644 --- a/addons/godot_insim/src/insim/packet/insim_csc_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_csc_packet.gd @@ -13,7 +13,7 @@ var plid := 0 ## player's unique id var csc_action := InSim.CSCAction.CSC_START ## CSC action, see [enum InSim.CSCAction]. -var time := 0 ## hundredths of a second since start (as in [constant InSim.Small.SMALL_RTP]) +var time := 0 ## ms since start (as in [constant InSim.Small.SMALL_RTP]) var object := CarContObj.new() ## Car data when the action occurred. var gis_time := 0.0 ## Time in seconds diff --git a/addons/godot_insim/src/insim/packet/insim_hlv_packet.gd b/addons/godot_insim/src/insim/packet/insim_hlv_packet.gd index 0bc30fe..8460dc8 100644 --- a/addons/godot_insim/src/insim/packet/insim_hlv_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_hlv_packet.gd @@ -5,15 +5,14 @@ extends InSimPacket ## This packet is received when a player violates the hotlap validity rules. ## Conversion factor between standard units and LFS-encoded values. -const TIME_MULTIPLIER := 100.0 +const TIME_MULTIPLIER := 1000.0 -const PACKET_SIZE := 16 ## Packet size +const PACKET_SIZE := 20 ## Packet size const PACKET_TYPE := InSim.Packet.ISP_HLV ## The packet's type, see [enum InSim.Packet]. var plid := 0 ## player's unique id var hlvc := 0 ## 0: ground / 1: wall / 4: speeding / 5: out of bounds -## looping time stamp (hundredths - time since reset - like [constant InSim.Tiny.TINY_GTH]) -var time := 0 +var time := 0 ## time stamp var object := CarContObj.new() ## Details about the car that violated HLV rules. @@ -35,7 +34,8 @@ func _decode_packet(packet: PackedByteArray) -> void: plid = read_byte() hlvc = read_byte() var _sp1 := read_byte() - time = read_word() + var _spw := read_word() + time = read_unsigned() var struct_size := CarContObj.STRUCT_SIZE object.set_from_buffer(packet.slice(data_offset, data_offset + struct_size)) data_offset += struct_size diff --git a/addons/godot_insim/src/insim/packet/insim_obh_packet.gd b/addons/godot_insim/src/insim/packet/insim_obh_packet.gd index 2e0385c..4305c43 100644 --- a/addons/godot_insim/src/insim/packet/insim_obh_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_obh_packet.gd @@ -20,14 +20,15 @@ const CLOSING_SPEED_MULTIPLIER := 10.0 const POSITION_XY_MULTIPLIER := 16.0 ## Conversion factor between standard units and LFS-encoded values. const POSITION_Z_MULTIPLIER := 4.0 +## Conversion factor between standard units and LFS-encoded values. +const TIME_MULTIPLIER := 1000.0 -const PACKET_SIZE := 24 ## Packet size +const PACKET_SIZE := 28 ## Packet size const PACKET_TYPE := InSim.Packet.ISP_OBH ## The packet's type, see [enum InSim.Packet]. var plid := 0 ## Player's unique id var sp_close := 0 ## high 4 bits: reserved / low 12 bits: closing speed (10 = 1 m/s) -## looping time stamp (hundredths - time since reset - like [constant InSim.Tiny.TINY_GTH]) -var time := 0 +var time := 0 ## time stamp var object := CarContObj.new() ## Details about the car that hit the object @@ -40,6 +41,7 @@ var obh_flags := 0 ## Flags, see [enum Flag] var gis_closing_speed := 0.0 ## Closing speed in m/s var gis_position := Vector3.ZERO ## Position in meters +var gis_time := 0.0 ## Time in s func _init() -> void: @@ -56,7 +58,8 @@ func _decode_packet(packet: PackedByteArray) -> void: super(packet) plid = read_byte() sp_close = read_word() - time = read_word() + var _spw := read_word() + time = read_unsigned() var struct_size := CarContObj.STRUCT_SIZE object.set_from_buffer(packet.slice(data_offset, data_offset + struct_size)) data_offset += struct_size @@ -115,5 +118,9 @@ func _set_data_from_dictionary(dict: Dictionary) -> void: func _update_gis_values() -> void: gis_closing_speed = (sp_close & _CLOSING_SPEED_MASK) / CLOSING_SPEED_MULTIPLIER - gis_position = Vector3(x / POSITION_XY_MULTIPLIER, y / POSITION_XY_MULTIPLIER, - z / POSITION_Z_MULTIPLIER) + gis_position = Vector3( + x / POSITION_XY_MULTIPLIER, + y / POSITION_XY_MULTIPLIER, + z / POSITION_Z_MULTIPLIER, + ) + gis_time = time / TIME_MULTIPLIER diff --git a/addons/godot_insim/src/insim/packet/insim_plh_packet.gd b/addons/godot_insim/src/insim/packet/insim_plh_packet.gd index e8554d2..9f3bc07 100644 --- a/addons/godot_insim/src/insim/packet/insim_plh_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_plh_packet.gd @@ -4,7 +4,7 @@ extends InSimPacket ## ## This packet is sent to set player handicaps, and received when a player handicap is changed. -const PLH_MAX_PLAYERS := 40 ## Max players per packet +const PLH_MAX_PLAYERS := 48 ## Max players per packet const PLH_DATA_SIZE := 4 ## Handicap data size const PACKET_BASE_SIZE := 4 ## Base packet size diff --git a/addons/godot_insim/src/insim/packet/insim_reo_packet.gd b/addons/godot_insim/src/insim/packet/insim_reo_packet.gd index 1e07444..c6fe5dc 100644 --- a/addons/godot_insim/src/insim/packet/insim_reo_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_reo_packet.gd @@ -5,9 +5,9 @@ extends InSimPacket ## This packet is received when the race starts or upon request via [constant InSim.Tiny.TINY_REO], ## and can be sent to modify the grid just before a race start. -const _MAX_PLAYERS := 40 +const REO_MAX_PLAYERS := 48 -const PACKET_SIZE := 44 ## Packet size +const PACKET_SIZE := 52 ## Packet size const PACKET_TYPE := InSim.Packet.ISP_REO ## The packet's type, see [enum InSim.Packet]. var num_players := 0 ## Number of players in race @@ -19,15 +19,15 @@ static func create(reo_num: int, reo_plids: Array[int]) -> InSimREOPacket: var packet := InSimREOPacket.new() packet.num_players = reo_num packet.plids = reo_plids.duplicate() - var _discard := packet.plids.resize(_MAX_PLAYERS) + var _discard := packet.plids.resize(REO_MAX_PLAYERS) return packet func _init() -> void: size = PACKET_SIZE type = PACKET_TYPE - var _discard := plids.resize(_MAX_PLAYERS) - for i in _MAX_PLAYERS: + var _discard := plids.resize(REO_MAX_PLAYERS) + for i in REO_MAX_PLAYERS: plids[i] = 0 receivable = true sendable = true @@ -41,17 +41,17 @@ func _decode_packet(packet: PackedByteArray) -> void: super(packet) num_players = read_byte() plids.clear() - for i in _MAX_PLAYERS: + for i in REO_MAX_PLAYERS: plids.append(read_byte()) func _fill_buffer() -> void: super() - num_players = mini(num_players, _MAX_PLAYERS) + num_players = mini(num_players, REO_MAX_PLAYERS) add_byte(num_players) for i in num_players: add_byte(plids[i]) - for i in _MAX_PLAYERS - num_players: + for i in REO_MAX_PLAYERS - num_players: add_byte(0) diff --git a/addons/godot_insim/src/insim/packet/insim_rip_packet.gd b/addons/godot_insim/src/insim/packet/insim_rip_packet.gd index 2e79e35..3d6d17c 100644 --- a/addons/godot_insim/src/insim/packet/insim_rip_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_rip_packet.gd @@ -6,7 +6,7 @@ extends InSimPacket ## a sent packet. ## Conversion factor between standard units and LFS-encoded values. -const TIME_MULTIPLIER := 100.0 +const TIME_MULTIPLIER := 1000.0 ## Maximum replay name length const REPLAY_NAME_MAX_LENGTH := 64 # last byte must be zero, so actual value is decreased by one @@ -19,8 +19,8 @@ var mpr := 0 ## 0 = SPR / 1 = MPR var paused := 0 ## Request: pause on arrival / reply: paused state var options := 0 ## Various options - see [enum InSim.ReplayOption] -var c_time := 0 ## (hundredths) request: destination / reply: position -var t_time := 0 ## (hundredths) request: zero / reply: replay length +var c_time := 0 ## (ms) request: destination / reply: position +var t_time := 0 ## (ms) request: zero / reply: replay length var replay_name := "" ## Zero or replay name - last byte must be zero diff --git a/addons/godot_insim/src/insim/packet/insim_small_packet.gd b/addons/godot_insim/src/insim/packet/insim_small_packet.gd index aa658d5..c70e3aa 100644 --- a/addons/godot_insim/src/insim/packet/insim_small_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_small_packet.gd @@ -13,6 +13,7 @@ const RECEIVABLES := [ InSim.Small.SMALL_VTA, InSim.Small.SMALL_RTP, InSim.Small.SMALL_ALC, + InSim.Small.SMALL_LCL, ] ## List of sendable Small packets const SENDABLES := [ @@ -99,7 +100,7 @@ func _get_pretty_text() -> String: InSim.Small.SMALL_LCS: small_description = "set local car switches" InSim.Small.SMALL_LCL: - small_description = "set local car lights" + small_description = "get/set local car lights" InSim.Small.SMALL_AII: small_description = "get local AI info" return "(ReqI %d) %s (Value %d) - %s" % [ diff --git a/addons/godot_insim/src/insim/packet/insim_tiny_packet.gd b/addons/godot_insim/src/insim/packet/insim_tiny_packet.gd index 433e673..fbbb89e 100644 --- a/addons/godot_insim/src/insim/packet/insim_tiny_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_tiny_packet.gd @@ -27,7 +27,7 @@ const SENDABLES := [ InSim.Tiny.TINY_VTC, InSim.Tiny.TINY_SCP, InSim.Tiny.TINY_SST, - InSim.Tiny.TINY_GTH, + InSim.Tiny.TINY_GTM, InSim.Tiny.TINY_ISM, InSim.Tiny.TINY_NCN, InSim.Tiny.TINY_NPL, @@ -45,6 +45,7 @@ const SENDABLES := [ InSim.Tiny.TINY_MAL, InSim.Tiny.TINY_PLH, InSim.Tiny.TINY_IPB, + InSim.Tiny.TINY_LCL, ] const PACKET_SIZE := 4 ## Packet size @@ -109,7 +110,7 @@ func _get_pretty_text() -> String: tiny_description = "request camera packet" InSim.Tiny.TINY_SST: tiny_description = "request state packet" - InSim.Tiny.TINY_GTH: + InSim.Tiny.TINY_GTM: tiny_description = "request time" InSim.Tiny.TINY_MPE: tiny_description = "multiplayer ended" @@ -153,6 +154,8 @@ func _get_pretty_text() -> String: tiny_description = "request player handicaps" InSim.Tiny.TINY_IPB: tiny_description = "request IP ban list" + InSim.Tiny.TINY_LCL: + tiny_description = "request local car lights" return "(ReqI %d) %s - %s" % [ req_i, str(InSim.Tiny.find_key(sub_type)), diff --git a/addons/godot_insim/src/insim/packet/insim_uco_packet.gd b/addons/godot_insim/src/insim/packet/insim_uco_packet.gd index 884ac2a..c5b00d6 100644 --- a/addons/godot_insim/src/insim/packet/insim_uco_packet.gd +++ b/addons/godot_insim/src/insim/packet/insim_uco_packet.gd @@ -13,7 +13,7 @@ var plid := 0 ## Player's unique id var uco_action := InSim.UCOAction.UCO_CIRCLE_ENTER ## UCO Action, see [enum InSim.UCOAction]. -var time := 0 ## Hundredths of a second since start (as in [constant InSim.Small.SMALL_RTP]) +var time := 0 ## ms since start (as in [constant InSim.Small.SMALL_RTP]) var object := CarContObj.new() ## Info about the car var info := ObjectInfo.new() ## Info about the checkpoint or circle diff --git a/addons/godot_insim/src/insim/struct/car_contact.gd b/addons/godot_insim/src/insim/struct/car_contact.gd index 1af43c3..67a2844 100644 --- a/addons/godot_insim/src/insim/struct/car_contact.gd +++ b/addons/godot_insim/src/insim/struct/car_contact.gd @@ -18,7 +18,7 @@ const STEER_MULTIPLIER := PI / 180.0 const STRUCT_SIZE := 16 ## The size of this struct's data var plid := 0 ## player's unique id -var info := 0 ## like info byte in [CompCar] (CCI_BLUE / CCI_YELLOW / CCI_LAG) +var info := 0 ## like info byte in [CompCar] (CCI_BLUE / CCI_YELLOW / CCI_OOB / CCI_LAG) var sp2 := 0 ## spare var steer := 0 ## front wheel steer in degrees (right positive) diff --git a/addons/godot_insim/src/lyt/lyt_file.gd b/addons/godot_insim/src/lyt/lyt_file.gd index 585116e..2c428b6 100644 --- a/addons/godot_insim/src/lyt/lyt_file.gd +++ b/addons/godot_insim/src/lyt/lyt_file.gd @@ -7,13 +7,14 @@ extends LFSPacket const HEADER_SIZE := 12 ## LYT header data size const CURRENT_VERSION := 0 ## File format version const CURRENT_REVISION := 252 ## File format revision +const MINI_REV := 9 ## See NOTE4 in LYT.txt var header := "" ## Header, always equalto LFSLYT var version := 0 ## File format version var revision := 0 ## File format revision var num_objects := 0 ## Number of objects in the layout var laps := 0 ## Number of laps -var flags := 0 ## Layout flags, always equal to 7 for recent files. +var mini_rev := 0 ## Revision number, equal to 9 for recent files (LFS 0.8A). var objects: Array[LYTObject] = [] ## An array containing the objects in the layout. @@ -32,7 +33,7 @@ static func load_from_file(path: String) -> LYTFile: layout.revision = layout.read_byte() layout.num_objects = layout.read_word() layout.laps = layout.read_byte() - layout.flags = layout.read_byte() + layout.mini_rev = layout.read_byte() if ( layout.header != "LFSLYT" or layout.version > CURRENT_VERSION @@ -77,8 +78,8 @@ func get_axm_packets(ucid := 0) -> Array[InSimAXMPacket]: return axm_packets -## Saves the layout to a file at [param path]. Forces [member flags] to indicate the most recent -## format (bits 0, 1 and 2 set). +## Saves the layout to a file at [param path]. Forces [member mini_rev] to indicate +## the most recent format. func save_to_file(path: String) -> void: var file := FileAccess.open(path, FileAccess.WRITE) var error := FileAccess.get_open_error() @@ -87,7 +88,7 @@ func save_to_file(path: String) -> void: return version = CURRENT_VERSION revision = CURRENT_REVISION - flags = (flags & ~0b111) | 7 + mini_rev = (mini_rev & ~0b1111) | MINI_REV resize_buffer(HEADER_SIZE + num_objects * LYTObject.STRUCT_SIZE) data_offset = 0 var _discard := add_string(6, "LFSLYT", false) @@ -95,7 +96,7 @@ func save_to_file(path: String) -> void: add_byte(revision) add_word(num_objects) add_byte(laps) - add_byte(flags) + add_byte(mini_rev) for i in num_objects: objects[i].update_flags() add_buffer(objects[i].get_buffer()) diff --git a/addons/godot_insim/src/lyt/lyt_object.gd b/addons/godot_insim/src/lyt/lyt_object.gd index 6cd24bc..ac0a8f0 100644 --- a/addons/godot_insim/src/lyt/lyt_object.gd +++ b/addons/godot_insim/src/lyt/lyt_object.gd @@ -23,6 +23,9 @@ var flags := 0 ## Object flags var index := InSim.AXOIndex.AXO_NULL ## The object index, part of [enum InSim.AXOIndex]. var heading := 0 ## The object's heading, in LFS-encoded format. +var color_number := 0 ## The object's color index, if supported. +var mapping_number := 0 ## The object's mapping index, if supported. + var gis_position := Vector3.ZERO ## The object's position, in meters. var gis_heading := 0.0 ## The object's heading, in radians. @@ -110,17 +113,16 @@ func _apply_flags() -> void: ## elongated cube by default. func _get_mesh() -> MeshInstance3D: if ( - index >= InSim.AXOIndex.AXO_CONE_RED - and index <= InSim.AXOIndex.AXO_CONE_YELLOW2 - or index >= InSim.AXOIndex.AXO_CONE_PTR_RED - and index <= InSim.AXOIndex.AXO_CONE_PTR_YELLOW + index >= InSim.AXOIndex.AXO_CONE1 + and index <= InSim.AXOIndex.AXO_CONE2 + or index >= InSim.AXOIndex.AXO_CONE_TALL1 + and index <= InSim.AXOIndex.AXO_CONE_TALL2 + or index == InSim.AXOIndex.AXO_CONE_POINTER ): return _get_mesh_cone() elif ( - index >= InSim.AXOIndex.AXO_MARKER_CURVE_L - and index <= InSim.AXOIndex.AXO_MARKER_U_R - or index >= InSim.AXOIndex.AXO_DIST25 - and index <= InSim.AXOIndex.AXO_DIST250 + index == InSim.AXOIndex.AXO_MARKER_CORNER + or index >= InSim.AXOIndex.AXO_MARKER_DISTANCE ): return _get_mesh_marker() elif ( @@ -133,10 +135,7 @@ func _get_mesh() -> MeshInstance3D: and index <= InSim.AXOIndex.AXO_BARRIER_WHITE ): return _get_mesh_barrier() - elif ( - index >= InSim.AXOIndex.AXO_BANNER1 - and index <= InSim.AXOIndex.AXO_BANNER2 - ): + elif index == InSim.AXOIndex.AXO_BANNER: return _get_mesh_banner() elif ( index >= InSim.AXOIndex.AXO_RAMP1 @@ -145,29 +144,26 @@ func _get_mesh() -> MeshInstance3D: return _get_mesh_ramp() elif ( index >= InSim.AXOIndex.AXO_SPEED_HUMP_10M - and index <= InSim.AXOIndex.AXO_SPEED_HUMP_6M + and index <= InSim.AXOIndex.AXO_SPEED_HUMP_1M ): return _get_mesh_speed_hump() - elif ( - index >= InSim.AXOIndex.AXO_POST_GREEN - and index <= InSim.AXOIndex.AXO_POST_WHITE - ): + elif index == InSim.AXOIndex.AXO_POST: return _get_mesh_post() elif index == InSim.AXOIndex.AXO_BALE: return _get_mesh_bale() - elif index == InSim.AXOIndex.AXO_RAILING: - return _get_mesh_railing() - elif index == InSim.AXOIndex.AXO_START_LIGHTS: - return _get_mesh_start_light() elif ( - index >= InSim.AXOIndex.AXO_SIGN_KEEP_LEFT - and index <= InSim.AXOIndex.AXO_SIGN_KEEP_RIGHT + index >= InSim.AXOIndex.AXO_RAILING1 + and index <= InSim.AXOIndex.AXO_RAILING2 ): - return _get_mesh_sign_direction() + return _get_mesh_railing() elif ( - index >= InSim.AXOIndex.AXO_SIGN_SPEED_80 - and index <= InSim.AXOIndex.AXO_SIGN_SPEED_50 + index >= InSim.AXOIndex.AXO_START_LIGHTS1 + and index <= InSim.AXOIndex.AXO_START_LIGHTS3 ): + return _get_mesh_start_light() + elif index == InSim.AXOIndex.AXO_SIGN_METAL: + return _get_mesh_sign_metal() + elif index == InSim.AXOIndex.AXO_SIGN_SPEED: return _get_mesh_sign_speed() elif index == InSim.AXOIndex.AXO_START_POSITION: return _get_mesh_start_position() @@ -205,6 +201,8 @@ func _update_flags_from_gis() -> void: ## Updates all properties of this [LYTObject] that are defined by the current ## [member flags]. Override [method _apply_flags] for implementation. func apply_flags() -> void: + color_number = flags & 0x07 + mapping_number = (flags & 0x78) >> 3 _apply_flags() @@ -641,7 +639,14 @@ func _get_mesh_banner() -> MeshInstance3D: st.generate_normals() var mesh := st.commit() var mat := generate_default_material() - mat.albedo_color = Color.LIGHT_GRAY if index == InSim.AXOIndex.AXO_BANNER1 else Color.DIM_GRAY + mat.albedo_color = ( + Color.LIGHT_GRAY if color_number == 0 + else Color.RED if color_number == 1 + else Color.YELLOW if color_number == 2 + else Color.GREEN if color_number == 3 + else Color.BLUE if color_number == 4 + else Color.DIM_GRAY + ) mesh.surface_set_material(0, mat) var mesh_instance := MeshInstance3D.new() mesh_instance.mesh = mesh @@ -820,17 +825,19 @@ func _get_mesh_cone() -> MeshInstance3D: const TIP_HEIGHT := 0.025 const RADIUS_TOP := 0.035 var radius_base := ( - 0.12 if index == InSim.AXOIndex.AXO_CONE_RED + 0.12 if ( + index >= InSim.AXOIndex.AXO_CONE1 and index <= InSim.AXOIndex.AXO_CONE2 + or index == InSim.AXOIndex.AXO_CONE_POINTER + ) else 0.15 if ( - index == InSim.AXOIndex.AXO_CONE_RED3 - or index >= InSim.AXOIndex.AXO_CONE_PTR_RED + index == InSim.AXOIndex.AXO_CONE_TALL1 + or index >= InSim.AXOIndex.AXO_CONE_TALL2 ) else 0.13 ) var base_width := ( - 0.38 if index == InSim.AXOIndex.AXO_CONE_RED + 0.38 if index == InSim.AXOIndex.AXO_CONE1 else 0.46 if ( - index == InSim.AXOIndex.AXO_CONE_RED3 - or index >= InSim.AXOIndex.AXO_CONE_PTR_RED + index == InSim.AXOIndex.AXO_CONE_TALL1 ) else 0.4 ) var base_low := 0.5 * base_width @@ -858,7 +865,7 @@ func _get_mesh_cone() -> MeshInstance3D: ring_height )) _discard = vertices.push_back(Vector3(0, 0, HEIGHT)) - if index >= InSim.AXOIndex.AXO_CONE_PTR_RED: + if index == InSim.AXOIndex.AXO_CONE_POINTER: for i in vertices.size(): vertices[i] = ( vertices[i].rotated(Vector3(1, 0, 0), deg_to_rad(106.5)) @@ -922,38 +929,15 @@ func _get_mesh_cone() -> MeshInstance3D: st.add_vertex(vertices[indices[i]]) st.generate_normals() var mesh := st.commit() - var color := Color.BLACK - match index: - InSim.AXOIndex.AXO_CONE_RED: - color = Color.RED - InSim.AXOIndex.AXO_CONE_RED2: - color = Color.ORANGE_RED - InSim.AXOIndex.AXO_CONE_RED3: - color = Color.INDIAN_RED - InSim.AXOIndex.AXO_CONE_BLUE: - color = Color.BLUE - InSim.AXOIndex.AXO_CONE_BLUE2: - color = Color.DEEP_SKY_BLUE - InSim.AXOIndex.AXO_CONE_GREEN: - color = Color.FOREST_GREEN - InSim.AXOIndex.AXO_CONE_GREEN2: - color = Color.GREEN - InSim.AXOIndex.AXO_CONE_ORANGE: - color = Color.DARK_ORANGE - InSim.AXOIndex.AXO_CONE_WHITE: - color = Color.WHITE - InSim.AXOIndex.AXO_CONE_YELLOW: - color = Color.YELLOW - InSim.AXOIndex.AXO_CONE_YELLOW2: - color = Color.GOLD - InSim.AXOIndex.AXO_CONE_PTR_RED: - color = Color.RED - InSim.AXOIndex.AXO_CONE_PTR_BLUE: - color = Color.SKY_BLUE - InSim.AXOIndex.AXO_CONE_PTR_GREEN: - color = Color.GREEN - InSim.AXOIndex.AXO_CONE_PTR_YELLOW: - color = Color.GOLD + var color := ( + Color.ORANGE_RED if color_number == 0 + else Color.BLUE if color_number == 1 + else Color.DEEP_SKY_BLUE if color_number == 2 + else Color.LIME_GREEN if color_number == 3 + else Color.DARK_ORANGE if color_number == 4 + else Color.LIGHT_GRAY if color_number == 5 + else Color.GOLD + ) var mat := generate_default_material() mat.albedo_color = color mesh.surface_set_material(0, mat) @@ -1055,8 +1039,8 @@ func _get_mesh_marker() -> MeshInstance3D: ]) # Arrow line definition, assuming left turn for all variations # Horizontal flip for right turns and fixing indices happens later - match index: - InSim.AXOIndex.AXO_MARKER_CURVE_L, InSim.AXOIndex.AXO_MARKER_CURVE_R: + match mapping_number: + 0, 1: # Curve L, Curve R for v in arrow_vertices.size(): arrow_vertices[v] = ( arrow_vertices[v].rotated(Vector3(0, 1, 0), -PI / 3) @@ -1068,7 +1052,7 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0, 0, -0.45), Vector3(0.2, 0, -0.45), ]) - InSim.AXOIndex.AXO_MARKER_L, InSim.AXOIndex.AXO_MARKER_R: + 2, 3: # L, R for v in arrow_vertices.size(): arrow_vertices[v] = ( arrow_vertices[v].rotated(Vector3(0, 1, 0), -PI / 2) @@ -1080,7 +1064,7 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0.2, 0, -0.4), Vector3(0.4, 0, -0.4), ]) - InSim.AXOIndex.AXO_MARKER_HARD_L, InSim.AXOIndex.AXO_MARKER_HARD_R: + 4, 5: # Hard L, Hard R for v in arrow_vertices.size(): arrow_vertices[v] = ( arrow_vertices[v].rotated(Vector3(0, 1, 0), -PI * 3 / 4) @@ -1092,7 +1076,7 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0.1, 0, -0.4), Vector3(0.3, 0, -0.4), ]) - InSim.AXOIndex.AXO_MARKER_L_R, InSim.AXOIndex.AXO_MARKER_R_L: + 6, 7: # L R, R L for v in arrow_vertices.size(): arrow_vertices[v] = arrow_vertices[v] + Vector3(-0.25, 0, 0.2) arrow_vertices.append_array([ @@ -1103,7 +1087,7 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0.1, 0, -0.4), Vector3(0.3, 0, -0.4), ]) - InSim.AXOIndex.AXO_MARKER_S_L, InSim.AXOIndex.AXO_MARKER_S_R: + 8, 9: # S L, S R for v in arrow_vertices.size(): arrow_vertices[v] = ( arrow_vertices[v].rotated(Vector3(0, 1, 0), -PI / 2) @@ -1119,7 +1103,7 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0.3, 0, -0.4), Vector3(0.5, 0, -0.4), ]) - InSim.AXOIndex.AXO_MARKER_S2_L, InSim.AXOIndex.AXO_MARKER_S2_R: + 10, 11: # S2 L, S2 R for v in arrow_vertices.size(): arrow_vertices[v] = arrow_vertices[v] + Vector3(-0.4, 0, 0.2) arrow_vertices.append_array([ @@ -1134,7 +1118,20 @@ func _get_mesh_marker() -> MeshInstance3D: Vector3(0.3, 0, -0.4), Vector3(0.5, 0, -0.4), ]) - InSim.AXOIndex.AXO_MARKER_U_L, InSim.AXOIndex.AXO_MARKER_U_R: + 12, 13: # U L, U R + for v in arrow_vertices.size(): + arrow_vertices[v] = ( + arrow_vertices[v].rotated(Vector3(0, 1, 0), PI) + Vector3(-0.2, 0, -0.1) + ) + arrow_vertices.append_array([ + Vector3(-0.1, 0, 0.2), + Vector3(-0.3, 0, 0.4), + Vector3(0.2, 0, 0.2), + Vector3(0.4, 0, 0.4), + Vector3(0.2, 0, -0.4), + Vector3(0.4, 0, -0.4), + ]) + 14, 15: # Kink L, Kink R for v in arrow_vertices.size(): arrow_vertices[v] = ( arrow_vertices[v].rotated(Vector3(0, 1, 0), PI) + Vector3(-0.2, 0, -0.1) @@ -1153,15 +1150,7 @@ func _get_mesh_marker() -> MeshInstance3D: arrow_indices.append_array([ idx, idx + 1, idx + 3, idx + 3, idx + 2, idx, ]) - if index in [ - InSim.AXOIndex.AXO_MARKER_CURVE_R, - InSim.AXOIndex.AXO_MARKER_R, - InSim.AXOIndex.AXO_MARKER_HARD_R, - InSim.AXOIndex.AXO_MARKER_R_L, - InSim.AXOIndex.AXO_MARKER_S_R, - InSim.AXOIndex.AXO_MARKER_S2_R, - InSim.AXOIndex.AXO_MARKER_U_R, - ]: + if mapping_number % 2 != 0: # Odd numbered mapping, right turn variant for v in arrow_vertices.size(): arrow_vertices[v] = arrow_vertices[v].bounce(Vector3(1, 0, 0)) for i in int(arrow_indices.size() / 3.0): @@ -1169,6 +1158,7 @@ func _get_mesh_marker() -> MeshInstance3D: var swap := arrow_indices[idx] arrow_indices[idx] = arrow_indices[idx + 2] arrow_indices[idx + 2] = swap + var number_width := 0.45 # monospace font character size equivalent var number_thickness := 0.1 var number_0_vertices := PackedVector3Array() @@ -1271,7 +1261,8 @@ func _get_mesh_marker() -> MeshInstance3D: ]) var marker_vertices := PackedVector3Array() var marker_indices := PackedInt32Array() - if index >= InSim.AXOIndex.AXO_MARKER_CURVE_L and index <= InSim.AXOIndex.AXO_MARKER_U_R: + + if index == InSim.AXOIndex.AXO_MARKER_CORNER: marker_vertices.append_array(arrow_vertices) marker_indices.append_array(arrow_indices) else: @@ -1310,23 +1301,16 @@ func _get_mesh_marker() -> MeshInstance3D: vertices[v] = vertices[v] - Vector3(0.5 * (numbers.size() - 1) * number_width, 0, 0) return [vertices, indices] var number_array := [] - match index: - InSim.AXOIndex.AXO_DIST25: - number_array = add_numbers.call([2, 5] as Array[int]) - InSim.AXOIndex.AXO_DIST50: - number_array = add_numbers.call([5, 0] as Array[int]) - InSim.AXOIndex.AXO_DIST75: - number_array = add_numbers.call([7, 5] as Array[int]) - InSim.AXOIndex.AXO_DIST100: - number_array = add_numbers.call([1, 0, 0] as Array[int]) - InSim.AXOIndex.AXO_DIST125: - number_array = add_numbers.call([1, 2, 5] as Array[int]) - InSim.AXOIndex.AXO_DIST150: - number_array = add_numbers.call([1, 5, 0] as Array[int]) - InSim.AXOIndex.AXO_DIST200: - number_array = add_numbers.call([2, 0, 0] as Array[int]) - InSim.AXOIndex.AXO_DIST250: - number_array = add_numbers.call([2, 5, 0] as Array[int]) + number_array = ( + add_numbers.call([2, 5] as Array[int]) if mapping_number == 0 + else add_numbers.call([5, 0] as Array[int]) if mapping_number == 1 + else add_numbers.call([7, 5] as Array[int]) if mapping_number == 2 + else add_numbers.call([1, 0, 0] as Array[int]) if mapping_number == 3 + else add_numbers.call([1, 2, 5] as Array[int]) if mapping_number == 4 + else add_numbers.call([1, 5, 0] as Array[int]) if mapping_number == 5 + else add_numbers.call([2, 0, 0] as Array[int]) if mapping_number == 6 + else add_numbers.call([2, 5, 0] as Array[int]) + ) marker_vertices = number_array[0] marker_indices = number_array[1] var marking_angle := atan( @@ -1474,16 +1458,15 @@ func _get_mesh_post() -> MeshInstance3D: st.add_vertex(vertices[indices[i]]) st.generate_normals() var mesh := st.commit() - var color := Color.BLACK - match index: - InSim.AXOIndex.AXO_POST_GREEN: - color = Color.WEB_GREEN - InSim.AXOIndex.AXO_POST_ORANGE: - color = Color.DARK_ORANGE - InSim.AXOIndex.AXO_POST_RED: - color = Color.RED - InSim.AXOIndex.AXO_POST_WHITE: - color = Color.WHITE + var color := ( + Color.GREEN if color_number == 0 + else Color.ORANGE if color_number == 1 + else Color.RED if color_number == 2 + else Color.WHITE if color_number == 3 + else Color.BLUE if color_number == 4 + else Color.YELLOW if color_number == 5 + else Color.CYAN + ) var mat := generate_default_material() mat.albedo_color = color mesh.surface_set_material(0, mat) @@ -1749,7 +1732,7 @@ func _get_mesh_ramp() -> MeshInstance3D: # Creates and returns a mesh for direction signs. -func _get_mesh_sign_direction() -> MeshInstance3D: +func _get_mesh_sign_metal() -> MeshInstance3D: const SPREAD := 0.65 const WIDTH := 0.8 const HEIGHT := 0.8 @@ -1807,7 +1790,16 @@ func _get_mesh_sign_direction() -> MeshInstance3D: 8, 3, 2, ]) var arrow_height := ALTITUDE + 0.5 * HEIGHT - var arrow_angle := PI / 4 * (1 if index == InSim.AXOIndex.AXO_SIGN_KEEP_LEFT else -1) + var arrow_angle := PI / 4 * ( + 1 if mapping_number == 0 + else -1 if mapping_number == 1 + else 2 if mapping_number == 2 + else -2 if mapping_number == 3 + else 3 if mapping_number == 4 + else -3 if mapping_number == 5 + else 4 if mapping_number == 6 + else 0 + ) for v in disk_vertices.size(): disk_vertices[v] = ( disk_vertices[v].rotated(Vector3(0, 0, 1), PI) @@ -2053,7 +2045,7 @@ func _get_mesh_sign_speed() -> MeshInstance3D: if n == 0: number_vertices.append_array( ( - number_8_vertices if index == InSim.AXOIndex.AXO_SIGN_SPEED_80 + number_8_vertices if mapping_number in [0, 2] else number_5_vertices ).duplicate() ) @@ -2061,7 +2053,7 @@ func _get_mesh_sign_speed() -> MeshInstance3D: number_vertices[v] = number_vertices[v] + Vector3(-0.5 * number_width, 0, 0) number_indices.append_array( ( - number_8_indices if index == InSim.AXOIndex.AXO_SIGN_SPEED_80 + number_8_indices if mapping_number in [0, 2] else number_5_indices ).duplicate() ) diff --git a/addons/godot_insim/src/utils/gis_time.gd b/addons/godot_insim/src/utils/gis_time.gd index c168069..b54260f 100644 --- a/addons/godot_insim/src/utils/gis_time.gd +++ b/addons/godot_insim/src/utils/gis_time.gd @@ -27,7 +27,7 @@ static func get_seconds_from_time_string(time: String) -> float: ## are omitted if they are leading zeros. The intended valid range is 0 to 360,000 seconds ## (100 hours) excluded, values outside this range return 0. static func get_time_string_from_seconds( - time: float, decimal_places := 2, simplify_zero := false, show_plus_sign := false, + time: float, decimal_places := 3, simplify_zero := false, show_plus_sign := false, always_show_minutes := false ) -> String: var negative := true if time < 0 else false diff --git a/addons/godot_insim/test/insim/packet/test_insim_con_packet.gd b/addons/godot_insim/test/insim/packet/test_insim_con_packet.gd index 3fee6f5..adf6c35 100644 --- a/addons/godot_insim/test/insim/packet/test_insim_con_packet.gd +++ b/addons/godot_insim/test/insim/packet/test_insim_con_packet.gd @@ -6,17 +6,19 @@ const __source = "res://addons/godot_insim/src/insim/packet/insim_con_packet.gd" var epsilon := 1e-5 var buffers := [ [PackedByteArray([ - 10, 50, 0, 0, 9, 0, 106, 16, 1, 0, 0, 255, 240, 0, 48, 40, 245, 246, 2, 251, - 158, 255, 242, 24, 3, 0, 0, 255, 240, 0, 64, 41, 244, 245, 2, 251, 147, 255, - 178, 24, + 11, 50, 0, 0, 32, 0, 0, 0, 129, 196, 0, 0, 19, 2, 0, 1, 224, 0, 32, 16, + 254, 254, 3, 2, 75, 1, 180, 30, 21, 0, 0, 4, 15, 240, 48, 19, 253, 254, + 246, 2, 76, 1, 116, 30, ])], [PackedByteArray([ - 10, 50, 0, 0, 65, 0, 254, 38, 1, 0, 0, 220, 0, 48, 16, 17, 130, 53, 3, 6, - 159, 27, 131, 205, 3, 0, 0, 6, 0, 0, 80, 1, 37, 124, 0, 252, 206, 27, 87, 205, + 11, 50, 0, 0, 54, 0, 0, 0, 38, 196, 0, 0, 21, 0, 0, 2, 15, 192, 48, 17, + 253, 253, 243, 3, 74, 1, 88, 30, 22, 0, 0, 254, 15, 240, 48, 23, 252, 251, + 244, 2, 79, 1, 24, 30, ])], [PackedByteArray([ - 10, 50, 0, 0, 76, 0, 36, 63, 15, 0, 0, 5, 16, 0, 16, 23, 18, 17, 0, 14, 228, - 209, 74, 5, 67, 0, 0, 5, 11, 0, 16, 31, 19, 17, 243, 9, 4, 210, 6, 5, + 11, 50, 0, 0, 33, 0, 0, 0, 250, 214, 0, 0, 41, 0, 0, 36, 15, 32, 48, 26, + 251, 23, 250, 249, 119, 1, 50, 28, 42, 2, 0, 28, 0, 0, 48, 21, 252, 23, + 1, 252, 149, 1, 53, 28, ])], ] @@ -40,18 +42,19 @@ func test_decode_packet(buffer: PackedByteArray, test_parameters := buffers) -> assert_float(packet.gis_closing_speed) .is_equal_approx(packet.sp_close / InSimCONPacket.CLOSING_SPEED_MULTIPLIER, epsilon) ) - _test = assert_int(packet.time).is_equal(buffer.decode_u16(6)) + _test = assert_int(buffer.decode_u16(6)).is_zero() + _test = assert_int(packet.time).is_equal(buffer.decode_u32(8)) _test = ( assert_float(packet.gis_time) .is_equal_approx(packet.time / InSimCONPacket.TIME_MULTIPLIER, epsilon) ) _test = ( assert_array(packet.car_a.get_buffer()) - .is_equal(buffer.slice(8, 8 + CarContact.STRUCT_SIZE)) + .is_equal(buffer.slice(12, 12 + CarContact.STRUCT_SIZE)) ) _test = ( assert_array(packet.car_b.get_buffer()) - .is_equal(buffer.slice(8 + CarContact.STRUCT_SIZE)) + .is_equal(buffer.slice(12 + CarContact.STRUCT_SIZE)) ) packet.fill_buffer() _test = assert_array(packet.buffer).is_equal(buffer) diff --git a/addons/godot_insim/test/insim/packet/test_insim_hlv_packet.gd b/addons/godot_insim/test/insim/packet/test_insim_hlv_packet.gd index 024651e..14997fc 100644 --- a/addons/godot_insim/test/insim/packet/test_insim_hlv_packet.gd +++ b/addons/godot_insim/test/insim/packet/test_insim_hlv_packet.gd @@ -5,10 +5,15 @@ const __source = "res://addons/godot_insim/src/insim/packet/insim_hlv_packet.gd" var epsilon := 1e-5 var buffers := [ - [PackedByteArray([4, 52, 0, 4, 0, 0, 223, 5, 0, 6, 17, 1, 124, 250, 250, 241])], - [PackedByteArray([4, 52, 0, 4, 1, 0, 60, 8, 0, 174, 14, 1, 14, 253, 233, 248])], - [PackedByteArray([4, 52, 0, 1, 4, 0, 110, 4, 0, 253, 23, 40, 155, 250, 151, 9])], - [PackedByteArray([4, 52, 0, 1, 5, 0, 180, 33, 0, 234, 31, 2, 21, 253, 185, 241])], + [PackedByteArray([ + 5, 52, 0, 57, 0, 0, 0, 0, 62, 106, 0, 0, 0, 239, 31, 14, 245, 1, 227, 27 + ])], + [PackedByteArray([ + 5, 52, 0, 57, 5, 0, 0, 0, 29, 120, 0, 0, 0, 2, 19, 45, 106, 2, 141, 33 + ])], + [PackedByteArray([ + 5, 52, 0, 57, 1, 0, 0, 0, 117, 168, 0, 0, 0, 143, 4, 62, 237, 7, 0, 31 + ])], ] @@ -28,10 +33,11 @@ func test_decode_packet(buffer: PackedByteArray, test_parameters := buffers) -> _test = assert_int(packet.plid).is_equal(buffer.decode_u8(3)) _test = assert_int(packet.hlvc).is_equal(buffer.decode_u8(4)) _test = assert_int(buffer.decode_u8(5)).is_zero() - _test = assert_int(packet.time).is_equal(buffer.decode_u16(6)) + _test = assert_int(buffer.decode_u16(6)).is_zero() + _test = assert_int(packet.time).is_equal(buffer.decode_u32(8)) _test = assert_float(packet.gis_time).is_equal_approx( - buffer.decode_u16(6) / InSimHLVPacket.TIME_MULTIPLIER, epsilon + buffer.decode_u32(8) / InSimHLVPacket.TIME_MULTIPLIER, epsilon ) - _test = assert_array(packet.object.get_buffer()).is_equal(buffer.slice(8)) + _test = assert_array(packet.object.get_buffer()).is_equal(buffer.slice(12)) packet.fill_buffer() _test = assert_array(packet.buffer).is_equal(buffer) diff --git a/addons/godot_insim/test/insim/packet/test_insim_obh_packet.gd b/addons/godot_insim/test/insim/packet/test_insim_obh_packet.gd index 817325f..5ea6574 100644 --- a/addons/godot_insim/test/insim/packet/test_insim_obh_packet.gd +++ b/addons/godot_insim/test/insim/packet/test_insim_obh_packet.gd @@ -6,16 +6,12 @@ const __source = "res://addons/godot_insim/src/insim/packet/insim_obh_packet.gd" var epsilon := 1e-5 var buffers := [ [PackedByteArray([ - 6, 51, 0, 62, 26, 0, 96, 54, 0, 77, 12, 9, 223, 3, 188, 243, 235, 3, 208, - 243, 7, 0, 178, 9, + 7, 51, 0, 57, 25, 1, 0, 0, 117, 110, 0, 0, 0, 28, 28, 26, 34, 2, 226, 29, + 48, 2, 240, 29, 0, 0, 84, 10, ])], [PackedByteArray([ - 6, 51, 0, 59, 24, 0, 76, 57, 0, 128, 35, 8, 128, 7, 177, 245, 144, 7, 107, - 245, 7, 0, 174, 9, - ])], - [PackedByteArray([ - 6, 51, 0, 20, 73, 0, 65, 73, 0, 185, 25, 8, 56, 251, 28, 214, 113, 251, 7, - 214, 7, 0, 174, 9, + 7, 51, 0, 57, 62, 0, 0, 0, 211, 232, 0, 0, 0, 139, 7, 60, 33, 7, 218, 28, + 252, 6, 151, 29, 0, 0, 0, 6, ])], ] @@ -38,20 +34,21 @@ func test_decode_packet(buffer: PackedByteArray, test_parameters := buffers) -> _test = assert_float(packet.gis_closing_speed).is_equal_approx( buffer.decode_u16(4) / InSimOBHPacket.CLOSING_SPEED_MULTIPLIER, epsilon ) - _test = assert_int(packet.time).is_equal(buffer.decode_u16(6)) + _test = assert_int(buffer.decode_u16(6)).is_zero() + _test = assert_int(packet.time).is_equal(buffer.decode_u32(8)) _test = assert_array(packet.object.get_buffer()).is_equal( - buffer.slice(8, 8 + CarContObj.STRUCT_SIZE) + buffer.slice(12, 12 + CarContObj.STRUCT_SIZE) ) - _test = assert_int(packet.x).is_equal(buffer.decode_s16(CarContObj.STRUCT_SIZE + 8)) - _test = assert_int(packet.y).is_equal(buffer.decode_s16(CarContObj.STRUCT_SIZE + 10)) - _test = assert_int(packet.z).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 12)) + _test = assert_int(packet.x).is_equal(buffer.decode_s16(CarContObj.STRUCT_SIZE + 12)) + _test = assert_int(packet.y).is_equal(buffer.decode_s16(CarContObj.STRUCT_SIZE + 14)) + _test = assert_int(packet.z).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 16)) _test = assert_vector(packet.gis_position).is_equal_approx(Vector3( - buffer.decode_s16(CarContObj.STRUCT_SIZE + 8) / InSimOBHPacket.POSITION_XY_MULTIPLIER, - buffer.decode_s16(CarContObj.STRUCT_SIZE + 10) / InSimOBHPacket.POSITION_XY_MULTIPLIER, - buffer.decode_u8(CarContObj.STRUCT_SIZE + 12) / InSimOBHPacket.POSITION_Z_MULTIPLIER + buffer.decode_s16(CarContObj.STRUCT_SIZE + 12) / InSimOBHPacket.POSITION_XY_MULTIPLIER, + buffer.decode_s16(CarContObj.STRUCT_SIZE + 14) / InSimOBHPacket.POSITION_XY_MULTIPLIER, + buffer.decode_u8(CarContObj.STRUCT_SIZE + 16) / InSimOBHPacket.POSITION_Z_MULTIPLIER ), epsilon * Vector3.ONE) - _test = assert_int(buffer.decode_u8(CarContObj.STRUCT_SIZE + 13)).is_zero() - _test = assert_int(packet.index).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 14)) - _test = assert_int(packet.obh_flags).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 15)) + _test = assert_int(buffer.decode_u8(CarContObj.STRUCT_SIZE + 17)).is_zero() + _test = assert_int(packet.index).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 18)) + _test = assert_int(packet.obh_flags).is_equal(buffer.decode_u8(CarContObj.STRUCT_SIZE + 19)) packet.fill_buffer() _test = assert_array(packet.buffer).is_equal(buffer) diff --git a/addons/godot_insim/test/insim/packet/test_insim_packet.gd b/addons/godot_insim/test/insim/packet/test_insim_packet.gd index f7e7362..4e5e2b6 100644 --- a/addons/godot_insim/test/insim/packet/test_insim_packet.gd +++ b/addons/godot_insim/test/insim/packet/test_insim_packet.gd @@ -20,10 +20,8 @@ func test_decode_header(buffer: PackedByteArray, test_parameters := [ @warning_ignore("unused_parameter") func test_decode_packet(buffer: PackedByteArray, test_parameters := [ - [PackedByteArray([5, 2, 1, 0, 48, 46, 55, 70, 0, 0, 0, 0, 83, 51, 0, 0, 0, 0, 9, 0])], [PackedByteArray([ - 10, 50, 0, 0, 102, 0, 151, 4, 1, 0, 0, 254, 240, 112, 16, 9, 249, 249, 3, - 255, 227, 251, 64, 7, 34, 0, 0, 220, 240, 0, 16, 8, 50, 40, 1, 243, 6, 252, 93, 7, + 5, 2, 1, 0, 48, 46, 55, 70, 0, 0, 0, 0, 83, 51, 0, 0, 0, 0, 9, 0 ])], ]) -> void: var packet := InSimPacket.create_packet_from_buffer(buffer) @@ -37,10 +35,8 @@ func test_decode_packet(buffer: PackedByteArray, test_parameters := [ @warning_ignore("unused_parameter") func test_encode_packet(buffer: PackedByteArray, test_parameters := [ - [PackedByteArray([5, 2, 1, 0, 48, 46, 55, 70, 0, 0, 0, 0, 83, 51, 0, 0, 0, 0, 9, 0])], [PackedByteArray([ - 10, 50, 0, 0, 102, 0, 151, 4, 1, 0, 0, 254, 240, 112, 16, 9, 249, 249, 3, - 255, 227, 251, 64, 7, 34, 0, 0, 220, 240, 0, 16, 8, 50, 40, 1, 243, 6, 252, 93, 7, + 5, 2, 1, 0, 48, 46, 55, 70, 0, 0, 0, 0, 83, 51, 0, 0, 0, 0, 9, 0 ])], ]) -> void: var packet := InSimPacket.create_packet_from_buffer(buffer) diff --git a/addons/godot_insim/test/insim/packet/test_insim_reo_packet.gd b/addons/godot_insim/test/insim/packet/test_insim_reo_packet.gd index ca1daa6..aa7be05 100644 --- a/addons/godot_insim/test/insim/packet/test_insim_reo_packet.gd +++ b/addons/godot_insim/test/insim/packet/test_insim_reo_packet.gd @@ -5,12 +5,14 @@ const __source = "res://addons/godot_insim/src/insim/packet/insim_reo_packet.gd" var buffers := [ [PackedByteArray([ - 11, 36, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 36, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, ])], [PackedByteArray([ - 11, 36, 0, 15, 25, 5, 11, 37, 52, 53, 54, 18, 55, 23, 48, 9, 56, 58, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 36, 0, 48, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ])], ] @@ -52,24 +54,25 @@ func test_encode_packet(buffer: PackedByteArray, test_parameters := buffers) -> func test_send_packet() -> void: var packet := InSimREOPacket.new() packet.num_players = 3 - packet.plids = [1, 2, 3] + packet.plids = [1, 42, 30] packet.fill_buffer() var _test := assert_array(packet.buffer).is_equal(PackedByteArray([ - 11, 36, 0, 3, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 13, 36, 0, 3, 1, 42, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, ])) func test_send_too_many_players() -> void: var packet := InSimREOPacket.new() var plids: Array[int] = [] - for i in 41: + for i in InSimREOPacket.REO_MAX_PLAYERS + 1: plids.append(i + 1) packet.num_players = plids.size() packet.plids = plids packet.fill_buffer() var _test := assert_array(packet.buffer).is_equal(PackedByteArray([ - 11, 36, 0, 40, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 13, 36, 0, 48, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40 + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, ])) diff --git a/addons/godot_insim/test/utils/test_gis_time.gd b/addons/godot_insim/test/utils/test_gis_time.gd index fe592e7..fdba1c4 100644 --- a/addons/godot_insim/test/utils/test_gis_time.gd +++ b/addons/godot_insim/test/utils/test_gis_time.gd @@ -7,7 +7,7 @@ const __source = "res://addons/godot_insim/src/utils/gis_time.gd" func test_get_time_string_from_seconds() -> void: var _test := assert_str( GISTime.get_time_string_from_seconds(0) - ).is_equal("00.00") + ).is_equal("00.000") _test = assert_str( GISTime.get_time_string_from_seconds(0, 2, true) ).is_equal("0.00") @@ -19,7 +19,7 @@ func test_get_time_string_from_seconds() -> void: ).is_equal("0:00.0") _test = assert_str( GISTime.get_time_string_from_seconds(42.21) - ).is_equal("42.21") + ).is_equal("42.210") _test = assert_str( GISTime.get_time_string_from_seconds(42.21, 2, true, false, true) ).is_equal("0:42.21") @@ -31,10 +31,10 @@ func test_get_time_string_from_seconds() -> void: ).is_equal("-10.00") _test = assert_str( GISTime.get_time_string_from_seconds(3600) - ).is_equal("1:00:00.00") + ).is_equal("1:00:00.000") _test = assert_str( GISTime.get_time_string_from_seconds(3599.99) - ).is_equal("59:59.99") + ).is_equal("59:59.990") _test = assert_str( GISTime.get_time_string_from_seconds(-65.842, 1) ).is_equal("-01:05.8") -- GitLab