SAMPHP - Escrever Gamemodes em PHP -
GWMPT - 20.11.2014
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(playerid, name, MAX_PLAYER_NAME);
//----
format(mensagem, 128, "O jogador %s ligou-se ao servidor!", name);
SendClientMessageToAll(0xFF9900, mensagem);
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
Re: SAMPHP - Escrever Gamemodes em PHP -
GWMPT - 20.11.2014
Nova versгo lanзada a 21-12-2014
Informaзхes sobre esta versгo:
Код:
- Foram arranjados bugs crнticos
- 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.
Re: SAMPHP - Escrever Gamemodes em PHP -
Schocc - 20.11.2014
Parabйns pela framework, isso influencia os membros a estudar a linguagem

++rep;
@edit: Da pra estudar PHP de uma forma divertida.
Re: SAMPHP - Escrever Gamemodes em PHP -
GM_KoDi - 20.11.2014
Parabйns pelo plugin, vou testar isso em breve e darei um edit, altamente recomendavel pra quem esta estudando PHP
+REP
Re: SAMPHP - Escrever Gamemodes em PHP -
PT - 20.11.2014
Nunca fui fan desse tipo de alteraзхes, acho desnecessбrio.
Contudo e bom para quem gosta da linguagem.
Re: SAMPHP - Escrever Gamemodes em PHP -
GWMPT - 20.11.2014
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.
Re: SAMPHP - Escrever Gamemodes em PHP -
ProKillerpa - 20.11.2014
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.
Re: SAMPHP - Escrever Gamemodes em PHP -
Pablo098 - 20.11.2014
Parabйns, podia fazer uma Include jб que vocк criou este tipo de cуdigo, continue assim, vejo que isso vai dar certo..
Re: SAMPHP - Escrever Gamemodes em PHP -
PaulMcCartney - 20.11.2014
Muito bom cara, parabйns!
Re: SAMPHP - Escrever Gamemodes em PHP -
RebeloX - 20.11.2014
Й isso kikito, muito bom