#Dv^ Posted June 9, 2016 Share Posted June 9, 2016 Hola! Perdón por la molestia, tengo este script que lo saqué de acá http://pastebin.com/HZqzVr1R Es un id System Lo que hace es que agrega una columna al scoreboard "ID" y cada jugador que entre se le asigna un numero, es decir si entra el primero tendrá el id "1" y luego si entra otro seguido de ese tendrá el id "2" y así sucesivamente, pero cuando el player que tenía la id "1" sale se le elimina y la obtendrá otro player que ingrese al servidor, así Pero lo que yo quiero es que cada cuenta de player tenga su propia id, estando o no en el servidor, que sea tipo como un contador de players, con sus propias ID´s, al salir y volver al entrar al servidor siempre tener mi propia id de cuenta No se si me explico Este es el script, no es mio solo lo saque de esta pagina http://pastebin.com/HZqzVr1R local availableID = { } -- Create the table that specifies which id's are available. local scoreboard local _dxver local _initp = true local _loaded = false function Init () if ( getResourceFromName ( "scoreboard" ) and getResourceState ( getResourceFromName ( "scoreboard" ) ) == "running" ) then scoreboard = exports.scoreboard _dxver = false elseif ( getResourceFromName ( "dxscoreboard" ) and getResourceState ( getResourceFromName ( "dxscoreboard" ) ) == "running" ) then scoreboard = exports.dxscoreboard _dxver = true else outputDebugString ( "No scoreboard resource has been started", 2 ) _initp = false end if _initp then scoreboard:addScoreboardColumn ( "ID", getRootElement(), 1, 0.05 ) -- Add the ID column sortScoreboard( "ID" ) end if not _loaded then loadID() end end addEventHandler ( "onResourceStart", resourceRoot, Init ) function loadID () _loaded = true local max_players = getMaxPlayers() for i = 1, max_players do table.insert ( availableID, i, true ) -- Populate the table. end for _, player in ipairs ( getElementsByType ( "player" ) ) do assignPlayerID ( player ) -- Assign an id to all players. end end function checkStoppedResource ( resource ) local rname = getResourceName ( resource ) local sres = tostring ( scoreboard ):gsub( "exports.","" ) if ( rname:lower() == sres:lower() ) then outputChatBox ( "falsed" ) _initp = false end end addEventHandler ( "onResourceStop", getRootElement(), checkStoppedResource ) function checkStartedResource ( resource ) if ( getResourceName ( resource ) == "scoreboard" or "dxscoreboard" and source ~= getResourceRootElement() ) then Init() end end addEventHandler ( "onResourceStart", getRootElement(), checkStartedResource )--]] function sortScoreboard( column ) if _dxvera and _initp then scoreboard:scoreboardSetSortBy ( column, true, getRootElement() ) end end function onJoin () -- Player joined --> assign ID. assignPlayerID ( source ) end addEventHandler ( "onPlayerJoin", getRootElement(), onJoin) function assignPlayerID ( player ) local s_id = 1 -- start at one while ( isIDAvailable ( s_id ) == false ) do -- is it available? if not, +1 & repeat. s_id = s_id + 1 end setElementData ( player, "ID", s_id ) -- available -> assign the ID to the player. sortScoreboard( "ID" ) availableID[ s_id ] = false -- set the id as not available. end function isIDAvailable ( id ) -- checks if the id is used or not. return availableID[id] end function onLeave () -- player left, remove ID, set as available. local s_id = getElementData ( source, "ID" ) availableID[ s_id ] = true removeElementData ( source, "ID" ) end addEventHandler ( "onPlayerQuit", getRootElement(), onLeave ) function removeData ( ) -- resource stopped, clear everything. for k, players in ipairs ( getElementsByType ( "player" )) do removeElementData ( players, "ID" ) end availableID = { } end addEventHandler ( "onResourceStop", resourceRoot, removeData ) function getNameMatches ( player_name ) i = 1 local matchingPlayers = { } if ( player_name ) then for k, player in ipairs ( getElementsByType ( "player" ) ) do local player_n = getPlayerName ( player ) local match = string.find ( string.lower( player_n ), string.lower ( player_name ) ) if ( match ) then table.insert ( matchingPlayers, i, player ) i = i + 1 end end if ( #matchingPlayers == 1 ) then return true, matchingPlayers[1] elseif ( #matchingPlayers > 1 ) then return true, matchingPlayers else return false, "None" end else return false, "Please enter a player name" end end function getPlayerFromPartialName ( source, player_name, script ) if ( player_name ) then local sucess, value = getNameMatches ( player_name ) if ( sucess ) then local matches = ( type ( value ) == "table" ) and #value or 1 if ( matches == 1 ) then if ( script ) then return value else local player_nick = getPlayerName ( value ) local player_id = getElementData ( value, "ID" ) outputChatBox ( "(" .. player_id .. ") " .. player_nick, source, 255, 255, 0 ) end else outputChatBox ( "Players matching your search are: ", source, 255, 255, 0 ) for k, player in ipairs ( value ) do local player_nick = getPlayerName ( value[k] ) local player_id = getElementData ( value[k], "ID" ) outputChatBox ( "(" .. player_id .. ") " .. player_nick, source, 255, 255, 0 ) end return true, true end else if ( script ) then return false else outputChatBox ( "Players matching your search are: ", source, 255, 255, 0 ) outputChatBox ( value, source, 255, 0, 0 ) end end end end function getPlayerFromID ( id ) for k, player in ipairs ( getElementsByType ( "player" ) ) do local p_id = getElementData ( player, "ID" ) if ( p_id == tonumber(id) ) then player_n = getPlayerName ( player ) return player, player_n end end return false, "No player has been found with the ID " .. id .. "." end function getPlayer ( source, input ) if ( tonumber ( input ) ) then local player, playername = getPlayerFromID ( tonumber(input) ) if ( player ) then return player else outputChatBox ( playername, source, 255, 0, 0 ) -- in this case, playername carries the error. It's just to minimize the amount of code if an error is ecountered. return false end else local player, multiple = getPlayerFromPartialName ( source, input, true ) if ( player and not multiple ) then return player elseif ( player and multiple ) then return false else outputChatBox ( "Player not found", source, 255, 0, 0 ) return false end end end function processIDCommands ( source, command, input ) if ( tonumber ( input ) ) then local player, playername = getPlayerFromID ( tonumber(input) ) if ( player ) then outputChatBox ( "Player that matches that id: ", source, 255, 255, 0 ) outputChatBox ( "(" .. input .. ") " .. playername, source, 255, 255, 0, true ) else outputChatBox ( playername, source, 255, 0, 0 ) -- in this case, playername carries the error. It's just to minimize the amount of code if an error is ecountered. end else local player = getPlayer ( source, input ) if ( player ) then outputChatBox ( "Player that matches that id: ", source, 255, 255, 0 ) outputChatBox ( "(" .. tostring ( getElementData ( player, "ID" ) ) .. ") " .. getPlayerName ( player ), source, 255, 255, 0, true ) end end end addCommandHandler ( "id", processIDCommands ) Link to comment
aka Blue Posted June 9, 2016 Share Posted June 9, 2016 ¿Su propia ID? Almacenalo en XML o SQL, personalmente recomiendo SQL. Link to comment
#Dv^ Posted June 9, 2016 Author Share Posted June 9, 2016 ¿Podrías darme un ejemplo? Gracias Link to comment
Enargy, Posted June 9, 2016 Share Posted June 9, 2016 Loopea getAccounts y usas el índice como una key y las almacenas. Link to comment
aka Blue Posted June 10, 2016 Share Posted June 10, 2016 No sabía que existía getAccounts Si no te quedo claro, es hacer un bucle con lo que retorna la función y el primero 'argumento', que es la key, ordenada numéricamente, la guardas como una 'ID'. for k, v in ipairs (getAccounts()) do local id = k outputChatBox ( "Jugador con ID: "..id ) end Esa función lo que haría es crear tantos textos en el chat como jugadores haya registrados en el servidor y saca sus id's utilizando el método que te dijo @Gaberiel Link to comment
MTA Team 0xCiBeR Posted June 11, 2016 MTA Team Share Posted June 11, 2016 Proba esto, lo escribí del movil comenta si te da algún error. function inicializar() for i, v in ipairs(getAccounts())do setAccountData(v,"id",i) end end addCommandHandler("crearids",inicializar)--Solo corre este comando 1 vez y ya nunca mas. addEventHandler("onPlayerLogin", root, function (_,acc) local id = getAccountData(acc,"id") if id then setElementData(source,"id",id) else local cCuentas = getAccounts() setAccountData(acc,"id",#cCuentas+1) setElementData(source,"id",#cCuentas+1) end end ) Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Eso lo agrego lo en el script que postee más arriba? Link to comment
aka Blue Posted June 11, 2016 Share Posted June 11, 2016 Lo que te ha escrito @.:CiBeR:. hace lo siguiente: /crearids Es el comando que les asigna una ID a las cuentas ya creadas en el servidor. Utilizalo solo una vez para asignarle las ids a las cuentas y luego puedes quitarlo. Y después ya te hizo el evento, que es, cuando el jugador se loguea, ya le asigna una ID. Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Si entiendo, pero debo ponerlo en un script aparte? Link to comment
aka Blue Posted June 11, 2016 Share Posted June 11, 2016 Si. Tipo idsystem o como quieras. Es que el scoreboard tiene su propio id system con su propio elementData que es ID, el que te pasó Ciber usa id, en minúsculas. Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Si me funciona bien, se los agradezco, pero ahora quiero reiniciar las ID´s, es decir que vuelva a empezar de 1 y empieza a contar de nuevo ¿Qué debería utilizar? ¿O como puedo eliminar todas las cuentas para que vuelvan a registrarse? Gracias Link to comment
Tomas Posted June 11, 2016 Share Posted June 11, 2016 Si me funciona bien, se los agradezco, pero ahora quiero reiniciar las ID´s, es decir que vuelva a empezar de 1 y empieza a contar de nuevo¿Qué debería utilizar? ¿O como puedo eliminar todas las cuentas para que vuelvan a registrarse? Gracias Desde la consola: start runcode run aclGroupAddObject(aclGetGroup("Admin"), "user.Console") run for i,v in ipairs(getAccounts()) do if ( getAccount("Console") ~= v ) then deleteAccount(v) end end Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Me sale esto #000000Nick executed command: aclGroupAddObject(aclGetGroup("Admin"), "user.Console")run for i,v in ipairs(getAccounts()) do if ( getAccount("Console") ~= v ) then deleteAccount(v) end end Error: [string "aclGroupAddObject(aclGetGroup("Admin"), "user.Console")run for ..."]:1: '=' expected near 'for' Link to comment
Tomas Posted June 11, 2016 Share Posted June 11, 2016 Me sale esto#000000Nick executed command: aclGroupAddObject(aclGetGroup("Admin"), "user.Console")run for i,v in ipairs(getAccounts()) do if ( getAccount("Console") ~= v ) then deleteAccount(v) end end Error: [string "aclGroupAddObject(aclGetGroup("Admin"), "user.Console")run for ..."]:1: '=' expected near 'for' Deja un espacio entre línea y línea (entre el ") run ) Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 No entendí ._. Tengo que abrir la consola "f8" y poner start runcode luego: run aclGroupAddObject(aclGetGroup("Admin"), "user.Console") y por ultimo: run for i,v in ipairs(getAccounts()) do if ( getAccount("Console") ~= v ) then deleteAccount(v) end end ¿Es así? Gracias por tu tiempo Link to comment
Enargy, Posted June 11, 2016 Share Posted June 11, 2016 No entendí ._.Tengo que abrir la consola "f8" y poner start runcode luego: run aclGroupAddObject(aclGetGroup("Admin"), "user.Console") y por ultimo: run for i,v in ipairs(getAccounts()) do if ( getAccount("Console") ~= v ) then deleteAccount(v) end end ¿Es así? Gracias por tu tiempo Si, pero no es deleteAccount sino removeAccount. Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Gracias! Funciono, pero aún así tengo la "Id=35" y quiero que empiece del 1 Link to comment
#Dv^ Posted June 11, 2016 Author Share Posted June 11, 2016 Olvidenlo, ya pude hacerlo con el SQLite, eliminé todas las cuentas desde allí Gracias Link to comment
Recommended Posts