void process_message_playerrequest(Net::Connection * connection, double buffer) { if(Sys::PlayerList::FromConnection(connection) == NULL) { auto namelen = read_ubyte(buffer); auto name = read_string(buffer, namelen); auto player = new Sys::Player(Ent::New(), name); unsigned playerslot = Sys::PlayerList::AddPlayer(connection, player); auto serverplayer = Sys::PlayerList::Slots[playerslot]; player->spawn(Maps::width/2, Maps::height/2); auto response = buffer_create(); write_ubyte(response, namelen); write_string(response, name); write_ushort(response, Maps::width/2); write_ushort(response, Maps::height/2); // tell other players about the new player for ( unsigned i = 0; i+1/*last slot is joining player*/ < Sys::PlayerList::Slots.size(); ++i ) { auto current = Sys::PlayerList::Slots[i]->connection; std::cout << "Sending player " << playerslot << " to " << i << " (" << current->as_string() << ")\n"; Net::send(current, 0, SERVERMESSAGE::ADDPLAYER, response); } buffer_clear(response); // tell the new player about everyone, including theirself build_message_serveplayer(serverplayer, response); Net::send(connection, 0, SERVERMESSAGE::SERVEPLAYER, response); buffer_destroy(response); } }
/* Test writing single values of various types to board's global memory. * The test passes if we read back what we wrote. */ void test_small_writes (ssize_t f) { unsigned char uc; unsigned short us; unsigned int ui; unsigned long int uli; write_uchar (f, 0, 0, 19); uc = read_uchar (f, 0, 0); assert (uc == 19); write_ushort (f, 0, 0, 13); us = read_ushort(f, 0, 0); assert (us == 13); write_ulong (f, 0, 0, 0x3037383633352030); uli = read_ulong (f, 0, 0); assert (uli == 0x3037383633352030); write_uint (f, 0, 0, 18987983); ui = read_uint (f, 0, 0); assert (ui == 18987983); printf ("test_small_writes PASSED\n"); }
double build_message_serveplayer(Sys::ServerPlayer * targetplayer, double buffer) { for(auto serverplayer : Sys::PlayerList::Slots) { write_ubyte(buffer, serverplayer->player->name.size()); std::string asdf = serverplayer->player->name; asdf.resize(255, '\0'); write_string(buffer, asdf.data()); if(serverplayer->player->character) { write_ubyte(buffer, 1); write_ushort(buffer, serverplayer->player->character->position->x*10); write_ushort(buffer, serverplayer->player->character->position->y*10); } else write_ubyte(buffer, 0); } return buffer; }