Сокращение, дороботка кода.

Smer4

Известный
Автор темы
424
51
Мне надо получить координаты всех на экране(и переведя это все в экранные координаты конечно-же) я написал вот такую огромную дерьмо конструкцию и это пздц, она получает координаты секунд 20-40. (Я если что esp пытаюсь сделать)
AutoHotKey:
; #     - getPlayerPosById(dwId)                    - Возвращает позицию игрока по id игрока                                    #
; #     - isPlayerInStreamById(player_id [, dist])  - Определяет есть ли игроки на заданной дистации от вас                     #
; #     - calcScreenCoors(fX,fY,fZ)                 - Возвращает массив координат [fX,fY,fZ] относительно экрана                #
/*

BoxCreate(x,y,width,height,Color,show)
{
    global BoxCreate_func
    res := DllCall(BoxCreate_func,Int,x,Int,y,Int,width,Int,height,UInt,Color,UChar,show)
    return res
}

BoxDestroy(id)
{
    global BoxDestroy_func
    res := DllCall(BoxDestroy_func,Int,id)
    return res
}

*/

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#Include inc\samp.ahk
#Include inc\DX9-Overlay-API-master\include\ahk\overlay.ahk
SetParam("use_window", "1")
SetParam("window", "GTA:SA:MP")

r:=[]
numpad5::
MsgBox, start
goto, GetCoords ; В массив r вводятся координаты игроков в зоне стрима, в переменной all содержится число игроков в зоне стрима
l:
screen := []
i = 0
d = 0
Loop{
    screen[i] := calcScreenCoors(r[i][1],r[i][2],r[i][3])
    i++
    if(i >= all)
        break
    if(GetKeyState("Numpad1","P")){
        break
    }
}
num = 1
i = 1
Loop
{
    num++
    if(num==3)
    {
        num = 1
        i++
    }
    if(screen[i][1] != null && screen[i][1] > 0)
    {
        if(screen[i][2] != null && screen[i][2] > 0)
        {
        q = 1
        loop{
            box%q% = BoxCreate(screen[i][1], screen[i][2],5,5,0xFFFFFFFF, true)
            addchatmessage("box created")
            q++
            if(q == all)
            {
                Sleep, 3000
                Loop{
                    BoxDestroy(boxQ)
                    addchatmessage("box destroy")
                    q--
                    if(q==0)
                    {
                        break
                    }
                }
                break
            }
        }
        return
        }
    }
    if(i == all)
        break
}
return


GetCoords:
{
r := []
i = 0
b = 0
    Loop{
        if(isPlayerInStreamById(i ,300)){
            r[b] := getPlayerPosById(i)
            b++
            }
        i++
        if(i >= 1001)
            break
    }
all := b
goto, l
}
Предлагайте как сократить код и время поиска координат на экране до минимума.
 

index

Известный
127
83
Убедись, что в твоём UDF в функции UpdateOScoreboardData() координаты игрока (массив MPOS) обязательно запишутся в глобальный объект oScoreboardData. Был там такой баг, что координаты (а так же HP и ARMOR) оставались в локальном объекте o этой функциии и в oScoreboardData не попадали.
Также учитывай, что если какой-то игрок находится за камерой (вне зоны ее обзора), то вызов CalcScreenCoords к координатам такого игрока возвратит координаты экрана, будто бы этот игрок находится в зоне обзора камеры, повернутой на 180 градусов. К примеру, игрок стоит сзади справа камеры, CalcScreenCoords к координатам такого игрока вернет координаты точки спереди слева.
AutoHotKey:
p := []
for id, oPlayer in GetStreamedInPlayersInfo()
    p.push( CalcScreenCoords(oPlayer.MPOS[1], oPlayer.MPOS[2], oPlayer.MPOS[3]) )
 
Последнее редактирование:

Smer4

Известный
Автор темы
424
51
Убедись, что в твоём UDF в функции UpdateOScoreboardData() координаты игрока (массив MPOS) обязательно запишутся в глобальный объект oScoreboardData. Был там такой баг, что координаты (а так же HP и ARMOR) оставались в локальном объекте o этой функциии и в oScoreboardData не попадали.
Также учитывай, что если какой-то игрок находится за камерой (вне зоны ее обзора), то вызов CalcScreenCoords к координатам такого игрока возвратит координаты экрана, будто бы этот игрок находится в зоне обзора камеры, повернутой на 180 градусов. К примеру, игрок стоит сзади справа камеры, CalcScreenCoords к координатам такого игрока вернет координаты точки спереди слева.
AutoHotKey:
p := []
for id, oPlayer in GetStreamedInPlayersInfo()
    p.push( CalcScreenCoords(oPlayer.MPOS[1], oPlayer.MPOS[2], oPlayer.MPOS[3]) )
Насчет проверки не находится ли человек сзади, то можно просто ставить проверку на то больше ли число чем 0. Вот так что-то получилось только рисуется где-то справа-снизу.
AutoHotKey:
#Include inc\samp.ahk
#Include inc\DX9-Overlay-API-master\include\ahk\overlay.ahk
SetParam("use_window", "1")
SetParam("window", "GTA:SA:MP")

updateOScoreboardData()
updateScoreboardDataEx()
Loop
{
r := []
boxes := []
i := 1
for id, oPlayer in getStreamedInPlayersInfo()
{
    r := calcScreenCoors(oPlayer.POS[1],oPlayer.POS[2],oPlayer.POS[3])
    if(r[1]>0 && r[2]>0)
    {
            boxes[i] := BoxCreate(r[1], r[2], 10, 15,0xFFFFFFFF, true)
            i++
    }
}
Loop
{
   BoxDestroy(boxes[i])
   i--
   if(i==0)
    break
}
}

И да, теперь координаты получаются быстро.

Вот тут видно, игроки находятся сверху-слева, а квадраты снизу-справа.
 

Вложения

  • sa-mp-004.png
    sa-mp-004.png
    407.5 KB · Просмотры: 225