Sistema de Objetos v0.2 | Sistema de Portões v0.1

Ir em baixo

Sistema de Objetos v0.2 | Sistema de Portões v0.1

Mensagem por Diego^ em Ter Ago 16, 2016 1:12 am

Olá, dessa vez trago a nova versão melhorada do sistema de objetos, agora todos podem criar um objeto ao mesmo tempo. Trago também um sistema de portões.

Eventos

Código:
function onScriptLoad()
{
db <- ConnectSQL( "DataBase.db" );

Map <- array( GetMaxPlayers(), null );
i_1PortaoPos <- array( GetMaxPlayers(), null );
i_1PortaoRot <- array( GetMaxPlayers(), null );
i_2PortaoPos <- array( GetMaxPlayers(), null );
i_2PortaoRot <- array( GetMaxPlayers(), null );

P <- BindKey( true, 0x50, 0, 0 );

Portao <- [];

QuerySQL( db, "CREATE TABLE IF NOT EXISTS Objects ( Model NUMERIC, World NUMERIC, PX FLOAT, PY FLOAT, PZ FLOAT, Alpha NUMERIC, RX FLOAT, RT FLOAT, RZ FLOAT, Creator TEXT )" );
QuerySQL( db, "CREATE TABLE IF NOT EXISTS Portoes ( CasaID NUMERIC, Model NUMERIC, Pos1 TEXT, Rot1 TEXT, Pos2 TEXT, Rot2 TEXT )" );
CarregarPortoes();
CarregarObjetos();
}

function onKeyDown( player, key )
{
if ( key == P ) MoverPortao( player );
}

function onPlayerJoin( player )
{
i_1PortaoPos[ player.ID ] = null;
i_1PortaoRot[ player.ID ] = null;
i_2PortaoPos[ player.ID ] = null;
i_2PortaoRot[ player.ID ] = null;
}

Funções

Código:

function GetTok(string, separator, n, ...)
{
local m = vargv.len() > 0 ? vargv[0] : n,
tokenized = split(string, separator),
text = "";
if (n > tokenized.len() || n < 1) return null;
for (; n <= m; n++)
{
text += text == "" ? tokenized[n-1] : separator + tokenized[n-1];
}
return text;
}

function NumTok(string, separator)
{
local tokenized = split(string, separator);
return tokenized.len();
}

function IsFloat( value )
{
if ( typeof value == "float" ) return true;
try
{
if ( value.find( "." ) != null )
{
value = value.tofloat();
return true;
}
else return false;
}
catch(e) return false;
}

function IsInRangeOfPoint( a, range, x, y, z )
{
local px = a.Pos.x, py = a.Pos.y, pz = a.Pos.z;
px -= x, py -= y, pz -= z;
return ( ( px * px ) + ( py * py ) + ( pz * pz ) ) < ( range * range );
}

function MoverPortao( player )
{
if ( player.IsSpawned )
{
for ( local i = 0; i < Portao.len(); i++ )
{
local portao = Portao[i].Objeto;
if ( IsInRangeOfPoint( player, 10, Portao[i].Pos1.x, Portao[i].Pos1.y, Portao[i].Pos1.z ) )
{
if ( Casa[ Portao[i].ID ].Dono == player.Name || Casa[ Portao[i].ID ].Compart == player.Name )
{
if ( Portao[i].Trancado == true )
{
PlaySound( player.World, 145, player.Pos );
portao.MoveTo( Portao[i].Pos2, 2800 );
portao.RotateToEuler( Portao[i].Rot2, 2800 );
Portao[i].Trancado = false;
}
else if ( Portao[i].Trancado == false )
{
PlaySound( player.World, 145, player.Pos );
portao.MoveTo( Portao[i].Pos1, 2800 );
portao.RotateToEuler( Portao[i].Rot1, 2800 );
Portao[i].Trancado = true;
}
}
}
}
}
}

