Garik66 Опубликовано 14 июля, 2016 Автор Поделиться Опубликовано 14 июля, 2016 Только что, ZoraVl сказал: Могу записать видео как сделать топор в начале игры, если хочешь) Да не зачем. Я в неё играть всё-равно не буду. А видео по крафту и прохождение - думаю полный ТЮБ, т.е. куча. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 14 июля, 2016 Поделиться Опубликовано 14 июля, 2016 (изменено) 5 минут назад, Garik66 сказал: Да не зачем. Я в неё играть всё-равно не буду. А видео по крафту и прохождение - думаю полный ТЮБ, т.е. куча. Ну короче что-бы сделать первый инструмент тоесть топор, нужно подойти к дереву постучать по нему, подойти к камню постучать по нему и постучать по траве... лучше включить скрипт для ломания с одного удара... дальше нажимаешь ТАВ и там белым цветом будет Stone Axe это каменный топор, нажимаешь на него и нажимаешь Craft (собрать)... Вуаля Изменено 14 июля, 2016 пользователем ZoraVl Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 14 июля, 2016 Автор Поделиться Опубликовано 14 июля, 2016 ZoraVI, извиняй - сегодня точно уже не получиться покопаться в игре. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 7 часов назад, Garik66 сказал: ZoraVI, извиняй - сегодня точно уже не получиться покопаться в игре. Да ладно мне не к спеху) Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 8 часов назад, Garik66 сказал: ZoraVI, извиняй - сегодня точно уже не получиться покопаться в игре. Короче спасибо большое!!! Я разобрался как сделать фильтр!!! Урааа!=)))) P.S мой ник читается как ЗораВЛ - ударение на О, а вл это Влад =) Спасибо за твои уроки! 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
LIRW Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 3 часа назад, ZoraVl сказал: P.S мой ник читается как ЗораВЛ Я думал просто ЖОРА прям похоже. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 2 часа назад, LIRW сказал: Я думал просто ЖОРА прям похоже. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 5 часов назад, ZoraVl сказал: мой ник читается как ЗораВЛ А я подумал, что Зорро 6. 5 часов назад, ZoraVl сказал: Короче спасибо большое!!! Я разобрался как сделать фильтр!!! Урааа!=)))) Молодца!!! Удачного дальнейшего взлома!!! 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 А я вообще почему-то подумал, что "ЖураВЛь" Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 (изменено) 3 часа назад, Garik66 сказал: А я подумал, что Зорро 6. Молодца!!! Удачного дальнейшего взлома!!! Можешь рассказать что означают функции в твоем скриптке GodMod? Я в коде отмечу какие. Скрытый текст { Game : 7DaysToDie.exe Version: лицензия Steam Alpha 14.7 (64bit) Date : 2016-07-10 Author : Garik66 This script does blah blah blah } [ENABLE] aobscan(Pointer,48 8B 46 18 F3 0F 10 45 CC) // should be unique aobscan(GodMod,F3 0F 11 6E 24 48 8B CE) alloc(newmem,$1000,2A0C488C) label(code) label(return) label(Health) label(Wilness) label(Stamina) label(code1) label(return1) label(newmem1) registersymbol(Health) registersymbol(Stamina) registersymbol(Pointer) registersymbol(Wilness) registersymbol(GodMod) newmem: mov ecx,[rsi+10] mov [Health],ecx mov ecx,[rsi+18] mov [Stamina],ecx mov ecx,[rsi+38] mov [Wilness],ecx code: mov rax,[rsi+18] movss xmm0,[rbp-34] jmp return Health: dq (double)0 Stamina: dq (double)0 Wilness: dq (double)0 newmem1: mov rcx,[Health] cmp rcx,rsi je @f // Что делает эта фукция? mov rcx,[Stamina] cmp rcx,rsi je @f // Что делает эта фукция? mov rcx,[Wilness] cmp rcx,rsi je @f // Что делает эта фукция? jmp return1 @@: fld [rsi+20] // Что делает эта фукция? fstp [rsi+24] // Что делает эта фукция? jmp return1 code1: movss [rsi+24],xmm5 jmp return1 Pointer: jmp newmem db 90 90 90 90 return: GodMod: jmp newmem1 return1: [DISABLE] Pointer: db 48 8B 46 18 F3 0F 10 45 CC GodMod: db F3 0F 11 6E 24 unregistersymbol(Health) unregistersymbol(Stamina) unregistersymbol(Pointer) unregistersymbol(GodMod) unregistersymbol(Wilness) dealloc(newmem) Код я переделал немного, добавил Wilness, это отвечает за максимальное здоровье и стамину... Еще мне интересно почему ты записал db 90 90 90 90 где Pointer, ну тоесть зачем это? и чем отличается db от dq и почему ты написал dq (bouble) а не dq (float) Изменено 15 июля, 2016 пользователем ZoraVl 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 24 минуты назад, ZoraVl сказал: je @f // Что делает эта фукция? je - если в предыдущем сравнение значения в регистре и адресе равны то прыгаем на ..... @f - короткий прыжок (условный переход) вперёд (от английского forward - вперёд) на ближайшую безымянную метку @@, может быть ещё @b - короткий прыжок назад (от английского back - назад). В чём преимущество использования безымянных меток @@: их ненужно объявлять, и их может быть сколько угодно в скрипте. 30 минуты назад, ZoraVl сказал: fld [rsi+20] // Что делает эта фукция? fstp [rsi+24] // Что делает эта фукция? fld - загружает в верхний регистр FPU значение из адреса (в нашем случае [rsi+20]) сдвигая значения в регистрах. fst - выгружает из регистра в память без сдвига. fstp - выгружает из регистра в память со сдвигом назад (т.е. в нашем случае мы восстановили значения регистров на игровые на всякий случай). Т.е. код: fld [rsi+20] fstp [rsi+24] нам позволил передать значение из памяти в память, т.к. напрямую этого делать нельзя. Подробнее по работе с вещественными числами - погугли и почитай, больше поймёшь. 37 минуты назад, ZoraVl сказал: Еще мне интересно почему ты записал db 90 90 90 90 где Pointer, ну тоесть зачем это? 90 - это тот же опкод nop, в нашем случае служит для выравнивания, т.е. 5 байт (jmp newmem) + 4 байта (4 nop или 90 90 90 90) = 9 байт (48 8B 46 18 F3 0F 10 45 CC - смотри ниже это байты оригинальной инструкции игры, с которой мы делаем прыжок (переход) на нашу инъекцию.) 40 минуты назад, ZoraVl сказал: и чем отличается db от dq и почему ты написал dq (bouble) а не dq (float) db - от английского define byte (определить байт) dw - word (слово - два байта) dd - double word (двойное слово - 4 байта) - если значение вещественное то пишем float в скобках. dq - quadr worrd (учетверённое слово - 8 байт) ставим double, т.е. получаем удвоенное двойное слово. Об этом всём тоже лучше погуглить и почитать поподробнее. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 ЗЫ: 1 час назад, ZoraVl сказал: Можешь рассказать что означают функции в твоем скриптке GodMod? Я в коде отмечу какие. Молодец!!! Я тебе об этом как раз и говорил во втором видео, что нужно апгрейдить скрипт, так как максимальное (скорее всего это не максимальное значение, я имею ввиду, которое по смещению +20, а предыдущее значение) значение здоровья падает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 ЗЫ1: ZoraVl, а с голодом и жаждой разобрался? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 2 часа назад, Garik66 сказал: ЗЫ1: ZoraVl, а с голодом и жаждой разобрался? Нет, я значение найти не как не могу.... Пробовал и отнимать и прибавлять, и в структуре капался... Без толку... Вот скрипты котоорые я сделал: •качество оружия бесконечное •бесконечные патроны •очки улучшения скиллов •всегда день •быстрый крафт Ну и остальные твои, год мод и дамаг... 2 часа назад, Garik66 сказал: je - если в предыдущем сравнение значения в регистре и адресе равны то прыгаем на ..... @f - короткий прыжок (условный переход) вперёд (от английского forward - вперёд) на ближайшую безымянную метку @@, может быть ещё @b - короткий прыжок назад (от английского back - назад). В чём преимущество использования безымянных меток @@: их ненужно объявлять, и их может быть сколько угодно в скрипте. fld - загружает в верхний регистр FPU значение из адреса (в нашем случае [rsi+20]) сдвигая значения в регистрах. fst - выгружает из регистра в память без сдвига. fstp - выгружает из регистра в память со сдвигом назад (т.е. в нашем случае мы восстановили значения регистров на игровые на всякий случай). Т.е. код: fld [rsi+20] fstp [rsi+24] нам позволил передать значение из памяти в память, т.к. напрямую этого делать нельзя. Подробнее по работе с вещественными числами - погугли и почитай, больше поймёшь. 90 - это тот же опкод nop, в нашем случае служит для выравнивания, т.е. 5 байт (jmp newmem) + 4 байта (4 nop или 90 90 90 90) = 9 байт (48 8B 46 18 F3 0F 10 45 CC - смотри ниже это байты оригинальной инструкции игры, с которой мы делаем прыжок (переход) на нашу инъекцию.) db - от английского define byte (определить байт) dw - word (слово - два байта) dd - double word (двойное слово - 4 байта) - если значение вещественное то пишем float в скобках. dq - quadr worrd (учетверённое слово - 8 байт) ставим double, т.е. получаем удвоенное двойное слово. Об этом всём тоже лучше погуглить и почитать поподробнее. Спасибо большое за объяснения! Теперь намного понятнее что да как!:) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 (изменено) 2 часа назад, ZoraVl сказал: Нет, я значение найти не как не могу.... Пробовал и отнимать и прибавлять, и в структуре капался... Без толку... Да разрабы хитрые ребята. А в 4 байтах поискать не пробовал? (Ну не во float т .е.) Скрипт "Hunger and thirst (Голод и жажда)": Скрытый текст { Game : 7DaysToDie.exe Version: Date : 2016-07-15 Author : Garik66 This script does blah blah blah } [ENABLE] aobscan(WATER,89 47 10 48 63 4F 14) // should be unique alloc(newmem,$1000,2E86DC17) label(code) label(return) registersymbol(WATER) newmem: mov eax,[rdi+14] // проверь может лучше поставить [rdi+18] code: mov [rdi+10],eax movsxd rcx,dword ptr [rdi+14] jmp return WATER: jmp newmem DB 90 90 return: [DISABLE] WATER: db 89 47 10 48 63 4F 14 unregistersymbol(WATER) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: 2E86DC17 2E86DBFC: 00 00 - add [rax],al 2E86DBFE: 00 00 - add [rax],al 2E86DC00: 55 - push rbp 2E86DC01: 48 8B EC - mov rbp,rsp 2E86DC04: 57 - push rdi 2E86DC05: 48 83 EC 18 - sub rsp,18 2E86DC09: 48 8B F9 - mov rdi,rcx 2E86DC0C: 48 89 55 E8 - mov [rbp-18],rdx 2E86DC10: 48 63 47 10 - movsxd rax,dword ptr [rdi+10] 2E86DC14: 03 45 E8 - add eax,[rbp-18] // ---------- INJECTING HERE ---------- 2E86DC17: 89 47 10 - mov [rdi+10],eax 2E86DC1A: 48 63 4F 14 - movsxd rcx,dword ptr [rdi+14] // ---------- DONE INJECTING ---------- 2E86DC1E: 3B C1 - cmp eax,ecx 2E86DC20: 0F 8E 75 00 00 00 - jng 2E86DC9B 2E86DC26: B8 01 00 00 00 - mov eax,00000001 2E86DC2B: 83 F8 01 - cmp eax,01 2E86DC2E: B8 01 00 00 00 - mov eax,00000001 2E86DC33: 85 C0 - test eax,eax 2E86DC35: F3 0F 10 47 1C - movss xmm0,[rdi+1C] 2E86DC3A: F3 0F 5A C0 - cvtss2sd xmm0,xmm0 2E86DC3E: 48 63 47 10 - movsxd rax,dword ptr [rdi+10] 2E86DC42: 48 63 4F 14 - movsxd rcx,dword ptr [rdi+14] } MAX значение не равно 100, а равно 72. В структуре этой инструкции: [rdi+10] - текущее значение голода (жажды). [rdi+14] - я выбрал это значение за MAX, но нужно тестить скрипт в игре, может лучше следующее смещение взять. [rdi+18] - вот это. Потесть. Видео записывать не буду, вроде ничего сложного. Изменено 15 июля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 ЗЫ: ZoraVl, игрушку я сношу (надоел мне этот английский, ни хрена не понимаю ни что делать, никак делать, а без понимания весь интерес к игре теряется), но, если сделают поддержку на русском разрабы, либо фанаты опять начнут переводить, то может и поиграю (вроде интересно должно быть повыживать, но конечно же без читов). Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 1 час назад, Garik66 сказал: ЗЫ: ZoraVl, игрушку я сношу (надоел мне этот английский, ни хрена не понимаю ни что делать, никак делать, а без понимания весь интерес к игре теряется), но, если сделают поддержку на русском разрабы, либо фанаты опять начнут переводить, то может и поиграю (вроде интересно должно быть повыживать, но конечно же без читов). На лицензии которая в стиме продается, там есть русификатор от фанатов, в руководствах... Можешь глянуть вот тут Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 1 час назад, Garik66 сказал: Да разрабы хитрые ребята. А в 4 байтах поискать не пробовал? (Ну не во float т .е.) Скрипт "Hunger and thirst (Голод и жажда)": Показать содержимое { Game : 7DaysToDie.exe Version: Date : 2016-07-15 Author : Garik66 This script does blah blah blah } [ENABLE] aobscan(WATER,89 47 10 48 63 4F 14) // should be unique alloc(newmem,$1000,2E86DC17) label(code) label(return) registersymbol(WATER) newmem: mov eax,[rdi+14] // проверь может лучше поставить [rdi+18] code: mov [rdi+10],eax movsxd rcx,dword ptr [rdi+14] jmp return WATER: jmp newmem DB 90 90 return: [DISABLE] WATER: db 89 47 10 48 63 4F 14 unregistersymbol(WATER) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: 2E86DC17 2E86DBFC: 00 00 - add [rax],al 2E86DBFE: 00 00 - add [rax],al 2E86DC00: 55 - push rbp 2E86DC01: 48 8B EC - mov rbp,rsp 2E86DC04: 57 - push rdi 2E86DC05: 48 83 EC 18 - sub rsp,18 2E86DC09: 48 8B F9 - mov rdi,rcx 2E86DC0C: 48 89 55 E8 - mov [rbp-18],rdx 2E86DC10: 48 63 47 10 - movsxd rax,dword ptr [rdi+10] 2E86DC14: 03 45 E8 - add eax,[rbp-18] // ---------- INJECTING HERE ---------- 2E86DC17: 89 47 10 - mov [rdi+10],eax 2E86DC1A: 48 63 4F 14 - movsxd rcx,dword ptr [rdi+14] // ---------- DONE INJECTING ---------- 2E86DC1E: 3B C1 - cmp eax,ecx 2E86DC20: 0F 8E 75 00 00 00 - jng 2E86DC9B 2E86DC26: B8 01 00 00 00 - mov eax,00000001 2E86DC2B: 83 F8 01 - cmp eax,01 2E86DC2E: B8 01 00 00 00 - mov eax,00000001 2E86DC33: 85 C0 - test eax,eax 2E86DC35: F3 0F 10 47 1C - movss xmm0,[rdi+1C] 2E86DC3A: F3 0F 5A C0 - cvtss2sd xmm0,xmm0 2E86DC3E: 48 63 47 10 - movsxd rax,dword ptr [rdi+10] 2E86DC42: 48 63 4F 14 - movsxd rcx,dword ptr [rdi+14] } MAX значение не равно 100, а равно 72. В структуре этой инструкции: [rdi+10] - текущее значение голода (жажды). [rdi+14] - я выбрал это значение за MAX, но нужно тестить скрипт в игре, может лучше следующее смещение взять. [rdi+18] - вот это. Потесть. Видео записывать не буду, вроде ничего сложного. Хорошо спасибо, я полазию посмотрю может что найду Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 15 июля, 2016 Автор Поделиться Опубликовано 15 июля, 2016 (изменено) 1 час назад, ZoraVl сказал: Хорошо спасибо, я полазию посмотрю может что найду ZoraVl, ты видимо не понял, сам скрипт потестируй в игре. Изменено 15 июля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 К сожалению, трейнер делать нет желания. Просто приведу исследование. Все игры сделанные на Unity интересно ломать на высоком уровне. Взлом здоровья и стамины на высоком уровне Скрытый текст using UnityEngine; public class Cheat7DaysToDie : MonoBehaviour { EntityPlayerLocal entityPlayerLocal; void Update() { if(entityPlayerLocal == null){ entityPlayerLocal = GameObject.FindObjectOfType(typeof(EntityPlayerLocal)) as EntityPlayerLocal; return; } if(entityPlayerLocal == null){ return; } entityPlayerLocal.Health = entityPlayerLocal.GetMaxHealth(); entityPlayerLocal.Stamina = entityPlayerLocal.GetMaxStamina(); } } Скрытый текст Код dll инъекции в mono через AA Скрытый текст [ENABLE] //mono_assembly_foreach //mono_assembly_getimage alloc(bla, 2048) alloc(testdllpath, 256); alloc(domain,4) alloc(image,4) alloc(classdef,4) alloc(classobject, 4) alloc(methodDesc,4) alloc(method,4) registersymbol(domain) registersymbol(image) registersymbol(classdef) registersymbol(classobject) registersymbol(methodDesc) registersymbol(method) alloc(result,4) registersymbol(result) alloc(result2,4) registersymbol(result2) alloc(strTestLib,64) alloc(strClass1,64) alloc(strSomething,64) alloc(params, 32) alloc(exception,4) registersymbol(exception) strTestLib: db 'NamespaceCheats',0 strClass1: db 'Cheats',0 strSomething: db '*:Main',0 testdllpath: db 'D:\Cheat_32.dll',0 bla: //foreach domain is useful too call mono.mono_get_root_domain mov [domain],eax push eax call mono.mono_thread_attach add esp,4 push testdllpath push [domain] call mono.mono_domain_assembly_open add esp,8 push eax call mono.mono_assembly_get_image add esp,4 mov [image],eax push strClass1 push strTestLib push eax call mono.mono_class_from_name add esp, c mov [classdef],eax //create a class push eax //classdef push [domain] call mono.mono_object_new add esp, 8 mov [classobject],eax push eax call mono.mono_runtime_object_init //execute the nameless constructor (if there is one) add esp,4 //find the method push 0 push strSomething call mono.mono_method_desc_new add esp,8 mov [methodDesc], eax push [classdef] push eax call mono.mono_method_desc_search_in_class add esp,8 mov [method], eax mov [params],0 push exception push params //no params push [classobject] push eax //[method] call mono.mono_runtime_invoke add esp,10 mov [result],eax ret result: dd 0 result2: dd 0 createthread(bla) [DISABLE] //code from here till the end of the code will be used to disable the cheat Как я делал 1. Ставим игру 32 разрядную, т.к. у нас код АА для 32 разрядной инъекции. Может и рабочий на 64, не тестил 2. Отключаем античит, ищем в Интернете 3. Декомпилим через ILSpy файл игры Assembly-CSharp.dll ищем классы по определению 4. Ищем мой скрипт по просмотрю иерархии объектов на форуме. 5. Компилим dll, инжектим, смотрим объекты и компоненты прямо в игре. Находим EntityPlayerLocal, смотрим его. 6. Открываем доки по Unity если надо и пишем скрипт в Update в новой dll-ке. Её инжектим. Ну и все. Играем с полным xp и здоровьем. 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
ZoraVl Опубликовано 16 июля, 2016 Поделиться Опубликовано 16 июля, 2016 Garik66 Я понял, сейчас проверю MasterGH Ну для тебя это все просто) А мне до такого уровня еще далеко Garik66 Короче скрипт проверил, активировал, еда стала 100% вода осталась так-же, но в консоли много ошибок и она не закрывается, даже если скрипт отключить, все-равно много ошибок А если поставить rdi+18 то скрипт работает!) Спасибо за помощь!!! А как ты нашел значение то? Как ты понял что оно максимально 72? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2016 Автор Поделиться Опубликовано 16 июля, 2016 56 минут назад, ZoraVl сказал: А как ты нашел значение то? Как ты понял что оно максимально 72? Поиск: 1. Точное значение (float) -ничего 1.1. Точное значение (4 байта) - ничего 2. Неизвестно значение (на всякий случай поставил тип - 4 байта, если что в конце отсева готов был перевести значения во float), уменьшилось на 1/ не изменилось несколько раз, а потом скушал консервы - увеличилось на не помню сколько. - и вот нашлось в 4 байтах значение - УРРРЯЯЯ . Ну вообще-то это стандартный поиск. Если бы и во 2 случае не сработало, пришлось бы делать очень долгий поиск: 3. Неизвестное значение, 4 байта, изменилось/не изменилось. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2016 Автор Поделиться Опубликовано 16 июля, 2016 10 час назад, MasterGH сказал: Код dll инъекции в mono через AA MasterGH, класс!!!!! Да наверное на таком уровне ломать, гораздо проще - все структуры на экране - суппперрр!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 16 июля, 2016 Поделиться Опубликовано 16 июля, 2016 В среде разработки работаем практически с исходниками игры. Можно сделать практически все. *На лишний "return" можно не обращать внимание, забыл удалить. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2016 Автор Поделиться Опубликовано 16 июля, 2016 В 12.07.2016в08:45, ZoraVl сказал: Garik66, сделал скрипт на быстрый крафт (сборку) предметов, можешь в шапке темы закрепить, может понадобится кому-нибудь: Добавил в шапку. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения