netpanzer-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netPanzer-CVS] netpanzer/src/NetPanzer Interfaces/PlayerGameMa...


From: Hankin Chick
Subject: [netPanzer-CVS] netpanzer/src/NetPanzer Interfaces/PlayerGameMa...
Date: Mon, 17 Nov 2003 08:14:32 -0500

CVSROOT:        /cvsroot/netpanzer
Module name:    netpanzer
Branch:         
Changes by:     Hankin Chick <address@hidden>   03/11/17 08:14:32

Modified files:
        src/NetPanzer/Interfaces: PlayerGameManager.cpp 
        src/NetPanzer/Views/MainMenu/Multi: GameServerList.hpp 
                                            IRCLobby.cpp IRCLobby.hpp 
                                            IRCLobbyView.cpp 
                                            IRCLobbyView.hpp 
                                            PlayerNameView.cpp 
                                            PlayerNameView.hpp 

Log message:
        PING/PONG the irc server every 2mins.
        reconnect irc if anything bad happens.
        renames usernames using numbers instead of _
        IRCLobby can now works independantly without netpanzer.

Patches:
Index: netpanzer/src/NetPanzer/Interfaces/PlayerGameManager.cpp
diff -u netpanzer/src/NetPanzer/Interfaces/PlayerGameManager.cpp:1.6 
netpanzer/src/NetPanzer/Interfaces/PlayerGameManager.cpp:1.7
--- netpanzer/src/NetPanzer/Interfaces/PlayerGameManager.cpp:1.6        Tue Nov 
11 09:42:31 2003
+++ netpanzer/src/NetPanzer/Interfaces/PlayerGameManager.cpp    Mon Nov 17 
08:14:30 2003
@@ -200,14 +200,17 @@
     Desktop::add(new InterfaceView());
     Desktop::add(new FlagSelectionView());
     Desktop::add(new HostOptionsView());
-    Desktop::add(new PlayerNameView());
+    PlayerNameView *playernameview=new PlayerNameView();
+    Desktop::add(playernameview);
     Desktop::add(new ResignView());
     Desktop::add(new AreYouSureResignView());
     Desktop::add(new AreYouSureExitView());
 
     //winsock hack
     Desktop::add(new IPAddressView());
-    Desktop::add(new IRCLobbyView());
+    IRCLobbyView *irc_lobby_view=new IRCLobbyView();
+    Desktop::add(irc_lobby_view);
+    irc_lobby_view->setNotifyIRCChangeName((NotifyIRCChangeName 
*)playernameview);
 
     Desktop::setVisibilityAllWindows(false);
     Desktop::setVisibility("MainView", true);
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/GameServerList.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/GameServerList.hpp:1.2 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/GameServerList.hpp:1.3
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/GameServerList.hpp:1.2 Thu Nov 
 6 12:53:26 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/GameServerList.hpp     Mon Nov 
17 08:14:31 2003
@@ -21,8 +21,6 @@
 #include <vector>
 #include <string>
 
-#include "View.hpp"
-#include "Surface.hpp"
 #include "GameServer.hpp"
 
 
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.10 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.11
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp:1.10      Sun Nov 
16 17:56:41 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.cpp   Mon Nov 17 
08:14:31 2003
@@ -15,13 +15,19 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
-#include <config.h>
 
-#include <SDLNet.hpp>
+
+// can be used independantly of netpanzer, see sample program at the end
+
+#include <SDL_net.h>
 #include <sstream>
 
+
+#ifndef WITHOUT_NETPANZER
+#include <config.h>
+
+#include <SDLNet.hpp>
 #include "Log.hpp"
-#include "IRCLobby.hpp"
 #include "IRCLobbyView.hpp"
 #include "PlayerInterface.hpp"
 #include "GameConfig.hpp"
@@ -31,18 +37,78 @@
 #include "PlayerNameView.hpp"
 #include "GameControlRulesDaemon.hpp"
 
