Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Buldog
Вот, писал для нашего шарда, конечно далеко от идеала, но работает, тут использованы коэффициенты для классов и для субрасс. Учтена смерть мобов от ловушек, за идею спасибо HitmanXXX. В партии экспа распределяется в зависимости от лвла чаров, которые были рядом с убитым мобом + штрафы за большой разброс по лвлам, для защиты от нубокача.

Состоит из 2х скриптов, инклюд:

inc_xpsystem_nd
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
//*******************************************//
//**********Modified 20.04.2005**************//
//*******************************************//
///////////////////////////////////////////////

//Classes coefficients
const float FIGHTER_COEFFICIENT          = 1.5;
const float ARCANE_ARCHER_COEFFICIENT    = 0.9;
const float ASSASSIN_COEFFICIENT        = 1.5;
const float BARBARIAN_COEFFICIENT        = 1.5;
const float BARD_COEFFICIENT            = 0.8;
const float BLACKGUARD_COEFFICIENT      = 1.2;
const float CLERIC_COEFFICIENT          = 0.8;
const float DIVINE_CHAMPION_COEFFICIENT  = 0.9;
const float DRAGON_DISCIPLE_COEFFICIENT  = 0.9;
const float DRUID_COEFFICIENT            = 1.4;
const float DWARVEN_DEFENDER_COEFFICIENT = 1.3;
const float HARPER_COEFFICIENT          = 2.0;
const float MONK_COEFFICIENT            = 1.2;
const float PALADIN_COEFFICIENT          = 0.8;
const float PALE_MASTER_COEFFICIENT      = 0.8;
const float RANGER_COEFFICIENT          = 1.5;
const float ROGUE_COEFFICIENT            = 1.4;
const float SHADOWDANCER_COEFFICIENT    = 1.2;
const float SHIFTER_COEFFICIENT          = 1.3;
const float SORCERER_COEFFICIENT        = 0.4;
const float WEAPON_MASTER_COEFFICIENT    = 0.9;
const float WIZARD_COEFFICIENT          = 0.5;

//Subrace coefficients
const int AIR_GENASI_COEFFICIENT          = 1;
const int EARTH_GENASI_COEFFICIENT        = 1;
const int WATER_GENASI_COEFFICIENT        = 1;
const int FIRE_GENASI_COEFFICIENT          = 1;
const int CELESTIAL_COEFFICIENT            = 8;
const int FIENDISH_COEFFICIENT            = 8;
const int HALF_CELESTIAL_COEFFICIENT      = 7;
const int HALF_FIEND_COEFFICIENT          = 7;
const int HALF_DRAGON_COEFFICIENT          = 8;
const int AASIMAR_COEFFICIENT              = 1;
const int TIEFLING_COEFFICIENT            = 1;
const int GHOSTWISE_HALFLING_COEFFICIENT  = 1;
const int LIGHTFOOT_HALFLING_COEFFICIENT  = 1;
const int STRONGHEART_HALFLING_COEFFICIENT = 1;
const int GOLD_DWARF_COEFFICIENT          = 1;
const int SHIELD_DWARF_COEFFICIENT        = 1;
const int DUERGAR_COEFFICIENT              = 2;
const int DROW_COEFFICIENT                = 2;
const int WILD_ELF_COEFFICIENT            = 1;
const int MOON_ELF_COEFFICIENT            = 1;
const int SUN_ELF_COEFFICIENT              = 1;
const int WOOD_ELF_COEFFICIENT            = 1;
const int ROCK_GNOME_COEFFICIENT          = 1;
const int SVIRFNEBLIN_COEFFICIENT          = 3;

//Calculate XP bonus.
int BonusCalculation(object oPC, object oCreature=OBJECT_SELF);

//Return class coefficient for calculate XP.
float ClassCoefficient(object oPC);

//Return oPC level with subrace coefficient for calculate XP.
int LevelWithSubrace(object oPC);

//Calculate XP bonus if killer is trap.
int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF);

float ClassCoefficient(object oPC)
{
    int nClass, nPClass, nPLC = 0 ,nLC = 0, n;

    float fCoeff = 0.0;

    for(n = 1; n <= 3; n++)
    {
        nClass = GetClassByPosition(n, oPC);
        nLC = GetLevelByClass(nClass, oPC);
        if(nLC > nPLC) { nPClass = nClass; nPLC = nLC; }

        if(nPClass == CLASS_TYPE_BARBARIAN)        fCoeff = BARBARIAN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_BARD)            fCoeff = BARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_CLERIC)          fCoeff = CLERIC_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DRUID)            fCoeff = DRUID_COEFFICIENT;
        if(nPClass == CLASS_TYPE_FIGHTER)          fCoeff = FIGHTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_MONK)            fCoeff = MONK_COEFFICIENT;
        if(nPClass == CLASS_TYPE_PALADIN)          fCoeff = PALADIN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_RANGER)          fCoeff = RANGER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ROGUE)            fCoeff = ROGUE_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SORCERER)        fCoeff = SORCERER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_WIZARD)          fCoeff = WIZARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ARCANE_ARCHER)    fCoeff = ARCANE_ARCHER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_ASSASSIN)        fCoeff = ASSASSIN_COEFFICIENT;
        if(nPClass == CLASS_TYPE_BLACKGUARD)      fCoeff = BLACKGUARD_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DIVINE_CHAMPION)  fCoeff = DIVINE_CHAMPION_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DRAGON_DISCIPLE)  fCoeff = DRAGON_DISCIPLE_COEFFICIENT;
        if(nPClass == CLASS_TYPE_DWARVEN_DEFENDER) fCoeff = DWARVEN_DEFENDER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_HARPER)          fCoeff = HARPER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_PALE_MASTER)      fCoeff = PALE_MASTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SHADOWDANCER)    fCoeff = SHADOWDANCER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_SHIFTER)          fCoeff = SHIFTER_COEFFICIENT;
        if(nPClass == CLASS_TYPE_WEAPON_MASTER)    fCoeff = WEAPON_MASTER_COEFFICIENT;
    }

    //SendMessageToPC(oPC, "Class coefficient: " + FloatToString(fCoeff));
    return fCoeff;
}

int LevelWithSubrace(object oPC)
{
    int nPCRace = GetRacialType(oPC);
    int nLvl = GetHitDice(oPC);

    string sPCSubrace = GetStringUpperCase(GetSubRace(oPC));

    if(sPCSubrace == "") return nLvl;

    switch(nPCRace)
    {  /*
        case RACIAL_TYPE_ALL:
            if(TestStringAgainstPattern("**AIR**", sPCSubrace))            nLvl = nLvl + AIR_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**EARTH**", sPCSubrace))          nLvl = nLvl + EARTH_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**WATER**", sPCSubrace))          nLvl = nLvl + WATER_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**FIRE**", sPCSubrace))          nLvl = nLvl + FIRE_GENASI_COEFFICIENT;
            if(TestStringAgainstPattern("**CELESTIAL**", sPCSubrace))      nLvl = nLvl + CELESTIAL_COEFFICIENT;
            if(TestStringAgainstPattern("**FIENDISH**", sPCSubrace))      nLvl = nLvl + FIENDISH_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-CELESTIAL**", sPCSubrace)) nLvl = nLvl + HALF_CELESTIAL_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-FIEND**", sPCSubrace)||
              TestStringAgainstPattern("**FIEND**", sPCSubrace))          nLvl = nLvl + HALF_FIEND_COEFFICIENT;
            if(TestStringAgainstPattern("**HALF-DRAGON**", sPCSubrace)||
              TestStringAgainstPattern("**DRAGON**", sPCSubrace))        nLvl = nLvl + HALF_DRAGON_COEFFICIENT;
            break;*/

        case RACIAL_TYPE_HUMAN:
            if(TestStringAgainstPattern("**AASIMAR**", sPCSubrace))        nLvl = nLvl + AASIMAR_COEFFICIENT;
            if(TestStringAgainstPattern("**TIEFLING**", sPCSubrace))      nLvl = nLvl + TIEFLING_COEFFICIENT;
            break;
        case RACIAL_TYPE_HALFORC:
            break;
        case RACIAL_TYPE_HALFELF:
            break;
        case RACIAL_TYPE_HALFLING:
            if(TestStringAgainstPattern("**GHOSTWISE**", sPCSubrace))      nLvl = nLvl + GHOSTWISE_HALFLING_COEFFICIENT;
            if(TestStringAgainstPattern("**LIGHTFOOT**", sPCSubrace))      nLvl = nLvl + LIGHTFOOT_HALFLING_COEFFICIENT;
            if(TestStringAgainstPattern("**STRONGHEART**", sPCSubrace))    nLvl = nLvl + STRONGHEART_HALFLING_COEFFICIENT;
            break;
        case RACIAL_TYPE_DWARF:
            if(TestStringAgainstPattern("**GOLD**", sPCSubrace))          nLvl = nLvl + GOLD_DWARF_COEFFICIENT;
            if(TestStringAgainstPattern("**SHIELD**", sPCSubrace))        nLvl = nLvl + SHIELD_DWARF_COEFFICIENT;
            if(TestStringAgainstPattern("**GRAY**", sPCSubrace) ||
              TestStringAgainstPattern("**DUERGAR**", sPCSubrace))        nLvl = nLvl + DUERGAR_COEFFICIENT;
            break;
        case RACIAL_TYPE_ELF:
            if(TestStringAgainstPattern("**DROW**", sPCSubrace) ||
              TestStringAgainstPattern("**DARK**", sPCSubrace))          nLvl = nLvl + DROW_COEFFICIENT;
            if(TestStringAgainstPattern("**WILD**", sPCSubrace))          nLvl = nLvl + WILD_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**MOON**", sPCSubrace))          nLvl = nLvl + MOON_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**SUN**", sPCSubrace))            nLvl = nLvl + SUN_ELF_COEFFICIENT;
            if(TestStringAgainstPattern("**WOOD**", sPCSubrace))          nLvl = nLvl + WOOD_ELF_COEFFICIENT;
            break;
        case RACIAL_TYPE_GNOME:
            if(TestStringAgainstPattern("**ROCK**", sPCSubrace))          nLvl = nLvl + ROCK_GNOME_COEFFICIENT;
            if(TestStringAgainstPattern("**DEEP**", sPCSubrace) ||
              TestStringAgainstPattern("**SVIRFNEBLIN**", sPCSubrace))    nLvl = nLvl + SVIRFNEBLIN_COEFFICIENT;
            break;
    }
    //SendMessageToPC(oPC, "Subrace coefficient: " + IntToString(nLvl));
    return nLvl;
}

