Jump to content

Общий мини "HELP ME" топик по скриптингу


Recommended Posts

Posted
Ребят, всем привет. Запостил вопрос в разделе "Scripting" основного форума, думал помогут, но нет. Видать там только на простенькие вопросы могут ответить. Поэтому прошу помощи здесь. Вопрос скорее математический, а не скриптовый. В общем, на картинке снизу изображены несколько DX-окружностей и курсор. Так вот мне нужно как-то вычислить что курсор находится в радиусе любой из окружностей. Т.е. грубо говоря, зная только координаты центра окружности и ее радиус, а также координаты курсора, мне нужно это каким-то образом определять. К сожалению, я сам это делать не умею, поэтому буду очень благодарен за помощь.

3f5ba2dd7ca3t.jpg

Для каждой окружности

getDistanceBetweenPoints2D(circleCenterX, circleCenterY, cursorX, crusorY) < circleRadius 

на которой даст true - в той и находится.

Posted

Скиньте что-нибудь почитать по HLSL

Вопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ?

Posted
Как определить модель видеокарты в МТА ?

Модель видеокарты, версию шейдеров, свободную видеопамять и т. п. можно узнать с помощью этой функции:

dxGetStatus 

Posted
Скиньте что-нибудь почитать по HLSL

Вопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ?

Делай векторный и пиксельный обычную 2 версию, с ней меньше всего проблем, вроде бы (могу быть не прав).

Posted
Скиньте что-нибудь почитать по HLSL

Вопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ?

Делай векторный и пиксельный обычную 2 версию, с ней меньше всего проблем, вроде бы (могу быть не прав).

Чем ниже версия - тем меньше проблем. И, на сколько я знаю, не векторный, а вертексный или вершинный.

Posted (edited)

Сделал простой инвентарь.

Таблицу использую для сохранение и загрузки так и для регистрации.

  
local itemTable = { --таблица с данными 
    {"Burger", 1},-- 
    {"Pizza", 1}, 
    {"Hot-Dog", 2}, 
    {"Apple", 3}, 
    {"Peach", 0}, 
    {"Banana", 3}, 
    {"Meat", 1}, 
    {"Raw-Meat", 2}, 
    {"Bandage", 0}, 
    {"Drug", 0} 
} 
  

Регистрация

  
addEvent("onPlayerRegister", true) 
addEventHandler("onPlayerRegister", root, 
    function(player) 
        local numb = math.random(#spawnPos) 
        local x, y, z = spawnPos[numb][1], spawnPos[numb][2], spawnPos[numb][3] 
        player:spawn(x, y, z) 
        player:fadeCamera(true) 
        player:setCameraTarget(player) 
        for i, data in ipairs(itemTable) do 
            player:setData(data[1], data[2])--думаю понятно 
        end 
    end 
) 
  

Чтобы не засорять базу данных решил использовать toJSON(Посоветовал знакомый)

  
addEventHandler("onPlayerQuit", root, 
    function() 
        local name = source:getName() 
        local pos = {getElementPosition(source)} 
        local inventory = {} 
        for i, data in ipairs(itemTable) do 
            inventory[i] = source:getData(data[1]) 
        end 
        inventory = toJSON(inventory) 
        exports.mysql:getDB():exec("UPDATE `accounts` SET `pos` = '"..pos[1]..", "..pos[2]..", "..pos[3].."', `inventory` = '"..inventory.."' WHERE `username` = '"..name.."' LIMIT 1") 
    end 
) 
  

Но вот с загрузкой трабла.

  
addEvent("onPlayerLogged", true) 
addEventHandler("onPlayerLogged", root, 
    function(player) 
        local name = player:getName() 
        local query = exports.mysql:getDB():query("SELECT * FROM `accounts` WHERE `username` = '"..name.."' LIMIT 1") 
        local result = query:poll(-1) 
        local pos = split(result[1]["pos"], ",") 
        player:spawn(pos[1], pos[2], pos[3]) 
        player:fadeCamera(true) 
        player:setCameraTarget(player) 
        for i, data in ipairs(itemTable) do --извлекаю название предмета 
            for k, v in pairs(fromJSON(result[1]["inventory"])) do--извлекаю количество предмета 
                local elementData = unpack(v) 
                player:setData(data[1], elementData)--тут ясно 
            end 
        end 
    end 
) 
  

Использовать цикл в цикле как то глупо, да и функция не работает.

UPD: Решено

Edited by Guest
Posted

Jeff_Monson,

Извини, нету совсем желания разбираться в твоем коде(не плохой, просто нет, утром тоже не было).

Как вариант: покопай в стороне fromJSON(result[1]["inventory"]

А да, цикл в цикле - вообще нормальная практика

Дебажить пытался ? Если нет, то посмотри что хранится переменных на всех участках кода. Что возвращает из БД, по чем циклы ходят и всё такое.

Posted

Извини, нету совсем желания разбираться в твоем коде(не плохой, просто нет, утром тоже не было).

Как вариант: покопай в стороне fromJSON(result[1]["inventory"]

А да, цикл в цикле - вообще нормальная практика

Дебажить пытался ? Если нет, то посмотри что хранится переменных на всех участках кода. Что возвращает из БД, по чем циклы ходят и всё такое.

Буду химичить,

Новый нюанс ребята), знаю руки не из того места растут...

Сделал систему транспорта, но тут уже не загрузка а сохранение не пашет :|

Создание транспорта:

  
addCommandHandler("addvehicle", 
    function (player, cmd, model) 
        local x, y, z = getElementPosition(player) 
        local rx, ry, rz = getElementRotation(player) 
        local pos = toJSON({x, y, z, rx, ry, rz}) 
        local query = getDB():query("INSERT INTO `vehicles` (`model`, `repos`, `pos`) VALUES ('"..model.."', '"..pos.."', '"..pos.."')") 
        if (query) then 
            local result, num_affected_rows, last_insert_id = query:poll(-1) 
            addVehicle(last_insert_id, model, 1000, pos, pos) 
            player:outputChat(last_insert_id) 
        else 
            outputConsole("MySQL error occured when tried to create the vehicle.") 
        end 
    end 
) 
  

Функция addVehicle:

  
function addVehicle(id, model, health, pos, repos) 
    local vpos = fromJSON(pos) 
    local vrepos = fromJSON(repos) 
    local vehicle = Vehicle(model, vpos[1], vpos[2], vpos[3], vpos[4], vpos[5], vpos[6]) 
    vehicle:setHealth(health) 
    vehicle:setRotation(vpos[4], vpos[5], vpos[6]) 
    vehicle:setData("dbid", id) 
    setVehicleRespawnPosition(vehicle, vrepos[1], vrepos[2], vrepos[3], vrepos[4], vrepos[5], vrepos[6]) 
end 
  

Загрузка:

  
addEventHandler("onResourceStart", resourceRoot, 
    function () 
        local query = getDB():query("SELECT * FROM `vehicles`") 
        if (query) then 
            local result, num_affected_rows, errmsg = query:poll(-1) 
            if (num_affected_rows > 0) then 
                for result, row in pairs(result) do 
                    addVehicle(row["id"], row["model"], row["health"], row["pos"], row["repos"]) 
                end 
            else 
                outputConsole("0 vehicles loaded.") 
            end 
        else 
            outputConsole("MySQL query failed when tried to fetch all vehicles.") 
        end 
    end 
) 
  

Сохранение:

  
addEventHandler("onResourceStop", resourceRoot, 
    function () 
        for i, v in ipairs(getElementsByType("vehicle")) do 
            saveVehicle(v) 
        end 
    end 
) 
  

Функция сохранение:

  
function saveVehicle(element) 
    local id = tonumber(element:getData("dbid")) or -1 
    if isElement(element) and element:getType() == "vehicle" and id >= 0 then 
        local health = element:getHealth() 
        local x, y, z = getElementPosition(element) 
        local rx, ry, rz = getElementRotation(element) 
        local query = getDB():exec("UPDATE `vehicles` SET `health` = '"..health.."', `pos` = '"..toJSON({x, y, z, rx, ry, rz}).."' WHERE `id` = '"..id.."'") 
        if (query) then 
            outputConsole("Vehicle was saved automatically.") 
        else 
            outputConsole("MySQL query failed when trying to save vehicle.") 
        end 
    end 
end 
  

Знаю наверное задолбал всех со своими ошибками...

Добавил 5 машин

Что выдает мне консоль при отключение мода:

  
[2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] 
[2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] 
[2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] 
[2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] 
[2014-12-11 23:40:57] WARNING: [new_project]\project\vehicle\vehicle_s.lua:71: Bad argument @ 'exec' [Expected db-connection at argument 1] 
  

UPD: Разобрался :mrgreen: , странно но связь с бд отключался до того как сервер успевал сохранять т/с.

Пришлось таким способом сохранять т/с и игрока.

  
addEventHandler("onResourceStop", resourceRoot, 
    function() 
        for i, p in ipairs(getElementsByType("player")) do 
            if p:getData("Logged") then 
                onPlayerSave(p) 
            end 
        end 
        for i, v in ipairs(getElementsByType("vehicle")) do 
            saveVehicle(v:getData("dbid"), v) 
        end 
        if (isElement(connection)) then 
            connection:destroy() 
        end 
    end 
) 
  

Posted

Приветствую, помогите пожалуйста разобраться с одним моментом.

Ниже скрипт, идея была сделать вид от 1го лица. Но если смещать камеру по оси X или Y то получается фигня.

Нарпмер если выставить значение tarX = tarX+0.37 то при повороте авто точка обзора вращается по кругу относительно нулевой координаты (т.е. центра машины). Есть возможность победить это?

function toggleCockpitView () 
  if (not isEnabled) then 
    isEnabled = true 
    addEventHandler ("onClientPreRender", root, camera) 
  else 
    isEnabled = false 
    setCameraTarget (localPlayer, localPlayer) 
    removeEventHandler ("onClientPreRender", root, camera) 
  end 
end 
addCommandHandler("racecam", toggleCockpitView) 
  
function camera() 
  if (isEnabled) then 
    local vehicle = getPedOccupiedVehicle(getLocalPlayer()) 
    if not vehicle then return end 
    local tarX, tarY, tarZ = getElementPosition(vehicle) 
    tarX = tarX 
    tarY = tarY 
    tarZ = tarZ 
    local velX, velY, velZ = getElementVelocity(vehicle) 
    local rotX, rotY, rotZ = getElementRotation(vehicle) 
    local vel3D = (velX^2+velY^2+velZ^2)^0.5 
      if(vel3D == 0)then 
        local camX, camY, camZ = getRotatedPosition(vehicle, 0, 0, 0) 
        return 
      end 
    local relX = velX / vel3D 
    local relY = velY / vel3D 
    local relZ = velZ / vel3D 
    local camX, camY, camZ = tarX, tarY, tarZ 
    camX, camY, camZ = camX-relX, camY-relY, camZ-relZ 
    local hit, hitX, hitY, hitZ = processLineOfSight(tarX, tarY, tarZ, camX, camY, camZ, true, false, false, true, false, true, true, true) 
    local rot = 0 
      if hit and (rotX >= 45 and rotX <= 360-45)then 
        rot = 180 
        camX, camY, camZ = getRotatedPosition(vehicle, 0, 0, 0) 
        camX, camY, camZ = camX-relX, camY-relY, camZ-relZ 
      else 
        rot = -rotY 
      end 
    setCameraMatrix(camX, camY, camZ+0.45, tarX, tarY, tarZ+0.45) 
  end 
end 
  
function getRotatedPosition(element, distX, distY, distZ) 
    if not element or not isElement(element) then return end 
    local matrix = getElementMatrix(element) 
    if not matrix then return end 
    local offX = distX * matrix[1][1] + distY * matrix[2][1] + distZ * matrix[3][1] + 1 * matrix[4][1] 
    local offY = distX * matrix[1][2] + distY * matrix[2][2] + distZ * matrix[3][2] + 1 * matrix[4][2] 
    local offZ = distX * matrix[1][3] + distY * matrix[2][3] + distZ * matrix[3][3] + 1 * matrix[4][3] 
    return offX, offY, offZ 
end 

Posted

Генерация пароля:

  
local symbols = { 
    'A', 'b', 'D', 'G', 'N', 'f', 'j', 'T', 'R', 'e', 'z', 'Z', 'X', 'x', 'V', 'v', 'E', 'H', 'h', 's', 'S', 'a', 'B', 'n', 'm', 'M', 'l', 'L', 'g', 'F', 'y', 'Y', 'U', 'u', 'p', 'P' 
} 
-- 
function RandomPassword(sym_num) 
    local pass = '' 
    for i = 1, sym_num do 
        if math.random(1, 2) == 1 then 
            pass = pass..tostring(math.random(0, 9)) 
        else 
            pass = pass..symbols[math.random(1, #symbols)] 
        end 
    end 
    return pass 
end 
  

Вопрос можно как-то сократить код? пример не используя таблицу

Posted

Можно записать все в одну строку и потом посимвольно выдергивать

function randomPass(length) 
    length = length or 0 
    local output = '' 
    dic = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 
  
    while(length > 0) do 
        local randId = math.random(1,#dic) 
        output = output .. dic:sub(randId ,randId) 
        length = length - 1 
    end 
  
    return output 
end 

Posted

Промежутки, из которых брать символы записываются в таблицу groups, добавь свои промежутки, если этих мало.

  
local groups = { 
    { 48, 57 }, -- числа 
    { 65, 90 }, -- большие буквы 
    { 97, 122 }, -- маленькие буквы 
} 
  
  
  
function genPass( len ) 
    local pass = ""; 
  
    for i = 1, len do 
        local group = groups[ math.random( 1, #groups ) ]; 
        local groupFloor, groupCeil = unpack( group ); 
  
        local char = math.random( groupFloor, groupCeil ); 
  
        pass = pass .. string.char( char ); 
    end 
  
    return pass; 
end 

Оффтоп: видел я твой "генератор" в одной дейзовском чуде, которое продавали за 1к... Если это оттуда - на будущее - не советую что либо брать из того, что продают в дейзах.

Posted
Приветствую, помогите пожалуйста разобраться с одним моментом.

Ниже скрипт, идея была сделать вид от 1го лица. Но если смещать камеру по оси X или Y то получается фигня.

Нарпмер если выставить значение tarX = tarX+0.37 то при повороте авто точка обзора вращается по кругу относительно нулевой координаты (т.е. центра машины). Есть возможность победить это?

Камера - это элемент, попробуй просто приаттачить.

getCamera() 
attachElements() 

Posted
Промежутки, из которых брать символы записываются в таблицу groups, добавь свои промежутки, если этих мало.
  
local groups = { 
    { 48, 57 }, -- числа 
    { 65, 90 }, -- большие буквы 
    { 97, 122 }, -- маленькие буквы 
} 
  
  
  
function genPass( len ) 
    local pass = ""; 
  
    for i = 1, len do 
        local group = groups[ math.random( 1, #groups ) ]; 
        local groupFloor, groupCeil = unpack( group ); 
  
        local char = math.random( groupFloor, groupCeil ); 
  
        pass = pass .. string.char( char ); 
    end 
  
    return pass; 
end 

Здесь бред какой-то с unpack, нужно овер переменных, и чтобы количество символов во всех таблицах было одинаковое.

Так вот вроде норм:

local groups = { 
    { '1','2','3','4','5','6','7','8','9','0' }, 
    { 'Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M' }, 
    { 'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m' } 
} 
  
  
function genPass( len ) 
    local pass = "" 
  
    for i = 1, len do 
  
        local group = groups[math.random( 1, #groups )] 
        local char = group[math.random(1, #group)] 
  
        pass = pass .. char  
    end 
  
    return pass 
end 

Posted
Здесь бред какой-то с unpack, нужно овер переменных, и чтобы количество символов во всех таблицах было одинаковое.

Перечитай код или даже запусти его и проверь, бред или нет.

Posted

Здесь бред какой-то с unpack, нужно овер переменных, и чтобы количество символов во всех таблицах было одинаковое.

Ничего этого не нужно. Всё там правильно, просто ты видимо не в курсе про ASCII (основы программирования)

Posted
Промежутки, из которых брать символы записываются в таблицу groups, добавь свои промежутки, если этих мало.
  
local groups = { 
    { 48, 57 }, -- числа 
    { 65, 90 }, -- большие буквы 
    { 97, 122 }, -- маленькие буквы 
} 
  
  
  
function genPass( len ) 
    local pass = ""; 
  
    for i = 1, len do 
        local group = groups[ math.random( 1, #groups ) ]; 
        local groupFloor, groupCeil = unpack( group ); 
  
        local char = math.random( groupFloor, groupCeil ); 
  
        pass = pass .. string.char( char ); 
    end 
  
    return pass; 
end 

Оффтоп: видел я твой "генератор" в одной дейзовском чуде, которое продавали за 1к... Если это оттуда - на будущее - не советую что либо брать из того, что продают в дейзах.

Я беру те функции которые мне полезны, но теперь понял что лучше писать самому

P.S Спасибо

Posted
Приветствую, помогите пожалуйста разобраться с одним моментом.

Ниже скрипт, идея была сделать вид от 1го лица. Но если смещать камеру по оси X или Y то получается фигня.

Нарпмер если выставить значение tarX = tarX+0.37 то при повороте авто точка обзора вращается по кругу относительно нулевой координаты (т.е. центра машины). Есть возможность победить это?

Камера - это элемент, попробуй просто приаттачить.

getCamera() 
attachElements() 

Не получается..

Попробовал приаттачить элемент к машине и завязать камеру на него но все равно она ходит по кругу при повороте..

function toggleCockpitView () 
  if (not isEnabled) then 
    isEnabled = true 
    addEventHandler ("onClientPreRender", root, camera) 
  else 
    isEnabled = false 
    setCameraTarget (localPlayer, localPlayer) 
    removeEventHandler ("onClientPreRender", root, camera) 
  end 
end 
addCommandHandler("racecam", toggleCockpitView) 
  
function camera() 
  if (isEnabled) then 
    local x, y, z = getElementPosition(getLocalPlayer()) 
    local vehicle = getPedOccupiedVehicle(getLocalPlayer()) 
    gnat = createObject(3803, x+0.37, y+0.6, z+0.6)  
    setElementAlpha(gnat, 0) 
    if not vehicle then return end 
    local tarX, tarY, tarZ = getElementPosition(gnat) 
    local velX, velY, velZ = getElementVelocity(vehicle) 
    local rotX, rotY, rotZ = getElementRotation(gnat) 
    local vel3D = (velX^2+velY^2+velZ^2)^0.5 
      if(vel3D == 0)then 
        local camX, camY, camZ = getRotatedPosition(gnat, 0, 0, 0) 
        return 
      end 
    local relX = velX / vel3D 
    local relY = velY / vel3D 
    local relZ = velZ / vel3D 
    local camX, camY, camZ = tarX, tarY, tarZ 
    camX, camY, camZ = camX-relX, camY-relY, camZ-relZ 
    local hit, hitX, hitY, hitZ = processLineOfSight(tarX, tarY, tarZ, camX, camY, camZ, true, false, false, true, false, true, true, true) 
    local rot = 0 
      if hit and (rotX >= 45 and rotX <= 360-45)then 
        rot = 180 
        camX, camY, camZ = getRotatedPosition(gnat, 0, 0, 0) 
        camX, camY, camZ = camX-relX, camY-relY, camZ-relZ 
      else 
        rot = -rotY 
      end 
    setCameraMatrix(camX, camY, camZ, tarX, tarY, tarZ) 
  end 
end 
  
function getRotatedPosition(element, distX, distY, distZ) 
    if not element or not isElement(element) then return end 
    local matrix = getElementMatrix(element) 
    if not matrix then return end 
    local offX = distX * matrix[1][1] + distY * matrix[2][1] + distZ * matrix[3][1] + 1 * matrix[4][1] 
    local offY = distX * matrix[1][2] + distY * matrix[2][2] + distZ * matrix[3][2] + 1 * matrix[4][2] 
    local offZ = distX * matrix[1][3] + distY * matrix[2][3] + distZ * matrix[3][3] + 1 * matrix[4][3] 
    return offX, offY, offZ 
end 

Posted

Ребят, а разве к элементу с типом "player" нельзя прикреплять другие элементы с помощью функции setElementParent? Пробовал прикрепить таким образом объект, но все время возвращает false.

Posted
Ребят, а разве к элементу с типом "player" нельзя прикреплять другие элементы с помощью функции setElementParent? Пробовал прикрепить таким образом объект, но все время возвращает false.

Просто player находится под рутом, а элементы не могут по дереву подняться выше своего ресурса. Решение: опусти игрока под ресурс:

setElementParent( player, resourceRoot ); 

или под другой нужный элемент в этом ресурсе:

local playerRoot = createElement( "playerRoot", "playerRoot" ); 
setElementParent( player, playerRoot ); 

Posted

Kernell, спасибо. С помощью второго варианта удалось приаттачить объект к элементу игрока. Но вот, например, я хотел чтобы таким образом приаттаченный дочерний объект удалялся при исчезновении родительского элемента, например при выходе игрока из игры. Как бы игрок вышел - его элемента больше не существует, а по логике элементов МТА, и дочерние должны исчезать (в данном случае мой объект). Но вот почему-то у меня этого не происходит, при выходе из игры объект не удаляется. Что может быть не так?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...