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