Перейти к содержимому
Для публикации в этом разделе необходимо провести 1 боёв.
Kinhcotolom

[ModAPI] Content SDK для модификации кораблей

В этой теме 153 комментария

Рекомендуемые комментарии

6 746
[-ZOO-]
Старший бета-тестер, Коллекционер
11 602 публикации
27 597 боёв

"В папке модпака создать Main.py"

Вот что мешает сразу создать этот файл?

Что мешает написать - п.2.0. Запустите Игру??

Что мешает записать - Послде Этого появятся файлы ДДС которые вы можете отредактировать (Бла бла Ссылки нва Плагтины фотошопа и другие Гимпы кто там чем окрывает)

 

И это я еще джелал шкуру и примерно понимаю - а теперь представьте в каком ступоре тот кто ВООБЩШЕ ничего не делал но хочет? Да забьет на это болт большой и жирный

 

ВЕДь НЕТ ЭТОГО?!?!?! Потому и вопросы!!!!

17:58 Добавлено спустя 1 минуту

"Я никого не минусил, клянусь Хаосом"

Так и быть я милостив к Хаосу - исправлюсь )) 

  • Плюс 1

Рассказать о публикации


Ссылка на публикацию
6 746
[-ZOO-]
Старший бета-тестер, Коллекционер
11 602 публикации
27 597 боёв

 

Я никого не минусил, клянусь Хаосом. Только ответил на твой вопрос. Так что минусы прилетели откуда-то из другого места. Инструкция - в первом посте. Попробую разжевать её:

 

Так понятней? И да - я нисколько не издеваюсь и не минусю, наоборот - пытаюсь помочь

  1. скачать ModsSDK и положить папку ModsDSK из него в res_mods\x.x.x.x\PnFMods (прошу обратить внимание, что в предложенном дляскачивания архиве эта папка находится чуть глубже рута - необходимо быть внимательным)
  2. создать пустой файл PnFModsLoader.py в папке res_mods\x.x.x.x
  3. предположим, ты хочешь создать скин на Миссури. Тогда следует создать папку res_mods\x.x.x.x\PnFMods\Missouri_modded
  4. в этой папке надо создать файл Main.py с текстом

     API_VERSION = 'API_v1.0'
    MOD_NAME = "Missouri_modded"
    SHIP_NAME = 'ASB509_Missouri' #этот ID корабля как раз и берётся из папки ModsSDK 
    contentSdk.extractSources(MOD_NAME, SHIP_NAME)

     

  5. Запустить клиент, дождаться пока не появится экран с логином. Логиниться не надо, всё равно не получится
  6. Закрыть клиент
  7. зайти в папку Missouri_modded и увидеть, что там появилась папка с файлами модели корабля - ASB509_Missouri. Можно в ней пошариться и выяснить, как всё устроено. DDS файлы там будут. так что дальше дело в твоих руках
  8. Поменять код Main.py с экстракта на загрузку:

      API_VERSION = 'API_v1.0'
    MOD_NAME = "Missouri_modded"
    SHIP_NAME = 'ASB509_Missouri' 
    contentSdk.extractSources(MOD_NAME, SHIP_NAME) #эта строчка как раз и запускает мод

 

1 - Скачал - всё понятно

2 - Почему нельзя сразу создать файл и написать "Открывать в блокноте"?

3 - Стоит сразу создать папку с Тест-Мод-Кораблем (Пускай пустую)

4 - Сразу Создать Папку с файлом с путями и комментами по необходимости

5 - Написать про запуск клиента так пунктом (Реально понятно - спс)

6 - Понятно (Деталь - но реально кто то может не закрыть)

7 - Уточнить что появятся ДДС (понятно спс - что мешало это пояснить программеру Лесты - нипанятна)

8 - Тут нипанятна - У вас код не поменялся (надо см ответ разораба для уточнения - я так понял это необходимый костыль и автоматизировать не получится?)

 

СПС по вашему комменту стало НАМНОГО понятней .... разбираться буду уже завтра

 

Плюсеги кончились - верну не раньше :honoring:

 

 

Изменено пользователем WarXed

