Город Мастеров
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 не просто так ее вписал... И не мог не предусмотреть какую-то "страховку" от зацикливания команды?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Chiffa
сообщение Nov 5 2017, 15:33
Сообщение #2


Level 6
**

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



Уважаемый denis0k, спасибо что откликнулись. Вряд ли я способен разобраться с такими скриптами. С годами - может быть. Но тратить годы, как верно подмечено:
Цитата(denis0k @ Nov 5 2017, 12:54) *
это долго и бессмысленно

Так что и правда, господь с ней, с системой PaiNt_craft. По крайней мере, пока. Поговорить хотелось о другом.
Цитата(denis0k @ Nov 5 2017, 12:54) *
Что касается крафта в нвн в принципе. Я писал довольно сложные. Всё, что нужно, в нвн есть - создание итемов, навешивание на них свойств. Сложность только с изменением внешнего вида сложных итемов

Тут позволю себе не согласиться. Крафт, ПМСМ, начинается все-таки не с этого. А с добычи. А это не только и не столько монстры ради шкурок-костей и т.п. Это активные плейсы. Я в "робинзонаде" пока поставил только четыре вида. Это "выход горной породы" (добывать кремень для ножиков-топоров), это "пласт песчанника" (точильные камни и стройматериал), это "годный куст" (волокно для тканей-веревок), ну и "годное дерево" - понятно для чего.
И произошло следующее. Герой стал дергаться, как эпилептик. Постоянно поворачивается куда угодно, только не туда, куда его посылаешь мышкой. Его атакует "морская тыдра" (ну не называть же эту тварь на "вы" - выдрой (IMG:style_emoticons/kolobok_light/biggrin.gif) ), а он куда-то опять поворачивается. У него захлопывается инвентарь сразу после открывания. Он не может подобрать дроп без нажатого пробела - все схлопывается.
Много еще он чего не так делает, но если в двух словах, то ПС стал практически неуправляем.
Да, сначала добыча у меня начиналась через диалог типа "Ага, вот деревце, а где мой топор?" и т. п. Но у меня таки хватило ума ставить скрипт, включающий эти диалоги, на "OnUsed" плейсов, а не на "OnClick" или куда похуже. Расстояние - 2 метра. Так он за километры пытается побеседовать "по душам" с плейсом, вместо того, что от него требуется.
Очень дорожу атмосферностью, но при таких делах отключил диалоги вовсе. Не помогло... Плейс "поговорить" не хочет и уже не может, а герой все одно дергается.
Убрал все породы и песчанники под землю, в пещеру к крысам. Кустики-деревца перенес на соседний островок. Не помогло.
Как говорил прапорщик Наливайко "или я дурак или одно из двух".
Понимаю, что не имея нвн и не видя моего мода, сходу не сообразишь, в чем беда. Но, уважаемые мастера, у вас нет нвн, зато есть опыт. И вы можете хотя бы предположить, в чем проблема? В моей, миль пардон, рукожопости или все-таки, упаси бог, в движке авроры?
Спасибо.
З.Ы.Да, насчет сложности крафта я не сильно парюсь. (За исключением этой чертовой добычи!) Взял систему из ПЛ, которую, если я правильно понял, сочинял DBColl. А этот гений (пишу без кавычек, заметьте!) нагородил огород из секретных плейсов, ящиков, специальных полезных таблиц 2ДА и много еще чего, но у него, как у ТруЪ-индуса непонятно почему, но все работает. И я почему-то не сомневаюсь, что даже когда 2ДА-табличка раздуется до размеров "Войны и мира", все равно будет все работать.


Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме
- Chiffa   Крафт в Neverwinter Nights - а это вообще возможно?   Nov 5 2017, 04:09
- - denis0k   На этапе компиляции в скрипт подцепляются все инкл...   Nov 5 2017, 12:54
- - Chiffa   Уважаемый denis0k, спасибо что откликнулись. Вряд ...   Nov 5 2017, 15:33
- - denis0k   Вообще не представляю, в чём проблема Я могу толь...   Nov 5 2017, 23:58
- - Chiffa   Цитата(denis0k @ Nov 5 2017, 23:58) Вообщ...   Nov 6 2017, 04:28
- - Aiwan   Chiffa, дружище, первое правило начинающего горнол...   Nov 6 2017, 06:59
- - denis0k   Да, с НПС беда конечно. Я когда ИИ боссам писал, о...   Nov 6 2017, 07:51
- - Chiffa   Цитата(Aiwan @ Nov 6 2017, 06:59) первое ...   Nov 6 2017, 09:33
- - denis0k   Так и не понял, что хотел сделать автор арифметиче...   Nov 6 2017, 17:32
- - Chiffa   Цитата(denis0k @ Nov 6 2017, 17:32) могу ...   Nov 7 2017, 02:40
- - denis0k   Очевидно, что OnDamaged всё равно запускается, даж...   Nov 7 2017, 07:44
- - Melisse   Если стоит ПлотФлаг событие не работает   Nov 7 2017, 15:08
- - denis0k   Событие не работает, а итемы создаются xD Мб у авт...   Nov 7 2017, 17:55
- - Chiffa   Цитата(denis0k @ Nov 7 2017, 07:44) Очеви...   Nov 8 2017, 00:29
- - Aiwan   Волат помер, ща какая-то новая версия сайта. https...   Nov 8 2017, 09:08
- - Chiffa   Цитата(Aiwan @ Nov 8 2017, 09:08) Волат п...   Nov 9 2017, 06:04
- - denis0k   https://nwnlexicon.com/index.php?title=TakeNumItem...   Nov 9 2017, 13:33
- - Aiwan   Chiffa, полистай мои скрипты в монетке, там много ...   Nov 9 2017, 14:51
- - Chiffa   Цитата(Aiwan @ Nov 9 2017, 14:51) Chiffa,...   Nov 10 2017, 03:14
- - Aiwan   Цитата(Chiffa @ Nov 10 2017, 06:14) Aiwan...   Nov 10 2017, 07:04
- - denis0k   Neverwinter Script#include "nw_i0_plot" ...   Nov 10 2017, 07:44
- - Aiwan   Точно   Nov 10 2017, 09:09
- - Chiffa   Aiwan. denis0k, ребята, СПА-СИ-БО!!! ...   Nov 10 2017, 09:43
- - Chiffa   Уважаемые мастера, надеюсь, я не слишком вас доста...   Nov 16 2017, 16:33
- - Aiwan   Основная твоя ошибка ты понятия не имеешь зачем вс...   Nov 16 2017, 18:51
- - denis0k   location oLoc = GetLocation(GetNearestObjectByTag(...   Nov 16 2017, 19:28
- - Chiffa   denis0k, спасибо за поправку. Как всегда у тебя: о...   Nov 17 2017, 11:33
- - Aiwan   Цитата(Chiffa @ Nov 17 2017, 14:33) З.Ы. ...   Nov 17 2017, 13:53
- - Chiffa   Приветствую еще раз, уважаемые мастера! Aiwan,...   Nov 20 2017, 12:12
- - Aiwan   Блин, я уже и не помню Старею...   Nov 20 2017, 13:19
- - Melisse   ТГА сохраняется в 3х видах. Чтобы сохранить альфу ...   Nov 20 2017, 14:38
- - Chiffa   Aiwan, спасибо за участие. Разобрался. Моя привычк...   Nov 20 2017, 14:44
- - Melisse   ЦитатаМакс, зараза, по-прежнему MDL-формат в упор ...   Nov 20 2017, 14:46
- - Chiffa   Melisse, спасибо за подсказку. Но и при "трад...   Nov 20 2017, 14:51
- - Aiwan   Давай, делай свой модуль о приключениях ЗК на лесо...   Nov 20 2017, 16:08
- - Chiffa   Цитата(Aiwan @ Nov 20 2017, 16:08) Давай,...   Nov 20 2017, 16:43
- - Aiwan   Ну так ПЛ и делался из расчета того, что оригинал ...   Nov 20 2017, 18:34
- - denis0k   Бренд НВН и так слабо узнаваем, в отличие от того ...   Nov 21 2017, 15:52
- - Chiffa   Цитата(denis0k @ Nov 21 2017, 15:52) Брен...   Nov 22 2017, 20:15
- - Aiwan   Цитата(Chiffa @ Nov 22 2017, 23:15) Потом...   Nov 22 2017, 20:22
- - Chiffa   Спасибо! Ты прав. Нашел секретную дверь. Буду ...   Nov 22 2017, 21:53
- - denis0k   ЦитатаА герой себе "построит" что-то бол...   Nov 23 2017, 23:17
- - Chiffa   Цитата(denis0k @ Nov 23 2017, 23:17) Для ...   Nov 24 2017, 14:10
- - denis0k   ЦитатаИ вот мне по прежнему интересно: как же вы с...   Nov 24 2017, 23:58
- - Melisse   ЦитатаИ вот мне по прежнему интересно: как же вы с...   Nov 25 2017, 12:58
- - Chiffa   Цитата(Melisse @ Nov 25 2017, 12:58) 1. И...   Nov 25 2017, 15:40
- - Melisse   ЦитатаЯ правильно понял: игрок просто делает себе ...   Nov 27 2017, 20:20
- - Chiffa   Доброго времени суток! Возник один вопрос, ка...   Nov 30 2017, 23:18
- - Aiwan   Можешь вешать локалки хоть на невидимый объект, ил...   Dec 1 2017, 05:35
- - denis0k   Какое-то внутреннее ограничение, связанное с разме...   Dec 1 2017, 08:05
- - Aiwan   У локальных переменных есть числовые значения. Я б...   Dec 1 2017, 09:34
- - Chiffa   Aiwan, denis0k, спасибо. Кажется, я правильно вас ...   Dec 1 2017, 15:05
- - denis0k   Разговор вроде был о количестве локалок, так что я...   Dec 1 2017, 18:18
- - Chiffa   Цитата(denis0k @ Dec 1 2017, 18:18) Это и...   Dec 1 2017, 18:34
- - Melisse   В кастомных ELC значения из 2да вешались массивами...   Dec 2 2017, 23:54
- - Aiwan   Цитата(Chiffa @ Dec 1 2017, 18:05) Насчет...   Dec 3 2017, 06:08
- - denis0k   Нужны базовые знания по программированию и составл...   Dec 3 2017, 11:30
- - Aiwan   Я тоже учил языки программирования, и тоже был ни ...   Dec 3 2017, 12:26
- - Chiffa   Цитата(Aiwan @ Dec 3 2017, 06:08) В общем...   Dec 3 2017, 16:59


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

 



Текстовая версия Сейчас: 27th April 2024 - 08:19