×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • Guías y Tutoriales
  • /
  • [Tutorial] Sistema de Admins, Bans y comandos exclusivos
1 / 2 › »
[Tutorial] Sistema de Admins, Bans y comandos exclusivos
Hakureimouse
« Citoyen »
1381173600000
    • Hakureimouse#0000
    • Profil
    • Derniers messages
    • Tribu
#1
  2
Una de las cosas que más desea un líder en su tribu es tener control sobre lo que pasa en la misma, para mantener cierto orden o simplemente para ejercer sus poderes de dictador. Es por esa y varias razones que a veces se quiere tener privilegios especiales; ser admin de la sala, de la tribu, del minijuego.

En este tutorial pretendo mostrar y explicar, desde cero, la creación de un sistema de admins. Y además complementarlo con sus comandos exclusivos para admins y un sistema de ban para mandar a los malulos a recibir su castigo.


#1. Lista de admins

Para tener una lista de admins, es necesario tener una tabla donde almacenar los nombres de cada uno de los jugadores con privilegios de admin.

Existen diferentes formas de hacer esto pero la más sencilla es con una lista inicial, que se modifique directamente en el código.

a dit :
local admins = {"Hakureimouse", "Violetanose"}



#2. Comandos

Perfecto, tenemos una lista de admins, pero no hace nada. Ahora necesitamos un comando que agregue personas a esa lista. Para ello tendremos que hacer que nuestro script pueda leer varias palabras en un mismo comando, puesto que usaremos "!admin usuario" para agregar a alguien a la lista.

a dit :
function eventChatCommand (playerName, command)
args = {}
for arg in command:gmatch ("[^%s]+") do
table.insert (args, arg)
end
end

El código anterior lo encontrarás con frecuencia y te permite separar la cadena de texto "command" en cada palabra escrita. Cada palabra se guarda en la tabla args y para acceder a ellas simplemente usaremos args[número de la palabra]

En el caso de "!admin usuario", la primera palabra es admin y la otra el nombre del jugador. Estas serían args[1] y args[2], respectivamente.

Ahora creamos nuestro primer comando, dentro del código anterior:

a dit :
function eventChatCommand (playerName, command)
args = {}
for arg in command:gmatch ("[^%s]+") do
table.insert (args, arg)
end

if args[1] == "adminlist" then
local message = "Lista de admins: "
for _,adminName in pairs(admins) do
message = message .. adminName .. ", "
end
message = message:sub(1,-3) .. "."
ui.addPopup (0, 0, message, playerName, 300, 200, 200)
end
end

Si la primera palabra en el comando es "adminlist", se muestra la lista de los administradores actuales.


#3. Agregar admins

Si ahora quisiéramos agregar más personas a la lista de admins para entregarles privilegios, podemos crear el comando del que hablamos antes: "!admin nombreDeUsuario", de la siguiente forma, dentro del mismo código anterior:

a dit :
if args[1] == "adminlist" then
local message = "Lista de admins: "
for _,adminName in pairs(admins) do
message = message .. adminName .. ", "
end
message = message:sub(1,-3) .. "."
ui.addPopup (0, 0, message, playerName, 300, 200, 200)

elseif args[1] == "admin" and tfm.get.room.playerList[args[2]] then
table.insert (admins, args[2])
ui.addPopup (0, 0, "¡Ahora eres admin!", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ahora es admin!", playerName, 350, 200, 100)
end

En el bloque elseif que agregamos, primero se comprueba si el comando comienza con "admin" y luego se comprueba si la segunda palabra corresponde a un jugador existente en la sala.

Luego se agrega al usuario a la tabla/lista de admins, y se muestra por pantalla un mensaje tanto al usuario que lo agregó como al nuevo admin.


#4. Comprobar si un usuario es admin

Ahora necesitamos crear una función simple para comprobar si un jugador está o no en la lista de admins. Esto lo usaremos para todos los comandos exclusivos de admins. Esto va al final de todo el código:

a dit :
function isAdmin (playerName)
for _,adminName in pairs(admins) do
if playerName == adminName then return true end
end
return false
end


En primer lugar incorporaremos esta función en nuestro código anterior para evitar que se pueda agregar a la lista alguien que ya es admin:

a dit :
if isAdmin(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya es admin.", playerName, 350, 200, 100)
else
table.insert (admins, args[2])
ui.addPopup (0, 0, "¡Ahora eres admin!", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ahora es admin!", playerName, 350, 200, 100)
end

Y en segundo lugar haremos que el comando !admin solo pueda ser usando por alguien que ya es admin, de esta forma solo un administrador podrá agregar a otros a la lista:

if isAdmin(playerName) then
if isAdmin(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya es admin.", playerName, 350, 200, 100)
else
table.insert (admins, args[2])
ui.addPopup (0, 0, "¡Ahora eres admin!", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ahora es admin!", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end

De esta forma tenemos listo y completo nuestro primer comando exclusivo "!admin nombreDeUsuario". Y el código completo de eventChatCommand quedaría:

a dit :
function eventChatCommand (playerName, command)
args = {}
for arg in command:gmatch ("[^%s]+") do
table.insert (args, arg)
end

if args[1] == "adminlist" then
local message = "Lista de admins: "
for _,adminName in pairs(admins) do
message = message .. adminName .. ", "
end
message = message:sub(1,-3) .. "."
ui.addPopup (0, 0, message, playerName, 300, 200, 200)

elseif args[1] == "admin" and tfm.get.room.playerList[args[2]] then
if isAdmin(playerName) then
if isAdmin(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya es admin.", playerName, 350, 200, 100)
else
table.insert (admins, args[2])
ui.addPopup (0, 0, "¡Ahora eres admin!", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ahora es admin!", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end

end
end



#5. Añadir comandos exclusivos

Si quisiéramos añadir más comandos exclusivos de admin, solo tenemos que usar la función isAdmin. Tomemos de ejemplo un script para [url=https://paste.moepl.eu/view/44ec387f]congelar ratones[/quote] con un comando:

a dit :
elseif args[1] == "congelar" and tfm.get.room.playerList[args[2]] then
local mouse = tfm.get.room.playerList[args[2]]
tfm.exec.killPlayer (args[2])
tfm.exec.addShamanObject (54, mouse.x, mouse.y)

Para hacerlo exclusivo de admin y que solo ellos puedan congelar:

a dit :
elseif args[1] == "congelar" and tfm.get.room.playerList[args[2]] and isAdmin(playerName) then
local mouse = tfm.get.room.playerList[args[2]]
tfm.exec.killPlayer (args[2])
tfm.exec.addShamanObject (54, mouse.x, mouse.y)

Así de simple.


#6. Banear ratones

Ahora vamos a incluír en nuestro script un comando para banear. Los ratones baneados morirán automáticamente en cada ronda, si se trata de un minijuego no podrán jugar.

Primero creamos una nueva tabla que almacene la lista de baneados, al igual que la lista de admins. Y añadimos la siguiente línea arriba de todo nuevamente. Sin embargo esta lista estará vacía en un comienzo:

a dit :
local banlist = {}

Nuevamente haremos una función para comprobar si un jugador está baneado o no. La llamaremos isBanned:

a dit :
function isBanned (playerName)
for _,bannedName in pairs(banlist) do
if playerName == bannedName then return true end
end
return false
end

Ahora necesitamos un comando que agregue gente a la lista. Nótese que: el comando solo lo usarán los admins, solo se podrá banear a alguien si no está actualmente en la lista de baneados, y el comando contiene dos palabras. Según todo lo anterior el comando será bastante similar al comando !admin que hicimos anteriormente:

a dit :
elseif args[1] == "ban" and tfm.get.room.playerList[args[2]] then
if isAdmin (playerName) then
if isBanned(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya está baneado.", playerName, 350, 200, 100)
else
table.insert (banlist, args[2])
ui.addPopup (0, 0, "¡Has sido baneado! ):", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ha sido baneado! :):)", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end

Bastante similar al otro comando, ¿no? Ahora tenemos un comando ban completamente funcional, solo que... aún no les ocurre nada a los baneados.

Ahora haremos que al inicio de cada ronda los jugadores en la lista de baneados se mueran. También haremos que se mueran al respawnear y al entrar a la sala; esto será útil especialmente en la casa de la tribu.

Simplemente agregamos estas 3 funciones al final de todo, puesto que aún no hemos creado estos eventos:

a dit :
function eventNewGame (playerName)
for _,playerName in pairs(banlist) do
tfm.exec.killPlayer(playerName);
end
end

function eventNewPlayer (playerName)
if isBanned(playerName) then
tfm.exec.killPlayer(playerName);
end
end

function eventPlayerRespawn (playerName)
if isBanned(playerName) then
tfm.exec.killPlayer(playerName);
end
end



#6. Detalles

Ahora hay varios detalles que mejorar. En primer lugar hay que impedirle a los baneados utilizar cualquier comando. Esto se puede lograr fácilmente haciendo que se detenga la función eventChatCommand al inicio si el jugador está baneado:

a dit :
function eventChatCommand (playerName, command)
if isBanned(playerName) then return end

args = {}
-El resto del código-...

Nota: return inmediatamente termina una función, devolviendo o no un valor. En este caso no devuelve nada y simplemente pone fin a eventChatCommand.

Otro detalle a corregir es que al momento de banear a un usuario, este muera inmediatamente. Simplemente agregamos una línea para matar al jugador, dentro del comando ban:

a dit :
table.insert (banlist, args[2])
tfm.exec.killPlayer(args[2]);
ui.addPopup (0, 0, "¡Has sido baneado! ):", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ha sido baneado! :):)", playerName, 350, 200, 100)

Un detalle importante además es que no se pueda ser admin y baneado al mismo tiempo, aunque al igual que todo; esto es opcional, dependiendo de las necesidades de tu script o minijuego.

Lo que haremos es modificar ambos comandos, admin y ban, para comprobar que el jugador no esté en la otra lista antes de agregarlo:

a dit :
elseif args[1] == "admin" and tfm.get.room.playerList[args[2]] then
if isAdmin(playerName) then
if isAdmin(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya es admin.", playerName, 350, 200, 100)
elseif isBanned(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." está banead@.", playerName, 350, 200, 100)
else
table.insert (admins, args[2])
ui.addPopup (0, 0, "¡Ahora eres admin!", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ahora es admin!", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end

elseif args[1] == "ban" and tfm.get.room.playerList[args[2]] then
if isAdmin (playerName) then
if isBanned(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." ya está baneado.", playerName, 350, 200, 100)
elseif isAdmin(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." es un admin.", playerName, 350, 200, 100)
else
table.insert (banlist, args[2])
tfm.exec.killPlayer(args[2]);
ui.addPopup (0, 0, "¡Has sido baneado! ):", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ha sido baneado! :):)", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end



#7. Desbanear

Y probablemente hayas pensado en este detalle: el comando !unban
El comando !unban nuevamente será similar a los otros dos comandos:

a dit :
elseif args[1] == "unban" and tfm.get.room.playerList[args[2]] then
if isAdmin (playerName) then
if not isBanned(args[2]) then
ui.addPopup (0, 0, "Error: "..args[2].." no está baneado.", playerName, 350, 200, 100)
else
for i,bannedName in pairs(banlist) do
if args[2] == bannedName then
table.remove (banlist, i)
break
end
end
ui.addPopup (0, 0, "¡Has sido desbaneado! ):", args[2], 350, 200, 100)
ui.addPopup (1, 0, "¡"..args[2].." ha sido desbaneado! :):)", playerName, 350, 200, 100)
end
else
ui.addPopup (0, 0, "Error: solo los admins pueden usar este comando", playerName, 350, 200, 100)
end

Si el jugador no está baneado no se puede desbanear, entregando un error. Luego se busca en la lista de baneados al elemento que encaje con el nombre, y se remueve de la lista.



#Fin

Eso concluye este tutorial para un sistema de administración para usar comandos exclusivos. Y un sistema de ban que funciona integramente con el de los admins.

El trabajo no acaba acá pues puedes seguir editando detalles y arreglándolo a tu antojo. Además ahora puedes agregar los comandos que quieras y hacerlos exclusivos para administradores.

A continuación dejo el código completo tras seguir todos los pasos de esta guía:
https://paste.moepl.eu/view/eb3dfac0

Espero que les sirva y que puedan incorporarlo en sus proyectos, minijuegos o scripts varios de la tribu, para controlar mejor a los jugadores.

~ Haku
Gaston
« Censeur »
1381173720000
    • Gaston#1499
    • Profil
    • Derniers messages
    • Tribu
#2
  0
Excelente hilo Haku, ¡será de mucha ayuda!
Hakureimouse
« Citoyen »
1381173960000
    • Hakureimouse#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Gastuu a dit :
Excelente hilo Haku, ¡será de mucha ayuda!

o/

Intenté buscar un punto medio entre explicar las cosas y no explicar demasiado. Aún así quedó mucho sin explicar completamente así que si alguien tiene una duda y quiere saber cómo se hizo tal cosa o cómo funciona, siéntase libre de preguntar.
Zutto
« Citoyen »
1381175160000
    • Zutto#4451
    • Profil
    • Derniers messages
    • Tribu
#4
  0
Hakku seria mejor como te dije un hilo para tus scripts :c

igualmente HAKU PRO!
Foorero
« Citoyen »
1381193700000
    • Foorero#0000
    • Profil
    • Derniers messages
    • Tribu
#5
  0
Hakureimouse a dit :
[url=https://paste.moepl.eu/view/44ec387f]congelar ratones




º-º
Buen Tutorial Haku! Sigue así:3
Xdmanuxd
« Citoyen »
1381267020000
    • Xdmanuxd#0000
    • Profil
    • Derniers messages
    • Tribu
#6
  0
Me gustan tu tutoriales :$ sigue asi Haku
Isaacmanda
« Citoyen »
1381651920000
    • Isaacmanda#0000
    • Profil
    • Derniers messages
    • Tribu
#7
  0
como hago este codigo solo para admins,
a dit :

for name,player in pairs(tfm.get.room.playerList) do
system.bindMouse(name, true)
end

function eventMouse(name, x, y)
tfm.exec.movePlayer(name, x, y, false, 0, 1, false)
end

 
Hakureimouse
« Citoyen »
1381714260000
    • Hakureimouse#0000
    • Profil
    • Derniers messages
    • Tribu
#8
  0
Isaacmanda a dit :
como hago este codigo solo para admins,

 

a dit :
for name,player in pairs(tfm.get.room.playerList) do
system.bindMouse(name, true)
end

function eventMouse(name, x, y)
if isAdmin (name) then
tfm.exec.movePlayer(name, x, y, false, 0, 1, false)
end
end

Para cualquier otra cosa basta con usar isAdmin para ver si el nombre está en la lista de admins.
Isaacmanda
« Citoyen »
1382385240000
    • Isaacmanda#0000
    • Profil
    • Derniers messages
    • Tribu
#9
  0
Hakureimouse a dit :
Para cualquier otra cosa basta con usar isAdmin para ver si el nombre está en la lista de admins.

gracias ya le entendi :O
Hfaundez
« Citoyen »
1383318000000
    • Hfaundez#0000
    • Profil
    • Derniers messages
    • Tribu
#10
  0
Como pongo los comandos solo para admins?
Alejandroalf
« Citoyen »
1383410400000
    • Alejandroalf#0000
    • Profil
    • Derniers messages
    • Tribu
#11
  0
oye y si un raton esta baneado uno mismo lo desbanea o que¿
Rodrielgenio
1383412440000
    • Rodrielgenio#0000
    • Profil
    • Derniers messages
    • Tribu
#12
[Modéré par Modogrande]
Deusvult
« Citoyen »
1383794160000
    • Deusvult#4895
    • Profil
    • Derniers messages
#13
  0
Me has ayudado a manetener el orden en mi tribu! Eres la ley!
Rodrielgenio
1388270160000
    • Rodrielgenio#0000
    • Profil
    • Derniers messages
    • Tribu
#14
[Modéré par Rowne, raison : Spam]
Migayhp
1388284380000
    • Migayhp#0000
    • Profil
    • Derniers messages
#15
[Modéré par Rowne, raison : Spam]
Alejocapocr
« Citoyen »
1389288060000
    • Alejocapocr#0000
    • Profil
    • Derniers messages
#16
  0
Los scripts estan mal, ninguno me andubo
Haku
« Sénateur »
1389295080000
    • Haku#0807
    • Profil
    • Derniers messages
#17
  0
Alejocapocr a dit :
Los scripts estan mal, ninguno me andubo

En este hilo solo hay 1 script.
Jootttaa
« Citoyen »
1389326700000
    • Jootttaa#0000
    • Profil
    • Derniers messages
    • Tribu
#18
  0
Si lo creaste tú, te felicito porque esta perfecto!
Eljonas
1389442680000
    • Eljonas#0000
    • Profil
    • Derniers messages
#19
[Modéré par Modogrande]
Alejocapocr
« Citoyen »
1390512000000
    • Alejocapocr#0000
    • Profil
    • Derniers messages
#20
  0
Hinakagiyama a dit :
En este hilo solo hay 1 script.

Hay mas de 1, Admins, Bans, +bonus ._.
  • Forums
  • /
  • Transformice
  • /
  • Modules
  • /
  • Guías y Tutoriales
  • /
  • [Tutorial] Sistema de Admins, Bans y comandos exclusivos
1 / 2 › »
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27