Ranking para pagina web [Parte I]

Bienvenidos a un nuevo tutorial, en esta oportunidad aprenderemos a entender, configurar y personalizar un ranking en php para el MuOnline.
1)A continuación les mostraré el ranking que utilizaré y luego lo analizaremos:

Ranking muonline

2)¿Qué les parecio?
Es un ranking común, en el que se visualiza el nombre del personaje, la raza o clase, el nivel , la fuerza, la agilidad, la energía, la vitalidad y los resets.
¿Han notado alguna falla?
Para el que no vio la falla, le diré que mire nuevamente la imagen y concentre su atención sobre la columna "Clase".
¿Ahora lo vieron?
En algunos personajes no se visualiza la clase y raza.
¿Por qué será? ¿Qué sucede? ¿Tiene solución?
Para responder estas preguntas, lo que necesitamos es analizar el código o script de este ranking, yo pondré una imágen para comenzar a revisar de que se trata esto.
3)El script tiene dos partes, la primera es la conexión a su base de datos, por lo tanto donde dice:

$apass = "Tu Password SQL";
Debemos poner nuestro Password SQL. También yo llamé al archivo index.php pero ustedes pueden renombrarlo y luego rutiarlo.
Entonces la primera parte hace referencia a la conexión a la base de datos.
Hoy no me dentré en eso, pero en otro tutorial lo analizaremos en profundidad.
En lo que me quiero detener es en solucionar esa falla que detectamos y ver su origen.
A continuación dejaré las líneas que hacen referencia a esto.

Selección de razas en php

4)Observen como comienza el código que hace referencia al ranking, lo primero que vemos es lo siguiente:
if($row[8] == 8){
echo 'Game Master';
}
Lo que nos está diciendo literalmente es lo siguiente "Si el CtlCode es igual 8, imprimo Game Master"
¿Por qué?
La respuesta es la siguiente, la columna "CtlCode" del SQL es la que define la categoría del personaje:
0= Personaje normal
8= Personaje Game Master
Entonces hagamos una prueba cualquiera, pondre "CtlCode 8" al primer personaje del Ranking

Ctlcode en 8

5)Ahora veamos nuestro ranking desde la web para ver que sucede

Mostrando el ranking

6)¿Qué les pareció, difícil de comprender o fácil?
Analizemos nuevamente este código para luego continuar:
if($row[8] == 8){
echo 'Game Master';
}
Ese "IF" como en varios tutoriales hemos dicho, significa "SI" , pero ¿Si qué ...?
La respuesta la tenemos frente a nuestros ojos, "Si $row[8] == 8""
Ahora, ¿Qué significa esto "$row[8] == 8"?
Para comprender eso, debemos de leer el código completo, "$row" es una variable, pero ¿Qué contiene esa variable?
Si leemos más arriba en busca de su significado encontraremos algo como lo siguiente
$row = mssql_fetch_row($result);
Aunque no entendamos mucho lo que significa concentremos la atención y memoricen todas las palabras que tengan un signo "$" delante (variable)
Lo que les diré es que ahora "$row" contiene el resultado de otra variable llamada "$result"
Pero, ¿Qué contiene ahora "$result"?
Nuevamente debemos seguir leyendo más arriba en busca de su contenido. Leyendo nos vamos a encontrar con lo siguiente
$result = mssql_query( $query );
Ahora "$result" contiene el valor de "$query"
Pero, ¿Qué contiene "$query"?
Para esto debemos continuar leyendo nuestros código. Y justamente leyendo nos encontramos con lo siguiente:
$query = 'select Name, Class,cLevel,Strenght,Dexterity,Vitality,Energy, LevelUpPoint,CtlCode,resets from Character orden by resets desc , cLevel desc' ;
6)Al fin llegamos, presten atención, algunas de esas palabras Ustedes ya las conocen.
Por ejemplo:
Strength
Dexterity
Vitality
Energy
A continuación les dejo la imagen de la ruta de la variable:

Pasaje de variables en php

