Настрой решительный, ни одну прогу так долго еще не мусолил)
По существу и язык для меня новый(на C# пишу - это мой 1ый на нем проект) и вобще я раньше не работал особо с пакетами, тридами скриптами, графикой и прочей хренотенью) Боюсь как бы какашку не сделать из-за незнания того что делаю)
...
А началось все с инжектора) Начал играть на пвп-альфе(шард такой) и там же начал 1 раз юзать инжект (до этого его не юзал потому что он запрещен везде)... мой скрипто-ориентированный моск сразу усек что можно написать на нем такие скрипты что бегать возможно будет в 2 кнопки) Что я и сделал. Написал много прикольных скриптов (которые используются непосредственно в ПвП), но с ростом сложности скриптов стало увеличиватся количество крашей ( некоторые скрипты у валили клиент с довольно большой вероятностью - тяжелые скрипты).
Да и на слабом компе под инжектом особо не поиграешь там просто слайдшоу (хотя без инжекта норм). Ну и в рамки вгоняет нехило ограниченность по функционалу(много чего нельзя через инжект сделать) Вот и пришла идея замутить свой клиент.. причем цель сразу поставил себе переплюнуть инжект в плане гибкости (скорости выполнения, отказоустойчивости) скриптов, дабы воплотить в реальность свою мечту - ПвП бот (который сам бегает всех валит, пока хозяин чара спит).
...
Почему именно C#? А все просто - нашел в сети исходник UOPhoenix (прога на c# очень сырая - аналог инжекта) .. проект этот успешно заброшен и не обновляется. Из этого исходника я сп***ил (по другому не скажешь) пару тройку классов.. (по сетевой части - пакет билдер (набор функций создающих тело пакета из входных параметров), и описание длин пакетов.. оттуда же вытащил .net надстройку над стандартным uoencryption.dll (это для шифровки пакетов)).. Долго ковырялся с шифровалкой.. но в итоге кое -как все вроде бы заработало, подрубился на пвп-альфу со своей консольной проги(чему был жутко рад). Первый этап пройден теперь меня ничто не остановит. Дальше оказалось что не все так просто как с тупо коннектом на сервер - пакеты то нужно принимать асинхронно) В отдельном триде тобишь (тут началось мое очень приятное знакомство с тридами и тем как они любят вылетать с ошибками, если их не синхронизировать). После пары дней мук, получилось нечто способное ходить в разные стороны) Для того чтоб увидеть что собственно происходит приходилось 2ым чаром через стандартный клиент заходить )))
Этот факт мне не очень понравился и я начал ковырять интернеты в надежде найти какой-то алгоритм, способный открыть стандартные mul-ы чтобы из них отображать графику. В итоге нашел (опять под c#!) библиотеку для открывания этих мулов (я с ней еще не до конца разобрался). Кстати она от вроде как от создателей RunUo(если не путаю). Далее пошли проблемы с выбором граф движка (под c# альтернатив не много в отличии от native-языков таких как c++), остановился на Managed DirectX(мелкософтовская надстройка над DirectX под .net). Кое как сделал вывод тайловой карты (мучался еще с формулами преобразовния координат из x y объекта в экранные координаты - так как в уо все повернуто на 45 градусов). Потом и отрисовку объектов(присобачил в обработчике приходящих пакетов пакет на отрисовку(не знаю как по другому назвать) объекта). Потом у меня были долгие муки связанные с тем что мир нужно рисовать какбэ в 3д(тоесть устанавливать порядок отрисовки объектов).
Ну дальше я на эту прогу забил и ушел с головой в задротство World of Warcraft на оффе, так как приехал брат и затянул меня в это дело. вкачал 80ку одел в эпики, и теперь могу спокойно смотреть на вас как на говно потому что у меня эльф 80лвл)))) (хотя он на самом деле хуман).
Далее вов разочаровал меня своей убогостью и крайним нежеланием близзардов избавить ПвПшников от сраного ПвЕ-контента. Забил.
Решил снова взятся за прогу. Решил не убивать свой мозг MUL-ами и сделать примитивненькую графику, лишь-бы было понятно что происходит на экране. Однако проблема с отрисовкой в "3д" осталась. На форуме gamedev.ru мне сказали что нужно тупо сортировать массив вида(объекты которые отрисовываются) по xyz. Сработало). Поставил обратно MUL-ки и теперь уже у меня отрисовывается что-то отдаленно напоминающее уо). Узнал, что данные об объектах перестают приниматся (а также начинают приниматся с другой стороны) в пределах определенного радиуса от чара ( - кругом, хотя я считал что там все в форме экрана тоесть таким непонятным прямоугольником повернутым на 45 градусов). Оказалось что область которую можно показывать игроку на самом деле раза в полтора больше чем на стандартном клиенте. Дальше засунул в отрисовку статику. Все стало очень красиво и теперь я перестал упиратся мордой в невидимые объекты(которыми и была статика).
Однако меня огорчал фпс.. (в самом начале я тупо загружал практически все ресурсы нужные для отображния, что длилось секунд 15 наверно.. и это без анимаций!.. и памяти жрало кучу..при том стандартная уо жрет вначале около 35метров и спокойно работает без тормозов)). При загрузке ресурсов(уже динамически - когда их требует отрисовщик) игра подвисала пока не загрузит нужные ресурсы.. эти зависания всего по несколько милисекунд но ресурсов много и в итоге это выливалось в ТОРМОЗА.
Решением стала загрузка всех ресурсов в отдельном триде. все стало работать НАМНОГО быстрее но все таки не айс.. оказалось что в managed directx отрисовка какая-о мега медленная.
В итоге я сменил Managed DirectX(by Мелкософт, правдо они его уже не поддерживают) на SlimDx(аналог манажед, от сторонних разработчиков). Новый граф апи был 1 в 1 похож на манажед директикс (в смысле все функции также называются - не пришлось врубатся в него с 0ля) - и отрисовка у него была намного быстрее.
Дальше ковырял анимацию в итоге у меня уже есть возможность проигрывать анимацию у персов (чуть позже сделаю и анимацию тайлов - там все просто).
Примерно на этом моменте я вспомнил рад чего я это все делаю - мне же скрипты нужно присобачить (можно конечно и прямо в коде прописать все что нужно, но тогда народ не сможет писать под себя ничего.. ведь шардов разных много да и разные скрипты всем нужны - всего в "твердом" коде не пропишешь) - в итоге я завис надолго.. ковырял LuaInterface сначала оказалось что там нифига не поддерживаются триды(а это в скриптах на уо критично)..есть какойто внутренний механизм тридов(из скрипта) я его долго мучал но так и не нашел механизма его связки с внешним миром(прогой).
Уже начал растраиватся и думать о том как буду писать свой интерпретатор скрипт-языка. В итоге узнал что у .net есть прикольный механизм - можно прямо из проги скомпилировать .net скрипты(стандартными средставми) и подрубить то что получилось(.dll - сборка .net) к основной проге. И это сработало. Оказалось в UOPhoenix использовалась эта же система но я тогда не мог разобрацо в коде на c# особо, по этому не стал вытаскивать оттуда механизм скриптов. Теперь я могу вызывать из скрипта любые функции (прямо как в инжекторе), и из скрипта вызывать функции проги.
Сделал систему запуска каждой функции в отдельном триде с возможностью пришлепнуть зависшую функцию(такое же окошко как в инжекторе).
До этого момента у меня была возможность использовать только 1го чара для своих экспирементов с 1го окна проги. Теперь сделал по - другому. Ну тут аналогия со стелсом(к этому моменту я уже успел его немного поковырять.. скрипты не писал просто коннектился к пвп-альфе сморел че за прога вобщем) из списка выбирается чар его можно подключить от его имени можно запустить скрипт.
Также скрипты можно запускать от активного перса(активный - тот который в данный момент виден в игровом окне - там де графика рисуется..остальные либо просто подключены и стоят на месте либо на скриптах стоят..в любой момент можно переключится на другого чара и играть уже им). Такие активные функции по аналогу с инжектом будут вешатся на кнопки и вызыватся из игрового окна по нажатии кнопок.
Еще присобачил крякнутый компонент для подсветки кода(это для редактирования скриптов - планирую там еще систему сделать (наработки есть) выведения списка объектов например когда точку пишешь (ну во всех IDE такое сть) и подсветку аргументов у функции когда скобку открываешь.. впринципе я это уже сделал но малец глючит - отключил пока..потом доработаю.
Это для того чтобы не держать в уме все названия(а они чувствительны к регистру) функций которые нужны для написания скриптов.. там еще комменты к каждой функции (так что по большому счету еще и справочник частично заменят)
Пока что можно использовать только 1ин сервер одновременно (с 1го окна проги), но в будующем сделаю для нескольких серверов (хотя на самом деле непонимаю зачем это может понадобится)
Все данные о настройках относительно игроков(логин, пароль, имя чара.. потом там будут еще другие настройки) а также настройки адреса сервера, необходимоси использования мулов(читать дальше))
хранятся в 1ом файле (профайл). Еще будут(пока не сделал) в другом файле общие настройки такие как путь к скрипту на автозагрузку.. там цвета окошек всякие и прочая шелуха).
Вроде ничего не упустил. Да кстати скрипты(процессы) не разделены между отдельными игроками.. то есть можно сделать скрипт который будет управлять сразу 10-ю чарами (стратегии из уо делать xD).
Соответственно перестают быть полезными скрипты которые до этого юзались для спаррингов(это просто пример).. в которых для того чтоб друг друга не убить приходилось своим чаром говорить из скрипта команду(в уо чат) о том что нужно перестать меня бить(когда мало хп) - таким скриптом я пользовался на уо пилоте. Тут просто скрипт может посмотреть данные другого чара абсолютно спокойно.
...
Блин целую поэму накатал)
Что планирую сделать:
1) Херову тучу функций для работы с прогой из скрипта (включая "сырые" функции, такие как отправка определенного пакета, отрисовка произвольной загогулины на игровом экране и тд)
2) Возможность эмуляции разных версий клиента (само собой разная шифровка пакетов + фишки доступные в определенных версиях)
3) Защиту от вредоносного действия скрипта (не секрет что в код скриптов врубаются далеко не все кто играет например на инжекте, и не всегда можно проверить а не прислал ли дядя вася скрипт с названием мего-авто-лесоруб, в котором на самом деле скриптовый-вирус. (открытие файла(профайла) - смотрение в пароль и рассказывание этого пароля через Say в игре))
Для начала отключу по дефолту некоторые библиотеки которые будет использовать скрипт(для чтения файла.. создания сокетов и многое другое).. при желании их можно будет подрубить в натройках.. но тогда план дяди васи по захвату мира через ваш комп может пройти успешно.С другой стороны необходимость в этих библиотеках не должна появлятся(это только если вы делаете какойто - мега сложный скрипт) Все что нужно для скриптинга в уо я включу в стандартные функции. Встречный вопрос - может ли интерпретатор паскаля(ну то что стоит в стелсе) открыть реестр и увидеть там пароль от акков стелса? Если может то советую задуматся над тем как это ограничить.
4) Графика. Сделать все то что нужно для нормального восприятия ситуации(игровой) в уо. То есть возможности стандартного клиента уо. Возможно тут сделаю что то прикольное вроде нормальных теней света и прочего(но это все стоит по приоритету на последнем месте)
5) Играбельность - она должна быть не ниже чем на оригинальном клиенте. Планирую отойти от стандартных вещей в уо, таких как лут с трупа(сделаю короче говоря весь инвентарь в клеточках по дефолту - как в оригинальной уо можно будет включить в настройках), **ля с таргетами - сделаю как во всех нормальных(читай корейских xD) мморпгах - выделил цель (она выделелась и хорошо видна на экране), причем выделил без всяких сумасшедших ловушек таргетов - а просто сингл кликом(кнопки можно будет настроить на нужные действия) и шлепаешь касты в цель(причем ненужно будет писать скрипт в пол-экрана чтобы кастануть по последнему таргету) 1им юзом спелла. Если цели никакой нету то будет вылезать таргет(ну это как в ВоВе).. также можно будет кастовтаь на себя.
Можно будет задавать задержку на разные спеллы (возможно даже без использования скриптов) - и на экране у спеллов будет показыватся время кулдауна(время пока этот спелл нельзя кастовтаь).. вобщем все как в нормальных мморпгах. В итоге большинству игроков скрипты не нужны будут вобще! Все будет по дефолту удобным.
6) Работа без MUL-ов. Графика в таком случае берется из папки с прогой и она крайне примитивная.. нужна исключительно для того чтоб понять что где находится..играть на таком будет проблематично
7) Всякие дополнительные фичи.. вроде записи макроса(результат - набор скриптовых команд, которые нужно вставлять в скрипт+редактировать).. поддержки функций инжектора(с такими же названиями и аналогичной реализацией..они будут в отдельном классе) ..также возможно херовину сделаю для перевода скриптов из инжекта на скрипты моей проги.
Еще думаю сделать что-то вроде пактной записи видео.. из кучи пакетов выделять скриптовые команды которые будут отрисовывать нужные оббъекты на экране - результат - скрипт который в оффлайне запускаешь и наблюдаешь "видео"
8) В случае успешного релиза проги, можно будет задумыватся о версии под КПК. Кпк с каждым днем становятся все мощнее.. вполне хватит современного кпк (коммунтикатора) для отрисовки графики в примитивном виде..примитивной анимации и использования протокола уо(сетевого) для связи с сервером. ММОРПГИ под кпк уже есть и неплохо бы увидеть УО на кпк. Конечно в хард-моде ПвПшится врядли с него получится но помочить мобов(порубить лес xD) вполне реально.
Вот такие у меня планы.
К разработчику стелса:
По большому счету наши проги выполняют одну и ту же задачу - автоматизация действий игрока через скрипты, без использования оригинального клиента от уо.
Может поделимся мыслями о том как и что делать и в итоге возможно сделаем нечто на основе этих прог более крутое? Делаем то одно и тоже)
Саму прогу выкладывать не буду, пока она не будет нормально(без ошибок) работать.. ну и чтоб функционал у нее был поболее чем сейчас. Щас то все равно толку с нее 0. Только перспективы.
Выложу несколько скринов (скрины разных версий)
http://depositfiles.com/files/sdvstz43t
А это шаблон скрипта:
Code: Select all
// Это шаблон скрипта для HandOfGod
// Все функции, вызываемые из HandOfGod, должны находится в пространстве имен Script, public классе Executable. Класс
// не должен быть статическим. Функции не вызываемые напрямую из HandOfGod могут определятся в любом месте.
// После загрузки скрипта в HandOfGod создается экземпляр класса Script.Executable.
// Из него вызываются все нужные функции
using ScriptAPI;
namespace Script
{
public class Executable
{
//------------------------------Блок вызова от имени определенного игрока----------------------
// Это точка входа в скрипт, при вызове скрипта от имени игрока, где playerId - ИД игрока,
// action - действие, которое игрок должен выполнить(скрипт, который игрок должен использовать)
public void PlayScriptOnline(string action, int playerId)
{
Player me = Player.PlayerById(playerId);
if (action == "Скрипт1")
Functions.Script1(me);
else if (action == "Скрипт2")
Functions.Script2(me);
else
Functions.DefaultScript(me);
}
// Тоже самое, но для игроков не в онлайне, здесь передается логин и имя чара(для дальнейшего
// подключения
public void PlayScriptOffline(string action, string accountName, string characterName)
{
int res = Player.LoginAndEnterWorld(accountName, characterName);
if (res != -1)
PlayScriptOnline(action, res);
}
//------------------------------Блок вызова от имени активного игрока----------------------
public void ActiveCharScript()
{
// Подобные скрипты(функции) вызываются для
// активного игрока, обычно они биндятся на
// кнопки и вызываются непосредственно нажатием
// кнопок в игре. Для манипуляций активным
// игроком использовать свойство Player.Active
// например
Player activePlayer = Player.Active;
// далее использовать activePlayer
activePlayer.Say("Это активный персонаж");
}
}
class Functions
{
public static void Script1(Player player)
{
// Скрипт1 (использовать объект player для
// манипуляций игроком)
player.Say("Запущен скрипт1");
}
public static void Script2(Player player)
{
// Скрипт2 (использовать объект player для
// манипуляций игроком)
player.Say("Запущен скрипт2");
}
public static void DefaultScript(Player player)
{
// Скрипт по умолчанию (не задано действие)
// (использовать объект player для манипуляций игроком)
player.Say("Запущен скрипт по умолчанию");
}
}
}
PS: Еще вспомнил что хотел сделать для удобства выделения игроков(и прочих мобов) таргетом, такую функцию чтобы выделялся ближайший к таргету перс. Часто в пвп бывают ситуации когда бегаешь и нужно сменить таргет..во первых то что нужно одновременно бежать при этом уже затрудняет выделение. так как и бегаешь мышкой и выделяешь ей же. Так вот если таргет промахнулся то выделится самый ближайший перс к курсору.
PPS: До этого тоже кодил на делфях) думал ничего удобнее еще не придумали, так вот я ошибался) Но минусы у c# тоже есть)