MasterGH

Cheat Engine. Общие вопросы по работе с программой

262 сообщения в этой теме

Здесь можно задавать общие вопросы по Cheat Engine в том числе и русской.

Если ваш вопрос заслуживает особого внимания, то вы можете создать отдельную тему.

Старайтесь задавать вопросы, которые больше относятся к специфике Cheat Engine, а не по играм которые ей можно обмануть. К этим вопросам можно отнести применение той или иной функции, общие настройки Cheat Engine, настройки отдельных функций, ошибки и т.д.

Вопрос должен быть привязан к специфике cheat engine, а уже в последнюю очередь к игре. В противном случае лучше задать вопрос в форуме по взлому игр.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь можно задавать вопросы по скриптам Cheat Engine, обсуждать скрипты как полностью готовые так и примеры скриптов.

Мной приветствуются, если вы решите обсудить или задать вопрос по индивидуальному скрипту, общий принцип которого в этой теме ещё не был рассмотрен.

Так же приветствуются рассмотрения особых шаблонов. В данный момент я занимаюсь тем, что пытаюсь разработать синтаксис особых шаблонов для генерации обычных шаблонов CE, подправив которые можно получить рабочий скрипт. Иными словами особый шаблон позволит наносить разметку, по которой будет генерировать обычный шаблон. Также разрабатываю в CE менеджер шаблонов. Более подробно напишу позже...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

После того как скачал любую версию СЕ и нажимаю "Открыть", выходит вот такая ошибка:

e75811df9c4e.jpg

Перепробовал не все, так как не знаю что делать. Так, что делать?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Данная проблема произошла по моей вине в русской CE версии ниже 1.0.0 (а может и более ранняя версия, т.е. та, которая ниже 1.0.0)

Решение такое:

1) Сохранить нужные файлы, например, таблицы.

2) Корректно удалить CE инсталлятором (вроде такой должен быть, если я не ошибаюсь)

3) Установить инсталлятором англискую CE

4) Скопировать в директорию программы, главный файл CE RUS ни ниже 1.0.0. ,если нужно пользоваться русской версией.

Проблема из-за того, что в реестре остаются не верные данные от CE RUS после её закрытия, после чего могут быть проблемы с английской версией, которая также напортачит в реестре. Затем ни одна версия не откроется.

Увы, моя вина... но сейчас такого быть не должно.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

О_о! Помогло! Спасибо большое :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще один вопрос, тупой. Просто интересно. Возможно ли каким либо образом СЕ открыть таблицы ArtMoney? В СЕ нажимаешь откурыть, в "Тип Файлов" выбираю "ArtMoney Tables". Выбираю какую нужно таблицу и выходит что СЕ не может загрузить версию таблиц ArtMoney.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я думаю, ты делал всё правильно, наверно, просто есть какие-то ошибки в коде CE. В CE предусмотрено открывать таблицы артмани, попробуй открыть английской версией CE, если не пробовал.

О багах русской версии.

1) В версии CE RUS 1.2.0 трейнер сделать почему-то нельзя.

2) Почему-то CE автоматически сохраняет таблицы с названиями без расширения .CT.

Например у меня в папке лежит "spider.CT" и просто "spider". Если вас беспокоит этот "мусор", то вы можете его удалить.

3) В русской версии до 1.2.0 замечено, что генерируемые ей трейнеры прибавили в весе чуть ли не 6 мб.

Мною было решено, дождаться выхода версии 5.6 и модернизировать уже только её. А версию CE 5.5 RUS 1.2.0 можно считать больше не обновляемой. Следующая версия будет CE 5.6 RUS.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Я думаю, ты делал всё правильно, наверно, просто есть какие-то ошибки в коде CE. В CE предусмотрено открывать таблицы артмани, попробуй открыть английской версией CE, если не пробовал.

[...]

.

Да, английской тоже пробовал. Может это из-за того что у меня ArtMoney версии 7.30? Сейчас уже более поздняя версия, намного, есть.

Мною было решено, дождаться выхода версии 5.6 и модернизировать уже только её. А версию CE 5.5 RUS 1.2.0 можно считать больше не обновляемой. Следующая версия будет CE 5.6 RUS

Ух ты...интересно на это посмотреть.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А в СЕ так и должно быть: Когда пытаюсь сохранить таблицу, он мне выводит окно - "Сделай трейнер...пожалуйста". Я его посылаю и все...потом заново. Короче, нельзя что ли иметь таблицу в СЕ как в ArtMoney?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Короче, нельзя что ли иметь таблицу в СЕ как в ArtMoney?
Можно. Сохраняешь как "имя файла.CT" и будет сохранён файл с табличными данными.
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То-то я удивился, что в версии 1.2.0 тренер получился такой здоровый))) метр то многовато (но терпимо), а шесть уже перебор..

И кстати в 1.2.0 у меня не получалось сделать тренер. Причина оказалась в иконке. Если пытаюст изменить иконку файла, тренер генерируется, но ругается при запуске что мол "приложение не является Win32". Если оставить иконку по умолчанию, всё работает. Ждём новых версий :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Откопал исходники сходники CE 5.6, сейчас качну и гляну рабочие ли они.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Задали мне такой вопрос, про то как работают активирующие скрипты. Разберём пример.

//=========================================

// ParaWorld

// Game Version : 1.0

// Script Version: 1.0

// CE Version : 5.5

// GodMode and Resources

// 16-Jan-2010

//=========================================

[ENABLE]

alloc(MyCode,1024)

//=========================================

// Declaration section

label(_GodMode)

label(_BackGM)

label(_ExitGM)

label(_MonID)

label(_BackMI)

label(_MonRes)

label(_BackMR)

label(_ExitMR)

label(pHero)

label(pUnit)

label(pRes)

label(iEnableGM)

label(iEnableMR)

label(iPlayerID)

registersymbol(MyCode)

registersymbol(pHero)

registersymbol(pUnit)

registersymbol(pRes)

registersymbol(iEnableGM)

registersymbol(iEnableMR)

registersymbol(iPlayerID)

//=========================================

// Hacking Points

PWServer.exe+1c408c:

jmp _GodMode

nop

_BackGM:

PWServer.exe+045540:

jmp _MonID

nop

nop

_BackMI:

PWServer.exe+237944:

jmp _MonRes

nop

_BackMR:

MyCode:

//=========================================

_GodMode:

cmp dword ptr [iEnableGM],0

je _ExitGM // Jump if feature is disabled

mov eax,[iPlayerID] // Get player ID

cmp eax,[esi+10] // Is it a playerґs Object?

jne _ExitGM // Jump if false

mov [pHero],esi // Save pointer for debugging

mov dword ptr [esp+08],0 // value2decrease = 0

mov eax,[esi+0000061c] // Get Max HP

mov [esi+00000618],eax // Update HP

_ExitGM:

fld dword ptr [esi+00000618] // Original code

jmp _BackGM // Back to main code

//=========================================

_MonID:

mov ecx,[esp+2c] // Original code

mov [pUnit],ecx // Save ptr for debugging

push ebx

mov ebx,[ecx+10] // Original code

mov [iPlayerID],ebx // Save Player ID for further use

pop ebx

cmp eax,[ecx+10] // Original code

jmp _BackMI // Back to main code

//=========================================

// EDI = ptr to Worker

_MonRes:

cmp dword ptr [iEnableMR],0

je _ExitMR // Jump if feature is disabled

or edi,edi // Valid pointer?

jz _ExitMR // Jump if false

mov eax,[iPlayerID] // Get player ID

cmp eax,[edi+10] // Is it a playerґs worker?

jne _ExitMR // Jump if false

mov [pRes],esi // Save ptr for debugging

mov eax,459c4000 // Get cheat value

cmp eax,[esi+000002dc] // Current value >= cheat value?

jle _ExitMR // Jump if true

mov [esi+000002dc],eax // Update value

_ExitMR:

fld dword ptr [esi+000002dc] // Original code

jmp _BackMR // Back to main code

//=========================================

// Variables

pHero:

dd 0

pUnit:

dd 0

pRes:

dd 0

iEnableGM:

dd 1

iEnableMR:

dd 1

iPlayerID:

dd 0

//=========================================

// Original Codes

[DISABLE]

PWServer.exe+1c408c:

fld dword ptr [esi+00000618]

PWServer.exe+045540:

mov ecx,[esp+2c]

cmp eax,[ecx+10]

PWServer.exe+237944:

fld dword ptr [esi+000002dc]

dealloc(MyCode)

unregistersymbol(MyCode)

unregistersymbol(pHero)

unregistersymbol(pUnit)

unregistersymbol(pRes)

unregistersymbol(iEnableGM)

unregistersymbol(iEnableMR)

unregistersymbol(iPlayerID)

Пишем вспомогательные скрипты, типа этого


[ENABLE]
iEnableGM:
db 01

[DISABLE]
iEnableGM:
db 00
//Скрипт2

На главный скрипт вешаем хот-кей ctrl+0.

На скрипт2 вешаем хот-кей ctrl+1.

