Вопрос, который мучал уже многих почти с самого момента выхода фрилансера: почему в игре начисто отсутвует возможность походить по планетам/базам, хотя выполненны они в 3д и достаточно достойно?
ТАк вот, кажеться я нашел решение. Я могу зделать это возможным, причем, в онлайне других игроков можно увидеть и побить=). Это не проблема и с ядром OSD выполняеться на раз, два, три. Настоящая проблема - нпц, а в часности их ии. Луа скрипт для таких целей не подходит. Нужно писать самый настойщий ии, основанный на онализе ситуаций. Это долго, и сложно. Поэтому с нежитями придеться подождать.
Итак. Как создать 3д базы, чтоб можно было походить
Этап 1. Рисуем свои, или выдераем модели из игры и сохроняем их в формате *.x (не будем стоить из себя крутых, а формат хороший)
Этап 2. Стираем строчки в файле базы к примеру Li01_01.ini, но сам файл не трогаем (чтоб игра не вылетала)
Этап3. Создаем новый модуль (неважно на каком языке, главное, чтоб DLL)
Модуль должен экспортировать следующие функции: GetModuleMode с возвращаемой текстовой строкой
В нашем случае она должна ровняться "BaseLi01_01"
и ModuleBody - здесь будет производиться старт модуля.
и ModuleRender - собсно прорисовка нашей базы
Этап4.
В MOduleBody обрабатываем загрузку текстур и моделей (примеры в DirectXSDK и в документации к OSD Online SDK)
В ModuleRender прописываем метрику и положение моделей (города Либерти)(для экономии памяти город можно разбить на локации, только не факт что работать будет корректно)
там же пишем обработку положения и анимации персоонажей
Если вы хотите чтоб ваш персоонаж двигался, то прописываем еще одну функцию KeysAssign, в которой привязываем коды клавиш, к ключу анимации персоонажа в функции Modulerender
пример
Код:
if 87 then Walk;
т.е. если нажата клавиша номер 87, тогда ваш персоонаж начинает идти (код 87 соответствует клавише "w")
вот и все.
Прописываем модуль в конфигурационный инишник OSD Online и в путь
Ой, да, совсем забыл. В серверной части модуля необходимо прописать событие, при котором Статус OSD будет BaseLi01_01
примерно так
Код:
if Save.Base = 'Li01_01' Then ChangeState('BaseLi01_01')
Ну вот=) Теперь летим на Манхеттэн. Садимся. Видим черный экран (я думаю секунды 2-3 не больше) и попадаем в 3д город, по которому можно побродить.
=)