From: <ma...@us...> - 2011-02-24 19:14:59
|
Revision: 6989 http://planeshift.svn.sourceforge.net/planeshift/?rev=6989&view=rev Author: magodra Date: 2011-02-24 19:14:52 +0000 (Thu, 24 Feb 2011) Log Message: ----------- - Added list option to teleport for maps "/teleport me map list" to see possible sectors. - Search both zone and sector for teleport to map. - Moved offline teleport to a separate function. Modified Paths: -------------- trunk/src/server/adminmanager.cpp trunk/src/server/adminmanager.h Modified: trunk/src/server/adminmanager.cpp =================================================================== --- trunk/src/server/adminmanager.cpp 2011-02-24 09:02:31 UTC (rev 6988) +++ trunk/src/server/adminmanager.cpp 2011-02-24 19:14:52 UTC (rev 6989) @@ -5129,6 +5129,46 @@ } } +void AdminManager::TeleportOfflineCharacter(Client* client, AdminCmdDataTeleport* data) +{ + psString sql; + iSector * gmSector; // sector of gamemaster issuing the cmd + csVector3 gmPoint; // position of the gm + psSectorInfo * gmSectorInfo = NULL; + float yRot = 0.0; + + client->GetActor()->GetPosition(gmPoint, yRot, gmSector); + + if (gmSector != NULL) + { + gmSectorInfo = psserver->GetCacheManager()->GetSectorInfoByName(gmSector->QueryObject()->GetName()); + } + if (gmSectorInfo == NULL) + { + psserver->SendSystemError(client->GetClientNum(), "Sector not found!"); + return; + } + + //escape the player name so it's not possible to do nasty things + csString escapedName; + db->Escape( escapedName, data->target.GetDataSafe() ); + + sql.AppendFmt("update characters set loc_x=%10.2f, loc_y=%10.2f, loc_z=%10.2f, loc_yrot=%10.2f, loc_sector_id=%u, loc_instance=%u where name=\"%s\"", + gmPoint.x, gmPoint.y, gmPoint.z, yRot, gmSectorInfo->uid, client->GetActor()->GetInstance(), escapedName.GetDataSafe()); + + if (db->CommandPump(sql) != 1) + { + Error3 ("Couldn't save character's position to database.\nCommand was " + "<%s>.\nError returned was <%s>\n",db->GetLastQuery(),db->GetLastError()); + + psserver->SendSystemError(client->GetClientNum(), "Offline character %s could not be moved!", data->target.GetData()); + } + else + { + psserver->SendSystemResult(client->GetClientNum(), "%s will next log in at your current location", data->target.GetData()); + } +} + void AdminManager::Teleport(MsgEntry* me, psAdminCmdMessage& msg, AdminCmdData* cmddata, Client *client) //, gemObject* subject) { AdminCmdDataTeleport* data = dynamic_cast<AdminCmdDataTeleport*>(cmddata); @@ -5138,7 +5178,7 @@ psserver->SendSystemInfo(client->GetClientNum(), "Use: /teleport <subject> <destination>\n" "Subject : me/target/<object name>/<NPC name>/<player name>/eid:<EID>/pid:<PID>\n" "Destination: me [<instance>]/target/<object name>/<NPC name>/<player name>/eid:<EID>/pid:<PID>/\n" - " here [<instance>]/last/spawn/restore/map [<map name>|here] <x> <y> <z> [<instance>]\n" + " here [<instance>]/last/spawn/restore/map <map name>|here|list [<x> <y> <z> [<instance>]]\n" " there <instance>"); return; } @@ -5146,40 +5186,7 @@ // If player is offline and the special argument is called if (!data->IsOnline() && data->dest == "restore") { - psString sql; - iSector * gmSector; // sector of gamemaster issuing the cmd - csVector3 gmPoint; // position of the gm - psSectorInfo * gmSectorInfo = NULL; - float yRot = 0.0; - client->GetActor()->GetPosition(gmPoint, yRot, gmSector); - - if (gmSector != NULL) - { - gmSectorInfo = psserver->GetCacheManager()->GetSectorInfoByName(gmSector->QueryObject()->GetName()); - } - if (gmSectorInfo == NULL) - { - psserver->SendSystemError(client->GetClientNum(), "Sector not found!"); - return; - } - - //escape the player name so it's not possible to do nasty things - csString escapedName; - db->Escape( escapedName, data->target.GetDataSafe() ); - - sql.AppendFmt("update characters set loc_x=%10.2f, loc_y=%10.2f, loc_z=%10.2f, loc_yrot=%10.2f, loc_sector_id=%u, loc_instance=%u where name=\"%s\"", - gmPoint.x, gmPoint.y, gmPoint.z, yRot, gmSectorInfo->uid, client->GetActor()->GetInstance(), escapedName.GetDataSafe()); - - if (db->CommandPump(sql) != 1) - { - Error3 ("Couldn't save character's position to database.\nCommand was " - "<%s>.\nError returned was <%s>\n",db->GetLastQuery(),db->GetLastError()); - - psserver->SendSystemError(client->GetClientNum(), "Offline character %s could not be moved!", data->target.GetData()); - } - else - psserver->SendSystemResult(client->GetClientNum(), "%s will next log in at your current location", data->target.GetData()); - + TeleportOfflineCharacter(client, data); return; } else if (data->targetObject == NULL) @@ -5187,6 +5194,23 @@ psserver->SendSystemError(client->GetClientNum(), "Cannot teleport target"); return; } + + if (data->dest == "map" && (data->destSector == "list" || data->destMap == "list") ) + { + // Build list of sectors + csString sectorList; + csHash<psSectorInfo*>::GlobalIterator iter(psserver->GetCacheManager()->GetSectorIterator()); + while (iter.HasNext()) + { + psSectorInfo* info = iter.Next(); + sectorList += "\n"; + sectorList += info->name; + } + + psserver->SendSystemInfo(client->GetClientNum(),"List of sectors:%s", + sectorList.GetDataSafe()); + return; + } csVector3 targetPoint; float yRot = 0.0; @@ -5195,7 +5219,8 @@ if ( !GetTargetOfTeleport(client, msg, data, targetSector, targetPoint, yRot, data->targetObject, targetInstance) ) { - psserver->SendSystemError(client->GetClientNum(), "Cannot teleport %s to %s", data->target.GetData(), data->destObj.target.GetData() ); + psserver->SendSystemError(client->GetClientNum(), "Cannot teleport %s to %s", + data->target.GetData(), data->destObj.target.GetData() ); return; } @@ -6370,7 +6395,7 @@ csRefArray<StartPosition> positions = loader->GetStartPositions(); for(size_t i = 0; i < positions.GetSize(); ++i) { - if(positions.Get(i)->zone == map) + if ( positions.Get(i)->zone == map || positions.Get(i)->sector == map ) { targetSector = engine->FindSector(positions.Get(i)->sector); targetPoint = positions.Get(i)->position; Modified: trunk/src/server/adminmanager.h =================================================================== --- trunk/src/server/adminmanager.h 2011-02-24 09:02:31 UTC (rev 6988) +++ trunk/src/server/adminmanager.h 2011-02-24 19:14:52 UTC (rev 6989) @@ -3120,6 +3120,12 @@ */ void Slide(MsgEntry* me,psAdminCmdMessage& msg, AdminCmdData* data, Client *client); + /** @brief Teleport an offline character. + * @param client The GM client the command came from. + * @param data A pointer to the command parser object with target data + */ + void TeleportOfflineCharacter(Client* client, AdminCmdDataTeleport* data); + /** @brief Move an object to a certain position. * @param me The incoming message from the GM * @param msg The cracked command message. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |