PDA

Просмотр полной версии : [Вопрос] Проблема с проверкой анимации



Salik_Davince
14.07.2019, 17:54
Здравствуйте, приступлю к делу, наверное многие знают что существует баг SA:MP'a с функцией RemoveObject (удалением объектов), в моем сервере при реконнекте игрока кикало, я поискал в офф.форуме решение, все таки нашел но в текстовом формате, решение было таковым: Подключается игрок - телепортируется в определенный участок где имеется стандартный объект (при первом заходе этот объект и удаляется), после всего проверяет игрока на анимацию плавания (2й коннект - объекта нету - плавает), думаю вы догнали суть фикса.

Вот так я провожу данные проверки в OnPlayerConnect, вызываю таймер с 2300мс, после вызывается функция но узнать позицию/анимацию никак не получается, либо что то еще имеется?

Устанавливаем позицию при коннекте

set_pos(playerid, 258.18, 2938.75, 1.77, .angle = 0.0, .interior = 0, .world = 0);
toggle_controlable(playerid, true);//Размораживаю из за того что в самой функции set_pos имеется фриз предзагрузки объектов


Устанавливаем таймер

SetTimerEx("CheckPlayerRemovedObjects", 2300, false, "d", playerid);


Вызываем функцию по истечении времени

function CheckPlayerRemovedObjects(playerid)
{
if(IsPlayerConnected(playerid))
{
new
animLib[32],
animName[32];

new
Float: tempX,
Float: tempY,
Float: tempZ;
GetPlayerPos(playerid, tempX, tempY, tempZ);
printf("#Тест позиции %f %f %f", tempX, tempY, tempZ);

GetAnimationName(GetPlayerAnimationIndex(playerid), animLib, sizeof(animLib), animName, sizeof(animName));

printf("CheckPlayerRemovedObject = AnimLib = %s | AnimName = %s", animLib, animName);


if(strcmp(animLib, "SWIM", false)) {
//none;
print("CheckPlayerRemovedObjects | Плавает");
}
else {
print("CheckPlayerRemovedObjects | Не Плавает");

RemovePlayerObjects(playerid);
}
TogglePlayerSpectating(playerid, true);//Нужен для дальнейшего показа

new query_string[80 + MAX_PLAYER_NAME];
format(query_string, sizeof query_string, "SELECT `u_id` FROM `users` WHERE `u_name` = '%s' LIMIT 1", Player[playerid][name]);
mysql_tquery(sql_connection, query_string, "CheckPlayerRegistered", "i", playerid);

}
return true;
}


https://ibb.co/71gsKTS - Сам объект (удаленный).


Выводит в логах: Position: 0.000 0.000 0.000 | Анимация: пусто

Daniel_Cortez
14.07.2019, 23:16
Если я правильно вас понимаю, вы имели в виду баг не с RemoveObject, а с RemoveBuildingForPlayer, и игрока при этом не кикает, а крашит - это две совершенно разные вещи.
Касаемо проблемы, вы скорее всего не заспавнили игрока перед перемещением; нет персонажа - нет и координат с анимацией.

Salik_Davince
15.07.2019, 01:52
Да я так и хотел сказать но просто перепутал слова, извеняюсь. А на счет проблемы решил сделать проверку на первый спавн, создал переменную которая отвечает за это, лучше наглядно покажу :)

OnPlayerConnect

firstSpawn[playerid] = true;
SpawnPlayer(playerid);


OnPlayerSpawn


if(firstSpawn[playerid])
{
firstSpawn[playerid] = false;
set_pos(playerid, позиция);
return true;
}


То появляется еще 1 проблема при дальнейшем спавне после авторизации игрок появляется в скине сиджея в том месте где телепортировали до проверки (думаю как то можно решить), 2я проблема - это то что до сих пор координаты нулевые и анимации нету.