Elengar Posted December 4, 2014 Share Posted December 4, 2014 Ребят, всем привет. Запостил вопрос в разделе "Scripting" основного форума, думал помогут, но нет. Видать там только на простенькие вопросы могут ответить. Поэтому прошу помощи здесь. Вопрос скорее математический, а не скриптовый. В общем, на картинке снизу изображены несколько DX-окружностей и курсор. Так вот мне нужно как-то вычислить что курсор находится в радиусе любой из окружностей. Т.е. грубо говоря, зная только координаты центра окружности и ее радиус, а также координаты курсора, мне нужно это каким-то образом определять. К сожалению, я сам это делать не умею, поэтому буду очень благодарен за помощь. Для каждой окружности getDistanceBetweenPoints2D(circleCenterX, circleCenterY, cursorX, crusorY) < circleRadius на которой даст true - в той и находится. Link to comment
AMARANT Posted December 4, 2014 Share Posted December 4, 2014 Elengar, спасибо за ответ. Такая проверка работает, что и было мне нужно Link to comment
Elengar Posted December 6, 2014 Share Posted December 6, 2014 Скиньте что-нибудь почитать по HLSL Вопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ? Link to comment
Strix Posted December 6, 2014 Share Posted December 6, 2014 Как определить модель видеокарты в МТА ? Модель видеокарты, версию шейдеров, свободную видеопамять и т. п. можно узнать с помощью этой функции: dxGetStatus Link to comment
N1kS Posted December 6, 2014 Share Posted December 6, 2014 Скиньте что-нибудь почитать по HLSLВопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ? Делай векторный и пиксельный обычную 2 версию, с ней меньше всего проблем, вроде бы (могу быть не прав). Link to comment
Elengar Posted December 6, 2014 Share Posted December 6, 2014 Скиньте что-нибудь почитать по HLSLВопрос c этого же двора: при применении некоторых шейдеров у некоторых игроков черный экран. Это с моделью шейдеров видеокарты связано ? Как определить модель видеокарты в МТА ? Делай векторный и пиксельный обычную 2 версию, с ней меньше всего проблем, вроде бы (могу быть не прав). Чем ниже версия - тем меньше проблем. И, на сколько я знаю, не векторный, а вертексный или вершинный. Link to comment
iAxel Posted December 10, 2014 Share Posted December 10, 2014 (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 December 12, 2014 by Guest Link to comment
N1kS Posted December 11, 2014 Share Posted December 11, 2014 Есть предложение выложить код ошибки... Link to comment
iAxel Posted December 11, 2014 Share Posted December 11, 2014 Есть предложение выложить код ошибки... его нет Link to comment
Elengar Posted December 11, 2014 Share Posted December 11, 2014 Jeff_Monson, Извини, нету совсем желания разбираться в твоем коде(не плохой, просто нет, утром тоже не было). Как вариант: покопай в стороне fromJSON(result[1]["inventory"] А да, цикл в цикле - вообще нормальная практика Дебажить пытался ? Если нет, то посмотри что хранится переменных на всех участках кода. Что возвращает из БД, по чем циклы ходят и всё такое. Link to comment
iAxel Posted December 12, 2014 Share Posted December 12, 2014 Извини, нету совсем желания разбираться в твоем коде(не плохой, просто нет, утром тоже не было). Как вариант: покопай в стороне 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: Разобрался , странно но связь с бд отключался до того как сервер успевал сохранять т/с. Пришлось таким способом сохранять т/с и игрока. 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 ) Link to comment
Seddo Posted December 15, 2014 Share Posted December 15, 2014 Приветствую, помогите пожалуйста разобраться с одним моментом. Ниже скрипт, идея была сделать вид от 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 Link to comment
iAxel Posted December 16, 2014 Share Posted December 16, 2014 Генерация пароля: 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 Вопрос можно как-то сократить код? пример не используя таблицу Link to comment
l0vefist Posted December 16, 2014 Share Posted December 16, 2014 Можно записать все в одну строку и потом посимвольно выдергивать 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 Link to comment
Elengar Posted December 16, 2014 Share Posted December 16, 2014 Промежутки, из которых брать символы записываются в таблицу 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к... Если это оттуда - на будущее - не советую что либо брать из того, что продают в дейзах. Link to comment
TheNormalnij Posted December 16, 2014 Share Posted December 16, 2014 Приветствую, помогите пожалуйста разобраться с одним моментом.Ниже скрипт, идея была сделать вид от 1го лица. Но если смещать камеру по оси X или Y то получается фигня. Нарпмер если выставить значение tarX = tarX+0.37 то при повороте авто точка обзора вращается по кругу относительно нулевой координаты (т.е. центра машины). Есть возможность победить это? Камера - это элемент, попробуй просто приаттачить. getCamera() attachElements() Link to comment
FranklinRoosevelt Posted December 16, 2014 Share Posted December 16, 2014 Промежутки, из которых брать символы записываются в таблицу 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 Link to comment
Elengar Posted December 16, 2014 Share Posted December 16, 2014 Здесь бред какой-то с unpack, нужно овер переменных, и чтобы количество символов во всех таблицах было одинаковое. Перечитай код или даже запусти его и проверь, бред или нет. Link to comment
Kernell Posted December 17, 2014 Share Posted December 17, 2014 Здесь бред какой-то с unpack, нужно овер переменных, и чтобы количество символов во всех таблицах было одинаковое. Ничего этого не нужно. Всё там правильно, просто ты видимо не в курсе про ASCII (основы программирования) Link to comment
FranklinRoosevelt Posted December 17, 2014 Share Posted December 17, 2014 Запустил, реально все работает, не знал просто как работает string.char. Link to comment
iAxel Posted December 17, 2014 Share Posted December 17, 2014 Промежутки, из которых брать символы записываются в таблицу 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 Спасибо Link to comment
Seddo Posted December 18, 2014 Share Posted December 18, 2014 Приветствую, помогите пожалуйста разобраться с одним моментом.Ниже скрипт, идея была сделать вид от 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 Link to comment
AMARANT Posted December 21, 2014 Share Posted December 21, 2014 Ребят, а разве к элементу с типом "player" нельзя прикреплять другие элементы с помощью функции setElementParent? Пробовал прикрепить таким образом объект, но все время возвращает false. Link to comment
Kernell Posted December 21, 2014 Share Posted December 21, 2014 Ребят, а разве к элементу с типом "player" нельзя прикреплять другие элементы с помощью функции setElementParent? Пробовал прикрепить таким образом объект, но все время возвращает false. Просто player находится под рутом, а элементы не могут по дереву подняться выше своего ресурса. Решение: опусти игрока под ресурс: setElementParent( player, resourceRoot ); или под другой нужный элемент в этом ресурсе: local playerRoot = createElement( "playerRoot", "playerRoot" ); setElementParent( player, playerRoot ); Link to comment
AMARANT Posted December 22, 2014 Share Posted December 22, 2014 Kernell, спасибо. С помощью второго варианта удалось приаттачить объект к элементу игрока. Но вот, например, я хотел чтобы таким образом приаттаченный дочерний объект удалялся при исчезновении родительского элемента, например при выходе игрока из игры. Как бы игрок вышел - его элемента больше не существует, а по логике элементов МТА, и дочерние должны исчезать (в данном случае мой объект). Но вот почему-то у меня этого не происходит, при выходе из игры объект не удаляется. Что может быть не так? Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now