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

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

Помогите установить метку

Скрытый текст

function random_anom_spawn()
    local section = anom[math.random(table.getn(anom))]
    local lv = math.random(level_vertexes[level.name()]["lvid"])
    local gv = level_vertexes[level.name()]["gvid"]
    for i = 1, count do
    create_anom(section, level.vertex_position(lv), lv, gv, 1.5, 1.0)
    level.map_add_object_spot_ser(section.id, "zone_zdn_mapspot", gts("st_ui_pda_legend_special"))
end
end

Но метка ставится на гг

 

Ссылка на комментарий
1 час назад, Colder сказал:

Помогите установить метку

Да легко!

Сейчас телепаты проверят правильность таблиц "anom" и "level_vertexes", а также корректность функции "create_anom" и, поняв откуда берётся "count", быстро подскажут, где ошибка.

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

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий
22.10.2023 в 22:02, Colder сказал:

section.id

section тут - это строка, видимо? Нужно что-то вроде

local obj = creare_anom(....

level.map_add_object_spot_ser(obj.id, .....

Ну, и функция  create_anom должна возвращать заспавненный объект.

22.10.2023 в 22:02, Colder сказал:

метка ставится на гг

Потому что первый аргумент в level.map_add_object_spot_ser равен nil

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

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

naxac.gif

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

Решил переделать гравиган/гравипривод ну т.е. НПС работают с этим прибором через скриптовые схемы ИИ. Надо чтобы в момент захвата НПС удерживал захваченный предмет в прицеле, т.е. пока оружие подлетает к оператору он должен целиться на него. Эвалуатор работает, а вот экшен не всегда. Вот такой код.

Скрытый текст
class "action_operator_gravygun" (action_base)
function action_operator_gravygun:__init(npc, action_name, storage) super(nil, action_name)
	self.st = storage
end

function action_operator_gravygun:hit_callback(amount, dir, who)
	local npc = self.object
	log1("action_operator_gravygun:hit_callback() name: "..npc:name())
end

function action_operator_gravygun:initialize()
	action_base.initialize(self)
	local npc = self.object
--	if npc:path_completed() then
--		npc:set_desired_position()
--		npc:set_desired_direction()
--	end
--	npc:set_mental_state(anim.danger)
--	npc:set_item(object.aim1, npc:active_item())
	log1("action_operator_gravygun:initialize()["..time_global().."] name: "..npc:name())
end

function action_operator_gravygun:execute()
	action_base.execute(self)
	local npc = self.object
	local wpn = npc:active_item()
	if wpn and wpn:section()==gdrive_section then 
		local target = wpn:binded_object().target
		if target then
			state_mgr.set_state(npc, "threat_heli", nil, nil, {look_object = target}, nil, nil, {yaw_delta=10})
		end
	end
end

function action_operator_gravygun:finalize()
	action_base.finalize(self)
	local npc = self.object
	log1("action_operator_gravygun:finalize()["..time_global().."] name: "..npc:name())
end

 

Делал на основе схемы rx_ff Bak'а, наверное надо initialize доделать, а именно раскомментировать код или ещё как настроить.

  • Нравится 1
  • Полезно 2

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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

А что возвращает best_item? Написано, это объект который монстр хочет пожевать, а я думал это предмет который сталкер хочет подобрать. И вообще, как узнать что НПС хочет что-то подобрать.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Ссылка на комментарий
21.10.2023 в 18:54, Капрал Хикс сказал:

в оригинале ТЧ можно влиять на голод ГГ скриптами? Скажем, повесить на апдейт увеличение сытости при наличии в инвентаре определённой брони?

в чистом ТЧ нельзя, надо ставить правки/другой движок X-ray Ext/OGSR где игровому объекту актор добавлен метод движка db.actor.satiety = нужное значение, в оригинале же можно например скриптом заспавнить еду и заставить игрока её съесть, чтоб убрать голод, в оригинале ТЧ только 2 фактора влияют на голод, это время - уменьшает сытость и еда -увеличивает, больше ничего не влияет(

  • Нравится 1
  • Согласен 1
  • Полезно 2
Ссылка на комментарий
21.10.2023 в 14:54, Капрал Хикс сказал:

Подскажите, в оригинале ТЧ можно влиять на голод ГГ скриптами? Скажем, повесить на апдейт увеличение сытости при наличии в инвентаре определённой брони?

Разве что спавнить с каким-то интервалом по времени невидимый батон и съедать его по-тихому.

 

P.S. Только сейчас заметил пост выше))

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

Вроде как можно делать свои функции глобальными, не добавляя их в [_g.script].

Следующая запись дает вылет при вызове из другого скрипта:
_G.new_fx = function(…)

вызов new_fx(…)

 

Как правильно оформить такую функцию?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Попытка переноса времени из одной метки CTime() в другую: порядок значения в мс похож на нужный год, но после вычислений не получается и половины требуемого значения. Где ошибка?

Spoiler
local ct0 = game.CTime()		-- 01/01/0001 00:00:00
local ct = game.get_game_time()		-- 01/05/2015 06:45:00
local ms = ct:diffSec(ct0) * 1000	-- ~ 64 * 10^12

local dt = game.CTime()
dt:setHMS(0, 0, ms/1000)

local ct1 = ct0 + dt			-- 19/01/0069 03:14:00

 

Есть прямая копия метки, но требуется запись diffSec в память с последующим восстановлением.

 

 

Дополнительный вопрос: почему последовательно прочитанные значения diffSec при аргументах "текущее время / время 0" получаются одинаковыми при разнице до получаса игрового времени?

https://drive.google.com/file/d/1z5AiT9F6ddl5fPDlOXjV9N8y10QS2d7I

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

@Norman Eisenherz скорее всего, дело в типе и размерности промежуточных переменных. 69 год - это (примерно) ёмкость int. Я бы предположил, что ограничение начинает работать где-то в строке "local ms = ...", поскольку diffSec сама по себе возвращает вполне вместимый float результат. Но это надо проверять.

Только зачем превращать сохраняемое значение в миллисекунды? Сохранять и восстанавливать можно непосредственно результат diffSec без промежуточных умножений и делений.

Ну а лично я сохранял бы в сейве все составляющие даты:

   local year, month, day, hour, min, sec, ms = ct:get()

и восстанавливал потом также из всех:

   local ct1 = game.CTime()
   ct1:set(year, month, day, hour, min, sec, ms)

  • Нравится 3
  • Полезно 1
Ссылка на комментарий
3 часа назад, Norman Eisenherz сказал:

Дополнительный вопрос: почему последовательно прочитанные значения diffSec при аргументах "текущее время / время 0" получаются одинаковыми при разнице до получаса игрового времени?

https://drive.google.com/file/d/1z5AiT9F6ddl5fPDlOXjV9N8y10QS2d7I

Точность флоата - 7 десятичных разрядов. У тебя на скрине какой-то смысл имеют старшие 7 разрядов у чисел, в остальных мусор.

Интересное наблюдение - разница между числами у тебя на скрине 4096 :) Вот с такой точностю с такими большими значениями работает флоат.

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

Миллисекунды указаны по аналогии с обычным счетчиком game.time(). Сохранение diffSec в секундах не меняет картины: счет до 69-го года при подстановке и одинаковые значения diffSec при разных метках чч:мм:сс.

 

 

Еще вопрос: для чего полный набор значений читается показанным ниже способом, если метод ct:get() дает все те же значения и без ввода аргументов?

Spoiler
[utils.script]
if not editor() then
	CTime_0 = game.CTime()
end

function w_CTime( p, t )
	if t and not (t == CTime_0) then
		local Y, M, D, h, m, s, ms = 0, 0, 0, 0, 0, 0, 0
		Y, M, D, h, m, s, ms = t:get( Y, M, D, h, m, s, ms )

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
34 минуты назад, Norman Eisenherz сказал:

Миллисекунды указаны по аналогии с обычным счетчиком

В памяти игры время Ctime хранится в виде одного 64-битного ЦЕЛОГО чила, означающего количество миллисекунд, прошедших с 1-01-0001 00:00.

У тебя 69 год наводит на мысль о том, что diffsec использует формать 4-х байтового  float, где максимум = 2147483647 сек, что как раз и есть 69 лет.

Может чем-то поможет.

  • Нравится 2
Ссылка на комментарий
1 час назад, Norman Eisenherz сказал:

Еще вопрос: для чего полный набор значений читается показанным ниже способом, если метод ct:get() дает все те же значения и без ввода аргументов?

Возможно это наследие старых версий luabind. Когда-то можно было писать только с полным набором значений. Потом стало можно писать и пустой get, но скрипты править уже не стали.

6 часов назад, Norman Eisenherz сказал:

но после вычислений не получается и половины требуемого значения. Где ошибка?

А это тебя еще и функция setHMS подводит :)

в движке у нее аргументы типа int - так что да - больше 69 лет таким макаром не получишь.

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

local t = 0
local BACKPACK_SLOT = 8

 

function ItTank(obj)
    if not obj then return false end
    local list = {

    ["airtank"] = true,
}
    return list[obj:section()]
end

 

local toxic_level = ini_file([[items\settings\txr_toxic_level.ltx]]):r_float("hit_level", level.name())
local min_cond = sys_ini:r_float_ex("airtank", "inv_condition")

 

function item_to_tank()
    local slot = db.actor:item_in_slot(BACKPACK_SLOT)

    local function list(actor,obj)
    if slot and ItTank(obj) then
    if t < time_global() then

    local cond = obj:condition()
    obj:set_condition(cond-min_cond)
    db.actor.health = toxic_level+0.001
    t = time_global() + 1000
end
end
end
    db.actor:iterate_inventory(list,db.actor)
end

  • Всем привет.
  • У меня такая проблема если вставить в слот airtank, потом вытащить его и поставить другой. То хит наноситься всё равно 1 airtank который стоял до этого в слоте. Я так понимаю нужно присвоить ид предмету? Как мне это сделать?
Изменено пользователем Colder
Ссылка на комментарий

@Colder, функция "item_in_slot" возвращает объект, находящийся в заданном слоте. Перебирать инвентарь не нужно, можно сразу работать с полученным объектом и описанная "проблема" отпадёт сама собой.

  • Спасибо 1
  • Нравится 2
  • Согласен 1

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

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

Чем obj:set_fastcall(fx, obj) лучше/хуже level.add_call(fx1, fx2)? Оба варианта проверки активны только в онлайне, у обоих есть авто-отключение проверки при выполнении заданного условия и, если верить старым постам, одинаково частое срабатывание отдельно от апдейта ГГ.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Всем привет. Создал спальник который при использовании спавнит, матрас к гг под ноги и компресионый мешок в инвентарь. Возникла проблема что при использовании компресионого мешка на НЕ разрешеной дистанции компресионый мешок не спавнится обратно к гг.

Скрытый текст

local spawned_sleepbags = {}
local dist = 1.5

function on_item_sleep(obj)
    if obj:section() == "sleep_bag" then                    -- спальный мешок
    alife():create("compression_bag", pos, lvid, gvid, pid)            -- спавним компресионый мешок гг

    pos.x = pos.x + 1
    pos.z = pos.z + 0

    local matt = alife():create("mattress", pos, lvid, gvid)        -- спавним матрас
    spawned_sleepbags[matt.id] = true

    elseif obj:section() == "compression_bag" then

    for id, v in pairs(spawned_sleepbags) do
    local sp = level.object_by_id(id)
    if sp and (v == true) then

    local sp_distance = sp:position():distance_to(db.actor:position())
    if (sp_distance < dist) then

    alife():release(alife():object(sp:id()), true)                -- удаляем матрас и спавним мешок обратно
    alife():create("sleep_bag", pos, lvid, gvid, pid)

    local bag = db.actor:object("compression_bag")                -- удаляем компресионый мешок у гг
    alife():release(alife():object(bag:id()), true)
    spawned_sleepbags[id] = nil
    break
end
end
end
end
end

 

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

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

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

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

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

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

Войти

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

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

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