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

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

@Sla-Sla, очень сомнительно.

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

Хуже того у тебя количество патронов - это количество пачек на самом деле и у тебя в списке 15 строчек 5.45 х15.

Заведи таблицу, в которой ключом будет секция, значением количество. В ней аккумулируешь информацию о количестве предметов с одинаковой секцией.

Тогда функция FillList будет примерно такой:

 

function CUIScriptInventory:FillList()
  local temp = {}
  for i=0, db.actor:object_count()-1 do
    local obj = db.actor:object(i)
    local quan = temp[obj:section()]
    if quan == nil then
      quan = 0
    end
    --учесть на будущее количество патронов в пачке
    quan = quan + 1
    temp[obj:section()] = quan
    --возможно стоит запоминать еще ид предметов
  end
  
  for section, quantity in pairs(temp) do
    local item = ItemList()
    item:SetSection(section)
    local name = game.translate_string(system_ini():r_string(section, "inv_name"))
    item.text:SetText(name .. " x"..quantity)
    self.list:AddItem(item)
  end
end
Изменено пользователем abramcumner
  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

@hi_flyer, можно, если известно его имя из all.spawn, или еще какой-нибудь идентефикатор (id или story_id)

local respawn = alife():object("respawn_name")

respawn:spawn(100)

Изменено пользователем naxac
  • Спасибо 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Как отрисовать линию от точки A до точки B? Имееться ввиду линия в 3d пронстранстве, проекцируемая на наш 2d монитор. Не прибугая к средствам DirectX, используя сугубо LUA. Наверняка в движке подобные ф-ии заложенны.

Не соответствует правилам.

Ссылка на комментарий
используя сугубо LUA

 

 

Наверняка в движке

Сами себе противоречите. Таки вам надо на Lua, или в исходниках движка ковыряться.

 

Если все же на Lua, то вот

function point_projection(point)
--проекция точки в 3д-пространстве игры на экран 
    local dev = device()
    local scr_w = dev.width
    local scr_h = dev.height

    local fov2 = (dev.fov/2) * (math.pi/180)
    local scr_dist = 0.5 * scr_h / math.tan(fov2)

    local ppp = vector():sub(point, dev.cam_pos)
    local dp = dev.cam_dir:dotproduct(ppp)

    local x = 512 + dev.cam_right:dotproduct(ppp) * scr_dist / dp * (1024/scr_w)
    local y = 384 - dev.cam_top:dotproduct(ppp)   * scr_dist / dp * (768/scr_h)
    return {x, y}
end
--Функция учитывает возможное разрешение экрана, режим зума и то, что камера может наклоняться. Можно использовать в различных целеуказателях.

function add_traectory(start_pos, fin_pos, step_pix)
-- функция генерирует набор точек, лежащих на прямой, соединяющей точки start_pos {x, y}, fin_pos {x, y}. точки выражены как таблицы с двумя числами.
-- третий аргумент step_pix - число. величина шага между точками в пикселах.
-- возвращает таблицу, заполненную элементами вида {x, y}, т.е. координатами точек. 
    local v1 = vector():set(start_pos[1], start_pos[2], 0)
    local v2 = vector():set(fin_pos[1], fin_pos[2], 0)
    local d = v1:distance_to(v2)
    local vtable = {}
    if d > step_pix * 2 then
        local step_count = round(d / step_pix)
        local x_step_size = (fin_pos[1] - start_pos[1]) / step_count
        local y_step_size = (fin_pos[2] - start_pos[2]) / step_count
        local i = 1
        while i < step_count do
            local t_x = round(start_pos[1] + (x_step_size * i))
            local t_y = round(start_pos[2] + (y_step_size * i))
            local t = {t_x, t_y}
            table.insert(vtable, t)
        i = i + 1
        end
    end
    return vtable
end

 

 

Изменено пользователем Zander_driver
  • Полезно 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Если в СЗ тоже будут подробные комментарии, то мод однозначно станет востребованной платформой для создания других проектов. 

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

Изменено пользователем aromatizer
  • Согласен 2

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

@aromatizer, Ну я практически из файлов мода это и взял. Без подробных комментариев я бы сам в СЗ давно запутался, т.к невозможно все про все скрипты и функции помнить, что она делает, по какому принципу работает и какой результат возвращает.

  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Всем доброго дня, такая проблема: вывожу в статик описание выбранного предмета, все работает, но если описание слишком длинное, то получается некрасиво и вообще фу. Как сделать многострочное поле для текста?

21f03074a392114c0f91ab89259416715b7a0224

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

@Sla-Sla, для тега text статика укажи параметр complex_mode="1". Но если описание будет слишком большое, то оно вылезет за нижнюю границу статика. Как вариант, можно вручную разбить текст на строки нужной ширины и сформировать из них список.

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

 

 

Как вариант, можно вручную разбить текст на строки нужной ширины и сформировать из них список.

В "СЗ" кстати, так и сделано. на сами статики выводится одна строчка, а разбивкой длинного текста на строки занимается отдельная функция, с учетом размера шрифта и ширины окна. Имхо, так удобнее + для любого текста можно сразу узнать, сколько строк он займет.

  • Согласен 1
  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий
@Sla-Sla, либо использовать CUIScrollView, в который добавлять статик с текстом. Изменено пользователем naxac
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

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

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

Добрый день. Как изменить логику(двери) скриптом? То есть есть файл enc_door и надо его заменить на enc_door_1. А точнее мне нужно скриптом дверь у Сидора открыть.

 

И: вот вызываю я функцию из функции(например:      Kober.outfit()  ). Но вызывать мне ее надо не из файла Kober.script, а из этого же файла в котором я вызываю. Например я вызываю из none.script. Мне тогда так и писать none.outfit()?


Правильно ли я создал таблицу?

 

 

T = {ammo_9x18_fmj

ammo_5.45x39_fmj

ammo_5.7x28_fmj}

 

function none ()
alife():create("T",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
end

 

 

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

@Kober(BRUC), функцию, которая написана в файле скрипта вызывается просто по имени, без указания, в каком файле. Из твоего примера - вызывать просто  outfit() внутри скрипта none.script .  А что насчёт таблиц:

 

 

-- "ammo_9x18_fmj" это строковый тип данных, не цифры, обозначаются всегда кавычками
-- к примеру переменная с числовым типом данных k = 1, и так же со строкой k = "string"

T = {"ammo_9x18_fmj",   -- в таблице должно быть перечисление каждой строки через запятую
"ammo_5.45x39_fmj",     -- кстати данные будут записаны в таком виде: T[1] = "ammo_9x18_fmj"
"ammo_5.7x28_fmj"}      -- таблица построена как массив, ключи выдаются по порядку. скажем "ammo_5.7x28_fmj" поставь первым - он будет первым
 
function none ()
-- движковая функция create вроде не предусматривает перебор в таблице по значениям,
-- потому надо "вручную" перебирать строки в таблице T и вызывать функцию с этим входным параметром
-- для этого надо цикл
 for key = 1, #T do   -- #T означает конечный ключ в таблице T (можно и так: for key, section in ipairs(T) только в функцию вместо T[key] просто section, но лучше загугли о таком) 
  -- входным параметром является значение в таблице T по ключу key, который будет с каждым повтором
  -- прибавлять +1 до #T (в нашем случае это будет 3, тк всего 3 строковых переменных в таблице)
  alife():create(T[key],db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
 end
end 

 

 

 

Надеюсь правильно объяснил. Оо

  • Спасибо 1

... А наше дело маленькое - с ружьём да по болотам. (с)

Ссылка на комментарий
Но вызывать мне ее надо не из файла Kober.script, а из этого же файла

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

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

Изменено пользователем Zander_driver

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Добрый день. Написал я такой код:


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



function spawn_z_escape_1(section)
 local lv = math.random(pos_tbl[set_0 .. math.random(1,4)]["lvid"]) --Левел вертекс
 local gv = pos_tbl[set_0 .. math.random(1,4)]["gvid"] --Гэйм вертекс
 local ps = pos_tbl[set_0 .. math.random(1,4)]["pos"] --Position
  return alife():create(section, vector():set(ps),lv,gv) --Около фермы
end

function r_zombie_1()
  spawn_z_escape_1("zombie_new_k_1")
  spawn_z_escape_1("zombie_new_k_1")
end 

 

 

 

Ловлю такой вылет:

 

Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...adow of chernobyl\gamedata\scripts\new_script.script:13: attempt to concatenate global 'set_0' (a nil value)

 

 

Не знаю как это собственно исправлять. Как я понимаю вылет из-за того, что он не может рандомно вызвать одно из четырех "set_0*". Значит ошибка здесь: [set_0 .. math.random(1,4)]. Но вот как мне по-другому вызывать? :russian_ru: 

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

@Kober(BRUC), не изобретай велосипед...

Вот готовый код, пользуйся :) .

 

 

local tbl_dekoder_red={
{
position={x=70.637008666992,y=16.557912826538,z=18.104104995728},
lv=253116,
gv=371

--position={x=44.793453216553,y=0.91162407398224,z=243.92503356934},
--lv=218601,
--gv=359

},
{
position={x=-58.544227600098,y=23.022161483765,z=-102.28317260742},
lv=158711,
gv=296
},
{
position={x=-66.466384887695,y=20.586454391479,z=111.6127166748},
lv=107654,
gv=336
}
}
local a = tbl_dekoder_red[math.random(table.getn(tbl_dekoder_red))]

function spawn()
alife():create("af_cristall", vector():set(a.position.x,a.position.y,a.position.z), a.lv, a.gv)

end

 

 

Не соответствует правилам.

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

@CRAZY_STALKER666, проблема то в том, что пользоваться мне этим не особо то и надо. А ваш велосипед я в интернете находил(иль похожий). А свой писать начал, так как интересно сделать что-то свое... Хоть это уже и есть, и даже лучше... но это то свое! :D

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

@Kober(BRUC)

2.5.4 - Конкатенация

Оператор конкатенации (соединения) строк в Lua обозначается двумя точками ('..'). Если оба операнда являются строками или числами, то они будут преобразованы в строки согласно правилам §2.2.1. Иначе будет вызван метаметод "concat" 

...

2.2.1 - Приведение типов

Lua обеспечивает автоматическое преобразование между строковыми и числовыми значениями в процессе выполнения...

Разберись, какие значения операндов в

set_0 .. math.random(1,4)

abramcumner

Решения давать не хорошо :)
Человек хочет свое делать. А как он будет делать, если пока не понимает основ?

Там же ещё ошибки есть.

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

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

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

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

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

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

Войти

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

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

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