From 0add9572243bbdc95effa08af3ed5843d7288fa6 Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Sat, 25 Feb 2023 19:51:47 +0000 Subject: [PATCH 1/3] Changed from bzero to memset - All instances of bzero have been replaced in an effort to make SilverMUD slightly easier to port. --- src/client/SilverMUDClient.c | 3 ++- src/gamelogic.c | 20 ++++++++++---------- src/server/SilverMUDServer.c | 5 +++-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/client/SilverMUDClient.c b/src/client/SilverMUDClient.c index ea6155c..3c260d3 100644 --- a/src/client/SilverMUDClient.c +++ b/src/client/SilverMUDClient.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ void * messageSender(void * parameters) // Send the message off to the server: messageSend(tlsSession, &sendBuffer); - bzero(&sendBuffer, sizeof(char) * MAX); + memset(&sendBuffer, 0, sizeof(char) * MAX); } // Rejoin the main thread: diff --git a/src/gamelogic.c b/src/gamelogic.c index 36c5d55..5c24d0f 100644 --- a/src/gamelogic.c +++ b/src/gamelogic.c @@ -108,7 +108,7 @@ void * gameLogicHandler(void * parameters) free(recipients); } } - bzero(currentInput, sizeof(inputMessage)); + memset(currentInput, 0, sizeof(inputMessage)); currentInput = NULL; threadParameters->inputQueue->lock = false; popQueue(threadParameters->inputQueue); @@ -204,7 +204,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) pushQueue(parameters->outputQueue, lookOutputMessage, OUTPUT_MESSAGE); //queueTargetedOutputMessage(parameters->outputQueue, lookMessage, ¤tCommand->caller, 1); - bzero(lookMessage, sizeof(userMessage)); + memset(lookMessage, 0, sizeof(userMessage)); // Loop through the paths and send the appropriate amount of messages: int charCount = 13; @@ -221,7 +221,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) // Queue the outputMessage: pushQueue(parameters->outputQueue, lookOutputMessage, OUTPUT_MESSAGE); - bzero(lookMessage, sizeof(userMessage)); + memset(lookMessage, 0, sizeof(userMessage)); charCount = 0; } snprintf(formattedString, 64, "\n\t%ld. %s", index + 1, @@ -278,7 +278,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) // Queue the outputMessage: pushQueue(parameters->outputQueue, statOutputMessage, OUTPUT_MESSAGE); - bzero(statMessage->messageContent, sizeof(char) * MAX); + memset(statMessage->messageContent, 0, sizeof(char) * MAX); if (currentCommand->caller->skills->head != NULL) { size_t skillIndex = 0; @@ -299,7 +299,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) // Queue the outputMessage: pushQueue(parameters->outputQueue, statOutputMessage, OUTPUT_MESSAGE); - bzero(statMessage, sizeof(userMessage)); + memset(statMessage, 0, sizeof(userMessage)); charCount = 0; break; } @@ -519,7 +519,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) // Queue the outputMessage: pushQueue(parameters->outputQueue, listOutputMessage, OUTPUT_MESSAGE); - bzero(listMessage, sizeof(userMessage)); + memset(listMessage, 0, sizeof(userMessage)); charCount = 0; addNewline = false; } @@ -695,8 +695,8 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) } // Remove the current command and unlock the queue: - bzero(currentCommand->command, sizeof(char) * 16); - bzero(currentCommand->arguments, sizeof(char) * MAX); + memset(currentCommand->command, 0, sizeof(char) * 16); + memset(currentCommand->arguments, 0, sizeof(char) * MAX); currentCommand = NULL; queue->lock = false; popQueue(queue); @@ -747,7 +747,7 @@ outcome statCheck(playerInfo * player, int chance, coreStat statToCheck) return ERROR; } } - int attempt = (random() % 100) + modifier; + int attempt = (rand() % 100) + modifier; if (attempt >= chance) { if (attempt >= 98) @@ -820,7 +820,7 @@ outcome skillCheck(playerInfo * player, int chance, char * skillName, size_t ski } // Attempt the check: - int attempt = (random() % 100) + modifier; + int attempt = (rand() % 100) + modifier; if (attempt >= chance) { if (attempt >= 98) diff --git a/src/server/SilverMUDServer.c b/src/server/SilverMUDServer.c index a1dfe49..a18be2f 100644 --- a/src/server/SilverMUDServer.c +++ b/src/server/SilverMUDServer.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -131,7 +132,7 @@ int main(int argc, char ** argv) slowPrint("\n--==== \033[33;40mSILVERKIN INDUSTRIES\033[0m COMM-LINK SERVER ====--\nVersion Alpha 0.5\n", delay); // Seed random number generator from the current time: - srandom((unsigned)time(¤tTime)); + srand((unsigned)time(¤tTime)); // Initialize the sockets to 0, so we don't crash. for (int index = 0; index < PLAYERCOUNT; index++) @@ -152,7 +153,7 @@ int main(int argc, char ** argv) slowPrint("\tSocket Creation is:\t\033[32;40mGREEN.\033[0m\n", delay); } - bzero(&serverAddress, sizeof(serverAddress)); + memset(&serverAddress, 0, sizeof(serverAddress)); // Assign IP and port: serverAddress.sin_family = AF_INET; From 8814a45c522bad68ea26315b0de7c88cedcdcdfc Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Sat, 25 Feb 2023 23:04:35 +0000 Subject: [PATCH 2/3] ALlowed for the server to change client prompt. - The server can now send some data in the normally unused "senderName" field for a server mesasge. - This will be set as the prompt for the client. --- src/client/SilverMUDClient.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/client/SilverMUDClient.c b/src/client/SilverMUDClient.c index 3c260d3..0e22b63 100644 --- a/src/client/SilverMUDClient.c +++ b/src/client/SilverMUDClient.c @@ -29,6 +29,7 @@ typedef struct threadparameters bool loggingFlag; WINDOW * window; int characterDelay; + char * prompt; } threadparameters; // Use sockaddr as a type: @@ -45,13 +46,15 @@ void * messageSender(void * parameters) FILE * loggingStream = threadParameters->loggingStream; bool loggingFlag = threadParameters->loggingFlag; WINDOW * window = threadParameters->window; + char * prompt = threadParameters->prompt; userMessage sendBuffer; // Repeatedly get input from the user, place it in a userMessage, and send it to the server: while (!shouldExit) { // Print the prompt: - wprintw(window, "\n\n\nCOMM-LINK> "); + wprintw(window, "\n\n\n"); + wprintw(window, prompt); if (wgetnstr(window, sendBuffer.messageContent, MAX) == ERR) { // Quit if there's any funny business with getting input: @@ -111,8 +114,15 @@ void * messageReceiver(void * parameters) // Check if it's a server message: else if (receiveBuffer.senderName[0] == '\0') { + // Check if the server wants to change the prompt: + if (receiveBuffer.senderName[1] != '\0') + { + strncpy(threadParameters->prompt, &receiveBuffer.senderName[1], 63); + threadParameters->prompt[63] = '\0'; + } + // Check if it's a command to disconnect: - if (receiveBuffer.messageContent[0] == '\0') + if (receiveBuffer.messageContent[0] == '\0' && receiveBuffer.senderName[1] != '\0') { shouldExit = true; pthread_exit(NULL); @@ -307,6 +317,7 @@ int main(int argc, char ** argv) logArea->tlsSession = tlsSession; logArea->loggingFlag = chatLogging; logArea->characterDelay = characterDelay; + if (chatLog != NULL) { logArea->loggingStream = chatLog; @@ -314,13 +325,18 @@ int main(int argc, char ** argv) messageArea->window = newwin(3, COLS - 2, LINES - 4, 1); messageArea->tlsSession = tlsSession; messageArea->loggingFlag = gameLogging; - + // Set the appropriate log pointers: if (gameLog != NULL) { messageArea->loggingStream = gameLog; } - + + // Set up the string to hold the current "prompt" that the server has sent: + messageArea->prompt = calloc(64, sizeof(char)); + strcpy(messageArea->prompt, "> "); + logArea->prompt = messageArea->prompt; + // Set the two windows to scroll: scrollok(logArea->window, true); scrollok(messageArea->window, true); From 408033d48a0d85b5e458bd969a4c4eb3267edada Mon Sep 17 00:00:00 2001 From: Barry Kane Date: Sun, 26 Feb 2023 00:16:07 +0000 Subject: [PATCH 3/3] Talking now changes the prompt. - The server will now change the prompt for a user who begins a conversation with another player to that player's name. --- src/client/SilverMUDClient.c | 12 ++++++++---- src/gamelogic.c | 25 +++++++++++++++++++++++-- src/server/SilverMUDServer.c | 2 +- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/client/SilverMUDClient.c b/src/client/SilverMUDClient.c index 0e22b63..6209eff 100644 --- a/src/client/SilverMUDClient.c +++ b/src/client/SilverMUDClient.c @@ -52,9 +52,13 @@ void * messageSender(void * parameters) // Repeatedly get input from the user, place it in a userMessage, and send it to the server: while (!shouldExit) { - // Print the prompt: + usleep(100000); + // Clear the window: wprintw(window, "\n\n\n"); + + // Print the prompt: wprintw(window, prompt); + if (wgetnstr(window, sendBuffer.messageContent, MAX) == ERR) { // Quit if there's any funny business with getting input: @@ -122,7 +126,7 @@ void * messageReceiver(void * parameters) } // Check if it's a command to disconnect: - if (receiveBuffer.messageContent[0] == '\0' && receiveBuffer.senderName[1] != '\0') + if (receiveBuffer.messageContent[0] == '\0') { shouldExit = true; pthread_exit(NULL); @@ -333,8 +337,8 @@ int main(int argc, char ** argv) } // Set up the string to hold the current "prompt" that the server has sent: - messageArea->prompt = calloc(64, sizeof(char)); - strcpy(messageArea->prompt, "> "); + messageArea->prompt = calloc(32, sizeof(char)); + strcpy(messageArea->prompt, " Login > "); logArea->prompt = messageArea->prompt; // Set the two windows to scroll: diff --git a/src/gamelogic.c b/src/gamelogic.c index 5c24d0f..88782e8 100644 --- a/src/gamelogic.c +++ b/src/gamelogic.c @@ -599,6 +599,7 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) { currentCommand->caller->talkingWith = NULL; strcpy(talkMessage->messageContent, "Conversation ended."); + strncat(&talkMessage->senderName[1], " > ", 4); } else { @@ -609,6 +610,8 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) currentCommand->caller->talkingWith = &(parameters->connectedPlayers[playerIndex]); // Fill out the message to inform the receiving user what is happening: + strncat(&talkMessage->senderName[1], currentCommand->caller->playerName, 27); + strncat(&talkMessage->senderName[1], " > ", 4); strncpy(talkMessage->messageContent, currentCommand->caller->playerName, 31); strcat(talkMessage->messageContent, " is talking to you."); @@ -626,9 +629,12 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) strcat(talkMessage->messageContent, parameters->connectedPlayers[playerIndex].playerName); } } - } - + if(talkMessage->messageContent[0] == '\0') + { + strcpy(talkMessage->messageContent, "There is no player by that name connected."); + } + // Allocate an outputMessage for the queue: outputMessage * talkOutputMessage = createTargetedOutputMessage(talkMessage, ¤tCommand->caller, 1); @@ -683,6 +689,21 @@ int evaluateNextCommand(gameLogicParameters * parameters, queue * queue) { strncpy(currentCommand->caller->playerName, currentCommand->arguments, 16); currentCommand->caller->currentArea = getFromList(parameters->areaList, 1)->area; + + // Allocate a userMessage containing null characters as the first char in both fields: + userMessage * joinMessage = calloc(1, (sizeof(userMessage))); + memcpy(joinMessage->senderName, "\0 > \0", 5); + strcpy(joinMessage->messageContent, "Logged in successfully."); + + // Allocate an outputMessage for the queue: + outputMessage * joinOutputMessage = createTargetedOutputMessage(joinMessage, ¤tCommand->caller, 1); + + // Queue the outputMessage: + pushQueue(parameters->outputQueue, joinOutputMessage, OUTPUT_MESSAGE); + + // Free the userMessage + free(joinMessage); + // Call the look command after joining. It's fine to unlock, because the loop won't // continue until the command is queued: queue->lock = false; diff --git a/src/server/SilverMUDServer.c b/src/server/SilverMUDServer.c index a18be2f..5b18ccf 100644 --- a/src/server/SilverMUDServer.c +++ b/src/server/SilverMUDServer.c @@ -285,7 +285,7 @@ int main(int argc, char ** argv) while (returnVal < 0 && gnutls_error_is_fatal(returnVal) == 0); // Send a greeting message: - strcpy(sendBuffer.senderName, ""); + memcpy(sendBuffer.senderName, "\0 Login > \0", 11); strcpy(sendBuffer.messageContent, "Welcome to the server!"); messageSend(tlssessions[index], &sendBuffer); strcpy(receiveBuffer.messageContent, "/look");