Portal SAMP
[Ajuda] Dúvidas sobre stock e forward - 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] Dúvidas sobre stock e forward (/showthread.php?tid=3723)



Dúvidas sobre stock e forward - Usuário Aleatório - 26/06/2023

Olá,sou novo no samp e estudo algumas GAMEMODES para ter mais conhecimento,e vi q todas tenhem Stock e Forwards,pra que serve isso?É tipo pra criar Publics?Se sim,alguém pode me dar tipo um pequeno ´´tutorialzinho´´ pvf.


RE: Dúvidas sobre stock e forward - White_Blue - 26/06/2023

forwards servem para definir callbacks que podem ser usadas em registros de eventos(Timers, registro de eventos como OnPlayerConnect) enquanto a função "stock" é uma palavra-chave para definir uma função para encapsular código, em termos grosseiros, é uma compactação e poupa tempo dos desenvolvedores.

Um exemplo prático de encapsulamento de código:

Código PHP:
stock GetPlayerNameEx(playerid) {
        static Name[MAX_PLAYER_NAME];
        GetPlayerName(playeridNameMAX_PLAYER_NAME);
        return Name;


Estou encapsulando o código para não ter que definir uma variável e digitar todo esse código toda vez que eu quiser pegar o nome do jogador.

Entretanto, vale ressaltar que o uso do "stock" é opcional, e usando stock para definir a função, caso ela não esteja sendo usada, ela não dará um warning alertando sobre o uso da mesma. Eu poderia definir o mesmo código dessa forma sem o stock:

Código PHP:
GetPlayerNameEx(playerid) {
        static Name[MAX_PLAYER_NAME];
        GetPlayerName(playeridNameMAX_PLAYER_NAME);
        return Name;




Espero ter esclarecido sua dúvida.

De toda forma, recomendo ler o artigo da Wikipedia sobre callbacks e o artigo sobre Pawn e o artigo sobre encapsulamento de código da Wikibooks para mais detalhes:
https://pt.wikipedia.org/wiki/Callback
https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Encapsulamento
https://pt.wikipedia.org/wiki/Pawn


RE: Dúvidas sobre stock e forward - Usuário Aleatório - 27/06/2023

Muito obrigado pela ajuda,entendi o ´´stock´´ mas n entendi muito bem o ´´forward´´ pode explicar? (dsclp se estou sendo chato,mas pesquiso muito sobre o stock e o forward e nunca encontro quase nada na net,e quando encontro n entendo )


RE: Dúvidas sobre stock e forward - xbruno1000x - 27/06/2023

forward é a declaração prévia dos parâmetros que serão recebidos pela public.

Exemplo:
Código:
forward Float:SetPlayerToFacePos(playerid, Float:X, Float:Y);
Nesse caso, a public já irá esperar por receber 1 playerid e 2 floats.

Então a public deveria ficar dessa forma:
Código:
public Float:SetPlayerToFacePos(playerid, Float:X, Float:Y)

É possível adicionar um atalho para não ter que declarar a forward também.
Código:
#define xBruno1000x::%0(%1)         forward %0(%1);\
                            public %0(%1)

Dessa forma, quando for criar a public, eu apenas faria da forma abaixo:
Código:
xBruno1000x::Float:SetPlayerToFacePos(playerid, Float:X, Float:Y)



RE: Dúvidas sobre stock e forward - Usuário Aleatório - 27/06/2023

Finalmente entendi mn,obrigado pela ajuda Bruno,mas tava vendo uns sites e fóruns gringos aqui e uns dizia umas coisas sobre o ´´stock´´ e outros explicavam de forma totalmente diferente mano e isso me deixou confuso pra caramba,pode explicar o ´´stock´´ tmb pvf (se n der mt trabalho pra vc)


RE: Dúvidas sobre stock e forward - White_Blue - 27/06/2023

(27/06/2023 11:23)Usuário Aleatório Escreveu: Finalmente entendi mn,obrigado pela ajuda Bruno,mas tava vendo uns sites e fóruns gringos aqui e uns dizia umas coisas sobre o ´´stock´´ e outros explicavam de forma totalmente diferente mano e isso me deixou confuso pra caramba,pode explicar o ´´stock´´ tmb pvf (se n der mt trabalho pra vc)

Recomendo você ler o artigo da wiki do SA-MP: https://sampwiki.blast.hk/wiki/Function

Mas é basicamente aquilo que eu disse, o "stock" em si é uma palavra-chave que diz para o compilador que caso a função não esteja sendo usada por você, o compilador irá ignorar aquela função e não emitir um aviso.

É usado para encapsular código, que é muito útil para poupar tempo de fazer coisas mais repetitivas e cansativas toda hora.

Um exemplo bem simples(Inútil, mas é só para exemplificar) é criar uma função para alterar e outra para pegar a vida do jogador

Código PHP:
stock Float:SetPlayerHealthEx(playeridFloat:Health) {
      SetPlayerHealth(playeridhealth);
      return 1;
}

stock Float:GetPlayerHealthEx(playerid) {
    new 
Float:Health;
    
GetPlayerHealth(playeridHealth);
    return 
_:Health;



Outro exemplo:

Código PHP:
stock SendClientMessageEx(playeridColor, const Message[]) {
      
SendClientMessage(playeridColorMessage);
      return 
1;




RE: Dúvidas sobre stock e forward - xbruno1000x - 27/06/2023

(27/06/2023 11:23)Usuário Aleatório Escreveu: Finalmente entendi mn,obrigado pela ajuda Bruno,mas tava vendo uns sites e fóruns gringos aqui e uns dizia umas coisas sobre o ´´stock´´ e outros explicavam de forma totalmente diferente mano e isso me deixou confuso pra caramba,pode explicar o ´´stock´´ tmb pvf (se n der mt trabalho pra vc)

Stock's são para facilitar. Imagina você ter que reescrever o mesmo código por dezenas de vezes?

Código sem stock:
Código:
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 548 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 465 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 425 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 417 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 487 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 488 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 497 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 563 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 447 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 469){
printf("está em um helicoptero!");
}
Percebe quanta coisa tive que digitar? imagina verificar em vários comandos e ter que ficar reescrevendo isso tudo.

Com stock:
Código:
//A stock
stock IsInHeli(playerid)
{
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 548 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 465 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 425 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 417 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 487 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 488 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 497 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 563 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 447 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 469)
    return true;
else
    return false;
}
Código:
//O mesmo código ali de cima, dessa vez com o uso de stock
if(IsInHeli(playerid)){
printf("está em um helicoptero!");
}

Com as stocks você consegue reduzir drasticamente os códigos.