PvPGN
Advertisement

Language and Strings

Using PvPGN Strings

Protocols

Blizzard Battle.net · Westwood Online

Protocol was added by SyS AkA ReX Was used in AWOS And DWOL.txt[]

Contact me at frop@live.co.uk for more information


WOL GameServ Protocol
This Server is the server that is used to organize games. Games are played between clients and not run over the server.

Due to differences in implementation, my code examples shall show dWOL-style output rather than XWIS output (Even if dWOL does not currently implement the token). This is because dWOL attempts to stay true to the IRC RFC, whereas XWIS is a lazy implementation, and thus the examples look better from dWOL.

Channels Due to the irc-based nature of the protocol, the different game "bunkers" are actually irc channels, with a key of "zotclot9"

LOB_<GameNumber>_[0-7] The game then converts these channel names to area names. Yuris revenge has the following:

  1. lob_19_0 = Quick Match Or quick Co-Op?
  2. lob_18_0 = Tiberian Sun Lobbie's 0 to 7
  3. lob_33_0 = Red Alert 2 lobbie's 0 to 7
  4. Lob_41_7 = Intl. Command
  5. Lob_41_6 = Chinese Bunker
  6. Lob_41_5 = French HQ
  7. Lob_41_4 = Korean HQ
  8. Lob_41_3 = USA HQ
  9. Lob_41_2 = German Bunker
  10. Lob_41_1 = Korean Bunker
  11. Lob_41_0 = USA Command

Games are also hosted in channels. #<Player>'s_game

Known Tokens

CVERS VERCHK PASS NICK APGAR SERIAL USER SETLOCALE SETCODEPAGE GETLOCALE GETCODEPAGE SETOPT SQUADINFO GETBUDDY ADDBUDDY DELBUDDY LIST JOIN JOINGAME PART TOPIC GAMEOPT STARTG PAGE PRIVMSG QUIT FINDUSER FINDUSEREX CVERS This is how the game tells the server what game it is. This uses the same number as the LOBCOUNT param passed to the ServServ Server

[ IN ] >> CVERS 10496 There is no way to say "sorry, no this aint my game". The way dWOL implements it is the same way XWIS implements normal error messages (eg wrong pass) is to send the client a MOTD line with the error, and then not allow them todo anything.

VERCHK This is how the game tells the server what game it is. This uses the same number as the LOBCOUNT param passed to the ServServ Server

[ IN ] >> VERCHK 32512 720912 [ OUT ] << :dwol.server 379 RandomUser :none none none 1 1000 NONREQ [ IN ] >> VERCHK 8448 65536 [ OUT ] << :dwol.server 606 RandomUser :westwood-patch.ea.com update world96 ra2 65542_65536_8448.rtp 65542 8448 REQ There is no way to say "sorry, no this aint my game". The way dWOL implements it is the same way XWIS implements normal error messages (eg wrong pass) is to send the client a MOTD line with the error, and then not allow them todo anything.

PASS To prevent normal irc clients randomly connecting, the server is passworded. The password is "supersecret"

[ IN ] >> PASS supersecret NICK This line contains the username of the client

[ IN ] >> NICK RandomUser APGAR "APGAR" is the westwood way of encrypting passwords. I dont know much about this, but believe that it is a one way hash.

[ IN ] >> APGAR Oaanakaa 0 the 0 appears to be optional, only appears in some instances. Not sure why.

SERIAL This is the users serial number. XWIS uses this to make serial numbers only work for 3 accounts. This can also be used to ban users, and WOL used it to check for warezed copies.

[ IN ] >> SERIAL 0000000000000000000000 USER This is only used to maintain compatibility with the IRC Protocol. dWOL uses this line to start sending the MOTD, add new users, perform checks on banned users, invalid passwords, etc etc

SETLOCALE When you first connect to WOL, the game asks where you are. All locations have a code, this code is sent to the server to store. Probably used for quick-game matching. If given with no param, current setting is returned.

[ IN ] >> SETLOCALE 4 [ OUT ] << :dwol.server 310 RandomUser 4 [ IN ] >> SETLOCALE [ OUT ] << :dwol.server 310 RandomUser 4 SETCODEPAGE No data for this at present, similar to SETLOCALE

