Город Мастеров
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 >  
Открыть новую тему
Ответов (25 - 49)
denis0k
сообщение Nov 16 2017, 19:28
Сообщение #26


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

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



location oLoc = GetLocation(GetNearestObjectByTag("PLACE_CHEST"));
DelayCommand(0.5,AssignCommand(oPC,ActionForceMove
ToObject(GetObjectByTag("PLASE_CHEST"))));
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 17 2017, 11:33
Сообщение #27


Level 6
**

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



denis0k, спасибо за поправку. Как всегда у тебя: очень коротко и очень по делу.
Aiwan, спасибо за науку. Я люблю иногда почитывать твои саркастичные посты. И вот теперь оценил, насколько ты был ко мне доброжелателен. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Ясен пень, я первым делом полез по ссылке. И хлопнул себя по лбу: я ж акции герою не почистил! Вот только где он их испачкать успел, засранец? (IMG:style_emoticons/kolobok_light/vava.gif) Ведь только вошел на "Полигон" - и на тебе!
Почистил. Побежал, как миленький, к плейсу. Только почему-то в самом коце скрипта, когда уже и ящик стоял, и все танцы с бубном были исполнены.
Ладно... С этим смехом уж сам как-нибудь теперь разберусь.
Еще раз спасибо, ребята.
З.Ы. Aiwan, извини, немножко не в тему, но... Короче, "вылечил" я ПЛ-овского бандита. Точнее, вылечил ПЛ от знаменитого бандитского зависания, которое столько крови испортило игрокам.
Ты меня, конечно, напугал Великим Джедаем. Но потом я подумал: а какого лешего... ну, джедай... Дык я всегда смогу вернуть все взад, если накосячу, долго ли модуль в отдельную папку скопировать. Тупо снял катсцену с задержкой 20 секунд. Все. Бандит по-прежнему нападает, а если ему нападать лениво, катсцена соскакивает сама. (IMG:style_emoticons/kolobok_light/prankster2.gif)

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 17 2017, 13:53
Сообщение #28


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

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



Цитата(Chiffa @ Nov 17 2017, 14:33) *
З.Ы. Aiwan, извини, немножко не в тему, но... Короче, "вылечил" я ПЛ-овского бандита. Точнее, вылечил ПЛ от знаменитого бандитского зависания, которое столько крови испортило игрокам.
Ты меня, конечно, напугал Великим Джедаем. Но потом я подумал: а какого лешего... ну, джедай... Дык я всегда смогу вернуть все взад, если накосячу, долго ли модуль в отдельную папку скопировать. Тупо снял катсцену с задержкой 20 секунд. Все. Бандит по-прежнему нападает, а если ему нападать лениво, катсцена соскакивает сама.

