Вопросы по AHK-скриптингу

Revalto

Известный
532
225
а тип как я его получу (ид водителя?) если я не навел на него, или по радиусу?? Если по радиусу то как записать
Как сделать вывод Марки машины и цвет я понял, а как сделать что бы именно выбрал ИД игрока которого я приследую?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
По моему мой код про текст в чат логе легче:)
Вообще не легче... да и выглядит ужасно с бесполезным goto, который можно было не использовать... Да и вообще использовать loop не эффективно!
В регулярке всегда можно разобраться, прочитав документации

И да, что тут не так?
Код:
#IfWinActive GTA:SA:MP
#include SAMP.AHK

LineResult()
{
if (!isDialogOpen() || getDialogStyle() = 0 || getDialogStyle() = 1 || getDialogStyle() = 3)
return false
while (isDialogOpen())
continue
if(GetKeyState("Esc", "P"))
return false
return getDialogLineNumber()
}


1::
ShowDialog(2, "Действия", "1. Попросить игрока предъявить документы`n2. И.т","Ок")
Result := LineResult()
if (!Result)
return
Gosub, Label%Result%
return
Label1:
{
sendChatMessage("Дороу паспорт.")
}
return
Воспользуйся таким управлением диалогом:
Код:
#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return
 

Carlos Reyes

Новичок
14
0
При вводе в чат слова "Текст" нажимается H
Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP


SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Текст
    {
        Goto, start5
    }
}
goto, start3
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
send, {vk48 down}
send, {vk48 up}
}
return

Что-то не работает :с
 

Carlos Reyes

Новичок
14
0
вместо \[\d+:\d+:\d+\]\s+\[A\] ([A-z]{4,24})\[\d{1,3}\]: /([a-z]+) (\d{1,3}) (.*)

AHK - ANSI32


Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к загрузке.
    {
        Goto, start5
    }
}
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Goto, start1

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start1:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к разгрузке.
    {
        Goto, start2
    }
}
start2:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
goto, start3
return

Помогите, где-то я запутался. Мне нужно вот такое: когда написало текст "Посигнальте, чтобы перейти к загрузке" - нажалась кнопка "H"(Это получилось), потом нужно, чтобы он стал на паузу, аж до текста "Посигнальте, чтобы перейти к разгрузке" и опять нажалась кнопка "H", потом опять пауза и в начало.

Upd. Тут подумал, после "Посигнальте, чтобы перейти к загрузке" кнопка "H" сарботает и поставить на паузу, а когда будет текст "[Успешно]Загрузка завершена" - скрипт снова заработает до "Посигнальте, чтобы перейти к разгрузке" и всё заново...
 
Последнее редактирование:

Black_Bird

Участник
59
4
Вообще не легче... да и выглядит ужасно с бесполезным goto, который можно было не использовать... Да и вообще использовать loop не эффективно!
В регулярке всегда можно разобраться, прочитав документации


Воспользуйся таким управлением диалогом:
Код:
#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return
Что-то сложно, куча ошибок выбивает

Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к загрузке.
    {
        Goto, start5
    }
}
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Goto, start1

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start1:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к разгрузке.
    {
        Goto, start2
    }
}
start2:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
goto, start3
return

Помогите, где-то я запутался. Мне нужно вот такое: когда написало текст "Посигнальте, чтобы перейти к загрузке" - нажалась кнопка "H"(Это получилось), потом нужно, чтобы он стал на паузу, аж до текста "Посигнальте, чтобы перейти к разгрузке" и опять нажалась кнопка "H", потом опять пауза и в начало.

Upd. Тут подумал, после "Посигнальте, чтобы перейти к загрузке" кнопка "H" сарботает и поставить на паузу, а когда будет текст "[Успешно]Загрузка завершена" - скрипт снова заработает до "Посигнальте, чтобы перейти к разгрузке" и всё заново...
Вот другой код, Спасибо Ревалто за код, чуть переделал что бы работал.
Код:
#IfWinActive GTA:SA:MP
global file_chat := A_MyDocuments "/GTA San Andreas User Files/SAMP/chatlog.txt"
SetTimer, Chat, 50

Chat:
FileRead, chatlog, % file_chat

if (RegExMatch(chatlog, "Посигнальте, чтобы перейти к загрузке.", chattext))
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Return
 
Последнее редактирование модератором:

Carlos Reyes

Новичок
14
0
Помогите, где-то я запутался. Мне нужно вот такое: когда написало текст "Посигнальте, чтобы перейти к загрузке" - нажалась кнопка "H"(Это получилось), потом нужно, чтобы он стал на паузу, аж до текста "Посигнальте, чтобы перейти к разгрузке" и опять нажалась кнопка "H", потом опять пауза и в начало.

Upd. Тут подумал, после "Посигнальте, чтобы перейти к загрузке" кнопка "H" сарботает и поставить на паузу, а когда будет текст "[Успешно]Загрузка завершена" - скрипт снова заработает до "Посигнальте, чтобы перейти к разгрузке" и всё заново...

Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к загрузке.
    {
        Goto, start5
    }
}
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Goto, start1

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start1:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к разгрузке.
    {
        Goto, start2
    }
}
start2:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
goto, start3
return
 

Black_Bird

Участник
59
4
Помогите, где-то я запутался. Мне нужно вот такое: когда написало текст "Посигнальте, чтобы перейти к загрузке" - нажалась кнопка "H"(Это получилось), потом нужно, чтобы он стал на паузу, аж до текста "Посигнальте, чтобы перейти к разгрузке" и опять нажалась кнопка "H", потом опять пауза и в начало.

Upd. Тут подумал, после "Посигнальте, чтобы перейти к загрузке" кнопка "H" сарботает и поставить на паузу, а когда будет текст "[Успешно]Загрузка завершена" - скрипт снова заработает до "Посигнальте, чтобы перейти к разгрузке" и всё заново...

Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к загрузке.
    {
        Goto, start5
    }
}
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Goto, start1

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start1:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к разгрузке.
    {
        Goto, start2
    }
}
start2:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
goto, start3
return
Щяс этот код работает?

Вообще не легче... да и выглядит ужасно с бесполезным goto, который можно было не использовать... Да и вообще использовать loop не эффективно!
В регулярке всегда можно разобраться, прочитав документации


Воспользуйся таким управлением диалогом:
Код:
#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return#include UDF_037.ahk ; UDF_037.ahk - это название  файла UDF

;=============================================
; Обнуление переменной при нажатии ESC и F6
;=============================================
~ESC::
~F6::
menu:=0
return

;=============================================
; Кнопки вызова диалогов
;=============================================
F3::
menu := 1
ShowDialog(2, "Диалог 1", "Первая`nВторая", "X")
return
F4::
menu := 2
ShowDialog(2, "Диалог с подменю", "Лекции`nПункт без доп. меню", "X")
return

~LButton::
Time := A_TickCount
while(isDialogOpen())
{
    if (A_TickCount - Time > 500)
    {
  Return
    }
}
checkdialogMenu:
if (isDialogButton1Selected() == 1)
{
    menu := 0
}
ifWinNotActive, GTA:SA:MP
{
    return
}

;=============================================
; Проверка на активное меню
;=============================================
if (menu == 1)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 2)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    if (line_num == 1)
    {
  showDialog(2, "Подменю", "Первый пукнкт`nВторой пункт", "X")
  menu := 3
    }
    else if (line_num == 2)
  addChatMessage("Выбрано: " line_text)
    return
}
else if (menu == 3)
{
    menu := 0
    line_num  := getDialogLineNumber()
    line_text  := getDialogLine(line_num)

    addChatMessage("В подменю выбрано: " line_text)
    return
}
return

~Enter::
gosub, checkdialogMenu
return
выдает ошибку в этой строке while(isDialogOpen())
 
Последнее редактирование модератором:

Revalto

Известный
532
225
выдает ошибку в этой строке while(isDialogOpen())
udf подключи и положи его в папку со скриптом

Помогите, где-то я запутался. Мне нужно вот такое: когда написало текст "Посигнальте, чтобы перейти к загрузке" - нажалась кнопка "H"(Это получилось), потом нужно, чтобы он стал на паузу, аж до текста "Посигнальте, чтобы перейти к разгрузке" и опять нажалась кнопка "H", потом опять пауза и в начало.