[ IN ] >> SETCODEPAGE <number> [ OUT ] << :dwol.server 329 RandomUser <number> [ IN ] >> SETCODEPAGE [ OUT ] << :dwol.server 329 RandomUser <number> GETLOCALE Get the locale info for another user.

[ IN ] >> GETLOCALE RandomUser2 [ OUT ] << :dwol.server 309 RandomUser RandomUser2`4 GETCODEPAGE Get the codepage info for another user.

[ IN ] >> GETCODEPAGE RandomUser2 [ OUT ] << :dwol.server 328 RandomUser RandomUser2`<number> SETOPT 2 numbers that represent the options set in the "My Information" page.

[ IN ] >> SETOPT 17,32 SETOPT [16|17],[32|33]

16 == Find Disabled / 17 == Find Enabled 32 == Page Disabled / 33 == Page Enabled SQUADINFO Get name of a clan, from clanid number if param is "0", then we want the name of my clan. No Clan:

[ IN ] >> SQUADINFO 0 [ OUT ] << :dwol.server 439 RandomUser :ID Doesn't exist. Clan:

[ IN ] >> SQUADINFO 1 [ OUT ] << :dwol.server 258 RandomUser 1`Administrators Clan`[-admin-]`0`0`1`0`0`0`0`0`0`0`x`x`x

server.name 258 <NickName> <ClanID>`<ClanName>`<ClanTag>`<Rank?>`<No Idea>

Code from dWOL: TempStr := inttostr(ClanDetails.ID)+'`'+ClanDetails.Name+'`'+ClanDetails.Tag+'`'+inttostr(ClanDetails.Rank)+'`0`1`0`0`0'; Send(':'+Config.MyName+' 358 '+Info.Username+' '+TempStr+'`0`0`0`0`x`x`x');

The **'`0`0`0`0`x`x`x'** at the end never seems to change on XWIS, the others do. Not sure about the meanings. GETBUDDY List of Buddies. No Buddy:

[ IN ] >> GETBUDDY [ OUT ] << :dwol.server 333 RandomUser Buddies:

