Orc Hunter
Модостроитель
- Регистрация
- 12 Окт 2013
- Сообщения
- 1.269
- Благодарности
- 1.667
- Баллы
- 305
Приветствую. В Spacer 2 к камере прикреплен источник света, где можно увидеть его свойства?
AssessDamage и AssessOtherDamage тут почти не помогут. Во-первых потому что первое не работает на гг, а во-вторых потому что оба не срабатывают во время боя.У меня почему-то получаются только условия вида: если ГГ НАНЁС урон, то ...
А как зафиксировать получение урона?)
var int PlayerCurrentHP;
func void ZS_Attack()
{
...
// Инициализировать значение здоровья
// до вступления NPC в бой с героем
if (Npc_IsPlayer(other))
{
Hlp_PrintConsole("Player HP initialized");
PlayerCurrentHP = other.attribute[ATR_HITPOINTS];
};
};
func int ZS_Attack_Loop()
{
// Проверка, поменялось ли значение
// HP для NPC и в какую сторону
if (Npc_IsPlayer(other))
{
var int playerNewHP;
var int damageTotal;
var string format;
playerNewHP = other.attribute[ATR_HITPOINTS];
if (playerNewHP != PlayerCurrentHP)
{
if (playerNewHP < PlayerCurrentHP)
{
// Твой код тут . . .
damageTotal = PlayerCurrentHP - playerNewHP;
format = Str_Format("Урона получено: %i", damageTotal);
Hlp_PrintConsole(format);
};
PlayerCurrentHP = playerNewHP;
};
};
...
};
Физически не существует никакого источника света. За интенсивность подсветки полигонов отвечает функцияПриветствую. В Spacer 2 к камере прикреплен источник света, где можно увидеть его свойства?
zCPolygon::LightDynCamSpace
. Для изменения значения силы света используется глобальная переменная (адрес для G2A) 0x0089EBB4 int playerLightInt
Задавался аналогичным вопросом неделю тому назад. Есть тестовый код, но он не оптимизирован для выхода в массы.Я обнаружил что некоторые объекты, если смотреть против солнца, смотрятся не очень приятно. При этом даже слабый источник света прикрепленный к камере или гг значительно улучшает положение. Подскажите, возможно есть какие-то способы отключить тень на траве, или подсветить ее?
HOOK Hook_zCRenderLightContainer_CollectLights_StatLights AS( &zCRenderLightContainer::CollectLights_StatLights, &zCRenderLightContainer::CollectLights_StatLights_Union );
bool IsTransparentVob( zCVob* vob ) {
if( !vob || !vob->visual )
return false;
return vob->visual->GetVisualName().HasWordI( "GRASS" );
}
zVEC3 GetFloorColorVec3( zCVob* vob ) {
zCOLOR floorLight = vob->GetLightColorStat();
return zVEC3( floorLight.r, floorLight.g, floorLight.b );
}
bool IsOutDoorSector( const zTRenderContext& renderContext ) {
zCPolygon* groundPoly = renderContext.vob->groundPoly;
return !groundPoly || !groundPoly->flags.sectorPoly || renderContext.world->GetBspTree()->bspTreeMode == zBSP_MODE_OUTDOOR;
}
void zCRenderLightContainer::CollectLights_StatLights_Union( const zTRenderContext& renderContext ) {
THISCALL( Hook_zCRenderLightContainer_CollectLights_StatLights )(renderContext);
if( IsOutDoorSector( renderContext ) && IsTransparentVob( renderContext.vob ) ) {
zCRenderLight& pmLight = lightList[numLights++];
zVEC3 floorColor = GetFloorColorVec3( renderContext.vob );
pmLight.lightType = zLIGHT_TYPE_AMBIENT;
pmLight.colorDiffuse = floorColor * 0.8f;
}
};
Отлично работает! Люди пытались написать на Икарусе, но результатов я не нашел. Я тоже пытался. Насколько я понял за это отвечает _zCVob_lightColorStat и _zCVob_lightDirectionStat? У меня обрабатываются все модели травы после загрузки сохранения, я думал сделать их ярче в этот момент.Задавался аналогичным вопросом неделю тому назад. Есть тестовый код, но он не оптимизирован для выхода в массы.
Из-за того, что в свойствах воба отсутствует параметр альтернативного алгоритма освещения, все объекты считаются по умолчанию непросвечивающими. И свет на каждый из них ложится с максимальным затемнением с теневой стороны. Для аутдор локации освещение воба задается в момент рендера. При этом участвуют в этой операции два источника света: 1. направленный солнечный свет 2. эмбиент свет локации.
В реализации ниже для объекта, модель которого имеет в имени подстроку Grass, создается третий источник света, который добавляет светимости траве. Сила третьего источника базируется на значении освещенности полигона, на котором расположен воб.
C++:HOOK Hook_zCRenderLightContainer_CollectLights_StatLights AS( &zCRenderLightContainer::CollectLights_StatLights, &zCRenderLightContainer::CollectLights_StatLights_Union ); bool IsTransparentVob( zCVob* vob ) { if( !vob || !vob->visual ) return false; return vob->visual->GetVisualName().HasWordI( "GRASS" ); } zVEC3 GetFloorColorVec3( zCVob* vob ) { zCOLOR floorLight = vob->GetLightColorStat(); return zVEC3( floorLight.r, floorLight.g, floorLight.b ); } bool IsOutDoorSector( const zTRenderContext& renderContext ) { zCPolygon* groundPoly = renderContext.vob->groundPoly; return !groundPoly || !groundPoly->flags.sectorPoly || renderContext.world->GetBspTree()->bspTreeMode == zBSP_MODE_OUTDOOR; } void zCRenderLightContainer::CollectLights_StatLights_Union( const zTRenderContext& renderContext ) { THISCALL( Hook_zCRenderLightContainer_CollectLights_StatLights )(renderContext); if( IsOutDoorSector( renderContext ) && IsTransparentVob( renderContext.vob ) ) { zCRenderLight& pmLight = lightList[numLights++]; zVEC3 floorColor = GetFloorColorVec3( renderContext.vob ); pmLight.lightType = zLIGHT_TYPE_AMBIENT; pmLight.colorDiffuse = floorColor * 0.8f; } };
Результат:
Проблема пока только в том, чтобы реализовать фильтр, через который без ущерба производительности можно было бы кроме травы добавлять множество других моделей, которые должны освещаться по альтернативному алгоритму. Возможно чуть позже поищу какие-нибудь ненужные поля вобов для записи туда дополнительного флага.
var zCArray vobList;
vobList = _^(vobArrayPtr);
repeat(i, vobList.numInArray);
var int i;
var int vobPtr; vobPtr = MEM_ArrayRead(vobArrayPtr, i);
var oCMobInter mob;
mob = _^ (vobPtr);
mob._zCVob_lightColorStat
Скорее помогают. Статический свет считается по разному для меша локации и вобов. В первом случае информация о цвете вертекса пишется непосредственно в сам зен, а вот цвета вертексов у вобов приходится пересчитывать каждый кадр.Насколько я понял за это отвечает _zCVob_lightColorStat и _zCVob_lightDirectionStat?
[ZVOBSOFTLIGHT]
Visuals=*grass*, *farn*, *weed*, *clover*, *bush*, *lupine*, *plant*, *webs*
; ... строки, которые содержат модели, которые следует подсветить.
; * - означает, что в этом месте может быть любая подстрока.
Intensity=0.7
; ... значение дополнительного освещения. По умолчанию - 0.7
Скорее помогают. Статический свет считается по разному для меша локации и вобов. В первом случае информация о цвете вертекса пишется непосредственно в сам зен, а вот цвета вертексов у вобов приходится пересчитывать каждый кадр.
Ключевым моментом является тип статических источников света, которые я перечислил выше:
1. Направленный свет от солнца с флагом zLIGHT_TYPE_DIR - освещенность полигона будет зависеть от угла, которым он повернут к источнику.
2. Эмбиент свет с флагом zLIGHT_TYPE_AMBIENT - освещенность распределяется равномерно на все полигоны согласно заданному цвету. Этот источник значительно темнее первого, из-за чего мы видим такие темные участки на траве.
Всего можно задействовать до 8 источников света, которые будут как бы суммироваться при конечном расчете. В аутдоре используется 2, в индоре 1 (только эмбиент, а роль первого играет генерация карт теней).
Но если мы говорим о 3м эмбиент-источнике для аутдора из реализации выше, то мы не можем применять его ко всем объектам в мире, иначе пропадет игра света и картинка станет максимально плоской.
Вот смотри. Добавил пару опций в Gothic.ini, теперь можно более конкретно поиграть с вобами и уровнем освещения:
INI:[ZVOBSOFTLIGHT] Visuals=*grass*, *farn*, *weed*, *clover*, *bush*, *lupine*, *plant*, *webs* ; ... строки, которые содержат модели, которые следует подсветить. ; * - означает, что в этом месте может быть любая подстрока. Intensity=0.7 ; ... значение дополнительного освещения. По умолчанию - 0.7
Дллка при входе в мир перебирает все дерево вобов и по фильтру добавляет в сортированный массив подходящие модели. Далее эти модели бинарно проверяются в функции CollectLights_StatLights, соответственно на производительность это не влияет. И еще можно кнопкой KEY_0 посмотреть ДО и ПОСЛЕ.
По ощущениям будто напрашивается каждому из указанных типов добавить собственную настройку яркости. Некоторые объекты сильно пересвечивает. Либо мне кажется... Во всяком торчащие из воды тентакли можно и потемнее сделать.
У меня почему-то получаются только условия вида: если ГГ НАНЁС урон, то ...
А как зафиксировать получение урона?)
Ага, разобрались уже. Гратт подсказал костыль)
Тогда это лучше отслеживать циклическим тригером, а не рутиной нпс.Там примитив, как раз подходит (шанс на активацию состояния временной неуязвимости при получении любого урона).
TopLayer же делал это в своем плагине, который поднимает предметы.Комрады, подскажите кто шарит в чем ошибка. Суть - провести линию к от гг ко всем итемам в радиусе n готических попугаев.
void Lift::Debug()
{
screen->PrintCX(1000, string::Combine("Items checked: %i", itemsTraversed).GetVector());
screen->PrintCX(1200, string::Combine("Items affected: %i", oldPositions.size()).GetVector());
//интересующая часть
for (auto it = oldPositions.begin(); it != oldPositions.end(); it++)
{
zlineCache->Line3D(GetFocus(player), GetFocus(it->first), zCOLOR(255, 0, 0), true);
}
if (!player->GetFocusVob())
{
return;
}
}
Первый элемент списка всегда пустые данные содержит.в чем ошибка
for (zCListSort<oCItem>* node = ogame->GetGameWorld()->voblist_items->GetNextInList(); node; node = node->GetNextInList())
// use node->GetData()
Тут используются итераторы, которые, вроде, только в моих проектах реализованыВот часть кода, которая рисует линии к предметам, которые поднялись
Первый элемент списка всегда пустые данные содержит.
Пишу по памяти:
C++:for (zCListSort<oCItem>* node = ogame->GetGameWorld()->voblist_items->GetNextInList(); node; node = node->GetNextInList()) // use node->GetData()
Тут используются итераторы, которые, вроде, только в моих проектах реализованы
Trazege, у игрока есть player->interactItem, можно с ним сравнить.