function CarregarPortoes()
{
local i = 0, obj, id, modelo, pos1, rot1, pos2, rot2;
local q = QuerySQL( db, "SELECT * FROM Portoes" );
while ( GetSQLColumnData( q, 0 ) != null )
{
id = GetSQLColumnData( q, 0 );
modelo = GetSQLColumnData( q, 1 );
pos1 = split( GetSQLColumnData( q, 2 ), " " );
rot1 = split( GetSQLColumnData( q, 3 ), " " );
pos2 = split( GetSQLColumnData( q, 4 ), " " );
rot2 = split( GetSQLColumnData( q, 5 ), " " );
obj = CreateObject( modelo, 1, Vector( pos1[0].tofloat(), pos1[1].tofloat(), pos1[2].tofloat() ), 255 );
obj.RotateToEuler( Vector( rot1[0].tofloat(), rot1[1].tofloat(), rot1[2].tofloat() ), 0 );
Portao.push({
Objeto = obj,
ID = id,
Pos1 = Vector( pos1[0].tofloat(), pos1[1].tofloat(), pos1[2].tofloat() ),
Rot1 = Vector( rot1[0].tofloat(), rot1[1].tofloat(), rot1[2].tofloat() ),
Pos2 = Vector( pos2[0].tofloat(), pos2[1].tofloat(), pos2[2].tofloat() ),
Rot2 = Vector( rot2[0].tofloat(), rot2[1].tofloat(), rot2[2].tofloat() ),
Trancado = true
});
GetSQLNextRow( q );
i++;
}
FreeSQLQuery( q );
print( "[Carregado] Portoes do servidor - " + i );
}

function CarregarObjetos()
{
local i = 0, obj, modelo, world, pos, alpha, rot;
local q = QuerySQL( db, "SELECT * FROM Objects" );
while ( GetSQLColumnData( q, 0 ) != null )
{
modelo = GetSQLColumnData( q, 0 );
world = GetSQLColumnData( q, 1 );
pos = Vector( GetSQLColumnData( q, 2 ), GetSQLColumnData( q, 3 ), GetSQLColumnData( q, 4 ) );
alpha = GetSQLColumnData( q, 5 );
rot = Vector( GetSQLColumnData( q, 6 ), GetSQLColumnData( q, 7 ), GetSQLColumnData( q, 8 ) );
obj = CreateObject( modelo, world, pos, alpha );
obj.RotateToEuler( rot, 0 );
GetSQLNextRow( q );
i++;
}
FreeSQLQuery( q );
print( "[Carregado] Objetos do servidor - " + i );
}

Comandos

Código:

