Skip to content

Commit fcdec19

Browse files
authored
Added Chat Log
Merge pull request #2 from Kgamer77/message-system
2 parents 93b45c1 + 37c5b0e commit fcdec19

9 files changed

Lines changed: 157 additions & 22 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ compile_commands.json
1313

1414
Ultimate_SMO_Compiler.bat
1515
Makefile
16+
/.vs

include/debugMenu.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ extern sead::TextWriter *gTextWriter;
1818

1919
bool setupDebugMenu(agl::DrawContext* context, sead::Viewport* viewport);
2020

21-
void drawBackground(agl::DrawContext *context);
21+
void drawBackground(agl::DrawContext *context);
22+
23+
void drawChatBackground(agl::DrawContext *context, float rows);

include/packets/MessagePacket.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include "Packet.h"
4+
5+
struct PACKED MessagePacket : Packet {
6+
MessagePacket() : Packet() {
7+
this->mType = PacketType::MESSAGE;
8+
mPacketSize = sizeof(MessagePacket) - sizeof(Packet);
9+
};
10+
11+
short senderId = 0;
12+
short messageType = 0;
13+
char message[MESSAGESIZE] = {};
14+
};

include/packets/Packet.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#define PACKBUFSIZE 0x30
1111
#define COSTUMEBUFSIZE 0x20
12+
#define MESSAGESIZE 0x4B
1213

1314
#define MAXPACKSIZE 0x100
1415

@@ -27,6 +28,7 @@ enum PacketType : short {
2728
CAPTUREINF,
2829
CHANGESTAGE,
2930
CMD,
31+
MESSAGE,
3032
End // end of enum for bounds checking
3133
};
3234

@@ -45,7 +47,8 @@ USED static const char *packetNames[] = {
4547
"Moon Collection",
4648
"Capture Info",
4749
"Change Stage",
48-
"Server Command"
50+
"Server Command",
51+
"Message"
4952
};
5053

