• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 574
Последнее редактирование модератором:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Если ещё будут проблемы напишу
Прежде чем писать, посмотри аналогичные моменты в скриптах. Там почти всё уже есть, нужно только поискать. Ну и поиском по проекту нужно научиться пользоваться. Если ещё не умеешь.
 

Hiannyede

Участник форума
Регистрация
23 Дек 2016
Сообщения
26
Благодарности
0
Баллы
155
Ребят я прописал команду (B_Attack(self,other,AR_NONE,1)своему нпс
И всё работает, но когда персонаж меня одолевает, он не убивает меня, а просто даёт полежать
Как прописать чтобы он убивал ?
(Посмотрел у Скиннера у него тоже самое, но он кажись добивает потому что бандит)
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.129
Благодарности
5.626
Баллы
910
Ребят я прописал команду (B_Attack(self,other,AR_NONE,1)своему нпс
И всё работает, но когда персонаж меня одолевает, он не убивает меня, а просто даёт полежать
Как прописать чтобы он убивал ?
(Посмотрел у Скиннера у него тоже самое, но он кажись добивает потому что бандит)
const int AR_NONE = 0; //Причины убийства ГГ или НПС нет
const int AR_LeftPortalRoom = 1; //ГГ находится в помещении с ограниченным доступом
const int AR_ClearRoom = 2; //ГГ находится в помещении другого НПС
const int AR_GuardCalledToRoom = 3; //Вызвана охрана для защиты помещения
const int AR_MonsterVsHuman = 4; //Монстр сражается с человеком, ГГ помогает человеку
const int AR_MonsterMurderedHuman = 5; //Монстр убил человека
const int AR_SheepKiller = 6; //Овца была атакована и убита (человеком или монстром)
const int AR_Theft = 7; //ГГ что-то украл
const int AR_UseMob = 8; //ГГ использовал МОВ с флагом принадлежности другому НПС
const int AR_GuardCalledToThief = 9; //Вызвана стража по факту воровства ГГ
const int AR_ReactToWeapon = 10; //Преступник не убрал оружие после двукратного предупреждения или пустился в бега
const int AR_ReactToDamage = 11; //Преступник ранил НПС
const int AR_GuardStopsFight = 12; //Охрана останавливает драку
const int AR_GuardCalledToKill = 13; //Вызвана охрана по факту убийства
const int AR_GuildEnemy = 14; //НПС является врагом гильдии (человек или монстр)
const int AR_HumanMurderedHuman = 15; //Человек убил человека
const int AR_MonsterCloseToGate = 16; //Охрана ворот атакует враждебного монстра
const int AR_GuardStopsIntruder = 17; //Охрана ворот атакует незваного гостя
const int AR_SuddenEnemyInferno = 18; //Немедленная атака ГГ или иного НПС(невзирая на блокировку)
const int AR_KILL = 19; //Нападение с целью убийства ГГ или иного НПС
В твоем случае используй
Daedalus:
(B_Attack(self,other,AR_KILL,1));
 
Последнее редактирование:

Hiannyede

Участник форума
Регистрация
23 Дек 2016
Сообщения
26
Благодарности
0
Баллы
155
Привет кто может помочь
Прописал команду Гараду что бы он при вступлении к нему в ученики выдавал одежду кузнеца (Скриншот 2)
Так вот также прописал ему в инвентарь броню (Скриншот 1)
Захожу в игру выполняю квесты и тут мне Гарад выдаёт броню, но не из инвентаря
Он снимает свою броню и отдаёт мне (Дальше ходит в труханах)
Кто знает куда и что прописать что бы он мне не свою одежду отдавал
 

Вложения

  • 2.png
    2.png
    16,8 KB · Просмотры: 34
  • 1.png
    1.png
    12,2 KB · Просмотры: 34

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.129
Благодарности
5.626
Баллы
910
Кто знает куда и что прописать что бы он мне не свою одежду отдавал
Перенеси создание одежды кузнеца из инстанции Гарада, в диалог, из картинки 1 в картинку 2.
Можешь даже надеть его сразу на героя
Daedalus:
//создать вещь в инвентаре НПС
CreateInvItems(self,ItAr_Smith,1);
//передать вещь НПС другому НПС
B_GiveInvItems(self,hero,ItAr_Smith,1);
//надеть доспех
AI_EquipArmor(hero,ItAr_Smith);
+ так ты не сможешь выбить из него созданный доспех заранее.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
Перенеси создание одежды кузнеца из инстанции Гарада, в диалог, из картинки 1 в картинку 2.
Это не поможет. При передаче предмета в скриптовой функции B_GiveInvItems предмет удаляется из инвентаря дающего и создаётся в инвентаре получающего. Так вот, если у дающего есть два одинаковых доспеха, один из которых экипирован, будет удалён именно тот экземпляр, который экипирован. Просто он занимает слот с меньшим номером, и движковая функция выберет именно его.

Кто знает куда и что прописать что бы он мне не свою одежду отдавал
Я знаю. Не используй стандартную функцию B_GiveInvItems. Создай доспех в инвентаре ГГ по ходу диалога и выведи на экран надпись, мол, получен предмет.

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

Hiannyede

Участник форума
Регистрация
23 Дек 2016
Сообщения
26
Благодарности
0
Баллы
155
ElderGamer, Спасибо сам почему то не додумался
Пока вы не написали я прописывал
CreateInvItems(self,ITAR_Smith,1);
B_GiveInvItems(self,hero,ITAR_Smith,1);
AI_EquipArmor(self,ItAr_Smith);
AI_EquipArmor(hero,ItAr_Smith);
Но выглядело неочень
 

Северный Кочевник

Участник форума
Регистрация
9 Янв 2019
Сообщения
40
Благодарности
2
Баллы
105
Дорогие друзья, не знаю к чему относится вопрос,но подскажите в каком файле можно изменить строку чтобы у ГГ не было его робы заключенного?вопрос к обеим частям относится. Заранее спасибо.
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.169
Баллы
340
в каком файле можно изменить строку чтобы у ГГ не было его робы заключенного?вопрос к обеим частям относится. Заранее спасибо.
Если я правильно понимаю, Вам нужно, чтобы стартовая текстура ГГ была без нарисованной одежды. Это можно исправить, отредактировав файл PC_Hero.d.
В строке: Mdl_SetVisualBody(self,"hum_body_Naked0",9,0,"Hum_Head_Pony",Face_N_Player,0,NO_ARMOR); есть указание на материал hum_body_Naked. Под таким именем в готике используются дефолтные текстуры тела, различающиеся лишь цифровым индексом. Для Г2 у Безымянного прописан индекс 9, что аналогично текстуре Hum_Body_Naked_V9_C0. tex.
Можно использовать любую другую текстуру из стандартного набора от 0-12 (включая и женские текстуры) , но наиболее подходящая по цвету кожи текстура с индексом 1.
Если хочется нарисовать свою текстуру и внедрить ее в игру, то желательно будет прописать ее в файле AI_Constants.d.
Там есть секция
const int BodyTex_P = 0;
const int BodyTex_N = 1;
const int BodyTex_L = 2;
const int BodyTex_B = 3;
const int BodyTexBabe_P = 4;
const int BodyTexBabe_N = 5;
const int BodyTexBabe_L = 6;
const int BodyTexBabe_B = 7;
const int BodyTex_Player = 8;
const int BodyTex_T = 10;
const int BodyTexBabe_F = 11;
const int BodyTexBabe_S = 12;
const int NO_ARMOR = -1;
Просто добавляем новую константу с индексом, идущим за последним стандартным, например: const int BodyTexPlayerNew = 13; при этом, текстура должна иметь имя: Hum_Body_Naked_V13.tga
Для Г1 действия и файлы аналогичные, единственное, индексы текстур отличаются.
 
Последнее редактирование:

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.190
Благодарности
3.373
Баллы
485
Дорогие друзья, не знаю к чему относится вопрос,но подскажите в каком файле можно изменить строку чтобы у ГГ не было его робы заключенного?вопрос к обеим частям относится. Заранее спасибо.
Готика 2: НВ - Общее обсуждение
Ну или играть с мод-фиксом (для Г1) и с неофициальным обновлением (для Г2НВ), где смена текстуры тела при экипировке открытой одежды реализована на уровне скриптов.

ElderGamer, Спасибо сам почему то не додумался
Пока вы не написали я прописывал
CreateInvItems(self,ITAR_Smith,1);
B_GiveInvItems(self,hero,ITAR_Smith,1);
AI_EquipArmor(self,ItAr_Smith);
AI_EquipArmor(hero,ItAr_Smith);
Но выглядело неочень
Слишком много лишнего. Обойдись без B_GiveInvItems, создавай одежду сразу в инвентаре ГГ и выводи на экран соответствующее сообщение. Собеседник при этом не нужен вообще, а при твоей реализации в момент передачи на нем будет мелькать нижнее белье.
Daedalus:
CreateInvItem(hero,ITAR_Smith);
AI_PrintScreen("Одежда кузнеца получено",-1,YPOS_ItemTaken,FONT_ScreenSmall,2);
AI_EquipArmor(hero,ItAr_Smith);
 
Последнее редактирование:

Hiannyede

Участник форума
Регистрация
23 Дек 2016
Сообщения
26
Благодарности
0
Баллы
155
Ребят помогите мне дописать что бы всё работало
Короче...
Давно появилась идея дополнить диалоги так как иногда выбешивали некоторые ситуации
Вот решил дописать что бы можно было после убийства гильдии воров посадить Ханну так как здесь только глупый не поймёт, что она укрывала их (а если достаточно подождать она даже нападает)
Так вот начинаю писать получилось так (Скриншот 1-2)
Но сразу когда иду всё проверять появляются 2 ошибки
1) Когда сдаю Ханну у Андре не исчезает вариант -Ханна укрывала воров (хоть Info_ClearChoices(DIA_Andre_Auslieferung); прописано)
2)Ханна когда появляется в камере (Если идешь спать и т.д) исчезает
Вроде всё
 