+#else
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#ifndef _NETPANZER_DEFAULT_PORT_TCP
+#define _NETPANZER_DEFAULT_PORT_TCP 3030
+#endif
+
+#ifndef LOG
+#define LOG(x) printf x
+#endif
+
+#ifndef Exception
+class Exception : public std::exception {
+    char* message;
+public:
+    Exception(const char* msg, ...) throw() {
+        va_list args;
+        va_start(args, msg);
+
+        message = new char[255];
+        vsnprintf(message, 255, msg, args);
+
+        va_end(args);
+    }
+    ~Exception() throw() { delete[] message; }
+    const char* what() const throw() { return message; }
+};
+#endif
+
+
+
+
+
+// split server:port string, doesn't always set the port
+static void splitServerPort(const std::string& server,std::string& address,int 
*port)
+{
+    unsigned int colon=server.find(':',0);
+    if(colon==std::string::npos) {
+        address=server;
+    }
+    else {
+        address=server.substr(0,colon);
+        colon++;
+        std::string port_str(server.substr(colon,server.length()-colon));
+        port[0]=atoi(port_str.c_str());
+    }
+}
+
+
+
+#endif
+
+#include "IRCLobby.hpp"
+
 static const char* ask_server_running_mess = "Who's running a server?";
 static const char* server_running_mess = "I'm running";
 
 IRCLobby::IRCLobby(const std::string& server,
         const std::string& nick,
-        const std::string& newchannelname)
-    : irc_server_socket(0), channel_name(newchannelname), nickname(nick),
-        game_servers(0), running_thread(0)
+        const std::string& newchannelname
+        )
+    : game_servers(0),
+    irc_server_socket(0), channel_name(newchannelname), nickname(nick),
+         running_thread(0)
 {
     serveraddress=server;
     game_servers=new GameServerList();
     game_servers_mutex=SDL_CreateMutex();
+    change_name=0;
+    expected_ping=0;
 
     setNickName(nick);
 
@@ -52,10 +118,14 @@
 IRCLobby::~IRCLobby()
 {
     stopThread();
-    
     SDL_DestroyMutex(game_servers_mutex);
-    delete game_servers;
-    game_servers=0;
+LOG(("delete lobby"));
+}
+
+void IRCLobby::restartThread()
+{
+    stopThread();
+    startMessagesThread();
 }
 
 void IRCLobby::setNickName(const std::string &nick)
@@ -77,9 +147,7 @@
     }
     ircname[i] = 0;
     nickname=ircname;
-    if(playernameview) {
-        playernameview->setString(ircname);
-    }
+    if(change_name) { change_name->changeIRCName(nickname); }
 }
 
 void IRCLobby::changeNickName(const std::string &nick)
@@ -105,8 +173,11 @@
         SDLNet_TCP_Close(irc_server_socket);
         irc_server_socket=0;
     }
+    delete game_servers;
+    game_servers=0;
 }
 
+#ifndef WITHOUT_NETPANZER
 // send server info to someone
 void IRCLobby::sendServerInfo(const std::string& dest)
 {
@@ -121,31 +192,44 @@
     return sendIRCMessageLine(buffer.str(), dest);
 }
 
+
+#endif
+
+
 void IRCLobby::connectToServer()
 {
     IPaddress addr;
+    expected_ping=0;
     
-    const std::string &server=((const std::string 
&)gameconfig->proxyserver).size()>0 ? ((const std::string 
&)gameconfig->proxyserver): serveraddress;
+#ifndef WITHOUT_NETPANZER
+    const std::string &proxyserver=gameconfig->proxyserver;
+#else
+    const std::string proxyserver;
+#endif
+    const std::string &server=proxyserver.size()>0 ? proxyserver: 
serveraddress;
 
     int sport=6667;
-    std::string saddress;
-    UtilInterface::splitServerPort(server,saddress,&sport);
+#ifndef WITHOUT_NETPANZER
+    UtilInterface::splitServerPort(server,server_host,&sport);
+#else
+    ::splitServerPort(server,server_host,&sport);
+#endif
 
     // some old versions of SDL_net take a char* instead of const char*
-    if(SDLNet_ResolveHost(&addr, const_cast<char*>(saddress.c_str()), sport) < 
0)
+    if(SDLNet_ResolveHost(&addr, const_cast<char*>(server_host.c_str()), 
sport) < 0)
         throw Exception("Couldn't resolve server address '%s'",
-                saddress.c_str());
+                server_host.c_str());
         
     irc_server_socket = SDLNet_TCP_Open(&addr);
     if(!irc_server_socket)
         throw Exception("Couldn't connect to irc server '%s': %s",
-                saddress.c_str(),  SDLNet_GetError());
-
+                server.c_str(),  SDLNet_GetError());
 
-
-    if(((const std::string &)gameconfig->proxyserver).size()>0) {
+#ifndef WITHOUT_NETPANZER
+    if(proxyserver.size()>0) {
         UtilInterface::sendProxyConnect(irc_server_socket,serveraddress);
     }
+#endif
 
     std::stringstream buffer;
     buffer.str("");
@@ -176,6 +260,7 @@
     buffer << "JOIN " << channel_name;
     sendIRCLine(buffer.str());
 
+#ifndef WITHOUT_NETPANZER
     if(gameconfig->hostorjoin== _game_session_host) {
         // tell everyone the server just started
         sendServerInfo(channel_name);
@@ -183,10 +268,15 @@
     else if(gameconfig->hostorjoin== _game_session_join) {
         refreshServerList();
     }
+#else
+    refreshServerList();
+#endif
 }
 
 void IRCLobby::refreshServerList()
 {
+    delete game_servers;
+    game_servers=new GameServerList();
     std::stringstream buffer;
 
     buffer << "-" << ask_server_running_mess;
@@ -200,14 +290,44 @@
     sendIRCLine(str);
 }
 
+void IRCLobby::sendPingMessage()
+{
+    std::stringstream ping;  
+    ping << "PING " << server_host;
+    sendIRCLine(ping.str());
+    expected_ping=SDL_GetTicks()+15000;
+}
+
 int IRCLobby::messagesThreadEntry(void* data)
 {
     IRCLobby* t = (IRCLobby*) data;
-    // this is here so that the thread is started before we connect 
-    // to the irc server otherwise the main thread will halt 
-    // if we don't have access to the irc server.
-    t->connectToServer();
-    t->processMessages();
+    int restart_delay=5000;     // time to wait before starting the server
+    while(1) {
+        // this is here so that the thread is started before we connect 
+        // to the irc server otherwise the main thread will halt 
+        // if we don't have access to the irc server.
+        Uint32 start_tick=SDL_GetTicks();
+        try {
+            t->connectToServer();
+            t->processMessages();
+        } catch(std::exception& e) {
+            LOG(("Exception in IRC Thread: %s, restarting in %i secs", 
e.what(),(restart_delay/1000) ));
+            t->addChatMessage("Error",e.what());
+
+            Uint32 run_length=SDL_GetTicks()-start_tick;
+            SDL_Delay(restart_delay);
+            if(run_length>(15*60*1000)) {
+                // we managed to run for 15mins, reset the delay
+                restart_delay=5000;
+            }
+            else { restart_delay*=2; }
+            // ... wait a while and try to reconnect
+            continue;
+        } catch(...) {
+            break;
+        }
+        break;
+    }
     return 0;
 }
 
@@ -228,14 +348,7 @@
     }
 
     while(1) {
-        try {
-            processMessage();
-        } catch(std::exception& e) {
-            LOG(("Exception in IRC Thread: %s", e.what()));
-            break;
-        } catch(...) {
-            break;
-        }
+        processMessage();
     }
 }
 
@@ -271,7 +384,9 @@
     char *host, *mess, *host_end, *user_end, *code;
 
     readIRCLine(buf, sizeof(buf));
+#ifndef WITHOUT_NETPANZER
     LOGGER.debug("irc:%s",buf);
+#endif
     
     if(buf[0]!=':')
         return;
@@ -280,19 +395,29 @@
     // skip 1 word and spaces behind it
     while(*code && !isspace(*code)) { code++; }
     while(*code && isspace(*code)) { code++; }
+    char *code_end=code;
+    while(*code_end && !isspace(*code_end)) code_end++;
+    *code_end=0;
 
     int code_i=atoi(code);
