Рипперам Спирита посвящается...
Наверное многие хотят себя попробовать не только в области маппинга, но и в программинге, устав, от бесконечных ограничений обычного ХЛ. И тут на помощь мапперам приходит спирит, в котором возможно многое, по прежнему не затрагивая кодинг. Однако спирит обладает кучей нехороших багов, которые боюсь пофиксить будет не так просто. ЧТо же делать в случае, если из всего громадного кода спирита нужен всего лишь env_rain, а так хочется, чтобы и вагончики тоже работали нормально - ответ прост, нужно перетащить код дождя в свой мод, зачастую именно с этого и начинают свой путь будущие кодеры. причем именно со спирита, так как исходники других модов недоступны. Многие пытаються сделать что-то по туторам, однако в туторе более или менее подробно расписано, как написать код для той или иной штуки, тогда как с исходниками спирита новичок остается "один на один", к тому же спирит - система глобальная и перетащить все что угодной, обойдясь "малой кровью" получиться далеко не у каждого. Рассмотреть основные трудности, которые возникают у новичков при рипании спирита и призван этот тутор.
Первые трудности.
Для работы на понадобяться СДК спирта (любой, который вам нужен) и СДК хл - можно взять версию 2.2 или 2.3, но я ркомендую версию 2.1 как наиболее быструю и безглючную. Ну как вы понимаете, чтобы зарипать энтитю нужно для начала найти ее вывод в энтитю , а именно строчку LNIK_ENTITY_TO_CLASS в которой будет написано и название энтити. После этого смело выделяйте все функции, которые относяться к данной энтити (у них будет одинаковое название, ну например у func_tank будут названия всех воидов и булей начинаться с void CFuncTank :: или BOOL CFuncTank :: ) и копируйте их в свой код, примерно на то же место, кде они находяться в спирите, если же они находяться в новом файле - создайте аналогичный файл у себя и добавьте его в проект. После чего запускайте компиляцию и смотрите на ошибки, которые выдаст вам компилятор.
Ошибки.
Первая и наиболее распространенная ошибка имеет следующий вид:
SetNextThink undeclare identifier.
Не пытайтесь перетащить эту функцию в свой код, ибо это - глобальная утилита мовевитч (в смысле система мовевитч ее активно юзает), и вам она абсолютно не нужна (ну разумеется если вы не хотите перетащить мовевитч в свой код ). Рассмотрим как же пофиксить эту ошибку. Строка, нак которую поргуался компилятор будет иметь примерно следующий вид:
SetNextThink (0.5);
Разумеется число там может быть любым другим. Фиксить это мы будем следующим способом. Замените данную строку на:
pev->nextthink = gpGlobals->time + 0.5;
разумеется число нужно подставлять то, которое вы увидели в скобках. Иногда данная строка имеет немного другой вид:
SetNextThink (0.5, FALSE);
В этом случае нужно будет заменить ее немного другой строкой, а именно :
pev->nextthink = pev->ltime + 0.5;
Значение 0.5 в обоих случаях дано просто для примера, вам могут встретиться любые значения, даже какая-либо переменная, в любом случае мы дописываем ее так, как показано на примере. Пойдем дальше. Вторая распространенная ошибка, это -
DontThink undeclare identifier.
Эту ошибку пофиксить еще проще, просто замените строку
DontThink();
на
pev->nextthink = 0;
третья, часто встречающаяся ошибка - ругань компилятора на стринг at_debug, просто замените все слова at_debug на at_console, это можно сделать и в автоматическом режиме - т.е. автозаменой.
Иногда компилятор ругается на неизвестную функцию DesiredAction - это так же утитлита мовевитч, которой нету в ХЛ, поэтому просто переименуйте DesiredAction в Think (а если функция Think уже есть - перенесите туда все из DesiredAction). Глобальной функции Activate в Хл также нету - зачастую данную функцию можно просто удалить, но внимательно следите, что в этой функции находиться, если эта функция имеет вид, типа:
void CParticle::Activate( void )
{
CPointEntity::Activate();
UTIL_DesiredAction(this);
}
смело грохайте ее, а вот если у функции такой вид:
void CEnvSky :: Activate ( void )
{
pev->effects |= EF_NODRAW;
pev->nextthink = gpGlobals->time + 1.0;
}
то переименуйте Activate в Spawn (не забудьте также продекларировать ее). Кстати не стоит радоваться, что функции типа env_fog или env_sky такие простые - на самом деле большая часть кода находиться в клиенте, куда вам, если вы начинающий кодер я лезть не советую, поскольку в клиенте запутаться еще проще, нежли в сервере. если компилятор ругается на какой-то локус - смело комментируйте (или выбрасывайте совсем из кода) данные строки - они вам также не понадобяться, если конечно вы не хотите перетащить локус к себе, а сделать это будет не так-то просто, поскольку локус - система глобальная. Если энтити брашевые, то в них частенько встречаються подобные условия
if (m_pMoveWith)
{
m_yawCenter = pev->angles.y - m_pMoveWith->pev->angles.y;
m_pitchCenter = pev->angles.x - m_pMoveWith->pev->angles.x;
}
else
{
m_yawCenter = pev->angles.y;
m_pitchCenter = pev->angles.x;
}
в таком случае нужно поступить следующим образом, обрезав почти все, и оставив только это
m_yawCenter = pev->angles.y;
m_pitchCenter = pev->angles.x;
Так же часто компилятор ругается на UTIL_SetOrigin, в которой он не может конвертировать инт в пев или что-то типа того. При этом данная строка имеет примерно такой вид.
UTIL_SetOrigin( this, pev->origin );
заменяется она на
UTIL_SetOrigin( pev, pev->origin );
Вам может встреиться случай и посложнее, например
UTIL_SetOrigin( m_pSpot, tr.vecEndPos );
В данном случае заменять m_pSpot на pev нельзя ни в коем случае, нужно просто указать, что m_pSpot входит в пев. см пример:
UTIL_SetOrigin( m_pSpot->pev, tr.vecEndPos );
Кстати строки, подобные
UTIL_SetAvelocity(this, g_vecZero);
UTIL_FlushAliases();
можете смело удалять - они вам не понадобяться. Данных советов должно хватить, чтобы перетащить из спирта несложные энтити, типа env_decal, env_shokwave, env_model и прочих несложных энтитей, а для новичка большего и не нужно. Потом, когда вы поднаберетесь опыта, вы сможете перетащить любую энтитю, будь то мовевитч или локус .
Подсказки и полезные советы от человека, который перетащил мовевитч в обычный ХЛ :)г .
Передполагается, что вы уже имеете достаточно опыта, чтобы перенести тот же мовевитч, но иногда попадаються такие ошибки, что хоть стой хоть падай, а толку = 0. Вот про такие вещи я дам вам несколько советов.
1.Если вы перетащили мовевитч, а приаттаченные энтити не обновляються во время движения - вы упустили важную функцию в player.cpp (там по моему всего три строки, но тем не менее).
2. Так же при подрубании мовевитч обычный use перестает работать в player.cpp найдите функцию use и посмотрите, чего дописал туда Лаури .
3. Отражения моделей находяться в файле studiomodelrenderer.cpp (ключевое слово поиска - reflection) так же кам придется прописать в const.h новый тип render fx.
4. управление любой целью с помощью префиксов + и - находяться в файле subs.cpp (ключевое слово поиска - '+')
5. консольная команда fire находиться в client.cpp (я думаю не нужно объяснять по какому слову искать код ).
Заключение
Надеюсь, что вышеприведенный тутор поможет начинающим кодерам, в освоении таскания энтитей, ибо кодинг в ХЛ на 40% заключается именно в этом :D. Если возникнут какие-то вопросы, или у вас случиться ошибка, которую я не включил в свой тутор - пишите, и я подробно разберу, как от нее избавиться.
Спасибо за внимание
g-cont