if ( cmd == "obj" )
{
if ( Map[ player.ID ] != null ) MessagePlayer( "[#FF0000]Erro: Voce ja criou um objeto.", player );
else if ( !player.IsSpawned ) MessagePlayer( "[#FF0000]Erro: Escolha uma skin para usar esse comando.", player );
else if ( !text ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <Modelo>", player );
else if ( !IsNum( text ) ) MessagePlayer( "[#FF0000]Erro: Voce deve usar numeros no modelo.", player );
else
{
i_1PortaoPos[ player.ID ] = null;
i_1PortaoRot[ player.ID ] = null;
i_2PortaoPos[ player.ID ] = null;
i_2PortaoRot[ player.ID ] = null;
Map[ player.ID ] = CreateObject( text.tointeger(), player.World, player.Pos, 255 );
MessagePlayer( "[#00FF00]*** Objeto Criado.", player );
}
}

else if ( cmd == "objdel" )
{
if ( Map[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce nao criou um objeto.", player );
else
{
Map[ player.ID ].Delete();
Map[ player.ID ] = null;
MessagePlayer( "[#00FF00]*** Objeto Deletado.", player );
}
}

else if ( cmd == "objsave" )
{
if ( Map[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce nao criou um objeto.", player );
else
{
local map = Map[ player.ID ];
local model = map.Model, pos = map.Pos, rot = map.RotationEuler, alpha = map.Alpha;
QuerySQL( db, "INSERT INTO Objects VALUES ( '" + model + "', '" + player.World + "', '" + pos.x + "', '" + pos.y + "', '" + pos.z + "', '" + alpha + "', '" + rot.x + "', '" + rot.y + "', '" + rot.z + "', '" + player.Name + "' )" );
Map[ player.ID ] = null;
MessagePlayer( "[#00FF00]*** Objeto Salvo.", player );
}
}

else if ( cmd == "objmov" )
{
if ( Map[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce nao criou um objeto.", player );
else if ( !text ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else
{
local pos = GetTok( text, " ", 1 );
if ( !pos ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( pos != "x" && pos != "y" && pos != "z" ) MessagePlayer( "[#FF0000]Erro: Use letras x/y/z.", player );
else
{
local sinal = GetTok( text, " ", 2 );
if ( !sinal ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( sinal != "+" && sinal != "-" ) MessagePlayer( "[#FF0000]Erro: Use um sinal + ou -.", player );
else
{
local valor = GetTok( text, " ", 3 );
if ( !valor ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( !IsNum( valor ) && !IsFloat( valor ) )  MessagePlayer( "[#FF0000]Erro: Use numeros no valor.", player );
else
{
local map = Map[ player.ID ];
if ( pos == "x" )
{
if ( sinal == "+" ) map.MoveTo( Vector( map.Pos.x + valor.tofloat(), map.Pos.y, map.Pos.z ), 1000 );
else if ( sinal == "-" ) map.MoveTo( Vector( map.Pos.x - valor.tofloat(), map.Pos.y, map.Pos.z ), 1000 );
}
else if ( pos == "y" )
{
if ( sinal == "+" ) map.MoveTo( Vector( map.Pos.x, map.Pos.y + valor.tofloat(), map.Pos.z ), 1000 );
else if ( sinal == "-" ) map.MoveTo( Vector( map.Pos.x, map.Pos.y - valor.tofloat(), map.Pos.z ), 1000 );
}
else if ( pos == "z" )
{
if ( sinal == "+" ) map.MoveTo( Vector( map.Pos.x, map.Pos.y, map.Pos.z + valor.tofloat() ), 1000 );
else if ( sinal == "-" ) map.MoveTo( Vector( map.Pos.x, map.Pos.y, map.Pos.z - valor.tofloat() ), 1000 );
}
MessagePlayer( "[#00FF00]*** Objeto Movido.", player );
}
}
}
}
}

else if ( cmd == "objrot" )
{
if ( Map[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce nao criou um objeto.", player );
else if ( !text ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else
{
local pos = GetTok( text, " ", 1 );
if ( !pos ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( pos != "x" && pos != "y" && pos != "z" ) MessagePlayer( "[#FF0000]Erro: Use letras x/y/z.", player );
else
{
local sinal = GetTok( text, " ", 2 );
if ( !sinal ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( sinal != "+" && sinal != "-" ) MessagePlayer( "[#FF0000]Erro: Use um sinal + ou -.", player );
else
{
local valor = GetTok( text, " ", 3 );
if ( !valor ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <x/y/z> <+/-> <Valor>", player );
else if ( !IsNum( valor ) && !IsFloat( valor ) )  MessagePlayer( "[#FF0000]Erro: Use numeros no valor.", player );
else
{
local map = Map[ player.ID ];
if ( pos == "x" )
{
if ( sinal == "+" ) map.RotateToEuler( Vector( map.RotationEuler.x + valor.tofloat(), map.RotationEuler.y, map.RotationEuler.z ), 1000 );
else if ( sinal == "-" ) map.RotateToEuler( Vector( map.RotationEuler.x - valor.tofloat(), map.RotationEuler.y, map.RotationEuler.z ), 1000 );
}
else if ( pos == "y" )
{
if ( sinal == "+" ) map.RotateToEuler( Vector( map.RotationEuler.x, map.RotationEuler.y + valor.tofloat(), map.RotationEuler.z ), 1000 );
else if ( sinal == "-" ) map.RotateToEuler( Vector( map.RotationEuler.x, map.RotationEuler.y - valor.tofloat(), map.RotationEuler.z ), 1000 );
}
else if ( pos == "z" )
{
if ( sinal == "+" ) map.RotateToEuler( Vector( map.RotationEuler.x, map.RotationEuler.y, map.RotationEuler.z + valor.tofloat() ), 1000 );
else if ( sinal == "-" ) map.RotateToEuler( Vector( map.RotationEuler.x, map.RotationEuler.y, map.RotationEuler.z - valor.tofloat() ), 1000 );
}
MessagePlayer( "[#00FF00]*** Objeto Rotacionado.", player );
}
}
}
}
}

else if ( cmd == "portao" )
{
if ( Map[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce deve criar um objeto antes.", player );
else if ( !text ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <Casa_ID> <inicio/fim/salvar>", player );
else
{
local id = GetTok( text, " ", 1 );
if ( !id ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <Casa_ID> <inicio/fim/salvar>", player );
else if ( !IsNum( id ) ) MessagePlayer( "[#FF0000]Erro: Use numeros no ID da casa.", player );
else if ( !FindProp( id.tointeger() ) ) MessagePlayer( "[#FF0000]Erro: Propriedade nao encontrada.", player );
else
{
local option = GetTok( text, " ", 2 );
if ( !option ) MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <Casa_ID> <inicio/fim/salvar>", player );
else if ( option.tolower() == "inicio" )
{
i_1PortaoPos[ player.ID ] = Vector( Map[ player.ID ].Pos.x, Map[ player.ID ].Pos.y, Map[ player.ID ].Pos.z );
i_1PortaoRot[ player.ID ] = Vector( Map[ player.ID ].RotationEuler.x, Map[ player.ID ].RotationEuler.y, Map[ player.ID ].RotationEuler.z );
MessagePlayer( "[#00FF00]*** Esse sera o ponto inicial do portao.", player );
}
else if ( option.tolower() == "fim" )
{
i_2PortaoPos[ player.ID ] = Vector( Map[ player.ID ].Pos.x, Map[ player.ID ].Pos.y, Map[ player.ID ].Pos.z );
i_2PortaoRot[ player.ID ] = Vector( Map[ player.ID ].RotationEuler.x, Map[ player.ID ].RotationEuler.y, Map[ player.ID ].RotationEuler.z );
MessagePlayer( "[#00FF00]*** Esse sera o ponto final do portao.", player );
}
else if ( option.tolower() == "salvar" )
{
if ( i_1PortaoPos[ player.ID ] == null || i_2PortaoPos[ player.ID ] == null ) MessagePlayer( "[#FF0000]Erro: Voce deve selecionar o ponto de inicio e final para poder salvar.", player );
else
{
local model = Map[ player.ID ].Model,
pos1 = i_1PortaoPos[ player.ID ].x + " " + i_1PortaoPos[ player.ID ].y + " " + i_1PortaoPos[ player.ID ].z,
rot1 = i_1PortaoRot[ player.ID ].x + " " + i_1PortaoRot[ player.ID ].y + " " + i_1PortaoRot[ player.ID ].z,
pos2 = i_2PortaoPos[ player.ID ].x + " " + i_2PortaoPos[ player.ID ].y + " " + i_2PortaoPos[ player.ID ].z,
rot2 = i_2PortaoRot[ player.ID ].x + " " + i_2PortaoRot[ player.ID ].y + " " + i_2PortaoRot[ player.ID ].z;
QuerySQL( db, "INSERT INTO Portoes VALUES ( '" + id.tointeger() + "', '" + model + "', '" + pos1 + "', '" + rot1 + "', '" + pos2 + "', '" + rot2 + "' )" );
Portao.push({ Objeto = Map[ player.ID ], ID = id.tointeger(), Pos1 = i_1PortaoPos[ player.ID ], Rot1 = i_1PortaoRot[ player.ID ], Pos2 = i_2PortaoPos[ player.ID ], Rot2 = i_2PortaoRot[ player.ID ], Trancado = true });
Map[ player.ID ].Pos = i_1PortaoPos[ player.ID ];
Map[ player.ID ].RotateToEuler( i_1PortaoRot[ player.ID ], 0 );
i_1PortaoPos[ player.ID ] = null;
i_1PortaoRot[ player.ID ] = null;
i_2PortaoPos[ player.ID ] = null;
i_2PortaoRot[ player.ID ] = null;
Map[ player.ID ] = null;
MessagePlayer( "[#00FF00]*** Portao instalado com sucesso na propriedade de ID: " + id + ".", player );
}
}
else MessagePlayer( "[#FFA500]Sintaxe: /" + cmd + " <Casa_ID> <inicio/fim/salvar>", player );
}
}
}

OBS: O sistema de portão só funcionara se você estiver usando meu sistema de casa, a menos que você adapte o script.


Última edição por Diego^ em Dom Set 18, 2016 3:07 pm, editado 3 vez(es)

_________________
avatar
Diego^
Desenvolvedor

Mensagens : 60
Pontos : 106
Reputação : 21
Data de inscrição : 11/06/2015
Idade : 21
Localização : Brazil

Ver perfil do usuário http://vcmp-br.umforum.net

Voltar ao Topo Ir em baixo

Re: Sistema de Objetos v0.2 | Sistema de Portões v0.1

Mensagem por Thomas BR em Qua Ago 17, 2016 10:06 pm

Muito bom joinha

Thomas BR

Mensagens : 17
Pontos : 25
Reputação : 0
Data de inscrição : 03/01/2016

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Sistema de Objetos v0.2 | Sistema de Portões v0.1

Mensagem por Caique em Sex Ago 19, 2016 9:17 pm

Assim que reiniciamos o servidor os objetos somem e não ficam na database.

Caique

Mensagens : 21
Pontos : 35
Reputação : 0
Data de inscrição : 03/10/2015

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Sistema de Objetos v0.2 | Sistema de Portões v0.1

Mensagem por Diego^ em Sex Ago 19, 2016 10:40 pm

Caique escreveu:Assim que reiniciamos o servidor os objetos somem e não ficam na database.

Sistema atualizado!

_________________
avatar
Diego^
Desenvolvedor

Mensagens : 60
Pontos : 106
Reputação : 21
Data de inscrição : 11/06/2015
Idade : 21
Localização : Brazil

Ver perfil do usuário http://vcmp-br.umforum.net

Voltar ao Topo Ir em baixo

Re: Sistema de Objetos v0.2 | Sistema de Portões v0.1

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum