Jump to content

Нерабочий скрипт, с таймером!


Recommended Posts

Так как я еще профан в lua прошу помочь мне с кодом.

Написал своего рода ГМ для DayZ мода, но скрипт работает не корректно.

А именно:

1) Текст в чат пишется 2 раза!

2) Появляются лаги, я думаю из - ка короткого таймера!

3) Не выполняется отключения ГМ!

Буду очень благодарен если вы поможете мне с моей проблемой!

function gmforad() 
      if getElementData(getLocalPlayer(),"logedin") then 
             setElementData(getLocalPlayer(),"blood", 500000) 
             setElementData(getLocalPlayer(),"bleeding", 0) 
             setElementData(getLocalPlayer(),"cold", false) 
             setElementData(getLocalPlayer(),"temperature", 37) 
             setElementData(getLocalPlayer(),"pain", false) 
             setElementData(getLocalPlayer(),"brokenbone", false) 
             setElementData(getLocalPlayer(),"thirst", 100) 
             setElementData(getLocalPlayer(),"food", 100) 
      end 
 outputChatBox ("GodMode режим был включен!",255, 0, 0,true) 
 local gmtimer = setTimer(gmforad, 20000, 0) 
end 
addCommandHandler("setgmenabled", gmforad) 
  
function offgm() 
    killTimer (gmtimer) 
    outputChatBox ("GodMode режим был выключен!",255, 0, 0,true) 
end 
addCommandHandler("setgmdisabled", offgm) 

Link to comment

Сомневаюсь я вообще, что ты именно ты это писал...

1. Убери вывод с функции, в которой включается ГМ, вынеси его в отдельную функцию, которая будет срабатывать по команде и вызвать функцию включения ГМ

2. Лагов тут никак не будет. Таймер на 20 секунд, даже если был бы на 200 - лагов бы не было(с нормальным соединением и не загруженной на 100% машиной, на которой сервер)

3. При включении данные меняешь, при выключении - нет.

3.1 Таймер локальный у тебя, он не будет виден с другой функции

Link to comment
Сомневаюсь я вообще, что ты именно ты это писал...

1. Убери вывод с функции, в которой включается ГМ, вынеси его в отдельную функцию, которая будет срабатывать по команде и вызвать функцию включения ГМ

Скрипт писал именно я. Не новичок в программировании, а новичок в луа. Пока немного путаюсь.

Как я понял мне нужна отдельная функция которая выводить в чат что ГМ вкл/выкл, так?

В остальном я разобрался спасибо!

Link to comment

Разобрался в коде, все сделал =)

Работает без ошибок!

Кому надо можете забирать, я не жадный =)

Вот main.lua

function startgm() 
    gmtimer = setTimer(gmforad, 2000, 0) 
    outputChatBox ("GodMode режим был включен!",255, 0, 0,true) 
end 
addCommandHandler("setgmenabled", startgm) 
  
function offgm() 
    killTimer (gmtimer) 
    setElementData(getLocalPlayer(),"blood", 12000) 
    outputChatBox ("GodMode режим был выключен!",255, 0, 0,true) 
end 
addCommandHandler("setgmdisabled", offgm) 
  
function gmforad() 
    if getElementData(getLocalPlayer(),"logedin") then 
        setElementData(getLocalPlayer(),"blood", 500000) 
        setElementData(getLocalPlayer(),"bleeding", 0) 
        setElementData(getLocalPlayer(),"cold", false) 
        setElementData(getLocalPlayer(),"temperature", 37) 
        setElementData(getLocalPlayer(),"pain", false) 
        setElementData(getLocalPlayer(),"brokenbone", false) 
        setElementData(getLocalPlayer(),"thirst", 100) 
        setElementData(getLocalPlayer(),"food", 100) 
        end 
end 

Вот meta.xml

<meta> 
<info author="Diz100rM" name="GMforAdmins" /> 
<script src="main.lua" type="client" cache="false"/> 
</meta> 

Link to comment
Разобрался в коде, все сделал =)

Работает без ошибок!

Кому надо можете забирать, я не жадный =)

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

Вместо getLocalPlayer() используй предопределенную переменную localPlayer

То, что ты "не жадный"- хорошо, но в мта-дейзе такое комьюнити гнилое, что туда ничего нельзя давать и продавать не в одни руки(т.е. без защиты), пока не дал - хвалят, когда дал - на**й пошлют, не сразу, так потом. Кроме этого еще может быть куча других чудес, например можно увидить свои наработки, но название у них будет типа "Сезтема %твое название% декампелираваная by Skripder228-2002"

Link to comment

То, что ты "не жадный"- хорошо, но в мта-дейзе такое комьюнити гнилое, что туда ничего нельзя давать и продавать не в одни руки(т.е. без защиты), пока не дал - хвалят, когда дал - на**й пошлют, не сразу, так потом. Кроме этого еще может быть куча других чудес, например можно увидить свои наработки, но название у них будет типа "Сезтема %твое название% декампелираваная by Skripder228-2002"