Рассказать о публикации


Ссылка на публикацию
6 746
[-ZOO-]
Старший бета-тестер, Коллекционер
11 602 публикации
27 597 боёв

И кстати еще вопрос - А Если Скинов 2 ил 5ть? Что тогда? Как прописывать? Файл то Один и написан тиак мод - один (Одного корабля)

 

Второй вопрос по шкурам Тип1- Тип12 .... они не требуют "особой прописи"? По старому? И как тогда называются те что не Тип1-2?

Изменено пользователем WarXed

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

А почему у меня всё получилось сразу и без вопросов?

Этот функционал вообще-то для "продвинутых" пользователей, которые уже что-то умеют. И да - лучше пользоваться notepad++, а не обычным блокнотом

Насчёт кода - читай внимательней, он поменялся, я его специально цветом выделил

18:16 Добавлено спустя 2 минуты

И кстати еще вопрос - А Если Скинов 2 ил 5ть? Что тогда? Как прописывать? Файл то Один и написан тиак мод - один (Одного корабля)

 

Я для каждого корабля создаю отдельно - так проще. С каждым разбираться можно отдельно, да и сразу видно, какие корабли окрашены, это удобней, чем шариться по content\usa\ship\battleship\textures... Если нужно несколько - пример в инструкции от разработчика. Там намного сложней, потому что ещё подвязан GUI в клиенте.
  • Плюс 1

Рассказать о публикации


Ссылка на публикацию
6 746
[-ZOO-]
Старший бета-тестер, Коллекционер
11 602 публикации
27 597 боёв

А почему у меня всё получилось сразу и без вопросов?

Этот функционал вообще-то для "продвинутых" пользователей, которые уже что-то умеют. И да - лучше пользоваться notepad++, а не обычным блокнотом

Насчёт кода - читай внимательней, он поменялся, я его специально цветом выделил

 

Я как бы не бабушка (системный админ так то и дружу с компом) но как видишь впал в ступор - чай программы типа "кораблики" увы не пишу

Настолько Продивнутых - Раз два и обчелся - Для кого тогда СДК? Для вас и только?

 

Тут речь не про это - а про метод изложения - он РЕАЛЬНО не понятен тем кто хзочет сделать шкуру - А должно быть ПОНЯТНО

Да и прикопался только потому что разраб обещал что по факту я доделаю свою шкурку до норм состояния и она будет только на фаре и больше ни на чем.... но вопрос смогу ли сделать так "коллекцию" из нескольких - есть такая бредовая идея .... пока по праву идеи :teethhappy:

 

Кстати ты изложил "по полочкам" и очень понятно - красаучек - без претензий - уверен завтра со всем размерусь ... ну или попозже

Изменено пользователем WarXed

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

 

Я так и понял. Я хочу сделать скин чисто для одного корабля - Миссури. Вот так выглядит работающий Main.py:

 API_VERSION = 'API_v1.0'
MOD_NAME = "Missouri_War"
SHIP_NAME = 'ASB509_Missouri'
contentSdk.registerShipMod(SHIP_NAME)

 

 Понятно.

Попробуйте такой скрипт

API_VERSION = 'API_v1.0'

MOD_NAME = "Missouri_War"
SHIPS_LIST = ['ASB509_Missouri']
SETTINGS = {'installed':False, 'used':{}}
MOD_PATH = utils.getModDir()

if utils.isPathExists(MOD_PATH + '/settings.cfg'):
    with open('settings.cfg', 'rb') as f:
        SETTINGS = utils.jsonDecode( f.read() )

SHIPS_LIST = dict( [[value, True] if value not in SETTINGS['used']  else (value, SETTINGS['used'][value]) for value in SHIPS_LIST] )


