Гайд Пишем свои функции в скрипте с помощью SA-MP API

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Автор темы
Модератор
1,890
3,041
Всем привет. Люди меня спрашивали: "Как пользоваться module.Get() в SA-MP API?" В этой теме я покажу и расскажу как пользоваться данной функцией.

Давайте сначала я вам расскажу, что делает данная функция. Данная функция позволяет делать любые изменения и действия в структурах SA:MP. Теперь покажу как пользоваться функцией.

Для начала давайте сделаем простенький скрипт и подключим к нему библиотеку "SA-MP API"

Lua:
local dl = require "SA-MP API.init" -- подключаем библиотеку

function main()
     while not dl.GetIsAvailable() do wait(0) end
     wait(-1)
end
Мы сделали простой скрипт и подключили библиотеку, к примеру я хочу получить свой ник, давайте это сделаем! Но для начала перейдем в папку lib/SA-MP API/samp/*ВЕРСИЯ САМП ПОД КОТОРУЮ ВЫ ПИШИТЕ СКРИПТ*/. В папке мы увидим все структуры с которыми мы можем работать, самая главная в данной библиотеке структура stSAMP.lua именно она прописывается в самом начале нашей функции. Всего библиотека включает в себя 7 главных структур от которых мы можем "отталкиваться" для поиска нужной нам структуры и значения:
Lua:
pChat = stChatInfo
pChatInput = stInputInfo
pKillList = stKillInfo
pBase = stSAMP
pScoreboard = stScoreboardInfo
pRecentDialog = stDialogInfo
pMisc = stGameInfo
Как мы видим "stSAMP" названа в библиотеке как "pBase", именно это название нам и нужно будет. Наш ник хранится в структуре "stPlayerPool" (можно конечно его взять и из "stLocalPlayer", но я буду его брать из "stPlayerPool"), давайте я покажу как из "pBase" перейти в "stPlayerPool":
Lua:
local dl = require "SA-MP API.init" -- подключаем библиотеку


function main()
     while not dl.GetIsAvailable() do wait(0) end
     local this = dl.Get().pBase -- сейчас мы находимся в pBase
     if ( this == nil ) then -- проверка на существование структуры, если функция Get() возвращает 0, то крашим скрипт с ошибкой
         error("pBase = nil")
     end
     wait(-1)
end

Откроем файл "stSAMP.lua" и увидим такую картину:
43410

Наша задача перейти в stSAMPPools (там хранятся все пулы SA:MP), обратим внимание на эту строчку:
43411

Мы видим, что тут "stSAMPPools" назван как pPools, давайте перейдем в "stSAMPPools" по примеру выше:

Lua:
local dl = require "SA-MP API.init" -- подключаем библиотеку

function main()
     while not dl.GetIsAvailable() do wait(0) end
     local this = dl.Get().pBase.pPools -- ПРИПИСАЛИ К pBase "pPools"
     if ( this == nil ) then -- проверка на существование структуры, если функция Get() возвращает 0, то крашим скрипт с ошибкой
         error("pBase = nil")
     end
     wait(-1)
end
Теперь откроем файл "stSAMPPools" и увидим там вот такую строчку:
43412

Мы уже почти добрались до структуры "stPlayerPool", она названа как "pPlayer", снова припишем ее в коде:

Lua:
local dl = require "SA-MP API.init" -- подключаем библиотеку

function main()
     while not dl.GetIsAvailable() do wait(0) end
     local this = dl.Get().pBase.pPools.pPlayer -- ПРИПИСАЛИ К pPools "pPlayer"
     if ( this == nil ) then -- проверка на существование структуры, если функция Get() возвращает 0, то крашим скрипт с ошибкой
         error("pBase = nil")
     end
     wait(-1)
end
Теперь мы находимся в "stPlayerPool", тут и хранится наш ник, а именно в этой строке:
43413

Можем вывести наш ник на экран, делается это так:
Lua:
local dl = require "SA-MP API.init" -- подключаем библиотеку

function main()
     while not dl.GetIsAvailable() do wait(0) end
     local this = dl.Get().pBase.pPools.pPlayer -- ПРИПИСАЛИ К pPools "pPlayer"
     if ( this == nil ) then -- проверка на существование структуры, если функция Get() возвращает 0, то крашим скрипт с ошибкой
         error("pBase = nil")
     end
     MyNickName = this.strLocalPlayerName -- записали ник из структуры в переменную
     printStringNow(MyNickName, 5000) -- вывели этот ник
     wait(-1)
end


Заключение: Как вы наверно могли понять, с помощью этой функции можно делать очень крутых вещей. Я надеюсь, что я довольно понятно все объяснил, если у кого-то будут вопросы, пишите в тему :)
 

Oreshka23

Известный
338
164
Как жаль только что DL умирает, вот Hosted для него отключили
 

neYarik.

Участник
83
9
С помощью SA-MP API можно писать скрипты не только для 0.3.DL, можно также и для 0.3.7 R-1 без SAMPFUNCS
Что я делаю не так? Координаты есть почти увсех, даже если они не в зоне стрима (а если и в зоне, то циферки непонятные выходят). Так же попадаются ники вида "@ЉзАvфИxф(wф", "hЉз°њфшЎфPћф", "А‡зЙуШјуЁЅу"
У некоторых по непонятному критерию координаты оказываются на нуле.
Код:
        local pools = dl.Get().pBase.pPools
        if showPlayers then
            local players = pools.pPlayer.pRemotePlayer
            for i=0,pools.pPlayer.ulMaxPlayerID do
                if players[i] == nil then goto continue end
               
                local name = ffi.string(players[i].strPlayerName)
                local pos = players[i].pPlayerData.fOnFootPos
                local x, y, z = pos[0], pos[1], pos[2]
                print(name, x, y, z, players[i].pPlayerData.sPlayerID)
                ::continue::
            end
        end
Вывод
Код:
[18:55:32.069985] (script)    test.lua: Василий_Швенда   -0.022194113582373   -0.02847264893353   -5.5083700090108e-07   47
[18:55:32.069985] (script)    test.lua: Адам_Молчун   0.0005881188553758   -0.036807715892792   -5.6170972584368e-07   48
[18:55:32.069985] (script)    test.lua: (‰зиsфPtфрuф   0   0   0   49
 

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Автор темы
Модератор
1,890
3,041
Что я делаю не так? Координаты есть почти увсех, даже если они не в зоне стрима (а если и в зоне, то циферки непонятные выходят). Так же попадаются ники вида "@ЉзАvфИxф(wф", "hЉз°њфшЎфPћф", "А‡зЙуШјуЁЅу"
У некоторых по непонятному критерию координаты оказываются на нуле.
Код:
        local pools = dl.Get().pBase.pPools
        if showPlayers then
            local players = pools.pPlayer.pRemotePlayer
            for i=0,pools.pPlayer.ulMaxPlayerID do
                if players[i] == nil then goto continue end
             
                local name = ffi.string(players[i].strPlayerName)
                local pos = players[i].pPlayerData.fOnFootPos
                local x, y, z = pos[0], pos[1], pos[2]
                print(name, x, y, z, players[i].pPlayerData.sPlayerID)
                ::continue::
            end
        end
Вывод
Код:
[18:55:32.069985] (script)    test.lua: Василий_Швенда   -0.022194113582373   -0.02847264893353   -5.5083700090108e-07   47
[18:55:32.069985] (script)    test.lua: Адам_Молчун   0.0005881188553758   -0.036807715892792   -5.6170972584368e-07   48
[18:55:32.069985] (script)    test.lua: (‰зиsфPtфрuф   0   0   0   49
на счет ников - это скорее всего из-за плагина на сервере который делает ники русскими. на счет остального хз