Jump to content
Korean Random
Dragon armor

Мод "Эмулятор сервера World of Tanks".

Recommended Posts

1 час назад, SkepticalFox сказал:

@Dragon armor го нормальный чат создай, тут весьма неудобно

 

А ты не стесняйся, тут все свои.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
6 часов назад, SkepticalFox сказал:

го нормальный чат создай

Где? И что в нём обсуждать сверх того, что в теме?

Как загрузить ландшафт? На данный момент не интересует статичная геометрия, только сам ландшафт.

Что у меня есть - это загруженный terrain2\heights из .cdata_processed. Получил массив чисел

-28.190001      -28.200001      -28.200001      -28.230001      -28.240002      -28.250002      -28.250002 и так далее

Они как группируются? 3 числа - вектор, 3 вектора - полигон? Или как-то по-другому? Смотрел в исходниках blender-tools/wot_maps_viewer, но там так мудрёно, что ничего не понял.

10 минут назад, SkepticalFox сказал:

крайне неудобно вести так разработку

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

Карта, если что, "spaces/28_desert", файл "00000000o.cdata_processed".

И как мне помнится, буква в конце имени файла ("o") что-то означает. Или нет?

Share this post


Link to post

Short link
Share on other sites
1 hour ago, Dragon armor said:

Они как группируются? 3 числа - вектор, 3 вектора - полигон? Или как-то по-другому? Смотрел в исходниках blender-tools/wot_maps_viewer, но там так мудрёно, что ничего не понял

у тебя есть 2D картинка - из RGB получаешь z-координату

x, y получаешь умножением на chunkSize позиции пикселя

а полигональность можно различными способами достичь, не факт что у меня верно

 

1 hour ago, Dragon armor said:

И как мне помнится, буква в конце имени файла ("o") что-то означает. Или нет?

она всегда o (outside?)

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
15 часов назад, SkepticalFox сказал:

у тебя есть 2D картинка - из RGB получаешь z-координату

x, y получаешь умножением на chunkSize позиции пикселя

Как всё сложно. Но логично, что только z хранится в картинке. Позже разберусь. Потому что сейчас столкнулся с такой вещью, что мне надо бы два независимых экземпляра питона в одной программе. Есть константа component, которая может быть 'sell' (когда в бою) или 'base' (когда в ангаре). И грузится, в зависимости от значения константы, немного разная информация из xml. Сейчас попытался разобраться с моделью коллизии, но путь до неё не грузится при парсинге xml, когда component == 'base'. Сейчас пока что поставлю хук на _readHitTester, чтобы грузилась клиентская коллизия.

А может и не надо будет, оставлю так, как есть.

Проверил, хук работает, путь до коллизии есть. Оставлю до лучших времён так.

Но узнать, как сделать независимые экземпляры в одной программе было бы неплохо. Пытался по статье на хабре сделать, но не получилось, было что-от типа deadlock.

16 часов назад, SkepticalFox сказал:

она всегда o (outside?)

Видимо так.

Share this post


Link to post

Short link
Share on other sites
2 hours ago, Dragon armor said:

Но узнать, как сделать независимые экземпляры в одной программе было бы неплохо.

ты про multiprocessing?

так его в клиенте WoT и быть не может

а вообще непонятно, что ты имеешь в виду

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
Только что, SkepticalFox сказал:

ты про multiprocessing?

так его в клиенте WoT и быть не может

а вообще непонятно, что ты имеешь в виду

 

Он скорее всего ведет речь о конфигурациях клиента. Там же несколько конфигураций, задаваемых базовыми константами. В зависимости от них питоновская часть по разному работает и грузится, включая и ресурсы.... Но в реальности я хз чего он делает и как ))))))

Share this post


Link to post

Short link
Share on other sites
43 минуты назад, StranikS_Scan сказал:

Он скорее всего ведет речь о конфигурациях клиента. Там же несколько конфигураций, задаваемых базовыми константами. В зависимости от них питоновская часть по разному работает и грузится, включая и ресурсы

Да, именно это. GIL. Чтобы в разных потоках был свой собственный контекст питона. На хабре в статье очень просто было, повторял по шагам, а в итоге не получилось. Инициализация проходила нормально, но при вызове PyGILState_Ensure() происходила блокировка, которая не снималась. В итоге в своё время отбросил эту идею. И сейчас это не очень и нужно.

46 минут назад, StranikS_Scan сказал:

Но в реальности я хз чего он делает и как

Ну да.

Share this post


Link to post

Short link
Share on other sites
В ‎06‎.‎08‎.‎2018 в 00:47, Dragon armor сказал:

@Serfer_78 Благодарю.

 

