[Include] eDistance System
#1

• eDistance System •

Introduзгo

Й uma include que lhe permite verificar a distвncia que um veнculo jб percorreu sendo em Metros, Quilфmetros ou Milhas.
Possui sistema de escolha caso vocк queira salvar a distвncia percorrida por cada veнculo.


Nativas

• GetMeters(vehicleid);................................................ ..................................Verifica em Metros a distвncia percorrida
• GetKilometers(vehicleid);................................................ ......................Verifica em Quilфmetros a distвncia percorrida
• GetMiles(vehicleid);................................................ ......................................Verifica em Milhas a distвncia percorrida
• ResetMetersTraveled(vehicleid);................................................ .....................Reseta a metragem percorrida do veнculo
• E_SetVehiclePos(vehicleid, float:X, float:Y, float:Z);.........Define a posiзгo do veнculo evitando erros na distancia percorrida


• IMPORTANTE •

• Sempre que for definir a posiзгo de um veнculo use a nativa E_SetVehiclePos, caso vocк nгo usб-la poderб bugar a quilфmetragem do veнculo.
• Crie uma pasta chamada "KMRodados" em sua ScriptFiles caso vocк queira salvar os dados da distвncia percorrida de cada veнculo e altere na include a define "SaveDistance" para 1.
pawn Код:
#define   Paste                      "KMRodados/Veнculo %d.ini" //Pasta para salvar a distвncia que cada veнculo percorreu
#define   SaveDistance               1 // (0 - Desabilitar | 1 - Abilitar) O salvamento da distancia percorrida
• Caso queira alterar a pasta de destino, apenas troque a define "Paste".


Atualizaзхes

03/01/2013 - Bug's concertados e adicionado nova native (E_SetVehiclePos)
04/01/2013 - Adicionado sistema de salvamento (file.inc)


Modo de Uso

• GetMeters(vehicleid) - retorna a nъmeros inteiros, ou seja:
pawn Код:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
    static String[56]; //Definimos a string com 56 cйlulas

    format(String, sizeof(String), "O veнculo %d percorreu %d metros.", vehicleid, GetMeters(vehicleid));
    //Formatamos a string mostrando o ID do veнculo e a metragem percorrida

    SendClientMessage(playerid, -1, String); //Mostramos ao player a mensagem

    return true;
}
Exemplo: O veнculo 542 percorreu 1265 metros.

...

• GetKilometers(vehicleid) - retorna a um nъmero flutuante, ou seja:
pawn Код:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
    static String[56]; //Definimos a string com 56 cйlulas

    format(String, sizeof(String), "O veнculo %d percorreu %0.3f quilфmetros.", vehicleid, GetKilometers(vehicleid));
    //Formatamos a string mostrando o ID do veнculo e a quilometragem percorrida

    SendClientMessage(playerid, -1, String); //Mostramos ao player a mensagem

    return true;
}
Exemplo: O veнculo 542 percorreu 1.265 quilфmetros. (Equivale a 1265m)

...

• GetKilometers(vehicleid) - retorna a um nъmero flutuante, ou seja:
pawn Код:
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
    static String[56]; //Definimos a string com 56 cйlulas

    format(String, sizeof(String), "O veнculo %d percorreu %0.3f milhas.", vehicleid, GetMiles(vehicleid));
    //Formatamos a string mostrando o ID do veнculo e as milhas percorrida

    SendClientMessage(playerid, -1, String); //Mostramos ao player a mensagem

    return true;
}
Exemplo: O veнculo 542 percorreu 0.786 milhas. (Equivale a 1265m)


Bugs/Dъvidas/Sugestхes

Comente abaixo


Download

pawn Код:
///////////////////////////////////////////////////////////////////////////////////
//
//                 |*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|
//                 |*|      eDistance System     |*|
//                 |*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|
//
//               =====================================
//                            INTRODUЗГO
//               =====================================
//
//               Essa include permite a vocк verificar
//               quanto um veнculo percorreu em Metros,
//               Quilфmetros ou Milhas.
//
//               =====================================
//                             NATIVES
//               =====================================
//
//               native GetMeters(vehicleid);
//               native GetKilometers(vehicleid);
//               native GetMiles(vehicleid);
//               native E_SetVehiclePos(vehicleid, float:X, float:Y, float:Z);
//
//               =====================================
//                      EXEMPLOS (MODO DE USO)
//               =====================================
//
//                    *-- | METROS RODADOS | --*
//               format(string, sizeof(string), "Esse veнculo percorreu %d Metros Rodados.", GetMeters(GetPlayerVehicleID(playerid)));
//               SendClientMessage(playerid, -1, string);
//
//                    *-- | QUILФMETROS RODADOS | --*
//               format(string, sizeof(string), "Esse veнculo percorreu %s Quilфmetros Rodados.", GetKilometers(GetPlayerVehicleID(playerid)));
//               SendClientMessage(playerid, -1, string);
//
//                    *-- | MILHAS RODADOS | --*
//               format(string, sizeof(string), "Esse veнculo percorreu %s Milhas Rodados.", GetMiles(GetPlayerVehicleID(playerid)));
//               SendClientMessage(playerid, -1, string);
//
//               =====================================
//                             CRЙDITOS
//               =====================================
//
//                  * Include Criada por EditPawn *
//        * BlueX e Paulor por me ajudar com algumas funзхes *
//        * Lordz pelo tutorial de ligar Funзхes e Callbacks *
//
//               =====================================
//                     BUGS, DЪVIDAS E SUGESTХES
//               =====================================
//
//         Acesse: http://forum.sa-mp.com/forumdisplay.php?f=56
//
//
///////////////////////////////////////////////////////////////////////////////////

/* ----- INCLUDE ----- */
#include    a_samp

/* ----- DEFINES ----- */
#define   GetMeters(%0)              E@_R[%0]
#define   GetKilometers(%0)         (E@_R[%0] * 0.001)
#define   GetMiles(%0)              (E@_R[%0] * 0.000621)
#define   ResetMetersTraveled(%0)    E@_R[%0] = 0;
#define   Paste                      "KMRodados/Veнculo %d.ini" //Pasta para salvar a distвncia que cada veнculo percorreu
#define   SaveDistance               1 // (0 - Desabilitar | 1 - Abilitar) O salvamento da distancia percorrida

/* ----- VARS ----- */
new    E@_R[MAX_VEHICLES] = 0,
       Float:v@_P[3],
       E@_Timer[MAX_PLAYERS];
       
#if SaveDistance == 1
    new    File:E@_Arq;
    static E@_S[32],
           E@_Ss[24];
#endif

/* ----- FORWARDS ----- */
forward E@_OnPlayerDisconnect(playerid, reason);
forward E@_OnPlayerStateChange(playerid, newstate, oldstate);
forward E@_At(playerid);
forward E@_OnPlayerExitVehicle(playerid, vehicleid);
forward E@_OnGameModeExit();
forward E@_OnGameModeInit();

/* ----- CALLBACKS ----- */
public OnGameModeInit() {
    #if SaveDistance == 1
        for(new x; x < MAX_VEHICLES; ++x) {
            format(E@_S, sizeof(E@_S), Paste, x);
            if(fexist(E@_S)) {
                E@_Arq = fopen(E@_S, io_read);
                fread(E@_Arq, E@_Ss);
                E@_R[x] = strval(E@_Ss);
                fclose(E@_Arq);
            }
        }
    #endif
    return CallLocalFunction("E@_OnGameModeInit", "");
}

#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#endif
#define OnGameModeInit E@_OnGameModeInit

public OnGameModeExit() {
    #if SaveDistance == 1
        for(new x; x < MAX_VEHICLES; ++x) {
            if(E@_R[x] > 0) {
                format(E@_S, sizeof(E@_S), Paste, x);
                format(E@_Ss, sizeof(E@_Ss), "%d", E@_R[x]);
                E@_Arq = fopen(E@_S, io_write);
                fwrite(E@_Arq, E@_Ss);
                fclose(E@_Arq);
            }
        }
    #endif
    return CallLocalFunction("E@_OnGameModeExit", "");
}

#if defined _ALS_OnGameModeExit
    #undef OnGameModeExit
#endif
#define OnGameModeExit E@_OnGameModeExit

public OnPlayerDisconnect(playerid, reason) {
    KillTimer(E@_Timer[playerid]);
    return CallLocalFunction("E@_OnPlayerDisconnect", "id", playerid, reason);
}

#if defined _ALS_OnPlayerDisconnect
    #undef OnPlayerDisconnect
#else
    #define _ALS_OnPlayerDisconnect
#endif
#define OnPlayerDisconnect E@_OnPlayerDisconnect

public OnPlayerExitVehicle(playerid, vehicleid) {
    KillTimer(E@_Timer[playerid]);
    return CallLocalFunction("E@_OnPlayerExitVehicle", "id", playerid, vehicleid);
}

#if defined _ALS_OnPlayerExitVehicle
    #undef OnPlayerExitVehicle
#endif
#define OnPlayerExitVehicle E@_OnPlayerExitVehicle

public E@_At(playerid) {
    if(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), v@_P[0], v@_P[1], v@_P[2]) <= 100) {
        E@_R[GetPlayerVehicleID(playerid)] += floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), v@_P[0], v@_P[1], v@_P[2]));
    }
    GetVehiclePos(GetPlayerVehicleID(playerid), v@_P[0], v@_P[1], v@_P[2]);
/*
    OBS: Caso queira fazer teste, apenas abilite essa parte e irб aparecer todas as formas de distвncia que o veнculo estб rodando.

    new E@_Str[129];
    format(E@_Str, sizeof(E@_Str), "(%d) Metros - (%0.3f) Quilфmetros - (%0.3f) Milhas", GetMeters(GetPlayerVehicleID(playerid)), GetKilometers(GetPlayerVehicleID(playerid)), GetMiles(GetPlayerVehicleID(playerid)));
    SendClientMessage(playerid, -1, E@_Str);
*/

}

public OnPlayerStateChange(playerid, newstate, oldstate) {
    if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER) {
        GetVehiclePos(GetPlayerVehicleID(playerid), v@_P[0], v@_P[1], v@_P[2]);
        E@_Timer[playerid] = SetTimerEx("E@_At", 1000, true, "i", playerid);
    }
    else if(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) KillTimer(E@_Timer[playerid]);
    return CallLocalFunction("E@_OnPlayerStateChange", "idd", playerid, newstate, oldstate);
}

#if defined _ALS_OnPlayerStateChange
    #undef OnPlayerStateChange
#else
    #define _ALS_OnPlayerStateChange
#endif
#define OnPlayerStateChange E@_OnPlayerStateChange

/* ----- STOCK ----- */
stock E_SetVehiclePos(vehicleid, float:X, float:Y, float:Z) {
    SetVehiclePos(vehicleid, X, Y, Z);
    V@_P[0] = X, V@_P[1] = Y, V@_P[2] = Z;
}
Pastebin


Observaзхes

№Demorei alguns minutos para criar e 1 dia para testar e melhorar a otimizaзгo de alguns cуdigos.
ІEssa й minha primeira include que faзo, pode conter erros ou atй desatenзхes, caso contenha algo que nгo esteja de acordo por favor comente abaixo.
іSalve como e_km.inc


BUG's Encontrados

1° - Se um jogador cair do veнculo a verificaзгo continua. (CONCERTADO)
2° - Ao teleportar o veнculo a distвncia do veнculo era maior do que seria. (CONCERTADO)


Crйditos

Include criada por EditPawn
Paulor e BlueX por me ajudarem em algumas funзхes
Lordz pelo tutorial de ligar Funзхes e Callbacks https://sampforum.blast.hk/showthread.php?tid=392061
Fonte dos Cбlculos: http://www.convertworld.com/pt/comprimento/
leonardo1434 por ter me avisado do bug que iria ocorrer usando SetVehiclePos


Espero que gostem
Reply
#2

Muito bom, uma vez acho que o bruno fez algo parecido.
Reply
#3

Quote:
Originally Posted by DrTHE
Посмотреть сообщение
Muito bom, uma vez acho que o bruno fez algo parecido.
Sim, isso й verdade.
Aqui estб o que ele fez: http://forum.sa-mp.com/showthread.ph...hlight=vehicle

Mas percebi que o dele nгo pegava em Milhas e tambйm a kilometragem sу mostrava nъmeros inteiros, ai decidi fazer essa include.


Obrigado
Reply
#4

Gostei das funзхes cara.
Parabйns!
Reply
#5

bem legal sua include ja sabia como fazer ela e fiz no gamemode mesmo nгo vi razгo para uma include!
mais toda forma!

belo trabalho

pawn Код:
E@_R
maldito Kuddy

acho que isso sу complica vocк mesmo de fazer seu code!











_
Reply
#6

Bom trabalho, funзхes legais a include .
Reply
#7

muito bom serб , ъtil para alguem esses dias tem gente pedindo algo sobre isso.
+rep = 2 <
Reply
#8

@Miqueias Barros
Obrigado

@Sky
Obrigado mano
Na verdade jб tinha dado um nome a essa variбvel, mas troquei e nгo atrapalha pois quando vocк cria algo vocк sabe como modificar
Na verdade nem sabia um nome pra colocar -q

@DiReCt hIt
Thanks

@Q.I
Valeu


@TOPIC
Aliбs, coloquei uma funзгo nova, й bem simples mas pode ser ъtil. ResetMetersTraveled(vehicleid);
Reply
#9

Legal, gostei (:
Reply
#10

Ficou уtimo
Reply
#11

Bom
Reply
#12

Muito bom, bem organizadinho e ъtil
Reply
#13

Bom trabalho, sу que buga com SetPlayerPos
Reply
#14

Dica:

Se vocк nгo queria os nъmeros finais da flutuante bastava colocar assim no format %0.2f - O nъmero 2 representa quantos nъmeros depois do ponto vocк deseja que apareзa.

Mais a maneira mais simples й:


pawn Код:
#define GetKilometers(%0) (E@_R[%0] * 0.001)
#define GetMiles(%0) (E@_R[%0] * 0.000621)
Reply
#15

Quote:
Originally Posted by ipsBruno
Посмотреть сообщение
Bom trabalho, sу que buga com SetPlayerPos
Como iria bugar? Pois ai eu tentava arrumar isso.


Quote:
Originally Posted by paulor
Посмотреть сообщение
Dica:

Se vocк nгo queria os nъmeros finais da flutuante bastava colocar assim no format %0.2f - O nъmero 2 representa quantos nъmeros depois do ponto vocк deseja que apareзa.

Mais a maneira mais simples й:


pawn Код:
#define GetKilometers(%0) (E@_R[%0] * 0.001)
#define GetMiles(%0) (E@_R[%0] * 0.000621)
Hm, obrigado paulor, irei adaptar

@Todos
Obrigado
Reply
#16

Quote:
Originally Posted by EditPawn
Посмотреть сообщение
Como iria bugar? Pois ai eu tentava arrumar isso.





Hm, obrigado paulor, irei adaptar

@Todos
Obrigado


@EDIT
Paulor, mas se eu fizer com defines, ficara um nъmero um pouco extenso ?
Pois depois do ponto seria melhor aparecer apenas 3 numeros.
O modo que vocк fez estб retornando String isso й errado pois Metros, km e milhas sгo numйricos, entгo vocк deveria ter feito para retornar Float ou Inteiro ai й com vocк, caso fosse retornar Float a pessoa que fosse usar deveria fazer assim:

pawn Код:
#define GetKilometers(%0) (E@_R[%0] * 0.001)
format(Str, 128, "Km: %0.2f", GetKilometers(vehicleid));
Assim ficaria arredondado com 2 casas decimais depois do ponto caso queria Inteiro bastava fazer assim:

pawn Код:
#define GetKilometers(%0) floatround(E@_R[%0] * 0.001)
format(Str, 128, "Km: %i", GetKilometers(vehicleid));
Reply
#17

Quote:
Originally Posted by paulor
Посмотреть сообщение
O modo que vocк fez estб retornando String isso й errado pois Metros, km e milhas sгo numйricos, entгo vocк deveria ter feito para retornar Float ou Inteiro ai й com vocк, caso fosse retornar Float a pessoa que fosse usar deveria fazer assim:

pawn Код:
#define GetKilometers(%0) (E@_R[%0] * 0.001)
format(Str, 128, "Km: %0.2f", GetKilometers(vehicleid));
Assim ficaria arredondado com 2 casas decimais depois do ponto caso queria Inteiro bastava fazer assim:

pawn Код:
#define GetKilometers(%0) floatround(E@_R[%0] * 0.001)
format(Str, 128, "Km: %i", GetKilometers(vehicleid));
Entendi

Jб atualizei o tуpico
Reply
#18

Quote:
Originally Posted by EditPawn
Посмотреть сообщение
Entendi

Jб atualizei o tуpico
Estava vendo melhor acho eu que isso:

pawn Код:
format(String, sizeof(String), "O veнculo %d percorreu %0.3f quilфmetros.", vehicleid, GetKilometers(vehicleid));
Nгo serб executado da forma certa pois a Variavel E@_R nгo й flutuante. Teste para ver se realmente serб isso, creio que depois do ponto serб tudo zero.
Reply
#19

Parabens bem legal a include (:
Reply
#20

Bem legal cara gostei..
funcoes boas e uteis!!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)