Josemaaaaa Posted Thursday at 02:59 AM Group: Members Topic Count: 2 Topics Per Day: 1.00 Content Count: 3 Reputation: 0 Joined: 05/21/25 Last Seen: 1 hour ago Share Posted Thursday at 02:59 AM Como puedo crear un npc que le de la oportunidad de un lider de party invitar jugadores desde el npc. ejemplo: +30lvl minimo y tambien el job tipo un champ o un hp para heals, arqueros etc... (soporte) 1 npc cartel anunciador de partys, reclutador. Quote Link to comment Share on other sites More sharing options...
0 Racaae Posted Thursday at 02:00 PM Group: Members Topic Count: 0 Topics Per Day: 0 Content Count: 248 Reputation: 111 Joined: 06/02/12 Last Seen: 4 hours ago Share Posted Thursday at 02:00 PM 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: Spoiler Puedes usar getunits, isloggedin, y party_addmember para mostrar jugadores cercanos y permitir que el líder de party los invite directamente desde el NPC. Puedes usar un NPC como este cartel ejemplo para que líderes de party publiquen anuncios filtrando por nivel, clase o rol, y otros jogadores se unan si cumplen os requisitos. 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; } 1 Quote Link to comment Share on other sites More sharing options...
0 Racaae Posted Thursday at 02:02 PM Group: Members Topic Count: 0 Topics Per Day: 0 Content Count: 248 Reputation: 111 Joined: 06/02/12 Last Seen: 4 hours ago Share Posted Thursday at 02:02 PM (edited) . Edited Thursday at 02:55 PM by Racaae duplicate 1 Quote Link to comment Share on other sites More sharing options...
0 Josemaaaaa Posted 8 hours ago Group: Members Topic Count: 2 Topics Per Day: 1.00 Content Count: 3 Reputation: 0 Joined: 05/21/25 Last Seen: 1 hour ago Author Share Posted 8 hours ago On 22/5/2025 at 10:00, Racaae said: Puedes usar getunits , isloggedin y party_addmember para mostrar a los jugadores cercanos y permitir que el líder del grupo los invite directamente desde el PNJ . Puedes usar un PNJ como este póster de ejemplo para que los líderes del grupo publiquen anuncios filtrados por nivel, clase o rol, y otros jugadores puedan unirse si cumplen los requisitos. Revelar contenidos ocultos Puedes usar getunits , isloggedin y party_addmember para mostrar jugadores cercanos y permitir que el líder del grupo los invite directamente desde el NPC. Puedes usar un NPC como este cartel ejemplo para que líderes de partido publiquen anuncios filtrando por nivel, clase o rol, y otros jogadores se unan si cumplen os requisitos. ++) { 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 Perfecto, podría ayudarme a mejorarlo aún más?? Me referia a un cartel como aquel mire, con movimiento que diga Odin +90, y vaya mostrando mas partys como cada 2 segundos cambie de party agregadas. le muestro un ejemplo de un cartel de pvp que tengo. intente modificarlo pero no lo conseguí. El pvp cada cierto tiempo muestra un segundo party. Quote Link to comment Share on other sites More sharing options...
0 Racaae Posted 6 hours ago Group: Members Topic Count: 0 Topics Per Day: 0 Content Count: 248 Reputation: 111 Joined: 06/02/12 Last Seen: 4 hours ago Share Posted 6 hours ago (edited) 1 hour ago, Josemaaaaa said: Perfecto, podría ayudarme a mejorarlo aún más?? Me referia a un cartel como aquel mire, con movimiento que diga Odin +90, y vaya mostrando mas partys como cada 2 segundos cambie de party agregadas. le muestro un ejemplo de un cartel de pvp que tengo. intente modificarlo pero no lo conseguí. El pvp cada cierto tiempo muestra un segundo party 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: Spoiler //===== rAthena Script ======================================= //= Cartel de Reclutamiento //===== Current Version: ===================================== //= 1.0 First version. [Racaae] //============================================================ prontera,149,164,5 script Cartel de Reclutamiento 4_BOARD3,{ setarray .@jobs,Job_Priest,Job_Monk,Job_Knight,Job_Crusader,Job_Wizard,Job_Sage,Job_Hunter,Job_Bard,Job_Dancer,Job_Assassin,Job_Rogue,Job_Blacksmith,Job_Alchemist,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; donpcevent strnpcinfo(0) + "::OnUpdateBoard"; 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; } 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; OnInit: deletearray $@party_ids[0]; end; } Edited 6 hours ago by Racaae code correction Quote Link to comment Share on other sites More sharing options...
Question
Josemaaaaa
Como puedo crear un npc que le de la oportunidad de un lider de party invitar jugadores desde el npc.
ejemplo: +30lvl minimo y tambien el job tipo un champ o un hp para heals, arqueros etc... (soporte)
1 npc cartel anunciador de partys, reclutador.
Link to comment
Share on other sites
4 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.