[Ajuda] Jogador nгo spawna
#1

Eu implantei recentemente um sistema de salvar posiзхes ao sair do Ricop em Dini, mas meu gamemode й todo feito em MySQL, atй aн tudo bem, mas quando eu vou logar eu nгo spawno. Alguйm poderia checar o cуdigo e se possнvel me ajudar por gentileza.

Код:
//
// Medieval Roleplay
// Gamemode from scratch by Lucas Santos
//

#include <a_samp>
#include <zcmd>
#include <Dini>
#include <sscanf2>
#include <mSelection>
#include <a_mysql>

#pragma tabsize 0

// Configuraзхes MySQL
#define SQL_HOST "127.0.0.1"
#define SQL_USER "root"
#define SQL_PASS "vertrigo"
#define SQL_DB "medieval"

// Defines
new skinlist = mS_INVALID_LISTID;

// Defines de dialogs
#define DIALOG01 1
#define DIALOG02 2
#define DIALOG03 3

// Variavйis globais
new mysql;

new Float:X[MAX_PLAYERS];
new Float:Y[MAX_PLAYERS];
new Float:Z[MAX_PLAYERS];
new Float:A[MAX_PLAYERS];
new SpawnBloqueado[MAX_PLAYERS];

static seconds;
static minutes;
static hours;
static days;
static months;
static years;

// Textdraws

new Text:Time;
new Text:Date;
new Text:Textdrawdebaixodoradar;

// Armazenamento de dados do jogador
enum E_PLAYER
{
	 E_PLAYER_LOGGED, // Verificar se o usuбrio estб conectado
	 E_PLAYER_SKIN // Skin do jogador
};
new player[MAX_PLAYERS][E_PLAYER];

main()
{
    print("\n----------------------------------");
    print(" Medieval Roleplay.");
    print("----------------------------------\n");
}

public OnGameModeInit()
{
    mysql = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);

	// Salvando dados dos jogadores
	SetTimer("saveAll", 100000, 1);

    SetGameModeText("Medieval Roleplay");

    skinlist = LoadModelSelectionMenu("skins.txt");
    
    // Textdraws
    
    Time = TextDrawCreate(632.0,25.0,"--:--:--");
    TextDrawUseBox(Time, 0);
    TextDrawFont(Time, 3);
    TextDrawSetShadow(Time,0);
    TextDrawSetOutline(Time,2);
    TextDrawBackgroundColor(Time,0x000000FF);
    TextDrawColor(Time,0xFFFFFFFF);
    TextDrawAlignment(Time,3);
    TextDrawLetterSize(Time,0.5,1.5);

    Date = TextDrawCreate(620.0,5.0,"00/00/0000");
    TextDrawUseBox(Date, 0);
    TextDrawFont(Date, 3);
    TextDrawSetShadow(Date,0);
    TextDrawSetOutline(Date,2);
    TextDrawBackgroundColor(Date,0x000000FF);
    TextDrawColor(Date,0xFFFFFFFF);
    TextDrawAlignment(Date,3);
    TextDrawLetterSize(Date,0.5,1.5);

    ProcessGameTime();
    SetTimer("ProcessGameTime", 1000, 1);
    
    Textdrawdebaixodoradar= TextDrawCreate(1.0, 433.0, "~y~] ~w~Medieval Roleplay ~y~]");
    TextDrawAlignment(Textdrawdebaixodoradar,0);
    TextDrawBackgroundColor(Textdrawdebaixodoradar,0x000000ff);
    TextDrawFont(Textdrawdebaixodoradar,2);
    TextDrawLetterSize(Textdrawdebaixodoradar,0.2999, 1.4);
    TextDrawBoxColor(Textdrawdebaixodoradar,0x00000050);
    TextDrawColor(Textdrawdebaixodoradar,0xffffffff);
    TextDrawSetOutline(Textdrawdebaixodoradar,1);
    TextDrawSetProportional(Textdrawdebaixodoradar,1);
    TextDrawSetShadow(Textdrawdebaixodoradar,1);
    
    for(new i; i < MAX_PLAYERS; i ++)
    {
        if(IsPlayerConnected(i))
        {
            TextDrawShowForPlayer(i, Textdrawdebaixodoradar);
        }
    }
    
    return 1;
}

public OnGameModeExit()
{
    TextDrawHideForAll(Time);
    TextDrawDestroy(Time);
    TextDrawHideForAll(Date);
    TextDrawDestroy(Date);
    TextDrawHideForAll(Textdrawdebaixodoradar);
    TextDrawDestroy(Textdrawdebaixodoradar);
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    TogglePlayerSpectating(playerid, false);
    
	if(player[playerid][E_PLAYER_LOGGED])
	{
		SpawnPlayer(playerid);
	}
    return 0;
}

public OnPlayerConnect(playerid)
{
    TogglePlayerSpectating(playerid, false);
    
    TextDrawShowForPlayer(playerid, Textdrawdebaixodoradar);
    
    SpawnBloqueado[playerid] = 0;

    new name[MAX_PLAYER_NAME], query[1024];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);

    format(query, sizeof(query), "SELECT * FROM `contas` WHERE `usuario` = '%s'", name);
    mysql_function_query(mysql, query, true, "q_loginRequest", "d", playerid);
    return 1;
}

forward q_loginRequest(playerid);
public q_loginRequest(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields);

    if(rows > 0)
    {
      // Usuбrio existe
      ShowPlayerDialog(playerid, DIALOG01, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", "{FFFFFF}Bem vindo novamente, digite a sua senha para logar-se.", "Logar", "");
    }
    else
    {
      // Usuбrio nгo existe
      ShowPlayerDialog(playerid, DIALOG02, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registro", "{FFFFFF}Bem vindo, digite a sua senha para registrar-se.", "Registrar", "");
    }
}

public OnPlayerDisconnect(playerid, reason)
{
    player[playerid][E_PLAYER_LOGGED] = 0;
    new name[MAX_PLAYER_NAME];
    new data[256];
    GetPlayerName(playerid, name, sizeof(name));
    GetPlayerPos(playerid,X[playerid],Y[playerid],Z[playerid]);
    GetPlayerFacingAngle(playerid,A[playerid]);
	format(data, sizeof(data), "%s.spawn.ini", name);
    dini_FloatSet(data,"CoordenadaX",X[playerid]);
    dini_FloatSet(data,"CoordenadaY",Y[playerid]);
    dini_FloatSet(data,"CoordenadaZ",Z[playerid]);
    dini_FloatSet(data,"CoordenadaA",A[playerid]);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    TextDrawShowForPlayer(playerid,Time);
    TextDrawShowForPlayer(playerid,Date);
    
    new tmp[64], skin;

    cache_get_field_content(0, "skin", tmp);
    skin = strval(tmp);
    new name[MAX_PLAYER_NAME];
   	new voltarcoordenada[256];
    GetPlayerName(playerid, name, sizeof(name));
    format(voltarcoordenada, sizeof(voltarcoordenada), "%s.spawn.ini", name);
    if(fexist(voltarcoordenada) && SpawnBloqueado[playerid] == 0)
    {
    X[playerid] = dini_Float(voltarcoordenada,"CoordenadaX");
    Y[playerid] = dini_Float(voltarcoordenada,"CoordenadaY");
    Z[playerid] = dini_Float(voltarcoordenada,"CoordenadaZ");
    A[playerid] = dini_Float(voltarcoordenada,"CoordenadaA");
   	SetSpawnInfo(playerid, 0, skin, X[playerid], Y[playerid], Z[playerid], 0, 0, 0, 0, 0, 0, 0);
	SetPlayerFacingAngle(playerid, A[playerid]);
	SetCameraBehindPlayer(playerid);
   	SendClientMessage(playerid, 0x33FF00FF, "Vocк voltou para onde saiu pela ъltima vez.");
   	SpawnBloqueado[playerid] = 1;
    }
    if(!fexist(voltarcoordenada))
    {
	dini_Create(voltarcoordenada);
	SpawnBloqueado[playerid] = 1;
    }
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    TogglePlayerSpectating(playerid, true);
    TextDrawHideForPlayer(playerid,Time);
    TextDrawHideForPlayer(playerid,Date);
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 0;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG01:
        {
            new query[1024], name[MAX_PLAYER_NAME];
            GetPlayerName(playerid, name, MAX_PLAYER_NAME);

            Hash(inputtext);
            format(query, sizeof(query), "SELECT * FROM `contas` WHERE `usuario` = '%s' AND `senha` = '%s'", name, inputtext);
            mysql_function_query(mysql, query, true, "q_verifyPassword", "d", playerid);
            return 1;
        }


        // Usuбrio nгo existe.
        case DIALOG02:
        {
            if(strlen(inputtext) < 2)
            {
                ShowPlayerDialog(playerid, DIALOG02, DIALOG_STYLE_PASSWORD, "{FFFFFF}Registro", "{FFFFFF}Bem vindo, digite a sua senha para registrar-se.\n\n{FF0000}Informe uma senha vбlida.", "Registrar", "");
                return 1;
            }
            else
            {
                new query[1024], name[MAX_PLAYER_NAME];
                GetPlayerName(playerid, name, MAX_PLAYER_NAME);
                Hash(inputtext);
                format(query, sizeof(query), "INSERT INTO `contas` (usuario, senha) VALUES ('%s', '%s')", name, inputtext);
                mysql_function_query(mysql, query, false, "", "");

                // Spawn jogador
                SetTimerEx("RegSkinMenu",5000,0,"d",playerid);
                SendClientMessage(playerid, 0xFFFFFF00, "Aguarde enquanto nуs preparamos sua conta...");
                return 1;
            }
        }
    }
    return 1;
}

