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

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

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

MaGoth

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

Вложения

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

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, если ты в Spell_Cast_SummonNikita обнушишь, тогда у тебя сработает условие на рандом из фрагмента кода что ты привел выше.

Ты хочешь что бы рандом происходил после каждого каста любого спелла?
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
RPD, если ты в Spell_Cast_SummonNikita обнушишь, тогда у тебя сработает условие на рандом из фрагмента кода что ты привел выше.

Ты хочешь что бы рандом происходил после каждого каста любого спелла?
Да и в определенном диапозоне, что я привел
Пост автоматически объединён:

Пост автоматически объединён:

Да и в определенном диапозоне, что я привел
Пост автоматически объединён:
Но ведь если обнулять в спелл лоджик- то каст от гг тоже будет обнулять селект спелл. Доп проверки вешать?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, ГГ этот аивер не использует.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
RPD, ГГ этот аивер не использует.
окей. я сделал все. В итоге вроде даже работает - только вот кастует он призыв только в начале - потом уже второй каст он не закканчивает, убирает, либо стоит в состоянии каста бесконечно. Со стрелами больше такой проблемы нет.
Daedalus:
if(slf.guild == GIL_NIK)
    {
        if(Npc_IsDrawingWeapon(slf))
        {
            return TRUE;
        };
       
        if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_MELEE)
        {
            return FALSE;
        };
       
        if(Npc_HasItems(slf,ItRu_PierceArrow) == 0)
        {
            CreateInvItems(slf,ItRu_PierceArrow,1);
        };
        if(Npc_HasItems(slf,ItRu_SumNik) == 0)
        {
            CreateInvItems(slf,ItRu_SumNik,1);
        };
        if(Npc_HasItems(slf,ItRu_FullHeal) == 0)
        {
            CreateInvItems(slf,ItRu_FullHeal,1);
        };
       
       
        if(slf.attribute[ATR_HITPOINTS] < slf.attribute[ATR_HITPOINTS_MAX]/3)
        {
            B_ReadySpell(slf,SPL_FullHeal,0);
            return true;
        };
        if(slf.aivar[AIV_SelectSpell] == 0)
        {
            rand = Hlp_Random(5) + 1;
            slf.aivar[AIV_SelectSpell] += rand;
        };
        if(slf.aivar[AIV_SelectSpell] >= 3)
        {
            B_ReadySpell(slf,SPL_PierceArrow,0);
            return true;
           
        }
        else if(slf.aivar[AIV_SelectSpell] < 3)
        {
            B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
        if(slf.aivar[AIV_SelectSpell] >= 10)
        {
            slf.aivar[AIV_SelectSpell] = 0;
        };
       
        return true;
    };
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, наверное будет лучше если ты словами объяснишь что ты хочешь сделать.
У тебя есть какой нпс и он должен случайно то вызывать то брасать стрелки ?
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
наверное будет лучше если ты словами объяснишь что ты хочешь сделать.
Да, именно так. Нпс именно Nikita должен кастовать призыв и стрелки рандомно, а вот вызванный для самого Никиты экземпляр только атаковать все подряд с меча (никакой магии)
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, так если НПС никита уже произвел вызов, он должен кидать срелки или происходит рандом и может произойти повторный вызов ?
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
Вообще не понятно. Каков шанс призвать Никиту? Каков шанс призвать Никиту если он уже призван?
Ну если не призван - 20 процентов (80 стрела). Если призван - 5 процентов (95 стрела).
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, в таком случае надо отслеживать есть ли в мире инстанция призываемого нпс

