Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

PacketEntitiesFix

Статус пользователя [WPMG]PRoSToTeM@
сообщение 6.4.2014, 10:34
Сообщение #1
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Авторы: [WPMG]PRoSToTeM@, Lev
Версия: 0.0.1

Описание:
Данный метамод плагин фиксит баг с частично неправильной в некоторых случаях отсылкой полей в Svc_PacketEntities.
Например, это могло повлечь к "подскакиванию" игроков при записи демо.
Представлена только linux версия.

Установка:
Распаковать в папку с модом, добавить в plugins.ini из metamod:
Код
linux addons/PacketEntitiesFix/PacketEntitiesFix.so

Также имеется возможность подгрузки в режиме "онлайн":
Код
meta load addons/PacketEntitiesFix/PacketEntitiesFix.so


Исходный код:
C++ код
Код
#include <extdll.h>
#include <meta_api.h>

#include <sys/mman.h>

#ifndef PAGE_SIZE
    #define    PAGE_SIZE    4096
#endif

#define BIT(n)                (1<<(n))

#define DT_BYTE                BIT(0)
#define DT_SHORT            BIT(1)
#define DT_SIGNED            BIT(31)

#define DT_SEND                BIT(0)

struct delta_t
{
    int m_iFieldType;
    byte dontneed[32];
    int m_iOffset;
    byte dontneed0[16];
    byte m_iFlags;
    byte dontneed1[8];
};

struct delta_info_t
{
    byte dontneed[4];
    int m_iFieldsCount;
    byte dontneed0[36];
    delta_t *m_pFields;
};

#define OPCODE_JMPNEAR        0xE9

#pragma pack(push, 1)
struct jmpnear_t {
    byte m_bOpcode;
    void *m_pAddr;
};
#pragma pack(pop)

struct hook_t {
    void *m_pfnOriginal;
    byte m_rgbOriginalBytes[sizeof(jmpnear_t)];
    jmpnear_t m_jmpnearBytes;
};

meta_globals_t *gpMetaGlobals;
gamedll_funcs_t *gpGamedllFuncs;
mutil_funcs_t *gpMetaUtilFuncs;

enginefuncs_t g_engfuncs;
globalvars_t *gpGlobals;

typedef void (DELTA_MARKSENDFIELDS)(void *, void *, delta_info_t *);
typedef void (SV_CREATEPACKETENTITIES)(int, void *, void *, void *);

hook_t *g_phookDeltaMarkSendFields;
hook_t *g_phookSvCreatePacketEntities;

void *g_pEngineHandle;

plugin_info_t Plugin_info = {
    META_INTERFACE_VERSION,
    "PacketEntitiesFix",
    "0.0.1",
    "Apr  6 2014",
    "[WPMG]PRoSToTeM@ / Lev",
    "",
    "PEF",
    PT_ANYTIME,
    PT_ANYTIME,
};

extern void SV_CreatePacketEntities(int fDelta, void *dontneed, void *dontneed0, void *dontneed1);
extern void DELTA_MarkSendFields(void *pFrom, void *pTo, delta_info_t *pDeltaInfo);
extern void OpenEngine(void);
extern void CloseEngine(void);
extern void *FindSymbol(const char *pszSymbolName);
extern hook_t *CreateHook(void *pfnOriginal, void *pfnCallback, bool fDoHook = true);
extern void DeleteHook(hook_t *pHook);
extern void DoHook(hook_t *pHook);
extern void UndoHook(hook_t *pHook);

C_DLLEXPORT void GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals) {
    memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));

    gpGlobals = pGlobals;
}

C_DLLEXPORT int Meta_Query(char *, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) {
    *pPlugInfo = &Plugin_info;

    gpMetaUtilFuncs = pMetaUtilFuncs;

    return TRUE;
}

C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME , META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) {
    gpMetaGlobals = pMGlobals;
    gpGamedllFuncs = pGamedllFuncs;

    OpenEngine();
    g_phookDeltaMarkSendFields = CreateHook(FindSymbol("DELTA_MarkSendFields"), &DELTA_MarkSendFields, false);
    g_phookSvCreatePacketEntities = CreateHook(FindSymbol("SV_CreatePacketEntities"), &SV_CreatePacketEntities);
    CloseEngine();

    return TRUE;
}

C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME , PL_UNLOAD_REASON) {
    DeleteHook(g_phookSvCreatePacketEntities);
    DeleteHook(g_phookDeltaMarkSendFields);

    return TRUE;
}

void SV_CreatePacketEntities(int fDelta, void *dontneed, void *dontneed0, void *dontneed1) {
    if (!fDelta) {
        DoHook(g_phookDeltaMarkSendFields);
    }

    UndoHook(g_phookSvCreatePacketEntities);
    (*(SV_CREATEPACKETENTITIES *)g_phookSvCreatePacketEntities->m_pfnOriginal)(fDelta, dontneed, dontneed0, dontneed1);
    DoHook(g_phookSvCreatePacketEntities);

    if (!fDelta) {
        UndoHook(g_phookDeltaMarkSendFields);
    }
}

void DELTA_MarkSendFields(void *pFrom, void *pTo, delta_info_t *pDeltaInfo) {
    delta_t *pField;
    int nFieldCount;
    int i;
    void *pFromChange;
    void *pToChange;

    UndoHook(g_phookDeltaMarkSendFields);
    (*(DELTA_MARKSENDFIELDS *)g_phookDeltaMarkSendFields->m_pfnOriginal)(pFrom, pTo, pDeltaInfo);
    DoHook(g_phookDeltaMarkSendFields);

    pField = &(pDeltaInfo->m_pFields[0]);
    nFieldCount = pDeltaInfo->m_iFieldsCount;

    for (i = 0; i < nFieldCount; i++, pField++) {
        if (pField->m_iFlags & DT_SEND) {
            continue;
        }

        pFromChange = (byte *)pFrom + pField->m_iOffset;
        pToChange = (byte *)pTo + pField->m_iOffset;

        switch (pField->m_iFieldType & ~DT_SIGNED) {
        case DT_BYTE:
            *(byte *)pToChange = *(byte *)pFromChange;

            break;
        case DT_SHORT:
            *(word *)pToChange = *(word *)pFromChange;

            break;
        // Don't care about strings, cause entity_state_t haven't it
        default:
            *(unsigned int *)pToChange = *(unsigned int *)pFromChange;

            break;
        }
    }
}

void OpenEngine(void) {
    Dl_info Info;

    dladdr(g_engfuncs.pfnPrecacheModel, &Info);

    g_pEngineHandle = dlopen(Info.dli_fname, RTLD_NOW);
}

void CloseEngine(void) {
    dlclose(g_pEngineHandle);
}

void *FindSymbol(const char *pszSymbolName) {
    return dlsym(g_pEngineHandle, pszSymbolName);
}

hook_t *CreateHook(void *pfnOriginal, void *pfnCallback, bool fDoHook = true) {
    hook_t *pHook = new hook_t;

    pHook->m_pfnOriginal = pfnOriginal;
    memcpy(pHook->m_rgbOriginalBytes, pfnOriginal, sizeof(jmpnear_t));
    pHook->m_jmpnearBytes.m_bOpcode = OPCODE_JMPNEAR;
    pHook->m_jmpnearBytes.m_pAddr = (void *)((size_t)pfnCallback - (size_t)pfnOriginal - sizeof(jmpnear_t));

    mprotect((void *)((size_t)pfnOriginal & ~(PAGE_SIZE-1)), PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC);

    if (fDoHook) {
        DoHook(pHook);
    }

    return pHook;
}

void DeleteHook(hook_t *pHook) {
    UndoHook(pHook);

    delete pHook;
}

void DoHook(hook_t *pHook) {
    memcpy(pHook->m_pfnOriginal, &(pHook->m_jmpnearBytes), sizeof(jmpnear_t));
}

void UndoHook(hook_t *pHook) {
    memcpy(pHook->m_pfnOriginal, pHook->m_rgbOriginalBytes, sizeof(jmpnear_t));
}

Прикрепленные файлы:
Прикрепленный файл  PacketEntitiesFix.zip ( 3,31 килобайт ) Кол-во скачиваний: 83
Прикрепленный файл  SourceCode.zip ( 1,87 килобайт ) Кол-во скачиваний: 58
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 13 раз
   Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 6.4.2014, 10:36
Сообщение #2


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

сам тестил:?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
ops244
сообщение 6.4.2014, 10:37
Сообщение #3
Стаж: 15 лет

Сообщений: 958
Благодарностей: 939
Полезность: 0

в последнем дпрото твой фикс, как я понимаю уже есть?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 6.4.2014, 10:42
Сообщение #4
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(GOOD FELLOW @ 6.4.2014, 12:36) *
сам тестил:?

Да.

Цитата(ops244 @ 6.4.2014, 12:37) *
в последнем дпрото твой фикс, как я понимаю уже есть?

Да, это для тех кто не хочет ставить последний dproto :D. Плюс здесь и в dproto способы немного отличаются, надо оба способа затестить, в целом они оба правильные.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
trollface
сообщение 6.4.2014, 10:44
Сообщение #5
Стаж: 12 лет

Сообщений: 1970
Благодарностей: 2423
Полезность: 0

[WPMG]PRoSToTeM@,
последний дпрото кривоват и банит ни за что:D
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя [WPMG]PRoSToTeM@
сообщение 6.4.2014, 10:48
Сообщение #6
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Вообще, баг виден на игроках которые ниже вас в status, можете зайти на любой сервер наблюдателем, наблюдать за игроком который ниже вас по позиции в status и в этот момент начать записывать демо.

