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

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

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

MaGoth

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

Вложения

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

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.178
Благодарности
3.351
Баллы
485
А возможно ли вообще прикрутить эффекты частиц(свечение дракона-нежити например) из НВ в классику? Попытался тупо скопировать скрипты, и после начала новой игры вылезла ошибка.
Нет. Свойство effect для класса C_NpcC_Item) в скриптах для движка 1.3 отсутствует.
Что копировал, какая ошибка?
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
Нет. Свойство effect для класса C_NpcC_Item) в скриптах для движка 1.3 отсутствует.
Что копировал, какая ошибка?
Я это свойство и добавил, потом по предметам расставлял effect'ы spellfx, когда скомпилировал, вставил в папку с игрой, и начал новую игру вышла ошибка:
Error-Message

U: PAR: Class - size not compatible : C_ITEM (да, если что, я и в c_npc и c_item свойство вставил)
CPP - size : 524
Script - size : 504
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
Кто нибудь знает моды для г2 у которого в инвентаре для оружия ближнего боя указывался радиус поражения/дальность атаки? Хотелось бы попробовать прикрутить себе
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.840
Благодарности
6.725
Баллы
1.625
Кто нибудь знает моды для г2 у которого в инвентаре для оружия ближнего боя указывался радиус поражения/дальность атаки? Хотелось бы попробовать прикрутить себе
Г2А, там и расстояние и надпись про расстояние...
 

D36


Модостроитель
Регистрация
3 Дек 2014
Сообщения
2.178
Благодарности
3.351
Баллы
485
Кто нибудь знает моды для г2 у которого в инвентаре для оружия ближнего боя указывался радиус поражения/дальность атаки? Хотелось бы попробовать прикрутить себе
Вот такое есть, радиус будет в названии:
 

Вложения

  • Show_Weapon_Range_1.0.zip
    14,5 KB · Просмотры: 8

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Кто нибудь знает моды для г2 у которого в инвентаре для оружия ближнего боя указывался радиус поражения/дальность атаки? Хотелось бы попробовать прикрутить себе
ты традиционно про скрипты классик и движке классики пишешь? :)
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60

