Before DarkNet 2.0, I used to be able to call mn Poll Connect at regular intervals as part of my main game loop.
Now every time it hits mn Poll Connect, I always get the error "An error occurred in mn Poll Connect whilst polling on the status of a connection attempt, connection process has not begun at line 410 of file "NetInstanceClient.cpp". Error code 0. Version "Release v2.0". Would you like to exit?"
The problem is that I KNOW the connection process has started AND finished because the client and server have already begun sending data back and forth -- the logs on the server show that it has received the client connection and already send and received data


Is mn Poll Connect no longer supported, or does it work differently now?
This used to work just fine (the profile additions were added to support 2.0's new profile requirement, but everything else is the same):
Main Module
sync on : sync rate 0
REM SYSTEM HANDLERS
gosub systemSharedSetup
gosub systemClientSetup
gosub debugSharedSetup
gosub debugClientSetup
debugStart()
REM DATA HANDLERS
gosub dataClientSetup
gosub dataSharedSetup
dataSharedLoadAllTables()
dataClientCreateRPGIDLookup()
gosub commandSharedSetup
REM HARDWARE HANDLERS
gosub netSharedSetup
gosub netClientSetup
gosub keyboardSharedSetup
gosub keyboardClientSetup
gosub mouseClientSetup
gosub cameraClientSetup
REM STARTUP FUNCTIONS HERE
netClientStart()
netClientConnectStart()
REM ASSET HANDLERS HERE
gosub mediaSharedSetup
gosub mediaClientSetup
gosub collisionSharedSetup
gosub collisionClientSetup
gosub materialClientSetup
gosub imageClientSetup
gosub effectClientSetup
gosub meshSharedSetup
gosub meshClientSetup
gosub skyClientSetup
gosub terrainClientSetup
REM PLAYER HANDLERS HERE
gosub playerSharedSetup
gosub playerClientSetup
REM GUI HANDLERS
gosub guiClientSetup
REM PARSE THE COMMAND LINE
commandSharedParseStartup()
repeat
systemSharedUpdateGameTime()
systemDragMode = 0
if (systemMode && SYSTEM_MODE_GUI)
mouseClientGetMove()
mouseClientProcessClicks()
keyboardClientPoll()
guiClientUpdateGUI()
endif
if (systemMode && SYSTEM_MODE_AV_SELECT)
meshClientAnimate(tidPlayer, "idle1", 1)
meshClientRegulate(tidPlayer)
endif
if (systemMode && SYSTEM_MODE_LOGON_COMPLETE)
playerClientControl()
cameraClientFollow()
endif
netClientMaintain()
if (systemMode && SYSTEM_MODE_TERRAIN)
terrainClientUpdate()
endif
sync
until (systemMode && SYSTEM_MODE_QUITTING) <> 0
REM STOP FUNCTION HERE
terrainClientUnload()
skyClientUnload()
netClientStop()
dataSharedSaveAllTables()
debugStop()
NetClient Module
REM *** Include File: modules\netClient.dba ***
REM Created: 7/4/2010 10:55:22 AM
REM
REM Included in Project: C:\Program Files\The Game Creators\Dark Basic Professional\Projects\worldofomen\worldofomen.dbpro
REM
netClientSetup:
NET_SERVER_NAME = dataSharedGetField("netClient", "netServerName", NET_SERVER_NAME_DEFAULT, DATA_CREATE)
global netClientCurrentChannel as string
netClientCurrentChannel = dataSharedGetField("netClient", "netClientCurrentChannel", "BROADCAST", DATA_CREATE)
global netTickerUpdate as integer
netTickerUpdate = systemSharedGetFree(SYSTEM_TYPE_TICKER, SYSTEM_SEARCH_FAST)
MAKE TICKER netTickerUpdate, NET_UDP_UPDATE_INTERVAL
global netTickerHeartbeat as integer
netTickerHeartbeat = systemSharedGetFree(SYSTEM_TYPE_TICKER, SYSTEM_SEARCH_FAST)
MAKE TICKER netTickerHeartbeat, NET_UDP_HEARTBEAT_INTERVAL
global netTickerReconnect as integer
netTickerReconnect = systemSharedGetFree(SYSTEM_TYPE_TICKER, SYSTEM_SEARCH_FAST)
MAKE TICKER netTickerReconnect, NET_TCP_RECONNECT_INTERVAL
global netTickSendNow as boolean
global netTickConnectNow as boolean
global netMaxUDPClients as integer
global netMaxUDPOperations as integer
global netSessionKey$ as string
global netUpdateMode as integer
global netClientUsername$ as string
global netClientPassword$ as string
global netClientAvatarname$ as string
`encryptSetKey(systemGameTitle$)
rem not yet
return
function netClientCreateProfile()
REM DARKNET 2.0
myProfile = mn create instance profile()
endfunction myProfile
function netClientStart()
mn start 1, 0
mn Toggle Error Mode 1
NET_PROFILE_STANDARD = netClientCreateProfile()
if NET_SERVER_NAME = NET_SERVER_NAME_DEFAULT
debugWrite(DEBUGWARN,"Server name not set, attempting search...")
REM NAME WAS NOT SET, SEARCH AND UPDATE
i = intval(dataSharedGetField("netClient", "netSearchMode", "1",1))
select i
case 0:
REM DO NOT SEARCH
debugWrite(DEBUGWARN,"Search mode set to 0, default server name will be used.")
endcase
case 1:
REM SEARCH LAN
debugWrite(DEBUGINFO,"Search mode set to 1, searching on LAN...")
i$ = netSharedGetLANIP()
if i$ = ""
debugWrite(DEBUGERROR,"NO VALID LAN INTERFACES FOUND. FORCING QUIT.")
systemSharedGameModeAdd(SYSTEM_MODE_QUITTING)
else
NET_SERVER_NAME = i$
dataSharedUpdateField("netClient","netServerName",NET_SERVER_NAME)
endif
endcase
case 2:
REM SEARCH WAN
debugWrite(DEBUGINFO,"Search mode set to 2, searching on WAN...")
i$ = netSharedGetWANIP()
if i$ = ""
debugWrite(DEBUGERROR,"NO VALID WAN INTERFACES FOUND. FORCING QUIT.")
systemSharedGameModeAdd(SYSTEM_MODE_QUITTING)
else
NET_SERVER_NAME = i$
dataSharedUpdateField("netClient","netServerName",NET_SERVER_NAME)
endif
endcase
endselect
endif
endfunction
function netClientStop()
mn Finish -1
endfunction
function netClientConnectStart()
debugWrite(DEBUGINFO,"CONNECT START: " + NET_SERVER_NAME + ":" + str$(NET_SERVER_PORT) + ", Profile: " + str$(NET_PROFILE_STANDARD))
myConnect = mn Connect(0,NET_SERVER_NAME,NET_SERVER_PORT,NET_SERVER_NAME,NET_SERVER_PORT,(NET_TIMEOUT_SECONDS * 1000),1,NET_PROFILE_STANDARD)
endfunction
function netClientConnectStop()
mn Stop Connect 0
if (systemMode && SYSTEM_MODE_NET_TCP)
debugWrite(DEBUGERROR,"Net Connect timeout or error connecting to server.")
endif
systemSharedGameModeRemove(SYSTEM_MODE_NET_TCP)
endfunction
function netClientMaintain()
local i as integer
local j as integer
local pollStatus as integer
if (systemMode && SYSTEM_MODE_NET_TCP) = 0
REM WE HAVE NEVER CONNNECTED BEFORE
pollStatus = mn poll connect(0)
select pollStatus
case -1:
REM ERROR
netClientConnectStop()
netClientConnectStart()
debugWrite(DEBUGERROR,"Net Connect Error: " + NET_SERVER_NAME + ":" + str$(NET_SERVER_PORT) + ":" + str$(NET_TIMEOUT_SECONDS))
endcase
case 0:
REM TIMEOUT
netClientConnectStop()
netClientConnectStart()
debugWrite(DEBUGERROR,"Net Connect Timeout.")
endcase
case 1:
REM SUCCESSFUL
systemSharedGameModeAdd(SYSTEM_MODE_NET_TCP)
debugWrite(DEBUGINFO,"Net Connect Successful. Mode TCP Added.")
`guiHideWindow("windowMessageBox")
netMaxUDPClients = mn Get Max Clients(0)
debugWrite(DEBUGINFO,"Net Max UDP Clients set to " + str$(netMaxUDPClients))
netMaxUDPOperations = mn Get Max Operations(0)
debugWrite(DEBUGINFO,"Net Max UDP Operations set to " + str$(netMaxUDPOperations))
endcase
case 2:
REM CONNECT IS STILL IN PROGRESS
REM LET IT KEEP TRYING UNTIL ITS
REM TIMEOUT VALUE
if TICKER(netTickerReconnect,1) = 1 or netTickConnectNow = 1
debugWrite(DEBUGINFO,"Attempting to connect to server...")
endif
endcase
endselect
endif
if (systemMode && SYSTEM_MODE_NET_TCP)
REM WE HAVE CONNECTED AT LEAST ONCE
if TICKER(netTickerReconnect,1) = 1 or netTickConnectNow = 1
netTickConnectNow = 0
if mn Client Connected(0,0) < 1
debugWrite(DEBUGINFO,"Net Disconnected.")
`areaUnload()
`playerUnload(tidPlayer)
systemSharedGameModeRemove(SYSTEM_MODE_NET_TCP)
netClientStop()
netClientStart()
netClientConnectStart()
guiClientSwitchToWindow("windowLogon")
msg$ = "Lost connection to server... attempting to reconnect. Press Cancel to stop and exit."
guiClientMessageBoxShow(msg$,2,"","Cancel","","","/exit","")
endif
endif
endif
REM SEND UPDATES
if (systemMode && SYSTEM_MODE_NET_TCP) <> 0 AND (systemMode && SYSTEM_MODE_LOGON_COMPLETE) <> 0
if ( (TICKER(netTickerUpdate,1)=1 and netUpdateMode>0) or netTickSendNow=1 or TICKER(netTickerHeartbeat,1)=1 )
netTickSendNow = 0
netUpdateMode = 0
netClientMove()
endif
endif
REM RECEIVE UPDATES
if (systemMode && SYSTEM_MODE_NET_TCP)
TcpPackets = mn Recv TCP(0,RecvPacket,0)
if TcpPackets > 0
netClientParseTCP()
endif
REM ONLY PARSE UDP DATA WHEN THE PLAYER IS IN-WORLD
REM HERE WE MUST LOOP THROUGH ALL CLIENT PORTS BECAUSE
REM DATA COULD BE WAITING ON ANY PORT
if (systemMode && SYSTEM_MODE_LOGON_COMPLETE)
for i = 0 to (netMaxUDPOperations - 1)
for j = 0 to netMaxUDPClients
REM A ZERO CLIENT IS THE SERVER
UdpPackets = mn Recv UDP(0,RecvPacket,j,i)
if UdpPackets > 0
netClientParseUDP(j,i)
`debugWrite(DEBUGINFO,"UDP message " + str$(i) + " received on channel " + str$(j))
endif
next j
next i
endif
endif
endfunction
function netClientSendChat(myChannel$,message$)
message$ = keyboardSharedSanitize(message$)
bytes = NET_HEADER_BYTES
inc bytes, len(myChannel$)
inc bytes, len(message$)
REM CHAT WILL NEED TO BE ENCRYPTED ON
REM CHANNELS THAT ARE MARKED PRIVATE
netSharedAddHeader(NETC_CHAT,bytes)
mn Add string SendPacket, myChannel$, 0, 1
mn Add String SendPacket, message$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
endfunction
function netClientSendCommand(cmd$)
cmd$ = keyboardSharedSanitize(cmd$)
bytes = NET_HEADER_BYTES
inc bytes, len(cmd$)
netSharedAddHeader(NETC_COMMAND,bytes)
REM COMMAND MESSAGES WILL ALWAYS
REM BE ENCRYPTED. THIS WILL BE
REM DONE VERY SOON.
mn Add String SendPacket, cmd$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
endfunction
function netClientChangeChannels(operationID as integer, channel$ as string)
channel$ = keyboardSharedSanitize(channel$)
bytes = NET_HEADER_BYTES
inc bytes, len(channel$)
netSharedAddHeader(operationID,bytes)
mn Add String SendPacket, channel$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
endfunction
function netClientSendCreateAccount(accountName$ as string, password$ as string)
bytes = NET_HEADER_BYTES
inc bytes, len(accountName$)
inc bytes, len(password$)
netSharedAddHeader(NETC_CREATE_ACCOUNT,bytes)
mn Add String SendPacket, accountName$, 0, 1 : accountName$ = ""
mn Add String SendPacket, password$, 0, 1 : password$ = ""
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO, "Sent Create Account Request for " + accountName$)
endfunction
function netClientSendLogonAlpha(accountName$ as string)
bytes = NET_HEADER_BYTES
encryptSetKey(systemGameTitle$)
dat1$ = EncryptString(accountName$) : inc bytes, len(dat1$)
netSharedAddHeader(NETC_LOGON_ALPHA,bytes)
mn Add String SendPacket, dat1$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
`debugWrite(DEBUGINFO,"Sent NETC_LOGON_ALPHA")
endfunction
function netClientSendLogonBeta(testKey$ as string,accountName$ as string)
bytes = NET_HEADER_BYTES
encryptSetKey(testKey$)
dat1$ = EncryptString(accountName$) : inc bytes, len(dat1$)
netSharedAddHeader(NETC_LOGON_BETA, bytes)
mn Add String SendPacket, dat1$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
`debugWrite(DEBUGINFO,"Sent NETC_LOGON_BETA")
endfunction
function netClientSendAvatarList()
REM MUST SEND ENCYPTED ACCOUNTNAME
REM USING UNIQUE SESSION KEY
bytes = NET_HEADER_BYTES
accountName$ = dataSharedGetField( DATA_TABLE_INPUT, "inputLogonAccountName", DATA_KEY_UNDEFINED, DATA_NO_CREATE)
dat1$ = EncryptString(accountName$) : inc bytes, len(dat1$)
netSharedAddHeader(NETC_AVATAR_LIST, bytes)
mn Add String SendPacket, dat1$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO,"Sent NETC_AVATAR_LIST")
endfunction
function netClientSendAvatarDetailsSelf(avatarName$ as string)
REM MUST SEND ENCYPTED ACCOUNTNAME
REM USING UNIQUE SESSION KEY
bytes = NET_HEADER_BYTES
inc bytes, len(avatarName$)
netSharedAddHeader(NETC_AVATAR_DETAILS_SELF, bytes)
mn Add String SendPacket, avatarName$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO,"Sent NETC_AVATAR_DETAILS_SELF")
endfunction
function netClientSendManifestComplete()
REM TELL THE SERVER WE ARE DONE UPDATING MANIFEST
bytes = NET_HEADER_BYTES
netSharedAddHeader(NETC_MANIFEST, bytes)
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO,"Sent NETC_MANIFEST")
endfunction
function netClientSendAssetIDRequest(path$ as string)
REM REQUEST AN RPGID FROM THE SERVER FOR AN ASSET
bytes = NET_HEADER_BYTES
dat1$ = path$: inc bytes, len(dat1$)
netSharedAddHeader(NETC_ASSETID, bytes)
mn Add String SendPacket, dat1$, 0, 1
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO,"Sent NETC_ASSETID for " + path$)
endfunction
function netClientSendCreateAvatarRequest()
local sendrequest as boolean
sendrequest = 1
REM FIRST COLLECT BASE DATA
myclass = intval(dataSharedGetField(DATA_TABLE_INPUT, "inputCreateAvatarClass", "1", DATA_CREATE))
mysource = intval(dataSharedGetField(DATA_TABLE_INPUT, "inputCreateAvatarPowerSource", "0", DATA_CREATE))
myname$ = dataSharedGetField(DATA_TABLE_INPUT, "inputCreateAvatarName", "", DATA_CREATE)
REM SECOND COLLECT THE MORPHS
mymorphlist$ = dataSharedGetField(DATA_TABLE_INPUT, "inputCreateAvatarMorphList", "", DATA_CREATE)
split string mymorphlist$, DATA_ARGSEP
mymorphcount = split count()
dim morph(mymorphcount) as integer
for i = 1 to mymorphcount
morph(i) = intval(get split word$(i))
next i
REM TEXTURES WILL GO HERE
REM OTHER MODS WILL GO HERE
REM LOCAL NAME VALIDATION
if myname$ = DATA_KEY_UNDEFINED OR myname$="" or len(myname$) < 6
guiClientMessageBoxShow("Avatar creation failed. Avatar names must be at least 6 characters long.",2,"","OK","","","/hidewindow\windowMessageBox","")
sendrequest = 0
endif
if sendrequest = 1
bytes = NET_HEADER_BYTES
inc bytes, 12
inc bytes, len(myname$)
netSharedAddHeader(NETC_CREATE_AVATAR, bytes)
mn Add Int SendPacket, myclass
mn Add Int SendPacket, mysource
mn Add String SendPacket, myname$, 0, 1
mn Add Int SendPacket, mymorphcount
for i = 1 to mymorphcount
mn Add Int SendPacket, morph(i)
next i
mn Send TCP 0,SendPacket,0,0,1
debugWrite(DEBUGINFO,"Sent NETC_CREATE_AVATAR for " + myname$)
endif
endfunction sendrequest
function netClientParseTCP()
length = mn Get Int(RecvPacket)
time = mn Get Int(RecvPacket)
msgID = mn Get Int(RecvPacket)
REM SKIPPING THE SANITY CHECKS FOR NOW
select msgID
case NETS_CHAT
channel$ = mn Get String(RecvPacket,0,1)
message$ = mn Get String(RecvPacket,0,1)
message$ = "[" + channel$ + "] " + message$
message$ = keyboardSharedSanitize(message$)
REM TURN ON CHAT WHEN WE RECEIVE A MESSAGE
REM ON A CHANNEL WE ARE LISTENING TO
systemSharedGameModeAdd(SYSTEM_MODE_CHAT_ACTIVE)
guiClientUpdateChatRcv(message$)
endcase
case NETS_CREATE_ACCOUNT
REM SERVER IS TELLING US THAT WE SUCCESSFULLY
REM CREATED AN ACCOUNT
guiClientSwitchtoWindow("windowLogon")
guiClientMessageBoxShow("Account creation successful. You can now logon using the accountname and password you just created.",2,"","OK","","","/hidewindow\windowMessageBox","")
endcase
case NETS_LOGON_ALPHA
REM SERVER IS SENDING BACK A TEST PACKET
REM FOR US TO DECRYPT TO SEE IF WE KNOW
REM THE PASSWORD FOR THE ACCOUNT
`debugWrite(DEBUGINFO,"NETS_LOGON_ALPHA received.")
accountName$ = dataSharedGetField( DATA_TABLE_INPUT, "inputLogonAccountName", DATA_KEY_UNDEFINED, DATA_NO_CREATE)
password$ = dataSharedGetField( DATA_TABLE_INPUT, "inputLogonPassword", DATA_KEY_UNDEFINED, DATA_NO_CREATE)
encryptSetKey(password$ + systemGameTitle$)
testKey$ = DecryptString(mn Get String(RecvPacket,0,1))
netClientSendLogonBeta(testKey$, accountName$)
endcase
case NETS_LOGON_BETA
REM SERVER HAS ACCEPTED OUR TEST PACKET
REM AND IS SENDING US OUR UNIQUE KEY FOR
REM THIS GAME SESSION - LOGIN IS COMPLETE
debugWrite(DEBUGINFO,"LOGIN SUCCESS")
keySession$ = DecryptString(mn Get String(RecvPacket,0,1))
encryptSetKey(keySession$)
netClientSendAvatarList()
endcase
case NETS_AVATAR_LIST
REM SERVER IS SENDING AVATAR LIST
REM EXTRACT NAMES AND POPULATE GUI DATA TABLE
REM DYNAMICALLY CONSTRUCT BOTH THE avatarnameX
REM AND switchavatarX RECORDS, AND THEN SWITCH TO
REM THE CHARACTER SELECTION WINDOW
myAvatarList$ = mn Get String(RecvPacket,0,1)
debugWrite(DEBUGINFO,"Avatar list received: " + myAvatarList$)
split string myAvatarList$, DATA_ARGSEP
for i = 1 to split count()
myAvatarName$ = get split word$(i)
guiClientSetGUIDataField("avatarname"+str$(i), myAvatarName$)
guiClientSetGUIDataField("switchavatar"+str$(i), ";/deletelocalplayer;/switchavatar\"+myAvatarName$)
next i
guiClientSwitchToWindow("windowSelectAvatar")
endcase
case NETS_MANIFEST
REM SERVER IS TELLING US TO UPDATE OUR LIBRARY
debugWrite(DEBUGINFO,"NETS_MANIFEST received")
mediaClientRegisterNew()
wait 1000
REM TELL THE SERVER WE ARE DONE UPDATING LIBRARY
netClientSendManifestComplete()
endcase
case NETS_ASSETID
REM SERVER IS RESPONDING TO AN RPGID
REM REQUEST FOR A LIBRARY ASSET
assetID = mn Get Int(RecvPacket)
assetPath$ = mn Get String(RecvPacket,0,1)
dataSharedUpdateField(DATA_TABLE_LIBRARY, str$(assetID), assetPath$)
debugWrite(DEBUGINFO,"Asset RPGID for received for " + assetPath$ + " : " + str$(assetID))
endcase
case NETS_SWITCH_WINDOW
REM SERVER IS FORCING A GAME WINDOW CHANGE
windowName$ = mn Get String(RecvPacket,0,1)
guiClientSwitchToWindow(windowName$)
systemSharedGameModeAdd(SYSTEM_MODE_GUI)
debugWrite(DEBUGINFO,"NETS_SWITCH_WINDOW received for " + windowName$)
endcase
case NETS_CREATE_AVATAR
REM SERVER IS TELLING CLIENT THAT AN AVATAR
REM CREATION WAS SUCCESSFUL, UPDATE AVATAR LIST
guiClientMessageBoxShow("Avatar creation successful.",2,"","OK","","","/hidewindow\windowMessageBox;;/killwindow\windowSelectAvatar;/getavatarlist","")
endcase
case NETS_AVATAR_DETAILS_SELF
REM SERVER IS SENDING BACK tidPlayer AVATAR DETAILS
myavatarid = mn Get Int(RecvPacket)
myavatarName$ = mn Get String(RecvPacket,0,1)
myclass = mn Get Int(RecvPacket)
mypowersource = mn Get Int(RecvPacket)
mymeshid = mn Get Int(RecvPacket)
mymorphcount = mn Get Int(RecvPacket)
mytid = playerClientCreate(myavatarid, mymeshid)
tidPlayer = mytid
dataSharedUpdateFieldFast(mytid,"avatarid",str$(myavatarid))
dataSharedUpdateFieldFast(mytid,"avatarname",myavatarName$)
dataSharedUpdateFieldFast(mytid,"class",str$(myclass))
dataSharedUpdateFieldFast(mytid,"powersource",str$(mypowersource))
dataSharedUpdateFieldFast(mytid,"meshid",str$(mymeshid))
dataSharedUpdateFieldFast(mytid,"morphcount",str$(mymorphcount))
mydbpid = intval(dataSharedGetFieldFast(mytid,"dbpid"))
cameraClientPaperDoll(mydbpid)
DATA_NOSAVE_TABLES = systemSharedFieldAdd(DATA_NOSAVE_TABLES,str$(myavatarid),DATA_ARGSEP)
for i = 1 to mymorphcount
mymorphid = mn Get Int(RecvPacket)
meshClientApplyMorphTarget(mytid,mymorphid,MORPH_TYPE_ADD)
next i
REM GET AND APPLY MASKS
REM GET AND APPLY TEXTURES/COLORS
REM GET AND APPLY SHADER
REM MORE MODS WILL BE ADDED HERE LATER
endcase
case NETS_RPGID
REM SERVER IS SENDING BACK THE UNIQUE
REM RPGID OF THE LOCAL PLAYER
myrpgid = mn Get Int(RecvPacket)
mymeshid = mn Get Int(RecvPacket)
debugWrite(DEBUGINFO,"Local Player RPGID received: " + str$(myrpgid))
DATA_NOSAVE_TABLES = systemSharedFieldAdd(DATA_NOSAVE_TABLES,str$(myrpgid),DATA_ARGSEP)
guiClientShowWindow(GUI_WINDOW_MAIN)
systemSharedGameModeAdd(SYSTEM_MODE_LOGON_COMPLETE)
systemSharedGameModeAdd(SYSTEM_MODE_GUI)
endcase
case NETS_CREATE_ACCOUNT_ERROR
guiClientMessageBoxShow("Account creation failed. Account names and passwords must be at least 6 characters long or accountname already in use.",2,"","OK","","","/switchtowindow\windowCreateAccount","")
endcase
case NETS_LOGON_ALPHA_ERROR
guiClientMessageBoxShow("Logon failed. Password is case sensitive. Please try again.",2,"","OK","","","/switchtowindow\windowLogon","")
endcase
case NETS_LOGON_BETA_ERROR
guiClientMessageBoxShow("Logon failed. Password is case sensitive. Please try again.",2,"","OK","","","/switchtowindow\windowLogon","")
endcase
case NETS_CREATE_AVATAR_ERROR
guiClientMessageBoxShow("Avatar creation failed. Avatar name invalid or in use. Please try again.",2,"","OK","","","/hidewindow\windowMessageBox;/showwindow\windowCreateAvatarChasis","")
endcase
endselect
endfunction
function netClientParseUDP(clientID as integer,OperationID as integer)
REM GET UDP MESSAGES
RPGIDRemotePlayer = mn Get Int(RecvPacket)
tidRemotePlayer = dataSharedTableExist(str$(RPGIDRemotePlayer))
if tidRemotePlayer = DATA_FUNCTION_FAIL and RPGIDRemotePlayer <> 0
REM THIS PLAYER IS NEW TO THIS CLIENT
dataSharedUpdateField(str$(RPGIDRemotePlayer),"rpgid",str$(RPGIDRemotePlayer))
playerClientCreate(RPGIDRemotePlayer,1)
REM WE DON'T WANT TO SAVE TABLES FOR
REM THE TEMPORARY DATA USED FOR
REM REMOTE PLAYERS
DATA_NOSAVE_TABLES = systemSharedFieldAdd(DATA_NOSAVE_TABLES,str$(RPGIDRemotePlayer),DATA_ARGSEP)
endif
if tidRemotePlayer <> DATA_FUNCTION_FAIL
select OperationID
case NETS_MOVE
dataSharedUpdateFieldFast(tidRemotePlayer,"posx",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"posy",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"posz",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"roty",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"attarget","0")
endcase
case NETS_JUMP
dataSharedUpdateFieldFast(tidRemotePlayer,"jumpx",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"jumpy",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"jumpz",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"jumpry",str$(mn Get Float(RecvPacket)))
dataSharedUpdateFieldFast(tidRemotePlayer,"jumpready","1")
dataSharedUpdateFieldFast(tidRemotePlayer,"attarget","0")
endcase
endselect
endif
endfunction
function netClientMove()
if tidPlayer < 1 then exitfunction
mydbpid = intval(dataSharedGetFieldFast(tidPlayer, "dbpid"))
if mydbpid = 0 then exitfunction
if object exist(mydbpid) = 0 then exitfunction
mn Clear Packet SendPacket
mn Add Int SendPacket, NETC_MOVE
mn Add Int SendPacket, intval(dataSharedGetFieldFast(tidPlayer,"rpgid"))
mn Add Float SendPacket, object position x(mydbpid)
mn Add Float SendPacket, object position y(mydbpid)
mn Add Float SendPacket, object position z(mydbpid)
mn Add Float SendPacket, object angle y(mydbpid)
mn Send UDP 0, SendPacket, NULL, 0, 1
`debugWrite(DEBUGINFO,"Sent Movement Update")
endfunction