Максимальная дальность видимости 565 метров, говорили они, это максимальная дистанция, на которой в принципе можно увидеть технику, говорили они.

It was a lie, Morpheus. The prophecy was a lie.

shot_042.jpg

shot_042.jpg

shot_046.jpg

shot_047.jpg

shot_048.jpg

В снайперском прицеле за кустами немного видно, но силуэт не обводится.

shot_049.jpg

То что ты видишь на картинке это летает танк наблюдателя. Какой то модер следит за игрой.. Боевые танки невидно.. :smile:

А ещё есть инфа что дальность до 760 метров без глюков игры если поснимать ограничения и сервер игры не контролит.. :smile:

А так пропадают они на 548 метрах...

Edited by DWG
  • Downvote 3

Share this post


Link to post

Short link
Share on other sites

@Monstrofil С setNested_PROPERTY нет, а с setSlice_PROPERTY в сообщении sliceEntityProperty, но так и не смог разобраться, как упаковываются значения.

В 17.08.2018 в 21:36, DWG сказал:

Какой то модер следит за игрой

Точно! Подняли сервер специально для меня и присоединились к локальному серверу, минуя фаервол и NAT провайдера.

В 17.08.2018 в 21:36, DWG сказал:

А так пропадают они на 548 метрах

В том то и дело, что не пропали за пределом круга отрисовки.

В 17.08.2018 в 21:36, DWG сказал:

А ещё есть инфа что дальность до 760 метров без глюков игры

Позже проверю. Тут уже графический движок отвечает за это. Местность видно далеко за пределами круга отрисовки, модели тоже должно бы рисовать так же далеко.

 

Что-то дело не идёт совсем. Сегодня несколько часов промучился с питоном и его невнятным логом "float expected" (или что-то подобное). Уже везде расставил print, чтобы найти место, где ошибка. Не печатает. Всё время показывает на "print 'Load_Collision {}'.format(path)" с "float expected". Когда уже по-отдельности функции разделил, вдруг заработало. Что с этим питоном не так? Почему конструкция Func1(Func2(some_param)) выдавала такую дичь? Когда разделил, сразу же заработали print во всех расставленных местах. Оказалось, что d.turrets[0][0].guns[0].hitTester == None. Поставил assert в хуке на загрузку hitTester. Не срабатывает, т.е. всё загружается, но в guns всё равно hitTester == None. В файле G98_Waffentrager_E100_P.xml параметр hitTester есть, путь валиден, файл существует. Что ему надо? Почему не загружается? Или находится в другом месте?

d получил из vehicles.VehicleDescr(compactDescr = '\x11\xbe\xe0\x00\x90\x00\xcd\x00"\x00\xc2\x00\x80\x00\x00'). Для всех остальных компонентов hitTester есть, для орудия нет. Откуда его брать?

Как-нибудь отладчик для питона можно прикрутить? Чтобы VisualStudio отдельно, отладчик питона отдельно. Надоело print'ами смотреть, что не так.

Share this post


Link to post

Short link
Share on other sites
4 минуты назад, SkepticalFox сказал:

так откуда у орудия коллижн?)

что там хиттестить?

Хотя бы попадание в орудие. Ведь в xml файле есть секция hitTester, в collision_client есть соответствующая модель.

 

6 минут назад, SkepticalFox сказал:

посмотри pycharm

У меня он есть. В нём так и не разобрался, как добавить свои модули, которые на C написаны. Поэтому даже до отладки дело не дошло. Гуглил что-то невразумительное, но ничего не нашёл. Не знаю, по каким ключевым словам вести поиск.

Share this post


Link to post

Short link
Share on other sites
15 минут назад, Dragon armor сказал:

Хотя бы попадание в орудие. Ведь в xml файле есть секция hitTester, в collision_client есть соответствующая модель.

 

У меня он есть. В нём так и не разобрался, как добавить свои модули, которые на C написаны. Поэтому даже до отладки дело не дошло. Гуглил что-то невразумительное, но ничего не нашёл. Не знаю, по каким ключевым словам вести поиск.

Так-то и к VisualStudio его можно подключать. Если не ошибаюсь это что-то типа такого: https://github.com/Microsoft/PTVS

а гуглить: "pydevd visualStudio"

Share this post


Link to post

Short link
Share on other sites
Только что, Dragon armor сказал:

Оказалось, что d.turrets[0][0].guns[0].hitTester == None.

 

Дело в том, что орудие как элемент коллижена пробития на клиенте не требуется и потому везде в коде стоят затычки аля:

if not isAttached or compDescr.itemTypeName == 'vehicleGun': continue

А вот на сервере коллижен имеется и используется ибо у орудия есть внешний "броневой" слой.

Share this post


Link to post

Short link
Share on other sites

Оказалось, что не expected, а request.

    print 'Load_Collision {}'.format(path)
TypeError: a float is required

Очень информативное сообщение. Опять вылезло. Ни номера строки, ни типа ошибки. Явно не из-за print'а. Меня сегодня питон решил добить?

@StranikS_Scan Ясно. Были смутные подозрения, но файл коллижена на клиенте существует и его даже можно загрузить в Blender.

@spoter Как всё сложно. Эту статью видел, но только ознакомился в своё время.

16 минут назад, spoter сказал:

Если не ошибаюсь это что-то типа такого: https://github.com/Microsoft/PTVS

Цитата

Python support for Visual Studio 2017 is developed and managed here

Цитата

Prior to Visual Studio 2017, Python support was released as a standalone extension. We are no longer actively developing these versions, but if you are unable to upgrade to Visual Studio 2017 yet, you can use these older installers to get Python support.

Для меня мимо. Пока в блокноте продолжу print'ами отлаживать.

Share this post


Link to post

Short link
Share on other sites
Цитата

С setNested_PROPERTY нет, а с setSlice_PROPERTY в сообщении sliceEntityProperty, но так и не смог разобраться, как упаковываются значения.

@Dragon armor, короче разобрался с этим кошмаром, австралийские(?) разрабы решили там зачем-то экономить каждый бит(!).

 

Определить setNested/setSlice можно по флагу в пакете, он сразу после entityId лежит. Потом лежит размер, 3 байта 0x00 и, собственно, данные (по крайней мере в реплее).

Что setNested что setSlice начинаются с упакованного пути к изменяемому элементу, читать приходится побитово.

 

Псевдокодом будет примерно так.

pOwner = entity

while bits.pop(0) == 1 && pOwner
   length = obj.childLength()  // длина массива || кол-во элементов в словаре || для entity - кол-во свойств
   bits = bitsRequires(length)  // смотрим сколько бит нужно дабы уместить индекс для контейнера выше => ceil(log(length, 2))
   propertyId = readBits(bitsArray, bits) // читаем нужное кол-во бит, недостающее добиваем нулями до "целого" байта, переводим в int32
  
   pOwner = pOwner.getPropertyByIndex(propertyId)  // для массива - берем по индексу элемент, для словаря - по порядковому номеру свойство в .def файлике, для entity - по exposedId

 

Потом (уже вне цикла while) начинаются отличия, для setNested читаем индекс изменяемого свойства как обычно:

maxBits = bitsRequires(pOwner.childLenght())
propertyId = readBits(bits, maxBits)

Всё, остаток информации можно распаковать используя тип данных из def/alias.

 

Для setSlice чуть иначе

maxBits = bitsRequires(pOwner.childLenght() + 1)
index1 = readBits(bits, maxBits)    
index2 = readBits(bits, maxBits)

// если индекс превышает кол-во элементов в pOwner -> добавляем новый
// если index2 > index1 && payload == None -> удаляем из массива
// замены, похоже, выполняются через setNested


В общем-то ничего особо сложного когда разобрался, но мозг мне этот пакет выносил долго...

Edited by Monstrofil

Share this post


Link to post

Short link
Share on other sites

@Monstrofil Там не всё так "просто".

Первый бит вроде как флаг - упаковано или нет, что меня радует, мне-то байты экономить не надо. Ибо эти упакованные значения утомили. И если распаковать ещё можно, то написать алгоритм упаковки у меня выходит плохо.

8 минут назад, Monstrofil сказал:

Потом лежит размер, 3 байта 0x00 и, собственно, данные (по крайней мере в реплее).

По памяти пишу, без проверки. Наверно, 3 бита, а не байта. Там завязано на количество свойств в энтити (bitsRequires видимо у тебя), а размер определяется исходя из максимального количества бит, которым можно задать индекс свойства. Для 4 свойств требуется 3 бита. Но у меня всё-равно не получалось, не хватало бита для количества свойств, когда пытался прикинуть на глазок. Потом попытаюсь осознать твой алгоритм.

 

Share this post


Link to post

Short link
Share on other sites
3 минуты назад, Dragon armor сказал:

Наверно, 3 бита, а не байта.

 

Именно что 3 байта, не знаю их предназначение но они всегда по нулям..

 

Цитата

Там завязано на количество свойств в энтити (bitsRequires видимо у тебя), а размер определяется исходя из максимального количества бит, которым можно задать индекс свойства. 

Да, это оно, а obj.childLength() - как раз текущее кол-во свойств (размер массива / кол-во ключей в словаре / кол-во свойств в entity).

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...