(IMG:style_emoticons/kolobok_light/i-m_so_happy.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 20 2017, 12:12
Сообщение #29


Level 6
**

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



Приветствую еще раз, уважаемые мастера!
Aiwan, а не мог бы ты еще разок меня куда-нибудь послать, мне понравилось. (IMG:style_emoticons/kolobok_light/biggrin.gif)

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

Ладно... Извините за многабукаф, это профессионально-нравственная деформация, лечить бесполезно. А мне всего-то и надо, что корректно вставить в хак TGA-шные файлы типа "iit_midmisc_", "iit_thnmisc_" и т. п. то есть "портреты" вещей. Самое смешное, всегда думал, что умею работать в фотошопе. И действительно делал куда более сложные вещи, чем "заточка" рисунков под нужный размер и формат. А вот на тебе! Получается не "каменный наконечник для копья", а рисунок этого чертова наконечника на черном полотне.
Сначала поступил просто: сделал прозрачный файл 64х64 и тупо перетащил в него этот наконечник. Результат понятен: при записи tga-файла фотошоп все слои слепил в один и эту прозрачность убрал...
Стал рыть. Ответ нашел не на ГМ и даже не на WRG, а на форуме "Рыцарской саги". Там наш друг Геннадий небрежно, типа между прочим сообщает:
Цитата
Чтобы добавить прозрачность, нужно добавить рисунку альфо канал.

А дальше еще и пишет, что научил его этому некто Aiwan, известный...
Подумал, может, я чего пропустил? Ведь Геннадий практически слово в слово твою, Aiwan, PDF-ку пересказывает! Посмотрел. Нет. Там после вставления в хак портретов НПС и "кстати о музыке" сразу идут диалоги. Про прозрачность вообще ни слова.
Ну, бывал я в этом Бологом... пардон, нашел этот канал "Альфа 1". Добавил. А толку? TGA-формат при сохранении его "забывает". В PSD. PDD и т. п. - хоть сто порций. Но эти форматы не поймет уже Аврора. Пометить галкой строку "сохранить прозрачность" уже фотошоп не позволяет.
В общем, чувствую, дело в какой-нибудь ерунде, но я вот об нее спотыкаюсь. Только, прошу, не надо посылать меня в раздел "Работа с 2DA-таблицами". Читал. Там народ серьезными вещами занят, новые расы-классы добавляет, спеллы и т. п. Так спросишь у профессора высшей математики про дважды два, а ему и поплохеет. А у тебя, Aiwan, закалка возни с нубами с начала нулевых, тебя такой ерундой не проймешь. (IMG:style_emoticons/kolobok_light/prankster2.gif)
Вот я и интересуюсь: может, существует какой "букварь" по хакам, навроде твоей знаменитой PDF-ки? А уж если его автор понимает: то, что само собой разумеется для него, Автора, далеко не всегда само собой разумеется для всех остальных, - так вовсе было бы замечательно.
Спасибо.
З.Ы. Вопрос далеко не срочный. Моему "робинзону" пока есть чем заняться. Но потом пойдут каменные топоры и прочее, а Макс, зараза, по-прежнему MDL-формат в упор не видит, как и 10 лет назад. В будущее смотрю с содроганием... (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 20 2017, 13:19
Сообщение #30


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

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



Блин, я уже и не помню (IMG:style_emoticons/kolobok_light/prankster2.gif) Старею... (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Nov 20 2017, 14:38
Сообщение #31


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

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



ТГА сохраняется в 3х видах. Чтобы сохранить альфу нужно 32битный сохранять. По умолчанию 24бита.

(IMG:https://s8.hostingkartinok.com/uploads/images/2017/11/a3d0504b5abba482ec0559da85a7acee.jpg)

Сообщение отредактировал Melisse - Nov 20 2017, 14:43
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 20 2017, 14:44
Сообщение #32


Level 6
**

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



Aiwan, спасибо за участие. Разобрался. Моя привычка наступать на грабли, которых нет. Карма, так ее растак.
Короче, Геннадий правильно не стал усложнять и разжевывать. Потому что надо тупо добавлять эту альфу и не ставить ей "Непрозрачность 0", как это я делал. Нужно оставлять "Непрозрачность 100", как по умолчанию. Почему все получается правильно - понять не могу, но тут, как у ТруЪ-индусов все работает вопреки всякой логике.

Помнишь анекдот про прапорщика Наливайко: "Люлюмен - самое легкое железо. А кто шибко грамотный идет грузить чугунину". Вот я весь день эту чугунину в фотошопе и грузил. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Nov 20 2017, 14:46
Сообщение #33


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

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



Цитата
Макс, зараза, по-прежнему MDL-формат в упор не видит, как и 10 лет назад.

Попробуй это
https://neverwintervault.org/project/nwn1/o...ated-3dsmax2015
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 20 2017, 14:51
Сообщение #34


Level 6
**

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



Melisse, спасибо за подсказку. Но и при "традиционных" 24-х все пахает прекрасно, только что проверил. Но если комп приличный, берем 32, конечно, красивше же подучается. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Еще раз спасибо за скрипт! Он работает вообще только тогда, когда у моего робинзона этот молоток в правой руке. То есть реализм рулит!

З.Ы. Ну а за подсказку по максу и не знаю, как благодарить. Больная мозоль. И очень давно...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 20 2017, 16:08
Сообщение #35


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

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



Давай, делай свой модуль о приключениях ЗК на лесоповале (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 20 2017, 16:43
Сообщение #36


Level 6
**

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



Цитата(Aiwan @ Nov 20 2017, 16:08) *
Давай, делай свой модуль о приключениях ЗК на лесоповале (IMG:style_emoticons/kolobok_light/smile.gif)


Этот пост будет чистой воды офтопом, так что карайте, админы, если что не так.

Melisse, Aiwan, denis0k, просто хочу сказать спасибо за то, что вы есть. (IMG:style_emoticons/kolobok_light/angel.gif)
Понимаете, без ваших подсказок, помощи, без дружеских подначек начинаю чувствовать себя маразматиком, который занят не пойми чем. И фиг бы я вообще сделал хоть что-то , не говоря уже о таких сложных вещах, как приключения ЗК на лесоповале. (IMG:style_emoticons/kolobok_light/biggrin.gif)
А зайдешь на ГМ - и это мерзкое чувство сразу испаряется.

Вообще засесть за "робинзонаду" меня заставило жесткое разочарование в игре "ARK Survival Evolved", от которой я некоторое время буквально фанател. Начиналась она именно как робинзонада, причем очень хорошая. Но вскоре разрабы испохабили ее донельзя (это ПМСМ, разумеется). Я не стал материть разрабов, как многие форумчане на Стиме. Могу понять людей, денег всем хочется, вот и пошли на поводу у массовой школотной аудитории. Ладно, речь не об этом. Просто вместо того, чтобы бессмысленно ломать копья на Стиме, вспомнил старое правило: если хочешь, чтобы что-то было сделано хорошо, делай это сам. Правило действительно мощное, исключение из него, пожалуй, только одно - секс. Да и то, как наслышан, далеко не всегда и вовсе не у всех. (IMG:style_emoticons/kolobok_light/prankster2.gif)

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

К счастью, оказался не один. Спасибо!!!

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 20 2017, 18:34
Сообщение #37


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

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



Ну так ПЛ и делался из расчета того, что оригинал НВН не воткнул. Прям непонятно все было как-то (IMG:style_emoticons/kolobok_light/smile.gif) Захотелось сделать что-то свое.
Успешных мучений и увлечений (IMG:style_emoticons/kolobok_light/wink3.gif) Эх, вспоминаю бессонные ночи у тулсета, тестинг кривоскриптов, мапинг, диалогописание...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Nov 21 2017, 15:52
Сообщение #38


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

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



Бренд НВН и так слабо узнаваем, в отличие от того же Морровинда (а они одногодки). Если бы не тулсет, про него вообще бы никто не знал (IMG:style_emoticons/kolobok_light/smile.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 22 2017, 20:15
Сообщение #39


Level 6
**

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



Цитата(denis0k @ Nov 21 2017, 15:52) *
Бренд НВН и так слабо узнаваем, в отличие от того же Морровинда (а они одногодки). Если бы не тулсет, про него вообще бы никто не знал (IMG:style_emoticons/kolobok_light/smile.gif)

Что верно, то верно. "Беседка" вообще "делает" биоварей как хочет. И ДЭ супротив Скайрима что Невер сутротив Морра... ну и так далее. Помню, как сын, поглядев на мои мытарства, стал мне втолковывать: "Да делай ты свою робинзонаду в Скайриме! Разберешся быстрее и легче, и возможностей больше, а про графу вообще молчу!"
Но все-таки неверовкий френди-тулсет (так его однажды обозвал Lex) позволяет сделать то, что вряд ли возможно сделать в мастерских от "Беседки". А именно это, то есть характеры, личности, отношения между ними меня как раз интересуют больше всего. И мне трудно представить ПЛ (не говоря уже о "Монетке"!) на движке "Морровинда"...
Но это, разумеется, ПМСМ. И вообще заканчиваю флуд, перехожу к делу.
А дело застревает в дверях. Точнее, на дверях.
Задумался о будущем робинзона. Не век же ему робинзонить и жить в пещере. Нарыл на волте один интересный хак, перетащил оттуда модельки тросниковых и глинобитных хижин. Избушки смотрятся чудо как хорошо, даже хотел скрины выложить.
Ну, думаю, щас я в очередной раз ограблю Aiwanа, благо, он разрешает. Вытащу его знаменитые двери из полотна. И заменю полотно на бамбук.
И вот пока сижу, курю этот самый бамбук. (IMG:style_emoticons/kolobok_light/prankster2.gif)
Потому что ни одна дверь, что стандартная, что полотняная на плейс не ставится. Только секретные двери, которые вообще можно лепить куда угодно, хоть в молельне Сан в Арбонне, хоть на палатку командира гномов в Верхнем Тракте, хоть на "мои" тросниковые хижины.
Но даже деревянная секретная дверь на этой хижине смотрится инородным телом. Всю красотищщщу уродует. Про каменные вообще молчу...
И вот очень мне интересно: а можно ли вообще присобачить на плейс дверной проем как у тайла? Или как-то более иначе это решить? Например, отбамбучить секретную дверь? Она вроде тоже плейс, но в табличке "placeables.2da" ее нет. Как и в табличке "genericdoors.2da".
Не подскажете, что и в каком направлении ковырять?
И еще... Наверное, вопрос больше к вам, уважаемые Melisse и denis0k. Помню, вы обсуждали тему, разрешать игрокам на шарде строить свои дома или нет? Если я правильно вас понял, технически эта задача давно решена, и спор шел в основном о том, что "город не резиновый".
Не подскажете методу? Нет, эту тросниковую хижину с палитры вызвать легко, типа герой ее "постороил". Тут дело в другом. В хижинах у меня будет жить племя прекрасных дикарок. А герой себе "построит" что-то более другое, типа бревенчатой избы. Причем хотелось бы реализовать это поэтапно. То есть, вот фундамент заложил. Вот одна стенка, потом другая. Ну и крышей заканчивается, как везде в России...
Если это сложно и "чайник" вроде меня вряд ли такое осилит, так и скажите. Никаких обидок, давно этим не болею...
Спасибо.

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 22 2017, 20:22
Сообщение #40


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

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



Цитата(Chiffa @ Nov 22 2017, 23:15) *
Потому что ни одна дверь, что стандартная, что полотняная на плейс не ставится.

Если палатки твои это плейс, то никак. Хотя, я может и отстал от жизни... (IMG:style_emoticons/kolobok_light/prankster2.gif)
Только если есть хак плс дверей, типа секретных.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 22 2017, 21:53
Сообщение #41


Level 6
**

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



Спасибо! Ты прав. Нашел секретную дверь. Буду ее бамбучить... Хотя жалко. Шибко уж хотелось, чтобы бамбук раздвигался, как тряпоч... ой, прости! - шикарные полотнища в "Монетке".
Но видать, не судьба. (IMG:style_emoticons/kolobok_light/swoon.gif)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Nov 23 2017, 23:17
Сообщение #42


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

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



Цитата
А герой себе "построит" что-то более другое, типа бревенчатой избы. Причем хотелось бы реализовать это поэтапно. То есть, вот фундамент заложил. Вот одна стенка, потом другая. Ну и крышей заканчивается, как везде в России...
Для этого, очевидно, нужны плейсы в виде фундамента, стен и т.п.

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

Вообще, самый простой вариант для сингла - фазировка. Несколько версий одной и той же локации на разных стадиях развития сюжета.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 24 2017, 14:10
Сообщение #43


Level 6
**

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



Цитата(denis0k @ Nov 23 2017, 23:17) *
Для этого, очевидно, нужны плейсы в виде фундамента, стен и т.п.

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

Вообще, самый простой вариант для сингла - фазировка. Несколько версий одной и той же локации на разных стадиях развития сюжета.


И по моему ПМСМ тоже дурное. И на все грабли, которые ты описал, я успел споткнуться. Ну, как обычно. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Нарыл домик-плейс на волте (кстати, спасибо за ссылку, с гугл-переводчиком даже я с там там коей-чего понимать). Смех, но домик - один в один тайловый деревенский 1х1. Поставил рядом - точно, он! Только плейс.
Вызываю с палитры - герой сквозь него ходит. Ну ладно, об этом читал в теме Melisse, она же и учила, как это лечить. Вылечил. Герой вызвал домик с палитры и в нем... ты уже догадался, да? - ну ясен пень, застрял. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Продолжаем умственный изврат. Герой бежит к исполнять танцы с бубном одному плейсу, а домик спавнится на другом, чуть в стороне. В конце-концов добился, что домик появляется стенкой прямо у физии героя, а тот молотком машет, типа заколачивает последние гвозди. (IMG:style_emoticons/kolobok_light/prankster2.gif)
Ну и вторая серия Мерлезонского балета. Если домик валиден, включается триггер. Герой спикстрингает: "Ну все, осталось только навесить дверь". Бежит к дверному проему, опять танцы с бубном, спавнится дверь. Вот ведь не думал, что когда-то самую обычную, дефолтную деревянную дверь буду выдирать из базы и прописывать в хак как секретную! Но что делать, на таком деревенском домике именно она смотрится наиболее органично. Дефолтная секретка скорее для внутренней отделки.
Ну чего мне стоило добиться, чтобы дверь спавнилась точно в проеме - писать не буду. Она вообще сначала поперек становилась. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Понятно, всем этим извратом я занимался на "Полигоне". Два дня... И теперь локу, где все таки получилось, очищу от всего лишнего и аккуратненько экспортирую в "робинзонаду". И все эти тросниковые круглые хижины прелестных дикарок (кстати, еще ню-хак на волте нарыл, тоже подключу, дикарки же!) - буду расставлять возле подготовленного места, где герой свой дом "посторит".

И вот мне по прежнему интересно: как же вы собирались на шарде игрокам разрешать строительство? Это уже не с целью перенять методу, а просто интересно. Так сказать, для общего развития... Не фазировкой же, на самом деле!
Спасибо.

З.Ы. Кстати, о тросниковых хижинах. Они и правда чудо как хороши. Француз, который их нарисовал - ну настоящий Художник. Блин, с заглавной буквы "Х"! (IMG:style_emoticons/kolobok_light/biggrin.gif)
Только вот он напрочь забыл о такой фигне, как гемплей.
В самый большой домик еще как-то становится широкая секретка ("злая каменная" дверь, которую я переделал на бамбуковую). Но она маловата во высоте. В самую маленькую я запихал ... тюк сена, - герой хоть черта лысого проюзает за хвост, если на этом хвосте нужный скрипт. А что делать со средней пока ума не приложу. Все двери торчат углами из арки - смотрится отвратительно.
Но это не вопрос, сами понимаете. Так, к слову...
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Nov 24 2017, 23:58
Сообщение #44


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

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



Цитата
И вот мне по прежнему интересно: как же вы собирались на шарде игрокам разрешать строительство? Это уже не с целью перенять методу, а просто интересно. Так сказать, для общего развития... Не фазировкой же, на самом деле!
Самое простое - поставить готовые дома (как многоквартирные, так и одиночные), и туда уже пускать игроков с ключами (т.е. не строить, а покупать готовое). Можно сделать каждому по интерьеру, который он сам может обставлять как хочет, а при тычке в триггер уже телепортировать куда надо.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Nov 25 2017, 12:58
Сообщение #45


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

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



Цитата
И вот мне по прежнему интересно: как же вы собирались на шарде игрокам разрешать строительство? Это уже не с целью перенять методу, а просто интересно. Так сказать, для общего развития... Не фазировкой же, на самом деле!
Спасибо.

Несколько вариантов:
1. Игрок рисует - разраб вставляет.
2. Инстансинг локации. т.е. в определенном месте вы выбираете себе вариант дома из N вариантов и его интерьер из N вариантов - инстансите эти локации - вуаля у вас свой дом, который построен в таком-то месте. К нему есть доступ и все прочее.
3. Уже готовые дома - выбираем интерьеры и инстансим локации. Можно и без инстансов в это случае - тогда дома будут, что называется - физически присутствовать.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 25 2017, 15:40
Сообщение #46


Level 6
**

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



Цитата(Melisse @ Nov 25 2017, 12:58) *
1. Игрок рисует - разраб вставляет.

Дико извиняюсь за каламбур, но в шардах я не шарю. Впрочем, как и во многом другом. (IMG:style_emoticons/kolobok_light/biggrin.gif)
Я правильно понял: игрок просто делает себе домик в своем тулсете, а потом отправляет разрабу ерефку? Разраб ее импортирует и подключает к шарду, как новую локацимю?
Цитата(Melisse @ Nov 25 2017, 12:58) *
2. Инстансинг локации. т.е. в определенном месте вы выбираете себе вариант дома из N вариантов и его интерьер из N вариантов - инстансите эти локации - вуаля у вас свой дом, который построен в таком-то месте. К нему есть доступ и все прочее.

Можно чуть подробнее начиная со слова "инстансинг"? Шард имеет несколько, так сказать, "спрятанных" локаций, которые никому, кроме разрабов и ДМ-ов, не видны? А потом игрок выполнил какой-то суперский квест или еще что важное сделал, получил право на свой дом. Ему предлагают выбор, игрок его делает, и невидимая лока мгновеннно (таки инстант!) делается видимой, доступной и все такое? Или я опять какую-то фигню несу?

Я к чему спрашиваю. Для общего развития, все так. Но мне еще и хочется благодаря этому развитию сочинить свою методу строительства, взяв полезное от уже действующих. Например, как строят в игре "Life is Feudal". Там разрабы не стали заморачиваться с последовательным возведением фундаментов, стен и так далее. Надо тебе дом. Выбираешь место. Если подходящее, то появляется даже не фундамент, а так, разметка, четыре бревна прямоугольником и пара досок наискось. Но эта разметка, как я понял, есть контейнер со счетчиком. Пихать в этот контейнер можно только то, что требуется для строительства и ровно столько, сколько надо. Пытаешься положить "лишнее" бревно - оно уже не лезет. А когда все собрано, становиться доступна команда "построить" - и вуаля! - "из ниоткуда" появляется твой домишко. Или целый замок, если вы всем кланом таскали туда мрамор (его 5.000 надо, а больше сотни ни один игрок не утащит, и еще камень, его не то 20, не то 40 к надо, не помню, + бревна, доски ets...).
Как сами понимаете, на "Полигоне" я спавнил домишко и дверь и подгонял их друг к другу, не затрачивая никаких ресурсов. Но в игре их тратить придется! Причем если прописать, что на целый дом ушло, к примеру, по 5 бревен, кирпичей и извести, то никакого правдоподобия не будет. Где это видано, чтобы ресы для дома все целиком в инвентарь влезли! Зараз. Так не бывает...
Найти плоскость и покрасить ее "под кирпич" нетрудно. Также легко сделать этот "фундамент" контейнером. Но вот как приладить к нему "счетчик" и какой? Пока никаких толковых идей...

Ладно, иногда хорошие идеи приходят сами, если отвлечься от темы. Так что пойду я, уважаемая Melisse, ковырять твою тему. Очень уж меня табличка "appearance.2da" интересует. И в самом деле, зачем мне 4 слона! Двух за глаза хватит, большого и поменьше. Тем более, что одного вообще назвали мамонтом. Не умеешь нарисовать нормальную шерсть зверюге, так и нечего обзывать его именем благородного животного. (IMG:style_emoticons/kolobok_light/prankster2.gif)
И носорог... Это ж простой кабан, которому рог нелепо прилепили. Нет, носорог нужен, но не такой же...
А вот крокодил - красавец! Только он, зараза, совсем в другом хаке.

Короче, мне есть чем заняться. Чего не пойму, спрошу, ладно? И если кому из мастеров какие идеи насчет фундамента-контейнера случайно придут в голову - поделитесь? А нет, так нет. Мне главное, как уже писал, понимание того, что я не одинок.
Спасибо.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Melisse
сообщение Nov 27 2017, 20:20
Сообщение #47


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

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



Цитата
Я правильно понял: игрок просто делает себе домик в своем тулсете, а потом отправляет разрабу ерефку? Разраб ее импортирует и подключает к шарду, как новую локацимю?

да
На некоторых шардах процесс с интерьерами домов был в таком виде и автоматизирован. Т.е. ты загружаешь - локация проверяется - и просто заходишь туда героем и все

Цитата
Можно чуть подробнее начиная со слова "инстансинг"?

инстанс - это копия локации со слепка для чего либо, она может быть персональной или общей - как настроить. Если ты играл в ММО то видел как люди посещают данжи, создавая персональные копии локации для группы - это тоже самое.
в обычном нвн - это делается через плагины на сервере, а в ЕЕ будет доступно в комплекте игры
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Chiffa
сообщение Nov 30 2017, 23:18
Сообщение #48


Level 6
**

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



Доброго времени суток!

Возник один вопрос, как всегда у меня, нелепый. А именно: как велика "грузоподъемность" ПС в смысле локалок? Сколько их на него можно повесить?

А дело вот в чем. У меня три монстра-невидимки привязаны к иструментам. Это мультитул, молоток и клещи для наковальни. Но потом их будет гораздо больше. Так вот, я заметил, что у этих монстров не регулируются ветки диалога. Ставишь локалку, проверяешь ее - не работает.

Сначала думал - глюк какой-то. Монстр же один, тег и даже реф один и тот же. Вся и разница, что вызывается с палитры каждый раз заново. Потом дошло, что в этой разнице и дело. Получается, что движок ставит на монстра переменную. Примерно так, как и мы ее пишем в тулсете. Но монстр уничтожается в конце диалога. Заново вызывается пусть тот же, но "свеженький", без переменной.
Это верно?
И получается, что локалки можно вешать только на героя. Тогда диалог будет переключаться, как надо.
Проверил. Так оно и есть.

Вот я и малость встревожился: монстров-"инструментов" у меня много будет. Мой ПС не "надорвется"? И если надорвется, есть способ это лечить?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Dec 1 2017, 05:35
Сообщение #49


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

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



Можешь вешать локалки хоть на невидимый объект, или на локацию в которой действие, без разницы. Создай на локации невидимый объект или поставь вейпоинт где спавнится твой монстр инструмент, это и будет хранитель локальных переменных.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
denis0k
сообщение Dec 1 2017, 08:05
Сообщение #50


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

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



Какое-то внутреннее ограничение, связанное с размером массива, конечно есть. Но вряд ли оно достижимо при разумном использовании. Моё мнение - самый минимум, который там может быть, - 8 бит. Это 128 или 256 (зависит от того, хранится ли знак "минус").
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 16th May 2024 - 14:30