Yay. On Mon, Mar 04, 2019 at 07:55:43PM -0800, Darrell Root wrote: > Success! My problem was I set query=1 in my CP_LOGIN. > > It looks like the MacTrek client opens one socket, does a query, then closes > that socket and opens a second socket to play. I think I spotted a query=1 in > the first socket and emulated that. Doh! > > Thank you for including this line in your debugging info: > > > CP_LOGIN query= 0 name= guest > > Now I have a bunch of other packet types to parse. The universe is eager to be > updated! ;-) Hopefully I’ll get started on some drawing code tomorrow. > > Darrell > > On Mar 4, 2019, at 4:20 PM, James Cameron <[1]quozl at laptop.org> wrote: > > No worries. You may be interested in the Gytha client TCP and UDP > module, at 300 lines. > > [2]https://github.com/quozl/gytha/blob/master/gytha/client.py > > Our earlier use of the socket API for networking was because it was > the lowest common denominator on UNIX systems. Socket API also > appears in the Gytha client for same reason. > > When you're building on top of a larger stack, interoperability > becomes a challenge. > > On Mon, Mar 04, 2019 at 03:57:26PM -0800, Darrell Root wrote: > > Thank you for that packet dump in netrek format. I’ll have to upgrade > my logs > to be that helpful. ;-) > > I’m actively troubleshooting using your data. > > On a general netrek-dev note, programming with Swift for most things is > cool. > I’m using Apple’s new Network framework to send my data (I believe they > are > working with the IETF on that), so no more BSD socket API. My TCP > reader/ > writer is around 100 lines (have not implemented UDP). Packet analyzer > is > larger of course. > > One Swift pain point is generating arbitrary packets. In C you can > just send a > struct out a network interface. But Swift does not guarantee the > layout of > native-Swift Structs, particularly Structs with arrays. Swift also > does not > have arrays of predefined sizes. > > For simple structs with no arrays/strings, it works to create the > Struct > natively in Swift and spit it out the network interface (at least for > Swift > 4.2).. But whenever I have a struct with an array or String, I have to > define > the struct in C and import it into Swift. This makes it “difficult” to > layout > the packet in Swift, although I’m now past that challenge. > > I remember looking at the Netrek source code back in 1991. I was > impressed, > but the C was mostly beyond my abilities. I looked at it again > recently. It's > still beyond my abilities. Swift just works better with the way my > brain is > wired. I salute you all! > > Darrell > > On Mar 4, 2019, at 2:52 PM, James Cameron <[1][3]quozl at laptop.org> > wrote: > > Here's a packet dump from Gytha just now. > > [2][4]http://dev.laptop.org/~quozl/z/1h0wOC.txt > > Note how CP_FEATURE is sent early, and there's a burst of SP_FEATURE > after CP_LOGIN and before SP_LOGIN. > > Also, I was wrong in previous mail, SP_YOU is seen before CP_LOGIN, > but with zero flags. > > On Mon, Mar 04, 2019 at 02:26:14PM -0800, Darrell Root wrote: > > I’ll take a look at those documents although I’m already all > over > packets.h > from the distribution. > > Here’s the full sequence in order. SP_YOU comes early before I > send my > login > authentication as guest. > > Darrell > > "Sending CP_PACKET 27" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_PLAYER_INFO" > "Received SP_YOU" > "Sending CP_LOGIN 8" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PL_LOGIN" > "Received SP_HOSTILE" > "Received SP_PLAYER_INFO" > "Received SP_KILLS" > "Received SP_PSTATUS" > "Received SP_FLAGS" > "Received SP_PLAYER" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_PLANET_LOC" > "Received SP_LOGIN" > "Sending CP_FEATURE 60" > "Sending CP_OUTFIT 9" > > On Mar 4, 2019, at 2:19 PM, James Cameron <[1][3][5] > quozl at laptop.org> > wrote: > > G'day Darrell, > > According to protocol, you should expect SP_YOU in response > to > CP_LOGIN and CP_FEATURE. You say you have it in the count of > packets, > but you don't have it in the end of the sequence. Can you > show the > whole sequence? > > Also, see these references; > > 1. netrek protocol > > [2][4][6]https://github.com/quozl/netrek-server/blob/master/ > include/ > packets.h#L24 > > 2. sending CP_FEATURE of FEATURE_PACKETS immediately after > CP_SOCKET, > > [5][7]https://github.com/quozl/gytha/blob/master/gytha/ > __init__.py# > L5644 > > On Mon, Mar 04, 2019 at 01:07:35PM -0800, Darrell Root wrote: > > netrek-dev, > > I’m working on a Swift Netrek client for the Mac. I’m > having > trouble > getting > through the login sequence. > > I’m using netrek-server-vanilla > netrek-server-vanilla-2.19.0 > with no > active > players as a test target. In my packet traces below the > server > is at > 192.168.0.10. > > I’m able to successfully play on my test server with the > MacTrek > client. > > Here’s a count of the packets I’ve been able to send/ > receive and > process (not > in order): > > 31 "Received SP_FLAGS" > 32 "Received SP_HOSTILE" > 32 "Received SP_KILLS" > 1 "Received SP_LOGIN" > 40 "Received SP_PLANET_LOC" > 32 "Received SP_PLAYER" > 52 "Received SP_PLAYER_INFO" > 32 "Received SP_PL_LOGIN" > 32 "Received SP_PSTATUS" > 1 "Received SP_YOU" > 1 "Sending CP_FEATURE 60" > 1 "Sending CP_LOGIN 8" > 1 "Sending CP_OUTFIT 9" > 1 "Sending CP_SOCKET 27" > > Here’s the end of the sequence: > > ... > "Received SP_LOGIN" > "Sending CP_FEATURE 60" > "Sending CP_OUTFIT 9" > > No response to CP_OUTFIT. > The server logs an inability to do a DNS reverse lookup > on > 192.168.0.31, but I > don’t think that is related (and it doesn’t stop the > MacTrek > Objective-C client > from playing). > > I presume that something is wrong with my CP_OUTFIT or > CP_LOGIN, > or > that some > other packet is required to login on the server. > > Here’s my CP_FEATURE: > > 12:46:33.444140 IP 192.168.0.31.62943 > > 192.168.0.10.netrek: > Flags > [P.], seq > 61:149, ack 5873, win 2048, options [nop,nop,TS val > 516594040 > ecr > 1657847922], > length 88 > 0x0000: 685b 3589 0a04 1410 9fd7 77b1 0800 4500 > 0x0010: 008c 0000 4000 4006 b8f2 c0a8 001f c0a8 > 0x0020: 000a f5df 0a20 187e d37b 87ce 7c2f 8018 > 0x0030: 0800 96e5 0000 0101 080a 1eca 9978 62d0 > 0x0040: c072 3c53 0000 0000 0001 4645 4154 5552 > 0x0050: 455f 5041 434b 4554 5300 0000 0000 0000 > 0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0090: 0000 0000 0000 0000 0000 > > Here’s a packet dump of a MacTrek CP_FEATURE packet. > Mine looks > correct. > > 08:29:02.233675 IP 192.168.0.31.60481 > > 192.168.0.10.netrek: > Flags > [P.], seq > 9:97, ack 1, win 2058, options [nop,nop,TS val 501230260 > ecr > 1642419149], > length 88 > 0x0000: 685b 3589 0a04 1410 9fd7 77b1 0800 4500 > 0x0010: 008c 0000 4000 4006 b8f2 c0a8 001f c0a8 > 0x0020: 000a ec41 0a20 47c9 bead f710 babe 8018 > 0x0030: 080a b569 0000 0101 080a 1de0 2ab4 61e5 > 0x0040: 53cd 3c53 0000 0000 0001 4645 4154 5552 > 0x0050: 455f 5041 434b 4554 5300 0000 0000 0000 > 0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0070: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0080: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0090: 0000 0000 0000 0000 0000 > > For reference here’s reference information on that > structure: > > #define CP_FEATURE 60 > > struct feature_cpacket { /* CP_FEATURE py-struct "! > bcbbi80s" #60 > */ > char type; > char feature_type; /* either 'C' or > 'S' */ > char arg1, > arg2; > int value; > char name[80]; > }; > > struct feature_var feature_vars[] = { > {"FEATURE_PACKETS", &F_client_feature_packets, > NULL}, > > Here’s my CP_OUTFIT when I try to login as fed (I also > tried > setting > team to 0 at 0x0044 since that is what MacTrek appears to > do). > > 12:46:34.381240 IP 192.168.0.31.62943 > > 192.168.0.10.netrek: > Flags > [P.], seq 149:153, ack 5873, win 2048, options > [nop,nop,TS val > 516594969 ecr 1657848989], length 4 > 0x0000: 685b 3589 0a04 1410 9fd7 77b1 0800 4500 > 0x0010: 0038 0000 4000 4006 b946 c0a8 001f c0a8 > 0x0020: 000a f5df 0a20 187e d3d3 87ce 7c2f 8018 > 0x0030: 0800 0e95 0000 0101 080a 1eca 9d19 62d0 > 0x0040: c49d 0901 0200 > > Here’s info on that struct: > > #define CP_OUTFIT 9 /* outfit to new > ship */ > > struct outfit_cpacket { /* CP_OUTFIT py-struct "!bbbx" #9 > */ > char type; > char team; > char ship; > char pad1; > }; > > Could the problem be with my earlier packets? They got > responses. But > here they are for completeness: > > CP_SOCKET: (note that my client does not support UDP) > > 11:46:12.530856 IP 192.168.0.31.62508 > > 192.168.0.10.netrek: > Flags > [P.], seq 1:9, ack 1, win 2058, options [nop,nop,TS val > 512991468 ecr > 1654229963], length 8 > 0x0000: 685b 3589 0a04 1410 9fd7 77b1 0800 4500 > 0x0010: 003c 0000 4000 4006 b942 c0a8 001f c0a8 > 0x0020: 000a f42c 0a20 c97b 28a2 549c ed30 8018 > 0x0030: 080a 67e8 0000 0101 080a 1e93 a0ec 6299 > 0x0040: 8bcb 1b04 0a00 0000 8020 > > #define CP_SOCKET 27 /* new socket for > reconnection > */ > > struct socket_cpacket { /* CP_SOCKET py-struct "!bbbxI" # > 27 */ > char type; > char version; > char udp_version; /* was pad2 */ > char pad3; > u_int socket; > }; > > CP_LOGIN: (hardcoded to guest as the username, password > and > login > empty) > > 11:46:13.591234 IP 192.168.0.31.62508 > > 192.168.0.10.netrek: > Flags > [P.], seq 9:61, ack 5769, win 2048, options [nop,nop,TS > val > 512992524 > ecr 1654231039], length 52 > 0x0000: 685b 3589 0a04 1410 9fd7 77b1 0800 4500 > 0x0010: 0068 0000 4000 4006 b916 c0a8 001f c0a8 > 0x0020: 000a f42c 0a20 c97b 28aa 549d 03b8 8018 > 0x0030: 0800 a51c 0000 0101 080a 1e93 a50c 6299 > 0x0040: 8fff 0801 0000 6775 6573 7400 0000 0000 > 0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0060: 0000 0000 0000 0000 0000 0000 0000 0000 > 0x0070: 0000 0000 0000 > > struct login_cpacket { /* CP_LOGIN py-struct '! > bbxx16s16s16s' #8 > */ > char type; > char query; > char pad2; > char pad3; > char name[NAME_LEN]; > char password[NAME_LEN]; > char login[NAME_LEN]; > }; > > Any ideas what I need to correct or what else I need to > supply > to > successfully login as guest? > > Darrell > > _______________________________________________ > netrek-dev mailing list > [6][8]netrek-dev at us.netrek.org > [7][9]http://mailman.us.netrek.org/mailman/listinfo/ > netrek-dev > > -- > James Cameron > [8][10]http://quozl.netrek.org/ > > References: > > [1] [9][11]mailto:quozl at laptop.org > [2] [10][12]https://github.com/quozl/netrek-server/blob/master/ > include/ > packets.h#L24 > > _______________________________________________ > netrek-dev mailing list > [11][13]netrek-dev at us.netrek.org > [12][14]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > > -- > James Cameron > [13][15]http://quozl.netrek.org/ > _______________________________________________ > netrek-dev mailing list > [14][16]netrek-dev at us.netrek.org > [15][17]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > > References: > > [1] [18]mailto:quozl at laptop.org > [2] [19]http://dev.laptop.org/~quozl/z/1h0wOC.txt > [3] [20]mailto:quozl at laptop.org > [4] [21]https://github.com/quozl/netrek-server/blob/master/include/ > packets.h#L24 > [5] [22]https://github.com/quozl/gytha/blob/master/gytha/__init__.py# > L5644 > [6] [23]mailto:netrek-dev at us.netrek.org > [7] [24]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [8] [25]http://quozl.netrek.org/ > [9] [26]mailto:quozl at laptop.org > [10] [27]https://github.com/quozl/netrek-server/blob/master/include/ > packets.h#L24 > [11] [28]mailto:netrek-dev at us.netrek.org > [12] [29]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [13] [30]http://quozl.netrek.org/ > [14] [31]mailto:netrek-dev at us.netrek.org > [15] [32]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > > _______________________________________________ > netrek-dev mailing list > [33]netrek-dev at us.netrek.org > [34]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > > -- > James Cameron > [35]http://quozl.netrek.org/ > _______________________________________________ > netrek-dev mailing list > [36]netrek-dev at us.netrek.org > [37]http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > > References: > > [1] mailto:quozl at laptop.org > [2] https://github.com/quozl/gytha/blob/master/gytha/client.py > [3] mailto:quozl at laptop.org > [4] http://dev.laptop.org/~quozl/z/1h0wOC.txt > [5] mailto:quozl at laptop.org > [6] https://github.com/quozl/netrek-server/blob/master/include/ > [7] https://github.com/quozl/gytha/blob/master/gytha/__init__.py# > [8] mailto:netrek-dev at us.netrek.org > [9] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [10] http://quozl.netrek.org/ > [11] mailto:quozl at laptop.org > [12] https://github.com/quozl/netrek-server/blob/master/include/ > [13] mailto:netrek-dev at us.netrek.org > [14] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [15] http://quozl.netrek.org/ > [16] mailto:netrek-dev at us.netrek.org > [17] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [18] mailto:quozl at laptop.org > [19] http://dev.laptop.org/~quozl/z/1h0wOC.txt > [20] mailto:quozl at laptop.org > [21] https://github.com/quozl/netrek-server/blob/master/include/packets.h#L24 > [22] https://github.com/quozl/gytha/blob/master/gytha/__init__.py#L5644 > [23] mailto:netrek-dev at us.netrek.org > [24] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [25] http://quozl.netrek.org/ > [26] mailto:quozl at laptop.org > [27] https://github.com/quozl/netrek-server/blob/master/include/packets.h#L24 > [28] mailto:netrek-dev at us.netrek.org > [29] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [30] http://quozl.netrek.org/ > [31] mailto:netrek-dev at us.netrek.org > [32] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [33] mailto:netrek-dev at us.netrek.org > [34] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > [35] http://quozl.netrek.org/ > [36] mailto:netrek-dev at us.netrek.org > [37] http://mailman.us.netrek.org/mailman/listinfo/netrek-dev > _______________________________________________ > netrek-dev mailing list > netrek-dev at us.netrek.org > http://mailman.us.netrek.org/mailman/listinfo/netrek-dev -- James Cameron http://quozl.netrek.org/