Jump to content

Вопросы и ответы по MTA.


Recommended Posts

Всем доброго времени суток.

Вопрос, возможно, глупый, и тем не менее: если ставить MTA сервер на хостинг, запись/чтение файлов (XML, обычные, ...) будет работать нормально? Или нужно обязательно использовать БД SQL?

Link to comment

Я бы на твоем месте использовал бы СУБД MySQL (если ты также имеешь ввиду как лучше хранить данные), но вот только не на всех игровых хостингах могут предоставить это, так что лучше брать VPS и делать все самому.

Link to comment
Я бы на твоем месте использовал бы СУБД MySQL (если ты также имеешь ввиду как лучше хранить данные), но вот только не на всех игровых хостингах могут предоставить это, так что лучше брать VPS и делать все самому.

Извини, а на не-VPS MTA сервер сможет оперировать XML и обычными текстовыми файлами? Если забыть про эффективность?

Link to comment

Извини, а на не-VPS MTA сервер сможет оперировать XML и обычными текстовыми файлами? Если забыть про эффективность?

Если для хранения данных и раз нету внешней СУБД, то можно использовать внутреннюю.

executeSQLQuery 

Link to comment

Подскажите, как создать команду для передачи денег. При нажатии команды /pay [ник] [сумма] деньги от одного игрока будут переходить к другому.

Я смог найти функции, но не понимаю как их соединить и доработать.

function consoleGiveCash ( thePlayer, command, amount ) 
       givePlayerMoney ( thePlayer, amount ) 
  
end 
addCommandHandler ( "pay", consoleGiveCash ) 

function takeCash ( thePlayer, command, amount ) 
       takePlayerMoney ( thePlayer, tonumber(amount) ) 
end 

Link to comment
Подскажите, как создать команду для передачи денег. При нажатии команды /pay [ник] [сумма] деньги от одного игрока будут переходить к другому.

Я смог найти функции, но не понимаю как их соединить и доработать.

function consoleGiveCash ( thePlayer, command, amount, sum ) -- amount - первый аргумент (ник игрока), sum - второй (сумма) 
       givePlayerMoney ( getPlayerFromName(amount), sum ) 
       takePlayerMoney ( thePlayer, sum ) 
  
end 
addCommandHandler ( "pay", consoleGiveCash ) 

Link to comment
Подскажите, как создать команду для передачи денег. При нажатии команды /pay [ник] [сумма] деньги от одного игрока будут переходить к другому.

Я смог найти функции, но не понимаю как их соединить и доработать.

function consoleGiveCash ( thePlayer, command, amount, sum ) -- amount - первый аргумент (ник игрока), sum - второй (сумма) 
       givePlayerMoney ( getPlayerFromName(amount), sum ) 
       takePlayerMoney ( thePlayer, sum ) 
  
end 
addCommandHandler ( "pay", consoleGiveCash ) 

Всё. Собрал то что нужно. Спасибо за помощь)

Edited by Guest
Link to comment

И хотелось узнать, как сделать так, чтобы hp игроков каждые 15 секунд повышалось на 1hp и так до 100?

Я вот набросал что-то, но не работает.

setTimer( 
function() 
for k,v in ipairs(getElementsByType("player")) do 
if getTeamName(getPlayerTeam(v)) == "Staff" then 
setElementHealth(v, getElementHealth(v)+100)     
end 
end 
end, 100, 0) 

Link to comment

^ Спасибо большое. То, что нужно.

У меня вот есть две команды для того, чтобы открыть и закрыть автомобиль. А как сделать так, чтобы введя /lock один раз - автомобиль закрывался, а на второй раз открывался?

addCommandHandler ( "lock", doLockVehicle ) 
addCommandHandler ( "unlock", doUnlockVehicle ) 

Link to comment

Извини, а на не-VPS MTA сервер сможет оперировать XML и обычными текстовыми файлами? Если забыть про эффективность?

Если для хранения данных и раз нету внешней СУБД, то можно использовать внутреннюю.

executeSQLQuery 

Чем отличаются 'dbQuery' и 'executeSQLQuery'?

Link to comment
^ Спасибо большое. То, что нужно.

У меня вот есть две команды для того, чтобы открыть и закрыть автомобиль. А как сделать так, чтобы введя /lock один раз - автомобиль закрывался, а на второй раз открывался?

addCommandHandler ( "lock", doLockVehicle ) 
addCommandHandler ( "unlock", doUnlockVehicle ) 

Возможно, неправильно тебя понял, но:

  
-- Server Code 
-- Type 'lock' to lock/unlock current vehicle 
  
function doChangeLockState(player) 
    local veh = getPedOccupiedVehicle(player) 
  
    if veh then 
        local lock = true 
        local op = 'закрыто' 
  
        if isVehicleLocked(veh) then 
            lock = false 
            op = 'открыто' 
        end 
  
        if setVehicleLocked(veh, lock) then 
            return outputConsole("Ваше транспортное средство было "..op..".", player) 
        end 
    end 
end 
  
addCommandHandler("lock", doChangeLockState) 
  

Link to comment
^ Спасибо большое. То, что нужно.

У меня вот есть две команды для того, чтобы открыть и закрыть автомобиль. А как сделать так, чтобы введя /lock один раз - автомобиль закрывался, а на второй раз открывался?

addCommandHandler ( "lock", doLockVehicle ) 
addCommandHandler ( "unlock", doUnlockVehicle ) 

Возможно, неправильно тебя понял, но:

  
-- Server Code 
-- Type 'lock' to lock/unlock current vehicle 
  
function doChangeLockState(player) 
    local veh = getPedOccupiedVehicle(player) 
  
    if veh then 
        local lock = true 
        local op = 'закрыто' 
  
        if isVehicleLocked(veh) then 
            lock = false 
            op = 'открыто' 
        end 
  
        if setVehicleLocked(veh, lock) then 
            return outputConsole("Ваше транспортное средство было "..op..".", player) 
        end 
    end 
end 
  
addCommandHandler("lock", doChangeLockState) 
  

Оно работает, но теперь эта команда работает только в самом автомобиле. То есть, если вышел из автомобиля, то его больше не открыть.

Link to comment
addCommandHandler ( "lock", doLockVehicle ) 

Скинь функцию

-- player element data -- 
    -- cl_ownedvehicle
-- vehicle element data --
    -- cl_vehicleowner
    -- cl_vehiclelocked
    -- cl_enginestate
 
 
-- resource starts - ends
function initCarLocks ()
    -- Initilize Player Element Data
    local players = getElementsByType ( "player" )
    for k,p in ipairs(players) do
        removeElementData ( p, "cl_ownedvehicle" )
        bindKey ( p, "l", "down", doToggleLocked )
        bindKey ( p, "2", "down", doToggleEngine )
    end
 
    -- Initilize Vehicle Element Data
    local vehicles = getElementsByType ( "vehicle" )
    for k,v in ipairs(vehicles) do
        removeElementData ( v, "cl_vehicleowner" )
        removeElementData ( v, "cl_vehiclelocked" )
        removeElementData ( v, "cl_enginestate" )
        setVehicleLocked ( v, false )
        setVehicleOverrideLights ( v, 0 )
    end
end
addEventHandler ( "onResourceStart", getResourceRootElement ( getThisResource () ), initCarLocks )
addEventHandler ( "onResourceStop", getResourceRootElement ( getThisResource () ), initCarLocks )
 
-- player joins
function cl_PlayerJoin ( )
bindKey ( source, "2", "down", doToggleEngine )
 
end
addEventHandler ( "onPlayerJoin", getRootElement(), cl_PlayerJoin )
 
-- player quits
function cl_PlayerQuit ( )
    -- check for owned car
    local ownedVehicle = getElementData ( source, "cl_ownedvehicle" )
    if (ownedVehicle ~= false) then
        cl_RemoveVehicleOwner ( ownedVehicle )
    end
end
addEventHandler ( "onPlayerQuit", getRootElement(), cl_PlayerQuit )
 
-- player dies
function cl_PlayerWasted ( )
    -- check for owned car
    local ownedVehicle = getElementData ( source, "cl_ownedvehicle" )
    if (ownedVehicle ~= false) then
        cl_RemoveVehicleOwner ( ownedVehicle )
    end
end
addEventHandler ( "onPlayerWasted", getRootElement(), cl_PlayerWasted )
 
-- player tries to enter vehicle
function cl_VehicleStartEnter ( enteringPlayer, seat, jacked )
    local theVehicle = source
    local theOwner
    -- locked and not owner entering
    if ( getElementData ( theVehicle, "cl_vehiclelocked" ) == true ) then
        theOwner = getElementData ( theVehicle, "cl_vehicleowner" )
        if theOwner ~= false and theOwner ~= enteringPlayer then
            -- make sure they dont enter
            --cancelEvent();
        end
     end
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), cl_VehicleStartEnter )
 
-- player enters a vehicle
function cl_PlayerDriveVehicle ( player, seat, jacked )
    -- Driver Enter
    if ( seat == 0 ) then
        oldVehicle = getElementData ( player, "cl_ownedvehicle" )
        -- not entering player's own owned vehicle
        if ( (cl_VehicleLocked(source) == true) and (cl_VehicleOwner(source) ~= player) ) then
            removePedFromVehicle( player )
            Err_Msg("this vehicle is locked.", player)
            return false
        end
        -- set element data for vehicle and owner
        cl_SetVehicleOwner ( source, player )
    end
    return true
end
addEventHandler ( "onVehicleEnter", getRootElement(), cl_PlayerDriveVehicle )
 
-- vehicle respawns
function cl_VehicleRespawn ( exploded )
    cl_RemoveVehicleOwner ( source )
end
addEventHandler ( "OnVehicleRespawn", getRootElement(), cl_VehicleRespawn )
 
-- vehicle explosion
function cl_VehicleExplode ( )
    local theOwner = getElementData ( source, "cl_vehicleowner" )
    if ( theOwner ~= false ) then
        cl_RemoveVehicleOwner ( source )
    end
end
addEventHandler ( "onVehicleExplode", getRootElement(), cl_VehicleExplode )
 
-- set vehicle owner
function cl_SetVehicleOwner ( theVehicle, thePlayer )
    local oldVehicle = getElementData ( thePlayer, "cl_ownedvehicle" )
    if ( oldVehicle ~= false ) then
        -- unlock old car      
        removeElementData ( oldVehicle, "cl_vehicleowner" )
        removeElementData ( oldVehicle, "cl_vehiclelocked" )
        removeElementData ( oldVehicle, "cl_enginestate" )
        setVehicleLocked ( oldVehicle, false )
        -- set vars for new car
    end
    setElementData ( theVehicle, "cl_vehicleowner", thePlayer )
    setElementData ( theVehicle, "cl_vehiclelocked", false )
    setElementData ( thePlayer, "cl_ownedvehicle", theVehicle )
    setElementData( theVehicle, "cl_enginestate", true )
 
end
 
function cl_RemoveVehicleOwner ( theVehicle )
    local theOwner = getElementData ( theVehicle, "cl_vehicleowner" )
    if ( theOwner ~= false ) then
        removeElementData ( theOwner, "cl_ownedvehicle" )
        removeElementData ( theVehicle, "cl_vehicleowner" )
        removeElementData ( theVehicle, "cl_vehiclelocked" )
        removeElementData ( owned, "cl_enginestate" )
    end
    setVehicleLocked ( theVehicle, false )
 
end
 
-- flash the lights twice
function cl_FlashLights ( thePlayer )
    setTimer ( doToggleLights, 300, 4, thePlayer, true )
end
 
-- flash once
function cl_FlashOnce ( thePlayer )
    setTimer ( doToggleLights, 300, 2, thePlayer, true )
end
 
-- get vehicle owner ( according to vehicle's element data )
function cl_VehicleOwner ( theVehicle )
    return getElementData( theVehicle, "cl_vehicleowner" )
 
end
-- is vehicle locked ( according to vehicle's element data )
function cl_VehicleLocked ( theVehicle )
    return getElementData( theVehicle, "cl_vehiclelocked" )
end
-- messaging functions
-- send red error message
function Err_Msg ( strout, thePlayer )
    outputChatBox ( strout, thePlayer, 200, 0, 10 )
end
 
-- send message to all occupants of vehicle
function Car_Msg ( strout, theVehicle )
    numseats = getVehicleMaxPassengers ( theVehicle )
    for s = 0, numseats do
        local targetPlayer = getVehicleOccupant ( theVehicle, s )
        if targetPlayer ~= false then
            outputChatBox ( strout, targetPlayer, 30, 144, 255 )
        end
    end
end
-- send aquamarine message to player
function Info_Msg ( strout, thePlayer )
    outputChatBox ( strout, thePlayer, 102, 205, 170 )
end
 
-- commands
function doToggleLocked ( source )
    local theVehicle , strout
    if ( getElementType(source) == "vehicle" ) then
        theVehicle = source
    end
    if ( getElementType(source) == "player" ) then
        theVehicle = getElementData ( source, "cl_ownedvehicle" )
    end
 
    if ( theVehicle ) then
        local vehiclename = getVehicleName ( theVehicle )
        -- already locked
        if ( getElementData ( theVehicle, "cl_vehiclelocked") == true ) then
            doUnlockVehicle ( source )
        else
            doLockVehicle ( source )
        end
    else
        Err_Msg("Вы должны быть автомобиль, чтобы заблокировать или разблокировать его.", source)
    end
end 
 
function doLockVehicle ( source )
    local theVehicle , strout
    if ( getElementType(source) == "vehicle" ) then
        theVehicle = source
    end
    if ( getElementType(source) == "player" ) then
        theVehicle = getElementData ( source, "cl_ownedvehicle" )
    end
 
    if ( theVehicle ) then
        local vehiclename = getVehicleName ( theVehicle )
        -- already locked
        if ( getElementData ( theVehicle, "cl_vehiclelocked") == true ) then
            strout = "Ваш " .. vehiclename .. " уже заблокирован."
            Err_Msg(strout, source)
        else
            setElementData ( theVehicle, "cl_vehiclelocked", true)
            setVehicleLocked ( theVehicle, true )
            Car_Msg( "Текущие транспортное средство " .. vehiclename .. " закрыто.", theVehicle)
            Info_Msg ( "locked vehicle " .. vehiclename .. ".", source )
            if ( getVehicleController ( theVehicle ) == false ) then
                cl_FlashLights ( source )
            end
        end
    else
        Err_Msg("Вы должны быть автомобиль, чтобы зафиксировать ее.", source)
    end
end
 
function doUnlockVehicle ( source )
    local theVehicle, strout
    if ( getElementType(source) == "vehicle" ) then
        theVehicle = source
    end
    if ( getElementType(source) == "player" ) then
        theVehicle = getElementData ( source, "cl_ownedvehicle" )
    end
    if ( theVehicle ) then
    local vehiclename = getVehicleName ( theVehicle )
        if ( getElementData ( theVehicle, "cl_vehiclelocked") == false ) then
            strout = "Ваш " .. vehiclename .. " уже разблокирован."
            Err_Msg(strout, source)
        else
            setElementData ( theVehicle, "cl_vehiclelocked", false)
            setVehicleLocked ( theVehicle, false )
            Car_Msg( "Текущие транспортное средство " .. vehiclename .. " разблокировано.", theVehicle )
            Info_Msg ( "unlocked vehicle " .. vehiclename .. ".", source )
            if ( getVehicleController ( theVehicle ) == false ) then
                cl_FlashOnce ( source )
            end
        end
    else
        Err_Msg
Link to comment

Помогите пожалуйста. Выдаёт такую ошибку: "attempt to perform arithmetic on local 'lvls' (a nil value)"

И кто больше разбирается, то проверьте функцию на правильность. Изначально я хотел, чтобы каждый промежуток времени начислялись exp каждому игроку. И потом повышался его лвл. При вводе команды /mylevel чтобы в чат показывало уровень игрока. В чём моя ошибка?

addCommandHandler ( "mylevel", 
    function ( thePlayer ) 
                local myLevel = exports.exp_system:getPlayerLevel ( thePlayer ) 
        outputChatBox ( "Ваш уровень: ".. myLevel, thePlayer ) 
    end 
) 
  
function experience () 
    for i, pPlayer in ipairs( getElementsByType( "player" ) ) do 
        local pAccount = getPlayerAccount( pPlayer ) 
        local exp = getAccountData(pAccount, "exp") 
        local exps = tonumber(getAccountData(pAccount, "exp")) 
        local lvls = tonumber(getAccountData(pAccount, "lvl")) 
        local needexp = lvls * 4 
        if not exp then 
            setAccountData(pAccount, "exp", 1) 
            setAccountData(pAccount, "allexp", 1) 
            setAccountData(pAccount, "lvl", 1) 
            outputChatBox("Ваш опыт: " .. exps .. "/" .. needexp, getRootElement(), 0, 255, 0) 
        else 
            setAccountData(pAccount, "exp", exps + 1) 
            if exps == needexp then 
                setAccountData(pAccount, "lvl", lvls + 1) 
                setAccountData(pAccount, "exp", 1) 
                outputChatBox("Ваш уровень повышен до " .. lvls + 1 .. "!", getRootElement(), 0, 255, 0) 
            else 
                outputChatBox("Ваш опыт: " .. exps .. "/" .. needexp, getRootElement(), 0, 255, 0) 
            end 
        end 
    end 
end 
setTimer(experience, 3000, 0) 

Link to comment

function doLockVehicle ( source ) 
    local theVehicle , strout 
    if ( getElementType(source) == "vehicle" ) then 
        theVehicle = source 
    end 
    if ( getElementType(source) == "player" ) then 
        theVehicle = getElementData ( source, "cl_ownedvehicle" ) 
    end 
    if ( theVehicle ) then 
        local vehiclename = getVehicleName ( theVehicle ) 
        -- already locked 
            setElementData ( theVehicle, "cl_vehiclelocked", not isVehicleLocked(theVehicle)) 
            setVehicleLocked ( theVehicle, not isVehicleLocked(theVehicle)) 
            if isVehicleLocked(theVehicle) then 
                  Car_Msg( "Текущие транспортное средство " .. vehiclename .. " закрыто.", theVehicle) 
                  Info_Msg ( "locked vehicle " .. vehiclename .. ".", source ) 
            else 
                  Car_Msg( "Текущие транспортное средство " .. vehiclename .. " открыто.", theVehicle) 
                  Info_Msg ( "unlocked vehicle " .. vehiclename .. ".", source ) 
            end 
            if ( getVehicleController ( theVehicle ) == false ) then 
                cl_FlashLights ( source ) 
            end 
        end 
    else 
        Err_Msg("Вы должны быть автомобиле, чтобы закрыть/открыть его.", source) 
    end 
end 
  
function doToggleLocked ( source ) 
    local theVehicle , strout 
    if ( getElementType(source) == "vehicle" ) then 
        theVehicle = source 
    end 
    if ( getElementType(source) == "player" ) then 
        theVehicle = getElementData ( source, "cl_ownedvehicle" ) 
    end 
  
    if ( theVehicle ) then 
        local vehiclename = getVehicleName ( theVehicle ) 
        doLockVehicle ( source ) 
    else 
        Err_Msg("Вы должны быть автомобиле, чтобы заблокировать или разблокировать его.", source) 
    end 
end 

lvls и exps пустые. Если значения нет и x = get, а потом set, то x всё равно будет пустой.

local exps = tonumber(getAccountData(pAccount, "exp")) or 1 
local lvls = tonumber(getAccountData(pAccount, "lvl")) or 1 

Link to comment

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

SCRIPT ERROR: myserver\car\car_locks_server.lua:224: 'end' expected (to close 'function' at line 200) near 'else'

ERROR: Loading script failed: myserver\car\car_locks_server.lua:224: 'end' expected (to close 'function' at line 200) near 'else'

Link to comment

^Спасибо большое! Помогло)

И у меня очередная проблема. Я скачал ресурс slothbot и куда бы этот архив не пихал, при нажатии "start slothbot" мне выдаёт, что не видит этот ресурс. Куда его нужно кидать?

Если что, то путь к ресурсам у меня deathmatch > resources > myserver.

Link to comment

после resources все папки на пути ресурса должны быть в квадратных скобках. И для новых ресурсов нужно выполнить команду refresh, если после добавления сервер не был перезапущен.

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