Jump to content

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


Recommended Posts

  K1parik said:
Подскажите как можно редактировать данные игрока в userdata в файле internal.db при условии что этого игрока нет в онлайне?
local acc = getAccount( "логин игрока" ); 
setAccountData( acc, "что-то", "значение чего-то" ); 

И это не userdata. userdata это тип данных в Lua. В нем хранятся такие данные, которые "даются" Lua оттуда, куда он был встроен.

  Kenix said:
Редактировать базу данных можешь через db функции. (dbConnect, dbQuery, ... )

https://wiki.multitheftauto.com/wiki/Se ... _functions

Бред написал:(

dbConnect и dbQuery вообще не для локальных(которые от сервера МТА) БД. Есть executeSQLQuery для локальных, но не для internal.db

Link to comment
  Elengar said:
  Kenix said:
Редактировать базу данных можешь через db функции. (dbConnect, dbQuery, ... )

https://wiki.multitheftauto.com/wiki/Se ... _functions

Бред написал:(

dbConnect и dbQuery вообще не для локальных(которые от сервера МТА) БД. Есть executeSQLQuery для локальных, но не для internal.db

Читаем Wiki:

host: The target to connect to. The format of this depends on the database type.

>>For SQLite it is a filepath to a SQLite database file. If the filepath starts with ":/" then the server's global databases directory is used. The file will be created if it does not exist.

  Elengar said:
Есть executeSQLQuery для локальных, но не для internal.db

Я где-то указал executeSQLQuery? Я написал db функции.

Можно пользоваться как и db функциями, так и функциями аккаунта.

P.S через db функции в данном случае можно открывать только внутри databases директории, моя вина.

Придираться ко мне не надо.

Link to comment

Всем привет!

Ребята помогите решить проблему

Есть таблицы

  
local sw, sh = guiGetScreenSize() 
local move = false 
local rpos = {} -- rectangle 
local ipos = {} -- image 
  

Рендерим dx элементы

  
addEventHandler('onClientRender', root, function () 
    local rx = 0 
    for i = 1, 4 do -- 1 цикл 
        rpos[i] = {x = 100 + rx, y = 100} -- задаем таблице координаты rectangle 
        dxDrawRectangle(bpos[i].x, bpos[i].y, 64, 64, tocolor(100, 100, 100, 225)) 
        rx = rx + 64 
    end 
    for i = 1, 2 do -- 2 цикл 
        ipos[i] = rpos[i] -- копируем коориданаты 1 и 2 rectangle 
        dxDrawImage(ipos[i].x, ipos[i].y, 64, 64, 'image.jpg') 
    end 
    if (move) then -- для мув элемента 
        local cx, cy = getCursorPosition() 
        dxDrawRectangle(sw * cx, sh * cy, 64, 64, tocolor(100, 100, 100, 225)) 
        dxDrawImage(sw * cx, sh * cy, 64, 64, 'image.jpg') 
    end 
end) 
  
addEventHandler('onClientClick', root, function (button, state, x, y) -- для мув элемента 
    if (button == 'left' and state == 'up') then 
        for i = 1, #ipos do 
            -- используем таблицу ipos т.к в нем координаты 1 и 2 dx элемента 
            if (x >= ipos[i].x and x <= ipos[i].x + 64) and (y > ipos[i].y and y < ipos[i].y + 64) then 
                if (not move) then 
                    move = true 
                end 
                outputChatBox('Click dx element') 
            else 
                if (move) then 
                    move = false 
                end 
            end 
        end 
    end 
end) 
  

Проблема в том что при использование цикла

  
for i = 1, #ipos do 
    -- todo 
end 
  

можно мувнуть только первый dx элемент, я не могу мувнуть второй элемент, а при использование иного цикла

  
for i, coord in pairs(ipos) do 
    -- todo 
end 
  

можно мувнуть только второй dx элемент, я не могу мувнуть первый элемент

Но при этом сообщение выводиться нормально...

Помогите пожалуйста

Link to comment
  obuhhh said:
  K1parik said:
Подскажите как округлить число? Что бы без лишних знаков после точки. Например вместо 123.456 было 123
math.ceil(123.45) 
>>124 
math.floor(123.45) 
>>123 
  

obuhhh, тебя питон не кусал?

function round(num, idp) 
  local mult = 10^(idp or 0) 
  return math.floor(num * mult + 0.5) / mult 
end 

idp - количество знаков после точки

Варианты, предложенные obuhhh'ом не правильно работают на отрицательных числах.

Link to comment
  Elengar said:
Варианты, предложенные obuhhh'ом не правильно работают на отрицательных числах.

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

  
print( math.ceil( -10.1 ) ); --  -10 
print( math.floor( -10.1 ) ); -- -11 
  

Link to comment
  Kenix said:
  Elengar said:
Варианты, предложенные obuhhh'ом не правильно работают на отрицательных числах.

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

  
print( math.ceil( -10.1 ) ); --  -10 
print( math.floor( -10.1 ) ); -- -11 
  

С точки зрения поставленного вопроса (отбрасывание не целой части числа, truncate) они работают не правильно.

А вообще эти функции работают правильно. Например floor - пол, т.е. округление к меньшему числу. Если представить это на координатной прямой, то меньшее целое лежит всегда левее, вот оно и в случае с отрицательными будет по модулю на еденицу больше. С ceil аналогично в случае положительных чисел.

Конечно, можно сделать более просто, (x > 0 and math.ceil(x) or math.floor(x)), чем та функция, которую я дал. Почему я дал именно ту функцию? Ну, а вдруг вопрос не правильно поставлен и ему нужно что-то другое.

Link to comment
  Elengar said:

С точки зрения поставленного вопроса (отбрасывание не целой части числа, truncate) они работают не правильно.

А вообще эти функции работают правильно. Например floor - пол, т.е. округление к меньшему числу. Если представить это на координатной прямой, то меньшее целое лежит всегда левее, вот оно и в случае с отрицательными будет по модулю на еденицу больше. С ceil аналогично в случае положительных чисел.

Конечно, можно сделать более просто, (x > 0 and math.ceil(x) or math.floor(x)), чем та функция, которую я дал. Почему я дал именно ту функцию? Ну, а вдруг вопрос не правильно поставлен и ему нужно что-то другое.

да мне там не критично +-1 так что вариант вполне подходящий и довольно простой

Link to comment
  • 2 weeks later...

Еще один вопрос)

Есть точка. Ее х,у координаты выпадают случайным образом, z координата берется с помощью getGroundPosition. Как можно проверить находится эта точка под водой или нет? А то получается так, что если игрок в ней спавнится то просто бегает по дну моря/реки. Пробовал после спавна проверять через isElementInWater но она работает только при условии что игрок умер в воде и в ней же появился.

Link to comment
  K1parik said:
Еще один вопрос)

Есть точка. Ее х,у координаты выпадают случайным образом, z координата берется с помощью getGroundPosition. Как можно проверить находится эта точка под водой или нет? А то получается так, что если игрок в ней спавнится то просто бегает по дну моря/реки. Пробовал после спавна проверять через isElementInWater но она работает только при условии что игрок умер в воде и в ней же появился.

Не уверен, но можно попробовать testLineAgainstWater.

Edited by Guest
Link to comment
  K1parik said:
Еще один вопрос)

Есть точка. Ее х,у координаты выпадают случайным образом, z координата берется с помощью getGroundPosition. Как можно проверить находится эта точка под водой или нет? А то получается так, что если игрок в ней спавнится то просто бегает по дну моря/реки. Пробовал после спавна проверять через isElementInWater но она работает только при условии что игрок умер в воде и в ней же появился.

Вся стандартная вода размещена на высоте 0, то-есть если твой z < 1 значит это скорее всего вода.

Link to comment
  FranklinRoosevelt said:

Вся стандартная вода размещена на высоте 0, то-есть если твой z < 1 значит это скорее всего вода.

Нет, есть несколько мест, где это правило не применимо, например, карьер.

Link to comment
  FranklinRoosevelt said:
  K1parik said:
Еще один вопрос)

Есть точка. Ее х,у координаты выпадают случайным образом, z координата берется с помощью getGroundPosition. Как можно проверить находится эта точка под водой или нет? А то получается так, что если игрок в ней спавнится то просто бегает по дну моря/реки. Пробовал после спавна проверять через isElementInWater но она работает только при условии что игрок умер в воде и в ней же появился.

Вся стандартная вода размещена на высоте 0, то-есть если твой z < 1 значит это скорее всего вода.

плотина и куча бассейнов не на нуле

Link to comment
  • 2 weeks later...
  • Other Languages Moderators
  Jonathan.P said:
Хочу сделать одометр. Правильно ли будет доверить такие вычисления клиентам? Имею ввиду одометр не на каждого клиента, а на каждую машину.

Как бы вычисления проводи на клиенте, а передавай значения в БД на сервере.

Link to comment
  K1parik said:
Подскажите как посчитать количество игроков с определенной getElementData?
  
local count = 0 
for i,player in ipairs(getElementsByType("player")) do 
    if getElementData(player,"yourdata") then 
     count=count+1 
    end 
end 
outputChatBox("Количество игроков с определенной getElementData: "..tostring(count)) 
  

Link to comment

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...