Instalación de un servidor MuOnline Ex700 Plus

Bienvenidos a un nuevo tutorial, hoy aprenderemos a instalar un servidor Ex700 Plus, dicho servidor se compone de una base Season 4 Custom.
Lo primero que haremos será descargar el pack Ex700 Plus haciendo un clic en la imagen, o desde nuestro facebook [MuTutoriales]
El pack Ex700Plus contiene:



a)Cliente Mu Ex700 by MuOnline Tutoriales.rar
El cual ya contiene main.exe y START.exe configurados correctamente con los files (Versión y Serial)
b)Muserver Ex700 Plus.rar
El cual ya contiene las Dbs fixeadas
c)Editor.rar
El que podrán usar para crear cuentas y editar al personaje (Stats, Raza, Zen, etc)

Interfaz de acceso al cliente Ex700

1)Lo primero que haremos será descomprir el contenido del archivo MuserverEx700Plus.rar en una carpeta dentro de nuestro disco. (El nombre de la carpeta y disco queda a su elección)

Archivos que componen los files

2)Nuestro siguiente paso será configurar los archivos con nuestro usuario y password SQL, el primero lo encontramos en la siguiente ruta:
D:\Muserver Ex700 Plus\eDataServer\eDataServer.ini
Configuración del archivo con datos de acceso SQL

3)Ahora hacemos lo mismo, pero en el archivo de la siguiente ruta:
D:\Muserver Ex700 Plus\eDataServer1\eDataServer.ini
Usuario y password SQL

4)Nuestro siguiente archivo a configurar con los datos de nuestro SQL lo encontramos en la siguiente ruta:
D:\Muserver Ex700 Plus\eDataServer2\eDataServer.ini
Acceso sql

5)Ahora ingresamos a D:\Muserver Ex700 Plus\EventServer , abrimos el archivo Config.ini y lo configuramos con nuestros datos del SQL

Configuración de logueo con usuario y password sql

6)Ahora ingresamos a la siguiente ruta
D:\Muserver Ex700 Plus\EventServer\Data
Y abrimos el archivo svconfig.ini y lo configuramos con nuestros datos del SQL.

Acceso sql al archivo ini

7)Hacemos lo mismo en el archivo alojado en la siguiente ruta:
D:\Muserver Ex700 Plus\ExDB\ExDB.ini
Configuracion de datos sql en el exdb

8)Finalmente ingresamos a la siguiente ruta y abrimos el siguiente archivo
D:\Muserver Ex700 Plus\RankingServer\svconfig.ini
En él, agregamos los datos de nuestro SQL

Usuario y password sql en el archivo svconfig

9)Lo que haremos ahora, será configurar las ips en nuestros files, comezemos con el archivo BoR_ServerList.dat que lo encontramos en la siguiente ruta
D:\Muserver Ex700 Plus\ConnectServer\Data
Lo abrimos y en donde dice "ip" lo cambiamos con nuestra ip LAN [Si quieren un server local] o por su ip pública o no-ip [Si quieren un servidor público], en mi caso usaré como ip la siguiente "asd.sytes.net"
El archivo configurado debería quedarnos similar al siguiente:

Configuración de ips

10)El siguiente archivo a configurar con nuestra ip lo encontramos en la siguiente ruta:
D:\Muserver Ex700 Plus\Data\MapServerInfo.dat
Lo que haremos, será cambiar en donde dice -ip- por nuestra ip (La misma que colocaron en el archivo anterior)
Recuerden que no deben borrar la S inicial que acompañará nuestra ip.
El archivo configurado debería quedarles similar al siguiente:

Configuración de ips en el mapserverinfo

11)El siguiente archivo es el IpList.dat y lo encontramos en esta ruta:
D:\Muserver Ex700 Plus\Data
Lo que haremos, será cambiar en donde dice ip por la nuestra

Agregado de ips en el iplist

12)Y el último archivo a configurar lo encontramos en la raíz de la carpeta, en mi caso D:\Muserver Ex700 Plus, el archivo se llama Configs.ini
Lo que haremos será deslizar el scroll vertical hasta el final y en donde dice "ip" (del lado derecho), modificamos eso con nuestra ip.

Configuración de ips publica

