;-top XIncludeFile "MatchWin.pb" XIncludeFile "MatchGlob.pb" XIncludeFile "IniFile.pb" ;XIncludeFile "Search.pb" Procedure UpdateObserver() msg.s="" If GetGadgetState(#Observers) msg=check+"O" Else msg=check+"N" EndIf ResetList(User()) PokeS(*Buffer,msg,Len(msg)) While NextElement(User()) If User()\ID SendNetworkData(User()\ID,*Buffer,Len(msg)) EndIf Wend EndProcedure Procedure UpDateUsers() msg.s=check+"P" ResetList(User()) ClearGadgetItemList(#Player_List) While NextElement(User()) AddGadgetItem(#Player_List,-1,User()\name) msg=msg+User()\name+cr Wend If MasterID=0 ResetList(User()) PokeS(*Buffer,msg,Len(msg)) While NextElement(User()) If User()\ID SendNetworkData(User()\ID,*Buffer,Len(msg)) EndIf Wend UpdateObserver() EndIf msg.s=MainPath+GetGadgetText(#SG_Name)+".host" If CreatePreferences(msg) WritePreferenceString("Version",Version) WritePreferenceString("Status","Waiting") WritePreferenceString("MyISP",GetGadgetText(#MyISP)) WritePreferenceString("UserPort",GetGadgetText(#UsePort)) WritePreferenceString("ProxyISP",GetGadgetText(#ProxyISP)) WritePreferenceString("ProxyPort",GetGadgetText(#Gadget_33)) ;WritePreferenceString("Game",GetGadgetText(#SG_Name)) WritePreferenceString("Game",NewGameIni) WritePreferenceString("Player",Str(CountList(User()))) WritePreferenceString("Host",GetGadgetText(#Join_Flag)) temp.s=Trim(GetGadgetText(#Map_Type)) temp=Right(temp,Len(temp)-3) WritePreferenceString("Map",temp) temp.s=Trim(GetGadgetText(#Game_Type)) temp=Right(temp,Len(temp)-3) WritePreferenceString("GameType",temp) ClosePreferences() File\FileToSend=msg File\FileName=GetGadgetText(#SG_Name)+".host" UploadFileHost(@File) EndIf EndProcedure Procedure.l HandleClientWindow(GID.l) reply.l=0 msg.s="" Select GID Case #Send_Chat msg=Trim(GetGadgetText(#Out_Chat)) If Len(msg)>0 msg=MyName+" > "+msg AddGadgetItem(#Chat_List,-1,msg) PokeS(*Buffer,msg,Len(msg)) ;ResetList(user()) ;While NextElement(user()) SendNetworkData(MasterID,*Buffer,Len(msg)) ;Wend SetGadgetText(#Out_Chat,"") ActivateGadget(#Out_Chat) EndIf Case #Bump_Player ; Case #Launch ; Case #Room_Exit CloseWindow(#Window_Chat) reply=1 Case #Clear_Chat ClearGadgetItemList(#Chat_List) EndSelect ProcedureReturn reply EndProcedure Procedure.l HandleHostWindow(GID.l) reply.l=0 msg.s="" Select GID Case #Send_Chat msg=Trim(GetGadgetText(#Out_Chat)) If Len(msg)>0 msg=MyName+" > "+msg AddGadgetItem(#Chat_List,-1,msg) PokeS(*Buffer,msg,Len(msg)) ResetList(user()) While NextElement(user()) If User()\ID SendNetworkData(user()\id,*Buffer,Len(msg)) EndIf Wend SetGadgetText(#Out_Chat,"") ActivateGadget(#Out_Chat) EndIf Case #Bump_Player ; Case #Observers UpdateObserver() Case #Launch ;launch the game and exit this app ;and hope fred does a nice shutdown :) ;check masterlist for path to game ini file OpenPreferences(MainPath+"Masterlst.ini") PreferenceGroup(NewGameIni) gfile.s=ReadPreferenceString("Path","Unknown") ClosePreferences() OpenPreferences(gfile) PreferenceGroup("Specs") gfile=GetPathPart(gfile)+ReadPreferenceString("EXE","Unknown.exe") ClosePreferences() tf$=Trim(GetGadgetText(#Total_Flags)) If Len(tf$) tf$=" "+tf$ EndIf If RunProgram(gfile,MyName+" "+GetGadgetText(#MyISP)+tf$,"") ;send message to all users to start the game msg=check+"S" PokeS(*Buffer,msg,Len(msg)) ResetList(User()) While NextElement(User()) If User()\ID SendNetworkData(User()\ID,*buffer,Len(msg)) Delay(1) EndIf Wend Delay(100) ;send again just to be sure ResetList(User()) While NextElement(User()) If User()\ID SendNetworkData(User()\ID,*buffer,Len(msg)) Delay(1) EndIf Wend Delay(100) If GetGadgetState(#Observers) msg.s=MainPath+GetGadgetText(#SG_Name)+".host" If CreatePreferences(msg) WritePreferenceString("Version",Version) WritePreferenceString("Status","Started") WritePreferenceString("MyISP",GetGadgetText(#MyISP)) WritePreferenceString("UserPort",GetGadgetText(#UsePort)) WritePreferenceString("ProxyISP",GetGadgetText(#ProxyISP)) WritePreferenceString("ProxyPort",GetGadgetText(#Gadget_33)) ;WritePreferenceString("Game",GetGadgetText(#SG_Name)) WritePreferenceString("Game",NewGameIni) WritePreferenceString("Player",Str(CountList(User()))) WritePreferenceString("Host",GetGadgetText(#Join_Flag)) temp.s=Trim(GetGadgetText(#Map_Type)) temp=Right(temp,Len(temp)-3) WritePreferenceString("Map",temp) temp.s=Trim(GetGadgetText(#Game_Type)) temp=Right(temp,Len(temp)-3) WritePreferenceString("GameType",temp) ClosePreferences() File\FileToSend=msg File\FileName=GetGadgetText(#SG_Name)+".host" UploadFileHost(@File) EndIf FTPDisconnect(@File) Else ;remove file from FTP site File\FileName=GetGadgetText(#SG_Name)+".host" KillHostFile(@File) EndIf End Else MessageRequester("Launch Error","Program "+gfile+" does not exist",#MB_ICONSTOP) EndIf Case #Room_Exit CloseWindow(#Window_Chat) reply=1 Case #Clear_Chat ClearGadgetItemList(#Chat_List) EndSelect ProcedureReturn reply EndProcedure Procedure HandleServer() Select NetworkServerEvent() Case 1 ;new client AddElement(User()) User()\id=NetworkClientID() user()\time=gettickcount_() Case 2 ;data cid.l=NetworkClientID() length.l=ReceiveNetworkData(cid,*Buffer,#maxbuffer) msg.s=PeekS(*Buffer,length) If Left(msg,1)=check ;special message If Mid(msg,2,1)="L" ;login new player ResetList(User()) While NextElement(User()) If User()\ID=CID User()\name=Right(msg,length-2) msg="** "+User()\Name+" has joined chat **" UpdateUsers() EndIf Wend AddGadgetItem(#Chat_List,-1,msg) EndIf Else AddGadgetItem(#Chat_List,-1,msg) ResetList(User()) PokeS(*Buffer,msg,Len(msg)) While NextElement(User()) If User()\ID<>cid SendNetworkData(user()\id,*Buffer,Len(msg)) EndIf Wend EndIf Case 3 ;file.... not supported Case 4 ;client left cid.l=NetworkClientID() While NextElement(User()) If User()\ID=CID ;User()\name=Right(msg,length-2) msg="** "+User()\Name+" has left chat **" CloseNetworkConnection(User()\ID) DeleteElement(User()) EndIf Wend AddGadgetItem(#Chat_List,-1,msg) UpdateUsers() EndSelect EndProcedure Procedure HandleClient() Select NetworkClientEvent(MasterID) Case 1 ;new client ..... server only ;AddElement(User()) ;User()\id=NetworkClientID() ;user()\time=gettickcount_() Case 2 ;data ;cid.l=NetworkClientID() length.l=ReceiveNetworkData(MasterID,*Buffer,#maxbuffer) msg.s=PeekS(*Buffer,length) If Left(msg,1)=check ;special message If Mid(msg,2,1)="P" ;recieve a new player list ClearList(User()) ClearGadgetItemList(#Player_List) startpos.l=3 length.l=1 quit.l=0 AddElement(User()) Repeat If Mid(msg,startpos+length,1)=cr User()\name=Mid(msg,startpos,length) AddGadgetItem(#Player_List,-1,User()\Name) startpos=startpos+length+1 length=1 If startpos>Len(msg) quit=1 Else AddElement(User()) EndIf Else If startpos+length>Len(msg) quit=1 User()\name=Mid(msg,startpos,length) AddGadgetItem(#Player_List,-1,User()\Name) Else length+1 EndIf EndIf Until quit EndIf If Mid(msg,2,1)="S" ;start the game.... OpenPreferences(MainPath+SelGame+".host") isp.s=ReadPreferenceString("MyISP","") cflag.s=Trim(ReadPreferenceString("HOST","")) If Len(cflag) cflag=cflag+" "+cflag EndIf cflag=Left(cflag,2)+" "+Left(GetGadgetText(#JD_Opts),2) gfile.s=ReadPreferenceString("Game","") ClosePreferences() OpenPreferences(MainPath+"Masterlst.ini") PreferenceGroup(gfile) gfile=ReadPreferenceString("PATH","") ClosePreferences() OpenPreferences(gfile) PreferenceGroup("Specs") gfile=GetPathPart(gfile)+ReadPreferenceString("EXE","") ClosePreferences() If RunProgram(gfile,MyName+" "+isp+" "+cflag,"") End Else MessageRequester("Launch Error","Program "+gfile+" does not exist",#MB_ICONSTOP) EndIf EndIf If Mid(msg,2,1)="O" SetGadgetState(#Observers,1) EndIf If Mid(msg,2,1)="N" SetGadgetState(#Observers,0) EndIf Else AddGadgetItem(#Chat_List,-1,msg) EndIf Case 3 ;file.... not supported Case 4 ;client left........... server only ;cid.l=NetworkClientID() ;While NextElement(User()) ; If User()\ID=CID ; User()\name=Right(msg,length-2) ; msg="** "+User()\Name+" has left chat **" ; CloseNetworkConnection(User()\ID) ; DeleteElement(User()) ; EndIf ;Wend ;UpdateUsers() EndSelect EndProcedure Procedure BeginChat(mode.l) *Buffer=AllocateMemory(0,#maxbuffer,0) check=Chr(159) cr=Chr(10) ClearList(User()) quit.l=0 ;mode=1 is host ;mode=0 is joining player If Mode If CreateNetworkServer(1667) MasterID=0 Open_Window_Chat() AddKeyboardShortcut(#Window_Chat,#PB_Shortcut_Return,#Send_Chat) ActivateGadget(#Out_Chat) AddElement(User()) User()\name=GetGadgetText(#SG_Player) AddGadgetItem(#Player_List,-1,User()\name) MyName=User()\name Repeat SetForground() If File\ThreadActive ;the thread ended, check for errors If File\SendFailed MessageRequester("FTP Upload Error","If no users in room, recommend exit and try again",#MB_ICONSTOP) ;quit=1 ;CloseWindow(#Window_Chat) EndIf File\ThreadActive=0 EndIf Select WindowEvent() Case #PB_EventCloseWindow quit=1 Case #PB_EventGadget quit=HandleHostWindow(EventMenuID()) Case #PB_EventMenu quit=HandleHostWindow(EventMenuID()) Default HandleServer() EndSelect Delay(1) Until quit CloseNetworkServer() Else MessageRequester("Server Error","Unable to create server",#MB_ICONSTOP) EndIf Else ;IniFile=File\FileName If OpenPreferences(MainPath+SelGame+".host") HostISP.s=ReadPreferenceString("MyISP","") MasterID=OpenNetworkConnection(HostISP,1667) If MasterID Open_Window_Chat() AddKeyboardShortcut(#Window_Chat,#PB_Shortcut_Return,#Send_Chat) ActivateGadget(#Out_Chat) AddElement(User()) User()\name=InputRequester("User Name","Please enter your gaming name","YourName") MyName=user()\name FreeGadget(#Bump_Player) FreeGadget(#Launch) DisableGadget(#Observers,1) ;login to server msg.s=check+"L"+MyName PokeS(*Buffer,msg,Len(msg)) SendNetworkData(MasterID,*Buffer,Len(msg)) Delay(1) Repeat SetForground() If File\ThreadActive ;the thread ended, check for errors If File\RecvFailed MessageRequester("FTP Download Error","Unable to download updated file from host.",#MB_ICONSTOP) ;quit=1 ;CloseWindow(#Window_Chat) EndIf File\ThreadActive=0 EndIf Select WindowEvent() Case #PB_EventCloseWindow quit=1 Case #PB_EventGadget quit=HandleClientWindow(EventGadgetID()) Case #PB_EventMenu quit=HandleClientWindow(EventMenuID()) Default HandleClient() EndSelect Delay(1) Until quit CloseNetworkConnection(MasterID) Else msg$="Unable to connect to chat server, do you wish to launch game now?" If MessageRequester("Connection Error",msg$,#MB_ICONQUESTION+#PB_MessageRequester_YESNO)=6 ;start the game.... OpenPreferences(MainPath+SelGame+".host") isp.s=ReadPreferenceString("MyISP","") cflag.s=Trim(ReadPreferenceString("HOST","")) If Len(cflag) cflag=cflag+" "+cflag EndIf cflag=Left(cflag,2)+" "+Left(GetGadgetText(#JD_Opts),2) gfile.s=ReadPreferenceString("Game","") ClosePreferences() OpenPreferences(MainPath+"Masterlst.ini") PreferenceGroup(gfile) gfile=ReadPreferenceString("PATH","") ClosePreferences() OpenPreferences(gfile) PreferenceGroup("Specs") gfile=GetPathPart(gfile)+ReadPreferenceString("EXE","") ClosePreferences() If RunProgram(gfile,MyName+" "+isp+cflag,"") End Else MessageRequester("Launch Error","Program "+gfile+" does not exist",#MB_ICONSTOP) EndIf EndIf EndIf Else MessageRequester("Client Error","Game "+SelGame+" is unsupported",#MB_ICONSTOP) EndIf EndIf FreeMemory(0) ClearList(User()) EndProcedure ; ExecutableFormat=Windows ; EOF