1

Тема: SAMP: Взять данные с паспорта и вывести в чат

Доброго времени суток.

Показывают паспорт.
Текст из чат лога:

[00:08:36] -----------===[ PASSPORT ]===----------

[00:08:36]  Имя: Nick_Name

[00:08:36]  Возраст: 33   Телефон: 99999

[00:08:36]  Фракция: Армия ЛВ   Должность: Майор

[00:08:36]  Работа: Неизвестно   Разрешение на оружие: Есть

[00:08:36]  Преступлений: 227

[00:08:36]  Законопослушность: 100

[00:08:36] =============================

Надо сделать доклад:

/f в распоряжение части прибыл Майор Nick Name.

Кто может сделать скрипт что бы само брало информацию из чат лога?

Активация на "Alt+2".

За ранее спасибо.

2

Re: SAMP: Взять данные с паспорта и вывести в чат

ChatLog =
(
[00:08:36] -----------===[ PASSPORT ]===----------

[00:08:36]  Имя: Nick_Name

[00:08:36]  Возраст: 33   Телефон: 99999

[00:08:36]  Фракция: Армия ЛВ   Должность: Майор

[00:08:36]  Работа: Неизвестно   Разрешение на оружие: Есть

[00:08:36]  Преступлений: 227
[00:08:36]  Законопослушность: 100

[00:08:36] =============================
)
MsgBox, % "/f в распоряжение части прибыл " StrReplace(RegExReplace(ChatLog, "(*UCP).*Имя: (\w+)\b.+жность: ([А-я]+)\b.*", "$2 $1"), "_", " ") "."

На будущее: в заголовке вместо "AHK SAMP," пишите  "SAMP:" или  "[SAMP]", далее с заглавной буквы. Писать в этом разделе "AHK" не требуется. Точка на конце также не ставится. Исправлено.

3

Re: SAMP: Взять данные с паспорта и вывести в чат

Качаешь udf для samp. Кладешь в одной папке со скриптом.
Ссылка: https://yadi.sk/d/D2ADMIzctwhgZ


#include SAMP-UDF-Developer.ahk

~vkA4 & ~vk32:: ;alt+2
myname := getUsername() ; считываем свое имя
SendChat("/f в распоряжение части прибыл Майор " myname ".") ; отправляем в чат
return

4

Re: SAMP: Взять данные с паспорта и вывести в чат

Flasher,  Должность может быть и мл.сержант, прапорщик, лейтинанант и тп.

5 (изменено: belyankin12, 2017-02-09 12:47:48)

Re: SAMP: Взять данные с паспорта и вывести в чат


global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

!2::
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)_(.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Фракция: Армия ЛВ   Должность: (.*)"
            , zvanie) and (log.find:=log.num + 1 - A_Index)
                break
		if (name2 != "") and (zvanie2 != "") {
			sendinput, {F6}/f в распоряжение части прибыл %zvanie2% %name2% %name3%.{Enter}
		} else {
			msgbox, Error
		}
return
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

6

Re: SAMP: Взять данные с паспорта и вывести в чат

ataks63rus
Не обратил внимания на должность. Исправил.

7

Re: SAMP: Взять данные с паспорта и вывести в чат

Dworkin, Мне надо что бы читало не моё имя а из "chatlog.txt" и звание тоже.

8

Re: SAMP: Взять данные с паспорта и вывести в чат

Flasher, Не то, вот есть что то подобное кода.


numpad2::
SendChat("/get guns 1")
sleep 1200
File = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
FileRead, Chatlog, %File%
RegExMatch(Chatlog, "s).*\[(..):(..):(..)\]", pr)
RegExMatch(Chatlog, "s).*\[(..):(..):(..)\]\s\sУ\sвас\s(.*?)\/500\sматериалов\sс\sсобой", name)
if ((((name1*3600+name2*60+name3+2)>(pr1*3600+pr2*60+pr3)) and ((name1*3600+name2*60+name3)<(pr1*3600+pr2*60+pr3+2))) or (((name1-24)*3600+name2*60+name3+2)>(pr1*3600+pr2*60+pr3)))
{
kolvo:=498-name4
SendChat("/get guns " kolvo)
}
return

Надо что бы получилось проимерно так:


numpad2::
File = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
FileRead, Chatlog, %File%
RegExMatch(Chatlog, "s).*\[(..):(..):(..)\]  Имя: (.*)_(.*)", name)
RegExMatch(Chatlog, "s).*\[(..):(..):(..)\] Фракция: Армия ЛВ   Должность: (.*)",zv)

