diff options
| author | Shauren <shauren.trinity@gmail.com> | 2013-10-26 17:06:50 +0200 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2013-10-26 17:06:50 +0200 | 
| commit | 75a790ca475c6af31730d331a3ab185f8abdd6e2 (patch) | |
| tree | f961f8de614ac7e1dfc1f17c68e83c7d14feff20 /src/server/scripts/Commands | |
| parent | 8d6aec608f0cd323d291dc12efce32f630590a23 (diff) | |
| parent | b81bf7d0250939ee96b942f554c16d950f06c7b1 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Diffstat (limited to 'src/server/scripts/Commands')
| -rw-r--r-- | src/server/scripts/Commands/cs_debug.cpp | 26 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_group.cpp | 51 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 40 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_tele.cpp | 2 | 
4 files changed, 89 insertions, 30 deletions
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index dc88366e677..fd6c0b7a149 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -31,6 +31,7 @@ EndScriptData */  #include "GridNotifiers.h"  #include "GridNotifiersImpl.h"  #include "GossipDef.h" +#include "Transport.h"  #include "Language.h"  #include <fstream> @@ -91,6 +92,7 @@ public:              { "areatriggers",  rbac::RBAC_PERM_COMMAND_DEBUG_AREATRIGGERS,  false, &HandleDebugAreaTriggersCommand,     "", NULL },              { "los",           rbac::RBAC_PERM_COMMAND_DEBUG_LOS,           false, &HandleDebugLoSCommand,              "", NULL },              { "moveflags",     rbac::RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS,     false, &HandleDebugMoveflagsCommand,        "", NULL }, +            { "transport",     rbac::RBAC_PERM_COMMAND_DEBUG_TRANSPORT,     false, &HandleDebugTransportCommand,        "", NULL },              { "phase",         rbac::RBAC_PERM_COMMAND_DEBUG_PHASE,         false, &HandleDebugPhaseCommand,            "", NULL },              { NULL,            0,                                     false, NULL,                                "", NULL }          }; @@ -1358,6 +1360,30 @@ public:          return true;      } +    static bool HandleDebugTransportCommand(ChatHandler* handler, char const* args) +    { +        Transport* transport = handler->GetSession()->GetPlayer()->GetTransport(); +        if (!transport) +            return false; + +        bool start = false; +        if (!stricmp(args, "stop")) +            transport->EnableMovement(false); +        else if (!stricmp(args, "start")) +        { +            transport->EnableMovement(true); +            start = true; +        } +        else +        { +            handler->PSendSysMessage("Transport %s is %s", transport->GetName().c_str(), transport->GetGoState() == GO_STATE_READY ? "stopped" : "moving"); +            return true; +        } + +        handler->PSendSysMessage("Transport %s %s", transport->GetName().c_str(), start ? "started" : "stopped"); +        return true; +    } +      static bool HandleDebugPhaseCommand(ChatHandler* handler, char const* /*args*/)      {          Unit* unit = handler->getSelectedUnit(); diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 8c38d954203..fda34586f0c 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -260,24 +260,35 @@ public:      static bool HandleGroupListCommand(ChatHandler* handler, char const* args)      { +        // Get ALL the variables!          Player* playerTarget; +        uint32 phase = 0;          uint64 guidTarget;          std::string nameTarget; +        std::string zoneName; +        const char* onlineState = ""; +        // Parse the guid to uint32...          uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER); +        // ... and try to extract a player out of it.          if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))          {              playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);              guidTarget = parseGUID;          } +        // If not, we return false and end right away.          else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))              return false; +        // Next, we need a group. So we define a group variable.          Group* groupTarget = NULL; + +        // We try to extract a group from an online player.          if (playerTarget)              groupTarget = playerTarget->GetGroup(); +        // If not, we extract it from the SQL.          if (!groupTarget)          {              PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER); @@ -287,6 +298,7 @@ public:                  groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());          } +        // If both fails, players simply has no party. Return false.          if (!groupTarget)          {              handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str()); @@ -294,12 +306,20 @@ public:              return false;          } -        handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party")); +        // We get the group members after successfully detecting a group.          Group::MemberSlotList const& members = groupTarget->GetMemberSlots(); + +        // To avoid a cluster fuck, namely trying multiple queries to simply get a group member count... +        handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"), members.size()); +        // ... we simply move the group type and member count print after retrieving the slots and simply output it's size. + +        // While rather dirty codestyle-wise, it saves space (if only a little). For each member, we look several informations up.          for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)          { +            // Define temporary variable slot to iterator.              Group::MemberSlot const& slot = *itr; +            // Check for given flag and assign it to that iterator              std::string flags;              if (slot.flags & MEMBER_FLAG_ASSISTANT)                  flags = "Assistant"; @@ -321,13 +341,38 @@ public:              if (flags.empty())                  flags = "None"; +            // Check if iterator is online. If is...              Player* p = ObjectAccessor::FindPlayer((*itr).guid); -            const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline"; +            if (p && p->IsInWorld()) +            { +                // ... than, it prints information like "is online", where he is, etc... +                onlineState = "online"; +                phase = (!p->IsGameMaster() ? p->GetPhaseMask() : -1); +                uint32 locale = handler->GetSessionDbcLocale(); + +                AreaTableEntry const* area = GetAreaEntryByAreaID(p->GetAreaId()); +                if (area) +                { +                    AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); +                    if (zone) +                        zoneName = zone->area_name[locale]; +                } +            } +            else +            { +                // ... else, everything is set to offline or neutral values. +                zoneName    = "<ERROR>"; +                onlineState = "Offline"; +                phase       = 0; +            } +            // Now we can print those informations for every single member of each group!              handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState, -                GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str()); +                zoneName.c_str(), phase, GUID_LOPART(slot.guid), flags.c_str(), +                lfg::GetRolesString(slot.roles).c_str());          } +        // And finish after every iterator is done.          return true;      }  }; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 301f37d7acc..422ca31a4c2 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -246,24 +246,22 @@ public:          float o = chr->GetOrientation();          Map* map = chr->GetMap(); -        if (chr->GetTransport()) +        if (Transport* trans = chr->GetTransport())          { -            uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO()); -            if (tguid > 0) -            { -                PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_INS_CREATURE_TRANSPORT); +            uint32 guid = sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT); +            CreatureData& data = sObjectMgr->NewOrExistCreatureData(guid); +            data.id = id; +            data.phaseMask = chr->GetPhaseMgr().GetPhaseMaskForSpawn(); +            data.posX = chr->GetTransOffsetX(); +            data.posY = chr->GetTransOffsetY(); +            data.posZ = chr->GetTransOffsetZ(); +            data.orientation = chr->GetTransOffsetO(); -                stmt->setInt32(0, int32(tguid)); -                stmt->setInt32(1, int32(id)); -                stmt->setInt32(2, int32(chr->GetTransport()->GetEntry())); -                stmt->setFloat(3, chr->GetTransOffsetX()); -                stmt->setFloat(4, chr->GetTransOffsetY()); -                stmt->setFloat(5, chr->GetTransOffsetZ()); -                stmt->setFloat(6, chr->GetTransOffsetO()); +            Creature* creature = trans->CreateNPCPassenger(guid, &data); -                WorldDatabase.Execute(stmt); -            } +            creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMgr().GetPhaseMaskForSpawn()); +            sObjectMgr->AddCreatureToGrid(guid, &data);              return true;          } @@ -904,17 +902,6 @@ public:              return false;          } -        if (target->GetTransport() && target->GetGUIDTransport()) -        { -            PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_TRANSPORT_EMOTE); - -            stmt->setInt32(0, int32(emote)); -            stmt->setInt32(1, target->GetTransport()->GetEntry()); -            stmt->setInt32(2, target->GetGUIDTransport()); - -            WorldDatabase.Execute(stmt); -        } -          target->SetUInt32Value(UNIT_NPC_EMOTESTATE, emote);          return true; @@ -1342,7 +1329,8 @@ public:      {          if (!*args)              return false; -        char* charID = strtok((char*)args, " "); + +        char* charID = handler->extractKeyFromLink((char*)args, "Hcreature_entry");          if (!charID)              return false; diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 154da04db6a..ca9f4a59045 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -65,7 +65,7 @@ public:          std::string name = args; -        if (sObjectMgr->GetGameTele(name)) +        if (sObjectMgr->GetGameTeleExactName(name))          {              handler->SendSysMessage(LANG_COMMAND_TP_ALREADYEXIST);              handler->SetSentErrorMessage(true);  | 