def install():
    SHIPS_TO_BUILD = [
    ('ASB509_Missouri', 'content'),
    ]
    
    
    FIX_COMMON_MODELS = set(['transparent_glass_alpha_a.tga'])
    
    
    def writeFile(file, data):
        with open(file, 'wb') as f:
            f.write(data)
    
    def readFile(file):
        try:
            with open(file, 'rb') as f:
                data = f.readlines()
        except:
            return None
        return list(data)
    
    def build():
        if SHIPS_TO_BUILD:
            ship, oldMod = SHIPS_TO_BUILD.pop()
            for dirname, dirnames, filenames in utils.walk( "%s/%s"%(MOD_PATH, ship) ):
                for filename in filenames:
                    path = ('%s/%s'%(dirname, filename)).replace('\\', '/').replace('//', '/')
                    ext = filename[filename.rfind('.'):]
                    if ext == '.mfm':
                        data = readFile(path)
                        idx = -1
                        for line in data:
                            idx += 1
                            if 'content/gameplay/' in line:
                                for common_model in FIX_COMMON_MODELS:
                                    if common_model in line:
                                        toreplace = line.split('</Texture>')[0]
                                        replacestr = '<Texture>\tcontent/gameplay/common/textures/%s\t'%common_model
                                        data[idx] = line.replace(toreplace, replacestr)
                        
                        writeFile(path, ''.join(data) )
            
            contentSdk.buildMod(MOD_NAME, ship, oldMod)
            if SHIPS_TO_BUILD:
                next()
            else:
                SETTINGS['installed'] = True
                writeConfig()
                contentSdk.onDone(MOD_NAME)

    def next():
        contentSdk.extractSources(MOD_NAME, SHIPS_TO_BUILD[-1][0], callback = build)
    
    next()


def writeConfig():
    with open('settings.cfg', 'wb') as f:
        SETTINGS['used'] = SHIPS_LIST
        f.write( utils.jsonEncode( SETTINGS ) )

if not SETTINGS['installed']:
    install()

else:
    for ship, state in SHIPS_LIST.iteritems():
        if state:
            contentSdk.registerShipMod(ship)

в FIX_COMMON_MODELS пишите название файла с расширением *.tga

В файлах моделей прописаны *.tga, если игра не находит tga, то она ищет текстуру с тем-же именем, но с расширением dds

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

Но там будет изрядно лишних файлов, которые увеличивают размер мода.

Для уменьшения размера, вам нужно раздавать только Main.py и содержимое папки content. В папку content вам нужно положить те текстуры, которые вы изменили. Папку с файлами корабля и фаил settings.cfg нужно будет удалить. Размер мода значительно уменьшится.

У людей при первом запуске клиент извлечет файлы корабля в папку мода, заменит текстуры теми что лежат в content, создаст фаил settings.cfg, и перезапустится.

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

 Понятно.

Попробуйте такой скрипт

API_VERSION = 'API_v1.0'

MOD_NAME = "Missouri_War"
SHIPS_LIST = ['ASB509_Missouri']
SETTINGS = {'installed':False, 'used':{}}
MOD_PATH = utils.getModDir()

if utils.isPathExists(MOD_PATH + '/settings.cfg'):
    with open('settings.cfg', 'rb') as f:
        SETTINGS = utils.jsonDecode( f.read() )

SHIPS_LIST = dict( [[value, True] if value not in SETTINGS['used']  else (value, SETTINGS['used'][value]) for value in SHIPS_LIST] )


def install():
    SHIPS_TO_BUILD = [
    ('ASB509_Missouri', 'content'),
    ]
    
    
    FIX_COMMON_MODELS = set(['transparent_glass_alpha_a.tga'])
    
    
    def writeFile(file, data):
        with open(file, 'wb') as f:
            f.write(data)
    
    def readFile(file):
        try:
            with open(file, 'rb') as f:
                data = f.readlines()
        except:
            return None
        return list(data)
    
    def build():
        if SHIPS_TO_BUILD:
            ship, oldMod = SHIPS_TO_BUILD.pop()
            for dirname, dirnames, filenames in utils.walk( "%s/%s"%(MOD_PATH, ship) ):
                for filename in filenames:
                    path = ('%s/%s'%(dirname, filename)).replace('\\', '/').replace('//', '/')
                    ext = filename[filename.rfind('.'):]
                    if ext == '.mfm':
                        data = readFile(path)
                        idx = -1
                        for line in data:
                            idx += 1
                            if 'content/gameplay/' in line:
                                for common_model in FIX_COMMON_MODELS:
                                    if common_model in line:
                                        toreplace = line.split('</Texture>')[0]
                                        replacestr = '<Texture>\tcontent/gameplay/common/textures/%s\t'%common_model
                                        data[idx] = line.replace(toreplace, replacestr)
                        
                        writeFile(path, ''.join(data) )
            
            contentSdk.buildMod(MOD_NAME, ship, oldMod)
            if SHIPS_TO_BUILD:
                next()
            else:
                SETTINGS['installed'] = True
                writeConfig()
                contentSdk.onDone(MOD_NAME)

    def next():
        contentSdk.extractSources(MOD_NAME, SHIPS_TO_BUILD[-1][0], callback = build)
    
    next()


def writeConfig():
    with open('settings.cfg', 'wb') as f:
        SETTINGS['used'] = SHIPS_LIST
        f.write( utils.jsonEncode( SETTINGS ) )

if not SETTINGS['installed']:
    install()

else:
    for ship, state in SHIPS_LIST.iteritems():
        if state:
            contentSdk.registerShipMod(ship)

в FIX_COMMON_MODELS пишите название файла с расширением *.tga

В файлах моделей прописаны *.tga, если игра не находит tga, то она ищет текстуру с тем-же именем, но с расширением dds

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

Но там будет изрядно лишних файлов, которые увеличивают размер мода.

Для уменьшения размера, вам нужно раздавать только Main.py и содержимое папки content. В папку content вам нужно положить те текстуры, которые вы изменили. Папку с файлами корабля и фаил settings.cfg нужно будет удалить. Размер мода значительно уменьшится.

У людей при первом запуске клиент извлечет файлы корабля в папку мода, заменит текстуры теми что лежат в content, создаст фаил settings.cfg, и перезапустится.

 

Пользователям будет нужен ModsSDK для того, чтобы пользоваться этим модом?

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

 Пользователям будет нужен ModsSDK для того, чтобы пользоваться этим модом?

 Да. Но придет время и он будет в составе клиента. Так что не нужно будет таскать его вместе с модом.

 

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

Есть замечания по поводу кода Main.py для Миссури (я говорю на примере, чтобы было понятней):
Если в content уже есть файлы, которые использует Миссури (в частности, ГК и ПМК Айовы), при установке мод подхватывает именно их, а не те, что заложены в него. Даже если я в архив с модом кладу нужные файлы, то происходит одно из двух - либо они затираются айововскими, либо Айова получает ГК и ПМК Миссури. Есть только два варианта установки, которые отработают как положено у конечного пользователя, который захочет поставить Айову и Миссури с разными скинами:

  1. Поместить в архив только content и main.py - в этом случае после установки каждого мода необходимо запустить клиент, чтобы он прогрузился и подхватился. Неудобно, потому что скинов у меня в модпаке больше сотни, каждый раз перезапускать клиент не комильфо
  2. Поместить в архив полностью скомпилированный скин вместе с settings.cfg, где указано, что он уже установлен - тогда мод будет смотреть в PnFMods и брать текстуры оттуда. Я бы не сказал, что получается чересчур много лишнего - я далеко не все скины буду делать через ModsAPI, а только те, которые пересекаются и слить их вместе не получается. Размер скина "по старинке" отличается от нового примерно на 5-10мб. Мне не кажется это критичным

Рассказать о публикации


Ссылка на публикацию
Старший бета-тестер
1 067 публикаций
15 372 боя

Привет всем и с Наступившим!

Удачи и Здоровья!

 

Ребята, есть вот такая картинка:

14dfe65dbc4a.jpg

 

Если что, смотреть на 3-й кораблик на заднем плане :ohmy:.

Реализовано жесткой правкой порта Санк-Петербурга. Можно ли реализовать через ModsAPI? Как и в каком направлении копать. с АПИ пока не разобрался от слова совсем . . .

Рассказать о публикации


Ссылка на публикацию
32
Участник
7 публикаций
3 677 боёв

 

Добрый день! 

