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 i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if(IsPlayerConnected(i)) { if(pDados[i][IDFIXO] == sqlid) { return 1; } } } return 0; }
stock GetPlayerID(sqlid){ for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) { if(IsPlayerConnected(i)) { if(pDados[i][IDFIXO] == sqlid) { return i; //retorna o ID do player } } } return -1; //retorna 'id invalido' }
CMD:prender(playerid, params[]) { if(!IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1) return SendClientMessage(playerid, -1, "{FA5858}Erro: {FFFFFF}Você não tem autorização.");
new IDFIXO, minutos, motivo[50 + 1]; if(sscanf(params, "dds[50]", IDFIXO, minutos, motivo)) 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 horas, segundos; 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(pasta, sizeof(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(str, sizeof(str), "%02d:%02d:%02d", horas, minutos, segundos); PlayerTextDrawSetString(playerid, Text_Timer[id][0], str);
PlayerTextDrawShow(id, Text_Timer[id][0]); TimerCadeia[id] = SetTimerEx("SairCadeia", 1000, true, "d", id); // Posição da prisão SetPlayerPos(id, 1412.14, -2.28, 1000.92); SetPlayerInterior(id, 1); // Obter data atual new Ano, Mes, Dia; getdate(Ano, Mes, Dia); format(str, sizeof(str), "%02d/%02d/%d", Dia, Mes, Ano); DOF2_SetString(pasta, "Data", str); // Mensagem para todos os jogadores sobre a prisão new msgcadeia[140]; format(msgcadeia, sizeof(msgcadeia), "{FF6347}[CADEIA]: O Admin %s prendeu o Player %s no Quadradao. Por [%d] Minutos. Motivo: %s", pName(playerid), pName(id), minutos + horas * 60, motivo); SendClientMessageToAll(-1, msgcadeia); 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 i = 0; i <= MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { if(pDados[i][IDFIXO] == sqlid) { return 1; } } } return 0; }
stock GetPlayerID(sqlid){ for(new i = 0; i <= MAX_PLAYERS; i++) { 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(playerid, params[]) { if(!IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1) return SendClientMessage(playerid, -1, "{FA5858}Erro: {FFFFFF}Você não tem autorização.");
new IDFIXO, minutos, motivo[50 + 1]; if(sscanf(params, "dds[50]", IDFIXO, minutos, motivo)) 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 == -1 ||!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 i = 0; i <= MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { if(pDados[i][IDFIXO] == sqlid) { return i; //retorna o ID do player logado } } } return 0; //retorna 'id invalido' }
CMD:prender(playerid, params[]) { if(!IsPlayerAdmin(playerid) && pDados[playerid][Admin] < 1) return SendClientMessage(playerid, -1, "{FA5858}Erro: {FFFFFF}Você não tem autorização.");
new IDFIXO, minutos, motivo[50 + 1]; if(sscanf(params, "dds[50]", IDFIXO, minutos, motivo)) 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_HANDLE, query, sizeof(query), "SELECT * FROM tabela_de_contas WHERE id = %d", IDFIXO); mysql_query(MYSQL_DEFAULT_HANDLE, query, "PrenderPlayer", "iiis", playerid, IDFIXO, minutos, motivo);
return 1; }
forward PrenderPlayer(playerid, IDFIXO, minutos, motivo[]); public PrenderPlayer(playerid, IDFIXO, minutos, motivo[]) { 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 horas, segundos; 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(pasta, sizeof(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(str, sizeof(str), "%02d:%02d:%02d", horas, minutos, segundos); PlayerTextDrawSetString(playerid, Text_Timer[tabID][0], str);
PlayerTextDrawShow(tabID, Text_Timer[tabID][0]); TimerCadeia[tabID] = SetTimerEx("SairCadeia", 1000, true, "d", id); // Posição da prisão SetPlayerPos(tabID, 1412.14, -2.28, 1000.92); SetPlayerInterior(tabID, 1); // Obter data atual new Ano, Mes, Dia; getdate(Ano, Mes, Dia); format(str, sizeof(str), "%02d/%02d/%d", Dia, Mes, Ano); DOF2_SetString(pasta, "Data", str); // Mensagem para todos os jogadores sobre a prisão new msgcadeia[140]; format(msgcadeia, sizeof(msgcadeia), "{FF6347}[CADEIA]: O Admin %s prendeu o Player %s no Quadradao. Por [%d] Minutos. Motivo: %s", pName(playerid), pName(tabID), minutos + horas * 60, motivo); SendClientMessageToAll(-1, msgcadeia);
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.
|