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

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

@Kober(BRUC), добавь после 12-й строки:

 

local set_0 = "set_0"

Человек хочет свое делать. А как он будет делать, если пока не понимает основ? Там же ещё ошибки есть.

Ну это не решение. Решение - обойтись без этой строчки. А это просто подумать, что значит одна и та же строка в кавычках и без.

 

А до конкатенации и приведения типов тут далеко. Тут хотя бы переменные отличать от констант, находить в коде вызовы функций и прочее.

Книги и доки, я так понимаю, в данном случае не котируются, только грабли, шишки и кодирование наугад.

Изменено пользователем abramcumner
  • Спасибо 1
  • Согласен 2
Ссылка на комментарий
Разберись, какие значения операндов

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

set_0 

на:

"set_0"
Изменено пользователем Kober(BRUC)
  • Согласен 2
Ссылка на комментарий

@Kober(BRUC)

С одним разобрались )
 

Теперь смотри на это :

vector():set(ps)

и разберись что такое 'ps'

Только не спеши. Мы все понимаем что ты хотел сделать, но получилось не так.

 

Подсказка

2.5.7 - Конструкторы таблиц

...
описание синтаксиса конструкторов: 
...
fieldsep ::= ',' | ';'
 
если перевести 'fieldsep', то выйдет 'разделитель полей' таблицы. Т.е. либо запятая, либо точка с запятой.
И теперь посмотри какие поля у тебя в таблицах 'set_0*'
Изменено пользователем Nazgool
  • Согласен 1
Ссылка на комментарий

Я бы еще обратил внимание, что из таблицы разных вариантов координат, по отдельности выбирается, гейм_вертекс, левел-вертекс, и позиция. Т.е. возможен случай когда для спавна будут выбраны например, гейм-вертекс из 3-го варианта, левел-вертекс из 1-го, а позиция из второго. Но так же нельзя делать) Точнее, это смысла не имеет. Координаты в сталкере - это взаимосвязь gv, lv, position. Таким образом не надо 3 раза дергать math.random, достаточно вызвать его 1 раз, выбрать один вариант из таблицы, и уже все параметры (lv, gv, pos) брать из этого варианта.

А если хочется больше разнообразия то увеличивать число вариантов в таблице.

О настоящем рандомном спавне тут пока речь вести рано)

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
возможен случай когда для спавна будут выбраны например, гейм-вертекс из 3-го варианта, левел-вертекс из 1-го, а позиция из второго

:)

Об этом я хотел сказать чуть позже. После того как с основами построения таблиц и обращения к полям всё станет ясно.

Ну чтобы не вываливать всё сразу.

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

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

------------------------------------------------------------------------------------------------------------------------
--" информация об оружии
------------------------------------------------------------------------------------------------------------------------
local time_update = 500
local time_add
local condition
local damage
local velocity
local dispersion
function weapon_info()
local time = time_global()
if time_add == nil then
time_add = time_global() + time_update
end
local active_slot = db.actor:active_item()
if active_slot and db.actor:active_slot()==1 then
if time > time_add then
time_add = time_global() + time_update
local sect=db.actor:item_in_slot(1):section()
local name = tostring(system_ini():r_string(sect,"inv_name_short"))
local a=tonumber(system_ini():r_string(sect,"hit_power"))
local b=tonumber(system_ini():r_string(sect,"bullet_speed"))
local c=tonumber(system_ini():r_string(sect,"fire_dispersion_base"))
local d=tonumber(system_ini():r_string(sect,"fire_dispersion_condition_factor"))
damage=a*100
velocity=b
condition=db.actor:item_in_slot(1):condition()
dispersion=(c*100)*(1+(d*(1-condition)))
local text = "\\n%c[0,0,255,255]Текущее оружие: \\n%c[255,160,160,160]"..game.translate_string(tostring(name)).."\\n%c[255,1,255,1]повреждение = "..game.translate_string(tostring(damage)).."\\n%c[255,1,255,1]скорость пули = "..game.translate_string(tostring(velocity)).."\\n%c[255,1,255,1]кучность = "..game.translate_string(tostring(dispersion)).."\\n%c[255,1,255,1]состояние = "..game.translate_string(tostring(condition))
db.actor:give_game_news(text,"ui\\ui_IconsTotalKrot",Frect():set(0,48,83,47),50,10000)
end
time_add = nil
end
if active_slot and db.actor:active_slot()==2 then
if time > time_add then
time_add = time_global() + time_update
local sect=db.actor:item_in_slot(2):section()
local name = tostring(system_ini():r_string(sect,"inv_name_short"))
local a=tonumber(system_ini():r_string(sect,"hit_power"))
local b=tonumber(system_ini():r_string(sect,"bullet_speed"))
local c=tonumber(system_ini():r_string(sect,"fire_dispersion_base"))
local d=tonumber(system_ini():r_string(sect,"fire_dispersion_condition_factor"))
damage=a*100
velocity=b
condition=db.actor:item_in_slot(2):condition()
dispersion=(c*100)*(1+(d*(1-condition)))
local text = "\\n%c[0,0,255,255]Текущее оружие: \\n%c[255,160,160,160]"..game.translate_string(tostring(name)).."\\n%c[255,1,255,1]повреждение = "..game.translate_string(tostring(damage)).."\\n%c[255,1,255,1]скорость пули = "..game.translate_string(tostring(velocity)).."\\n%c[255,1,255,1]кучность = "..game.translate_string(tostring(dispersion)).."\\n%c[255,1,255,1]состояние = "..game.translate_string(tostring(condition))
db.actor:give_game_news(text,"ui\\ui_IconsTotalKrot",Frect():set(0,0,83,47),50,10000)
end
time_add = nil
end
end

 

Здесь могла быть ваша реклама.

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

@Nazgool, т.е. между "x" "y" "z" нужно поставить”;”, так как если будет запятая, то он выберет только "x".

З.ы. я себя чувствую дураком... Как я сразу это не заметил составляя таблицу координат?..

 

@Zander_driver, а гейм-вертекс и левел-вертекс во всех четырех вариантах совпадают. :)

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

@Kober(BRUC), прочитай уж доку наконец. Там разбирается пример один в один как у тебя.

И нет, запятая и точка с запятой в конструкторах таблиц означают одно и тоже.

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

@Kober(BRUC)

Ты немного не понял. Я говорил

 посмотри какие поля у тебя в таблицах

А про сепараторы - это было для того, чтобы ты понял как определить где же поля.
Хорошо. Давай разбирать. Но прежде, как правильно сказал abramcumner, прочитай.

Вот на русском http://www.lua.ru/doc/2.5.7.html
 

set_01 = {lvid=261995, gvid=187, pos = -15.300880,5.824976,292.832062}

Ищем разделители. У тебя это запятые (но могут быть и точки с запятой). 

Значит у тебя будет 5 полей :

lvid=261995
gvid=187
pos = -15.300880
5.824976
292.832062

Ты уже почитал доки ( :)) и знаешь, что поля записываются как пара "ключ=значение"

Разберем эти поля:

ключ | значение |
-----|----------|
lvid |  261995  |
-----|----------|
gvid |   187    |
-----|----------|
 pos |-15.300880|
-----|----------|
     | 5.824976 |
-----|----------|
     |292.832060|
----------------- 

Как видишь в последних двух случаях ключи не указаны, но после прочтения доков ты моментально поймешь, что ключи будут инициализированы самой lua автоматически, по правилам индексированного массива. А именно:

-----|----------|
 [1] | 5.824976 |
-----|----------|
 [2] |292.832060|
-----------------

А теперь повторюсь :

разберись что такое 'ps'

в выражении vector():set(ps)

и с какими аргументами сколько аргументов передаются при вызове метода vector():set(...)

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

@Nazgool, то есть это должно выглядеть так:

  return alife():create(section, vector():set(ps,ps[1],ps[2]),lv,gv) --Около фермы
Изменено пользователем Kober(BRUC)
Ссылка на комментарий

@Kober(BRUC)

Уже теплее :)

Итак, ты пишешь :

ps[1],ps[2]

Т.е. подразумеваешь, что 'ps' таблица, и получаешь значения полей [1] и  [2].

А что же у тебя всё-таки 'ps'? Таблица или не таблица?

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

:) Нужно в доки добавить новое определение.
Давай разбирать

local ps = pos_tbl[set_0 .. math.random(1,4)]["pos"]

Выходит, что 'ps' это значения поля таблицы 'pos_tbl[какая-то_рандомная]' с индексом ['pos']
А что у тебя записано в этом поле? Скажем таблица 'pos_tbl[какая-то_рандомная]' это 'set_01'

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

Одному ключу можно присвоить только одно значение.

И как же то, что мы уже разобрали ?

-----|----------|
 pos |-15.300880|
-----|----------|

И всё. В 'pos' записана только координата 'x'
Значит и 'ps' будет иметь значение ..... какое?

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

@Nazgool, я когда говорил координаты я подразумевал ps - x; ps[1] - y; ps[2] - z. Но как я понял это не правильно. То есть нужно изменить таблицу на такую?: ...

 

А вот на какую что бы, я со своими скудными познаниями смог вызвать из этой таблицы и "x", и "y", и "z", из этой строки вызывались сразу три:

 local ps = pos_tbl["set_0" .. math.random(1,4)]["pos"] --Position

Значит нужно сделать так:

local pos_tbl={
set_01 = {lvid=261995, gvid=187, pos = -15.300880, pos[1] = 5.824976, pos[2] = 292.832062},
set_02 = {lvid=261995, gvid=187, pos = -13.200880, pos[1] = 3.716976, pos[2] = 292.832062},
set_03 = {lvid=261995, gvid=187, pos = -11.400880, pos[1] = 1.908976, pos[2] = 292.832062},
set_04 = {lvid=261995, gvid=187, pos = -19.100880, pos[1] = 7.600976, pos[2] = 292.832062}
}


...
 local ps = pos_tbl["set_0" .. math.random(1,4)]["pos"] --Position
 local ps[1] = pos_tbl["set_0" .. math.random(1,4)]["pos[1]"] --Position
 local ps[2] = pos_tbl["set_0" .. math.random(1,4)]["pos[2]"] --Position

Но вот проблема тогда появляется. Тогда рандомно из всех четырех "set_0*" будет вызываться разные координаты "x", "y" и "z".

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

@Kober(BRUC)

Ладно. Давай пойдем от обратного.
Вот готовый вариант. Специально написал более развернуто, чтобы ты пошагово понимал что происходит

local pos_tbl={
    {lvid=261995, gvid=187, pos = {-15.300880,5.824976,292.832062}},
    {lvid=261995, gvid=187, pos = {-13.200880,3.716976,292.832062}},
    {lvid=261995, gvid=187, pos = {-11.400880,1.908976,292.832062}},
    {lvid=261995, gvid=187, pos = {-19.100880,7.600976,292.832062}},
}

function spawn_z_escape_1(section)
    local data = math.random(#pos_tbl) -- Один раз получить какую-то таблицу с координатами
    local lv  = data.lvid --Левел вертекс
    local gv  = data.gvid --Гэйм вертекс
    local pos = data.pos  --Position - Это таблица с координатами x,y,z
    local x = pos[1] -- теперь уже из таблицы 'pos' получаем первое поле 'x'
    local y = pos[2] -- второе 'y'
    local z = pos[3] -- и наконец третье 'z'
    return alife():create(section, vector():set(x,y,z),lvid,gvid) --Около фермы
end

function r_zombie_1()
    spawn_z_escape_1("zombie_new_k_1")
    spawn_z_escape_1("zombie_new_k_1")
end 
Изменено пользователем Nazgool
  • Спасибо 1
Ссылка на комментарий

@Nazgool, а у меня ведь была идея сделать из pos еще одну таблицу... :(

Что я понял из вашего кода:

1) Вы гениальны.

2) благодаря этой строчке:

    local data = math.random(#pos_tbl) -- Один раз получить таблицу с координатами 

можно решить проблему вызова левел-вертексов, гейм-вертексов и координат x, y,z  из разных set_0*

3)  То что в вашем коде pos является таблицей, а pos[1] - x и т.д.

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

Даже не знаю как и отреагировать.
@Kober(BRUC)
Почитай доки. Там написано ровно столько, чтобы все стали гениальны :)

Это код не окончательный, а только для разъяснения.
Окончательный выглядит несколько иначе, т.к. ещё не всё разобрали. 

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

@Nazgool, а чем же окончательный отличается? Вроде бы и этот прекрасно должен работать.

Я кажется понял отличие. Нет числа рандомного спавна. Точнее от сколки и до сколки зомби заспавнятся.

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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