Вложения

  • 1.png
    1.png
    31,1 KB · Просмотры: 27
  • 2.png
    2.png
    12,8 KB · Просмотры: 48

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.129
Благодарности
5.626
Баллы
910
Ребят помогите мне дописать что бы всё работало
Короче...
Давно появилась идея дополнить диалоги так как иногда выбешивали некоторые ситуации
Вот решил дописать что бы можно было после убийства гильдии воров посадить Ханну так как здесь только глупый не поймёт, что она укрывала их (а если достаточно подождать она даже нападает)
Так вот начинаю писать получилось так (Скриншот 1-2)
Но сразу когда иду всё проверять появляются 2 ошибки
1) Когда сдаю Ханну у Андре не исчезает вариант -Ханна укрывала воров (хоть Info_ClearChoices(DIA_Andre_Auslieferung); прописано)
2)Ханна когда появляется в камере (Если идешь спать и т.д) исчезает
Вроде всё
Вариант диалога и останется, потому что всегда выполняется условие
if(Hanna_Prison == TRUE)

1. Либо добавь дополнительную переменную (новую переменную вводи выше диалога), либо старую переводи на FALSE
Daedalus:
//if(Hanna_Prison == TRUE)
if((Hanna_Prison == TRUE) && (Hanna_Ausgeliefert == FALSE))
{
        Info_AddChoice(DIA_Andre_Auslieferung,"Ханна укрывала гильдию воров.",DIA_Andre_Auslieferung_Hanna);
    };
};

