Антикреш от создания пустых объектов читерами
#1

Случайно заметил что креш клиента происходил из за несуществующих объектов по коду ошибки
И действительно вылеты клиента часто происходят из за этого сам проверял.
натолкнула на решение этой проблемы вот эта тема https://sampforum.blast.hk/showthread.php?tid=324206

pawn Code:
SetTimer("CheckObjects",15000,1);

forward CheckObjects();
public CheckObjects()
{
    for(new i = 1; i < 3000; i++)
    {
        if(i > 2504)//тупо если превышает ваше количество объектов удалять их
        {
            DestroyDynamicObject(i);
            printf("Object ID: %d", i);
        }
    }
    return 1;
}
протестировано работает настраивайте на своё усмотрение
чтобы посмотреть количество объектов на сервере через консоль можно сначала поставить вот этот скрипт
потом соответственно заменить на тот что выше
forward CheckObjects();
public CheckObjects()
{
    for(new i = 1; i < 3000; i++)
    {
        if(IsValidDynamicObject(i))
        {
            DestroyDynamicObject(i);
            printf("Object ID: %d", i);
        }
    }
    return 1;
}
если у вас нет стримера от инкогнито то используйте в скрипте вот эти функции IsValidObject(i) DestroyObject(i);
Reply
#2

Оказалось придётся проверять ещё и обычные объекты помимо стримера
в GemeModeInit();
PHP Code:
SetTimer("CheckObjects",3000,1); 
в конец мода
PHP Code:
forward CheckObjects();
public 
CheckObjects()
{
    for(new 
14000i++)//4000 - максимально возможное количество объектов стримера
    
{
        if(
IsValidDynamicObject(i))
        {
            if(
2504)//количество объектов CreateDynamicObject
            
{
                
DestroyDynamicObject(i);//удалять объект который по счёту больше 2504 количества серверных объектов
            
}
        }
    }
    for(new 
1MAX_OBJECTSi++)
    {
        if(
IsValidObject(i))
        {
            if(
96)//количество объектов CreateObject
            
{
                
DestroyObject(i);//удалять объект который по счёту больше 96 количества серверных объектов
            
}
        }
    }
    return 
1;

Reply
#3

Quote:
Originally Posted by WINDAM
View Post
//4000 - максимально возможное количество объектов стримера
Где вы увидели лимит в 4к объектов?

Quote:
Originally Posted by WINDAM
View Post
public CheckObjects()
{
for(new i = 1; i < 3000; i++)
{
if(i > 2504)//тупо если превышает ваше количество объектов удалять их
{
DestroyDynamicObject(i);
printf("Object ID: %d", i);
}
}
return 1;
}
ох лол...
Reply
#4

Лимит объектов был на стримере от инкогнито, больше я бы не рискнул добавлять у меня их 2500 нагрузка на сервер 15 процентов
А насчёт скрипта первый блин комом
вот скрипт чтобы посчитать объекты Посмотреть можно в serverlog.txt
PHP Code:
else if (strcmp(cmd"/test"true) == 0)
    {
        new 
nobject[32];
        for(new 
14000i++)
        {
            if(
IsValidDynamicObject(i))
            {
                
format(nobject,sizeof(nobject),"%d",i);
                
SendClientMessageToAll(0x00B95CAA,nobject);
                
printf("DynamicObject ID: %d"i);
            }
        }
        for(new 
1MAX_OBJECTSi++)
        {
            if(
IsValidObject(i))
            {
                
format(nobject,sizeof(nobject),"%d",i);
                
SendClientMessageToAll(0x00B95CAA,nobject);
                
printf("Object ID: %d"i);
            }
        }
        return 
1;
    } 
Reply
#5

На этом стримере лимит объектов только вокруг тебя.
Нагрузка на сервер 15 процентов? 15 процентов чего? 15 процентов от чего?

PHP Code:
        new nobject[32]; 
        for(new 
14000i++) 
        { 
            if(
IsValidDynamicObject(i)) 
            { 
                
format(nobject,sizeof(nobject),"%d",i); 
                
SendClientMessageToAll(0x00B95CAA,nobject); 
                
printf("DynamicObject ID: %d"i); 
            } 
        } 
        for(new 
1MAX_OBJECTSi++) 
        { 
            if(
IsValidObject(i)) 
            { 
                
format(nobject,sizeof(nobject),"%d",i); 
                
SendClientMessageToAll(0x00B95CAA,nobject); 
                
printf("Object ID: %d"i); 
            } 
        } 
Зачем писать правильные объекты в лог, да еще и выводить для всех пользователей?
Подсчитать объекты? Это можно сделать например так


Или так
PHP Code:
        for(new 14000i++) 
        { 
            if(!
IsValidDynamicObject(i)) return printf("Valid objects: %d"i-1);  
        } 
Reply
#6

Quote:
Originally Posted by WINDAM
View Post
Случайно заметил что креш клиента происходил из за несуществующих объектов по коду ошибки
И действительно вылеты клиента часто происходят из за этого сам проверял.
натолкнула на решение этой проблемы вот эта тема https://sampforum.blast.hk/showthread.php?tid=324206
Вы бы для начала дочитали ту тему и лишь потом предлагали решение. А клиент вылетает не из-за отсутствия объектов а из за отсутствии модели объекта или объект вызывает краш так как он связан со скриптами самой игры.
Reply
#7

То ли автор действительно людям помочь хотел, то ли просто репутации заработать, но о работе стримера и правильном, экономном написании циклов у него 0 представления.
Reply
#8

эм, а как читер объект создает? вся инфа об объектах на сервере хранится
Reply
#9

Quote:
Originally Posted by White_116
View Post
Вы бы для начала дочитали ту тему и лишь потом предлагали решение. А клиент вылетает не из-за отсутствия объектов а из за отсутствии модели объекта или объект вызывает краш так как он связан со скриптами самой игры.
Клиент вылетает если этот объект будет создан на сервере, смысл в том чтоб его удалить, можешь проверку на создание стандартных моделей сделать если у тебя там есть кривые модели. Я ща играю нормально варнинги только из за машин вылетают тоже наверное из за несуществующих моделей. Насчет этого ниче точно сказать немагу незнаю.
Reply
#10

Quote:
Originally Posted by Jon_De
View Post
эм, а как читер объект создает? вся инфа об объектах на сервере хранится
Информация инструкции для работы выполнения каких то задач типа мода хранятся в файле, но инструкции для сервера можно делать как то иначе, Используя функцию создания объекта во время игры CreateObject. Всё что не запрещено кодом сервера или есть где то недоработка, соответственно люди пользуются те что умеют. Например я знаю что самп не отслеживает находится ли игрок в стене или где то ещё он это вообще не понимает, для этого придумана была геодата для серверов Lineage чтоб через стены не ходить. Так же по моему можно тупо настроить на клиенте в текстовом документе параметры машин и гонять как на иномарках на стремных тачках.
Reply
#11

Quote:
Originally Posted by stabker
Посмотреть сообщение
То ли автор действительно людям помочь хотел, то ли просто репутации заработать, но о работе стримера и правильном, экономном написании циклов у него 0 представления.
Те что знают настроят, это пример а не готовая функция, идею главное подать а дальше сам думай что из этого лепить. Репутации точно мне ненужно а вот пользоваться идеей в одну харю мне бы не хотелось так неинтересно)
Reply
#12

Quote:
Originally Posted by sniper-termit
Посмотреть сообщение
На этом стримере лимит объектов только вокруг тебя.
Нагрузка на сервер 15 процентов? 15 процентов чего? 15 процентов от чего?

Зачем писать правильные объекты в лог, да еще и выводить для всех пользователей?
Подсчитать объекты?
1. Нагрузка на процессор например.
2. Чтобы запись пошла в лог например можно отправить сообщение в чат, у меня функция принт не пишется в лог я не настраивал скрипты под это, чтобы снизить нагрузку(лог оставил только чата так как его нельзя вырубить).
Reply
#13

Не представляю как можно создать глобальный объект, не имея админки.
Разумеется я имею ввиду случай, когда не раздаются админки всем попало и код проверки админки написан грамотно.
А писать защиту от глупости самих админов... на мой взгляд бессмысленно и глупо. ИМХО.
Reply
#14

Quote:
Originally Posted by WINDAM
Посмотреть сообщение
2. Чтобы запись пошла в лог например можно отправить сообщение в чат, у меня функция принт не пишется в лог я не настраивал скрипты под это, чтобы снизить нагрузку(лог оставил только чата так как его нельзя вырубить).
Я что-то не уловил? но функция print и её расширение printf предназначена ТОЛЬКО для вывода сообщения в лог.
Reply
#15

Quote:
Originally Posted by -Stranger-
Посмотреть сообщение
Я что-то не уловил? но функция print и её расширение printf предназначена ТОЛЬКО для вывода сообщения в лог.
Мне этого неизвестно не проверял. Помоему она вообзе только сообщение в консоль отправляет.
Reply
#16

Quote:
Originally Posted by WINDAM
Посмотреть сообщение
Мне этого неизвестно не проверял. Помоему она вообзе только сообщение в консоль отправляет.
Такж лог это лог консоли
Reply
#17

Quote:
Originally Posted by -Stranger-
Посмотреть сообщение
Не представляю как можно создать глобальный объект, не имея админки.
Разумеется я имею ввиду случай, когда не раздаются админки всем попало и код проверки админки написан грамотно.
А писать защиту от глупости самих админов... на мой взгляд бессмысленно и глупо. ИМХО.
Как взламывать сервера я тебя не буду учить, я думаю на форуме за это попадёт любому. А на сервере за 2 года много чего повидал. Таких чудес насмотрелся просто ппц))) Поставить сервер это ещё ничего не значит. Да и защиту от всего сразу не сделаешь.
Reply
#18

WINDAM, я тоже не просто на форуме 500 сообщений набил.
И за 2 года держание своего сервера и обслуживания другого, у меня было тока два серьёзных бага, причём оба связанные с моей ленью и недосмотром.
1) Переполнился ramdisk логом, и стали затираться аккаунты игроков.
2) Можно было зайти под именем бота без пароля, а права у него чуть ниже админа.
При этом, не единого хака. И почти у всех сторожил форума тоже самое.

Вывод очевидный, прежде чем что-то делать, хоть вики прочитать нада по программированию :\
Reply
#19

Quote:
Originally Posted by -Stranger-
Посмотреть сообщение
WINDAM, я тоже не просто на форуме 500 сообщений набил.
И за 2 года держание своего сервера и обслуживания другого, у меня было тока два серьёзных бага, причём оба связанные с моей ленью и недосмотром.
1) Переполнился ramdisk логом, и стали затираться аккаунты игроков.
2) Можно было зайти под именем бота без пароля, а права у него чуть ниже админа.
При этом, не единого хака. И почти у всех сторожил форума тоже самое.

Вывод очевидный, прежде чем что-то делать, хоть вики прочитать нада по программированию :\
Чтобы лог не переполнялся можно в моде попробовать стереть скрипты записи в лог и поставить антифлуд на команды чата секунд на 5 и лог станет весить значительно меньше мегобайт 200 в месяц. Будут записываться только логи чата и логи коннекта дисконнекта и модифицирование отправляемых пакетов.

Ну как бы все стандартные функции изучил досканально и как ими пользоваться тоже умею там ничего сложного нету, составить функцию придумать тоже, самые простые функции проще некуда, дети маленькие на нем программируют. Если у тебя всё так профессионально на mysql базу сервер переводи, А акаунты слетают одна из основных причин атака на сервер. Потому что серевер перестает обрабатывать команды и держать в памяти информацию об акаунтах и об всём остальном у него там каша в памяти получается и сохраняется уже всё в перемешку. Так сказать рука одного нога второго деньги третьего полный чернобль ))))
Reply
#20

Quote:
Originally Posted by WINDAM
Посмотреть сообщение
Ну как бы все стандартные функции изучил досканально и как ими пользоваться тоже умею там ничего сложного нету, составить функцию придумать тоже, самые простые функции проще некуда, дети маленькие на нем программируют. Если у тебя всё так профессионально на mysql базу сервер переводи, А акаунты слетают одна из основных причин атака на сервер. Потому что серевер перестает обрабатывать команды и держать в памяти информацию об акаунтах и об всём остальном у него там каша в памяти получается и сохраняется уже всё в перемешку. Так сказать рука одного нога второго деньги третьего полный чернобль ))))
По тому что вы пишите я сильно сомневаюсь в ваших познаниях. А знай вы функции досканально, вы бы не утверждали что объекты можно создать со стороны клиента.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)