int BonusCalculation(object oPC, object oCreature=OBJECT_SELF)
{
    object oPartyMember = GetFirstFactionMember(oPC, FALSE);
    object oPCArea, oCArea = GetArea(oCreature);

    int nLvl, nDiff, nMaxLvl = 0, nPartyXP;
    int i = 0, j = 0, k, l = 0;
    int nLvlCreature = GetHitDice(oCreature);

    float fCRCreature = GetChallengeRating(oCreature);
    float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5;
    float fPartyXP, fXPMod = 7.0f;

    while(GetIsObjectValid(oPartyMember))
    {
        nLvl = LevelWithSubrace(oPartyMember);

        if(!GetIsPC(oPartyMember) && !GetIsDM(oPartyMember)) nLvl = GetHitDice(oPartyMember);

        oPCArea = GetArea(oPartyMember);
        if(oCArea == oPCArea && GetDistanceBetween(oPartyMember, oCreature) <= 35.0f &&
          !GetIsDM(oPartyMember) && GetCurrentHitPoints(oPartyMember) > 0)
        {
            if(GetIsPC(oPartyMember)) l++;
            if(nLvl > nMaxLvl && GetIsPC(oPartyMember)) nMaxLvl = nLvl;
        }
        oPartyMember = GetNextFactionMember(oPC, FALSE);
    }

    fDiff = fDiff - IntToFloat(nMaxLvl);

    nDiff = FloatToInt(fDiff);
    if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1;
    if (nDiff > 12) nDiff = 12;
    if (nDiff < -6) nDiff = -6;

    for (k = -6; k <= nDiff; k++)
    {
        j++;
        fPartyXP = fPartyXP + fXPMod * IntToFloat(j);
    }

    if(l > 1) fPartyXP = fPartyXP * (1.2 * IntToFloat(l));

    //SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));

    return FloatToInt(fPartyXP);
}

int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF)
{
    int nLvl = LevelWithSubrace(oPC), nDiff, k, j;
    int nLvlCreature = GetHitDice(oCreature);

    float fCRCreature = GetChallengeRating(oCreature);
    float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5;
    float fXPMod = 7.0f, fXP;

    fDiff = fDiff - IntToFloat(nLvl);

    nDiff = FloatToInt(fDiff);
    if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1;
    if (nDiff > 12) nDiff = 12;
    if (nDiff < -6) nDiff = -6;

    for (k = -6; k <= nDiff; k++)
    {
        j++;
        fXP = fXP + fXPMod * IntToFloat(j);
    }

    //SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));

    return FloatToInt(fXP);
}

//void main(){}


И основной скрипт, который раздает экспу:

nd_applyxp
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
//*******************************************//
//**********Modified 20.04.2005**************//
//*******************************************//
///////////////////////////////////////////////

#include "inc_xpsystem_nd"
#include "nd_textcolor_inc"

int GetXPByLevel(int nLevel)
{
    return (((nLevel - 1) * nLevel) / 2) * 1000;
}

object CheckKiller(object oKiller)
{
    //SendMessageToPC(oKiller, "Checking Monster Killer...");
    if (!GetIsPC(oKiller))
    {
        if (GetObjectType(oKiller) == OBJECT_TYPE_CREATURE) oKiller = GetMaster(oKiller);
        else
        {
            oKiller = GetTrapCreator(oKiller);
            SetLocalInt(oKiller, "TrapKiller", 1);
            //SendMessageToPC(oKiller, "Finded Trap Master!");
        }
    }
    if (GetIsPC(oKiller) && !GetIsDM(oKiller)) return oKiller;
    return OBJECT_INVALID;
}

void main()
{
    object oPC = GetLastKiller();

    oPC = CheckKiller(oPC);

    if(oPC == OBJECT_INVALID) return;

    if(GetIsDM(oPC)) return;

    object oCreature = OBJECT_SELF;
    object oParty, oPArea, oCArea = GetArea(oCreature);

    int i = 0, nPC = 0, nXP, nNewXP, nLevel, nPLevel = 0, nPCPLvl = 0, nAPLvl = 0;
    int nDelta;
    int nBonusXP = BonusCalculation(oPC, oCreature);
    int nMinXP = 10, nMaxXP = 1000;

    float fClassCoeff, fNewXP;

    if(GetLocalInt(oPC, "TrapKiller") == 1)
    {
        nBonusXP = TrapBonusCalkulation(oPC, oCreature);
        nNewXP = nBonusXP;

        if(nNewXP < nMinXP) nNewXP = nMinXP;
        if(nNewXP > nMaxXP) nNewXP = nMaxXP;

        //SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));

        fClassCoeff = ClassCoefficient(oParty);
        fNewXP = IntToFloat(nNewXP) * fClassCoeff;

        if(GetXP(oPC) - GetXPByLevel(GetHitDice(oPC) + 1) > 0 && GetHitDice(oPC) < 40)
        {
            fNewXP = 0.0;
            SendMessageToPC(oParty, "You must to level up before getting new expierence points.");
        }

        //SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP));
        GiveXPToCreature(oPC, FloatToInt(fNewXP));
        SendMessageToPC(oPC, C_LBLUE2 +  GetName(oPC) + C_END + C_ORANGE + " óáèë " + GetName(oCreature) + C_END);
        DeleteLocalInt(oPC, "TrapKiller");
        return;
    }

    oParty = GetFirstFactionMember(oPC, FALSE);
    while(GetIsObjectValid(oParty))
    {
        nLevel = LevelWithSubrace(oParty);

        if(!GetIsPC(oParty) && !GetIsDM(oParty)) nLevel = GetHitDice(oParty);

        //SendMessageToPC(oParty, "Your level with subrace: " + IntToString(nLevel));

        oPArea = GetArea(oParty);

        if(oCArea == oPArea && GetDistanceBetween(oParty, oCreature) <= 35.0f &&
          !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0)
        {
            i++;
            if(GetIsPC(oParty) && !GetIsDM(oParty))
            {
                nPCPLvl = nPCPLvl + nLevel;
                nPC++;
            }
            nPLevel = nPLevel + nLevel;
            //SendMessageToPC(oParty, "Party level with your: " + IntToString(nPLevel) +
            //                        ", i: " + IntToString(i));
        }
        oParty = GetNextFactionMember(oPC, FALSE);
    }

    nAPLvl = nPCPLvl/nPC;

    oParty = GetFirstFactionMember(oPC, FALSE);
    while(GetIsObjectValid(oParty))
    {
        nLevel = LevelWithSubrace(oParty);
        oPArea = GetArea(oParty);

        if(oPArea == oCArea && GetDistanceBetween(oParty, oCreature) <= 35.0f &&
          GetIsPC(oParty) && !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0)
        {
            nXP = GetXP(oParty);

            if(i > 1)
            {
                nNewXP = nBonusXP / nPLevel * nLevel;
            }
            else { nNewXP = nBonusXP; }

            if(nNewXP < nMinXP) nNewXP = nMinXP;
            if(nNewXP > nMaxXP) nNewXP = nMaxXP;

            //SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));

            fClassCoeff = ClassCoefficient(oParty);
            fNewXP = IntToFloat(nNewXP) * fClassCoeff;

            if(GetXP(oParty) - GetXPByLevel(GetHitDice(oParty) + 1) > 0 && GetHitDice(oParty) < 40)
            {
                fNewXP = 0.0;
                SendMessageToPC(oParty, "You must to level up before getting new expierence points.");
            }

            //SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP));

            if(nAPLvl > nLevel) nDelta = (nAPLvl - nLevel)/2;
            else nDelta = (nLevel - nAPLvl)/2;

            if(nDelta < 1) nDelta = 1;

            nNewXP = FloatToInt(fNewXP)/nDelta;

            if(nNewXP < nMinXP) nNewXP = nMinXP;
            if(nNewXP > nMaxXP) nNewXP = nMaxXP;

            GiveXPToCreature(oParty, nNewXP);
        }
        oParty = GetNextFactionMember(oPC, FALSE);
    }
}


В скрипт nw_c2_default7, или как там его, помещаешь строчку:
ExecuteScript("nd_applyxp", OBJECT_SELF);
А еще, маленький инклюдик для расскраски сообщений, идея _каа_, но сам инклюдик писал я сам smile.gif

nd_textcolor_inc
Neverwinter Script Source
///////////////////////////////////////////////
//*******************************************//
//***********Created by Buldog***************//
//*******************************************//
///////////////////////////////////////////////

const string C_WHITE  = "<cþþþ>";
const string C_YELLOW = "<cþþ >";
const string C_RED    = "<cþ  >";
const string C_BLUE1  = "<c  þ>";
const string C_BLUE2  = "<c zþ>";
const string C_LBLUE1 = "<c þþ>";
const string C_LBLUE2 = "<czþþ>";
const string C_GREEN  = "<c þ >";
const string C_LILAC1 = "<cþ þ>";
const string C_LILAC2 = "<czzþ>";
const string C_ORANGE = "<cþz >";
const string C_VIOLET = "<cz þ>";
const string C_END    = "</c>";

//void main(){}
Лито
Buldog, ты даже не представляешь, как ты мне помог yahoo.gif

И спасибки за оперативность good.gif
Добавлено в [mergetime]1114017506[/mergetime]
Ну конечно же появилось несколько проблем this.gif

1. нужно ли раскомментировать в инклюдах
Neverwinter Script Source
//void main(){}

Если нет, то у меня не получается их скомпилить.
2.В скрипте раздающем экспу, компилятор просит меня "Дублировать выполнение функции(main)"
вобщем тоже не состовляется sad.gif
Buldog
Если надо откомпилить, то раскоментируй, откомпилируй, а потом снова закоментируй, тока не забудь сохранить вариант с закоментированым майном, в инклюдах функции void main() быть не должно, потому они в инклюдах и закоментированы, из за етого и ошибка в основном скрипте.
Лито
Buldog все пасиба, работает smile.gif
Добавлено в [mergetime]1114089959[/mergetime]
Раз уж пошел разговор о системе опыта, может есть у кого нибудь и система лута? smile.gif
Нет нет, я не настолько ленивый, я написал собственную, но к сожелению она очень большая(2000 строк в скрипте, а всего их 3) this.gif
Так что,для меня этот вопрос остается открытым dntknw.gif
Алексашка
Сделал себе систему крафта.(Содрал из Левора biggrin.gif ) 2da таблицу сделал свою, скрипт содрал у Baalа biggrin.gif Надеюсь божественная аватара не будет сильно гневаться на скромного священника. yes.gif У самого ума не хватит такой скрипт написать. Все получилось нормально. Только вместо названий вещей и компонентов пишуться ярлыки. (В леворе кстати такое имело место быть. С вещами имеющими два тега). Подскажите из-за чего такое происходит.
Lex
там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле?
(просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так)
Алексашка
QUOTE (Lex @ Apr 23 2005, 06:27)
там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле?
(просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так)