-    if((mess=strchr(buf+1,':'))==NULL) {
+    if((mess=strchr(code_end+1,':'))==NULL) {
         return;
     }
     mess++;
 
     if(code_i == 433) {
-        // wrong user name, add _ at the end like chatzilla does
+        // wrong user name, change the number at the end
         char newplayer[256];
-        strncpy(newplayer,playernameview->getString(),sizeof(newplayer)-2);
+        char *p;
+        strncpy(newplayer,nickname.c_str(),sizeof(newplayer)-2);
         newplayer[sizeof(newplayer)-2]=0;
-        strcat(newplayer,"_");
+        p=strchr(newplayer,0);
+        if(isdigit(p[-1])) {
+            p--;
+            while(isdigit(*p) && p>newplayer) p--;
+            p++;
+        }
+        snprintf(p,(newplayer+sizeof(newplayer))-p,"%i",atoi(p)+1);
         changeNickName(newplayer);
         return;
     }
@@ -304,11 +429,21 @@
         addChatMessage("Error",mess);
         LOG(("IRC:%s",buf));
     }
-    if(code_i==353 || strncmp(code,"NOTICE ",7)==0) {
+    if(code_i==353 || strcmp(code,"NOTICE")==0) {
         addChatMessage("Lobby",mess);
         return;
     }
 
+    if(strcmp(code,"PONG")==0) {
+        expected_ping=0;
+    }
+    if(strcmp(code,"PING")==0) {
+        std::stringstream pong;  
+        pong << "PONG " <<(code+5);
+        sendIRCLine(pong.str());
+        return;
+    }
+
     // get remote user/host
     if(
         (host=strchr(buf,'@'))==0
@@ -319,22 +454,26 @@
     *host++=0;
     *user_end++=0;
 
-    if(strncmp(code,"JOIN ",5)==0) {
+    if(strcmp(code,"JOIN")==0) {
         std::string joined(buf+1);
         joined+=" has arrived in lobby";
         addChatMessage("",joined);
+#ifndef WITHOUT_NETPANZER
         if(gameconfig->hostorjoin== _game_session_host) {
             LOG(("%s",joined.c_str()));
         }
+#endif
         return;
     }
-    if(strncmp(code,"PART ",5)==0 || strncmp(code,"QUIT ",5)==0) {
+    if(strcmp(code,"PART")==0 || strcmp(code,"QUIT")==0) {
         std::string leave(buf+1);
         leave+=" has left the lobby";
         addChatMessage("",leave);
+#ifndef WITHOUT_NETPANZER
         if(gameconfig->hostorjoin== _game_session_host) {
             LOG(("%s",leave.c_str()));
         }
+#endif
         return;
     }
 
@@ -344,65 +483,68 @@
     }
     *host_end++=0;
     while(isspace(*host_end)) host_end++;
-    if(strncmp(host_end,"PRIVMSG ",8)!=0) {
+    if(strcmp(code,"PRIVMSG")!=0) {
         return;
     }
 
     if(mess[0]=='#') {
         // this is a chat message
         addChatMessage(buf+1, mess+1);
+#ifndef WITHOUT_NETPANZER
         if(gameconfig->hostorjoin== _game_session_host) {
             LOG(("IRC message:%s:%s",buf+1,mess+1));
         }
+#endif
 
         return;
     }
     if(mess[0]=='-') {
         // this is an internal message
 
+#ifndef WITHOUT_NETPANZER
         if(strcmp(mess+1, ask_server_running_mess)==0) {
             if(gameconfig->hostorjoin== _game_session_host) {
                 // reply with server details
                 sendServerInfo(buf+1);
             }
         }
-        else 
if(strncmp(mess+1,server_running_mess,sizeof(server_running_mess)-1)==0) {
+        else 
+#endif
+        
if(strncmp(mess+1,server_running_mess,sizeof(server_running_mess)-1)==0) {
             // add a server to the list
-            if(gameconfig->hostorjoin== _game_session_join) {
-                const char *p=mess+strlen(server_running_mess)+1;
-                const char *map;
-                int players=atoi(p);
-                if((p=strchr(p,'/'))==0) {
-                    LOG(("bad server description: %s\n",mess));
-                    return;
-                }
-                int max_players=atoi(++p);
-                int port=_NETPANZER_DEFAULT_PORT_TCP;
-                char *port_str;
-                if((port_str=strstr(p,"port:"))!=0) {
-                    port=atoi(port_str+5);
-                }
-                if((map=strstr(p,"map:"))==0) {
-                    LOG(("no map name: %s\n",mess));
-                    return;
-                }
-                map+=4;
+            const char *p=mess+strlen(server_running_mess)+1;
+            const char *map;
+            int players=atoi(p);
+            if((p=strchr(p,'/'))==0) {
+                LOG(("bad server description: %s\n",mess));
+                return;
+            }
+            int max_players=atoi(++p);
+            int port=_NETPANZER_DEFAULT_PORT_TCP;
+            char *port_str;
+            if((port_str=strstr(p,"port:"))!=0) {
+                port=atoi(port_str+5);
+            }
+            if((map=strstr(p,"map:"))==0) {
+                LOG(("no map name: %s\n",mess));
+                return;
+            }
+            map+=4;
 
-                GameServer *server
-                    = game_servers->find(host, port);
-                if(server==0) {
-                    SDL_mutexP(game_servers_mutex);
-                    game_servers->push_back(
-                            GameServer(host, port,
-                                buf+1, map, players, max_players));
-                    SDL_mutexV(game_servers_mutex);
-                }
-                else {
-                    server->user = buf+1;
-                    server->map = map;
-                    server->playercount = players;
-                    server->max_players = max_players;
-                }
+            GameServer *server
+                = game_servers->find(host, port);
+            if(server==0) {
+                SDL_mutexP(game_servers_mutex);
+                game_servers->push_back(
+                        GameServer(host, port,
+                            buf+1, map, players, max_players));
+                SDL_mutexV(game_servers_mutex);
+            }
+            else {
+                server->user = buf+1;
+                server->map = map;
+                server->playercount = players;
+                server->max_players = max_players;
             }
         }
     }
@@ -460,11 +602,19 @@
     SDLNet_SocketSet sock_set=SDLNet_AllocSocketSet(1);
     SDLNet_TCP_AddSocket(sock_set,irc_server_socket);
 
+    int no_activity=0;
     try {
         while(buf_upto < buf_end) {
             SDLNet_CheckSockets(sock_set, 1000);
-            if(!SDLNet_SocketReady(irc_server_socket))
+            if(!SDLNet_SocketReady(irc_server_socket)) {
+                if(++no_activity>=(60*2) && !expected_ping) {
+                    sendPingMessage();
+                }
+                if(expected_ping && expected_ping<SDL_GetTicks()) {
+                    throw Exception("no pong received after ping");
+                }
                 continue;
+            }
 
             if(SDLNet_TCP_Recv(irc_server_socket,&ch,1)<0)
                 throw Exception("Couldn't read TCP: %s",
@@ -484,4 +634,38 @@
     SDLNet_FreeSocketSet(sock_set);
     *buf_upto=0;
 }
+
+
+
+#if 0
+
+// sample program to use this class...
+
+#include <unistd.h>
+#define WITHOUT_NETPANZER
+#include "IRCLobby.cpp"
+
+
+int main()
+{
+    IRCLobby *lobby=new 
IRCLobby("irc.freenode.net","testnpsrv","#netpanzerlob");
+    sleep(30);
+
+    SDL_mutexP(lobby->game_servers_mutex);
+    GameServerList::iterator i;
+    GameServerList* serverlist = lobby->game_servers;
+    for(i=serverlist->begin(); i!=serverlist->end(); i++) {
+        const GameServer* server = &(*i);
+        printf("%s is running %s (%i/%i) on %s:%i\n",
+            i->user.c_str(),i->map.c_str(),
+            i->playercount,i->max_players,
+            i->host.c_str(),i->port
+            );
+    }
+    SDL_mutexV(lobby->game_servers_mutex);
+
+
+    delete lobby;
+}
+#endif
 
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.6 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.7
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp:1.6       Sat Nov 
15 21:24:58 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobby.hpp   Mon Nov 17 
08:14:31 2003
@@ -24,14 +24,20 @@
 #include <SDL_thread.h>
 #include <SDL_net.h>
 
-#include "View.hpp"
-#include "Surface.hpp"
 #include "GameServer.hpp"
 #include "GameServerList.hpp"
 #include "IRCChatMessage.hpp"
 
+class IRCLobby;
 class IRCLobbyView;
 
+class NotifyIRCChangeName {
+public:
+    virtual void changeIRCName(std::string &newname) = 0;
+    friend class IRCLobby;
+};
+
+
 //---------------------------------------------------------------------------
 class IRCLobby
 {
@@ -49,6 +55,10 @@
     bool isConnected() const
     { return irc_server_socket != 0; }
     void changeNickName(const std::string &nick);
+    void restartThread();   // restart thread & reconnect irc
+
+    GameServerList* game_servers;
+    NotifyIRCChangeName* change_name;
 
 private:
     void startMessagesThread();
@@ -67,6 +77,7 @@
     void sendLoginInfo();
     void setNickName(const std::string &nick);
     void sendNickName();
+    void sendPingMessage();
     void addChatMessage(const std::string& user, const std::string& message);
 
     SDL_mutex *game_servers_mutex;   
@@ -77,8 +88,9 @@
     std::string channel_name;
     std::string nickname;
     std::string serveraddress;
+    std::string server_host;
     std::list<IRCChatMessage> chat_messages;
-    GameServerList* game_servers;
+    unsigned int expected_ping;
     
     SDL_Thread *running_thread;
 };
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.9 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.10
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp:1.9   Sat Nov 
15 21:24:58 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.cpp       Mon Nov 
17 08:14:31 2003
@@ -33,6 +33,7 @@
     : View()
 {
     lobby_connection=0;
+    change_name=0;
     lobby_view_height=160;
     total_displayed_servers=0;
     setSearchName("IRCLobbyView");
@@ -218,6 +219,7 @@
         stopIRC();
         lobby_connection=new IRCLobby(gameconfig->lobbyserver,
                 gameconfig->playername, "#netpanzerlob");
+        lobby_connection->change_name=change_name;
     } catch(std::exception& e) {
         LOG(("Couldn't connect to irc lobby: %s", e.what()));
         error_message = e.what();
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.7 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.8
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp:1.7   Sat Nov 
15 21:24:58 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/IRCLobbyView.hpp       Mon Nov 
17 08:14:31 2003
@@ -44,11 +44,15 @@
             lobby_connection->changeNickName(s);
         }
     }
+    void setNotifyIRCChangeName(NotifyIRCChangeName *cn) {
+        change_name=cn;
+    }
 
 private:
     static void buttonRefresh();
     static void chatReturnPressed(cInputField* input);
     
+    NotifyIRCChangeName *change_name;
     int server_list_end_y;
     int server_list_end_x;
     int chat_list_end_y;
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.cpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.cpp:1.11 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.cpp:1.12
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.cpp:1.11        
Sun Nov 16 17:56:41 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.cpp     Mon Nov 
17 08:14:31 2003
@@ -46,13 +46,12 @@
     init();
 
     // XXX ugly
-    if(!playernameview)
-        playernameview = this;
+//    if(!playernameview) playernameview = this;
 } // end PlayerNameView::PlayerNameView
 
 PlayerNameView::~PlayerNameView()
 {
-       playernameview=0;
+//     playernameview=0;
 }
 
 // init
@@ -83,5 +82,12 @@
     }
 }
 
+void PlayerNameView::changeIRCName(std::string &newname)
+{
+    setString(newname.c_str());
+    gameconfig->playername=newname;
+}
+
+
 // sometime we shoudl eleminate all these global vars...
-PlayerNameView* playernameview = 0;
+//PlayerNameView* playernameview = 0;
Index: netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.hpp
diff -u netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.hpp:1.5 
netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.hpp:1.6
--- netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.hpp:1.5 Sat Nov 
15 21:24:58 2003
+++ netpanzer/src/NetPanzer/Views/MainMenu/Multi/PlayerNameView.hpp     Mon Nov 
17 08:14:31 2003
@@ -20,10 +20,11 @@
 
 #include "View.hpp"
 #include "Surface.hpp"
+#include "IRCLobby.hpp"
 #include "cGrowList.hpp"
 
 //---------------------------------------------------------------------------
-class PlayerNameView : public View
+class PlayerNameView : public View,NotifyIRCChangeName
 {
 public:
     PlayerNameView();
@@ -36,6 +37,7 @@
     void init();
     void setString(const char *s) { playerName.setString(s); }
     const char *getString() { return playerName.getString(); }
+    virtual void changeIRCName(std::string &newname);
 
 private:
     static void returnPressed(cInputField* input);
@@ -46,6 +48,6 @@
     cInputFieldString playerName;
 }; // end PlayerNameView
 
-extern PlayerNameView* playernameview;
+//extern PlayerNameView* playernameview;
 
 #endif // end __PlayerNameView_hpp__




reply via email to

[Prev in Thread] Current Thread [Next in Thread]