Acá les dejo una guia de como programar un sistema de Deathmatch en Argentum Online 11.5.
El sistema es asi:
Mediante un Npc, se irá al deathmatch, una ves que estes hay y mueras tipear /SALIRDEATH. Si intentas hacerlo en otro mapa no te dejara. Cada vez que ingrese un usuario se lo dirá a todos, y al salir igual. Tiene un extra para ver cuantos usuarios hay. /INFODEATH. Jaja.
Prosigamos que tengo sueño, todo en el servidor:
Buscamos:
Código:
Guardiascaos = 8
Debajo ponemos:
Código:
Deathmath = 10
Es el 10, porque el nueve lo tengo en uso, ponelo como quieras porque lo lei desde tipo, no el número.
Ahora buscamos:
Código:
Case "/ONLINE"
'No se envia más la lista completa de usuarios
N = 0
For LoopC = 1 To LastUser
If UserList(LoopC).name <> "" And UserList(LoopC).flags.Privilegios <= PlayerType.Consejero Then
N = N + 1
End If
Next LoopC
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Número de usuarios: " & N & FONTTYPE_INFO)
Exit Sub
Debajo ponemos:
Código:
'Mithrandir - Deathmatch
Case "/DEATH"
'Estas muerto?
If UserList(UserIndex).flags.Muerto = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||¡¡Estas muerto!!" & FONTTYPE_INFO)
Exit Sub
End If
'Mithrandir
'Estas en death?
If UserList(UserIndex).flags.EnDeath = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||¡Ya te encuentras en deathmatch!" & FONTTYPE_INFO)
Exit Sub
End If
'Se asegura que el target es un npc
If UserList(UserIndex).flags.TargetNPC = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Primero tenes que seleccionar un personaje, hace click izquierdo sobre el." & FONTTYPE_INFO)
Exit Sub
End If
'Si no es el death no.
If Npclist(UserList(UserIndex).flags.TargetNPC).NPCtype <> eNPCType.Deathmath Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Primero debes hacer click sobre el organizador." & FONTTYPE_INFO)
Exit Sub
End If
'Distancia ^^
If Distancia(Npclist(UserList(UserIndex).flags.TargetNPC).Pos, UserList(UserIndex).Pos) > 3 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Estás demasiado lejos del organizador." & FONTTYPE_INFO)
Exit Sub
End If
'Si el mapa esta lleno, nos dice
If MapInfo(1).NumUsers = 10 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||El deathmath solo soporta 10 usuarios, espera un momento." & FONTTYPE_INFO)
Exit Sub
End If
'Estamos en deathmatch
Call WarpUserChar(UserIndex, 1, 50, 50, True)
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Has ingresado al deathmatch." & FONTTYPE_INFO)
Call SendData(SendTarget.ToAll, UserIndex, 0, "||" & UserList(UserIndex).name & " ha ingresado al deathmatch." & FONTTYPE_INFO)
UserList(UserIndex).flags.EnDeath = 1
'Mithrandir
Case "/INFODEATH"
'Avisamos los cuantos hay
If MapInfo(1).NumUsers = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente no hay usuarios en el deathmatch." & FONTTYPE_INFO)
ElseIf MapInfo(1).NumUsers = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente hay 1 usuario en deathmath" & FONTTYPE_INFO)
ElseIf MapInfo(1).NumUsers < 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente hay: " & MapInfo(1).NumUsers & " usuarios en deathmatch." & FONTTYPE_INFO)
Exit Sub
End If
'Mithrandir
'Salgamos que nos matan
Case "/SALIRDEATH"
If UserList(UserIndex).flags.EnDeath = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No estas en deathmatch." & FONTTYPE_INFO)
Else
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Has regresado a la ciudad." & FONTTYPE_INFO)
Call SendData(SendTarget.ToAll, UserIndex, 0, "||" & UserList(UserIndex).name & " se ha retirado del deathmatch." & FONTTYPE_INFO)
Call WarpUserChar(UserIndex, 1, 50, 50, True)
UserList(UserIndex).flags.EnDeath = 0
Exit Sub
End If
'Mithrandir - Deathmatch
Ahora, en el "/SALIR" agregamos debajo de:
Código:
If UserList(UserIndex).flags.Paralizado = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No puedes salir estando paralizado." & FONTTYPE_WARNING)
Exit Sub
End If
Lo siguiente:
Código:
If UserList(UserIndex).flags.EnDeath = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No puedes salir estando en deathmatch." & FONTTYPE_WARNING)
Exit Sub
End If
Ahora nos falta el flag Endeath, buscamos:
Código:
Paralizado As Byte
Debajo ponemos:
Código:
EnDeath As Byte
Buscamos:
Código:
UserList(UserIndex).flags.Navegando = CByte(UserFile.GetValue("FLAGS", "Navegando"))
Y arriba ponemos:
Código:
'Death - Mithrandir
UserList(UserIndex).flags.EnDeath = CByte(UserFile.GetValue("FLAGS", "EnDeath"))
Buscamos:
Código:
Call WriteVar(UserFile, "FLAGS", "Paralizado", CStr(UserList(UserIndex).flags.Paralizado))
Debajo ponemos:
Código:
'Death - Mithrandir
Call WriteVar(UserFile, "FLAGS", "EnDeath", CStr(UserList(UserIndex).flags.EnDeath))
Con esto ya leeria el flag, y esta todo declarado ahora solo falta crear el Npc. Que tiene que ser Npctype=10, y si pusieron otro pongan el número ese..
Muchas gracias. Espero que sirva.
El sistema es asi:
Mediante un Npc, se irá al deathmatch, una ves que estes hay y mueras tipear /SALIRDEATH. Si intentas hacerlo en otro mapa no te dejara. Cada vez que ingrese un usuario se lo dirá a todos, y al salir igual. Tiene un extra para ver cuantos usuarios hay. /INFODEATH. Jaja.
Prosigamos que tengo sueño, todo en el servidor:
Buscamos:
Código:
Guardiascaos = 8
Debajo ponemos:
Código:
Deathmath = 10
Es el 10, porque el nueve lo tengo en uso, ponelo como quieras porque lo lei desde tipo, no el número.
Ahora buscamos:
Código:
Case "/ONLINE"
'No se envia más la lista completa de usuarios
N = 0
For LoopC = 1 To LastUser
If UserList(LoopC).name <> "" And UserList(LoopC).flags.Privilegios <= PlayerType.Consejero Then
N = N + 1
End If
Next LoopC
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Número de usuarios: " & N & FONTTYPE_INFO)
Exit Sub
Debajo ponemos:
Código:
'Mithrandir - Deathmatch
Case "/DEATH"
'Estas muerto?
If UserList(UserIndex).flags.Muerto = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||¡¡Estas muerto!!" & FONTTYPE_INFO)
Exit Sub
End If
'Mithrandir
'Estas en death?
If UserList(UserIndex).flags.EnDeath = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||¡Ya te encuentras en deathmatch!" & FONTTYPE_INFO)
Exit Sub
End If
'Se asegura que el target es un npc
If UserList(UserIndex).flags.TargetNPC = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Primero tenes que seleccionar un personaje, hace click izquierdo sobre el." & FONTTYPE_INFO)
Exit Sub
End If
'Si no es el death no.
If Npclist(UserList(UserIndex).flags.TargetNPC).NPCtype <> eNPCType.Deathmath Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Primero debes hacer click sobre el organizador." & FONTTYPE_INFO)
Exit Sub
End If
'Distancia ^^
If Distancia(Npclist(UserList(UserIndex).flags.TargetNPC).Pos, UserList(UserIndex).Pos) > 3 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Estás demasiado lejos del organizador." & FONTTYPE_INFO)
Exit Sub
End If
'Si el mapa esta lleno, nos dice
If MapInfo(1).NumUsers = 10 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||El deathmath solo soporta 10 usuarios, espera un momento." & FONTTYPE_INFO)
Exit Sub
End If
'Estamos en deathmatch
Call WarpUserChar(UserIndex, 1, 50, 50, True)
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Has ingresado al deathmatch." & FONTTYPE_INFO)
Call SendData(SendTarget.ToAll, UserIndex, 0, "||" & UserList(UserIndex).name & " ha ingresado al deathmatch." & FONTTYPE_INFO)
UserList(UserIndex).flags.EnDeath = 1
'Mithrandir
Case "/INFODEATH"
'Avisamos los cuantos hay
If MapInfo(1).NumUsers = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente no hay usuarios en el deathmatch." & FONTTYPE_INFO)
ElseIf MapInfo(1).NumUsers = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente hay 1 usuario en deathmath" & FONTTYPE_INFO)
ElseIf MapInfo(1).NumUsers < 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Actualmente hay: " & MapInfo(1).NumUsers & " usuarios en deathmatch." & FONTTYPE_INFO)
Exit Sub
End If
'Mithrandir
'Salgamos que nos matan
Case "/SALIRDEATH"
If UserList(UserIndex).flags.EnDeath = 0 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No estas en deathmatch." & FONTTYPE_INFO)
Else
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Has regresado a la ciudad." & FONTTYPE_INFO)
Call SendData(SendTarget.ToAll, UserIndex, 0, "||" & UserList(UserIndex).name & " se ha retirado del deathmatch." & FONTTYPE_INFO)
Call WarpUserChar(UserIndex, 1, 50, 50, True)
UserList(UserIndex).flags.EnDeath = 0
Exit Sub
End If
'Mithrandir - Deathmatch
Ahora, en el "/SALIR" agregamos debajo de:
Código:
If UserList(UserIndex).flags.Paralizado = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No puedes salir estando paralizado." & FONTTYPE_WARNING)
Exit Sub
End If
Lo siguiente:
Código:
If UserList(UserIndex).flags.EnDeath = 1 Then
Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No puedes salir estando en deathmatch." & FONTTYPE_WARNING)
Exit Sub
End If
Ahora nos falta el flag Endeath, buscamos:
Código:
Paralizado As Byte
Debajo ponemos:
Código:
EnDeath As Byte
Buscamos:
Código:
UserList(UserIndex).flags.Navegando = CByte(UserFile.GetValue("FLAGS", "Navegando"))
Y arriba ponemos:
Código:
'Death - Mithrandir
UserList(UserIndex).flags.EnDeath = CByte(UserFile.GetValue("FLAGS", "EnDeath"))
Buscamos:
Código:
Call WriteVar(UserFile, "FLAGS", "Paralizado", CStr(UserList(UserIndex).flags.Paralizado))
Debajo ponemos:
Código:
'Death - Mithrandir
Call WriteVar(UserFile, "FLAGS", "EnDeath", CStr(UserList(UserIndex).flags.EnDeath))
Con esto ya leeria el flag, y esta todo declarado ahora solo falta crear el Npc. Que tiene que ser Npctype=10, y si pusieron otro pongan el número ese..
Muchas gracias. Espero que sirva.