Jump to content

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


Recommended Posts

ошибка в непонимании того, что вы делаете.

Логически здесь вроде как всё верно. LUA я изучаю от силы часа 4, вот, первый опыт...

Link to comment
  
-- type="client" 
function GotoPlayerToPlayer(commandname,playerName) 
    local thePlayer = getPlayerFromName( playerName ) 
    if thePlayer then 
       local x, y, z = getElementPosition( thePlayer) 
       local teleported = setElementPosition(localPlayer, x + 2, y, z); 
       if(teleported == false) then outputChatBox("Не удалось телепортироваться к игроку.") 
       end 
   end 
end 
addCommandHandler("goto",GotoPlayerToPlayer) 

Синтаксис был верный. Грубые ошибки в логике.

Link to comment
  
-- type="client" 
function GotoPlayerToPlayer(commandname,playerName) 
    local thePlayer = getPlayerFromName( playerName ) 
    if thePlayer then 
       local x, y, z = getElementPosition( thePlayer) 
       local teleported = setElementPosition(localPlayer, x + 2, y, z); 
       if(teleported == false) then outputChatBox("Не удалось телепортироваться к игроку.") 
       end 
   end 
end 
addCommandHandler("goto",GotoPlayerToPlayer) 

Синтаксис был верный. Грубые ошибки в логике.

Спасибо !

Link to comment

Подскажите пожалуйста, где написано какие функции отвечают за то, или иное. Не так выразился. Например: Игрок умер, что вызывается при его смерти ? Или игрок заспавнился.

Link to comment
Подскажите пожалуйста, где написано какие функции отвечают за то, или иное. Не так выразился. Например: Игрок умер, что вызывается при его смерти ? Или игрок заспавнился.

За это отвечают функции-события. Полный список клиентских событий - https://wiki.multitheftauto.com/wiki/Client_Scripting_Events, и серверных - https://wiki.multitheftauto.com/wiki/Server_Scripting_Events.

И ещё, как объявлять глобальные переменные ?
myVariable = 12 

Link to comment
Подскажите пожалуйста, где написано какие функции отвечают за то, или иное. Не так выразился. Например: Игрок умер, что вызывается при его смерти ? Или игрок заспавнился.

За это отвечают функции-события. Полный список клиентских событий - https://wiki.multitheftauto.com/wiki/Client_Scripting_Events, и серверных - https://wiki.multitheftauto.com/wiki/Server_Scripting_Events.

И ещё, как объявлять глобальные переменные ?
myVariable = 12 

Спасибо. Насчёт глобальных переменных еще вопрос.

Вот например есть 3 дома, у каждого дома свои данные, данные определённого дома нужно записать в определённую ячейку определённого массива, как это будет выглядеть в LUA ?

(В pawn'e так: enum data { owner[24],Float:x,Float:y,Float:z } new House[5][data]; и потом использовать так: House[0][x] = 0.0)

Link to comment

Ещё вопрос, какое событие срабатывает при смерти игрока ? При спавне нашёл, а при смерти нет... Дело в том, что после смерти камера просто бесконечно "качается" над игроком.

-------------------

Нашёл... onPlayerWasted

Link to comment

Событие смерти игрока - onPlayerWasterd

Для объявлении массива с домами, тебе не нужно заранее определять размеры и элементы его полей. Просто при инициализации пишешь так:

  
House = {} 
House[1] = {} 
House[1]["x"] = 123 
House[1]["owner"] = "Ololosh" 
  

И т.д.

P.S. Только вот House = {} не надо каждый раз писать. Всего лишь один раз, при объявлении. А для каждого нового индекса, необходимо House[index] = {}

Link to comment

Смотрел, не совсем понимаю что нужно писать в аргументах функции

Сервер

function check (source) 
    local accName = getAccountName(getPlayerAccount(source)) 
    if isObjectInACLGroup("user."..accName, aclGetGroup("Admin")) then 
        triggerClientEvent ( "checkAcc", getLocalPlayer() )  
    end 
    if isObjectInACLGroup("user."..accName, aclGetGroup("Moderator")) then 
        triggerClientEvent ( "checkAcc" ) 
    end 
end 
  
addCommandHandler("showmap", check) 

Клиент

addEventHandler("onClientResourceStart", getRootElement( ), 
    function(startedRes) 
        if getThisResource() == startedRes then 
            local screenWidth, screenHeight = guiGetScreenSize() 
            if screenHeight < 700 then 
                g_MapSide = 600 
            else 
                g_MapSide = 600 
            end 
            wndSpawnMap = guiCreateWindow(100, 100, g_MapSide, g_MapSide, "Карта", false) 
            wndImgMap = guiCreateStaticImage(0, 0, g_MapSide, g_MapSide, "map.png", false, wndSpawnMap) 
            guiSetVisible(wndSpawnMap, false) 
            addEventHandler("onClientGUIDoubleClick", wndImgMap, spawnMapDoubleClick) 
        end 
    end 
) 
  
function spawnMapDoubleClick(button, state, relX, relY) 
    local x,y = guiGetPosition(wndImgMap, false) 
    relX = relX - x 
    local q = relX*10 
    q = q - 3000 
    relY = relY - y 
    local w = relY*10 
    w = 3000 - w 
    setElementPosition(getLocalPlayer(), q, w, getGroundPosition(q, w, 500.0)) 
    guiSetVisible(wndSpawnMap, false) 
    showCursor(false) 
end 
  
function showMap() 
    guiSetVisible(wndSpawnMap, true) 
    showCursor(true) 
end 
addEvent( "checkAcc", true ) 
addEventHandler( "checkAcc", getRootElement(), showMap ) 
  
function showMap() 
    guiSetVisible(wndSpawnMap, false) 
    showCursor(false) 
end 
addCommandHandler("closemap", showMap) 

Edited by Guest
Link to comment

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

Вам нужно изучить:

https://forum.multitheftauto.com/viewto ... d65644daa8

https://wiki.multitheftauto.com/index.ph ... troduction

https://wiki.multitheftauto.com/index.ph ... ng_the_GUI

Link to comment
По вашему коду видно, что знаний у вас очень мало и вы берёте код из других источников и пытаетесь с ним что-то сделать, но у вас врятли это получится.

Вам нужно изучить:

https://forum.multitheftauto.com/viewto ... d65644daa8

https://wiki.multitheftauto.com/index.ph ... troduction

https://wiki.multitheftauto.com/index.ph ... ng_the_GUI

Ну на данный момент я совсем не знаю gui, знаю мало функций и не особо понимаю как создавать евенты, и как они потом будут работать. Не могли бы обьяснить как там использовать triggerClientEvent, ну в коде, который я скнул

Туторы по луа попробую почитать, но завтра...

Link to comment
Событие смерти игрока - onPlayerWasterd

Для объявлении массива с домами, тебе не нужно заранее определять размеры и элементы его полей. Просто при инициализации пишешь так:

  
House = {} 
House[1] = {} 
House[1]["x"] = 123 
House[1]["owner"] = "Ololosh" 
  

И т.д.

P.S. Только вот House = {} не надо каждый раз писать. Всего лишь один раз, при объявлении. А для каждого нового индекса, необходимо House[index] = {}

Т.е объявляем вот так:

  
House = {} 
House[5] = {} -- Где 5, количество домов 
House[5]["x"] = 0.0 
House[5]["y"] = 1.1 
House[5]["z"] = 2.2 -- Создаём переменные и задаём начальные данные 
  

Затем используем так:

House[0]["x"] = 15.15 -- 0, это ячейка в которой находятся данные о доме 

А при обычном выводе пишем так:

House[0]["x"] 

Я верно понял ?

Link to comment

Т.е объявляем вот так:

  
House = {} 
House[5] = {} -- Где 5, количество домов 
House[5]["x"] = 0.0 
House[5]["y"] = 1.1 
House[5]["z"] = 2.2 -- Создаём переменные и задаём начальные данные 
  

Я верно понял ?

Немного не так. В Lua не нужно указывать размерность массива ( в вашем случае - количество домов).

Строчка House[5] = {} - индекс не обозначает размерность массива. Это уже индекс элемента. А вот последующее = {} делает данный элемент массивом. Т.е. после этой строки можно использовать House[5]["x"] = 0.1.

А вот, например, House[4] не массив, поэтому если написать House[4]["x"] = 0.1, то произойдет ошибка, т.к. это не массив.

P.S. Если не понятно, то попроси кого-нибудь объяснить, я не очень силен в этом :)

Link to comment
Не совсем понимаю что нужно писать в аргументах функции

Сервер

function check (source) 
    local accName = getAccountName(getPlayerAccount(source)) 
    if isObjectInACLGroup("user."..accName, aclGetGroup("Admin")) then 
        triggerClientEvent ( "checkAcc", getLocalPlayer() )  
    end 
    if isObjectInACLGroup("user."..accName, aclGetGroup("Moderator")) then 
        triggerClientEvent ( "checkAcc" ) 
    end 
end 
  
addCommandHandler("showmap", check) 

Клиент

addEventHandler("onClientResourceStart", getRootElement( ), 
    function(startedRes) 
        if getThisResource() == startedRes then 
            local screenWidth, screenHeight = guiGetScreenSize() 
            if screenHeight < 700 then 
                g_MapSide = 600 
            else 
                g_MapSide = 600 
            end 
            wndSpawnMap = guiCreateWindow(100, 100, g_MapSide, g_MapSide, "Карта", false) 
            wndImgMap = guiCreateStaticImage(0, 0, g_MapSide, g_MapSide, "map.png", false, wndSpawnMap) 
            guiSetVisible(wndSpawnMap, false) 
            addEventHandler("onClientGUIDoubleClick", wndImgMap, spawnMapDoubleClick) 
        end 
    end 
) 
  
function spawnMapDoubleClick(button, state, relX, relY) 
    local x,y = guiGetPosition(wndImgMap, false) 
    relX = relX - x 
    local q = relX*10 
    q = q - 3000 
    relY = relY - y 
    local w = relY*10 
    w = 3000 - w 
    setElementPosition(getLocalPlayer(), q, w, getGroundPosition(q, w, 500.0)) 
    guiSetVisible(wndSpawnMap, false) 
    showCursor(false) 
end 
  
function showMap() 
    guiSetVisible(wndSpawnMap, true) 
    showCursor(true) 
end 
addEvent( "checkAcc", true ) 
addEventHandler( "checkAcc", getRootElement(), showMap ) 
  
function showMap() 
    guiSetVisible(wndSpawnMap, false) 
    showCursor(false) 
end 
addCommandHandler("closemap", showMap) 

Не могли бы помочь с данным скриптом ? А именно с triggerClientEvent . Спасибо

Link to comment

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

triggerClientEvent("checkAcc",source) -- выполнит действия на клиенте для игрока, который прописал команду 'showmap' 
triggerClientEvent("checkAcc",getRootElement()) -- выполнит действия для всех игроков на сервере, если любой игрок пропишет эту команду. 
  

Edited by Guest
Link to comment
В вашем верхнем скрипте вы пытаетесь в одном случае отправить на клиент событие для локального игрока, а как известно на серверной стороне такого игрока быть не может. Во втором же случае вы вообще отправляете событие ни для кого. Ваша задача указать в аргументах функции triggerClientEvent элемент, для кого выполнять функцию на клиенте. Например:
triggerClientEvent("checkAcc",source) -- выполнит действия на клиенте для игрока, который прописал команду 'showmap' 
triggerClientEvent("checkAcc",getRootElement()) - выполнит действия для всех игроков на сервере, если любой игрок пропишет эту команду. 
  

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

Link to comment

MTA вылетает после заставки 'Stop playing with yourself'

По пробывал найти ошибку с пмощью MTADiag во что выдало:

MTADiag v2.7.6 by Towncivilian

MTA install path: D:\mta

MTA version: 1.3.2-9.05463.0.000

GTA install path: D:\GTA

DirectX is up-to-date.

Checking for missing GTA files, please wait...

Missing GTA file: \audio\streams\CH

Missing GTA file: \audio\streams\CO

Missing GTA file: \audio\streams\CR

Missing GTA file: \audio\streams\DS

Missing GTA file: \audio\streams\HC

Missing GTA file: \audio\streams\MH

Missing GTA file: \audio\streams\MR

Missing GTA file: \audio\streams\NJ

Missing GTA file: \audio\streams\RE

Missing GTA file: \audio\streams\RG

Missing GTA file: \audio\streams\TK

Checking 393 out of 394...

Your Grand Theft Auto installation is missing one or more files.

Please reinstall GTA and see if MTA works then.

Для продолжения нажмите любую клавишу . .

Link to comment

И ешё вот я пробывал всё кроме этого

"Задайте правило предотвращения исполнения данных: Используйте настройку Включить DEP для всех программ и служб кроме выбранных ниже. Нажмите добавить, отыщите "Multi Theft Auto.exe" и "gta_sa.exe", а затем добавьте их"

Потому что не знаю куда зайти и что сделать.

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