Como Poner Scripts En Su Server

Acontecimientos, combates, dudas y demás, acerca del servidor propio de la web en el Pokémon Online, actualizado a la quinta generación (Blanca y Negra).
Dr.Sex
Victorios@ ante Koga II
Victorios@ ante Koga II
Mensajes: 528
Registrado: Mar Ene 18, 2005 4:12 am

Como Poner Scripts En Su Server

Mensajepor Dr.Sex »

Bueno pondre esta guia apra que aprendan a crear scripts para su server

INTRODUCCIÓN
=============================================
Traducción al español del ScriptFAQ original creado por Masamune para la versión
0.9.0 del NetBattle.
El script (guión) ejecuta líneas de comandos una por una, ejecutando acciones
programadas por el dueño de un server para personalizarlo a su antojo. Éste FAQ te
enseñará como usarlo y sacar al máximo su potencial.

1ª Parte: EVENTOS (EVENTS)
=============================================
Los bloques básicos del código del script están separados en Eventos. Esos bloques
se ejecutarán cuando se realice la acción indicada en el Evento. Para que el código
se active ANTES de que el evento ocurra, coloca un "-" antes del nombre del evento.
Para que se active DESPUÉS, coloca un "+".
Esta es la forma básica de escribirlo:

Código 1:
-----------------------------
Event {-|+}[NombredelEvento]
[Código]
EndEvent
-----------------------------

Las entradas validas para [NombredelEvento] están en la Tabla 1. Lo que les sigue es
una breve descripción de cada evento.

Tabla 1: Nombre de cada evento
-----------------------------
NombredelEvento | Descripción
ServerStartup | Se activa al abrir el server.
NewMessage | Se activa cuando llega un mensaje a la casilla de texto del server.
ChatMessage | Se activa cuando un mensaje de chat es recibido.
PlayerSignOn | Se activa cuando un jugador entra al server.
PlayerSignOff | Se activa cuando un jugador sale del server.
ChallengeIssued | Se activa cuando se pide una batalla.
BattleBegin | Se activa cuando se empieza una batalla.
BattleOver | Se activa cuando termina una batalla.
PlayerKick | Se activa cuando un jugador es pateado (kick).
PlayerBan | Se activa cuando un jugador es banneado (Ban).
PlayerAway | Se activa cuando un jugador cambia su estado a NoDisponible(Away).
TeamChange | Se activa cuando un jugador cambia sus Pokémon.
Timer | Se explicará más adelante.
-----------------------------

Aquí hay un ejemplo para apreciar mejor el uso de eventos:

Ejemplo 1
-----------------------------
Event +PlayerSignOn
[Código]
EndEvent
-----------------------------

En este ejemplo, el código escrito en [Código] se activará cada vez que un jugador
entre al server, y se ejecutará luego de que el proceso de ingreso termine.
Ahora, ¿Qué es lo que podemos poner en [Código]? Veamos.


2ª Parte: COMANDOS (COMMANDS)
=============================================
Los comandos completan varias tareas por si mismos cuando se ejecutan. Sin embargo,
la mayoría de los Comandos requieren cierto tipo de información adicional, llamada
Argumentos. En la Lista 1, se muestra el comando con su(s) respectivo(s) argumento(s)
(si lo tienen) y, en la siguiente línea, su descripción. Los argumentos precedidos por
un "#" indican que su valor es numérico. Aquellos precedidos por un "$" indican un
valor textual. Aquellos precedidos por un "!" indican que el valor del argumento
puede ser tanto numérico como textual. Y finalmente, aquellos precedidos por un "@"
indican una constante. Los Argumentos de un Comando van separados por comas. El
texto, como valor de un argumento, SIEMPRE debe estar en comillas. El nombre que l
leva cada argumento no es más que un ejemplo. El valor real se lo debes dar tú.

Lista 1: Comandos
-----------------------------
/? !Val
^^^Envía el valor de !Val a la casilla de texto del Server (Solo el dueño del server
lo puede ver).

/Clear
^^^Borra todo el texto en la casilla de texto del Server

/SendPM #NºJugador, $Mensaje
^^^Envía el texto $Mensaje sólo al jugador con el número #NºJugador. Este comando
NO ocupa la ventana de PMs (PM = Mensaje Privado (PrivateMessage)) sino que los
manda a la ventana del Chat sin que los demás lo puedan ver.

/SendAll $Mensaje
^^^Envía el texto $Mensaje a todos los jugadores conectados.

/Kick #NºJugador
^^^Patea (desconecta) al jugador #NºJugador.

/Ban #NºJugador
^^^Bannea el IP del jugador #NºJugador (agrega su IP a la lista de IPs banneados).

/SIDBan #NºJugador
^^^Bannea la Identificación del jugador #PNum (agrega su SID (Station ID) a la
lista de SIDs banneados).

/TempBan #NºJugador
^^^Bannea al jugador #NºJugador durante 15 min. Durante ese tiempo, el ban no se
puede quitar.

/Run $Dirección
^^^Abre el programa ubicado en $Dirección (Ej:$Dirección = "C:\WINDOWS\NOTEPAD.EXE"
abre el Bloc de Notas)

/SaveValue $Key, !Val
^^^Guarda un valor en el Registro de Windows. Los usuarios avanzados lo pueden usar
para extender el potencial de los scripts guardando registros de lo que deseen. Las
"Keys" son guardadas en el directorio SaveSetting del Visual Basic en
/NetBattle/Script Values/[$Key] (Key corresponde al nombre de la entrada de registro)

/SetPlayerInfo #NºJugador, @Info, !NuevoValor
^^^Establece o cambia la información indicada de un Jugador como !NuevoValor. Solo
algunos datos pueden ser cambiados. La lista de los valores validos para @Info se
darán más adelante.

/Set !Var, !Val
^^^ Se explicará más adelante.

/Unset !Var
^^^ Se explicará más adelante.

/Inc #Var, #Cantidad
^^^ Se explicará más adelante.

/StopEvent
^^^Detiene el evento en ejecución. Se explicará en detalle más adelante.

/Exit
^^^Interrumpe el script. Se explicará en detalle más adelante.
-----------------------------

OK, ahora intentemos añadir un comando al ejemplo anterior. Este script se activará
luego de que un jugador entre al server, y le mandará a todos los jugadores conectados
este mensaje.

Ejemplo 2
-----------------------------
Event +PlayerSignOn
/SendAll "Todos ríanse del idiota que acaba de entrar!"
EndEvent
-----------------------------

Además de ser parte integral del script, los comandos también se pueden ocupar
directamente en la casilla de texto del Server para ejecutar acciones inmediatas.


3ª Parte: VARIABLES
=============================================
La mayoría de las veces, no querrás introducir un valor actual en el argumento de un
comando. Esto es porque puedes necesitar diferentes argumentos en diferentes
situaciones. Éste es el propósito de las variables. Las variables son marcas que
guardan información para ser usada en varios lugares.

Las variables son creadas con el comando /Set. Como se puede ver en la Lista 1, el
comando /Set tiene 2 argumentos: !var y !val. El primer argumento es especial en el
hecho de que NO PUEDE ser un simple valor numérico o de texto. Debe ser una variable.
Si la variable no existe aún, el comando /Set la creará. De cualquier forma, el valor
de !val será guardado en esa variable. Este argumento puede ser omitido, en cuyo caso
tomará el valor 0 ó " ", dependiendo del tipo de variable. !val también puede ser una
variable, si quieres establecer una variable con el mismo valor de otra.

Hay 2 tipos de variables: variables de Texto y variables Numéricas.
Cuando te estés refiriendo a una variable de texto, coloca un "$" antes de su nombre.
Para una variable numérica, coloca un "#" antes de su nombre. Los nombres de las
variables sólo deben contener letras. Puedes observar las variables y sus respectivos
valores en la lengüeta "Variables" en la Script Window.

También hay 3 variables especiales: #Source, #Target, y $Message. Estas variables
siempre existen, incluso si no están en la lengüeta "Variables". Ellas cambian
automáticamente dependiendo del evento. En la Tabla 2 se encuentra una lista de
los valores de esas variables en cada evento. Si una variable aparece como N/A,
esa variable es igual a 0 ó " " durante ese evento.

Tabla 2: Variables Especiales
---------------------------------------------------------------------------
Nombre del Evento | #Source | #Target | $Message
ServerStartup | N/A | N/A | N/A
NewMessage | N/A | N/A | [MensajeAñadido]
ChatMessage |[QnEnviaElMsje]| N/A |[Mensaje del Chat]
PlayerSignOn | [Nº Jugador] | N/A | N/A
PlayerSignOff | [Nº Jugador] | N/A | N/A
ChallengeIssued | [Desafiante] | [Desafiado] | N/A
BattleBegin | [Jugador 1] | [Jugador 2] | N/A
BattleOver | [Ganador] | [Perdedor] | {"TIE"|"WIN"}
PlayerKick | [QnPatea] |[Nºdel Pateado]| N/A
PlayerBan | [QnBannea] |[NºdelBanneado]| N/A
PlayerAway | [Nº Jugador] | N/A | N/A
TeamChange | [Nº Jugador] | N/A | N/A
Timer | N/A | N/A | N/A
---------------------------------------------------------------------------
NOTA: A partir de la versión 0.9.4, la variable $Message en el evento BattleOver
debe llevar un "*" en ella para indicar cuando una batalla es Unrated (Ej: "WIN*"
indica una victoria en una batalla Unrated)
---------------------------------------------------------------------------

Entonces, agreguémosle algo más a nuestro ejemplo. El script en el ejemplo 3 usa
el comando /SendPM en vez del /SendAll para enviar un mensaje SÓLO al nuevo jugador.
Sin embargo, si recuerdas, /SendPM tiene 2 argumentos. El segundo argumento es
el mensaje que será enviado. Ese es fácil de agregar, pero el primer argumento
es el número del jugador al que se le envía el mensaje. Revisando la Tabla 2,
podemos ver que el número de jugador que necesitamos está guardado en la variable
#Source. Entonces, usamos #Source para el primer argumento, y nuestro mensaje para
el segundo. El resultado es que, cuando un nuevo jugador entre al server,
el mensaje "Bienvenido al Server!" será enviado sólo a ese jugador.

Ejemplo 3
-----------------------------
Event +PlayerSignOn
/SendPM #Source, "Bienvenido al Server!"
EndEvent
-----------------------------

También hay otros comandos que están relacionados con las variables. /Unset
destruye una variable de la memoria. Éste no puede ser usado con las
variables especiales. /Inc es un poco más complicado. /Inc tiene 2 argumentos;
el primero debe ser una variable, o, siendo más específicos, una variable
numérica. La variable es incrementada por el monto en el segundo argumento.
Si el segundo argumento es omitido, tomará el valor 1. Para reducir una variable,
simplemente usa un número negativo para el segundo argumento.

Las variables proporcionan muchas opciones para personalizar tu server, pero
necesitarás una herramienta más:


4ª Parte: FUNCIONES (FUNCTIONS)
=============================================
Las funciones toman varios argumentos y devuelven un valor numérico o de texto.
Las funciones pueden ser usadas en lugar de valores actuales para los argumentos
de un comando, como también se pueden incluir en el argumento de otra función.
Como las variables, las funciones que devuelven un número van precedidas por un
"#" y aquellas que devuelven texto, por un "$". En la Lista 2 aparecen todas las
funciones con sus respectivos argumentos, si los tiene, y en la línea siguiente
su descripción.

Lista 2: Funciones
-----------------------------
#IsLoaded(#NºJugador)
^^^Devuelve 1 si el Nº de Jugador existe (Si el jugador está conectado). De otra
forma, devuelve 0.

$Name(#NºJugador)
^^^Devuelve el nombre de NºJugador.

$Pokemon(#NºPKMN)
^^^Devuelve el nombre del pokemon cuyo número concuerda con el indicado en #NºPKMN

#PNumber($NombreJugador)
^^^Devuelve el número del jugador con el nombre (más bien nick) $NombreJugador.
Devuelve 0 si no se encuentra un jugador con ese nombre.

#HasPoke(#NºJugador, #NºPKMN)
^^^Devuelve 1 si el Jugador NºJugador tiene el Pokémon con el número NºPKMN en su
equipo. De otra forma devuelve 0.

#HasPokeMove(#NºJugador, #NºPKMN, #NºAtaque)
^^^Devuelve 1 si el jugador NºJugador tiene el Pokémon con el número NºPKMN y además
tiene el ataque NºAtaque en su equipo. De otra forma devuelve 0.

#GetTeamPoke(#NºJugador, #Nº)
^^^Devuelve el número de PokéDex de un Pokémon en el equipo del jugador NºJugador.
Los valores válidos para #Nº son del 1 al 6 según el puesto en el equipo del
Pokémon que se quiere averiguar.

#GetPlayerInfo(#NºJugador, @Info)
^^^Devuelve un dato específico de un jugador según el valor de @Info.
(Sólo Numéricos) @Info es una constante; sus valores validos son:
AUTH (Autoridad - 0 = Usuario, 1 = Mod, 2 = Admin)
BWTH (Peleando con... - 0 si no está en batalla)
SPED (Player Speed)
HIDE (Equipo Oculto - 0 = Oculto, 1 = Sin Ocultar)
WINS (Victorias)
LOSE (Derrotas)
TIES (Empates)
DISC (Desconexiones en batalla)

$GetPlayerInfo(#NºJugador, @Info)
^^^ Devuelve un dato específico de un jugador según el valor de @Info.
(Sólo Texto) @Info es una constante; sus valores validos son:
NAME (Nombre)
IPAD (Dirección IP)
PSID (Station ID)
DNSA (Dirección DNS)
EXTR (Información Extra)
VERS (Versión de NetBattle)

#GetCompat(#NºJugador)
^^^Revisa el equipo del jugador con el número #NºJugador y devuelve el número que
corresponda con la compatibilidad de su equipo. Los valores que puede devolver son:
0 - Sólo RBY
1 - RBY con Intercambios
2 - Sólo GSC
3 - GSC con Intercambios
4 - Sólo R/S (PokéDex Hoenn)
5 - Full Advance

#LineNum
^^^Devuelve el número de líneas de texto en la casilla principal de texto
(la del server).

#TrainersNum
^^^Devuelve el número de jugadores conectados

#SysTimer
^^^Devuelve el número de segundos pasados desde la medianoche.

$Time
^^^Devuelve la hora actual del computador del Server en el formato: HH:MM:SS AM/PM

$Date
^^^Devuelve la fecha actual en el formato: MM/DD/YY

$WeekDay
^^^Devuelve el día de la semana.

$Month
^^^Devuelve el mes actual.

#Rand(#LMaximo, #LMinimo)
^^^Devuelve un número entero al azar entre un límite mínimo (#LMinimo) y un
límite máximo (#LMaximo), incluyendo a ambos. Si #LMinimo se omite, se parte desde 0.

#RandPlayer
^^^Devuelve el número de un jugador al azar. Devuelve 0 si no hay jugadores conectados.

#GetValue($Key)
^^^Devuelve el valor (Numérico) de una entrada ($Key) del Registro de Windows
hecha con el comando /SaveValue. Ocurrirá un error si el valor no es un número.

$GetValue($Key)
^^^Devuelve el valor (Texto) de una entrada ($Key) del Registro de Windows hecha
con el comando /SaveValue. Si el valor es un número, será convertido a texto
(Ej: 1 = "1").

$Msg(#Indice)
^^^Devuelve un mensaje predefinido, establecido en la ventana del script
en la lengüeta "Messages".

#MaxUsers
^^^Devuelve el máximo número de jugadores que pueden estar conectados
al server.

#FloodTol
^^^Devuelve la tolerancia de "Flood" del server.

$WelcomeMsg
^^^Devuelve el mensaje de bienvenida del server.

$Left($Texto, #Nº)
^^^Devuelve la cantidad especificada de letras desde la izquierda de $Texto
(Ej: $Left("Gatito", 4) = "Gati").

$Right($Texto, #Nº)
^^^Devuelve la cantidad especificada de letras desde la derecha de $Texto
(Ej: $Right("Gatito", 4) = "tito").

$Mid($Texto, #Inicio, #Longitud)
^^^Devuelve una porción del texto $Texto empezando desde la letra indicada en
#Inicio hasta completar la cantidad de letras que se indica en #Longitud
(Ej: $Mid("Gatito bonito", 3, 9) = "tito boni").

#IsIn($Texto, $Check, #Mayus)
^^^Revisa si $Check se encuentra en alguna parte de $Texto. Si es así,
devuelve la distancia del inicio en la que se encuentra $Check (en caso de que
haya otro igual). Sino, devuelve 0. #Mayus especifica si la revisión es o no
sensible al uso de mayúsculas. 0=No SM, 1=SM (SM = Sensible a Mayúsculas). Si se
omite, se toma "No SM" como el valor requerido
(Ej: #IsIn("Gatito bonito", "ti", 0) = 3).

#Len($Texto)
^^^Devuelve el número de letras en $Texto.

$Replace $Texto, $Buscar, $Reemplazar
^^^Busca el texto $Buscar en $Texto y lo reemplaza por $Reemplazar.
Devuelve el resultado.

$LCase($Texto)
^^^Cambia todas las letras de $Texto a minúsculas.

$UCase($Texto)
^^^Cambia todas las letras de $Texto a mayúsculas.

$Chr(#Código)
^^^Devuelve el símbolo indicado por #Código según el código ASCII. Los valores
válidos para #Code van de 0 a 255. NOTA: $Chr(1) está reservado para el uso del
sistema. Si tratas de usarlo, será reemplazado por $Chr(2). Ambos son símbolos
sin sentido para el usuario.

#Asc($Símbolo)
^^^Devuelve el código ASCII para el símbolo indicado. Si la longitud de $Símbolo
es más que 1, el primer símbolo será usado.

$Str(#Número)
^^^Devuelve el número indicado en formato de texto.

#Val($Texto)
^^^Devuelve los números de $Texto en formato numérico.

#Round(#Val, #LugaresDec)
^^^Redondea el número indicado en #Val dejando tantos decimales como
indique #LugaresDec.

#PokeNum($Pokemon)
^^^Devuelve el número del Pokémon indicado en el argumento $Pokemon.

#MoveNum($Ataque)
^^^Devuelve el número del ataque indicado en $Ataque.

$Move(#Nº)
^^^Devuelve el nombre del ataque con el número indicado en #Nº.

$Item(#Nº)
^^^Devuelve el nombre del objeto con el número indicado en #Nº.

#GetPokeLevel(#NºJugador, #Nº)
^^^Devuelve el nivel del Pokémon que se encuentra en la posición #Nº en
el equipo del jugador con el número #NºJugador.

#GetPokeItem(#NºJugador, #Nº)
^^^Devuelve el número del objeto que lleva el Pokémon que se encuentra en
la posición #Nº en el equipo del jugador con el número #NºJugador.


-----------------------------

Las funciones proporcionan una gran cantidad de opciones de personalización
para el server. Agreguémosle algo más al ejemplo que ya teníamos. Ahora
podemos usar funciones para cambiar el mensaje según el usuario. Fíjate
que usamos el signo amperstand ("&") para juntar ambos valores (mensaje y función).

Ejemplo 4
-----------------------------
Event +PlayerSignOn
/SendPM #Source, "Bienvenido al server, " & $Name(#Source) & "!"
/SendPM #Source, "Tu nombre en mayúsculas es " & $UCase($Name(#Source)) & "."
/SendPM #Source, "Tu Número de la Suerte es " & $Str(#Rand(9999, 1000)) & "."
EndEvent
-----------------------------

Bien, revisemos esto línea por línea. Este script envía 3 mensajes al
nuevo jugador. Si recuerdan, en nuestro ejemplo anterior, #Source contiene
el número del nuevo jugador.

Observemos el primer /SendPM. En él puedes ver la función $Name, y en la
Lista 2 decía que esta función devuelve el nombre del jugador con el número
dado por el argumento. Por lo tanto, esta función devuelve el nombre del
nuevo jugador. El signo "&" junta el nombre con el resto del mensaje.

El segundo /SendPM es un poco más complicado. Tiene una función dentro de
otra función. Está la función $Name, ya sabemos qué es lo que hace. Pero
esa función está dentro de otra función, $UCase. En la Lista 2, podemos
ver que $UCase toma su argumento y devuelve todas sus letras en mayúsculas.
Entonces, como dice la otra parte del mensaje, esto devuelve el nombre del
nuevo jugador en mayúsculas.

El tercer /SendPM también contiene una función dentro de otra. Esta vez, la
función que va dentro es #Rand, la cual, según la Lista 2, devuelve un número
al azar comprendido entre los límites indicados. Sin embargo, esta es una
función numérica, y no puede ser unida a un mensaje de texto así como está.
El valor devuelto por #Rand debe ser convertido a texto, que es lo que hace la
función $Str.

Asi que, veamos cual es el resultado. ( En el ScriptFAQ original, Masamune se
ponía a si mismo como ejemplo. Pero en esta traducción, voy a tomar el nombre
que ocupo casi siempre (SpendTimer) para explicarlo mejor. ) Ésto es lo que yo
debería ver al entrar al server:

Flood count is set to 5
Your team's power is: 77%
Bienvenido al server, SpendTimer
Tu nombre en mayúsculas es SPENDTIMER
Tu Número de la Suerte es 8157

Obviamente, el "Número de la Suerte" será diferente cada vez, pero ya captaste
la idea. Sin embargo, hay algunos comandos que querrás ejecutar sólo cuando se
de ciertas condiciones. La forma de hacer esto es usando los Condicionales.


5ª Parte: IF-ELSE-ENDIF (Condicionales)
=============================================
Esos comandos especiales se usan para revisar una condición, y ejecutar un código
basándose en la validez o falsedad de la condición. La forma básica de escribirlo es:

Código 2:
-----------------------------
If [Valor1] [Operador] [Valor2]
[Comandos]
Else
[Otros comandos]
EndIf
-----------------------------

^^^Como dato aparte, If significa "si" de condición, no de afirmación. Else
significa "sino" o "de otra forma" y EndIf sería algo así como "fin de la condición".

Donde aparece [Operador], se debe poner un método de condicionalidad que
vendría siendo una forma de establecer una igualdad o desigualdad entre 2
valores. Los métodos válidos son:

Chart 3: Operators
-----------------------------
= | Igual a
== | Igual a (Diferenciando mayúsculas de minúsculas)
<> | No es igual a
> | Mayor que
< | Menor que
>= | Mayor o igual a
<= | Menor o igual a
-----------------------------

Si la revisión es verdadera, se ejecutarán los comandos inmediatamente después
del If(recordar que el script se ejecuta línea por línea). Si es falso, los
comandos inmediatamente después del Else serán ejecutados. Si se omite el Else
y la revisión resulta falsa, la ejecución del script irá directamente a la línea
posterior a EndIf. Entonces, agreguémosle más cosas a nuestro ejemplo. Éste
buscará a Mewtwo en el equipo del nuevo jugador y, si lo tiene, le cortará el
paso al server. Fíjate que esto se ejecuta en un evento separado, por lo que
la revisión se realizará ANTES de que el jugador pueda entrar al server.

Ejemplo 4
-----------------------------
Event -PlayerSignOn
If #HasPoke(#Source, 150) = 1
/SendPM #Source, "Mewtwo no está permitido aquí!"
/Kick #Source
Else
/SendPM #Source, "Tu equipo es válido y está listo para la batalla!"
EndIf
End Event
Event +PlayerSignOn
/SendPM #Source, "Bienvenido al server, " & $Name(#Source) & "!"
/SendPM #Source, "Tu nombre en mayúsculas es " & $UCase($Name(#Source)) & "."
/SendPM #Source, "Tu Número de la Suerte es " & $Str(#Rand(9999, 1000)) & "."
EndEvent
-----------------------------

Analicemos la condicionalidad partiendo por la línea del If. Comienza por la
palabra "If" que muestra que es la revisión de una condición. Le sigue la
función #HasPoke la cual devuelve 1 si el jugador #Source tiene el Pokémon Nº 150,
Mewtwo, en su equipo. Entonces, cuando esta función sea evaluada, será reemplazada
por un 0 o un 1 según el resultado, y nos quedaremos con "If 1 = 1" ("Si 1 = 1")
o "If 0 = 1" ("Si 0 = 1"). En el primer caso será verdadero, y el código luego
del If será ejecutado, enviando el mensaje de advertencia y pateando al jugador.
Si resulta ser falsa, el otro mensaje será enviado avisando que puede entrar
al server, activando el siguiente evento.

También puedes revisar más de 1 condición en un mismo If usando los nexos
AND, OR, XOR, y EQV. Sus funciones aparecen en la Tabla 4.

Tabla 4:
-----------------------------
AND | Devuelve verdadero si las 2 condiciones son verdaderas
OR | Devuelve verdadero si 1 de las 2 condiciones es verdadera
XOR | Devuelve verdadero si 1 es verdadera y la otra falsa.
EQV | Devuelve verdadero si las 2 son verdaderas o las 2 son falsas.
-----------------------------

Puedes unir tantas condiciones como quieras usando estos nexos. Hagámosle un
pequeño cambio a nuestro ejemplo. Digamos que le queremos prohibir el uso de
Mewtwo a los usuarios normales, y dejar a los ADMINS y MODS usarlo si quieren.
El siguiente script hará justamente eso.

Ejemplo 5
-----------------------------
Event -PlayerSignOn
If #HasPoke(#Source, 150) = 1 AND #GetPlayerInfo(#Source, AUTH) = 0
/SendPM #Source, "Mewtwo no está permitido aquí!"
/Kick #Source
Else
/SendPM #Source, "Tu equipo es válido y está listo para la batalla!"
EndIf
EndEvent
-----------------------------

Ahora el If revisa 2 condiciones. Primero revisa para asegurarse si el
jugador tiene a Mewtwo en su equipo, y luego revisa si la autoridad del
Jugador es la de un usuario normal.
Si AMBAS condiciones son verdaderas, se activa el comando /Kick.

Fíjate que en este caso el Else no es necesario. Puedes omitirlo por completo
si no quieres hacer nada en caso de que la condición sea falsa.

6ª Parte: OTROS...
=============================================
Esta sección contiene algunos elementos no explicados antes, de menos
importancia pero que pueden serte útiles.

***El Evento Temporizador (Timer)***
Éste es un evento distinto a todos los que habías visto antes. Este evento
no es activado por una acción como los demás, pero se activa automáticamente
en un intervalo de tiempo determinado. Esta es la forma de hacer un evento
temporizador.

Código 3:
-----------------------------
Event Timer [Intervalo]
[Código]
EndEvent
-----------------------------

Como puedes ver, este evento omite el + o el -, pero agrega un argumento: el
intervalo del temporizador. El intervalo puede ser cualquier número entero
entre 1 (1 segundo) y 86400 (86400 segundos, exactamente 24 horas). Por
ejemplo, para crear un evento temporizador que se active cada 5 segundos,
debemos poner "Event Timer 5" en la primera línea. El código dentro del evento
será ejecutado cada 5 segundos hasta que el server se apague. Puedes poner
tantos temporizadores como quieras para que cada uno realice diversas funciones
en intervalos distintos.

***Mensajes Predefinidos***
La lengüeta "Messages" en la ventana del script te permite crear Mensajes
Predefinidos (Predefined Messages o PDM). Los PDMs son útiles para enviar
mensajes que enviarás en varias ocasiones distintas, así sólo lo debes escribir
una vez. Fíjate que todos los PDMs DEBEN ESTAR ENTRE COMILLAS para ser usados,
ya que son como variables de texto. La diferencia es que puedes usar la función
que quieras en tus PDMs, así puedes personalizarlos para que sean diferentes
en cada situación. Para recobrar un PDM del script, usa la función $Msg.

***/Exit***
Uno de los comandos no explicados anteriormente es el comando /Exit. Cuando
este comando es ejecutado, el script se detiene prematuramente y no se
procesan más líneas. Es útil para las instancias en que los procesos
posteriores no tienen sentido. Por ejemplo, digamos que quieres prohibir
a Mewtwo y Lugia de tu server. Se debería ver como esto.

Ejemplo 6
-----------------------------
Event -PlayerSignOn
If #HasPoke(#Source, 150) = 1
/SendPM #Source, "Mewtwo no está permitido aquí!"
/Kick #Source
/Exit
EndIf
If #HasPoke(#Source, 249) = 1
/SendPM #Source, "Lugia no está permitido aquí!"
/Kick #Source
EndIf
/SendPM #Source, "Tu equipo es válido y está listo para la batalla!"
EndEvent
-----------------------------

El comando /Exit se ejecuta si el jugador tiene a Mewtwo en su equipo.
Esto porque, al haber desconectado al jugador, no sería necesario revisar
si tiene un Lugia también.

***/StopEvent***
Otro comando útil es el /StopEvent. Este comando detiene el curso del
evento actual. El comando /StopEvent sólo es valido en algunos eventos.
Éstos son:

Lista 3: Eventos para /StopEvent
-----------------------------
-NewMessage
-ChatMessage
-PlayerAway
-PlayerKick
-PlayerBan
-ChallengeIssued
-----------------------------

Esto funciona sólo si está en un evento MENOS, indicando que el evento se
activa ANTES de que ocurra la acción. Cuando el /StopEvent se activa, la
acción que activó el evento se cancela. Esto puede ser útil para varias
cosas. Por ejemplo, si quieres apagar el server pero sin interrumpir la
batalla de alguien, no querrás que nadie empiece una NUEVA batalla, Cierto?.
Entonces, un simple /StopEvent en el evento -ChallengeIssued prevendrá que
cualquier nueva batalla empiece.

***Conjuntos de Jugadores (Player Arrays)***
Algunas veces se vuelve necesario tener una variable diferente para cada
jugador conectado. Para hacer esto, puedes crear un Conjunto de Jugadores.
Créalo con el comando /SetPA de esta forma:

Código 4:
-----------------------------
/SetPA {#|$}NombreConjunto
-----------------------------

Luego, puedes establecer las variables individuales con el comando /Set.

Código 5:
-----------------------------
/Set #NombreConjunto(#NºJugador), #Valor
-----------------------------

Cuando un jugador sale del server, la variable asignada a ese jugador es
automáticamente borrada.
Cuando un jugador entra al server, una nueva variable es creada automáticamente
para ese jugador.

Ejemplo 6
-----------------------------
Event +PlayerSignOn
/Set $CapNam(#Source), $UCase($Name(#Source))
EndEvent
-----------------------------

El script anterior mantiene un registro del nombre de cada jugador en mayúsculas.
Los valores para todos los jugadores pueden ser vistos en la ventana del script
en la lengüeta "Player Arrays".

***Marcadores y "GoTo"(Ir a)***
Los Marcadores son usados para establecer una línea de tu script como punto
de referencia. Para establecer un marcador, empieza una línea con 2 puntos
(":") y escribe una palabra junto a ellos. Esta palabra será el nombre del
Marcador. Para ir a un marcador específico utiliza la indicación GoTo.

Ejemplo 7:
-----------------------------
Event +ChatMessage
If $Message = "Cuenta Regresiva"
/Set #X, 5
:Bucle
/? $Str(#X)
/Inc #X, -1
If #X <> 0
GoTo Bucle
EndIf
/? "Despege!!"
EndIf
End Event
-----------------------------

Este ejemplo mostrará el siguiente texto en la casilla de mensaje del server
cuando la frase "Cuenta Regresiva" sea recibida:

5
4
3
2
1
Despegue!!

Como puedes ver, las 3 líneas entre el Marcador y la indicación GoTo se seguirán
ejecutando hasta que la condición "#X <> 0" sea falsa. Por supuesto, en este
ejemplo en particular, probablemente sea más fácil decir /? "5" , /? "4" ...
hasta llegar a /? "1", pero tan solo es un ejemplo para mostrar como funciona.

7ª Parte: APÉNDICES
=============================================
NOTA: Parte no incluida en el ScriptFAQ original
1.- Números POKÉMON
No creo que sean necesarios, pero igual haré una referencia a ellos. Los números
de los Pokemon son los mismos que se usan en el PokédDex nacional, que empiezan
por Bulbasaur, con el número 1, y terminan con Deoxys-E, con el número 389.

2.- Números Ítems
A continuación aparece cada ítem con su respectivo número al lado:

1 - Berry
2 - Berry Juice
3 - Bitter Berry
4 - Burnt Berry
5 - Gold Berry
6 - Ice Berry
7 - Mint Berry
8 - Miracle Berry
9 - Mysteryberry
10 - PrzCureBerry
11 - PsnCureBerry
12 - Berserk Gene
13 - Black Belt
14 - BlackGlasses
15 - BrightPowder
16 - Charcoal
17 - Dragon Fang
18 - Focus Band
19 - Hard Stone
20 - King's Rock
21 - Leftovers
22 - Light Ball
23 - Lucky Punch
24 - Magnet
25 - Metal Coat
26 - Metal Powder
27 - Miracle Seed
28 - Mystic Water
29 - NevermeltIce
30 - Pink Bow
31 - Poison Barb
32 - Polkadot Bow
33 - Quick Claw
34 - Scope Lens
35 - Sharp Beak
36 - Silver Powder
37 - Soft Sand
38 - Spell Tag
39 - Stick
40 - Thick Club
41 - TwistedSpoon
42 - Cheri Berry
43 - Chesto Berry
44 - Pecha Berry
45 - Rawst Berry
46 - Aspear Berry
47 - Leppa Berry
48 - Oran Berry
49 - Persim Berry
50 - Lum Berry
51 - Sitrus Berry
52 - Figy Berry
53 - Iapapa Berry
54 - Mago Berry
55 - Wiki Berry
56 - Aguav Berry
57 - Liechi Berry
58 - Ganlon Berry
59 - Salac Berry
60 - Petaya Berry
61 - Apicot Berry
62 - Lansat Berry
63 - Starf Berry
64 - Choice Band
65 - DeepSeaScale
66 - DeepSeaTooth
67 - Lax Incense
68 - Macho Brace
69 - Mental Herb
70 - Sea Incense
71 - Shell Bell
72 - Silk Scarf
73 - Soul Dew
74 - White Herb

3.- Números Ataques
También los necesitaras y, además, son un poco difíciles de conseguir.

1 - Absorb
2 - Acid
3 - Acid Armor
4 - Aeroblast
5 - Agility
6 - Amnesia
7 - Ancientpower
8 - Attract
9 - Aurora Beam
10 - Barrage
11 - Barrier
12 - Baton Pass
13 - Beat Up
14 - Belly Drum
15 - Bide
16 - Bind
17 - Bite
18 - Blizzard
19 - Body Slam
20 - Bone Club
21 - Bone Rush
22 - Bonemerang
23 - Bubble
24 - Bubblebeam
25 - Charm
26 - Clamp
27 - Comet Punch
28 - Confuse Ray
29 - Confusion
30 - Constrict
31 - Conversion
32 - Conversion2
33 - Cotton Spore
34 - Counter
35 - Crabhammer
36 - Cross Chop
37 - Crunch
38 - Curse
39 - Cut
40 - Defense Curl
41 - Destiny Bond
42 - Detect
43 - Dig
44 - Disable
45 - Dizzy Punch
46 - Double Kick
47 - Double Team
48 - Double-Edge
49 - Doubleslap
50 - Dragon Rage
51 - Dragonbreath
52 - Dream Eater
53 - Drill Peck
54 - Dynamicpunch
55 - Earthquake
56 - Egg Bomb
57 - Ember
58 - Encore
59 - Endure
60 - Explosion
61 - Extremespeed
62 - Faint Attack
63 - False Swipe
64 - Fire Blast
65 - Fire Punch
66 - Fire Spin
67 - Fissure
68 - Flail
69 - Flame Wheel
70 - Flamethrower
71 - Flash
72 - Fly
73 - Focus Energy
74 - Foresight
75 - Frustration
76 - Fury Attack
77 - Fury Cutter
78 - Fury Swipes
79 - Future Sight
80 - Giga Drain
81 - Glare
82 - Growl
83 - Growth
84 - Guillotine
85 - Gust
86 - Harden
87 - Haze
88 - Headbutt
89 - Heal Bell
90 - Hi Jump Kick
91 - Hidden Power
92 - Horn Attack
93 - Horn Drill
94 - Hydro Pump
95 - Hyper Beam
96 - Hyper Fang
97 - Hypnosis
98 - Ice Beam
99 - Ice Punch
100 - Icy Wind
101 - Iron Tail
102 - Jump Kick
103 - Karate Chop
104 - Kinesis
105 - Leech Life
106 - Leech Seed
107 - Leer
108 - Lick
109 - Light Screen
110 - Lock-On
111 - Lovely Kiss
112 - Low Kick
113 - Mach Punch
114 - Magnitude
115 - Mean Look
116 - Meditate
117 - Mega Drain
118 - Mega Kick
119 - Mega Punch
120 - Megahorn
121 - Metal Claw
122 - Metronome
123 - Milk Drink
124 - Mimic
125 - Mind Reader
126 - Minimize
127 - Mirror Coat
128 - Mirror Move
129 - Mist
130 - Moonlight
131 - Morning Sun
132 - Mud-Slap
133 - Night Shade
134 - Nightmare
135 - Octazooka
136 - Outrage
137 - Pain Split
138 - Pay Day
139 - Peck
140 - Perish Song
141 - Petal Dance
142 - Pin Missile
143 - Poison Gas
144 - Poison Sting
145 - Poisonpowder
146 - Pound
147 - Powder Snow
148 - Present
149 - Protect
150 - Psybeam
151 - Psych Up
152 - Psychic
153 - Psywave
154 - Pursuit
155 - Quick Attack
156 - Rage
157 - Rain Dance
158 - Rapid Spin
159 - Razor Leaf
160 - Razor Wind
161 - Recover
162 - Reflect
163 - Rest
164 - Return
165 - Reversal
166 - Roar
167 - Rock Slide
168 - Rock Smash
169 - Rock Throw
170 - Rolling Kick
171 - Rollout
172 - Sacred Fire
173 - Safeguard
174 - Sandstorm
175 - Sand-Attack
176 - Scary Face
177 - Scratch
178 - Screech
179 - Seismic Toss
180 - Selfdestruct
181 - Shadow Ball
182 - Sharpen
183 - Sing
184 - Sketch
185 - Skull Bash
186 - Sky Attack
187 - Slam
188 - Slash
189 - Sleep Powder
190 - Sleep Talk
191 - Sludge
192 - Sludge Bomb
193 - Smog
194 - Smokescreen
195 - Snore
196 - Softboiled
197 - Solarbeam
198 - Sonicboom
199 - Spark
200 - Spider Web
201 - Spike Cannon
202 - Spikes
203 - Spite
204 - Splash
205 - Spore
206 - Steel Wing
207 - Stomp
208 - Strength
209 - String Shot
210 - Struggle
211 - Stun Spore
212 - Submission
213 - Substitute
214 - Sunny Day
215 - Super Fang
216 - Supersonic
217 - Surf
218 - Swagger
219 - Sweet Kiss
220 - Sweet Scent
221 - Swift
222 - Swords Dance
223 - Synthesis
224 - Tackle
225 - Tail Whip
226 - Take Down
227 - Teleport
228 - Thief
229 - Thrash
230 - Thunder
231 - Thunder Wave
232 - Thunderbolt
233 - Thunderpunch
234 - Thundershock
235 - Toxic
236 - Transform
237 - Tri Attack
238 - Triple Kick
239 - Twineedle
240 - Twister
241 - Vicegrip
242 - Vine Whip
243 - Vital Throw
244 - Water Gun
245 - Waterfall
246 - Whirlpool
247 - Whirlwind
248 - Wing Attack
249 - Withdraw
250 - Wrap
251 - Zap Cannon
252 - Aerial Ace
253 - Air Cutter
254 - Arm Thrust
255 - Aromatherapy
256 - Assist
257 - Astonish
258 - Blast Burn
259 - Blaze Kick
260 - Block
261 - Bounce
262 - Brick Break
263 - Bulk Up
264 - Bullet Seed
265 - Calm Mind
266 - Camouflage
267 - Charge
268 - Cosmic Power
269 - Covet
270 - Crush Claw
271 - Dive
272 - Doom Desire
273 - Dragon Claw
274 - Dragon Dance
275 - Endeavor
276 - Eruption
277 - Extrasensory
278 - Facade
279 - Fake Out
280 - Fake Tears
281 - Featherdance
282 - Flatter
283 - Focus Punch
284 - Follow Me
285 - Frenzy Plant
286 - Grasswhistle
287 - Grudge
288 - Hail
289 - Heat Wave
290 - Helping Hand
291 - Howl
292 - Hydro Cannon
293 - Hyper Voice
294 - Ice Ball
295 - Icicle Spear
296 - Imprison
297 - Ingrain
298 - Iron Defense
299 - Knock Off
300 - Leaf Blade
301 - Luster Purge
302 - Magic Coat
303 - Magical Leaf
304 - Memento
305 - Metal Sound
306 - Meteor Mash
307 - Mist Ball
308 - Mud Shot
309 - Mud Sport
310 - Muddy Water
311 - Nature Power
312 - Needle Arm
313 - Odor Sleuth
314 - Overheat
315 - Poison Fang
316 - Poison Tail
317 - Psycho Boost
318 - Recycle
319 - Refresh
320 - Revenge
321 - Rock Blast
322 - Rock Tomb
323 - Role Play
324 - Sand Tomb
325 - Secret Power
326 - Shadow Punch
327 - Sheer Cold
328 - Shock Wave
329 - Signal Beam
330 - Silver Wind
331 - Skill Swap
332 - Sky Uppercut
333 - Slack Off
334 - Smellingsalt
335 - Snatch
336 - Spit Up
337 - Stockpile
338 - Superpower
339 - Swallow
340 - Tail Glow
341 - Taunt
342 - Teeter Dance
343 - Tickle
344 - Torment
345 - Trick
346 - Uproar
347 - Volt Tackle
348 - Water Pulse
349 - Water Sport
350 - Water Spout
351 - Weather Ball
352 - Will-O-Wisp
353 - Wish
354 - Yawn

8ª Parte: TERMINANDO (por fin!)
Imagen
Name: 0vni

Avatar de Usuario
Electric Boy
Huevo
Huevo
Mensajes: 7
Registrado: Jue Sep 07, 2006 4:10 am

Mensajepor Electric Boy »

Este manual me vendrá de perlas para programar mi server. Muchas gracias.
Los obstáculos son esas temibles cosas que ves, cuando quitas los ojos de la meta.

Avatar de Usuario
shhh
Familiarizándose con Johto
Familiarizándose con Johto
Mensajes: 278
Registrado: Vie Jun 16, 2006 12:04 pm

ahhhhh

Mensajepor shhh »

No te cansaste??????

*rey_4933*
En batalla con Antón
En batalla con Antón
Mensajes: 322
Registrado: Vie Mar 16, 2007 5:45 pm

Mensajepor *rey_4933* »

Oye no revivas temas viejos.

pero bueno BIENVENID@ A EL FORO.
Remodelando Firma Principal
Imagen
Imagen
Imagen
El Silencio Es De Uno El Conocimiento Es De Todos.
De Cada 10 Foreros Soy odiado por 9 De cada 20 fororos 18 no kieren saber de mi,quiere decir de cada 30,27 No Me Soportan Es Facir Ver Que Son Pocos Los Que Aportan.
Amigos Van Amigos Vienen,Pero cuando uno esta atra no son capases de llamar para preg como uno esta,YO NO HABLO POR HABLAR USTED SABE K ES VERDAD.
La Confianza Es Un Tesoro No Se La Des A Cuarquiera