SendChat("/f в распоряжения части прибыл " zv " " name ")

return

9

Re: SAMP: Взять данные с паспорта и вывести в чат

ataks63rus
Т.е. не то? Я показываю как из текста создать строку. А что там в играх, я без понятия.

numpad2::
FileRead, Chatlog, %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
SendChat("/f в распоряжение части прибыл " StrReplace(RegExReplace(Chatlog, "(*UCP).*Имя: (\w+)\b.+жность: ([А-я]+)\b.*", "$2 $1"), "_", " ") ".")
Return

10

Re: SAMP: Взять данные с паспорта и вывести в чат

ataks63rus, посмотри уже мой вариант >_<, у меня все работает.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

11 (изменено: ataks63rus, 2017-02-10 11:03:06)

Re: SAMP: Взять данные с паспорта и вывести в чат

belyankin12, О да спасибо, отлично работает.

12

Re: SAMP: Взять данные с паспорта и вывести в чат

Всем привет. Нашел данную тему и хочу переделать код по адвоката. То есть вместо звания и имени, записывался уровень игрока в определенную переменную, и его id. Проблема в том, что после того как я начал редактировать и попутно тестировать, после уровня игрока ("Возраст") у меня записывалось "Телефон: xxxxxx". То есть я не знаю как "отделить" лвл и телефон. Не требую мне полностью готовый и рабочий код, лучше укажите ошибки, и способы их исправить.
Цель: Чтобы после того как человек показывал мне паспорт, я нажимал на определенную клавишу, и шла проверка его уровня, проигрывалось РП(/me, /do и тд.) и собственно говоря сама команда /free в которой и требуется его id. Уровень мне нужен для установки цены.

 #include SAMP.ahk

global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

!2::
SendMessage, 0x50,, 0x4190419,, A
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)_(.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Возраст: (.*)"
            , lvl) and (log.find:=log.num + 1 - A_Index)
                break
		if (name2 != "") and (lvl2 != "") {
			sendinput, {F6}%lvl2% %name2% %name3%.{Enter}
		} else {
			msgbox, Error
		}
return 

13 (изменено: belyankin12, 2017-08-23 12:48:18)

Re: SAMP: Взять данные с паспорта и вывести в чат

Тогда можно вообще избавиться от проверки уровня по паспорту. Зачем использовать команду чтения текстового файла, если в памяти хранятся id и lvl игрока? Функции getplayeridbyname() и getplayerscorebyid() в UDF тебе помогут, имя узнаешь из паспорта, я так понял он у тебя нормально имя узнает.

Чтобы указать ошибки на конкретный код, нужна строчка с телефоном и возрастом из чатлога.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

14 (изменено: ThisIsStart, 2017-08-23 13:53:19)

Re: SAMP: Взять данные с паспорта и вывести в чат

Ясно, значит можно считывать просто имя. Теперь у меня другие проблемы, при нажатии на Alt+2 тестовую фразу он пишет очень много раз, и сервер сразу меня кикает. И еще, как оставить _? То есть Никнейм может быть формата "Nick" или "Nick_Name", сейчас код выводит мне его в виду "Nick Name". Я сменил "(.*)_(.*)" из кода на "(.*)", но не все так просто как мне показалось.
Нужно сделать какую-то задержку, чтобы я не флудил, и ник сделать одним целым

Вот код:

#include SAMP.ahk

global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

!2::
SendMessage, 0x50,, 0x4190419,, A
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		loop 30	
		if (name2 != "") {
			sendinput, {F6}%lvl2% %name2% %name3%.{Enter}
		} else {
			msgbox, Error
		}
return

15

Re: SAMP: Взять данные с паспорта и вывести в чат

Скопируй новый код сюда, странно что он флудит, читая вышеприведенный код, он должен один раз тестовую фразу отправлять.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

16

Re: SAMP: Взять данные с паспорта и вывести в чат

А, ну вот она причина , неаккуратно отрезал второй поиск. Команда loop создает цикл, теперь челендж: найди причину флуда командой . А насчёт имени: скопируй строчку из чатлога, где имя в паспорте.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

17 (изменено: ThisIsStart, 2017-08-23 15:11:12)

Re: SAMP: Взять данные с паспорта и вывести в чат

Хорошо, флуд я убрал. При активации вместо обычного ника в формате "Nick_Name" он берет все целиком и получается

[16:08:28]  Имя: Nick_Name.

А вот строчка с именем из паспорта

[16:05:35]  Имя: Nick_Name

18

Re: SAMP: Взять данные с паспорта и вывести в чат

Код верный, имя содержится в переменной name2, переработай тестовое сообщение под себя, а не используй это, сделанное для другого пользователя. Хотя все равно странно, что отправляется в чат вся строчка, вместо имени...

sendinput {f6}%name2%{enter}

работает?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

19 (изменено: ThisIsStart, 2017-08-23 16:10:04)

Re: SAMP: Взять данные с паспорта и вывести в чат

Так, имя выводит целое, теперь я попробовал вывести ник, ID и уровень игрока. Запуск прошел без ошибок, но при попытке активации выходит окно ошибки с кодом направленную на строчку

lvlplayer := getPlayerScoreById(%idplayer%)

Вот целый код:

#include SAMP.ahk

global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

!2::
SendMessage, 0x50,, 0x4190419,, A
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		if (name2 != "") {
			idplayer := getPlayerIdByName(%name2%)
                        lvlplayer := getPlayerScoreById(%idplayer%)
                        SendChat("%name2% , %idplayer% , %lvlplayer%")
		} else {
			msgbox, Error
		}
return

И еще, я хотел добавить бинд приветствия и просьбы показать паспорт. Как правильно написать?

!1::
SendMessage, 0x50,, 0x4190419,, A
myid := getId()
SendChat("Здраствуйте, я адвокат. Покажите мне свой паспорт (( /showpass %myid% )) ")
return


Это не правильно, и выводит он вместо ID %myid%, я пытался поставить кавычки чтобы было "%myid%", но при запуске скрипта вылезает окно с ошибкой в этой строчке


Line Text: ")
Error: Missing close-quote

Что я делаю не так?

20 (изменено: belyankin12, 2017-08-23 16:50:44)

Re: SAMP: Взять данные с паспорта и вывести в чат

В функции переменные не обрамляются процентами: getplayeridbyname(name2). sendhchat("" . name2 . " " . idplayer . " " . lvlplayer . ").

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

21

Re: SAMP: Взять данные с паспорта и вывести в чат

Теперь проблема с определением ID, бинд говорит и выводит то что нужно(хоть и с небольшой задержкой), только теперь вместо ID пишет "-1". Поискав в SAMP.udf я изменил строки при ошибках, чтобы выдавало не только "-1", но и "-2", "-3", и "-4".
Вот код из SAMP.udf


getPlayerIdByName(wName) {
    wName := "" wName
    if(StrLen(wName) < 1 || StrLen(wName) > 24)
        return -1
    
    if(iRefreshScoreboard+iUpdateTick > A_TickCount)
    {
        For i, o in oScoreboardData
        {
            if(InStr(o.NAME,wName)==1)
                return i
        }
        return -2
    }
    
    if(!updateOScoreboardData())
        return -3
    
    For i, o in oScoreboardData
    {
        if(InStr(o.NAME,wName)==1)
            return i
    }
    return -4
}

Когда я представляюсь с этим кодом:


SendChat("Здраствуйте, я адвокат. Покажите мне свой паспорт (( /showpass " myid " )) " )

Вместо ID выводит "-1".
А когда я показываю себе паспорт и пытаюсь вывести свое имя и ID. Вывод имени правильный, но вместо ID показывает "-4".

 Numpad2::
SendMessage, 0x50,, 0x4190419,, A
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		if (name2 != "") {
			idplayer := getPlayerIdByName(name2)
                        lvlplayer := getPlayerScoreById(idplayer)
                        SendChat(name2 . idplayer . lvlplayer)
		} else {
			msgbox, Error
		}
return 

Я не знаю в чем ошибка, так как даже заменив значение "-x", я не понимаю. Возможно вы поймете?

22

Re: SAMP: Взять данные с паспорта и вывести в чат

У тебя ахк юникодовский, судя по sendmessage. Установи AHK ANSI 32 bit.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

23

Re: SAMP: Взять данные с паспорта и вывести в чат

Все, теперь код рабочий, переменные можно вставлять в любые команды. А можно как-то уменьшить задержку? А то между нажатием кнопки и выводом в чат проходит секунды 4, если не больше


#include SAMP.ahk

global path_log := A_MyDocuments "\GTA San Andreas User Files\SAMP\chatlog.txt"

Numpad1::
SendMessage, 0x50,, 0x4190419,, A
myid := getId()
SendChat("Здраствуйте, я адвокат. Покажите мне свой паспорт (( /showpass " myid " )) " )
return

Numpad2::
SendMessage, 0x50,, 0x4190419,, A
log := {str:"",find:0,num:0}    ,    log.str := []

        Loop, read, %path_log%
        log.str.Insert(A_LoopReadLine)    ,log.num := A_Index

		loop 30	
	    if RegExMatch(     log.str[log.num + 1 - A_Index]
            ,"\[(.*)\]  Имя: (.*)"
            , name) and (log.find:=log.num + 1 - A_Index)
                break
		if (name2 != "") {
			idplayer := getPlayerIdByName(name2)
                        lvlplayer := getPlayerScoreById(idplayer)
                        SendChat(name2 . idplayer . lvlplayer)
		} else {
			msgbox, Error
		}
return

24

Re: SAMP: Взять данные с паспорта и вывести в чат

Разве что избавиться от присвоения переменных функциям. Например: sendchat("" . getplayeridbyname(name2) . " " . getplayerscorebyid(getplayeridbyname(name2)) . " " . name2 . "").

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.