Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/lib/network/proxy/proxy_control.cc @ 9571

Last change on this file since 9571 was 9571, checked in by patrick, 19 years ago

disconnecting instead of joining..

File size: 4.9 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli (patrick@orxonox.ethz.ch)
13*/
14
15#include "proxy_control.h"
16
17#include "class_list.h"
18
19
20#include "player.h"
21#include "state.h"
22#include "shared_network_data.h"
23#include "network_game_manager.h"
24
25#include "converter.h"
26
27#include "preferences.h"
28
29#include "debug.h"
30
31
32
33
34ProxyControl* ProxyControl::singletonRef = NULL;
35
36
37/**
38 * constructor
39 */
40ProxyControl::ProxyControl()
41{
42  this->setClassID( CL_PROXY_CONTROL, "ProxyControl" );
43
44  MessageManager::getInstance()->registerMessageHandler( MSGID_PROXY_NEWCLIENT, messageHandlerNewClient, NULL );
45
46  PRINTF(0)("ProxyControl created\n");
47}
48
49
50/**
51 * standard deconstructor
52 */
53ProxyControl::~ProxyControl()
54{
55  ProxyControl::singletonRef = NULL;
56}
57
58
59 /**
60 * override this function to be notified on change
61 * of your registred variables.
62 * @param id id's which have changed
63  */
64void ProxyControl::varChangeHandler( std::list< int > & id )
65{
66//   if ( std::find( id.begin(), id.end(), playableUniqueId_handle ) != id.end() )
67//   {
68//     this->setPlayableUniqueId( this->playableUniqueId );
69//
70//     PRINTF(0)("uniqueID changed %d %d %d\n", userId, SharedNetworkData::getInstance()->getHostID(), getUniqueID());
71//   }
72}
73
74
75/**
76 *  signals new client connected to this local proxy
77 * @param userId userId of the new client
78 */
79void ProxyControl::signalNewClient(int userId)
80{
81  PRINTF(0)("Signaling new Client: %i\n", userId);
82  // make sure we are a proxy server
83  assert(SharedNetworkData::getInstance()->isProxyServerActive());
84
85  byte data[INTSIZE];
86
87  assert( Converter::intToByteArray( userId, data, INTSIZE ) == INTSIZE );
88
89  MessageManager::getInstance()->sendMessage( MSGID_PROXY_NEWCLIENT, data, INTSIZE, RT_SERVER, NET_UNASSIGNED, MP_HIGHBANDWIDTH );
90}
91
92
93/**
94 * this is the handler for proxy signals: new clients
95 *
96 * @param messageType the type of the message
97 * @param data message data
98 * @param dataLength length of the message data
99 * @param someData some other atteched data
100 * @param senderId id of the sender client
101 * @param destinationId id of the destination client
102 * @return true if succeeded
103 */
104bool ProxyControl::messageHandlerNewClient( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId  )
105{
106  // body data length correct?
107  if ( dataLength != INTSIZE )
108  {
109    PRINTF(2)("new client message has wrong size: %d\n", dataLength );
110    return true;
111  }
112  // read the userId fromt he message body
113  int newClientId = 0;
114  assert( Converter::byteArrayToInt( data, &newClientId) == INTSIZE );
115
116  PRINTF(0)("Got Signal: from %i new player arrived with userId: %i\n", senderId, newClientId);
117  // part for the master server
118  if( SharedNetworkData::getInstance()->isMasterServer())
119  {
120    // we now create the new player ship and stuff...
121    NetworkGameManager::getInstance()->signalNewPlayer(newClientId);
122  }
123  else if(SharedNetworkData::getInstance()->isProxyServerActive())
124  {
125
126  }
127
128  return true;
129}
130
131
132
133/**
134 *  signals client disconnect
135 * @param userId userId of the old client
136 */
137void ProxyControl::signalLeaveClient(int userId)
138{
139  PRINTF(0)("Signaling new Client: %i\n", userId);
140  // make sure we are a proxy server
141  assert(SharedNetworkData::getInstance()->isProxyServerActive());
142
143  byte data[INTSIZE];
144
145  assert( Converter::intToByteArray( userId, data, INTSIZE ) == INTSIZE );
146
147  MessageManager::getInstance()->sendMessage( MSGID_PROXY_LEAVECLIENT, data, INTSIZE, RT_SERVER, NET_UNASSIGNED, MP_HIGHBANDWIDTH );
148}
149
150
151/**
152 * this is the handler for proxy signals: removing clients
153 *
154 * @param messageType the type of the message
155 * @param data message data
156 * @param dataLength length of the message data
157 * @param someData some other atteched data
158 * @param senderId id of the sender client
159 * @param destinationId id of the destination client
160 * @return true if succeeded
161 */
162bool ProxyControl::messageHandlerLeaveClient( MessageType messageType, byte * data, int dataLength, void * someData, int senderId, int destinationId  )
163{
164  // body data length correct?
165  if ( dataLength != INTSIZE )
166  {
167    PRINTF(2)("leave client message has wrong size: %d\n", dataLength );
168    return true;
169  }
170  // read the userId fromt he message body
171  int leaveClientId = 0;
172  assert( Converter::byteArrayToInt( data, &leaveClientId) == INTSIZE );
173
174  PRINTF(0)("Got Signal: from %i new player left with userId: %i\n", senderId, leaveClientId);
175  // part for the master server
176  if( SharedNetworkData::getInstance()->isMasterServer())
177  {
178    // we now create the new player ship and stuff...
179    NetworkGameManager::getInstance()->signalLeftPlayer(leaveClientId);
180  }
181  else if(SharedNetworkData::getInstance()->isProxyServerActive())
182  {
183
184  }
185
186  return true;
187}
Note: See TracBrowser for help on using the repository browser.