Когда идём в игру, то нажимает на ctrl+0 один раз. Затем можем включать читы, например нажав ctrl+1.

Активирующим скриптом я называю первый скрипт. Остальные - вспомогательными.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот уже дождались выхода версии 5.6, теперь осталось только подождать мод от Мастера :rolleyes:

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2afc3caeef29056a65542193bdeb4fa2.png

неплохой прикол, я ток потом догадался что эта хрень только первого апреля появляется )))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ага, я в прошлом году на эту фишку накололся )))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Бывают ещё сообщения:

strhappybirthday='Let''s sing Happy Birthday for Dark Byte today!';

strXMess='Merry christmas and happy new year';

strNewyear='And what are your good intentions for this year? ;-)';

strfuture='Wow,I never imagined people would use Cheat Engine up to today';

Если в образовательных целях, то сообщение с первоапрельской шуткой вылазит здесь..

[cod]procedure TMainForm.FormShow(Sender: TObject);

resourcestring

strhappybirthday='Let''s sing Happy Birthday for Dark Byte today!';

strXMess='Merry christmas and happy new year';

strNewyear='And what are your good intentions for this year? ;-)';

strfuture='Wow,I never imagined people would use Cheat Engine up to today';

var reg: tregistry;

modifier: dword;

key: dword;

hotkey: string;

year,month,day: word;

temp:string;

i: integer;

outputfile: textfile;

go:boolean;

loadt: boolean;

firsttime: boolean;

x: array of integer;

begin

Set8087CW($133f);

loadt:=false;

edit2.Text:=format('%.1f',[1.0]);

reg:=Tregistry.Create;

try

Reg.RootKey := HKEY_CURRENT_USER;

if not Reg.OpenKey('SoftwareCheat Engine',false) then

begin

if Reg.OpenKey('SoftwareCheat Engine',true) then

begin

//write some default data into the register

reg.WriteBool('Undo',true);

reg.writeBool('Advanced',true);

reg.writeBool('SeperateThread',true);

reg.writebool('Use Hyperscan if posible',false);

reg.WriteInteger('ScanThreadpriority',formsettings.combothreadpriority.itemindex);

end;

end;

except

end;

if reg.ValueExists('First Time User') then

firsttime:=reg.ReadBool('First Time User')

else

firsttime:=true;

if firsttime then

begin

reg.WriteBool('First Time User',false);

if messagedlg('Do you want to try out the tutorial?',mtconfirmation,[mbyes,mbno],0)=mryes then

shellexecute(0,'open','Tutorial.exe','','',sw_show);

end;

// animatewindow(mainform.Handle,10000,AW_CENTER);

//mainform.repaint;

fronttext:='brings Cheat engine to front';

if dontrunshow then exit;

dontrunshow:=true;

decodedate(now,year,month,day);

if (month=7) and (day=1) then showmessage(strhappybirthday);

if (month=12) and ((day=25) or (day=26)) then Showmessage(strXmess);

if (month=1) and (day=1) then showmessage(strnewyear );

if (month=1) and (day=1) and (year>=2010) then showmessage(strFuture);

if (month=4) and (day=1) then aprilfools:=true;

if aprilfools=true then

Messagedlg('Your license to use Cheat Engine has expired. You can buy a license to use cheat engine for 1 month for $200, 6 months for only $1000 and for 1 year for only $1800.'+' If you don''t renew your license Cheat Engine will be severely limited in it''s abilities. (e.g: Next scan has been disabled)',mtwarning,[mbok],0);

LoadSettingsFromRegistry;

//Load the table if one was suplied

overridedebug:=false;

if paramcount>=1 then

begin

loadt:=true;

if uppercase(paramstr(1))='-O' then

begin

OverrideDebug:=true;

loadt:=false;

end;

if paramcount>1 then

begin

//extra param

temp:=paramstr(2);

if length(temp)>4 then

if temp[1]+temp[2]+temp[3]='/o=' then

begin

//output to:

temp:=copy(temp,4,length(temp)-3);

assignfile(outputfile, temp);

rewrite(outputfile);

for i:=0 to numberofrecords-1 do

writeln(outputfile,memrec.description+' '+IntToHex(memrec.Address,8));

closefile(outputfile);

showmessage(temp+' has been created');

end;

end;

end else

begin

end;

if loadt then

begin

LoadTable(paramstr(1),false);

updatescreen;

updatelist;

end;

if GetSystemType<3 then //not a supported os for hardware breakpoints

with formsettings do

begin

rdWriteExceptions.Checked:=true;

rbDebugRegisters.Enabled:=false;

label6.Enabled:=false;

