Disable gfMoreWind for land objects on turn end only after a fixed-time delay
15s sounds much, but it's the average amount for gfMineStrike mines to settle
naturally. And it would be very confusing to see falling mines suddenly not
caring about gfMoreWind for no apparent reason.
Note this whole thing is a giant hack anyway, to prevent a turn being
blocked by infinitely bouncing mines.
The better solution would be to help gfMoreWind-affected land objects settle
naturally more reliably even under extreme wind.
But this commit is "good enough" for now.
If you don't like the delay, you can always tweak the constant.
#ifndef NET_SESSION_H
#define NET_SESSION_H
#include <QSharedPointer>
#include <QSslSocket>
#include <QStringList>
#include <QUrl>
class PlayersListModel;
class RoomsListModel;
class NetSession : public QObject {
Q_OBJECT
const int cMinServerVersion = 3;
const int cProtocolVersion = 60;
// clang-format off
Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
Q_PROPERTY(QAbstractSocket::SocketState state READ state NOTIFY stateChanged)
Q_PROPERTY(QString nickname READ nickname WRITE setNickname NOTIFY nicknameChanged)
Q_PROPERTY(SessionState sessionState READ sessionState NOTIFY sessionStateChanged)
Q_PROPERTY(QString room READ room NOTIFY roomChanged)
Q_PROPERTY(QString passwordHash READ passwordHash WRITE setPasswordHash NOTIFY passwordHashChanged)
// clang-format on
public:
enum SessionState { NotConnected, Login, Authentication, Lobby, Room, Game };
Q_ENUMS(SessionState)
explicit NetSession(QObject *parent = nullptr);
~NetSession() override;
QUrl url() const;
QAbstractSocket::SocketState state() const;
QString nickname() const;
SessionState sessionState() const;
QString room() const;
QString passwordHash() const;
public slots:
void open();
void close();
void setUrl(const QUrl &url);
void setNickname(const QString &nickname);
void setPasswordHash(const QString &passwordHash);
signals:
void urlChanged(const QUrl url);
void stateChanged(QAbstractSocket::SocketState state);
void nicknameChanged(const QString &nickname);
void sessionStateChanged(SessionState sessionState);
void warning(const QString &message);
void error(const QString &message);
void roomChanged(const QString &room);
void passwordHashChanged(const QString &passwordHash);
void passwordAsked();
private slots:
void onReadyRead();
void parseNetMessage(const QStringList &message);
void handleConnected(const QStringList ¶meters);
void handlePing(const QStringList ¶meters);
void handleBye(const QStringList ¶meters);
void handleUnknownCommand(const QStringList ¶meters);
void handleAddTeam(const QStringList ¶meters);
void handleAskPassword(const QStringList ¶meters);
void handleBanList(const QStringList ¶meters);
void handleCfg(const QStringList ¶meters);
void handleChat(const QStringList ¶meters);
void handleClientFlags(const QStringList ¶meters);
void handleEm(const QStringList ¶meters);
void handleError(const QStringList ¶meters);
void handleHhNum(const QStringList ¶meters);
void handleInfo(const QStringList ¶meters);
void handleJoined(const QStringList ¶meters);
void handleJoining(const QStringList ¶meters);
void handleKicked(const QStringList ¶meters);
void handleLeft(const QStringList ¶meters);
void handleLobbyJoined(const QStringList ¶meters);
void handleLobbyLeft(const QStringList ¶meters);
void handleNick(const QStringList ¶meters);
void handleNotice(const QStringList ¶meters);
void handlePong(const QStringList ¶meters);
void handleProto(const QStringList ¶meters);
void handleRedirect(const QStringList ¶meters);
void handleRemoveTeam(const QStringList ¶meters);
void handleReplayStart(const QStringList ¶meters);
void handleRoomAbandoned(const QStringList ¶meters);
void handleRoom(const QStringList ¶meters);
void handleRooms(const QStringList ¶meters);
void handleRoundFinished(const QStringList ¶meters);
void handleRunGame(const QStringList ¶meters);
void handleServerAuth(const QStringList ¶meters);
void handleServerMessage(const QStringList ¶meters);
void handleServerVars(const QStringList ¶meters);
void handleTeamAccepted(const QStringList ¶meters);
void handleTeamColor(const QStringList ¶meters);
void handleWarning(const QStringList ¶meters);
void send(const QString &message);
void send(const QString &message, const QString ¶m);
void send(const QString &message, const QStringList ¶meters);
void send(const QStringList &message);
void sendPassword();
void setSessionState(SessionState sessionState);
void setRoom(const QString &room);
private:
QUrl m_url;
QSharedPointer<QTcpSocket> m_socket;
QSharedPointer<PlayersListModel> m_playersModel;
QSharedPointer<RoomsListModel> m_roomsModel;
QString m_nickname;
QStringList m_buffer;
SessionState m_sessionState;
QString m_serverAuthHash;
QString m_room;
QString m_serverSalt;
QString m_serverHash;
QString m_clientSalt;
QString m_passwordHash;
Q_DISABLE_COPY(NetSession)
};
#endif // NET_SESSION_H