1 /////////////////////////////////////////
2 //
3 //             OpenLieroX
4 //
5 // code under LGPL, based on JasonBs work,
6 // enhanced by Dark Charlie and Albert Zeyer
7 //
8 //
9 /////////////////////////////////////////
10 
11 
12 
13 #ifndef __CCLIENT_NET_ENGINE_H__
14 #define __CCLIENT_NET_ENGINE_H__
15 
16 
17 #include <string>
18 #include "Consts.h"
19 
20 
21 class CClient;
22 class CBytestream;
23 
24 class CClientNetEngine {
25 
26 protected:
27 
28 	CClient * client;
29 
30 public:
31 	// Constructor
CClientNetEngine(CClient * _client)32 	CClientNetEngine(CClient * _client): client(_client) { }
33 
~CClientNetEngine()34 	virtual ~CClientNetEngine() { }
35 
36 	// Parsing
37 	void				ParseConnectionlessPacket(CBytestream *bs);
38 	bool				ParsePacket(CBytestream *bs);
39 
40 	// Sending
41 	virtual void		SendGameReady();
42 	virtual void		SendDeath(int victim, int killer);
43 	virtual void		SendText(const std::string& sText, std::string sWormName);
44 	virtual void		SendWormDetails();
45 	virtual void		SendGrabBonus(int id, int wormid);
46 	virtual void		SendUpdateLobby(bool ready = true);
47 	virtual void		SendDisconnect();
48 	virtual void		SendFileData();
SendChatCommandCompletionRequest(const std::string & startStr)49 	virtual void		SendChatCommandCompletionRequest(const std::string& startStr) { return; }
50 	virtual void		SendAFK(int wormid, AFK_TYPE afkType, const std::string & message = "") { return; }
51 	virtual void		SendReportDamage(bool flush = false) { return; }
QueueReportDamage(int victim,float damage,int offender)52 	virtual void		QueueReportDamage(int victim, float damage, int offender) { return; }
53 #ifdef FUZZY_ERROR_TESTING
54 	void				SendRandomPacket();
55 #endif
56 
57 private:
58 	void		SendTextInternal(const std::string& sText, const std::string& sWormName);
59 
60 protected:
61 
62 	// Internal details that may be used by child class
63 	// I expect child class will redirect most in-lobby messages to parent class
64 	void		 ParseChallenge(CBytestream *bs);
65 	void		 ParseConnected(CBytestream *bs);
66 	void		 ParsePong();
67 	void		 ParseTimeIs(CBytestream *bs);
68 	void		 ParseTraverse(CBytestream *bs);
69 	void		 ParseConnectHere(CBytestream *bs);
70 
71 	virtual bool ParsePrepareGame(CBytestream *bs);
72 	virtual void ParseScoreUpdate(CBytestream *bs);
73 	virtual void ParseUpdateLobbyGame(CBytestream *bs);
ParseChatCommandCompletionSolution(CBytestream * bs)74 	virtual void ParseChatCommandCompletionSolution(CBytestream* bs) { return; }
ParseChatCommandCompletionList(CBytestream * bs)75 	virtual void ParseChatCommandCompletionList(CBytestream* bs) { return; }
ParseAFK(CBytestream * bs)76 	virtual void ParseAFK(CBytestream* bs) { return; }
ParseReportDamage(CBytestream * bs)77     virtual void ParseReportDamage(CBytestream *bs) { return; }
ParseHideWorm(CBytestream * bs)78 	virtual void ParseHideWorm(CBytestream *bs) { return; }
79 	virtual void ParseGotoLobby(CBytestream *bs);
80 	virtual void ParseStartGame(CBytestream *bs);
81 	virtual void ParseSpawnWorm(CBytestream *bs);
82 	virtual void ParseWormDown(CBytestream *bs);
83 	virtual void ParseUpdateWorms(CBytestream *bs);
84 	virtual int  ParseWormInfo(CBytestream *bs);
85 
86 	void		 ParseUpdateLobby(CBytestream *bs);
87 	void		 ParseWormWeaponInfo(CBytestream *bs);
88 	void		 ParseText(CBytestream *bs);
89 	void		 ParseGameOver(CBytestream *bs);
90 	void		 ParseSpawnBonus(CBytestream *bs);
91 	void		 ParseTagUpdate(CBytestream *bs);
92 	void		 ParseCLReady(CBytestream *bs);
93 	void		 ParseWormsOut(CBytestream *bs);
94 	void		 ParseServerLeaving(CBytestream *bs);
95 	void		 ParseSingleShot(CBytestream *bs);
96 	void		 ParseMultiShot(CBytestream *bs);
97 	void		 ParseUpdateStats(CBytestream *bs);
98 	void		 ParseDestroyBonus(CBytestream *bs);
99     void		 ParseDropped(CBytestream *bs);
100     void		 ParseSendFile(CBytestream *bs);
101 	virtual void ParseFlagInfo(CBytestream* bs);
102 	virtual void ParseTeamScoreUpdate(CBytestream* bs);
103 	virtual void ParseWormProps(CBytestream* bs);
104 	virtual void ParseSelectWeapons(CBytestream* bs);
105 
106 	void		 ParseUpdateLobby_Internal(CBytestream *bs, std::vector<byte> * updatedWorms = NULL); // Second parameter is used only in CClientNetEngineBeta9::ParseUpdateLobby()
107 
108 };
109 
110 // TODO: maybe add CClientNetEngineBeta5 for map/mod downloading - SendFileData() and ParseSendFile() funcs
111 class CClientNetEngineBeta7: public CClientNetEngine {
112 public:
CClientNetEngineBeta7(CClient * _client)113 	CClientNetEngineBeta7( CClient * _client ): CClientNetEngine( _client ) { }
114 
115 	virtual void SendChatCommandCompletionRequest(const std::string& startStr);
116 	virtual void SendAFK(int wormid, AFK_TYPE afkType, const std::string & message = "");
117 
118 	virtual bool ParsePrepareGame(CBytestream *bs);
119 	virtual void ParseUpdateLobbyGame(CBytestream *bs);
120 	virtual void ParseChatCommandCompletionSolution(CBytestream* bs);
121 	virtual void ParseChatCommandCompletionList(CBytestream* bs);
122 	virtual void ParseAFK(CBytestream* bs);
123 };
124 
125 class CClientNetEngineBeta9: public CClientNetEngineBeta7 {
126 public:
CClientNetEngineBeta9(CClient * _client)127 	CClientNetEngineBeta9( CClient * _client ): CClientNetEngineBeta7( _client )
128 	{
129 		fLastDamageReportSent = AbsTime();
130 	}
131 
132 	virtual bool ParsePrepareGame(CBytestream *bs);
133 	virtual void ParseUpdateLobbyGame(CBytestream *bs);
134 	virtual void ParseReportDamage(CBytestream *bs);
135 	virtual void ParseScoreUpdate(CBytestream *bs);
136 	virtual void ParseHideWorm(CBytestream *bs);
137 	virtual int  ParseWormInfo(CBytestream *bs);
138 	virtual void ParseStartGame(CBytestream *bs);
139 	virtual void ParseFlagInfo(CBytestream* bs);
140 	virtual void ParseTeamScoreUpdate(CBytestream* bs);
141 	virtual void ParseWormProps(CBytestream* bs);
142 	virtual void ParseSelectWeapons(CBytestream* bs);
143 
144     void		 ParseFeatureSettings(CBytestream* bs);
145 
146 	virtual void SendDeath(int victim, int killer);
147 	virtual void SendReportDamage(bool flush = false);
148 	virtual void QueueReportDamage(int victim, float damage, int offender);
149 
150 private:
151     AbsTime fLastDamageReportSent;
152     std::map< std::pair< int, int >, float > cDamageReport;
153 };
154 
155 #endif  //  __CCLIENT_NET_ENGINE_H__
156