MX_Master

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

Recommended Posts

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

3f5ba2dd7ca3t.jpg

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

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

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

Share this post


Link to post

Elengar, спасибо за ответ. Такая проверка работает, что и было мне нужно :)

Share this post


Link to post

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

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

Share this post


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

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

dxGetStatus 

Share this post


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

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

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

Share this post


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

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

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

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

Share this post


Link to post

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

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

  
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

Share this post


Link to post

Есть предложение выложить код ошибки...

Share this post


Link to post
Есть предложение выложить код ошибки...

его нет

Share this post


Link to post

Jeff_Monson,

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

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

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

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

Share this post


Link to post

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

Как вариант: покопай в стороне 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 
) 
  

Share this post


Link to post

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

Ниже скрипт, идея была сделать вид от 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 

Share this post


Link to post

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

  
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 
  

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

Share this post


Link to post

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

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 

Share this post


Link to post

Промежутки, из которых брать символы записываются в таблицу 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к... Если это оттуда - на будущее - не советую что либо брать из того, что продают в дейзах.

Share this post


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

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

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

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

getCamera() 
attachElements() 

Share this post


Link to post
Промежутки, из которых брать символы записываются в таблицу 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 

Share this post


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

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

Share this post


Link to post

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

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

Share this post


Link to post
Промежутки, из которых брать символы записываются в таблицу 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 Спасибо

Share this post


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

Ниже скрипт, идея была сделать вид от 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 

Share this post


Link to post

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

Share this post


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

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

setElementParent( player, resourceRoot ); 

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

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

Share this post


Link to post

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

Share this post


Link to post

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.