public OnPlayerModelSelection(playerid, response, listid, modelid)
{
	if(listid == skinlist)
	{
		if(response)
		{
           SetSkin(playerid, modelid);
		}
		else
		{
		SetSkin(playerid,modelid);
		}
    }
	return 1;
}

forward q_verifyPassword(playerid);
public q_verifyPassword(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields);

    if(rows)
    {
        // Pegando informaзхes do jogador
        player[playerid][E_PLAYER_LOGGED] = 1;
        SpawnPlayer(playerid);
        return 1;
    }
    else
    {
        // Senha incorreta
        ShowPlayerDialog(playerid, DIALOG01, DIALOG_STYLE_PASSWORD, "{FFFFFF}Login", "{FFFFFF}Bem vindo novamente, digite a sua senha para logar-se.\n\n{FF0000}Senha de acesso invбlida!", "Logar", "");
        return 1;
    }
}

forward saveAll();
public saveAll()
{
	new query[128], name[MAX_PLAYER_NAME];
	for(new a=0; a<MAX_PLAYERS; a++)
	{
		if(!player[a][E_PLAYER_LOGGED]) continue;
        GetPlayerName(a, name, MAX_PLAYER_NAME);
		format(query, sizeof(query), "UPDATE `contas` SET `skin` = '%d' WHERE `usuario` = '%s'", GetPlayerSkin(a), name);
		mysql_function_query(mysql, query, false, "", "");
	}
	SendClientMessageToAll(0xFF000000, "Dados salvos.");
}

forward RegSkinMenu(playerid);
public RegSkinMenu(playerid)
{
	SendClientMessage(playerid, 0xFFFFFF00, "Estamos quase terminando, selecione uma skin para seu personagem.");
	ShowSkinMenu(playerid);
	return 1;
}

forward ProcessGameTime();
public ProcessGameTime()
{
 	new string[12];
	gettime(hours, minutes, seconds);
 	getdate(years, months, days);
	format(string, sizeof string, "%02d:%02d:%02d", hours, minutes, seconds);
	TextDrawSetString(Time, string);
	format(string, sizeof string, "%02d/%02d/%04d", days, months, years);
 	TextDrawSetString(Date, string);
	SetWorldTime(hours);
	for(new i = 0; i < MAX_PLAYERS; i++)SetPlayerTime(i, hours, minutes);
}

forward Hash(string[]);
public Hash(string[])
{
	for(new x=0; x < strlen(string); x++)
	{
	    string[x] += (3^x) * (x % 15);
		if(string[x] > (0xff))
		{
		    string[x] -= 256;
	    }
    }
	return 1;
}

stock SetSkin(playerid, skin)
{
	SetSpawnInfo(playerid, 0, skin, 1958.3783, 1343.1572, 15.3746, 0, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    // Salvando dados do jogador
    saveAll();
	return SetPlayerSkin(playerid, skin);
}

stock ShowSkinMenu(playerid)
{
	ShowModelSelectionMenu(playerid, skinlist, "Menu de Skins");
	SelectTextDraw(playerid, 0xACCBF1FF);
	return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

////////////////////////////////////////////////////////////////////////////////


COMMAND:gmx()
{
   GameModeExit();
   return 1;
}

COMMAND:limparchat(playerid, params[])
{
   for(new a = 0; a < 20; a++)
   {
      SendClientMessageToAll(0xFFFFFF00, " ");
   }
   SendClientMessageToAll(0xFFFFFF00, "<!> Chat limpo.");
   return 1;
}
Reply
#2

Vocк deve usar o SetSpawnInfo aqui:
pawn Код:
if(rows)
    {
        // Pegando informaзхes do jogador
        player[playerid][E_PLAYER_LOGGED] = 1;
        //SpawnInfo aqui !
        SpawnPlayer(playerid);
        return 1;
    }
Se nгo funcionar verifica o seu MySQL_log, vк se estб dando algum warning/error, para dar um debug geral use:
Код:
    mysql_log(LOG_ALL)
no OnGameModeInit()
Reply
#3

pawn Код:
public OnPlayerSpawn(playerid)
{
    TextDrawShowForPlayer(playerid,Time);
    TextDrawShowForPlayer(playerid,Date);
   
    new tmp[64], skin;

    cache_get_field_content(0, "skin", tmp);
    skin = strval(tmp);
    new name[MAX_PLAYER_NAME];
    new voltarcoordenada[256];
    GetPlayerName(playerid, name, sizeof(name));
    format(voltarcoordenada, sizeof(voltarcoordenada), "%s.spawn.ini", name);
    if(fexist(voltarcoordenada) && SpawnBloqueado[playerid] == 0)
    {
    X[playerid] = dini_Float(voltarcoordenada,"CoordenadaX");
    Y[playerid] = dini_Float(voltarcoordenada,"CoordenadaY");
    Z[playerid] = dini_Float(voltarcoordenada,"CoordenadaZ");
    A[playerid] = dini_Float(voltarcoordenada,"CoordenadaA");
    SetSpawnInfo(playerid, 0, skin, X[playerid], Y[playerid], Z[playerid], 0, 0, 0, 0, 0, 0, 0);
    SetPlayerFacingAngle(playerid, A[playerid]);
    SetCameraBehindPlayer(playerid);
    SendClientMessage(playerid, 0x33FF00FF, "Vocк voltou para onde saiu pela ъltima vez.");
    SpawnBloqueado[playerid] = 1;
    }
    if(!fexist(voltarcoordenada))
    {
    dini_Create(voltarcoordenada);
    SpawnBloqueado[playerid] = 1;
    }
    return 1;
}
deve usar SetPlayerPos.

pawn Код:
for(new i; i < MAX_PLAYERS; i ++)
    {
        if(IsPlayerConnected(i))
        {
            TextDrawShowForPlayer(i, Textdrawdebaixodoradar);
        }
    }
nao precisa na OnGameModeInit()

e isto:

pawn Код:
stock SetSkin(playerid, skin)
{
    SetSpawnInfo(playerid, 0, skin, 1958.3783, 1343.1572, 15.3746, 0, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    // Salvando dados do jogador
    saveAll();
    return SetPlayerSkin(playerid, skin);
}
aconselho a arranjar outra logica essa nao й nada boa, imagine isso sendo chamado para 10 ou 20 players diferentes com 50 players no servidor online.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)