Как декомпилировать cs файл

Обновлено: 06.07.2024

Зачем и как декомпилировать модели? Как компилировать модели? Как делать коллизию для модели? Всё это Вы узнаете из этой статьи Начнём, пожалуй, с декомпиляции моделей. Для этого есть программа MDL Decompiler, она есть в составе Source SDK. Программа очень проста в применении, вот как она выглядит:

Выбираем модель, указываем путь, куда положить декомпилированные файлы и нажимаем кнопку Extract. Для чего нужна декомпиляция? Также, как с картами - рассмотреть устройство модели, переделать, перенести в 3D Max. Иногда бывает нужно изменить размер модели - например, Вы делаете 3D-скайбокс - Вам нужны уменьшенные в 16 (или в 25, в 24) раз модели. В стандартных моделях можно найти и обычные модели, и модели для 3d-скайбокса, но как быть, если уменьшенных моделей нет? Решить эту проблему просто - декомпилируем модель, изменяем размер и компилируем снова. Только новую модель нужно будет вшить в конечный файл карты.

Декомпилировать, как Вы видите, просто. А для компиляции нужно кое-что знать. В папке, где лежит SMD-файл, нужно создать 2 дополнительных файла - bat-файл (для запуска компиляции) и qc-файл (для настройки). Оба файлы - текстовые. Открываем bat-файл и пишем:

"C:\Ultimate SSDK v3\SourceSDK\bin\orangebox\bin\studiomdl.exe" -fullcollide C:\bridge\bridge.qc
@pause

C:\Ultimate SSDK v3\SourceSDK\bin\orangebox\bin\studiomdl.exe - это путь к компилятору моделей, C:\bridge\bridge.qc - путь к Вашему qc-файлу. Теперь открываем qc-файл и заполняем его так:

