The checkbox "fill up with computer players" is now working (protocol has been changed to implement this). Lobby dialog is now also used after joining the game. Leaving game not possible yet.
This commit is contained in:
+31
-15
@@ -1,4 +1,5 @@
|
||||
Changelog:
|
||||
09-05-2007: Minimum packet length is now definitely 8.
|
||||
08-26-2007: Server sends player name only on request.
|
||||
Player id is used in all other cases.
|
||||
08-20-2007: Create Game is answered by Join Game Ack.
|
||||
@@ -23,7 +24,7 @@ PokerTH general message format:
|
||||
| +-------------------------------+
|
||||
/ | padding |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
Minimum length is 4. Maximum length is 256.
|
||||
Minimum length is 8. Maximum length is 256.
|
||||
|
||||
|
||||
Client Request: Init
|
||||
@@ -300,13 +301,28 @@ Client Request: Kick Player
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
Client Request: Leave Current Game
|
||||
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 15 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
Client Request: Start Event
|
||||
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 15 | Message Length = 4 |
|
||||
| Message Type = 16 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Start Flags | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
Start Flags:
|
||||
0x01 set: Fill up with computer opponents.
|
||||
|
||||
|
||||
Server Notification: Game Start
|
||||
@@ -314,7 +330,7 @@ Server Notification: Game Start
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 16 | Message Length |
|
||||
| Message Type = 17 | Message Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Start Dealer Player Id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -345,7 +361,7 @@ Server Notification: Hand Start
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 17 | Message Length = 8 |
|
||||
| Message Type = 18 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Your 1st Card | Your 2nd Card |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -359,7 +375,7 @@ Server Request/Notification: Player's Turn
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 18 | Message Length = 8 |
|
||||
| Message Type = 19 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Player ID |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -378,7 +394,7 @@ Client Reply/Request: Player's Action
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 19 | Message Length = 12 |
|
||||
| Message Type = 20 | Message Length = 12 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Game State | Player Action |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -403,7 +419,7 @@ Server Notification: Player's Action Done
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 20 | Message Length = 20 |
|
||||
| Message Type = 21 | Message Length = 20 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Player ID |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -424,7 +440,7 @@ Server Reply: Player's Action Rejected
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 21 | Message Length = 16 |
|
||||
| Message Type = 22 | Message Length = 16 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Game State | Player Action |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -452,7 +468,7 @@ Server Notification: Deal Flop Cards
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 22 | Message Length = 12 |
|
||||
| Message Type = 23 | Message Length = 12 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Flop 1st Card | Flop 2nd Card |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -465,7 +481,7 @@ Server Notification: Deal Turn Card
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 23 | Message Length = 8 |
|
||||
| Message Type = 24 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Turn Card | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -476,7 +492,7 @@ Server Notification: Deal River Card
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 24 | Message Length = 8 |
|
||||
| Message Type = 25 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| River Card | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -487,7 +503,7 @@ Server Notification: All In Show Cards
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 25 | Message Length |
|
||||
| Message Type = 26 | Message Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Number Of PlayerCards Records | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -509,7 +525,7 @@ Server Notification: End Of Hand Show Cards
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 26 | Message Length |
|
||||
| Message Type = 27 | Message Length |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|Number Of PlayerResult Records | Reserved |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -543,7 +559,7 @@ Server Notification: End Of Hand Hide Cards
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 27 | Message Length = 16 |
|
||||
| Message Type = 28 | Message Length = 16 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Player ID |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@@ -558,7 +574,7 @@ Server Notification: End Of Game
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Type = 28 | Message Length = 8 |
|
||||
| Message Type = 29 | Message Length = 8 |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Winner Player Id |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
@@ -1,60 +1,62 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2006 by FThauer FHammer *
|
||||
* f.thauer@web.de *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
#include "connecttoserverdialogimpl.h"
|
||||
// #include "configfile.h"
|
||||
#include <net/socket_msg.h>
|
||||
|
||||
connectToServerDialogImpl::connectToServerDialogImpl(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
{
|
||||
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2006 by FThauer FHammer *
|
||||
* f.thauer@web.de *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
#include "connecttoserverdialogimpl.h"
|
||||
#include <net/socket_msg.h>
|
||||
|
||||
connectToServerDialogImpl::connectToServerDialogImpl(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
{
|
||||
|
||||
setupUi(this);
|
||||
}
|
||||
|
||||
void connectToServerDialogImpl::exec()
|
||||
{
|
||||
label_actionMessage->setText("");
|
||||
progressBar->setValue(0);
|
||||
progressBar->setValue(0);
|
||||
|
||||
QDialog::exec();
|
||||
}
|
||||
|
||||
void connectToServerDialogImpl::refresh(int actionID) {
|
||||
|
||||
switch (actionID) {
|
||||
|
||||
case MSG_SOCK_INIT_DONE: { label_actionMessage->setText("Resolving address..."); }
|
||||
break;
|
||||
case MSG_SOCK_RESOLVE_DONE: { label_actionMessage->setText("Connecting to server..."); }
|
||||
break;
|
||||
case MSG_SOCK_CONNECT_DONE: { label_actionMessage->setText("Starting session..."); }
|
||||
break;
|
||||
case MSG_SOCK_SESSION_DONE: { label_actionMessage->setText("Connection established!"); }
|
||||
break;
|
||||
|
||||
default: { label_actionMessage->setText("Please wait..."); }
|
||||
}
|
||||
|
||||
progressBar->setValue(actionID*(100/MSG_SOCK_LIMIT_CONNECT));
|
||||
|
||||
if (actionID == MSG_SOCK_LIMIT_CONNECT)
|
||||
QTimer::singleShot(1000, this, SLOT(accept()));
|
||||
}
|
||||
|
||||
|
||||
void connectToServerDialogImpl::refresh(int actionID) {
|
||||
|
||||
bool skip = false;
|
||||
switch (actionID) {
|
||||
|
||||
case MSG_SOCK_INIT_DONE: { label_actionMessage->setText(tr("Resolving address...")); }
|
||||
break;
|
||||
case MSG_SOCK_RESOLVE_DONE: { label_actionMessage->setText(tr("Connecting to server...")); }
|
||||
break;
|
||||
case MSG_SOCK_CONNECT_DONE: { label_actionMessage->setText(tr("Starting session...")); }
|
||||
break;
|
||||
case MSG_SOCK_SESSION_DONE: { label_actionMessage->setText(tr("Connection established!")); }
|
||||
break;
|
||||
default: skip = true;
|
||||
}
|
||||
|
||||
if (!skip)
|
||||
{
|
||||
progressBar->setValue(actionID*(100/MSG_SOCK_LIMIT_CONNECT));
|
||||
|
||||
if (actionID == MSG_SOCK_LIMIT_CONNECT)
|
||||
QTimer::singleShot(1000, this, SLOT(accept()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
// Description:
|
||||
//
|
||||
//
|
||||
// Author: FThauer FHammer <webmaster@pokerth.net>, (C) 2007
|
||||
// Author: FThauer FHammer LMay <webmaster@pokerth.net>, (C) 2007
|
||||
//
|
||||
// Copyright: See COPYING file that comes with this distribution
|
||||
//
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "session.h"
|
||||
#include "configfile.h"
|
||||
#include "gamedata.h"
|
||||
#include <net/socket_msg.h>
|
||||
|
||||
gameLobbyDialogImpl::gameLobbyDialogImpl(QWidget *parent, ConfigFile *c)
|
||||
: QDialog(parent), myW(NULL), myConfig(c), mySession(NULL), currentGameName(""), isAdmin(false)
|
||||
@@ -22,6 +23,9 @@ gameLobbyDialogImpl::gameLobbyDialogImpl(QWidget *parent, ConfigFile *c)
|
||||
connect( pushButton_CreateGame, SIGNAL( clicked() ), this, SLOT( createGame() ) );
|
||||
connect( pushButton_JoinGame, SIGNAL( clicked() ), this, SLOT( joinGame() ) );
|
||||
connect( treeWidget_GameList, SIGNAL( currentItemChanged ( QTreeWidgetItem*, QTreeWidgetItem*) ), this, SLOT( gameSelected(QTreeWidgetItem*, QTreeWidgetItem*) ) );
|
||||
connect( pushButton_StartGame, SIGNAL( clicked() ), this, SLOT( startGame() ) );
|
||||
connect( pushButton_Kick, SIGNAL( clicked() ), this, SLOT( kickPlayer() ) );
|
||||
connect( treeWidget_connectedPlayers, SIGNAL( currentItemChanged ( QTreeWidgetItem*, QTreeWidgetItem*) ), this, SLOT( playerSelected(QTreeWidgetItem*, QTreeWidgetItem*) ) );
|
||||
|
||||
clearDialog();
|
||||
}
|
||||
@@ -50,7 +54,7 @@ void gameLobbyDialogImpl::createGame()
|
||||
myCreateInternetGameDialog->exec();
|
||||
|
||||
if (myCreateInternetGameDialog->result() == QDialog::Accepted ) {
|
||||
|
||||
|
||||
GameData gameData;
|
||||
// Set Game Data
|
||||
gameData.maxNumberOfPlayers = myCreateInternetGameDialog->spinBox_quantityPlayers->value();
|
||||
@@ -59,12 +63,19 @@ void gameLobbyDialogImpl::createGame()
|
||||
gameData.handsBeforeRaise = myCreateInternetGameDialog->spinBox_handsBeforeRaiseSmallBlind->value();
|
||||
gameData.guiSpeed = myCreateInternetGameDialog->spinBox_gameSpeed->value();
|
||||
gameData.playerActionTimeoutSec = myCreateInternetGameDialog->spinBox_netTimeOutPlayerAction->value();
|
||||
|
||||
mySession->clientCreateGame(gameData, myConfig->readConfigString("MyName") + "'s game", myCreateInternetGameDialog->lineEdit_Password->text().toUtf8().constData());
|
||||
|
||||
currentGameName = QString::fromUtf8(myConfig->readConfigString("MyName").c_str()) + QString("'s game");
|
||||
|
||||
accept();
|
||||
// Update dialog
|
||||
gameModeDialogUpdate();
|
||||
|
||||
label_SmallBlind->setText(QString::number(gameData.smallBlind));
|
||||
label_StartCash->setText(QString::number(gameData.startMoney));
|
||||
label_MaximumNumberOfPlayers->setText(QString::number(gameData.maxNumberOfPlayers));
|
||||
label_HandsToRaiseSmallBlind->setText(QString::number(gameData.handsBeforeRaise));
|
||||
label_TimeoutForPlayerAction->setText(QString::number(gameData.playerActionTimeoutSec));
|
||||
|
||||
mySession->clientCreateGame(gameData, myConfig->readConfigString("MyName") + "'s game", myCreateInternetGameDialog->lineEdit_Password->text().toUtf8().constData());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,12 +84,19 @@ void gameLobbyDialogImpl::joinGame()
|
||||
QTreeWidgetItem *item = treeWidget_GameList->currentItem();
|
||||
if (item)
|
||||
{
|
||||
QString gameName = item->text(0);
|
||||
|
||||
assert(mySession);
|
||||
mySession->clientJoinGame(gameName.toUtf8().constData(), "");
|
||||
mySession->clientJoinGame(item->data(0, Qt::UserRole).toUInt(), "");
|
||||
|
||||
accept();
|
||||
// Update dialog
|
||||
gameModeDialogUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::refresh(int actionID) {
|
||||
|
||||
if (actionID == MSG_NET_GAME_CLIENT_START)
|
||||
{
|
||||
QTimer::singleShot(500, this, SLOT(accept()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,13 +222,17 @@ void gameLobbyDialogImpl::clearDialog()
|
||||
label_TimeoutForPlayerAction->setText("");
|
||||
|
||||
treeWidget_GameList->clear();
|
||||
treeWidget_GameList->show();
|
||||
treeWidget_connectedPlayers->clear();
|
||||
|
||||
pushButton_JoinGame->setEnabled(false);
|
||||
pushButton_Leave->hide();
|
||||
pushButton_Kick->hide();
|
||||
pushButton_Kick->setEnabled(false);
|
||||
pushButton_StartGame->hide();
|
||||
checkBox_fillUpWithComputerOpponents->hide();
|
||||
pushButton_CreateGame->show();
|
||||
pushButton_JoinGame->show();
|
||||
pushButton_JoinGame->setEnabled(false);
|
||||
|
||||
treeWidget_GameList->setColumnWidth(0,250);
|
||||
treeWidget_GameList->setColumnWidth(1,75);
|
||||
@@ -221,13 +243,18 @@ void gameLobbyDialogImpl::clearDialog()
|
||||
|
||||
void gameLobbyDialogImpl::checkPlayerQuantity() {
|
||||
|
||||
// if (treeWidget->topLevelItemCount() >= 2 && isAdmin) {
|
||||
// pushButton_startGame->setEnabled(true);
|
||||
// }
|
||||
// else {
|
||||
// pushButton_startGame->setEnabled(false);
|
||||
// }
|
||||
|
||||
if(isAdmin){
|
||||
pushButton_Kick->show();
|
||||
pushButton_StartGame->show();
|
||||
checkBox_fillUpWithComputerOpponents->show();
|
||||
|
||||
if (treeWidget_connectedPlayers->topLevelItemCount() >= 2) {
|
||||
pushButton_StartGame->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
pushButton_StartGame->setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::joinedNetworkGame(unsigned playerId, QString playerName, int rights) {
|
||||
@@ -284,3 +311,44 @@ void gameLobbyDialogImpl::removePlayer(unsigned playerId, QString) {
|
||||
checkPlayerQuantity();
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::gameModeDialogUpdate() {
|
||||
groupBox_GameInfo->setEnabled(true);
|
||||
groupBox_GameInfo->setTitle(currentGameName);
|
||||
treeWidget_GameList->clear();
|
||||
treeWidget_GameList->hide();
|
||||
treeWidget_connectedPlayers->clear();
|
||||
pushButton_CreateGame->hide();
|
||||
pushButton_JoinGame->hide();
|
||||
pushButton_Leave->show();
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::playerSelected(QTreeWidgetItem* item, QTreeWidgetItem*) {
|
||||
|
||||
if (item)
|
||||
pushButton_Kick->setEnabled(isAdmin);
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::startGame() {
|
||||
assert(mySession);
|
||||
mySession->sendStartEvent(checkBox_fillUpWithComputerOpponents->isChecked());
|
||||
}
|
||||
|
||||
void gameLobbyDialogImpl::kickPlayer() {
|
||||
|
||||
QTreeWidgetItem *item = treeWidget_connectedPlayers->currentItem();
|
||||
if (item)
|
||||
{
|
||||
QString playerName = item->text(0);
|
||||
if(playerName == QString::fromUtf8(myConfig->readConfigString("MyName").c_str())) {
|
||||
{ QMessageBox::warning(this, tr("Server Error"),
|
||||
tr("You should not kick yourself from this game!"),
|
||||
QMessageBox::Close); }
|
||||
}
|
||||
else {
|
||||
assert(mySession);
|
||||
mySession->kickPlayer(item->data(0, Qt::UserRole).toUInt());
|
||||
}
|
||||
}
|
||||
pushButton_Kick->setEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,12 @@ public slots:
|
||||
void updatePlayer(unsigned, QString);
|
||||
void removePlayer(unsigned, QString);
|
||||
|
||||
void playerSelected(QTreeWidgetItem*, QTreeWidgetItem*);
|
||||
void refresh(int actionID);
|
||||
void startGame();
|
||||
void kickPlayer();
|
||||
|
||||
void gameModeDialogUpdate();
|
||||
void clearDialog();
|
||||
|
||||
private:
|
||||
|
||||
@@ -647,6 +647,7 @@ mainWindowImpl::mainWindowImpl(ConfigFile *c, QMainWindow *parent)
|
||||
|
||||
connect(this, SIGNAL(signalNetClientConnect(int)), myConnectToServerDialog, SLOT(refresh(int)));
|
||||
connect(this, SIGNAL(signalNetClientGameInfo(int)), myStartNetworkGameDialog, SLOT(refresh(int)));
|
||||
connect(this, SIGNAL(signalNetClientGameInfo(int)), myGameLobbyDialog, SLOT(refresh(int)));
|
||||
|
||||
connect(this, SIGNAL(signalNetClientSelfJoined(unsigned, QString, int)), myStartNetworkGameDialog, SLOT(joinedNetworkGame(unsigned, QString, int)));
|
||||
connect(this, SIGNAL(signalNetClientPlayerJoined(unsigned, QString, int)), myStartNetworkGameDialog, SLOT(addConnectedPlayer(unsigned, QString, int)));
|
||||
@@ -845,9 +846,8 @@ void mainWindowImpl::callGameLobbyDialog() {
|
||||
|
||||
if (myGameLobbyDialog->result() == QDialog::Accepted)
|
||||
{
|
||||
if(myGameLobbyDialog->getCurrentGameName() != "")
|
||||
myStartNetworkGameDialog->setWindowTitle(myGameLobbyDialog->getCurrentGameName());
|
||||
showNetworkStartDialog();
|
||||
//some gui modifications
|
||||
networkGameModification();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2006 by FThauer FHammer *
|
||||
* Copyright (C) 2006 by FThauer FHammer LMay *
|
||||
* f.thauer@web.de *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
@@ -46,7 +46,7 @@ void startNetworkGameDialogImpl::exec() {
|
||||
|
||||
void startNetworkGameDialogImpl::startGame() {
|
||||
assert(mySession);
|
||||
mySession->sendStartEvent();
|
||||
mySession->sendStartEvent(checkBox_fillUpWithComputerOpponents->isChecked());
|
||||
}
|
||||
|
||||
void startNetworkGameDialogImpl::cancel() {
|
||||
@@ -131,7 +131,7 @@ void startNetworkGameDialogImpl::kickPlayer() {
|
||||
}
|
||||
else {
|
||||
assert(mySession);
|
||||
mySession->kickPlayer(playerName.toUtf8().constData());
|
||||
mySession->kickPlayer(item->data(0, Qt::UserRole).toUInt());
|
||||
}
|
||||
}
|
||||
pushButton_Kick->setEnabled(false);
|
||||
|
||||
@@ -33,7 +33,7 @@ class ConfigFile;
|
||||
class startNetworkGameDialogImpl: public QDialog, public Ui::startNetworkGameDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
startNetworkGameDialogImpl(QWidget *parent = 0, ConfigFile *config = 0);
|
||||
startNetworkGameDialogImpl(QWidget *parent = 0, ConfigFile *config = 0);
|
||||
|
||||
void setSession(Session *session);
|
||||
|
||||
|
||||
@@ -54,12 +54,12 @@ public:
|
||||
const std::string &pwd,
|
||||
const std::string &playerName);
|
||||
|
||||
void SendKickPlayer(const std::string &playerName);
|
||||
void SendStartEvent();
|
||||
void SendKickPlayer(unsigned playerId);
|
||||
void SendStartEvent(bool fillUpWithCpuPlayers);
|
||||
void SendPlayerAction();
|
||||
void SendChatMessage(const std::string &msg);
|
||||
void SendJoinFirstGame(const std::string &password);
|
||||
void SendJoinGame(const std::string &name, const std::string &password);
|
||||
void SendJoinGame(unsigned gameId, const std::string &password);
|
||||
void SendCreateGame(const GameData &gameData, const std::string &name, const std::string &password);
|
||||
|
||||
GameInfo GetGameInfo(unsigned playerId) const;
|
||||
|
||||
@@ -87,29 +87,32 @@ ClientThread::Init(
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SendKickPlayer(const string &playerName)
|
||||
ClientThread::SendKickPlayer(unsigned playerId)
|
||||
{
|
||||
boost::shared_ptr<PlayerData> tmpPlayer = GetPlayerDataByName(playerName);
|
||||
if (tmpPlayer.get())
|
||||
{
|
||||
boost::shared_ptr<NetPacket> request(new NetPacketKickPlayer);
|
||||
NetPacketKickPlayer::Data requestData;
|
||||
requestData.playerId = tmpPlayer->GetUniqueId();
|
||||
static_cast<NetPacketKickPlayer *>(request.get())->SetData(requestData);
|
||||
boost::mutex::scoped_lock lock(m_outPacketListMutex);
|
||||
m_outPacketList.push_back(request);
|
||||
}
|
||||
boost::shared_ptr<NetPacket> request(new NetPacketKickPlayer);
|
||||
NetPacketKickPlayer::Data requestData;
|
||||
requestData.playerId = playerId;
|
||||
static_cast<NetPacketKickPlayer *>(request.get())->SetData(requestData);
|
||||
boost::mutex::scoped_lock lock(m_outPacketListMutex);
|
||||
m_outPacketList.push_back(request);
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SendStartEvent()
|
||||
ClientThread::SendStartEvent(bool fillUpWithCpuPlayers)
|
||||
{
|
||||
// Warning: This function is called in the context of the GUI thread.
|
||||
// Create a network packet for the server start event.
|
||||
boost::shared_ptr<NetPacket> startEvent(new NetPacketStartEvent);
|
||||
// Just dump the packet.
|
||||
boost::mutex::scoped_lock lock(m_outPacketListMutex);
|
||||
m_outPacketList.push_back(startEvent);
|
||||
boost::shared_ptr<NetPacket> start(new NetPacketStartEvent);
|
||||
NetPacketStartEvent::Data startData;
|
||||
startData.fillUpWithCpuPlayers = fillUpWithCpuPlayers;
|
||||
try
|
||||
{
|
||||
static_cast<NetPacketStartEvent *>(start.get())->SetData(startData);
|
||||
boost::mutex::scoped_lock lock(m_outPacketListMutex);
|
||||
m_outPacketList.push_back(start);
|
||||
} catch (const NetException &)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -177,16 +180,16 @@ ClientThread::SendJoinFirstGame(const std::string &password)
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SendJoinGame(const std::string &name, const std::string &password)
|
||||
ClientThread::SendJoinGame(unsigned gameId, const std::string &password)
|
||||
{
|
||||
// Warning: This function is called in the context of the GUI thread.
|
||||
// Create a network packet to request joining a game.
|
||||
boost::shared_ptr<NetPacket> join(new NetPacketJoinGame);
|
||||
NetPacketJoinGame::Data joinData;
|
||||
joinData.password = password;
|
||||
joinData.gameId = gameId;
|
||||
try
|
||||
{
|
||||
joinData.gameId = GetGameIdByName(name);
|
||||
static_cast<NetPacketJoinGame *>(join.get())->SetData(joinData);
|
||||
boost::mutex::scoped_lock lock(m_outPacketListMutex);
|
||||
m_outPacketList.push_back(join);
|
||||
|
||||
@@ -41,20 +41,21 @@ using namespace std;
|
||||
#define NET_TYPE_PLAYER_JOINED 0x000C
|
||||
#define NET_TYPE_PLAYER_LEFT 0x000D
|
||||
#define NET_TYPE_KICK_PLAYER 0x000E
|
||||
#define NET_TYPE_START_EVENT 0x000F
|
||||
#define NET_TYPE_GAME_START 0x0010
|
||||
#define NET_TYPE_HAND_START 0x0011
|
||||
#define NET_TYPE_PLAYERS_TURN 0x0012
|
||||
#define NET_TYPE_PLAYERS_ACTION 0x0013
|
||||
#define NET_TYPE_PLAYERS_ACTION_DONE 0x0014
|
||||
#define NET_TYPE_PLAYERS_ACTION_REJECTED 0x0015
|
||||
#define NET_TYPE_DEAL_FLOP_CARDS 0x0016
|
||||
#define NET_TYPE_DEAL_TURN_CARD 0x0017
|
||||
#define NET_TYPE_DEAL_RIVER_CARD 0x0018
|
||||
#define NET_TYPE_ALL_IN_SHOW_CARDS 0x0019
|
||||
#define NET_TYPE_END_OF_HAND_SHOW_CARDS 0x001A
|
||||
#define NET_TYPE_END_OF_HAND_HIDE_CARDS 0x001B
|
||||
#define NET_TYPE_END_OF_GAME 0x001C
|
||||
#define NET_TYPE_LEAVE_CURRENT_GAME 0x000F
|
||||
#define NET_TYPE_START_EVENT 0x0010
|
||||
#define NET_TYPE_GAME_START 0x0011
|
||||
#define NET_TYPE_HAND_START 0x0012
|
||||
#define NET_TYPE_PLAYERS_TURN 0x0013
|
||||
#define NET_TYPE_PLAYERS_ACTION 0x0014
|
||||
#define NET_TYPE_PLAYERS_ACTION_DONE 0x0015
|
||||
#define NET_TYPE_PLAYERS_ACTION_REJECTED 0x0016
|
||||
#define NET_TYPE_DEAL_FLOP_CARDS 0x0017
|
||||
#define NET_TYPE_DEAL_TURN_CARD 0x0018
|
||||
#define NET_TYPE_DEAL_RIVER_CARD 0x0019
|
||||
#define NET_TYPE_ALL_IN_SHOW_CARDS 0x001A
|
||||
#define NET_TYPE_END_OF_HAND_SHOW_CARDS 0x001B
|
||||
#define NET_TYPE_END_OF_HAND_HIDE_CARDS 0x001C
|
||||
#define NET_TYPE_END_OF_GAME 0x001D
|
||||
|
||||
#define NET_TYPE_SEND_CHAT_TEXT 0x0200
|
||||
#define NET_TYPE_CHAT_TEXT 0x0201
|
||||
@@ -66,6 +67,8 @@ using namespace std;
|
||||
#define NET_PLAYER_FLAG_HUMAN 0x01
|
||||
#define NET_PLAYER_FLAG_ADMIN 0x02
|
||||
|
||||
#define NET_START_FLAG_FILL_WITH_CPU_PLAYERS 0x01
|
||||
|
||||
#define NET_ERR_JOIN_GAME_VERSION_NOT_SUPPORTED 0x0001
|
||||
#define NET_ERR_JOIN_GAME_SERVER_FULL 0x0002
|
||||
#define NET_ERR_JOIN_GAME_ALREADY_RUNNING 0x0003
|
||||
@@ -216,9 +219,17 @@ struct GCC_PACKED NetPacketKickPlayerData
|
||||
u_int32_t playerId;
|
||||
};
|
||||
|
||||
struct GCC_PACKED NetPacketLeaveCurrentGameData
|
||||
{
|
||||
NetPacketHeader head;
|
||||
u_int32_t reserved;
|
||||
};
|
||||
|
||||
struct GCC_PACKED NetPacketStartEventData
|
||||
{
|
||||
NetPacketHeader head;
|
||||
u_int16_t startFlags;
|
||||
u_int16_t reserved;
|
||||
};
|
||||
|
||||
struct GCC_PACKED NetPacketGameStartData
|
||||
@@ -1964,6 +1975,27 @@ NetPacketStartEvent::Clone() const
|
||||
return newPacket;
|
||||
}
|
||||
|
||||
void
|
||||
NetPacketStartEvent::SetData(const NetPacketStartEvent::Data &inData)
|
||||
{
|
||||
NetPacketStartEventData *tmpData = (NetPacketStartEventData *)GetRawData();
|
||||
|
||||
// Set the data.
|
||||
tmpData->startFlags = htons(inData.fillUpWithCpuPlayers ? NET_START_FLAG_FILL_WITH_CPU_PLAYERS : 0);
|
||||
|
||||
// Check the packet - just in case.
|
||||
Check(GetRawData());
|
||||
}
|
||||
|
||||
void
|
||||
NetPacketStartEvent::GetData(NetPacketStartEvent::Data &outData) const
|
||||
{
|
||||
// We assume that the data is valid. Validity has already been checked.
|
||||
NetPacketStartEventData *tmpData = (NetPacketStartEventData *)GetRawData();
|
||||
|
||||
outData.fillUpWithCpuPlayers = (ntohs(tmpData->startFlags) & NET_START_FLAG_FILL_WITH_CPU_PLAYERS);
|
||||
}
|
||||
|
||||
const NetPacketStartEvent *
|
||||
NetPacketStartEvent::ToNetPacketStartEvent() const
|
||||
{
|
||||
|
||||
@@ -293,20 +293,27 @@ ServerGameStateInit::InternalProcess(ServerGameThread &server, SessionWrapper se
|
||||
|
||||
if (packet->ToNetPacketStartEvent())
|
||||
{
|
||||
NetPacketStartEvent::Data startData;
|
||||
packet->ToNetPacketStartEvent()->GetData(startData);
|
||||
|
||||
server.ResetComputerPlayerList();
|
||||
int remainingSlots = server.GetGameData().maxNumberOfPlayers - server.GetCurNumberOfPlayers();
|
||||
for (int i = 1; i <= remainingSlots; i++)
|
||||
|
||||
if (startData.fillUpWithCpuPlayers)
|
||||
{
|
||||
boost::shared_ptr<PlayerData> tmpPlayerData(
|
||||
new PlayerData(server.GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL));
|
||||
int remainingSlots = server.GetGameData().maxNumberOfPlayers - server.GetCurNumberOfPlayers();
|
||||
for (int i = 1; i <= remainingSlots; i++)
|
||||
{
|
||||
boost::shared_ptr<PlayerData> tmpPlayerData(
|
||||
new PlayerData(server.GetLobbyThread().GetNextUniquePlayerId(), 0, PLAYER_TYPE_COMPUTER, PLAYER_RIGHTS_NORMAL));
|
||||
|
||||
ostringstream name;
|
||||
name << SERVER_COMPUTER_PLAYER_NAME << i;
|
||||
tmpPlayerData->SetName(name.str());
|
||||
server.AddComputerPlayer(tmpPlayerData);
|
||||
ostringstream name;
|
||||
name << SERVER_COMPUTER_PLAYER_NAME << i;
|
||||
tmpPlayerData->SetName(name.str());
|
||||
server.AddComputerPlayer(tmpPlayerData);
|
||||
|
||||
// Send "Player Joined" to other fully connected clients.
|
||||
server.SendToAllPlayers(CreateNetPacketPlayerJoined(*tmpPlayerData), SessionData::Game);
|
||||
// Send "Player Joined" to other fully connected clients.
|
||||
server.SendToAllPlayers(CreateNetPacketPlayerJoined(*tmpPlayerData), SessionData::Game);
|
||||
}
|
||||
}
|
||||
|
||||
server.InternalStartGame();
|
||||
|
||||
@@ -477,12 +477,19 @@ protected:
|
||||
class NetPacketStartEvent : public NetPacket
|
||||
{
|
||||
public:
|
||||
struct Data
|
||||
{
|
||||
bool fillUpWithCpuPlayers;
|
||||
};
|
||||
|
||||
NetPacketStartEvent();
|
||||
virtual ~NetPacketStartEvent();
|
||||
|
||||
virtual boost::shared_ptr<NetPacket> Clone() const;
|
||||
|
||||
void SetData(const Data &inData);
|
||||
void GetData(Data &outData) const;
|
||||
|
||||
virtual const NetPacketStartEvent *ToNetPacketStartEvent() const;
|
||||
|
||||
protected:
|
||||
|
||||
+6
-6
@@ -186,11 +186,11 @@ void Session::clientCreateGame(const GameData &gameData, const string &name, con
|
||||
myNetClient->SendCreateGame(gameData, name, password);
|
||||
}
|
||||
|
||||
void Session::clientJoinGame(const std::string &name, const std::string &password)
|
||||
void Session::clientJoinGame(unsigned gameId, const std::string &password)
|
||||
{
|
||||
if (!myNetClient)
|
||||
return; // only act if client is running.
|
||||
myNetClient->SendJoinGame(name, password);
|
||||
myNetClient->SendJoinGame(gameId, password);
|
||||
}
|
||||
|
||||
void Session::startNetworkServer()
|
||||
@@ -234,11 +234,11 @@ void Session::waitForNetworkServer(unsigned timeoutMsec)
|
||||
}
|
||||
}
|
||||
|
||||
void Session::sendStartEvent()
|
||||
void Session::sendStartEvent(bool fillUpWithCpuPlayers)
|
||||
{
|
||||
if (!myNetClient)
|
||||
return; // only act if client is running.
|
||||
myNetClient->SendStartEvent();
|
||||
myNetClient->SendStartEvent(fillUpWithCpuPlayers);
|
||||
}
|
||||
|
||||
void Session::sendClientPlayerAction()
|
||||
@@ -255,11 +255,11 @@ void Session::sendChatMessage(const std::string &message)
|
||||
myNetClient->SendChatMessage(message);
|
||||
}
|
||||
|
||||
void Session::kickPlayer(const std::string &playerName)
|
||||
void Session::kickPlayer(unsigned playerId)
|
||||
{
|
||||
if (!myNetClient)
|
||||
return; // only act if client is running.
|
||||
myNetClient->SendKickPlayer(playerName);
|
||||
myNetClient->SendKickPlayer(playerId);
|
||||
}
|
||||
|
||||
bool Session::isNetworkClientRunning() const
|
||||
|
||||
+3
-3
@@ -50,10 +50,10 @@ public:
|
||||
void startNetworkClientForLocalServer(const GameData &gameData);
|
||||
void terminateNetworkClient();
|
||||
void clientCreateGame(const GameData &gameData, const std::string &name, const std::string &password);
|
||||
void clientJoinGame(const std::string &name, const std::string &password);
|
||||
void clientJoinGame(unsigned gameId, const std::string &password);
|
||||
|
||||
void startNetworkServer();
|
||||
void sendStartEvent();
|
||||
void sendStartEvent(bool fillUpWithCpuPlayers);
|
||||
void terminateNetworkServer();
|
||||
void waitForNetworkServer(unsigned timeoutMsec);
|
||||
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
int getCurrentGameID() const { return currentGameID; }
|
||||
|
||||
void sendChatMessage(const std::string &message);
|
||||
void kickPlayer(const std::string &playerName);
|
||||
void kickPlayer(unsigned playerId);
|
||||
|
||||
bool isNetworkClientRunning() const; // TODO hack
|
||||
bool isNetworkServerRunning() const; // TODO hack
|
||||
|
||||
Reference in New Issue
Block a user