Jump to content
The forums will be going offline for an extended maintenance period at 1400hrs GMT on 19th June 2025. The number of hours for this downtime is intentionally not advertised due to the nature of these upgrades. ×

Racaae

Members
  • Posts

    263
  • Joined

  • Last visited

  • Days Won

    41

Racaae last won the day on May 24

Racaae had the most liked content!

5 Followers

Profile Information

  • Gender
    Male
  • Location
    Brasil

Recent Profile Visitors

3589 profile views

Racaae's Achievements

  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.
×
×
  • Create New...