mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-12-02 22:22:48 +00:00
Made Lua mods show up in Discord Activity
This commit is contained in:
parent
a28f046eb9
commit
948e4283de
8 changed files with 49 additions and 9 deletions
|
|
@ -90,7 +90,7 @@ void smlua_init(void) {
|
||||||
|
|
||||||
// load scripts
|
// load scripts
|
||||||
LOG_INFO("Loading scripts:");
|
LOG_INFO("Loading scripts:");
|
||||||
struct ModTable* table = (gNetworkType == NT_SERVER) ? &gModTableLocal : &gModTableRemote;
|
struct ModTable* table = gModTableCurrent;
|
||||||
for (int i = 0; i < table->entryCount; i++) {
|
for (int i = 0; i < table->entryCount; i++) {
|
||||||
struct ModListEntry* entry = &table->entries[i];
|
struct ModListEntry* entry = &table->entries[i];
|
||||||
if (!entry->enabled) { continue; }
|
if (!entry->enabled) { continue; }
|
||||||
|
|
|
||||||
|
|
@ -155,9 +155,9 @@ int smlua_hook_mario_action(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_Integer action = smlua_to_integer(L, -2);
|
lua_Integer action = smlua_to_integer(L, 1);
|
||||||
if (action == 0 || gSmLuaConvertSuccess) {
|
if (action == 0 || !gSmLuaConvertSuccess) {
|
||||||
LOG_LUA("Hook Action: tried to hook invalid action");
|
LOG_LUA("Hook Action: tried to hook invalid action: %lld, %u", action, gSmLuaConvertSuccess);
|
||||||
smlua_logline();
|
smlua_logline();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ bool smlua_to_boolean(lua_State* L, int index) {
|
||||||
|
|
||||||
lua_Integer smlua_to_integer(lua_State* L, int index) {
|
lua_Integer smlua_to_integer(lua_State* L, int index) {
|
||||||
if (lua_type(L, index) == LUA_TBOOLEAN) {
|
if (lua_type(L, index) == LUA_TBOOLEAN) {
|
||||||
|
gSmLuaConvertSuccess = true;
|
||||||
return lua_toboolean(L, index) ? 1 : 0;
|
return lua_toboolean(L, index) ? 1 : 0;
|
||||||
} else if (lua_type(L, index) != LUA_TNUMBER) {
|
} else if (lua_type(L, index) != LUA_TNUMBER) {
|
||||||
LOG_LUA("smlua_to_integer received improper type '%d'", lua_type(L, index));
|
LOG_LUA("smlua_to_integer received improper type '%d'", lua_type(L, index));
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
struct ModTable gModTableLocal = { .entries = NULL, .entryCount = 0, .totalSize = 0, .isRemote = false };
|
struct ModTable gModTableLocal = { .entries = NULL, .entryCount = 0, .totalSize = 0, .isRemote = false };
|
||||||
struct ModTable gModTableRemote = { .entries = NULL, .entryCount = 0, .totalSize = 0, .isRemote = true };
|
struct ModTable gModTableRemote = { .entries = NULL, .entryCount = 0, .totalSize = 0, .isRemote = true };
|
||||||
|
struct ModTable* gModTableCurrent = &gModTableLocal;
|
||||||
|
|
||||||
static char sTmpSession[MAX_SESSION_CHARS] = { 0 };
|
static char sTmpSession[MAX_SESSION_CHARS] = { 0 };
|
||||||
static char sTmpPath[PATH_MAX] = { 0 };
|
static char sTmpPath[PATH_MAX] = { 0 };
|
||||||
|
|
@ -99,7 +100,7 @@ static char* extract_lua_field(char* fieldName, char* buffer) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void extract_lua_fields(struct ModListEntry* entry) {
|
void mod_list_extract_lua_fields(struct ModListEntry* entry) {
|
||||||
FILE* f = entry->fp;
|
FILE* f = entry->fp;
|
||||||
char buffer[512] = { 0 };
|
char buffer[512] = { 0 };
|
||||||
|
|
||||||
|
|
@ -107,6 +108,8 @@ static void extract_lua_fields(struct ModListEntry* entry) {
|
||||||
entry->incompatible = NULL;
|
entry->incompatible = NULL;
|
||||||
entry->description = NULL;
|
entry->description = NULL;
|
||||||
|
|
||||||
|
fseek(entry->fp, 0, SEEK_SET);
|
||||||
|
|
||||||
while (!feof(f)) {
|
while (!feof(f)) {
|
||||||
file_get_line(buffer, 512, f);
|
file_get_line(buffer, 512, f);
|
||||||
|
|
||||||
|
|
@ -128,6 +131,7 @@ static void extract_lua_fields(struct ModListEntry* entry) {
|
||||||
snprintf(entry->description, 512, "%s", extracted);
|
snprintf(entry->description, 512, "%s", extracted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mod_list_add_local(u16 index, const char* path, char* name) {
|
static void mod_list_add_local(u16 index, const char* path, char* name) {
|
||||||
|
|
@ -142,7 +146,7 @@ static void mod_list_add_local(u16 index, const char* path, char* name) {
|
||||||
snprintf(entry->path, PATH_MAX - 1, "%s/%s", path, name);
|
snprintf(entry->path, PATH_MAX - 1, "%s/%s", path, name);
|
||||||
entry->fp = fopen(entry->path, "rb");
|
entry->fp = fopen(entry->path, "rb");
|
||||||
|
|
||||||
extract_lua_fields(entry);
|
mod_list_extract_lua_fields(entry);
|
||||||
|
|
||||||
fseek(entry->fp, 0, SEEK_END);
|
fseek(entry->fp, 0, SEEK_END);
|
||||||
entry->size = ftell(entry->fp);
|
entry->size = ftell(entry->fp);
|
||||||
|
|
@ -292,6 +296,7 @@ static void mod_list_load_local(const char* path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mod_list_init(void) {
|
void mod_list_init(void) {
|
||||||
|
gModTableCurrent = &gModTableLocal;
|
||||||
srand(time(0));
|
srand(time(0));
|
||||||
snprintf(sTmpSession, MAX_SESSION_CHARS, "%06X", (u32)(rand() % 0xFFFFFF));
|
snprintf(sTmpSession, MAX_SESSION_CHARS, "%06X", (u32)(rand() % 0xFFFFFF));
|
||||||
snprintf(sTmpPath, PATH_MAX - 1, "%s", fs_get_write_path("tmp"));
|
snprintf(sTmpPath, PATH_MAX - 1, "%s", fs_get_write_path("tmp"));
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,10 @@ struct ModTable {
|
||||||
|
|
||||||
extern struct ModTable gModTableLocal;
|
extern struct ModTable gModTableLocal;
|
||||||
extern struct ModTable gModTableRemote;
|
extern struct ModTable gModTableRemote;
|
||||||
|
extern struct ModTable* gModTableCurrent;
|
||||||
|
|
||||||
void mod_list_add_tmp(u16 index, u16 remoteIndex, char* name, size_t size);
|
void mod_list_add_tmp(u16 index, u16 remoteIndex, char* name, size_t size);
|
||||||
|
void mod_list_extract_lua_fields(struct ModListEntry* entry);
|
||||||
void mod_table_clear(struct ModTable* table);
|
void mod_table_clear(struct ModTable* table);
|
||||||
void mod_list_alloc(struct ModTable* table, u16 count);
|
void mod_list_alloc(struct ModTable* table, u16 count);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include "pc/network/network.h"
|
#include "pc/network/network.h"
|
||||||
#include "pc/network/version.h"
|
#include "pc/network/version.h"
|
||||||
#include "pc/djui/djui.h"
|
#include "pc/djui/djui.h"
|
||||||
|
#include "pc/mod_list.h"
|
||||||
#include "pc/logfile.h"
|
#include "pc/logfile.h"
|
||||||
|
|
||||||
#define HASH_LENGTH 8
|
#define HASH_LENGTH 8
|
||||||
|
|
@ -79,17 +80,40 @@ void discord_activity_update(bool hosting) {
|
||||||
|
|
||||||
if (gCurActivity.details[0] == '\0') {
|
if (gCurActivity.details[0] == '\0') {
|
||||||
snprintf(gCurActivity.details, 128, "%s", get_version());
|
snprintf(gCurActivity.details, 128, "%s", get_version());
|
||||||
|
|
||||||
|
bool displayDash = true;
|
||||||
|
bool displayComma = false;
|
||||||
|
|
||||||
if (gRegisteredMods.string != NULL) {
|
if (gRegisteredMods.string != NULL) {
|
||||||
strncat(gCurActivity.details, " - ", 127);
|
strncat(gCurActivity.details, " - ", 127);
|
||||||
|
displayDash = false;
|
||||||
|
|
||||||
|
// add patches to activity
|
||||||
struct StringLinkedList* node = &gRegisteredMods;
|
struct StringLinkedList* node = &gRegisteredMods;
|
||||||
while (node != NULL && node->string != NULL) {
|
while (node != NULL && node->string != NULL) {
|
||||||
|
if (displayComma) { strncat(gCurActivity.details, ", ", 127); }
|
||||||
strncat(gCurActivity.details, node->string, 127);
|
strncat(gCurActivity.details, node->string, 127);
|
||||||
|
displayComma = true;
|
||||||
node = node->next;
|
node = node->next;
|
||||||
if (node != NULL && node->string != NULL) {
|
|
||||||
strncat(gCurActivity.details, ", ", 127);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ModTable* table = gModTableCurrent;
|
||||||
|
if (table != NULL && table->entryCount > 0) {
|
||||||
|
// add mods to activity
|
||||||
|
for (int i = 0; i < table->entryCount; i++) {
|
||||||
|
struct ModListEntry* entry = &table->entries[i];
|
||||||
|
if (!entry->enabled) { continue; }
|
||||||
|
if (displayDash) { strncat(gCurActivity.details, " - ", 127); }
|
||||||
|
if (displayComma) { strncat(gCurActivity.details, ", ", 127); }
|
||||||
|
|
||||||
|
strncat(gCurActivity.details, entry->displayName ? entry->displayName : entry->name, 127);
|
||||||
|
|
||||||
|
displayDash = false;
|
||||||
|
displayComma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
app.activities->update_activity(app.activities, &gCurActivity, NULL, on_activity_update_callback);
|
app.activities->update_activity(app.activities, &gCurActivity, NULL, on_activity_update_callback);
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,12 @@ void network_receive_download(struct Packet* p) {
|
||||||
if (sOffset[OFFSET_COUNT - 1] + CHUNK_SIZE >= entry->size) {
|
if (sOffset[OFFSET_COUNT - 1] + CHUNK_SIZE >= entry->size) {
|
||||||
LOG_INFO("Finished download of '%s'", entry->name);
|
LOG_INFO("Finished download of '%s'", entry->name);
|
||||||
fclose(entry->fp);
|
fclose(entry->fp);
|
||||||
|
|
||||||
|
// parse mod header
|
||||||
|
entry->fp = fopen(entry->path, "rb");
|
||||||
|
mod_list_extract_lua_fields(entry);
|
||||||
|
fclose(entry->fp);
|
||||||
|
|
||||||
entry->fp = NULL;
|
entry->fp = NULL;
|
||||||
entry->complete = true;
|
entry->complete = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ void network_receive_mod_list(struct Packet* p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 modEntryCount = 0;
|
u16 modEntryCount = 0;
|
||||||
|
gModTableCurrent = &gModTableRemote;
|
||||||
|
|
||||||
packet_read(p, &modEntryCount, sizeof(u16));
|
packet_read(p, &modEntryCount, sizeof(u16));
|
||||||
mod_list_alloc(&gModTableRemote, modEntryCount);
|
mod_list_alloc(&gModTableRemote, modEntryCount);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue