Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Крафт в Neverwinter Nights - а это вообще возможно?, Герой-робинзон, "адын на льдине" купить-продать невозможно, вс
Chiffa
сообщение Nov 5 2017, 04:09
Сообщение #1


Level 6
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Человек



Собственно, началась тема на WRG, откуда я скачал замечательную систему крафта от PaiNtа. Поставил за нее десятку, и до сих пор считаю, что поступил правильно. Несмотря на все грабли, на которые наступил. Переношу сюда два последних поста с WRG, потому что в них, собственно, суть. (Продолжать обсужденние в теме на WRG, думаю, неправильно, это превращать тему "файлы" в форум.
Итак, собственно грабли:

Цитата
Записал дословно сообщение сисемы. Вот это:
"Скрипт pt_axcrf_activ OID ffffffff, Tag:, ОШИБКА СЛИШКОМ МНОГО ИНСТРУКЦИЙ
Скрипт x2_mod_def_act, OID 80000000, Tag:, ОШИБКА СЛИШКОМ МНОГО ИНСТРУКЦИЙ"
В очередной раз это произошло сразу после входа в игру. Расстроился. Дело в том, что герой как раз присел отдохнуть перед крафтом. Что ж это, прощай атмосферность? А я то разгубастился и на рискованный отдых, и на систему от Авадона с ковриками-кострами, эх!
Ладно, заменил скрипт отдыха на "родной". Снова зашел. То же самое. И тоже прям сразу.
Подумал, может проблема в хаке? Но вот хак то - курам на смех, всего то заменил четыре из бесчисленных и доставших донельзя дефолтных флагов на мокрую водичку 1х1 и 4х4 (это где герой в затопленной палубе фрегата задыхается.)
Ладно, убрал хак. Короче, все настройки - родные. Поиграл полчаса. Собщение системы то же самое.
А компилятор от обоих скриптов в восторге. Прямо тащатся от удовольствия, какие они правильные, белые и пушистые.
И еще. Если в переменной "pt_CRAFT_PROCESS_PC_CUSTOM_SCRIPT" действительно сдуру поставить какой-нибудь скрипт (даже самый простенький, с анимацией присесть когда что-то мастеришь или "говорить убедительно", когда ветку от дерева отламываешь или руду "киркой" долбишь, то скрипт запустится, но никакого крафта уже не будет.
Ставить в переменных скилы и прочие навыки не стал. Страшно...


И ответ уважаемого Aiwanа на этот пост:

Цитата
Чаще всего такое происходит, когда какой-то скрипт не отключается и постоянно выдает какие-то задания. Чаще всего это забытый новичком скрипт на хертбите НПС или модуля или триггероах. Или неккоректно сделана проверка в скрипте и он постоянно циклично работает


Aiwan, при всем уважении, нет там у меня никаких неписей, герой "адын на льдине". Для теста даже монстров не ставил. Примерно половина (минимум треть) модуля задумана как исключительно робинзонада, нет магазинов, никто ничо не подарит, все сам, все ручками, от кремневого ножа до лохмотьев и простейших зелий. Настройки модуля, как и писал, все вернул "родные", от PaiNtа. Триггер единственный, это "REST_ZONA". и сильно сомневаюсь, что он будет выдавать цикличные инструкции.

Остаются скрипты? Первый, на который жалуется система и которым восхищается компилятор, это скрипт настроек модуля "x2_mod_def_act", стоит на OnActivateltem. Вот он, целиком, совсем короткий:

Neverwinter Script
//::///////////////////////////////////////////////
//:: Example XP2 OnActivate Script Script
//:: x2_mod_def_act
//:: © 2003 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Put into: OnItemActivate Event

*/

//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-07-16
//:://////////////////////////////////////////////

#include "x2_inc_switches"
void main()
{
    object oItem = GetItemActivated();

    // * Generic Item Script Execution Code
    // * If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
    // * it will execute a script that has the same name as the item's tag
    // * inside this script you can manage scripts for all events by checking against
    // * GetUserDefinedItemEventNumber(). See x2_it_example.nss
    if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASE
D_SCRIPTS) == TRUE)
    {
        SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVA
TE);
        int nRet =  ExecuteScriptAndReturnInt(GetUserDefinedItemEventS
criptName(oItem),OBJECT_SELF);
        if (nRet == X2_EXECUTE_SCRIPT_END)
        {
          return;
        }

    }



//Execute PaiNt activate craft-tool script
if(GetStringLeft(GetTag(oItem), 14)=="pt_craft_tool_")
    {
    object oActivator=GetItemActivator();

    SetLocalObject(oActivator, "pt_ActTool", oItem);
    SetLocalObject(oActivator, "pt_ActTarget", GetItemActivatedTarget());


    ExecuteScript("pt_axcrf_activ", oActivator);
    };
}


Смотрю на него, как известное рунное животное на известный новый плейстейбл и в упор не понимаю, чему тут зацикливаться...

Второй скрипт "pt_axcrf_activ" куда серьезней. Даже не уверен, поместится ли, но рискну таки. Вот он:

Neverwinter Script
//Óíèâåðñàëüíûé ñêðèïò àêòèâàöèè èíñòðóìåíòà

#include "pt_frame000"
#include "x3_inc_string"
#include "pt_axcrf_md_cons"






void pCreateObjectInLocal(object oTarget, string sName, int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{
SetLocalObject(oTarget, sName, CreateObject(nObjectType, sTemplate, lLocation, bUseAppearAnimation, sNewTag));
}



void main()
{
object oModule=GetModule();
object oActivator=OBJECT_SELF;
if(GetLocalInt(oActivator, "pt_curCraftProcess_Mode")) return;
object oTool=GetLocalObject(oActivator, "pt_ActTool");DeleteLocalObject(oActivator, "pt_ActTool");
object oTarget=GetLocalObject(oActivator, "pt_ActTarget");DeleteLocalObject(oActivator, "pt_ActTarget");
object oParentRawTarget;






//Î÷èñòêà äèàëîãîâûõ ïåðåìåííûõ
SetLocalInt(oActivator, "pt_craft_dialNodeArray_Length", 0);
SetLocalInt(oActivator, "pt_craft_dialTok"+IntToString(pt_CUSTTOK_NODE_ONE)+"_Index", -1);
SetLocalInt(oActivator, "pt_craft_dialTok"+IntToString(pt_CUSTTOK_NODE_TWO)+"_Index", -1);
SetLocalInt(oActivator, "pt_craft_dialTok"+IntToString(pt_CUSTTOK_NODE_THREE)+"_Index", -1);
SetLocalInt(oActivator, "pt_craft_dialTok"+IntToString(pt_CUSTTOK_NODE_FOUR)+"_Index", -1);
SetLocalInt(oActivator, "pt_craft_dialTok"+IntToString(pt_CUSTTOK_NODE_FIVE)+"_Index", -1);
SetCustomToken(pt_CUSTTOK_NODE_ONE, "");
SetCustomToken(pt_CUSTTOK_NODE_TWO, "");
SetCustomToken(pt_CUSTTOK_NODE_THREE, "");
SetCustomToken(pt_CUSTTOK_NODE_FOUR, "");
SetCustomToken(pt_CUSTTOK_NODE_FIVE, "");
SetLocalInt(oActivator, "pt_craft_dialMinI", 0);
SetLocalInt(oActivator, "pt_craft_dialMaxI", 0);
int iNumDialogNodes=-1;

//Î÷èñòêà ïåðåìåííûõ ñëóæåáíûõ ïðåäìåòîâ
SetLocalInt(oActivator, "pt_craft_dialToolIsBook", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsSkillStick", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsToolTool", FALSE);

SetLocalInt(oActivator, "pt_craft_dialToolIsRawCreateSp", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeRawSp", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeToolSp", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeSkillSp", FALSE);
SetLocalInt(oActivator, "pt_craft_dialToolIsRawCreateSkillSt", FALSE);




//Èìÿ èíñòðóìåíòà,êîòîðûé âûçâàë ñêðèïò äëÿ äèàëîãà
SetLocalString(oActivator, "pt_craft_dialTool", GetName(oTool));

//Òàã èíñòðóìåíòà, êîòîðûé âûçâàë ñêðèïò
string sToolTag=GetTag(oTool);



/////////////////////////////////////////////
//Ñëóæåáíûå ïðåäìåòû äëÿ óïðàâëåíèÿ ñèñòåìîé

//Áîëüøàÿ êíèãà êðàôòà
if(sToolTag=="pt_craft_tool_DMbook")
    {
    SetLocalInt(oActivator, "pt_craft_dialToolIsBook", TRUE);
    }


//Áîëüøàÿ ïàëêà íàâûêîâ
    else if(sToolTag=="pt_craft_tool_DMs00")
    {
    if(GetObjectType(oTarget)!=OBJECT_TYPE_CREATURE) {FloatingTextStringOnCreature("Íå ïîäõîäÿùèé ïðåäìåò.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsSkillStick", TRUE);
    SetLocalObject(oActivator, "pt_craft_dialToolIsSkillStickTarget", oTarget);
    }


//Áîëüøàÿ ïàëêà Èíñòðóìåíòîâ
    else if(sToolTag=="pt_craft_tool_DMs10")
    {
    if(GetObjectType(oTarget)!=OBJECT_TYPE_ITEM && GetObjectType(oTarget)!=OBJECT_TYPE_PLACEABLE && GetObjectType(oTarget)!=OBJECT_TYPE_CREATURE) {FloatingTextStringOnCreature("Íå ïîäõîäÿùèé ïðåäìåò.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsToolTool", TRUE);
    SetLocalObject(oActivator, "pt_craft_dialToolIsToolToolTarget", oTarget);

    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
    return;
    }


/////////////////////////////////////////////////////
//Ñëóæåáíûå ïðåäìåòû äëÿ ââîäà â ñèñòåìó èíãðèäèåíòîâ

//Áîëüøàÿ côåðà òðàíñôîðìàöèè
    else if(sToolTag=="pt_craft_tool_DMs01")
    {
    if(GetObjectType(oTarget)!=OBJECT_TYPE_ITEM) {DeleteLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget"); FloatingTextStringOnCreature("Íå ïîäõîäÿùèé ïðåäìåò.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawCreateSp", TRUE);
    SetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget", oTarget);


    //Çàäàíèå ïåðåìåííûõ äëÿ äèàëîãà
    string sRawsString=GetLocalString(oTarget, "pt_CRAFT_RAW"), sToolsString=GetLocalString(oTarget, "pt_CRAFT_TOOL"), sSkillsString=GetLocalString(oTarget, "pt_CRAFT_SKILL_ID"), sRTtempstring, sNumDialogNodes;
    int x, iRawLen=pArrayLength(sRawsString), iToolLen=pArrayLength(sToolsString), iSkillLen=pArrayLength(sSkillsString);

    iNumDialogNodes=-1;
    for(x=0; x<iRawLen; x++)
        {
        sRTtempstring=pArray(sRawsString, x);
        if(sRTtempstring=="") continue;

        iNumDialogNodes++;
        sNumDialogNodes=IntToString(iNumDialogNodes);

        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemRawTag", sRTtempstring);
        };
    iNumDialogNodes=-1;
    for(x=0; x<iToolLen; x++)
        {
        sRTtempstring=pArray(sToolsString, x);
        if(sRTtempstring=="") continue;

        iNumDialogNodes++;
        sNumDialogNodes=IntToString(iNumDialogNodes);

        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemToolTag", sRTtempstring);
        };
    iNumDialogNodes=-1;
    for(x=0; x<iSkillLen; x++)
        {
        sRTtempstring=pArray(sSkillsString, x);
        if(sRTtempstring=="") continue;

        iNumDialogNodes++;
        sNumDialogNodes=IntToString(iNumDialogNodes);

        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemSkillId", sRTtempstring);
        };

    //Çàäàíèå äëèííû ìàññèâà
    SetLocalInt(oActivator, "pt_craft_dialNodeArray_Length", iRawLen+((iRawLen<iToolLen)?abs(iRawLen-iToolLen):0));
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");



    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
    return;
    }


//Ìàëàÿ ïàëêà ñûðüÿ
    else if(sToolTag=="pt_craft_tool_DMs02")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)) {FloatingTextStringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE); return;};

    if(GetIsObjectValid(oTarget) && GetObjectType(oTarget)==OBJECT_TYPE_ITEM)
        {
        FloatingTextStringOnCreature("Ïðåäìåò äîáàâëåí â êà÷åñòâå ñûðüÿ ê '"+GetName(oParentRawTarget)+"'" , oActivator, FALSE);
        }
        else
        {
        FloatingTextStringOnCreature("Íå ïîäõîäÿùèé ïðåäìåò.", oActivator, FALSE);
        SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeRawSp", TRUE);
        AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
        return;
        };

    //Çàäàíèå ïåðåìåííûõ äëÿ äèàëîãà
    string sRawsString=GetLocalString(oParentRawTarget, "pt_CRAFT_RAW");
    int iRawLen=pArrayLength(sRawsString);

    iNumDialogNodes=iRawLen;
    iNumDialogNodes++;
    string sNumDialogNodes=IntToString(iNumDialogNodes);

    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemRawTag", GetTag(oTarget));
    if(sRawsString!="") {sRawsString+=","+GetTag(oTarget);} else{sRawsString=GetTag(oTarget);};
    SetLocalString(oParentRawTarget, "pt_CRAFT_RAW", sRawsString);

    //Çàäàíèå äëèííû ìàññèâà
    SetLocalInt(oActivator, "pt_craft_dialNodeArray_Length", iNumDialogNodes);
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeRawSp", TRUE);
    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));

    return;
    }


//Ìàëàÿ ïàëêà èíñòðóìåíòîâ
    else if(sToolTag=="pt_craft_tool_DMs04")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)){FloatingText
StringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE);return;};

    if(GetIsObjectValid(oTarget))
        {
        FloatingTextStringOnCreature("Ïðåäìåò äîáàâëåí â êà÷åñòâå èíñòðóìåíòà ê '"+GetName(oParentRawTarget)+"'" , oActivator, FALSE);
        }
        else
        {
        FloatingTextStringOnCreature("Íå ïîäõîäÿùèé ïðåäìåò.", oActivator, FALSE);
        SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeToolSp", TRUE);
        AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
        return;
        };
    //Çàäàíèå ïåðåìåííûõ äëÿ äèàëîãà
    string sToolsString=GetLocalString(oParentRawTarget, "pt_CRAFT_TOOL");
    int iToolLen=pArrayLength(sToolsString);

    iNumDialogNodes=iToolLen;
    iNumDialogNodes++;
    string sNumDialogNodes=IntToString(iNumDialogNodes);

    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemToolTag", GetTag(oTarget));
    if(sToolsString!="") {sToolsString+=","+GetTag(oTarget);} else{sToolsString=GetTag(oTarget);};
    SetLocalString(oParentRawTarget, "pt_CRAFT_TOOL", sToolsString);

    //Çàäàíèå äëèííû ìàññèâà
    SetLocalInt(oActivator, "pt_craft_dialNodeArray_Length", iNumDialogNodes);
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeToolSp", TRUE);
    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));

    return;
    }


//Ìàëàÿ ïàëêà íàâûêîâ
    else if(sToolTag=="pt_craft_tool_DMs06")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)){FloatingText
StringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE);return;};

    FloatingTextStringOnCreature("Ïðîèçíåñèòå èäåíòèôèêàòîð íàâûêà", oActivator, FALSE);

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawCreateSkillSt", TRUE);

    return;
    }



//Ìàëàÿ ñôåðà ïðîñìîòðà ñûðüÿ
    else if(sToolTag=="pt_craft_tool_DMs03")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)) {FloatingTextStringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeRawSp", TRUE);

    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
    return;
    }


//Ìàëàÿ ñôåðà ïðîñìîòðà èíñòðóìåíòîâ
    else if(sToolTag=="pt_craft_tool_DMs05")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)) {FloatingTextStringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeToolSp", TRUE);

    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
    return;
    }


//Ìàëàÿ ñôåðà ïðîñìîòðà íàâûêîâ
    else if(sToolTag=="pt_craft_tool_DMs07")
    {
    oParentRawTarget=GetLocalObject(oActivator, "pt_craft_dialToolIsRawCreateTarget");
    if(!GetIsObjectValid(oParentRawTarget)) {FloatingTextStringOnCreature("Âû íå âûáðàëè ïðåäìåò äëÿ ðåäàêòèðîâàíèÿ ñ ïîìîùüþ ñôåðû òðàíñôîðìàöèè.", oActivator, FALSE); return;};

    SetLocalInt(oActivator, "pt_craft_dialToolIsRawSeeSkillSp", TRUE);

    AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
    return;
    };
////////////////////////////////////////////////////
////////////////////////////////////////////////////





//////////////////////////
//Èíñòðóìåíò èçíàøèâàåòñÿ
int iMaxUses=GetLocalInt(oTool, "pt_CRAFT_PROCESS_NUMUSE");
int iCurUses=GetLocalInt(oTool, "pt_curCraftProcess_uses");
iCurUses++;
SetLocalInt(oTool, "pt_curCraftProcess_uses", iCurUses);
if(iCurUses>iMaxUses && iMaxUses>0)
    {
    //debug
    FloatingTextStringOnCreature("Ïðîöåññ íåâîçìîæåí. Ðåñóðñ èíñòðóìåíòà èñ÷åðïàí.", oActivator, FALSE);

    int iToolObjectType=GetObjectType(oTool);
    float fRespTime=GetLocalFloat(oTool, "pt_CRAFT_PROCESS_RESPTIME");
    if(fRespTime>0.0 && iToolObjectType!=OBJECT_TYPE_ITEM && iToolObjectType!=OBJECT_TYPE_TRIGGER)
        {
        string sToolResRef=GetResRef(oTool);
        object oBuoy=CreateObject(OBJECT_TYPE_PLACEABLE, "plc_invisobj", GetLocation(oTool));
        float fCurRespTime=fRespTime+IntToFloat(Random(FloatToIn
t(fRespTime)/2));

        AssignCommand(oBuoy, DelayCommand(fCurRespTime, pCreateObjectInLocal(oBuoy, "pt_curCraftProcess_buoytool", iToolObjectType, sToolResRef, GetLocation(oBuoy))));

        AssignCommand(oBuoy, DelayCommand(fCurRespTime+0.1, SetLocalInt(GetLocalObject(oBuoy, "pt_curCraftProcess_buoytool"), "pt_CRAFT_PROCESS_NUMUSE", iMaxUses)));
        AssignCommand(oBuoy, DelayCommand(fCurRespTime+0.1, SetLocalFloat(GetLocalObject(oBuoy, "pt_curCraftProcess_buoytool"), "pt_CRAFT_PROCESS_RESPTIME", fRespTime)));

        AssignCommand(oBuoy, DelayCommand(fCurRespTime+0.1, DestroyObject(oBuoy)));
        };

    DeleteLocalInt(oActivator, "pt_curCraftProcess_Mode");
    DeleteLocalInt(oActivator, "pt_curCraftProcess_ScriptMode");
    DeleteLocalLocation(oActivator, "pt_craft_PClocation");
    DestroyObject(oTool);

    return;
    };









//Øêóðà àêòèâàòîðà
object oSkin=GetItemInSlot(INVENTORY_SLOT_CARMOUR, oActivator);

//Ïîñëåäíèé èñïîëüçóåìûé èíñòðóìåíò, ìîæåò èñïîëüçîâàòüñÿ â ñêðèïòàõ ïðîöåññà.
SetLocalObject(oActivator, "pt_craft_lastUsedTool", oTool);







//////////////////////////////////////////////
///Íà÷àëî öèêëà ïîñòðîåíèÿ âîçìîæíûõ ïðîöåññîâ
//////////////////////////////////////////////
int i, k, l, m;
int iMaxIItem=GetLocalInt(oModule, "pt_CraftItemBoxArray_Length");
for(i=0; i<iMaxIItem; i++)
    {
    string sI=IntToString(i);
    DeleteLocalObject(oActivator, "pt_craft_dialNodeArray"+sI+"_Object");
    DeleteLocalString(oActivator, "pt_craft_dialNodeArray"+sI+"_ItemName");
    ///////////////////////////////////////////////////////////////////////
    object oCrftItem=GetLocalObject(oModule, "pt_CraftItemBoxArray"+sI);

    if(!GetIsObjectValid(oCrftItem)) continue;


    //Áîëüøàÿ êíèãà êðàôòà
    if(GetTag(oTool)=="pt_craft_tool_DMbook")
        {
        iNumDialogNodes++;
        string sNumDialogNodes=IntToString(iNumDialogNodes);

        SetLocalObject(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_Object", oCrftItem);
        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemName", GetName(oCrftItem));

        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_Skills", GetLocalString(oCrftItem, "pt_CRAFT_SKILL_ID"));
        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_SkillsVal", GetLocalString(oCrftItem, "pt_CRAFT_SKILL_VALUE"));
        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_RawNames", GetLocalString(oCrftItem, "pt_CRAFT_RAW"));
        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_RawCost", GetLocalString(oCrftItem, "pt_CRAFT_RAW_COST"));

        SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ToolNames", GetLocalString(oCrftItem, "pt_CRAFT_TOOL"));

        //debug
        //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");

        continue;
        };



















///////////////////
////Ïðîâåðêà íàâûêà
    string sProcSkill=GetLocalString(oCrftItem, "pt_CRAFT_SKILL_ID");
    string sProcSkillVal=GetLocalString(oCrftItem, "pt_CRAFT_SKILL_VALUE");
    int iSkillLen=pArrayLength(sProcSkill);
    int iSkillValLen=pArrayLength(sProcSkillVal);
    int bClosedSkill=FALSE;
    for(k=0; k<iSkillLen; k++)
        {
        int iValK=(k<=(iSkillValLen-1)?k:iSkillValLen-1);

        string sSkillID=pArray(sProcSkill, k);
        sSkillID=GetStringLeft(sSkillID, 35);

        //Áîëüøàÿ ïàëêà íàâûêîâ
        if(GetTag(oTool)=="pt_craft_tool_DMs00")
            {
            int z, bHasThatSkill;
            bHasThatSkill=FALSE;
            for(z=0; z<=iNumDialogNodes+1; z++)
                {
                if(GetLocalString(oActivator, "pt_craft_dialNodeArray"+IntToString(z)+"_ItemName")==sSkillID) {bHasThatSkill=TRUE; break;};
                };
            if(!bHasThatSkill)
                {
                iNumDialogNodes++;
                string sNumDialogNodes=IntToString(iNumDialogNodes);

                SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemName", sSkillID);
                };

            //debug
            //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");

            continue;
            }
            else
            {
            float fActivatorSkill=GetLocalFloat(oSkin, "pt_craft_skill_"+sSkillID+"_value");

            if(fActivatorSkill<0.0 || GetLocalInt(oSkin, "pt_craft_skill_"+sSkillID+"_DMblock")) {bClosedSkill=TRUE; break;};
            };
        };
    if(bClosedSkill) continue;
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Ïðîâåðêà ñêèëà óñïåøíà.");


    //Áîëüøàÿ ïàëêà íàâûêîâ
    if(GetTag(oTool)=="pt_craft_tool_DMs00")
        {
        continue;
        };























////////////////////////////////////
////Ïðîâåðêà âûçûâàþùåãî èíñòðóìåíòà
    string sProcTool=GetLocalString(oCrftItem, "pt_CRAFT_TOOL");
    string sProcToolNames=sProcTool;
    int iToolLen=pArrayLength(sProcTool);

    string sCurToolTag=sToolTag;
    int iCurToolIndex=-1;
    for(k=0; k<iToolLen; k++)
        {
        string sToolTemp=pArray(sProcTool, k);
        if(sCurToolTag==sToolTemp || ((sProcTool=="" || sProcTool=="pt_craft_tool_") && sCurToolTag=="pt_craft_tool_")) {sProcToolNames=pArray(sProcToolNames, k, GetName(oTool)); iCurToolIndex=k; break;};
        };
    if(iCurToolIndex<0) continue;
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' âûäåëèëè èíñòðóìåíò âûçîâà. ("+pArray(sProcTool, iCurToolIndex)+")");















/////////////////////////
////Ïðîâåðêà èíñòðóìåíòîâ
    int bNotHasAllTool=FALSE;
    for(k=0; k<iToolLen; k++)
        {
        int bHasTool=FALSE;

        if(iCurToolIndex==k) continue;

        string sToolTag=pArray(sProcTool, k);


        object oPlaTool=GetNearestObjectByTag(sToolTag, oActivator); //Scan near activator
        if(GetIsObjectValid(oPlaTool) && GetObjectType(oPlaTool)!=OBJECT_TYPE_ITEM && GetDistanceBetween(oPlaTool, oActivator)<=3.0) {sProcToolNames=pArray(sProcToolNames, k, GetName(oPlaTool)); bHasTool=TRUE;};
        if(!bHasTool)
            {
            int iCurItemSlot=0;
            object oActItem=GetItemInSlot(iCurItemSlot, oActivator);
            while(!bHasTool && iCurItemSlot<=17) //Scan in equipeble slots
                {
                if(GetTag(oActItem)==sToolTag) {sProcToolNames=pArray(sProcToolNames, k, GetName(oActItem)); bHasTool=TRUE; break;};

                iCurItemSlot++; oActItem=GetItemInSlot(iCurItemSlot, oActivator);
                };
            if(!bHasTool)
                {
                oActItem=GetFirstItemInInventory(oActivator);
                while(!bHasTool && GetIsObjectValid(oActItem)) //Scan in inventory
                    {
                    if(GetTag(oActItem)==sToolTag) {sProcToolNames=pArray(sProcToolNames, k, GetName(oActItem)); bHasTool=TRUE; break;};

                    oActItem=GetNextItemInInventory(oActivator);
                    };
                };
            };

        if(!bHasTool) {bNotHasAllTool=TRUE; break;};
        };
    if(bNotHasAllTool) continue;
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Ïðîâåðêà îñòàëüíûõ èíñòðóìåíòîâ óñïåøíà");




































//////////////////////////////
////Ïðîâåðêà íèìåíîâàíèé ñûðüÿ
    string sProcRaw=GetLocalString(oCrftItem, "pt_CRAFT_RAW");
    string sProcRawNames=GetLocalString(oCrftItem, "pt_CRAFT_RAW");
    string sProcRawCost=GetLocalString(oCrftItem, "pt_CRAFT_RAW_COST");
    string sProcActivatorRawValue="0";

    int iRawLen=pArrayLength(sProcRaw);
    int iRawCostLen=pArrayLength(sProcRawCost);

    int bNotHasAllRaw=FALSE;
    for(k=0; k<iRawLen; k++)
        {
        string sRawTag=pArray(sProcRaw, k);

        int bHasRaw=TRUE;
        object oActItem=GetFirstItemInInventory(oActivator);
        while(GetIsObjectValid(oActItem))
            {
            if(GetTag(oActItem)==sRawTag)
                {
                sProcRawNames=pArray(sProcRawNames, k, GetName(oActItem));

                int iActRawVal=StringToInt(pArray(sProcActivatorRawVal
ue, k));
                iActRawVal+=GetItemStackSize(oActItem);
                sProcActivatorRawValue=pArray(sProcActivatorRawVal
ue, k, IntToString(iActRawVal));
                bHasRaw=TRUE;
                };

            oActItem=GetNextItemInInventory(oActivator);
            };
        if(!bHasRaw) {bNotHasAllRaw=TRUE; break;};
        };
    if(bNotHasAllRaw) continue;
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Ôîðìèðîâàíèå ìàññèâà íàëè÷èÿ ñûðüÿ óñïåøíî.");















/////////////////////////////
////Ïðîâåðêà êîëè÷åñòâà ñûðüÿ

    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Òðåáîâàíèå ñûðüÿ: "+sProcRawCost);
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Íàëè÷èå ñûðüÿ: "+sProcActivatorRawValue);
    int bNotHasAllRawQuant=FALSE;
    for(k=0; k<iRawLen; k++)
        {
        int iCostK=(k<=(iRawCostLen-1)?k:iRawCostLen-1);

        int iCurRawCost=StringToInt(pArray(sProcRawCost, iCostK));
        int iCurRawHave=StringToInt(pArray(sProcActivatorRawVa
lue, iCostK));

        if(iCurRawCost<0) iCurRawCost=1;

        if(iCurRawHave<iCurRawCost) {bNotHasAllRawQuant=TRUE; break;};
        };
    if(bNotHasAllRawQuant) continue;
    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Ïðîâåðêà êîëè÷åñòâà ñûðüÿ ó èãðîêà óñïåøíà.");



















/////////////////////////////////////////////////////////////////////
////Çàäàíèå ïåðåìåííûõ åñëè âñå ïðîâåðêè óñïåøíû äëÿ äàííîãî ïðîöåññà
    iNumDialogNodes++;
    string sNumDialogNodes=IntToString(iNumDialogNodes);

    SetLocalObject(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_Object", oCrftItem);
    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ItemName", GetName(oCrftItem));

    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_Skills", sProcSkill);
    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_SkillsVal", sProcSkillVal);
    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_RawNames", sProcRawNames);
    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_RawCost", sProcRawCost);

    SetLocalString(oActivator, "pt_craft_dialNodeArray"+sNumDialogNodes+"_ToolNames", sProcToolNames);

    //debug
    //SendMessageToPC(GetFirstPC(), "'"+GetName(oCrftItem)+"' Çàïèñü äàííûõ â ïåðåìåííûå");



    };
/////////////////////////////////////////////
//Çàäàíèå äëèííû ìàññèâà ïîëó÷åííûõ ïðîöåññîâ
SetLocalInt(oActivator, "pt_craft_dialNodeArray_Length", iNumDialogNodes+1);




/////////////////////////
//Çàïóñê äèàëîãîâîãî ìåíþ
if(iNumDialogNodes>=0) AssignCommand(oActivator, ActionStartConversation(oActivator, "pt_axcrf_main", TRUE, FALSE));
}


Собственно, это и есть универсальный скрипт активации инструмента. Думаю, уважаемый PaiNt оставил пробелы, чтобы юзер мог дописать что-то нужное конкретно ему. Но тут я понять что-то и не пытаюсь, не мой уровень. Может, кто-то из мастеров поймет?
А если нет, или просто лениво вникать, то господь с ней, с системой PaiNt_craft. Потому что тема не только и не столько о ней. Но об этом позже, и так пост раздулся, лопнет еще...

Пока писал, подумал (я уже говорил, со мной такое случается (IMG:style_emoticons/kolobok_light/rolleyes.gif) ).
Обратил внимание на строчку " ExecuteScript("pt_axcrf_activ", oActivator);" скрипта настроек модуля "x2_mod_def_act". Она же запускает главный скрипт инструмента! Тот самый, который второй и такой большой...
Может она это постоянно делать, поскольку в настройках модуля прописана? Если так, то понятно. Такого ни один грузчик не выдержит, не то что мой маленький модуль.
Однако, надо полагать, уважаемый PaiNt не просто так ее вписал... И не мог не предусмотреть какую-то "страховку" от зацикливания команды?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
3 страниц V  < 1 2 3  
Открыть новую тему
Ответов (50 - 58)
Aiwan
сообщение Dec 1 2017, 09:34
Сообщение #51


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



У локальных переменных есть числовые значения. Я боюсь ты не вдавался в тонкости этого вопроса (IMG:style_emoticons/kolobok_light/smile.gif) Или вдавался?
Приведи пример скрипта, мы поможем с оптимизацией.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Dec 1 2017, 15:05
Сообщение #52


Level 6
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Человек



Aiwan, denis0k, спасибо. Кажется, я правильно вас понял. Правда, не совсем усвоил насчет знака минус. В ПЛ я скоммуниздил очень нужный мне скрип, который регулирует отношения хеньша к игроку. И решил проверить, может ли он переходить за ноль. Оказалось, еще как может. Заставил ПС постоянно хамить хеньше, довел отношения до -100, после чего портнул хеньша в клозет (то есть на закрытую арену), а ПС закатал в тюрягу "за попытку изнасилования собственной помощницы" (IMG:style_emoticons/kolobok_light/biggrin.gif) Это все на "Полигоне", я говорил, что есть у меня специальный полезный мод для издевательств над ПС.
denis0k, ты что-то подобное имел ввиду, когда говорил о знаке минус, или совсем другое?
Насчет цифровых значений тоже вроде вникал. Правда, довольно поверхностно и скорее интуитивно. Aiwan, вот, к примеру, твой скрипт из Андры:
Neverwinter Script
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwan@e-mail.ru
//:://////////////////////////////////////////////
//::   ЗАКРЫВАЕТ СТРОКУ НПС ПОСЛЕ РАЗГОВОРА
//:://////////////////////////////////////////////
int StartingConditional()
{
    if (!GetLocalInt(OBJECT_SELF,"SPEAK_1"))
      {
      SetLocalInt(OBJECT_SELF,"SPEAK_1",TRUE);
        return TRUE;
      }
       return FALSE;
}


Очень полезный скрипт, иногда просто незаменим. Одна беда: он, зараза, действителен для всех без исключения неписей модуля. То есть если тебе надо закрыть еще одну веточку в диалоге любого непися, будь любезен, пиши: "SPEAK_2", потом "SPEAK_3" ну и так далее... Таким макаром можно наплодить стопитьсот этих "SPEAK_ов" и просто в них запутаться. Я этот скрипт немного переделал. Примерно так:
Neverwinter Script
int StartingConditional()
{
    if (!GetLocalInt(OBJECT_SELF,"SPEAK_1"+ GetTag(OBJECT_SELF)))
      {
      SetLocalInt(OBJECT_SELF,"SPEAK_1"+ GetTag(OBJECT_SELF),TRUE);
        return TRUE;
      }
       return FALSE;
}

То есть теперь он привязан к конкретному неписю, на другого его можно смело ставить с тем же номером, ветка диалога закроется. Проверил - работает. Естественно, я сохранил его под другим названием. Потому что оказываться от твоего, Aiwan, скрипта, я не собираюсь, иногда требуется заткнуть рот на определенную тему именно всем неписям...
Это как, можно считать "вниканием" в числовые значения, или я очередную глупость сморозил? (IMG:style_emoticons/kolobok_light/prankster2.gif)

Ну, а за предложение помощи в отладке просто и не знаю, как благодарить! И тут уж, без обид, ловлю на слове. Потому что где она точно понадобится - это когда у меня дело дойдет до фильмов. Я говорил, что шарахался от катсцен, запуганный "висяками" ПЛ-овского бандита. Но теперь бояться перестал и очень даже начинаю увлекаться.
Так что спасибо еще раз.

З.Ы. Кстати, Aiwan, у тебя я тоже занял скрипты Алишан, очень понравилось, что они регулируют отношения независимо от того, хеньша она или еще нет. Надеюсь на их основе налаживать отношения с фракцией очаровательных дикарок, которых мой робинзон найдет ближе к середине мода. Причем тут надо разные значения. Ну, с конкретной дикаркой, которой ПС принес рыбину вкусную или ожерелье какое красивое сразу Love+10 и одновременно с фракцией Love+1. Вот так и пахай, парень, пока фракция ТруЪ_Нейтрал не перейдет во фракцию Друг_ПС. Только тогда с тобой заговорит Великий Шаман (нарыл фотку настолько татуированного полинезийца, что понять не могу, как он выжил, бедняга).
Тут тоже в отладке, боюсь, без вас, ребята, вряд ли что выйдет путное...

З.Ы.Ы. Сорри за многабукафф. Говорил уже, профессионально-нравственная деформация. Лечению не поддается

Сообщение отредактировал Chiffa - Dec 1 2017, 15:07
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Dec 1 2017, 18:18
Сообщение #53


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



Разговор вроде был о количестве локалок, так что я о нём. Поясню.

Как ни крути, локалки сохраняются в массиве, у массива есть размер. Если предположить, что размер массива не зарезан специально до какого-то абсурдного числа (типа 10, 50 и т.п., что в 21-м веке редко, но таки бывает), то ограничивает нас тип переменной индекса этого массива. Самый минимум, что могли сделать биовари - 1 байт (8 бит, 2^8=256 "значений"). И тут два варианта:
- знаковый int8/char: диапазон -128...127, но т.к. индекс массива обычно 0+, то это даёт размер в 128 (этот же диапазон, например, у скиллов и абилок);
- беззнаковый unsigned int8/char: диапазон 0...255, размер 256.

Это именно тот минус, о котором я говорил, - часть реализации массива, а не особенности внутри скрипта.

Хотя я ни разу не замечал проблем с локалками. Местами использовал довольно много, даже массивы на локалках реализовывал, да и не только я. А на старых серверах без внешней бд даже все фишки чара/акка хранили в локалках на итемах.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Dec 1 2017, 18:34
Сообщение #54


Level 6
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Человек



Цитата(denis0k @ Dec 1 2017, 18:18) *
Это именно тот минус, о котором я говорил, - часть реализации массива, а не особенности внутри скрипта.

Хотя я ни разу не замечал проблем с локалками. Местами использовал довольно много, даже массивы на локалках реализовывал, да и не только я. А на старых серверах без внешней бд даже все фишки чара/акка хранили в локалках на итемах.


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

Тем более, что благодаря подсказке Aiwanа я уж точно не стану грузить на ПС лишнее. Стоит наковальня, статичный плейс - так пусть хоть локалки хранит, все польза. Это ведь только с мультитулом герой по всему острову бегает. А все остальные "инструменты" вполне могут поработать "чемоданами".

Спасибо.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Dec 2 2017, 23:54
Сообщение #55


Level 11
Иконки Групп

Класс: Волшебник
Характер: Neutral Good
Раса: Фея
NWN: Скриптинг [PW]
Край Лесов



В кастомных ELC значения из 2да вешались массивами на 1 объект, это тысячи локалок. Все работало как часы.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Dec 3 2017, 06:08
Сообщение #56


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Цитата(Chiffa @ Dec 1 2017, 18:05) *
Насчет цифровых значений тоже вроде вникал. Правда, довольно поверхностно и скорее интуитивно. Aiwan, вот, к примеру, твой скрипт из Андры:

Ну я тебя читаю на раз два (IMG:style_emoticons/kolobok_light/smile.gif) Скорее всего из-за того, что я сам был точно такой как ты, гуманитарий скорее чем скриптер-логик. Короче, ты все понял не так (IMG:style_emoticons/kolobok_light/snoozer_17.gif) Разжевываю, хоть это и есть в мануале по авроре, почитай вниматочно.
Локальная переменная это как название улицы. Например, переменная "УЛИЦА_СТРОИТЕЛЕЙ", и это "стринг" буквенное обозначение. Но, кроме всего оно имеет и числовое обозначение "интеджер" типа номер дома. Если мы не указываем его конкретное значение, то оно будет 1 или TRUE (что значит ИСТИНА для языка компьютера).
Итак что имеем:
Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL", 1);
}


Это вторая часть Марлезонского балета.

Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL", 2);
}


Это третья часть...

Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL", 3);
}


И таких частей может быть сто тыщ мульонов. А ты делаешь так:

Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL_1", TRUE);
}


Часть два
Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL_2", TRUE);
}


Часть три:

Neverwinter Script
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    SetLocalInt(oPC,"QUEST_KILL_BILL_3", TRUE);
}


Что в принципе работает но реализовано через задний проход. В общем быстро в тему для скриптов для начинающих и грызи PDF по авроре, что я писал.

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Dec 3 2017, 11:30
Сообщение #57


Level 19
Иконки Групп

Класс: Воин
Характер: Lawful Good
Раса: Человек
NWN: Скриптинг [PW]
Gem of the North
Край Лесов



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

Я изучал программирование в вузе (правда при этом я занимался им с 5-го или 7-го класса школы), абсолютное большинство студентов просто зубрит конструкции. Экзамены сдать это позволяет, а вот программировать - не очень. Рекомендую искать инфу по основам программирования, где рассказывается про алгоритмы, блок-схемы и т.п.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Dec 3 2017, 12:26
Сообщение #58


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Я тоже учил языки программирования, и тоже был ни в зуб ногой. Только Аврора дала понять что ЭТО такое и как там все просто и сложно.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Dec 3 2017, 16:59
Сообщение #59


Level 6
**

Класс: Волшебник
Характер: Chaotic Good
Раса: Человек



Цитата(Aiwan @ Dec 3 2017, 06:08) *
В общем быстро в тему для скриптов для начинающих и грызи PDF по авроре, что я писал.

Слушаюсь, мой генерал! (IMG:style_emoticons/kolobok_light/prankster2.gif)
Нет, серьезно, спасибо за разжевывание. Твой труд не пропал даром, все-таки ты имеешь дело не с самым безнадежным тупицей.
Цитата(denis0k @ Dec 3 2017, 11:30) *
Нужны базовые знания по программированию и составлению алгоритмов. После этого язык значения не имеет вовсе, можно со справочником писать на любом после пары-тройки дней знакомства с синтаксисом.

Я изучал программирование в вузе (правда при этом я занимался им с 5-го или 7-го класса школы), абсолютное большинство студентов просто зубрит конструкции. Экзамены сдать это позволяет, а вот программировать - не очень. Рекомендую искать инфу по основам программирования, где рассказывается про алгоритмы, блок-схемы и т.п.

Кстати, весьма заметно, что программирование ты постигал именно вниканием, а уж не зубрежкой. По твоей логике заметно. Это я понял, просто прочитав два-три твоих поста. Тут как у Жванецкого: "Я не разбираюсь в автомобильных шинах, моя работа - разбираться в людях."
К слову, "зубрежный" подход универсален для любых ВУЗов, не обязательно технических. У нас тоже таких хватало: вызубрят в чем отличие статьи от корреспонденции, к примеру, экзамен сдадут на "отлично". Только потом над их писаниной покатывается со смеху весь Мухосранск.
За совет спасибо. Попробую именно вникать. В базу. ГСУ сильно мешает, ясен пень, но ... попробую...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

3 страниц V  < 1 2 3
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 11th May 2024 - 17:41