Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты: Все вопросы
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights 2 Obsidian Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7
Sugo77
Нет Vanes ты маленько меня недопонял вот последние тобой написаные 2 скрипта куда вставлять в свойства мобов или в свойства локации? и в какие строчки?

а так я разообрался где их имя изменять у меня уже 2 скрипта твои внесены в он Enter и on Exit
под именами: vr_spawn_general 1 и vr_spawn_general 2
но а последнии тобой изобритеные 2 скрита куды вставляются?

Ну тоесть Vanes я шас имею у себя все твои 4 скрипта в тулсете под именами

vr_spawn_general 1
vr_spawn_general 2
vr_spawn_general 3
vr_spawn_general 4

Дак вот с первыми двумя все ясно в строку On Enter Script вставляем vr_spawn_general 1
В строку арейных свойств On Exit Script вставляем vr_spawn_general 2
а куда вставляем оставшиеся два скрипта?vr_spawn_general 3
vr_spawn_general 4

И ето ешо(а вот в етой твоей фразе нет ошибки?"в *теге моба* указывается либо тег моба, илбо тег группы для спавна"
Может имелось ввиду в теге поинта?
ну тоесть вот так:"в *теге поинта* указывается либо тег моба, илбо тег группы для спавна"

Эх пока никак((

А через сколько у тебя запргормаирован респ?

А еше а может мне что то надо изменить в скриптах твоих а то всетаки у меня не валидор модуль а по другому называется? или гдето закралась ошибка или я что то делаю не так(

Проверь плиз ,и раскажи всеже куда еше то 2 скрипта последних вставляем?
Vanes
Цитата
а куда вставляем оставшиеся два скрипта?vr_spawn_general 3
vr_spawn_general 4

первый скрипт должен называться vr_spawn_general, иначе он просто не будет запускаться из энтера локи...
второй скрипт - это инклуд для первого и называется vr_spawn_groups...
вставлять их никуда не надо - эти скрипты либо запускаются из других скриптов, либо являются инклудами...

Цитата
Может имелось ввиду в теге поинта?

уже исправил

Цитата
А через сколько у тебя запргормаирован респ?

задержка респа указывается для каждого конкретного спавна-вейпоинта отдельно, в его имени
т.е. если имя вейпоинта SP_SG0_SD5_SN1_SR5_END и тег vr_goblin
то моб с тегом vr_goblin в количестве одной штуки будет появляться на расстоянии 5 от вейпоинта каждые 5*60 секунд...
зы я кстати ошибся в описании имени спавнпоинта, т.к. по памяти писал... щас поправил...

да особо то и менять не надо ничего, кроме разве что названий инклудов, тегов мобов в таблице групп...
а так же тега vr_dmhelper - на этой криче у меня идет счетчик времени...
Sugo77
Хм тоесть надо изменить все нахвания скриттов не генерал 1-2-3-4
а генерал просто ето первый второй будет спавн гроуп по порядку а 3 и 4 ый вообше непонял(
так и непонял что с ними делаем))(
и как ето вставлять их никуда ненадо они что автоматически запустятся ?даже если просто будут сушествовать в тулсете(

млин мнеб попроше обьяснять что куда на уровне ламера)а не мастера)(



кстати 2 скритпа с одинаковым именем никак неможетсушествовать тулсет недает их сохранять тогда(
значит каждый твой скритп должен по разному называтся первый и второй уже понял а 3-4 ?

может череез асю пообшаемся на ету тему?)а то весь форум зафлудим сколко непытаюс никак немогу добится респа уже неделю((

просто я обсолютно запутался ответы то несовсем развернутые( а загадками понятными тока мастерам а не новичкам,вот чтоо такое инклуды? я вобше хз(
мнеб все попрастому обьяснить открываем ето вставляем то и тд(
Lex
Цитата(Sugo77 @ May 4 2007, 13:51) [snapback]107767[/snapback]
вот чтоо такое инклуды?

вот это:
Neverwinter Script Source
#include "vr_spawn_groups"
#include "vr_config"

присоединяемые к скрипту библиотеки с дополнительными функциями (такие библиотеки можно самому писать)
Vanes
Цитата
а генерал просто ето первый второй будет спавн гроуп по порядку а 3 и 4 ый вообше непонял(

первый и второй - это не скрипты, а части скриптов, которые тебе нужно вставить в свои скрипты энтера и экзита локи... если таковых нет, то создай 2 скрипта area_enter и area_exit и туда эти части вставь...
третий (который самый большой) - это как раз таки vns_spawn_general
ну и последний - vns_spawn_groups
Sugo77
Неа все еше никак(
Можно с тобой через асю пообшатся там будет проше вживую ?
потом если что удолиш меня

Собственно что я делал вот что содал с нуля 2 скрипта с названиями: area_enter и area_exit
Вот как выглядят первый:area_enter :

Neverwinter Script Source
// area_enter

void main()
{
    object oArea = GetArea(OBJECT_SELF);
    object oPC = GetEnteringObject();
    if(GetIsDM(oPC)) return;
    if(GetIsPC(oPC)){
        int nCount = GetLocalInt(oArea, "nPlayerCount");
        nCount++;
        SetLocalInt(oArea, "nPlayerCount", nCount);
        if(GetLocalInt(oArea, "bNeedSpawn")==FALSE){
            SetLocalInt(oArea, "bNeedSpawn", TRUE);
            if(GetLocalInt(oArea, "bNeedClear")==FALSE){
                ExecuteScript("vr_spawn_general", oArea);
            }else{
                SetLocalInt(oArea, "bNeedClear", FALSE);
            }
        }
    }
}

// SPAWN SYSTEM
// for NWN Shard "Validor 2"
// main script
/* Scripted by Vanes */

#include "vr_spawn_groups"
#include "vr_config"

void CheckWaypoints(object oArea);
void Spawn(object oWP);
void StoreSpawns(object oArea);
void ClearLocationFromCreatures(object oArea);


void main() // psevdo heartbeat
{
    object oArea = OBJECT_SELF;

    if(GetLocalInt(oArea, "bNeedSpawn")==TRUE){
        CheckWaypoints(oArea);
        //SendMessageToPC(GetFirstPC(), "attemting to spawn... "+ GetName(oArea));
        AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        return;
    }
    if(GetLocalInt(oArea, "bNeedClear")==TRUE){
        //SendMessageToPC(GetFirstPC(), "attemting to clear... "+ GetName(oArea));
        //SendMessageToPC(GetFirstPC(), "nLastPCExitTime = " + IntToString(GetLocalInt(oArea, "nLastPCExitTime")));
        //SendMessageToPC(GetFirstPC(), "nCurrentTime = " + IntToString(GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")));
        if((GetLocalInt(oArea, "nLastPCExitTime")+SPAWN_CLEAR_LOC_DELAY)<=GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")){
            //SendMessageToPC(GetFirstPC(), "clearing... "+ GetName(oArea));
            ClearLocationFromCreatures(oArea);
            SetLocalInt(oArea, "bNeedClear", FALSE);
        }else{
            AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        }
        return;
    }
}

void CheckWaypoints(object oArea) // check for WP status (waiting for delay end,
                                  // waiting for children death, need pawn now)
{
    if(GetLocalInt(oArea, "bSpawnsStored")==FALSE){
        StoreSpawns(oArea);
        SetLocalInt(oArea, "bSpawnsStored", TRUE);
    }
    object oWP;
    string sName;
    int nPos, nSpawnDelay, nStartDelay, nCurrentTime;
    int i;
    int nSpawnersCount = GetLocalInt(oArea, "nSpawnersCount");
    //SendMessageToPC(GetFirstPC(), "nSpawnersCount="+IntToString(nSpawnersCount));
    for(i=1; i<=nSpawnersCount; i++){
        oWP = GetLocalObject(oArea, "Spawner"+IntToString(i));
        sName = GetName(oWP);
        //SendMessageToPC(GetFirstPC(), "checking WP " + sName);
        if(GetLocalInt(oWP, "nSpawnDelay")==0){ // first check after module started
            nPos = FindSubString(sName, "SG");
            nSpawnDelay = StringToInt(GetSubString(sName, 5, nPos-6))*60;
            //int nTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //if(nTime!=0){
            //SetLocalInt(oWP, "nStartDelay", 60);
            SetLocalInt(oWP, "nSpawnDelay", nSpawnDelay);
            //}
            Spawn(oWP);
        }
        if(GetLocalInt(oWP, "nChildCount")<=0){
            nStartDelay = GetLocalInt(oWP, "nStartDelay");
            //SendMessageToPC(GetFirstPC(), "nStartDelay=" + IntToString(nStartDelay));
            nCurrentTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //SendMessageToPC(GetFirstPC(), "nCurrentTime=" + IntToString(nCurrentTime));
            nSpawnDelay = GetLocalInt(oWP, "nSpawnDelay");
            //SendMessageToPC(GetFirstPC(), "nSpawnDelay=" + IntToString(nSpawnDelay));
            if(nSpawnDelay<(nCurrentTime-nStartDelay)){
                //SendMessageToPC(GetFirstPC(), "delay end, spawning...");
                SetLocalInt(oWP, "bSpawnDisturbed", FALSE);
                Spawn(oWP);
            }else{
                //SendMessageToPC(GetFirstPC(), "waiting for delay end");
            }
        }
    }
}

void Spawn(object oWP)
{
    object oCreature;
    string sTag;
    int nPos1, nPos2;
    int n, n1, n2, i, r, r1;
    int bGroup = FALSE;
    location lLoc;

    sTag = GetLocalString(oWP, "sTag"); // for Lexey's Spawn Table

//---- SG flag ----
    bGroup = GetLocalInt(oWP, "bGroup");

//---- SRn flag ----
    r = GetLocalInt(oWP, "r");
    location lLocation = GetLocation(oWP);
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition;
    float fOrientation = GetFacingFromLocation(lLocation);

//---- SNn flag ----
    n1 = GetLocalInt(oWP, "nMin");
    n2 = GetLocalInt(oWP, "nMax");
    if(n2!=0){
        n = n1+Random(n2-n1)+1;
    }else{
        n = n1;
    }

    for(i=1; i<=n; i++){
        vPosition = GetPositionFromLocation(lLocation);
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.x += r1;
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.y += r1;

        lLoc = Location(oArea, vPosition, fOrientation);
        if(bGroup==TRUE) sTag = SpawnGroup(oWP);
        oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTag, lLoc);
        if(oCreature!=OBJECT_INVALID){
            SetLocalInt(oWP, "nChildCount", GetLocalInt(oWP, "nChildCount")+1);
            SetLocalObject(oCreature, "parent", oWP);
            SetLocalLocation(oCreature, "lHomeLocation", lLoc);
        }else{
            i--;
        }
    }
}

void StoreSpawns(object oArea)
{
    object oObject = GetFirstObjectInArea(oArea);
    string sName, s;
    string sTag;
    int nPos1, nPos2;
    int nCount=0;
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);
        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)
){
            nCount++;
            SetLocalObject(oArea, "Spawner"+IntToString(nCount), oObject);

            SetLocalString(oObject, "sTag", GetTag(oObject));

            //---- SG flag ----
            nPos1 = FindSubString(sName, "SG");
            if((nPos1!=-1)&&(StringToInt(GetSubString(sName, nPos1+2, 1))==1))
                SetLocalInt(oObject, "bGroup", TRUE);

            //---- SRn flag ----
            nPos1 = FindSubString(sName, "SR");
            nPos2 = FindSubString(sName, "END");
            SetLocalInt(oObject, "r", StringToInt(GetSubString(sName, nPos1+2, nPos2-nPos1-3)));

            //---- SNn flag ----
            nPos1 = FindSubString(sName, "SN");
            nPos2 = FindSubString(sName, "SR");
            s = GetSubString(sName, nPos1+2, nPos2-nPos1-3);
            nPos1 = FindSubString(s, "-");
            if(nPos1==-1){
                SetLocalInt(oObject, "nMin", StringToInt(s));
                SetLocalInt(oObject, "nMax", 0);
            }else{
                SetLocalInt(oObject, "nMin", StringToInt(GetSubString(s, 0, nPos1)));
                SetLocalInt(oObject, "nMax", StringToInt(GetSubString(s, nPos1+1, GetStringLength(s)-nPos1-1)));
            }
        }
        oObject = GetNextObjectInArea(oArea);
    }
    SetLocalInt(oArea, "nSpawnersCount", nCount);
}

void ClearLocationFromCreatures(object oArea)
{
    string sName;
    object oWP;
    object oObject = GetFirstObjectInArea(oArea);
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);

        oWP = GetLocalObject(oObject, "parent");
        if(oWP!=OBJECT_INVALID)
            DestroyObject(oObject);

        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)
){
            if(GetLocalInt(oObject, "nChildCount")>0){
                SetLocalInt(oObject, "nChildCount", 0);
                if(GetLocalInt(oObject, "bSpawnDisturbed")){
                    SetLocalInt(oObject, "nStartDelay", GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime"));
                }
            }
            //SendMessageToPC(GetFirstPC(), "b="+IntToString(GetLocalInt(oObject, "bSpawnDisturbed")));
        }

        oObject = GetNextObjectInArea(oArea);
    }
}
вставлял все ето я в On enter в опциях локи а вот второй area_exit :
// area_exit

void main()
{
    object oArea = GetArea(OBJECT_SELF);
    object oPC = GetExitingObject();
    if(GetIsDM(oPC)) return;
    if(GetIsPC(oPC)){
        int nCount = GetLocalInt(oArea, "nPlayerCount");
        nCount--;
        SetLocalInt(oArea, "nPlayerCount", nCount);

        if(nCount<=0){ // no PC in location
            SetLocalInt(oArea, "bNeedSpawn", FALSE);
            object oWP;
            int nSpawnersCount = GetLocalInt(oArea, "nSpawnersCount");
            int i;
            for(i=1; i<=nSpawnersCount; i++){
                oWP = GetLocalObject(oArea, "Spawner"+IntToString(i));
                if(GetLocalInt(oWP, "nChildCount")>0){ // if any spawner has children
                    SetLocalInt(oArea, "nLastPCExitTime", GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime"));
                    SetLocalInt(oArea, "bNeedClear", TRUE);
                    break;
                }
            }
        }
    }else if(GetIsObjectValid(GetLocalObject(oPC, "parent"))){
        //SendMessageToPC(GetFirstPC(), "name="+GetName(oPC));
        object oCreature = CreateObject(OBJECT_TYPE_CREATURE,
                        GetResRef(oPC),
                        GetLocalLocation(oPC, "lHomeLocation"));

        SetLocalLocation(oCreature, "lHomeLocation", GetLocalLocation(oPC, "lHomeLocation"));

        DeleteLocalInt(oPC, "TotalDamage");
        int i;
        for(i=1;i<=GetLocalInt(oPC, "TotalDamagers");i++){
            DeleteLocalObject(oPC, "Damager"+IntToString(i));
            DeleteLocalInt(oPC, "Damage"+IntToString(i));
        }
        DeleteLocalInt(oPC, "TotalDamagers");
        DeleteLocalInt(oPC, "nPreviousHP");
        DeleteLocalObject(oPC, "parent");
        DeleteLocalLocation(oPC, "lHomeLocation");

        DestroyObject(oPC);
    }
}
// SPAWN SYSTEM
// for NWN Shard "Validor 2"
// main script
/* Scripted by Vanes */

#include "vr_spawn_groups"
#include "vr_config"

void CheckWaypoints(object oArea);
void Spawn(object oWP);
void StoreSpawns(object oArea);
void ClearLocationFromCreatures(object oArea);


void main() // psevdo heartbeat
{
    object oArea = OBJECT_SELF;

    if(GetLocalInt(oArea, "bNeedSpawn")==TRUE){
        CheckWaypoints(oArea);
        //SendMessageToPC(GetFirstPC(), "attemting to spawn... "+ GetName(oArea));
        AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        return;
    }
    if(GetLocalInt(oArea, "bNeedClear")==TRUE){
        //SendMessageToPC(GetFirstPC(), "attemting to clear... "+ GetName(oArea));
        //SendMessageToPC(GetFirstPC(), "nLastPCExitTime = " + IntToString(GetLocalInt(oArea, "nLastPCExitTime")));
        //SendMessageToPC(GetFirstPC(), "nCurrentTime = " + IntToString(GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")));
        if((GetLocalInt(oArea, "nLastPCExitTime")+SPAWN_CLEAR_LOC_DELAY)<=GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime")){
            //SendMessageToPC(GetFirstPC(), "clearing... "+ GetName(oArea));
            ClearLocationFromCreatures(oArea);
            SetLocalInt(oArea, "bNeedClear", FALSE);
        }else{
            AssignCommand(oArea, DelayCommand(10.0, ExecuteScript("vr_spawn_general", oArea)));
        }
        return;
    }
}

void CheckWaypoints(object oArea) // check for WP status (waiting for delay end,
                                  // waiting for children death, need pawn now)
{
    if(GetLocalInt(oArea, "bSpawnsStored")==FALSE){
        StoreSpawns(oArea);
        SetLocalInt(oArea, "bSpawnsStored", TRUE);
    }
    object oWP;
    string sName;
    int nPos, nSpawnDelay, nStartDelay, nCurrentTime;
    int i;
    int nSpawnersCount = GetLocalInt(oArea, "nSpawnersCount");
    //SendMessageToPC(GetFirstPC(), "nSpawnersCount="+IntToString(nSpawnersCount));
    for(i=1; i<=nSpawnersCount; i++){
        oWP = GetLocalObject(oArea, "Spawner"+IntToString(i));
        sName = GetName(oWP);
        //SendMessageToPC(GetFirstPC(), "checking WP " + sName);
        if(GetLocalInt(oWP, "nSpawnDelay")==0){ // first check after module started
            nPos = FindSubString(sName, "SG");
            nSpawnDelay = StringToInt(GetSubString(sName, 5, nPos-6))*60;
            //int nTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //if(nTime!=0){
            //SetLocalInt(oWP, "nStartDelay", 60);
            SetLocalInt(oWP, "nSpawnDelay", nSpawnDelay);
            //}
            Spawn(oWP);
        }
        if(GetLocalInt(oWP, "nChildCount")<=0){
            nStartDelay = GetLocalInt(oWP, "nStartDelay");
            //SendMessageToPC(GetFirstPC(), "nStartDelay=" + IntToString(nStartDelay));
            nCurrentTime = GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime");
            //SendMessageToPC(GetFirstPC(), "nCurrentTime=" + IntToString(nCurrentTime));
            nSpawnDelay = GetLocalInt(oWP, "nSpawnDelay");
            //SendMessageToPC(GetFirstPC(), "nSpawnDelay=" + IntToString(nSpawnDelay));
            if(nSpawnDelay<(nCurrentTime-nStartDelay)){
                //SendMessageToPC(GetFirstPC(), "delay end, spawning...");
                SetLocalInt(oWP, "bSpawnDisturbed", FALSE);
                Spawn(oWP);
            }else{
                //SendMessageToPC(GetFirstPC(), "waiting for delay end");
            }
        }
    }
}

void Spawn(object oWP)
{
    object oCreature;
    string sTag;
    int nPos1, nPos2;
    int n, n1, n2, i, r, r1;
    int bGroup = FALSE;
    location lLoc;

    sTag = GetLocalString(oWP, "sTag"); // for Lexey's Spawn Table

//---- SG flag ----
    bGroup = GetLocalInt(oWP, "bGroup");

//---- SRn flag ----
    r = GetLocalInt(oWP, "r");
    location lLocation = GetLocation(oWP);
    object oArea = GetAreaFromLocation(lLocation);
    vector vPosition;
    float fOrientation = GetFacingFromLocation(lLocation);

//---- SNn flag ----
    n1 = GetLocalInt(oWP, "nMin");
    n2 = GetLocalInt(oWP, "nMax");
    if(n2!=0){
        n = n1+Random(n2-n1)+1;
    }else{
        n = n1;
    }

    for(i=1; i<=n; i++){
        vPosition = GetPositionFromLocation(lLocation);
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.x += r1;
        r1 = Random(r+1);
        if(d2()==1) r1 *= -1;
        vPosition.y += r1;

        lLoc = Location(oArea, vPosition, fOrientation);
        if(bGroup==TRUE) sTag = SpawnGroup(oWP);
        oCreature = CreateObject(OBJECT_TYPE_CREATURE, sTag, lLoc);
        if(oCreature!=OBJECT_INVALID){
            SetLocalInt(oWP, "nChildCount", GetLocalInt(oWP, "nChildCount")+1);
            SetLocalObject(oCreature, "parent", oWP);
            SetLocalLocation(oCreature, "lHomeLocation", lLoc);
        }else{
            i--;
        }
    }
}

void StoreSpawns(object oArea)
{
    object oObject = GetFirstObjectInArea(oArea);
    string sName, s;
    string sTag;
    int nPos1, nPos2;
    int nCount=0;
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);
        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)
){
            nCount++;
            SetLocalObject(oArea, "Spawner"+IntToString(nCount), oObject);

            SetLocalString(oObject, "sTag", GetTag(oObject));

            //---- SG flag ----
            nPos1 = FindSubString(sName, "SG");
            if((nPos1!=-1)&&(StringToInt(GetSubString(sName, nPos1+2, 1))==1))
                SetLocalInt(oObject, "bGroup", TRUE);

            //---- SRn flag ----
            nPos1 = FindSubString(sName, "SR");
            nPos2 = FindSubString(sName, "END");
            SetLocalInt(oObject, "r", StringToInt(GetSubString(sName, nPos1+2, nPos2-nPos1-3)));

            //---- SNn flag ----
            nPos1 = FindSubString(sName, "SN");
            nPos2 = FindSubString(sName, "SR");
            s = GetSubString(sName, nPos1+2, nPos2-nPos1-3);
            nPos1 = FindSubString(s, "-");
            if(nPos1==-1){
                SetLocalInt(oObject, "nMin", StringToInt(s));
                SetLocalInt(oObject, "nMax", 0);
            }else{
                SetLocalInt(oObject, "nMin", StringToInt(GetSubString(s, 0, nPos1)));
                SetLocalInt(oObject, "nMax", StringToInt(GetSubString(s, nPos1+1, GetStringLength(s)-nPos1-1)));
            }
        }
        oObject = GetNextObjectInArea(oArea);
    }
    SetLocalInt(oArea, "nSpawnersCount", nCount);
}

void ClearLocationFromCreatures(object oArea)
{
    string sName;
    object oWP;
    object oObject = GetFirstObjectInArea(oArea);
    while(oObject!=OBJECT_INVALID){
        sName = GetName(oObject);

        oWP = GetLocalObject(oObject, "parent");
        if(oWP!=OBJECT_INVALID)
            DestroyObject(oObject);

        if((GetStringLeft(sName, 2)=="SP")&&(GetObjectType(oObject)==OBJECT_TYPE_WAYPOINT)
){
            if(GetLocalInt(oObject, "nChildCount")>0){
                SetLocalInt(oObject, "nChildCount", 0);
                if(GetLocalInt(oObject, "bSpawnDisturbed")){
                    SetLocalInt(oObject, "nStartDelay", GetLocalInt(GetObjectByTag("vr_dmhelper"), "nCurrentTime"));
                }
            }
            //SendMessageToPC(GetFirstPC(), "b="+IntToString(GetLocalInt(oObject, "bSpawnDisturbed")));
        }

        oObject = GetNextObjectInArea(oArea);
    }
}

соответствеенно в опции локи в On exit

и что не так?
а с мобами вот что сделал поставил на локу волка стегом c_dogwolfdire и задал для него точку с именемSP_SG0_SD5_SN1_SR5_END и тегом c_dogwolfdire
И что не так????7 ждал около 10 минут респа и недождался(

Помираю хочу научится респу,уже всю ету неделю пробую делать и никак блин(
diggers
Цитата
Помираю хочу научится респу,уже всю ету неделю пробую делать и никак блин(

Напиши свой. Создай пустой модуль, назови его гордо - RespBySugoMod

Соспавни монстра в точке, на пустой локации. Как - см скрипты Vanesа.

Соспавнишь, тогда(И только тогда. На этом этапе уже другие сложности, и с самим спавном у тебя затруднений уже быть не должно. Иначе потонешь в проблемах и забьешь на это дело), соспавнишь несколько монстров, по хитрой системе. Что бы спавнились разные мобы, разное количество и можно было всем этим управлять. Что бы спавнились, нападали, что бы все было нормально в маштабе 1 спавна. Как - посмотришь там же.

Потом подумаешь как переделать систему так, что бы удобно было такие спавны расставлять в больших количествах и управлять ими. На этом этапе, я уверен, у тебя уже закипят свои собственные идеи как что сделать, и будешь спрашивать только об отдельных конкретных технических решениях.

А таким шаманством, тыкая то, незнаю что, незнаю куда, можно и за полгода ничего не сделать.
r1Stranger
Такая штука. Перенес скрипты из 1й версии во вторую.
То что визуальные эффекты почти половина отсутствует или не работает это ладно.
Но как сделать, чтоб неписи ходили по непрерывно по точкам? Была хорошая каманда WalkEayPoints() а тут нету.
Надо снова самому велосипед изобретать?
Griffon
Нет, не надо. Если тебе нужно чтобы нпс строго ходил от 01 до 0..., то выбираешь нпс -> пкм создать wp -> размещаешь wps -> выбираешь все wp через shift лкм и -> пкм create waypoint set
r1Stranger
Спасибо.
Так и сделал. Но оно требует ввести имя группы точек. Дал имя - все равно не ходят по всем.Может надо было вписывать в имя тэг существа?
Griffon
Цитата(r1Stranger @ May 15 2007, 19:01) [snapback]108263[/snapback]
Может надо было вписывать в имя тэг существа?


Именно.
shadowdweller
Вот два скрипта, которые делают любого НПС полностью неподвижным (на случай, если нужна статуя, игрушка и т.д.)
Первый ставится на слот OnConversation:
Neverwinter Script Source
// empty to avoid default behaviour

void RemoveEffects(object oObject)
{
    effect eEffect = GetFirstEffect(oObject);
    while(GetIsEffectValid(eEffect))
    {
        RemoveEffect(oObject, eEffect);
        eEffect = GetNextEffect(oObject);
    }
}

void main()
{
    PlaySound("as_cv_winch1");
    /*SetPlotFlag(OBJECT_SELF, FALSE);
    RemoveEffects(OBJECT_SELF);
    ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK, 0.5);
    effect eHold = EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION);
    ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHold, OBJECT_SELF));
    ActionDoCommand(SetPlotFlag(OBJECT_SELF, TRUE));*/

}

Второй - на слот OnSpawn:
Neverwinter Script Source
void main()
{
    effect eHold = EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHold, OBJECT_SELF);
    SetLocalInt(OBJECT_SELF, "X1_L_IMMUNE_TO_DISPEL", 10);
}

Оба взяты из SoU, но прекрасно работают и в НВН2.
Наслаждайтесь! rolleyes.gif

ВАЖНО: Чтобы НПС оставался действительно неподвижным, не забудьте убить все остальные скрипты. Должны остаться только эти два. smile.gif
Griffon
Скриптование вэйпойнтов:

Neverwinter Script Source
#include "ginc_wp"

void main()
{
    int iCurrentWP = GetCurrentWaypoint();
    int iNextWP;
    switch (iCurrentWP)
    {
        case 1:
            iNextWP = Random(GetNumWaypoints()-1) + 2;
            SetNextWaypoint(iNextWP);
            ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS, 1.0, 7.0);
            break;
        case 2:
            SetNextWaypoint(1);
            ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 4.0);
            break;
        case 3:
            SetNextWaypoint(1);
            break;
    }
}


Neverwinter Script Source
#include "ginc_wp"
     
const int REDIRECTOR_WP = 1;

void main()
{
    int iCurrentWP = GetCurrentWaypoint();// where we are
    int iNextWP;
    switch (iCurrentWP)
    {
        case 1:
// Node 1 should be placed off somewhere out of the way.  This is where the creatures
// will hang out in between reaching the end of the path and starting on a new path.
// Creatures will change their appearance in between travels.

// 1st param is the list of nodes they may reappear at. Must follow the pattern XX,YY,ZZ...
// 2nd param is the length of time to wait before reappearing.
                  StandardRedirectorNode("02,03", 5.0f);
            break;
        case 2:
// Nodes 2 on up define the network the road walkers travel.  They will never return to the node
// they just came from.  When they reach an end node (typically a door or a route out of the area)
// they will be be "redirector node" - typically node 1.

// 1st param is the list of nodes they may travel to. Must follow the pattern XX,YY,ZZ...
//                (end nodes are those with only 1 element in the list)
// 2nd param is the redirector WP
                  StandardRoadNetworkNode("03", REDIRECTOR_WP);
            break;

        case 3:
                  StandardRoadNetworkNode("02", REDIRECTOR_WP);
            break;
    }
}



Статья.


Валеско
В одной из локаций модуля присутствует жаровня. Жаровня - это такая фиговина при нажимании на которую оружие игрока воспламеняется.\
Для действия жаровни был написан скрипт:

Neverwinter Script Source
void main()
{
ActionCastSpellAtObject(SPELL_FLAME_WEAPON,GetLast
sedBy());
}


Однако в работающем скрипте есть недостаток. Воспламенение оружия не прекращается ни через минуту, ни через 2 часа. Что делать?
Воспламенение должно длиться 30-40 секунд.
Lex
делать не через магию, а через добавление временного эффекта на предмет.
Что-то типа:
Neverwinter Script Source
void main()
{
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,GetLastUsedBy());
if (!GetIsObjectValid(oWeapon)) return;
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6),oWeapon,40.0);
}

насчет работы под НВН2 не знаю, не могу проверить. Но по идее проблем быть не должно.
Валеско
ERROR: UNDEFINED IDENTIFIER
Dik Morris
2 Валеско, я подправил:

Neverwinter Script Source
void main()
{
object oWeapon = GetItemInSlot
(INVENTORY_SLOT_RIGHTHAND,
GetLastUsedBy());

if (!GetIsObjectValid(oWeapon)) return;
AddItemProperty(DURATION_TYPE_TEMPORARY,
ItemPropertyDamageBonus
(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6)
,oWeapon,40.0);
}


PS: дело было в том, что при абзатце, функции "делились", на несколько частей, соответственно скрипт и не составлялся.
Drow
Как лучше всего скриптом сделать непися невидимым. В смысле не эффект невидимости, а чтобы непися не было видно в тру сии.
Dik Morris
2 Drow, эх, жаль NWN-2 на компьютере нет (и не горю желанием ее устанавливать) но думаю, EffectVisualEffect и константа VFX_DUR_CUTSCENE_INVISIBILITY, все-таки остались. Так что попробуй использовать их.

Никакие "штатные" средства (ака трусинг или си-инвиз) этот эффект не берут.
Tomb
Ребят а кто нить может помочь со скриптом на сундуки для шарда...
Сундук привязан на акк
gennady
Tomb, если ты о генерации лута, то можно почитать статью Игроделу. Правда там пробиты шмотки для 1 Невера...
Griffon
Рандомный генератор лута - подходит как для модуля, так и для шарда. Правда, он написан на выпадение лута с монстров.
Tomb
Неа я про сундуки чтобы хранить свой шмот....
Lorendroll
Ну так ты расскажи как именно хочешь чтобы работала твоя система. Если сундук на каждого игрока свой, привязывай SetLocalObject на нужного oPC, а чтобы после рестарта восстанавливать лежащие в сундуке вещи нужно на попадание в сундук вещи запоминать вещь по тегу (StrRef'у? не знаю точно), привязывая SetLocalString на игрока. Но здесь без БД трудно будет, не знаю, есть уже НВНх для НВН2 или нет...
Да или вот пришло в голову интересное решение - завести отдельный модуль-"хранилище". Который просто SaveGame'ить время от времени. Есть ведь возможность переместить игрока в другой модуль скриптом онлайн? Я честно говоря с этим еще не экспериментировал, но должно работать...
Tomb
Насколько я помню Ванес писал скрипт с внешней БД
Она работал так
Сундук привязывается к акку шмот по тегу сохраняется во внешней БД
Положил шмот нажал на рычаг и счастье
FreemanD
Люди, помогите чайнику... Я тут где-то напоролся на тему где было упоминание про то как посадить перса на стул, к примеру. Но там было сказано, что скрипты x2_am_sit и еще какой-то, x2_plc_sit кажется, короче они кривые, и их надо дорабатывать. Не могли бы вы мне на пальцах объяснить, что именно с ними надо сделать? и желательно с подробными коменнтариями. А то блин, сделал две табуреточки и пенек, повесил скрипт, помучался, а перс, собака такая, не садится! Стоит около него, на панельке действий висит действие "сесть", и все!!! vava.gif

*Ушел в кому*

И такой вопрос: а есть скрипт на действие "Лечь"? Чтобы и на пол, и на кровать, допустим... Я просто сейчас делаю маленький тренировочный модуль, в котором будет все включено, но при этом хочу сделать его максимально качественно и реалистично. Стиль, обстановка, нпсы уже готовы, остались эффекты, диалоги, и вот самая больная тема - скрипты... Хелп... sad.gif
Aiwan
Сложно что то говорить если человек не понимает. Тебе надо попробовать с азов самому... Скриптинг нужен всем, если ты не рисуешь локации и больше ничего.

Лечь... Ты видел лежащего НПС в игре?
NWNmaster
BAN ME
Vhall
Конечно можно.
Только если анимация колеса будет предварительно прописана в максе и подготовлена для обращения через скрипт. biggrin.gif
Griffon
Цитата(FreemanD @ Aug 10 2007, 12:33) *
вопрос: а есть скрипт на действие "Лечь

Зачем тебе скрипт если есть анимация смерти и НПС падает на пол.
FreemanD
Если бы я знал с чего начинать, то начал бы. А так, никакого руководства под руками нет, чтобы азы какие-нибудь получить... Блин... Нырять то в бездну, не зная что там ох как не хочется...
NWNmaster
BAN ME
FreemanD
Цитата
Лечь... Ты видел лежащего НПС в игре?


Я специально еще раз прошел игру, чтобы убедиться, что глаза меня не обманули, и понял, что лежащий нпс в игре есть. Обычно это спящие орки и багберы, в пещерах. Скрин сделать не успел, потому что они вскакивают, и хотят меня побить. vava.gif

В редакторе визуальных эффектов обнаружил действие лечь. (LAYDOWN, кажется.) Нпс там берет и реально ложится, правда только на пол, но все равно прогресс. А вот скрипт не нашел. Его реально сделать?

Цитата
Зачем тебе скрипт если есть анимация смерти и НПС падает на пол.


Не катит, мне надо чтобы нпс после того как его растолкают не сваливался с ног как пьяный, а тихо уходил и ложился обратно. Там где лежал.

Цитата
Если бы я знал с чего начинать, то начал бы. А так, никакого руководства под руками нет, чтобы азы какие-нибудь получить... Блин... Нырять то в бездну, не зная что там ох как не хочется...


Беру свои слова обратно, прочитал вики. prankster2.gif Нырнул в бездну.

Мне кто-нить объяснит, что со скиптом "сесть" делать? shout.gif
Валеско
Возможно, тут помогут разобраться. Есть скрипт:

Neverwinter Script Source
#include "mf_hench"
#include "c_animations"

void C_GoDown(object oTarget)
{
      float fTiming;
      fTiming = C_CustomAnimationLength(oTarget, "laydownb");
      PlayCustomAnimation(oTarget, "laydownb", 0, 1.0);
    DelayCommand(fTiming, C_PlayCustomAnimation(oTarget, "proneb", 1, 1.0));
}

void main()
{
object oPoint = GetObjectByTag("WP_RIV_AWAY");
object oBoy = GetObjectByTag("RIV_NPC_YOR");
object oBoy2 = GetObjectByTag("RIV_NPC_DAN");
object oMrin = GetHenchmanByTag("DRW_HEN_MRE01");
effect eEffect = EffectSleep();
if (GetHenchValid("DRW_HEN_MRE01"))
    {
    DestroyObject(GetObjectByTag("T_MISC_TAVERN"));
    int i = 0;
    object oObject = GetObjectByTag("T_ALCO_SLEEP",i);
    while (GetIsObjectValid(oObject))
        {
        DestroyObject(oObject);
        i++;
        oObject = GetObjectByTag("T_ALCO_SLEEP",i);
        }
    }
else
    {
    int i = 0;
    object oObject = GetObjectByTag("RIV_NPC_ALR",i);
    while (GetIsObjectValid(oObject))
        {
        AssignCommand(oObject, ActionDoCommand(ApplyEffectToObject(EFFECT_TYPE_SL
EP, eEffect, oObject,99999.0)));
        C_GoDown(oObject);
        i++;
        oObject = GetObjectByTag("RIV_NPC_ALR",i);
        }
    }
DelayCommand(6.0,SetCutsceneMode(GetFirstPC(),FALS
));
AssignCommand(oBoy2, ClearAllActions());
AssignCommand(oBoy, ClearAllActions());
DelayCommand(0.1,AssignCommand(oBoy2, ActionForceMoveToObject(oPoint)));
DelayCommand(0.1,AssignCommand(oBoy,  ActionForceMoveToObject(oPoint)));
DelayCommand(20.0, DestroyObject(oBoy));
DelayCommand(20.0, DestroyObject(oBoy2));
}


Помимо всего прочего отвечающий за то, чтобы персы с тегом RIV_NPC_ALR лежали на полу и не двигались. Все бы хорошо, но скрипт этот работает только в пределах одной локации, в то время как "дрова" лежат на другой... Есть варианты, как это можно поправить?
gennady
Цитата
Возможно, тут помогут разобраться. Есть скрипт:


Уходя – уходи!

Цитата
Я не жалею что потратил столько времени на такое бесперспективное и неблагодарное дело как модульмейкинг на НВН2, но жалею, что потратил его в русском комьюнити.

Оскорбив все русское комьюнити, вылив кучу грязи на модмейкеров и скриптеров - просить о помощи???… Вытри слюни и сопли, и будь мужчиной!
P.S. Западло такому человеку помогать… За 3 года мог бы хоть кодами NSS научиться пользоваться…
Валеско
Не волнуйся, милая, буржуям я такой вопрос тоже задал.
Aiwan
Поиск сделай через локацию и на ней ищи нужных неписей.
Neverwinter Script Source
object oSelf = OBJECT_SELF; // тут укажи любой объект в нужной локе. Тег уникальный.
    object oObject = GetFirstObjectInArea(GetArea(oSelf));
    while (GetIsObjectValid(oObject))
    {
      if(GetObjectType(oObject)==OBJECT_TYPE_CREATURE)
      {
        if (GetTag(oObject)== "RIV_NPC_ALR")
        {
            AssignCommand(oObject, ClearAllActions(TRUE));
            AssignCommand(oObject, ActionDoCommand(ApplyEffectToObject(EFFECT_TYPE_SL
P, eEffect, oObject,99999.0)));
            C_GoDown(oObject);
        }
      }
        oObject = GetNextObjectInArea(GetArea(oSelf));
    }
Валеско
Задумался над таким моментом: как в скриптах менять параметр static у предметов? Допустим есть тайная дверь, которую игрок никак не должен увидеть до момента, когда ей нужно открыться. То есть логично сделать ее до этого static, а после наступления условия - этот static снять... каким образом это сделать?
Lex
никак.
Белатрис
Я, конечно, скрипты не так хорошо знаю, но на С++ можно изменить, например Visible( виден объект, или нет).
Выглядет все так:
Имя_объекта(в НВН тег или ResRef) -> Visible = true;
Так может, в НВН так:
Тег\ResRef -> static = true/false; ? prankster2.gif
virusman
Цитата(Белатрис @ Sep 4 2007, 14:19) *
Я, конечно, скрипты не так хорошо знаю, но на С++ можно изменить, например Visible( виден объект, или нет).
Выглядет все так:
Имя_объекта(в НВН тег или ResRef) -> Visible = true;
Так может, в НВН так:
Тег\ResRef -> static = true/false; ? prankster2.gif
NWScript - не C++. Если уж на то пошло, то больше похоже на C.
Валеско
идиотия. Неужто все тайные двери в официальной кампании НВН2 - просто запертые участки стены? о.О
Dik Morris
Не асилил что есть запертые участки стены. Но что есть тайные двери - можно посмотреть в тулсете НВН2 (точнее как они реализованы).

Если запертая дверь, будет иметь галочку "Статик", то дверь будет отображаться. Если не будет "статики", объект опять будет видим, тут тоже логики не уловил.

Если не ошибаюсь, в официальной компании НВН1 тайные двери были соответствующим плейсом, со скриптом на onXB, укрытые эффектом прозрачности (невидимки). Скрипт проверял: есть ли игрок в пределах XX метров, если есть, идет проверка его навыка "Spot" - и только в том случае, если игрок обойдет заданное ДЦ, эффект прозрачности удаляется с двери, а сама она открывается. Готовый скрипт, стало быть, нужно искать в компаниях первой или второй части игры (или писать самому).
azathoth
Что до статиков, то до них скриптами не добраться. Они вообще хранятся отдельно и загружаются только один раз.

P.S. Эх, а хорошо ведь было бы так: ScriptName "00door" Begin GameMode foreach (object in module as nwn2::placeable) WHERE *$1 IS DOOR with (.pop) { if (Detected(%PC%)) Static = true; } the end.
P.P.S. Надо создать топик: не знаю как тут, но в нвн1 можно сделать так...
Валеско
Цитата
Если запертая дверь, будет иметь галочку "Статик", то дверь будет отображаться. Если не будет "статики", объект опять будет видим, тут тоже логики не уловил.
Логика в том, что если объект static -то мы не можем выбрать его курсором и совершить с ним какие-то действия.
Цитата
Что до статиков, то до них скриптами не добраться. Они вообще хранятся отдельно и загружаются только один раз.
Типичная ёпсидиановская идиотия. Я уж решил поступить изящно и двери просто удалить, вместо того чтобы их открывать, но выяснилось что статичные двери даже не удаляются. Придется опускаться до кретинизма вроде "неоткрываемых секретных дверей, про существование которых персонаж догадываться не должен" или дедовским способом перегораживать проходы шкафами, ящиками и камнями.
Vhall
У Door State есть вариант "No visible model" (он же Destroyed), которым можно воспользоваться при ситуации:
QUOTE(Валеско @ Sep 4 2007, 11:12) *
Допустим есть тайная дверь, которую игрок никак не должен увидеть до момента, когда ей нужно открыться.

Вопрос в том, можно ли его менять через скрипты.
Lex
Цитата(Валеско @ Sep 4 2007, 17:17) *
Логика в том, что если объект static -то мы не можем выбрать его курсором и совершить с ним какие-то действия.
этого же эффекта можно добиться и просто не поставив галочку Статик и Активный. smile.gif
Цитата(Vhall @ Sep 4 2007, 20:44) *
У Door State есть вариант "No visible model" (он же Destroyed), которым можно воспользоваться при ситуации
раньше 100 пудов можно было такое проделывать с плейсами. В нвн2 и с дверьми - я не пробовал.
Vanes
Цитата
Если не ошибаюсь, в официальной компании НВН1 тайные двери были соответствующим плейсом, со скриптом на onXB, укрытые эффектом прозрачности (невидимки). Скрипт проверял: есть ли игрок в пределах XX метров, если есть, идет проверка его навыка "Spot" - и только в том случае, если игрок обойдет заданное ДЦ, эффект прозрачности удаляется с двери, а сама она открывается. Готовый скрипт, стало быть, нужно искать в компаниях первой или второй части игры (или писать самому).

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

а так в палитре нвн2 видел какие то секретные двери, но что у них за фичи и как ими пользоваться я честно говоря не пробовал...
Griffon
Цитата(Валеско @ Sep 4 2007, 11:12) *
Задумался над таким моментом: как в скриптах менять параметр static у предметов? Допустим есть тайная дверь, которую игрок никак не должен увидеть до момента, когда ей нужно открыться. То есть логично сделать ее до этого static, а после наступления условия - этот static снять... каким образом это сделать?


В кампании это, вроде сделано предметами - сама секретная дверь и шкаф, который ее закрывает. Так вот этот шкаф имел static - false, collision - true. И поскольку эти двери становились видны только после надевания очков, то почему не сделалать так же?
audun
Здравствуйте уважаемые мастера.
Вот наткнулся в скриптах на отладочную функцию:

Neverwinter Script Source

      PrettyDebug( sOut );
      PrettyDebug( "Total influence with " + GetStringByStrRef( GetCompanionNameStringRef( nCompanion )) + " = " + IntToString( nNewInfluence ));


ИМХО понятно, что срабатывает она при включении отладки и выводит текст.

Вопрос:
1.где и как включается этот отладочный режим.
2. куда выводиться отладочная информация(окно сообщений,экран, что нить особое...).

P.S. Сорри, если вопрос нубский или написал не в том топике, прошу не бить больно smile.gif
P.P.S.(поиск юзал sad.gif )
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.