Memory
Members-
Posts
383 -
Joined
-
Last visited
Everything posted by Memory
-
Подскажите пожалуйста, как отсортировать игроков, которые имеют больше всего поинтов из кода ниже. Попробовал сделать, но выдаёт только онлайн игроков. function top(player) for i,v in ipairs(getElementsByType("player")) do -- get all players if(getElementData ( v, "Points" )>1)then topPoints[ getPlayerName(v) ] = " points: " .. getElementData ( v, "Points" ) -- insert him into the table with his money end end for i,v in pairs(topPoints) do table.sort(topPoints) -- sorting outputChatBox("Top players " .. i .. " Points: " .. v,player) end end addCommandHandler("top",top)
-
Спасибо
-
Здравствуйте, помогите разобраться с SQL, на примере этого кода. Вот с "onResStart" и "onPlayerQuit" понятно. Но вот "onJoin", что-то никак не могу его заставить работать. Я перерыл много кодов на форуме, чтобы разобраться в этом, но увы. Хочу сделать по такому алгоритму: при Join получить из базы Points и послать их игроку setElementData, а при Quit получить Points (getElementData) и послать в базу. function onResStart () executeSQLCreateTable ( "Points", "serial TEXT, points INT" ) end addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), onResStart) -------------------------------- function onJoin () local serial = getPlayerSerial(source) local getPoints = executeSQLSelect("Points", "points", "serial='"..serial.."'") if getPoints == false then executeSQLInsert ( "Points", "'"..serial.."', '0'" ) setElementData(source, "Points", 0) else setElementData(source, "Points", tonumber(getPoints[1]["points"])) end end addEventHandler("onPlayerJoin", getRootElement(), onJoin) ---------------------------------------- function onPlayerQuit() local getActualPoints = getElementData(source, "Points") local serial = getPlayerSerial(source) executeSQLUpdate ( "Points", "points = '"..tonumber(getActualPoints).."'","serial = '" ..serial.. "'" ) end addEventHandler("onPlayerQuit", getRootElement(), onPlayerQuit)
-
I fix it. local amountOfTopsToDisplay = 3 -- how many tops you need addCommandHandler("top", function(player, command, value) fileindex = xmlLoadFile("users.xml") -- load file file = xmlFindChild ( fileindex, "user", 0 ) if file then -- if file exists if value == "wins" or value == "points" or value == "second" or value == "third" then -- if syntax is right local tableOrder = {} -- make a table local subTable = {} -- make a sub table for i,v in ipairs(xmlNodeGetChildren(file)) do -- get children from file subTable.name = xmlNodeGetAttribute(v, "Name") -- name goes in subTable subTable.data = xmlNodeGetAttribute(v, value) -- data goes in subTable table.insert(tableOrder, subTable) -- subTable is inserted in bigger table subTable = {} -- empty subTable for next loop end table.sort(tableOrder, function(a,b) return tonumber(a.data) > tonumber(b.data) end) -- put data in order outputChatBox("Displaying top "..value, player, 255,255,255,true) for i,v in ipairs(tableOrder) do -- loop the sorted table outputChatBox(i..": "..v.name.." - "..v.data, player, 255,255,255,true) -- display in order if i == amountOfTopsToDisplay then break end -- when enough tops has been shown, break it end else outputChatBox("Syntax : /top [wins|points|second|third]", player, 255,255,255,true) -- show the correct syntax if he got it wrong end xmlUnloadFile(fileindex) -- unload the file from memory end end )
-
Спасибо, благодаря этому я нашёл где можно поменять. Оказывается в race прямо в админ панель можно менять, ставишь 0 и всё. Спасибо ещё раз.
-
Thanks, but code have error and I can't fix it. Error ":20 atempt to concantenate field 'data' (a boolean value)" local amountOfTopsToDisplay = 3 -- how many tops you need addCommandHandler("top", function(player, command, value) local fileindex = xmlLoadFile("users.xml") -- load file local file = xmlNodeGetChildren(fileindex) if file then -- if file exists if value == "wins" or value == "points" or value == "second" or value == "third" then -- if syntax is right local tableOrder = {} -- make a table local subTable = {} -- make a sub table for i,v in ipairs(xmlNodeGetChildren(fileindex)) do -- get children from file subTable.name = xmlNodeGetAttribute(v, "nick") -- name goes in subTable subTable.data = xmlNodeGetAttribute(v, value) -- data goes in subTable table.insert(tableOrder, subTable) -- subTable is inserted in bigger table subTable = {} -- empty subTable for next loop end table.sort(tableOrder, function(a,b) return tonumber(a.data) > tonumber(b.data) end) -- put data in order outputChatBox("Displaying top "..value, player, 255,255,255,true) for i,v in ipairs(tableOrder) do -- loop the sorted table outputChatBox(i..": "..v.name.." - "..v.data, player, 255,255,255,true) -- display in order if i == amountOfTopsToDisplay then break end -- when enough tops has been shown, break it end else outputChatBox("Syntax : /top [wins|points|second|third]", player, 255,255,255,true) -- show the correct syntax if he got it wrong end xmlUnloadFile(fileindex) -- unload the file from memory end end )
-
Подскажите, пожалуйста, как убрать "расплытие" экрана при активации азота. (Опять поднимаю вопрос, так как на предыдущий уже никто не ответит)
-
Подскажите, пожалуйста, как убрать "расплытие" экрана при активации азота.
-
Hello, please, fix error in 19 line. And if add this code to client, for send values to GUI, he will work? Or I must use this through triggerServerEvent?
-
Hello, please, help me create Top ten panel. Server function sortAccounts( ) local rowdata = { } for _, account in pairs( getAccounts( ) ) do rowdata[ #rowdata + 1 ] = { account = getAccountName( account ), points = getAccountData( account,"Points" ) } end table.sort( rowdata, function ( a, b ) return ( tonumber( a.points ) or 0 ) > ( tonumber( b.points ) or 0 ) end ) return rowdata end function tables( ) outputChatBox( "Top 10 points:", root, 255,255,255 ) for index, data in ipairs( sortAccounts( ) ) do outputChatBox(tostring( index )..": ".. tostring( data.account ) .." - ".. tostring( data.points ), root, 255, 255, 255 ) if index == 10 then break end end triggerClientEvent( 'onAccountsSend',root,sortAccounts( ) ) end addEvent("onSortTopTen", true) addEventHandler("onSortTopTen", root, tables) addCommandHandler( "top", tables ) Client function clientsideResourceStart () local playerList = guiCreateGridList ( 0.80, 0.10, 0.15, 0.60, true ) local column = guiGridListAddColumn( playerList, "Player", 0.6 ) local points = guiGridListAddColumn( playerList, "Points", 0.3 ) if ( column ) then triggerServerEvent("onSortTopTen", getLocalPlayer()) local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, column, data.account, false, false ) end if ( points ) then triggerServerEvent("onSortTopTen", getLocalPlayer()) local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, points, data.points, false, false ) end end addEventHandler ( "onClientResourceStart", getResourceRootElement(), clientsideResourceStart )
-
Это типа такого, да? (не проверял) сервер function sortAccounts( ) local rowdata = { } for _, account in pairs( getAccounts( ) ) do rowdata[ #rowdata + 1 ] = { account = getAccountName( account ), points = getAccountData( account,"Points" ) } end table.sort( rowdata, function ( a, b ) return ( tonumber( a.points ) or 0 ) > ( tonumber( b.points ) or 0 ) end ) return rowdata end function tables( ) outputChatBox( "Top 7 points:", root, 255,255,255 ) for index, data in ipairs( sortAccounts( ) ) do outputChatBox(tostring( index )..": ".. tostring( data.account ) .." - ".. tostring( data.points ), root, 255, 255, 255 ) if index == 7 then break end end triggerClientEvent( 'onAccountsSend',root,sortAccounts( ) ) end addEvent("onSortTopTen", true) addEventHandler("onSortTopTen", root, tables) addCommandHandler( "top", tables ) клиент function clientsideResourceStart () local playerList = guiCreateGridList ( 0.80, 0.10, 0.15, 0.60, true ) local column = guiGridListAddColumn( playerList, "Player", 0.6 ) local points = guiGridListAddColumn( playerList, "Points", 0.3 ) if ( column ) then triggerServerEvent("onSortTopTen", getLocalPlayer()) local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, column, data.account, false, false ) end if ( points ) then triggerServerEvent("onSortTopTen", getLocalPlayer()) local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, points, data.points, false, false ) end end addEventHandler ( "onClientResourceStart", getResourceRootElement(), clientsideResourceStart ) И ещё попутно вопрос, игроки жалуются на "размытие" экрана при азоте, как это убрать, что-то искал нигде не нашёл.
-
Здравствуйте, у меня опять возник вопрос Как можно вызвать функцию sortAccounts c сервера сюда for index, data in ipairs( sortAccounts( ) ) do. Конечно, я думаю, вызвать надо через triggerServerEvent, но как её заставить работать в нужном месте, с этим у меня проблемы. Сервер function sortAccounts( ) local rowdata = { } for _, account in pairs( getAccounts( ) ) do rowdata[ #rowdata + 1 ] = { account = getAccountName( account ), points = getAccountData( account,"Points" ) } end table.sort( rowdata, function ( a, b ) return ( tonumber( a.points ) or 0 ) > ( tonumber( b.points ) or 0 ) end ) return rowdata end Клиент, открывается при старте ресурса, но потом сделаю нормальное gui function clientsideResourceStart () local playerList = guiCreateGridList ( 0.80, 0.10, 0.15, 0.60, true ) local column = guiGridListAddColumn( playerList, "Player", 0.6 ) local points = guiGridListAddColumn( playerList, "Points", 0.3 ) if ( column ) then for index, data in ipairs( sortAccounts( ) ) do local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, column, getPlayerName ( data.account), false, false ) if index == 7 then break end end end if ( points ) then for index, data in ipairs( sortAccounts( ) ) do local row = guiGridListAddRow ( playerList ) guiGridListSetItemText ( playerList, row, points, getPlayerName ( data.points), false, false ) if index == 7 then break end end end end addEventHandler ( "onClientResourceStart", getResourceRootElement(), clientsideResourceStart )
-
Действительно, простое и понятное объяснение, спасибо Скрипт уже переделал
-
Действительно, простое и понятное объяснение Скрипт уже переделал
-
Спасибо за алгоритм, обязательно исправлю старый код на новый. Но мне интересно, мой же код тоже работает, почему он
-
Это весь код вычисления, остального ничего нет, ну если хотите вот полный код. 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)
-
Эх, не получается, все функции перебрал, даже math.abs, которая должна показывать число так, как оно есть. Нет, я наоборот не хочу округления, а он округляет. Причём, при math.abs в чат выводит 5.8, а в scoreboard пишет ровно 5. outputChatBox("[Test] " .. getPlayerName(source).. " got "..pointsToWin, getRootElement(), 255, 255, 255, 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)
-
Дело в том, что не math.round, не math.floor, не math.ceil нет. Там проще, вот простой пример local playerCount = getPlayerCount() local pointsToWin = playerCount *5.8 . Вот сервер и читает только цифры до какого-либо знака препинания. Есть предложения? Просто очень нужно домножить именно на десятичную дробь
-
Здравствуйте, как сделать, чтобы можно было домножать на дробное число какое-либо значение или прибавлять к нему, например, пишу в функции "значение + 5.8", после выполнения функции в scoreboard выводит прежнее значение + 5, а не 5.8.
-
Flaker, Kenix, спасибо за помощь, буду дорабатывать
-
А то Так о проблеме, при команде /top в чате отображаются топ 10 игроков, ну это понятно, я думаю. Так я бы хотел теже топ 10 игроков, чтобы отображались в этом простом gui, а вот как послать туда отсортированных игроков подскажите, пожалуйста.
