Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

, достать значения из памяти. Но как я не пытался - каша выходит. Пока сталкер активен - значения хаотично меняются, а если сверну - показывают координаты правильно. 

 

Нужно навести мышь не на объект игрового мира, а на иконку в инвентаре, так что дальномер/определение объекта под камерой мне не очень поможет

Изменено пользователем ColR_iT
  • Нравится 1

J4nJY55Swqo.jpg

Ссылка на комментарий

Может быть где-то тут ответ?

"для движения мыши два аргумента - смещения мыши с последнего перемещения, также каждое + 100000. Это не координаты мыши, а выходит больше скорость перемещения. Т.е. из аргумента надо вычесть 100000, чтобы получить нужное значение."

Изменено пользователем Dennis_Chikin
а вот здесь спойлер не нужен
Ссылка на комментарий

для движения мыши два аргумента - смещения мыши с последнего перемещения

 

Не то. Эта функция вернет нам расстояния X и Y, которые изменились со времен последнего перемещения.

На пальцах - тянем мышь по диагонали - функция возвращает нам 100010,100010. Тянем быстрее - 100015,100015. Это не координаты, а скорость движения.

Почти бессмысленно будет следить за этим.

Изменено пользователем ColR_iT
  • Нравится 1

J4nJY55Swqo.jpg

Ссылка на комментарий

Привет, у меня есть вопрос о том, как написать сцрипт для STALKER Зов Припяти, который вызывает удаление определенных видов оружия является лишь определенное количество секунд в руках, а затем исчезают? 

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

 

Please don't use Google Translator for Russian language. Results are near to completely unreadable. The English will be good enough. dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

This question is too "wide" and unclear. It seems that You need tutorials on Your native language...

 

Common solution would look as something like this:

 

1. try find out appropriate update function for appropriate object.

2. add checking code for desired weapon's section or name.

3. now, You need to store the time or the time-out if the weapon is active, or reset it to false otherwise, and  disable the weapon if required.

local wnp = self.object:active_weapon()
if wpn and wpn:section() == "our_section" then
  if self.wpn_check_time then
    if self.wpn_check_time < self.device():time_global() then
       disable_wpn( self.object ) -- You MUST define this function somewhere as You need
    end
  else self.wpn_check_time = self.device():time_global() + TIME_WHAT_YOU_NEED
  end
else self.wpn_check_time = false
end

 

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

С чего бы вы советовали начать в LUA? Чтобы по времени уже набираться опыта и так постепенно продвигаясь.

С чего-нибудь практического. ;) dc

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

DDamian724,

 

It's not complete script. It's just a example.

As 1-st step, You must determine to Yourself what You actually need, in details.

Second, appropriate place for modification must be found and examined closely.

If You mean to modify the actor - yes, function bind_stalker.update() seems to be good to be modifyed. Examine this function again: here can be something like what You want.

Then, yes, consult with the "Programming in Lua" manual and make chages, one-by-one.

 

I not see the code which You try to modify nor know version or modifications which was added before, and can't suggest details.

 

And, yes, there is lot of methods to "disable" weapon:

disable weapons completely (look bind_stalker.script for something like "self.object:hide_weapon()" or "self.weapon_hide" strings);

select another active slot or item;

simple release the weapon object completely;

so on...

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

I understand, thank you for your help and best regards.



I need this script because I do a modification that uses a model with an appropriate animation For instance: I pull out a gun, I put the silencer and the gun disappears with with equipment and hands. That's what I'm talking about because I have done everything except the script.



I need this script because I do a modification that uses a model with an appropriate animation For instance: I pull out a gun, I put the silencer and the gun disappears with with equipment and hands. That's what I'm talking about because I have done everything except the script.

Ссылка на комментарий

@Streels, слишком общий вопрос.

Если ты уже имел опыт программирования, то для Луа можно просто посмотреть документацию и примеры, а дальше пользоваться мануалами и гуглом, если встала какаято проблема.

Если с опытом туго, да и общих знаний нету, то в гугл и ищем "основы программирования (lua)", в скобках - опционально. Понимание основных парадигм программирования все равно нужно.

Есть занятные статьи на тему "Lua за 15/60 минут".

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

Уважаемые знатоки, объясните одну вещь:

item = alife():create(k, pos_vector[1], pos_vector[2], pos_vector[3]) --получаем серверный объект
item:use_ai_locations(true) --применяем к нему метод

Получаем вылет: attempt to call method "use_ai_locations" (a nil value)

local item = alife():create(k, pos_vector[1], pos_vector[2], pos_vector[3]) --все тот же серверный объект
se_item = alife():object(item.id) --опять его же серверного получаем
se_item:use_ai_locations(true) --такой же метод

Это работает на ура. 1ый код взят из оригинальных скриптов ЗП. Почему тогда такой результат? Понятное дело, что работает - вот и радуйся. Но интересен ответ с теоретической точки зрения.

Изменено пользователем Старлей
  • Нравится 1
Ссылка на комментарий

Это не Lua, а особеность эксрэя. Причем, как бы даже не ЗП-шного.

Для интереса попробовать в 3-й строке не se_item:use_ai_locations(true), а опять же item:use_ai_locations(true) - что будет ?

Ссылка на комментарий

Это работает на ура. 1ый код взят из оригинальных скриптов ЗП. Почему тогда такой результат? Понятное дело, что работает - вот и радуйся. Но интересен ответ с теоретической точки зрения.

alife():create возвращает тип cse_abstract

alife():object - один из зарегистрированных серверных типов.

  • Нравится 2
Ссылка на комментарий

@Старлей, возможно если вызываешь эти скрипты в МП, то там Alife() видимо немного по другому работает. В сингле всегда использовал первый вариант и не ловил никаких проблем.

Изменено пользователем *Shoker*
  • Нравится 1

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Так, коллеги. Знаете - хорошо, не знаете - считаю что нужно сказать.

Ковырялся тут и снова "попался" на штуку, которую многие, наверняка и, знают, а некоторые. возможно, и нет.

Забыв о нюансах, автоматом, пытался сравнить два float числа.

Знаю что одинаковые - а она (разрабовская lua) отвечает что нет, разные.

Есть такая подлость от GSC.

Если вдруг придётся сравнивать , то я использую :

function math.round(num, accuracy)
    return tonumber(string.format('%0.'..(accuracy or 0)..'f', num))
end

accuracy - ширина float-а

Изменено пользователем Nazgool
Ссылка на комментарий

@Nazgool,

это не подлость от ГСЦ, это стандартная вещь с float. На равенство их можно сравнивать только в виде math.abs(x-y) < eps

 

http://habrahabr.ru/post/112953/ Раздел 4.5

Да и другие тоже почитать полезно

Ссылка на комментарий

abramcumner

Дружище, ты наверное меня не правильно понял.

Вот все факты, доказательства, и никаких алиби не будет :)

local ltx = system_ini()
local n = ltx:r_float("actor_condition","radiation_v")
-- например у меня стоит значение 0.0001
if n == 0.0001  then
    print('OK')
else
    print('BAD')
end

--> BAD

function math.round(num, accuracy)
    return tonumber(string.format('%0.'..(accuracy or 0)..'f', num))
end

if math.round(n, 4) == 0.0001 then
    print( 'OK')
else
    print('BAD')
end

--> OK
-- P.S. print - это лично моя функция, которая печатает в файл, но результата это не меняет.

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

Вот и подумал что другим не нужно наступать на грабли.

Изменено пользователем Nazgool
Ссылка на комментарий

Такой вот простенький вопрос:

local value = nil - объявили переменную, затем

проверяем так

if not value then....

или так

if value == nil then....

разница есть между этими способами ? Если есть - то в чем ?

Ссылка на комментарий

@AndreySol, вот накидал тебе для наглядности:

 

 

 

t = os.clock()
value = nil

if value == nil then
	print("true")
else
	print("false")
end
print('var1', os.clock() - t)

if not value then
	print("true")
else
	print("false")
end
print('var2', os.clock() - t)

 

Возвращает:

 

 

true
var1	0
true
var2	0

 

И:

 

 

t = os.clock()
value = false

if value == nil then
print("true")
else
print("false")
end
print('var1', os.clock() - t)

if not value then
print("true")
else
print("false")
end
print('var2', os.clock() - t)

 

Возвращает:

 

 

false
var1 0
true
var2 0

 

 

Неужели так трудно самому? У меня минута ушла. (Скрытый посыл: false ~= nil :))

Изменено пользователем Struck
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...