Raurin Forums

Raurin Forums (http://raurin.ru/forum/index.php)
-   Скриптинг, маппинг и диалогинг :) (http://raurin.ru/forum/forumdisplay.php?f=55)
-   -   Общие вопросы. (http://raurin.ru/forum/showthread.php?t=1381)

Elisar Kronvell 20.11.2007 19:26

Re: Вопрос: OnPlayerDying
 
Necrosis
Я не про это, я про отступы.

Так. Скрипты написал. Логически - должны работать. На практике - событие модуля OnHeartbeat не выполняется в принципе. Ни разу. Вот скрипты:

ek_lib01
Код:

string GetDyingString (object oCharacter)
{
        string sDyingString = "";
        int iGender = GetGender(oCharacter);
        int iAlignmentGE = GetAlignmentGoodEvil(oCharacter);
        int iAlignmentLC = GetAlignmentLawChaos(oCharacter);
               
        if (iGender == GENDER_MALE)
        {
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "Вот и все... я... ухожу. Прощайте, друзья, прощайте...";
                }
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "Это конец.";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "Аргх! Проклятые твари! *кашель* Ну давайте! Подходите! Я перегрызу вам глотки!";
                }
        }
        if (iGender == GENDER_FEMALE)
        {
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_GOOD && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_NEUTRAL && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_LAWFUL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_NEUTRAL)
                {
                        sDyingString = "";
                }
                if (iAlignmentGE == ALIGNMENT_EVIL && iAlignmentLC == ALIGNMENT_CHAOTIC)
                {
                        sDyingString = "";
                }
        }
        return sDyingString;
}

ek_module_OnPlayerDying
Код:

#include "ek_lib01"

void main()
{
        object oPC = GetLastPlayerDying();
       
        AssignCommand(oPC, ClearAllActions());
        AssignCommand(oPC, SpeakString(GetDyingString(oPC)));
        AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_KNEELDEATH));
       
        SetLocalInt(oPC, "iDying", 1);       
}

ek_module_OnHeartbeat
Код:

void main()
{
object oPC = OBJECT_SELF;
//==========================
if (GetLocalInt(oPC, "iDying") == 1)
{
        int iDamage = d3(2) - (GetAbilityScore(oPC, ABILITY_CONSTITUTION)-10)/2;
        effect eDeath = EffectDeath(TRUE, TRUE, TRUE, TRUE);
        effect eDamageOrHeal;
        string sDamageOrHeal;
       
        if(WillSave(oPC, d12()) == 0)
        {
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPC);
        }
       
        if(iDamage < 0)
        {
                iDamage = -iDamage;
                eDamageOrHeal = EffectHeal(iDamage);
                sDamageOrHeal = "*кашель*";
        }
        if(iDamage >= 0)
        {
                eDamageOrHeal = EffectDamage(iDamage, DAMAGE_TYPE_ALL, DAMAGE_POWER_NORMAL, TRUE);
                sDamageOrHeal = "*стон*";
        }
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamageOrHeal, oPC);
        AssignCommand(oPC, SpeakString(sDamageOrHeal));
       
        if(GetCurrentHitPoints(oPC) <= -10)
        {
                ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPC);
                FloatingTextStringOnCreature ("Смерть", oPC);
        }
}
//==========================
}

Ошибка в скрипте? Где-то в основе из основ? Или его надо хоть раз запустить извне?

Mozon 20.11.2007 20:53

Re: Вопрос: OnPlayerDying
 
Многа букаф! Ничего не понятно!:iq:

Elisar Kronvell 20.11.2007 21:40

Re: Вопрос: OnPlayerDying
 
Mozon
Когда здоровье персонажа опускается до 0 или ниже переменной "iDying", висящей на нем, присваивается значение 1.

Каждые 6 секунд запускается скрипт, проверяющий - нет ли кого с переменной "iDying" равной 1. Но либо скрипт не работает вовсе, либо Planetouched ошибся и OBJECT_SELF возвращает отнюдь не игрока, т.к. в этом случае не получается даже вывести FloatStringOnCharacter с текстом "Работа скрипта началась" над oPC, где oPC есть OBJECT_SELF.

P.S. Странно, старался писать как можно более понятно и аккуратно. Только комментить не стал, потому-что еще не понял - что надо комментить. Признайся - хоть читал? Или просто просмотрел по диагонале? ^_-

Moonk 21.11.2007 07:01

Re: Вопрос: OnPlayerDying
 
Mozon флудер
не обращай внимания


если проблема работать с -ХП, может персонажу добавлять 10 ХП?
и все, что вы хотите сделать, производить в интервале от 0 до 10, а не от - 10 до 0

Nuligen 21.11.2007 07:30

Re: Вопрос: OnPlayerDying
 
2Moonk проблема что на визарда 1-го левела этот скрипт тоже распростаняется, а у него всего 4 хп

Moonk 21.11.2007 07:45

Re: Вопрос: OnPlayerDying
 
а в чем проблема?
10 добавочных ХП не юзабельны

маг (а вообще кто угодно, но для примера возьмем мага) с 4 мя ХП
умирает при получениии урона 4 и более
плюсуем ему 10 ХП
итого 14 ХП, но делать проверку:
если ХП <= 10, то "смерть" с запуском скрипта, где ХП минусуются проверки идут какие-нибудь и т.д. (хз что они тут вообще мутят ^^ =) )

Elisar Kronvell 21.11.2007 07:45

Re: Вопрос: OnPlayerDying
 
Проблема в том, что событие Module_OnHeartbeat не обрабатывается впринципе или обрабатывается, но OBJECT_SELF != Текущий персонаж игрока

А по поводу ХП - это вобще не проблема, т.к. вместо хп можно юзать переменную. Проблема описана выше.

Elisar Kronvell 21.11.2007 08:10

Re: Вопрос: OnPlayerDying
 
Заменил OBJECT_SELF на GetFirstPC - заработало. Значит OBJECT_SELF возвращает не персонажа, а нечто иное. Внимание вопрос - что делать?

Moonk 21.11.2007 08:36

Re: Вопрос: OnPlayerDying
 
мне еще подруге математику решать
так что вникая в строки скрипта мозг насиловать не собираюсь
=)
но
на сервере реализовано сохранение персонажа
вот и сделать "предсмертный скрипт" аналогичным.

Planetouched 21.11.2007 10:32

Re: Вопрос: OnPlayerDying
 
возможно OBJECT_SELF указатель на модуль.. тогда используй механизм GetFirstPC/GetNextPC


Часовой пояс GMT, время: 01:01.

Powered by vBulletin Version R.I.P., Copyright ©2000-2024, Jelsoft Enterprises Ltd.