diff options
| author | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-03-09 23:28:32 +0100 |
|---|---|---|
| committer | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-03-09 23:28:32 +0100 |
| commit | 4ee0a4a4460ff0a44f39a5359c6e234c9d31fc6b (patch) | |
| tree | 5d42618930add2f230969b05e02a7cd515c102a4 /src/server/scripts/Commands | |
| parent | 4e789d4c5c83dd6f0f582fe24e9d49b39950fffe (diff) | |
Revert "Core/Commands: Optimize for command .npc near"
This reverts commit 4e789d4c5c83dd6f0f582fe24e9d49b39950fffe.
Diffstat (limited to 'src/server/scripts/Commands')
| -rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index f640d257a3a..79a74b0823d 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -665,29 +665,43 @@ public: static bool HandleNpcNearCommand(ChatHandler* handler, char const* args) { - WorldObject* object = handler->GetSession()->GetPlayer(); float distance = (!*args) ? 10.0f : float((atof(args))); uint32 count = 0; - CellCoord pair(Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY())); - Cell cell(pair); - cell.SetNoCreate(); - - std::list<Creature*> creatureList; - Trinity::AnyUnitInObjectRangeCheck check(object, distance); - Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck> search(object, creatureList, check); - TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck>, GridTypeMapContainer> visit(search); + Player* player = handler->GetSession()->GetPlayer(); - cell.Visit(pair, visit, *(object->GetMap()), *object, distance); + PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_NEAREST); + stmt->setFloat(0, player->GetPositionX()); + stmt->setFloat(1, player->GetPositionY()); + stmt->setFloat(2, player->GetPositionZ()); + stmt->setUInt32(3, player->GetMapId()); + stmt->setFloat(4, player->GetPositionX()); + stmt->setFloat(5, player->GetPositionY()); + stmt->setFloat(6, player->GetPositionZ()); + stmt->setFloat(7, distance * distance); + PreparedQueryResult result = WorldDatabase.Query(stmt); - if (!creatureList.empty()) + if (result) { - for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + do { - handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, (*itr)->GetGUIDLow(), (*itr)->GetGUIDLow(), (*itr)->GetName().c_str(), - (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ(), (*itr)->GetMapId()); + Field* fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); + float x = fields[2].GetFloat(); + float y = fields[3].GetFloat(); + float z = fields[4].GetFloat(); + uint16 mapId = fields[5].GetUInt16(); + + CreatureTemplate const* creatureTemplate = sObjectMgr->GetCreatureTemplate(entry); + if (!creatureTemplate) + continue; + + handler->PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, creatureTemplate->Name.c_str(), x, y, z, mapId); + ++count; } + while (result->NextRow()); } handler->PSendSysMessage(LANG_COMMAND_NEAR_NPC_MESSAGE, distance, count); |