$cd "C:\bridge" (Здесь путь к qc-файлу)
$modelname "zet\bridge\bridge.mdl" (Где будет находиться Ваша модель в папке cstrike/models)
$scale 1.0 (Масштаб модели. Вот тут можно изменять размер модели, сделать её меньше для 3d-скайбокса. Если размер модели в Хаммере получился слишком большой/маленький - просто поправьте тут число и откомпилируйте заново)
$body "body" "bridge.smd" (Здесь вводим имя SMD-файла)
$cdmaterials "models/zet/" (Путь к текстуре для модели. В эту папку нужно положить текстуры, которые Вы накладывали на модель в 3D Max'е)
$surfaceprop "metal" (Тип материала, из которого сделана модель)
$sequence idle "idle" fps 30 aCT_iDLE 1 (Тут ничего не трогаем)
$keyvalues < prop_data < "base" "Plastic.Medium" >> (Здесь указываются свойства физической модели, например, из чего она сделана, будет ли взрываться и т.д. Если Вам нужна статическая модель, вместо этой строчки введите просто $staticprop)
$collisionmodel "bridge.smd" (Тут указывается модель коллизии, для простых моделей типа ящика можно указывать тот же SMD-файл, а для моделей посложнее надо создавать дополнительную модель коллизии, об этом ниже)
$mass 200.0
$inertia 1.00
$damping 0.00
$rotdamping 0.00
>
(Это физические параметры - инерция, масса и т.д.)

Если модель состоит из нескольких объектов, при указании в параметре $collisionmodel обычного SMD в игре может проявиться неправильная коллизия - например, сквозь решётку или дыры в заборе не будут пролетать пули, модель может оказаться приподнятой над землей и т.д. Тогда для такой модели делается модель коллизии. Открываем модель в 3D Max'е, выделяем всю нашу модель, идём на панель модификаторов, выбираем Edit Poly и выделяем все полигоны, которые будут физическими ограничителями, т.е. иметь модель столкновений - коллизию. Это должны быть все внешние полигоны. Вот у меня такая "модель", окошко в браше:

Выделяем все внешние полигоны, затем назначаем им группу сглаживания 1 (Smooth Group):

Всё, теперь сохраняем эту физическую модель с другим именем и указываем его в параметре $collisionmodel.

И да, чуть не забыл. Если Вы помните статью про созданию текстур - текстуры для моделей делаются точно также с одним изменением в VMT-файле:

Вместо LightmappedGeneric напишите VertexLitGeneric. Тогда текстура на модели будет отображаться нормально, но при этом она не наложится на браш.

Готово, можно начать компиляцию - просто запустите Ваш bat-файл. Если всё сделали правильно, то Ваша новая модель появится среди остальных в Хаммере. Не забудьте вшить файлы модели и текстуры для неё в конечный файл карты. До новых встреч!

Минитуториал по использованию BSPSource или проще,декомпилятора.
Для чего нужен декомпилятор?Открыть исходник карты,для редактирования,либо поиска секретов для некоторых режимов либо посмотреть устройства карты или сбайтить(позаимствовать) какие то его элементы

Для начала нужна установленая Java желательно последняя версия,ищется в гугле,является условно бесплатной.
Дальше нужна сама программа Bspsrc Releases · ata4/bspsrc скачиваем с гитхаба ласт сборку.
Дальше нам нужен CSGO SDK при условии купленной csgo или купленного прайма находится в библиотеке steam в разделе инструменты(сверху в библиотеке есть фильтр)
CSGO SDK потребуется для просмотра карты после декомпиляции.

1)Распаковываем bspsrc в удобную нам папку программу можно запускать как с батника(файла формата .bat) так и напрямую java файл(.jar)
2)После запуска программы появляется данное окно
3)Далее нажимаем кнопку add и ищем карту которую мы хотим декомпилировать чтобы взглянуть на нее поближе :) и нажимаем кнопку open.
4)Далее нажимаем кнопку decompile и сохраняем исходник в формате .vmf в удобное нам место.
4.1)Очень важно если карта имеет текстуры и модели которые не содержатся в оригинальных файлах csgo,нам нужно вытащить вместе с исходником данные текстуры,делается это перед нажатием кнопку decompile,нажимаем вкладку other и ставим галочку на , после этого так же выбираем путь сохранения как и в пункте 4, и после сохранения, открываем путь по которому сохраняли,открываем папку с названием карту которую мы декомпилировали и копируем ее содержимое,далее вставляем скопированное содержимое в папку csgo находящаяся по пути "Ваш локальный диск>steam>steamapps>common>Counter-strike global offensive>csgo.
5)Открытие исходника с помощью CSGO SDK, запускаем скачанный CSGO SDK и запускаем в нем , первый пункт Hammer World Editor.
6) далее нажимаем в левом верхнем углу вкладку open и ищем то место куда мы сохранили исходник после decompile (файл в формате .vmf)
7)Поздравляю вы впервые декомпилировали карту и открыли ее исходник что дальше делать и как использовать вы можете найти на тематических форумах,или на youtube полно туториалов как на английском языке так и на русском(вбивайте в поиск Hammer World Editor),все начиная от редактирования заканчивая компиляцией и вшитием текстур(если были использованы нестандартные текстуры "пользовательские)

Проект Clana -pupS[*_*]

Сейчас мы немного расскажем о декомпиляции карт и расскажем какими же именно способами можно декомпилировать карту.
На самом деле рассуждать о том с какой целью люди декомпилируют карты можно очень много. Некоторые хотят создавать новые версии уже существующих карт, другим интересно посмотреть структуру карты чтобы больше узнать о свойствах карты перед тем как создать свою, другие могу брать некоторые объекты с карт (машины, дома, поезда и т.д) и добавлять их на свою карту. Можно понять когда человек декомпилирует чужую карту для того чтобы чему-то научится, взять пример и пополнить свои знания. Но тех людей, которые берут чужую карту для того чтобы на ее основе создать свою, можно по простому назвать варварами. А почему нет? Ведь человек крадет чужую идею, и переделывает там все под себя. Но не будем их судить, потому что в большинстве случаев из этого ничего хорошего не выходит. Почему?
Почему не стоит переделывать существующие карты?
Конечно компиляторы очень хорошо справляются со своей работой, но в любом случае это очень сильно отражается на качестве карты. Смело можно сказать о том что чем обширнее и структурнее карта, тем больше ошибок будет после ее декомпиляции. Всевозможное количество так называемых дырок. Мелкие дырки это одна из самых серьезных проблем при создании карты, именно поэтому при создании карты нужно быть очень внимательным и аккуратным. Но дырки это только одна из многочисленных проблем которые могут появится после декомпиляции, и многие юные мапперы после попытки ремейка какой нибудь карты задаются вопросом "Почему не компилируется карта?". Так вот мы настоятельно рекомендуем не брать чужие карты для создания новых версий, уж очень гиблое это дело.
Почему не декомпилируется карта?
Дело в том что опытные игроки нашли выход от таких бывалых мапперов которые хотят украсть чужую идею. Они защищают свои карты от декомпиляции. Так что если карта не поддается декомпиляции то лучше бросить все это так как в любом случае ничего не выйдет. Найдите другую карту и все будет хорошо ;)
О компиляторах.
Для того чтобы декомпилировать какую-либо карту существуют 2 программы. В принципе они похожи по своим свойствам и отличаются не многим, разве что внешним видом. Но как и первая так и вторая программа не декомпилируют вам идеальной карты, и как мы уже говорили при декомпиляции вы столкнетесь с огромным количеством всевозможных ошибок. Собственно программы:

