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

Vlad Horii

Известный
Проверенный
310
171
Здравствуйте. Нужно сделать скрипт, который при вводе /offmembers брал из диалогового окна информацию по определенному человеку( например первая строка кликабельная) и зачитывал ее в чат
Ты разделом ошибся
 

Magov1733

Новичок
20
0
Здарова братки. Недавно наткнулся на проблему с AHK. SAMP, после небольшого времени использования AHK скрипта, сам закрывает процесс или выводит окно с логом краша. Раньше всё было нормально. Вылетает именно в момент использовании команды, которая была закреплена на действие. Пример: Ввожу команду /st 128
идёт рп отыгровка и краш. Поможет кто?

Ещё, вопрос не в тему может быть, но выбивает процесс игры когда ставлю метку на карте, есть решение?


Маленькая просьба: Как сделать что бы скрипт останавливался по нажатию кнопки?.
 
Последнее редактирование:

Forfeit

Участник
69
12
Здарова братки. Недавно наткнулся на проблему с AHK. SAMP, после небольшого времени использования AHK скрипта, сам закрывает процесс или выводит окно с логом краша. Раньше всё было нормально. Вылетает именно в момент использовании команды, которая была закреплена на действие. Пример: Ввожу команду /st 128
идёт рп отыгровка и краш. Поможет кто?

Ещё, вопрос не в тему может быть, но выбивает процесс игры когда ставлю метку на карте, есть решение?


Маленькая просьба: Как сделать что бы скрипт останавливался по нажатию кнопки?.
Может хотя бы скриншот крашей, или сам код покажешь? Как мы сможем помочь? :thinking:
 

hertoem

Новичок
6
0
Помогите найти скрипт, который проверяет кого нет в строю и чекает мемберс
 

Kev1H

Новичок
19
0

Вложения

  • upload_2019-2-17_20-0-27.png
    upload_2019-2-17_20-0-27.png
    6.1 KB · Просмотры: 205

index

Известный
126
82
Попробовал и той и другой версии по твоей ссылке. Выдает теперь такую ошибку
Добавь функу в UDF себе. Странно, вроде же там была.
AutoHotKey:
IsDialogButton1Selected() {
    dwPointer := GetDialogStructPtr()
    if (ErrorLevel || !dwPointer)
        return false

    dwPointer := readDWORD(hGTA, dwPointer + SAMP_DIALOG_PTR1_OFFSET)
    if (ErrorLevel) {
        ErrorLevel := ERROR_READ_MEMORY
        return false
    }

    selected := readMem(hGTA, dwPointer + SAMP_DIALOG_BUTTON_HOVERING_OFFSET, 1, "Byte")
    if (ErrorLevel) {
        ErrorLevel := ERROR_READ_MEMORY
        return false
    }

    ErrorLevel := ERROR_OK
    return selected
}
 

Adam_Rockwell

Активный
143
25
Когда сжимаю ahk, скомпилированный в .ехe, антивирусник его блокирует как вредоносный.

Подскажите пожалуйста, из-за чего это может быть.
mpress.exe, компилятор, да и весь пк в целом проверял на вирусы Касперским. Сказал всё чисто.

В несжатом состоянии:
2019-02-18_1-48-19.png
В сжатом: (сжимал при отключённом антивируснике, т.к иначе он его сразу удаляет)
2019-02-18_1-48-54.png
 

Magov1733

Новичок
20
0
Может хотя бы скриншот крашей, или сам код покажешь? Как мы сможем помочь? :thinking:
Сори, скриншотов нету, ибо частые вылеты без лога краша. Просто процесс игры сам закрывается.
Код от которого вылетает игра:
Код:
$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
chatinput := readString(hGTA, dwSAMP + 0x12D8F8, 256)
if RegExMatch(chatinput, "^/hist (\d{1,3})", var)
{
    name := getPlayerNameById(var1)
    SendChat("/history " name)
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/mh")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/medhelp " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/h")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/heal " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/mhb")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/pay " out_pars1 " 120")
    Sleep, 3500
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/medhelp " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/cs")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    SendChat("/do Кислородная маска висит над операционным столом на крючке.")
    Sleep 2000
    SendChat("/me надел кислородную маску на пациента")
    Sleep, 2000
    SendChat("/do На столе лежит поднос с хирургическими инструментами.")
    Sleep, 2000
    SendChat("/do На столе лежит спиртовой раствор.")
    Sleep, 2000
    SendChat("/me простерилизовал руки спиртовым раствором")
    Sleep, 2000
    SendChat("/me надел на руки перчатки")
    Sleep, 2000
    SendChat("/me взял в руки заполненный шприц с наркозом")
    Sleep, 2000
    SendChat("/me вколол шприц в вену пациента")
    Sleep, 2000
    SendChat("/me начал процесс операции по смене пола")
    Sleep, 2000
    SendChat("/do Прошло необходимое время для операции.")
    Sleep, 2000
    SendChat("/do Процесс операции закончен.")
    Sleep, 2000
    SendChat("/do " Nick " пришел в себя?")
    Sleep, 500
    SendChat("/changesex " out_pars1 " " out_pars2)
    return
}
Return
 

Forfeit

Участник
69
12
Когда сжимаю ahk, скомпилированный в .ехe, антивирусник его блокирует как вредоносный.

Подскажите пожалуйста, из-за чего это может быть.
mpress.exe, компилятор, да и весь пк в целом проверял на вирусы Касперским. Сказал всё чисто.

В несжатом состоянии:
Посмотреть вложение 25345
В сжатом: (сжимал при отключённом антивируснике, т.к иначе он его сразу удаляет)
Посмотреть вложение 25343
Если ты юзаешь AHK Protector - то да, из-за него начинают ругаться антивирусники. Компилируй обычным способом через Scite
 

Adam_Rockwell

Активный
143
25
Если ты юзаешь AHK Protector - то да, из-за него начинают ругаться антивирусники. Компилируй обычным способом через Scite
Как раз таки с протектором всё идеально и без вирусов. Но мне нужно чтобы код был открытым в данной ситуации.
 

never_dk

Новичок
9
0
Помогите с RegExMatch пожалуйста нужно из этой строки вывести все после Nick_Name
Diamond Role Play | Emerald - Nick_Name level:3 money:264485$
 

darksoor

Известный
674
353
Помогите с RegExMatch пожалуйста нужно из этой строки вывести все после Nick_Name
Diamond Role Play | Emerald - Nick_Name level:3 money:264485$

AutoHotKey:
RegExMatch(chatlog, "Diamond Role Play \| Emerald - (\w+) (level\:(\d+)) (money\:(\d+)\$)", var) ; var1 - Nick_Name, var2 - level:3, var3 - 3 (число в level), var4 - money:228228$, var5 - 228228 (число в money)
 

7jizzle

Участник
238
14
Привет. Я написал скрипт который ускоряет персонажа по конманде, но столкнулся с проблемой: скрипт работает в чате. Можете подсказать как сделать так чтобы не работал в чате?
Код:
#IfWinActive GTA:SA:MP
#Include SAMP.ahk
:?:/fastrunon::
showGameText("FastRun:ON", 500, 1)
run:
Send {Space down}
Sleep 1
Send {Space up}
Sleep 5
goto run
return

:?:/fastrunoff::
showGameText("FastRun:OFF", 500, 1)
Send {Space up}
sleep 100
Reload
 

Adam_Rockwell

Активный
143
25
Привет. Я написал скрипт который ускоряет персонажа по конманде, но столкнулся с проблемой: скрипт работает в чате. Можете подсказать как сделать так чтобы не работал в чате?
Код:
#IfWinActive GTA:SA:MP
#Include SAMP.ahk
:?:/fastrunon::
showGameText("FastRun:ON", 500, 1)
run:
Send {Space down}
Sleep 1
Send {Space up}
Sleep 5
goto run
return

:?:/fastrunoff::
showGameText("FastRun:OFF", 500, 1)
Send {Space up}
sleep 100
Reload
команда isInChat() проверяет, открыт ли чат. Юзай её в if

Сори, скриншотов нету, ибо частые вылеты без лога краша. Просто процесс игры сам закрывается.
Код от которого вылетает игра:
Код:
$~NumpadEnter::
$~Enter::
if (!isInChat()) || (isDialogOpen() && (getDialogStyle() == 1 || getDialogStyle() == 3))
   Return
Sleep 250
chatinput := readString(hGTA, dwSAMP + 0x12D8F8, 256)
if RegExMatch(chatinput, "^/hist (\d{1,3})", var)
{
    name := getPlayerNameById(var1)
    SendChat("/history " name)
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/mh")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/medhelp " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/h")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/heal " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/mhb")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    Sendchat("/me внимательно осмотрел пациента")
    Sleep, 1000
    Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
    Sleep, 1000
    SendChat("/pay " out_pars1 " 120")
    Sleep, 3500
    SendChat("/do Через плечо надета медицинская сумка.")
    Sleep, 1000
    SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
    Sleep, 500
    SendChat("/medhelp " out_pars1 " " out_pars2) ;out_pars1 - ID игрока, out_pars2 - причина
    Sleep, 1000
    random, x, 1, 2, 3
    if x = 1
{
    x := SendChat("Скорее поправляйтесь.")
}
    if x = 2
{
    x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
}
if x = 3
{
x := SendChat("Всего доброго, не болейте!")
}
if x = 4
{
    x := SendChat("Своевременно проходите медосмотр")
}
    Sleep, 2000
    SendChat("кхм..")
    return
}
tempText := readString(hGTA, dwSAMP + 0x12D8F8, 256)
tempCmd := StrSplit(tempText, " ")[1]
if (tempCmd == "/cs")
if (RegExMatch(chatinput, "^" tempCmd "\s+(\d{1,3})\s+(.{1,})$", out_pars))
{
    Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ") ;выведет из ID ник без знака "_". EX: Pavel Pavlovich
    SendChat("/do Кислородная маска висит над операционным столом на крючке.")
    Sleep 2000
    SendChat("/me надел кислородную маску на пациента")
    Sleep, 2000
    SendChat("/do На столе лежит поднос с хирургическими инструментами.")
    Sleep, 2000
    SendChat("/do На столе лежит спиртовой раствор.")
    Sleep, 2000
    SendChat("/me простерилизовал руки спиртовым раствором")
    Sleep, 2000
    SendChat("/me надел на руки перчатки")
    Sleep, 2000
    SendChat("/me взял в руки заполненный шприц с наркозом")
    Sleep, 2000
    SendChat("/me вколол шприц в вену пациента")
    Sleep, 2000
    SendChat("/me начал процесс операции по смене пола")
    Sleep, 2000
    SendChat("/do Прошло необходимое время для операции.")
    Sleep, 2000
    SendChat("/do Процесс операции закончен.")
    Sleep, 2000
    SendChat("/do " Nick " пришел в себя?")
    Sleep, 500
    SendChat("/changesex " out_pars1 " " out_pars2)
    return
}
Return
Специально для тебя переписал код нормально, если есть возможность, автору сего "творения" покажи, а то ну надо же из обезьян уже эволюционировать...

Код:
#SingleInstance Force
#Persistent
#NoEnv
#Include udf.ahk
#IfWinActive GTA:SA:MP

~Enter::
if IsInChat() and !IsDialogOpen()
{
    sleep 200
    chatInput := readString(hGTA, dwSAMP + 0x12D8F8, 256)
    if RegExMatch(chatInput, "i)^\/hist (\d{1,3})", var)
    {
        name := getPlayerNameById(var1)
        SendChat("/history " name)
    }
    else if RegExMatch(chatInput, "i)^\/mh\s+(\d{1,3})\s+(.{1,})$", out_pars)
    {
        Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ")
        Sendchat("/me внимательно осмотрел пациента")
        sleep 1000
        Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
        sleep 1000
        SendChat("/do Через плечо надета медицинская сумка.")
        sleep 1000
        SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
        sleep 500
        SendChat("/medhelp " out_pars1 " " out_pars2) ; out_pars1 - ID игрока, out_pars2 - причина
        sleep 1000
        random, x, 1, 4
        if (x = 1)
            x := SendChat("Скорее поправляйтесь.")
        else if (x = 2)
            x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
        else if (x = 3)
            x := SendChat("Всего доброго, не болейте!")
        else if (x = 4)
            x := SendChat("Своевременно проходите медосмотр")
    }
    else if RegExMatch(chatInput, "i)^\/h\s+(\d{1,3})\s+(.{1,})$", out_pars)
    {
        Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ")
        Sendchat("/me внимательно осмотрел пациента")
        sleep 1000
        Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
        sleep 1000
        SendChat("/do Через плечо надета медицинская сумка.")
        sleep 1000
        SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
        sleep 500
        SendChat("/heal " out_pars1 " " out_pars2) ; out_pars1 - ID игрока, out_pars2 - причина
        sleep 1000
        random, x, 1, 4
        if (x = 1)
            x := SendChat("Скорее поправляйтесь.")
        else if (x = 2)
            x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
        else if (x = 3)
            x := SendChat("Всего доброго, не болейте!")
        else if (x = 4)
            x := SendChat("Своевременно проходите медосмотр")
    }
    else if RegExMatch(chatInput, "i)^\/mhb\s+(\d{1,3})\s+(.{1,})$", out_pars)
    {
        Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ")
        Sendchat("/me внимательно осмотрел пациента")
        sleep 1000
        Sendchat("/todo Поставив пациенту диагноз*Я выпишу вам лекарство. Его цена: " out_pars2 "$")
        sleep 1000
        SendChat("/pay " out_pars1 " 120")
        sleep 3500
        SendChat("/do Через плечо надета медицинская сумка.")
        sleep 1000
        SendChat("/me открыв сумку, достал от туда лекарство и передал его " Nick)
        sleep 500
        SendChat("/medhelp " out_pars1 " " out_pars2) ; out_pars1 - ID игрока, out_pars2 - причина
        sleep 1000
        random, x, 1, 4
        if (x = 1)
            x := SendChat("Скорее поправляйтесь.")
        else if (x = 2)
            x := SendChat("При возникновении вопросов, обращайтесь на регистратуру.")
        else if (x = 3)
            x := SendChat("Всего доброго, не болейте!")
        else if (x = 4)
            x := SendChat("Своевременно проходите медосмотр")
    }
    else if RegExMatch(chatInput, "i)^\/cs\s+(\d{1,3})\s+(.{1,})$", out_pars)
    {
        Nick := RegExReplace(getPlayerNameById(out_pars1), "_", " ")
        SendChat("/do Кислородная маска висит над операционным столом на крючке.")
        Sleep 2000
        SendChat("/me надел кислородную маску на пациента")
        sleep 2000
        SendChat("/do На столе лежит поднос с хирургическими инструментами.")
        sleep 2000
        SendChat("/do На столе лежит спиртовой раствор.")
        sleep 2000
        SendChat("/me простерилизовал руки спиртовым раствором")
        sleep 2000
        SendChat("/me надел на руки перчатки")
        sleep 2000
        SendChat("/me взял в руки заполненный шприц с наркозом")
        sleep 2000
        SendChat("/me вколол шприц в вену пациента")
        sleep 2000
        SendChat("/me начал процесс операции по смене пола")
        sleep 2000
        SendChat("/do Прошло необходимое время для операции.")
        sleep 2000
        SendChat("/do Процесс операции закончен.")
        sleep 2000
        SendChat("/do " Nick " пришел в себя?")
        sleep 500
        SendChat("/changesex " out_pars1 " " out_pars2)
    }
}
return
 
Последнее редактирование:
  • Нравится
Реакции: 7jizzle

darksoor

Известный
674
353
Блин что за умственно отсталый тебе код скинул, это просто убожество.
Специально для тебя переписал всю эту бредятину, если есть возможность, автору кода покажи, а то ну надо же из обезьян уже эволюционировать
Врятли ему кто-то скидывал, а вот копировать не каждый сможет.
Твой код, что ты написал, не является идеальным)