1. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Авторы: joaquimandrade(v.2.3), Arkshine(v.2.6.3).
    Актуальные версии: 2.3, 2.6.3
    Официальная страница: forums.alliedmods.net
    Модуль требуется в плагинах, где используется патчинг памяти.

    Этот модуль даёт больше возможностей amxmodx кодеру, позволяя использовать функции, которые невозможно использовать без него. Начиная с версии 2.1 поддерживает прямой доступ к определённым участкам памяти. Концепция заключается в следующем: модуль обрабатывает преобразование между типами в C ++ и pawn, даёт вам возможность использовать функцию, если вы знаете её адрес в памяти и аргументы, которые она использует. Этот метод включает в себя общие принципы работы со структурами С++.

    Допустим, вы хотите использовать функцию
    Код (Unknown Language):
    1. void PM_Move( struct playermove_s *ppmove, qboolean server)
    Эта функция не возвращает значение и получает аргументы типов "playermove_s *" и "qboolean".

    Пока типы, необходимые функции, используются в модуле, вы можете её использовать. Если один из типов не используется, то Вы можете попробовать использовать его напрямую и продолжать работать с функцией, к примеру подключать её, так как при подключении функции вам не надо заботиться обо всех ее аргументах.

    Есть несколько путей найти функцию в памяти:
    1. Зная её имя. В библиотеках, скомпилированных на Линуксе, символьные имена функций прикреплены к самим функциям по умолчанию, так что найти не составит труда. К сожалению, этот способ бесполезен, если библиотека скомпилирована под Windows. В таком случае вам надо иметь исходники библиотеки и компилировать её самостоятельно так, чтобы библиотека передавала символьные имена для функций.
    2. Зная набор байтов в памяти, который относится именно к этой функции. Это метод называется "сканирование подписи", или "signature scanning". Технические подробности метода раскрыты здесь и вот тут. Этот метод позволяет вам обратиться к любой функции в памяти, пока вы можете найти её. Чтобы понять данный метод, вы должны прочитать больше о предмете по ссылкам выше.
    3. Получив адрес функции во время её использования в плагине. Если вы можете найти адрес функции программно, то вы можете её использовать. Эти функции предоставлены AmxModX без модуля Orpheu, но вы можете перехватить их модулем ещё перед вызовом во многих ситуациях. Например, когда они вызываются другими metamod-плагинами.
    4. Зная оффсет функции в библиотеке. Данный метод используется для тестирования "на ходу". Не следует на него полагаться, так как найденные оффсеты могут измениться при обновлении библиотек.
    5. Зная указатель функции в виртуальной таблице функций класса. Этот метод позволит использовать множество функций, зная лишь индекс. Метод был взят с модуля hamsandwich и переделан для работы с модулем Orpheu. Это даёт возможность перехватывать виртуальные функции entities и объектов, таких как CGameRules. Теперь набор функций, кодированных напрямую(hardcoded), ничем не ограничен, и можно использовать функции, зависящие от мода, которые ранее было невозможно перехватить обычными методами.
    Для того, чтобы дать модулю информацию о функции, вы должны создать файл, отформатированный в стандарте JSON, и положить в "configs/orpheu/functions". Этот файл будет выглядеть так, как в примере ниже:
    Для функции
    Код (Unknown Language):
    1. CMBaseMonster* spawn_monster(int monster_type, Vector& origin, float angle, int respawn_index)  
    Файл будет выглядеть так

    Код (Unknown Language):
    1. {
    2.     "name" : "spawn_monster",
    3.     "library" : "monstermod",
    4.     "info" : "Spawns a monstermod monster in the world",
    5.     "arguments" :
    6.     [
    7.         {
    8.             "type" : "int",
    9.             "info" : "The type of the monster"
    10.         },
    11.         {
    12.             "type" : "Vector &",
    13.             "info" : "The position where the monster will be placed at"
    14.         },
    15.         {
    16.             "type" : "float",
    17.             "info" : "Angle of the monster"
    18.         },
    19.         {
    20.             "type" : "int",
    21.             "info" : "Respawn index. Related to the order of a monster respawning if failed to spawn at the first try"
    22.         }
    23.     ],
    24.     "return" :
    25.     {
    26.         "type" : "CMBaseMonster *",
    27.         "info" : "The monster created"
    28.     },
    29.     "identifiers":
    30.     [
    31.         {
    32.             "os" : "windows",
    33.             "value" : "?spawn_monster@@YAPAVCMBaseMonster@@HAAVVector@@MH@Z"
    34.         },
    35.         {
    36.             "os" : "linux",
    37.             "value" : "_Z13spawn_monsteriR6Vectorfi"
    38.         }
    39.     ]
    40. }
    • поля "Info" не обязательны
    • поле "name" должно совпадать с именем файла
    • Библиотека называется "mod" для модов типа cstrike, и "engine" для библиотеки движка(engine dll). Для библиотек Metamod'а надо создать файл наподобие тех, что вы можете найти в "configs\orpheu\libraries", которые содержат пару libraryname/libraryCvar.
    • Идентификаторы(The identifiers) представляют собой массив групп "os"/"value" для идентификации функции. Если библиотека это "mod", вам надо добавить дополнительные поля под названием "mod". Это выглядит так:
      Код (Unknown Language):
      1. "mod" : "cstrike"
      Задача этого поля - документация.
    В данном случае используется метод определения имени для ссылки на функцию. В случае с сигнатурами поле "value" будет последовательностью байтов, "*" или "?". Например
    Код (Unknown Language):
    1. "value" : [0x1,"*","?"]
    "*" используется когда значение байта не важно. Например,
    "value" : [0x1,"*"]
    равно
    [0x1,0x0] , [0x1,0x1] , ... [0x1,0xFF]
    "?" используется когда значение байта не важно и даже сам байт может не быть создан. Например,
    "value" : [0x1,"?"]
    равно тому, что выше, плюс [0x1].

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

    Особняком стоят функции, которые принадлежат классу, например
    PHP:
    1. void CMController :: HandleAnimEvent( MonsterEvent_t *pEvent )  
    В этом случае необходимо создать папку по имени "CMController" и создать файл "HandleAnimEvent" в этой папке. Это необходимо для лучшей организации. Вам также необходимо добавить в файл поле "class".
    Файл будет выглядеть так:
    Код (Unknown Language):
    1. {
    2.     "name" : "HandleAnimEvent",
    3.     "class" : "CMController",
    4.     "library" : "monstermod",
    5.     "arguments" :
    6.     [
    7.         {
    8.             "type" : "MonsterEvent_t *"
    9.         }
    10.     ],
    11.     "identifiers":
    12.     [
    13.         {
    14.             "os" : "windows",
    15.             "value" : "?HandleAnimEvent@CMController@@UAEXPAUMonsterEvent_t@@@Z"
    16.         },
    17.         {
    18.             "os" : "linux",
    19.             "value" : "_ZN12CMController15HandleAnimEventEP14MonsterEvent_t"
    20.         }
    21.     ]
    22. }
    Другой метод использования функции состоит в получении её адреса программно. Обратите внимание на эту ссылку, строка 100.
    Вы можете найти там представление структуры под названием "enginefuncs_s". Эта структура содержит адреса функций движка. Модуль предоставляет stock чтобы их использовать.
    Допустим, мы хотим перехватить функцию, расположенную в структуре
    PHP:
    1. void (*pfnServerPrint)( const char *szMsg );  
    Надо создать файл вида
    Код (Unknown Language):
    1. {
    2.     "name" : "ServerPrint",
    3.     "library" : "engine",
    4.     "arguments" :
    5.     [
    6.         {
    7.             "type" : "char *"
    8.         }
    9.     ]
    10. }
    Идентификаторы не нужны, так как адрес будет найден программно во время запуска. В плагине у нас будет
    PHP:
    1. new OrpheuFunction:ServerPrint = OrpheuGetEngineFunction("pfnServerPrint","ServerPrint")  
    После чего вы можете перехватить или вызвать эту функцию. Перехватив функцию, вы также можете перехватить консольные сообщения наподобие тех, которые возникают, когда вы используете серверную команду "metamod".
    Это вариант (кодированный вручную(hardcoded)) метода, использующего функцию, адрес, который есть в плагине. Другой метод заключается в использовании OrpheuGetDLLFunction для восстановления функций из структуры DLL_FUNCTIONS.
    Обратите внимание на эту ссылку, строка 384.
    Для рядовых случаев можно использовать натив
    PHP:
    1. native OrpheuFunction:OrpheuCreateFunction(address,libFunctionName[],classname[]="")  
    Модуль позволяет вам управлять структурами обычным путём. Допустим, нам надо перехватить функцию PM_Move, которая может быть найдена в структуре DLL_FUNCTIONS. Её файл
    Код (Unknown Language):
    1. {
    2.     "name" : "PM_Move",
    3.     "library" : "mod",
    4.     "arguments" :
    5.     [
    6.         {
    7.             "type" : "playermove_s *"
    8.         },
    9.         {
    10.             "type" : "qboolean"
    11.         }
    12.     ]
    13. }
    Перехватываем её
    Код (Unknown Language):
    1. public plugin_init()
    2. {
    3.     new OrpheuFunction:PM_Move = OrpheuGetDLLFunction("pfnPM_Move","PM_Move")
    4.     OrpheuRegisterHook(PM_Move,"OnPM_Move")
    5. }
    6.  
    7. public OnPM_Move(ppmove,server)
    8. {
    9.  
    10. }  
    Первый аргумент функции - структура. Вы можете видеть её по этой ссылке, строка 92.

    Работа с данными структуры
    PHP:
    1. public OnPM_Move(ppmove,server)
    2. {
    3.     new id = OrpheuGetParamStructMember(1,"player_index") + 1
    4.     new Float:friction = OrpheuGetParamStructMember(1,"friction")
    5.  
    6.     new sztexturename[20]
    7.     OrpheuGetParamStructMember(1,"sztexturename",sztexturename,charsmax(sztexturename))
    8.  
    9.     server_print("ID %d friction %f texturename %s",id,friction,sztexturename)
    10. }  
    Остальную информацию можно посмотреть в инклюдах(вложения, includes).
    Та же структура содержит адреса для других функций. Ниже пример, как перехватить одну из них:
    Код (Unknown Language):
    1. {
    2.     "name" : "PM_PlaySound",
    3.     "library" : "engine",
    4.     "arguments" :
    5.     [
    6.         {
    7.             "type" : "int"
    8.         },
    9.         {
    10.             "type" : "char *"
    11.         },
    12.         {
    13.             "type" : "float"
    14.         },
    15.         {
    16.             "type" : "float"
    17.         },
    18.         {
    19.             "type" : "int"
    20.         },
    21.         {
    22.             "type" : "int"
    23.         }
    24.     ]
    25. }
    PHP:
    1. new OrpheuHook:PM_PlaySoundHook
    2.  
    3. public plugin_init()
    4. {
    5.     new OrpheuFunction:PM_Move = OrpheuGetDLLFunction("pfnPM_Move","PM_Move")
    6.     OrpheuRegisterHook(PM_Move,"OnPM_Move")
    7.     OrpheuRegisterHook(PM_Move,"OnPM_MovePost",OrpheuHookPost)
    8. }
    9.  
    10. public OnPM_Move(ppmove,server)
    11. {
    12.     // Retrieves the address of the function to hook
    13.     new PM_PlaySoundAddress = OrpheuGetParamStructMember(1,"PM_PlaySound")
    14.  
    15.     // Creates the function in the module
    16.     new OrpheuFunction:PM_PlaySound = OrpheuCreateFunction(PM_PlaySoundAddress,"PM_PlaySound")
    17.  
    18.     // Hooks it
    19.     PM_PlaySoundHook = OrpheuRegisterHook(PM_PlaySound,"OnPM_PlaySoundHook")
    20. }
    21.  
    22. public OnPM_PlaySoundHook(channel,sample[],Float:volume,Float:attenuation,fFlags,pitch)
    23. {
    24.     server_print("Sample %s",sample)
    25. }
    26.  
    27. public OnPM_MovePost(ppmove,server)
    28. {
    29.     OrpheuUnregisterHook(PM_PlaySoundHook)
    30. }  
    Остальная информация во вложениях(includes)
    Список поддерживаемых типов данных
    PHP:
    1.  
    2.     "bool"
    3.     "byte"
    4.     "long"
    5.     "CBaseEntity *"
    6.     "char *"
    7.     "edict_s *"
    8.     "float"
    9.     "Vector *"
    10.     "CMBaseMonster *"
    11.     "char"
    12.     "short"
    13.     "entvars_s *"
    Структуры:
    Код (Unknown Language):
    1.  "movevars_s *"
    2.     "usercmd_s *"
    3.     "MonsterEvent_t *"
    4.     "DLL_FUNCTIONS *"
    5.     "playermove_s *"
    6.     "enginefuncs_t *"
    7.     "TraceResult *"
    8.     "physent_s *"
    9.     "pmplane_s *"
    10.     "pmtrace_s *"
    11.     "weapon_data_s *"
    12.     "AmmoInfo *"
    13.     "ItemInfo *"
    14.     "Task_t *"
    15.     "Schedule_t *"
    Если модуль не работает на вашем Linux - сервере, вам стоит установить libstdc++
    Продолжение в следующем посте из-за ограничения по числу символов.

    Установка:
    Выбор нужной вам версии зависит от билда сервера.
    Если у вас HLDS Build 5***, ставьте 2.3.
    Если HLDS Build 6***, ставьте 2.6.3.
    Можно попробовать на HLDS Build 5*** поставить версию 2.6.3. Чаще всего работает, но не всегда, может не завестись. Тогда ставьте старую проверенную 2.3.
     

    Вложения:

    Последнее редактирование: 30.05.15
    p1kA, HUNTERsp4x, like и ещё 1-му нравится это.
  2. gudaus Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.508
    Симпатии:
    1.102
    Пол:
    Мужской
    Виртуальные функции:
    Виртуальные функции – это функции,которые представляют концепцию совместного использования ресурсов для нескольких различных классов (как Spawn) и по другому осуществляют это предоставление. Способ, которым функции компилируются, позволяет размещать их в памяти путем обеспечения их простыми числовыми оффсетами. Ссылки на функции хранятся в таблице так, что каждый объект класса может взаимодействовать с ними. Эта таблица для мода Counter Strike, восстановленная из бинарного файла под Linux класса CHalfLifeMultiplay, который расширяет CGameRules. (Каждая строка содержит символьное имя, которое представляет функцию):
    Код (Unknown Language):
    1. 01 - Think__18CHalfLifeMultiplay
    2. 02 - IsAllowedToSpawn__18CHalfLifeMultiplayP11CBaseEntity
    3. 03 - FAllowFlashlight__18CHalfLifeMultiplay
    4. 04 - FShouldSwitchWeapon__18CHalfLifeMultiplayP11CBasePlayerP15CBasePlayerItem
    5. 05 - GetNextBestWeapon__18CHalfLifeMultiplayP11CBasePlayerP15CBasePlayerItem
    6. 06 - IsMultiplayer__18CHalfLifeMultiplay
    7. 07 - IsDeathmatch__18CHalfLifeMultiplay
    8. 08 - IsTeamplay__10CGameRules
    9. 09 - IsCoOp__18CHalfLifeMultiplay
    10. 10 - GetGameDescription__10CGameRules
    11. 11 - ClientConnected__18CHalfLifeMultiplayP7edict_sPCcT2Pc
    12. 12 - InitHUD__18CHalfLifeMultiplayP11CBasePlayer
    13. 13 - ClientDisconnected__18CHalfLifeMultiplayP7edict_s
    14. 14 - UpdateGameMode__18CHalfLifeMultiplayP11CBasePlayer
    15. 15 - FlPlayerFallDamage__18CHalfLifeMultiplayP11CBasePlayer
    16. 16 - FPlayerCanTakeDamage__18CHalfLifeMultiplayP11CBasePlayerP11CBaseEntity
    17. 17 - ShouldAutoAim__10CGameRulesP11CBasePlayerP7edict_s
    18. 18 - PlayerSpawn__18CHalfLifeMultiplayP11CBasePlayer
    19. 19 - PlayerThink__18CHalfLifeMultiplayP11CBasePlayer
    20. 20 - FPlayerCanRespawn__18CHalfLifeMultiplayP11CBasePlayer
    21. 21 - FlPlayerSpawnTime__18CHalfLifeMultiplayP11CBasePlayer
    22. 22 - GetPlayerSpawnSpot__18CHalfLifeMultiplayP11CBasePlayer
    23. 23 - AllowAutoTargetCrosshair__18CHalfLifeMultiplay
    24. 24 - ClientCommand_DeadOrAlive__18CHalfLifeMultiplayP11CBasePlayerPCc
    25. 25 - ClientCommand__18CHalfLifeMultiplayP11CBasePlayerPCc
    26. 26 - ClientUserInfoChanged__18CHalfLifeMultiplayP11CBasePlayerPc
    27. 27 - IPointsForKill__18CHalfLifeMultiplayP11CBasePlayerT1
    28. 28 - PlayerKilled__18CHalfLifeMultiplayP11CBasePlayerP9entvars_sT2
    29. 29 - DeathNotice__18CHalfLifeMultiplayP11CBasePlayerP9entvars_sT2
    30. 30 - CanHavePlayerItem__18CHalfLifeMultiplayP11CBasePlayerP15CBasePlayerItem
    31. 31 - PlayerGotWeapon__18CHalfLifeMultiplayP11CBasePlayerP15CBasePlayerItem
    32. 32 - WeaponShouldRespawn__18CHalfLifeMultiplayP15CBasePlayerItem
    33. 33 - FlWeaponRespawnTime__18CHalfLifeMultiplayP15CBasePlayerItem
    34. 34 - FlWeaponTryRespawn__18CHalfLifeMultiplayP15CBasePlayerItem
    35. 35 - VecWeaponRespawnSpot__18CHalfLifeMultiplayP15CBasePlayerItem
    36. 36 - CanHaveItem__18CHalfLifeMultiplayP11CBasePlayerP5CItem
    37. 37 - PlayerGotItem__18CHalfLifeMultiplayP11CBasePlayerP5CItem
    38. 38 - ItemShouldRespawn__18CHalfLifeMultiplayP5CItem
    39. 39 - FlItemRespawnTime__18CHalfLifeMultiplayP5CItem
    40. 40 - VecItemRespawnSpot__18CHalfLifeMultiplayP5CItem
    41. 41 - CanHaveAmmo__10CGameRulesP11CBasePlayerPCci
    42. 42 - PlayerGotAmmo__18CHalfLifeMultiplayP11CBasePlayerPci
    43. 43 - AmmoShouldRespawn__18CHalfLifeMultiplayP15CBasePlayerAmmo
    44. 44 - FlAmmoRespawnTime__18CHalfLifeMultiplayP15CBasePlayerAmmo
    45. 45 - VecAmmoRespawnSpot__18CHalfLifeMultiplayP15CBasePlayerAmmo
    46. 46 - FlHealthChargerRechargeTime__18CHalfLifeMultiplay
    47. 47 - FlHEVChargerRechargeTime__18CHalfLifeMultiplay
    48. 48 - DeadPlayerWeapons__18CHalfLifeMultiplayP11CBasePlayer
    49. 49 - DeadPlayerAmmo__18CHalfLifeMultiplayP11CBasePlayer
    50. 50 - GetTeamID__18CHalfLifeMultiplayP11CBaseEntity
    51. 51 - PlayerRelationship__18CHalfLifeMultiplayP11CBasePlayerP11CBaseEntity
    52. 52 - GetTeamIndex__10CGameRulesPCc
    53. 53 - GetIndexedTeamName__10CGameRulesi
    54. 54 - IsValidTeam__10CGameRulesPCc
    55. 55 - ChangePlayerTeam__10CGameRulesP11CBasePlayerPCcii
    56. 56 - SetDefaultPlayerTeam__10CGameRulesP11CBasePlayer
    57. 57 - PlayTextureSounds__18CHalfLifeMultiplay
    58. 58 - FAllowMonsters__18CHalfLifeMultiplay
    59. 59 - EndMultiplayerGame__18CHalfLifeMultiplay
    60. 60 - IsFreezePeriod__10CGameRules
    61. 61 - ServerDeactivate__18CHalfLifeMultiplay
    62. 62 - CheckMapConditions__18CHalfLifeMultiplay
    63. 63 - CleanUpMap__18CHalfLifeMultiplay
    64. 64 - RestartRound__18CHalfLifeMultiplay
    65. 65 - CheckWinConditions__18CHalfLifeMultiplay
    66. 66 - RemoveGuns__18CHalfLifeMultiplay
    67. 67 - GiveC4__18CHalfLifeMultiplay
    68. 68 - ChangeLevel__18CHalfLifeMultiplay
    69. 69 - GoToIntermission__18CHalfLifeMultiplay  
    Чтобы использовать любую из них, вам надо создать файл, который будет выглядеть так
    Код (Unknown Language):
    1. {
    2.     "name" : "GetNextBestWeapon",
    3.     "class" : "CGameRules",
    4.     "library" : "mod",
    5.     "arguments" :
    6.     [
    7.         {
    8.             "type" : "CBasePlayer *"
    9.         },
    10.         {
    11.             "type" : "CBasePlayerItem *"
    12.         }
    13.     ],
    14.     "return" :
    15.     {
    16.         "type" : "bool"
    17.     },
    18.     "indexes" :
    19.     [
    20.         {
    21.             "os" : "windows",
    22.             "mod" : "cstrike",
    23.             "value" : 5
    24.         },
    25.         {
    26.             "os" : "linux",
    27.             "mod" : "cstrike",
    28.             "value" : 6
    29.         }
    30.     ]
    31. }
    На Linux виртуальная таблица включает дополнительную функцию в начале, поэтому надо делать смещение на +1( увеличить offsets на 1).
    Это описание функции должно быть помещено в каталог "virtualFunctions", в папку "CGameRules", в файл "GetNextBestWeapon".
    Теперь вы можете использовать эти функции в плагине при помощи нативов
    PHP:
    1. OrpheuGetFunctionFromClass(entityClassName[],libFunctionName[],libClassName[])
    2. OrpheuGetFunctionFromEntity(id,libFunctionName[],libClassName[])
    3. OrpheuGetFunctionFromObject(object,libFunctionName[],libClassName[])
    4. OrpheuGetFunctionFromMonster(id,libFunctionName[],libClassName[])  
    Первые два работают также, как нативы с модуля hamsandwich:
    • Первая вызывает функцию, основанную на классе энтити
    • Вторая вызывает функцию, основанную на энтити
    Чтобы использовать функции из CHalfLifeMultiplay, описанные выше, нам нужен OrpheuGetFunctionFromObject. Этот натив вызывает функцию, основанную на объекте, класс которого нам необходим. Так что нам нужен лишний шаг для получения объекта.
    Вот один из путей решения:
    PHP:
    1. {
    2.     "name" : "InstallGameRules",
    3.     "library" : "mod",
    4.     "return" :
    5.     {
    6.         "type" : "CHalfLifeMultiplay *"
    7.     },
    8.     "identifiers":
    9.     [
    10.         {
    11.             "os" : "windows",
    12.             "mod" : "cstrike",
    13.             "value" : [0x68,0x8c,0xea,"*",0xa,0xff,0x15,0xdc,0x23,"*",0xa,0x83,0xc4,0x4,0xff,0x15,0xe0,0x23,"*",0xa,0xa1,0xb8,0x25]
    14.         },
    15.         {
    16.             "os" : "linux",
    17.             "mod" : "cstrike",
    18.             "value" : "InstallGameRules__Fv"
    19.         }
    20.     ]
    21. }  
    PHP:
    1. public plugin_precache()
    2. {
    3.     new OrpheuFunction:InstallGameRules = OrpheuGetFunction("InstallGameRules")
    4.     OrpheuRegisterHook(InstallGameRules,"OnInstallGameRules",OrpheuHookPost)
    5. }
    6.  
    7. public OnInstallGameRules()
    8. {
    9.     new obj = OrpheuGetReturn()
    10.     new OrpheuFunction:GetNextBestWeapon = OrpheuGetFunctionFromObject(obj,"GetNextBestWeapon","CGameRules")
    11.     OrpheuRegisterHook(GetNextBestWeapon,"OnGetNextBestWeapon")
    12. }
    13.  
    14. public OnGetNextBestWeapon(obj,id,weaponID)
    15. {
    16.     //
    17. }  
    Управление памятью
    Модуль поддерживает установку любых значений напрямую в память, где находится библиотека. Примеры того, что может быть сделано: изменить стоимость оружия, поменять строки чтобы изменить текст в консоли.
    Всё это может быть сделано при помощи использования смещений(offsets) для ссылки к тем участкам памяти, которые вы хотите изменить, зная их расположение или подпись(signatures). Как и для функций, необходимо создать файл. Файл может содержать одно или несколько описаний тех ячеек памяти, к которым вы хотите обратиться.
    Пример изменения стоимости AWP:
    PHP:
    1. [
    2.     {
    3.         "name" : "awpCost",
    4.         "library" : "mod",
    5.         "type" : "long",
    6.         "memoryType" : "data",
    7.         "identifiers" :
    8.         [
    9.             {
    10.                 "os" : "windows",
    11.                 "mod" : "cstrike",
    12.                 "value" : [0x8E,0x12,0x00,0x00,0x7D,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07]
    13.             }
    14.         ]
    15.     }
    16. ]  
    PHP:
    1. OrpheuMemorySet("awpCost",1,1000)  
    Это просто пример для windows и cstrike, однако модуль может быть использован как на windows, так и на Linux и на любом другом моде.
    Остальную информацию читайте во вложениях(includes).
    Замечание: если вы хотите заменить строки, напрямую размещённые в памяти, используйте тип "string" вместо "char *".

    Переведено: Gudaus, special for Neugomon.ru
    Особая благодарность Next21 Team за их вариант перевода. Несколько предложений из раздела Виртуальные функции я не смог перевести и воспользовался их вариантом.
     
    Последнее редактирование: 30.05.15
    HUNTERsp4x, like и Phantom нравится это.
  3. niga7772 Пользователь

    Регистрация:
    20.05.15
    Сообщения:
    31
    Симпатии:
    7
    Пол:
    Мужской
    VKcom:
    rogoz2827
    Skype:
    rogoz2827
    а для билда 6153 ,нужен 2.6.3?
     
  4. mforce Пользователь

    Регистрация:
    24.08.15
    Сообщения:
    145
    Симпатии:
    93
    Пол:
    Мужской
    да
     
  5. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    mforce, о, ты по русски пишешь? :D
     
  6. mforce Пользователь

    Регистрация:
    24.08.15
    Сообщения:
    145
    Симпатии:
    93
    Пол:
    Мужской
    Переводчика Google мой друг
     
    happyQQ, Le$hiy и neygomon нравится это.
  7. deadarhangel Пользователь

    Регистрация:
    19.06.15
    Сообщения:
    99
    Симпатии:
    30
    Пол:
    Мужской
    Может кто сталкивался с данной ошибкой. :confused:
    Код (Unknown Language):
    1.  
    2. [ORPHEU] Function "SV_ParseConsistencyResponse" not found
    3. [AMXX] Run time error 10 (plugin "opengl32.amxx") (native "OrpheuGetFunction") - debug not enabled!
    4. [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
    5. Log file started (file "cstrike/addons/amxmodx/logs/OD/2016_04_12.log") (game "cstrike") (amx "1.8.2")
    6. [SELFTEST][ERROR] Orpheu Function NOT FOUND! I'll try to fix it!
    7. [opengl32.amxx] [ERROR] Orpheu Function NOT FOUND I'll try to fix it!
    Билд 6153 , amx 1.8.2.
    Orpheu 2.6.3.

    Но, если ставлю Orpheu 2.3 - то нормально всё, но рекомендован первый вариант же.
     
  8. VkriterT Пользователь

    Регистрация:
    02.06.15
    Сообщения:
    424
    Симпатии:
    125
    Пол:
    Мужской
    deadarhangel, Там же написано что нет функции SV_ParseConsistencyResponse, тебе её нужно найти и добавить.
     
  9. deadarhangel Пользователь

    Регистрация:
    19.06.15
    Сообщения:
    99
    Симпатии:
    30
    Пол:
    Мужской
    А это тогда что?!

    Снимок экрана (18).png
     
  10. VkriterT Пользователь

    Регистрация:
    02.06.15
    Сообщения:
    424
    Симпатии:
    125
    Пол:
    Мужской
    deadarhangel, так это для 2.3
     
  11. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.543
    Симпатии:
    4.142
    Пол:
    Мужской
    VkriterT, они одинаковы