func void DIA_Andre_Auslieferung_Back()
{
    Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Hanna()
{
//new
var C_NPC Hanna;
Hanna = Hlp_GetNpc(vlk_114_hanna);
//end
    //AI_Teleport(vlk_114_hanna,"NW_CITY_HABOUR_KASERN_RENGARU");
AI_Teleport(Hanna ,"NW_CITY_HABOUR_KASERN_RENGARU");
    /*AI_Output(other,self,"DIA_Andre_Auslieferung_Hanna_00");    //Ханна укрывала гильдию воров.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_01");    //Ясно. Она очень хорошо скрывала их, но теперь получит по заслугам.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_02");    //Вот награда.*/
    AI_Output(other,self,"DIA_Andre_Auslieferung_Hanna_15_00");    //Ханна укрывала гильдию воров.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_08_01");    //Ясно. Она очень хорошо скрывала их, но теперь получит по заслугам.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_08_02");    //Вот награда.
B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
   // B_StartOtherRoutine(vlk_114_hanna,"PRISON");
//new
Hanna_Ausgeliefert == FALSE;
//end
    MIS_Canthars_KomproBrief = LOG_SUCCESS;
    B_GivePlayerXP(XP_Andre_Auslieferung);
    Info_ClearChoices(DIA_Andre_Auslieferung);
//new
B_StartOtherRoutine(Hanna,"PRISON");
//end
Daedalus:
if(Hanna_Prison == TRUE)
{
        Info_AddChoice(DIA_Andre_Auslieferung,"Ханна укрывала гильдию воров.",DIA_Andre_Auslieferung_Hanna);
    };
};

func void DIA_Andre_Auslieferung_Back()
{
    Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Hanna()
{
//new
var C_NPC Hanna;
Hanna = Hlp_GetNpc(vlk_114_hanna);
//end
    //AI_Teleport(vlk_114_hanna,"NW_CITY_HABOUR_KASERN_RENGARU");
AI_Teleport(Hanna ,"NW_CITY_HABOUR_KASERN_RENGARU");
    /*AI_Output(other,self,"DIA_Andre_Auslieferung_Hanna_00");    //Ханна укрывала гильдию воров.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_01");    //Ясно. Она очень хорошо скрывала их, но теперь получит по заслугам.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_02");    //Вот награда.*/
    AI_Output(other,self,"DIA_Andre_Auslieferung_Hanna_15_00");    //Ханна укрывала гильдию воров.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_08_01");    //Ясно. Она очень хорошо скрывала их, но теперь получит по заслугам.
    AI_Output(self,other,"DIA_Andre_Auslieferung_Hanna_08_02");    //Вот награда.
B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
   // B_StartOtherRoutine(vlk_114_hanna,"PRISON");
    MIS_Canthars_KomproBrief = LOG_SUCCESS;
Hanna_Prison == FALSE;
    B_GivePlayerXP(XP_Andre_Auslieferung);
    Info_ClearChoices(DIA_Andre_Auslieferung);
//new
B_StartOtherRoutine(Hanna,"PRISON");
//end
2. Самое важное. Чтобы ханна не пропадала из казарм, ты должен прописать ей новый распорядок дня. Его изменяет функция B_StartOtherRoutine, как ты мог заменить.

Daedalus:
instance VLK_414_Hanna(Npc_Default)
{
    name[0] = "Ханна";
    guild = GIL_VLK;
    id = 414;
    voice = 17;
    flags = 0;
    npcType = npctype_main;
    B_SetAttributesToChapter(self,1);
    fight_tactic = FAI_HUMAN_COWARD;
    B_CreateAmbientInv(self);
    B_SetNpcVisual(self,FEMALE,"Hum_Head_Babe1",FaceBabe_N_WhiteCloth,BodyTex_N,ITAR_VlkBabe_L);
    Mdl_ApplyOverlayMds(self,"Humans_Babe.mds");
    B_GiveNpcTalents(self);
    B_SetFightSkills(self,35);
    daily_routine = Rtn_Start_414;
};

func void Rtn_Start_414()
{
    TA_Stand_ArmsCrossed(8,0,22,0,"NW_CITY_HANNA");
    TA_Stand_ArmsCrossed(22,0,8,0,"NW_CITY_HANNA");
};

//new
func void Rtn_Prison_414()
{
    TA_Stand_ArmsCrossed(8,0,23,0,"NW_CITY_HABOUR_KASERN_RENGARU");
    TA_Stand_ArmsCrossed(23,0,8,0,"NW_CITY_HABOUR_KASERN_RENGARU");
};
Ну и ещё по хорошему, на карте добавить ей отдельный WP, на котором она будет стоять. И если спрашиваешь, давай сюда куски кода в тег CODE
Скачай себе справочник из этого поста, там многое что есть
 
Последнее редактирование:

Hiannyede

Участник форума
Регистрация
23 Дек 2016
Сообщения
26
Благодарности
0
Баллы
155
Ребят кто знает с чем это связано ?
 

Вложения

  • Gothic2 2019-06-27 16-49-06-401.jpg
    Gothic2 2019-06-27 16-49-06-401.jpg
    304,6 KB · Просмотры: 43
  • Gothic2 2019-06-27 16-49-45-047.jpg
    Gothic2 2019-06-27 16-49-45-047.jpg
    284,4 KB · Просмотры: 54

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.860
Благодарности
6.740
Баллы
1.625
badmentank, в этой точке начало координат, те вещи, которые ты положил в мир скриптами, если у них нет реальной точки, куда ты положил - он попадают в начало координат.
т.е. укажи реальные фри(вай)поинты, где они должны лежать
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.190
Благодарности
3.373
Баллы
485
Г2/Г2НВ. Зачем в инвентаре каждого торговца каждую главу создается золото, если оно недоступно для обмена и всегда скрывается с началом торговли, а при продаже предметов этому торговцу золото главному герою добавляется бесконечно? У этого есть какое-то техническое обоснование или же это просто остатки от ранних разработок, когда торговля была основана на натуральном обмене, как в Г1? У меня было подозрение, что это нужно для имитации бурной торговой деятельности торговца (мол, в первой главе у него 100 золотых, а к пятой он заработал все 650), но нет - если избить торговца, то этого золота у него не окажется. Вместо него будет сумма, с которой он появился в мире (если такая была прописана при создании амбиентного инвентаря или в инстанции персонажа).
Daedalus:
func void B_GiveTradeInv_Lutero(var C_Npc slf)
{
    if((Kapitel >= 1) && (Lutero_ItemsGiven_Chapter_1 == FALSE))
    {
        CreateInvItems(slf,ItMi_Gold,100);
        ...
        Lutero_ItemsGiven_Chapter_1 = TRUE;
    };
    if((Kapitel >= 2) && (Lutero_ItemsGiven_Chapter_2 == FALSE))
    {
        CreateInvItems(slf,ItMi_Gold,100);
        ...
        Lutero_ItemsGiven_Chapter_2 = TRUE;
    };
    if((Kapitel >= 3) && (Lutero_ItemsGiven_Chapter_3 == FALSE))
    {
        CreateInvItems(slf,ItMi_Gold,100);
        ...
        Lutero_ItemsGiven_Chapter_3 = TRUE;
    };
    if((Kapitel >= 4) && (Lutero_ItemsGiven_Chapter_4 == FALSE))
    {
        CreateInvItems(slf,ItMi_Gold,150);
        ...
        Lutero_ItemsGiven_Chapter_4 = TRUE;
    };
    if((Kapitel >= 5) && (Lutero_ItemsGiven_Chapter_5 == FALSE))
    {
        CreateInvItems(slf,ItMi_Gold,200);
        ...
        Lutero_ItemsGiven_Chapter_5 = TRUE;
    };
};
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.407
Благодарности
3.232
Баллы
525
или же это просто остатки от ранних разработок, когда торговля была основана на натуральном обмене, как в Г1?
Наверное, так. Но нужно проверять.
 

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
А как движок различает руны и свитки?

Daedalus:
instance ItRu_Light(C_Item)
{
    name = NAME_Rune;
    mainflag = ITEM_KAT_RUNE;
    flags = 0;
    value = Value_Ru_Light;
    visual = "ItRu_Light.3ds";
    material = MAT_STONE;
    spell = SPL_Light;
    mag_circle = 1;
    wear = WEAR_EFFECT;
    effect = "SPELLFX_WEAKGLIMMER";
    description = NAME_SPL_LIGHT;
    text[0] = NAME_Mag_Circle;
    count[0] = mag_circle;
    text[1] = NAME_Manakosten;
    count[1] = SPL_Cost_LIGHT;
    text[2] = NAME_Duration;
    count[2] = SPL_Duration_LIGHT;
    text[5] = NAME_Value;
    count[5] = value;
};

instance ItSc_Light(C_Item)
{
    name = NAME_Spruchrolle;
    mainflag = ITEM_KAT_RUNE;
    flags = ITEM_MULTI;
    value = Value_Sc_Light;
    visual = "ItSc_Light.3DS";
    material = MAT_LEATHER;
    spell = SPL_Light;
    cond_atr[2] = ATR_MANA_MAX;
    cond_value[2] = SPL_Cost_Scroll;
    wear = WEAR_EFFECT;
    effect = "SPELLFX_WEAKGLIMMER";
    description = NAME_SPL_LIGHT;
    text[0] = NAME_MageScroll;
    text[1] = NAME_Mana_needed;
    count[1] = SPL_Cost_Scroll;
    text[2] = NAME_Duration;
    count[2] = SPL_Duration_LIGHT;
    text[5] = NAME_Value;
    count[5] = value;
};

Наверное по полю mag_circle?
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.190
Благодарности
3.373
Баллы
485
Да никак. Руна - это просто многоразовый свиток.
Daedalus:
instance ItRu_Light(C_Item)
{
    flags = 0;
};

instance ItSc_Light(C_Item)
{
    flags = ITEM_MULTI;
};
 
Последнее редактирование:

neromont


Модостроитель
Регистрация
12 Мар 2011
Сообщения
675
Благодарности
662
Баллы
245
Почему выдает ошибку?
Ведь массив из 100 элементов.
 

Вложения

  • Безымянный.png
    Безымянный.png
    51,8 KB · Просмотры: 227

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Почему выдает ошибку?
А с какой целью, ты в текстовое поле Description пытаешься запихать целочисленное значение константы (const int SPL_FIREBOLT) стоимости номера заклинания а не их названия (NAME_SPL_FIREBOLT)?
 
Последнее редактирование:
Сверху Снизу