Made globalIndex able to be determined by just localIndex

refactored the ugly spaghetti mess that was network_player_connected()
This commit is contained in:
MysterD 2022-01-31 00:29:44 -08:00
parent e9d3bf49da
commit 20599aa6f3
7 changed files with 122 additions and 95 deletions

View File

@ -19,7 +19,7 @@ fi
# no debug, direct # no debug, direct
$FILE --server 27015 --configfile sm64config_server.txt & $FILE --server 27015 --configfile sm64config_server.txt &
sleep 5 sleep 3
$FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt & $FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt &
exit exit

View File

@ -136,107 +136,96 @@ void network_player_update(void) {
} }
u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, u8 paletteIndex, char* name) { u8 network_player_connected(enum NetworkPlayerType type, u8 globalIndex, u8 modelIndex, u8 paletteIndex, char* name) {
// translate globalIndex to localIndex
u8 localIndex = globalIndex;
if (gNetworkType == NT_SERVER) {
localIndex = globalIndex;
} else if (type == NPT_SERVER) {
localIndex = 1;
} else if (type == NPT_LOCAL) {
localIndex = 0;
} else if (gNetworkPlayerLocal != NULL) {
localIndex = globalIndex + ((globalIndex < gNetworkPlayerLocal->globalIndex) ? 1 : 0);
} else {
assert(false);
}
struct NetworkPlayer* np = &gNetworkPlayers[localIndex];
// ensure that a name is given // ensure that a name is given
if (name[0] == '\0') { if (name[0] == '\0') {
name = sDefaultPlayerName; name = sDefaultPlayerName;
} }
if (modelIndex >= CT_MAX) { modelIndex = 0; } if (modelIndex >= CT_MAX) { modelIndex = 0; }
if (type == NPT_LOCAL) { // if already connected, update a few things
struct NetworkPlayer* np = &gNetworkPlayers[0]; if (np->connected) {
if (np->connected) { np->lastReceived = clock_elapsed();
np->globalIndex = globalIndex; np->lastSent = clock_elapsed();
return 0; if ((type != NPT_LOCAL) && (gNetworkType == NT_SERVER || type == NPT_SERVER)) { gNetworkSystem->save_id(localIndex, 0); }
}
memset(np, 0, sizeof(struct NetworkPlayer)); np->modelIndex = modelIndex;
np->connected = true; np->paletteIndex = paletteIndex;
np->type = type; network_player_update_model(localIndex);
np->localIndex = 0;
np->globalIndex = globalIndex;
np->currLevelAreaSeqId = 0;
extern s16 gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
np->currLevelSyncValid = false;
np->currAreaSyncValid = false;
np->modelIndex = modelIndex;
np->paletteIndex = paletteIndex;
snprintf(np->name, MAX_PLAYER_STRING, "%s", name); snprintf(np->name, MAX_PLAYER_STRING, "%s", name);
network_player_update_model(0); return localIndex;
}
for (int j = 0; j < MAX_RX_SEQ_IDS; j++) { np->rxSeqIds[j] = 0; np->rxPacketHash[j] = 0; } // clear
np->onRxSeqId = 0; memset(np, 0, sizeof(struct NetworkPlayer));
// update fundamentals
np->connected = true;
np->type = type;
np->localIndex = localIndex;
np->globalIndex = globalIndex;
if ((type != NPT_LOCAL) && (gNetworkType == NT_SERVER || type == NPT_SERVER)) { gNetworkSystem->save_id(localIndex, 0); }
// update course/level
np->currLevelAreaSeqId = 0;
extern s16 gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex;
network_player_update_course_level(np, gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex);
np->currLevelSyncValid = false;
np->currAreaSyncValid = false;
// update visuals
np->fadeOpacity = 0;
np->modelIndex = modelIndex;
np->paletteIndex = paletteIndex;
snprintf(np->name, MAX_PLAYER_STRING, "%s", name);
network_player_update_model(localIndex);
// clear networking fields
np->lastReceived = clock_elapsed();
np->lastSent = clock_elapsed();
np->onRxSeqId = 0;
if (localIndex != 0) {
for (int j = 0; j < MAX_SYNC_OBJECTS; j++) { gSyncObjects[j].rxEventId[localIndex] = 0; }
}
for (int j = 0; j < MAX_RX_SEQ_IDS; j++) { np->rxSeqIds[j] = 0; np->rxPacketHash[j] = 0; }
packet_ordered_clear(globalIndex);
// set up network player pointers
if (type == NPT_LOCAL) {
gNetworkPlayerLocal = np; gNetworkPlayerLocal = np;
if (gNetworkType == NT_SERVER) { if (gNetworkType == NT_SERVER) {
gNetworkPlayerServer = gNetworkPlayerLocal; gNetworkPlayerServer = gNetworkPlayerLocal;
} }
packet_ordered_clear(globalIndex); } else if (type == NPT_SERVER) {
return 0; gNetworkPlayerServer = np;
} }
if (globalIndex != UNKNOWN_GLOBAL_INDEX) { // display connected popup
for (int i = 1; i < MAX_PLAYERS; i++) { if (type != NPT_SERVER && (gNetworkType != NT_SERVER || type != NPT_LOCAL)) {
struct NetworkPlayer* np = &gNetworkPlayers[i]; u8* rgb = get_player_color(np->paletteIndex, 0);
if (!np->connected) { continue; } char popupMsg[128] = { 0 };
if (np->globalIndex != globalIndex) { continue; } snprintf(popupMsg, 128, "\\#%02x%02x%02x\\%s\\#dcdcdc\\ connected", rgb[0], rgb[1], rgb[2], np->name);
np->localIndex = i; djui_popup_create(popupMsg, 1);
np->lastReceived = clock_elapsed();
np->lastSent = clock_elapsed();
np->modelIndex = modelIndex;
np->paletteIndex = paletteIndex;
np->localLevelMatch = (np->currCourseNum == gCurrCourseNum && np->currActNum == gCurrActStarNum && np->currLevelNum == gCurrLevelNum);
snprintf(np->name, MAX_PLAYER_STRING, "%s", name);
network_player_update_model(i);
if (gNetworkType == NT_SERVER || type == NPT_SERVER) { gNetworkSystem->save_id(i, 0); }
LOG_ERROR("player connected, reusing local %d, global %d, duplicate event?", i, globalIndex);
return i;
}
} }
LOG_INFO("player connected, local %d, global %d", localIndex, np->globalIndex);
for (int i = 1; i < MAX_PLAYERS; i++) { return localIndex;
struct NetworkPlayer* np = &gNetworkPlayers[i];
if (np->connected) { continue; }
memset(np, 0, sizeof(struct NetworkPlayer));
np->connected = true;
np->currLevelAreaSeqId = 0;
if (gNetworkType == NT_SERVER && !np->currAreaSyncValid) {
network_player_update_course_level(np, 0, 0, 16, 1);
np->currLevelSyncValid = false;
np->currAreaSyncValid = false;
}
np->fadeOpacity = 0;
np->localIndex = i;
np->globalIndex = (gNetworkType == NT_SERVER) ? i : globalIndex;
np->type = type;
np->lastReceived = clock_elapsed();
np->lastSent = clock_elapsed();
np->modelIndex = modelIndex;
np->paletteIndex = paletteIndex;
np->localLevelMatch = (np->currCourseNum == gCurrCourseNum && np->currActNum == gCurrActStarNum && np->currLevelNum == gCurrLevelNum);
snprintf(np->name, MAX_PLAYER_STRING, "%s", name);
network_player_update_model(i);
if (gNetworkType == NT_SERVER || type == NPT_SERVER) { gNetworkSystem->save_id(i, 0); }
for (int j = 0; j < MAX_SYNC_OBJECTS; j++) { gSyncObjects[j].rxEventId[i] = 0; }
for (int j = 0; j < MAX_RX_SEQ_IDS; j++) { np->rxSeqIds[j] = 0; np->rxPacketHash[j] = 0; }
np->onRxSeqId = 0;
if (type == NPT_SERVER) {
gNetworkPlayerServer = np;
} else {
// display popup
u8* rgb = get_player_color(np->paletteIndex, 0);
char popupMsg[128] = { 0 };
snprintf(popupMsg, 128, "\\#%02x%02x%02x\\%s\\#dcdcdc\\ connected", rgb[0], rgb[1], rgb[2], np->name);
djui_popup_create(popupMsg, 1);
}
LOG_INFO("player connected, local %d, global %d", i, np->globalIndex);
packet_ordered_clear(np->globalIndex);
return i;
}
LOG_ERROR("player connected, but unable to allocate!");
return UNKNOWN_GLOBAL_INDEX;
} }
u8 network_player_disconnected(u8 globalIndex) { u8 network_player_disconnected(u8 globalIndex) {

View File

@ -36,7 +36,6 @@ struct NetworkPlayer {
u8 onRxSeqId; u8 onRxSeqId;
u8 modelIndex; u8 modelIndex;
u8 paletteIndex; u8 paletteIndex;
bool localLevelMatch;
char name[MAX_PLAYER_STRING+1]; char name[MAX_PLAYER_STRING+1];
u16 rxSeqIds[MAX_RX_SEQ_IDS]; u16 rxSeqIds[MAX_RX_SEQ_IDS];
u32 rxPacketHash[MAX_RX_SEQ_IDS]; u32 rxPacketHash[MAX_RX_SEQ_IDS];

View File

@ -85,6 +85,8 @@ void packet_process(struct Packet* p) {
case PACKET_LUA_SYNC_TABLE: network_receive_lua_sync_table(p); break; case PACKET_LUA_SYNC_TABLE: network_receive_lua_sync_table(p); break;
case PACKET_NETWORK_PLAYERS_REQUEST: network_receive_network_players_request(p); break;
// custom // custom
case PACKET_CUSTOM: network_receive_custom(p); break; case PACKET_CUSTOM: network_receive_custom(p); break;
default: LOG_ERROR("received unknown packet: %d", p->buffer[0]); default: LOG_ERROR("received unknown packet: %d", p->buffer[0]);

View File

@ -61,6 +61,8 @@ enum PacketType {
PACKET_LUA_SYNC_TABLE, PACKET_LUA_SYNC_TABLE,
PACKET_NETWORK_PLAYERS_REQUEST,
/// ///
PACKET_CUSTOM = 255, PACKET_CUSTOM = 255,
}; };
@ -223,7 +225,9 @@ void network_send_save_set_flag(s32 fileIndex, s32 courseIndex, u8 courseStars,
void network_receive_save_set_flag(struct Packet* p); void network_receive_save_set_flag(struct Packet* p);
// packet_network_players.c // packet_network_players.c
void network_send_network_players(void); void network_send_network_players_request(void);
void network_receive_network_players_request(struct Packet* p);
void network_send_network_players(u8 exceptLocalIndex);
void network_receive_network_players(struct Packet* p); void network_receive_network_players(struct Packet* p);
// packet_death.c // packet_death.c

View File

@ -63,12 +63,24 @@ void network_receive_join_request(struct Packet* p) {
void network_send_join(struct Packet* joinRequestPacket) { void network_send_join(struct Packet* joinRequestPacket) {
SOFT_ASSERT(gNetworkType == NT_SERVER); SOFT_ASSERT(gNetworkType == NT_SERVER);
// do connection event // figure out id
joinRequestPacket->localIndex = network_player_connected(NPT_CLIENT, joinRequestPacket->localIndex, sJoinRequestPlayerModel, sJoinRequestPlayerPalette, sJoinRequestPlayerName); u8 globalIndex = joinRequestPacket->localIndex;
if (joinRequestPacket->localIndex == UNKNOWN_LOCAL_INDEX) { if (globalIndex == UNKNOWN_LOCAL_INDEX) {
network_send_kick(EKT_FULL_PARTY); for (int i = 1; i < MAX_PLAYERS; i++) {
return; if (!gNetworkPlayers[i].connected) {
globalIndex = i;
break;
}
}
if (globalIndex == UNKNOWN_LOCAL_INDEX) {
network_send_kick(EKT_FULL_PARTY);
return;
}
} }
LOG_INFO("chose globalIndex: %d", globalIndex);
// do connection event
network_player_connected(NPT_CLIENT, globalIndex, sJoinRequestPlayerModel, sJoinRequestPlayerPalette, sJoinRequestPlayerName);
fs_file_t* fp = fs_open(SAVE_FILENAME); fs_file_t* fp = fs_open(SAVE_FILENAME);
if (fp != NULL) { if (fp != NULL) {
@ -83,7 +95,7 @@ void network_send_join(struct Packet* joinRequestPacket) {
struct Packet p = { 0 }; struct Packet p = { 0 };
packet_init(&p, PACKET_JOIN, true, PLMT_NONE); packet_init(&p, PACKET_JOIN, true, PLMT_NONE);
packet_write(&p, &version, sizeof(u8) * MAX_VERSION_LENGTH); packet_write(&p, &version, sizeof(u8) * MAX_VERSION_LENGTH);
packet_write(&p, &joinRequestPacket->localIndex, sizeof(u8)); packet_write(&p, &globalIndex, sizeof(u8));
packet_write(&p, &gCurrSaveFileNum, sizeof(s16)); packet_write(&p, &gCurrSaveFileNum, sizeof(s16));
packet_write(&p, &gServerSettings.playerInteractions, sizeof(u8)); packet_write(&p, &gServerSettings.playerInteractions, sizeof(u8));
packet_write(&p, &gServerSettings.playerKnockbackStrength, sizeof(u8)); packet_write(&p, &gServerSettings.playerKnockbackStrength, sizeof(u8));
@ -108,10 +120,10 @@ void network_send_join(struct Packet* joinRequestPacket) {
node = node->next; node = node->next;
} }
network_send_to(joinRequestPacket->localIndex , &p); network_send_to(globalIndex, &p);
LOG_INFO("sending join packet"); LOG_INFO("sending join packet");
network_send_network_players(); network_send_network_players(globalIndex);
} }
void network_receive_join(struct Packet* p) { void network_receive_join(struct Packet* p) {
@ -219,4 +231,6 @@ void network_receive_join(struct Packet* p) {
gChangeLevel = 16; gChangeLevel = 16;
smlua_init(); smlua_init();
network_send_network_players_request();
} }

View File

@ -41,11 +41,30 @@ static void network_send_to_network_players(u8 sendToLocalIndex) {
LOG_INFO("sent list of %d network players to %d", connectedCount, sendToLocalIndex); LOG_INFO("sent list of %d network players to %d", connectedCount, sendToLocalIndex);
} }
void network_send_network_players(void) { void network_send_network_players_request(void) {
SOFT_ASSERT(gNetworkType == NT_CLIENT);
struct Packet p = { 0 };
packet_init(&p, PACKET_NETWORK_PLAYERS_REQUEST, true, PLMT_NONE);
network_send_to((gNetworkPlayerServer != NULL) ? gNetworkPlayerServer->localIndex : 0, &p);
LOG_INFO("sending network players request");
}
void network_receive_network_players_request(struct Packet* p) {
SOFT_ASSERT(gNetworkType == NT_SERVER);
u8 localIndex = p->localIndex;
if (localIndex == UNKNOWN_LOCAL_INDEX) {
LOG_ERROR("Received network players request from unknown index");
return;
}
network_send_to_network_players(localIndex);
}
void network_send_network_players(u8 exceptLocalIndex) {
SOFT_ASSERT(gNetworkType == NT_SERVER); SOFT_ASSERT(gNetworkType == NT_SERVER);
LOG_INFO("sending list of network players to all"); LOG_INFO("sending list of network players to all");
for (int i = 1; i < MAX_PLAYERS; i++) { for (int i = 1; i < MAX_PLAYERS; i++) {
if (!gNetworkPlayers[i].connected) { continue; } if (!gNetworkPlayers[i].connected) { continue; }
if (i == exceptLocalIndex) { continue; }
network_send_to_network_players(i); network_send_to_network_players(i);
} }
} }