13)Lo que haremos ahora, será restaurar nuestras 3 bases de datos, estas DBs las encontramos en la siguiente ruta:
D:\Muserver Ex700 Plus\DataBase Files
El proceso de restauración, es algo que lo hemos visto en muchas oportunidades, por lo que no nos detendremos en este paso, para quienes son nuevos pueden Visiten este tutorial
Las bases de datos a resturar son: MuOnline, MuEvent y MuRanking, luego del proceso de restauración ejecutan los ODBC.reg (Contenidas en la misma carpeta)

Bases de datos para los files ex700

14)Para iniciar nuestro servidor, simplemente ejecutamos el MUServerStartUP.exe y esperamos a que el lanzador cargue todos los link.
Una vez terminado, tendremos nuestro Servidor MuEx700 Plus Online

Iniciando el servidor

15)Lo que haremos ahora, será configurar nuestro cliente para poder ingresar correctamente, lo que harán será descomprimir la carpeta Cliente Mu Ex700 by MuOnline Tutoriales.rar en nuestro escritorio y abrir el archivo llamado Patched.ini
Dentro del archivo lo que debemos modificar es lo siguiente:
IpAddress = asd.sytes.net
Por nuestra Ip lan o no-ip

Editando el archivo de ingreso con la ip pública

16)Para ingresar al juego, ejecutamos el START.exe (Si usan Windows 7, recuerden hacerlo como administrador)
La base de datos que contiene los files, tiene algunos fixers que realize, y la misma contiene una cuenta que si desean pueden usar:
Login: byasd
Password: byasd

Ingresando al juego

Para finalizar, en el tutorial se utilizo SQL Server 2000 y Windows 7 Ultimate.
Las base de datos son compatibles con el SQL Server 2000, sólo deben restaurarlas.
El editor ya está configurado para que funcione con la versión, lo que deben hacer es en el archivo MuEdit.ini abrirlo con cualquier procesador de textos y poner el password de nuestro SQL a la derecha de "DatabasePassword"

Añadir misiones online al MuOnline

Bienvenidos a un nuevo tutorial, hoy veremos en forma de pantallazo como realizar el procedimiento para crear misiones online en nuestro servidor MuOnline.
Este tutorial fue pedido a través de nuestro e´mail consultas@muonlinetutoriales.com, de manera que si necesitas una guia específica para algo que desean hacer o saber, simplemente nos escriben.
Este tutorial se aplica a cualquier server de MuOnline que tengas, no importa la versión pero si deberás prestar atención que dependiendo de ella, algunas cosas pueden variar.
Para los que son nuevos o no conocen la terminología "Misiones Online" veamos de que se trata:
Es normal que luego de un tiempo y de cierta popularidad de nuestro juego, necesitemos innovarnos, ¿Cambiar de versión?, para nada ni en absoluto, se trata de darle una nueva dinámica al juego para salir de esa monotonía, alli surgen estas "Misiones Online"



Técnicamente, las misiones online es la combinación de "PHP" + "JUEGO", dicho de otra manera las misiones online, funcionan de la siguiente forma:
Misión Ejemplo: Buscar 10 manzanas, recompensa (Pueden ser items, PCPoints, etc)
El usuario deberá ingresar al juego buscar esas 10 manzanas, ubicarlas en el inventario, entrar a la web, en donde se ejecutará una serie de condicionales los cuales verificarán esas 10 manzanas y procederá a darle el premio si todo está correcto.

Básicamente de eso se tratan las misiones online, las combinaciones, premios , requisitos , cantidades son realmente infinitas, quedará en la imaginación de cada uno estos detalles.
1)Lo primero que aprenderemos será a leer nuestro inventario, es decir, ¿Cómo sabemos en .PHP si tenemos 10 manzanas en el inventario? ¿De que forma podríamos saber si realmente son 10 o menos?
Entonces comenzemos: Para esta demostración utilizaré una versión Season 6, tomaré un personaje nuevo (Esto es muy importante, el personaje no debe tener items en el invetario, (luego veremos porque) y le editaré 10 manzanas.

Editor TitanEditor

2)Lo que haremos ahora será ingresar al Analizador de Consultas => MuOnline => Dbo.Character [Clic derecho Abrir] => Buscamos el personaje al que le editamos las 10 manzanas y copiamos el contenido de la columna [Inventory]

Analizador de consultas

3)El resultado anterior será algo similar a esto (Dependiendo la longitud de la variable, el tamaño puede variar):
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E00000000000000000FF000000000000E0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Muchos de ustedes se preguntarán ¿Qué es eso?
La respuesta es simple, ese es nuestro inventario contenido en una variable de tipo Varbinary(3776), y eso lo usaremos para responder la pregunta inicial ¿Cómo saber si tenemos 10 manzanas?, la respuesta es sencilla, hacemos la comparación del inventario del usuario con este "molde" por asi llamarlo.
Si la comparación es correcta, entonces la misión estará completada y podrán entregar el premio.
Este sería el pantallazo sobre las misiones online, lógicamente que ustedes pueden poner los items que quieran.

Veamos algunas explicaciones adicionales:

a)¿Por qué el inventario debía estar vacio?,
La respuesta es más que visible, el inventario debería estar vacio porque necesitamos retirar un molde limpio.

b)¿Importa la posición de las manzanas?
Si, claro que importa, eso significa que si tenemos 10 manzanas ubicadas de otra forma, el código del inventario cambiará y no nos servirá como molde único.
(Para esto abría que generar otro script más complejo en donde quitemos por ejemplo "0000FF000000000000E0000000000000" = 1 manzana y recorramos el código en busca de ellas)

c)¿Si el personaje tiene un set puesto, alas, anillos o pendals influye a la hora de hacer la verificación?
Si, el molde se realizo con un personaje sin items, por lo que la copia debe ser exacta.

d)¿Cuántas misiones puedo hacer?
Tantas misiones como imaginación tengas.

e)¿Las misiones solo son con búsqueda de items?
No, podemos hacer misiones por ejemplo en donde una guild debe tener cierto score, o en donde un player tenga cierto nivel de PK, etc

Como les mencione arriba, las variedades son infinitas, todo es cuestión de tener imaginación.

Generar secuencia de comandos SQL

Bienvenidos a nuevo tutorial, hoy aprenderemos generar secuencia de comandos SQL,
¿Para qué nos sirve esto?
Esta función tiene infinitas utilidades, en este tutorial la usaremos para pasar "columnas" con sus respectivos tipos de datos, de una base de datos a otra.



1)En este tutorial simularemos tener dos bases de datos restauradas, a una la llamaremos "DB_Anterior" y a la otra la llamaremos "DB_Nueva"
En la DB_Anterior, simularemos tener muchas columnas en la tabla "Character" que queremos pasar a la DB_Nueva.
Entonces lo primero que haremos será ingresar a la "Db_Anterior" => "Tablas" => "Character" => "Todas las tareas" => "Generar secuencia de comandos SQL"

Generar secuencia desde SQL server 2000

2)Lo que haremos en nuestra nueva ventana, será simplemente un clic en "Aceptar"

Generador de secuencias

3)Ahora debemos seleccionar un lugar para guardar nuestra secuencia.
Lo que haremos será en donde dice *.sql , borran el * y ponerle un nombre al archivo, en este caso lo llamaré muonlinetutorial.sql
Luego tildamos la opción "Guardar"

Seleccionando destino para guardar la secuencia

4)Lo que hemos generado es una secuencia de comandos SQL.
En ella contenemos toda las columnas con sus propiedades (Atención: no contiene datos ni tampoco información de su DB, para eso deben usar los anteriores tutoriales en donde vimos como exportar o importar tablas con su respectiva información)

Secuencia generada

5)Entonces, en el archivo muonlinetutorial.sql tenemos todas las columnas con sus propiedades.
Si corremos esta querry en el analizador de consultas, tendremos como resultado lo siguiente:
Al correr dicha consulta, lo que hara será un drop de la tabla "Character" y crearla de nuevo con estas nuevas columnas.
Esto lo hariamos en el caso de querer mantener la originalidad de la tabla character de la DB_Anterior en la DB_Nueva.
Pero talvez lo que necesitemos sea crear algunas columnas de la DB_Anterior en la DB_Nueva, de esta forma mantendríamos nuestros datos actuales y anexaríamos las columnas faltantes (Ya sea por que las necesitamos para una página web, o porque cambiamos de versión, etc)
Supongamos lo siguiente:
En la Db_Anterior tenemos estas columnas:
[AccountID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cLevel] [int] NULL ,
[LevelUpPoint] [int] NULL ,
[Class] [tinyint] NULL ,
[Experience] [int] NULL ,
[Strength] [int] NULL ,
[Dexterity] [int] NULL ,
[Vitality] [int] NULL ,
[Energy] [int] NULL ,
[Inventory] [varbinary] (3776) NULL ,
[MagicList] [varbinary] (180) NULL ,
[Money] [int] NULL ,
[Life] [real] NULL ,
[MaxLife] [real] NULL ,
[Mana] [real] NULL ,
[MaxMana] [real] NULL ,
[MapNumber] [smallint] NULL ,
[MapPosX] [smallint] NULL ,
[MapPosY] [smallint] NULL ,
[MapDir] [tinyint] NULL ,
[PkCount] [int] NULL ,
[PkLevel] [int] NULL ,
[PkTime] [int] NULL ,
[MDate] [smalldatetime] NULL ,
[LDate] [smalldatetime] NULL ,
[CtlCode] [tinyint] NULL ,
[DbVersion] [tinyint] NULL ,
[Quest] [varbinary] (50) NULL ,
[Leadership] [int] NULL ,
[ChatLimitTime] [smallint] NULL ,
[FruitPoint] [int] NULL ,
[zs_count] [int] NULL ,
[ZY] [int] NULL ,
[FQBZ] [int] NULL ,
[FQCount] [int] NULL ,
[FQName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[Resets] [int] NOT NULL ,
[mu_id] [int] IDENTITY (1, 1) NOT NULL ,
[SCFPCPoints] [int] NULL ,
[SCFMarried] [int] NOT NULL ,
[SCFMarryHusbandWife] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SCFMasterLevel] [int] NOT NULL ,
[SCFMasterPoints] [int] NOT NULL ,
[SCFMasterSkills] [varbinary] (300) NULL ,
[SCFCustomQuest] [varbinary] (512) NULL ,
[SCFGensFamily] [smallint] NOT NULL ,
[SCFGensContribution] [int] NOT NULL ,
[SCFGensRank] [int] NOT NULL ,
[SCFGensDateLeave] [smalldatetime] NULL ,
[SCFGensRecvReward] [tinyint] NOT NULL ,
[Grand_Resets] [int] NOT NULL ,
[SCFMasterSkill] [varbinary] (240) NULL ,
[SCFExtInventory] [tinyint] NOT NULL ,
[SCFUpdatedPShop] [tinyint] NOT NULL ,
[SCFSealItem] [int] NOT NULL ,
[SCFSealTime] [int] NOT NULL ,
[SCFScrollItem] [int] NOT NULL ,
[SCFScrollTime] [int] NOT NULL
Y en la DB_Nueva tenemos estas columnas:
[AccountID] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cLevel] [smallint] NULL ,
[LevelUpPoint] [int] NULL ,
[Class] [tinyint] NULL ,
[Experience] [int] NULL ,
[Strength] [smallint] NULL ,
[Dexterity] [smallint] NULL ,
[Vitality] [smallint] NULL ,
[Energy] [smallint] NULL ,
[Inventory] [varbinary] (760) NULL ,
[MagicList] [varbinary] (60) NULL ,
[Money] [int] NULL ,
[Life] [real] NULL ,
[MaxLife] [real] NULL ,
[Mana] [real] NULL ,
[MaxMana] [real] NULL ,
[MapNumber] [smallint] NULL ,
[MapPosX] [smallint] NULL ,
[MapPosY] [smallint] NULL ,
[MapDir] [tinyint] NULL ,
[PkCount] [int] NULL ,
[PkLevel] [int] NULL ,
[PkTime] [int] NULL ,
[MDate] [smalldatetime] NULL ,
[LDate] [smalldatetime] NULL ,
[CtlCode] [tinyint] NULL ,
[DbVersion] [tinyint] NULL ,
[Quest] [varbinary] (50) NULL ,
[Reset] [int] NOT NULL
Como pueden observar, la DB_Anterior posee mayor cantidad de columnas que la DB_Nueva, entonces para pasar solamente las columnas que faltan en esta útlima lo que haremos será lo siguiente:
Anteriormente habíamos generado una secuencia de comandos SQL a la cual yo llame muonlinetutoriales.sql, abrimos eso con el notepad o cualquier procesador de textos y de manera inmediata borramos lo siguiente:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Character]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Character]
GO

CREATE TABLE [dbo].[Character] (
De esta forma evitamos que al correr la querry no nos borre la tabla character de la DB_Nueva
Luego al final borramos esto que sería el cierre del código
) ON [PRIMARY]
GO
Literalmente nos quedaría algo asi:

Secuencia modificada

6)Lo que vimos entonces en la anterior imagen son tan sólo las columnas (Sin instruciones).
Lo que debemos hacer ahora, es una simple observación comparando las columnas que nos sobran en la DB_Anterior y que nos faltan en la DB_Nueva, en este caso es muy fácil, si prestan atención verán que en la DB_Anterior tenemos un listado de 29 columnas más, estas son las siguientes:
[mu_id] [int] IDENTITY (1, 1) NOT NULL ,
[SCFPCPoints] [int] NULL ,
[SCFMarried] [int] NOT NULL ,
[SCFMarryHusbandWife] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[SCFMasterLevel] [int] NOT NULL ,
[SCFMasterPoints] [int] NOT NULL ,
[SCFMasterSkills] [varbinary] (300) NULL ,
[SCFCustomQuest] [varbinary] (512) NULL ,
[SCFGensFamily] [smallint] NOT NULL ,
[SCFGensContribution] [int] NOT NULL ,
[SCFGensRank] [int] NOT NULL ,
[SCFGensDateLeave] [smalldatetime] NULL ,
[SCFGensRecvReward] [tinyint] NOT NULL ,
[Grand_Resets] [int] NOT NULL ,
[SCFMasterSkill] [varbinary] (240) NULL ,
[SCFExtInventory] [tinyint] NOT NULL ,
[SCFUpdatedPShop] [tinyint] NOT NULL ,
[SCFSealItem] [int] NOT NULL ,
[SCFSealTime] [int] NOT NULL ,
[SCFScrollItem] [int] NOT NULL ,
[SCFScrollTime] [int] NOT NULL
[Leadership] [int] NULL ,
[ChatLimitTime] [smallint] NULL ,
[FruitPoint] [int] NULL ,
[zs_count] [int] NULL ,
[ZY] [int] NULL ,
[FQBZ] [int] NULL ,
[FQCount] [int] NULL ,
[FQName] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL

Pasando tablas faltantes

7)Esas columnas las aislamos del código y las pegamos en nuestro "Analizador de consultas" (Recuerden seleccionar arriba la base de datos en donde quieran anexar o agregar las columnas)
Luego delante del nombre de cada columna agregan lo siguiente:
ALTER TABLE character ADD
¿Qué función tiene este fragmento?
Esto lo que hará será "Modificar/Alterar" la tabla character agregando esas columnas que tenemos en el listado"
Importante: si copiaron las columnas del archivo .txt es posible que tengan una "," al final de cada columna, eso deberán borrarlo también sino al correr la querry tendrán un error.
Una vez que finalizamos, hacemos un clic en boton "Ejecutar" o aprentan "F5"

Analizador de consultas

Con eso hemos creado todas las columnas faltantes en nuestra DB_Nueva.
Si al momento de ejecutar la consulta, nos arroja este error:
ALTER TABLE sólo permite agregar columnas que contengan valores Null o que tengan la definición DEFAULT. La columna 'El nombre de la columna' no se puede agregar a la tabla 'El nombre de tu tabla' porque no permite valores Null y no especifica la definición DEFAULT.
Lo que deben hacer es buscar la columna que menciona el error (Este nombre dependerá de la tabla con la que esten trabajando) y agregar despues del NULL lo siguiente
DEFAULT 0
Entonces, por ejemplo si tenemos la siguiente columna con el error
ALTER TABLE character ADD [SCFGensFamily] [smallint] NOT NULL
Le agregamos lo mencionado anteriormente de modo tal que nos quedará asi:
ALTER TABLE character ADD [SCFGensFamily] [smallint] NOT NULL DEFAULT 0
Recuerden que antes de trabajar deben generar backups de sus bases de datos por si algo les sale mal.
Tambien más adelante trabajaremos esto de manera más simplificada sin necesidad de agregar tantas instrucciónes ni complicarnos con la sintaxís.

SP_POINT_ACCUMULATION [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula SP_POINT_ACCUMULATION

Procedimiento sql
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE SP_POINT_ACCUMULATION
@Server tinyint,
@Square tinyint,

@AccountID varchar(10),
@CharacterName varchar(10),
@Class tinyint ,
@Point int
As
Begin

BEGIN TRANSACTION

SET NOCOUNT ON

IF EXISTS ( SELECT CharacterName FROM EVENT_INFO WITH (READUNCOMMITTED)
WHERE Server = @Server AND AccountID = @AccountID AND CharacterName = @CharacterName )
Begin
UPDATE EVENT_INFO
SET Point = Point + @Point , Square = @Square
WHERE Server = @Server AND AccountID = @AccountID AND CharacterName = @CharacterName
End
ELSE
Begin
INSERT INTO EVENT_INFO ( Server, Square, AccountID, CharacterName, Class, Point ) VALUES (
@Server,
@Square,
@AccountID,
@CharacterName,
@Class,
@Point
)
End


IF(@@Error <> 0 )
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

SET NOCOUNT OFF
End


GO

WZ_WriteModifyLog [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_WriteModifyLog

Procedimiento sql wz_whitemodifylog
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE WZ_WriteModifyLog

@MngID varchar(10),
@AccID varchar(10),
@GameID varchar(10),
@Server int,
@ip varchar(17),
@type varchar(17),
@text varchar(100)


AS
begin
INSERT INTO MngModifyLog (ManagerID,AccountID,GameID,servernumber,IP,LogType,LogText) valueS (@MngID,@AccID,@GameID,@Server,@ip,@type,@text)
end


GO

WZ_WriteLog [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_WriteLog

Procedimiento para funciones muonline
--www.muonlinetutoriales.com
--by asd*

CREATE procedure WZ_WriteLog

@uid varchar(10),
@uip varchar(16),
@ud int,
@ust varchar(100)

as
begin

INSERT INTO Mnglog (ID, IP, LogType, LogText) valueS (@uid, @uip,@ud,@ust)
end

GO

WZ_SetGuildDelete [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_SetGuildDelete

Procedimiento almacenado
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE WZ_SetGuildDelete

@guild varchar(14)

as
begin

delete from Guild where G_Name=@guild
delete from GuildMember where G_Name=@guild

end


GO

WZ_GuildCreate [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_GuildCreate

Procedimiento almacenado para versiones 097
--www.muonlinetutoriales.com
--by asd*

CREATE procedure WZ_GuildCreate
@GuildName nvarchar(50),
@MasterName nvarchar(10)
as
if (SELECT COUNT(*) FROM guild where G_Name=@GuildName )=0

BEGIN
DECLARE @ErrorCode int

SET @ErrorCode = 0
SET XACT_ABORT OFF

Set nocount on

begin transaction


INSERT INTO Guild (G_Name,G_Master,G_Score) valueS (@GuildName, @MasterName, 1)
IF ( @@Error <> 0 )
BEGIN
SET @ErrorCode = 1
END


IF ( @ErrorCode = 0 )
BEGIN

INSERT GuildMember (Name, G_Name, G_Level) valueS (@MasterName, @GuildName, 1)
IF ( @@Error <> 0 )
BEGIN
SET @ErrorCode = 2
END
END

IF ( @ErrorCode <> 0 )
rollback transaction
ELSE
commit transaction

select @ErrorCode

Set nocount off
SET XACT_ABORT ON
END


GO

WZ_GetItemSerial [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_GetItemSerial

Procedimiento almacenado
--www.muonlinetutoriales.com
--by asd*

CREATE procedure WZ_GetItemSerial
as
BEGIN
DECLARE @ItemSerial int
set nocount on
begin transaction

update GameServerInfo set @ItemSerial = ItemCount = ItemCount+1

if(@@error <> 0)
begin
rollback transaction
select-1
end
else
begin
commit transaction
select @ItemSerial
end
END
GO

WZ_DISCONNECT_MEMB [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_DISCONNECT_MEMB

Procedimiento almacenado para versiones viejas de muonline
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE WZ_DISCONNECT_MEMB

@uid varchar(20)
AS
Begin

BEGIN TRANSACTION

SET NOCOUNT ON

IF EXISTS ( SELECT memb___id FROM MEMB_STAT WITH (READUNCOMMITTED)
WHERE memb___id = @uid )
Begin
UPDATE MEMB_STAT
SET DisConnectTM = (getdate()), connectstat = 0 WHERE memb___id = @uid
End
ELSE
Begin
INSERT INTO MEMB_STAT ( memb___id,DisConnectTM,connectstat) valueS (@uid,(getdate()),0)
End


IF(@@Error <> 0 )
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

SET NOCOUNT OFF
End


GO

WZ_CONNECT_MEMB [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_CONNECT_MEMB

Querry que contiene el procedimiento almacenado
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE WZ_CONNECT_MEMB

@uid varchar(20),
@server varchar(20),
@uip varchar(20)
AS

Begin

BEGIN TRANSACTION

SET NOCOUNT ON

IF EXISTS ( SELECT memb___id FROM MEMB_STAT WITH (READUNCOMMITTED)
WHERE memb___id = @uid )
Begin
UPDATE MEMB_STAT
SET ip = @uip , connectstat = 1 , servername = @server , ConnectTM = (getdate())
WHERE memb___id = @uid
End
ELSE
Begin
INSERT INTO MEMB_STAT ( memb___id,ip,connectstat,servername) values (@uid,@uip,1,@server )
End


IF(@@Error <> 0 )
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

SET NOCOUNT OFF
End


GO

WZ_CharInfoChange [0.97D+0.99B]

Bienvenidos a un nuevo tutorial, el siguiente procedimiento corresponde a la versión 0.97D+0.99B del MuOnline y se titula WZ_CharInfoChange

Querry con prodecimiento almacenado
--www.muonlinetutoriales.com
--by asd*

CREATE PROCEDURE WZ_CharInfoChange
@AdminId varchar(10),
@mess varchar(10),
@action varchar(50),
@AccId varchar(10),
@GameID varchar(16),
@gamenum int,
@unknow2 varchar(10),
@cLevel1 int,
@Up1 int,
@exp1 int,
@st1 int,
@dex1 int,
@vi1 int,
@en1 int,
@mlift1 int,
@dlift1 int,
@mmagic1 int,
@dmagic1 int,
@cLevel2 int,
@Up2 int,
@exp2 int,
@st2 int,
@dex2 int,
@vi2 int,
@en2 int,
@mlift2 int,
@dlift2 int,
@mmagic2 int,
@dmagic2 int

AS
begin
insert into MngModifyLog (ManagerID,AccountId,GameID,servernumber,LogText) values (@AdminId,@AccId,@GameID,@gamenum,@action)

insert into CharInfoModifyOrigin (cLevel,LevelUpPoint,Experience,Strength,Dexterity,Vitality,Energy,Life,MaxLife,Mana,MaxMana) valueS (@cLevel1,@Up1,@exp1,@st1,@dex1,@vi1,@en1,@mlift1,@dlift1,@mmagic1,@dmagic1)

insert into CharInfoModify (cLevel,LevelUpPoint,Experience,Strength,Dexterity,Vitality,Energy,Life,MaxLife,Mana,MaxMana) valueS (@cLevel2,@Up2,@exp2,@st2,@dex2,@vi2,@en2,@mlift2,@dlift2,@mmagic2,@dmagic2)

insert into CharInfoModify (cLevel,LevelUpPoint,Experience,Strength,Dexterity,Vitality,Energy,Life,MaxLife,Mana,MaxMana) valueS (@cLevel2,@Up2,@exp2,@st2,@dex2,@vi2,@en2,@mlift2,@dlift2,@mmagic2,@dmagic2)

update Character set cLevel=@cLevel2,LevelUpPoint=@Up2,Experience=@exp2,Strength=@st2,Dexterity=@dex2,Vitality=@vi2,Energy=@en2,Life=@mlift2,MaxLife=@dlift2,Mana=@mmagic2,MaxMana=@dmagic2 where AccountID=@AccId and Name=@GameId

end

GO