5154
enum SenderType {
@@ -80,6 +83,7 @@ struct PACKED Packet {
8083
#include "packets/GameInf.h"
8184
#include "packets/TagInf.h"
8285
//#include "packets/FreezeInf.h"
86+
#include "packets/MessagePacket.h"
8387
#include "packets/CostumeInf.h"
8488
#include "packets/ServerCommand.h"
8589
#include "packets/ShineCollect.h"

include/server/Client.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ class Client {
158158
static sead::FixedSafeString<0x20> getUsername() {
159159
return sInstance ? sInstance->mUsername : sead::FixedSafeString<0x20>::cEmptyString;
160160
}
161+
static sead::FixedSafeString<MESSAGESIZE> getMessage(int index);
162+
static void setMessage(int index, const char* message);
161163

162164
// ===== SERVER CONFIGURATION =====
163165
static const int getCurrentPort();
@@ -223,6 +225,7 @@ class Client {
223225
void updateCaptureInfo(CaptureInf* packet);
224226
void sendToStage(ChangeStagePacket* packet);
225227
void disconnectPlayer(PlayerDC *packet);
228+
void updateMessages(MessagePacket *packet);
226229

227230
// ===== UTILITY METHODS =====
228231
PuppetInfo* findPuppetInfo(const nn::account::Uid& id, bool isFindAvailable);
@@ -247,6 +250,9 @@ class Client {
247250
int collectedShineCount = 0;
248251
int lastCollectedShine = -1;
249252

253+
// ===== MESSAGE MEMBERS =====
254+
sead::SafeArray<sead::FixedSafeString<MESSAGESIZE>, 3> messages;
255+
250256
// ===== PACKET BACKUPS =====
251257
PlayerInf lastPlayerInfPacket = PlayerInf();
252258
GameInf lastGameInfPacket = GameInf();

source/debugMenu.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,17 @@ void drawBackground(agl::DrawContext *context) {
4343
agl::utl::DevTools::drawTriangleImm(context, p1, p2, p3, c);
4444
agl::utl::DevTools::drawTriangleImm(context, p3, p4, p2, c);
4545

46+
}
47+
48+
void drawChatBackground(agl::DrawContext* context, float rows) {
49+
sead::Vector3<float> p1(-1, -.50 - 0.05 * rows, 0); // top left
50+
sead::Vector3<float> p2(-.2, -.50 - 0.05 * rows, 0); // top right
51+
sead::Vector3<float> p3(-1, -.7, 0); // bottom left
52+
sead::Vector3<float> p4(-.2, -.7, 0); // bottom right
53+
sead::Color4f c(.1, .1, .1, .7);
54+
55+
agl::utl::DevTools::beginDrawImm(context, sead::Matrix34<float>::ident,
56+
sead::Matrix44<float>::ident);
57+
agl::utl::DevTools::drawTriangleImm(context, p1, p2, p3, c);
58+
agl::utl::DevTools::drawTriangleImm(context, p3, p4, p2, c);
4659
}

source/main.cpp

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
// ===== GLOBAL VARIABLES =====
5656
static int pInfSendTimer = 0;
5757
static int gameInfSendTimer = 0;
58+
static int chatUpdateTimer = 0;
5859
static int debugPuppetIndex = 0;
5960
static int debugCaptureIndex = 0;
6061
static int pageIndex = 0;
@@ -90,6 +91,31 @@ void updatePlayerInfo(GameDataHolderAccessor holder, PlayerActorBase* playerBase
9091
gameInfSendTimer = 0;
9192
}
9293

94+
if (chatUpdateTimer >= 300)
95+
{
96+
if (!Client::getMessage(0).isEmpty())
97+
{
98+
Client::setMessage(0, "");
99+
}
100+
if (!Client::getMessage(1).isEmpty())
101+
{
102+
Client::setMessage(0, Client::getMessage(1).cstr());
103+
Client::setMessage(1, "");
104+
}
105+
if (!Client::getMessage(2).isEmpty())
106+
{
107+
Client::setMessage(1, Client::getMessage(2).cstr());
108+
Client::setMessage(2, "");
109+
}
110+
chatUpdateTimer = 0;
111+
}
112+
else if (!Client::getMessage(0).isEmpty() || !Client::getMessage(1).isEmpty() ||
113+
!Client::getMessage(2).isEmpty())
114+
{
115+
chatUpdateTimer++;
116+
}
117+
118+
93119
pInfSendTimer++;
94120
gameInfSendTimer++;
95121
}
@@ -155,32 +181,32 @@ void drawMainHook(HakoniwaSequence* curSequence, sead::Viewport* viewport, sead:
155181
gTextWriter->printf("Your TCP status: %s\n", socket->getStateChar());
156182

157183
sead::Heap* clientHeap = Client::getClientHeap();
158-
if (clientHeap) {
184+
if (clientHeap) {
159185
sead::Heap* gmHeap = GameModeManager::instance()->getHeap();
160-
if (gmHeap) {
161-
// Validate heaps before using them
162-
if (clientHeap->getSize() > 0 && gmHeap->getSize() > 0) {
163-
size_t clientUsed = clientHeap->getSize() - clientHeap->getFreeSize();
164-
size_t clientTotal = clientHeap->getSize();
165-
size_t gmUsed = gmHeap->getSize() - gmHeap->getFreeSize();
166-
size_t gmTotal = gmHeap->getSize();
186+
if (gmHeap) {
187+
// Validate heaps before using them
188+
if (clientHeap->getSize() > 0 && gmHeap->getSize() > 0) {
189+
size_t clientUsed = clientHeap->getSize() - clientHeap->getFreeSize();
190+
size_t clientTotal = clientHeap->getSize();
191+
size_t gmUsed = gmHeap->getSize() - gmHeap->getFreeSize();
192+
size_t gmTotal = gmHeap->getSize();
167193

168-
gTextWriter->printf(
169-
"Heap Use: %.1f/%.0f (Client) %.1f/%.0f (Gmode)\n",
170-
0.0009765625 * clientUsed,
171-
0.0009765625 * clientTotal,
172-
0.0009765625 * gmUsed,
173-
0.0009765625 * gmTotal
174-
);
194+
gTextWriter->printf(
195+
"Heap Use: %.1f/%.0f (Client) %.1f/%.0f (Gmode)\n",
196+
0.0009765625 * clientUsed,
197+
0.0009765625 * clientTotal,
198+
0.0009765625 * gmUsed,
199+
0.0009765625 * gmTotal
200+
);
201+
} else {
202+
gTextWriter->printf("Heap Use: Invalid heap sizes\n");
203+
}
175204
} else {
176-
gTextWriter->printf("Heap Use: Invalid heap sizes\n");
205+
gTextWriter->printf("Heap Use: GameMode heap unavailable\n");
177206
}
178207
} else {
179-
gTextWriter->printf("Heap Use: GameMode heap unavailable\n");
208+
gTextWriter->printf("Heap Use: Client heap unavailable\n");
180209
}
181-
} else {
182-
gTextWriter->printf("Heap Use: Client heap unavailable\n");
183-
}
184210

185211
gTextWriter->printf(
186212
"Queue Count: %d/%d (Send) %d/%d (Receive)\n",
@@ -221,6 +247,24 @@ if (clientHeap) {
221247
GameMode gameMode = GameModeManager::instance()->getGameMode();
222248
GameModeBase* gameModeBase = GameModeManager::instance()->getMode<GameModeBase>();
223249

250+
if (!(Client::getMessage(0) == Client::getMessage(1) &&
251+
Client::getMessage(1) == Client::getMessage(2))) {
252+
if (Client::getMessage(0) == Client::getMessage(1))
253+
drawChatBackground((agl::DrawContext*)drawContext, 3.f);
254+
else if (Client::getMessage(1).isEmpty())
255+
drawChatBackground((agl::DrawContext*)drawContext, 2.f);
256+
else
257+
drawChatBackground((agl::DrawContext*)drawContext, 1.f);
258+
259+
gTextWriter->beginDraw();
260+
gTextWriter->setCursorFromTopLeft(sead::Vector2f(10.f, (dispHeight * 7 / 10) + 60.f));
261+
gTextWriter->setScaleFromFontHeight(15.f);
262+
263+
gTextWriter->printf("%s\n", Client::getMessage(0).cstr());
264+
gTextWriter->printf("%s\n", Client::getMessage(1).cstr());
265+
gTextWriter->printf("%s\n", Client::getMessage(2).cstr());
266+
}
267+
224268
gTextWriter->printf("(ZR ←)------------ Page %d/%d -------------(ZR →)\n", pageIndex + 1, maxPages);
225269

226270
switch (pageIndex)

source/server/Client.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ Client::Client() {
4848

4949
collectedShineCount = 0;
5050

51+
messages.fill(sead::FixedSafeString<MESSAGESIZE>());
52+
5153
mShineArray.allocBuffer(100, nullptr); // max of 100 shine actors in buffer
5254

5355
nn::account::GetLastOpenedUser(&mUserID);
@@ -406,6 +408,9 @@ void Client::readFunc() {
406408
case PacketType::SHINECOLL:
407409
updateShineInfo((ShineCollect*)curPacket);
408410
break;
411+
case PacketType::MESSAGE:
412+
updateMessages((MessagePacket*)curPacket);
413+
break;
409414
case PacketType::PLAYERDC:
410415
Logger::log("Received Player Disconnect!\n");
411416
curPacket->mUserID.print();
@@ -1016,6 +1021,28 @@ void Client::updateGameInfo(GameInf *packet) {
10161021
}
10171022
}
10181023

1024+
/**
1025+
* @brief
1026+
*
1027+
* @param packet
1028+
*/
1029+
void Client::updateMessages(MessagePacket* packet)
1030+
{
1031+
if (!sInstance)
1032+
{
1033+
return;
1034+
}
1035+
1036+
for (int i = 0; i < 3; i++)
1037+
{
1038+
if (sInstance->messages[i].isEmpty())
1039+
{
1040+
messages[i].append(packet->message);
1041+
}
1042+
}
1043+
1044+
}
1045+
10191046
/**
10201047
* @brief
10211048
*
@@ -1434,6 +1461,30 @@ void Client::clearArrays() {
14341461
}
14351462
}
14361463

1464+
/**
1465+
* @brief
1466+
*
1467+
*/
1468+
sead::FixedSafeString<MESSAGESIZE> Client::getMessage(int index) {
1469+
if (!sInstance) {
1470+
return sead::FixedSafeString<MESSAGESIZE>();
1471+
}
1472+
1473+
return sInstance->messages[index];
1474+
}
1475+
1476+
/**
1477+
* @brief
1478+
*
1479+
*/
1480+
void Client::setMessage(int index, const char* message) {
1481+
if (!sInstance) {
1482+
return;
1483+
}
1484+
1485+
sInstance->messages[index] = message;
1486+
}
1487+
14371488
/**
14381489
* @brief
14391490
*

0 commit comments

Comments
 (0)