Код:
rand = 0;
      if(slf.aivar[AIV_SelectSpell] > 0)
        {
        // нпс совершил каст. делаем рандом
            slf.aivar[AIV_SelectSpell] = 0;
            rand = Hlp_Random(100) + 1;
        };

        if  (rand >  95)
        {
// шанс 5 на призыв бездоп условий
            B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
    
var c_npc npc;
npc= Hlp_GetNpc(Nikita_for_Npc);
if !Hlp_IsValidNpc(npc)
{
// можно так же проверять жив ли Никита
        if  (rand > 80)
        {
// шанс 20% на призыв с доп условиями
  B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
};
    
// призыва не было, кидаем стрелку
        B_ReadySpell(slf,SPL_PierceArrow,0);
            return true;      

  
        return true;

в Spell_Cast_*** делай как и в других, что бы не было потом путаницы

slf.aivar[AIV_SelectSpell] +=1;
 
Последнее редактирование:

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
RPD, в таком случае надо отслеживать есть ли в мире инстанция призываемого нпс

Код:
rand = 0;
      if(slf.aivar[AIV_SelectSpell] > 0)
        {
        // нпс совершил каст. делаем рандом
            slf.aivar[AIV_SelectSpell] = 0;
            rand = Hlp_Random(100) + 1;
        };

        if  (rand >  95)
        {
// шанс 5 на призыв бездоп условий
            B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
   
var c_npc npc;
npc= Hlp_GetNpc(Nikita_for_Npc);
if !Hlp_IsValidNpc(npc)
{
// можно так же проверять жив ли Никита
        if  (rand > 80)
        {
// шанс 20% на призыв с доп условиями
  B_ReadySpell(slf,SPL_SummonNikita,0);
            return true;
        };
};
   
// призыва не было, кидаем стрелку
        B_ReadySpell(slf,SPL_PierceArrow,0);
            return true;     

 
        return true;

в Spell_Cast_*** делай как и в других, что бы не было потом путаницы

slf.aivar[AIV_SelectSpell] +=1;
Но теперь так как rand = 0 изначально - нпс будет всегда выходить из b_selectspell.
Пост автоматически объединён:

Проблема в том, что он постоянно недокастует призыв. То есть стрелу нормально пускает всегда, а призыв вечно не завершает. Это вот прямо самая главная проблема.
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, в приведенном мною примере после каждого каста будет рандом.

касательно призыва: ты отдаешь "0" в качестве манаинвестед. попробуй увеличить ману что бы спеллогик мог несколько раз пройти, возможно это решит проблему.

B_ReadySpell(slf,SPL_SummonNikita,13);
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
RPD, в приведенном мною примере после каждого каста будет рандом.

касательно призыва: ты отдаешь "0" в качестве манаинвестед. попробуй увеличить ману что бы спеллогик мог несколько раз пройти, возможно это решит проблему.

B_ReadySpell(slf,SPL_SummonNikita,13);
Спасибо. Насчет каста - после каждого будет конечно, но так он же не сделает первый каст никогда.

Проблему не решило, все равно не кастует призыв
 
Последнее редактирование:

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
Спасибо. Насчет каста - после каждого будет конечно, но так он же не сделает первый каст никогда.
почему не сделает? на стрелку же нет проверки ;-)

Проблему не решило, все равно не кастует призыв
прикрепи весь файл. проверю.
 

RPD

Участник форума
Регистрация
13 Ноя 2023
Сообщения
106
Благодарности
3
Баллы
30
почему не сделает? на стрелку же нет проверки ;-)
Потому что НПС из скрипта выйдет раньше, чем дойдет до стрелки, так как при попадании в инструкцию rand == 0 - вернется false
прикрепи весь файл. проверю.
Daedalus:
func int B_SelectSpell(var C_Npc slf,var C_Npc oth)
{
    var int dK_rnd;
    var int dK_Mega;
    var int rand; rand = 0;
    
    if(slf.guild == GIL_NIK)
    {
        if(Npc_IsDrawingWeapon(slf))
        {
            return TRUE;
        };
        
        if(Npc_GetDistToNpc(slf,oth) <= FIGHT_DIST_MELEE)
        {
            return FALSE;
        };
        
        if(Npc_HasItems(slf,ItRu_PierceArrow) == 0)
        {
            CreateInvItems(slf,ItRu_PierceArrow,1);
        };
        if(Npc_HasItems(slf,ItRu_SumNik) == 0)
        {
            CreateInvItems(slf,ItRu_SumNik,1);
        };
        if(Npc_HasItems(slf,ItRu_FullHeal) == 0)
        {
            CreateInvItems(slf,ItRu_FullHeal,1);
        };
        
        
        if(slf.aivar[AIV_SelectSpell] > 0)
        {
            slf.aivar[AIV_SelectSpell] = 0;
            rand = Hlp_Random(100) + 1;
        };
        
        if(rand <= 5 && rand != 0)
        {
            B_ReadySpell(slf,SPL_SummonNikita,20);
            return true;
        };
    
        var c_npc npc;
        npc    = Hlp_GetNpc(Nikita_for_Npc);
        
        if(!Hlp_IsValidNpc(npc))
        {
            if  (rand <= 20 && rand != 0)
            {
                B_ReadySpell(slf,SPL_SummonNikita,20);
                return true;
            };
        };
        
        B_ReadySpell(slf,SPL_PierceArrow,10);
        
        return true;
        
    };
    if((slf.npcType == NPCTYPE_FRIEND) && Npc_IsPlayer(oth) && (oth.guild < GIL_SEPERATOR_HUM))
    {
        if((slf.guild == GIL_KDF) || (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
        {
            if(Npc_HasItems(slf,ItRu_Sleep) == 0)
            {
                CreateInvItems(slf,ItRu_Sleep,1);
            };
            B_ReadySpell(slf,SPL_Sleep,SPL_Cost_Sleep);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if((slf.guild == GIL_DMT) && (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_HasItems(slf,ItRu_Deathbolt) == 0)
        {
            CreateInvItems(slf,ItRu_Deathbolt,1);
        };
        if(Npc_HasItems(slf,ItRu_Deathball) == 0)
        {
            CreateInvItems(slf,ItRu_Deathball,1);
        };
        if(Npc_HasItems(slf,ItRu_Firerain) == 0)
        {
            CreateInvItems(slf,ItRu_Firerain,1);
        };
        if(Npc_HasItems(slf,ItRu_Thunderstorm) == 0)
        {
            CreateInvItems(slf,ItRu_Thunderstorm,1);
        };
        if(Npc_HasItems(slf,ItRu_LightningFlash) == 0)
        {
            CreateInvItems(slf,ItRu_LightningFlash,1);
        };
        if(Npc_HasItems(slf,ItRu_Firestorm) == 0)
        {
            CreateInvItems(slf,ItRu_Firestorm,1);
        };
        if(Npc_HasItems(slf,ItRu_Skull) == 0)
        {
            CreateInvItems(slf,ItRu_Skull,1);
        };
        if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(DMT_1299_OberDementor_DI))
        {
            B_ReadySpell(slf,SPL_Skull,SPL_Cost_Skull);
            return TRUE;
        }
        else
        {
            if(Npc_IsDrawingWeapon(slf))
            {
                return TRUE;
            };
            if(slf.aivar[AIV_SelectSpell] <= 0)
            {
                dK_rnd = Hlp_Random(10);
                slf.aivar[AIV_SelectSpell] += dK_rnd;
            };
            if(slf.aivar[AIV_SelectSpell] < 10)
            {
                if(Kapitel <= 3)
                {
                    B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
                    return TRUE;
                }
                else if(Kapitel <= 4)
                {
                    B_ReadySpell(slf,SPL_Deathbolt,SPL_COST_Deathbolt);
                    return TRUE;
                }
                else
                {
                    B_ReadySpell(slf,SPL_Deathball,SPL_COST_Deathball);
                    return TRUE;
                };
            }
            else if(slf.aivar[AIV_SelectSpell] == 10)
            {
                slf.aivar[AIV_SelectSpell] = 11;
                dK_Mega = Hlp_Random(100);
                if(dK_Mega <= 2)
                {
                    B_ReadySpell(slf,SPL_Firerain,SPL_Cost_Firerain);
                    return TRUE;
                }
                else if(dK_Mega <= 5)
                {
                    B_ReadySpell(slf,SPL_Thunderstorm,SPL_Cost_Thunderstorm);
                    return TRUE;
                }
                else if(dK_Mega <= 10)
                {
                    B_ReadySpell(slf,SPL_LightningFlash,SPL_Cost_LightningFlash);
                    return TRUE;
                }
                else
                {
                    B_ReadySpell(slf,SPL_Firestorm,SPL_COST_Firestorm);
                    return TRUE;
                };
            }
            else if(slf.aivar[AIV_SelectSpell] == 12)
            {
                slf.aivar[AIV_SelectSpell] = 0;
            };
        };
        return TRUE;
    };
    if((slf.guild == GIL_KDF) || (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
    {
        if(Npc_HasItems(slf,ItRu_Concussionbolt) == 0)
        {
            CreateInvItems(slf,ItRu_Concussionbolt,1);
        };
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_HasItems(slf,ItRu_Deathball) == 0)
        {
            CreateInvItems(slf,ItRu_Deathball,1);
        };
        if(Npc_HasItems(slf,ItRu_FullHeal) == 0)
        {
            CreateInvItems(slf,ItRu_FullHeal,1);
        };
        if(self.attribute[ATR_HITPOINTS] < 100)
        {
            B_ReadySpell(slf,SPL_FullHeal,SPL_Cost_FullHeal);
            return TRUE;
        }
        else if(C_NpcHasAttackReasonToKill(self))
        {
            if((self.flags == NPC_FLAG_IMMORTAL) || (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(Raven)))
            {
                B_ReadySpell(slf,SPL_Deathball,SPL_COST_Deathball);
            }
            else
            {
                B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            };
            return TRUE;
        }
        else
        {
            B_ReadySpell(slf,SPL_ConcussionBolt,SPL_COST_Concussionbolt);
            return TRUE;
        };
    };
    if(slf.guild == GIL_PAL)
    {
        if(slf.fight_tactic == FAI_NAILED)
        {
            return FALSE;
        };
        if(Npc_HasItems(slf,ItRu_PalHolyBolt) == 0)
        {
            CreateInvItems(slf,ItRu_PalHolyBolt,1);
        };
        if((Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE) && C_NpcIsEvil(oth))
        {
            B_ReadySpell(slf,SPL_PalHolyBolt,SPL_Cost_PalHolyBolt);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.guild == GIL_SKELETON_MAGE)
    {
        if(Npc_HasItems(slf,ItRu_SumSkel) == 0)
        {
            CreateInvItems(slf,ItRu_SumSkel,1);
        };
        if(Npc_HasItems(slf,ItRu_IceCube) == 0)
        {
            CreateInvItems(slf,ItRu_IceCube,1);
        };
        if(Npc_HasItems(slf,ItRu_Icebolt) == 0)
        {
            CreateInvItems(slf,ItRu_Icebolt,1);
        };
        if(slf.aivar[AIV_SelectSpell] >= 6)
        {
            slf.aivar[AIV_SelectSpell] = 1;
        };
        if(!Npc_IsInState(oth,ZS_MagicFreeze) && (slf.aivar[AIV_SelectSpell] == 0))
        {
            B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);
            return TRUE;
        }
        else if(slf.aivar[AIV_SelectSpell] == 1)
        {
            B_ReadySpell(slf,SPL_SummonSkeleton,SPL_Cost_SummonSkeleton);
            return TRUE;
        }
        else
        {
            B_ReadySpell(slf,SPL_Icebolt,SPL_COST_Icebolt);
            return TRUE;
        };
    };
    if(slf.guild == GIL_ICEGOLEM)
    {
        if(Npc_HasItems(slf,ItRu_IceCube) == 0)
        {
            CreateInvItems(slf,ItRu_IceCube,1);
        };
        if((Npc_GetDistToNpc(slf,oth) < FIGHT_DIST_MELEE) || Npc_IsInState(oth,ZS_MagicFreeze))
        {
            return FALSE;
        }
        else
        {
            B_ReadySpell(slf,SPL_IceCube,SPL_Cost_IceCube);
            return TRUE;
        };
    };
    if(slf.guild == GIL_FIREGOLEM)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_SWAMP)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ROCK)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_FIRE)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_ICE)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_DRAGON_UNDEAD)
    {
        Npc_ClearAIQueue(self);
        if(Npc_HasItems(slf,ItRu_Deathball) == 0)
        {
            CreateInvItems(slf,ItRu_Deathball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_DRAGON_MAGIC)
        {
            B_ReadySpell(slf,SPL_Deathball,SPL_COST_Deathball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    if(slf.aivar[AIV_MM_REAL_ID] == ID_ORCSHAMAN)
    {
        if(Npc_HasItems(slf,ItRu_InstantFireball) == 0)
        {
            CreateInvItems(slf,ItRu_InstantFireball,1);
        };
        if(Npc_GetDistToNpc(slf,oth) > FIGHT_DIST_MELEE)
        {
            B_ReadySpell(slf,SPL_InstantFireball,SPL_COST_InstantFireball);
            return TRUE;
        }
        else
        {
            return FALSE;
        };
    };
    return FALSE;
};
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, а если вместе никиты призывать например скелета, работать будет нормально?
 

MW 7


Модостроитель
Регистрация
26 Мар 2004
Сообщения
1.992
Благодарности
967
Баллы
275
RPD, а если все рандомы и стрелки убрать и оставить просто

B_ReadySpell(slf,SPL_SummonNikita,20);
return true;

тогда вызывает?
 
Сверху Снизу