void sendEntitiesList(Player *player) { levelLoadMutex.lock(); // Protect player->inGame if (player->inGame == 0) // Not yet in game, send player's ponies list (Characters scene) { levelLoadMutex.unlock(); #if DEBUG_LOG win.logMessage("UDP: Sending ponies list"); #endif sendPonies(player); return; } else if (player->inGame > 1) // Not supposed to happen, let's do it anyway { //levelLoadMutex.unlock(); win.logMessage(QString("UDP: Entities list already sent to ")+QString().setNum(player->pony.netviewId) +", resending anyway"); //return; } else // Loading finished, sending entities list win.logMessage(QString("UDP: Sending entities list to ")+QString().setNum(player->pony.netviewId)); Scene* scene = findScene(player->pony.sceneName); // Spawn all the players on the client for (int i=0; i<scene->players.size(); i++) sendNetviewInstantiate(&scene->players[i]->pony, player); // Send npcs for (int i=0; i<win.npcs.size(); i++) if (win.npcs[i]->sceneName.toLower() == player->pony.sceneName.toLower()) { #if DEBUG_LOG win.logMessage("UDP: Sending NPC "+win.npcs[i]->name); #endif sendNetviewInstantiate(win.npcs[i], player); } // Spawn some mobs in Zecoras if (scene->name.toLower() == "zecoras") { sendNetviewInstantiate(player,"mobs/dragon", win.getNewId(), win.getNewNetviewId(), {-33.0408, 0.000425577, 101.766}, {0,-1,0,1}); } player->inGame = 2; levelLoadMutex.unlock(); // Send stats of the client's pony sendSetMaxStatRPC(player, 0, 100); sendSetStatRPC(player, 0, 100); sendSetMaxStatRPC(player, 1, 100); sendSetStatRPC(player, 1, 100); }
void sendEntitiesList(Player *player) { levelLoadMutex.lock(); // Protect player->inGame if (player->inGame == 0) // Not yet in game, send player's ponies list (Characters scene) { levelLoadMutex.unlock(); sendPonies(player); return; } else if (player->inGame > 1) // Not supposed to happen, let's do it anyway { //levelLoadMutex.unlock(); win.logMessage(QString("UDP: Entities list already sent to ")+QString().setNum(player->pony.netviewId) +", resending anyway"); //return; } else // Loading finished, sending entities list win.logMessage(QString("UDP: Sending entities list to ")+QString().setNum(player->pony.netviewId)); Scene* scene = findScene(player->pony.sceneName); // Spawn all the players on the client for (int i=0; i<scene->players.size(); i++) sendNetviewInstantiate(scene->players[i], player); /// SEND DONUT STEEL (in front of the mirror) if (scene->name == "RaritysBoutique") { win.logMessage(QString("UDP: Sending Donut Steel to ")+QString().setNum(player->pony.netviewId)); sendNetviewInstantiate(player,"PlayerBase",0,0,UVector(24.7333,-1.16802,-51.7106), UQuaternion(0,-0.25,0,1)); } player->inGame = 2; levelLoadMutex.unlock(); // Send stats of the client's pony sendSetMaxStatRPC(player, 0, 100); sendSetStatRPC(player, 0, 100); sendSetMaxStatRPC(player, 1, 100); sendSetStatRPC(player, 1, 100); }
// Processes the commands entered directly in the server, not the chat messages void Widget::sendCmdLine() { if (!enableGameServer) { logMessage(QObject::tr("This is not a game server, commands are disabled")); return; } QString str = ui->cmdLine->text(); if (str == "clear") { ui->log->clear(); return; } else if (str == "stop") { delete this; return; } else if (str == "listTcpPlayers") { for (int i=0; i<tcpPlayers.size(); i++) { Player* p = tcpPlayers[i]; logMessage(p->name+" "+p->IP+":"+QString().setNum(p->port)); } return; } else if (str.startsWith("setPeer")) { if (udpPlayers.size() == 1) { cmdPeer = udpPlayers[0]; QString peerName = cmdPeer->IP + " " + QString().setNum(cmdPeer->port); logMessage(QObject::tr("UDP: Peer set to %1").arg(peerName)); return; } str = str.right(str.size()-8); QStringList args = str.split(':'); bool ok; if (args.size() != 2) { if (args.size() != 1) { logMessage(QObject::tr("UDP: setPeer takes a pony id or ip:port combination")); return; } quint16 id = args[0].toUInt(&ok); if (!ok) { logMessage(QObject::tr("UDP: setPeer takes a pony id as argument")); return; } for (int i=0; i<udpPlayers.size();i++) { if (udpPlayers[i]->pony.id == id) { cmdPeer = Player::findPlayer(udpPlayers,udpPlayers[i]->IP, udpPlayers[i]->port); logMessage(QObject::tr("UDP: Peer set to %1").arg(udpPlayers[i]->pony.name)); return; } } logMessage(QObject::tr("UDP: Peer not found (id %1)").arg(args[0])); return; } quint16 port = args[1].toUInt(&ok); if (!ok) { logMessage(QObject::tr("UDP: setPeer takes a port as argument")); return; } cmdPeer = Player::findPlayer(udpPlayers,args[0], port); if (cmdPeer->IP!="") logMessage(QObject::tr("UDP: Peer set to %1").arg(str)); else logMessage(QObject::tr("UDP: Peer not found (%1)").arg(str)); return; } else if (str.startsWith("listPeers")) { if (str.size()<=10) { for (int i=0; i<win.udpPlayers.size();i++) win.logMessage(QString().setNum(win.udpPlayers[i]->pony.id) +" ("+QString().setNum(win.udpPlayers[i]->pony.netviewId)+")" +" "+win.udpPlayers[i]->pony.name +" "+win.udpPlayers[i]->IP +":"+QString().setNum(win.udpPlayers[i]->port) +" "+QString().setNum((int)timestampNow()-win.udpPlayers[i]->lastPingTime)+"s"); return; } str = str.right(str.size()-10); Scene* scene = findScene(str); if (scene->name.isEmpty()) win.logMessage(QObject::tr("Can't find scene")); else for (int i=0; i<scene->players.size();i++) win.logMessage(win.udpPlayers[i]->IP +":"+QString().setNum(win.udpPlayers[i]->port) +" "+QString().setNum((int)timestampNow()-win.udpPlayers[i]->lastPingTime)+"s"); return; } else if (str.startsWith("listVortexes")) { for (int i=0; i<scenes.size(); i++) { win.logMessage("Scene "+scenes[i].name); for (int j=0; j<scenes[i].vortexes.size(); j++) win.logMessage("Vortex "+QString().setNum(scenes[i].vortexes[j].id) +" to "+scenes[i].vortexes[j].destName+" " +QString().setNum(scenes[i].vortexes[j].destPos.x)+" " +QString().setNum(scenes[i].vortexes[j].destPos.y)+" " +QString().setNum(scenes[i].vortexes[j].destPos.z)); } return; } else if (str.startsWith("sync")) { win.logMessage(QObject::tr("UDP: Syncing manually")); sync.doSync(); return; } // DEBUG global commands from now on else if (str==("dbgStressLoad")) { // Send all the players to the GemMines at the same time for (int i=0; i<udpPlayers.size(); i++) sendLoadSceneRPC(udpPlayers[i], "GemMines"); return; } else if (str.startsWith("dbgStressLoad")) { str = str.mid(14); // Send all the players to the given scene at the same time for (int i=0; i<udpPlayers.size(); i++) sendLoadSceneRPC(udpPlayers[i], str); return; } else if (str.startsWith("tele")) { str = str.right(str.size()-5); QStringList args = str.split(' '); if (args.size() != 2) { logStatusMessage(QObject::tr("Error: Usage is tele ponyIdToMove destinationPonyId")); return; } bool ok; bool ok1; bool ok2 = false; quint16 sourceID = args[0].toUInt(&ok); quint16 destID = args[1].toUInt(&ok1); Player* sourcePeer; if (!ok && !ok1) { logStatusMessage(QObject::tr("Error: Usage is tele ponyIdToMove destinationPonyId")); return; } for (int i=0; i<udpPlayers.size();i++) { if (udpPlayers[i]->pony.id == sourceID) { sourcePeer = udpPlayers[i]; ok2 = true; break; } } if (!ok2) { logStatusMessage(QObject::tr("Error: Source peer does not exist!")); return; } for (int i=0; i<udpPlayers.size();i++) { if (udpPlayers[i]->pony.id == destID) { logMessage(QObject::tr("UDP: Teleported %1 to %2").arg(sourcePeer->pony.name,udpPlayers[i]->pony.name)); if (udpPlayers[i]->pony.sceneName.toLower() != sourcePeer->pony.sceneName.toLower()) sendLoadSceneRPC(sourcePeer, udpPlayers[i]->pony.sceneName, udpPlayers[i]->pony.pos); else sendMove(sourcePeer, udpPlayers[i]->pony.pos.x, udpPlayers[i]->pony.pos.y, udpPlayers[i]->pony.pos.z); return; } } logMessage(QObject::tr("Error: Destination peer does not exist!")); } if (cmdPeer->IP=="") { logMessage(QObject::tr("Select a peer first with setPeer/listPeers")); return; } else // Refresh peer info { cmdPeer = Player::findPlayer(udpPlayers,cmdPeer->IP, cmdPeer->port); if (cmdPeer->IP=="") { logMessage(QObject::tr("UDP: Peer not found")); return; } } // User commands from now on (requires setPeer) if (str.startsWith("disconnect")) { logMessage(QObject::tr("UDP: Disconnecting")); sendMessage(cmdPeer,MsgDisconnect, "Connection closed by the server admin"); Player::disconnectPlayerCleanup(cmdPeer); // Save game and remove the player } else if (str.startsWith("load")) { str = str.mid(5); sendLoadSceneRPC(cmdPeer, str); } else if (str.startsWith("getPos")) { logMessage(QObject::tr("Pos : ","Short for position") + QString().setNum(cmdPeer->pony.pos.x) + " " + QString().setNum(cmdPeer->pony.pos.y) + " " + QString().setNum(cmdPeer->pony.pos.z)); } else if (str.startsWith("getRot")) { logMessage(QObject::tr("Rot : x=","Short for rotation") + QString().setNum(cmdPeer->pony.rot.x) + ", y=" + QString().setNum(cmdPeer->pony.rot.y) + ", z=" + QString().setNum(cmdPeer->pony.rot.z) + ", w=" + QString().setNum(cmdPeer->pony.rot.w)); } else if (str.startsWith("getPonyData")) { logMessage("ponyData : "+cmdPeer->pony.ponyData.toBase64()); } else if (str.startsWith("sendPonies")) { sendPonies(cmdPeer); } else if (str.startsWith("sendUtils3")) { logMessage(QObject::tr("UDP: Sending Utils3 request")); QByteArray data(1,3); sendMessage(cmdPeer,MsgUserReliableOrdered6,data); } else if (str.startsWith("setPlayerId")) { str = str.right(str.size()-12); QByteArray data(3,4); bool ok; unsigned id = str.toUInt(&ok); if (ok) { logMessage(QObject::tr("UDP: Sending setPlayerId request")); data[1]=(quint8)(id&0xFF); data[2]=(quint8)((id >> 8)&0xFF); sendMessage(cmdPeer,MsgUserReliableOrdered6,data); } else