Чекпоинты

Статус
В этой теме нельзя размещать новые ответы.

serhiyrubin

Известный
Автор темы
396
106
Нигде ещё не видел FAQ по чекпоинтам в AHK
Вообще никто походу об этом не думал
Мб кто знает объяснит и даст пример чтобы создать чекпоинт и когда встаешь на него выполнялся какой то код
Код:
; ##### Checkpointsachen #####
setCheckpoint(fX, fY, fZ, fSize ) {
    if(!checkHandles())
        return false
    dwFunc := dwSAMP + 0x9D340
    dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR) ;misc info
    if(ErrorLevel || dwAddress==0) {
        ErrorLevel := ERROR_READ_MEMORY
        return false
    }
    VarSetCapacity(buf, 16, 0)
    NumPut(fX, buf, 0, "Float")
    NumPut(fY, buf, 4, "Float")
    NumPut(fZ, buf, 8, "Float")
    NumPut(fSize, buf, 12, "Float")
    writeRaw(hGTA, pParam1, &buf, 16)
    dwLen := 31
    VarSetCapacity(injectData, dwLen, 0)
    NumPut(0xB9, injectData, 0, "UChar")
    NumPut(dwAddress, injectData, 1, "UInt")
    NumPut(0x68, injectData, 5, "UChar")
    NumPut(pParam1+12, injectData, 6, "UInt")
    NumPut(0x68, injectData, 10, "UChar")
    NumPut(pParam1, injectData, 11, "UInt")
    NumPut(0xE8, injectData, 15, "UChar")
    offset := dwFunc - (pInjectFunc + 20)
    NumPut(offset, injectData, 16, "Int")
    NumPut(0x05C7, injectData, 20, "UShort")
    NumPut(dwAddress+0x24, injectData, 22, "UInt")
    NumPut(1, injectData, 26, "UInt")
    NumPut(0xC3, injectData, 30, "UChar")
    writeRaw(hGTA, pInjectFunc, &injectData, dwLen)
    if(ErrorLevel)
        return false
    hThread := createRemoteThread(hGTA, 0, 0, pInjectFunc, 0, 0, 0)
    if(ErrorLevel)
        return false
    waitForSingleObject(hThread, 0xFFFFFFFF)
    closeProcess(hThread)
    ErrorLevel := ERROR_OK
    return true
}

disableCheckpoint()
{
    if(!checkHandles())
        return false
    dwAddress := readDWORD(hGTA, dwSAMP + ADDR_SAMP_INCHAT_PTR) ;misc info
    if(ErrorLevel || dwAddress==0) {
        ErrorLevel := ERROR_READ_MEMORY
        return false
    }
    VarSetCapacity(enablecp, 4, 0)
    NumPut(0,enablecp,0,"Int")
    writeRaw(hGTA, dwAddress+0x24, &enablecp, 4)
    ErrorLevel := ERROR_OK
    return true
}

IsMarkerCreated(){
    If(!checkHandles())
        return false
    active := readMem(hGTA, CheckpointCheck, 1, "byte")
    If(!active)
        return 0
    else return 1
}
CoordsFromRedmarker(){
    if(!checkhandles())
        return false
    for i, v in rmaddrs
    f%i% := readFloat(hGTA, v)
    return [f1, f2, f3]
}

Вот тут используются чекпоинты через АХК, ток нифига не понятно
https://www.blast.hk/threads/15391/
 
Последнее редактирование модератором:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Все твои ограничения - навыки работы в AHK и знаниях о функциях GTA.
Чекпоинт создается как раз таки с помощью функций GTA (при том если найти исходник, то это не составит труда перенести на AHK при должном знании языка).
Проверку проще простого - берем текущую позицию игрока, к позициям маркера прибавляем необходимый радиус, считаем дистанцию перса к ранее прибавленным координатам, сравниваем как нам надо, profit.
 

serhiyrubin

Известный
Автор темы
396
106
setCheckpoint(xpos,ypos,zpos,Radius) Устанавливает маркер на карте
IsMarkerCreated() Включает красную метку на радаре к установленному маркеру
CoordsFromRedmarker() Считывает координаты метки с карты.
disableCheckpoint() Отключает маркер на карте.

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

Это код чтобы узнать свои координаты
Они появятся в чате
Вы их копируете и используете в своем коде.
Это я пишу для таких же нубов как я
Код:
numpad0::
getplayerpos(X, Y, Z)
SendInput {F6}%X%, %Y%, %Z%
return


Тут пример кода чтобы включить текпоинт, и когда вы на него встаете появляется другое.
Так же если немного подумать то можно сделать чтобы выполнялся какой нибудь код когда вы встаете на этот чекпоинт.
Код:
MyNumber = 0
SetTimer, ifa, 1

ifa:
if IsPlayerInRangeOfPoint(X , Y , Z , R)
    gosub, number
return

numpad1::
SetCheckpoint(2482.645508, -1932.327393, 14.014704, 1.0)
        X:=2482.645508
        Y:=-1932.327393
        Z:=14.014704
        R:=1.0
        return


number:
    if(MyNumber = 0)
    {
        SetCheckpoint(2476.902588, -1932.343628, 14.011292, 1.0)
        X:=2476.902588
        Y:=-1932.343628
        Z:=14.011292
        R:=1.0
        MyNumber++
    }
    else if(MyNumber = 1)
    {
        SetCheckpoint(2096.9255,-1033.7744,30.7087, 1.0)
        X:=2096.9255
        Y:=-1033.7744
        Z:=30.7087
        R:=1.0
        MyNumber++
    }
    else if(MyNumber = 2)
    {
    disableCheckpoint()
    MyNumber:=0
    }
return

Все это работает только c и инклудом samp udf
 
Последнее редактирование модератором:

SGr

Новичок
1
1
Раз уж тут в качестве примера мой быдло-код gps vo кинули, подниму тему месячной давности, дабы желающие заняться чекпоинтами время не тратили. Существует баг, вероятно, udf. При слишком большой длинне кода (на сколько я помню), исполнение по ветви TRUE условного оператора (где проверка через IsPlayerInRangeOfPoint) попросту перестаёт работать. На этом уже несколько человек убили по целому дню :)

Итог: если ваше творение после очередного «улучшения» перестало работать, выносите всю процедуру проверки в отдельный скрипт. Которому уже передавайте из основного скрипта координаты и другие параметры (при помощи временного файла) и через RunWait ждите его «отработки».
 
  • Нравится
Реакции: Kvisk
Статус
В этой теме нельзя размещать новые ответы.