yahoo.gif Спасибо Lex! Я просто не поставил точку WP, в которой вещи креатятся и дестроятся. Все работает, все ОК! Спасибо за теорию. Мне ее временами катастрофически не хватает. yes.gif Я гуманитарий, а не программист. (т.е. программер yes.gif )
Лито
Появилась идея сделать что-то вроде фильтра на нецензурные выражения.
Смысл такой: когда игрок выражается biggrin.gif то получает штраф и предупреждение автоматически. Должен быть какой-то словарь, куда надо вписать все bad.gif .Вот только не знаю с какого конца начать. Надеюсь, что поможете yes.gif
Tiger Greyhawk
to Лито:
swearfilter.2da и namefilter.2da ссылка на описание значений Но это, насколько я понял Leon_PRO, будет работать только в "chatroom" (чат до игры), хотя это надо проверить. На экране у говорящего отображается, а как будет у других dntknw.gif .
Можно сделать путем отслеживания произнесенных слов (как например в "Русская версия KPBS (система банкинга и биржи) ссылка" в переводе Аваддона, см. его подпись), но это, по моему, будет только после произнесения слова. dntknw.gif т.е. можно сделать на автоматический штраф и предупреждение, но не катит как фильтр. Хотя, это все только предположения.
-fenix-




Люди как сделать полноценного оруженосца. И можно сделать, чтобы с персом бегало 2 оруженосца, а не один?


И как сделать портал, который в официальной компании и модах. Юзаешь камень призыва и тебя переносит к порталу, заходишь в портал и тебя переносит в последнее место использования камня.

Buldog
По поводу камня с возвратом. Создаешь нужный тебе предмет и даешь ему какой то тэг, при этом в предмет добавь свойство в русской версии "Только своя уникальная сила", прозьба не смеяться, по английски я понимаю плохо, поэтому использую руссифицированный тулсет, как это свойство по английски звучит я не в курсе.

В модуле в OnActivateItem помещаешь скрипт:
Neverwinter Script Source
void main()
{
    object oUser = GetItemActivator();
    object oStone = GetItemActivated();
    object oTarget = GetObjectByTag("ST_" + GetTag(oStone));

    SetLocalLocation(oUser, "ReturnLocation", GetLocation(oUser));

    AssignCommand(oUser, ClearAllActions());
    DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocation(oTarget))));
}

Далее в нужном месте создаешь вэйпоинт с тэгом ST_+тэг предмета и поблизости портал. В OnUsed портала вставляешь скрипт:
Neverwinter Script Source
void main()
{
    object oUser = GetLastUsedBy();

    AssignCommand(oUser, ClearAllActions());
    DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocalLocation(oUser, "ReturnLocation"))));
}

Сам не проверял, но должно работать smile.gif
-fenix-
Buldog спасибо, попробую.
RiPPeR
QUOTE

Neverwinter Script Source
void main()
{
    object oUser = GetItemActivator();
    object oStone = GetItemActivated();
    object oTarget = GetObjectByTag("ST_" + GetTag(oStone));

    SetLocalLocation(oUser, "ReturnLocation", GetLocation(oUser));

    AssignCommand(oUser, ClearAllActions());
    DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocation(oTarget))));
}

Дык так будет для любой активации уник повера предмета одинаковое дейтсвие, проверку тага actived предмета нужно сделать, а лучше res-ref'а.
Добавлено в [mergetime]1114706618[/mergetime]
Neverwinter Script Source
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemActivated();
   
string sResRef = GetResRef(oItem);
string sStoneResRef = "stone"; //Сюда рес-реф камня поставишь

if (sResRef == sStoneResRef)
  {
  object oTarget = GetWaypointByTag("WP_" + sStoneResRef);

  SetLocalLocation(oPC, "ReturnLocation", GetLocation(oPC));

  AssignCommand(oPC, ClearAllActions());
  DelayCommand(1.0f, AssignCommand(oPC, ActionJumpToLocation(GetLocation(oTarget))));
  }
}


При активации камня (или любого другого предмета) с заданным рес-рефом, телепортирует его к вэйпоинту с тагом: WP_+рес-реф камня. В скрипте между " " своё название подставь и все.
-fenix-
Buldog все работает спасибо!

RiPPeR - поправлю как сказал, тоже спасибо!

А про оруженосца кто знает?????????
Zik
Здравствуйте.

Подскажите пожалуйста, можно ли отключить (запретить использовать) кнопку save character, которая экспортирует персонажа в localvault и как это сделать?
-fenix-
У меня вообще оруженосец есть. Я его сделал из Томи, путем пластической операции и промывки разговора. Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел. И еще инвентарь у него от Томи остался.



Алексашка
QUOTE (-fenix- @ Apr 28 2005, 21:19)
У меня вообще оруженосец есть. Я его сделал из Томи, путем пластической операции и промывки разговора. Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел. И еще инвентарь у него от Томи остался.

