Primeiro passos
Primeiro, queremos criar algo que possa armazenar nosso contrato (O preço do contrato na cabeça de alguém).
Para isso, vamos simplesmente fazer isso: (NOTA: não vou explicar como você precisa fazer isso, há um tutorial aqui, não consigo encontrar o link atm, vou carregar mais tarde)
Também queremos isso apenas HITMANS pode matar o jogador e obter o dinheiro, não apenas jogadores regulares. Então, também faremos pFaction
Código de peão:
enum pInfo
{
pContract // Isso armazenará o preço do contrato na cabeça de alguém. Se for 0, o sistema irá simplesmente ignorá-lo
pFaction
}
new PlayerInfo [ MAX_PLAYERS ] [ pInfo ] ;
Tudo bem, depois que isso for feito, queremos criar um comando para que alguém possa colocar um contrato na cabeça de outra pessoa. Portanto, precisaremos de ZCMD e SSCANF.
Também
Vamos começar fazendo nosso comando.
Cada comando (no ZCMD) começa com este
Código de peão:
CMD : contrato ( playerid, params [ ] )
Agora, isso não é tão difícil. Depois disso, incluiremos nosso sscanf. Para isso, precisaremos criar algumas novas variáveis.
Código de peão:
CMD : contrato ( playerid, params [ ] )
{
novo pID, recompensa, mensagem1 [ 170 ] , mensagem2 [ 170 ] ;
if ( sscanf ( params, "ud" , pID, bounty ) ) return SendClientMessage ( playerid, COLOR_WHITE, " USAGE : / contract [playerid] [amount]" ) ;
{
Deixe-me separar isso para você.
Código de peão:
novo pID, recompensa, mensagem1 [ 170 ] , mensagem2 [ 170 ] ;
Isso criará nossas novas variáveis. pID será o ID no qual queremos colocar o contrato. A recompensa será o preço que você colocará em sua cabeça. Precisaremos da variável de mensagem para formatar nossas mensagens. Mais sobre isso mais tarde.
Código de peão:
if ( sscanf ( params, "ud" , pID, bounty ) ) return SendClientMessage ( playerid, COLOR_WHITE, " USAGE : / contract [playerid] [amount]" ) ;
Isso fará a varredura se tudo estiver correto. Se você não entende esta parte, vá para o tutorial do sscanf. (Mais uma vez, não conheço o link.)
Também faremos para que ninguém possa colocar um valor negativo na cabeça de um jogador, portanto:
Código de peão:
if ( bounty <= 0 ) return SendClientMessage ( playerid, - 1 , "Você não pode colocar valores negativos na cabeça de um jogador!" ) ;
Depois disso, queremos colocar a recompensa na cabeça dos jogadores. Lembra quando fizemos o pContract? Vamos precisar agora! Vamos armazenar a recompensa no pContract dos jogadores.
Código de peão:
PlayerInfo [ pID ] [ pContract ] = recompensa;
Isso adicionará a recompensa pela cabeça do jogador. Queremos também que o valor em dinheiro seja multado do jogador. Podemos fazer isso muito facilmente. Existe algo útil chamado GivePlayerMoney. Vamos usar isso!
Código de peão:
GivePlayerMoney ( playerid, - bounty ) ;
Como você pode ver, eu fiz isso - generosidade em vez de apenas generosidade. Isso ocorre porque queremos REDUZIR o dinheiro dos jogadores e não ADICIONAR o dinheiro.
Também queremos deixar uma mensagem para que o jogador saiba que fez com sucesso um contrato na cabeça do jogador.
Isso pode ser feito com SendClientMessage. Mas também queremos que o jogador saiba QUANTO ele colocou uma recompensa na cabeça do jogador. Portanto, precisaremos de nosso bom amigo chamado format!
Código de peão:
format ( message1, sizeof ( message1 ) , "Você colocou um contrato na cabeça dos jogadores por $% d" , recompensa ) ;
Como você pode ver, usei minha variável message1. É obrigatório que message1 seja um array, ou isso não funcionará. Também usei% d e, no final, coloquei bounty. Usamos% d quando queremos chamar um número e% s quando queremos chamar uma string. Neste comando, ele chamará um número, a recompensa que colocamos na cabeça do jogador, portanto usamos% d. Depois disso, diremos ao servidor o que% d precisa ser. Aqui precisa ser nossa generosidade, então colocamos isso no final! Tudo bem, formatamos nossa mensagem, mas agora precisamos enviá-la. Portanto, usamos SendClientMessage!
Código de peão:
format ( message1, sizeof ( message1 ) , "Você colocou um contrato na cabeça dos jogadores por $% d" , recompensa ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
Não é tão difícil, eu acho. Aqui estamos apenas enviando nossa mensagem1 para o jogador que está chamando o comando.
É assim que seu código deve estar agora
Código de peão:
CMD : contrato ( playerid, params [ ] )
{
novo pID, recompensa, mensagem1 [ 170 ] , mensagem2 [ 170 ] ;
if ( sscanf ( params, "ud" , pID, bounty ) ) return SendClientMessage ( playerid, COLOR_WHITE, " USAGE : / contract [playerid] [amount]" ) ;
if ( bounty <= 0 ) retorna SendClientMessage ( playerid, -1 , "Você não pode colocar valores negativos na cabeça de um jogador!" ) ;
{
GivePlayerMoney ( playerid, - recompensa ) ;
format ( message1, sizeof ( message1 ) , "Você colocou um contrato na cabeça dos jogadores por $% d." , recompensa ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
PlayerInfo [ pID ] [ pContract ] = recompensa;
}
Tudo bem, fizemos o comando. Mas precisamos avisar aos assassinos que há um novo contrato!
Usaremos o loop for. Isso percorrerá todos os jogadores. Faremos isso sempre que o servidor detectar um assassino, ele enviará uma mensagem para ele!
Código de peão:
for ( new i = 0 ; i < MAX_PLAYERS; i ++ )
{
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
{
format ( message2, sizeof ( message2 ) , "HQ: Um jogador colocou um contrato em% s para $% d. " , GetName ( pID ) , bounty ) ;
SendClientMessage ( i, - 1 , mensagem2 );
}
}
Deixe-me explicar isso para você.
Código de peão:
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
Isso verificará se o jogador está na facção Hitman, aqui o número 3. Se o jogador ESTÁ na facção hitman, ele enviará uma mensagem.
Código de peão:
format ( message2, sizeof ( message2 ) , "HQ: Um jogador colocou um contrato em% s por $% d." , GetName ( pID ) , bounty ) ;
SendClientMessage ( i, - 1 , mensagem2 ) ;
(NOTA: GetName provavelmente não está definido em seu script, é muito fácil e há muitos tutoriais sobre ele. Use a útil função de pesquisa!)
Isso enviará uma mensagem para todos que estão na Faction 3. Isso os deixará saiba sobre quem foi feito um contrato e por quanto.
Tudo bem, só precisamos adicionar return 1 no final e nosso comando está pronto! Deve ser assim:
Código de peão:
CMD : contrato ( playerid, params [ ] )
{
novo pID, recompensa, mensagem1 [ 170 ] , mensagem2 [ 170 ] ;
if ( sscanf ( params, "ud" , pID, bounty ) ) return SendClientMessage ( playerid, COLOR_WHITE, " USAGE : / contract [playerid] [amount]" ) ;
if ( bounty <= 0 ) retorna SendClientMessage ( playerid, -1 , "Você não pode colocar valores negativos na cabeça de um jogador!" ) ;
{
GivePlayerMoney ( playerid, - recompensa ) ;
format ( message1, sizeof ( message1 ) , "Você colocou um contrato na cabeça dos jogadores por $% d." , recompensa ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
PlayerInfo [ pID ] [ pContract ] = recompensa;
para( novo i = 0 ; i < MAX_PLAYERS; i ++ )
{
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
{
format ( message2, sizeof ( message2 ) , "HQ: Um jogador colocou um contrato em% s para $% d. " , GetName ( pID ) , recompensa ) ;
SendClientMessage ( i, - 1 , mensagem2 ) ;
}
}
}
return 1 ;
}
Compilado sem erros? Seguindo em frente então! Agora precisamos ir para OnPlayerDeath. Queremos verificar se quando um jogador morre, se ele tem um contrato em sua cabeça e se o assassino é um assassino.
Portanto, agora queremos verificar se nosso killerid está na Hitman Faction, nossa Faction número 3 E se o playerid tem um contrato em sua cabeça. Então, vamos adicionar uma instrução if.
Código de peão:
if ( PlayerInfo [ killerid ] [ pFaction ] == 3 ) // Verifica se o killerid é um hitman
{
if ( PlayerInfo [ playerid ] [ pContract ] > 0 ) // Verifica se o jogador tem um contrato em sua cabeça, se não , o servidor não fará nada.
{
Não é tão difícil. Portanto, agora queremos dizer ao servidor o que ele precisa fazer se o playerid tiver um contrato em sua cabeça e o killerid for um assassino. Queremos que o playerid perca dinheiro e o killerid ganhe dinheiro!
Usaremos nosso amigo GivePlayerMoney e Format novamente.
Código de peão:
nova mensagem1 [ 170 ] ;
GivePlayerMoney ( playerid, - PlayerInfo [ playerid ] [ pContract ] ) ;
format ( message1, sizeof ( message1 ) , "Você foi gravemente ferido por um Hitman e perdeu $% d." , PlayerInfo [ playerid ] [ pContract ] ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
GivePlayerMoney ( killerid, PlayerInfo [ playerid ] [ pContract ] ) ;
Deixe-me explicar isso para você.
Código de peão:
GivePlayerMoney ( playerid, - PlayerInfo [ playerid ] [ pContract ] ) ;
Isso REDUZIRÁ (observe o - no início do PlayerInfo) o dinheiro dos jogadores. A quantidade que queremos reduzir é igual ao contrato em sua cabeça.
Código de peão:
format ( message1, sizeof ( message1 ) , "Você foi gravemente ferido por um Hitman e perdeu $% d." , PlayerInfo [ playerid ] [ pContract ] ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
Foi o que fizemos no nosso comando também, não é tão difícil.
Código de peão:
GivePlayerMoney ( killerid, PlayerInfo [ playerid ] [ pContract ] )
Isso dará ao nosso assassino a recompensa que estava na cabeça dos jogadores. Isso irá ADICIONAR dinheiro (agora observe que eu não uso o -, porque queremos ADICIONAR).
Agora estamos quase lá! Queremos apenas informar os outros pistoleiros que o contrato foi bem-sucedido! Usaremos o loop for novamente.
Código de peão:
para ( novo i = 0 ; i < MAX_PLAYERS; i ++ )
{
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
{
nova mensagem2 [ 170 ] ;
format ( message2, sizeof ( message2 ) , "HQ: Hitman% s assasinou% s por $% d" , GetName ( killerid ) , GetName ( playerid ), PlayerInfo [ playerid ] [ pContract ] ) ;
SendClientMessage ( killerid, - 1 , mensagem2 ) ;
}
}
Também
(Mais uma vez, GetName provavelmente NÃO está definido. Por favor, use a função de pesquisa!)
Então aqui nós percorremos novamente todos os nossos jogadores e enviamos a mensagem para todos os assassinos que estão online! A última coisa que precisamos fazer é definir o contrato dos jogadores novamente para 0.
Código de peão:
PlayerInfo [ playerid ] [ pContract ] = 0 ;
Simples, não é? Isso definirá o contrato de volta para 0.
E terminamos. É assim que o seu comando deve ser:
Código de peão:
CMD :contrato ( playerid, params [ ] )
{
novo pID, recompensa, mensagem1 [ 170 ] , mensagem2 [ 170 ] ;
if ( sscanf ( params, "ud" , pID, bounty ) ) return SendClientMessage ( playerid, COLOR_WHITE, " USAGE : / contract [playerid] [amount]" ) ;
if ( bounty <= 0 ) retorna SendClientMessage ( playerid, -1 , "Você não pode colocar valores negativos na cabeça de um jogador!" ) ;
{
GivePlayerMoney ( playerid, - recompensa ) ;
format ( message1, sizeof ( message1 ) , "Você colocou um contrato na cabeça dos jogadores por $% d." , recompensa ) ;
SendClientMessage ( playerid, - 1 , mensagem1 ) ;
PlayerInfo [ pID ] [ pContract ] = recompensa;
para( novo i = 0 ; i < MAX_PLAYERS; i ++ )
{
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
{
format ( message2, sizeof ( message2 ) , "HQ: Um jogador colocou um contrato em% s para $% d. " , GetName ( pID ) , recompensa ) ;
SendClientMessage ( i, - 1 , mensagem2 ) ;
}
}
}
return 1 ;
}
E isso em seu OnPlayerDeath:
Código de peão:
public OnPlayerDeath ( playerid, killerid, motivo )
{
if ( PlayerInfo [ killerid ] [ pFaction ] == 3 )
{
if ( PlayerInfo [ playerid ] [ pContract ] > 0 )
{
new message1 [ 170 ] ;
GivePlayerMoney ( playerid, - PlayerInfo [ playerid ] [ pContract ]) ;
format ( message1, sizeof ( message1 ) , "Você foi gravemente ferido por um Hitman e perdeu $% d." , PlayerInfo [ playerid ] [ pContract ] ) ;
SendClientMessage ( playerid, COLOR_YELLOW, message1 ) ;
GivePlayerMoney ( killerid, PlayerInfo [ playerid ] [ pContract ] ) ;
para ( novo i = 0 ; i <MÁXIMO DE JOGADORES; i ++ )
{
if ( PlayerInfo [ i ] [ pFaction ] == 3 )
{
nova mensagem2 [ 170 ] ;
format ( message2, sizeof ( message2 ) , "HQ: Hitman% s assasinou% s por $% d" , GetName ( killerid ) , GetName ( playerid ) , PlayerInfo [ playerid ] [ pContract ] );
SendClientMessage ( killerid, COLOR_YELLOW, mensagem2 ) ;
}
}
PlayerInfo [ playerid ] [ pContract ] = 0 ;
}
}
return 1 ;
}
Isso é tudo. Eu sei que este é um longo tutorial, mas espero ter ajudado você! Sinta-se à vontade para me enviar PM com qualquer dúvida!

0 Comentários