Upd. Тут подумал, после "Посигнальте, чтобы перейти к загрузке" кнопка "H" сарботает и поставить на паузу, а когда будет текст "[Успешно]Загрузка завершена" - скрипт снова заработает до "Посигнальте, чтобы перейти к разгрузке" и всё заново...

Код:
#SingleInstance force
#NoEnv
#IfWinActive GTA:SA:MP

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start3:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к загрузке.
    {
        Goto, start5
    }
}
start5:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Goto, start1

SelectedFile = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
start1:
Loop, Read, %SelectedFile%
{
    IfInString, A_LoopReadLine, Посигнальте, чтобы перейти к разгрузке.
    {
        Goto, start2
    }
}
start2:
filedelete, %SelectedFile%
fileappend, , %SelectedFile%
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
goto, start3
return
Вот другой код, Спасибо Ревалто за код, чуть переделал что бы работал.
Код:
#IfWinActive GTA:SA:MP
global file_chat := A_MyDocuments "/GTA San Andreas User Files/SAMP/chatlog.txt"
SetTimer, Chat, 50

Chat:
FileRead, chatlog, % file_chat

if (RegExMatch(chatlog, "Посигнальте, чтобы перейти к загрузке.", chattext))
{
sendinput, {vk48 down}
sendinput, {vk48 up}
}
Return


Что-то сложно, куча ошибок выбивает
udf закинь в папку со скриптом
 
Последнее редактирование модератором:

Toopie

Новичок
29
2
Ужасный пример для новичков...
Нормальный, эффективный чек чатлога:
Код:
global file_chat := A_MyDocuments "/GTA San Andreas User Files/SAMP/chatlog.txt"
SetTimer, Chat, 50

Chat:
FileRead, chatlog, % file_chat

if (RegExMatch(chatlog, "\[\d+:\d+:\d+\]\s+\[A\] ([A-z]{4,24})\[\d{1,3}\]: /([a-z]+) (\d{1,3}) (.*)", chattext))
{
    save(chatlog)
    SendChat("Текст найден!")
}
Return


Код:
ShowDialog(1, "Проверка", "Введите данные:", "Закрыть")
while (isDialogOpen()) {
}
if(readString(hGTA, dwSAMP + 0x12D8F8, 256) == "Revalto")
    ShowDialog(0, "Меню", "Nice", "Закрыть")


Зачем наводиться прицелом на него если можно просто получить его ID как водителя автомобиля ну и от него уже сам кар :D

P.S. выше не вижу смысла отвечать, ибо выглядит как заказы на моё мнение...
Способ с while(isDialogOpen()) придумал я, у тебя не полный код, там перед ShowDialog должна стоять очистка адреса 0x12D8F8+чек на закрытие чата и открытие диалога
 

Carlos Reyes

Новичок
14
0
udf закинь в папку со скриптом
Но я не могу раставить так, чтобы пауза включалась и в определенный момент выключалась, у меня оно первый раз нажимается "H" и она зажатая...Перечитайте, пожалуйуста, что я хочу сделать, не могу разобраться с паузами
 

Andy Safino

Участник
69
4
Здравствуйте, у меня тут такой вопросик:
Возможно ли сделать систему определение марки машины по id человека который в ней сидит.
Пример: Еду я с напарником за преступником, мне надо остановить его и тем самым кричу ему в мегафон.
Идёт отыгровка:
/m Водитель автомобиля марки - " marka ". Прижмитесь к обочине.
/m В случае отказа мы откроем огонь.
Что-то типа такого.
 

dmitri4

Известный
452
79
Но я не могу раставить так, чтобы пауза включалась и в определенный момент выключалась, у меня оно первый раз нажимается "H" и она зажатая...Перечитайте, пожалуйуста, что я хочу сделать, не могу разобраться с паузами
Добавь задержку (sleep кол-во) после опусканя клавиши а именно
Код:
 sendinput, {vk48 down}
 

Andreykas1421

Новичок
47
0
Пытался сделать автообновление скрипта, но получается ошибка, кто знает в чём проблема?
upload_2018-7-19_15-54-46.png
 
Последнее редактирование: