Portal SAMP
[Ajuda] sistema com id fixo do mysql... - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] sistema com id fixo do mysql... (/showthread.php?tid=4732)

Páginas: 1 2 3


RE: sistema com id fixo do mysql... - pushline - 06/05/2024

O "u" do sscanf retorna ID DO JOGO, não do seu dof2. você deveria voltar o IDFIXO do arquivo do player lá do dof2 usando esse idfixo do sscanf, e alterando o valor do idfixo pra esse novo que você retornou, e após a mudança de valor você usar o IsPlayerConnectedSQLID (faz nem sentido ser SQLID/mysql já que vc usa dof2).


RE: sistema com id fixo do mysql... - Cyclopeta - 06/05/2024

NO caso, no lugar do "u" teria que colocar como??, no caso o dof2 é so pra salvar as cadeia mesmo, o negocio é que so quero verificars se on ou off pelo id fixo, somente isso, o dof2 nao tem nada haver com a verificaçao se ta on ou nao, pois acho q n atrapalhada em nada. se caso estiver errado, me corriga.....ai ficaria como o comando?


RE: sistema com id fixo do mysql... - BitSain - 06/05/2024

(06/05/2024 21:13)Cyclopeta Escreveu: NO caso, no lugar do "u" teria que colocar como??, no caso o dof2 é so pra salvar as cadeia mesmo, o negocio é que so quero verificars se on ou off pelo id fixo, somente isso, o dof2 nao tem nada haver com a  verificaçao se ta on ou nao, pois acho q n atrapalhada em nada. se caso estiver errado, me corriga.....ai ficaria como o comando?

Tem bastante "erro" nesse seu código...
Teria que reformular todo o comando, me aguarde que eu irei prontear esse comando pra você pq como o pushline disse, o 'u' retorna o id do jogador, e você tá usando o 'id fixo e o id do samp' e uma única variavel.


RE: sistema com id fixo do mysql... - BitSain - 06/05/2024

Código devidamente atualizado:

Código PHP:
stock IsPlayerConnectedSQLID(sqlid) {
    for(new 0GetPlayerPoolSize(); <= ji++) {
        if(IsPlayerConnected(i)) {
            if(pDados[i][IDFIXO] == sqlid) {
                return 1;
            }
        }
    }
    return 0;
}

stock GetPlayerID(sqlid){
    for(new 
0GetPlayerPoolSize(); <= ji++) {
        if(IsPlayerConnected(i)) {
            if(pDados[i][IDFIXO] == sqlid) {
                return i//retorna o ID do player
            }
        }
    }
    return -1//retorna 'id invalido'
}

CMD:prender(playeridparams[])
{
    if(!IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1)  
        
return SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Você não tem autorização.");

    new IDFIXOminutosmotivo[50 1];
    if(sscanf(params"dds[50]"IDFIXOminutosmotivo))
        return SendClientMessage(playerid, -1"{FA5858}[ERRO]: {FFFFFF}Use /prender [ID] [Minutos] [Motivo]. {DC143C}NÃO COLOQUE O TEMPO ACIMA DA TABELA, OU TOMARÁ PUNIÇÃO.");

    if(!IsPlayerConnectedSQLID(IDFIXO))
        return SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Este jogador não está online ou não possui o ID correspondente.");

    new id GetPlayerID(IDFIXO);
    // if(id == -1) return SendClientMessage(playerid, -1, "{FA5858}Erro: {FFFFFF}ID inválido. (-1)");

    // Verifica se o jogador já está preso
    if(pDados[id][PresoAdmin] == 1)
        return SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Este jogador já está preso.");

    // Restante do código...

    // Marca o jogador como preso
    pDados[id][PresoAdmin] = 1;

    // Calcular horas, minutos e segundos
    new horassegundos;
    horas minutos 60;
    segundos minutos 60;
    minutos %= 60;
    
    pDados
[id][HorasAdmin] = horas;
    pDados[id][MinutosAdmin] = minutos;
    pDados[id][SegundosAdmin] = segundos;
    
    
// Diretório para salvar informações da prisão
    new pasta[50];
    format(pastasizeof(pasta), "Cadeias/%s.ini"pName(id));
    DOF2_CreateFile(pasta);
    DOF2_SetInt(pasta"Horas"horas);
    DOF2_SetInt(pasta"Minutos"minutos);
    DOF2_SetInt(pasta"Segundos"segundos);
    DOF2_SetString(pasta"Motivo"motivo);
    DOF2_SetString(pasta"Admin"pName(playerid));
    
    
// Formatando a string de tempo
    new str[50];
    format(strsizeof(str), "%02d:%02d:%02d"horasminutossegundos);
    PlayerTextDrawSetString(playeridText_Timer[id][0], str);

    PlayerTextDrawShow(idText_Timer[id][0]);
    TimerCadeia[id] = SetTimerEx("SairCadeia"1000true"d"id);
    
    
// Posição da prisão
    SetPlayerPos(id1412.14, -2.281000.92);
    SetPlayerInterior(id1);
    
    
// Obter data atual
    new AnoMesDia;
    getdate(AnoMesDia);
    format(strsizeof(str), "%02d/%02d/%d"DiaMesAno);
    DOF2_SetString(pasta"Data"str);
    
    
// Mensagem para todos os jogadores sobre a prisão
    new msgcadeia[140];
    format(msgcadeiasizeof(msgcadeia), "{FF6347}[CADEIA]: O Admin %s prendeu o Player %s no Quadradao. Por [%d] Minutos. Motivo: %s"pName(playerid), pName(id), minutos horas 60motivo);
    SendClientMessageToAll(-1msgcadeia);
    return true;




RE: sistema com id fixo do mysql... - pushline - 07/05/2024

Não recomendo usar GetPlayerPoolSize pois a função é quebrada, mude para o loop do MAX_PLAYERS:

Código PHP:
stock IsPlayerConnectedSQLID(sqlid) {
    for(new 
0<= MAX_PLAYERSi++) {
        if(
IsPlayerConnected(i)) {
            if(
pDados[i][IDFIXO] == sqlid) {
                return 
1;
            }
        }
    }
    return 
0;
}

stock GetPlayerID(sqlid){
    for(new 
0<= MAX_PLAYERSi++) {
        if(
IsPlayerConnected(i)) {
            if(
pDados[i][IDFIXO] == sqlid) {
                return 
i//retorna o ID do player
            
}
        }
    }
    return -
1//retorna 'id invalido'


E o começo do comando prender pode ser arrumado pra assim:

Código PHP:
CMD:prender(playeridparams[])
{
    if(!
IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1)  
        return 
SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Você não tem autorização.");

    new 
IDFIXOminutosmotivo[50 1];
    if(
sscanf(params"dds[50]"IDFIXOminutosmotivo))
        return 
SendClientMessage(playerid, -1"{FA5858}[ERRO]: {FFFFFF}Use /prender [ID] [Minutos] [Motivo]. {DC143C}NÃO COLOQUE O TEMPO ACIMA DA TABELA, OU TOMARÁ PUNIÇÃO.");

    new 
id GetPlayerID(IDFIXO);
    if(
id == -||!IsPlayerConnected(id)) 
        return 
SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}ID inválido / Jogador não online ou não possui o ID correspondente.");
  
    
// ... 



RE: sistema com id fixo do mysql... - Cyclopeta - 08/05/2024

coloquei la, mais continua dando cadeia pelo id do tab e do id fixo do mysql,q é de 1 em diante. como deixa so pro id fixo?


RE: sistema com id fixo do mysql... - pushline - 08/05/2024

testa isso:

Código PHP:
GetPlayerID(sqlid){
    for(new 
0<= MAX_PLAYERSi++) {
        if(
IsPlayerConnected(i)) {
            if(
pDados[i][IDFIXO] == sqlid) {
                return 
i//retorna o ID do player logado
            
}
        }
    }
    return 
0//retorna 'id invalido'


CMD:prender(playeridparams[])
{
    if(!
IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1)  
        return 
SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Você não tem autorização.");

    new 
IDFIXOminutosmotivo[50 1];
    if(
sscanf(params"dds[50]"IDFIXOminutosmotivo))
        return 
SendClientMessage(playerid, -1"{FA5858}[ERRO]: {FFFFFF}Use /prender [ID] [Minutos] [Motivo]. {DC143C}NÃO COLOQUE O TEMPO ACIMA DA TABELA, OU TOMARÁ PUNIÇÃO.");

    new 
query[512];
    
    
// username é ficticio
    
mysql_format(MYSQL_DEFAULT_HANDLEquerysizeof(query), "SELECT * FROM tabela_de_contas WHERE id = %d"IDFIXO);
    
mysql_query(MYSQL_DEFAULT_HANDLEquery"PrenderPlayer""iiis"playeridIDFIXOminutosmotivo);

    return 
1;


forward PrenderPlayer(playeridIDFIXOminutosmotivo[]);
public 
PrenderPlayer(playeridIDFIXOminutosmotivo[])
{
    if(!
cache_num_rows())
        return 
printf("Jogador inexistente via ID procurado.")

    new 
tabID GetPlayerID(IDFIXO);
    if(!
tabID) return SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}ID inválido ou jogador não conectado.");

    
// Verifica se o jogador já está preso
    
if(pDados[tabID][PresoAdmin] == 1)
        return 
SendClientMessage(playerid, -1"{FA5858}Erro: {FFFFFF}Este jogador já está preso.");

    
// Marca o jogador como preso
    
pDados[tabID][PresoAdmin] = 1;

    
// Calcular horas, minutos e segundos
    
new horassegundos;
    
horas minutos 60;
    
segundos minutos 60;
    
minutos %= 60;
    
    
pDados[tabID][HorasAdmin] = horas;
    
pDados[tabID][MinutosAdmin] = minutos;
    
pDados[tabID][SegundosAdmin] = segundos;
    
    
// Diretório para salvar informações da prisão
    
new pasta[50];
    
format(pastasizeof(pasta), "Cadeias/%s.ini"pName(tabID));
    
DOF2_CreateFile(pasta);
    
DOF2_SetInt(pasta"Horas"horas);
    
DOF2_SetInt(pasta"Minutos"minutos);
    
DOF2_SetInt(pasta"Segundos"segundos);
    
DOF2_SetString(pasta"Motivo"motivo);
    
DOF2_SetString(pasta"Admin"pName(playerid));
    
    
// Formatando a string de tempo
    
new str[50];
    
format(strsizeof(str), "%02d:%02d:%02d"horasminutossegundos);
    
PlayerTextDrawSetString(playeridText_Timer[tabID][0], str);

    
PlayerTextDrawShow(tabIDText_Timer[tabID][0]);
    
TimerCadeia[tabID] = SetTimerEx("SairCadeia"1000true"d"id);
    
    
// Posição da prisão
    
SetPlayerPos(tabID1412.14, -2.281000.92);
    
SetPlayerInterior(tabID1);
    
    
// Obter data atual
    
new AnoMesDia;
    
getdate(AnoMesDia);
    
format(strsizeof(str), "%02d/%02d/%d"DiaMesAno);
    
DOF2_SetString(pasta"Data"str);
    
    
// Mensagem para todos os jogadores sobre a prisão
    
new msgcadeia[140];
    
format(msgcadeiasizeof(msgcadeia), "{FF6347}[CADEIA]: O Admin %s prendeu o Player %s no Quadradao. Por [%d] Minutos. Motivo: %s"pName(playerid), pName(tabID), minutos horas 60motivo);
    
SendClientMessageToAll(-1msgcadeia);

    return 
1;




RE: sistema com id fixo do mysql... - Cyclopeta - 09/05/2024

Continua dando cadeia pelo id do tab la e nao pelo id do banco de dados, e tbm deu pa de erros


RE: sistema com id fixo do mysql... - pushline - 09/05/2024

Tem que dar cadeia pelo ID do tab por que justamente é pra referenciar ao playerid específico pra ser teleportado pra prisão. Não tens como fazer de outra forma (isso é se o player estiver online, se quiseres fazer offline posso alterar o comando).
E tu falar que deu uma pá de erros sem nem falar que erros são não ajuda tmb.


RE: sistema com id fixo do mysql... - samuelmatheus0502 - 09/05/2024

@Cyclopeta essa variável IDFIXO, dessa linha "new IDFIXO, minutos, motivo[50 + 1];" você deve carregar ela quando o player entra.

Exeplo cria uma variável IdFixoPlayer[MAX_PLAYERS];
seta o IdFixo para o player com essa função que você tem.

E no comando você puxa essas informações, porquem você ta tentando pegar o idFixo no proprio comando, só que no comando você faz a busca através do playerid e não através de um loop

Meu amigo fiz esse código bem rápido e extremamente genérico porém está funcional, espero que ajude no sentido de lógica, pois eu uso STRCMP para fazer comandos e não sou muito familiarizado no ZCMD, mas é só converter e acredito que você consiga fazer isso na boa, ou o pessoal consegue te ajudar facilmente:
Topo do GM
Código:
new idFixoPlayer[MAX_PLAYERS]; // isso é porque é de maneira genérica, mas você deve ter o objeto player aí que conversa com seu banco de dados para puxar e setar essas infos de la
Na OnPlayerConnect setei o idFixo do player de maneira extremamente genérica, você terá que pegar esse idFixo que você setou lá no seu banco de dados:
Código:
public OnPlayerConnect(playerid)
{
        idFixoPlayer[playerid] = playerid + 7;
    return 1;
}

Na OnPlayerDisconnect eu fiz a limepza de dados da variável
Código:
public OnPlayerDisconnect(playerid, reason)
{
      idFixoPlayer[playerid] = 0;
      return 1;
}

Função de verificar se o player idFixo está conectado, no caso aquele que será digitado la no comando!(legal adicionar ao final do seu gamemode, você também já sabe disso)
Código:
getIdFixo(id) // 7
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i) && idFixoPlayer[i] == id)
    {
        return 1;
    }
}
return -255;
}

E o comando propriamente dito, espero que sirva lógicamente porque eu não fiz em ZCMD
Código:
if(strcmp("/prender", cmd, true) == 0)
    {
        if(PlayerInfo[playerid][pAdmin] == PLAYER_DONO) // isso tbm é meu mude para o seu se quiser ou remova
        {
            tmp = strtok(cmdtext, idx);
            if(!strlen(tmp))return SendClientMessage(playerid, vermelho, "/prender [IDFIXO]");

            new i = strval(tmp);
            if(i > 5000)return SendClientMessage(playerid, vermelho, "Os ID's fixos vão de 1 a 5000");

            new idPlayer = getIdFixo(i);
            if(idPlayer == -255) return SendClientMessage(playerid, vermelho, "O jogador está offline");

            new stringtp[256];
            format(stringtp, sizeof(stringtp),"{5858FA}[Presos] {ffffff}O %s prendeu o jogador ID %d",namePlayer(playerid), i);
            SendClientMessage(playerid, -1, stringtp);
            return 1;
        } else {
            //commandError(playerid); isso é do meu GM desconsidera
            return 1;
        }
    }

Com essa lógica da para fazer umas funções legais, exemplo: pegar o nome do player através do id unico etc

Da minha meneira genérica de fazer os ids fixo ficou o playerid + 7, no caso ID 0 > IdFixo = 7, ID 1 > IdFixo = 8 e assim vai meu amigo

E obviamente tem que fazer a função de prender de acordo que a você tem aí, eu só coloquei uma mensagem para servir de debug mesmo para ver se funcionou

Outra coisa também meu amigo, essa função está só sendo executada se o player tiver online, mas da para fazer também se ele estiver offiline, se for um sistema de prisão ADM por exemplo, mas para isso teria que fazer uma verificação no seu banco de dados se esse ID existe ao invés de verificar se ele está online.