Jump to content

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


Recommended Posts

addEventHandler ( 'onGamemodeMapStart', root, 
    function ( mapres ) 
        getMapDuration ( mapres ); 
    end 
) 
  
function getMapDuration ( mRes ) 
    local meta = xmlLoadFile ( ':' .. getResourceName ( mRes ) .. '/' .. 'meta.xml' ); 
    local mapnode = xmlFindChild ( meta, 'settings', 0 ); 
    if mapnode then 
        for i = 1,14 do -- Обычно 14 штук их.. 
            local mapnode = xmlFindChild ( mapnode, 'setting', i ); 
            local filename = mapnode and xmlNodeGetAttribute ( mapnode, 'name' ); 
            if filename == "#duration" then 
                local result = mapnode and xmlNodeGetAttribute ( mapnode, 'value' ); 
                outputChatBox ( timeToString ( getNumberFromText ( result ) ) ); 
            end 
        end 
        return false 
    end 
    return false 
end 
  
function timeToString ( seconds ) 
    local miliseconds = seconds * 60 * 1000; 
    --local seconds = math.floor ( miliseconds / 1000 ); 
    local minutes = math.floor( seconds / 60 ); 
    miliseconds = miliseconds - ( seconds * 1000 ); 
    seconds = seconds - ( minutes * 60 ); 
    if seconds < 10 then 
        seconds = "0" .. seconds; 
    end 
    if miliseconds < 100 then 
        miliseconds = "0" .. miliseconds; 
    elseif miliseconds < 10 then 
        miliseconds = "00" .. miliseconds; 
    end 
    return minutes .. ":" .. seconds .. ":" .. string.sub ( tostring ( miliseconds ) , 0, 3 ); 
end 
  
--Ty Flaker 
function getNumberFromText ( rText ) 
    rText = tostring ( rText ); 
    local s = string.gsub ( rText, '[[-|]', ' ' ); 
    return tonumber ( s ); 
end 

b089294a45ca.png

Edited by Guest
Link to comment
addEventHandler ( 'onGamemodeMapStart', root, 
    function ( mapres ) 
        getMapDuration ( mapres ); 
    end 
) 
  
function getMapDuration ( map ) 
    local meta = xmlLoadFile ( ':' .. getResourceName ( map ) .. '/' .. 'meta.xml' ); 
    local mapnode = xmlFindChild ( meta, 'map', 0 ) or xmlFindChild ( meta, 'race', 0 ) 
    local filename = mapnode and xmlNodeGetAttribute ( mapnode, 'src' ); 
    xmlUnloadFile ( meta ); 
    if filename then 
        local map = xmlLoadFile ( ':' .. getResourceName ( map ) .. '/' .. filename ); 
        if map then 
            local result = xmlFindChild ( map, 'duration', 0 ); 
            outputChatBox ( result ); 
            xmlUnloadFile ( map ); 
        end 
    end 
    return false 
end 
  

Спасибо.

Link to comment
addEventHandler ( 'onGamemodeMapStart', root, 
    function ( mapres ) 
        getMapDuration ( mapres ); 
    end 
) 
  
function getMapDuration ( map ) 
    local meta = xmlLoadFile ( ':' .. getResourceName ( map ) .. '/' .. 'meta.xml' ); 
    local mapnode = xmlFindChild ( meta, 'map', 0 ) or xmlFindChild ( meta, 'race', 0 ) 
    local filename = mapnode and xmlNodeGetAttribute ( mapnode, 'src' ); 
    xmlUnloadFile ( meta ); 
    if filename then 
        local map = xmlLoadFile ( ':' .. getResourceName ( map ) .. '/' .. filename ); 
        if map then 
            local result = xmlFindChild ( map, 'duration', 0 ); 
            outputChatBox ( result ); 
            xmlUnloadFile ( map ); 
        end 
    end 
    return false 
end 
  

Спасибо.

код не правильный :D щас

edit -- обновил

Link to comment

Здравствуйте, как сделать, чтобы можно было домножать на дробное число какое-либо значение или прибавлять к нему, например, пишу в функции "значение + 5.8", после выполнения функции в scoreboard выводит прежнее значение + 5, а не 5.8.

Link to comment
Здравствуйте, как сделать, чтобы можно было домножать на дробное число какое-либо значение или прибавлять к нему, например, пишу в функции "значение + 5.8", после выполнения функции в scoreboard выводит прежнее значение + 5, а не 5.8.

ищи math.floor в коде...

Link to comment

Привет всем. Делаю тут мод свой и возник у меня вопрос.

У игрока проигрывается анимация будто он плывет под водой (но происходит все дело на суше). Он должен так "доплыть" некоторое расстояние по прямой, попутно передвигая персонажа левее или правее и собирая пикапы. Но я что то не могу придумать, как мне его передвигать в сторону. setElementPosition сбивает анимацию. Есть у кого идеи, как мне сделать так, чтоб можно было персонажа двигать?

Вот, если что, как я устанавливаю анимацию:

setPedAnimation ( localPlayer, "SWIM", "Swim_Under", -1, true, true, false, true ) 

Link to comment

Дело в том, что не math.round, не math.floor, не math.ceil нет. Там проще, вот простой пример

local playerCount = getPlayerCount() 
local pointsToWin = playerCount *5.8 

.

Вот сервер и читает только цифры до какого-либо знака препинания. Есть предложения? Просто очень нужно домножить именно на десятичную дробь :)

Link to comment
Привет всем. Делаю тут мод свой и возник у меня вопрос.

У игрока проигрывается анимация будто он плывет под водой (но происходит все дело на суше). Он должен так "доплыть" некоторое расстояние по прямой, попутно передвигая персонажа левее или правее и собирая пикапы. Но я что то не могу придумать, как мне его передвигать в сторону. setElementPosition сбивает анимацию. Есть у кого идеи, как мне сделать так, чтоб можно было персонажа двигать?

Вот, если что, как я устанавливаю анимацию:

setPedAnimation ( localPlayer, "SWIM", "Swim_Under", -1, true, true, false, true ) 

Попробуйте вот такой код со стороны сервера.

  
-- DDC OMG generated script, PLACE IT SERVER-SIDE 
  
function omg_script27() 
  omg5969 = createObject(7586, 3765.3308105469, -2551.1330566406, 31.09373664856, 0, 0, 0) 
  omgMoveomg5969(1) 
end 
  
function omgMoveomg5969(point) 
  if point == 1 then 
    moveObject(omg5969, 5000, 3765.3308105469, -2551.1330566406, 45.09373664856, 0, 0, 90) 
    setTimer(omgMoveomg5969, 5000, 1, 2) 
  elseif point == 2 then 
    moveObject(omg5969, 5000, 3765.3308105469, -2551.1330566406, 50.09373664856, 0, 0, 90) 
    setTimer(omgMoveomg5969, 5000, 1, 3) 
  elseif point == 3 then 
    moveObject(omg5969, 5000, 3765.3308105469, -2551.1330566406, 60.09373664856, 0, 0, 90) 
    setTimer(omgMoveomg5969, 5000, 1, 4) 
  elseif point == 4 then 
    moveObject(omg5969, 5000, 3765.3308105469, -2551.1330566406, 50.09373664856, 0, 0, 90) 
    setTimer(omgMoveomg5969, 5000, 1, 5) 
  elseif point == 5 then 
    moveObject(omg5969, 5000, 3765.3308105469, -2551.1330566406, 31.09373664856, 0, 0, 0) 
    setTimer(omgMoveomg5969, 5000, 1, 1) 
  end 
end 
  
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), omg_script27) 

или вот, но одно и тоже, только объекты разные :)

function omg_CJCHRISCRATE() 
  CJCHRISCRATE = createObject(2669, 2508.1999511719, -1671.1999511719, 13.699999809265, 0, 0, 0) 
  omgMoveCJCHRISCRATE(1) 
end 
  
function omgMoveCJCHRISCRATE(point) 
  if point == 1 then 
    moveObject(CJCHRISCRATE, 5000, 2498.5, -1671.4000244141, 13.699999809265, 0, 0, 0) 
    setTimer(omgMoveCJCHRISCRATE, 5000, 1, 2) 
  elseif point == 2 then 
    moveObject(CJCHRISCRATE, 5000, 2508.1999511719, -1671.1999511719, 13.699999809265, 0, 0, 0) 
    setTimer(omgMoveCJCHRISCRATE, 5000, 1, 1) 
  end 
end 
  
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), omg_CJCHRISCRATE) 

Link to comment
Дело в том, что не math.round, не math.floor, не math.ceil нет. Там проще, вот простой пример
local playerCount = getPlayerCount() 
local pointsToWin = playerCount *5.8 

.

Вот сервер и читает только цифры до какого-либо знака препинания. Есть предложения? Просто очень нужно домножить именно на десятичную дробь :)

Я так понял, ты хочешь округление до определенного знака?

Ну вот накидал функцию:

num - число которое округлять

accuracy - кол-во знаков до которого округлять

function myRound(num, accuracy) 
    return math.floor(num*10^accuracy) / 10^accuracy; 
end 
  
local dd = 124.12324 
local sd = 1 
print(myRound(dd, sd)) 

Link to comment

Эх, не получается, все функции перебрал, даже math.abs, которая должна показывать число так, как оно есть.

Я так понял, ты хочешь округление до определенного знака?

Нет, я наоборот не хочу округления, а он округляет. Причём, при math.abs в чат выводит 5.8, а в scoreboard пишет ровно 5.

outputChatBox("[Test] " .. getPlayerName(source).. " got "..pointsToWin, getRootElement(), 255, 255, 255, true ) 

Link to comment
Ну ищи код с округлением сам...

В том коде, что ты давал округления нет...

Это весь код вычисления, остального ничего нет, ну если хотите вот полный код.

exports [ 'scoreboard' ]:addScoreboardColumn ( "Points" ) 
  
function refreshData() 
 for k, v in ipairs (getElementsByType("player")) do 
      local account = getPlayerAccount( v ) 
      if isGuestAccount(account) then 
      setElementData( v, "Points", "Guest" ) 
     else 
 local data = getAccountData(getPlayerAccount( v ), "Points" ) 
  if data then 
  setElementData( v, "Points", data ) 
  end 
 end 
end 
end 
setTimer( refreshData, 1000, 0 ) 
  
function raceWin( rank ) 
local acc = getPlayerAccount( source ) 
local ptzData = getAccountData( acc, "Points" ) 
    local playerCount = getPlayerCount() 
    local pointswin = playerCount *5.8 
    if rank == 1 then 
        if ptzData then 
              setAccountData( acc, "Points", ptzData + pointswin ) 
    outputChatBox("[Test] " .. getPlayerName(source).. " got "..pointswin, getRootElement(), 255, 255, 255, true ) 
    end 
end 
addEventHandler("onPlayerFinish", getRootElement(), raceWin) 
  

Link to comment

Не оптимизированнный код и не понятный в плане логики. Ты можешь хранить все значения в элемент дате и сохранять уже в аккаунт дате именно тогда, когда игрок выходит из сервера, а у тебя вообще не то ..

Вообщем я расписал небольшой алгоритм действий, который тебе нужно выполнить:

1.

exports[ 'scoreboard' ]:addScoreboardColumn( 'Points' ) 

2. Когда игрок залогинелся, то применяем к элемент дате игрока очки из аккаунт даты если они есть, а если данных из аккаунта нету, то 0.

3. Когда игрок финиширует, то просто получай элемент дату игрока, который финишировал и прибавляй одно очко, ну а далее изменяй элемент дату.

4. Когда игрок выходит из сервера или выходит из аккаунта, то получай элемент дату игрока и сохраняй её в аккаунт дате.

Link to comment

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

просто убьёт твой сервер, когда будет игроков 10
Link to comment
Спасибо за алгоритм, обязательно исправлю старый код на новый. Но мне интересно, мой же код тоже работает, почему он
просто убьёт твой сервер, когда будет игроков 10

во 1 у тебя будет ошибка, т.к ты пропустил end в raceWin

во 2

смотри

каждую секунду в твой дом прибегают 10 или 20 человек, которых ты не знаешь, ты например выгоняешь их, и через секунду они опять приходят и так бесконечно.

в3 опять же 10 или 20 человек приходят тебе в дом, и ты их впускаешь и кормишь их, получается что ты кормишь их каждую секунду

не проще ли сделать это 1 раз и выгнать людей тоже 1 раз?

в4

всем этим игрокам ты присваиваешь дату, то есть это 20 запросов в базу данных sql каждую секунду

представь например у тебя там за 2 месяца акков 1500 накопилось, на них есть эти данные, то есть sql запрос ищет в этой таблице игрока, берёт данные, записывает, зачем тебе этот геморой?

если можно сделать только ОДНОМУ игроку, который финишировал

Link to comment

Как воспроизвести звук из STREAM/Ambience?

Или playSoundFrontEnd это может? А то ведь на вики я посмотрел

0 - 20 Selection sounds

27 - 30 Bullet sounds

32 - 33 Selection sounds

а ведь эти звуки выстрелов находятся в папке SFX

5ac5db97c886.jpg

. Я конечно могу просто выцепить звук и юзануть playSound3D, но экономия ресов мне как-то более по душе. Вобщем есть ли возможность воспроизвести звук из STREAM'a?

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