Jump to content

kainfx

Members
  • Posts

    22
  • Joined

  • Last visited

Everything posted by kainfx

  1. Thank you very much! How did you learn this ? Would you mind giving me advice how i can start learning coding rathena script ? I wanted to start learning a Programming Language like Python but im more interested in rathena script but i dont understand what this Variables? commands? or what they are called do ("for" is a loop i guess? all i understand in programming is a little html, php and sql) but what is "getarg(0)" or ".@i = 0; .@i < .@count; .@i++)" or "getd" just to name a few.
  2. WOW, i'm amazed of your skill ! You even did things i didint think of yet. Can you help once more? 1. When i log to another char on this account, the delay timer of my first char is also active for the second char 2. Quest receiver NPC is not seperating quests when i took multiple quests and wants me to for example kill all monsters of all quests before giving out a reward. 3. Quests are not scales on the character baselevel, giving a blvl 1 noviece quests to kill elder willows and other much stronger monsters 4. Maybe you can look over the script, i fear i had a lot errors in my logic when i told the ai how it should work, im just now realising what i wanted the guild to work like makes no real sense. Thank you very much for you help.
  3. Hello everyone, im a noob at scripting rathena scripts and i used grok ai to generate a massive Questguild script with random generated quests and i was able to fix a lot bugs that the ai had built in. Right now i was able to get the script running after hours of hours reading server debug messages and fixing its errors but i have to comment out the following lines because the server gives "[Error]: buildin_rand: range (-1) is too small. No randomness possible." error once these lines are active (after commenting these lines, the server gives no error or debug messages anymore, no matter how i interact with the npcs) ; If i dont comment these lines, the npc window freezes after choosing a quest kind (hunting, killing, collection) After commenting thoose lines it looks like everything works and i can take a quest BUT i dont have to do it, the reward NPC gives me the reward without me doing the quest. So it looks to me like there is also something wrong with the quest requirements check. I fear that it pure luck that anything in this script is working and there might be much more problems and bugs than i can imagine Here is the complete Quest Guild Script (feel free to use it and any part of it if you want): //===== rAthena Script ======================================= //= Adventurers Guild System (Pre-Renewal, Complete) //===== Description ========================================== //= Comprehensive guild with 12 NPCs, 8 quest givers //= Hunting, Killing (20–200 + boss), Collection quests //= Rewards exceed collected item value, pre-renewal friendly //= German dialogue, balanced for 1x rates, <10 players //===== Features ============================================= //= 8 quest givers across 5 tiers, 4 support NPCs //= Special boss monsters for Killing Quests (10x HP, ~2x ATK/DEF) //= Expanded Collection Quests with tiered pre-renewal items //= Lore Keeper and Teleport Agent for immersion //============================================================ //===== Warp Portal to Adventurers Guild ===== prontera,238,42,0 warp AdventurersGuildPortal 2,2,pvp_room,52,26 pvp_room,52,18,0 warp PronteraAdvPortal 2,2,prontera,238,46 //===== Guild Master NPC ===== pvp_room,51,45,4 script Gildenmeister Konrad 48,{ mes "[Gildenmeister Konrad]"; mes "Willkommen in der Abenteurergilde, " + strcharinfo(0) + "!"; mes "Wir sind die Hüter von Ruhm und Ehre, die Helden in die gefährlichsten Winkel Rune-Midgards schicken."; if (!#Guild_Intro) { next; mes "[Gildenmeister Konrad]"; mes "Ein neuer Rekrut! Die Welt braucht Helden wie dich."; mes "Lass mich dir unsere Gilde vorstellen..."; emotion ET_HUK; next; callsub Guild_Info; emotion ET_GO; #Guild_Intro = 1; close; } mes F_Rand( "Dein Ruhm wächst, Held!", "Welche Taten schreibst du heute in die Geschichte?", "Die Welt wartet auf deinen nächsten Schritt!", "Bereit, die Legende zu erweitern?" ); mes "Wie kann die Gilde dir dienen?"; mes " "; mes "^777777~ Du hast " + F_InsertPlural(Mission_Total,"Quest",0,"^0055FF%d^777777 %s") + " abgeschlossen. ~^000000"; next; switch(select(" ~ Gildeninformationen: ~ Missionsshop: ~ Top-Abenteurer: ~ Quest abbrechen: ~ ^777777Abbrechen^000000")) { case 1: callsub Guild_Info; close; case 2: mes "[Gildenmeister Konrad]"; mes "Du hast ^0055FF" + #Mission_Points + "^000000 Missionspunkte."; mes "Nutze sie für wertvolle Belohnungen!"; callshop "guild_shop",1; npcshopattach "guild_shop"; end; case 3: mes "[Gildenmeister Konrad]"; mes "Die Ruhmeshalle der Gilde zeigt unsere Besten:"; query_sql("SELECT char_id AS id, (SELECT `name` FROM `char` WHERE char_id = id),`value` FROM `char_reg_num` WHERE `key` = 'Mission_Total' ORDER BY CAST(`value` AS SIGNED) DESC LIMIT 5", .@id, .@name$, .@val); for (.@i = 0; .@i < 5; .@i++) mes " [Rang " + (.@i+1) + "] " + ((.@name$[.@i] == "") ? "^777777keiner" : "^0055FF" + .@name$[.@i]+"^000000 : ^FF0000" + .@val[.@i] + " Quests^000000"); close; case 4: mes "[Gildenmeister Konrad]"; mes "Willst du deinen aktuellen Quest abbrechen?"; mes "Das kostet " + F_InsertComma(QuestSettings::.Reset) + " Zeny."; next; switch(select(" ~ Quest abbrechen: ~ ^777777Abbrechen^000000")) { case 1: if (Zeny < QuestSettings::.Reset) { mes "Nicht genug Zeny, Held!"; emotion ET_SORRY; close; } Zeny -= QuestSettings::.Reset; if (Quest_Type == 2 && Quest_Monster_GID) { killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; dispbottom "Der Quest-spezifische Boss wurde entfernt."; } for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { setd "Quest" + .@i, 0; setd "Quest" + .@i + "_Count", 0; setd "Quest" + .@i + "_Needed", 0; setd "Quest" + .@i + "_Item", 0; setd "Quest" + .@i + "_Item_Needed", 0; } Quest0 = 0; Quest0_Count = 0; Quest0_Needed = 0; Quest_Type = 0; Quest_Difficulty = 0; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; Quest_Monster_Count = 0; mes "Quest abgebrochen. Du bist frei für neue Taten!"; emotion ET_MONEY; close; case 2: mes "Gut, dann weiter im Kampfe!"; emotion ET_SMILE; close; } case 5: mes "[Gildenmeister Konrad]"; mes "Kehre zurück, wenn die Abenteuerlust ruft!"; emotion ET_SCRATCH; close; } Guild_Info: mes "[Gildenmeister Konrad]"; mes "Die Abenteurergilde ist das Herz von Rune-Midgards Helden."; mes "Wir bieten Quests für alle, von Anfängern bis zu Legenden, in fünf Schwierigkeitsstufen."; mes "Sprich mit unseren Aufgabenmeistern, um deine Mission zu wählen!"; next; mes "[Gildenmeister Konrad]"; mes "Jagdquests fordern dich auf, Horden von Monstern zu besiegen."; mes "Tötungsquests stellen dich gegen Schwärme und einen mächtigen Boss."; mes "Sammelquests senden dich auf die Suche nach wertvollen Materialien."; next; mes "[Gildenmeister Konrad]"; mes "Du musst die vorherige Stufe abschließen und das richtige Level haben."; mes "Belohnungen umfassen Missionspunkte, Erfahrung, Zeny und Schätze!"; mes "Neue Quests gibt’s alle " + QuestSettings::.Delay + " Stunden."; mes "Besuche den Großmeister Wolfhart für Geschichten oder den Teleporter für Reisen!"; return; OnBuyItem: .@size = getarraysize(@bought_nameid); for (.@i = 0; .@i < .@size; .@i++) { .@j = inarray(QuestSettings::.Shop, @bought_nameid[.@i]); .@cost += (QuestSettings::.Shop[.@j+1] * @bought_quantity[.@i]); } mes "[Gildenmeister Konrad]"; if (.@cost > #Mission_Points) { mes "Nicht genug Missionspunkte, Held!"; emotion ET_SORRY; } else { for (.@i = 0; .@i < .@size; .@i++) { getitem @bought_nameid[.@i], @bought_quantity[.@i]; dispbottom "Gekauft " + @bought_quantity[.@i] + "x " + getitemname(@bought_nameid[.@i]) + "."; } #Mission_Points -= .@cost; mes "Ein guter Handel! Nutze deine Schätze weise."; emotion ET_MONEY; } deletearray @bought_nameid[0], .@size; deletearray @bought_quantity[0], .@size; close; } //===== Quest Receiver NPC ===== pvp_room,56,45,4 script Schatzmeister Alfred 48,{ mes "[Schatzmeister Alfred]"; mes "Hallo, " + strcharinfo(0) + "! Wie läuft dein Auftrag?"; if (!Quest_Type) { mes "Du hast keinen aktiven Quest. Sprich mit einem Aufgabenmeister!"; emotion ET_THINK; close; } mes F_Rand( "Zeig mir, was du geschafft hast!", "Bist du bereit, deine Beute abzuliefern?", "Was hast du für mich, Held?" ); next; switch(Quest_Difficulty) { case 1: callsub Check_Quest, 1, 20, 0; break; case 2: callsub Check_Quest, 21, 40, 1; break; case 3: callsub Check_Quest, 41, 60, 2; break; case 4: callsub Check_Quest, 61, 80, 3; break; case 5: callsub Check_Quest, 81, 99, 4; break; default: mes "[Schatzmeister Alfred]"; mes "Etwas ist schiefgelaufen. Sprich mit dem Gildenmeister Konrad."; emotion ET_SORRY; close; } close; Check_Quest: mes "[Schatzmeister Alfred]"; mes "Dein Fortschritt:"; if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { if (getd("Quest" + .@i)) { .@mob = getd("Quest" + .@i); .@count = getd("Quest" + .@i + "_Count"); .@needed = getd("Quest" + .@i + "_Needed"); mes " > " + getmonsterinfo(.@mob, MOB_NAME) + " (" + .@count + "/" + .@needed + ")"; } } } if (Quest_Type == 2) { // Killing .@mob = Quest0; .@count = Quest0_Count; .@needed = Quest0_Needed; mes " > " + getmonsterinfo(.@mob, MOB_NAME) + " (" + .@count + "/" + .@needed + ")"; mes " > Boss " + getmonsterinfo(.@mob, MOB_NAME) + " (" + (Quest_Monster_Count ? "Erlegt" : "Auf " + Quest_Monster_Map$ + "") + ")"; } if (Quest_Type == 3) { // Collection for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { if (getd("Quest" + .@i + "_Item")) { .@item = getd("Quest" + .@i + "_Item"); .@needed = getd("Quest" + .@i + "_Item_Needed"); mes " > " + getitemname(.@item) + " (" + countitem(.@item) + "/" + .@needed + ")"; } } } .@complete = callsub Check_Completion; if (.@complete) { next; mes "[Schatzmeister Alfred]"; mes "Hervorragend, du hast den Quest gemeistert!"; mes "Die Gilde ist stolz auf dich!"; emotion ET_BEST; specialeffect2 EF_ANGEL; specialeffect2 EF_TRUESIGHT; if (Quest_Type == 2 && Quest_Monster_GID) { killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; dispbottom "Der Quest-spezifische Boss wurde entfernt."; } .@points = Quest_Difficulty * 2 + rand(1,5); .@exp = Quest_Difficulty * 10000 + rand(5000,15000); .@zeny = Quest_Difficulty * 2000 + rand(1000,4000); .@rare_chance = rand(100); if (.@rare_chance < 1) { // 1% rare item setarray .@rare_items[0], 607, 1201, 1101, 1601, 2301, 2101, 7179; // Ygg Berry, weapons, Old Card Album .@rare_item = .@rare_items[rand(getarraysize(.@rare_items))]; getitem .@rare_item, 1; mes " > Seltener Fund: ^0055FF" + getitemname(.@rare_item) + "^000000!"; } else if (.@rare_chance < 10) { // 9% uncommon item setarray .@uncommon_items[0], 601, 602, 645, 656, 657; // Fly Wing, Butterfly Wing, etc. .@uncommon_item = .@uncommon_items[rand(getarraysize(.@uncommon_items))]; .@qty = rand(1,3); getitem .@uncommon_item, .@qty; mes " > Fund: ^0055FF" + getitemname(.@uncommon_item) + " x" + .@qty + "^000000"; } else { // 90% common item setarray .@common_items[0], 501, 502, 503, 504, 505, 512, 513, 514; // Potions, fruits .@common_item = .@common_items[rand(getarraysize(.@common_items))]; .@qty = rand(3,10); getitem .@common_item, .@qty; mes " > Fund: ^0055FF" + getitemname(.@common_item) + " x" + .@qty + "^000000"; } mes "Belohnungen:"; mes " > Missionspunkte: ^0055FF" + .@points + "^000000"; mes " > Basis-EXP: ^0055FF" + F_InsertComma(.@exp) + "^000000"; mes " > Berufs-EXP: ^0055FF" + F_InsertComma(.@exp) + "^000000"; mes " > Zeny: ^0055FF" + F_InsertComma(.@zeny) + "^000000"; #Mission_Points += .@points; BaseExp += .@exp; JobExp += .@exp; Zeny += .@zeny; for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { setd "Quest" + .@i, 0; setd "Quest" + .@i + "_Count", 0; setd "Quest" + .@i + "_Needed", 0; if (Quest_Type == 3) { .@item = getd("Quest" + .@i + "_Item"); .@needed = getd("Quest" + .@i + "_Item_Needed"); if (.@item) delitem .@item, .@needed; setd "Quest" + .@i + "_Item", 0; setd "Quest" + .@i + "_Item_Needed", 0; } } Quest0 = 0; Quest0_Count = 0; Quest0_Needed = 0; Quest_Type = 0; Quest_Difficulty = 0; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; Quest_Monster_Count = 0; if (QuestSettings::.Delay) #Quest_Delay = gettimetick(2) + (QuestSettings::.Delay * 3600); Mission_Total++; setd "Quest_Tier" + Quest_Difficulty + "_Progress", getd("Quest_Tier" + Quest_Difficulty + "_Progress") + 1; if (getd("Quest_Tier" + Quest_Difficulty + "_Progress") >= (QuestSettings::.Hunting_Quests + QuestSettings::.Killing_Quests + QuestSettings::.Collection_Quests)) setd "Quest_Tier" + Quest_Difficulty + "_Complete", 1; if (Mission_Total == 1) query_sql("INSERT INTO `char_reg_num` (`char_id`,`key`,`index`,`value`) VALUES (" + getcharid(0) + ",'Mission_Total','0',1)"); else query_sql("UPDATE `char_reg_num` SET `value` = " + Mission_Total + " WHERE `char_id` = " + getcharid(0) + " AND `key` = 'Mission_Total'"); close; } mes "Du bist noch nicht fertig, Held!"; mes F_Rand( "Weiter so, die Gilde zählt auf dich!", "Du bist nah dran, gib nicht auf!", "Ein wenig mehr, und der Ruhm ist dein!" ); emotion ET_SMILE; close; Check_Completion: if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { if (getd("Quest" + .@i) && getd("Quest" + .@i + "_Count") < getd("Quest" + .@i + "_Needed")) return 0; } return 1; } else if (Quest_Type == 2) { // Killing return (Quest0_Count >= Quest0_Needed && Quest_Monster_Count); } else if (Quest_Type == 3) { // Collection for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { if (getd("Quest" + .@i + "_Item") && countitem(getd("Quest" + .@i + "_Item")) < getd("Quest" + .@i + "_Item_Needed")) return 0; } return 1; } return 0; OnNPCKillEvent: if (!Quest_Type || (!getcharid(1) || !QuestSettings::.Party)) { if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < QuestSettings::.Max_Quests; .@i++) { if (getd("Quest" + .@i) && getmonsterinfo(killedrid, MOB_NAME) == getmonsterinfo(getd("Quest" + .@i), MOB_NAME)) { if (getd("Quest" + .@i + "_Count") < getd("Quest" + .@i + "_Needed")) { setd "Quest" + .@i + "_Count", getd("Quest" + .@i + "_Count") + 1; dispbottom "[Quest] Getötet " + getd("Quest" + .@i + "_Count") + " von " + getd("Quest" + .@i + "_Needed") + " " + getmonsterinfo(killedrid, MOB_NAME) + "."; end; } } } } if (Quest_Type == 2 && Quest0 && getmonsterinfo(killedrid, MOB_NAME) == getmonsterinfo(Quest0, MOB_NAME)) { if (Quest0_Count < Quest0_Needed) { Quest0_Count++; dispbottom "[Quest] Getötet " + Quest0_Count + " von " + Quest0_Needed + " " + getmonsterinfo(Quest0, MOB_NAME) + "."; end; } } } else if (QuestSettings::.Party) { .@mob = killedrid; getmapxy(.@map1$,.@x1,.@y1); getpartymember getcharid(1),1; getpartymember getcharid(1),2; for (.@i = 0; .@i < $@partymembercount; .@i++) { if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) { set .@Quest_Type, getvar(Quest_Type, $@partymembercid[.@i]); set .@HP, readparam(HP, $@partymembercid[.@i]); if (.@Quest_Type && .@HP > 0) { getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@i])); if ((.@map1$ == .@map2$ || QuestSettings::.Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || QuestSettings::.Party < 3)) { if (.@Quest_Type == 1) { for (.@j = 0; .@j < QuestSettings::.Max_Quests; .@j++) { .@my_mob = getvar(getd("Quest" + .@j), $@partymembercid[.@i]); .@my_count = getvar(getd("Quest" + .@j + "_Count"), $@partymembercid[.@i]); .@my_needed = getvar(getd("Quest" + .@j + "_Needed"), $@partymembercid[.@i]); if (.@my_mob && getmonsterinfo(.@mob, MOB_NAME) == getmonsterinfo(.@my_mob, MOB_NAME) && .@my_count < .@my_needed) { setd "Quest" + .@j + "_Count", .@my_count + 1, $@partymembercid[.@i]; dispbottom "[Quest] Getötet " + (.@my_count + 1) + " von " + .@my_needed + " " + getmonsterinfo(.@mob, MOB_NAME) + ".", 0x777777, $@partymembercid[.@i]; break; } } } if (.@Quest_Type == 2) { .@my_mob = getvar(Quest0, $@partymembercid[.@i]); .@my_count = getvar(Quest0_Count, $@partymembercid[.@i]); .@my_needed = getvar(Quest0_Needed, $@partymembercid[.@i]); if (.@my_mob && getmonsterinfo(.@mob, MOB_NAME) == getmonsterinfo(.@my_mob, MOB_NAME) && .@my_count < .@my_needed) { setd "Quest0_Count", .@my_count + 1, $@partymembercid[.@i]; dispbottom "[Quest] Getötet " + (.@my_count + 1) + " von " + .@my_needed + " " + getmonsterinfo(.@mob, MOB_NAME) + ".", 0x777777, $@partymembercid[.@i]; } } } } } } } end; OnPCLogoutEvent: if (Quest_Type == 2 && Quest_Monster_GID) { killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; Quest_Monster_Count = 0; dispbottom "Dein Quest-spezifischer Boss wurde entfernt, da du dich abgemeldet hast."; } end; } //===== Special Boss Monster Label ===== - script QuestMonster -1,{ OnQuestMobKilled: if (Quest_Type == 2 && Quest_Monster_GID == killedgid && Quest0 == Quest_Monster_ID) { if (!getcharid(1) || !QuestSettings::.Party) { Quest_Monster_Count = 1; dispbottom "[Quest] Ziel Boss " + getmonsterinfo(Quest_Monster_ID, MOB_NAME) + " erlegt!"; killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; } else if (QuestSettings::.Party) { getmapxy(.@map1$,.@x1,.@y1); getpartymember getcharid(1),1; getpartymember getcharid(1),2; for (.@i = 0; .@i < $@partymembercount; .@i++) { if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) { set .@Quest_Type, getvar(Quest_Type, $@partymembercid[.@i]); set .@HP, readparam(HP, $@partymembercid[.@i]); set .@Quest_GID, getvar(Quest_Monster_GID, $@partymembercid[.@i]); set .@Quest_Mob, getvar(Quest0, $@partymembercid[.@i]); if (.@Quest_Type == 2 && .@HP > 0 && .@Quest_GID == killedgid && .@Quest_Mob == Quest_Monster_ID) { getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@i])); if ((.@map1$ == .@map2$ || QuestSettings::.Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || QuestSettings::.Party < 3)) { setd "Quest_Monster_Count", 1, $@partymembercid[.@i]; dispbottom "[Quest] Ziel Boss " + getmonsterinfo(Quest_Monster_ID, MOB_NAME) + " erlegt!", 0x777777, $@partymembercid[.@i]; killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; setd "Quest_Monster_GID", 0, $@partymembercid[.@i]; setd "Quest_Monster_Map$", "", $@partymembercid[.@i]; setd "Quest_Monster_ID", 0, $@partymembercid[.@i]; break; } } } } } } end; } //===== Lore Keeper NPC ===== pvp_room,48,45,4 script Großmeister Wolfhart 48,{ mes "[Großmeister Wolfhart]"; mes "Willkommen, Wanderer " + strcharinfo(0) + "."; mes "Ich bin der Hüter der Geschichten von Rune-Midgard."; mes "Welche Weisheit suchst du?"; next; switch(select(" ~ Über die Gilde: ~ Über Quests: ~ Über Rune-Midgard: ~ ^777777Abbrechen^000000")) { case 1: mes "[Großmeister Wolfhart]"; mes "Die Abenteurergilde wurde vor Jahrhunderten gegründet, als Helden sich vereinten, um das Land vor Chaos zu schützen."; mes "Unsere Hallen sind voller Taten von Mut und Ruhm."; mes "Sprich mit dem Gildenmeister Konrad, um deinen Platz unter den Legenden zu finden."; emotion ET_THINK; close; case 2: mes "[Großmeister Wolfhart]"; mes "Quests sind die Prüfungen der Gilde. Jage Monster, besiege mächtige Bosse oder sammle seltene Schätze."; mes "Jeder Aufgabenmeister hat seine eigenen Geschichten – höre genau hin, denn sie bergen Hinweise!"; mes "Der Empfänger wird deinen Fortschritt prüfen."; emotion ET_BOOK; close; case 3: mes "[Großmeister Wolfhart]"; mes "Rune-Midgard ist ein Land voller Wunder und Gefahren."; mes "Von den Feldern Pronteras bis zu den Tiefen von Glast Heim lauern Monster und Schätze."; mes "Man sagt, selbst Porings waren einst friedlich, bis ein Fluch sie verdarb..."; emotion ET_DELIGHT; close; case 4: mes "[Großmeister Wolfhart]"; mes "Die Geschichten warten auf dich, wenn du bereit bist."; emotion ET_SMILE; close; } } //===== Teleport Agent NPC ===== pvp_room,59,45,4 script Stallmeister Tobias 48,{ mes "[Stallmeister Tobias]"; mes "Hallo, Abenteurer " + strcharinfo(0) + "!"; mes "Ich kann dich zu den gefährlichsten Orten Rune-Midgards bringen."; mes "Wohin willst du? Es kostet ein wenig Zeny."; next; switch(select(" ~ Tier 1 Gebiete (100 Zeny): ~ Tier 2 Gebiete (200 Zeny): ~ Tier 3 Gebiete (300 Zeny): ~ Tier 4 Gebiete (400 Zeny): ~ Tier 5 Gebiete (500 Zeny): ~ ^777777Abbrechen^000000")) { case 1: callsub Warp_To, 1, 100; break; case 2: callsub Warp_To, 2, 200; break; case 3: callsub Warp_To, 3, 300; break; case 4: callsub Warp_To, 4, 400; break; case 5: callsub Warp_To, 5, 500; break; case 6: mes "[Stallmeister Tobias]"; mes "Kehre zurück, wenn du reisen willst!"; emotion ET_SMILE; close; } Warp_To: .@tier = getarg(0); .@cost = getarg(1); mes "[Stallmeister Tobias]"; if (Zeny < .@cost) { mes "Nicht genug Zeny! Du brauchst " + .@cost + " Zeny."; emotion ET_SORRY; close; } .@map_array$ = getd("QuestSettings::.Maps_Tier" + .@tier + "$"); .@size = getarraysize(.@map_array$); mes "Wähle dein Ziel:"; for (.@i = 0; .@i < .@size; .@i++) mes " ~ " + .@map_array$[.@i]; mes " ~ ^777777Abbrechen^000000"; next; .@select = select( implode(.@map_array$, ":") + ":^777777Abbrechen^000000" ) - 1; if (.@select >= .@size) { mes "[Stallmeister Tobias]"; mes "Kehre zurück, wenn du bereit bist!"; emotion ET_SMILE; close; } Zeny -= .@cost; warp .@map_array$[.@select], 0, 0; mes "[Stallmeister Tobias]"; mes "Viel Glück, Abenteurer!"; emotion ET_GO; close; } //===== Quest Giver NPCs (8 Total) ===== // Tier 1: Melder Kurt pvp_room,30,85,4 script Melder Kurt 48,{ mes "[Melder Kurt]"; mes "Grüß dich, junger Abenteurer " + strcharinfo(0) + "!"; mes "Die Welt von Rune-Midgard braucht Helden wie dich."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (Quest_Type && Quest_Difficulty != 1) { mes "Du hast einen anderen Quest. Schließe den zuerst ab!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm zurück nach " + Time2Str(#Quest_Delay) + " für einen neuen Quest."; emotion ET_SWEAT; close; } mes F_Rand( "Die Dörfer rufen nach Hilfe, bist du bereit?", "Kleine Taten machen große Helden!", "Dein Abenteuer beginnt hier, Held!" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 1–20 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 1; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 1; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 1; close; case 4: mes "[Melder Kurt]"; mes "Keine Eile, komm zurück, wenn du bereit bist!"; emotion ET_SMILE; close; } } // Tier 2: Spähtruppführer Rolf pvp_room,38,85,4 script Spähtruppführer Rolf 48,{ mes "[Spähtruppführer Rolf]"; mes "Hallo, mutiger Abenteurer " + strcharinfo(0) + "!"; mes "Du hast deine ersten Taten vollbracht, nun warten größere Prüfungen."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 21 || BaseLevel > 40) { mes "Dein Level passt nicht (21–40)."; emotion ET_NO; close; } if (!Quest_Tier1_Complete) { mes "Du musst erst alle Anfänger-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 2) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Dein Name wird in den Tavernen gesungen!", "Die Karawanen brauchen Schutz, bist du bereit?", "Zeit für Ruhm, Held!" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 21–40 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 2; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 2; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 2; close; case 4: mes "[Spähtruppführer Rolf]"; mes "Kehre zurück, wenn der Mut dich treibt!"; emotion ET_SMILE; close; } } // Tier 3: Zugführer Gregor pvp_room,46,85,4 script Zugführer Gregor 48,{ mes "[Zugführer Gregor]"; mes "Sei gegrüßt, tapferer " + strcharinfo(0) + "!"; mes "Deine Taten hallen durch Rune-Midgard."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 41 || BaseLevel > 60) { mes "Dein Level passt nicht (41–60)."; emotion ET_NO; close; } if (!Quest_Tier2_Complete) { mes "Du musst erst alle Novizen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 3) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Die Magiergilde braucht deine Stärke!", "Dein Ruhm wächst, doch die Gefahr auch!", "Bist du bereit für wahre Prüfungen?" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 41–60 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 3; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 3; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 3; close; case 4: mes "[Zugführer Gregor]"; mes "Die Magie der Quests wartet auf dich!"; emotion ET_SMILE; close; } } // Tier 4: Stabsfeldwebel Hagen pvp_room,54,85,4 script Stabsfeldwebel Hagen 48,{ mes "[Stabsfeldwebel Hagen]"; mes "Willkommen, erfahrener " + strcharinfo(0) + "!"; mes "Du bist ein Jäger der Dunkelheit, bereit für große Missionen."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Die Dunkelheit fürchtet deinen Namen!", "Bist du bereit, die Bestien zu jagen?", "Deine Legende wird in Stein gemeißelt!" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 61–80 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 4; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 4; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 4; close; case 4: mes "[Stabsfeldwebel Hagen]"; mes "Die Beute entkommt nicht ewig, komm zurück!"; emotion ET_SMILE; close; } } // Tier 4: Hauptmann Lothar pvp_room,62,85,4 script Hauptmann Lothar 48,{ mes "[Hauptmann Lothar]"; mes "Grüß dich, " + strcharinfo(0) + ", Schatten der Gilde!"; mes "Nur die Besten bestehen meine Prüfungen."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Die Nacht ruft nach deinen Klingen!", "Deine Feinde zittern vor deinem Namen!", "Bist du bereit für die Elite?" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 61–80 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 4; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 4; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 4; close; case 4: mes "[Hauptmann Lothar]"; mes "Die Schatten warten auf dich, Held!"; emotion ET_SMILE; close; } } // Tier 5: Oberst Wilfried pvp_room,70,85,4 script Oberst Wilfried 48,{ mes "[Oberst Wilfried]"; mes "Sei’s drum, Legende " + strcharinfo(0) + "!"; mes "Nur die Mächtigsten bestehen die Prüfungen der Gilde."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Deine Taten sind Legende, doch die größte Prüfung wartet!", "Die Götter beobachten dich, Held!", "Bist du bereit, die Dunkelheit zu bannen?" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 81–99 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 5; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 5; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 5; close; case 4: mes "[Oberst Wilfried]"; mes "Selbst Legenden brauchen Pausen. Komm zurück!"; emotion ET_SMILE; close; } } // Tier 5: General Wolfram pvp_room,78,85,4 script General Wolfram 48,{ mes "[General Wolfram]"; mes "Heil dir, " + strcharinfo(0) + ", Licht der Gilde!"; mes "Dein Name ist ein Leuchtfeuer für alle Helden."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Die Welt kniet vor deiner Macht!", "Deine Taten werden in Epen besungen!", "Bist du bereit für die letzte Prüfung?" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 81–99 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 5; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 5; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 5; close; case 4: mes "[General Wolfram]"; mes "Das Licht der Legenden leuchtet weiter!"; emotion ET_SMILE; close; } } // Tier 5: Kriegsminister Gustav pvp_room,86,85,4 script Kriegsminister Gustav 48,{ mes "[Kriegsminister Gustav]"; mes "Ehre sei dir, " + strcharinfo(0) + ", Meister der Gilde!"; mes "Nur die Größten wagen meine Aufgaben."; if (getarraysize(QuestSubroutines::.Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close; } mes F_Rand( "Deine Stärke ist ohnegleichen!", "Die Welt braucht deinen Mut, Meister!", "Bist du bereit für die ultimative Prüfung?" ); mes "Welche Aufgabe wählst du?"; mes "^777777Level 81–99 Quests^000000"; next; switch(select(" ~ Jagd-Quest: ~ Tötungs-Quest: ~ Sammel-Quest: ~ ^777777Abbrechen^000000")) { case 1: callsub QuestSubroutines::Generate_Hunting_Quest, 5; close; case 2: callsub QuestSubroutines::Generate_Killing_Quest, 5; close; case 3: callsub QuestSubroutines::Gen_Collection_Quest, 5; close; case 4: mes "[Kriegsminister Gustav]"; mes "Die Meisterschaft erwartet dich, Held!"; emotion ET_SMILE; close; } } //===== Quest Generation Subroutines ===== - script QuestSubroutines -1,{ OnInit: // Quest story templates setarray .Hunting_Stories$[0], "Die [Monster1] und ihre Brüder [Monster2] bedrohen die Felder! Jage sie!", "Die Händler klagen über [Monster1] in der Nähe. Erlege sie!", "Ein Rudel [Monster1] und [Monster2] hat die Straßen unsicher gemacht. Säubere sie!", "Die Bauern fürchten die [Monster1]. Bringe Frieden zurück!", "Die [Monster1] und [Monster2] stören die Karawanen. Jage sie!", "Die Wälder sind voller [Monster1]. Zeig deine Stärke!", "Die [Monster1] und ihre Verbündeten [Monster2] bedrohen die Dörfer. Stoppe sie!", "Ein Nest von [Monster1] wurde entdeckt. Vernichte es!", "Die [Monster1] und [Monster2] haben die Händler vertrieben. Jage sie!", "Die Gelehrten bitten um Hilfe gegen [Monster1]. Erlege sie!"; setarray .Killing_Stories$[0], "Die [Monster] bedrohen [Map], angeführt von einem mächtigen Boss [Monster]! Erlege sie alle!", "Ein Schwarm [Monster] und ihr Boss [Monster] haben [Map] übernommen. Säubere das Gebiet!", "Die [Monster] in [Map] folgen einem Boss [Monster]. Besiege sie und ihren Anführer!", "Die Magiergilde meldet [Monster] in [Map], geleitet von einem Boss [Monster]. Stoppe sie!", "Karawanen in [Map] werden von [Monster] und einem Boss [Monster] angegriffen. Rette sie!", "Ein Fluch hat die [Monster] und ihren Boss [Monster] in [Map] erweckt. Beende ihn!", "Die [Monster] in [Map] gehorchen einem Boss [Monster]. Bringe Frieden zurück!", "Ein Boss [Monster] führt die [Monster] in [Map] an. Besiege sie für die Händler!", "Die [Monster] und ihr Boss [Monster] terrorisieren [Map]. Stelle dich ihnen!", "Ein Boss [Monster] und seine [Monster] bedrohen [Map]. Vertreibe sie für die Gelehrten!"; setarray .Collection_Stories$[0], "Die Schmiede benötigen [Item1] und [Item2] für neue Worte. Sammle sie!", "Die Alchemisten bitten um [Item1] für ihre Tränke. Bringe sie!", "Die Händler suchen [Item1] und [Item2] für den Handel. Finde sie!", "Die Magiergilde braucht [Item1] für ein Ritual. Sammle sie!", "Die Bauern benötigen [Item1] und [Item2] für ihre Felder. Hilf ihnen!", "Ein Sammler zahlt gut für [Item1]. Bringe sie ihm!", "Die Gilde braucht [Item1] und [Item2] für Vorräte. Sammle sie!", "Ein Händler sucht [Item1] für seine Karawane. Finde sie!", "Die Gelehrten benötigen [Item1] und [Item2] für Studien. Bringe sie!", "Ein Priester bittet um [Item1] für ein heiliges Ritual. Sammle sie!"; // Debug: Verify array size debugmes "QuestSubroutines: Hunting_Stories$ size: " + getarraysize(.Hunting_Stories$); debugmes "QuestSubroutines: Killing_Stories$ size: " + getarraysize(.Killing_Stories$); debugmes "QuestSubroutines: Collection_Stories$ size: " + getarraysize(.Collection_Stories$); end; Generate_Hunting_Quest: .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@count = rand(1,3); .@min_level = .@difficulty * 20 - 19; .@max_level = .@difficulty * 20; .@min_count = .@difficulty * 10; .@max_count = .@difficulty * 20; query_sql("SELECT ID FROM `mob_db` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND level >= " + .@min_level + " AND level <= " + .@max_level + " AND instr('"+QuestSettings::.Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT " + .@count, .@mobs); //.@story_index = rand(getarraysize(.Hunting_Stories$)); .@story$ = .Hunting_Stories$[.@story_index]; for (.@i = 0; .@i < .@count; .@i++) { .@mob_name$ = getmonsterinfo(.@mobs[.@i], MOB_NAME); .@story$ = replacestr(.@story$, "[Monster" + (.@i+1) + "]", .@mob_name$); } mes .@story$; for (.@i = 0; .@i < .@count; .@i++) { .@needed = rand(.@min_count, .@max_count); setd "Quest" + .@i, .@mobs[.@i]; setd "Quest" + .@i + "_Needed", .@needed; setd "Quest" + .@i + "_Count", 0; mes " > Jage " + .@needed + " " + getmonsterinfo(.@mobs[.@i], MOB_NAME) + "."; } mes "Belohnung: Missionspunkte, Erfahrung, Zeny und vielleicht ein seltener Schatz!"; next; if (select("Annehmen:Abbrechen") == 2) { mes "[Aufgabenmeister]"; mes "Kehre zurück, wenn du bereit bist!"; emotion ET_SMILE; close; } Quest_Type = 1; Quest_Difficulty = .@difficulty; mes "[Aufgabenmeister]"; mes F_Rand( "Los, Held! Zeig ihnen deine Stärke!", "Viel Erfolg! Die Gilde zählt auf dich!", "Die Jagd beginnt, melde dich beim Empfänger!" ); return; Generate_Killing_Quest: .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@min_level = .@difficulty * 20 - 19; .@max_level = .@difficulty * 20; switch (.@difficulty) { case 1: .@min_count = 20; .@max_count = 50; break; case 2: .@min_count = 50; .@max_count = 80; break; case 3: .@min_count = 80; .@max_count = 120; break; case 4: .@min_count = 120; .@max_count = 160; break; case 5: .@min_count = 160; .@max_count = 200; break; } query_sql("SELECT ID FROM `mob_db` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND level >= " + .@min_level + " AND level <= " + .@max_level + " AND instr('"+QuestSettings::.Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT 1", .@mob); .@map_array$ = getd("QuestSettings::.Maps_Tier" + .@difficulty + "$"); .@map$ = .@map_array$[rand(getarraysize(.@map_array$))]; .@needed = rand(.@min_count, .@max_count); //.@story_index = rand(getarraysize(.Killing_Stories$)); .@story$ = .Killing_Stories$[.@story_index]; .@mob_name$ = getmonsterinfo(.@mob[0], MOB_NAME); .@story$ = replacestr(.@story$, "[Monster]", .@mob_name$); .@story$ = replacestr(.@story$, "[Map]", .@map$); mes .@story$; mes " > Erlege " + .@needed + " " + .@mob_name$ + "."; mes " > Besiege 1 Boss " + .@mob_name$ + " auf " + .@map$ + "."; mes "Belohnung: Missionspunkte, Erfahrung, Zeny und vielleicht ein seltener Schatz!"; next; if (select("Annehmen:Abbrechen") == 2) { mes "[Aufgabenmeister]"; mes "Kehre zurück, wenn du bereit bist!"; emotion ET_SMILE; close; } Quest_Type = 2; Quest_Difficulty = .@difficulty; Quest0 = .@mob[0]; Quest0_Count = 0; Quest0_Needed = .@needed; Quest_Monster_ID = .@mob[0]; Quest_Monster_Map$ = .@map$; Quest_Monster_Count = 0; .@hp = getmonsterinfo(.@mob[0], MOB_MAXHP) * 10; Quest_Monster_GID = monster(.@map$, 0, 0, "Boss " + .@mob_name$, .@mob[0], 1, "QuestMonster::OnQuestMobKilled", .@hp); mes "[Aufgabenmeister]"; mes F_Rand( "Ein mächtiger Boss " + .@mob_name$ + " erwartet dich auf " + .@map$ + "!", "Viel Glück, Held! Melde dich beim Empfänger, wenn du fertig bist!", "Dein Ruhm wächst mit diesem Sieg!" ); return; Gen_Collection_Quest: .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@item_count = rand(1,3); .@min_item = .@difficulty * 5; .@max_item = .@difficulty * 10 + 10; .@items$ = getd("QuestSettings::.Items_Tier" + .@difficulty + "$"); explode(.@item_array$, .@items$, ","); .@size = getarraysize(.@item_array$); .@item_indices = rand(.@size); .@items_selected = min(.@item_count, .@size); for (.@i = 0; .@i < .@items_selected; .@i++) { .@item_list[.@i] = atoi(.@item_array$[(.@item_indices + .@i) % .@size]); } //.@story_index = rand(getarraysize(.Collection_Stories$)); .@story$ = .Collection_Stories$[.@story_index]; for (.@i = 0; .@i < .@items_selected; .@i++) { .@item_name$ = getitemname(.@item_list[.@i]); .@story$ = replacestr(.@story$, "[Item" + (.@i+1) + "]", .@item_name$); } mes .@story$; for (.@i = 0; .@i < .@items_selected; .@i++) { .@item_needed = rand(.@min_item, .@max_item); setd "Quest" + .@i + "_Item", .@item_list[.@i]; setd "Quest" + .@i + "_Item_Needed", .@item_needed; mes " > Sammle " + .@item_needed + " " + getitemname(.@item_list[.@i]) + "."; } mes "Belohnung: Missionspunkte, Erfahrung, Zeny und vielleicht ein seltener Schatz!"; next; if (select("Annehmen:Abbrechen") == 2) { mes "[Aufgabenmeister]"; mes "Kehre zurück, wenn du bereit bist!"; emotion ET_SMILE; close; } Quest_Type = 3; Quest_Difficulty = .@difficulty; mes "[Aufgabenmeister]"; mes F_Rand( "Die Schätze warten auf dich, Held!", "Viel Erfolg! Zum Empfänger, wenn fertig!", "Zeig, dass du ein wahrer Sammler bist!" ); return; } //===== Shop Definition ===== - shop guild_shop -1,611:-1,501:-1,502:-1,503:-1,504:-1,506:-1,645:-1,656:-1,601:-1,602:-1,1065:-1,1750:-1 //===== Quest Settings and Data ===== - script QuestSettings -1,{ OnInit: // Quest settings .Delay = 12; // Quest cooldown in hours .Reset = 5000; // Zeny cost to abandon quests .Max_Quests = 3; // Max simultaneous targets/items .Hunting_Quests = 15; // Number of hunting quests per tier .Killing_Quests = 15; // Number of killing quests per tier .Collection_Quests = 20; // Number of collection quests per tier .Party = 3; // Party support: screen area only // Blacklist of excluded monster IDs (MVPs, problematic) .Blacklist$ = "1003,1006,1012,1014,1015,1021,1022,1027,1043,1050," + "1051,1052,1053,1054,1055,1056,1057,1058,1062,1084," + "1085,1086,1087,1088,1094,1095,1097,1098,1103,1104," + "1105,1106,1110,1111,1112,1118,1121,1122,1123,1124," + "1125,1126,1127,1128,1130,1132,1133,1135,1136,1137," + "1138,1140,1141,1142,1143,1144,1145,1146,1147,1148," + "1149,1150,1151,1152,1153,1154,1155,1156,1157,1158," + "1159,1160,1161,1162,1164,1165,1167,1168,1169,1170," + "1171,1172,1173,1174,1175,1176,1177,1178,1179,1180," + "1181,1182,1183,1184,1185,1186,1187,1188,1189,1190," + "1191,1192,1193,1194,1195,1196,1197,1198,1199,1200," + "1201,1202,1203,1204,1205,1206,1207,1209,1210,1211," + "1212,1213,1214,1215,1216,1217,1218,1220,1221,1222," + "1223,1224,1225,1226,1227,1228,1229,1230,1231,1232," + "1233,1234,1235,1236,1237,1238,1239,1240,1241,1242," + "1243,1244,1245,1246,1247,1249,1250,1251,1252,1253," + "1254,1255,1256,1257,1258,1260,1261,1263,1264,1265," + "1266,1267,1268,1269,1270,1272,1273,1274,1275,1276," + "1277,1278,1279,1280,1281,1282,1283,1284,1285,1286," + "1287,1288,1289,1290,1291,1292,1293,1294,1295,1296," + "1297,1298,1299,1300,1301,1302,1303,1304,1305,1306," + "1307,1308,1309,1310,1311,1312,1313,1314,1315,1316," + "1317,1318,1319,1320,1321,1322,1323,1324,1325,1326," + "1327,1328,1329,1330,1331,1332,1333,1334,1335,1336," + "1337,1338,1339,1340,1341,1342,1343,1344,1345,1346," + "1347,1348,1349,1350,1351,1352,1353,1354,1355,1356," + "1357,1358,1359,1360,1361,1362,1363,1364,1365,1366," + "1367,1368,1369,1370,1371,1372,1373,1374,1375,1376," + "1377,1378,1379,1380,1381,1382,1383,1384,1385,1386," + "1387,1388,1389,1390,1391,1392,1393,1394,1395,1396," + "1397,1398,1399,1400,1401,1402,1403,1404,1405,1406," + "1407,1408,1409,1410,1411,1412,1413,1414,1415,1416"; // Map arrays for each tier setarray .Maps_Tier1$[0], "prt_fild08", "pay_fild04", "moc_fild07", "izlude_dun01", "cmd_fild01"; setarray .Maps_Tier2$[0], "pay_dun00", "moc_fild12", "prt_maze01", "gef_fild07", "cmd_fild03"; setarray .Maps_Tier3$[0], "pay_dun02", "moc_fild16", "gef_fild09", "cmd_fild08", "iz_dun02"; setarray .Maps_Tier4$[0], "pay_dun03", "moc_fild19", "gef_dun01", "cmd_dun02", "gl_sew03"; setarray .Maps_Tier5$[0], "gl_dun02", "gef_dun03", "pay_dun04", "moc_pryd05", "ra_fild01"; // Shop items: ID, mission points cost setarray .Shop[0], 501,2, 502,2, 503,2, 504,5, 505,5, 512,15, 513,15, 514,15, // Potions, fruits 601,30, 602,30, 607,50, 1201,20, 1101,20, 1601,20, 2301,30, 2101,30, 7179,100; // Wings, weapons, Old Card Album // Collection items (pre-renewal, tiered) .Items_Tier1$ = "904,905,906,907,908,909,910,911"; // Jellopy, Fluff, Clover, Feather, etc. .Items_Tier2$ = "912,913,914,915,916,917"; // Sticky Mucus, Scell, Worm Peeling, etc. .Items_Tier3$ = "918,919,920,921,922"; // Animal Skin, Bug Leg, Scale Shell, etc. .Items_Tier4$ = "923,924,925,926,927"; // Cyfar, Brigan, Clam Shell, etc. .Items_Tier5$ = "7152,7170,7171,7172,756"; // Old Blue Box, Gift Box, Gold, etc. // Initialize guild shop npcshopdelitem "guild_shop",501; for (.@i = 0; .@i < getarraysize(.Shop); .@i += 2) npcshopadditem "guild_shop", .Shop[.@i], .Shop[.@i+1]; end; } Maybe someone here has a clue what i can do to fix this, im pretty clueless and the grok ai is not able to find a fix for this sadly (wasted 20 hours on useless solution tries from grok ai). Kind regards kainfx
  4. would be the same, the problem is when i start the server it remembers the IP i had when i started the server und does not check if the ip did change, so when my ip changes the server does not know about that dyndns AND noip have a fixed ip, but that only update themself when my ip changes but dont update the ip in the server, so i have to restart the server, so the server can learn about the new IP
  5. hy my rAthena Friends, ive got a problem, im hosting my server at home, and my Internet Service Provider resets my IP every 24 Hours, so i have to restart the server, so that the server gets this new IP (players cant conect when the server uses the old ip. so i wanted to ask you is it possible to write a script that updates my current IP automatically when it Changes ? Im Using dyndns.org in my conf as well in client side Clientinfo would be glad if someone could help me
  6. Hy Rathena friends, i got this problem, when my Players use the Alchemist Jobclass and use /quickspell, to cast a spell on F7 or F8 with the mouse wheel, there is this problem, it does not Cast the Spell, it only changes the Skill Lvl. would be glad if someone could help me
  7. thank you very much, i missed the skill.conf xD
  8. I want all players on my server to have 0 delay, so that they can spam with skills, but monk has still a skill delay, how do i get rid of it ?
  9. is there a turtorial for doing this ?
  10. one moer question, i have a sprite for assassin but need it for swordman, how can i change the position of the sprite to make it look like the swordman is using it ?
  11. Hy i dont know if i´m right or wrong in this forum, but i want to ask you, how do i implent custom weapon sprites, i actually can do it, but i have problems with the id, i can only use free ids betwen the existing weapons, anything else give a gravity error would be happy if anyone can help me
  12. Hy i have a mvp room and i need a script that kills all mobs and deletes all item on floor when no player is on the map pvpwarper.txt mvpspawner.txt
  13. @Emistry: youre my hero, gotty try it right now Edit: IT WORKS so wonderfull, i owe you a big one. edit2: btw where did you learn to script ? can you give me some advice where i can learn scripting like you ?
  14. hmm maybe i do something wrong but all i see is a blank window on the npc, i didnt think it would be so hard to create a button thats spawns the last monster i spawned by the mvp spawner npc
  15. Thx for awnsering, yeah thats what i want added my script in first post im a scripting noob and this is my first script
  16. Hy rAthena friends, you all know the npc warper script that shows the last location you warped to ? i need something like that für my mvp summon npc, so that i have not to scroll down all that way in my mvp summoner thx for reading guild_vs1,50,49,5 script MVP Spawner 403,{ switch(select("Amon Ra:Assassin Cross Eremes:Atroce:Bacsojin:Baphomet:Boitata:Champion Chen:Clown Alphoccio:Creator Flamel:Dark Lord:Detardeurus:Doppelganger:Dracula:Drake:Eddga:Evil Snake Lord:Fallen Bishop:Garm:Gloom Under Night:Gold Queen Scaraba:Golden Thief Bug:Gopinich:Gypsy Trentini:High Priest Margaretha:High Wizard Kathryne:Ifrit:Incantation Samurai:Kiel D-01:Stormy Knight:Kraken:Ktullanux:Lady Tanee:Leak:Lord Knight Seyren:Lord of Death:Lost Dragon:Maya:Mistress:Moonlight Flower:Nidhoggr's Shadow:Orc Hero:Orc Lord:Osiris:Paladin Randel:Pharaoh:Phreeoni:Professor Celia:Queen Scaraba:RSX 0806:Sniper Shecil:Stalker Gertie:Tao Gunka:Thanatos:Turtle General:Valkyrie Randgris:Vesper:Whitesmith Harword:Wounded Morroc:Ygnizem")) { case 1: atcommand ("@monster 1511"); close; case 2: atcommand ("@monster 1647"); close; case 3: atcommand ("@monster 1785"); close; case 4: atcommand ("@monster 1630"); close; case 5: atcommand ("@monster 1039"); close; case 6: atcommand ("@monster 2068"); close; case 7: atcommand ("@monster 2238"); close; case 8: atcommand ("@monster 2240"); close; case 9: atcommand ("@monster 2236"); close; case 10: atcommand ("@monster 1272"); close; case 11: atcommand ("@monster 1719"); close; case 12: atcommand ("@monster 1046"); close; case 13: atcommand ("@monster 1389"); close; case 14: atcommand ("@monster 1112"); close; case 15: atcommand ("@monster 1115"); close; case 16: atcommand ("@monster 1418"); close; case 17: atcommand ("@monster 1871"); close; case 18: atcommand ("@monster 1252"); close; case 19: atcommand ("@monster 1768"); close; case 20: atcommand ("@monster 2165"); close; case 21: atcommand ("@monster 1086"); close; case 22: atcommand ("@monster 1885"); close; case 23: atcommand ("@monster 2241"); close; case 24: atcommand ("@monster 1649"); close; case 25: atcommand ("@monster 1651"); close; case 26: atcommand ("@monster 1832"); close; case 27: atcommand ("@monster 1492"); close; case 28: atcommand ("@monster 1734"); close; case 29: atcommand ("@monster 1251"); close; case 30: atcommand ("@monster 2202"); close; case 31: atcommand ("@monster 1779"); close; case 32: atcommand ("@monster 1688"); close; case 33: atcommand ("@monster 2156"); close; case 34: atcommand ("@monster 1646"); close; case 35: atcommand ("@monster 1373"); close; case 36: atcommand ("@monster 2131"); close; case 37: atcommand ("@monster 1147"); close; case 38: atcommand ("@monster 1059"); close; case 39: atcommand ("@monster 1150"); close; case 40: atcommand ("@monster 2022"); close; case 41: atcommand ("@monster 1087"); close; case 42: atcommand ("@monster 1190"); close; case 43: atcommand ("@monster 1038"); close; case 44: atcommand ("@monster 2235"); close; case 45: atcommand ("@monster 1157"); close; case 46: atcommand ("@monster 1159"); close; case 47: atcommand ("@monster 2237"); close; case 48: atcommand ("@monster 2087"); close; case 49: atcommand ("@monster 1623"); close; case 50: atcommand ("@monster 1650"); close; case 51: atcommand ("@monster 2239"); close; case 52: atcommand ("@monster 1583"); close; case 53: atcommand ("@monster 1708"); close; case 54: atcommand ("@monster 1312"); close; case 55: atcommand ("@monster 1751"); close; case 56: atcommand ("@monster 1685"); close; case 57: atcommand ("@monster 1648"); close; case 58: atcommand ("@monster 1917"); close; case 59: atcommand ("@monster 1658"); close; } } guild_vs2,50,50,4 duplicate(MVP Spawner) MVP Spawner#1 403 guild_vs3,50,50,4 duplicate(MVP Spawner) MVP Spawner#2 403 guild_vs4,50,50,4 duplicate(MVP Spawner) MVP Spawner#3 403
  17. Hallo liebe rAthena gemeinde, der noch sehr junge rAthena server Custom-Ro, sucht einen Event GM und bis zu drei Support GM´s Anforderungen an den Event GM: du solltest dich sehr gut in der Welt von Ragnarok auskennen du musst viel Fantasie haben du solltest ein Entertainer sein (Spieler gut unterhalten können) Anforderungen an die Support GM´s: ihr solltet alle standard @ befehle auswendig können ihr solltet wissen wie man einem Spieler in Not gut hilft zu Uns: Unser Sever ist auf Custom Items (Wings, Hyo´s, Headgears) spezialisiert mit Custom Maps und Custom NPC´s, jeder GM hat bei uns ein mitsprache Recht und Spieler dürfen gerne Vorschläge machen die wenn sie von der mehrheit gewollt sind angenommen werden. neugierig? interessiert? dann besucht uns auf www.custom-ro.de.vu bewerbungen entweder hier oder in unserem Forum auf www.custom-ro.de.vu oder an [email protected]
  18. Hy rAthena friends, today i did set up my first rAthena server and it works fine, but im having problem to get my client to work. as client im using this http://rathena.org/b...-09-kro-client/ and this http://rathena.org/b...rathena-client/ with 2011-03-15aRagexeRE.exe.patched.exe (diffed it by myself and did only the recommended and the one fpr custom items),i did write the data in the idnum2.... files and did eaven try with the lua files and i did change my mmo.h to #ifndef PACKETVER #define PACKETVER 20110315 #endif i did put the sprites and bmp´s in the right folder but yet my game crasches when i try to equipt a custom item, leaving this error Module Name: D:\Spiele\Ragnarok\2011-03-15aRagexeRE.exe.patched.exe Time Stamp: 0x4d7f06a5 - Tue Mar 15 07:26:45 2011 Exception Type: 0xc0000005 0x00000006 eax: 0x00775e01 ebx: 0x75151001 ecx: 0x0e876968 edx: 0x0044a700 esi: 0x0018fb44 edi: 0x0089dc58 ebp: 0x00000000 esp: 0x0018f9a4 stack 0018f9a4 - 0018fda4 0018F9A4 : 09 00 00 00 F0 5B 89 00 42 6C 75 65 20 56 61 6C 0018F9B4 : 6B 20 48 65 6C 6D 00 01 00 00 00 00 60 02 00 00 0018F9C4 : D8 37 AF 0C 00 00 00 00 8C 79 A0 0C 20 FB 18 00 0018F9D4 : 74 D5 A0 0C 00 00 00 00 00 00 00 00 00 00 00 00 0018F9E4 : 00 00 00 00 00 00 00 00 00 5F 96 0F 00 00 00 00 0018F9F4 : 00 01 00 00 00 5F 96 0F F8 5E 96 0F 14 FA 18 00 0018FA04 : DD 14 15 75 00 00 9F 0C 00 00 00 00 00 5F 96 0F 0018FA14 : 40 FA 18 00 9D 34 AD 64 00 00 9F 0C 00 00 00 00 0018FA24 : 00 5F 96 0F 08 38 AF 0C 42 6C 75 65 20 56 61 6C 0018FA34 : 6B 20 48 65 6C 6D 7C 30 30 20 69 73 20 70 75 74 0018FA44 : 20 6F 6E 2E 00 00 00 00 68 A6 7B 0E 03 00 00 00 0018FA54 : 6C FA 18 00 2A 4F 3E 73 74 FB 18 00 0F 00 00 00 0018FA64 : 68 A6 7B 0E 03 00 00 00 84 FA 18 00 42 52 3E 73 0018FA74 : 74 FB 18 00 0F 00 00 00 68 A6 7B 0E 03 00 00 00 0018FA84 : A4 FA 18 00 D5 59 3E 73 74 FB 18 00 0F 00 00 00 0018FA94 : 68 A6 7B 0E AC FA 18 00 49 61 3E 73 00 00 00 00 Launch Info 00A4 00A4 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 Job : Novice sorry for my bad english, hope you can help me ___________________________________________________ edit: i used this turtorial to add custom items and everthing works perfekt now http://www.eathena.ws/board/index.php?showtopic=247748
  19. problem gefunden meine exe war nicht für custom items gedifft, allerdings kann ich die exe auch nicht mit weediff laden und habe so keinen client der mit custom items funktioniert
  20. moin, habe ein problem, habe alles so gemacht wie du es hier beschreiben hast, allerdings crasht mein client, es erscheint eine fehlermeldung aber ich habe die ganzen frost_wings sprites in jedem ordner drin und in den textdateien im data ordner stehen die items auch mit der item id vom server drin bin echt am verzweifeln
×
×
  • Create New...