(FS) Fix SA-MP Bugs (Исправление багов SA-MP)

Описание: Готовые решения скриптов, filterScript
Модератор: SJplayer

SJplayer M
Автор темы, Модератор
Модератор
Аватара
SJplayer M
Автор темы, Модератор
Модератор
Сообщения: 196
Зарегистрирован: 25 мая 2013
С нами: 10 лет 10 месяцев

#1 SJplayer » 5 июля 2013, 9:19

(FS) Fix SA-MP Bugs (Исправление багов SA-MP)
Автор: Kamox

FS содержащит в себе фиксы для самых распространенных SA-MP багов, таких как:

Банни хоп

- При помощи прыжков во время быстрого бега можно добиться ещё большей скорости. Данный фикс очищает анимацию нарушителя и замораживает его на 3 секунды.



- Нажимая клавишу "C" (По стандарту) игрок прерывает анимацию стрельбы, тем самым ускоряя её. Данный фикс переключает оружие нарушителя на кулаки/кастет и замораживает его на 3 секунды.

Slide

- При помощи данного бага игроки быстро передвигаются (На роликах ещё быстрее). При этом они могут стрелять. Данный фикс переключает оружие нарушителя на кулаки/кастет и замораживает его на 3 секунды.

Dialog Crush

- При вводе в диалоговое окно символа "%" сервер падает (Распространенный, но легко исправляемый баг). Данный фикс заменяет все символы "%" на "#" (Как в SendClientMessage).

Dialog colors

- Это не совсем баг, но если по мимо текста ввести ещё и цвет (Например: {33AA33} - Зеленый) исходный текст получится зеленого цвета. Данный фикс удаляет все HEX коды, заключенные в фигурные скобки ( "{" и "}" ).

Spawn money

- После "нормальной" смерти (Если после смерти игрок лежит на земле 2+ секунды, а не сразу спавнится) с игрока снимается $100, при этом GetPlayerMoney некоторое время показывает прежнюю сумму. Данный фикс отдает игроку $100 .При использовании данного фикса желательно убрать кик/бан за читерство денег. Оставить только их снятие.

Sprint

- Не баг, но всё же ... Многократно нажимая клавишу быстрого бега (По стандарту пробел) можно добиться ещё большей скорости быстрого бега. Данный фикс замораживает нарушителя на 3 секунды.

Knife bug

- Из-за плохой синхронизации SA-MP бывают такие моменты, что при "зарезании" игрока он остается жив. У нападающего он лежит и двигается в таком же положении, а у жертвы "зарезания" даже не происходило. Данный фикс очищает анимация "жертвы" если она избежала "зарезания", а на экране нападающего нет.

Knife kill

- Используя этот баг можно убить игрока "зарезанием" прямо на ходу. Данный фикс очищает анимацию нарушителя и "жертвы".

Scroll

- Данным багом пользуются для более быстрой перезарядки переключая оружие "туда-сюда". Данный фикс забирает оружие при использовании этого бага.

Любой из фиксов можно отключить по желанию. Для этого в FS есть

Код: Выделить всё

new FixInfo[fixInfo]


Код

Код: Выделить всё

/*
    Данный FS исправляет/запрещает использовать баги SA-MP:
    Данная версия скрипта включает в себя:
    BannyHop fix
    SpawnMoney fix
    DialogCrush fix
    DialogColor fix
    +C fix
    Slide fix
    Sprint fix
    Knife Bug fix
    Knife Kill fix
    
    Автор FS: Kamox
    Skype: k.amox
    Mail: k.amox@mail.ru
    
    Дата: 17.07.2012г
*/

#include <a_samp>

#define FREEZE_TIME 3000

enum fixInfo
{
    bool:fixBannyHop,
    bool:fixSpawnMoney,
    bool:fixDialogCrush,
    bool:fixDialogColor,
    bool:fixCBug,
    bool:fixSlideBug,
    bool:fixSprintBug,
    bool:fixKnifeBug,
    bool:fixKnifeKill
}

new FixInfo[fixInfo] =
{
    true, //BannyHop fix (Бег с прыжками)
    true, //SpawnMoney fix (При спавне снимает $100)
    true, //DialogCrush fix (Можно положить сервер вводя в диалоговое окно символ '%')
    true, //DialogColor fix (Можно менять цвет текста встявляя коды цветов "{33CCFF}")
    true, //C Bug fix (Баг со стрельбой с дигла)
    true, //Slide fix (Езда с диглом)
    true, //Sprint Bug fix (Быстрый бег многократным нажатием пробела)
    true, //KnifeBug fix (Баг с ножом, когда у одного игрока видно, что другой игрок лежит)
    true  //KnifeKill fix (Этим багом можно убить игрока ножом на ходу
};

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" Fix script by Kamox");
    print("--------------------------------------\n");
    return 1;
}

public OnPlayerConnect(playerid)
{
    SetPVarInt(playerid, "BHTime", -1);
    SetPVarInt(playerid, "MoneyTime", -1);
    SetPVarInt(playerid, "CBugTime", -1);
    SetPVarInt(playerid, "UnfreezeTime", -1);
    SetPVarInt(playerid, "SlideTime", -1);
    SetPVarInt(playerid, "SprintCount", -1);
     SetPVarInt(playerid, "SprintTime", -1);
     SetPVarInt(playerid, "KnifeTime", -1);
    SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if(FixInfo[fixSpawnMoney] && GetPVarInt(playerid, "MoneyTime") != -1)
    {
        if(GetTickCount() > GetPVarInt(playerid, "MoneyTime"))
        {
            GivePlayerMoney(playerid, 100);
        }
    }
    SetPVarInt(playerid, "MoneyTime", -1);
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    if(FixInfo[fixSpawnMoney])
    {
        SetPVarInt(playerid, "MoneyTime", GetTickCount() + 2000);
    }
    return 1;
}

stock BugFreezePlayer(playerid, time)
{
    SetPVarInt(playerid, "UnfreezeTime", time);
    TogglePlayerControllable(playerid, 0);
    return true;
}

stock GetPlayerSpeed(playerid)
{
    new Float:X, Float:Y, Float:Z;
    GetPlayerVelocity(playerid, X, Y, Z);
    return floatround( floatsqroot( X * X + Y * Y + Z * Z ) * 170.0 );
}

stock CheckDialogColor(text[], first, end)
{
    if(text[first] != '{' || text[end] != '}') return false;
    for(new i = first; i <= end; i ++)
    {
        if(text[i] >= '0' && text[i] <= '9') continue;
        if(text[i] >= 'a' && text[i] <= 'f') continue;
        if(text[i] >= 'A' && text[i] <= 'F') continue;
        return false;
    }
    strdel(text, first, end + 1);
    return true;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(FixInfo[fixBannyHop])
    {
        new tick = GetTickCount();
        if(oldkeys & KEY_SPRINT)
        {
            SetPVarInt(playerid, "BHTime", tick + 250);
        }
        if(newkeys & KEY_JUMP)
        {
            if(tick < GetPVarInt(playerid, "BHTime"))
            {
                ClearAnimations(playerid);
                BugFreezePlayer(playerid, tick + FREEZE_TIME);
            }
            SetPVarInt(playerid, "BHTime", -1);
        }
    }
    if(FixInfo[fixKnifeBug] || FixInfo[fixKnifeKill])
    {
        if(newkeys & KEY_FIRE && oldkeys & 128)
        {
            if(GetPlayerWeapon(playerid) == 4)
            {
                if(GetPlayerAnimationIndex(playerid) == 747)
                {
                    new knifeid = GetPlayerTargetPlayer(playerid);
                    if(knifeid != INVALID_PLAYER_ID)
                    {
                        if(FixInfo[fixKnifeKill] && GetPlayerSpeed(playerid) > 10)
                        {
                            ClearAnimations(playerid);
                            ClearAnimations(knifeid);
                        }
                        else if(FixInfo[fixKnifeBug])
                        {
                            new time = GetPlayerPing(playerid) + GetPlayerPing(knifeid);
                            SetPVarInt(knifeid, "KnifePlayer", playerid);
                            SetPVarInt(knifeid, "KnifeTime", GetTickCount() + time);
                        }
                    }
                }
            }
        }
    }
    if(FixInfo[fixSprintBug])
    {
        if(newkeys & KEY_SPRINT)
        {
            new tick = GetTickCount();
            if(GetPVarInt(playerid, "SprintTime") == -|| tick < GetPVarInt(playerid, "SprintTime"))
            {
                if(GetPlayerSpeed(playerid) > 15)
                {
                       if(GetPVarInt(playerid, "SprintCount") >= 5)
                    {
                        SetPVarInt(playerid, "SprintCount", -1);
                        SetPVarInt(playerid, "SprintTime", -1);
                        BugFreezePlayer(playerid, tick + FREEZE_TIME);
                    }
                    else
                    
{
                        SetPVarInt(playerid, "SprintCount", GetPVarInt(playerid, "SprintCount") + 1);
                        SetPVarInt(playerid, "SprintTime", tick + 200);
                    }
                }
            }
            else if(tick - GetPVarInt(playerid, "SprintTime") > 1000)
              {
                SetPVarInt(playerid, "SprintCount", -1);
                SetPVarInt(playerid, "SprintTime", -1);
            }
        }
    }
    if(FixInfo[fixCBug])
    {
        if(GetPlayerWeapon(playerid) > 21)
        {
            new tick = GetTickCount();
            if(oldkeys & KEY_FIRE) SetPVarInt(playerid, "CBugTime", tick + 500);
            if(newkeys & KEY_CROUCH)
            {
                if(tick < GetPVarInt(playerid, "CBugTime"))
                {
                    SetPlayerArmedWeapon(playerid, 0);
                    BugFreezePlayer(playerid, tick + FREEZE_TIME);
                }
                SetPVarInt(playerid, "CBugTime", -1);
            }
        }
    }
    if(FixInfo[fixSlideBug])
    {
        new tick = GetTickCount();
        new FIRE_WEAPON = GetPlayerWeapon(playerid) > 21;
        if(oldkeys & KEY_SPRINT && FIRE_WEAPON)
        {
            new keys, ud, lr;
            GetPlayerKeys(playerid, keys, ud, lr);
             if(ud != 0 || lr != 0)
              {
                 SetPVarInt(playerid, "SlideTime", tick + 500);
            }
        }
        if( (newkeys & KEY_FIRE || newkeys & 128) && FIRE_WEAPON )
        {
            if(tick < GetPVarInt(playerid, "SlideTime"))
            {
                SetPlayerArmedWeapon(playerid, 0);
                BugFreezePlayer(playerid, tick + FREEZE_TIME);
            }
            SetPVarInt(playerid, "SlideTime", -1);
        }
    }
    return 1;
}

public OnPlayerUpdate(playerid)
{
    if(GetPVarInt(playerid, "UnfreezeTime") != -1)
    {
        if(GetTickCount() > GetPVarInt(playerid, "UnfreezeTime"))
        {
            SetPVarInt(playerid, "UnfreezeTime", -1);
            TogglePlayerControllable(playerid, 1);
        }
    }
    if(GetPVarInt(playerid, "KnifeTime") != -1)
    {
        if(GetPlayerAnimationIndex(playerid) == 745)
        {
            SetPVarInt(playerid, "KnifeTime", -1);
            SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
        }
        else if(GetTickCount() > GetPVarInt(playerid, "KnifeTime"))
        {
            SetPVarInt(playerid, "KnifeTime", -1);
            SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
            ClearAnimations(playerid);
        }
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    for(new i, s = strlen(inputtext); i < s; i ++)
    {
        if(FixInfo[fixDialogCrush] && inputtext[i] == '%') inputtext[i] = '#';
        if(FixInfo[fixDialogColor] && inputtext[i] == '{') CheckDialogColor(inputtext, i, i + 7);
    }
    return 1;
}
i,


Вернуться в «Скрипты / FS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 4 гостя