Quero desejar a todos e principalmente os leitores do blog, um feliz Natal!
A Wiki do IV-MP já está no ar e já tem até algumas funções, resources, tutoriais etc.
Segue o link abaixo:
http://wiki.iv-multiplayer.com
Teste do dia 13 de Outubro, testando as melhorias na sincronização:
Teste do dia 16 de Setembro, testando as funções SetPlayerTime e AddPlayerWeapon:
Teste do dia 11 de Agosto, testando a sincronização dos veículos:
Conforme eu for achando os vídeos dos testes no youtube eu vou postando no blog. Realmente está ficando muito bom o IV-MP!
Para quem não sabe, estão desenvolvendo um multiplayer independente da live. Esse novo multiplayer promete ter a mesma liberdade do SA:MP, multiplayer para GTA San Andreas, onde é possivel criar os seus próprios modos de jogos, os famosos gamemodes e scripts para GTA IV online.
Esse novo IV-MP é o sonho para qualquer fanatico pelo SA:MP e pelo GTA IV, para quem sonha poder fazer tudo o que dá para fazer no SA:MP no GTA IV, o que é o meu caso.
As linguagens utilizadas para desenvolver scripts para IV-MP serão Lua (uma linguagem brasileira) e Squirrel.
Imagine criar um RPG ou um Gang War para GTA IV, isso séria fantasico!
Atualmente o progresso do desenvolvimento do programa está em 70% e poderá ser acompanhado no site: http://www.iv-multiplayer.com.
O site ainda está em construção, mas tem o fórum onde são postado os vídeos dos testes feitos pelos criadores e outras coisas também.
Até sair o IV-MP, que acredito que falte pouco tempo para sair, eu vou me aprofundar no aprendizado dessas duas linguagens de programação e quem sabe, em breve, colocar tutoriais e gamemodes aqui no blog para IV-MP!
Acho que talvez o bom e velho SA-MP fique ultrapassado com a vinda do IV-MP.
Estou aguardando ansiosamente e torço para que este projeto de certo!
Muita gente entra em servidores cheio de rampas, pontos e outras coisas... Ai da aquela vontade do cão de criar um gamemode com seu próprio mapa. Mas como fazer um mapa pra samp?
Primeiro baixe o MTA:
http://mtavc.com/124.html
Instale o programa e execute-o.
Irá abrir o GTA e aparecerá um menu diferente do jogo. Clique em Map Editor, espere carregar e então você aparecerá em Ganton, com um mirazinha no centro e alguns icones na tela.
Para usar o cursor, que servirá para clicar nos ícones, tecle F.
Para acessar a lista de objetos e adiciona-los no jogo faça o seguinte:
Depois de ter teclado F, vá com o cursor até o lado inferior esquerdo no ícone de uma caixa, chamada Object.
Aparecerá milhares de objetos do jogos, para adiciona-los ao jogo de dois cliques no item da lista ou de OK.
Pronto, você adicionou o objeto no jogo, mas você não poderá mexer a camera para coloca-lo onde você quiser, terá que ir com as setinhas, mas para resolver isso bastar teclar F de novo.
Quando quiser deixa-lo no lugar definitivo apenas de um clique.
Caso queria excluir o objeto apenas tecle delete.
Para ver a lista de objetos que você adicionou, com a teclada F precionada, vá até a parte de cima da tela e clique em current elements. Você poderá excluir, ir até o objeto, mudar sua posição, seleciona-lo etc.
Comandos básicos:
Modo cursor ON/OFF: Tecla F
Mover objeto: Setas
Mover camera: WSAD
Mover objeto para cima: Page Up
Mover objeto para baixo: Page Down
Rotacionar: ctrl + setas/page down/page up
Mover objeto com modo cursor OFF: Mouse
Para salvar o objeto clique, com a tecla F pressionada, em Save As ( caso for a primeira vez ) ou em Save (caso for edição de um mapa já existente).
Para abrir um mapa, também com a tecla F pressionada, clique em Open e para criar um novo mapa clique em New.
Para testar o mapa, jogando com o CJ, tecle F5 ou clique em Test. Para sair do teste apenas tecle F5 novamente.
Para adicionar veículos clique em Vehicles, no lado inferior esquerdo da tela, são quase os mesmos comandos de manipular objetos.
Para converter, você precisar pegar seu arquivo salvo do mapa, que geralmente fica na pasta:
C:\Arquivos de programas\MTA San Andreas\server\mods\deathmatch\resources
Dentro de uma pasta com o mesmo nome do mapa.
Entre no site:
http://gtamap.delux-host.com/converter/
Selecione para qual formato seu mapa será convertido e então clique em "Arquivo...", procure pelo seu mapa (nomedomapa.map) e clique em abrir.
Ele automaticamente será convertido então na parte de baixo do site copie as linhas de código e introduza-as em seu gamemode ou sei lá o que!
Prontinho! :D
Se você está tentando entrar no site do SA-MP, mas não consegue, é porque está bloqueado para a América Latina.
Uma maneira fácil e rápida de acessá-lo, sem fazer altas gambiarras ou resetar o modem sem parar até que seu IP mude para um que não esteja bloqueado, é por proxys.
No site abaixo existe uma lista de proxys publicos que podem ser usados para acessar qualquer site de uma maneira que disfarce seu IP (não é 100% seguro que você será totalmente disfarçado):
http://proxy.org/
No lado direito do site está a lista e um campo de formulario. Para entrar no site desejado coloque a URL do site no campo de formulario, escolha um proxy publico na lista que está abaixo do campo (caso queria um proxy aleatorio deixe em "*** random proxy ***").
Pronto!
O único problema é que eu até agora não achei nenhum proxy publico que deixe você fazer downloads dos sites que você acessa, nem ver vídeos etc e tal.
Praticamente, isso só servirá para ver a wiki do samp. ^^
Algumas regras, caso deseje colaborar com o blog.
Se quer colaborar envie o conteúdo para: cronosblog@hotmail.com
1º - Não será permitido envio de aplicativos ou arquivos executaveis.
Motivo: Pode conter vírus.
2º - Não serão aceitas fotos ou links que não sejam dos anexos do msn ou empresas conhecidas, como o youtube.
Motivo: Pode conter vírus.
3º - Esse e-mail é e-mail para enviar conteúdo, para colaborar com o blog. Caso contrario o e-mail será ingnorado.
4º - Conteúdo apenas sobre GTA, SA-MP ou PAWN. Caso contrario o e-mail será ingnorado.
E sobre as pessoas que não param de tentar redefinir a senha do e-mail e mandam e-mails com vírus, eu só sinto por elas. É assim que nascem é assim que morrem, idiotas para sempre!
Obrigado pela colaboração.
Pedagio em Las Venturas com sistema automatico se o player passar com um veiculo desconta o dinheiro e aparece a mensagem na tela: "Pagando Pedagio", "Pedagio Pago".
No arquivo .pwn diz que foi feito por [FBI]Bryan (eu acho meio dificil de ter sido ele), caso os créditos estejam errados, mande um e-mail para: cronosblog@hotmail.com
Pessoal, estou vendo gente perguntando para mim se o e-mail de colaboração com o blog que me mandaram não foi aceito.
Então, eu ainda não li os e-mails, estou lendo agora, não tive tempo de verificar o e-mail do Cr0Nos Blog ultimamente.
Obrigado pela compreensão.
Primeiramenta va ate a linha: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
se no seu GameMode não tiver ela adicione.
Embaixo do public coloque este code:
/* Se o jogador apertar o BOTÃO DE BUZINA E ESTIVER DENTRO DE UM VEÍCULO */
if((newkeys == KEY_HORN) && (IsPlayerInAnyVehicle(playerid)))
{
// ENTÃO ELE PROCESSA O QUE ESTÁ AQUI
}
return 1;
}
--explicação--
o if está dizendo que se o jogador estiver em um carro e aperta o botão da busina "H" ou "CapsLook" (Que neste caso é a key "horn") o portão ira abrir (Ou o que você colocou ali no code)
Obs:. Não se esqueça de por o define: #define KEY_HORN 2
Bom dia, senhores leitores do blog do Cronos, eu sou o novo colaborador, antigo [JPP]MrBean, e hoje, vou ensinar vocês a salvar as coisas...
-- Introdução --
Voces vao ver o que salvar com o que eu vou ensinar voces a fazerem, claro que voces podem se aprimorar mais, mais apenas vou ensinar o básico...
enum aAcc
{
aPassword[128],
aScore,
aCash,
Float:aX,
Float:aY,
Float:aZ,
Float:aA,
aLogged,
}
Como visto acima, nós usamos apenas uma variável em vez de colocar uma variável pra cada coisa ocupando mais memória...
new AccountInfo[MAX_PLAYERS][aAcc];
A variável acima, será o que vai reconhecer o PlayerID do jogador para salvar as informaçoes...
-- Criando, Carregando e Salvando contas --
- Registrando
forward RegisterPlayer(playerid, password[]);
public RegisterPlayer(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
new name[MAX_PLAYER_NAME], str[128];
GetPlayerName(playerid, name, sizeof name);
format(str, sizeof str, "%s.ini", name);
new File:account = fopen(str, io_write);
if (account)
{
strmid(AccountInfo[playerid][aPassword], password, 0, strlen(password), 128);
AccountInfo[playerid][aCash] = GetPlayerMoney(playerid);
AccountInfo[playerid][aScore] = GetPlayerScore(playerid);
GetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
GetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
new file[128];
{
format(file, sizeof file, "Password: %s\n", AccountInfo[playerid][aPassword]);
{ fwrite(account, file); }
format(file, sizeof file, "Grana: %d\n",AccountInfo[playerid][aCash]);
{ fwrite(account, file); }
format(file, sizeof file, "Score: %d\n", AccountInfo[playerid][aScore]);
{ fwrite(account, file); }
format(file, sizeof file, "X: %f\n",AccountInfo[playerid][aX]);
{ fwrite(account, file); }
format(file, sizeof file, "Y: %f\n",AccountInfo[playerid][aY]);
{ fwrite(account, file); }
format(file, sizeof file, "Z: %f\n",AccountInfo[playerid][aZ]);
{ fwrite(account, file); }
format(file, sizeof file, "Angulo: %f\n",AccountInfo[playerid][aA]);
{ fwrite(account, file); }
}
fclose(account);
SendClientMessage(playerid, 0x21DD00FF, "Voce foi registrado, agora logue-se.");
}
}
return 1;
}
- Agora que a conta foi criada vamos fazer o jogador se logar...
forward LoginPlayer(playerid, password[]);
public LoginPlayer(playerid, password[])
{
new name[MAX_PLAYER_NAME], str[128];
GetPlayerName(playerid, name, sizeof name);
format(str, sizeof str, "%s.ini", name);
new File:account = fopen(str, io_read);
if (account)
{
new pass[256];
new passres[128], value[128];
fread(account, pass, sizeof pass);
passres = GetFileString(pass);
if (!strcmp("Password", passres))
{
value = GetFileValue(pass);
strmid(AccountInfo[playerid][aPassword], value, 0, strlen(value)-1, 128); // -1 to remove the extra space(\n)
}
if (!strcmp(AccountInfo[playerid][aPassword], password, true))
{
while (fread(account, pass, 256))
{
passres = GetFileString(pass);
if (strfind(passres, "Cash") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aCash] = strval(value);
}
if (strfind(passres, "Score") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aScore] = strval(value);
}
if (strfind(passres, "X") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aX] = floatstr(value);
}
if (strfind(passres, "Y") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aY] = floatstr(value);
}
if (strfind(passres, "Z") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aZ] = floatstr(value);
}
if (strfind(passres, "Angle") != -1)
{
value = GetFileValue(pass);
AccountInfo[playerid][aA] = floatstr(value);
}
}
fclose(account);
AccountInfo[playerid][aLogged] = 1;
}
else
{
SendClientMessage(playerid, 0xE60000FF, "Senha errada.");
fclose(account);
return 1;
}
GivePlayerMoney(playerid, AccountInfo[playerid][aCash]);
SetPlayerScore(playerid, AccountInfo[playerid][aScore]);
SetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
SetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
SendClientMessage(playerid, 0x21DD00FF, "Logado com sucesso");
printf("%s logou", name);
}
return 1;
}
Agora vamos salvar....
forward SavePlayer(playerid);
public SavePlayer(playerid)
{
if(IsPlayerConnected(playerid))
{
if(AccountInfo[playerid][aLogged] == 1)
{
new name[MAX_PLAYER_NAME], str[128];
GetPlayerName(playerid, name, sizeof name);
format(str, sizeof str, "%s.ini", name);
new File:account = fopen(str, io_write);
if (account)
{
AccountInfo[playerid][aCash] = GetPlayerMoney(playerid);
AccountInfo[playerid][aScore] = GetPlayerScore(playerid);
GetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
GetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
new file[128];
{
format(file, sizeof file, "Password: %s\n", AccountInfo[playerid][aPassword]);
{ fwrite(account, file); }
format(file, sizeof file, "Grana: %d\n",AccountInfo[playerid][aCash]);
{ fwrite(account, file); }
format(file, sizeof file, "Score: %d\n", AccountInfo[playerid][aScore]);
{ fwrite(account, file); }
format(file, sizeof file, "X: %f\n",AccountInfo[playerid][aX]);
{ fwrite(account, file); }
format(file, sizeof file, "Y: %f\n",AccountInfo[playerid][aY]);
{ fwrite(account, file); }
format(file, sizeof file, "Z: %f\n",AccountInfo[playerid][aZ]);
{ fwrite(account, file); }
format(file, sizeof file, "Angulo: %f\n",AccountInfo[playerid][aA]);
{ fwrite(account, file); }
}
fclose(account);
}
}
}
return 1;
}
-- AGORA FAZENDO O BONECO SALVAR MESMO --
public OnPlayerDisconnect(playerid, reason)
{
SavePlayer(playerid);
return 1;
}
Isso vai salvar quando ele sair =D
public OnPlayerConnect(playerid)
{
AccountInfo[playerid][aCash] = 0;
AccountInfo[playerid][aScore] = 0;
AccountInfo[playerid][aX] = 0;
AccountInfo[playerid][aY] = 0;
AccountInfo[playerid][aZ] = 0;
AccountInfo[playerid][aA] = 0;
strmid(AccountInfo[playerid][aPassword], "-", 0, 1, 1);
return 1;
}
Isso vai criar um pedaço da conta quando ele entrar =D
-- AGORA OS COMANDOS --
new cmd[128], tmp[128], idx;
cmd = strtok(cmdtext, idx);
if (!strcmp(cmd, "/logar", true))
{
new tmppass[128];
if(AccountInfo[playerid][aLogged] == 1) return SendClientMessage(playerid, 0xE60000FF, "Você já está logado.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xF97804FF, "USE: /logar [password]");
new plname[MAX_PLAYER_NAME];
GetPlayerName(playerid, plname, sizeof plname);
format(plname, sizeof plname, "%s.ini", plname);
if(!fexist(plname)) return SendClientMessage(playerid, 0xE60000FF, "Por favor registre-se primeiro");
strmid(tmppass, tmp, 0, strlen(cmdtext), 128);
Encrypt(tmppass);
LoginPlayer(playerid, tmppass);
return 1;
}
if (!strcmp(cmd, "/registrar", true))
{
if(AccountInfo[playerid][aLogged] == 1) return SendClientMessage(playerid, 0xE60000FF, "Você já está logado.");
new plname[MAX_PLAYER_NAME];
GetPlayerName(playerid, plname, sizeof plname);
format(plname, sizeof plname, "%s.ini", plname);
new File: hFile = fopen(plname, io_read);
if (hFile)
{
SendClientMessage(playerid, 0xE60000FF, "Alguem já está usando esse nick.");
fclose(hFile);
return 1;
}
new tmppass[128];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xF97804FF, "USE: /registrar [password]");
strmid(tmppass, tmp, 0, strlen(cmdtext), 128);
Encrypt(tmppass);
RegisterPlayer(playerid, tmppass);
return 1;
}
-- E AGORA AS FUNÇOES DE PROTEÇAO DE SENHA --
stock Encrypt(string[]) // Made by Y_Less
{
for(new x=0; x < class="pawnkeyword">if(string[x] > (0xff))
{
string[x] -= 256;
}
}
}
stock strtok(const string[], &index,seperator=' ')
{
new length = strlen(string);
new offset = index;
new result[128];
while ((index < class="pawnkeyword">if ((index < class="pawnkeyword">return result;
}
Gente, de meu próximo tutorial, vou ensinar a usar dini, esse é so para voces verem mesmo que pode-se fazer sem usar outro include...
A diretiva #define serve para substiuir um valor ou script de uma linha por uma palavra de sua escolha. Por exemplo:
#include
#define SKABUSKA print("Oi!");
main()
{
SKABUSKA
}
A segunda linha vai definir a palavra SKABUSKA para que seja a "representante" da função print("Oi");.
A terceira linha, a função main() é obrigatória para inicializar seu gamemode.
Dentro das chaves ( { e } ) ou corpo da função, colocamos a palavrava SKABUSKA que irá representar a função print("Oi");.
Assim depois de compilar(F5) o script, inicie o seu servidor com o gamemode que contenha esse script e veja na tela do console do windows que aparecerá a palavra "Oi!". O resultado seria o mesmo se fizessimos desse jeito:
#include
main()
{
print("Oi!");
}
Declaramos o nome da profissão com a diretiva #define e colocamos um valor para que seja substituido pelo nome da profissão. Por exemplo:
#define DESEMPREGADO 0
#define POLICIAL 1
Esses valores seriam os IDs (ou números de indentificação) das profissões. Para setar a profissão você precisa atribuir o valor, que no caso seria o número que repesenta a profissão (ID), à uma array, se você não sabe o que são arrays, clique aqui.
Assim não precisamos nos preocupar de memorizar o ID de cada profissão.
Essa técnica pode ser aplica na criação de gangs, profissões e inúmeras coisas, mas não tratarei disso nesse tutorial.
E é assim que funciona a diretiva #define.
Até mais pessoal.
Feito por: Cr0Nos
Arrays, conhecidades também como vetores ou matrizes, são um conjunto de váriaveis com o mesmo nome, porém, quando as utilizamos, nos referimos à cada uma por um número entre colchetes ( [ e ] ), esses são os elementos da array.
São arrays de uma dimensão. Por exemplo:
new Array[10];
Nesse caso teriamos uma array com 10 elementos (dez variaveis com o mesmo nome representada por um número).
O começo de uma array é sempre 0, sendo assim:
Por exemplo:
new MinhaArray[1000];
O começo dessa array é 0 e o final é 999.
Para acessar cada elemento da array, temos que nos referir ao número do elemento que está entre colchetes. Por exemplo:
new MinhaArray[10];
MinhaArray[2] = 3;
Nesse exemplo declaramos a array MinhaArray e em seguida atribuimos ao segundo elemento da mesma o valor de 3 inteiros.
As arrays são muito úteis para várias coisas, ai vai um exemplo de como utilizá-las em seu gamemode ou filterscript:
No exemplo a seguir mostrarei como utilizar arrays para setar uma profissão à um certo ID de um certo player:
//declaração da array
new Profissao[MAX_PLAYERS];
//utilizando a array para setar a profissão ao player
Profissao[playerid] = POLICIAL;
Depois colocamos o valor do elemento playerid (ID do player) como POLICIAL.
Caso não saiba o motivo de colocar POLICIAL como valor de uma array, veja o tutorial "Diretiva #define" clicando aqui.
Sobre a constante MAX_PLAYERS: Cada servidor de SA-MP tem uma quantidade limitada de jogadores. A constante MAX_PLAYERS serve para capturar o número do limite de players do servidor e assim adicionar elementos, equivalente ao limite de players, à array, no nosso caso, a array Profissao.
Sobre o playerid: O playerid guarda o ID de cada player, quando se entra em um servidor, cada player recebe um ID, que seria como um número de indentificação, os IDs dos players não são fixos, eles mudam, se você entrar e ver que seu ID é 20, depois você sai do servidor e alguém entra no servidor e depois você decide entrar de novo, seu ID mudará, provavelmente, para 21. Então, em termos de programação, o playerid seria como acessar o elemento da array onde o elemento seria o ID do jogador, para que quando você for setar a profissão, setar para UM ID especifico em vez de todos.
Se você ainda não entendou vou fazer uma explicação melhor:
O player vai e digita um comando e vira policial.
Graças ao playerid, apenas o player que digitou o comando vai virar policial, em vez de todos.
Arrays podem ser usadas para fazer diversas coisas (como sistema de level etc.) e também são muito poderosas e muito úteis na hora de programar.
Na segunda parte desse tutorial veremos as Arrays Bidimensionais, ou seja, arrays de duas dimensões.
Feito por: Cr0Nos
A Rockstar Games lançou o patch de correções versão 1.0.2.0 para a plataforma PC.
Várias mudanças foram feitas, fazendo com que, o seu GTA IV, ganhe mais desempenho em seu computador, além de mais opções nas configurações gráficas.
Acesse o link a seguir e clique em "DOWNLOAD Grand Theft Auto IV Update Version 1.0.2.0", para iniciar o download do novo patch:
http://www.rockstargames.com/support/IV/PC/patch/index.html
Eu instalei esse patch em meu GTA IV e funciona perfeitamente e aumentou muito o desempenho do jogo em meu pc. Antes de instalar o FPS dentro da cidade era 20~30 (com commandline), agora com o novo patch o FPS dentro da cidade é 30~41, além de poder colocar algumas coisas com qualidade mais alta sem perder tanto FPS.
*FPS: Frame Per Second (Frame por Segundo), que significa o número de quadros por segundo de um dispositivo de geração de imagem. (Fonte: Wikipédia)