#include "server.h" #include "utility.h" #include #include "clientserver.h" #include "map.h" #include namespace jthread {} // JThread 1.2 support using namespace jthread; // JThread 1.3 support #include "main.h" #ifdef _WIN32 #include #define sleep_ms(x) Sleep(x) #else #include #define sleep_ms(x) usleep(x*1000) #endif void * ServerNetworkThread::Thread() { ThreadStarted(); while(getRun()) { m_server->AsyncRunStep(); try{ //dout_server<<"Running m_server->Receive()"<Receive(); } catch(con::NoIncomingDataException &e) { } catch(std::exception &e) { dout_server<<"ServerNetworkThread: Some exception: " < data(data_maxsize); u16 peer_id; u32 datasize; try{ { JMutexAutoLock lock(m_con_mutex); datasize = m_con.Receive(peer_id, *data, data_maxsize); } ProcessData(*data, datasize, peer_id); } catch(con::InvalidIncomingDataException &e) { dout_server<<"Server::Receive(): " "InvalidIncomingDataException: what()=" < reply(replysize); writeU16(&reply[0], TOCLIENT_BLOCKDATA); writeS16(&reply[2], p.X); writeS16(&reply[4], p.Y); writeS16(&reply[6], p.Z); block->serialize(&reply[8]); // Send as unreliable //m_con.Send(peer_id, 1, reply, false); m_con.Send(peer_id, 1, reply, true); } else if(command == TOSERVER_REMOVENODE) { if(datasize < 8) return; v3s16 p; p.X = readS16(&data[2]); p.Y = readS16(&data[4]); p.Z = readS16(&data[6]); MapNode n; n.d = MATERIAL_AIR; m_env.getMap().setNode(p, n); u32 replysize = 8; //u8 reply[replysize]; SharedBuffer reply(replysize); writeU16(&reply[0], TOCLIENT_REMOVENODE); writeS16(&reply[2], p.X); writeS16(&reply[4], p.Y); writeS16(&reply[6], p.Z); // Send as reliable m_con.SendToAll(0, reply, true); } else if(command == TOSERVER_ADDNODE) { if(datasize < 8 + MapNode::serializedLength()) return; v3s16 p; p.X = readS16(&data[2]); p.Y = readS16(&data[4]); p.Z = readS16(&data[6]); MapNode n; n.deSerialize(&data[8]); m_env.getMap().setNode(p, n); u32 replysize = 8 + MapNode::serializedLength(); //u8 reply[replysize]; SharedBuffer reply(replysize); writeU16(&reply[0], TOCLIENT_ADDNODE); writeS16(&reply[2], p.X); writeS16(&reply[4], p.Y); writeS16(&reply[6], p.Z); n.serialize(&reply[8]); // Send as reliable m_con.SendToAll(0, reply, true); } else if(command == TOSERVER_PLAYERPOS) { if(datasize < 2+12+12) return; Player *player = m_env.getPlayer(peer_id); // Create a player if it doesn't exist if(player == NULL) { dout_server<<"Server::ProcessData(): Adding player " <peer_id = peer_id; m_env.addPlayer(player); } player->timeout_counter = 0.0; v3s32 ps = readV3S32(&data[2]); v3s32 ss = readV3S32(&data[2+12]); v3f position((f32)ps.X/100., (f32)ps.Y/100., (f32)ps.Z/100.); v3f speed((f32)ss.X/100., (f32)ss.Y/100., (f32)ss.Z/100.); player->setPosition(position); player->speed = speed; /*dout_server<<"Server::ProcessData(): Moved player "<