Ты имеешь ввиду невозможность зайти в его инвентарь? Могу тебя порадовать, еще одним сюрпризом в будущем. Когда ты будешь повышать уровень своему"Томи" можешь ненароком остаться вообще без оруженосца biggrin.gif . Выкинь этого персонажа и сделай нового. Просто содаешь нового перса, с теми параметрами которые тебе нужны, затем заходишь в скрипты и меняешь все, стоящие там по умолчанию, на скрипты оруженосца из первого или вторго аддона. Смотря какой у тебя стоит. Создаешь ему диалог со скриптом присоединения и оруженосец готов. Скрипты по памяти не напишу, а тулсета рядом нет.
Алексашка
QUOTE (-fenix- @ Apr 28 2005, 21:19)
Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел.

Контракт прописан в диалоге в строке присоединения. biggrin.gif
Aiwan
QUOTE (Zik @ Apr 28 2005, 23:40)
Подскажите пожалуйста, можно ли отключить (запретить использовать) кнопку save character, которая экспортирует персонажа в localvault и как это сделать?

Боюсь что никак. Если только вообще запретить панель сэйва.
-fenix-
Самого оруженосца уже сам сделал. А вот за контракт ОГРОМНОЕ СПАСИБО!
Scaled
Привет всем, у меня вот такой вопрос : я вот компонентную магию делаю, заклы переписать не проблема. Вот в чем проблема, так это в том что я не знаю как она устанавливаеться, т. е. как заставить работать переписаные заклы?
Я не прошу скриптов, только алгоритм куда что вставлять biggrin.gif
Lex
Эм..там в spells.2da написано, какой скрипт какой закл обрабатывает по моему. Те если тебе надо закл поменять, то тебе эти скрипты и надо ковырять..или я что-то не догоняю?
Buldog
Все спелы обрабатыватся соответствующими скриптами, причем, что бы узнать какой скрипт какой спелл обрабатывает вовсе не обязательно лезть в spells.2da, у большинства скриптов имя совпадает с названием спела. А что бы посмотреть скрипты, просто при открытии скрипта поставь пометку, что бы показывались не только скрипты модуля, но и дефолтные скрпты НВНа.
Scaled
Не это все понятно, я про то как заставить переписаные спеллы работать.Пример, вот я переписал скрипт с молнией , добавил, скажем, компонент. Куда его надо поставить, или в каком скрипте ссылку на него сделать?
crazy.gif Замучился, порожаюсь как люди разбираються....
Лито
У самого были вопросы с компоненткой. В ту пору мне dumbo все разжевал biggrin.gif
Сейчас попробую я.
Делается все дело с помощью биотваревской системы spell-hook
Ставь на модуль переменную типа string, с именем X2_S_UD_SPELLSCRIPT. стоимость пременной = названию скрипта, в котором ты будешь дополнять спеллы.
Как поставить переменную?
Св-ва модуля -> Улучшенный(Advanced) -> переменные.
Вот пример компонентного закла.
скрипт называется m_my_spell.
Neverwinter Script Source
void main()
{
object oPC = OBJECT_SELF;
object oTarget = GetSpellTargetObject();  //в кого пуляем?
object oItem = GetSpellCastItem();  //а если кастуем с предмета?
int nSpell = GetSpellId();  //переменная, которая определяет какой именно спелл кастуется
switch (nSpell)

       {

         case SPELL_FIREBALL:  //на какие собственно спеллы компонент? В данном случае на фаэрболлы и фаэрбрэнды
         case SPELL_FIREBRAND:
         case SPELL_DELAYED_BLAST_FIREBALL:
         if (GetIsObjectValid(oItem))  //если указанные выше спеллы кастуются с предмета(амулет, свиток и т.д.). Останавливаем скрипт.
           {
           break;
           }

           if ((HasItem(oPC,"sera") == FALSE) && (GetIsDM(oPC) == FALSE))  //если у кастующего нет компонента с тэгом sera - остановить спелл.Если кастер - ДМ, забиваем на проверку
          {                                                                                            
           SetModuleOverrideSpellScriptFinished();
           SendMessageToPC(OBJECT_SELF, "У вас нет необходимых компонентов!!");
           }
      else
    {
    DestroyObject(GetItemPossessedBy(oPC,"sera")); //забираем серу
    }
    break;

скрипт называется m_my_spell.
Значит переменная на модуле будет выглядеть так:
имя: X2_S_UD_SPELLSCRIPT тип: string стоимость: m_my_spell
Scaled
Я попробую в выходные(на неделе занят black eye.gif ). Спасибо biggrin.gif
Мефистофель
Помогите пожалуйста с этим скриптом он не работает.
Neverwinter Script Source
void main()
{
object oPC = GetPCItemLastEquippedBy();
object oItem = GetPCItemLastEquipped();
if (GetTag(oItem) == "mg_it_ringghost")
  {
  effect E = EffectCutsceneGhost();
  E = EffectLinkEffects(EffectEthereal(),E);
  ApplyEffectToObject(DURATION_TYPE_PERMANENT,E,oPC);
  }
}


на onPlayerUnEquipItem()

Neverwinter Script Source
void FindAndRemoveGhostEffect(object O)
{
effect e = GetFirstEffect(O);
while (GetIsEffectValid(e))
  {
  if (GetEffectType(e) == EFFECT_TYPE_CUTSCENEGHOST)
      RemoveEffect(O,e);
  if (GetEffectType(e) == EFFECT_TYPE_ETHEREAL)
      RemoveEffect(O,e);
  e = GetNextEffect(O);
  }
void main()
{
object oPC = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
// кольцо духа
if (GetTag(oItem) == "mg_it_ringghost")
  {
  FindAndRemoveGhostEffect(oPC);
  }


и возможно ли его использовать в СоУ, если да то на какие слоты, ставить.
Добавлено в [mergetime]1115331269[/mergetime]
Ой Забыл, скрипт Lex(а).
mamuc
QUOTE
Ой Забыл, скрипт Lex(а).

то Мефистофель - это скрипт Мидгарда (если не ошибаюсь написаный каа) biggrin.gif
к нему нужно кольцо духа (тэг предмета("mg_it_ringghost") )- кустомный итем ( кстати создано это было отнюдь не для применения широкими масами простых игроков, а для весьма специальных целей), так что не рекомендую применять это как общепользовательский итем для всех играющих на шарде, ибо он дает слишком уж большую плюшку
Scaled
Лито, огромное спасибо! Попробовал с переписаным заклом фаерболла - просто сказка lol.gif
Мефистофель
Исходя, из вами сказанного я не понял одного, зачем тогда этот скрипт был выставлен, в соответствующей теме?
TwilightCount
Мефистофель, зачем тебе этот скрипт?
Этот скрипт позволяет при надетом кольце игроку проходить через других игроков
Если хочешь использовать, создай кольцо с тэгом mg_it_ringghost.

Можно ли использовать в СОУ, зависит по-мойму от патча. И вообще юзай сразу СОУ+ХТОУ.
Мефистофель
TwilightCount, блин я сюзал бы да вот незнаю от куда. Мне скрипт очень нужен я делаю Lord of Ring.
В СОУ не тех слотов куда скрипы эти ставить надо, да и Компилятор ошибку выдаёт во втором скрипте, вот и спросил чё исправить надо.
Scaled
У меня вопрос :
Я вот в переписаном спелле блесс хочу сделать проверку на класс и взависимости от него на предмет фокуса в левой руке.
Вот значит получаеться все слишком не эстетично, по обьему bad.gif
Можно ли как то, скажем, в скрипте закла, при проверке отправить на другой скрипт, на котором стоит проверка, и полученый результат использовать в скрипте закла ?
Или короче yes.gif я хочу сделать проверку класса и взависимости от него - предмета в слоте
Buldog
Выше Лито писал про компонентную магию, тебе тот же скрипт подойдет, только вместо компонентов проверяешь то, что тебе нужно.
Лито
Scaled, просто добавь в скрипте spell-hook(ну это в котором ты добавлял компоненты на фаэрболл wink.gif), case блесс.

Все это будет выглядеть примерно так:
Neverwinter Script Source
void main()
{
object oPC = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
object oItem = GetSpellCastItem();
int nSpell = GetSpellId();
switch (nSpell)

       {

         case SPELL_FIREBALL: 
         case SPELL_FIREBRAND:
         case SPELL_DELAYED_BLAST_FIREBALL:
         if (GetIsObjectValid(oItem))           
          {
           break;
           }
           if ((HasItem(oPC,"sera") == FALSE) && (GetIsDM(oPC) == FALSE)){                                                                                            
           SetModuleOverrideSpellScriptFinished();
           SendMessageToPC(OBJECT_SELF, "У вас нет необходимых компонентов!!");
           }
      else
    {
    DestroyObject(GetItemPossessedBy(oPC,"sera")); у
    }
    break;
     case SPELL_BLESS:
     //тут пишешь свою проверку smile.gif
     break;
     }


Все drag.gif
Jammed
Здравствуйте!
Меня давно мучает один вопрос, ответ на который я так и не нашел. Наверняка эта тема уже поднималась, но все-таки:

Я хочу добиться следующего эффекта:
Представьте себе, встречаете вы мирного к вам NPC, нападаете на него (через меню с правой мыши), и как только
его здоровье (NPC то есть) доходит до, к примеру, единицы, он падает на землю, его отношение к вам
становится снова нейтральным. Через нек. время он встаёт, садится отдыхать и т.п.. Однако если будучи
поверженным (лежа на земле) он будет вновь вами атакован, то умрёт окончательно с первого вашего удара (эдакое "добивание").
Buldog
Можно в OnDamage моба прописать проверку, что если жизней меньше какого то количества, то происходит все, что ты описал, но эффективней будет прописать в OnDeath, сделать, что бы НПС не умирал, а падал с 1 HP, а потом отдыхал, восстанавливался и т.д.
Scaled
Эх ступил я с вопросом, но все равно спасибо biggrin.gif
Вот еще вопрос, есть такой хороший скрипт - температура, Лито писал уже про ето
Что когда выходишь из локи он продолжает работать, как остановить его?
Приведенный там скрипт остановки не работает.
Lex
Эм... я выкладывал его поправленную версию в той теме, где с Лито про это говорили. Там все работает.
Jammed
Понимаешь, Buldog, может случиться такое, что у непися останется, допустим, 20хп, а я долбану его, к примеру, критическим на 60хп и у него сразу станет 0хп, минуя единицу.


Лито
Jammed, Разве нельзя написать проверку, чтобы если хиты становились меньше 1, существо хилилось? smile.gif
rdx
QUOTE (Jammed @ May 9 2005, 21:29)
Здравствуйте!
Меня давно мучает один вопрос, ответ на который я так и не нашел. Наверняка эта тема уже поднималась, но все-таки:

Я хочу добиться следующего эффекта:
Представьте себе, встречаете вы мирного к вам NPC, нападаете на него (через меню с правой мыши), и как только
его здоровье (NPC то есть) доходит до, к примеру, единицы, он падает на землю, его отношение к вам
становится снова нейтральным. Через нек. время он встаёт, садится отдыхать и т.п.. Однако если будучи
поверженным (лежа на земле) он будет вновь вами атакован, то умрёт окончательно с первого вашего удара (эдакое "добивание").

Посмотри вот это Subdual Damage, примерно что ты описал, но для игроков. Можно расширить и на неписей
Buldog
QUOTE (Jammed @ May 11 2005, 21:36)
Понимаешь, Buldog, может случиться такое, что у непися останется, допустим, 20хп, а я долбану его, к примеру, критическим на 60хп и у него сразу станет 0хп, минуя единицу.

Прочий внимательней мой пост, я же написал, что эффективней это сделать через не ОнДамаг, а ОнДеас, просто при смерти не убиваешь НПС, а он падает с 1 НР, правда там тогда надо пудет как то придумывать, что бы его добить можно было, но в принципе сразу он уже не помрет.
Lex
если было 20 и дамаг на 60, то сразу труп. Но событие на дамаг произойдет..так что имхо стоит его юзать и можно обработать попробовать. А может и не выйдет нифига.
ибо есть еще такой вариант, как магия смерти. В этом случае смерть не должна "откладываться" имхо
Добавлено в [mergetime]1115847072[/mergetime]
зы: сам в ближайшее время буду себе такую схему писать.
Buldog
А еще бывает Девастейт, ну это если эпики используются smile.gif Еще у монка дрожащая ладонь, смертельные сники у Ассасина, и если с заклинаниями можно бороться, прописать при провале спаса на смерть, что бы наносился дамаг какой то, то эти фиты правятся только хаками...
Scaled
Вот у меня еще вопосы:
1. Хочу сделать чтобы при попытке написания свитка, требовались компоненты: перо и свиток.
Как это сделать? в 2да лезть?
2. Как при смерти табличку респаун ор дай вызывать?интересно как в ней написать что мол нажмешь кнопку респа и потеряешь 50 хр за левел.(в табличке)
3. Вот я на форуме нашел скрипт респауна в сундуке фиксированой шмотки, как его установить? Я попробывал создать существо в закрытой локе и на ОнСпаун повесить этот скрип - не фига.
П.С.
Lex спасибо за темперературный скрипт - классная штука.
Buldog
Табличка при смерти вызывается вот этой функцией:
Neverwinter Script Source
// Spawn in the Death GUI.
// The default (as defined by BioWare) can be spawned in by PopUpGUIPanel, but
// if you want to turn off the "Respawn" or "Wait for Help" buttons, this is the
// function to use.
// - oPC
// - bRespawnButtonEnabled: if this is TRUE, the "Respawn" button will be enabled
//  on the Death GUI.
// - bWaitForHelpButtonEnabled: if this is TRUE, the "Wait For Help" button will
//  be enabled on the Death GUI.
// - nHelpStringReference
// - sHelpString
void PopUpDeathGUIPanel(object oPC, int bRespawnButtonEnabled=TRUE, int bWaitForHelpButtonEnabled=TRUE, int nHelpStringReference=0, string sHelpString="")

В OnPlayerDeath ее прописываешь, а там, где sHelpString, я так понимаю, сам ничего не писал там biggrin.gif, вписываешь нужный тебе текст.
Lex
QUOTE (Scaled @ May 12 2005, 12:45)
Lex спасибо за темперературный скрипт - классная штука.

это скрипт Milez'а, там же написано. Я просто со старого форума его перенес. smile.gif
Лито
Может где есть,но я не нашел. такой баг: когда выходишь в полиморфе, а затем снова заходишь на сервер, кол-во хит-поинтов не сокращается, а так и остается в размере полиморфа. Ну можно еще 10 раз перекинутся и набить себе до 10к хитов.
Вопрос: Кто знает как лечится? black eye.gif
Ответить знающих прошу срочно, народ уже эксплуатирует, а самому разбиратся долго sad.gif
Buldog
Вот, одновременно и HP вернет и фиксит баг с перезаходом в полиморфе, когда у сорка становится много много спелов после перезахода в полиморфе smile.gif
Neverwinter Script Source
void RemoveSpells(object oPC)
{
    int i, k, l;
    for(i = 0; i <= 805; i++)
    {
        k = GetHasSpell(i, oPC);
        if(k)
        {
            for(l = 0; l < k; l++)
            {
                DecrementRemainingSpellUses(oPC, i);
            }
        }
    }
}

Neverwinter Script Source
int i;
    int nCHP = GetCurrentHitPoints(oPC);
    int nMHP = GetMaxHitPoints(oPC);
    effect eDmg = EffectDamage(nCHP - nMHP);

    effect eEffect = GetFirstEffect(oPC);
    while(GetIsEffectValid(eEffect))
    {
        if(GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH)
        {
            RemoveEffect(oPC, eEffect);
            if(nCHP > nMHP) ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oPC);
            DelayCommand(1.0f, RemoveSpells(oPC));
            SendMessageToPC(oPC, "Вот тебе за багоюз!");
            break;
        }
        eEffect = GetNextEffect(oPC);
    }

Это в OnClientEnter модуля.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.