Jump to content
  • 0

Npc - Party reclutador de jugadores para subir de nivel


Josemaaaaa

Question


  • Group:  Members
  • Topic Count:  2
  • Topics Per Day:  1.00
  • Content Count:  3
  • Reputation:   0
  • Joined:  05/21/25
  • Last Seen:  

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

  • 0

  • Group:  Members
  • Topic Count:  0
  • Topics Per Day:  0
  • Content Count:  248
  • Reputation:   111
  • Joined:  06/02/12
  • Last Seen:  

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;
}

 

  • Love 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  0
  • Topics Per Day:  0
  • Content Count:  248
  • Reputation:   111
  • Joined:  06/02/12
  • Last Seen:  

.

Edited by Racaae
duplicate
  • Love 1
Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  2
  • Topics Per Day:  1.00
  • Content Count:  3
  • Reputation:   0
  • Joined:  05/21/25
  • Last Seen:  

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.

screenTestRO000.jpg

screenTestRO001.jpg

Link to comment
Share on other sites

  • 0

  • Group:  Members
  • Topic Count:  0
  • Topics Per Day:  0
  • Content Count:  248
  • Reputation:   111
  • Joined:  06/02/12
  • Last Seen:  

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 by Racaae
code correction
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...