Отредактировал: [WPMG]PRoSToTeM@, - 6.4.2014, 10:48
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 6.4.2014, 10:51
Сообщение #7


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Вышлите багрепорт волво, мб исправят когда ни будь
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя csnet
сообщение 6.4.2014, 17:07
Сообщение #8
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

Цитата(Surf @ 6.4.2014, 12:51) *
Вышлите багрепорт волво, мб исправят когда ни будь


машины вольво итак надежнее некуда


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 8 раз
   + Цитировать сообщение
Статус пользователя neverminde
сообщение 6.4.2014, 18:25
Сообщение #9


Стаж: 15 лет

Сообщений: 1133
Благодарностей: 595
Полезность: 576

Цитата(csnet @ 6.4.2014, 18:07) *
машины вольво итак надежнее некуда

это в доте аббревиатура для valve, возможно какой-то мем есть.
valve - volvo
dendi - dondo
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
exec1337
сообщение 6.4.2014, 18:28
Сообщение #10
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Под win стОит ждать?

И да, это же вроде с ds.ru или это своё?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fred Perry
сообщение 6.4.2014, 18:38
Сообщение #11


Иконка группы

Стаж: 16 лет

Сообщений: 6594
Благодарностей: 2370
Полезность: 813

Цитата(exec1337 @ 6.4.2014, 18:28) *
Под win стОит ждать?

И да, это же вроде с ds.ru или это своё?

Дпрото жди


Гнилой фашистской нечисти
Загоним пулю в лоб,
Отродью человечества
Сколотим крепкий гроб!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
exec1337
сообщение 6.4.2014, 18:45
Сообщение #12
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Цитата(Fred Perry @ 6.4.2014, 19:38) *
Дпрото жди

Я не обновляюсь на сырое.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 9iky6
сообщение 6.4.2014, 19:00
Сообщение #13


Стаж: 14 лет

Сообщений: 143
Благодарностей: 47
Полезность: 260

Цитата(exec1337 @ 6.4.2014, 22:45) *
Я не обновляюсь на сырое.

Сырое и нестабильное =) DProto с каждым релизом всё больше превращается в калл
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
trollface
сообщение 6.4.2014, 19:13
Сообщение #14
Стаж: 12 лет

Сообщений: 1970
Благодарностей: 2423
Полезность: 0

9iky6,
383 вроде пока что стабильно работает...
хотя я не уверен. видел как пол сервера выкинуло:D консольку не успел глянуть sad.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 9iky6
сообщение 6.4.2014, 19:28
Сообщение #15


Стаж: 14 лет

Сообщений: 143
Благодарностей: 47
Полезность: 260

Цитата(trollface @ 6.4.2014, 23:13) *
9iky6,
383 вроде пока что стабильно работает...
хотя я не уверен. видел как пол сервера выкинуло:D консольку не успел глянуть sad.gif

Очень стабильно =D мой steamID уже 2 раза в бане побывал на старой версии (ага, реальный стим является фейком, это очень круто) так что я не рискую менять настройки + я ещё не разобрался как так банит игрока, что ip сервера пропадает из избраного =) как будто на уровне фаервола бан выдает =(
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 6.4.2014, 19:49
Сообщение #16


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

9iky6, addip
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
csgamer
сообщение 9.4.2014, 16:09
Сообщение #17
Стаж: 12 лет

Сообщений: 398
Благодарностей: 16
Полезность: 0

Цитата([WPMG]PRoSToTeM@ @ 6.4.2014, 13:42) *

Да.


Да, это для тех кто не хочет ставить последний dproto :D. Плюс здесь и в dproto способы немного отличаются, надо оба способа затестить, в целом они оба правильные.


Какой дпрото ты называешь последним? 383??
Нужно это реализовать в самом дпрото и отдельный плагин не интересен.
Всё равно дпрото стоит на любом серваке.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 9.4.2014, 16:11
Сообщение #18


Стаж: 12 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

csgamer, оно уже вшито в 383 dproto
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя tato2013
сообщение 9.4.2014, 16:18
Сообщение #19


Стаж: 12 лет

Сообщений: 331
Благодарностей: 121
Полезность: 185

Цитата(trollface @ 6.4.2014, 21:13) *
9iky6,
383 вроде пока что стабильно работает...
хотя я не уверен. видел как пол сервера выкинуло:D консольку не успел глянуть sad.gif

Стоит 383 такого не наблюдал!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
kritik
сообщение 9.4.2014, 17:26
Сообщение #20
Стаж: 12 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Так в чем косяк-то? Старые поля не сохраняются, если дельта не шлется?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: