Jump to content

Racaae

Members
  • Posts

    263
  • Joined

  • Last visited

  • Days Won

    41

Everything posted by Racaae

  1. 18,27 es la coordenada oficial más reciente. Abre el archivo \conf\import\char_conf.txt y añade lo siguiente: // Punto de inicio para nuevos personajes start_point: iz_int03,18,27 Guarda el archivo y reinicia el servidor.
  2. Hola. Sí, agrega lo siguiente en la OnInit: bindatcmd "iparty",strnpcinfo(3) + "::OnAtcommand"; Y añade OnAtcommand: en la primera línea del NPC. Full Script:
  3. Te teletransportaste al vacío. Aparece todo negro porque no hay nada en esa localización. Solo hay dos salas (el interior de un barco) en el mapa, como puedes ver en tus capturas de pantalla. Corrige el NPC que te envió a esas coordenadas inválidas (x,y). Pero hay una versión antigua de esos mapas, puedes usarla si quieres. old iz_int maps.zip
  4. He eliminado los comandos mesitemlink e itemlink que no son compatibles con rAthena 2018. Por favor, intenta ahora. Si aún no funciona: ¿Aparece algún error o mensaje en la consola del map-server al cargar los scripts? ¿O al utilizar el comando? Si te funcionó, ¡dale un voto positivo al post, por favor! - script CouponNPC#main -1,{ S_Start: //Set code type (0 = normal | 1 = MD5-Hash) .code_type = 0; //Set code length .code_length = 12; //Set Min. GM Level to add new coupons .code_gmlvl = 99; setarray .coupon_code$[0],"A","B","C","D","E","F","G","H","I","J","K","L", "M","N","O","P","Q","R","S","T","U","V","W","X", "Y","Z","0","1","2","3","4","5","6","7","8","9"; if (getgmlevel() >= .code_gmlvl) { mes "[^FF7700Cupón Jack^000000]"; mes "Bienvenido GM " + strcharinfo(0) + "."; next; switch(select("Agregar cupón", "Mostrar cupones", "Menú normal", "Cancelar")) { case 1: do { mes "[^FF7700Cupón Jack^000000]"; mes "Ingrese el ID del objeto:"; input @coupon_item; if (getitemname(@coupon_item) == "null") { clear; mes "[^FF7700Cupón Jack^000000]"; mes "ID del objeto " + @coupon_item + " no encontrado."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } while (true); do { clear; mes "[^FF7700Cupón Jack^000000]"; mes getitemname(@coupon_item) + "?"; mes "Ingrese la cantidad del objeto:"; input @coupon_amount; if (@coupon_amount < 1 || @coupon_amount > 10000) { clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + " no es una cantidad válida."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } while (true); do { clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + "x " + getitemname(@coupon_item); mes "¿Cuántos cupones desea crear con estas mismas recompensas?"; next; if (select("Uno", "Ingresar cantidad") == 2) { input .@coupons; if (.@coupons < 1 || .@coupons > 50) { clear; mes "[^FF7700Cupón Jack^000000]"; mes .@coupons + " no es una cantidad válida."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } else break; } while (true); if (.@coupons < 2) .@coupons = 1; do { switch(select("Generar código aleatorio", "Ingresar código manual", "Cancelar")) { case 1: .@random = true; break; case 2: clear; mes "[^FF7700Cupón Jack^000000]"; mes "Ingrese el cupón:"; mes "Longitud máxima: " + .code_length + " caracter(es)"; input .@input_name$; if(getstrlen(.@input_name$) < 0 || getstrlen(.@input_name$) > .code_length) { clear; mes "[^FF7700Cupón Jack^000000]"; mes "Inválido."; mes "El cupón debe tener al menos 1 caracter y un máximo de " + .code_length + " caracter(es)"; } else { for(.@i = 0; .@i < .@coupons; .@i++) .@new_coupon$[.@i] = .@input_name$; } break; case 3: close; } } while (.@new_coupon$[0] == "" && !.@random); if (.@random || .@coupons > 1) { .@length = .code_length; if (.@new_coupon$[0] != "") { .@endchar = getstrlen(.@new_coupon$[0]); .@length = maximum(.code_length,(.@endchar+4)); } for(.@i = 0; .@i < .@coupons; .@i++) { for(.@j = .@endchar; .@j < .@length; .@j++) { .@random_char = rand(getarraysize(.coupon_code$)); .@new_coupon$[.@i] += .coupon_code$[.@random_char]; } if (.code_type == 1) .@new_coupon$[.@i] = md5(.@new_coupon$[.@i]); } } clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + "x " + getitemname(@coupon_item); for(.@i = 0; .@i < .@coupons; .@i++) mes "Cupón" + (.@coupons>1?" "+(.@i+1):"") + ": ^EE8800" + .@new_coupon$[.@i] + "^000000"; if(select("^0000FFConfirmar " + F_InsertPlural(.@coupons,"cupón") + "^000000", "Cancelar") == 2) close; for(.@i = 0; .@i < .@coupons; .@i++) query_sql "INSERT INTO `coupons` (`code`, `item_id`, `item_amount`) VALUES ('" + escape_sql(.@new_coupon$[.@i]) + "', "+@coupon_item+", "+@coupon_amount+")"; clear; mes "[^FF7700Cupón Jack^000000]"; mes F_InsertPlural(.@coupons,"cupón") + " agregado."; for(.@i = 0; .@i < .@coupons; .@i++) mes "Cupón" + (.@coupons>1?" "+(.@i+1):"") + ": ^EE8800" + .@new_coupon$[.@i] + "^000000"; close; case 2: mes "[^FF7700Cupón Jack^000000]"; query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; .@total_codes = getarraysize(.@available_code$); if (!.@total_codes) mes "No hay códigos disponibles."; dispbottom "==============================="; dispbottom "Código | Objeto | Cantidad"; for(.@i = 0; .@i < .@total_codes; .@i++) { mes "--------------------------------"; mes "Objeto: " + getitemname(.@available_item[.@i]); mes "Cantidad: " + .@available_amount[.@i]; mes "Código: " + .@available_code$[.@i]; dispbottom .@available_code$[.@i] + " | " + getitemname(.@available_item[.@i]) + " | x" + .@available_amount[.@i]; } dispbottom "==============================="; close; case 3: break; case 4: mes "[^FF7700Cupón Jack^000000]"; mes "¡Que tenga un buen día!"; close; } } mes "[^FF7700Cupón Jack^000000]"; mes "Bienvenido al sistema de códigos de cupones. ¿En qué puedo ayudarte?"; mes " ", "También puedes usar el comando", "^0000FF@claim <código del cupón>^000000 desde cualquier parte del mundo."; next; switch(Select("Canjear cupón", "Cancelar")) { case 1: mes "[^FF7700Cupón Jack^000000]"; mes "Por favor, introduce tu código de cupón:"; input .@my_code$; clear; callsub S_Submit,.@my_code$; close; case 2: mes "[^FF7700Cupón Jack^000000]"; mes "¡Que tenga un buen día!"; close; } S_Submit: .@my_code$ = getarg(0); query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; for (@i = 0; @i < getarraysize(.@available_code$); @i++) { if (strtoupper(.@my_code$) == strtoupper(.@available_code$[@i])) { if (checkweight(.@available_item[@i],.@available_amount[@i]) == 0) { if (getarg(1,0)) { message strcharinfo(0), "No tienes suficiente espacio en el inventario para reclamar este cupón."; end; } mes "[^FF7700Cupón Jack^000000]"; mes "No tienes suficiente espacio en el inventario para reclamar este cupón."; close; } query_sql "DELETE FROM `coupons` WHERE `code`='" + escape_sql(.@my_code$) + "'"; getitem .@available_item[@i],.@available_amount[@i]; if (getarg(1,0)) { message strcharinfo(0), "¡Cupón canjeado! Has recibido " + getitemname(.@available_item[@i]) + " - " + .@available_amount[@i] + " unidad(es).^000000"; end; } mes "[^FF7700Cupón Jack^000000]"; mes "Has recibido ^0000FF" + getitemname(.@available_item[@i]) + " - " + .@available_amount[@i] + " unidad(es).^000000"; close; } } if (getarg(1,0)) { message strcharinfo(0), "El cupón " + .@my_code$ + " no existe o ya fue canjeado."; end; } mes "[^FF7700Cupón Jack^000000]"; mes "Este código de cupón no existe o ya fue canjeado."; close; OnInit: query_sql "CREATE TABLE IF NOT EXISTS `coupons` (`code` TINYTEXT NOT NULL, `item_id` INT NOT NULL, `item_amount` INT NOT NULL, INDEX `code` (`code`(32)) ) ENGINE=MyISAM"; if (strnpcinfo(2) == "main") bindatcmd "claim",strnpcinfo(3)+"::OnAtcommand"; end; OnAtcommand: if (.@atcmd_parameters$[0] != "") callsub S_Submit,implode(.@atcmd_parameters$, " "),1; callsub S_Start; end; } //Uncomment to enable clickable NPC //prontera,146,173,5 duplicate(CouponNPC#main) Cupón Jack 807
  5. Hi. You can search by date on github to download files from any date you need. Click the "commits" tab near the top, find the commit with the date you want and click the "<>" button on the right (or click the commit and then find the "Browse files" button, it's the same thing). Example: https://github.com/rathena/rathena/commits/master?since=2022-04-01&until=2022-04-30
  6. OK. No existía el comando meitemlink en 2018. Adaptado para ti: iz_int,24,34,3 script Pack Bienvenida 4_F_EDEN_OFFICER,6,6,{ .@server_name$ = "Apocalypse RO"; //Item ID, Item amount setarray .@items_INT, 5126,1, // Morpheus's Hood 2518,1, // Morpheus's Shawl 2648,1, // Morpheus's Ring 2649,1, // Morpheus's Bracelet 100054,1, // Shadow Transcendental Time Crate 11567,200, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,30, // [Event] Blue Potion 12264,2; // [Event] Bubble Gum //Item ID, Item amount setarray .@items_DEX, 5544,1, // Time Keeper Hat 15007,1, // Time Keeper Robe 2145,1, // Time Keeper Shield 2455,1, // Time Keeper Shoes 2559,1, // Time Keeper Manteau 19218,1, // Time Keeper Glasses 28511,1, // Time Keeper Ring 11567,200, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,10, // [Event] Blue Potion 12263,2; // [Event] Battle Manual //Item ID, Item amount setarray .@items_STR, 5127,1, // Morrigane's Helm 2519,1, // Morrigane's Manteau 2650,1, // Morrigane's Belt 2651,1, // Morrigane's Pendant 11567,300, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,10, // [Event] Blue Potion 7776,2; // Gym Pass cutin "laime_evenor01",2; mes "[Pack Bienvenida]"; mes "Hola ^FF0000" + strcharinfo(0) + "^000000."; mes "¡Bienvenido a ^00B2EE" + .@server_name$ + "^000000!"; next; switch(select("^000088Reclamar Pack Bienvenida^000000", "Cancelar")) { case 1: if (#freebies) { mes "[Pack Bienvenida]"; mes "Ya tienes tu pack de inicio."; close3; } switch(select("Paquete INT", "Paquete DEX", "Paquete STR", "Cancelar")) { case 1: copyarray .@list[0],.@items_int,getarraysize(.@items_int); break; case 2: copyarray .@list[0],.@items_dex,getarraysize(.@items_dex); break; case 3: copyarray .@list[0],.@items_str,getarraysize(.@items_str); break; case 4: close3; } mes "[Pack Bienvenida]"; mes "¿Está seguro? Contenido del ^43572FPack^000000:"; for (.@x = 0; .@x < getarraysize(.@list); .@x += 2) mes (.@list[.@x+1]>1?.@list[.@x+1] + "x ":"") + getitemname(.@list[.@x]); mes "^FF0000Solo puedes recibir el pack una vez.^000000"; next; if (select("Sí", "No") == 2) close3; if (#freebies) { mes "[Pack Bienvenida]"; mes "Ya tienes tu pack de inicio."; close3; } #freebies++; announce "Démosle la bienvenida a " + strcharinfo(0) + " acaba de iniciar en el servidor " + .@server_name$ + "!",0; mes "[Pack Bienvenida]"; mes "¡Aquí están tus ^43572FPack^000000!"; mes "Espero que te diviertas en ^00B2EE" + .@server_name$ + "^000000!"; for (.@x = 0; .@x < getarraysize(.@list); .@x += 2) getitem .@list[.@x], .@list[.@x+1]; close3; case 2: close3; } OnInit: questinfo QTYPE_CLICKME, QMARK_YELLOW, "!#freebies"; end; OnTouch: if (!#freebies) npctalk "Hola " + strcharinfo(0) + ". Ven a reclamar el Pack bienvenida!", "", bc_self; end; } iz_int01,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#1 4_F_EDEN_OFFICER,6,6 iz_int02,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#2 4_F_EDEN_OFFICER,6,6 iz_int03,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#3 4_F_EDEN_OFFICER,6,6 iz_int04,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#4 4_F_EDEN_OFFICER,6,6 new_1-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#5 4_F_EDEN_OFFICER,6,6 new_2-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#6 4_F_EDEN_OFFICER,6,6 new_3-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#7 4_F_EDEN_OFFICER,6,6 new_4-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#8 4_F_EDEN_OFFICER,6,6 lasa_fild01,51,306,3 duplicate(Pack Bienvenida) Pack Bienvenida#9 4_F_EDEN_OFFICER,6,6
  7. El script me funciona bien. ¿Cuál es tu versión de rAthena? ¿Aparece algún error o mensaje en la consola del map-server al cargar los scripts? ¿Aparece algún error o mensaje en la consola del map-server al hacer clic en el NPC?
  8. iz_int,24,34,3 script Pack Bienvenida 4_F_EDEN_OFFICER,6,6,{ .@server_name$ = "Apocalypse RO"; //Item ID, Item amount setarray .@items_INT, 5126,1, // Morpheus's Hood 2518,1, // Morpheus's Shawl 2648,1, // Morpheus's Ring 2649,1, // Morpheus's Bracelet 100054,1, // Shadow Transcendental Time Crate 11567,200, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,30, // [Event] Blue Potion 12264,2; //[Event] Bubble Gum //Item ID, Item amount setarray .@items_DEX, 5544,1, // Time Keeper Hat 15007,1, // Time Keeper Robe 2145,1, // Time Keeper Shield 2455,1, // Time Keeper Shoes 2559,1, // Time Keeper Manteau 19218,1, // Time Guardian Glasses 28511,1, // Time Guardian Ring 11567,200, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,10, // [Event] Blue Potion 12263,2; //[Event] Battle Manual //Item ID, Item amount setarray .@items_STR, 5127,1, // Morrigane's Helm 2519,1, // Morrigane's Manteau 2650,1, // Morrigane's Belt 2651,1, // Morrigane's Pendant 11567,300, // [Event] Novice Potion 12324,30, // Novice Butterfly Wing 12325,30, // Novice Magnifier 12323,50, // Novice Fly Wing 11572,10, // [Event] Blue Potion 7776,2; //Gym Pass cutin "laime_evenor01",2; mes "[Pack Bienvenida]"; mes "Hola ^FF0000" + strcharinfo(0) + "^000000."; mes "¡Bienvenido a ^00B2EE" + .@server_name$ + "^000000!"; next; switch(select("^000088Reclamar Pack Bienvenida^000000", "Cancelar")) { case 1: if (#freebies) { mes "[Pack Bienvenida]"; mes "Ya tienes tu pack de inicio."; close3; } switch(select("Paquete INT", "Paquete DEX", "Paquete STR", "Cancelar")) { case 1: copyarray .@list[0],.@items_int,getarraysize(.@items_int); break; case 2: copyarray .@list[0],.@items_dex,getarraysize(.@items_dex); break; case 3: copyarray .@list[0],.@items_str,getarraysize(.@items_str); break; case 4: close3; } mes "[Pack Bienvenida]"; mes "¿Está seguro? Contenido del ^43572FPack^000000:"; for (.@x = 0; .@x < getarraysize(.@list); .@x += 2) mes (.@list[.@x+1]>1?.@list[.@x+1] + "x ":"") + mesitemlink(.@list[.@x]); mes "^FF0000Solo puedes recibir el pack una vez.^000000"; next; if (select("Sí", "No") == 2) close3; if (#freebies) { mes "[Pack Bienvenida]"; mes "Ya tienes tu pack de inicio."; close3; } #freebies++; announce "Démosle la bienvenida a " + strcharinfo(0) + " acaba de iniciar en el servidor " + .@server_name$ + "!",0; mes "[Pack Bienvenida]"; mes "¡Aquí están tus ^43572FPack^000000!"; mes "Espero que te diviertas en ^00B2EE" + .@server_name$ + "^000000!"; for (.@x = 0; .@x < getarraysize(.@list); .@x += 2) getitem .@list[.@x], .@list[.@x+1]; close2; cutin "",255; cloakonnpcself; end; case 2: close3; } OnInit: questinfo QTYPE_CLICKME, QMARK_YELLOW, "!#freebies"; end; OnTouch: if (!#freebies) npctalk "Hola " + strcharinfo(0) + ". Ven a reclamar el Pack bienvenida!", "", bc_self; end; } iz_int01,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#1 4_F_EDEN_OFFICER,6,6 iz_int02,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#2 4_F_EDEN_OFFICER,6,6 iz_int03,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#3 4_F_EDEN_OFFICER,6,6 iz_int04,24,34,3 duplicate(Pack Bienvenida) Pack Bienvenida#4 4_F_EDEN_OFFICER,6,6 new_1-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#5 4_F_EDEN_OFFICER,6,6 new_2-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#6 4_F_EDEN_OFFICER,6,6 new_3-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#7 4_F_EDEN_OFFICER,6,6 new_4-1,57,117,3 duplicate(Pack Bienvenida) Pack Bienvenida#8 4_F_EDEN_OFFICER,6,6 lasa_fild01,51,306,3 duplicate(Pack Bienvenida) Pack Bienvenida#9 4_F_EDEN_OFFICER,6,6
  9. You can delete or comment out the following line so the NPC doesn't exist. The @claim command will still work. SPA: Puedes eliminar o comentar la siguiente línea para que no exista el NPC. El comando @claim seguirá funcionando. Find: prontera,146,173,5 duplicate(CouponNPC#main) Cupón Jack 807 Replace: //prontera,146,173,5 duplicate(CouponNPC#main) Cupón Jack 807
  10. The player is talking to the NPC in the original (non-instanced) map. The script is supposed to be used only inside the instance. You're right. The NPC is too far from the edge for you to see it. I'm able to see it because my view range is increased. You could move it to somewhere closer, make it cloaked and uncloak just for GMs/ADMs. I added the option to count weekly entrances. You still need to change the cooldown time of the quest. If you want to try it, replace the whole Stone NPC. e_tower,81,105,0 script Tower Protection Stone 2_MONEMUS,{ $@etower_allow_reenter = true; //Allow reentering same Endless Tower. (true/false) $@etower_weekly_type = 1; // 0=no weekly limit. 1=distinct ET weekly entry limit. 2=gain points weekly limit. $@etower_weekly_limit = 3; //how many times per week at max? // GM Bypass //============================================================ if(getgroupid() > 90){ mes "GM Options"; next; switch(select("Main Menu", "Reset Cooldowns", "Destroy Instance")){ case 1: break; case 2: if(isbegin_quest(60200)) erasequest(60200); if(isbegin_quest(60201)) erasequest(60201); etower_timer = 0; //etower_instanceid = 0; etower_weekly_count = 0; etower_week_cd = 0; etower_year_cd = 0; end; case 3: if(instance_id(IM_PARTY)) instance_destroy instance_id(IM_PARTY); end; } } //============================================================ set .@party_id, getcharid(1); getpartymember .@party_id, 1; set .@online_members_count, $@partymembercount; set .@md_name$,"Endless Tower"; set .@etower_timer,checkquest(60200,PLAYTIME); // 1 week set .@etower_timer2,checkquest(60201,PLAYTIME); // 4 hours callfunc "F_Tower_Settings"; //if (!instance_check_party(.@party_id,2)) { // mes "Make or join a party with more than 1 member and try again."; // close; //} switch(.@etower_timer) { case -1: if ($@etower_weekly_type == 1 && $@etower_weekly_limit) { .@week = atoi(gettimestr("%V",5)); .@year = gettime(DT_YEAR); if (etower_week_cd != .@week || etower_year_cd != .@year) { etower_weekly_count = 0; } .@remaining = $@etower_weekly_limit - etower_weekly_count; mes "^0000ffYou can only enter " + ($@etower_allow_reenter?"distinct":"the") + " " + .@md_name$ + " " + ($@etower_weekly_limit>1?$@etower_weekly_limit + " times":"once") + " a week.^000000"; if (etower_weekly_count >= $@etower_weekly_limit) { next; switch(select("Difficulty Information","Return to Alberta","Cancel")) { case 1: callsub L_Info; case 2: mes "It is dangerous here. Let me move you to Alberta."; close2; warp "alberta",223,36; end; case 3: end; } } if (etower_weekly_count) mes "You can still enter " + (.@remaining!=1?.@remaining + " times":"once") + "."; } if (is_party_leader() == true) { mes "Confirmed the party has been made. Would you like to reserve entrance to the " + .@md_name$ + "?"; next; switch(select( ( .@party_id && getpartyleader(.@party_id,2) && !instance_id(IM_PARTY) )? "Generate dungeon "+.@md_name$:"", ( .@party_id && instance_id(IM_PARTY) )?"Enter the dungeon":"", "Return to Alberta", "Difficulty Information", "Cancel")){ case 1: // Difficulty //============================================================ .@level_mode = select( "[ Level 50+ ] Normal", "[ Level 100+ ] Veteran", "[ Level 150+ ] Nightmare", "[ Level 200+ ] Hell", "[ Level 240+ ] ^ff0000Torment^000000" ); $ENDLESSMODE[getcharid(1)] = .@level_mode; set .@required_level, 0; if (.@level_mode == 1) { .@required_level = 50; } else if (.@level_mode == 2) { .@required_level = 100; } else if (.@level_mode == 3) { .@required_level = 150; } else if (.@level_mode == 4) { .@required_level = 200; } else if (.@level_mode == 5) { .@required_level = 260; } if (!instance_check_party(getcharid(1), .@online_members_count, .@required_level)) { mes "All party members need to be at least Level " + .@required_level + " to enter."; close; } mes "Your party meets the Memorial Dungeon requirements."; announce "The party [ " + getpartyname(.@party_id) + " ] has registered "+.@md_name$+" on " + $@difficulty_mode$[.@level_mode] + ".", bc_all; instance_create("Endless Tower"); close; //============================================================= case 2: callsub L_Enter,0,1; case 3: mes "I will move you to Alberta."; close2; warp "alberta",223,36; end; case 4: callsub L_Info; case 5: close; } } switch(select("Enter the "+.@md_name$,"Difficulty Information","Return to Alberta","Cancel")) { case 1: callsub L_Enter,0,1,1; case 2: callsub L_Info; case 3: mes "I will move you to Alberta."; close2; warp "alberta",223,36; end; case 4: end; } case 0: case 1: if ($@etower_allow_reenter && .@etower_timer2 < 2 && etower_instanceid == instance_id(IM_PARTY) && instance_live_info(ILI_NAME,instance_id(IM_PARTY)) == .@md_name$) { mes "If you have the dungeon generated already, you can enter it. "; next; switch(select("Enter the "+.@md_name$,"Difficulty Information","Return to Alberta","Cancel")) { case 1: callsub L_Enter,0,0; case 2: callsub L_Info; case 3: mes "I will move you to Alberta."; close2; warp "alberta",223,36; end; case 4: close; } } .@dun_lim_time = etower_timer+604800; // 1 week // .@dun_lim_time2 = etower_timer+14400; // 4 hours set .@dun_cur_time,gettimetick(2); set .@dun_ent_t,(.@dun_lim_time - .@dun_cur_time); set .@dun_h,(.@dun_ent_t / 3600); set .@dun_m,(.@dun_ent_t - (.@dun_h * 3600)) / 60; set .@dun_s,.@dun_ent_t - ((.@dun_h * 3600) + (.@dun_m * 60)); if (.@dun_h > 23) mes "Due to the tower's aftereffects, you cannot enter the dungeon right now, " + Time2Str(.@dun_lim_time) + " left to enter the next dungeon."; else mes "Due to the tower's aftereffects, you cannot enter the dungeon right now, " + .@dun_h + "hours " + .@dun_m + "minutes " + .@dun_s + "seconds left to enter the next dungeon."; next; switch(select("Difficulty Information","Return to Alberta","Cancel")) { case 1: callsub L_Info; case 2: mes "It is dangerous here. Let me move you to Alberta."; close2; warp "alberta",223,36; end; case 3: end; } case 2: etower_timer = 0; erasequest 60200; erasequest 60201; if ($@etower_weekly_type == 1 && $@etower_weekly_limit) { mes "^0000ffThe after effects related to the Endless Tower have been removed.^000000"; .@week = atoi(gettimestr("%V",5)); .@year = gettime(DT_YEAR); if (etower_week_cd != .@week || etower_year_cd != .@year) { etower_weekly_count = 0; etower_week_cd = 0; etower_year_cd = 0; mes "^0000ffYou can generate and enter the Endless Tower again.^000000"; close; } mes "^0000ffBut there are stronger after effects. You can only enter " + ($@etower_allow_reenter?"distinct":"the") + " " + .@md_name$ + " " + (etower_weekly_count!=1?etower_weekly_count + " times":"once") + " a week.^000000"; .@remaining = $@etower_weekly_limit - etower_weekly_count; if (etower_weekly_count >= $@etower_weekly_limit) mes "^0000ffWait till next week.^000000"; else mes "^0000ffYou can still enter " + (.@remaining!=1?.@remaining + " times":"once") + " this week.^000000"; } else mes "^0000ffThe records and after effects related to the Endless Tower have been removed. You can generate and enter the Endless Tower again.^000000"; close; } L_Info: mes "[ Difficulty Information ]"; mes "^ff0000-------------------------------------------^000000"; mes "Difficulty Level: ^ff0000[ " + $@difficulty_mode$[1] + " ]^000000"; mes "Monster max hp: + ^ff0000[ " + $@easy_mode_variables[0] + "% ]^000000"; mes "Monster damage: + ^ff0000[ " + $@easy_mode_variables[1] + "% ]^000000"; mes "Monster takes less damage: ^ff0000[ " + $@easy_mode_variables[2] + "% ]^000000"; mes "Monster def: + ^ff0000[ " + $@easy_mode_variables[3] + "% ]^000000"; mes "Monster mdef: + ^ff0000[ " + $@easy_mode_variables[4] + "% ]^000000"; mes "Monster hit: + ^ff0000[ " + $@easy_mode_variables[5] + "% ]^000000"; mes "Monster flee: + ^ff0000[ " + $@easy_mode_variables[6] + "% ]^000000"; mes "Monster bonus exp reward: x ^ff0000[ " + $@bonus_exp[1] + " ]^000000"; mes ""+.@md_name$ +" Easy Points: + ^ff0000[ " + $@instance_points[1] + " ]^000000"; mes "^ff0000-------------------------------------------^000000"; next; mes "[ Difficulty Information ]"; mes "^ff0000-------------------------------------------^000000"; mes "Difficulty Level: ^ff0000[ " + $@difficulty_mode$[2] + " ]^000000"; mes "Monster max hp: + ^ff0000[ " + $@veteran_mode_variables[0] + "% ]^000000"; mes "Monster damage: + ^ff0000[ " + $@veteran_mode_variables[1] + "% ]^000000"; mes "Monster takes less damage: ^ff0000[ " + $@veteran_mode_variables[2] + "% ]^000000"; mes "Monster def: + ^ff0000[ " + $@veteran_mode_variables[3] + "% ]^000000"; mes "Monster mdef: + ^ff0000[ " + $@veteran_mode_variables[4] + "% ]^000000"; mes "Monster hit: + ^ff0000[ " + $@veteran_mode_variables[5] + "% ]^000000"; mes "Monster flee: + ^ff0000[ " + $@veteran_mode_variables[6] + "% ]^000000"; mes "Monster bonus exp reward: x ^ff0000[ " + $@bonus_exp[2] + " ]^000000"; mes ""+.@md_name$ +" Veteran Points: + ^ff0000[ " + $@instance_points[2] + " ]^000000"; mes "^ff0000-------------------------------------------^000000"; next; mes "[ Difficulty Information ]"; mes "^ff0000-------------------------------------------^000000"; mes "Difficulty Level: ^ff0000[ " + $@difficulty_mode$[3] + " ]^000000"; mes "Monster max hp: + ^ff0000[ " + $@nightmare_mode_variables[0] + "% ]^000000"; mes "Monster damage: + ^ff0000[ " + $@nightmare_mode_variables[1] + "% ]^000000"; mes "Monster takes less damage: ^ff0000[ " + $@nightmare_mode_variables[2] + "% ]^000000"; mes "Monster def: + ^ff0000[ " + $@nightmare_mode_variables[3] + "% ]^000000"; mes "Monster mdef: + ^ff0000[ " + $@nightmare_mode_variables[4] + "% ]^000000"; mes "Monster hit: + ^ff0000[ " + $@nightmare_mode_variables[5] + "% ]^000000"; mes "Monster flee: + ^ff0000[ " + $@nightmare_mode_variables[6] + "% ]^000000"; mes "Monster bonus exp reward: x ^ff0000[ " + $@bonus_exp[3] + " ]^000000"; mes ""+.@md_name$ +" Nightmare Points: + ^ff0000[ " + $@instance_points[3] + " ]^000000"; mes "^ff0000-------------------------------------------^000000"; next; mes "[ Difficulty Information ]"; mes "^ff0000-------------------------------------------^000000"; mes "Difficulty Level: ^ff0000[ " + $@difficulty_mode$[4] + " ]^000000"; mes "Monster max hp: + ^ff0000[ " + $@hell_mode_variables[0] + "% ]^000000"; mes "Monster damage: + ^ff0000[ " + $@hell_mode_variables[1] + "% ]^000000"; mes "Monster takes less damage: ^ff0000[ " + $@hell_mode_variables[2] + "% ]^000000"; mes "Monster def: + ^ff0000[ " + $@hell_mode_variables[3] + "% ]^000000"; mes "Monster mdef: + ^ff0000[ " + $@hell_mode_variables[4] + "% ]^000000"; mes "Monster hit: + ^ff0000[ " + $@hell_mode_variables[5] + "% ]^000000"; mes "Monster flee: + ^ff0000[ " + $@hell_mode_variables[6] + "% ]^000000"; mes "Monster bonus exp reward: x ^ff0000[ " + $@bonus_exp[4] + " ]^000000"; mes ""+.@md_name$ +" Hell Points: + ^ff0000[ " + $@instance_points[4] + " ]^000000"; mes "^ff0000-------------------------------------------^000000"; next; mes "[ Difficulty Information ]"; mes "^ff0000-------------------------------------------^000000"; mes "Difficulty Level: ^ff0000[ " + $@difficulty_mode$[5] + " ]^000000"; mes "Monster max hp: + ^ff0000[ " + $@torment_mode_variables[0] + "% ]^000000"; mes "Monster damage: + ^ff0000[ " + $@torment_mode_variables[1] + "% ]^000000"; mes "Monster takes less damage: ^ff0000[ " + $@torment_mode_variables[2] + "% ]^000000"; mes "Monster def: + ^ff0000[ " + $@torment_mode_variables[3] + "% ]^000000"; mes "Monster mdef: + ^ff0000[ " + $@torment_mode_variables[4] + "% ]^000000"; mes "Monster hit: + ^ff0000[ " + $@torment_mode_variables[5] + "% ]^000000"; mes "Monster flee: + ^ff0000[ " + $@torment_mode_variables[6] + "% ]^000000"; mes "Monster bonus exp reward: x ^ff0000[ " + $@bonus_exp[5] + " ]^000000"; mes ""+.@md_name$ +" Torment Points: + ^ff0000[ " + $@instance_points[5] + " ]^000000"; mes "^ff0000-------------------------------------------^000000"; close; L_Enter: addrid(2,0,getcharid(1)); .@party_id = getcharid(1); .@md_name$ = "Endless Tower"; .@etower_timer = checkquest(60200,PLAYTIME); // 1 week .@etower_timer2 = checkquest(60201,PLAYTIME); // 4 hours if (.@etower_timer == 2) { erasequest 60200; erasequest 60201; } if (strcharinfo(3) != strnpcinfo(4)) end; if ($@etower_allow_reenter && .@etower_timer2 < 2 && etower_instanceid == instance_id(IM_PARTY) && instance_live_info(ILI_NAME,instance_id(IM_PARTY)) == .@md_name$) .@reentering = true; else { if ($@etower_weekly_type == 1 && $@etower_weekly_limit) { .@week = atoi(gettimestr("%V",5)); .@year = gettime(DT_YEAR); if (etower_week_cd != .@week || etower_year_cd != .@year) { etower_weekly_count = 0; } else if (etower_weekly_count >= $@etower_weekly_limit) { mes "^0000ffThere are stronger after effects. You can only enter " + ($@etower_allow_reenter?"distinct":"the") + " " + .@md_name$ + " " + (etower_weekly_count!=1?etower_weekly_count + " times":"once") + " a week.^000000"; mes "^0000ffWait till next week.^000000"; close; } } if (.@etower_timer == 0 || .@etower_timer == 1) { mes "Due to the tower's aftereffects, you cannot enter right now."; open_quest_ui 60200; close; } } switch(instance_enter("Endless Tower",-1,-1,getcharid(0),instance_id(IM_PARTY))) { case IE_OTHER: mes "An unknown error has occurred."; close; case IE_NOINSTANCE: mes "The memorial dungeon Endless Tower does not exist."; mes "The party leader did not generate the dungeon yet."; close; case IE_NOMEMBER: mes "You can enter the dungeon after making the party."; close; case IE_OK: //if (getarg(1)) { if (!isbegin_quest(60200) && !.@reentering) { etower_timer = gettimetick(2); etower_instanceid = instance_id(IM_PARTY); setquest 60200; setquest 60201; etower_weekly_count++; etower_week_cd = .@week; etower_year_cd = .@year; } //warpparty instance_mapname("1@tower"),52,354,getcharid(1); //warp "1@tower",52,354; //if (getarg(0,0) == 0) close; end; } }
  11. Hola. El script de Euphy fue pensado para funcionar con monstruos aleatorios. Si deseas tener control total sobre qué monstruos elegir, te recomiendo usar el sistema de misiones de Tr0n's Quest Board, que permite seleccionar exactamente los monstruos que quieras incluir. //Añade misiones de caza aquí (puedes agregar tantos mobs como quieras) //AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...); AddHunting("Eliminación de abejas",1,MAX_LEVEL,503,1,0,500,500,1004,10); // [Josemaaaaa] Chance de contar a kill (%) .count_chance = 50; //===== rAthena Script ======================================= //= tr0n's Questboard //===== By: ================================================== //= tr0n //===== Current Version: ===================================== //= 1.6.6 //===== Description: ========================================= //= Easily add collection and hunting quests. //===== Changelogs: ========================================== // 1.0.0 Release // 1.1.0 Added zeny reward // 1.2.0 Rewrote checkmob and killcounter // 1.3.1 Added level restriction // 1.3.4 Added Reward Item Amount // 1.4.4 Added Quest delay // 1.5.4 Added repeatable Quests // 1.6.4 Added party support // 1.6.5 Bug fixes for party support // 1.6.6 Bug fixes for delay time does not appear [mazvi] //============================================================ prontera,129,215,5 script Questboard 4_BOARD3,{ if(c_run==true){ mes "[^FF7700Questboard^000000]"; mes "^0000FF"+getd("." + currentquest$ + "_collectionname$")+"^000000"; mes "--------------------------------"; set .@size, getarraysize(getd("."+ currentquest$ + "_collectionitem")); for( set .@j, 0; .@j < .@size; set .@j,.@j+2){ mes "^FF0000"+getitemname(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+" - "+countitem(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+"/"+getd("."+currentquest$+"_collectionitem["+(.@j+1)+"]")+" ea.^000000"; } mes "--------------------------------"; mes "[Reward]"; mes "Item: ^0000FF"+((getd("." +currentquest$+"_collectionprize"))?getitemname(getd("." +currentquest$+"_collectionprize"))+" - "+getd("." +currentquest$+"_collectionamount")+" ea.^000000":"Nothing^000000"); mes "Zeny: ^0000FF"+getd("." +currentquest$+"_collectionzeny")+"^000000"; mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+0+"]")+"^000000"; mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+1+"]")+"^000000"; next; if(select("Finish:Abort") == 2){ mes "[^FF7700Questboard^000000]"; mes "Quest aborted."; set currentquest$, ""; set c_run, false; close; } goto L_checkitems; } if(h_run==true){ mes "[^FF7700Questboard^000000]"; mes "^0000FF"+getd("." + currentquest$ + "_huntingname$")+"^000000"; mes "--------------------------------"; set .@size, getarraysize(getd("."+ currentquest$ + "_huntingmob")); for( set .@j, 0; .@j < .@size; set .@j,.@j+2){ set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]"); mes "^FF0000"+getmonsterinfo(getd("."+currentquest$+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000"; } mes "--------------------------------"; mes "[Reward]"; mes "Item: ^0000FF"+((getd("." +currentquest$+"_huntingprize"))?getitemname(getd("." +currentquest$+"_huntingprize"))+" - "+getd("." +currentquest$+"_huntingamount")+" ea.^000000":"Nothing^000000"); mes "Zeny: ^0000FF"+getd("." +currentquest$+"_huntingzeny")+"^000000"; mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+0+"]")+"^000000"; mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+1+"]")+"^000000"; next; if(select("Finish:Abort") == 2){ mes "[^FF7700Questboard^000000]"; mes "Quest aborted."; for(set .@x, 1; .@x < .@size; set .@x,.@x+2){ set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]"); setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0); } set currentquest$, ""; set h_run, false; close; } goto L_checkmobs; } mes "[^FF7700Questboard^000000]"; mes "Select category:"; next; switch(select((.collection)?"Collection Quests":"", (.hunting)?"Hunting Quests":"", "Exit")) { case 1: set .@collectmenu$, ""; for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1){ if (.@i) set .@collectmenu$,.@collectmenu$+":"; set .@collectmenu$, .@collectmenu$ + "[" + getd("." +(.@i+1)+"_collectionmin") + " - " + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$"); } set .@selection,select(.@collectmenu$); if(.quest_repeat == true){ if(gettimetick(2) < getd(.@selection + "_collection_delay")){ mes "[^FF7700Questboard^000000]"; mes "You have to wait ^0000FF"+Time2Str(getd(.@selection + "_collection_delay"))+"^000000 to do this quest again."; close; } } else{ if(getd(.@selection + "_collection_repeat") == true){ mes "[^FF7700Questboard^000000]"; mes "You already did this quest."; mes "Please choose another one."; close; } } mes "[^FF7700Questboard^000000]"; mes "^0000FF"+getd("." + .@selection + "_collectionname$")+"^000000"; mes "--------------------------------"; set .@size, getarraysize(getd("."+ .@selection + "_collectionitem")); for( set .@j, 0; .@j < .@size; set .@j,.@j+2){ mes "^FF0000"+getitemname(getd("."+.@selection+"_collectionitem["+.@j+"]"))+" - "+getd("."+.@selection+"_collectionitem["+(.@j+1)+"]")+" ea.^000000"; } mes "--------------------------------"; mes "[Reward]"; mes "Item: ^0000FF"+((getd("." +.@selection+"_collectionprize"))?getitemname(getd("." +.@selection+"_collectionprize"))+" - "+getd("." +.@selection+"_collectionamount")+" ea.^000000":"Nothing^000000"); mes "Zeny: ^0000FF"+getd("." +.@selection+"_collectionzeny")+"^000000"; mes "Base EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+0+"]")+"^000000"; mes "Job EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+1+"]")+"^000000"; next; if(select("Accept:Decline") == 2){ close; } if(BaseLevel >= getd("." +.@selection+"_collectionmin") && BaseLevel <= getd("." +.@selection+"_collectionmax")){ mes "[^FF7700Questboard^000000]"; mes "Quest accepted."; set c_run, true; set currentquest$, .@selection; close; } else{ mes "[^FF7700Questboard^000000]"; mes "You don't have the required"; mes "level to do this quest."; close; } case 2: set .@huntmenu$, ""; for( set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1){ if (.@i) set .@huntmenu$,.@huntmenu$+":"; set .@huntmenu$, .@huntmenu$ + "[" + getd("." +(.@i+1)+"_huntingmin") + " - " + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$"); } set .@selection,select(.@huntmenu$); if(.quest_repeat == true){ if(gettimetick(2) < getd(.@selection + "_hunting_delay")){ mes "[^FF7700Questboard^000000]"; mes "You have to wait ^0000FF"+Time2Str(getd(.@selection + "_hunting_delay"))+"^000000 to do this quest again."; close; } } else{ if(getd(.@selection + "_hunting_repeat") == true){ mes "[^FF7700Questboard^000000]"; mes "You already did this quest."; mes "Please choose another one."; close; } } mes "[^FF7700Questboard^000000]"; mes "^0000FF"+getd("." + .@selection + "_huntingname$")+"^000000"; mes "--------------------------------"; set .@size, getarraysize(getd("."+ .@selection + "_huntingmob")); for( set .@j, 0; .@j < .@size; set .@j,.@j+2){ mes "^FF0000"+getmonsterinfo(getd("."+.@selection+"_huntingmob["+.@j+"]"), MOB_NAME)+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000"; } mes "--------------------------------"; mes "[Reward]"; mes "Item: ^0000FF"+((getd("." +.@selection+"_huntingprize"))?getitemname(getd("." +.@selection+"_huntingprize"))+" - "+getd("." +.@selection+"_huntingamount")+" ea.^000000":"Nothing^000000"); mes "Zeny: ^0000FF"+getd("." +.@selection+"_huntingzeny")+"^000000"; mes "Base EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+0+"]")+"^000000"; mes "Job EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+1+"]")+"^000000"; next; if(select("Accept:Decline") == 2){ close; } if(BaseLevel >= getd("." +.@selection+"_huntingmin") && BaseLevel <= getd("." +.@selection+"_huntingmax")){ mes "[^FF7700Questboard^000000]"; mes "Quest accepted."; if (.count_chance > 0 && .count_chance < 100) mes "^FF0000Recuerda: cada vez que derrotes a un monstruo, hay una probabilidad del " + .count_chance + "% de que cuente para tu progreso.^000000"; set h_run, true; set currentquest$, .@selection; close; } else{ mes "[^FF7700Questboard^000000]"; mes "You don't have the required"; mes "level to do this quest."; close; } case 3: close; } L_checkitems: set .@size, getarraysize(getd("."+currentquest$+"_collectionitem")); for( set .@k,0; .@k < .@size; set .@k,.@k+2){ if(countitem(getd("."+currentquest$+"_collectionitem["+.@k+"]"))>=getd("."+currentquest$+"_collectionitem["+(.@k+1)+"]")){ set .@checkitem,.@checkitem+2; } } if(.@checkitem<.@size){ mes "[^FF7700Questboard^000000]"; mes "You don't have everything."; close; } for( set .@delcount,0; .@delcount < .@size; set .@delcount,.@delcount+2){ delitem getd("."+currentquest$+"_collectionitem["+.@delcount+"]"),getd("."+currentquest$+"_collectionitem["+(.@delcount+1)+"]"); } mes "[^FF7700Questboard^000000]"; mes "Congratulation! Here is your Reward."; if(getd("." +currentquest$+"_collectionprize")!=0) getitem(getd("." +currentquest$+"_collectionprize"),getd("." +currentquest$+"_collectionamount")); set Zeny,Zeny+getd("." +currentquest$+"_collectionzeny"); getexp getd("." +currentquest$+"_collectionexp["+0+"]"),getd("." +currentquest$+"_collectionexp["+1+"]"); setd(currentquest$ + "_collection_delay"),gettimetick(2)+.quest_delay; setd(currentquest$ + "_collection_repeat"),true; set currentquest$, ""; set c_run, false; close; L_checkmobs: set .@size, getarraysize(getd("."+currentquest$+"_huntingmob")); set .@goal, .@size/2; for(set .@i, 1; .@i < .@size; set .@i,.@i+2){ set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]"); if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")==getd("."+currentquest$+"_huntingmob["+.@i+"]")){ set .@checkmonster, .@checkmonster+1; if(.@checkmonster==.@goal){ goto L_checkmobs2; } continue; } goto L_checkmobs2; } L_checkmobs2: if(.@checkmonster<.@goal){ mes "[^FF7700Questboard^000000]"; mes "You didn't kill everything."; close; } mes "[^FF7700Questboard^000000]"; mes "Congratulation! Here is your Reward."; set .@size, getarraysize(getd("."+currentquest$+"_huntingmob")); for(set .@x, 1; .@x < .@size; set .@x,.@x+2){ set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]"); setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0); } if(getd("." +currentquest$+"_huntingprize")!=0) getitem(getd("." +currentquest$+"_huntingprize"),getd("." +currentquest$+"_huntingamount")); set Zeny, Zeny+getd("." +currentquest$+"_huntingzeny"); getexp getd("." +currentquest$+"_huntingexp["+0+"]"),getd("." +currentquest$+"_huntingexp["+1+"]"); setd(currentquest$ + "_hunting_delay"),gettimetick(2)+.quest_delay; setd(currentquest$ + "_hunting_repeat"),true; set currentquest$, ""; set h_run, false; close; OnNPCKillEvent: if(h_run!=true) end; set .@size, getarraysize(getd("."+currentquest$+"_huntingmob")); if (.count_chance > 0 && .count_chance < 100) { if (rand(1,100) > .count_chance) .@fail = true; } for(set .@i, 1; .@i < .@size; set .@i,.@i+2){ if(killedrid==getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]")){ set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]"); if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")<getd("."+currentquest$+"_huntingmob["+.@i+"]")){ if (.@fail) dispbottom "[" + getd("."+currentquest$+"_huntingname$") + "] No se registró esta baja."; else { setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1); //message strcharinfo(0), getd("."+currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")"; message strcharinfo(0), getmonsterinfo(.@currentmob, MOB_NAME)+" ["+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+"]"; //unittalk getcharid(3), getmonsterinfo(.@currentmob, MOB_NAME)+" ["+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+"]",bc_self; } } if(getcharid(1) != 0 && .party_support == true){ getmapxy(.@map1$,.@x1,.@y1); set .@killerid, getcharid(3); set .@currentquest$, currentquest$; getpartymember getcharid(1),1; getpartymember getcharid(1),2; for(set .@j, 0; .@j < $@partymembercount; .@j++){ if(isloggedin($@partymemberaid[.@j], $@partymembercid[.@j])){ if(h_run==true && $@partymemberaid[.@j] != .@killerid && .@currentquest$ == getvar(currentquest$, $@partymembercid[.@j]) && readparam(HP, $@partymembercid[.@j]) > 0){ getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@j])); if(.@map1$ == .@map2$ && distance(.@x1,.@y1,.@x2,.@y2) < .party_range){ if (.@fail) dispbottom "[" + getd("."+.@currentquest$+"_huntingname$") + "] No se registró esta baja.","",$@partymembercid[.@j]; else { set .@kill_amt,getvar(getd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount"), $@partymembercid[.@j]); set .@kill_goal,getd("."+.@currentquest$+"_huntingmob["+.@i+"]"); if(.@kill_amt<.@kill_goal) { setd(.@currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", .@kill_amt+1, $@partymembercid[.@j]); //message strcharinfo(0), getd("."+.@currentquest$+"_huntingname$")+": ["+getmonsterinfo(.@currentmob, MOB_NAME)+"] ("+(.@kill_amt+1)+"/"+.@kill_goal+")", 0xB6FF00, $@partymembercid[.@j]; message strcharinfo(0,$@partymembercid[.@j]), getmonsterinfo(.@currentmob, MOB_NAME)+" [ "+(.@kill_amt+1)+" / "+.@kill_goal+" ]"; //unittalk $@partymemberaid[.@j], getmonsterinfo(.@currentmob, MOB_NAME)+" [ "+(.@kill_amt+1)+" / "+.@kill_goal+" ]",bc_self; } } } } } } } break; } } end; OnInit: function AddCollection; function AddHunting; //Activate/Deactivate quest categories (true/1 - activated, false/0 - deactivated) set .collection, true; set .hunting, true; //Quest Delay (seconds) //24 hours = 86400 seconds set .quest_delay, 0; //Activate/Deactivate repeatable quests (true/1 - activated, false/0 - deactivated) set .quest_repeat, true; //Activate/Deactivate party support (true/1 - activated, false/0 - deactivated) set .party_support, true; //Max range for party support (+- x & y coordinations) set .party_range, 25; //Checks if quests are loaded (prevents out of index) if(.questsloaded==true) end; set .questsloaded, true; //Add Collection Quests here (You can add as many required items as you want) //AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...); //Añade misiones de caza aquí (puedes agregar tantos mobs como quieras) //AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...); AddHunting("Eliminación de abejas",1,MAX_LEVEL,503,1,0,500,500,1004,10); // [Josemaaaaa] Chance de contar a kill (%) .count_chance = 50; end; function AddCollection{ set .collectionquestcount,.collectionquestcount+1; setd ("." +.collectionquestcount+"_collectionname$", getarg(0)); setd ("." +.collectionquestcount+"_collectionmin", getarg(1)); setd ("." +.collectionquestcount+"_collectionmax", getarg(2)); setd ("." +.collectionquestcount+"_collectionprize", getarg(3)); setd ("." +.collectionquestcount+"_collectionamount", getarg(4)); setd ("." +.collectionquestcount+"_collectionzeny", getarg(5)); set .@argcount, 6; set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp")); setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount)); setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionitem")); while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){ setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount)); setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount,.@argcount+2; set .@size, .@size+2; } return; } function AddHunting{ set .huntingquestcount,.huntingquestcount+1; setd ("." +.huntingquestcount+"_huntingname$", getarg(0)); setd ("." +.huntingquestcount+"_huntingmin", getarg(1)); setd ("." +.huntingquestcount+"_huntingmax", getarg(2)); setd ("." +.huntingquestcount+"_huntingprize", getarg(3)); setd ("." +.huntingquestcount+"_huntingamount", getarg(4)); setd ("." +.huntingquestcount+"_huntingzeny", getarg(5)); set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp")); set .@argcount, 6; setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount)); setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob")); while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){ setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount)); setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, .@size+2; } return; } }
  12. Hola. El NPC puede mostrar un letrero encima con el número de usuarios que hay en la zona pero el comando waitingroom no acepta colores en el texto del letrero. Solo muestra texto plano, sin formato ni colores. //===== rAthena Script ======================================= //= NPC Zone Quest Warper //===== Current Version: ===================================== //= 1.0 First version. [Racaae] //============================================================ // Colores ejemplo // FF0000 = Rojo // 00FF00 = Verde // 0000FF = Azul // FFFF00 = Amarillo // FF00FF = Rosa // 00FFFF = Cian function script F_ZoneWarper { // getarg(0) : mapa de destino // getarg(1) : coordenada X del destino // getarg(2) : coordenada Y del destino // getarg(3) : nombre de la zona // getarg(4) : color del nombre de la zona (hexadecimal) // getarg(5) : rango del área para contar usuarios // getarg(6) : nombre del NPC .@map$ = getarg(0); .@x = getarg(1); .@y = getarg(2); if (getstrlen(getarg(4)) != 6) debugmes "Invalid color hex code in NPC " + getarg(6); else .@name$ = "^" + getarg(4); .@name$ += getarg(3) + "^000000"; mes "[" + getarg(6) + "]"; mes F_Hi; mes "¿Deseas visitar la " + .@name$ + "?"; if(select("Ir a la " + .@name$ , "Ir después") == 2) { clear; mes "[" + getarg(6) + "]"; mes "Puedes volver cuando quieras."; mes F_Bye; close3; } warp(.@map$, .@x, .@y); end; } prontera,160,181,5 script Guía de Zona#Cartas 4_F_KAFRA1,{ cutin "kafra_01",2; F_ZoneWarper(.map$,.x,.y,.zone_name$,.color$,.zonerange,strnpcinfo(1)); OnInit: //============================================ .zone_name$ = "Zona Quest Cartas"; // Nombre de la zona que aparecerá en el letrero .map$ = "aldebaran"; // Mapa de destino donde está la zona .x = 100; // Coordenada X dentro del mapa de destino .y = 120; // Coordenada Y dentro del mapa de destino .color$ = "70CC11"; // Color del nombre de la zona en formato hexadecimal .zonerange = 15; // Rango alrededor del punto (x,y) para contar usuarios presentes //============================================ //fallthough OnTimer5000: stopnpctimer; delwaitingroom; .@p = getareausers(.map$, (.x-.zonerange), (.y-.zonerange), (.x+.zonerange), (.y+.zonerange)); waitingroom .zone_name$ + " (" + .@p + " visitando)",0; initnpctimer; end; } prontera,160,185,5 script Guía de Zona#questSet 4_F_KAFRA4,{ cutin "kafra_04",2; F_ZoneWarper(.map$,.x,.y,.zone_name$,.color$,.zonerange,strnpcinfo(1)); OnInit: //============================================ .zone_name$ = "Zona de quest Set"; // Nombre de la zona que aparecerá en el letrero .map$ = "gonryun"; // Mapa de destino donde está la zona .x = 120; // Coordenada X dentro del mapa de destino .y = 100; // Coordenada Y dentro del mapa de destino .color$ = "0000FF"; // Color del nombre de la zona en formato hexadecimal .zonerange = 15; // Rango alrededor del punto (x,y) para contar usuarios presentes //============================================ //fallthough OnTimer5000: stopnpctimer; delwaitingroom; .@p = getareausers(.map$, (.x-.zonerange), (.y-.zonerange), (.x+.zonerange), (.y+.zonerange)); waitingroom .zone_name$ + " (" + .@p + " visitando)",0; initnpctimer; end; } function script F_Hi { return callfunc("F_Rand","¡Hola!","¡Buenas!","¡Buen día!","¿Cómo estás?","¡Hola por ahí!"); } function script F_Bye { return callfunc("F_Rand","Adiós. Hasta luego.","Nos vemos.","Hasta pronto.","¡Buena suerte!","¡Que tengas un buen día!","¡Chao chao!"); }
  13. In \npc\re\jobs\novice\academy.txt. Find: specialeffect EF_SIGHT, AREA, "Odd Novice#nk1"; Replace: specialeffect EF_SIGHT;
  14. \src\map\clif.cpp // messages mustn't be too long if( messageLength > CHAT_SIZE_MAX-1 ) { // Normally you can only enter CHATBOX_SIZE-1 letters into the chat box, but Frost Joke / Dazzler's text can be longer. // Also, the physical size of strings that use multibyte encoding can go multiple times over the chatbox capacity. // Neither the official client nor server place any restriction on the length of the data in the packet, // but we'll only allow reasonably long strings here. This also makes sure that they fit into the `chatlog` table. ShowWarning("clif_process_message: Player '%s' sent a message too long ('%.*s')!\n", sd->status.name, CHAT_SIZE_MAX-1, message); return false; } Check your ba_frostjoke / dc_scream files on data folder/grf. Too long messages can trigger the error.
  15. You can use commands waitingroom and initnpctimer. Find this part: if (.@announce$[0] != "") announce strcharinfo(0) + " está buscando miembros " + implode(.@announce$, " ") + " para su grupo.",0; else announce strcharinfo(0) + " está buscando miembros para su grupo.",0; Add the following line after it: donpcevent strnpcinfo(0) + "::OnUpdateBoard"; Then add this part at the end of the NPC: OnUpdateBoard: .board_index = getarraysize($@party_ids) - 1; OnTimer4000: stopnpctimer; delwaitingroom; .@total = getarraysize($@party_ids); if (.@total) { .@target_pid = $@party_ids[.board_index]; .@announce$[.@count++] = $@party_leader$[.@target_pid]; if ($@party_min_level[.@target_pid] > 1) .@announce$[.@count++] = "+" + $@party_min_level[.@target_pid]; if (.party_filter_type$[.@target_pid] == "role") { if ($@party_filter_values$[.@target_pid] != "cualquier") .@announce$[.@count++] = replacestr($@party_filter_values$[.@target_pid], ",", " / "); } else if ($@party_filter_values$[.@target_pid] != "cualquier") { explode(.@class_array$, $@party_filter_values$[.@target_pid], ","); if (getarraysize(.@class_array$) < 4) { for (.@i = 0; .@i < getarraysize(.@class_array$); .@i++) .@class_array$[.@i] = jobname(atoi(.@class_array$[.@i])); .@announce$[.@count++] = implode(.@class_array$, " / "); } else .@announce$[.@count++] = "Ciertas clases"; } waitingroom implode(.@announce$, " "),0; .board_index++; if (.board_index >= .@total) .board_index = 0; initnpctimer; } end; Full script:
  16. The NPC is in the empty space between floors. You can use @jump 53 8 to get close to it. - script ShowEndlessTowerPoints -1,{ OnAtcommand: .@size = getarraysize($@difficulty_mode$); if (!.@size) { dispbottom "Please talk to the Tower Protection Stone first."; end; } dispbottom "===================="; dispbottom "ENDLESS TOWER POINTS"; for (.@i = 1; .@i < .@size; .@i++) dispbottom $@difficulty_mode$[.@i] + ": " + getd("#" + $@var_names$[.@i]); dispbottom "===================="; end; OnInit: bindatcmd "ETpoints",strnpcinfo(3)+"::OnAtcommand"; end; }
  17. getmapxy and getmonsterinfo now use constants. Find: getmapxy .@map$, .@x, .@y, 0; Replace: getmapxy .@map$, .@x, .@y; Find: getmapxy .@map$, .@x, .@y ,1; Replace: getmapxy .@map$, .@x, .@y ,BL_NPC; Find all: getmonsterinfo( ..., 0) Replace: getmonsterinfo( ..., MOB_NAME) // ....... if your server has { Overwriting user function [int__] } don't blame me .......... function script int__ { set .@num, atoi(getarg(0)+""); if ( .@num == 0 || .@num >= 2147483647 ) return getarg(0); set .@l, getstrlen(.@num+""); for ( set .@i,0; .@i < .@l; set .@i, .@i + 1 ) { set .@num$, .@num % pow(10,.@i+1) / pow(10,.@i) + .@num$; if ( (.@i+1) % 3 == 0 && .@i+1 != .@l ) set .@num$, ","+ .@num$; } return .@num$; } //===== eAthena Script ====================================== //= Private MVP/Branch Room //===== By: =============================================== //= by ~AnnieRuru~ //===== Current Version: ====================================== //= 1.4a //===== Compatible With: ===================================== //= rathena 16819 //===== Description: ========================================= //= Player can rent MVP room for the player him/herself, for party or for guilds //===== Topic ================================================= //= http://www.eathena.ws/board/index.php?showtopic=187654 //===== Additional Comments: ================================== //= 1.0 //= ---- break the tradition which a script only for a player, or only for a party. //= now 1 room can be use for party and another room can use for guilds. //= ---- timeout feature to prevent player owns the room indefinitely, //= by create a new account and sit/@at'ing inside overnight. //= ---- can disable mvp/boss summon via configuration and becomes a branch room script. //= ---- a double check to prevent players rent all the rooms for himself. //= 1.0a //= ---- fix a critial bug that the time count too fast -_-" //= 1.1 //= ---- added item cost to rent or to summon //= ---- added a config to limit summoning per session //= ---- added flood control option //= 1.2 //= ---- rewrite the waitingroom counter //= ---- optimize the script in a way can add custom summon group //= ---- add config to kill the monsters if the room just being left empty //= ---- add GM can kick room in use //= ---- add able to spawn in numbers //= ---- add limitspawn can configure to negative to limit spawn in that group instead of individual one //= 1.3 //= ---- fix chatroom countdown issue due to rev13269 //= ---- fix a bug if 2 people rent a room at same time, the later 1 will get the room //= ---- add a feature so the GM can know how long the room has rented or abandoned //= 1.4 //= ---- update with new mvp and mini bosses //= ---- fix an exploit if server allow to use @mail, player can send item/zeny away to prevent item/zeny deletion when registering the room //= ---- players die inside mvp room shouldn't lose exp //= 1.4a //= ---- fix this to use in rathena //======================================================== // This is the shop for this Branch room IF you already enable it. Can sell whatever things you want. - shop MVP room#branch -1,604:100000,12103:1000000 - script MVP Summoner -1,{ goto L_Start; OnInit: getmapxy .@map$, .@x, .@y, BL_NPC; if ( .@map$ == "" ) { // Config --------------------------------------------------------------------------------------- // Time for rent a room IN MINUTES. When time out, players inside the room will kick out. Do Not set this as 0 set .timeout, 30; // if the room left empty for # minutes, will be treated as give up the room. Do Not set this as 0 set .nobodygiveup, 2; // NOTE : The script only search item OR zeny. if you specify item amount, then it will ask for the item. If item amount is 0, then it will ask for zeny. // the cost to rent a room set .rentitemid, 674; // item id use for rent a room - 674 - mithil coin set .rentitemamount, 0; // amount of items to rent a room set .rentcost, 1000000; // otherwise, zeny cost to rent a room // limit each room can only summon 1 monster at a time. (only the Summoning option) // Turn it off (0) means the player can summon a lot of monsters as long as the player has enough zeny/item. High rate server players love the room with a lot MVPs // Turn it on (1) means the player have to kill existing monster before can summon a new one. Low rate server player prefer to take out MVP 1 by 1 set .floodcontrol, 1; // if .floodcontrol is turn off, your players might experience lag if they summoned too many MVPs // so what is the maximum input to limit your players summon too many ? set .inputlimit, 30; // If the room has left over monsters while nobody in the room and the room not give up yet, shall we kill monsters in empty room ? set .killmonster, 1; // Default is yes // Options menu setting for MVP Summoner NPC. set .@menu[0], 1; // Turn Heal option On/Off set .@menu[1], 1; // Turn Group 1 summons On/Off -> MVP set .@menu[2], 1; // Turn Group 2 summons On/Off -> mini boss set .@menu[3], 0; // Turn Group 3 summons On/Off set .@menu[4], 0; // Turn Group 4 summons On/Off set .@menu[5], 0; // Turn Group 5 summons On/Off set .@menu[6], 0; // Turn Group 6 summons On/Off set .@menu[7], 0; // Turn Group 7 summons On/Off set .@menu[8], 0; // Turn Group 8 summons On/Off set .@menu[9], 0; // Turn Group 9 summons On/Off set .@menu[10], 0; // Sell shop items options On/Off ( shop npc above ) // set respawn point when they leave the room. Obviously warp to the Private MVP Room Warper npc set .respawnmap$, "prontera"; // Note : "SavePoint" does NOT work set .respawnx, 150; set .respawny, 174; // The minimum GM level can kick a room in use set .gmlvlkick, 80; // .limitspawn in previous revision changed to .grouplimit . // it is for limit each monster spawn per session, prevent them only killing same monster again and again // Now you can configure one group has limited summon, and another group has unlimited summon // Tips: if you server has an insane custom MVP, you can put your custom mob to Group 3~9 with insane item cost, and limit only 1 summon per session // .grouplimit use amount, means if group1limit set to 10, then each session can only summon up to 10 amount of that kind of monster. 0 is unlimited // --------- // Group 1 -> MVP // --------- set .group1name$, "MVP"; // Group 1 name set .group1itemid, 674; // item id use for summon any Group 1 monster - 674 - mithil coin set .group1itemamount, 0; // amount of items to summon a Group 1 monster set .group1cost, 100000; // if no item is specify, zeny cost to summon a Group 1 monster set .group1limit, 0; // limit of summon of Group 1 monster per session, prevent them only killing same monster again and again setarray .group1id, 1511,// Amon Ra 1647,// Assassin Cross Eremes 1785,// Atroce 1630,// Bacsojin 1039,// Baphomet 1874,// Beelzebub 1272,// Dark Lord 1719,// Datale 1046,// Doppelgangger 1389,// Dracula 1112,// Drake 1115,// Eddga 1418,// Evil Snake Lord 1871,// Fallen Bishop 1252,// Garm 1768,// Gloom Under Night 1086,// Golden Thief Bug 1885,// Gopinich 1649,// High Priest Magaleta 1651,// High Wizard Katrinn 1832,// Ifrit 1492,// Incantation Samurai 1734,// Kiel D-01 1251,// Knight of Windstorm 1779,// Ktullanux // 1980,// Kubkin ( I think this mvp is still new ) 1688,// Lady Tanee 1646,// Lord Knight Seyren 1373,// Lord of Death 1147,// Maya 1059,// Mistress 1150,// Moonlight Flower 1087,// Orc Hero 1190,// Orc Lord 1038,// Osiris 1157,// Pharaoh 1159,// Phreeoni 1623,// RSX 0806 1650,// Sniper Shecil 1583,// Tao Gunka 1708,// Thanatos 1312,// Turtle General 1751,// Valkyrie Randgris 1685,// Vesper 1648,// Whitesmith Harword 1917,// Wounded Morroc 1658;// Ygnizem // --------- // Group 2 -> mini boss // --------- set .group2name$, "mini boss"; // Group 2 name set .group2itemid, 674; // item id use for summon any Group 2 monster - 674 - mithil coin set .group2itemamount, 0; // amount of items to summon a Group 2 monster set .group2cost, 10000; // if no item is specify, zeny cost to summon a Group 2 monster set .group2limit, 0; // limit of summon of Group 2 monster per session, prevent them only killing same monster again and again setarray .group2id, 1096,// Angeling 1388,// Archangeling 1795,// Bloody Knight 1830,// Bow Guardian 1839,// Byorgue 1309,// Cat O' Nine Tail 1283,// Chimera 1302,// Dark Illusion 1198,// Dark Priest 1582,// Deviling 1091,// Dragon Fly 1093,// Eclipse 1205,// Executioner 1783,// Galion 1592,// Gangster 1120,// Ghostring 1259,// Gryphon 1720,// Hydro 1090,// Mastering 1289,// Maya Purple 1262,// Mutant Dragon 1203,// Mysteltainn 1870,// Necromancer 1295,// Owl Baron 1829,// Sword Guardian 1204,// Tirfing 1089,// Toad 1092,// Vagabond Wolf 1765;// Valkyrie // --------- // Group 3 // --------- set .group3name$, "Poring-Family"; // Group 3 name set .group3itemid, 12109; // item id use for summon any Group 3 monster - 12109 - Poring box set .group3itemamount, 1; // amount of items to summon a Group 3 monster set .group3cost, 0; // if no item is specify, zeny cost to summon a Group 3 monster set .group3limit, -5; // limit of summon of Group 3 monster per session, prevent them only killing same monster again and again setarray .group3id, 1002,// Poring 1113,// Drops 1031,// Poporing 1242,// Marin 1062,// Santa Poring 1613,// Metaling 1784,// Stapo 1090,// Mastering 1096,// Angeling 1120,// Ghostring 1582,// Deviling 1388,// Arc Angeling 1502;// Pori Pori // --------- // Group 4 // --------- set .group4name$, ""; // Group 4 name set .group4itemid, 0; // item id use for summon any Group 4 monster set .group4itemamount, 0; // amount of items to summon a Group 4 monster set .group4cost, 0; // if no item is specify, zeny cost to summon a Group 4 monster set .group4limit, 0; // limit of summon of Group 4 monster per session, prevent them only killing same monster again and again setarray .group4id, 1001, 1002; // --------- // Group 5 // --------- set .group5name$, ""; // Group 5 name set .group5itemid, 0; // item id use for summon any Group 5 monster set .group5itemamount, 0; // amount of items to summon a Group 5 monster set .group5cost, 0; // if no item is specify, zeny cost to summon a Group 5 monster set .group5limit, 0; // limit of summon of Group 5 monster per session, prevent them only killing same monster again and again setarray .group5id, 1001, 1002; // --------- // Group 6 // --------- set .group6name$, ""; // Group 6 name set .group6itemid, 0; // item id use for summon any Group 6 monster set .group6itemamount, 0; // amount of items to summon a Group 6 monster set .group6cost, 0; // if no item is specify, zeny cost to summon a Group 6 monster set .group6limit, 0; // limit of summon of Group 6 monster per session, prevent them only killing same monster again and again setarray .group6id, 1001, 1002; // --------- // Group 7 // --------- set .group7name$, ""; // Group 7 name set .group7itemid, 0; // item id use for summon any Group 7 monster set .group7itemamount, 0; // amount of items to summon a Group 7 monster set .group7cost, 0; // if no item is specify, zeny cost to summon a Group 7 monster set .group7limit, 0; // limit of summon of Group 7 monster per session, prevent them only killing same monster again and again setarray .group7id, 1001, 1002; // --------- // Group 8 // --------- set .group8name$, ""; // Group 8 name set .group8itemid, 0; // item id use for summon any Group 8 monster set .group8itemamount, 0; // amount of items to summon a Group 8 monster set .group8cost, 0; // if no item is specify, zeny cost to summon a Group 8 monster set .group8limit, 0; // limit of summon of Group 8 monster per session, prevent them only killing same monster again and again setarray .group8id, 1001, 1002; // --------- // Group 9 // --------- set .group9name$, ""; // Group 9 name set .group9itemid, 0; // item id use for summon any Group 9 monster set .group9itemamount, 0; // amount of items to summon a Group 9 monster set .group9cost, 0; // if no item is specify, zeny cost to summon a Group 9 monster set .group9limit, 0; // limit of summon of Group 9 monster per session, prevent them only killing same monster again and again setarray .group9id, 1001, 1002; // Config Ends ------------------------------------------------------------------------ if ( .timeout == 0 ) set .timeout, 60; if ( .nobodygiveup == 0 ) set .nobodygiveup, 5; if ( .inputlimit < 1 ) set .inputlimit, 1; if ( .rentitemid && .rentitemamount ) { if ( getitemname(.rentitemid) == "null" ) { debugmes "Private MVP Room: Rent a room is using invalid item id."; } } set .@i, 1; while ( .@i <= 9 ) { if ( .@menu[.@i] && getd(".group"+ .@i +"itemid") && getd(".group"+ .@i +"itemamount") ) { if ( getitemname( getd(".group"+ .@i +"itemid") ) == "null" ) { debugmes "Private MVP Room: Group no. "+ .@i +" is using invalid item id."; } } set .@i, .@i +1 ; } set .menu$, ( (.@menu[0])?"Heal":"" )+":"+( (.@menu[1])?"Summon "+ .group1name$:"" )+":"+( (.@menu[2])?"Summon "+ .group2name$:"" )+":"+( (.@menu[3])?"Summon "+ .group3name$:"" )+":"+( (.@menu[4])?"Summon "+ .group4name$:"" )+":"+( (.@menu[5])?"Summon "+ .group5name$:"" )+":"+( (.@menu[6])?"Summon "+ .group6name$:"" )+":"+( (.@menu[7])?"Summon "+ .group7name$:"" )+":"+( (.@menu[8])?"Summon "+ .group8name$:"" )+":"+( (.@menu[9])?"Summon "+ .group9name$:"" )+":"+( (.@menu[10])?"Buy branches":"" )+":Leave this room:Give up this room"; set .@i, 1; while ( .@i <= 9 ) { setd ".group"+ .@i +"idsize", getarraysize( getd(".group"+ .@i +"id") ); if ( .@menu[.@i] && getd(".group"+ .@i +"limit") <= 0 ) { set .@j, 0; while ( .@j < getd(".group"+ .@i +"idsize") ) { setd ".group"+ .@i +"menu$", getd(".group"+ .@i +"menu$") + getmonsterinfo( getd(".group"+ .@i +"id["+ .@j +"]"), MOB_NAME) +":"; set .@j, .@j +1 ; } } set .@i, .@i +1 ; } } else { sleep 1; mapannounce .@map$, "Admin has refresh the server, please register the room again.", 1; mapwarp .@map$, .respawnmap$, .respawnx, .respawny; } end; L_Start: // I hate gotos ... but ... set .@dif, strnpcinfo(2); if ( .remind[.@dif] == 0 ) { set .remind[.@dif], 1; initnpctimer; } mes "[MVP Summoner]"; mes "Hi, what can I do for you ?"; next; switch ( select(.menu$) ) { case 1: mes "[MVP Summoner]"; if ( mobcount("this","") > 0 ) { mes "I cannot offer heal service when there are monsters around."; close; } sc_end sc_stone; sc_end sc_slowdown; sc_end sc_freeze; sc_end sc_sleep; sc_end sc_curse; sc_end sc_silence; sc_end sc_confusion; sc_end sc_blind; sc_end sc_bleeding; sc_end sc_decreaseagi; sc_end sc_poison; sc_end sc_hallucination; sc_end sc_stripweapon; sc_end sc_striparmor; sc_end sc_striphelm; sc_end sc_stripshield; sc_end sc_changeundead; sc_end sc_orcish; sc_end sc_berserk; sc_end sc_ske; sc_end sc_swoo; sc_end sc_ska; percentheal 100,100; specialeffect2 7; mes "You have completely healed."; close; default: set .@group, @menu -1; if ( .floodcontrol && mobcount("this","") > 0 ) { mes "[MVP Summoner]"; mes "I cannot summon another monster when there are monsters around."; close; } else if ( getd(".group"+ .@group +"itemid") && getd(".group"+ .@group +"itemamount") ) { mes "[MVP Summoner]"; mes "The cost to summon a "+ getd(".group"+ .@group +"name$") +" is "+ getd(".group"+ .@group +"itemamount") +" "+ getitemname( getd(".group"+ .@group +"itemid") ) +"."; if ( getd(".group"+ .@group +"limit") < 0 ) mes "("+( ( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) <= 0 )?0:( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) ) )+") more summons for this group."; next; } else if ( getd(".group"+ .@group +"cost") ) { mes "[MVP Summoner]"; mes "The cost to summon a "+ getd(".group"+ .@group +"name$") +" is "+ callfunc("int__", getd(".group"+ .@group +"cost") ) +" zeny."; if ( getd(".group"+ .@group +"limit") < 0 ) mes "("+( ( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) <= 0 )?0:( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) ) )+") more summons for this group."; next; } else if ( getd(".group"+ .@group +"limit") < 0 ) { mes "[MVP Summoner]"; mes "("+( ( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) <= 0 )?0:( ~getd(".group"+ .@group +"limit")+1 - getd(".group"+ .@group +"limit"+ .@dif) ) )+") more summons for this group."; next; } if ( getd(".group"+ .@group +"limit") < 0 && getd(".group"+ .@group +"limit"+ .@dif) >= ~getd(".group"+ .@group +"limit")+1 ) { mes "[MVP Summoner]"; mes "I'm sorry, but you can't summon any more monster for this group."; close; } else if ( getd(".group"+ .@group +"limit") > 0 ) { for ( set .@i, 0; .@i < getd(".group"+ .@group +"idsize"); set .@i, .@i +1 ) set .@menu$, .@menu$ +( ( getd(".group"+ .@group +"limit"+ .@dif +"["+ .@i +"]") >= getd(".group"+ .@group +"limit") )?"^999999":"^000000" )+ getmonsterinfo( getd(".group"+ .@group +"id["+ .@i +"]"), MOB_NAME) +" ("+ ( ( getd(".group"+ .@group +"limit") - getd(".group"+ .@group +"limit"+ .@dif +"["+ .@i +"]") <= 0 )?0:( getd(".group"+ .@group +"limit") - getd(".group"+ .@group +"limit"+ .@dif +"["+ .@i +"]") ) ) +")"+":"; set .@menu, select(.@menu$) -1; } else set .@menu, select( getd(".group"+ .@group +"menu$") ) -1; mes "[MVP Summoner]"; if ( .floodcontrol == 0 && .inputlimit > 1 ) { mes "Input an amount of monsters to summon."; next; input .@amount; if ( .@amount == 0 ) close; else if ( .@amount > .inputlimit ) set .@amount, .inputlimit; mes "[MVP Summoner]"; } else set .@amount, 1; if ( getd(".group"+ .@group +"itemid") && getd(".group"+ .@group +"itemamount") ) { if ( countitem( getd(".group"+ .@group +"itemid") ) < getd(".group"+ .@group +"itemamount") * .@amount ) { mes "You don't have enough "+ getitemname( getd(".group"+ .@group +"itemid") ) +" to summon a "+ getd(".group"+ .@group +"name$") +"."; close; } } else if ( getd(".group"+ .@group +"cost") ) { if ( zeny < getd(".group"+ .@group +"cost") * .@amount ) { mes "You don't have enough zeny to summon a "+ getd(".group"+ .@group +"name$") +"."; close; } } if ( .floodcontrol && mobcount("this","") > 0 ) { mes "I cannot summon another monster when there are monsters around."; close; } else if ( getd(".group"+ .@group +"limit") > 0 ) { if ( getd(".group"+ .@group +"limit"+ .@dif +"["+ .@menu +"]") >= getd(".group"+ .@group +"limit") ) { mes "I'm sorry, but you already summoned that monster too much. Try summon another."; close; } else if ( getd(".group"+ .@group +"limit"+ .@dif +"["+ .@menu +"]") + .@amount > getd(".group"+ .@group +"limit") ) { mes "The amount you input is more than the limit you can summon. Try reduce the amount."; close; } } else if ( getd(".group"+ .@group +"limit") < 0 ) { if ( getd(".group"+ .@group +"limit"+ .@dif) >= ~getd(".group"+ .@group +"limit")+1 ) { mes "I'm sorry, but you can't summon any more monster for this group."; close; } else if ( getd(".group"+ .@group +"limit"+ .@dif) + .@amount > ~getd(".group"+ .@group +"limit")+1 ) { mes "The amount you input is more than the limit you can summon. Try reduce the amount."; close; } } mes "Summoning "+ .@amount +" "+ getmonsterinfo( getd(".group"+ .@group +"id["+ .@menu +"]"), MOB_NAME) +"."; mes "Ok, get ready ?"; close2; if ( .floodcontrol && mobcount("this","") > 0 ) end; if ( getd(".group"+ .@group +"itemid") && getd(".group"+ .@group +"itemamount") ) { if ( countitem( getd(".group"+ .@group +"itemid") ) < getd(".group"+ .@group +"itemamount") * .@amount ) end; delitem getd(".group"+ .@group +"itemid"), getd(".group"+ .@group +"itemamount") * .@amount; } else if ( getd(".group"+ .@group +"cost") ) { if ( zeny < getd(".group"+ .@group +"cost") * .@amount ) end; set zeny, zeny - getd(".group"+ .@group +"cost") * .@amount; } if ( getd(".group"+ .@group +"limit") > 0 ) { if ( getd(".group"+ .@group +"limit"+ .@dif +"["+ .@menu +"]") + .@amount > getd(".group"+ .@group +"limit") ) end; setd ".group"+ .@group +"limit"+ .@dif +"["+ .@menu +"]", getd(".group"+ .@group +"limit"+ .@dif +"["+ .@menu +"]") + .@amount; } else if ( getd(".group"+ .@group +"limit") < 0 ) { if ( getd(".group"+ .@group +"limit"+ .@dif) + .@amount > ~getd(".group"+ .@group +"limit")+1 ) end; setd ".group"+ .@group +"limit"+ .@dif, getd(".group"+ .@group +"limit"+ .@dif) + .@amount; } monster "this", 0, 0, "--ja--", getd(".group"+ .@group +"id["+ .@menu +"]"), .@amount; end; case 11: if ( mobcount("this","") > 0 ) { mes "[MVP Summoner]"; mes "I cannot offer this service when there are monsters around."; close; } close2; callshop "MVP room#branch", 0; end; case 12: mes "[MVP Summoner]"; mes "Are you sure you want to leave this room ?"; mes "If this room left empty for more than "+ .nobodygiveup +" minutes, you lost ownership for this room."; if ( select( "Yes:No") == 2 ) close; warp .respawnmap$, .respawnx, .respawny; end; case 13: mes "[MVP Summoner]"; getmapxy .@map$, .@x, .@y; if ( getmapusers(.@map$) > 1 ) { mes "There are still some players in this room. Make sure you are the last member in this room to use this option."; close; } mes "Are you sure you want to give up this room ?"; if ( .rentcost ) mes "You will need to pay again to enter this room."; next; if ( select( "Yes:No" ) == 2 ) close; warp .respawnmap$, .respawnx, .respawny; set .remaintime[.@dif], -1; end; } close; OnEnterMap: set .@dif, strnpcinfo(2); set .remind[.@dif], 0; for ( set .@i, 1; .@i <= 9; set .@i, .@i +1 ) deletearray getd(".group"+ .@i +"limit"+ .@dif), getd(".group"+ .@i +"idsize"); set .nobodycounter[.@dif], 0; getmapxy .@map$, .@x, .@y ,BL_NPC; set .starttime[.@dif], gettimetick(2); do { set .remaintime[.@dif], .timeout * 60 + .starttime[.@dif] - gettimetick(2); set .@hour[.@dif], .remainTime[.@dif] / 3600 ; set .@min[.@dif], .remainTime[.@dif] % 3600 / 60 ; set .@sec[.@dif], .remainTime[.@dif] % 3600 % 60 ; delwaitingroom strnpcinfo(0); waitingroom "Time Left = "+( ( .@hour[.@dif] )?( .@hour[.@dif] +":"):"" )+( ( .@min[.@dif] < 10 )?"0"+ .@min[.@dif]: .@min[.@dif] )+":"+( ( .@sec[.@dif] < 10 )?"0"+ .@sec[.@dif]: .@sec[.@dif] ), 0; if ( getmapusers(.@map$) ) set .nobodycounter[.@dif], 0; else { set .nobodycounter[.@dif], .nobodycounter[.@dif] +1 ; if ( .nobodycounter[.@dif] > .nobodygiveup * 60 ) break; } sleep 995; } while ( .remaintime[.@dif] > 1 ); set .remaintime[.@dif], 0; delwaitingroom "MVP Summoner#"+ .@dif; mapwarp .@map$, .respawnmap$, .respawnx, .respawny; end; OnTimer100: stopnpctimer; npctalk "Hi ~ the bubble above my head is the countdown for using this room."; sleep 2000; npctalk "Sometimes, I can skip for about 1 second in the countdown."; sleep 3000; npctalk "That is because the server is experiencing minor lag problem."; sleep 3000; npctalk "So, don't complain about me cheated for the countdown ~ ^.^"; sleep 3000; npctalk "Have a nice day ~"; end; } prontera,148,174,5 script Private MVP Room 100,{ mes "[Private MVP Room]"; mes "Please select a private MVP room."; if ( getvariableofnpc(.rentitemid, "MVP Summoner") && getvariableofnpc(.rentitemamount, "MVP Summoner") ) mes "The cost to rent a room for "+ getvariableofnpc(.timeout, "MVP Summoner") +" minutes is "+ getvariableofnpc(.rentitemamount, "MVP Summoner") +" "+ getitemname( getvariableofnpc(.rentitemid, "MVP Summoner") ) +"."; else if ( getvariableofnpc(.rentcost, "MVP Summoner") ) mes "The cost to rent a room for "+ getvariableofnpc(.timeout, "MVP Summoner") +" minutes is "+ callfunc("int__", getvariableofnpc(.rentcost, "MVP Summoner") ) +" zeny."; else mes "You can only use the room for only "+ getvariableofnpc(.timeout, "MVP Summoner") +" minutes."; mes " "; for ( set .@i, 1; .@i <= 8; set .@i, .@i +1 ) { if ( getvariableofnpc(.remaintime[.@i],"MVP Summoner") ) { switch ( .type[.@i] ) { case 1: set .@color$, "^EE8800"; break; case 2: set .@color$, "^70CC11"; break; case 3: set .@color$, "^0000FF"; break; default: set .@color$, "^000000"; } mes "Room #"+ .@i +" = "+ .@color$ + .whoinuse$[.@i] +"^000000"; } } next; set .@room, select("MVP Room 1 ["+ getmapusers("06guild_01") +"]", "MVP Room 2 ["+ getmapusers("06guild_02") +"]", "MVP Room 3 ["+ getmapusers("06guild_03") +"]", "MVP Room 4 ["+ getmapusers("06guild_04") +"]", "MVP Room 5 ["+ getmapusers("06guild_05") +"]", "MVP Room 6 ["+ getmapusers("06guild_06") +"]", "MVP Room 7 ["+ getmapusers("06guild_07") +"]", "MVP Room 8 ["+ getmapusers("06guild_08") +"]"); if ( getvariableofnpc(.remaintime[.@room],"MVP Summoner") ) { if ( .inuseid[.@room] == getcharid(.type[.@room]) ) { if ( getvariableofnpc(.killmonster,"MVP Summoner") && getmapusers("06guild_0"+ .@room) == 0 ) killmonsterall "06guild_0"+ .@room; warp "06guild_0"+ .@room, 0,0; end; } else { mes "[Private MVP Room]"; switch ( .type[.@room] ) { case 1: set .@color$, "^EE8800Party "; break; case 2: set .@color$, "^70CC11Guild "; break; case 3: set .@color$, "^0000FFPlayer "; } mes "This room is reserved for "; mes .@color$ + .whoinuse$[.@room] +"^000000 ."; if ( getgmlevel() < getvariableofnpc(.gmlvlkick,"MVP Summoner") ) { mes "Please select another."; close; } mes " "; mes "Currently there are "+ getmapusers("06guild_0"+ .@room) +" players"; mes "in that room."; set .@remaintime, getvariableofnpc(.remaintime[.@room],"MVP Summoner"); mes "It still has "+( .@remaintime /60 )+"mn "+( .@remaintime %60 )+"s left."; set .@nobodycounter, getvariableofnpc(.nobodycounter[.@room],"MVP Summoner"); if ( .@nobodycounter ) mes "And have left empty for "+( .@nobodycounter /60 )+"mn "+( .@nobodycounter %60 )+"s."; mes "Kick them ?"; next; if ( select ( "No:Yes" ) == 1 ) close; set getvariableofnpc(.remaintime[.@room],"MVP Summoner"), -1; mes "[Private MVP Room]"; mes "Room#"+ .@room +" is empty now."; close; } } mes "[Private MVP Room]"; if ( getvariableofnpc(.rentitemid, "MVP Summoner") && getvariableofnpc(.rentitemamount, "MVP Summoner") ) { if ( countitem(getvariableofnpc(.rentitemid, "MVP Summoner")) < getvariableofnpc(.rentitemamount, "MVP Summoner") ) { mes "You don't have enough "+ getitemname( getvariableofnpc(.rentitemid, "MVP Summoner") ) +" to rent a room."; close; } } else if ( getvariableofnpc(.rentcost, "MVP Summoner") ) { if ( zeny < getvariableofnpc(.rentcost, "MVP Summoner") ) { mes "You don't have enough zeny to rent a room."; close; } } mes "You reserve this room for ..."; next; set .@type, select("For my party members", "For my guild members", "For personal account use" ); if ( getcharid(.@type) == 0 ) { mes "[Private MVP Room]"; mes "You do not own a "+( (.@type == 1)?"Party":"Guild" )+"."; close; } else if ( getvariableofnpc(.rentitemid, "MVP Summoner") && getvariableofnpc(.rentitemamount, "MVP Summoner") ) { if ( countitem(getvariableofnpc(.rentitemid, "MVP Summoner")) < getvariableofnpc(.rentitemamount, "MVP Summoner") ) { mes "You don't have enough "+ getitemname( getvariableofnpc(.rentitemid, "MVP Summoner") ) +" to rent a room."; close; } } else if ( getvariableofnpc(.remaintime[.@room],"MVP Summoner") ) { mes "[Private MVP Room]"; mes "I'm sorry, somebody else has already register this room faster than you."; close; } for ( set .@i, 1; .@i <= 8; set .@i, .@i +1 ) { if ( getvariableofnpc(.remaintime[.@i],"MVP Summoner") && .@type == .type[.@i] && getcharid(.@type) == .inuseid[.@i] ) { mes "[Private MVP Room]"; mes "You already rented Room#"+ .@i +". Use that room instead."; close; } } set .type[.@room], .@type; set .inuseid[.@room], getcharid(.@type); set .whoinuse$[.@room], strcharinfo( (.@type == 3)?0:.@type ); if ( getvariableofnpc(.rentitemid, "MVP Summoner") && getvariableofnpc(.rentitemamount, "MVP Summoner") ) { if ( countitem(getvariableofnpc(.rentitemid, "MVP Summoner")) < getvariableofnpc(.rentitemamount, "MVP Summoner") ) end; delitem getvariableofnpc(.rentitemid, "MVP Summoner"), getvariableofnpc(.rentitemamount, "MVP Summoner"); } else if ( getvariableofnpc(.rentcost, "MVP Summoner") ) { if ( zeny < getvariableofnpc(.rentcost, "MVP Summoner") ) end; set zeny, zeny - getvariableofnpc(.rentcost, "MVP Summoner"); } warp "06guild_0"+ .@room, 0,0; killmonsterall "06guild_0"+ .@room; donpcevent "MVP Summoner#"+ .@room +"::OnEnterMap"; end; } 06guild_01,49,49,4 duplicate(MVP Summoner) MVP Summoner#1 116 06guild_02,49,49,4 duplicate(MVP Summoner) MVP Summoner#2 116 06guild_03,49,49,4 duplicate(MVP Summoner) MVP Summoner#3 116 06guild_04,49,49,4 duplicate(MVP Summoner) MVP Summoner#4 116 06guild_05,49,49,4 duplicate(MVP Summoner) MVP Summoner#5 116 06guild_06,49,49,4 duplicate(MVP Summoner) MVP Summoner#6 116 06guild_07,49,49,4 duplicate(MVP Summoner) MVP Summoner#7 116 06guild_08,49,49,4 duplicate(MVP Summoner) MVP Summoner#8 116 06guild_01 mapflag nowarpto 06guild_02 mapflag nowarpto 06guild_03 mapflag nowarpto 06guild_04 mapflag nowarpto 06guild_05 mapflag nowarpto 06guild_06 mapflag nowarpto 06guild_07 mapflag nowarpto 06guild_08 mapflag nowarpto 06guild_01 mapflag nomemo 06guild_02 mapflag nomemo 06guild_03 mapflag nomemo 06guild_04 mapflag nomemo 06guild_05 mapflag nomemo 06guild_06 mapflag nomemo 06guild_07 mapflag nomemo 06guild_08 mapflag nomemo 06guild_01 mapflag noteleport 06guild_02 mapflag noteleport 06guild_03 mapflag noteleport 06guild_04 mapflag noteleport 06guild_05 mapflag noteleport 06guild_06 mapflag noteleport 06guild_07 mapflag noteleport 06guild_08 mapflag noteleport 06guild_01 mapflag nosave SavePoint 06guild_02 mapflag nosave SavePoint 06guild_03 mapflag nosave SavePoint 06guild_04 mapflag nosave SavePoint 06guild_05 mapflag nosave SavePoint 06guild_06 mapflag nosave SavePoint 06guild_07 mapflag nosave SavePoint 06guild_08 mapflag nosave SavePoint 06guild_01 mapflag nopenalty 06guild_02 mapflag nopenalty 06guild_03 mapflag nopenalty 06guild_04 mapflag nopenalty 06guild_05 mapflag nopenalty 06guild_06 mapflag nopenalty 06guild_07 mapflag nopenalty 06guild_08 mapflag nopenalty
  18. Put this in \conf\import\battle_conf.txt. Then save the file and use @reloadbattleconf or restart the server. skill_trap_type: 1
  19. bindatcmd "mvpjoin", strnpcinfo(1) + "::OnEventJoin"; bindatcmd "mvpbet", strnpcinfo(1) + "::OnEventBet"; bindatcmd "mvpstart", strnpcinfo(1) + "::OnStart", 99, 99; The event can be activated by using the command @mvpstart
  20. You can use getunits, isloggedin, and party_addmember to display nearby players and allow the party leader to invite them directly from the NPC. You can use an NPC like this example poster to allow party leaders to post announcements filtered by level, class, or role, and other players can join if they meet the requirements. SPA: prontera,149,164,5 script Cartel de Reclutamiento 4_BOARD3,{ setarray .@jobs,Job_Knight,Job_Priest,Job_Wizard,Job_Blacksmith,Job_Hunter,Job_Assassin,Job_Crusader,Job_Monk,Job_Sage,Job_Rogue,Job_Alchemist,Job_Bard,Job_Dancer,Job_Gunslinger,Job_Ninja,Job_Star_Gladiator,Job_Soul_Linker; if (checkre(0)) setarray .@jobs[getarraysize(.@jobs)],Job_Summoner; mes "Ves un cartel viejo. Alguien lo ha reutilizado para otro propósito..."; mes "Parece usarse para ^EE8800reclutar miembros para grupos^000000 de aventura."; setarray .@roles$,"Dano","Curador","Tank","Soporte"; switch(select("Publicar un anuncio", "Leer los anuncios", "Alejarme")) { case 1: clear; if (!getcharid(1)) { mes "Estoy solo. No tengo party."; close; } if (getcharid(0) != getpartyleader(getcharid(1), 2)) { mes "No soy el líder de mi party. No puedo publicar nada aquí."; close; } .@party_id = getcharid(1); for (.@i = 0; .@i < getarraysize($@party_ids); .@i++) { if ($@party_ids[.@i] == .@party_id) { mes "Já hay un anuncio de mi party aquí. Nada que hacer."; close; } } mes "Penso un poco..."; mes "¿Qué nivel mínimo debería requerir?"; input .@min_level,0,MAX_LEVEL; clear; if (.@min_level > 1) mes "Nivel mínimo : " + .@min_level; else mes "Sin nivel mínimo"; switch(select("Seleccionar roles", "Seleccionar clases", "Cancelar")) { case 1: deletearray .@selected_roles[0], getarraysize(.@roles$); .@accept_all = false; while (1) { .@menu$ = ""; if (.@accept_all) .@menu$ += "^ff0000Desmarcar todos^000000:"; else .@menu$ += "[ ] Cualquier rol^000000:"; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { .@menu$ += (.@selected_roles[.@i] ? "^0000FF[+] " : "^808080[ ] ") + .@roles$[.@i] + "^000000:"; } .@menu$ += "Confirmar selección"; .@opt = select(.@menu$); if (.@opt == 1) { .@accept_all = !.@accept_all; if (.@accept_all) { for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) .@selected_roles[.@i] = true; } else { deletearray .@selected_roles[0], getarraysize(.@roles$); } } else if (.@opt == getarraysize(.@roles$) + 2) { .@valid = false; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { if (.@selected_roles[.@i]) { .@valid = true; break; } } if (!.@valid) { mes "Necesito seleccionar al menos un rol."; continue; } break; } else { .@index = .@opt - 2; .@selected_roles[.@index] = !.@selected_roles[.@index]; if (.@accept_all && !.@selected_roles[.@index]) .@accept_all = false; } } if (.@accept_all) { .party_filter_type$[.@party_id] = "role"; $@party_filter_values$[.@party_id] = "cualquier"; } else { .@str$ = ""; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { if (.@selected_roles[.@i]) { .@str$ += (.@str$ == "" ? "" : ",") + .@roles$[.@i]; } } .party_filter_type$[.@party_id] = "role"; $@party_filter_values$[.@party_id] = .@str$; } mes "Roles confirmados. Anuncio publicado."; .@index = getarraysize($@party_ids); $@party_ids[.@index] = .@party_id; $@party_min_level[.@party_id] = .@min_level; $@party_leader$[.@party_id] = strcharinfo(0); if ($@party_filter_values$[.@target_pid] != "cualquier") .@announce$[.@count++] = replacestr(.@str$, ",", " / "); break; case 2: deletearray .@selected_classes[0], getarraysize(.@jobs); .@accept_all = false; while (1) { .@menu$ = ""; if (.@accept_all) .@menu$ += "^ff0000Desmarcar todas^000000:"; else .@menu$ += "[ ] Cualquier clase^000000:"; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { .@menu$ += (.@selected_classes[.@i] ? "^0000FF[+] " : "^808080[ ] ") + jobname(.@jobs[.@i]) + "^000000:"; } .@menu$ += "Confirmar selección"; .@opt2 = select(.@menu$); if (.@opt2 == 1) { .@accept_all = !.@accept_all; if (.@accept_all) { for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) .@selected_classes[.@i] = true; } else { deletearray .@selected_classes[0], getarraysize(.@jobs); } } else if (.@opt2 == getarraysize(.@jobs) + 2) { .@valid2 = false; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { if (.@selected_classes[.@i]) { .@valid2 = true; break; } } if (!.@valid2) { mes "Necesito seleccionar al menos una clase."; continue; } break; } else { .@index2 = .@opt2 - 2; .@selected_classes[.@index2] = !.@selected_classes[.@index2]; if (.@accept_all && !.@selected_classes[.@index2]) .@accept_all = false; } } if (.@accept_all) { .party_filter_type$[.@party_id] = "class"; $@party_filter_values$[.@party_id] = "cualquier"; } else { .@str$ = ""; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { if (.@selected_classes[.@i]) { .@str$ += (.@str$ == "" ? "" : ",") + .@jobs[.@i]; } } .party_filter_type$[.@party_id] = "class"; $@party_filter_values$[.@party_id] = .@str$; explode(.@class_array$, .@str$, ","); if (getarraysize(.@class_array$) < 4) { for (.@i = 0; .@i < getarraysize(.@class_array$); .@i++) .@class_array$[.@i] = jobname(atoi(.@class_array$[.@i])); .@announce$[.@count++] = implode(.@class_array$, " / "); } else .@announce$[.@count++] = "de ciertas clases"; } mes "Clases confirmadas. Anuncio publicado."; mes "Ahora, a esperar que alguien se una."; .@index = getarraysize($@party_ids); $@party_ids[.@index] = .@party_id; $@party_min_level[.@party_id] = .@min_level; $@party_leader$[.@party_id] = strcharinfo(0); break; case 3: close; } if ($@party_min_level[.@party_id] > 1) .@announce$[.@count++] = "nivel " + $@party_min_level[.@party_id] + "+"; if (.@announce$[0] != "") announce strcharinfo(0) + " está buscando miembros " + implode(.@announce$, " ") + " para su grupo.",0; else announce strcharinfo(0) + " está buscando miembros para su grupo.",0; close; case 2: if (getarraysize($@party_ids) == 0) { mes "El cartel está vacío. Nadie está reclutando ahora."; close; } for (.@i = 0; .@i < getarraysize($@party_ids); .@i++) { .@pid = $@party_ids[.@i]; .@menu$ += "Party de " + $@party_leader$[.@pid] + " (Lv " + $@party_min_level[.@pid] + "+):"; } .@chosen = select(.@menu$) - 1; .@target_pid = $@party_ids[.@chosen]; clear; mes " - Líder: " + $@party_leader$[.@target_pid]; if ($@party_min_level[.@target_pid] > 1) mes " - Nivel requerido: " + $@party_min_level[.@target_pid]; if (.party_filter_type$[.@target_pid] == "role") { mes " - Roles: " + replacestr($@party_filter_values$[.@target_pid], ",", " / "); } else if (.party_filter_type$[.@target_pid] == "class") { if ($@party_filter_values$[.@target_pid] == "cualquier") { mes " - Clasess: Cualquier clase"; } else { explode(.@class_array$, $@party_filter_values$[.@target_pid], ","); .@class_str$ = ""; for (.@i = 0; .@i < getarraysize(.@class_array$); .@i++) { .@class_str$ += (.@class_str$ == "" ? "" : ", ") + jobname(atoi(.@class_array$[.@i])); } mes "Clases: " + .@class_str$; } } else { mes " - Sin restricciones de clase."; } if (BaseLevel < $@party_min_level[.@target_pid]) { mes "Pero... no tengo el nivel suficiente."; close; } if (.party_filter_type$[.@target_pid] == "class") { if ($@party_filter_values$[.@target_pid] != "cualquier") { .@my_class$ = "," + Class + ","; .@allowed$ = "," + $@party_filter_values$[.@target_pid] + ","; if (!compare(.@allowed$, .@my_class$)) { mes "Mi clase no está permitida. Qué lástima."; close; } } } else if (.party_filter_type$[.@target_pid] == "role") { if ($@party_filter_values$[.@target_pid] == "Curador") { if (!(BaseJob == Job_Acolyte || BaseJob == Job_Priest)) { mes "Mi clase no corresponde al rol que esta party necesita."; close; } } } if (getcharid(1)) { mes "Ya pertenezco a una party. No puedo unirme a otra."; close; } mes "Doy un paso al frente, decidido a unirme..."; .@result = party_addmember(.@target_pid, getcharid(0)); if (.@result == 1) mes "Ahora formo parte de esa party."; else if (.@result == -4) mes "El grupo está lleno"; else mes "Algo falló."; close; case 3: close; } OnInit: deletearray $@party_ids[0]; end; }
  21. 1. Changed account variable (#) to character variable. 2. Script only support one quest at a time. Now can do each one together. 3. Changed logic to consider player level. switch (.@difficulty) { case 1: .@min_level = BaseLevel-5; .@max_level = BaseLevel+3; break; case 2: .@min_level = BaseLevel-5; .@max_level = BaseLevel+10; break; case 3: .@min_level = BaseLevel-5; .@max_level = BaseLevel+20; break; default: .@min_level = .@difficulty * 20 - 19; .@max_level = .@difficulty * 20; break; } //===== 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 //===== Quest Generation Subroutines ===== - script QuestSubroutines -1,{ OnInit: // Quest story templates setarray $@qg_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 $@qg_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 $@qg_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($@qg_Hunting_Stories$); debugmes "QuestSubroutines: Killing_Stories$ size: " + getarraysize($@qg_Killing_Stories$); debugmes "QuestSubroutines: Collection_Stories$ size: " + getarraysize($@qg_Collection_Stories$); end; } function script F_Generate_Hunting { .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@count = rand(1,$@qg_Max_Quests); switch (.@difficulty) { case 1: .@min_level = BaseLevel-5; .@max_level = BaseLevel+3; break; case 2: .@min_level = BaseLevel-5; .@max_level = BaseLevel+10; break; case 3: .@min_level = BaseLevel-5; .@max_level = BaseLevel+20; break; default: .@min_level = .@difficulty * 20 - 19; .@max_level = .@difficulty * 20; break; } .@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('"+$@qg_Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT " + .@count, .@mobs); .@story_index = rand(getarraysize($@qg_Hunting_Stories$)); .@story$ = $@qg_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[.@i] = rand(.@min_count, .@max_count); mes " > Jage " + .@needed[.@i] + " " + 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; close3; } for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { setd "Quest_H" + .@i, .@mobs[.@i]; setd "Quest_H" + .@i + "_Needed", .@needed[.@i]; setd "Quest_H" + .@i + "_Count", 0; } 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; } function script F_Generate_Killing { .@difficulty = getarg(0); mes "[Aufgabenmeister]"; switch (.@difficulty) { case 1: .@min_level = BaseLevel-3; .@max_level = BaseLevel+3; break; case 2: .@min_level = BaseLevel-5; .@max_level = BaseLevel+10; break; case 3: .@min_level = BaseLevel-5; .@max_level = BaseLevel+20; break; default: .@min_level = .@difficulty * 20 - 19; .@max_level = .@difficulty * 20; break; } 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('"+$@qg_Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT 1", .@mob); .@size = getarraysize(getd("$@qg_Maps_Tier" + .@difficulty + "$")); copyarray .@map_array$,getd("$@qg_Maps_Tier" + .@difficulty + "$"), .@size; .@map$ = .@map_array$[rand(getarraysize(.@map_array$))]; .@needed = rand(.@min_count, .@max_count); .@story_index = rand(getarraysize($@qg_Killing_Stories$)); .@story$ = $@qg_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; close3; } Quest_Type = 2; Quest_Difficulty = .@difficulty; Quest_K = .@mob[0]; Quest_K_Count = 0; Quest_K_Needed = .@needed; Quest_Monster_ID = .@mob[0]; Quest_Monster_Map$ = .@map$; Quest_Monster_Count = 0; .@hp = getmonsterinfo(.@mob[0], MOB_MAXHP) * 10; monster .@map$, 0, 0, "Boss " + .@mob_name$, .@mob[0], 1, "QuestMonster::OnQuestMobKilled", 2; Quest_Monster_GID = $@mobid[0]; setunitdata $@mobid[0],UMOB_MAXHP,.@hp; setunitdata $@mobid[0],UMOB_HP,.@hp; .@slave = rand(5); if (.@slave) { for (.@i = 0; .@i < .@slave; .@i++) { monster .@map$, 0, 0, .@mob_name$, .@mob[0], 1; setunitdata $@mobid[0],UMOB_MASTERAID,Quest_Monster_GID; } unitskilluseid Quest_Monster_GID,"NPC_CALLSLAVE",1; } 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; } function script F_Generate_Collection { .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@item_count = rand(1,$@qg_Max_Quests); .@min_item = .@difficulty * 5; .@max_item = .@difficulty * 10 + 10; .@items$ = getd("$@qg_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($@qg_Collection_Stories$)); .@story$ = $@qg_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); mes " > Sammle " + .@item_needed + " " + mesitemlink(.@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; close3; } for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { setd "Quest_C" + .@i + "_Item", .@item_list[.@i]; setd "Quest_C" + .@i + "_Item_Needed", .@item_needed; } 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; } //===== Guild Master NPC ===== pvp_room,51,45,4 script Gildenmeister Konrad 4_ED_SCHMIDT,{ cutin "SCHMIDT01.bmp",2; 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; close3; } 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; close3; 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"); close3; case 4: mes "[Gildenmeister Konrad]"; mes "Willst du deinen aktuellen Quest abbrechen?"; mes "Das kostet " + F_InsertComma($@qg_Reset) + " Zeny."; next; switch(select(" ~ Quest abbrechen: ~ ^777777Abbrechen^000000")) { case 1: if (Zeny < $@qg_Reset) { mes "[Gildenmeister Konrad]"; mes "Nicht genug Zeny, Held!"; emotion ET_SORRY; close3; } Zeny -= $@qg_Reset; if (unitexists(Quest_Monster_GID)) { killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; dispbottom "Der Quest-spezifische Boss wurde entfernt."; } for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { setd "Quest_H" + .@i, 0; setd "Quest_H" + .@i + "_Count", 0; setd "Quest_H" + .@i + "_Needed", 0; setd "Quest_C" + .@i + "_Item", 0; setd "Quest_C" + .@i + "_Item_Needed", 0; } Quest_K = 0; Quest_K_Count = 0; Quest_K_Needed = 0; Quest_Type = 0; Quest_Difficulty = 0; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; Quest_Monster_Count = 0; mes "[Gildenmeister Konrad]"; mes "Quest abgebrochen. Du bist frei für neue Taten!"; emotion ET_MONEY; close3; case 2: mes "Gut, dann weiter im Kampfe!"; emotion ET_SMILE; close3; } case 5: mes "[Gildenmeister Konrad]"; mes "Kehre zurück, wenn die Abenteuerlust ruft!"; emotion ET_SCRATCH; close3; } 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 " + $@qg_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($@qg_Shop, @bought_nameid[.@i]); .@cost += ($@qg_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 " + itemlink(@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; close3; } //===== Quest Receiver NPC ===== pvp_room,56,45,4 script Schatzmeister Alfred 1_M_MERCHANT,{ cutin "aca_salim01.bmp",2; mes "[Schatzmeister Alfred]"; mes "Hallo, " + strcharinfo(0) + "! Wie läuft dein Auftrag?"; if (!Quest_H0 && !Quest_K && !Quest_C0_Item) { mes "Du hast keinen aktiven Quest. Sprich mit einem Aufgabenmeister!"; emotion ET_THINK; close3; } 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; close3; } close3; Check_Quest: if (Quest_H0) { // Hunting mes "[Schatzmeister Alfred]"; mes "Dein Fortschritt:"; for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { if (getd("Quest_H" + .@i)) { .@mob = getd("Quest_H" + .@i); .@count = getd("Quest_H" + .@i + "_Count"); .@needed = getd("Quest_H" + .@i + "_Needed"); mes " > " + getmonsterinfo(.@mob, MOB_NAME) + " (" + .@count + "/" + .@needed + ")"; } } for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { if (getd("Quest_H" + .@i) && getd("Quest_H" + .@i + "_Count") < getd("Quest_H" + .@i + "_Needed")) .@imcomplete = true; } if (!.@imcomplete) .@justcompleted = callsub(S_Reward,1); .@pagination++; } .@imcomplete = 0; if (Quest_K) { // Killing if (.@pagination) next; .@mob = Quest_K; .@count = Quest_K_Count; .@needed = Quest_K_Needed; clear; mes "[Schatzmeister Alfred]"; mes "Dein Fortschritt:"; mes " > " + getmonsterinfo(.@mob, MOB_NAME) + " (" + .@count + "/" + .@needed + ")"; mes " > Boss " + getmonsterinfo(.@mob, MOB_NAME) + " (" + (Quest_Monster_Count ? "Erlegt" : "Auf " + Quest_Monster_Map$ + "") + ")"; if (Quest_K_Count >= Quest_K_Needed && Quest_Monster_Count) .@justcompleted = callsub(S_Reward,2); .@pagination++; } if (Quest_C0_Item) { // Collection if (.@pagination) next; mes "[Schatzmeister Alfred]"; mes "Dein Fortschritt:"; for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { if (getd("Quest_C" + .@i + "_Item")) { .@item = getd("Quest_C" + .@i + "_Item"); .@needed = getd("Quest_C" + .@i + "_Item_Needed"); mes " > " + mesitemlink(.@item) + " (" + countitem(.@item) + "/" + .@needed + ")"; if (getd("Quest_C" + .@i + "_Item") && countitem(getd("Quest_C" + .@i + "_Item")) < getd("Quest_C" + .@i + "_Item_Needed")) .@imcomplete = true; } } if (!.@imcomplete) .@justcompleted = callsub(S_Reward,3); } if (.@justcompleted) return; 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; close3; S_Reward: 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; .@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" + mesitemlink(.@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" + mesitemlink(.@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" + mesitemlink(.@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; if (getarg(0) == 1) { for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { setd "Quest_H" + .@i, 0; setd "Quest_H" + .@i + "_Count", 0; setd "Quest_H" + .@i + "_Needed", 0; } if ($@qg_Delay) Quest_Delay1 = gettimetick(2) + ($@qg_Delay * 3600); } else if (getarg(0) == 2) { if (unitexists(Quest_Monster_GID)) { killmonster Quest_Monster_Map$, "QuestMonster::OnQuestMobKilled", Quest_Monster_GID; dispbottom "Der Quest-spezifische Boss wurde entfernt."; } Quest_K = 0; Quest_K_Count = 0; Quest_K_Needed = 0; Quest_Monster_GID = 0; Quest_Monster_Map$ = ""; Quest_Monster_ID = 0; Quest_Monster_Count = 0; if ($@qg_Delay) Quest_Delay2 = gettimetick(2) + ($@qg_Delay * 3600); } else if (getarg(0) == 3) { for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { .@item = getd("Quest_C" + .@i + "_Item"); .@needed = getd("Quest_C" + .@i + "_Item_Needed"); if (.@item) delitem .@item, .@needed; setd "Quest_C" + .@i + "_Item", 0; setd "Quest_C" + .@i + "_Item_Needed", 0; } if ($@qg_Delay) Quest_Delay3 = gettimetick(2) + ($@qg_Delay * 3600); } Mission_Total++; setd "Quest_Tier" + Quest_Difficulty + "_Progress", getd("Quest_Tier" + Quest_Difficulty + "_Progress") + 1; if (getd("Quest_Tier" + Quest_Difficulty + "_Progress") >= ($@qg_Hunting_Quests + $@qg_Killing_Quests + $@qg_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'"); .@justcompleted = true; return 1; OnNPCKillEvent: if (!Quest_Type || (!getcharid(1) || !$@qg_Party)) { if (Quest_H0) { // Hunting for (.@i = 0; .@i < $@qg_Max_Quests; .@i++) { if (getd("Quest_H" + .@i) && getmonsterinfo(killedrid, MOB_NAME) == getmonsterinfo(getd("Quest" + .@i), MOB_NAME)) { if (getd("Quest_H" + .@i + "_Count") < getd("Quest_H" + .@i + "_Needed")) { setd "Quest_H" + .@i + "_Count", getd("Quest_H" + .@i + "_Count") + 1; dispbottom "[Quest] Getötet " + getd("_H" + .@i + "_Count") + " von " + getd("Quest_H" + .@i + "_Needed") + " " + getmonsterinfo(killedrid, MOB_NAME) + "."; end; } } } } if (quest_K && getmonsterinfo(killedrid, MOB_NAME) == getmonsterinfo(Quest_K, MOB_NAME)) { if (Quest_K_Count < Quest_K_Needed) { Quest_K_Count++; dispbottom "[Quest] Getötet " + Quest_K_Count + " von " + Quest_K_Needed + " " + getmonsterinfo(Quest_K, MOB_NAME) + "."; end; } } } else if ($@qg_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 ((getvar(getd("Quest_H0"), $@partymembercid[.@i]) || getvar(getd("Quest_K"), $@partymembercid[.@i])) && .@HP > 0) { getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@i])); if ((.@map1$ == .@map2$ || $@qg_Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || $@qg_Party < 3)) { if (getvar(getd("Quest_H0"), $@partymembercid[.@i])) { for (.@j = 0; .@j < $@qg_Max_Quests; .@j++) { .@my_mob = getvar(getd("Quest_H" + .@j), $@partymembercid[.@i]); .@my_count = getvar(getd("Quest_H" + .@j + "_Count"), $@partymembercid[.@i]); .@my_needed = getvar(getd("Quest_H" + .@j + "_Needed"), $@partymembercid[.@i]); if (.@my_mob && getmonsterinfo(.@mob, MOB_NAME) == getmonsterinfo(.@my_mob, MOB_NAME) && .@my_count < .@my_needed) { setd "Quest_H" + .@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 (getvar(getd("Quest_K"), $@partymembercid[.@i])) { .@my_mob = getvar(Quest_K, $@partymembercid[.@i]); .@my_count = getvar(Quest_K_Count, $@partymembercid[.@i]); .@my_needed = getvar(Quest_K_Needed, $@partymembercid[.@i]); if (.@my_mob && getmonsterinfo(.@mob, MOB_NAME) == getmonsterinfo(.@my_mob, MOB_NAME) && .@my_count < .@my_needed) { setd "Quest_K_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_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_Monster_GID == killedgid && Quest_K == Quest_Monster_ID) { if (!getcharid(1) || !$@qg_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 ($@qg_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(Quest_K, $@partymembercid[.@i]); if (.@HP > 0 && .@Quest_GID == killedgid && .@Quest_Mob == Quest_Monster_ID) { getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@i])); if ((.@map1$ == .@map2$ || $@qg_Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || $@qg_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 4_M_REDSWORD,{ cutin "ep13_captin_edq.bmp",2; 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; close3; 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; close3; 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; close3; case 4: mes "[Großmeister Wolfhart]"; mes "Die Geschichten warten auf dich, wenn du bereit bist."; emotion ET_SMILE; close3; } } //===== Teleport Agent NPC ===== pvp_room,59,45,4 script Stallmeister Tobias 4_M_REIDIN_KURS,{ cutin "3rd_ranger",2; 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; close3; } 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; close3; } .@size = getarraysize(getd("$@qg_Maps_Tier" + .@tier + "$")); copyarray .@map_array$,getd("$@qg_Maps_Tier" + .@tier + "$"), .@size; 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; close3; } Zeny -= .@cost; warp .@map_array$[.@select], 0, 0; mes "[Stallmeister Tobias]"; mes "Viel Glück, Abenteurer!"; emotion ET_GO; close3; } //===== Quest Giver NPCs (8 Total) ===== // Tier 1: Melder Kurt pvp_room,30,85,4 script Melder Kurt 4_M_SWORDMAN,{ cutin "aca_sword.bmp",2; mes "[Melder Kurt]"; mes "Grüß dich, junger Abenteurer " + strcharinfo(0) + "!"; mes "Die Welt von Rune-Midgard braucht Helden wie dich."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (Quest_Type && Quest_Difficulty != 1) { mes "Du hast einen anderen Quest. Schließe den zuerst ab!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm zurück nach " + Time2Str(getd("Quest_Delay" + @menu)) + " für einen neuen Quest."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(1); close3; case 2: F_Generate_Killing(1); close3; case 3: F_Generate_Collection(1); close3; case 4: mes "[Melder Kurt]"; mes "Keine Eile, komm zurück, wenn du bereit bist!"; emotion ET_SMILE; close3; } } // Tier 2: Spähtruppführer Rolf pvp_room,38,85,4 script Spähtruppführer Rolf 1_M_KNIGHTMASTER,{ cutin "god_rebeireb.bmp",2; 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($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 21 || BaseLevel > 40) { mes "Dein Level passt nicht (21–40)."; emotion ET_NO; close3; } if (!Quest_Tier1_Complete) { mes "Du musst erst alle Anfänger-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 2) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(2); close3; case 2: F_Generate_Killing(2); close3; case 3: F_Generate_Collection(2); close3; case 4: mes "[Spähtruppführer Rolf]"; mes "Kehre zurück, wenn der Mut dich treibt!"; emotion ET_SMILE; close3; } } // Tier 3: Zugführer Gregor pvp_room,46,85,4 script Zugführer Gregor 4_M_JOB_KNIGHT1,{ cutin "v_breid01",2; mes "[Zugführer Gregor]"; mes "Sei gegrüßt, tapferer " + strcharinfo(0) + "!"; mes "Deine Taten hallen durch Rune-Midgard."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 41 || BaseLevel > 60) { mes "Dein Level passt nicht (41–60)."; emotion ET_NO; close3; } if (!Quest_Tier2_Complete) { mes "Du musst erst alle Novizen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 3) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(3); close3; case 2: F_Generate_Killing(3); close3; case 3: F_Generate_Collection(3); close3; case 4: mes "[Zugführer Gregor]"; mes "Die Magie der Quests wartet auf dich!"; emotion ET_SMILE; close3; } } // Tier 4: Stabsfeldwebel Hagen pvp_room,54,85,4 script Stabsfeldwebel Hagen 4_M_ROEL,{ cutin "roel01.bmp",2; mes "[Stabsfeldwebel Hagen]"; mes "Willkommen, erfahrener " + strcharinfo(0) + "!"; mes "Du bist ein Jäger der Dunkelheit, bereit für große Missionen."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close3; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(4); close3; case 2: F_Generate_Killing(4); close3; case 3: F_Generate_Collection(4); close3; case 4: mes "[Stabsfeldwebel Hagen]"; mes "Die Beute entkommt nicht ewig, komm zurück!"; emotion ET_SMILE; close3; } } // Tier 4: Hauptmann Lothar pvp_room,62,85,4 script Hauptmann Lothar 1_M_KNIGHTMASTER,{ cutin "job_knight_herman1",2; mes "[Hauptmann Lothar]"; mes "Grüß dich, " + strcharinfo(0) + ", Schatten der Gilde!"; mes "Nur die Besten bestehen meine Prüfungen."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close3; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(4); close3; case 2: F_Generate_Killing(4); close3; case 3: F_Generate_Collection(4); close3; case 4: mes "[Hauptmann Lothar]"; mes "Die Schatten warten auf dich, Held!"; emotion ET_SMILE; close3; } } // Tier 5: Oberst Wilfried pvp_room,70,85,4 script Oberst Wilfried 4_M_CHIEF_IRIN,{ cutin "sara_elder_irine1.bmp",2; mes "[Oberst Wilfried]"; mes "Sei’s drum, Legende " + strcharinfo(0) + "!"; mes "Nur die Mächtigsten bestehen die Prüfungen der Gilde."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[Oberst Wilfried]"; mes "Selbst Legenden brauchen Pausen. Komm zurück!"; emotion ET_SMILE; close3; } } // Tier 5: General Wolfram pvp_room,78,85,4 script General Wolfram 4_M_SURA,{ cutin "3rd_sura_master",2; mes "[General Wolfram]"; mes "Heil dir, " + strcharinfo(0) + ", Licht der Gilde!"; mes "Dein Name ist ein Leuchtfeuer für alle Helden."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[General Wolfram]"; mes "Das Licht der Legenden leuchtet weiter!"; emotion ET_SMILE; close3; } } // Tier 5: Kriegsminister Gustav pvp_room,86,85,4 script Kriegsminister Gustav 4_M_KNIGHT_SILVER,{ cutin "3rd_rune_knight.bmp",2; mes "[Kriegsminister Gustav]"; mes "Ehre sei dir, " + strcharinfo(0) + ", Meister der Gilde!"; mes "Nur die Größten wagen meine Aufgaben."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } 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; if (Quest_Delay1 > gettimetick(2)) .@c1$ = "^808080"; if (Quest_Delay2 > gettimetick(2)) .@c2$ = "^808080"; if (Quest_Delay3 > gettimetick(2)) .@c3$ = "^808080"; switch(select(.@c1$ + "~ Jagd-Quest^000000", .@c2$ + "~ Tötungs-Quest^000000", .@c3$ + "~ Sammel-Quest^000000:~ ^777777Abbrechen^000000")) { if (getd("Quest_Delay" + @menu) > gettimetick(2)) { mes "[" + strnpcinfo(1) + "]"; mes "Komm nach " + Time2Str(getd("Quest_Delay" + @menu)) + " zurück."; emotion ET_SWEAT; close3; } case 1: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[Kriegsminister Gustav]"; mes "Die Meisterschaft erwartet dich, Held!"; emotion ET_SMILE; close3; } } //===== 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 $@qg_Delay = 12; // Quest cooldown in hours $@qg_Reset = 5000; // Zeny cost to abandon quests $@qg_Max_Quests = 3; // Max simultaneous targets/items $@qg_Hunting_Quests = 15; // Number of hunting quests per tier $@qg_Killing_Quests = 15; // Number of killing quests per tier $@qg_Collection_Quests = 20; // Number of collection quests per tier $@qg_Party = 3; // Party support: screen area only // Blacklist of excluded monster IDs (MVPs, problematic) $@qg_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 $@qg_Maps_Tier1$[0], "prt_fild08", "pay_fild04", "moc_fild07", "iz_dun01", "cmd_fild01"; setarray $@qg_Maps_Tier2$[0], "pay_dun00", "moc_fild12", "prt_maze01", "gef_fild07", "cmd_fild03"; setarray $@qg_Maps_Tier3$[0], "pay_dun02", "moc_fild16", "gef_fild09", "cmd_fild08", "iz_dun02"; setarray $@qg_Maps_Tier4$[0], "pay_dun03", "moc_fild19", "gef_dun01", "cmd_dun02", "gl_sew03"; setarray $@qg_Maps_Tier5$[0], "gl_dun02", "gef_dun03", "pay_dun04", "moc_pryd05", "ra_fild01"; // Shop items: ID, mission points cost setarray $@qg_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) $@qg_Items_Tier1$ = "904,905,906,907,908,909,910,911"; // Jellopy, Fluff, Clover, Feather, etc. $@qg_Items_Tier2$ = "912,913,914,915,916,917"; // Sticky Mucus, Scell, Worm Peeling, etc. $@qg_Items_Tier3$ = "918,919,920,921,922"; // Animal Skin, Bug Leg, Scale Shell, etc. $@qg_Items_Tier4$ = "923,924,925,926,927"; // Cyfar, Brigan, Clam Shell, etc. $@qg_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($@qg_Shop); .@i += 2) npcshopadditem "guild_shop", $@qg_Shop[.@i], $@qg_Shop[.@i+1]; end; }
  22. I'm not sure I get what you want. Try: //===== rAthena Script ======================================= //= Rebirth System //===== Description: ========================================= //- Go back to Level 1 to gain bonus status points //===== Changelogs: ========================================== //= 1.0 First version. [Capuche] //= 1.7 Added Grand Rebirth. [Racaae] //============================================================ /* CREATE TABLE IF NOT EXISTS `rebirth_system` ( `player_id` int(11) unsigned NOT NULL default 0, `name` varchar(255) NOT NULL DEFAULT 'NULL', `num_rebirth` int(11) unsigned NOT NULL default 0, `num_grand` int(11) unsigned NOT NULL default 0, `last_ip` varchar(100) NOT NULL default '', PRIMARY KEY (`player_id`) ) ENGINE=MyISAM; */ prontera,141,179,5 script Rebirth System 531,{ function checkItem; // check if player have all item required function colorItemrequired; // color the text. Red : not enough item, green otherwise function deleteItem; // delete all items required function displayItemneed; // display all items need at start function getItemReward; // give the items reward //function weightreq; // check if your current weight is highter than weight high novice if (.ranking_type) @rebirth_type$ = "#"; else @rebirth_type$ = ""; if (.force_sql) { .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql( "SELECT `num_rebirth`,`num_grand` FROM `rebirth_system` WHERE `player_id` = "+ .@player_id, .@rebirthed, .@grand_rebirthed); if ( getd(@rebirth_type$ + "num_rebirth") != .@rebirthed[0] || getd(@rebirth_type$ + "num_grand_rebirth") != .@grand_rebirthed[0]) dispbottom "The rebirth ranking was reset. Your rebirth count is back to zero."; setd @rebirth_type$ + "num_rebirth", .@rebirthed[0]; setd @rebirth_type$ + "num_grand_rebirth", .@grand_rebirthed[0]; } if (.grand_reset_max > -1 && num_grand_rebirth >= .grand_reset_max) { mes "You can only grand rebirth x"+ .grand_reset_max +"."; emotion e_gasp; } else { .@eac = eaclass(); if (BaseLevel < 255 || JobLevel < 120 || ( !( .@eac&EAJL_2 ) || !Upper ) && ( Class != Job_Ninja && Class != Job_Gunslinger && Class != Job_Soul_Linker && Class != Job_Star_Gladiator) ) mes "You must be max level/max job level to rebirth."; else { if ( getd(@rebirth_type$ + "num_rebirth") == .reset_max ) { mes "You have reached the maximum rebirth."; emotion e_gasp; .@s2$ = "^777777~ Grand Rebirth"; } else .@s1$ = "^777777~ Rebirth"; mes "Items need :"; displayItemneed(); } } next; switch( select( .@s1$, .@s2$, "^777777~ Informations", (.rebirth_ranking?"~ Rebirth ranking":""), (.grand_ranking?"~ Grand Rebirth ranking":""), "~ Good bye^000000", (getgroupid() < 90 ?"":"^FF0000[GM]^000000 Reset Rebirth Rankings") )) { case 1: checkItem(); deleteItem(); setd @rebirth_type$ + "num_rebirth", getd(@rebirth_type$ + "num_rebirth")+1; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_rebirth`, `last_ip` ) select "+ .@player_id +", '"+ escape_sql( strcharinfo(0) ) +"', '"+ getd(@rebirth_type$ + "num_rebirth") +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_rebirth` = `rebirth_system`.`num_rebirth` +1"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Rebirth!", 0; break; case 2: checkItem(); deleteItem(); getItemReward(); setd @rebirth_type$ + "num_grand_rebirth", getd(@rebirth_type$ + "num_grand_rebirth")+1; setd @rebirth_type$ + "num_rebirth", 0; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_grand`, `last_ip` ) select "+ .@player_id + ", '" + escape_sql( strcharinfo(0) ) +"', '"+ getd(@rebirth_type$ + "num_grand_rebirth") +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_grand` = `rebirth_system`.`num_grand` +1, `rebirth_system`.`num_rebirth` = 0"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Grand Rebirth!", 0; specialeffect2 EF_GLOW4; break; case 3: do { switch(select( (.ranking_type?"Account ":"My") + " status", "Rebirth", (.grand_reset_max!=0?"Grand Rebirth":""), "Cancel")) { case 1: if ( getd(@rebirth_type$ + "num_grand_rebirth") ) mes "You performed ^0000FFGrand Rebirth^000000 x"+ getd(@rebirth_type$ + "num_grand_rebirth") +"."; if ( getd(@rebirth_type$ + "num_rebirth") ) mes "You already rebirth ^ff0000x"+ getd(@rebirth_type$ + "num_rebirth") +"^000000."; else if ( getd(@rebirth_type$ + "num_grand_rebirth") == 0) mes "You did not rebirth."; break; case 2: mes "Rebirthing can be done when one reaches the pinnacle, that is, maximum base and job level."; mes "It reverts your base level back to 1 and gives you ^ff0000"+ .num_status +" bonus status points^000000."; next; mes "Items required each time:"; displayItemneed(); mes "After ^ff0000"+ .change_reward +" rebirths^000000, more items are necessary."; next; if (.reset_job) mes "You will be back as a simple novice."; else mes "You will maintain your job class, job level and skills."; mes "One can rebirth ^ff0000x"+ .reset_max +"^000000."; if (.ranking_type) mes "Rebirth count is shared between all character in the account."; if (.grand_reset_max != 0) { next; mes "When you reach the limit you can perform the ^0000FFGrand Rebirth^000000."; } break; case 3: mes "After rebirthing "+ .reset_max +" times you can merge all past rebirth into a powerful ^0000FFGrand Rebirth^000000 upon reaching max level!"; next; mes "The process will reward you with item:"; for (.@i = 0 ; .@i < .size_reward; .@i += 2 ) mes .reward[ .@i+1 ] + " " + mesitemlink(.reward[.@i]); mes "Also all bonus status points gained are forfeit since the rebirth count goes back to zero."; next; mes "Then you can repeat the process of Rebirths and ^0000FFGrand Rebirth^000000 for even more glory."; if (.grand_reset_max > 0) mes "^0000FFGrand Rebirth^000000 can be perfomed " + .grand_reset_max + " times."; else mes "There is no limit on how many ^0000FFGrand Rebirth^000000 can be perfomed."; break; case 4: mes F_Bye; close; } mes "What do you want to know about?"; next; } while (true); case 4: mes "TOP " + .rebirth_ranking + " of rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_rebirth` from `rebirth_system` WHERE num_rebirth > 0 ORDER BY `num_rebirth` desc limit " + .rebirth_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 5: mes "TOP " + .grand_ranking + " of grand rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_grand` from `rebirth_system` WHERE num_grand > 0 ORDER BY `num_grand` desc limit " + .grand_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 6: mes "Bye."; close; case 7: callsub S_GM; close; } if (.reset_job) { if ( Upper ) { // just in case the user change the setting... lastJob = roclass( .@eac&EAJ_UPPERMASK ); jobchange Job_Novice_High; } else jobchange Job_Novice; } resetlvl 1; resetstatus; // Will reset the statpoints //StatusPoint = .default_statuspoints; StatusPoint += .num_status * getd(@rebirth_type$ + "num_rebirth"); if (.grand_reset_points == false) StatusPoint += .num_status * (getd(@rebirth_type$ + "num_grand_rebirth") * .reset_max); mes "Done!"; close2; sleep2 10000; removespecialeffect2 EF_GLOW4; end; S_GM: if (.force_sql) { if (select("Cancel", "^FF0000Confirm Reset!") == 1) close; query_sql "TRUNCATE TABLE rebirth_system"; announce "[ Rebirth system ] : The Rebirth Ranking has been reset!", 0; } else { switch(select("Cancel", (.rebirth_ranking?"^FF0000Confirm Reset Rebirth Ranking!":""), (.grand_ranking? "^FF0000Confirm Reset Grand Rebirth Ranking!":""))) { case 1: close; case 2: query_sql "UPDATE rebirth_system SET num_rebirth = 0"; announce "[ Rebirth system ] : The Rebirth Ranking has been reset!", 0; break; case 3: query_sql "UPDATE rebirth_system SET num_grand = 0"; announce "[ Rebirth system ] : The Grand Rebirth Ranking has been reset!", 0; break; } query_sql "DELETE FROM rebirth_system WHERE num_rebirth = 0 AND num_grand = 0"; } mes "Reset done."; close; function checkItem { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) if ( countitem( .item_req[.@i] ) < .item_req[ .@i+1 ] + .@count ) { mes "You don't have enought "+ getitemname( .item_req[.@i] ) +". ^ff0000["+ countitem( .item_req[.@i] ) +"/"+ ( .item_req[ .@i+1 ] + .@count ) +"]^000000"; close; } if ( .@count >= .change_reward ) if ( .add_item_req[1] + .@count - .change_reward > countitem( .add_item_req[0] ) ) { mes "You don't have enought "+ getitemname( .add_item_req[0] ) +". ^ff0000["+ countitem( .add_item_req[0] ) +"/"+ ( .add_item_req[1] + .@count - .change_reward ) +"]^000000"; close; } return; } function colorItemrequired { .@count = getd(@rebirth_type$ + "num_rebirth"); if ( countitem( .item_req[ getarg(0) ] ) < .item_req[ getarg(0)+1 ] + .@count ) return "^ff0000"; return "^00ff00"; } function deleteItem { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) delitem .item_req[.@i], ( .item_req[ .@i+1 ] + .@count ); if ( .@count >= .change_reward ) delitem .add_item_req[0], ( .add_item_req[1] + .@count - .change_reward ); return; } function displayItemneed { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) mes colorItemrequired( .@i ) +" - x"+ ( .item_req[ .@i+1 ] + .@count ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .item_req[.@i] ); if ( .@count >= .change_reward ) { if ( .add_item_req[1] + .@count - .change_reward > countitem( .add_item_req[0] ) ) .@color$ = "^ff0000"; else .@color$ = "^00ff00"; mes .@color$ +"- x"+ ( .add_item_req[1] + ( .@count - .change_reward ) ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .add_item_req[0] ); } return; } function getItemReward { for (.@i = 0; .@i < .size_reward; .@i += 2 ) getitem .reward[.@i], .reward[ .@i+1 ]; return; } function weightreq { if ( Weight > 50000 ) { mes "You have too much items on you. Your weight will be too high after rebirth."; close; } return; } OnInit: .reset_max = 10; // how many reset max .grand_reset_max = 100; // how many grand rebirth max (-1:unlimited) (0:disable) .change_reward = 6; // after the set rebirth, change reward .num_status = 10; // + X number of status points .reset_job = false; // character will go back to Novice? .rebirth_ranking = 0; // How many tops in normal rebirth ranking? (0=disable) .grand_ranking = 5; // How many tops in grand rebirhh ranking? (0=disable) .ranking_type = 0; // 0 = ranking by character. | 1 = ranking by account. .grand_reset_points = true; // Bonus status points will be back to 0 upon Grand Rebirth? .default_statuspoints = 48; // Default status points upon Lv1 in your server .force_sql = true; // Rebirth count are synced to sql ranking. // item required <item ID>, <number> setarray .item_req, 7179, 50, 7227, 50, 969, 300; // additionnal items after rebirth >> .change_reward // <item ID>, <number> setarray .add_item_req, 7179, 100; // Grand Rebirth rewards <item ID>, <number> setarray .reward, 674, 50; .size_item = getarraysize( .item_req ); .size_reward = getarraysize( .reward ); query_sql("CREATE TABLE IF NOT EXISTS `rebirth_system` (" + " `player_id` int(11) unsigned NOT NULL default 0," + " `name` varchar(255) NOT NULL DEFAULT 'NULL'," + " `num_rebirth` int(11) unsigned NOT NULL default 0," + " `num_grand` int(11) unsigned NOT NULL default 0," + " `last_ip` varchar(100) NOT NULL default ''," + " PRIMARY KEY (`player_id`)" + " ) ENGINE=MyISAM;"); end; }
  23. Hello, the NPC isn't copying the array correctly, that's the source of the buildin_rand error. Added copyarray command. NPCNAME::VARIABLENAME does not work. Changed most variables to global ($@) so that all NPCs can read them. callsub NPCNAME::LABEL does not work. Changed to function. //===== 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 //===== Quest Generation Subroutines ===== - script QuestSubroutines -1,{ OnInit: // Quest story templates setarray $@qg_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 $@qg_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 $@qg_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($@qg_Hunting_Stories$); debugmes "QuestSubroutines: Killing_Stories$ size: " + getarraysize($@qg_Killing_Stories$); debugmes "QuestSubroutines: Collection_Stories$ size: " + getarraysize($@qg_Collection_Stories$); end; } function script F_Generate_Hunting { .@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('"+$@qg_Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT " + .@count, .@mobs); .@story_index = rand(getarraysize($@qg_Hunting_Stories$)); .@story$ = $@qg_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; close3; } 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; } function script F_Generate_Killing { .@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('"+$@qg_Blacklist$+"',ID) = 0 ORDER BY rand() LIMIT 1", .@mob); .@size = getarraysize(getd("$@qg_Maps_Tier" + .@difficulty + "$")); copyarray .@map_array$,getd("$@qg_Maps_Tier" + .@difficulty + "$"), .@size; .@map$ = .@map_array$[rand(getarraysize(.@map_array$))]; .@needed = rand(.@min_count, .@max_count); .@story_index = rand(getarraysize($@qg_Killing_Stories$)); .@story$ = $@qg_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; close3; } 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"); setunitdata $@mobid[0],UMOB_MAXHP,.@hp; setunitdata $@mobid[0],UMOB_HP,.@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; } function script F_Generate_Collection { .@difficulty = getarg(0); mes "[Aufgabenmeister]"; .@item_count = rand(1,3); .@min_item = .@difficulty * 5; .@max_item = .@difficulty * 10 + 10; .@items$ = getd("$@qg_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($@qg_Collection_Stories$)); .@story$ = $@qg_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; close3; } 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; } //===== Guild Master NPC ===== pvp_room,51,45,4 script Gildenmeister Konrad 4_ED_SCHMIDT,{ cutin "SCHMIDT01.bmp",2; 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; close3; } 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; close3; 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"); close3; case 4: mes "[Gildenmeister Konrad]"; mes "Willst du deinen aktuellen Quest abbrechen?"; mes "Das kostet " + F_InsertComma($@qg_Reset) + " Zeny."; next; switch(select(" ~ Quest abbrechen: ~ ^777777Abbrechen^000000")) { case 1: if (Zeny < $@qg_Reset) { mes "Nicht genug Zeny, Held!"; emotion ET_SORRY; close3; } Zeny -= $@qg_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 < $@qg_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; close3; case 2: mes "Gut, dann weiter im Kampfe!"; emotion ET_SMILE; close3; } case 5: mes "[Gildenmeister Konrad]"; mes "Kehre zurück, wenn die Abenteuerlust ruft!"; emotion ET_SCRATCH; close3; } 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 " + $@qg_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($@qg_Shop, @bought_nameid[.@i]); .@cost += ($@qg_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; close3; } //===== Quest Receiver NPC ===== pvp_room,56,45,4 script Schatzmeister Alfred 1_M_MERCHANT,{ cutin "aca_salim01.bmp",2; 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; close3; } 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; close3; } close3; Check_Quest: mes "[Schatzmeister Alfred]"; mes "Dein Fortschritt:"; if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < $@qg_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 < $@qg_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 < $@qg_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 ($@qg_Delay) #Quest_Delay = gettimetick(2) + ($@qg_Delay * 3600); Mission_Total++; setd "Quest_Tier" + Quest_Difficulty + "_Progress", getd("Quest_Tier" + Quest_Difficulty + "_Progress") + 1; if (getd("Quest_Tier" + Quest_Difficulty + "_Progress") >= ($@qg_Hunting_Quests + $@qg_Killing_Quests + $@qg_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'"); close3; } 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; close3; Check_Completion: if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < $@qg_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 < $@qg_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) || !$@qg_Party)) { if (Quest_Type == 1) { // Hunting for (.@i = 0; .@i < $@qg_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 ($@qg_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$ || $@qg_Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || $@qg_Party < 3)) { if (.@Quest_Type == 1) { for (.@j = 0; .@j < $@qg_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) || !$@qg_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 ($@qg_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$ || $@qg_Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || $@qg_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 4_M_REDSWORD,{ cutin "ep13_captin_edq.bmp",2; 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; close3; 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; close3; 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; close3; case 4: mes "[Großmeister Wolfhart]"; mes "Die Geschichten warten auf dich, wenn du bereit bist."; emotion ET_SMILE; close3; } } //===== Teleport Agent NPC ===== pvp_room,59,45,4 script Stallmeister Tobias 4_M_REIDIN_KURS,{ cutin "3rd_ranger",2; 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; close3; } 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; close3; } .@size = getarraysize(getd("$@qg_Maps_Tier" + .@tier + "$")); copyarray .@map_array$,getd("$@qg_Maps_Tier" + .@tier + "$"), .@size; 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; close3; } Zeny -= .@cost; warp .@map_array$[.@select], 0, 0; mes "[Stallmeister Tobias]"; mes "Viel Glück, Abenteurer!"; emotion ET_GO; close3; } //===== Quest Giver NPCs (8 Total) ===== // Tier 1: Melder Kurt pvp_room,30,85,4 script Melder Kurt 4_M_SWORDMAN,{ cutin "aca_sword.bmp",2; mes "[Melder Kurt]"; mes "Grüß dich, junger Abenteurer " + strcharinfo(0) + "!"; mes "Die Welt von Rune-Midgard braucht Helden wie dich."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (Quest_Type && Quest_Difficulty != 1) { mes "Du hast einen anderen Quest. Schließe den zuerst ab!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm zurück nach " + Time2Str(#Quest_Delay) + " für einen neuen Quest."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(1); close3; case 2: F_Generate_Killing(1); close3; case 3: F_Generate_Collection(1); close3; case 4: mes "[Melder Kurt]"; mes "Keine Eile, komm zurück, wenn du bereit bist!"; emotion ET_SMILE; close3; } } // Tier 2: Spähtruppführer Rolf pvp_room,38,85,4 script Spähtruppführer Rolf 1_M_KNIGHTMASTER,{ cutin "god_rebeireb.bmp",2; 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($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 21 || BaseLevel > 40) { mes "Dein Level passt nicht (21–40)."; emotion ET_NO; close3; } if (!Quest_Tier1_Complete) { mes "Du musst erst alle Anfänger-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 2) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(2); close3; case 2: F_Generate_Killing(2); close3; case 3: F_Generate_Collection(2); close3; case 4: mes "[Spähtruppführer Rolf]"; mes "Kehre zurück, wenn der Mut dich treibt!"; emotion ET_SMILE; close3; } } // Tier 3: Zugführer Gregor pvp_room,46,85,4 script Zugführer Gregor 4_M_JOB_KNIGHT1,{ cutin "v_breid01",2; mes "[Zugführer Gregor]"; mes "Sei gegrüßt, tapferer " + strcharinfo(0) + "!"; mes "Deine Taten hallen durch Rune-Midgard."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 41 || BaseLevel > 60) { mes "Dein Level passt nicht (41–60)."; emotion ET_NO; close3; } if (!Quest_Tier2_Complete) { mes "Du musst erst alle Novizen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 3) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(3); close3; case 2: F_Generate_Killing(3); close3; case 3: F_Generate_Collection(3); close3; case 4: mes "[Zugführer Gregor]"; mes "Die Magie der Quests wartet auf dich!"; emotion ET_SMILE; close3; } } // Tier 4: Stabsfeldwebel Hagen pvp_room,54,85,4 script Stabsfeldwebel Hagen 4_M_ROEL,{ cutin "roel01.bmp",2; mes "[Stabsfeldwebel Hagen]"; mes "Willkommen, erfahrener " + strcharinfo(0) + "!"; mes "Du bist ein Jäger der Dunkelheit, bereit für große Missionen."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close3; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(4); close3; case 2: F_Generate_Killing(4); close3; case 3: F_Generate_Collection(4); close3; case 4: mes "[Stabsfeldwebel Hagen]"; mes "Die Beute entkommt nicht ewig, komm zurück!"; emotion ET_SMILE; close3; } } // Tier 4: Hauptmann Lothar pvp_room,62,85,4 script Hauptmann Lothar 1_M_KNIGHTMASTER,{ cutin "job_knight_herman1",2; mes "[Hauptmann Lothar]"; mes "Grüß dich, " + strcharinfo(0) + ", Schatten der Gilde!"; mes "Nur die Besten bestehen meine Prüfungen."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 61 || BaseLevel > 80) { mes "Dein Level passt nicht (61–80)."; emotion ET_NO; close3; } if (!Quest_Tier3_Complete) { mes "Du musst erst alle Zwischen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 4) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(4); close3; case 2: F_Generate_Killing(4); close3; case 3: F_Generate_Collection(4); close3; case 4: mes "[Hauptmann Lothar]"; mes "Die Schatten warten auf dich, Held!"; emotion ET_SMILE; close3; } } // Tier 5: Oberst Wilfried pvp_room,70,85,4 script Oberst Wilfried 4_M_CHIEF_IRIN,{ cutin "sara_elder_irine1.bmp",2; mes "[Oberst Wilfried]"; mes "Sei’s drum, Legende " + strcharinfo(0) + "!"; mes "Nur die Mächtigsten bestehen die Prüfungen der Gilde."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[Oberst Wilfried]"; mes "Selbst Legenden brauchen Pausen. Komm zurück!"; emotion ET_SMILE; close3; } } // Tier 5: General Wolfram pvp_room,78,85,4 script General Wolfram 4_M_SURA,{ cutin "3rd_sura_master",2; mes "[General Wolfram]"; mes "Heil dir, " + strcharinfo(0) + ", Licht der Gilde!"; mes "Dein Name ist ein Leuchtfeuer für alle Helden."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[General Wolfram]"; mes "Das Licht der Legenden leuchtet weiter!"; emotion ET_SMILE; close3; } } // Tier 5: Kriegsminister Gustav pvp_room,86,85,4 script Kriegsminister Gustav 4_M_KNIGHT_SILVER,{ cutin "3rd_rune_knight.bmp",2; mes "[Kriegsminister Gustav]"; mes "Ehre sei dir, " + strcharinfo(0) + ", Meister der Gilde!"; mes "Nur die Größten wagen meine Aufgaben."; if (getarraysize($@qg_Hunting_Stories$) == 0) { mes "Fehler: Quest-Daten nicht geladen. Bitte melde dies dem Admin."; emotion ET_SORRY; close3; } if (BaseLevel < 81 || BaseLevel > 99) { mes "Dein Level passt nicht (81–99)."; emotion ET_NO; close3; } if (!Quest_Tier4_Complete) { mes "Du musst erst alle Fortgeschrittenen-Quests abschließen!"; emotion ET_NO; close3; } if (Quest_Type && Quest_Difficulty != 5) { mes "Du hast einen anderen Quest. Schließe den zuerst!"; emotion ET_THINK; close3; } if (#Quest_Delay > gettimetick(2)) { mes "Komm nach " + Time2Str(#Quest_Delay) + " zurück."; emotion ET_SWEAT; close3; } 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: F_Generate_Hunting(5); close3; case 2: F_Generate_Killing(5); close3; case 3: F_Generate_Collection(5); close3; case 4: mes "[Kriegsminister Gustav]"; mes "Die Meisterschaft erwartet dich, Held!"; emotion ET_SMILE; close3; } } //===== 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 $@qg_Delay = 12; // Quest cooldown in hours $@qg_Reset = 5000; // Zeny cost to abandon quests $@qg_Max_Quests = 3; // Max simultaneous targets/items $@qg_Hunting_Quests = 15; // Number of hunting quests per tier $@qg_Killing_Quests = 15; // Number of killing quests per tier $@qg_Collection_Quests = 20; // Number of collection quests per tier $@qg_Party = 3; // Party support: screen area only // Blacklist of excluded monster IDs (MVPs, problematic) $@qg_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 $@qg_Maps_Tier1$[0], "prt_fild08", "pay_fild04", "moc_fild07", "iz_dun01", "cmd_fild01"; setarray $@qg_Maps_Tier2$[0], "pay_dun00", "moc_fild12", "prt_maze01", "gef_fild07", "cmd_fild03"; setarray $@qg_Maps_Tier3$[0], "pay_dun02", "moc_fild16", "gef_fild09", "cmd_fild08", "iz_dun02"; setarray $@qg_Maps_Tier4$[0], "pay_dun03", "moc_fild19", "gef_dun01", "cmd_dun02", "gl_sew03"; setarray $@qg_Maps_Tier5$[0], "gl_dun02", "gef_dun03", "pay_dun04", "moc_pryd05", "ra_fild01"; // Shop items: ID, mission points cost setarray $@qg_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) $@qg_Items_Tier1$ = "904,905,906,907,908,909,910,911"; // Jellopy, Fluff, Clover, Feather, etc. $@qg_Items_Tier2$ = "912,913,914,915,916,917"; // Sticky Mucus, Scell, Worm Peeling, etc. $@qg_Items_Tier3$ = "918,919,920,921,922"; // Animal Skin, Bug Leg, Scale Shell, etc. $@qg_Items_Tier4$ = "923,924,925,926,927"; // Cyfar, Brigan, Clam Shell, etc. $@qg_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($@qg_Shop); .@i += 2) npcshopadditem "guild_shop", $@qg_Shop[.@i], $@qg_Shop[.@i+1]; end; }
×
×
  • Create New...