-
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
-
Похожий контент
-
От watson
Привет всем!
Выкладываю рабочий инструмент, который лично писал под задачи для крупных бонусных проектов. От меня недавно произошла доработка - теперь при записи маршрута сохраняются все сообщения, которые вы пишете в чат.
Как это работает Запуск записи:
Вводите /route с названием скрипта (или биндите на клавишу) — скрипт начинает фиксировать всё ваше передвижение (onfoot/incar/aim пакеты) и любые ваши сообщения в чат. Завершение:
Ещё раз /route с названием скрипта или /stop — сохраняется маршрут вместе с чатом в файл формата .rt в папке MoonLoader/rakbotRoutes. Воспроизведение:
Через команду !play <название> в консоли RakSamp LITE — бот воспроизводит маршрут один в один с вашими действиями, повторяет весь ввод, а так-же отправляет в чат все сохранённые сообщения (имитация через Enter). Поддержка цикла:
Можно включить повтор маршрута (!loop), пока не надоест. Что важно в коде
Запись всех синк-пакетов (движения, анимации, aim и т.д.):
Пакеты по движению (onfoot/incar/aim) записываются подробно — никакой халтуры, каждое значение (позиция, кватернион, скорость, анимации, флаги и т.д.) фиксируется для полной копии.
Запись сообщений чата по индексам
Каждое сообщение, которое отправляется в чат во время записи маршрута, сохраняется в отдельную таблицу с текущим индексом (counter). То есть при воспроизведении бот знает, на каком этапе какой текст нужно “цитировать” в чат.
Воспроизведение маршрута и чата
На каждом этапе воспроизведения проверяется, было ли сообщение в этот момент — если да, оно “отправляется” как будто в оригинале, без задержек и рассинхрона. Пакеты проигрываются по индексу — как только доходит до конца, скрипт сам решает, останавливать ли выполнение или запускать по кругу (если включен loop).
Формат сохранения
Файл маршрута содержит не только действия, но и отдельную секцию [chat], что позволяет воспроизвести всё как было, а не только беготню.
Если кому-то реально нужна автоматизация для бонусных серверов и не только как например фейковые игроки и вам важна последовательность действий и чата — этот инструмент сэкономит часы времени. Всё написано максимально просто для внедрения.
P.S. Если есть определённые проблемы, вопросы или даже идеи для доработки — пишите.
Desktop.zip
-
От gooding
Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
-
Andy Постоянный 28
Здравствуйте, у лидеров есть в панели 'Игроки оффлайн', и там можно листать вперед-назад, но проблема в том что листать вперед можно до бесконечности, даже если там нет строк, сам без понятия как сделать проверку, прошу помощи.
CMD:lmenu(playerid) { if(!PlayerInfo[playerid][pLeader]) return true; switch(PlayerInfo[playerid][pLeader]) { case 12,15,17,18,13: return SPD(playerid, 8383, DIALOG_STYLE_LIST, "{FFCC00}Меню лидера банды","{FFFFFF}1. Оффлайн список игроков\n2. Спавн транспорта организации","Принять","Выход"); case 23,1,4,7,10,16,19,22,24,21,25: return SPD(playerid, 8383, DIALOG_STYLE_LIST, "{FFCC00}Меню лидера:","{FFFFFF}1. Оффлайн список игроков","Принять","Выход"); case 5,6,14: return SPD(playerid,5873,DIALOG_STYLE_LIST,"{FFCC00}Меню притона","{FFFFFF}1. Нанять нового работника\n2. Уволить работника\n3. Информация о притоне\n4. Оффлайн список игроков", "Далее","Отмена"); case 26: return SPD(playerid, 9659, DIALOG_STYLE_LIST,"{FFCC00}Меню правительства:","{FFFFFF}1. Оффлайн список игроков\n2. Управление экономикой","Принять","Выход"); } return true; }
case 8383: { if(!response) return true; switch(listitem) { case 0: { new string[164]; mysql_format(connects,string, MAX_STR,"SELECT `pLevel`,`pMember`,pRank,`age`,`Name`,pGetonDate,`id` FROM `accounts` WHERE `pMember` = '%d'",PlayerInfo[playerid][pMember]); mysql_tquery(connects,string, "offmember", "dd",playerid,0); } case 1: { if(GetPVarInt(playerid, #spawn_gettime) > gettime()) return error(playerid, "Спавнить авто можно только с интервалом две минуты!"); if(PlayerInfo[playerid][pLeader] == 12) { forveh(i) if(!IsVehicleOccupied1(i) && i >= ballascar[0] && i <= ballascar[1]) SetVehicleToRespawn(i); } if(PlayerInfo[playerid][pLeader] == 13) { forveh(i) if(!IsVehicleOccupied1(i) && i >= vagoscar[0] && i <= vagoscar[1]) SetVehicleToRespawn(i); } if(PlayerInfo[playerid][pLeader] == 15) { forveh(i) if(!IsVehicleOccupied1(i) && i >= grovecar[0] && i <= grovecar[1]) SetVehicleToRespawn(i); } if(PlayerInfo[playerid][pLeader] == 17) { forveh(i) if(!IsVehicleOccupied1(i) && i >= coronoscar[0] && i <= coronoscar[1]) SetVehicleToRespawn(i); } if(PlayerInfo[playerid][pLeader] == 18) { forveh(i) if(!IsVehicleOccupied1(i) && i >= rifacar[0] && i <= rifacar[1]) SetVehicleToRespawn(i); } new string[100]; format(string, 100, "Лидер организации %s зареспавнил весь незанятый транспорт Вашей организации!", PlayerInfo[playerid][pNames]); SendFamilyMessage(PlayerInfo[playerid][pMember], COLOR_BLUE, string); SetPVarInt(playerid, #spawn_gettime, gettime()+120); } } }
publics: offmember(playerid,page) { new f,d; cache_get_data(f,d); if(!f) return true; new nicks[24],lastvhod[30],name[50],rank,level,fraction,id_acc; new string[2048]; StringName[StringList] = -1, StringList = 0, DeletePVar(playerid, #name_string); format(string, sizeof(string),"{FFFFFF}Имя Фамилия\t{FFFFFF}Звание/Ранг\t{FFFFFF}Возраст\t{FFFFFF}Последний вход\n{FFCC00}Перейти на следующую страницу\nПерейти на предыдущую страницу{FFFFFF}\n"); new get = page*15; for(new i = get; i < f; i++) { if(i > page*15+14) break; cache_get_field_content(i, "Name", nicks, connects, sizeof ( nicks )); id_acc = cache_get_field_content_int(i, "id", connects); fraction = cache_get_field_content_int(i, "pMember", connects); rank = cache_get_field_content_int(i, "pRank", connects); level = cache_get_field_content_int(i, "age", connects); cache_get_field_content(i, "pGetonDate", lastvhod, connects, sizeof ( lastvhod )); StringName[StringList] = id_acc, StringList++; format(string,sizeof(string), "%s%d. %s\t[{FFCC00}%s(%d){FFFFFF}]\t[{FFCC00}%d {FFFFFF}лет/год(-а)]\t[{FFCC00}%s{FFFFFF}]\n",string,i+1,nicks,PlayerRank[fraction-1][rank-1],rank,level,lastvhod); } SetPVarInt(playerid, #page_str, page+1); format(name, sizeof(name), "{FFCC00}Страница номер: %d", GetPVarInt(playerid, #page_str)); SPD(playerid, 758, DIALOG_STYLE_TABLIST_HEADERS, name, string, "Принять", "Отмена"); return true; }
case 758: { if(!response) return DeletePVar(playerid, #page_str); new link = listitem, string[MAX_STR]; if(link == 0 || link == 1) { new page; if(!link) page = GetPVarInt(playerid, #page_str); else if(link == 1) page = GetPVarInt(playerid, #page_str)-2; if(link == 1 && page == -1) return error(playerid, "Страниц больше нет!"); mysql_format(connects,string, MAX_STR,"SELECT `pLevel`,`pMember`,pRank,`age`,`Name`,pGetonDate,`id` FROM `accounts` WHERE `pMember` = '%d'",PlayerInfo[playerid][pMember]); mysql_tquery(connects,string, "offmember", "dd",playerid,page); } if(link >= 2) { StringList = link-2; mysql_format(connects,string, MAX_STR,"SELECT `Name`,`pGetonDate`,`pRank`,`pMember` FROM `accounts` WHERE `id` = '%d'",StringName[StringList]); mysql_tquery(connects,string, "offstats", "dd", playerid,StringName[StringList]); } }
Отредактировано пользователем Andy
Поделиться сообщением
Ссылка на сообщение