label7.Enabled:=false;

rbDebugAsBreakpoint.Enabled:=false;

rbInt3AsBreakpoint.Checked:=true;

end;

if (GetSystemType<4) {or (is64bitos)} then //not nt or later

begin

with formsettings do

begin

cbKernelQueryMemoryRegion.enabled:=false;

cbKernelReadWriteProcessMemory.enabled:=false;

cbKernelOpenProcess.enabled:=false;

cbProcessWatcher.Enabled:=false;

cbKDebug.enabled:=false;

cbGlobalDebug.enabled:=false;

TauntOldOsUser.Visible:=true;

label25.Enabled:=false;

end;

end;

vartypechange(vartype);

adjustbringtofronttext;

if aprilfools then

caption:=cenorm+' EXPIRED!';

if autoattachtimer.enabled then autoattachcheck;

//SMenu:=GetSystemMenu(handle,false);

//don't put this in oncreate, just don't

if memscan=nil then

memscan:=tmemscan.create(progressbar1);

memscan.setScanDoneCallback(mainform.handle,wm_scandone);

FileAccessTest;

end;[/cod]

Оно мне уже надоело своим появление и я его кильну на... так же как и предложение потренироваться при первом запуске (при сбросе настроек в реестре)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+1, приколы это хорошо конечно, но порой бесят, да и предложение потренироваться тоже как то не серьёзно...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Приведу пример скрипта по добавлению опыта по нажатию горячей клавиши.


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(_Exp)
registersymbol(_Exp)

H5_Game.exe+75AA80:
jmp newmem
returnhere:

newmem:
cmp byte ptr [_Exp],1
jne originalcode
add [ecx+60],3E8
mov [_Exp],0
originalcode:
mov eax,[ecx+60]
ret
int 3
jmp returnhere

_Exp:
db 0

[DISABLE]
H5_Game.exe+75AA80:
mov eax,[ecx+60]
ret
int 3

после активации скрипта нужно добавить в таблицу значений адрес _Exp и навесить горячую клавишу чтобы присваивать значение 1. Как только скрипт добавит значение то переменная станет равна 0.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот ещё самописный скрипт на тему "Активирующие скрипты".

{
Герои Меча и Магии 5 - Повелители орды
Версия игры : 3.1
Версия скрипта : 1.1
Версия СЕ : 5.6
Автор: Akama
}

[ENABLE]
alloc(MyCode,2048)

label(_MovePoints)
label(_ExitMP)
label(_Troops)
label(_ExitT)
label(_Resource)
label(_ExitR)
label(_Expirience)
label(_BackExp)
label(_ExitExp)
label(_Mana)
label(_ExitM)
label(_Buildings)
label(_ExitB)
label(_DarkEnergy)
label(_ExitDE)
label(_Atributes)
label(_ExitAtr)
label(_MP)
label(_Tr)
label(_Bl)
label(_M)
label(_Res)
label(_DE)
label(_Atr)
label(_Exp)


registersymbol(MyCode)
registersymbol(_MP)
registersymbol(_Tr)
registersymbol(_Bl)
registersymbol(_M)
registersymbol(_Res)
registersymbol(_DE)
registersymbol(_Atr)
registersymbol(_Exp)
//=========================================
//??? ???????
MyCode:
_MovePoints:
cmp [_MP],1
jne _ExitMP
cmp ecx,ebx
jne _ExitMP
//push eax
//mov [ecx+130],1E240
//mov eax,[ecx+130]
mov eax,1E240
mov [ecx+12c],eax
//pop eax
jmp _ExitMP

_Troops:
cmp [_Tr],1
jne _ExitT
mov [eax+20],92E
jmp _ExitT

_Buildings:
cmp [_Bl],1
jne _ExitB
mov [esi+80],1
jmp _ExitB

_Expirience:
cmp byte ptr [_Exp],1
jne _BackExp
add [ecx+60],3E8
mov [_Exp],0
_BackExp:
mov eax,[ecx+60]
ret
int 3
jmp _ExitExp

_DarkEnergy:
cmp [_DE],1
jne _ExitDE
add [ecx+638],3E8
mov [_DE],0
jmp _ExitDE

_Atributes:
cmp [_Atr],1
jne _ExitAtr
add [ecx+30],1
add [ecx+34],1
add [ecx+38],1
add [ecx+3c],1
add [ecx+40],0A
add [ecx+44],0A
mov [_Atr],0
//mov eax,[ecx+30]
xor edx,edx
jmp _ExitAtr

