Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Запросы (http://mangos.ytdb.ru/forumdisplay.php?f=7)
-   -   Статистика рейдов (http://mangos.ytdb.ru/showthread.php?t=5137)

wroud 12.11.2011 10:05

Статистика рейдов
 
Нужен патч который бы записывал в таблицу статистику рейдов .
То_есть игрок прошел к примеру ЧХ(чёрный храм), а в таблицу
character_raids
записались данные

guid(игрока)raid(энтри рейда)boss_1,boss_2,boss_3,boss_4,boss_5,boss_6,boss_7,boss_8,boss_9,boss_10,boss_11,boss_12,boss_13,boss_14,boss_15,boss_16,boss_17,boss_18,boss_19,boss_20(боссы идут по порядку как в рейде)data(время последнего обновления)

получаем что-то типа
1 1 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1235556
где 1 2 1 - это первые 3 босса число показывает, сколько раз данный босс был убит.
Если что-то не так разъяснил или не поняли - переспросите.
Буду очень благодарен.

//Прости не удержался и поправил ошибки :) //Evilstar

TOM_RUS 12.11.2011 17:02

Разве эта инфа не записывается в таблицу с ачивками? Хотя бы частично....

wroud 12.11.2011 17:37

записывается но нужно более точнее

пожалуйста сделайте кто может я не очень в c++ шарю =(

rsa 12.11.2011 19:06

сейчас темпура придет и сделает... а если догонит, то вообще хана.
ну а если серьезно, вряд ли вы найдете хоть кого-нибудь, кому это надо (задача глупая и неинтересная). людей с подобными идеями в сети - вагон, а вот людей способных их реализовать - единицы. так что придется все же учить C++.

wroud 12.11.2011 19:32

я бы рад, вот только один с кучами книг из инета не справлюсь(
если бы кто мог обьяснить, хотя есть один знакомый...

почитал дату которую создаёт патч для вов армори_(шадес)
был в ужасе - 1327 строк_(если пробел считать как разделительный знак)
где во многих местах по 10 раз и больше повторяется одно и то же число , причём это такие числа, как 1065353216, 4294967295 >_<

Sid 12.11.2011 21:49

Число строк в патче не является показателем его сложности.
Эти числа проще воспринимать в шестнадцатеричной системе счисления)
Первое число какой-то флаг.
А второе число это -1 в unsigned int.

wroud 12.11.2011 22:00

Цитата:

Сообщение от Sid (Сообщение 25685)
Число строк в патче не является показателем его сложности.
Эти числа проще воспринимать в шестнадцатеричной системе счисления)
Первое число какой-то флаг.
А второе число это -1 в unsigned int.

Речь идёт не о патче а о структуре заносимой в бд минут 10 точно по строкам числа разносил :D

TOM_RUS 13.11.2011 00:08

Цитата:

Сообщение от wroud (Сообщение 25680)
записывается но нужно более точнее

Куда же еще точнее?

wroud 13.11.2011 00:20

с точностью до босса

TOM_RUS 13.11.2011 00:34

Цитата:

Сообщение от wroud (Сообщение 25688)
с точностью до боса

Ну так в таблице с ачивками тоже записывается сколько раз каждый босс был убит игроком, вот только даты последнего обновления там нет вроде, ну и привязки босса к конкретному рейду тоже, но это не сложно сделать самому зная что это за босс...

wroud 13.11.2011 10:28

понятное дело, но ведь некоторые ачивки не отслеживают боссов, да и вообще не работают

Lurker 15.11.2011 17:52

Могу дать старый патчик на логирование убийств элитников, записывает кто был в группе.

wroud 15.11.2011 18:16

буду благодарен

Lurker 15.11.2011 18:30

В виде патча не нашол :(

где-то в файле Unut.cpp


Код:

        if (pVictim->GetTypeId() == TYPEID_UNIT)
        {
            group_tap = ((Creature*)pVictim)->GetGroupLootRecipient();

// Вставка начинается Отседова :)
        if(((Creature*)victim)->GetCreatureInfo()->rank == CREATURE_ELITE_WORLDBOSS) {
            std::ostringstream TmpTextMassage;
                TmpTextMassage << "Death \"" << victim->GetName() << "[" << victim->getLevel() << "]\"";

                if (Player *player_tap = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) {
                        if (player_tap->GetTypeId() == TYPEID_PLAYER && player_tap != victim) {
                                TmpTextMassage  << " looting by \"" << player_tap->GetName() << "[" << player_tap->getLevel() << "]\" " << player_tap->GetSession()->GetAccountId();
                                if( Group *pGroup = player_tap->GetGroup() )
                                {
                                        TmpTextMassage << " Asistent: ";
                                        for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
                                        {
                                                Player *pGroupGuy = itr->getSource();
                                                if( pGroupGuy && player_tap->GetName() != pGroupGuy->GetName()) {
                                                        TmpTextMassage << pGroupGuy->GetName() << "[" << pGroupGuy->getLevel() << "] " << pGroupGuy->GetSession()->GetAccountId() << " ";
                                                }
                                        }
                                }
                        }
                        TmpTextMassage << " ! Location : X: " << player_tap->GetPositionX() << ", Y: " << player_tap->GetPositionY() << ", Z: " << player_tap->GetPositionZ() << ", MapId: " << player_tap->GetMap()->GetMapName() << " (" << player_tap->GetMapId() << ")";

// Тут была самописная функция записи в мускул (она за собой тянет много строк, поэтому не выкладываю ее тут), можете вписать вывод в файл лог или в саму игру как сообщение

                }
        }

// Вставка заканчивается тут !

                        if (Player* recipient = ((Creature*)pVictim)->GetOriginalLootRecipient())
                player_tap = recipient;
        }


wroud 15.11.2011 18:35

а sql?

Lurker 15.11.2011 18:42

Вот сама пропущенная строка из предыдущего поста :
Код:

        sWorld.SendGlobalMessageOnlyGM(3,player_tap,TmpTextMassage.str());
где-то в файле World.cpp

Код:

// Вставка начинается Отседова :)
void World::SendGlobalMessageOnlyGM(uint32 type, Player *cheater, std::string msg)
{
        CharacterDatabase.PExecute("INSERT INTO log_cheaters_alert (typeaction,account,player,timeact,message) VALUES ('%u','%u','%s',UNIX_TIMESTAMP(),'%s')", type, cheater->GetSession()->GetAccountId(), cheater->GetName(), msg.c_str());
        WorldPacket data;
        ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_SYSTEM, LANG_UNIVERSAL, NULL, 0, msg.c_str(), NULL);
        SessionMap::const_iterator itr;
        for (itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
        {
                if (itr->second && itr->second->GetPlayer() && itr->second->GetPlayer()->IsInWorld() && itr->second->GetPlayer()->isGameMaster()) {itr->second->SendPacket(&data);}
        }
}
// Вставка заканчивается тут !

namespace MaNGOS
{



где-то в файле World.h

Код:

        void LoadConfigSettings(bool reload = false);
// Вставка начинается Отседова :)
                void SendGlobalMessageOnlyGM(uint32 type, Player *cheater, std::string msg); // Anticheat
// Вставка заканчивается тут !

        void SendWorldText(int32 string_id, ...);


Вот структура базы:

Код:

DROP TABLE IF EXISTS `log_cheaters_alert`;
CREATE TABLE IF NOT EXISTS `log_cheaters_alert` (
  `entry` bigint(20) NOT NULL AUTO_INCREMENT,
  `typeaction` int(3) NOT NULL default 0,
  `account` int NOT NULL default 0,
  `player` varchar(60) NOT NULL default '',
  `timeact` int NOT NULL DEFAULT '0',
  `message` text NOT NULL,
  PRIMARY KEY (`entry`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=33 ;

typeaction = 3 = 'bosskill'

ну вот както так .... вроде ничего не пропустил, должно работать...
Кроме занесения записи в таблицу, анонсируется в чат игры ГМ'ам

tempura 15.11.2011 20:14

OFFTOPIC
 

Lurker 15.11.2011 21:48

Цитата:

Сообщение от tempura (Сообщение 25714)



Текущее время: 22:10. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS