Подполковник
Сообщений: 137 Зарегистрирован: 05.07.2009 Страна: Казахстан Город: Алматы
| Quote (CHOPK) а если придется затронуть ядро, что вообще надо сделать? Quote (Maick) P.S.S Порылся в сорсах Маногса, нашел файлы Level0.cpp, Level1.cpp, Level2.cpp, Level3.cpp (Отвечают за команды игроков с уровнем доступа 0-3) , там вроде как команды описаны , как добавлять новые хз, но думаю это все чем я могу помочь. Я как бы начал расписывать. Я полагаю, что новую команду нужно расписывать в этих файлах. Например, возьмем файл Level3.cpp. Нашел в нем такой код: Code bool ChatHandler::HandleAddItemCommand(const char* args) { if (!*args) return false;
uint32 itemId = 0;
if(args[0]=='[') // [name] manual form { char* citemName = strtok((char*)args, "]");
if(citemName && citemName[0]) { std::string itemName = citemName+1; WorldDatabase.escape_string(itemName); QueryResult *result = WorldDatabase.PQuery("SELECT entry FROM item_template WHERE name = '%s'", itemName.c_str()); if (!result) { PSendSysMessage(LANG_COMMAND_COULDNOTFIND, citemName+1); SetSentErrorMessage(true); return false; } itemId = result->Fetch()->GetUInt16(); delete result; } else return false; } else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r (Это часть функции bool ChatHandler::HandleAddItemCommand(const char* args)) Данная часть, реализует команду Additem (Ну вы знаете, добавление итема в инвентарь), как видим из кода она обращается к БД: Quote SELECT entry FROM item_template WHERE name В этой таблицы (item_template) он находит нужный вам итем по ID'у (который вы прописали в команде .additem id). После того, он проверяет Select игрока (если выбран добавляет ему, если нет, то вам): Code Player* pl = m_session->GetPlayer(); Player* plTarget = getSelectedPlayer(); if(!plTarget) plTarget = pl; Если проверка завершена, то добавляется итем (по координатам в инвентаре и ID'у, поиск пустого слота): Code //Adding items uint32 noSpaceForCount = 0;
// check space and find places ItemPosCountVec dest; uint8 msg = plTarget->CanStoreNewItem( [b]NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount [/b]); if( msg != EQUIP_ERR_OK ) // convert to possible store amount count -= noSpaceForCount;
if( count == 0 || dest.empty()) // can't add any { PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount ); SetSentErrorMessage(true); return false; } Ах да, забыл, кол-во итемов тоже в фактический параметрах присутствует. Почему я это все расписал?!, а потому что, если мы знаем точные координаты и id, той самой злополучной шмотки, то можем зависти процедуру Destroy. Как ты правильно указал команду: Quote (CHOPK) Kvestor, попробуй .additem ID -1 Я покажу точный код этой команды: Code //Subtract if ([b]count[/b] < 0) { plTarget->DestroyItemCount(itemId, -count, true, false); PSendSysMessage(LANG_REMOVEITEM, itemId, -count, GetNameLink(plTarget).c_str()); return true; } Я думаю все понятно, если GM указал отрицательное кол-во итемов (...if (count < 0)...), то объект уничтожается из инвентаря (DestroyItemCount). Выше описанная моя мысль лишь поможет понять, как и где что нужно расписать, что бы новую команду создать. Вот и все, если что забыл написать, дополните, если ошибся где укажите (исправлю, писал на память, то что думал, ошибки возможны). Я думаю хоть как-то поможет и ответит на твой вопрос. P.S. Для примера я взял код из файла Level3.cpp, этот файл отвечает за команды 3го уровня аккаунта. Другие файлы ты найдешь: Code %Sources_dir%\src\game\ Level0.cpp - Обычный аккаунт ... Level3.cpp - Администратор P.S.S. Все.
С Уважением, Михаил
Сообщение отредактировал Maick - Вторник, 06.07.2010, 10:18 |