Pero para entender esto, debemos ir por partes. Comenzemos con la primera palabra "select", esa palabra es lo que imaginan, simplemente selecciona.
¿Qué selecciona?, sencillo; selecciona ese conjunto de columnas del SQL entre ellas:
Name,Class,cLevel,Strength,Dexterity,Vitality,Energy,LevelUpPoint,
CtlCode,resets
Ahora aparecen dos palabras, un "From" y un "Character", esas dos palabras hacen referencia a de donde vamos a seleccionar las columnas anteriores.
Finalmente tenemos este conjunto de palabras
Order by resets desc , cLevel desc
¿Qué significa eso?, Lo que hace ese fragmento de código es ordenar lo seleccionado previamente tomando en cuenta los Resets y el Nivel de cada personaje.
¿Cómo ordena esos datos?
Los ordena de mayor a menor, por eso dice "desc" (Descendente).
Esto va tomando color, si se trata de un Ranking es lógico que en el primer puesto tendremos al personaje de mayor cantidad de RESET.
¿Pero que pasa si tenemos dos personajes con la misma cantidad de Resets?

Resets iguales en el ranking

7)Pero, ¿Por qué si tienen la misma cantidad de resets se ordenan de esa manera?
La respuesta está en el mismo código:
Order by resets desc , cLevel desc
Primero se ordena por los resets y luego por los niveles.
8)Pero retomemos esta primera parte nuevamente para terminar y continuar con la siguiente parte del código.
Habiamos comenzado analizando lo siguiente:
if($row[8] == 8){
echo 'Game Master';
}
Y dijimos que ese "$row" contenia los datos de una variable, y esa variable a otra y esa otra a otra más ... hasta ahi habiamos analizado , pero ¿Qué es ese [8] == 8?
Para entender eso, veamos lo siguiente:
Name,Class,cLevel,Strength,Dexterity,Vitality,Energy,LevelUpPoint,
CtlCode,resets
Ahora le asignamos un número a cada una de estas columnas del SQL
Name[0],Class[1],cLevel[2],Strength[3],Dexterity[4],Vitality[5],
Energy[6],LevelUpPoint[7],CtlCode[8],resets[9]
9)Ahora, veamos a que hace referencia ese [8], ¿Se entiende?, hace referencia al "CtlCode", entonces si volvemos al código:
if($row[8] == 8){
echo 'Game Master';
}
Lo que vemos ahi, es una condición (IF), y la condición es, "Si $row[8] (CrlCode) es igual a 8, entonces imprimimos 'Game Master'"
¿Pero que sucede si nuestro personaje no es "CtlCode 8"?
Para responder esta pregunta, debemos analizar la continuidad del código:
else {
if($row[1] == 0){
echo 'Dark Wizard';
}
if($row[1] == 1){
echo 'Soul Master';
}
if($row[1] == 16){
echo 'Dark Knight';
}
if($row[1] == 17){
echo 'Blade Knight';
}
if($row[1] == 32){
echo 'Elf';
}
if($row[1] == 33){
echo 'Muse Elf';
}
if($row[1] == 48){
echo 'Magic Gladiator';
}
if($row[1] == 64){
echo 'Dark Lord';
}
La primera palabra que vemos es un "else", lo que nos dice es "sino", ¿Sino qué?
Sino es "CtlCode = 8" se van ejecutando linealmente los siguientes IFs.
Ahora presten atención, ya no es más "$row[8]" sino que es "$row[1]" , como ya sabemos identificarlo, (Sólo debemos buscar arriba a que corresponde) veremos que "$row[1]" corresponde a "Class", entonces todo esto ya va tomando forma.
La columna "Class" es la que define la "Clase" o "Raza" del personaje.
(En tutoriales anteriores ya hemos visto que número le corresponde a cada raza)
10)En el código tenemos algunos ya marcados:
0=Dark Wizard
1=Soul Master
16=Dark Knight
17=Blade Knight
32=Elf
33=Muse Elf
48=Magic Gladiator
64=Dark Lord
11)¿Entonces porque tenemos espacios vacios?, para eso veamos en nuestra base de datos, que número de "Class" tiene un personaje al cual no identifica la raza nuestro ranking.

Modificando class en el sql

