20.11.2014, 16:57
(
Последний раз редактировалось GWMPT; 07.01.2015 в 18:01.
)
SAMPHP
Escrever Gamemodes em PHP
Versгo actual: 2.0.5
Versгo em desenvolvimento: 2.1.0
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.".");
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;
}
PHP код:
function OnPlayerConnect($playerid) {
$name = GetPlayerName($playerid);
SendClientMessageToAll(0xFF9900, "O jogador {$name} ligou-se ao servidor!");
return true;
}
PHP код:
Event::on("PlayerConnect", function($player) {
SendClientMessageToAll(0xFF9900, "O jogador ".$player->getName()." ligou-se ao servidor!");
});
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);
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);
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);
});
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);
});
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];
pawn Код:
gEPRocurado[playerid] = true;
pawn Код:
gEPRocurado[playerid] = false;
Exemplo:
PHP код:
$player = Player::find(0); // Player::find(<id do jogador>);
$player->EProcurado = true;
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().".";
});
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=40784Obrigado 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