Проект Clana -pupS[*_*]

WinBSPC - программа для декомпиляции карт

WinBSPC - эта улита, которая преобразует карты формата .bsp на движке GoldSource в формат .map, а карты в этом формате уже можно редактировать в программе Valve Hammer Editor.
Конечно прога не передаст вам полностью идеальную декомпилированную карту, но она легко передает структуру карты и вы сможете рассмотреть как построены те или иные объекты на карте, переделать их или доработать, как и саму карту. Чем сложнее карта, и чем больше объектов на ней, тем больше вероятность, что в декомпилированной карте будут всевозможные ошибки (не правильно наложенные браши и т.д.). Так что если вы решили просто внести маленькую деталь на карту, будьте готовы к тому, что, возможно, она не скомпилируется и выдаст ошибки.
Вы можете скачать WinBSPC по ссылке в конце статьи.
Как работать с программой WinBSPC
Открываем программу.
Далее нажимаем в меню "File" => "Open" и выбираем карту, которую мы хотим декомпилировать.
В появившемся окне выбираем "MAP". Рядом выбираем best match texturing и ниже, там, где написано "Out folder" (Конечная папка), выбираем место, куда нужно сохранить конечную декомпилированную карту. После всего жмём "ОК".

Декомпиляция плагинов (из .amxx в .sma) на основе amxxdump

4. Узнаем используемые модули:

Значит другие модули, кроме amxmodx, не используются.

5. Узнаем список всех глобальных переменных:

0x00000000 new AMXX_VERSION_STR[11]
0x00000134 new amx_flood_time
0x000000B0 new g_Flood[33]
0x0000002C new Float:g_Flooding[33]

6. Получаем весь дизассемблированный код плагина:

7. Рассмотрим только функцию plugin_init.
Используем:

Запишем как:

Так как используется функция register_plugin, то мы знаем ее синтаксис:
Код: Выделить всё
register_plugin(const plugin_name[], const version[], const author[])

Запишем как:

Так как используется функция register_dictionary, то мы знаем ее синтаксис:

Запишем как:

Так как используется функция register_clcmd, то мы знаем ее синтаксис:

Запишем как:

Запишем как

Так как используется функция register_cvar, то мы знаем ее синтаксис:

register_cvar(const name[],const string[],flags = 0,Float:fvalue = 0.0)

Смысл не изменится, так как два последних параметра имеют стандартные значения.

Запишем как:

8. Рассмотрим только функцию chkFlood.
Используем:

Код: Выделить всё
; new Float:maxChat
0x1B8 STACK 0xFFFFFFFC ; allocate 1 cells
0x1C0 PUSH 0x134 ; amx_flood_time // Аргумент
0x1C8 PUSH.C 0x4 // Один аргумент
0x1D0 SYSREQ.C 0x5 ; Float:get_pcvar_float(amx_flood_time) // Вызываем функцию get_pcvar_float
0x1D8 STACK 0x8 ; free 2 cells // Освобождаем из стека 2 ячейки
0x1E0 STOR.S.pri 0xFFFFFFFC ; Float:maxChat // Присвоение переменной maxChat
0x1E8 BREAK ; antiflood.sma:54

Так как используется функция get_pcvar_float, то мы знаем ее синтаксис:

Запишем как:

Запишем как:

