21.11.2018, 17:38
Нет. Тут что-то другое наверно. Даже когда я использую клавиши OnPlayerKeyStateChange ВООБЩЕ не срабатывает.
Краш детект и т.п. молчат обсалютно.
Краш детект и т.п. молчат обсалютно.
Люди добрые. Помогите кто чем может. Может кто сталкивался:
Рандомно (может не происходить в течении нескольких часов, а может и через минуту после входа) перестает работать соединение игрок-сервер, т.е. перестают работать ВСЕ стандартные калбеки. Такие как OnPlayerUpdate, OnPlayerKeyStateChange и т.п. Но , кое-что да работает. OnPlayerText. И всё. И если я не ошибаюсь, то я не один такой на своём сервере. Есть только одна гепотеза. Есть несколько TextDraw-баров, состоящих по 50 маленьких. Т.Е. единовременно на экране около 200 текстравов, и до 50 раз в секунду происходит их показ/скрытие. В какую сторону копать? |
Люди добрые. Помогите кто чем может. Может кто сталкивался:
Рандомно (может не происходить в течении нескольких часов, а может и через минуту после входа) перестает работать соединение игрок-сервер, т.е. перестают работать ВСЕ стандартные калбеки. Такие как OnPlayerUpdate, OnPlayerKeyStateChange и т.п. Но , кое-что да работает. OnPlayerText. И всё. И если я не ошибаюсь, то я не один такой на своём сервере. Есть только одна гепотеза. Есть несколько TextDraw-баров, состоящих по 50 маленьких. Т.Е. единовременно на экране около 200 текстравов, и до 50 раз в секунду происходит их показ/скрытие. В какую сторону копать? |
Недавно похожая проблема была, но связана она напрямую с крупными потерями трафика на маршруте через сервера мегафона. Игрок ставит ВПН или меняет интернет - все нормально. В конце концов всё решилось само собой. К симптомам добавлю отсутствие возможности заспавниться/переместить игрока, выдать диалог, ничего такого ему доступно не будет, его десинхронит, тут только кикать
|
Было пару таймеров с говнокодищем, вот я их вообще вырезал из мода. По моим наблюдениям такое происходит из-за нагромождения различных систем в таймерах/OnPlayerUpdate. Кстати, подозреваю что это счётчик угла заноса. Я такое делал давно когда-то. На локалке работало красиво, а на проде у игроков оно пинговало и итоге приводило к десинхрону...
|
for(new i; i <= 312; i++){
AddPlayerClass(i, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
}
SetPlayerSkin(playerid, Player[playerid][pSkin]);
t_SetSpawnInfo(playerid, team, skin, Float:xD, Float:yD, Float:zD, Float:AngleD, weapon1 = 0, weapon1_ammo = 0, weapon2 = 0, weapon2_ammo = 0,weapon3 = 0, weapon3_ammo = 0){
printf("SetSpawnInfo - %d - %d - %0.2f - %0.2f - %0.2f - %0.2f",playerid, skin,xD, yD, zD, AngleD);
return SetSpawnInfo(playerid, team, skin, xD, yD, zD, AngleD,weapon1, weapon1_ammo, weapon2, weapon2_ammo,weapon3, weapon3_ammo);
}
#define SetSpawnInfo t_SetSpawnInfo
[21:25:11] SetSpawnInfo - 0 - 32 - 1155.15 - 2313.92 - 10.48 - 329.13 [21:25:33] SetSpawnInfo - 1 - 29 - -13175.08 - 3049.64 - 25.30 - 4.00 [21:25:40] SetSpawnInfo - 6 - 122 - 1177.42 - -1323.15 - 14.07 - 269.26 |
При входе на сервер скрываю кнопки выбора скина. В определённый момент эти кнопки требуется вновь отобразить. Если использовать ForceClassSelection, то кнопки появляется, но действие функции почему-то распространяется и на следующий спавн (то бишь, после респавна опять кидает на выбор скина).
Пытался сделать связку: "выход со слежки + ForceClassSelection + вход в слежку + выход со слежки" - дабы попробовать добиться перереспавна, но это не помогло. Различные связки подобной схемы с таймером тоже не дали какого-либо результата. Есть ли у кого какие идеи на тему того, как вернуть отображение стрелок и, при этом, сделать весь процесс скрытым для игрока (обойтись без спавна на некоторое время и т.п.) + избавиться от подобного бага? |
Была у меня проблема. Когда я скрывал кнопки при коннекте спектатором, они снова появлялись при выходе из спектатора, не скипались, нужно было нажать на одну из них для спавна. А оказалось, что они появлялись, потому что ни разу не вызывался SetSpawnInfo до TogglePlayerSpectator(false). Либо в этом ключе пошаманить (но учитывать, что хоть раз для корректного спавна нужно вызвать SetSpawnInfo, иначе баг сампа ввиде кика), либо в OnPlayerRequestClass проверку, чтобы на следующем спавне сразу пропустить кнопки и заспавниться
|
Есть ли какая-то разница между _tquery и _query при установке кодировки через "SET NAMES..."?
На _query запрос как будто мимо проходит, кодировка не выставляется, кириллица не сохраняется, а на _tquery всё нормально. Перепроверил несколько раз. Нашёл на другом форуме тему про похожий случай, но там была обратная ситуация (не работал _tquery), там никак не прояснили это. Скорее всего, я какую-то очевидную вещь не вижу, но всё же. R41-4 |
В данной теме не описывается скриптинг с применением мускула и не решаются ваши проблемы с кодом, она создана для решения вопросов касающихся непосредственно самого MySQL. |
if(strcmp(cmd, "/makeadmin", true) == 0) { if(IsPlayerConnected(playerid)) { tmp = strtok(cmdtext, idx); if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_GRAD2, "ИНФО: /makeadmin [ID/Имя] [level] [AdminName]"); new para1; new level; para1 = ReturnUser(tmp); // переменая отвечающая за ид игрока tmp = strtok(cmdtext, idx); level = strval(tmp); /переменая отвечающая за лвл игрока new length = strlen(cmdtext);/ эта переменая отвечающая за adminName, дале мне непонятен цикл. типо он считвает мною веденный символ с начало его ведение и до последнего верно ? while ((idx < length) && (cmdtext[idx] <= ' ')) { idx++; } new offset = idx; new result[64]; while ((idx < length) && ((idx - offset) < (sizeof(result) - 1))) { result[idx - offset] = cmdtext[idx]; idx++; } result[idx - offset] = EOS; Все что выше мне уже не очень понятно if(!strlen(result)) return SendClientMessage(playerid, COLOR_GRAD2, "ИНФО: /makeadmin [ID/Имя] [level] [AdminName]"); if (PlayerInfo[playerid][pAdmin] >= 5 && AdminDuty[playerid] == 1) { if(IsPlayerConnected(para1)) { if(para1 != INVALID_PLAYER_ID) { GetPlayerName(para1, giveplayer, sizeof(giveplayer)); GetPlayerName(playerid, sendername, sizeof(sendername)); PlayerInfo[para1][pAdmin] = level; strmid(PlayerInfo[para1][pFirstName], result, 0, strlen(result), 64); printf("AdmCmd: %s has promoted %s to a level %d admin.", sendername, giveplayer, level, result); format(string, sizeof(string), "Bы былu назначены дo %d администраторского уровня, AdminName %s (( Администратором %s ))", level, sendername,result); SendClientMessage(para1, COLOR_LIGHTBLUE, string); format(string, sizeof(string), "Bы назначили %s администратором %d ypoвня, AdminName %s", giveplayer,level,result); SendClientMessage(playerid, COLOR_LIGHTBLUE, string); } } } else SendClientMessage(playerid, COLOR_GRAD1, "У вас недостаточно прав для использования этой команды!"); } return 1; }
if(strcmp(cmd, "/ban", true, 4) == 0)
{
new tmp[128]; // создали новую переменную для хранения параметров
tmp = strtok(cmdtext, idx); // засунули в неё параметры до следующего пробела
if(strlen(tmp) < 1) return SendClientMessage(playerid, 0xFF0000FF, "Синтаксис: /ban [playerid][reason]"); // если нет аргументов
new targetid = strval(tmp); // взяли ID игрока из параметров
new pos = strfind(cmdtext, " ", true, 4); // ищем пробел после ID
if(pos == -1) return SendClientMessage(playerid, 0xFF0000FF, "Синтаксис: /ban [playerid][text]"); // если больше аргументов нет
format(tmp, sizeof(tmp), "Администратор %s забанил игрока %s. Причина: %s", PlayerInfo[playerid][pName], PlayerInfo[targetid][pName], cmdtext[pos + 1]); // форматируем с причиной, полученной из параметров после следующего пробела (важно: причина может быть с пробелами, т.е. в несколько слов).
SendClientMessage(targetid, 0xFF0000FF, tmp);
Ban(playerid);
return 1;
}