Подскажите, пожалуйста, можно ли с помощью ныне предоставленных в свободный доступ инструментов сделать настоящий ремоделлинг корабля(лей)/Порта? 

Имеется в виду формирование своих primitives-файлов, чтобы игровой клиент нормально их принимал. 
Среди предоставляемых возможностей ModsSDK и ModsAPI, если я не ошибаюсь, нет плагинов для экспорта трехмерных примитивов из популярных пакетов 3ds max/Maya и т.п. 
primitives-файлы, полученные методом от World of Tanks клиент читать не хочет.

 

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

В первом сообщении обновлена ссылка на ModsSDK.

 

 Среди предоставляемых возможностей ModsSDK и ModsAPI, если я не ошибаюсь, нет плагинов для экспорта трехмерных примитивов из популярных пакетов 3ds max/Maya и т.п. 

 Нет, но где-то в соседних темах видел ссылки на рабочие плагины.

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

С релизом 0.6.2.0 (в том числе и с новым ModsSDK) перестали извлекаться исходники кораблей. Действую по инструкции:

  1. создал папку PnFMods и файл PnFModsLoader.py
  2. внутри PnFMods создал папку с модом GSB9_ABYSSAL_Friedrich_Plague и перенёс туда ModsSDK

     34de8-clip-26kb.png?nocache=1

     

  3. внутри папки мода создал файл Main.py с содержимым

    API_VERSION = 'API_v1.0'
    MOD_NAME = "GSB9_ABYSSAL_Friedrich_Plague"
    SHIP_NAME = 'GSB109_Friedrich_der_Grosse'
    contentSdk.extractSources(MOD_NAME, SHIP_NAME)

     

  4. запустил клиент, подождал минут 15, закрыл

Тем не менее, в папке GSB9_ABYSSAL_Friedrich_Plague ничего не появилось

В python.log только стандартные записи, которые появляются при запуске игры

 

Изменено пользователем anonym_UxjT6zeFfoLf

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

Добрый день!

Я очень извиняюсь за косяк- забыли обновить документацию.

Больше не нужно извлекать файлы из архива и класть их в папку ModsSDK.

Отныне у вас должен быть архив.

res_mods/x.y.z.c/PnFMods/ModsSDK.zip

 

Так что удалите папку ModsSDK, а вместо нее положите архив, предварительно его переименовав из ModsSDK_0.6.2.0.zip в ModsSDK.zip

  • Плюс 2

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

Добрый день!

Я очень извиняюсь за косяк- забыли обновить документацию.

Больше не нужно извлекать файлы из архива и класть их в папку ModsSDK.

Отныне у вас должен быть архив.

res_mods/x.y.z.c/PnFMods/ModsSDK.zip

 

Так что удалите папку ModsSDK, а вместо нее положите архив, предварительно его переименовав из ModsSDK_0.6.2.0.zip в ModsSDK.zip

 

Спасибо! Теперь всё ОК. Только стоит отдельно упомянуть, что нужен именно тот архив, ссылка на который в первом посте - его надо только переименовать. Если заархивировать ту папку ModsSDK, которая до этого лежала в PnFMods, то ничего не сработает.

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

Ваша правда. Что-то сломалось в самом API. В контенте постоянно что-то меняют, разработка API заморожена, а не все компоненты покрыты тестированием. Будем разбираться, но скорей всего исправления раньше 0.6.5 не попадут на прод :(

Извиняемся, epic fail, как говорится.

Рассказать о публикации


Ссылка на публикацию
Участник
1 195 публикаций

Очень жаль. Фактически, из-за этого полностью останавливается работа над шкурками. Придётся обходиться тем, что было сделано пока не сломалось. Ну и дополнительно - шкурки на Ташкент поломались :(

 

Рассказать о публикации


Ссылка на публикацию
Разработчик
102 публикации
3 719 боёв

Да, действительно жаль. SDK не успели накрыть тестами до заморозки разработки, и по закону подлости именно в нем и сломалось :(

 

Рассказать о публикации


Ссылка на публикацию
Гость
Эта тема закрыта для публикации новых ответов.

×