; new Float:nexTime
0x210 STACK 0xFFFFFFFC ; allocate 1 cells
0x218 PUSH.C 0x0 // Нет параметров
0x220 SYSREQ.C 0x6 ; Float:get_gametime() // Вызов функции get_gametime
0x228 STACK 0x4 ; free 1 cells // Освобождаем из стека одну ячейку
0x230 STOR.S.pri 0xFFFFFFF8 ; Float:nexTime // Присвоение переменной nexTime
0x238 BREAK ; antiflood.sma:58

Так как используется функция get_gametime, то мы знаем ее синтаксис:

Запишем как:

Запишем как:

0x290 CONST.alt 0xB0 ; g_Flood[33]=0x0 (0.00000) // Помещаем в ALT значение g_Flood[id]
0x298 LOAD.S.pri 0xC ; id
0x2A0 BOUNDS 0x20
0x2A8 LIDX
0x2AC MOVE.alt
0x2B0 CONST.pri 0x3 ; 0x2E00 (11776.00000) // Помещаем в PRI значение 3

Запишем как:

Так как используется функция client_print, то мы знаем ее синтаксис:

Запишем как:

print_notify = 1
print_console = 2
print_chat = 3
print_center = 4

Так как используется функция floatadd, то мы знаем ее синтаксис:

Запишем как:

0x38C CONST.pri 0x1 ; 0x2E000000 (771751936.00000) // Означает return 1, что аналогично return PLUGIN_HANDLED
0x394 STACK 0x8 ; free 2 cells
0x39C RETN
0x3A0 BREAK

Запишем как:

// Метка jump_2
; target:jump_2
// Данный кусок кода обозначает, что это массив g_Flood размерностью 33 и индексом id
0x3A4 CONST.alt 0xB0 ; g_Flood[33]=0x0 (0.00000)
0x3AC LOAD.S.pri 0xC ; id
0x3B4 BOUNDS 0x20

0x3BC IDXADDR
0x3C0 PUSH.pri
0x3C4 LOAD.I
0x3C8 SWAP.pri

Запишем как:

// Метка jump_1
; target:jump_1
// Данный кусок кода обозначает, что это массив g_Flood размерностью 33 и индексом id
0x3E0 CONST.alt 0xB0 ; g_Flood[33]=0x0 (0.00000)
0x3E8 LOAD.S.pri 0xC ; id
0x3F0 BOUNDS 0x20
0x3F8 LIDX
// Если g_Flood[id] равен 0 будет true, значит перейдем на метку jump_4
0x3FC JZER 0x438 ; jump_4
0x404 BREAK ; antiflood.sma:70

Запишем как (учитывая JUMP переход выше, следует, что у нас else if, так как в коде есть еще JZER условие):

// Данный кусок кода обозначает, что это массив g_Flood размерностью 33 и индексом id
0x408 CONST.alt 0xB0 ; g_Flood[33]=0x0 (0.00000)
0x410 LOAD.S.pri 0xC ; id
0x418 BOUNDS 0x20

Запишем как:

Метка 3 в нашем случае не содержит кода.

Код: Выделить всё
// Метка jump_4
; target:jump_4
// Данный кусок кода обозначает, что это массив g_Flooding размерностью 33 и индексом id
0x43C CONST.alt 0x2C ; Float:g_Flooding[33]=0x0 (0.00000)
0x444 LOAD.S.pri 0xC ; id
0x44C BOUNDS 0x20

0x454 IDXADDR
0x458 PUSH.pri
0x45C LOAD.S.pri 0xFFFFFFFC ; Float:maxChat // Помещаем maxChat в PRI
0x464 LOAD.S.alt 0xFFFFFFF8 ; Float:nexTime // Помещаем nexTime в ALT
0x46C PUSH.pri
0x470 PUSH.alt
0x474 PUSH.C 0x8 // Два параметра
0x47C SYSREQ.C 0x8 ; floatadd
0x484 STACK 0xC ; free 3 cells
0x48C POP.alt
0x490 STOR.I // Присвоение g_Floodind[id]
0x494 STACK 0x4 ; free 1 cells
0x49C BREAK ; antiflood.sma:76

Запишем как:

// Метка jump_0
; target:jump_0
0x4A0 ZERO.pri // Означает, что мы возвращаем 0, то есть return 0, а это аналогично return PLUGIN_CONTINUE
0x4A4 STACK 0x4 ; free 1 cells
0x4AC RETN

Запишем как:

9. На основании полученных результатов формируем исходник (antiflood.sma).

new amx_flood_time
new g_Flood[33]
new Float:g_Flooding[33]

