- Регистрация
- 24 Мар 2006
- Сообщения
- 9.860
- Благодарности
- 6.740
- Баллы
- 1.625
Расписывать что и кчему в скрипте эффекта не буду, так как это уже есть тут (PFX система (Эффекты излучаемых частиц)).
И так приступим, создайте новое решение в Готик Сорсере(Далее ГС). И назовите его к примеру VFX_Mgic(Включите в решение файлы ParticleFX.src,VisualFX.src лежат ?:Gothic II->_work->data->Scripts->System).
Далее выбираем проект ParticleFX Проект -> Задать активный проект -> ParticleFX открываем файл PfxInstMagic.d идем в конец этого файла и пишем туда следующее:
Дальше жмем "Компилирывать" и переходим в проект VisualFX
Вот тут я раскажу по более так как тутора по этому нету
и так тут также действует условии что и в пред-идущем файле имя нада NewSpell. И перейдем к скрипту.
На этом создание эффекта завершено, теперь переходим к написанию скрипта заклинания.
Открываем файл _intern->Constants.d в нем объявляем константу нашего заклинания
Также присвоим заклинанию наш Эффект тоже в файле _intern->Constants.d в массиве //spellFxInstanceNames//
Присвоим анимацию кастования в том-же файле, а именно _intern->Constants.d в массиве //spellFxAniLetters//
Дальше идем в файл AI->Magic->Spell_ProcessMana.d
в нем обрабатываются процесы инвестирования маны и тд
в функции //Spell_ProcessMana//
вписываем это
Теперь создадим файл, а в нем скрипт непосредственно самого заклинания.
AI->Magic->Spells->Spell_NewSpell.d
ВНИМАНИЕ!!! Файл Spell_NewSpell.d нужно ставить ПЕРЕД файлом Spell_ProcessMana.d ТК в нем объявляется Spell_Logic_NewSpell
Все заклинание готово осталось внести последние штрихи, а именно создать Руну и свиток с данным заклинанием идем в файл ItemsIT_Runen.d или ItemsIT_Runes.d у кого как у меня IT_Runen.d
и пишем в нем следующий скрипт:
Чуть не забыл надо еще прописать имяя заклинанию в файле Text.d
в массиве TXT_SPELLS
пишем на месте "TXT_SPL_RESERVED_69" Пишем "Заклинание Мага Воды"
далее в том-же файле ищем строку NAME_SPL_Reserved_69 = "NAME_SPL_RESERVED_69";
и заменяем ее NAME_SPL_NewSpell = "Заклинание Мага Воды";
Вот и все наше заклинание готово!
Всем пока, до новых встреч! ;-)
Автор статьи - Saturas.
И так приступим, создайте новое решение в Готик Сорсере(Далее ГС). И назовите его к примеру VFX_Mgic(Включите в решение файлы ParticleFX.src,VisualFX.src лежат ?:Gothic II->_work->data->Scripts->System).
Далее выбираем проект ParticleFX Проект -> Задать активный проект -> ParticleFX открываем файл PfxInstMagic.d идем в конец этого файла и пишем туда следующее:
Daedalus:
// Внимание! Имя Эффекта должно быть ПОЛНОСТЬЮ идентичным имени в файле Constants.d **SPL_Новое_заклинание**
//если имя эффекта NewSpell то и константа должна называтся SPL_NewSpell. Если это условие не соблюдено то
//заклинание работать не будет, а если и будет то не правильно!!!
//Инициализация заклинания
INSTANCE MFX_NewSpell_INIT (C_PARTICLEFX)
{
ppsvalue = 80; // Кол-во создаваемых частиц сделаем 80
ppsscalekeys_s = "5";
ppsislooping = 1;
ppsissmooth = 1;
ppsfps = 12;
shptype_s = "SPHERE"; //тип излучения ну скажем Сфера
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
// shpdistribwalkspeed = 0.100000001;
shpdim_s = "5"; //Размер поверхности на которой будут "рождаться" частицы поставим 8
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2;
dirmode_s = "RAND";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180;
dirangleelevvar = 180;
velavg = 0.00800000038;
velvar = 0.0299999993;
lsppartavg = 300;
flygravity_s = "0 0 0";
visname_s = "pfx_abs_03.tga"; //Текстуру я поставлю свою текстуру из моего мода
visorientation_s = "VELO";
vistexisquadpoly = 1;
vistexanifps = 18;
vistexaniislooping = 1;
vistexcolorstart_s = "0 100 255"; //начальный цвет будет синий
vistexcolorend_s = "0 100 255"; //конечный будет зеленым
vissizestart_s = "3 3";//Размер частиц при рождении поставим по 4
vissizeendscale = 5;
visalphafunc_s = "ADD";
visalphastart = 255;//Альфа-Функция будет ADD
useemittersfor = 1;
};
//Скастованое заклинание(Когда летит в цель)
//Тут уже объяснять не буду делайте по аналогии Инита
INSTANCE MFX_NewSpell_CAST (C_PARTICLEFX)
{
ppsvalue = 80;
ppsscalekeys_s = "5";
ppsislooping = 1;
ppsissmooth = 1;
ppsfps = 12;
shptype_s = "SPHERE";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
// shpdistribwalkspeed = 0.100000001;
shpdim_s = "15";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2;
dirmode_s = "RAND";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180;
dirangleelevvar = 180;
velavg = 0.00800000038;
velvar = 0.0299999993;
lsppartavg = 300;
flygravity_s = "0 0 0";
visname_s = "pfx_abs_03.tga";
visorientation_s = "VELO";
vistexisquadpoly = 1;
vistexanifps = 18;
vistexaniislooping = 1;
vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
vistexcolorend_s = "0 255 56"; //конечный будет зеленым
vissizestart_s = "4 4";
vissizeendscale = 10;
visalphafunc_s = "ADD";
visalphastart = 255;
useemittersfor = 1;
};
//И столкновение заклинания с объектом/целью
INSTANCE MFX_NewSpell_COLLIDE (C_PARTICLEFX)
{
ppsvalue = 20;
ppsfps = 30;
shptype_s = "SPHERE";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
shpisvolume = 1;
shpdim_s = "8";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2.000000000;
dirmode_s = "TARGET";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180.000000000;
dirangleelevvar = 180.000000000;
velavg = 0.079999998;
velvar = 0.020000000;
lsppartavg = 500.000000000;
flygravity_s = "0 0 0";
flycolldet_b = 2;
visname_s = "pfx_abs_03.tg";
visorientation_s = "VELO";
vistexisquadpoly = 1;
vistexanifps = 18.000000000;
vistexaniislooping = 1;
vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
vistexcolorend_s = "0 255 56"; //конечный будет зеленым
vissizestart_s = "10 10";
vissizeendscale = 10.000000000;
visalphafunc_s = "ADD";
visalphastart = 255.000000000;
};
//Ну и еще я решил добавить чтобы при попадании разлетались искры
INSTANCE MFX_NewSpell_COLLIDE_SPARKS (C_PARTICLEFX)
{
ppsvalue = 600.000000000;
ppsscalekeys_s = "1";
ppsissmooth = 1;
ppsfps = 10.000000000;
shptype_s = "POINT";
shpfor_s = "OBJECT";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "RAND";
shpisvolume = 1;
shpdim_s = "50";
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 2.000000000;
dirmode_s = "RAND";
dirfor_s = "object";
dirmodetargetfor_s = "OBJECT";
dirmodetargetpos_s = "0 0 0";
dirangleheadvar = 180.000000000;
dirangleelevvar = 180.000000000;
velavg = 0.200000003;
velvar = 0.050000001;
lsppartavg = 5000.000000000;
flygravity_s = "0 -0.0005 0";
flycolldet_b = 1;
visname_s = "MFX_SLEEP_STAR.TGA";
visorientation_s = "NONE";
vistexisquadpoly = 1;
vistexanifps = 18.000000000;
vistexaniislooping = 1;
vistexcolorstart_s = "140 252 255"; //начальный цвет будет синевато белый
vistexcolorend_s = "0 255 56"; //конечный будет зеленым
vissizestart_s = "30 30";
vissizeendscale = 0.100000001;
visalphafunc_s = "ADD";
visalphastart = 255.000000000;
visalphaend = 255.000000000;
};
//Извините за не полное разъяснение
Вот тут я раскажу по более так как тутора по этому нету
и так тут также действует условии что и в пред-идущем файле имя нада NewSpell. И перейдем к скрипту.
Daedalus:
INSTANCE spellFX_NewSpell (CFx_Base_Proto)
{
visname_S = "MFX_NewSpell_INIT"; //Инициализация заклинания(То что в руке гг)
emtrjmode_s = "FIXED"; //???
emTrjOriginNode = "ZS_RIGHTHAND"; //Инит в правой руке гг
emtrjtargetnode = "BIP01 FIRE"; //Будет лететь в точку BIP01 FIRE
emtrjloopmode_s = "NONE"; //???
emtrjeasefunc_s = "LINEAR"; //???
emActionCollStat_S = "COLLIDE CREATE"; //Будет воспринемать Статичные объкты при стокновении(Будет сталкиваться если убрать то пролетать)
emActionCollDyn_S = "COLLIDE CREATEONCE"; //Будет воспринемать Динамические объкты при стокновении(Будет сталкиваться если убрать то пролетать)
emFXCollStat_S = "spellFX_NewSpell_COLLIDE"; //Колизия при Стат. Объекте.
emFXCollDyn_S = "spellFX_NewSpell_COLLIDEDYNFX"; //Колизия при Дин. Объекте.
emTrjTargetRange = 20; //???
emTrjTargetElev = 0; //???
emTrjDynUpdateDelay = 20000; //???
//visAlpha = 0;
};
//открытие Ключа иницияализации
INSTANCE spellFX_NewSpell_KEY_INIT (C_ParticleFXEmitKey)
{
visname_S = "MFX_NewSpell_INIT"; //Эффект Инита
scaleDuration = 0.5;
};
// Открытие ключа кастования
INSTANCE spellFX_NewSpell_KEY_CAST (C_ParticleFXEmitKey)
{
visname_S = "MFX_NewSpell_CAST"; //Эффект каста
emtrjmode_s = "TARGET"; //Должно лететь в цель
emtrjeasevel = 1600.; //???
sfxid = "MFX_Thunderbolt_Cast"; //Звуковой эффект при касте
emCheckCollision = 1;
//emCreateFXID = "FX_CAST2";
};
// Открытие ключа столкновения
INSTANCE spellFX_NewSpell_KEY_COLLIDE (C_ParticleFXEmitKey)
{
pfx_flygravity_s = "0 0.0002 0";
emtrjeasevel = 0.000001; //???
emCheckCollision = 0; //вроде выбор колизии но трагать не станем
};
//эффект при столкновении со статикой
instance spellFX_NewSpell_COLLIDE (CFx_Base_Proto)
{
visname_S = "MFX_NewSpell_Collide"; //Название эфекта столкновения
visAlpha = 1; //чтото связанное с Альфа-каналом
emtrjmode_s = "FIXED"; //до конца не врубился
sfxid = "Torch_Enlight"; //звуковой эффект при столкновении
};
//Искры при столкновении со статикой
INSTANCE spellFX_NewSpell_COLLIDE_KEY_INVEST_1 (C_ParticleFXEmitKey)
{
visname_S = "MFX_NewSpell_COLLIDE_SPARKS";
};
//эффект при столкновении с динамикой
instance spellFX_NewSpell_COLLIDEDYNFX (CFx_Base_Proto)
{
visname_S = "MFX_NewSpell_Collide"; //Название эфекта столкновения
visAlpha = 1; //чтото связанное с Альфа-каналом
emtrjmode_s = "FIXED"; //до конца не врубился
sfxid = "Torch_Enlight"; //звуковой эффект при столкновении
};
//Искры при столкновении с динамикой
INSTANCE spellFX_NewSpell_COLLIDEDYNFX_KEY_INVEST_1 (C_ParticleFXEmitKey)
{
visname_S = "MFX_NewSpell_COLLIDE_SPARKS";
};
Открываем файл _intern->Constants.d в нем объявляем константу нашего заклинания
Daedalus:
const int SPL_NewSpell = 69; //NewSpell
Daedalus:
//Заменим Light названием нашего эффекта NewSpell
"Light", // 69 SPL_Reserved_69
"Thunderstorm", // 70 SPL_Thunderstorm //НЕ трогать дал чисто для того чтобы легче было найти нужную строку
Daedalus:
//Заменим ХХХ на FBT вроде анимация каста огненного шара
"XXX", // 69 SPL_Reserved_69
"STM", // 70 SPL_Thunderstorm
в нем обрабатываются процесы инвестирования маны и тд
в функции //Spell_ProcessMana//
вписываем это
Daedalus:
if(activeSpell == SPL_NewSpell ) { return Spell_Logic_NewSpell (manaInvested); };
AI->Magic->Spells->Spell_NewSpell.d
ВНИМАНИЕ!!! Файл Spell_NewSpell.d нужно ставить ПЕРЕД файлом Spell_ProcessMana.d ТК в нем объявляется Spell_Logic_NewSpell
Daedalus:
// стоимость заклинания
const int SPL_Cost_NewSpell = 40;
//Повреждение от заклинания
const int SPL_Damage_NewSpell = 65;
// объявление заклинания с инициализацией
INSTANCE Spell_NewSpell(C_Spell_Proto)
{
time_per_mana = 0;
damage_per_level = SPL_Damage_NewSpell;
};
// Функция инвестирования маны.
func int Spell_Logic_NewSpell(var int manaInvested)
{
// если активное заклинание свиток и есть требуемое кол-во маны
if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
{
// старт заклинания
return SPL_SENDCAST;
}
// иначе, если руна и есть требуемое кол-во маны
else if(self.attribute[ATR_MANA] >= SPL_Cost_NewSpell)
{
// старт заклинания
return SPL_SENDCAST;
}
else // мало маны
{
// отмена заклинания
return SPL_SENDSTOP;
};
return SPL_SENDSTOP;
};
// Вызов заклинания
func void Spell_Cast_NewSpell()
{
// если свиток
if(Npc_GetActiveSpellIsScroll(self))
{
// уменьшение маны на стоимость свитков
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else // руна
{
// уменьшение маны на фактическую стоимость заклинания
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_NewSpell;
};
// изменить случайное число выбора заклинаний
self.aivar[AIV_SelectSpell] += 1;
};
и пишем в нем следующий скрипт:
Daedalus:
//Создадим Руну
INSTANCE ItRu_NewSpell (C_Item)
{
name = NAME_Rune; //Имя из файла Text.d "Руна"
mainflag = ITEM_KAT_RUNE; //тип Руна
flags = 0;
value = 100; //Цена
visual = "ItRu_Water04.3DS"; //Визуальный 3DS объект
material = MAT_STONE; //Материал Камень
spell = SPL_NewSpell; //наше заклинание
mag_circle = 2; //Круг магии можно убрать
wear = WEAR_EFFECT;
effect = "SPELLFX_WEAKGLIMMER_BLUE"; //синее свечение руны
description = NAME_SPL_NewSpell; //Название нашего заклинания в файле Text.d
TEXT [0] = NAME_Mag_Circle;
COUNT [0] = mag_circle; //Круг
TEXT [1] = NAME_Manakosten;
COUNT [1] = SPL_Cost_NewSpell; //Стоит маны
TEXT [2] = NAME_Damage;
COUNT [2] = SPL_DAMAGE_NewSpell; //повреждение
TEXT [5] = NAME_Value;
COUNT [5] = value; //цена
};
//Теперь создадим свиток заклинания
INSTANCE ItSc_NewSpell (C_Item)
{
name = "Свиток";
mainflag = ITEM_KAT_RUNE;
flags = ITEM_MULTI;
value = 100; //цена
visual = "ItSc_Water02.3DS";
material = MAT_LEATHER;
spell = SPL_NewSpell; //наше заклинание
cond_atr[2] = ATR_MANA_MAX;
cond_value[2] = SPL_Cost_Scroll; //стоимость свитка
wear = WEAR_EFFECT;
effect = "SPELLFX_WEAKGLIMMER";
description = NAME_SPL_NewSpell; //Заклинание магов Воды
TEXT [0] = Name_MageScroll;
TEXT [1] = NAME_Mana_needed;
COUNT [1] = SPL_Cost_Scroll; //нада маны
TEXT [5] = NAME_Value;
COUNT [5] = value; //цена
};
в массиве TXT_SPELLS
пишем на месте "TXT_SPL_RESERVED_69" Пишем "Заклинание Мага Воды"
далее в том-же файле ищем строку NAME_SPL_Reserved_69 = "NAME_SPL_RESERVED_69";
и заменяем ее NAME_SPL_NewSpell = "Заклинание Мага Воды";
Вот и все наше заклинание готово!
Всем пока, до новых встреч! ;-)
Автор статьи - Saturas.
Последнее редактирование модератором: