SA-MP Forums Archive
[Tutorial] Segurando objetos e interagindo - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+----- Forum: Lançamentos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=56)
+----- Thread: [Tutorial] Segurando objetos e interagindo (/showthread.php?tid=608679)



Segurando objetos e interagindo - cuzido - 03.06.2016

Olб, й meu primeiro tutorial entгo peзo que tenham compreensгo e apontem qualquer falha ou explicaзгo que possa ter ficado difнcil de entender.
Longe de ser um assunto complexo, mas й algo que pode auxiliar muitos novatos a alзar vфos maiores com base no que o tutorial oferece.


Esse sistema de interaзгo com objetos pode servir muito bem para servidores RPG, de sobrevivкncia ou qualquer outro servidor que queira adicionar um toque a mais para que os players tenham uma maior imersгo.
Alguns servidores possuem sistema de fome e sede e utilizam comandos para que o player possa satisfazer essas necessidades, como /comer, /beber e etc.
Uma forma mais imersiva de se utilizar destes sistemas pode ser alcanзada colocando objetos que podem ser consumidos pelo player diretamente em suas mгos, e entгo usando as animaзхes para trazer seus efeitos.

Para isso, vamos utilizar principalmente a callback OnPlayerKeyStateChange, as funзхes SetPlayerAttachedObject e ApplyAnimation.
Secundбrias: EditAttachedObject, OnPlayerEditAttachedObject e OnPlayerDisconnect.
IMPORTANTE: Esse tutorial possui comandos utilizando o include I-ZCMD.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
ESCOLHENDO SEU OBJETO
Isso fica aberto а sua criatividade.
Eu utilizo o site Prineside para pegar as IDs dos objetos que gostaria de ter no servidor para interaзгo. Como exemplo, vamos utilizar o copo de cafй. ID 19835.

COLOCANDO O OBJETO NAS MГOS DO PLAYER
O momento em que o objeto serб colocado nas mгos do player tambйm depende do seu gamemode. Se vocк possui um sistema de inventбrio, por exemplo, vocк pode fazer o objeto aparecer somente caso o player possua tal item.
Como exemplo, vamos utilizar um comando para fazer o copo de cafй aparecer nas mгos do nosso player.
Primeiro, vamos criar trкs variбveis.
PHP код:
new Cafe[MAX_PLAYERS], Bebendo[MAX_PLAYERS], Consumindo[MAX_PLAYERS]; 
IMPORTANTE: NГO SE ESQUEЗA DE LIMPAR ESSAS VARIБVEIS QUANDO O PLAYER DESCONECTAR!
Motivo: Caso o player com ID 2 desconecte com um copo na mгo, sua variбvel Cafe, Bebendo e Consumindo ficaria 1. E entгo, quando um novo player com ID 2 conectasse, ele nгo poderia utilizar o nosso comando para segurar o copo de cafй.
PHP код:
public OnPlayerDisconnect(playeridreason){
    
Cafe[playerid] = 0;
    
Consumindo[playerid] = 0;
    
Bebendo[playerid] = 0;
    return 
1;

No nosso exemplo, o copo de cafй irб aparecer quando o comando /cafe for executado.

PHP код:
CMD:cafe(playerid,params[]){
    if(
Cafe[playerid] == 1) return SendClientMessage(playerid,0xFFFFFFFF,"Vocк jб tem um copo de cafй na mгo!");
    if(
Consumindo[playerid] == 1) return SendClientMessage(playerid,0xFFFFFFFF,"Vocк jб estб com algo nas mгos!");
    
Cafe[playerid] = 1;
    
Consumindo[playerid] = 1;
    
Bebendo[playerid] = 1;
    
SendClientMessage(playerid,0xFFFFFFFF,"Agora vocк estб segurando um copo de Cafй Pelй.");
    
SetPlayerAttachedObject(playerid21983550.10.070.04180.00.00.01.01.01.0);
    return 
1;

Se o player jб estiver com um copo de cafй na mгo, a variбvel Cafe estarб com valor 1, e uma mensagem de erro aparecerб. O mesmo acontece caso ele jб esteja consumindo outro item.
Caso o player nгo esteja consumindo nada, suas variбveis Cafe, Consumindo e Bebendo terгo valor 1, ele receberб uma mensagem informando que estб segurando o copo de cafй na mгo, e entгo terб o objeto colocado em suas mгos com a funзгo SetPlayerAttachedObject.

O nъmero 2 na nossa funзгo se refere ao INDEX(slot) no qual o objeto estб guardado. Hб 10 slots para colocar objetos no player (0-9).
19835 й o Model ID que escolhemos no site Prineside, o copo de cafй.
O nъmero 5 se refere ao Bone do player em que serб colocado nosso copo. Bone 5 seria a mгo esquerda, a razгo para isso й a animaзгo que usaremos em seguida para fazermos o player tomar o cafй no copo.
Os outros nъmeros sгo as coordenadas de posicionamento do nosso objeto no bone do player em questгo. Esse posicionamento foi obtido com a funзгo EditAttachedObject, que pode ser utilizada a partir do momento em que um objeto jб estб colocado no player.
Um exemplo de comando para ajustar posicionamento de objetos seria:
PHP код:
CMD:edit(playerid,params[]){
    
EditAttachedObject(playerid2);
    return 
1;

O nъmero 2 representa o INDEX(slot) do objeto colocado que queremos editar.
Para obter o posicionamento do objeto quando vocк achar a melhor posiзгo e entгo colocar as coordenadas no seu script, utilize o cуdigo presente nessa pбgina: OnPlayerEditAttachedObject. As coordenadas ficarгo disponнveis no painel de controle/server_log.txt do seu servidor.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
OBJETO EM MГOS, E AGORA?
Para o player efetivamente comer ou beber, vamos apertar o botгo da mira (normalmente botгo direito do mouse (RMB)).
Vamos definir o que seria o ato de pressionar o botгo.
PHP код:
#define PRESSED(%0) \
    
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0))) 
E entгo:
PHP код:
public OnPlayerKeyStateChange(playeridnewkeysoldkeys){
    if(
PRESSED(KEY_HANDBRAKE) && Consumindo[playerid] == 1){
        if(
Bebendo[playerid] == 1){
            
ApplyAnimation(playerid"VENDING""VEND_Drink2_P"4.1011111);
            
Consumindo[playerid]++;
            if(
Cafe[playerid] == 1){
                if(
Consumindo[playerid] >= 7){
                    switch(
random(4)){
                        case 
0:{
                            
SendClientMessage(playerid,0xFFFFFFFF,"Seu copo de Cafй Pelй acabou.");
                            
RemovePlayerAttachedObject(playerid2);
                            
Consumindo[playerid] = 0;
                            
Bebendo[playerid] = 0;
                            
Cafe[playerid] = 0;
                        }
                        default:{
                        }
                    }
                }
            }
        }
    }
    return 
1;

Caso nosso player esteja consumindo alguma coisa, pressione o botгo direito do mouse, e o que ele estiver consumindo seja uma bebida, ele farб uma animaзгo para levar o copo ou garrafa atй seu rosto, como se estivesse bebendo, 1 ponto da variбvel Consumindo serб adicionado. Caso essa bebida seja Cafй e os pontos de consumo estejam iguais ou superiores a 7, ele terб uma chance em 4 de terminar a bebida quando apertar o botгo direito do mouse para consumir novamente.
O que define o botгo direito do mouse й KEY_HANDBRAKE. Vocк pode escolher uma outra KEY, sem ser o botгo de mira, nessa pбgina: Keys.
Caso vocк esteja fazendo um sanduнche, hambъrguer ou algum objeto de comer, vocк pode ver outra animaзгo sem ser a "VEND_Drink2_P" nessa pбgina: Animations.
A switch(random(4)) abre 4 possibilidades aleatуrias (case 0, 1, 2 e 3. Default:, neste caso, engloba o case 1, 2 e 3. O que significa que hб 25% de chance da bebida acabar apуs o player beber 7 vezes ou mais.).

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
UTILIDADES
Vocк pode utilizar esse sistema para fazer o player comer, beber, fumar, tomar remйdios, ficar doente, se drogar de alguma forma e tambйm dar efeitos para o player. Por quк o player nгo pode recuperar vida a cada gole que dб em uma garrafa de бgua, ou atй mesmo ficar cada vez mais bкbado a cada gole que dб na cerveja?
O resto fica a cargo da sua criatividade.


Muito obrigado a todos que acompanharem este tutorial atй o fim.
Aguardo crнticas, sugestхes ou elogios (se merecer), haha.
Abraзos.



Re: Segurando objetos e interagindo - Hax0rlib - 04.06.2016

- уtimo tutorial, vai me ajudar muito em alguns projetos que estou desenvolvendo ...


Re: Segurando objetos e interagindo - Ferno - 06.06.2016

Espectacular, simplesmente fabuloso!