[ IN ] >> GETBUDDY [ OUT ] << :dwol.server 333 RandomUser OtherUser`TestUser ADDBUDDY Add a buddy to buddy list:

[ IN ] >> ADDBUDDY SomeGuy [ OUT ] << :dwol.server 334 RandomUser SomeGuy DELBUDDY Add a buddy to buddy list:

[ IN ] >> DELBUDDY SomeIdiot [ OUT ] << :dwol.server 335 RandomUser SomeIdiot LIST Listing Lobbies:

[ IN ] >> List 41 0 [ OUT ] << :dwol.server 321 RandomUser Channel :Users Name [ OUT ] << :dwol.server 327 RandomUser #Lob_41_1 1 0 2436: [ OUT ] << :dwol.server 323 RandomUser :End of /LIST

dwol.server 327 RandomUser #Lob_41_1 <UserCount> 0 2436:

Listing Games:

[ IN ] >> List 41 41 [ OUT ] << :dwol.server 321 RandomUser Channel :Users Name [ OUT ] << :dwol.server 326 RandomUser #aljassem's_game 2 0 41 0 1 3651424013 128::g14S25,2097731398,0,0,0,TourOfEgypt.MAP [ OUT ] << :dwol.server 326 RandomUser #alo16wo's_game 3 -1 41 0 1 1397326031 128::g15O25,2097731398,0,0,1,wolle-6.yrm [ OUT ] << :dwol.server 326 RandomUser #anam3's_game 3 0 41 0 0 1178229166 128::G16S25,2097731398,3,0,0,TourOfEgypt.MAP [ OUT ] << :dwol.server 326 RandomUser #cky2k2320's_game 2 0 41 0 0 1143047129 128::g12P25,2097731398,0,0,0,kot_gd01.yrm [ OUT ] << :dwol.server 326 RandomUser #colsmc's_game 1 0 41 0 1 1144936745 384::g14P25,2097731398,2,0,0,DESERT~2.YRM [ OUT ] << :dwol.server 326 RandomUser #dylthpil8's_game 6 0 41 0 1 2375561990 128::g16O25,2097731398,0,0,0,XMP17T6.MAP [ OUT ] << :dwol.server 323 RandomUser :End of /LIST

dwol.server 326 RandomUser <NAME> <Players> <N/A> <ListType> <Tourn> <Resolution> <HostIP> <LockStatus>::<TOPIC>

Lock Status

So far I've seen 0, 128 and 384. 384 = Locked, the other 2 both show unlocked. Resolution

0 = no resolution lock. 640 = 640x480 800 = 800x600 1024 = 1024x768 JOIN JOIN #Lob_41_1 zotclot9 used to join a lobby. On join send names/topic

JOINGAME Create a game:

[ IN ] >> JOINGAME #dforce88's_game 1 5 33 3 1 1 6 <Password> [ OUT ] >> :dforce88!UserName@HOST JOINGAME 1 5 33 1 1 1384478942 0 :#dforce88's_game JOINGAME #user's_game <unknown> <MaxPlayers> <ListType> <unknown1> <unknown2> <Tourn> <unknown3> <password> :user!u@h JOINGAME <unknown> <MaxPlayers> <ListType> <unknown2> <Tourn> <IP> <Clan> :#dforce88's_game

Used to join a game

When not creating a game:

[ IN ] >> JOINGAME #dforce88's_game [ OUT ] >> :Dataforce!UserName@HOST JOINGAME 1 5 33 1 1 1384478942 0 :#dforce88's_game Note: <unknown> <MaxPlayers> <ListType> <unknown2> is sent in both cases!!

In both cases a topic and names reply are sent following the joingame acknowledgement

PART

PART #Channel TOPIC TOPIC #user's_game :<Garbage> This needs to be saved, and sent in LIST and On join. Standard IRC Topic Reply

Example Topics:

g14N39,1878366581,0,0,0,ZZZZZZ~1.MPR

g16O25,2097731398,0,0,0,XMP17T6.MAP g16O25,2097731398,0,0,0,XMP17T6.MAP

g12P25,2097731398,0,0,0,XDeadman.MAP g12P25,2097731398,0,0,0,kot_gd01.yrm

g12O25,2097731398,0,0,0,XMP21S2.MAP

g14P25,2097731398,2,0,0,DESERT~2.YRM g14S25,2097731398,0,0,0,TourOfEgypt.MAP

g15O25,2097731398,0,0,1,wolle-6.yrm

G16S25,2097731398,3,0,0,TourOfEgypt.MAP The last part is the map name, the first 2 appear to be version numbers of some sort. Not sure about the middle 3.

GAMEOPT

GAMEOPT #user's_game :<Garbage> GAMEOPT RandomUser :<Garbage> These don't need to be processed, just sent to all clients in the game channel.

STARTG Used to start a game

   //IN> STARTG #DForce88's_game Dataforce,DForce88
   //OUT> Dataforce!u@h STARTG u :DForce88 82.133.120.222 Dataforce 82.133.120.222 :1108556308 1115237380

Last 2 outgoing params are <GameNumber> <Current Time>, the Rest is self explanatory.

PAGE / PRIVMSG Standard IRC PRIVMSG

PRIVMSG User2 :Hi There Page can only be sent if the option allows for it, and has a response code:

dWOL.Server 389 RandomUser User2 1

PRIVMSG has no response code.

QUIT QUIT :Reason FINDUSER

[ IN ] >> FindUser UserThatExists [ OUT ] << :dwol.server 388 RandomUser 0 :#lob_41_1 [ IN ] >> FindUser NonExistant [ OUT ] << :dwol.server 388 RandomUser 1 This should return NonExistant if user has find disabled

FINDUSEREX

[ IN ] >> FindUser UserThatExists [ OUT ] << :dwol.server 398 RandomUser 0 :#lob_41_1,0 [ IN ] >> FindUser NonExistant [ OUT ] << :dwol.server 398 RandomUser 1 Not sure what the ,0 is for, clan maybe?

This should return NonExistant if user has find disabled

Advertisement