Ku2zoff писал: никаким образом модели на сервере не получить, не загружая их заново внутри дллки.
Брашевые никак, а студиомодельки ещё как! Точно, есть же pfnGetModelPtr. При попытке изменения масштаба, я сразу заметил проблемы с монстрами и пушаблями. А вот с функ-валлами и прочими брашевыми кнопками и дверями вроде порядок. Надо проверить поезда и платформы, как они себя ведут. Если мои догадки подтвердятся, то можно будет сделать свои пушабли и починить монстров, имея доступ к студиомоделям.
Добавлено 03-02-2017 в 00:21:
Можно всё-таки пойти сложным путём, и загрузить все модели повторно. Но не полностью, возможно, получится обойтись только тем, что нужно для загрузки хуллов. Ну и задал Кармак задачку, не вынеся никуда на сервер интерфейс для указания своих размеров...
Ku2zoff писал: Ну и задал Кармак задачку, не вынеся никуда на сервер интерфейс для указания своих размеров...
Кармак?
Добавлено 03-02-2017 в 00:08:
Вообще говоря, есть волшебная функция в client.cpp называется GetHullBounds. Но она напрочь неверная. Там вотакое:
C++ Source Code:
1
case 0: // Normal player
2
mins = VEC_HULL_MIN;
3
maxs = VEC_HULL_MAX;
4
iret = 1;
5
break;
Дураку же понятно, что такое работать не может никогда. Поэтому все кто пытался одержали закономерную неудачу. А надо (как вы уже все догадались), вотак:
C++ Source Code:
1
case 0: // Normal player
2
VEC_HULL_MIN.CopyToArray( mins );
3
VEC_HULL_MAX.CopyToArray( maxs );
4
iret = 1;
5
break;
И всё будет работать. Но правда только для игрока.
Дядя Миша писал: Не вальвовцы, а Кармак. Вот единственный момент за который ему хочется дать по ушам.
Цитата:
Дядя Миша писал: Но правда только для игрока.
Ну так вот в этом и проблема. Что толку с одного игрока? Это только в мультиплеерном моде типа кс будет работать, где монстров и пушаблей нет.
Короче, для начала попробую починить монстров. Придётся дернуть в дллку код движения и трассы, и юзать его для монстров. Благо, вычислить их по модельке (студиомодельке) не так трудно. А для брашевых энтить оставить временно движковый, пока не придумаю, как правильно загрузить мир на сервере, чтобы получить доступ к субмоделям карты.
Добавлено 03-02-2017 в 12:52:
А ведь можно как в тринити, посредством клиентки грузить карту! Как временное решение, пока буду переносить код трассы, сойдёт.
Утащил в дллку функцию pfnWalkMove и всё, что она тянет за собой. В принципе, всё вполне переносимо из движка с минимумом изменений. Для загрузки моделей заюзал IEngineStudio.GetModelByIndex, как в тринити. Для синглового мода вполне достаточно.
Для мультиплеерного придётся в последствии составлять список моделей на сервере: грузить заново карту, и индексировать каждую model_t на манер того, как сделано в движке. Студиомодели и спрайты заново грузить не придётся. Во-первых, спрайты почти никогда не имеют физической оболочки, зависящей от их размера: все проджектайли имеют нулевой размер, по сути, тут можно оставить всё как есть. А во-вторых, у нас есть волшебная функция pfnGetModelPtr, которая может вытянуть из движка экстрадату студиомодели по модельиндексу. Собственно, если я ничего не напутал, этого будет достаточно, чтобы построить хулл для студиомодельки.
На данный момент код вроде даже работает. Правда крашится на функции SV_TouchLinks. Наверное, зацикливается намертво вот здесь:
C++ Source Code:
// touch linked edicts
for (l = node->trigger_edicts.next; l != &node->trigger_edicts; l = next)
{
Я всё делал на скорую руку, почти голая копипаста. По-хорошему, надо это всё запихать в класс CBaseEntity, как сделано в ксашмоде. Буду копать дальше.
Ku2zoff писал: Во-первых, спрайты почти никогда не имеют физической оболочки, зависящей от их размера
Воообще-то имеют, просто никому обычно не приходит в голову сделать их солидными.
Цитата:
Ku2zoff писал: На данный момент код вроде даже работает. Правда крашится на функции SV_TouchLinks.
ты sv_areanode засетапил?
Это такая бинарная сетка для облегчения поиска энтить в заданном квадрате. Нет, можешь конечно перебирать в списке, но это долго.
Ku2zoff писал: А SV_ClearWorld вызвал из void ParmsNewLevel( void ) в client.cpp. Оно как раз вызывается после движкового SV_ClearWorld. Судя по коду ксаша, конечно.
я тебя слегка расстрою, но в посл. билде ксаша этот каллбэк не вызвается.
Корочи он и в халфе не вызывается и в некоторых модах его вызов приводит к вылету. Поэтому я его убрал.
Цитата:
ILZM писал: Это вообще законно использовать переменную простого типа для семафоров
А нету никакого другого места. Это единственное возможное место было, откуда его следовало бы вызвать. А дальше спаун энтить, линкэдикт, вот это всё. Так что ой.
Попробовал вызвать из ServerActivate - вылет. Или мир в этот момент ещё не загружен, или IEngineStudio не инициализирован, и не может загрузить модельку. А без модельки мира SV_CreateAreaNode не пашет.
Добавлено 08-02-2017 в 02:42:
Цитата:
Дядя Миша писал: А дальше спаун энтить
Вот перед самым бы спауном может и получилось бы. Правда, в спауне вызывается pfnSetOrigin. А значит, ареноды должны быть уже готовы к этому моменту.
В общем, подумал я, и вот что придумал. Если я не ошибаюсь, все нужные в данном случае движковые экспорты физики всё равно вызываются из дллки. Значит, можно попытаться каким-то образом задержать спаун энтить до момента, пока не будет загружена модель мира, и не будут засетаплены ареаноды. Можно даже не задерживать спаун, а зациклить вызовы тех же pfnSetOrigin, pfnWalkMove и прочих (возвращая NULL грубо говоря), до тех пор, пока не будет возможно их выполнить с нужным результатом.
Ну или можно ещё поступить вот так:
1. Проверяем, загружена ли модель мира, готовы ли ареаноды. Если нет, то просто вызываем движковые экспорты.
2. Всё загружено и готово, вызываем функции из дллок.
3. Если нужно например поправить ориджин после спауна, или изменить хулл, то в классе CBaseEntity заводим особую функцию, которая будет гарантированно срабатывать уже после нужных нам операций. И будет вызывать pfnSetSize, pfnSetOrigin.
Просто теория, опять же может быть много подводных камней. Вдруг, придётся что-то ещё проделывать для клиентской стороны.
Добавлено 08-02-2017 в 14:30:
Тем временем, есть прогресс. Модели монстров перестали проваливаться в пол. Хотя физически они вообще чёрти где (как будто несолидные), и окружены жёлтыми партиклями.