11)Entonces, como muestra la imagen, el "Class" número 18 ya es leido o interpretrado por nuestro Ranking PHP para MuOnline, ¿Por qué será?
Revisemos nuevamente los números de "Class" que tenemos en nuestro código
0=Dark Wizard
1=Soul Master
16=Dark Knight
17=Blade Knight
32=Elf
33=Muse Elf
48=Magic Gladiator
64=Dark Lord
¿Aparece el 18?, Justamente NO, no aparece, porque la "Raza 18" o "Class 18" corresponde a la tercera evolución.
¿Qué sucede?, cuando estamos jugando al MuOnline, si nuestro personaje es "Dark Knight", para el SQL es un personaje Raza o Clase "16", si luego dentro del juego decidimos realizar la segunda evolución, nuestro personaje se convierte en un "Blade Knight" y para el SQL es un personaje Raza o Clase "17", pero si nuestra versión de MuOnline, es una Season 3, Season 4 , Season 5 o una Season 6, tenemos la oportunidad de hacer una tercera evolución y nuestro personaje se convertirá en un "Blade Master" y para el SQL es un personaje Raza o Clase "18".
Es por eso que en nuestro ranking no se ve la clase, ya que no todos los Rankings de las WebMU traen incorporado las terceras razas.
Esto no es problema, ya que podemos agregarlo nosotros mismo, ¿Cómo?
12)Primero copiamos un IF de los anteriores y modificamos los datos de la siguiente manera:
Supongamos que copiamos el siguiente:
if($row[1] == 48){
echo 'Magic Gladiator';
}
Y lo modificamos así:
if($row[1] == 18){
echo 'Blade Master';
}
Observen, ya no compará el número de la Clase o Raza con la del Magic Gladiator [48] sino que ahora hace la comparación con la Clase o Raza [18] Blade Master.
Entonces ahora agregamos ese fragmento de código al script original:

Agregando fragmento de código

13)Ahora nos resta verificar si en nuestra página web ya se visualiza correctamente la raza o clase 18

Visualizando la raza agregada

14)De esta forma, podemos agregar, todas las razas a ese ranking, por ejemplo la raza o clase 80 (Summoner) o la raza o clase 96 (Rage Fighter).
El nombre del personaje es válido para el Cliente del servidor y para la página web, pero para nuestra Base de Datos el nombre de los personajes son números (Al igual que los mapas).
Eso es todo por hoy, en el próximo tutorial veremos a que se debe que el ranking cargue los 100 primeros personajes y no los primeros 101 o 280.
RankingDemo.txt [1 KB]

¿Necesitas ayuda? Visita www.iceventas.com y nosotros lo hacemos por ti.

Se han publicado un total de 8 comentarios en Mu Online Tutoriales :

12 de febrero de 2013, 19:07

exelente guia... me sirve mucho ya q no me registraba la raza del first master, como siempre son unos genios!!!

12 de febrero de 2013, 22:22

Anónimo: Saludos y éxitos

26 de noviembre de 2014, 23:24

Buneas asd* quisiera saber como hago para excluir de los rankins a los gm, los rankings que uso vinieron con el template, gracias

27 de noviembre de 2014, 14:15

Cara : Debes condicionar tu ranking para evitar la lectura de los personajes admines.
Saludos

19 de diciembre de 2014, 19:24

Excelente guía asd*, pero mi pregunta no tiene nada que ver con lo que has explicado. Aquí va.

¿Cómo hago para que no aparezcan Gms en el ranking? debe ser un código sencillo que hay que agregar, pero realmente no puedo lograrlo! agradecería tu ayuda, saludos.

20 de diciembre de 2014, 16:22

Anónimo : Creo que en alguna guía está explicado.
Como dices, es bastante sencillo el procedimiento, simplemente condicionando la querry de esta forma: where CtlCode < 1
Esto significa que el select será condicionado por el where, el cual "filtra" a los personajes cuyo CltCode sean menor a 1.
Para que esto funcione, debes agregar tu GM/ADM de la forma tradicional, es decir poniendo un 24/32 en dicha columna de la tabla character.
Saludos

19 de junio de 2016, 4:15

holas asd .. quisiera saber donde encuentro para poner esto lo que explicar.. soy principiante por fa $apass = "Tu Password SQL";

20 de junio de 2016, 11:41

Anónimo : Dependerá mucho de la web que tengas.
Esos datos pertecen a la conexión que hace la web con tu base de datos.
Revisa los archivos de tu página web y busca similares a config.php, sql.php, etc.
Saludos

Publicar un comentario en la entrada