PDA

Просмотр полной версии : [Вопрос] Телепорт при спавне на Грув Стрит



Trane911
02.06.2014, 21:46
Всем привет!
При регистрации. Когда игрок уже заспавнился, он почему-то тпшится на центр Грув Стрит и в руках либо бутылка, либо сигарета.
Если игрок умрет, то спавнится нормально, там где надо. Почему такое может быть?

DeimoS
02.06.2014, 23:13
AddPlayerClass в моде присутствует?

Trane911
02.06.2014, 23:56
Нет, но использую SetPlayerInfo

Just_Fenix
03.06.2014, 00:00
Нет, но использую SetPlayerInfo
Может быть вы имели ввиду SetSpawnInfo (http://wiki.sa-mp.com/wiki/SetSpawnInfo_RU)?
Если нет AddPlayerClass или SetSpawnInfo то добавьте их и всё будет хо-ро-шо :smile:

Trane911
03.06.2014, 00:03
Да, именно SetSpawnInfo (ошибся немного :) )
Попробовал добавить
AddPlayerClass(0, 1989.8239,-1779.3820,17.3549, 270, 0, 0, 0, 0, 0, 0);
Скин имеет значение? Все равно я скин меняю при помощи SetPlayerSkin сразу же при спавне.

Just_Fenix
03.06.2014, 00:08
Да, именно SetSpawnInfo (ошибся немного :) )
Попробовал добавить
AddPlayerClass(0, 1989.8239,-1779.3820,17.3549, 270, 0, 0, 0, 0, 0, 0);
Скин имеет значение? Все равно я скин меняю при помощи SetPlayerSkin сразу же при спавне.
Вообще частенько эту строчку добавляют тупо чтобы спавнило игрока, а что внутри неё - без разницы.
В основном игрока отправляют на спавн через SetPlayerPos. Так что какой там скин значения не имеет)

Trane911
03.06.2014, 00:25
А как же SpawnPlayer?

- - - Добавлено - - -

Добавил AddPlayerClass, но толку 0.
Теперь игрока не ТПшит на Грув стрит, его ТПшит на координаты спавна (я их прописал в AddPlayerClass), но в руках так же сигарета или бутылка.

DeimoS
03.06.2014, 00:29
В OnPlayerRequestClass что находится?

Trane911
03.06.2014, 00:32
Ничего. Я не делаю выбор скинов.

DeimoS
03.06.2014, 00:40
В общем, серверу не хватает каких-то данных о игроке и дабы не случилось краша, он указывает на ошибку таким необычным способом. Честно - не помню причину того, почему при входе может выдавать бутылку. Возможно, в OnPlayerSpawn стоит что-то лишнее. В любом случае надо копать паблики OnGameModeInIt, OnPlayerConnect, OnPlayerRequestClass и OnPlayerSpawn.

Trane911
03.06.2014, 01:01
Лишнего ничего нету.

public OnGameModeInit()
{
EnableStuntBonusForAll(0);
SetGameModeText("Mode");
MySQLConnect ( ) ;
AddPlayerClass(289, 1989.8239,-1779.3820,17.3549, 270, 0, 0, 0, 0, 0, 0); // CJ
ConnectNPC("Jim", "bot_exit");
ConnectNPC("Vano", "bot_spawn");
return 1;
}
public OnPlayerConnect(playerid)
{
GetPlayerName ( playerid, PlayerName [ playerid ] , MAX_PLAYER_NAME ) ;//Получаем имя
SetTimerEx ( "connection", 500, false, "i", playerid ) ;//таймер
ClearPlayerData ( playerid );//очищаем данные игрока
new query [ 60 + MAX_PLAYER_NAME ];
format ( query, sizeof query, "SELECT `id` FROM `users` WHERE `login` = '%s' LIMIT 1", PlayerName [ playerid ] ) ;//Наш SQL запрос.SELECT-Выбираем ID из таблицы `users` где наш логин равен нашему имени
mysql_function_query ( dbHandle, query, true, "CheckPlayerRegistered", "ii", playerid, 0 ) ;//вызываем коллбэк, проверку зарегистрирован игрок или нет
SetPlayerPos ( playerid,-1396.0210,980.2402,179.3737 ) ;//Координаты для камеры(интро)
SetPlayerCameraPos ( playerid,-1399.0210,976.2402,179.3737 ) ;//Координаты для камеры(интро)
SetPlayerCameraLookAt ( playerid, -1754.3281, 669.2344, 62.8203 ) ;//Координаты для камеры(интро)
//CheckPlayerRegistered ( playerid );
return 1;
}

public OnPlayerSpawn(playerid)
{
if ( GetPVarInt ( playerid, "Logged" ) == 0)return true;
SetPlayerPos(playerid, PlayerInfo[playerid][pPosX],PlayerInfo[playerid][pPosY],PlayerInfo[playerid][pPosZ]);
SetPlayerHealth(playerid, PlayerInfo[playerid][pHp]);
SetPlayerArmour(playerid, PlayerInfo[playerid][pArmour]);
if(PlayerInfo[playerid][pZaraza] >= 80)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pZSkin]);
}
if(PlayerInfo[playerid][pZaraza] <= 79)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
}
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun0], PlayerInfo[playerid][ammo0]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun1], PlayerInfo[playerid][ammo1]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun2], PlayerInfo[playerid][ammo2]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun3], PlayerInfo[playerid][ammo3]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun4], PlayerInfo[playerid][ammo4]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun5], PlayerInfo[playerid][ammo5]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun6], PlayerInfo[playerid][ammo6]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun7], PlayerInfo[playerid][ammo7]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun8], PlayerInfo[playerid][ammo8]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun9], PlayerInfo[playerid][ammo9]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun10], PlayerInfo[playerid][ammo10]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun11], PlayerInfo[playerid][ammo11]);
GivePlayerWeapon(playerid, PlayerInfo[playerid][gun12], PlayerInfo[playerid][ammo12]);
return 1;
}

DeimoS
03.06.2014, 06:42
SetPlayerPos из OnPlayerConnect стоит убрать. Игрока в виде скина ещё не существует для всех (он есть, но в нулевых координатах)

В OnPlayerSpawn

if ( GetPVarInt ( playerid, "Logged" ) == 0)return true;
замените на

if ( GetPVarInt ( playerid, "Logged" ) == 0) return printf("\nError: Игрок с ID %d пытался заспавниться до авторизации\n",playerid);
Никогда не ленитесь ко всем подобным ключевым условиям писать какие-то сообщения. Ибо потом, когда случается баг, вы тупо не поймёте, что глючит именно из-за того, что не проходит условие, ведь об этом нигде не сообщается.

И вот это условие

if(PlayerInfo[playerid][pZaraza] >= 80)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pZSkin]);
}
if(PlayerInfo[playerid][pZaraza] <= 79)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
}
я переделал бы под такой вид

if(PlayerInfo[playerid][pZaraza] >= 80)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pZSkin]);
}
else if(PlayerInfo[playerid][pZaraza] <= 79)
{
SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
}
Ибо зачем заставлять мод выполнять проверку второго условия, если уже сработало первое?

Trane911
03.06.2014, 12:17
Вывело такое на ботов:
Error: Игрок с ID 0 пытался заспавниться до авторизации
Error: Игрок с ID 1 пытался заспавниться до авторизации
На игрока такого не вывело.

DeimoS
03.06.2014, 12:34
if (!GetPVarInt ( playerid, "Logged" ) && !IsPlayerNPC(playerid)) return printf("\nError: Игрок с ID %d пытался заспавниться до авторизации\n",playerid);
Ну а проблема то не решилась?

Trane911
03.06.2014, 13:38
Неа

Trane911
03.06.2014, 16:31
Поднимаю.

Mi-Zaft
03.06.2014, 23:39
Тоже столкнулся с такой проблемой. Как решить можно?

DeimoS
04.06.2014, 07:44
Залогируйте каждый колбэк и смотрите какой из них срабатывает перед тем, как спавнит на грув. Дальше его и копайте