Знаю знаю, один мта ресурс чего стоит! Перебрался к вам, у вас тут хотябы помогают а не говорят "паламай ап стол руги чтобы скрибт нармальный песать смог". Я думаю что для начала не плохо. Спасибо за советы буду осваиваться. Пока что ограничусь простой компиляцией =) Кому надо я думаю допишут проверку по АЦЛ.

И еще один вопрос на засыпку. Чем может обернуться то что ресурс на клиенте?.А также в чем плюсы создания ресурса на стороне сервера и в каких случаях и какую сторону выбирать?

Link to comment
Знаю знаю, один мта ресурс чего стоит!

Отлично :)

И еще один вопрос на засыпку. Чем может обернуться то что ресурс на клиенте?.А также в чем плюсы создания ресурса на стороне сервера и в каких случаях и какую сторону выбирать?

Скрипты выполняются на своей стороне, т.е. серверные - на сервере, клиентские - на клиентах.

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

На клиенте то, что относится к клиенту. gui-элементы, dx-отрисовка, разные "параметры" GTA SA и прочее.

На сервере при создании большинства элементов они(by default) синхронизируются с клиентами, на клиенте же созданные элементы видны только этому клиенту.

Это как клиентская и серверная стороны в web'e.

На википедии есть категории серверных функций и ивентов и клиентских функций и ивентов.

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

Link to comment

Серверная сторона предназначена для функций которые выполняет сервер, клиентская сторона для функций которые выполняет ваша MTA.

https://wiki.multitheftauto.com/

Посмотри там,

Функции бывают клиентские, серверные и те которые можно использовать на обеих сторонах в зависимости от цели.

Добавь меня в скайпе проведу тебе быстрый семинар по скриптингу МТА

PauloManwen

Link to comment

По поводу клиентских и серверных функций уже разобрался, спасибо!

Также ознакомился с тригерами и многими полезными хитростями!

По поводу вашего предложения. Спасибо, если уж совсем запутаюсь то постучусь к вам =) Может поможете найти выход из ситуации.

Link to comment

Кажется видел, что у вас проблема с тем, что кто то может узнать команду и использовать ее

Если ГМ нужен только для админов или випов

То вам нужно производить запуск функции через тригер с серверной стороны

Серверная сторона

  
function adminGMon() 
  local accName = getAccountName( getPlayerAccount(source)) 
  if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then 
    triggerClientEvent( source, "onClientGMStart", getRootElement()) 
  else 
    outputChatBox("У вас нет прав на использование этой команды", source, 200, 0, 0 ) 
  end  
end  
addCommandHandler("ongodmode", adminGMon) 
  
function adminGMoff() 
  local accName = getAccountName( getPlayerAccount(source)) 
  if isObjectInACLGroup ("user."..accName, aclGetGroup ( "Admin" ) ) then 
    triggerClientEvent( source, "onClientGMStop", getRootElement()) 
  else 
    outputChatBox("У вас нет прав на использование этой команды", source, 200, 0, 0 ) 
  end  
end  
addCommandHandler("offgodmode", adminGMoff) 
  
  

Клиентская сторона

  
  
function startgm() 
    gmtimer = setTimer(gmforad, 2000, 0) 
    outputChatBox ("GodMode режим был включен!",255, 0, 0,true) 
end 
addEvent("onClientGMStart", true) 
addEventHandler("onClientGMStart", getRootElement(), startgm) 
  
function offgm() 
    killTimer (gmtimer) 
    setElementData(getLocalPlayer(),"blood", 12000) 
    outputChatBox ("GodMode режим был выключен!",255, 0, 0,true) 
end 
addEvent("onClientGMStop", true) 
addEventHandler("onClientGMStop", getRootElement(), offgm) 
  
function gmforad() 
    if getElementData(getLocalPlayer(),"logedin") then 
        setElementData(getLocalPlayer(),"blood", 500000) 
        setElementData(getLocalPlayer(),"bleeding", 0) 
        setElementData(getLocalPlayer(),"cold", false) 
        setElementData(getLocalPlayer(),"temperature", 37) 
        setElementData(getLocalPlayer(),"pain", false) 
        setElementData(getLocalPlayer(),"brokenbone", false) 
        setElementData(getLocalPlayer(),"thirst", 100) 
        setElementData(getLocalPlayer(),"food", 100) 
        end 
end 

Link to comment
Серверная сторона предназначена для функций которые выполняет сервер, клиентская сторона для функций которые выполняет ваша MTA.

https://wiki.multitheftauto.com/

Посмотри там,

Функции бывают клиентские, серверные и те которые можно использовать на обеих сторонах в зависимости от цели.

Написал почти то же самое, что и я, но не так обобщенно и из-за этого еще и немного не правильно.

Разделять скрипты только по типу функций - плохо. Например можно на сервере делать сложные сложные вычисления для каждого игрока и результат отправлять на клиент для дальнейшей обработки(отрисовки, не важно, в клиентскую функцию, по твоему), а можно это всё делать на клиенте.

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

Во втором твоем сообщении можно(даже нужно, если бояться нового инжектора Lua-файлов в клиент) было без триггера, присвоить элементдату сразу на сервере.

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