Может и могут, проверь сам.
Причину крашей клиента или сервера?
Вид для печати
У меня на сервере задействовано около 7к объектов из них 6к используется в stock и сегодня я когда по ошибки отключил сток объектов то заметил что АМХ файл стал почти на 600мб меньше весить
И вот вопрос если 6к объектов увеличиваю амх на 600мб это нормально или нет?
Если нет то способ решения) какой ?
ой отпечатался )
килобайт)
На сервере был онлайн 1000 человек, то есть максимальный ID игрока - 999. Онлайн упал до 500, но 999 ID еще играет. Если мы будем использовать foreach то он выполнит 501 итерацию, верно? А если использовать GetPlayerPoolSize() в цикле то мы получим в итоге цикл на 1000 итераций, так как у нас последний игрок - 999 ID. Всё верно?
И еще, могли бы вы объяснить как работает GetPlayerPoolSize(), я про принцип действия, а не результат. И все равно ведь foreach лучше использовать?
Просто возвращает значение из структуры pPlayerPool. Само значение изменяется при отключении игрока (после вызова OnPlayerDisconnect).
http://ihost.pro-pawn.ru/image.php?di=SXSF
Конечно. Ты избавляешься от лишних итераций, избавляешься от проверок IsPlayerConnected и IsPlayerNPC.
Кстати, если ты планируешь использовать NPC, то использование GetPlayerPoolSize вообще теряет смысл, так как ID у NPC начинаются с последнего.
Более того, foreach - это не просто перебор игроков, это целая библиотека, которая позволяет создавать новые итераторы. Вот, например, перебор транспорта: http://pro-pawn.ru/showthread.php?13...нспорта
Вот так я использую foreach для работы со слотами банды:
Так с членами банды:PHP код:
static
Iterator:LoadedGangs<MAX_GANG>
stock Gang_IsActive(gangid)
{
return Iter_Contains(LoadedGangs, gangid);
}
stock Gang_SetActiveStatus(gangid, bool:status, bool:safe = false, &next_value = 0)
{
if (status) {
Iter_Add(LoadedGangs, gangid);
} else {
if (safe) {
Iter_SafeRemove(LoadedGangs, gangid, next_value);
} else {
Iter_Remove(LoadedGangs, gangid);
}
}
}
stock Gang_GetFreeSlot()
{
return Iter_Free(LoadedGangs);
}
Применений масса.PHP код:
new
Iterator:LoadedGangMembers[MAX_GANGS]<MAX_GANG_SIZE>;
GangMember_OnGameModeInit()
{
Iter_Init(LoadedGangMembers);
}
stock GangMember_IsActive(gangid, memberid)
{
return Iter_Contains(LoadedGangMembers[gangid], memberid);
}
stock GangMember_SetActiveStatus(gangid, memberid, bool:status, bool:safe = false, &next_value = 0)
{
if (status) {
Iter_Add(LoadedGangMembers[gangid], memberid);
} else {
if (safe) {
Iter_SafeRemove(LoadedGangMembers[gangid], memberid, next_value);
} else {
Iter_Remove(LoadedGangMembers[gangid], memberid);
}
}
}
stock GangMember_GetFreeSlot(gangid)
{
return Iter_Free(LoadedGangMembers[gangid]);
}
Вопрос: в чём разница между sscanf и sscanf2 кроме версии? Какую версию использовать желательнее?
Где-то на форуме говорилось, что PVar лучше использовать для "недолго-хранящихся" данных. Был совет, например, для проверки авторизации игрока, создавать массив. Верна ли данная теория? И в таком случае, для хранения ID секундного таймера игрока, например, лучше использовать массив на MAX_PLAYERS?
Об этом говорилось здесь. И там объяснялось почему эта "теория" верна.
Ну если таймер существует всё время, пока игрок находится на сервере, какой профит от использования pVar?
Никакого, я полагаю. Просто я думаю, как же всё же лучше хранить его, в PVar или в массиве. Его ведь надо удалить при выходе игрока с сервера. Таймеры работ, я полагаю, можно хранить в PVar, а вот уже секундный таймер игрока в массиве, верно?
menu1.txt сам удаляется из папки scriptfiles, вероятнее всего после рестарта, но точно не ясно. Как исправить?
Такой вопрос, если сделать макрос какой нибудь и он будет использоваться во многих участках кода,
то он как то повлияет на быстродействие компилирования или быстродействие в самой игре?
Расскажите пожалуйста, как пользоваться итераторами? Да и вообще, понятие итераторов. Я просил урок об этом создать, но на это много времени уйдет. Тут хоть ссылку дадут.
- - - Добавлено - - -
Нет, а иначе не использовали бы. логично?)
- - - Добавлено - - -
Нет, а иначе не использовали бы. логично?)
Обязательно ли индивидуальным таймерам задавать переменную с массивом, а то вот видел такой пример:
Будут ли баги если несколько игроков разом заюзают такой таймер?PHP код:
new timer;
timer = SetTimerEx("PublicTimer",5000,0,"i",playerid);
Зачем вообще записывать ID таймера в переменную, если таймер не рекурсивный?
Эмм, создаёшь массив
Добавление нового значения в массивPHP код:
new Iterator:blabla<число_ячеек>;
Удаление:PHP код:
Iter_Add(blabla, значение);
ИспользованиеPHP код:
Iter_Remove(blabla, значение);
PHP код:
foreach (new i : blabla)
Только на компиляцию, ибо все макросы заменяются на код во время препроцессинга. Но это очень маленький период времени
Весь код работы с файлом предоставь
В pVar хранишь всю информацию, которая будет востребована определённый промежуток времени (например, телепорт к игроку через нажатия на его ник в ТАВ. Тут глупо создавать гломальный массив ради того, чтоб раз в час в него записывать данные и через минуту отчищать. А вот pVar как раз подойдёт).
РАУНД!
То есть если этот таймер юзает не один игрок, то и смысла переменной(без массива с игроками) нету?
Глобальная переменная у индивидуального таймера
Либо переменная с массивом
Либо без переменной
так?
Эмм, ну если ты для каждого игрока создаёшь свой цикл, и, при этом, он зациклен (повторяется из раза в раз, пока его не "убить"), то и записывать ID таймеров нужно в массивы, если это тебе нужно (хотя можно банально сделать, как указано в тут в пункте 2 и в самом начале вызываемой функции сделать проверку на наличие игрока на сервере, тем самым таймер сам себя "убьёт" когда игрок выйдет с сервера)
- - - Добавлено - - -
Ну и по поводу "переполнения" ID таймеров. Вот такой вот код
Вытянул вот столько IDPHP код:
public OnGameModeInit()
{
printf("ID первого таймера - %d", SetTimerEx("Azaza", 100, 0, "ii", -1, 0));
for(new q; q < 1000000; q++) SetTimerEx("Azaza", 100, 0, "i", q, 1);
printf("ID таймера после окончания работы 1 цикла - %d", SetTimerEx("Azaza", 100, 0, "ii", -1, 1));
return 1;
}
public Azaza(for_id, timer_id);
public Azaza(for_id, timer_id)
{
if(for_id == -1) return 1;
if(for_id == 999999)
{
timer_id++;
for(new q; q < 1000000; q++) SetTimerEx("Azaza", 100, 0, "i", q, 0);
printf("ID таймера после окончания работы %i цикла - %d", timer_id, SetTimerEx("Azaza", 100, 0, "ii", -1, 1));
}
return 1;
}
http://i.imgur.com/866E3Bk.png
и вытянул бы больше, но мне уже лень ждать
Огорчу что пункт 2 подходит для глобальных таймеров,
когда я заюзал такую схему с индивидумами, то столкнулся с тем что таймеры накапливались на том playerid на который перезаходил игрок,
в общем пришлось пробовать по другому.
___________________________________
Накосячил я может, а может где то баг в индивидуме есть..
Нет понятия "индивидуальный таймер". Есть таймеры, которые могут передавать в фукцию, вызываемую таймером, определённые данные в качестве параметров и есть таймеры, которые этого делать не могут. И если у тебя появилась такая проблема, значит проблема в твоей реализации (как раз, скорее всего, проверку на онлайн не делал)
Ясно.. Может это Я говорил, а не он?)
Он типа меня поправил, что в переменную запишется не id таймера, а "возвращаемый этим таймером id".. Вот я и хочу узнать к чему это..
в таймер, до след. (пере)запуска таймера:
PHP код:
if(!IsPlayerConnected(playerid))
return 1;
Всем привет.
Редко пользую PVar'ами, но вот появилась жёсткая необходимость в PVarString, причём на кириллице.. Если содержимое PVar'a выводить в диалоге - всё нормально работает, а если в чат, то поулчается что-то вроде "яяяяяяяяязяяяязт"... Как я понимаю это и есть основная проблема string'а PVar'a? Если да, то какие способы решения данной проблемы существуют?
Добавлено: Хотя, видимо, PVar не причём.. Поторопился я с выводами, пойду дальше разбираться...
Добавлено #2: Проблему решил простым format'ом..
ребятки, что удачнее, orm сценарии или стандартным путем делать запросы?
выдает ошибку:PHP код:
#define IsValidText(%1) \
regex_match(%1, "/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)*\.([a-zA-Z]{2,6})$/")
mod.pwn(330) : error 027: invalid character constant
ругаеться именно на знак \ ,там 3 знака в макросе красным высвечивает \.
Прогуглил всё и не нашёл..PHP код:
native mysql_function_query(connectionHandle, query[], callback[] = "", format[] = "", {Float,_}:...);
mysql_function_query(connects, mysql_query, false, "", ""); //false
Какую роль играет false в этой функции?