[Plugin] SAMPHP - Escrever Gamemodes em PHP
#1


SAMPHP
Escrever Gamemodes em PHP
Versгo actual: 2.0.5
Versгo em desenvolvimento: 2.1.0

Olб a todos!
Este plugin foi originalmente lanзado na бrea inglesa, e como estou actualmente a desenvolver o plugin, vim lanзar na Бrea Portuguesa.

Basicamente, este plugin permite com que os gamemodes sejam desenvolvidos em PHP, numa forma mais estruturada e optimizada.
Para quem nгo conhece PHP, poderб encontrar uma breve descriзгo no wikipйdia(A versгo Inglesa estб actualizada).

O plugin actualmente suporta todas as funзхes do SA-MP(atй а ultima versгo do SA-MP, R4), e dada a flexibilidade que o PHP oferece, todas as funзхes que usavam referкncias para devolver valores(exemplo: GetPlayerPos) agora nгo tкm referкncias, e em troca, devolvem objectos.
Um pequeno exemplo:
PHP код:
$pos GetPlayerPos($playerid);
SendClientMessage($playerid, -1"x = ".$pos->x." y = ".$pos->y." e z = ".$pos->z."."); 
O php tambйm traz muitas funзхes nativas, as quais para nуs as utilizar-mos pelo PAWN iria-mos precisar de plugins.
E бs vezes, a utilizaзгo dos plugins pelo PAWN nem sempre trazem bom resultados.
Esses problemas acabaram agora, com a utilizaзгo de PHP com o plugin SAMPHP.

E isto nгo й tudo.
Como PHP tambйm consiste em programaзгo orientada a objectos, e perto de 99% dos programadores de PHP utilizam objectos na criaзгo de websites, nуs tambйm criamos uma pequena framework.
Assim, permitimos com que seja mais fбcil aceder as funзхes do SA-MP(estas que foram criadas para "procedural programming") pelos objectos.
Um exemplo, em PAWN, para anunciar-mos que um jogador se ligou ao servidor, temos de escrever o cуdigo abaixo:
PHP код:
public OnPlayerConnect(playerid) {
    new 
name[MAX_PLAYER_NAME], mensagem[128]
    
GetPlayerName(playeridnameMAX_PLAYER_NAME);
    
//----
    
format(mensagem128"O jogador %s ligou-se ao servidor!"name);
    
SendClientMessageToAll(0xFF9900mensagem);
    return 
1;

Em PHP sem a framework, fica alguma coisa do gйnero:
PHP код:
function OnPlayerConnect($playerid) {
    
$name GetPlayerName($playerid);
    
SendClientMessageToAll(0xFF9900"O jogador {$name} ligou-se ao servidor!");
    return 
true;

Em PHP com a framework, fica assim:
PHP код:
Event::on("PlayerConnect", function($player) {
    
SendClientMessageToAll(0xFF9900"O jogador ".$player->getName()." ligou-se ao servidor!");
}); 
Por ficar mais pequeno, fica mais fluente, fбcil.
E tambйm, como viram, os Eventos("triggers"), sгo "processados" com o Event:: on(ou Event::after).
Isto permite com que vocкs tenham uma quantidade "ilimitada" de OnPlayerConnect no vosso gamemode(No mesmo ficheiro, ou em vбrios ficheiros), que nгo irб criar problemas.
Basicamente, facilita a criaзгo dos servidores de "multi gamemode".
Tambйm oferece a habilidade de separar perfeitamente o vosso gamemode em secзхes, assim nгo tкm tudo "atafulhado" dentro de um sу ficheiro.

Vamos falar de outra caracterнstica da framework... a criaзгo de caixas de diбlogo!
A criaзгo de diбlogos pelo PAWN й complicado,pois temos de criar o diбlogo, dar um ID ъnico, e processa-lo no OnDialogResponse.
Entгo, nуs criamos uma forma alternativa(e mais fбcil) de criar diбlogos, processa-los e mostra-lo ao jogador.
Por exemplo, O diбlogo de mensagem, com a nossa framework, poderб ser criado e mostrado ao jogador na seguinte forma:
PHP код:
Dialog::create(DIALOG_STYLE_MSGBOX"Olб""Sim""Nгo")
    ->
setInfo("Olб, tudo bem?")
    ->
on("Success", function($player$dialog$inputtext) { 
        
$player->sendClientMessage(0xFF9900"Ainda bem que estб tudo bem!");
    })->
on("Cancel", function($player$dialog$inputtext) {
        
$player->sendClientMessage(0xFF9900"As melhoras entгo!");
    })->
showPlayer($player); 
Para criar um diбlogo para dar "spawn" a um veнculo, usamos o cуdigo abaixo:
PHP код:
Dialog::createList("Spawn Vehicle""Okay""Oh no")
    ->
addRow("Stallion"439)
    ->
addRow("Pizzaboy"448)
    ->
addRow("Turismo"451)
    ->
addRow("Flatbed"455)
    ->
addRow("Yankee"456)
    ->
on("Success", function($player$dialog$id) {
        
$pos $player->getPos();
        
$facing $player->getFacingAngle();
        
$vehicle Vehicle::create($id$pos->x$pos->y$pos->z$facing);
        
$player->putInVehicle($vehicle);
    })->
showPlayer($player); 
Acho que conseguiram ver as vantagens nos cуdigos acima.
Nгo temos de definir um ID para cada diбlogo, nгo temos de utilizar o OnDialogResponse, pois a classe faz logo tudo, e a parte ainda mais "bacana", й que no DIALOG_STYLE_LIST, podemos adicionar cada linha individualmente, assim nгo temos uma linha enorme para criar uma lista.
E nгo й sу!
Pelo facto do PHP ser uma linguagem dinвmica, podemos criar um nъmero ilimitado de diбlogos, sem termos de preocupar-nos com o ID de cada diбlogo.

Adicionar comandos ao Gamemode tambйm tornou-se bбsico com a nossa framework!
Para criar-mos um comando, podemos utilizar os cуdigos abaixo:
PHP код:
Command::register(['/vehicle''/v''/veh'], function($player$params) {
    
$pos $player->getPos();
    
$facing $player->getFacingAngle();
    
$vehicle Vehicle::create($params$pos->x$pos->y$pos->z$facing);
    
$player->putInVehicle($vehicle);
}); 
OU
PHP код:
CMD::register(['/vehicle''/v''/veh'], function($player$params) {
    
$pos $player->getPos();
    
$facing $player->getFacingAngle();
    
$vehicle Vehicle::create($params$pos->x$pos->y$pos->z$facing);
    
$player->putInVehicle($vehicle);
}); 
Como viram, podemos criar comandos, seja com CMD ou Command, e podemos registar vбrios comandos que irгo "apontar"(executar) o mesmo cуdigo, neste caso, /vehicle, /v e /veh irгo executar o mesmo cуdigo, definido uma ъnica vez.
O cуdigo acima escrito irб criar um veнculo com o ID passado pelo parвmetro, na mesma posiзгo que o jogador, e com o mesmo вngulo, e irб colocar o jogador dentro do veнculo.

Outra caracterнstica, variбveis de cada jogador.
No PAWN, muitas das vezes temos de criar estruturas e vectores(arrays) enormes para guardarem a informaзгo de cada jogador que nуs queremos.
Isto iria consistir em criaзгo de variбveis globais, e ao uso desnecessбrio de memуria.
Um exemplo, para guardar-mos a informaзгo sobre se o jogador й procurado ou nгo:
pawn Код:
new gEProcurado[MAX_PLAYERS];
Depois, para modificar o valor, temos de usar o cуdigo abaixo:
pawn Код:
gEPRocurado[playerid] = true;
E quando o jogador sair do servidor, temos de "dar reset" a este valor:
pawn Код:
gEPRocurado[playerid] = false;
Com a nossa framework, nгo temos de definir as variбveis, sу temos de ir buscar o objecto do jogador, e inicializar a variбvel.
Exemplo:
PHP код:
$player Player::find(0); // Player::find(<id do jogador>);
$player->EProcurado true
E quando o jogador sair do servidor, a variбvel й automaticamente apagada, e logo a seguir, o objecto do jogador.

Outra caracterнstica relacionada com os eventos em si й o "OnPlayerUpdate" para um jogador especial
Por exemplo, temos um evento especial para um jogador especнfico.
Aquilo que temos de fazer й retirar o objecto do jogador("Instвncia"), e escrever o Cуdigo abaixo:
PHP код:
$player->on("Update", function($player) {
    echo 
"Only called for ".$player->getName().".";
}); 
Uma maneira "bacana","fixe" de correr o evento do "OnPlayerUpdate" para o jogador em causa, como por exemplo, se desconfiar-mos que o jogador em causa й um cheater/hacker.

Se quiserem ver um script em acзгo, podem ver o gamemode GrandLarc, convertido para PHP, no GitHub.

INSTALAЗГO
Por aquilo que verifiquei, а vбrias pessoas a terem problemas com a versгo deste plugin para linux.
No momento, para o instalarem, tкm de mover o libphp5.so(oferecido no pacote) para o /usr/lib
E instalarem normalmente o plugin(e este, deverб comeзar a trabalhar).

WINDOWS
1. Efectuar o Download do pacote.(ver links abaixo)
2. Extrair dentro da pasta do servidor.
3. Adicionar plugins samphp ao server.cfg
4. Modificar a linha do gamemode0 para gamemode0 empty
5. Se tiverem erros relacionados com o msvcr130.dll, tкm de instalar o microsoft visual c++ redistributable 2013.

CRIAR UM GAMEMODE
Existem trкs maneiras para criar um gamemode.
Primeira: Criar o Gamemode totalmente no gamemode.php na pasta PHP;
Segunda: Criar uma pasta dentro da pasta PHP, desenvolver lб o gamemode, e depois no ficheiro gamemode.php na pasta php, dar "include" do ficheiro principal do vosso gamemode
Terceira: Criar uma pasta dentro da pasta PHP, desenvolver lб o gamemode, e no server.cfg adicionar a linha:
samphpmode <nome do gamemode>

AVISO: Na segunda e na terceira maneira, os ficheiros principais tкm de obrigatoriamente chamarem-se gamemode.php
Para usarem a framework, no inнcio do ficheiro PHP, tкm de incluir o ficheiro boostrap/core.php

LINKS
GitHub
ChangeLog
Downloads para o S.O Windows
SAMPHP - https://github.com/crodriguespt/SAMPHP/releases
Microsoft visual c++ redistributable 2013 para x86 - http://www.microsoft.com/en-us/downl....aspx?id=40784
Obrigado por terem tido paciкncia a lerem este tуpico, e possivelmente de virem utilizar este plugin.
Se encontrarem algum erro gramatical, ou mesmo erro no cуdigo, que tenha escrito acima, agradeceria que mandassem uma mensagem privada, assim poderei corrigi-los.(Gastei perto de uma hora a escrever tudo.. estou cansado.)
Se tiverem alguma recomendaзгo, se encontraram um bug, ou tкm outra "visгo" como este plugin pode ser construнdo/mantido, agradeзo que faзam um "post", enviem uma mensagem privada ou abram um "issue" no github.


SISTEMAS OPERATIVOS TESTADOS
Windows 7 home premium x64
Windows 7 ultimate x64
Reply
#2

Nova versгo lanзada a 21-12-2014

Informaзхes sobre esta versгo:
Код:
  1. Foram arranjados bugs crнticos
  2. Foram adicionadas 4 funзхes novas, GetPlayerCount, GetPlayerList, KillAllTimers e GetTimersCount
A possibilidade de usar as callbacks de outros plugins ainda nгo foi posta de fora, e poderб ser adicionada nas versхes seguintes.
Reply
#3

Parabйns pela framework, isso influencia os membros a estudar a linguagem
++rep;

@edit: Da pra estudar PHP de uma forma divertida.
Reply
#4

Parabйns pelo plugin, vou testar isso em breve e darei um edit, altamente recomendavel pra quem esta estudando PHP
+REP
Reply
#5

Nunca fui fan desse tipo de alteraзхes, acho desnecessбrio.

Contudo e bom para quem gosta da linguagem.
Reply
#6

Quote:
Originally Posted by Schocc
Посмотреть сообщение
Parabйns pela framework, isso influencia os membros a estudar a linguagem
++rep;

@edit: Da pra estudar PHP de uma forma divertida.
Quote:
Originally Posted by O_KoDi
Посмотреть сообщение
Parabйns pelo plugin, vou testar isso em breve e darei um edit, altamente recomendavel pra quem esta estudando PHP
+REP
Obrigado pelos comentбrios positivos!
Quote:
Originally Posted by PT
Посмотреть сообщение
Nunca fui fan desse tipo de alteraзхes, acho desnecessбrio.

Contudo e bom para quem gosta da linguagem.
Й pena que aches este tipo de alteraзхes desnecessбrio...
Mas mesmo assim, agradeзo o teu comentбrio.
Reply
#7

Bem legal o plugin, porйm eu prefiro o original.

Original sempre й melhor, modificaзхes nunca serб a mesma coisa. Porйm, parabйns pelo plugin, uma outra forma й legal.
Reply
#8

Parabйns, podia fazer uma Include jб que vocк criou este tipo de cуdigo, continue assim, vejo que isso vai dar certo..
Reply
#9

Muito bom cara, parabйns!
Reply
#10

Й isso kikito, muito bom
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)