Made globalIndex able to be determined by just localIndex
refactored the ugly spaghetti mess that was network_player_connected()
This commit is contained in:
parent
e9d3bf49da
commit
20599aa6f3
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue