![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#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 не просто так ее вписал... И не мог не предусмотреть какую-то "страховку" от зацикливания команды? |
![]() |
![]()
Сообщение
#2
|
|
Level 6 ![]() ![]() Класс: Волшебник Характер: Chaotic Good Раса: Человек ![]() |
Уважаемые мастера, надеюсь, я не слишком вас достал. Пишу только потому, что сам не смог добиться толку за трое суток. Проблема наверняка из серии "галка на ландшафте" или "демаг, которого не может быть, но он есть". Но она превращает мою робинзонаду в клоунаду. (IMG:style_emoticons/kolobok_light/vava.gif)
Вот, взгляните, в чем "провинился" этот несложный скрипт. Надеюсь, увидите ошибку: Neverwinter Script #include "nw_i0_plot" #include "lm_tsurl_lib" //для работы со стеками void main() { object oPC = GetPCSpeaker(); object oGvo = FindItem("itm_der_gvozd",GetPCSpeaker()); int Number = GetItemStackSize(oGvo); if (Number==1) DestroyObject(oGvo); else SetItemStackSize(oGvo,Number-10); // Это гвозди, которые уничтожаются ровно по 10 штук, все корректно... TakeNumItems(oPC, "itm_dosk_kor", 4); // Тут тоже ок, спасибо, denis0k! location oLoc = GetLocation(GetNearestObjectByTag("PLACE_CHEST")); // Невидимый объект, статик DelayCommand(0.0,ActionPauseConversation()); // А вот отсюда начинается какая-то хрень! DelayCommand(0.5,AssignCommand(oPC,ActionForceMoveToObject(GetObje ctByTag("PLASE_CHEST")))); // НИКОГДА не идет, зараза! DelayCommand(1.5,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_L OOPING_GET_LOW ,1.0f,3.0f))); //Иногда корячится, но чаще стоит столбом DelayCommand(2.5,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_L OOPING_SIT_CROSS ,1.0f,5.0f))); // То же самое DelayCommand(3.5,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_L OOPING_TALK_FORCEFUL ,1.0f,3.0f))); // То же самое DelayCommand(5.0,AssignCommand (oPC, SpeakString("Уф... упарился, аж в глазах потемнело."))); // Чаще молчит, гад DelayCommand(7.5, ActionCreate(OBJECT_TYPE_PLACEABLE, "SAMOD_CHEST",oLoc)); //Вызывается. Иногда. Есть любопытная закономерность DelayCommand(8.5,ActionResumeConversation()); } Как вы поняли, это мой "робонзон" сколачивает ящик, накопил барахлишка, инвентарь не резиновый. Скрипт стоит на диалоге с невидимым монстром. Монстр вызывается, когда юзаешь молоток. Тут полная аналогия с маршрутизаторами ПЛ и "Саги". Монстра я импортировал, естественно, поменяв теги, рефы и вызываемые диалоги. Но монстр вряд ли в чем виноват. Потому что есть еще монстры, например, мультитул, к нему никаких претензий. Скажу сразу: дело не в моих глюканутых "лошадках". Проверял и в старой, надежной "Шадоу", и в недавно установленной 1.69 - везде одинаково. (Кстати, "лошадок" я пока не стер. Возможно, проблема даже не в них, а в 64-разрядной винде). Так вот, что происходит. 1. Если скрипт стоит на "совершены действия" ПС, то герой стоит столбом и вообще ничего не делает. Ящик с палитры не вызывается. Никогда. 2. Если переставить на "совершены действия" непися (монстра), герой изображает "танцы с бубном", а также вполне спикает и стрингает, но к плейсу не идет и ящик не вызывается. 3. Если поставить на "совершены действия" обычного непися (специально рисовал для проверки) - тогда и танцы с бубном, и спики-стринги, - все ок, и ящик вызывается. Всегда. За километр от героя, точно на плейсе. Казалось бы, куда уж яснее: "ActionForceMoveToObject(GetObjectByTag("PLASE_CHEST"))));" - так не двигается! Говорю, не робинзонада, а клоунада... Конечно, я пробовал и несколько более иначе. Без "DelayCommand", а просто "AssignCommand", естественно, через ActionWait(1.5f); или побольше. Как и учил нас, нубов, уважаемый Aiwan. Получилось еще смешнее. Тут даже герой к плейсу пошел, и все танцы исполнил. Вот только ящик плевать хотел на эту вашу "ActionWait". Появляется с палитры сразу, без малейшей задержки. И герой "сколачивает" уже готовый ящик. Может, проблема в том, что монстр-мультитул работает исключительно с предметами, потому к нему и нет претензий. А к плейстейблам нужен какой другой подход? В общем, печалька... Ведь робинзону предстоит еще по такой же схеме делать и ткацкую раму, и печку для плавки, и много еще чего в задумках. А тут такая фигня... Спасибо. З.Ы. Проделал еще один опыт, такой же дурачий, как и сама ситуация. У всех невидимых монстров слоты чистые, кроме двух, на "OnHeartbeat" (коротенький скрипт, заставляет уничтожаться после использования) и на "OnSpawn" - скрипт вызова. Так вот, я взял и тупо поставил все дефолтные скрипты на эти чистые слоты. И получилось все, как в разговоре со специально подрисованным неписем. Ну вот что за фигня, на самом деле?! |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 10:07 |