K1parik Posted July 21, 2017 Share Posted July 21, 2017 12 hours ago, CharlySHOMAN said: Столкнулся с такой проблемой.. Нужно выбрать уже существующий объект (кликом мыши, наведением курсора на объект или другими подобными способами). И всё вроде работает, но не для всех объектов. Я конечно не перебирал все объекты, но вот на вскидку попробовал несколько ID - и некоторые объекты не удалось найти (к примеру, ID 1000). Я пробовал 2 способами, но ни одним не нашёл объект ID 1000 Код: function clickFunction(_, _, _, _, worldX, worldY, worldZ, object) -- Способ 1 if object then if getElementType (object) == "object" then outputChatBox("Object") end end -- Способ 2 local camX, camY, camZ = getCameraMatrix() local result = processLineOfSight (camX, camY, camZ, worldX, worldY, worldZ, --[[ Здания ]] true, --[[ ТС ]] false, --[[ Игроки ]] false, --[[ Объекты ]] true, false, --[[ Полупрозрачные ? ]] true, --[[ Динамические ? ]] true, false, nil, false) -- Для объекта ID 1000 'result' выдаёт 'false' -- Для объектов, которые находятся 'result' выдаёт 'true' end addEventHandler ( "onClientClick", getRootElement(), clickFunction ) а ты установил этот объект через мап эдитор? Link to comment
CharlySHOMAN Posted July 21, 2017 Share Posted July 21, 2017 5 hours ago, K1parik said: а ты установил этот объект через мап эдитор? Как понять "установить объект"? Link to comment
K1parik Posted July 21, 2017 Share Posted July 21, 2017 58 minutes ago, CharlySHOMAN said: Как понять "установить объект"? ну объект нужный нужно создать сначала ибо если это мировой объект то на сколько я знаю он не будет выбираться. хотя может ошибаюсь. Link to comment
CharlySHOMAN Posted July 21, 2017 Share Posted July 21, 2017 7 hours ago, K1parik said: ну объект нужный нужно создать сначала ибо если это мировой объект то на сколько я знаю он не будет выбираться. хотя может ошибаюсь. Ну да, объект я создал через createObject. Объект должен быть получен с помощью события "onClientClick" судя по Вики. Но не всегда срабатывает (не для всех объектов почему-то) Link to comment
knd Posted July 26, 2017 Share Posted July 26, 2017 Ребята срочно хочу сделать через guiCreateComboBox что бы выдавался лут без каких либо категорий (через таблицу) ,но не могу понять как ,помогите кому не трудно ,за ранее спасибо Link to comment
Alex_Correa Posted July 26, 2017 Share Posted July 26, 2017 Хочу сделать что бы если навёл на другого игрока прицел то появлялась картинка и прикреплялась к прицелу, потом как увёл прицел от игрока эта картинка пропадала делал так function drawMarker() dxDrawImage(p1-16, p2-16, 32, 32, "hitmarker.png") end function cursor() x2,y2,z2=getElementPosition(randomPed) w, h = guiGetScreenSize () tx, ty, tz = getWorldFromScreenPosition ( w/2, h/2, 50 ) px, py, pz = getCameraMatrix() p1,p2=getScreenFromWorldPosition(x2,y2,z2) hit, x, y, z, elementHit = processLineOfSight ( px, py, pz, tx, ty, tz ) if hit then if x~=x2 and y~=y2 and z~=z2 then addEventHandler("onClientRender", root, drawMarker) end end end bindKey("mouse2","down",cursor) картинка появляется только по центру скина, и не убирается если я уведу прицел с персонажа Link to comment
K1parik Posted July 27, 2017 Share Posted July 27, 2017 10 hours ago, Alex_Correa said: Хочу сделать что бы если навёл на другого игрока прицел то появлялась картинка и прикреплялась к прицелу, потом как увёл прицел от игрока эта картинка пропадала делал так function drawMarker() dxDrawImage(p1-16, p2-16, 32, 32, "hitmarker.png") end function cursor() x2,y2,z2=getElementPosition(randomPed) w, h = guiGetScreenSize () tx, ty, tz = getWorldFromScreenPosition ( w/2, h/2, 50 ) px, py, pz = getCameraMatrix() p1,p2=getScreenFromWorldPosition(x2,y2,z2) hit, x, y, z, elementHit = processLineOfSight ( px, py, pz, tx, ty, tz ) if hit then if x~=x2 and y~=y2 and z~=z2 then addEventHandler("onClientRender", root, drawMarker) end end end bindKey("mouse2","down",cursor) картинка появляется только по центру скина, и не убирается если я уведу прицел с персонажа local sx, sy = guiGetScreenSize () local px, py = 1600, 900 local x, y = ( sx / px ), ( sy / py ) addEventHandler ( "onClientHUDRender", root, function () if getPedControlState ( "aim_weapon" ) then local target = getPedTarget ( localPlayer ) if target then if getElementType ( target ) == "player" then local posX, posY, posZ = getPedBonePosition ( target, 8 ) local screenX, screenY = getScreenFromWorldPosition ( posX, posY, posZ ) if screenX and screenY then dxDrawText ( "Текст заменить на картинку", screenX, screenY, screenX, screenY, tocolor ( 255, 255, 255, 200 ), x * 1.4, "default-bold", "center", "center", false, false, true, true, false ) end end end end end ) 1 Link to comment
Alex_Correa Posted July 28, 2017 Share Posted July 28, 2017 Хочу создать изображение в краю экрана и что бы оно плавно перемещалось в другой край экрана. Как это лучше всего сделать? И можно ли использовать moveObject ? Link to comment
CharlySHOMAN Posted August 1, 2017 Share Posted August 1, 2017 (edited) On 28.07.2017 at 22:57, Alex_Correa said: Хочу создать изображение в краю экрана и что бы оно плавно перемещалось в другой край экрана. Как это лучше всего сделать? И можно ли использовать moveObject ? moveObject не подойдёт, т.к. это функция для перемещения физических объектов ГТА (дерево, дорога, дом, мебель и т.п.). Если ты будешь использовать dxDrawImage для отрисовки изображения, то можно будет просто менять координаты изображения и тем самым добиться эффекта движения картинки (обрати внимание на функцию interpolateBetween). Можно еще картинку попробовать нарисовать через guiCreateStaticImage, а потом просто менять её координаты на экране добиваясь эффекта движения. Edited August 1, 2017 by CharlySHOMAN Link to comment
CharlySHOMAN Posted August 1, 2017 Share Posted August 1, 2017 В районе гетто слышу какие-то выстрелы постоянно. Там никто из игроков не стреляет (100%). Появляются эти выстрелы рандомно. Может кто-нибудь знает, в чём проблема? Я спрашивал у других игроков, они тоже слышат это. Link to comment
Maikele Posted August 9, 2017 Share Posted August 9, 2017 (edited) Применил setElementModel, и пикап не хочет изменяется. Должен функционировать так: Купил дом > пикап поменялся. Что тут не так сделал? local hPickup if owner == '' then hPickup = createPickup(eX, eY, eZ, 3, 1273, 100) else hPickup = createPickup(eX, eY, eZ, 3, 1272, 100) end addEvent( 'HOUSE_Buy', true ); addEventHandler( 'HOUSE_Buy', root, function( cost, key ) local accName = getAccountName( getPlayerAccount( client ) ); local houseCounter = 0; for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do if getElementData( v, 'housech' ) then local owner = getElementData( v, 'housech' )[7]; if owner == accName then houseCounter = houseCounter + 1; end; end; end; if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then setPedFrozen( client, false ); return false; end; if getPlayerMoney( client ) >= tonumber( cost ) then sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) ); takePlayerMoney( client, cost ); local mrk = getHouseByID( getElementData( client, 'mrk_in' ) ); local t = {}; for i = 1, 6 do t[i] = getElementData( mrk, 'housech' )[i]; end; t[7] = accName; t[8] = key; t[9] = getElementData( client, 'mrk_in' ); setElementData( mrk, 'housech', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } ); setElementModel ( hPickup, 1272 ) --#Pickup // дом занят; setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true ); else outputChatBox( '* У вас нехватает денег', client, 255, 51, 36 ); onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true ); end; end ); Edited August 9, 2017 by Maikele Link to comment
CharlySHOMAN Posted August 9, 2017 Share Posted August 9, 2017 8 hours ago, Maikele said: Применил setElementModel, и пикап не хочет изменяется. Должен функционировать так: Купил дом > пикап поменялся. Что тут не так сделал? local hPickup if owner == '' then hPickup = createPickup(eX, eY, eZ, 3, 1273, 100) else hPickup = createPickup(eX, eY, eZ, 3, 1272, 100) end addEvent( 'HOUSE_Buy', true ); addEventHandler( 'HOUSE_Buy', root, function( cost, key ) local accName = getAccountName( getPlayerAccount( client ) ); local houseCounter = 0; for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do if getElementData( v, 'housech' ) then local owner = getElementData( v, 'housech' )[7]; if owner == accName then houseCounter = houseCounter + 1; end; end; end; if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then setPedFrozen( client, false ); return false; end; if getPlayerMoney( client ) >= tonumber( cost ) then sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) ); takePlayerMoney( client, cost ); local mrk = getHouseByID( getElementData( client, 'mrk_in' ) ); local t = {}; for i = 1, 6 do t[i] = getElementData( mrk, 'housech' )[i]; end; t[7] = accName; t[8] = key; t[9] = getElementData( client, 'mrk_in' ); setElementData( mrk, 'housech', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } ); setElementModel ( hPickup, 1272 ) --#Pickup // дом занят; setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true ); else outputChatBox( '* У вас нехватает денег', client, 255, 51, 36 ); onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true ); end; end ); setElementModel может менять модель игроков, транспорта и объектов, но не пикапов. Попробуй использовать setPickupType 1 Link to comment
Maikele Posted August 10, 2017 Share Posted August 10, 2017 18 hours ago, CharlySHOMAN said: setElementModel может менять модель игроков, транспорта и объектов, но не пикапов. Попробуй использовать setPickupType Хорошо, а вот если мне удалить этот пикап нужно? Link to comment
Maikele Posted August 10, 2017 Share Posted August 10, 2017 (edited) Что то у всех домов меняются пикапы на голубой когда куплю heeeeeeeeeeeeeeeeelp hPickup = createPickup(eX, eY, eZ, 3, 1273, 100) --#Зеленый пикап ( дом свободен ) setElementData ( hPickup, "hsPickup", { etX, etY, etZ, int, dim, cost, owner, key, ID } ) addEvent( 'HOUSE_Buy', true ); addEventHandler( 'HOUSE_Buy', root, function( cost, key ) local accName = getAccountName( getPlayerAccount( client ) ); local houseCounter = 0; for i, v in ipairs( getElementsByType( 'marker', getResourceRootElement() ) ) do if getElementData( v, 'HS_INFO' ) then local owner = getElementData( v, 'HS_INFO' )[7]; if owner == accName then houseCounter = houseCounter + 1; end; end; end; if houseCounter >= tonumber( get( 'playerHouseCounter' ) ) then outputChatBox( '* You can not buy more than #00FF00'..get( 'playerHouseCounter' )..' house(-s)#FF3324 at the same time!', client, 255, 51, 36, true ); setPedFrozen( client, false ); return false; end; if getPlayerMoney( client ) >= tonumber( cost ) then outputChatBox( '* Key has been set to #00FF00'..key, client, 255, 51, 36, true ); outputChatBox( '* Congratulations! You have bought a house!', client, 255, 255, 0 ); sql.Query( "UPDATE house_data SET owner = '"..accName.."', key = '"..key.."' WHERE ID = ?", getElementData( client, 'mrk_in' ) ); takePlayerMoney( client, cost ); local mrk = getHouseByID( getElementData( client, 'mrk_in' ) ); local t = {}; for i = 1, 6 do t[i] = getElementData( mrk, 'HS_INFO' )[i]; end; t[7] = accName; t[8] = key; t[9] = getElementData( client, 'mrk_in' ); setElementData( mrk, 'HS_INFO', { t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9] } ); setMarkerColor( mrk, 255, 51, 36, 150 ); --#Голубой пикап ( дом занят ) for i, v in ipairs( getElementsByType( 'pickup' ) ) do if getElementData( v, 'hsPickup' ) then setPickupType ( v, 3, 1272 ) end; end; setTimer( onPlayerHouseMarkerHit, 50, 1, client, mrk, true ); else outputChatBox( '* You do not have enough money!', client, 255, 51, 36 ); onPlayerHouseMarkerHit( client, getHouseByID( getElementData( client, 'mrk_in' ) ), true ); end; end ); Edited August 10, 2017 by Maikele Link to comment
Sauta Posted August 14, 2017 Share Posted August 14, 2017 Здравствуйте, подскажите пожалуйста как удалить стандартный HUD из сервера MTA. Нашел одну статейку, как это делается, но там не написано куда прописовать данную строчку showPlayerHudComponent("all", false) Link to comment
CharlySHOMAN Posted August 15, 2017 Share Posted August 15, 2017 On 14.08.2017 at 09:24, Sauta said: Здравствуйте, подскажите пожалуйста как удалить стандартный HUD из сервера MTA. Нашел одну статейку, как это делается, но там не написано куда прописовать данную строчку showPlayerHudComponent("all", false) Эту функцию не рекомендуется вроде как использовать. Вместо этого используй - setPlayerHudComponentVisible("all", false) Помести это в клиентский скрипт. Можешь прям в начало любого скрипта, тогда этот код будет выполняться при присоединении клиента к серверу и худ будет сразу же отключаться. Можешь поместить этот код в функцию и запускать её например при каким-то событии. Link to comment
Maikele Posted August 18, 2017 Share Posted August 18, 2017 (edited) Имеется логин панель и создание персонажа, проблема в том что не хочет переименовывать ник уже ранее зарегистрированного пользователя. К примеру: Игрок зашел на сервер > зарегистрировался, создал персонажа ввел имя фамилия > затем его переименовывает "Имя_Фамилия", но если игрок переподключится на сервер, то его не переименовывает. В чем проблема? хеелп Вот код: addEventHandler( "onPlayerLogin", getRootElement(), function () local name = getElementData ( source, "p_name" ); --# Имя local surname = getElementData ( source, "p_surname" ); --# Фамилия setPlayerName ( source, name.."_"..surname ); end ) addCommandHandler ( "changeNamePlayer", function ( thePlayer, cmd, id, name, surname ) if not id then return end if not name then return end if not surname then return end local accName = getAccountName ( getPlayerAccount ( thePlayer ) ); if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then local allPlayers = getElementsByType ( "player" ); for i, v in ipairs( allPlayers ) do if ( getElementData ( v, "playerid" ) == tonumber ( id ) ) then setElementData ( v, "p_name", name ); setElementData ( v, "p_surname", surname ); setPlayerName ( v, name.."_"..surname ); outputChatBox ( "#e6e6e6Ваше имя изменено администратором #ffd633"..getPlayerName(thePlayer), v, 255, 255, 255, true ); else if ( i == #allPlayers ) then outputChatBox ( "#ff8800[Инфо] #ff0000Игрока с ID: "..id.." не найдено", thePlayer, 255, 255, 255, true ); end end end end end ) addEventHandler("onPlayerChangeNick", getRootElement(), function () cancelEvent( ); end ) Edited August 18, 2017 by Maikele Link to comment
Maikele Posted August 18, 2017 Share Posted August 18, 2017 кхм, что за бред, код не весь выкладывается ... Link to comment
CharlySHOMAN Posted August 18, 2017 Share Posted August 18, 2017 (edited) Вопрос чисто по Lua (не знаю, где еще можно спросить, кроме как не здесь) Пример: у меня в функцию приходит таблица data = { 'a', 'b', 'c', 'd', 'e' } в качестве аргумента. Для удобства я делаю следующее: local var1 = data[1] local var2 = data[2] local var3 = data[3] local var4 = data[4] local var5 = data[5] Вопрос состоит в следующем: при выходе из этой функции, что случится с переменными var1-5 и таблицей data? Будут ли они храниться в окружении данной функции или уничтожатся? Если они будут храниться, то не будет ли расточительством делать переменные var1-5? (т.к. это по сути копии таблицы data). Просто мне удобно использовать var1-5 (т.к. легче обращаться к значениям по имени переменной, а не по индексу в в таблице data), но в то же время опасаюсь, что это будет лишним засорением памяти. // Появилась ещё идея, после ввода переменных var1-5 выполнить код: data = nil. Что скажете? Edited August 18, 2017 by CharlySHOMAN Link to comment
LoveFist Posted August 23, 2017 Share Posted August 23, 2017 CharlySHOMAN, в этом нет необходимости. В Lua работает сборщик мусора, после выполнения функции локальные переменные будут удалены. Подробнее можно почитать здесь Link to comment
Markn1 Posted September 9, 2017 Share Posted September 9, 2017 Как остановить анимацию через некоторое время? помогите с кодом. addEventHandler( "onPlayerChat", getRootElement(), function () setPedAnimation( source, "ped", "IDLE_chat", 1, false, true ) -- setTimer( function() setPedAnimation(source, false) end, 2000, 1) end ) Link to comment
Jonathan.P Posted September 19, 2017 Share Posted September 19, 2017 On 9/9/2017 at 07:29, Markn1 said: Как остановить анимацию через некоторое время? помогите с кодом. addEventHandler( "onPlayerChat", getRootElement(), function () setPedAnimation( source, "ped", "IDLE_chat", 1, false, true ) -- setTimer( function() setPedAnimation(source, false) end, 2000, 1)end ) 1. Ты не указал аргумент "игрок" функции внутри таймера, плюс не указал аргумент в функции "setTimer" 2. setPedAnimation(player, false) вроде как криво работает иногда, я не парюсь и юзаю быструю анимку везде 3. имей ввиду, что если игрок выйдет за эти 2 секунды, то при вызове функции в таймере в дебаге будет варнинг, т.к. игрока уже не будет и анимацию применять будет не к кому 4. вместо функции getRootElement() можно юзать глобальную переменную "root" addEventHandler( "onPlayerChat", root, function () setPedAnimation( source, "ped", "IDLE_chat", 1, false, true) setTimer( function(player) setPedAnimation(player, "BSKTBALL", "BBALL_idle_O", 1, false, false, true, false) end, 2000, 1, source) end ) Вопрос к знатокам: Допустим есть некоторая кустомная характеристика элемента (игрока или машины). Например, булевое значение "находится ли игрок в AFK" для игрока. Конечно, эту характеристику нужно синхронизировать для всех клиентов и сервера тоже(просто допустим, что того требует мод). Тут два способа построения системы: 1. Юзаем просто элемент дату: setElementData(player, "AFK", true) недостатки: - если будет много характеристик, элемент дата будет иметь огромное количество ключей, синхронизация которых будет кушать ресурсы, при этом не всегда важна быстрая синхронизация характеристик(например тот же афк) плюсы: - простота 2. Создаём отдельный ресурс, создаём таблицы с характеристиками на клиенте и сервере отдельно, пишем для них синхронизацию латентными триггерами(тем самым экономим ресурсы), экспортируем из него функции: afkPlayers = { -- [player1] = true, -- [player2] = false, } setPlayerAFK(player, true) --shared (client and server) isPlayerAFK(player) --shared плюсы: - более верно архитектурно (на мой взгляд) - экономия ресурсов (сомнительно, но на мой взгляд опять же) минусы: - больше кода Вопрос: что лучше и в каких случаях? Вопрос не касается самой системы AFK, а лишь архитектурной реализации системы "кустомных характеристик" на подобии встроенных "setElementModel", "setPedSkin". Link to comment
Markn1 Posted September 21, 2017 Share Posted September 21, 2017 (edited) Помогите с сохранением. К примеру хочу сохранить ак 47 навык, плохо разбираюсь, первый раз работаю с бд В мета: <oop>true</oop> прописал. В дебаге ошибок нету. Получилось сделать сохранение с жизней и броней, а вот с навыками - нет createDB = dbConnect("sqlite","skillsave.db") if createDB then outputDebugString("Да") else outputDebugString("Нет") end addEventHandler("onResourceStart",resourceRoot, function() if createDB then local tabela = dbExec(createDB,"CREATE TABLE IF NOT EXISTS skillsave(login TEXT, skills FLOAT NOT NULL)") else return end end ) addEventHandler("onPlayerLogin",getRootElement(), function() local login = getAccountName ( source:getAccount() ) local q = dbQuery(createDB,"SELECT rowid,* FROM skillsave WHERE login=?", login) local result = dbPoll(q,-1) if result then for _,row in ipairs(result) do source:setData("ID",row["rowid"]) source:setPedStat(row["skills"], 77) end end end ) addEventHandler("onPlayerQuit",root, function() local lp = source local pl = getPlayerAccount( lp ) local login = getAccountName ( pl ) local skills = getPedStat (lp, 77) local q = dbQuery(createDB, "SELECT * FROM skillsave WHERE login=?",login) local result = dbPoll(q,-1) dbFree(q) if #result == 0 then dbQuery(createDB,"INSERT INTO skillsave (login,skills) VALUES (?,?)",login,skills) outputDebugString("отправил") elseif #result == 1 then dbExec(createDB,"UPDATE skillsave SET skills=?,WHERE login=?",skills,login) end end ) Edited September 21, 2017 by Markn1 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