Um contato do Skype me pediu para fazer. Ele iria fechar o pagamento mas o individuo não fez mais contato.
Por este motivo vou postar aqui para todos terem acesso ao script que é ótimo para servidores de drift
Não se esqueça de criar a pasta Rank dentro de scriptfiles
Autoria
Bruno da Silva por ter ministrado todo projeto.
MadeMan pela função IsCarVehicle
Y_less pela função sscanf
TugaBR e Gustavo Araujo pelos testes !!
Por este motivo vou postar aqui para todos terem acesso ao script que é ótimo para servidores de drift
Demonstração:
Fiz o contador tentando imitar NSF. Mas não saiu muito original, mas já vale a pena.
Comandos:
/ranking
Vê o ranking dos melhores caras que mais fazem drift. É tudo salvo, pega mesmo que o jogador esteja offline!
/aceitar
Aceita um desafio
/desafiar [id] [valor]
Desafia alguém para um duelo de racing
/recusar
Recusa o desafio
/cancelardesafio
Quem envio o desafio quiser cancelar
/estilo
Muda o estilo do contador de drift
CÓDIGO:
Está pendente de modificações com relação a possíveis bugs no código. O sistema de desafios não foi testado, mas suponho que esteja tudo okay.
/ranking
Vê o ranking dos melhores caras que mais fazem drift. É tudo salvo, pega mesmo que o jogador esteja offline!
/aceitar
Aceita um desafio
/desafiar [id] [valor]
Desafia alguém para um duelo de racing
/recusar
Recusa o desafio
/cancelardesafio
Quem envio o desafio quiser cancelar
/estilo
Muda o estilo do contador de drift
CÓDIGO:
Está pendente de modificações com relação a possíveis bugs no código. O sistema de desafios não foi testado, mas suponho que esteja tudo okay.
pawn Code:
#include a_samp // =========================================================================== #undef MAX_PLAYERS #define MAX_PLAYERS 25 // =========================================================================== #define ERRO 0xFF0000FF #define INFO 0x00FF00FF new Float:racecheckpoints[][18] = { {-305.4507,1395.2365,72.3118}, {-375.1031,1461.8661,62.1423}, {-328.6879,1316.2310,52.4871}, {-447.1574,1500.4052,34.9547}, {-399.9567,1750.0654,42.6130}, {-409.4537,1918.7510,57.7848}, {-439.1856,1759.7423,72.0444}, {-480.7166,1939.3983,86.4597}, {-388.9103,2080.4001,61.1164}, {-532.2165,1990.8622,60.3906}, {-384.1641,2075.6667,60.9181}, {-439.3697,1761.9298,72.0275}, {-418.0215,1917.2354,57.4656}, {-443.9293,1630.9391,35.6589}, {-324.8012,1316.9939,52.8978}, {-370.5130,1462.3467,62.6581}, {-308.6009,1395.1691,72.2705}, {-301.6882,1501.4779,75.5935} }; // =========================================================================== #define function::%0(%1) forward %0(%1); public %0(%1) // =========================================================================== new JogadorConvidado[MAX_PLAYERS] = { -1 , ...}; new ScoreApostado[MAX_PLAYERS]; new Text:TextDrawInfo[MAX_PLAYERS]; new Text:NSFDraw[MAX_PLAYERS]; new bruno[ MAX_PLAYERS ] ; new playerDrift[MAX_PLAYERS]; new DB: jogadoresRanking; new bool: JogadorJogando[ MAX_PLAYERS ]; new bool: eleConvidado[ MAX_PLAYERS] ; // =========================================================================== public OnFilterScriptInit() { new dia, mes, ano; getdate(dia,mes,ano); if(ano != 13 && ano != 2013 && ano != 2012 && ano != 12 ) { printf(" SCRIPT NAO CARREGADO !! USO NAO AUTORIZADO"); } else { printf("Sistema de drift carregado !!"); jogadoresRanking = db_open("drift.db"); db_free_result(db_query(jogadoresRanking,"CREATE TABLE IF NOT EXISTS `Usuarios` (`jogador`,`Pontos`)")); SetTimer("DriftCounter", 850, true); } return true; } public OnGameModeExit() { db_close(jogadoresRanking); return true; } public OnPlayerDeath(playerid, killerid, reason) { OnPlayerExitVehicle(playerid, -1); return true; } public OnPlayerConnect(playerid) { NSFDraw[playerid] = TextDrawCreate(274.000000, 104.000000, "000,000"); TextDrawBackgroundColor(NSFDraw[playerid], 255); TextDrawFont(NSFDraw[playerid], 1); TextDrawLetterSize(NSFDraw[playerid], 0.460000, 1.600000); TextDrawColor(NSFDraw[playerid], -39169); TextDrawSetOutline(NSFDraw[playerid], 1); TextDrawSetProportional(NSFDraw[playerid], 1); TextDrawTextSize(TextDrawInfo[playerid], 620.000000, 0.000000); static string[256]; format(string, 128, "~n~~w~Pontos Ranking: ~r~%d", getScoreData(playerid) ); TextDrawInfo[playerid] = TextDrawCreate(500.000000, 110.000000, string); TextDrawBackgroundColor(TextDrawInfo[playerid], 255); TextDrawFont(TextDrawInfo[playerid], 1); TextDrawLetterSize(TextDrawInfo[playerid], 0.30000, 1.00000); TextDrawColor(TextDrawInfo[playerid], -1); TextDrawSetOutline(TextDrawInfo[playerid], 1); TextDrawSetProportional(TextDrawInfo[playerid], 1); TextDrawUseBox(TextDrawInfo[playerid], 0); TextDrawBoxColor(TextDrawInfo[playerid], 255); TextDrawTextSize(TextDrawInfo[playerid], 620.000000, 0.000000); return true; } public OnPlayerSpawn(playerid) { SendClientMessage(playerid, 0x0000FFFF, "===================================================================="); SendClientMessage(playerid, -1, "Caso queira mudar o estilo de textdraw de drift use /estilo"); SendClientMessage(playerid, -1, "Para ver os melhores jogadores do servidor use /ranking"); SendClientMessage(playerid, -1, "Se tiver vontade de desafiar algum jogador, use /desafiar"); SendClientMessage(playerid, -1, "Sistema e comandos acima criados por Bruno da Silva"); SendClientMessage(playerid, 0x0000FFFF, "===================================================================="); TextDrawShowForPlayer(playerid, TextDrawInfo[playerid]); SetPlayerScore(playerid, getScoreData(playerid)); return true; } public OnPlayerExitVehicle(playerid, vehicleid) { if (JogadorJogando[playerid]) { SetPVarInt(playerid, "Checkpoints", 0); SetPVarInt(JogadorConvidado[playerid], "Checkpoints", 0); // SetPlayerVirtualWorld(JogadorConvidado[playerid], 0); SetPlayerVirtualWorld(playerid, 0); // RemovePlayerFromVehicle(JogadorConvidado[playerid]); RemovePlayerFromVehicle(playerid); // new string[128]; new nome[25]; GetPlayerName (JogadorConvidado[playerid], nome, 25); GetPlayerName (playerid, string, 25); format(string, 128, "[Info] O %s GANHOU do jogador %s NO /DESAFIO! ", nome, string); SendClientMessageToAll(0xFF0000FF, string); format(string, 128, "[Info] Você perdeu %d de score !!", ScoreApostado[playerid]); SendClientMessage(playerid, -1, string); format(string, 128, "[Info] Você ganhou %d de score !!", ScoreApostado[playerid]); SendClientMessage(JogadorConvidado[playerid], -1, string); // JogadorJogando[JogadorConvidado[playerid]] = false; JogadorJogando[playerid] = false; DisablePlayerRaceCheckpoint(JogadorConvidado[playerid]); DisablePlayerRaceCheckpoint(playerid); TextDrawShowForPlayer(playerid, TextDrawInfo[playerid]); TextDrawShowForPlayer(JogadorConvidado[playerid], TextDrawInfo[JogadorConvidado[playerid]]); SetPlayerScore(playerid, GetPlayerScore(playerid) - ScoreApostado[playerid]); SetPlayerScore(JogadorConvidado[playerid], GetPlayerScore(JogadorConvidado[playerid]) + ScoreApostado[playerid]); salvarJogador(playerid); salvarJogador(JogadorConvidado[playerid]); ScoreApostado[playerid] = 0; ScoreApostado[JogadorConvidado[playerid]] = 0; TogglePlayerControllable(JogadorConvidado[playerid], 1); TogglePlayerControllable(playerid, 1); SetTimerEx("SpawnEx", 3000, false, "i", JogadorConvidado[playerid]); SetTimerEx("SpawnEx", 3000, false, "i", playerid); eleConvidado[JogadorConvidado[playerid]] = false; eleConvidado[playerid] = false; ////////////////////////// JogadorConvidado[JogadorConvidado[playerid]] = -1; JogadorConvidado[playerid] = -1 ; } TextDrawHideForPlayer(playerid, NSFDraw[playerid]); return true; } public OnPlayerDisconnect(playerid, reason) { salvarJogador(playerid); TextDrawDestroy(NSFDraw[playerid]); TextDrawDestroy(TextDrawInfo[playerid]); if (JogadorJogando[playerid]) { OnPlayerExitVehicle(playerid, -1); } return true; } public OnPlayerEnterRaceCheckpoint(playerid) { if (JogadorJogando[playerid]) { new checkid = GetPVarInt(playerid, "Checkpoints") + 1; if(checkid == sizeof(racecheckpoints) - 1) { OnPlayerExitVehicle(JogadorConvidado[playerid], -1); } else if(checkid == sizeof(racecheckpoints) - 2) { SetPlayerRaceCheckpoint(playerid, 1, racecheckpoints[checkid][0], racecheckpoints[checkid][1], racecheckpoints[checkid][2], racecheckpoints[checkid+1][0], racecheckpoints[checkid+1][1], racecheckpoints[checkid+1][2], 10 ); } else { SetPlayerRaceCheckpoint(playerid,0, racecheckpoints[checkid][0], racecheckpoints[checkid][1], racecheckpoints[checkid][2], racecheckpoints[checkid + 1][0], racecheckpoints[checkid + 1][1], racecheckpoints[checkid + 1][2], 10 ); } SetPVarInt(playerid, "Checkpoints", checkid); } return true; } public OnVehicleDamageStatusUpdate(vehicleid, playerid) { if(playerDrift[playerid] > 50) { playerDrift[playerid] = 0; TextDrawSetString(NSFDraw[playerid], "~r~FAIL"); KillTimer(bruno[playerid]); } return 1; } public OnPlayerUpdate(playerid) { SetPVarInt(playerid, "SegundosTick", gettime()); if( gettime() - GetPVarInt(playerid, "SegundosTick") > 1) salvarJogador(playerid); return true; } public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext[1], "carroteste", true)) { SetPlayerScore(playerid, 5000); static Float: xPos[3]; GetPlayerPos(playerid, xPos[0], xPos[1], xPos[2]); CreateVehicle(562, xPos[0], xPos[1], xPos[2]+10.0, 82.2873, 0, 1, 60); return true; } if(!strcmp(cmdtext[1], "estilo", true)) { TextDrawDestroy(NSFDraw[playerid]); if(!GetPVarInt(playerid, "EstiloColocado")) { NSFDraw[playerid] = TextDrawCreate(500.000000, 130.000000, "000,000"); TextDrawBackgroundColor(NSFDraw[playerid], 255); TextDrawFont(NSFDraw[playerid], 1); TextDrawLetterSize(NSFDraw[playerid], 0.30000, 1.00000); TextDrawColor(NSFDraw[playerid], -1); TextDrawSetOutline(NSFDraw[playerid], 1); TextDrawSetProportional(NSFDraw[playerid], 1); TextDrawUseBox(NSFDraw[playerid], 0); TextDrawBoxColor(NSFDraw[playerid], 255); TextDrawTextSize(NSFDraw[playerid], 620.000000, 0.000000); SetPVarInt(playerid, "EstiloColocado", 1) ; } else { NSFDraw[playerid] = TextDrawCreate(274.000000, 104.000000, "000,000"); TextDrawBackgroundColor(NSFDraw[playerid], 255); TextDrawFont(NSFDraw[playerid], 1); TextDrawLetterSize(NSFDraw[playerid], 0.460000, 1.600000); TextDrawColor(NSFDraw[playerid], -39169); TextDrawSetOutline(NSFDraw[playerid], 1); TextDrawSetProportional(NSFDraw[playerid], 1); TextDrawTextSize(TextDrawInfo[playerid], 620.000000, 0.000000); SetPVarInt(playerid, "EstiloColocado", 0) ; } return true; } if(!strcmp(cmdtext[1], "ranking", true)) { static query[128], nome[MAX_PLAYER_NAME], stringDialog[1024]; nome[0] = 0,stringDialog[0] = 0,query[0] = 0; SendClientMessage(playerid, -1, "Melhores Jogadores"); // new string2[128]; new DBResult:result; new DBResult:playerResult; format(query, sizeof(query), "SELECT `jogador` FROM `Usuarios` ORDER BY (`Pontos` * 1) DESC limit 10"); // main table result = db_query(jogadoresRanking, query); for(new i, r = db_num_rows(result); i != r; ++ i) { db_get_field(result, 0, nome, MAX_PLAYER_NAME); // get query player tab format(query, sizeof(query), "SELECT `pontos` FROM `Usuarios` WHERE `jogador` = '%s'", nome); // get player score db_get_field((playerResult = db_query(jogadoresRanking,query), playerResult), 0, query, 14); // if(strlen(nome) > 2) { format(stringDialog, sizeof stringDialog,"%s%02d \t %24s\t\t\tDrift (%05d)\n", stringDialog, (i +1) , nome, strval(query)); } // db_next_row(result); db_free_result(playerResult); } ShowPlayerDialog(playerid, 4, DIALOG_STYLE_MSGBOX, "Ranking", stringDialog, "Fechar", "Fechar"); return db_free_result(result), true; } if(!strcmp(cmdtext[1], "recusar", true)) { if(JogadorConvidado[playerid] == (-1) && eleConvidado[playerid]) return SendClientMessage(playerid, ERRO, "[Erro] Você não foi convidado por ninguém"); SendClientMessage(JogadorConvidado[playerid], ERRO, "[Info] O jogador RESCUSOU o convite para um desafio"); SendClientMessage(playerid, ERRO, "[Info] Desafio NÃO foi iniciado!"); JogadorJogando[JogadorConvidado[playerid]] = false; JogadorJogando[playerid] = false; JogadorConvidado[JogadorConvidado[playerid]] = -1; JogadorConvidado[playerid]= -1; return true; } if(!strcmp(cmdtext[1], "aceitar", true)) { if(JogadorConvidado[playerid] == (-1) && eleConvidado[playerid]) return SendClientMessage(playerid, ERRO, "[Erro] Você não foi convidado por ninguém"); if(IsPlayerInAnyVehicle(playerid) || IsPlayerInAnyVehicle(JogadorConvidado[playerid])) return SendClientMessage(playerid, ERRO, "[Erro] Caso estiver em algum carro saia dele, ou peça para seu desafiante sair!"); SendClientMessage(JogadorConvidado[playerid], 0x00FFFFFF, "[Info] O jogador aceitou o convite para um desafio"); SendClientMessage(playerid, -1, "[Info] Desafio foi iniciado!"); JogadorJogando[JogadorConvidado[playerid]] = true; JogadorJogando[playerid] = true; //// SetPVarInt(playerid, "CarroDrift", CreateVehicle(562, -305.1179, 1511.3324, 75.7015, 82.2873, 0, 1, 60)); SetPVarInt(JogadorConvidado[playerid], "CarroDrift", CreateVehicle(562, -305.1179+7.0, 1511.3324, 75.7015, 82.2873, 0, 1, 60)); TogglePlayerControllable(playerid, 0); TogglePlayerControllable(JogadorConvidado[playerid], 0); //// TextDrawHideForPlayer(playerid, TextDrawInfo[playerid]); TextDrawHideForPlayer(JogadorConvidado[playerid], TextDrawInfo[JogadorConvidado[playerid]]); TextDrawHideForPlayer(playerid, NSFDraw[playerid]); TextDrawHideForPlayer(JogadorConvidado[playerid], NSFDraw[playerid]); Contagem(playerid, 5); Contagem(JogadorConvidado[playerid], 5); SetPlayerRaceCheckpoint(JogadorConvidado[playerid], 0, racecheckpoints[0][0], racecheckpoints[0][1], racecheckpoints[0][2], racecheckpoints[1][0], racecheckpoints[1][1], racecheckpoints[1][2], 10 ); SetPlayerRaceCheckpoint(playerid, 0, racecheckpoints[0][0], racecheckpoints[0][1], racecheckpoints[0][2], racecheckpoints[1][0], racecheckpoints[1][1], racecheckpoints[1][2], 10 ); SetPlayerVirtualWorld(playerid, playerid + 1); SetPlayerVirtualWorld(JogadorConvidado[playerid], playerid + 1); SetVehicleVirtualWorld(GetPVarInt(playerid, "CarroDrift"), playerid + 1); SetVehicleVirtualWorld(GetPVarInt(JogadorConvidado[playerid], "CarroDrift"), playerid + 1); PutPlayerInVehicle(playerid, GetPVarInt(playerid, "CarroDrift"), 0); PutPlayerInVehicle(JogadorConvidado[playerid], GetPVarInt(JogadorConvidado[playerid], "CarroDrift"), 0); return true; } if(!strcmp(cmdtext[1], "cancelardesafio", true)) { if(JogadorConvidado[playerid] == -1 || JogadorJogando[playerid]) return SendClientMessage(playerid, ERRO, "[Erro] Você não convidou alguém ou já iniciou o jogo"); OnPlayerCommandText(JogadorConvidado[playerid], "/recusar"); return true; } if(!strcmp(cmdtext[1], "desafiar", true, 8)) { if(JogadorConvidado[playerid] != -1 || JogadorJogando[playerid]) return SendClientMessage(playerid, ERRO, "[Erro] Você foi convidado por alguém. Digite /aceitar ou /recusar"); new id, score, cmd[32]; if(sscanf( cmdtext, "sud", cmd, id , score ) ) return SendClientMessage(playerid, ERRO, "[Erro] Use corretamente: /desafiar [id] [score]"); if(score == 65535 || !score) return SendClientMessage(playerid, ERRO, "[Erro] Use um valor de score entre 1 e 65535"); if(!IsPlayerConnected(id) || id == playerid) return SendClientMessage(playerid, ERRO, "[Erro] Jogador desafiado não esta conectado."); if(JogadorConvidado[id] != -1 || JogadorJogando[id]) return SendClientMessage(playerid, ERRO, "[Erro] Esse jogador já foi convidado por alguém. Aguarde"); if(getScoreData(id) < score || getScoreData(playerid) < score) return SendClientMessage(playerid, ERRO, "[Erro] Você ou ele não tem score suficiente para fazer aposta !!"); JogadorConvidado[id] = playerid; JogadorConvidado[playerid] = id; static string[128]; GetPlayerName(playerid, string, 25); format(string, 128, "[Info] Você foi convidado por %s para duelo de corrida! Score apostado: {FF0000}%d", string, score); SendClientMessage(JogadorConvidado[playerid], ERRO, "==========================================================================="); SendClientMessage(JogadorConvidado[playerid], -1,string); SendClientMessage(JogadorConvidado[playerid], -1, "[Info] Caso queira aceitar digite /aceitar caso contrário /recusar"); SendClientMessage(JogadorConvidado[playerid], ERRO, "==========================================================================="); SendClientMessage(playerid, ERRO, "==========================================================================="); SendClientMessage(playerid, -1, "[Info] O jogador foi convidado, agora só esperar ele aceitar o desafio !!"); SendClientMessage(playerid, -1, "[Info] Caso queira cancelar o desafio digite /cancelardesafio"); SendClientMessage(playerid, ERRO, "==========================================================================="); eleConvidado[JogadorConvidado[playerid]] = true; ScoreApostado[playerid] = score; ScoreApostado[id] = score; return true; } return false; } // // @Função: Simples sistema de contagem // @Autor: Bruno da Silva // function::Contagem(playerid, contagem) { if(!contagem) { TogglePlayerControllable(playerid, 1); return GameTextForPlayer(playerid, "~r~Go ~g~Go ~b~Go", 999, 4); } new contaria[5]; format(contaria, 5, "%d", contagem); GameTextForPlayer(playerid, contaria, 999, 4); contagem --; return SetTimerEx( "Contagem", 1000, false, "ii", playerid, contagem); } // // @function: get score data // @author: Bruno da Silva // function::getScoreData(playerid) { new query[256], string[128]; new DBResult:qresult, ret; GetPlayerName(playerid, string, MAX_PLAYER_NAME + 1); format(query,sizeof(query),"SELECT `Pontos` FROM `Usuarios` WHERE `jogador` = '%s'", string); qresult = db_query(jogadoresRanking,query); if(db_num_rows(qresult) == 1) { db_get_field(qresult,0,string,128); ret = strval(string); } db_free_result(qresult); return ret; } ///////////////////////////////////////////////////////// // // @funcion: save data // @author: Bruno da Silva // //////////////////////////////////////////////////////// function::salvarJogador(playerid) { new tname[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid,tname,sizeof(tname)); new query[256]; format(query,sizeof(query),"SELECT `jogador` FROM `Usuarios` WHERE `jogador`=('%s') LIMIT 1",tname); new DBResult:qresult; qresult = db_query(jogadoresRanking,query); if(db_num_rows(qresult) == 1) { format(query,sizeof(query),"UPDATE `Usuarios` SET `Pontos`='%d' WHERE (`jogador` = ('%s'))",GetPlayerScore(playerid),tname); db_free_result(db_query(jogadoresRanking,query)); } else if(db_num_rows(qresult) == 0) { format(query, sizeof(query), "INSERT INTO `Usuarios` (`jogador`,`Pontos`) VALUES(('%s'),%d)",tname ,GetPlayerScore(playerid)); db_free_result(db_query(jogadoresRanking,query)); } return true; } function::ReadRank(jogador[]) { new files[42]; new rank[32]; format(files, 42, "rank/%s.rank", jogador); if(!fexist(files)) return 0; new File: fp = fopen(files, io_read); fread(fp, rank, sizeof rank); fclose (fp); return strval(rank); } function::WriteRank(jogador[], rank) { new files[42]; format(files, 42, "rank/%s.rank", jogador); new File: fp = fopen(files, io_write); format(files, 32, "%d", rank); fwrite(fp, files); fclose (fp); return true; } function::DriftEarn(playerid, score) { score *= 10; if (!JogadorJogando[playerid]) { playerDrift [playerid] += score; TextDrawShowForPlayer(playerid, NSFDraw[playerid]); new string[128]; switch(playerDrift [playerid]) { case 000 .. 100: string = "~n~Drift"; case 101 .. 400: string = "~n~Good Drift"; case 401 .. 1200: string = "~n~Great Drift"; case 1201 .. 3800: string = "~n~SUPERB DRIFT!"; case 3801 .. 6000: string = "~n~COLOSSAL DRIFT!"; case 6001 .. 20000: string = "~n~OUTRAGEOUS DRIFT!"; case 20001 .. 40000: string = "~n~INSANE DRIFT!"; default: string = "~n~~r~DRIFT KING!"; } format(string, 128, "%0d%s", playerDrift [playerid], string); TextDrawSetString(NSFDraw[playerid], string); KillTimer(bruno[playerid]); bruno[playerid] = SetTimerEx("DriftCheck", 1700, false, "id", playerDrift[playerid], playerid); } return true; } function::DriftCheck(score, playerid) { if(playerDrift[playerid] == score && !JogadorJogando[playerid]) { if(playerDrift[playerid] > 25000) { new string[128]; new nome[32]; GetPlayerName(playerid, nome, 32); if(playerDrift [playerid] > ReadRank(nome)) { WriteRank(nome, playerDrift [playerid]); format(string, 128, "[Info] O jogador \"%s\" chegou à seu recorde de %d em um único drift !!", nome, playerDrift [playerid]); SendClientMessageToAll(0x00FF00FF, string); } } SetPlayerScore(playerid, GetPlayerScore(playerid) + (playerDrift[playerid]/600)); new string[256]; format(string, 256, "~n~~w~Pontos Ranking: ~r~%d", getScoreData(playerid)); TextDrawSetString(TextDrawInfo[playerid], string); salvarJogador(playerid); playerDrift[playerid] = 0; TextDrawHideForPlayer(playerid, NSFDraw[playerid]); } return true; } function::DriftCounter() { for (new i; i != MAX_PLAYERS; i++) { if(IsPlayerInAnyVehicle(i)) { new vehicleid = GetPlayerVehicleID(i); if(IsCarVehicle(vehicleid)) { new Float:x, Float:y, Float:z; GetVehicleVelocity(vehicleid, x, y, z); new speed = floatround(floatsqroot(x*x+y*y+z*z)*200.0); if(speed > 1.0) { new radianos = floatround( atan2( y, x ) ); if(radianos > 400) radianos -= 400; switch(radianos) { case 090 .. 180: radianos -= 90; case 181 .. 360: radianos += 90; default: radianos += 270; } //////////////////////////////////////////////////////////////// static Float: angle; GetVehicleZAngle(vehicleid, angle); radianos = floatround( floatabs( radianos - angle ) ); if(radianos > 180) { radianos = floatround( floatabs ( radianos - 360 ) ); } new key[3]; GetPlayerKeys(i, key[0], key[1], key[2]); if( key[0] != 32 && speed > 20) { if( radianos > 3 && ((radianos * speed) / 30) < 300) { DriftEarn(i, (radianos * speed) / 35 ) ; } } //////////////////////////////////////////////////////////////// } } } } return true; } /////////////////////////////////////////////////////////////////////////////// // // @function: SpawnEx — Correção para SpawnPlayer // @author: Bruno da Silva // ////////////////////////////////////////////////////////////////////////////// function::SpawnEx(playerid) { SpawnPlayer(playerid); return true; } /////////////////////////////////////////////////////////////////////////////// // // @function: sscanf // @author: Y_less // ////////////////////////////////////////////////////////////////////////////// function::sscanf(string[], format[], {Float,_}:...) { #if defined isnull if (isnull(string)) #else if (string[0] == 0 || (string[0] == 1 && string[1] == 0)) #endif { return format[0]; } #pragma tabsize 4 new formatPos = 0, stringPos = 0, paramPos = 2, paramCount = numargs(), delim = ' '; while (string[stringPos] && string[stringPos] <= ' ') { stringPos++; } while (paramPos < paramCount && string[stringPos]) { switch (format[formatPos++]) { case '\0': { return 0; } case 'i', 'd': { new neg = 1, num = 0, ch = string[stringPos]; if (ch == '-') { neg = -1; ch = string[++stringPos]; } do { stringPos++; if ('0' <= ch <= '9') { num = (num * 10) + (ch - '0'); } else { return -1; } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num * neg); } case 'h', 'x': { new num = 0, ch = string[stringPos]; do { stringPos++; switch (ch) { case 'x', 'X': { num = 0; continue; } case '0' .. '9': { num = (num << 4) | (ch - '0'); } case 'a' .. 'f': { num = (num << 4) | (ch - ('a' - 10)); } case 'A' .. 'F': { num = (num << 4) | (ch - ('A' - 10)); } default: { return -1; } } } while ((ch = string[stringPos]) > ' ' && ch != delim); setarg(paramPos, 0, num); } case 'c': { setarg(paramPos, 0, string[stringPos++]); } case 'f': { new changestr[16], changepos = 0, strpos = stringPos; while(changepos < 16 && string[strpos] && string[strpos] != delim) { changestr[changepos++] = string[strpos++]; } changestr[changepos] = '\0'; setarg(paramPos,0,_:floatstr(changestr)); } case 'p': { delim = format[formatPos++]; continue; } case '\'': { new end = formatPos - 1, ch; while ((ch = format[++end]) && ch != '\'') {} if (!ch) { return -1; } format[end] = '\0'; if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1) { if (format[end + 1]) { return -1; } return 0; } format[end] = '\''; stringPos = ch + (end - formatPos); formatPos = end + 1; } case 'u': { new end = stringPos - 1, id = 0, bool:num = true, ch; while ((ch = string[++end]) && ch != delim) { if (num) { if ('0' <= ch <= '9') { id = (id * 10) + (ch - '0'); } else { num = false; } } } if (num && IsPlayerConnected(id)) { setarg(paramPos, 0, id); } else { #if !defined foreach #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2)) #define __SSCANF_FOREACH__ #endif string[end] = '\0'; num = false; new name[MAX_PLAYER_NAME]; id = end - stringPos; foreach (Player, playerid) { GetPlayerName(playerid, name, sizeof (name)); if (!strcmp(name, string[stringPos], true, id)) { setarg(paramPos, 0, playerid); num = true; break; } } if (!num) { setarg(paramPos, 0, INVALID_PLAYER_ID); } string[end] = ch; #if defined __SSCANF_FOREACH__ #undef foreach #undef __SSCANF_FOREACH__ #endif } stringPos = end; } case 's', 'z': { new i = 0, ch; if (format[formatPos]) { while ((ch = string[stringPos++]) && ch != delim) { setarg(paramPos, i++, ch); } if (!i) { return -1; } } else { while ((ch = string[stringPos++])) { setarg(paramPos, i++, ch); } } stringPos--; setarg(paramPos, i, '\0'); } default: { continue; } } while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ') { stringPos++; } while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' ')) { stringPos++; } paramPos++; } do { if ((delim = format[formatPos++]) > ' ') { if (delim == '\'') { while ((delim = format[formatPos++]) && delim != '\'') {} } else if (delim != 'z') { return delim; } } } while (delim > ' '); return 0; } /////////////////////////////////////////////////////////////////////////////// // // @function: Is Car Vehicle 1/0 // @author: Made Man // ////////////////////////////////////////////////////////////////////////////// function::IsCarVehicle(vehicleid) { switch(GetVehicleModel(vehicleid)) { case 416, //ambulan - car 445, //admiral - car 602, //alpha - car 485, //baggage - car 568, //bandito - car 429, //banshee - car 499, //benson - car 424, //bfinject, //car 536, //blade - car 496, //blistac - car 504, //bloodra - car 422, //bobcat - car 609, //boxburg - car 498, //boxville, //car 401, //bravura - car 575, //broadway, //car 518, //buccanee, //car 402, //buffalo - car 541, //bullet - car 482, //burrito - car 431, //bus - car 438, //cabbie - car 457, //caddy - car 527, //cadrona - car 483, //camper - car 524, //cement - car 415, //cheetah - car 542, //clover - car 589, //club - car 480, //comet - car 596, //copcarla, //car 599, //copcarru, //car 597, //copcarsf, //car 598, //copcarvg, //car 578, //dft30 - car 486, //dozer - car 507, //elegant - car 562, //elegy - car 585, //emperor - car 427, //enforcer, //car 419, //esperant, //car 587, //euros - car 490, //fbiranch, //car 528, //fbitruck, //car 533, //feltzer - car 544, //firela - car 407, //firetruk, //car 565, //flash - car 455, //flatbed - car 530, //forklift, //car 526, //fortune - car 466, //glendale, //car 604, //glenshit, //car 492, //greenwoo, //car 474, //hermes - car 434, //hotknife, //car 502, //hotrina - car 503, //hotrinb - car 494, //hotring - car 579, //huntley - car 545, //hustler - car 411, //infernus, //car 546, //intruder, //car 559, //jester - car 508, //journey - car 571, //kart - car 400, //landstal, //car 403, //linerun - car 517, //majestic, //car 410, //manana - car 551, //merit - car 500, //mesa - car 418, //moonbeam, //car 572, //mower - car 423, //mrwhoop - car 516, //nebula - car 582, //newsvan - car 467, //oceanic - car 404, //peren - car 514, //petro - car 603, //phoenix - car 600, //picador - car 413, //pony - car 426, //premier - car 436, //previon - car 547, //primo - car 489, //rancher - car 441, //rcbandit, //car 594, //rccam - car 564, //rctiger - car 515, //rdtrain - car 479, //regina - car 534, //remingtn, //car 505, //rnchlure, //car 442, //romero - car 440, //rumpo - car 475, //sabre - car 543, //sadler - car 605, //sadlshit, //car 495, //sandking, //car 567, //savanna - car 428, //securica, //car 405, //sentinel, //car 535, //slamvan - car 458, //solair - car 580, //stafford, //car 439, //stallion, //car 561, //stratum - car 409, //stretch - car 560, //sultan - car 550, //sunrise - car 506, //supergt - car 601, //swatvan - car 574, //sweeper - car 566, //tahoma - car 549, //tampa - car 420, //taxi - car 459, //topfun - car 576, //tornado - car 583, //tug - car 451, //turismo - car 558, //uranus - car 552, //utility - car 540, //vincent - car 491, //virgo - car 412, //voodoo - car 478, //walton - car 421, //washing - car 529, //willard - car 555, //windsor - car 456, //yankee - car 554, //yosemite - car 477 //zr350 - car : return true; } return false; }
Autoria
Bruno da Silva por ter ministrado todo projeto.
MadeMan pela função IsCarVehicle
Y_less pela função sscanf
TugaBR e Gustavo Araujo pelos testes !!
0 comentários:
Postar um comentário