Вложения

  • 1675257029697.png
    1675257029697.png
    363,7 KB · Просмотры: 23

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
ещё вопрос, какой скрипт отвечает за выдачу опыта с мобов и нпс после убийства/победы над ними? А то походу сломал так что опыт не выдает, а уже не помню где он лежит
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.840
Благодарности
6.725
Баллы
1.625
Парниша с горы,
Daedalus:
func void ZS_Dead()
{
    self.aivar[AIV_RANSACKED] = FALSE;
    self.aivar[AIV_PARTYMEMBER] = FALSE;
    B_StopLookAt(self);
    AI_StopPointAt(self);
    if((Npc_IsPlayer(other) || (other.aivar[AIV_PARTYMEMBER] == TRUE)) && (self.aivar[AIV_VictoryXPGiven] == FALSE))
    {
        if (self.Guild > GIL_SEPERATOR_HUM)         // Убитый - монстр
        {
            B_GivePlayerXP( (self.level * XP_PER_VICTORY) / 2);    // Даем в два раза меньше опыта за обычного монстра
        }
        else
        {
            B_GivePlayerXP(self.level * XP_PER_VICTORY);
        };
        self.aivar[AIV_VictoryXPGiven] = TRUE;
    };
    if(C_IAmCanyonRazor(self) == TRUE)
    {
        CanyonRazorBodyCount = CanyonRazorBodyCount + 1;
        if(MIS_Addon_Greg_ClearCanyon == LOG_Running)
        {
            B_CountCanyonRazor();
        };
    };
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.101
Благодарности
5.592
Баллы
910
Для классики 1.30 скрипт выглядит по-другому.
Daedalus:
// *****************************************
// ZS_Dead
// -------
// wird auch nach jedem Load Game ausgeführt
// wird auch vom Spieler ausgeführt
// *****************************************

func void ZS_Dead ()
{   
    // ------ aivars resetten ------
    self.aivar[AIV_RANSACKED] = FALSE;
    self.aivar[AIV_PARTYMEMBER] = FALSE;
    
    B_StopLookAt    (self);
    AI_StopPointAt    (self);
        
    // ------ XP ------
    if ( Npc_IsPlayer(other) || (other.aivar[AIV_PARTYMEMBER]==TRUE) )
    && (self.aivar[AIV_VictoryXPGiven] == FALSE)                           
    {
        B_GivePlayerXP (self.level * XP_PER_VICTORY);           
        
        self.aivar[AIV_VictoryXPGiven] = TRUE;
    };
    if (Npc_IsPlayer(other))
    {
        self.aivar[AIV_KilledByPlayer] = TRUE;
        
        // ------ STORY ------
        
        // ------ Fester------
        if (self.guild == GIL_GIANT_BUG)
        && (MIS_Fester_KillBugs == LOG_RUNNING)
        {
            Festers_Giant_Bug_Killed = Festers_Giant_Bug_Killed + 1;
        };
    };
    // ------ weil sonst Händler bevor man zum ersten Mal TRADE gewählt hat nix haben ------
    B_GiveTradeInv(self);//Joly:    STEHEN LASSEN!!!!!!!!!!!!!!!

    // ------ Monster-Inventory abhängig vom Spieler-Talent ------
    B_GiveDeathInv(self);
    B_ClearRuneInv(self); //klaue alle runen!!
    
    // ------ PetzCounter meiner Home-Location runtersetzen ------
    B_DeletePetzCrime (self); //hat bei CRIME_NONE (oder keiner Home-Location) keine Auswirkungen
    self.aivar[AIV_NpcSawPlayerCommit] = CRIME_NONE;
    
    // ------ Equippte Waffen können nicht genommen werden! ------
    AI_UnequipWeapons (self);
    
    // Drachen
    B_DragonKillCounter (self);
};
 

Парниша с горы

Участник форума
Регистрация
14 Дек 2022
Сообщения
121
Благодарности
41
Баллы
60
N1kX, а у тебя это что? Немецкие скрипты 1.30? А то я видел только НВ. Может скинешь?
 

N1kX


Модостроитель
Регистрация
13 Ноя 2009
Сообщения
6.101
Благодарности
5.592
Баллы
910
Нету у меня их. Воссоздать скрипт для классики из Mdk готики 2 несложно.
 

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Приветствую всех.
Вопрос по расширению давней функции для освящения старого доспеха паладина:
Daedalus:
instance PC_PrayShrine_BlessArmor(C_Info)
{
    npc = PC_Hero;
    nr = 4; //новый слот, чтобы не мешать другим опциям
    condition = PC_PrayShrine_BlessArmor_Condition;
    information = PC_PrayShrine_BlessArmor_Info;
    permanent = FALSE; //диалог одноразовый
    description = "Освятить старые доспехи паладина"; //правильное написание предмета
};

func int PC_PrayShrine_BlessArmor_Condition()
{
    if((PLAYER_MOBSI_PRODUCTION == MOBSI_PrayShrine) && (hero.guild == GIL_PAL) && (CurrentLevel == NEWWORLD_ZEN) && (PAL_KnowsAbout_FINAL_BLESSING == TRUE) && ArmorEquipped(hero,ITAR_PAL_Skel))
    {
        if(Npc_GetDistToWP(hero,"NW_MONASTERY_CHAPELL_02") <= 500)
        {
            return TRUE;
        };
    };
};

func void PC_PrayShrine_BlessArmor_Info()
{
    B_RemoveEveryInvItem(hero,ITAR_PAL_Skel); //удалить все старые доспехи из инвентаря
    CreateInvItem(hero,ITAR_PAL_BEST); //создать новые доспехи
    AI_EquipArmor(hero,ITAR_PAL_BEST); //экипировать новые доспехи
    Wld_PlayEffect("spellFX_PalHeal_ORIGIN",hero,hero,0,0,0,FALSE);
    Snd_Play("MFX_Heal_Cast");
    B_GivePlayerXP(XP_ArmorBlessed);
};

Как сюда можно корректно добавить условие, чтобы освящение происходило только при сданном Сатурасу Когте Белиара?

Насколько понимаю, за это отвечает данная функция:
Daedalus:
func void DIA_Addon_Saturas_BeliarWeapGeben_Info()
{
    AI_Output(other,self,"DIA_Addon_Saturas_BeliarWeapGeben_15_00");    //Возьми Коготь Белиара и уничтожь его.
    AI_Output(self,other,"DIA_Addon_Saturas_BeliarWeapGeben_14_01");    //Как скажешь, сын мой. Дай мне Коготь.
    B_ClearBeliarsItems();
    AI_PrintScreen("Коготь Белиара отдано",-1,YPOS_ItemGiven,FONT_ScreenSmall,2);
    AI_Output(self,other,"DIA_Addon_Saturas_BeliarWeapGeben_14_02");    //Теперь Коготь лишен своей силы. Я утоплю его в глубинах моря.
    AI_Output(self,other,"DIA_Addon_Saturas_BeliarWeapGeben_14_03");    //Мудрость Аданоса укроет его от Зла.
    TOPIC_END_Klaue = TRUE;
    B_GivePlayerXP(XP_Addon_BeliarsWeaponAbgegeben);
    Saturas_KlaueInsMeer = TRUE;
};

Задача в том, чтобы при сданном Когте освящение проходило как прописано выше, НО если ГГ НЕ сдал Коготь, то вместо освящения лишь появляется сообщение типа "Иннос отвергает вас". Подскажите, пожалуйста, как это правильно прописать?
 

WoOliN

Участник форума
Регистрация
13 Окт 2012
Сообщения
347
Благодарности
196
Баллы
210
Все, что внутри функции текущей PC_PrayShrine_BlessArmor_Info засунь в дополнительное условие, примерно так:


func void PC_PrayShrine_BlessArmor_Info()
{
if(Saturas_KlaueInsMeer == TRUE)
{

B_RemoveEveryInvItem(hero,ITAR_PAL_Skel); //удалить все старые доспехи из инвентаря
CreateInvItem(hero,ITAR_PAL_BEST); //создать новые доспехи
AI_EquipArmor(hero,ITAR_PAL_BEST); //экипировать новые доспехи
Wld_PlayEffect("spellFX_PalHeal_ORIGIN",hero,hero,0,0,0,FALSE);
Snd_Play("MFX_Heal_Cast");
B_GivePlayerXP(XP_ArmorBlessed);
}
else
{
PrintScreen("Иннос отвергает Вас!",-1,25,FONT_Screen,4);
};

};
 
Сверху Снизу