_Mana:
cmp [_M],1
jne _ExitM
push ebx
mov ebx,[ecx+00000140]
mov [ecx+13c],ebx
pop ebx
mov eax,[ecx+0000013c]
jmp _ExitM

_Resource:
cmp [_Res],1
jne _ExitR
add [ecx],1F4
add [ecx+4],1F4
add [ecx+8],1F4
add [ecx+c],1F4
add [ecx+10],1F4
add [ecx+14],1F4
add [ecx+18],2B995A
mov [_Res],0
jmp _ExitR
//=========================================
//??????????
_MP:
db 0

_Tr:
db 0

_Bl:
db 0

_Res:
db 0

_DE:
db 0

_M:
db 0

_Atr:
db 0

_Exp:
db 0
//=========================================
//???????? ??????????
H5_Game.exe+74BCBD:
jmp _MovePoints
nop
_ExitMP:

H5_Game.exe+1EDE0D:
jmp _Troops
nop
nop
nop
nop
nop
_ExitT:

H5_Game.exe+8D4E0F:
jmp _Buildings
nop
nop
nop
nop
nop
_ExitB:

H5_Game.exe+6F7F40:
jmp _Mana
nop
_ExitM:

H5_Game.exe+FB90B:
jmp _DarkEnergy
_ExitDE:

H5_Game.exe+74C190:
jmp _Atributes
_ExitAtr:

H5_Game.exe+5D0470:
jmp _Resource
_ExitR:

H5_Game.exe+75AA80:
jmp newmem
_ExitExp:
//========================================
[DISABLE]
H5_Game.exe+74BCBD:
mov [ecx+0000012c],eax

H5_Game.exe+1EDE0D:
mov edx,[eax+20]
mov [esp+000000e4],ecx

H5_Game.exe+8D4E0F:
mov [esi+00000080],0

H5_Game.exe+FB90B:
mov [ecx+00000638],eax

H5_Game.exe+74C190:
mov eax,[ecx+30]
xor edx,edx

H5_Game.exe+5D0470:
mov esi,[ecx]
cmp esi,[edx+ecx]

H5_Game.exe+6F7F40:
mov eax,[ecx+0000013c]

H5_Game.exe+75AA80:
mov eax,[ecx+60]
ret
int 3

dealloc(MyCode)
unregistersymbol(_M)
unregistersymbol(_MP)
unregistersymbol(_Tr)
unregistersymbol(_Bl)
unregistersymbol(_Res)
unregistersymbol(_DE)
unregistersymbol(_Exp)
unregistersymbol(MyCode)

скрипт сам писал, и трейнер тоже по нему существует. (Верите или нет, но это единственный трейнер для русской игры 3.1)

P.S.Кстати, MasterCH, я всё таки разобрался в чём проблема с опытом, я там слегна нарушил порядок инструкций, по-этому игра крашилось, сейчас всё адекватно.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если нужны мои комментарии, то первый твой пример в новинку может быть полезным для многих, а второй можно воспринять как закрепление материала по "активирующим" скриптам :)

Немного поправлю:

newmem:

cmp byte ptr [_Exp],1

jne short originalcode // корткий прыжок не пишет лишних нопов в теле чит-кода

add [ecx+60],3E8

mov [_Exp],0

originalcode:

mov eax,[ecx+60]

ret // эта инструкция "конечная станция" ^_^ поэтому...

int 3// ...можно было не писать

jmp returnhere // ...можно было не писать

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну дык мы ж народ простой, чё пишут то в оригинал код и вписываем )))

jmp short можно использовать в таких огромных скриптах как мой? Там прыжок не такой уж и маленький...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Akama, попробуй сам проверить, я к сожалению не помню: вроде прыжок может быть на расстоянии (0xFFFF-1) / 2 вверх и вниз. Или (0xFF-1)/2. Или без "-1"

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чисто для справки из личного опыта по написанию огромных скриптов дам совет: прежде чем писать само тело скрипта ОБЯЗАТЕЛЬНО нужно для одной функции создать 3 лейбла - начало функции, ориг код и выход из функции.

Т.е. если вы будете создавать функцию бессмертия, убедитесь что в лейблах есть такие строки.

label(GodMode) // Это начало чита

label(BackGM) // это начало оригинального кода того же чита

label(ExitGM) // это выход из него. (аналог returnhere)

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

Вот собственно и всё )))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ещё один мини совет: если хотите чтобы в переменную вписывался нужный адрес (например здоровья), то:

1) если функция типа А, то просто копируйте значение указателя в переменную.

2) Если тип В или С, то перед этим нужно отфильтровать остальные значения, чтобы в обработку попал только нужный адрес.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас