Jump to content

Начало начал, новичок как новичок


Recommended Posts

Здравствуйте, уважаемые форумчане, поделитесь информацией о том, как сделать 1-ый скрипт новичку с простейшей функцией и что самое главное - как его упаковать и как запустить на сервере mta 1.4, как правильно заполнить meta.xml, а точнее script type="server" (когда ставить server и когда client); type="misc" (какие типы бывают и от чего зависит тот или иной, когда их ставить) За все ответы буду признателен, только не оффтопьте, я новичок, так что проявите толерантность...

p.s Тему буду дополнять различными вопросами, дабы не забивать форум всяким шлаком.

Edited by Guest
Link to comment

В целом спасибо, начал учиться и вот вопрос, у меня есть 3 переменные, у каждой переменной свое значение, как мне вывести значение 3-ех переменных в одну строку через пробел?

Link to comment
В целом спасибо, начал учиться и вот вопрос, у меня есть 3 переменные, у каждой переменной свое значение, как мне вывести значение 3-ех переменных в одну строку через пробел?

В МТА значения можно вывести разными путями: в консоль, в чат и т.д. На вики функции сгруппированы по общему смыслу, группа функций "Output" содержит то, что вам нужно.

Ну и доки по Lua пригодятся: http://www.lua.ru/doc/

Link to comment
В целом спасибо, начал учиться и вот вопрос, у меня есть 3 переменные, у каждой переменной свое значение, как мне вывести значение 3-ех переменных в одну строку через пробел?

В МТА значения можно вывести разными путями: в консоль, в чат и т.д. На вики функции сгруппированы по общему смыслу, группа функций "Output" содержит то, что вам нужно.

Ну и доки по Lua пригодятся: http://www.lua.ru/doc/

Спасибо, изучу, но все же если можно, дайте пример c выводом переменных a, b, c в outputChatBox

Переменные:

a = "Я"

b = "Люблю"

c = "MTA"

Link to comment
Спасибо, изучу, но все же если можно, дайте пример c выводом переменных a, b, c в outputChatBox

Переменные:

a = "Я"

b = "Люблю"

c = "MTA"

function oup_put(thePlayer, com, arg1, arg2, arg3) -- присвоение функции 
    outputChatBox(arg1.." "..arg2.." "..arg3, thePlayer) -- сам вивод 
end 
addCommandHandler("output", oup_put) -- обработчик команды 

Вот код, на стороне сервера, когда в игре вводишь команду /output [текст 1] [текст 2] [текст 3], оно выводит тебе их по порядку в чат.

".." (две точки) - это склеивание

Link to comment

Спасибо, еще вопрос, в чем ошибка, решил написать точку спавна:

function spawnPoint(source) 
    spawnPlayer ( source, 0.0, 0.0, 0.0, 90.0, 0  ) 
end 
  
addEventHandler("onResourceStart", getRootElement(), spawnPoint) 
addEventHandler("onPlayerJoin", getRootElement(), spawnPoint) 
addEventHandler("onPlayerWasted", getRootElement(), spawnPoint) 

Debug:

[14:37:09] start: Requested by Console

[14:37:09] WARNING: mapmanager\mapmanager_main.lua:23: Bad argument @ 'getResourceName' [Expected resource-data at argument 1]

[14:37:09] ERROR: mapmanager\mapmanager_main.lua:23: attempt to concatenate a boolean value

[14:37:09] Starting spawn

[14:37:09] WARNING: [gameplay]\spawn\spawn.lua:2: Bad argument @ 'spawnPlayer' [Expected player at argument 1, got resource-data]

[14:37:09] start: Resource 'spawn' started

Link to comment
function oup_put(thePlayer, com, arg1, arg2, arg3) -- присвоение функции 
    outputChatBox(arg1.." "..arg2.." "..arg3, thePlayer) -- сам вивод 
end 
addCommandHandler("output", oup_put) -- обработчик команды 

Вот код, на стороне сервера, когда в игре вводишь команду /output [текст 1] [текст 2] [текст 3], оно выводит тебе их по порядку в чат.

".." (две точки) - это склеивание

Нужно приводить пример именно с того, с чего просят, особенно для новичков. Эта крутая функция оуп_пут тут явно не нужна.

  
a = "Я" 
b = "Люблю" 
c = "MTA" 
outputChatBox(a .. " " .. b .. " " .. c) 

______________________________________________

Спасибо, еще вопрос, в чем ошибка, решил написать точку спавна:

function spawnPoint(source) 
    spawnPlayer ( source, 0.0, 0.0, 0.0, 90.0, 0  ) 
end 
  
addEventHandler("onResourceStart", getRootElement(), spawnPoint) 
addEventHandler("onPlayerJoin", getRootElement(), spawnPoint) 
addEventHandler("onPlayerWasted", getRootElement(), spawnPoint) 

Debug:

[14:37:09] start: Requested by Console

[14:37:09] WARNING: mapmanager\mapmanager_main.lua:23: Bad argument @ 'getResourceName' [Expected resource-data at argument 1]

[14:37:09] ERROR: mapmanager\mapmanager_main.lua:23: attempt to concatenate a boolean value

[14:37:09] Starting spawn

[14:37:09] WARNING: [gameplay]\spawn\spawn.lua:2: Bad argument @ 'spawnPlayer' [Expected player at argument 1, got resource-data]

[14:37:09] start: Resource 'spawn' started

Код в тег lua ставь, а не в code

 

У тебя проблема в том, что ивент

addEventHandler("onResourceStart", getRootElement(), spawnPoint) 

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

Этот ивент, кстати, написан не правильно. getRootElement() возвращает root, это начало дерева всех элементов, ресурсов... вообще всего. Тоесть у тебя этот ивент будет срабатывать при запуске каждого ресурса, а тебе нужно только этого. Для "только этого" нужно использовать

getResourceRootElement(getThisResource()) 

или же, более просто, предопределенную переменную

resourceRoot 

Твоя функция не подходит для спавна всех игроков при запуске ресурса. И чтобы не делать какие-то, не понятные для новичка, конструкции в одной функции - сделай другую функцию, и на нее повесь этот ивент.

Для "всех игроков" используй

getElementsByType 

вообщем, попробуй сделать это сам, на вики есть пример по этой функции. Если будут проблемы - пиши сюда.

Link to comment

начни с самого простого - возьми какой-нибудь большой скрипт, вырежи из него всё по максимум, оставь там буквально 5-6 строк, после этого начни добавлять какие-либо функции, через пару дней ты сможешь оформить самые простые вещи, такие, как пикап, который при взятии пишет что-то в чат, например

Link to comment

Спасибо за ответы :3, назрели еще вопросы:

1. За что отвечает параметр "startup" и "protected" в mtaserver.conf?

2. Какая версия языка lua сейчас используется в mta?

3. Как сделать так, чтобы при вводе несуществующей команды в чат выводилось определенное сообщение?

Link to comment
Спасибо за ответы :3, назрели еще вопросы:

1. За что отвечает параметр "startup" и "protected" в mtaserver.conf?

2. Какая версия языка lua сейчас используется в mta?

3. Как сделать так, чтобы при вводе несуществующей команды в чат выводилось определенное сообщение?

1. startup=1 - Запуск ресурса при запуске сервера

protected=1 - ресурс нельзя будет выключить(совсем ли нельзя - хз, не использовал никогда его)

2. 5.1, в Lua есть предопредленная переменная _VERSION, содержащая строку версии интерпретатора

3. Я не уверен, но, наверное, никак. Вроде бы, даже недавно просили добавить функцию getAllCommands или что-то такое.

Можно попробовать сделать некоторый костыль через.

onPlayerCommand -- ивент 
executeCommandHandler 
  

Что-то типа выполнить данную комманду + пометить игрока и эту команду как проверяемую. И такие проверяемые команды в onPlayerCommand отменять. Хотя, я вот не знаю, что в таком случае вернет executeCommandHandler

Link to comment

По поводу третьего пункта.

Можно использовать событие onPlayerCommand в связке с addCommandHandler

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

local commands = {}; 
  
_addCommandHandler = addCommandHandler; 
  
function addCommandHandler( cmd, callback, restricted, caseSensitive ) 
    commands[ cmd ] = true; 
     
    return _addCommandHandler( cmd, callback, restricted, caseSensitive ); 
end 
  
local hardcodedCommands = 
{ 
    say = true; 
    me  = true; 
    -- полный список тут: [url=https://wiki.multitheftauto.com/wiki/Console_Commands_and_CVars]https://wiki.multitheftauto.com/wiki/Co ... _and_CVars[/url] 
}; 
  
function onPlayerCommand( command ) 
    if hardcodedCommands[ command ] or commands[ command ] then 
        return; 
    end 
     
    outputChatBox( command .. ": not found", source, 255, 255, 255 ); 
end 
  
addEventHandler( "onPlayerCommand", root, onPlayerCommand ); 
  

Если что-то не понятно - спрашивай.

Link to comment
По поводу третьего пункта.

Можно использовать событие onPlayerCommand в связке с addCommandHandler

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

local commands = {}; 
  
_addCommandHandler = addCommandHandler; 
  
function addCommandHandler( cmd, callback, restricted, caseSensitive ) 
    commands[ cmd ] = true; 
     
    return _addCommandHandler( cmd, callback, restricted, caseSensitive ); 
end 
  
local hardcodedCommands = 
{ 
    say = true; 
    me  = true; 
    -- полный список тут: [url=https://wiki.multitheftauto.com/wiki/Console_Commands_and_CVars]https://wiki.multitheftauto.com/wiki/Co ... _and_CVars[/url] 
}; 
  
function onPlayerCommand( command ) 
    if hardcodedCommands[ command ] or commands[ command ] then 
        return; 
    end 
     
    outputChatBox( command .. ": not found", source, 255, 255, 255 ); 
end 
  
addEventHandler( "onPlayerCommand", root, onPlayerCommand ); 
  

Если что-то не понятно - спрашивай.

Для ТС:

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

Даже если таблицу белых команд сделать на все ресурсы, подменять функции всё равно придется отдельно и в каждом.

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

Edited by Guest
Link to comment

Писать большой мод в одном ресурсе, как по мне, не очень хорошо.

Почему так считаете?

Не удобность изменения чего-либо при запущенном сервере... Вообще... Кроме этого даже ничего не приходит на мысль. Я собираюсь в скором времени проводить некоторые испытания, может-быть они изменят мою точку зрения.

Link to comment

Не удобность изменения чего-либо при запущенном сервере... Вообще... Кроме этого даже ничего не приходит на мысль. Я собираюсь в скором времени проводить некоторые испытания, может-быть они изменят мою точку зрения.

Ждем результатов исследования :) У меня все в одном ресурсе и думаю, что так лучше чем много ресурсов. И со стороны разработки (человеку удобнее поддерживать один проект) и, предполагаю, со стороны исполнения.

Link to comment

Не удобность изменения чего-либо при запущенном сервере... Вообще... Кроме этого даже ничего не приходит на мысль. Я собираюсь в скором времени проводить некоторые испытания, может-быть они изменят мою точку зрения.

Ждем результатов исследования :) У меня все в одном ресурсе и думаю, что так лучше чем много ресурсов. И со стороны разработки (человеку удобнее поддерживать один проект) и, предполагаю, со стороны исполнения.

Ну, исследования я чисто для себя буду проводить. Методом тыка выяснять, что же лучше.

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

Link to comment
Для ТС:

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

Даже если таблицу белых команд сделать на все ресурсы, подменять функции всё равно придется отдельно и в каждом.

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

Экспорты в помощь.

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

Link to comment

Что приходит на ум:

1. Логическое разделение, само по себе полезно;

2. На "живом" сервере проще перезапустить часть общей системы, чем общий ресурс;

3. Один ресурс еще и дольше перезапускается;

4. Четкое разделение прав - а это безопасность вашего сервера (не стоит делать админку, там же где и все остальное);

5. Коллизия глобальных переменных - это особенно относится к процедурному программированию. Глобальная среда растет, избежать коллизии, все труднее. Более того, чем больше одна Lua среда - тем медленнее она работает (хоть и не очень значительно);

Опять же, для взаимодействия между скриптами можно использовать не только экспорты, но и собственные эвенты.

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

Link to comment

Экспортами пользоваться не очень уж удобно. По крайней мере мне так кажется. Какие альтернативы могли бы посоветовать?

P.S. Кажется тема топика переросла в "другое русло". Может стоит создать отдельную тему?

Link to comment
Экспортами пользоваться не очень уж удобно. По крайней мере мне так кажется. Какие альтернативы могли бы посоветовать?

P.S. Кажется тема топика переросла в "другое русло". Может стоит создать отдельную тему?

Делать копии функций из экспортов

exportedFunction = exports.resource:exportedFunction 
exportedFunction() --вместо exports.resource:exportedFunction() 

Link to comment

Делать копии функций из экспортов

exportedFunction = exports.resource:exportedFunction 
exportedFunction() --вместо exports.resource:exportedFunction() 

Думаю все же передавать перед эвенты, так для меня удобнее. Тем более методы нельзя экспортировать, насколько я понимаю.

P.S. Использую эту библиотеку для ООП.

Link to comment
Экспортами пользоваться не очень уж удобно. По крайней мере мне так кажется. Какие альтернативы могли бы посоветовать?

P.S. Кажется тема топика переросла в "другое русло". Может стоит создать отдельную тему?

Неудобно в плане нагрузки или использования?

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