new Float:maxChat = get_pcvar_float(amx_flood_time)

new Float:nexTime = get_gametime()

if (g_Flooding[id] > nexTime)

if (g_Flood[id] >= 3)

g_Flooding[id] = floatadd(maxChat, nexTime)

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

Программа «Lysis Decompile» для CS 1.6

Декомпилятор AMXX файлов.Один из самых актуальных вопросов « Как из AMXX получить SMA файл? » возможно данная программа поможет вам, но имейте ввиду, программа полноценно не сможет получить исходный код вашего плагина, вам придется дописывать плагин для того что-бы он работал корректно ! У вас нет доступа к скачиванию файлов с нашего сервера Привет, наша адмнистрация публикует только пушечный контент , поставь лайк под постом ниже и напишите самый топовый комментарий, мы готовим материал только для тебя, любимый Гость .






Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации. Купить любую сборку или модель можна у нас в магазине!



Внимание! [Платно]

Если вам нужна помощь установки сборок и настройке.

Скидка на заказ плагина
по промокоду AMXX до 30.12.2021


Время рандомных скидок.
Специально для тебя - Гость

Заказать

Скидка на покупку всех
сборок до 30.12.2021

Время рандомных скидок.
Специально для тебя - Гость

  • +4 Всего статей 2134
  • +3 Комментариев 4279
  • +169 Пользователей : 23250
  • Новичок Игорь Рогожкин
  • Сейчас на сайте 10
  • Гостей 8
  • Пользователей 2 [ Молодой228Игорь Рогожкин ]


[ZP] Extra Item - Holy Sword Divine Order для CS 1.6


[CSO] [ZP] Extra Item - Thunder Ghost Wallker

Help when i shoot it it crash the game

Готовый сервер «ONLY DUST2_2X2» для CS 1.6

Нету флагов там._,

[ZP] Vip Menu [+SMA]

Как вызвать VIPMENU

[ZP] Extra Item - Stun Rifle [MKOD]

Услуга Помощь в установке/настройке серверов/модов/плагинов/сайтов. 2021-09-11 BUFFCS - Магазин покупки привилегий (бесплатно) 2020-12-31

Магазин покупки онлайн привилегий на сервера КС 1.6 c достаточно насыщенным функционалом,здесь есть практически всё что-бы из "коробки" подключить ваш сервер и продавать привилегии. Система работает

Друзья, выкатываю небольшое обновление сайта с номером [1.6]. В этом обновлении была проведена небольшая оптимизация шаблона. Так-же я написал новую систему "Черный список или доска позора". Все

ReHLDS (Reverse-engineered) - это новый шаг вперед, который дает второе дыхание нашим серверам. ReHLDS работает в 2 раза быстрей, чем HLDS.

AMXModX - это Metamod дополнение, которое позволяет создавать новые модификации для Half-Life на языке Pawn

Reunion является продолжением Dproto для ReHLDS. Это metamod плагин, который позволяет заходить 47/48 Non-Steam на сервер.

Revoice - это Metamod plugin, который дает возможность общения голосовым чатом между non-steam и steam клиентами.

Новый Metamod-r содержит огромное количество оптимизаций производительности и намного более чистый код. Ядро было написано с использованием JIT-компилятора.

Ultimate Unprecacher являет плагином для MetaMod, работает он по принципу отключение не нужных ресурсов на вашем сервере, тем самым вы сможете освободить места для ресурсов под ваши плагины, с помощью данного модуля можно избавиться от ошибки 512!

ReAuthCheck - это Metamod плагин, который занимается проверкой ваших игроков на валидность, с помощью данного модуля для REHLDS вы сможете защитить свой сервер от ботов, которые постоянно спамят рекламу или просто забивают слот на сервере!

NetBufExtender или NBEX - это метамод-плагин, который расширяет "интернет-буфер": буферы сервера и клиента(гарантия не 100%). Расширяет до 64 кб. Это значит, что у игроков уменьшается вероятность быть кикнутыми с ошибкой "Reliable channel overflowed".

UINO — metamod-плагин, который позволяет удалять ненужные поля из userinfo(setinfo) когда движок передаёт его другим игрокам на сервере. Данная мера уменьшает объём передаваемых данных и немного сокращает шанс быть кикнутым с "Reliable channel overflowed".

Читайте также: