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

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

14 часов назад, Firestarter сказал:

что это означает процент шанса

В оригинале вероятность появления новых артов в аномалиях после выброса 17%. 

 

10.11.2021 в 09:44, Space.Marine сказал:

if math.random(1,100) > 17 then

 

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

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

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

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value)

как только не загружал: 
load_variable("energy")
load_variable(energy)
load_variable("energy",nil)
load_variable("energy",0)

 Варианты?

upd: ошибся, данный вылет при загрузке сейва. 
При сохранении всё работает. 

 

Есть, конечно, вариант, что я вызываю функцию не там, хотя не знаю, вызов идёт в самом конце функции function actor_binder:load(reader) в бинде сталкера

 

God save Hatsune Miku!

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

вызов идёт в самом конце функции function actor_binder:load(reader) в бинде сталкера

Лучше, на мой взгляд, загружать сохраненное в net_spawn в том же биндере, после строки db.add_actor(self.object). Не знаю, что за load_variable у тебя, но если использовать штатные ф-ции(которых примеры тебе выше уже привели), то все должно работать.

 

Цитата

присвоить ей значение 10 в начале игры

Это делай в скрипте, ранее загрузки сохраненного значения.

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

@AndreySol 

load_variable это как раз и есть та функция, что мне выше привели

-- Загружаем переменную
function load_variable(variable_name, value_if_not_found)
   return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

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

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

God save Hatsune Miku!

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

Варианты?

Вообще-то. Варианты зависят от того, какова цель всего этого действа.

Если а) Сделать комбез с энергопитанием. То можно брать давно сделанные (Более 10 лет назад!!!), готовые, отработанные и надежные решения. Ну или поискать другие готовые аналоги, если этот чем-то не нравится. аналогов за 10 с лишним лет, сделано было предостаточно.

Если б) Разобраться в скриптах, освоить луа, "сделать самому". (На самом деле единственная внятная причина, объясняющая почему не взять готовое) - то можно было бы, свои вопросы на форуме адресовать не телепатам, а обычным форумчанам. Так скорее помогут, правда. Пока в твоих постах нет ни твоего кода, ни логов вылетов, они адресованы скорее телепатам и гадалкам. Некоторые конечно пытаются угадывать, что там у тебя происходит. Правильно ли они угадывают? Это никому не известно. Если ты хочешь разобраться, то множить неизвестные - не лучшее решение.

  • Спасибо 1
  • Согласен 3

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

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

@Zander_driver Опустим все подробности, на данный момент мне нужно просто:
1. Научится сохранять переменную в Pstor

2. Научится при загрузке сохранения её считывать оттуда

Как минимум, хочу именно в этом разобраться.  

God save Hatsune Miku!

Ссылка на комментарий
3 минуты назад, Labadal сказал:

1. Научится сохранять переменную в Pstor

local x = 10 -- твоя переменная
xr_logic.pstor_store(db.actor, "my_unique_x", x) -- Сохранена.

 

5 минут назад, Labadal сказал:

при загрузке сохранения её считывать оттуда

local def_val = 0 -- Значение по умолчанию. Если окажется, что переменная не сохранялась
local x = xr_logic.pstor_retrieve(db.actor, "my_unique_x", def_val) -- Загружено.

 

  • Спасибо 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.

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

@Zander_driver вот результаты: 
 

Скрытый текст
В файле en.script обьявляю переменную:
energy = 10
В файле bind_stalker.script: 
Сохраняю: 
В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy)
Загружаю: 
В функции function actor_binder:net_spawn(data) после строчки: db.add_actor(self.object) таким образом: 
	 
local test = 5 
en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test)

что в итоге: 
При начале новой игры в переменной energy присваивается не 10, как указано в файле en.sctipt, а значение локальной переменной test - из кода загрузки. 
В последующие сейвлоады, при каждой загрузке, ей присваивается значение 5, а не то, которое было сохранено.

 

Скрытый текст
В файле en.script обьявляю переменную:
energy = 10
В файле bind_stalker.script: 
Сохраняю: 
В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy)
Загружаю: 
В функции function actor_binder:load(reader) таким образом: 
local test = 5 
en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test)

что в итоге:
При загрузке происходит вылет, с таким вот логом: 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value)

 

 

Помимо прочего: Я выводил в лог значение сохраненной переменной - сохраняет оно правильно. 

God save Hatsune Miku!

Ссылка на комментарий
46 минут назад, Labadal сказал:

load_variable это как раз и есть та функция, что мне выше привели

Не нужная совсем обертка.

 

Попробуй сохранять значение в net_destroy биндера, в самом начале ф-ции.

Ссылка на комментарий
7 часов назад, Space.Marine сказал:

В оригинале вероятность появления новых артов в аномалиях после выброса 17%. 

 

 

Что интересно, в скинутом вами файле этого куска кода просто нет. И, если верить описанию мода, это даёт 100% вероятность спавна. 
Опять же, нихрена бы этого не понял без разъяснений - спасибо.

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

@Labadal, а зачем в функциях actor_binder:save/load использовать pstor? У них же есть свой net_paket?

 

В функции function actor_binder:save(packet):

   packet:w_float(en.energy)

В функции function actor_binder:load(reader):

   en.energy = reader:r_float()

 

Разместить в конце функций, начать новую игру.

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

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

Ссылка на комментарий
4 часа назад, Labadal сказал:
При загрузке происходит вылет, с таким вот логом:

При загрузке actor еще не зарегистрирован в db. Поэтому db.actor == nil, о чем лог и сообщает. Запись в пстор вообще говоря, удобнее делать где-нибудь до сейва.

А если именно в save и в load, то лучше через net_packet, как выше уже сказали.

 

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

  • Спасибо 1
  • Согласен 2
  • Полезно 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.

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


Доброго дня, нашёл такую функцию: 

--/ определяем название секции патронов в активном стволе NPC
function Get_ActiveAmmoSection(oNPC) --/< (npc or nil)
  if not oNPC then oNPC = db.actor end
  local oItem = oNPC and oNPC:active_item()
  if oItem and isWeapon(oItem) then --/ проверка: оружие ли в руках?
    local soWeapon = sim:object(oItem:id())
    if soWeapon then
      local iAmmoType = Get_AmmoType(soWeapon) --/< получаем тип патронов в стволе
      if iAmmoType then
        return Get_AmmoSection(oItem:section(),iAmmoType) --/> "ammo_section" (or nil)
      end
    end
  end
  return nil --/>
end

Но при использовании ругается на sim 
Кто нибудь знает, что это и где его объявить?
В lua helper есть похожая функция, там переменная sim объявлена как:

local sim             = nil --/ переменная, кеширующая функцию alife()

Или, может кто знает другой способ узнать секцию патронов в активном слоте

God save Hatsune Miku!

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

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

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

God save Hatsune Miku!

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

Как можно отследить выстрел из оружия?

1. Поставить движок OGSR.

2. Использовать в бинд_сталкере колбек on_actor_weapon_fire.

 

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

@aromatizer по теме есть что сказать? Или ты просто посты набиваешь.

  • Спасибо 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.

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

 

А можно ли "отследить" изменение переменной? 
Вот, к примеру, выполнить код, если переменная X уменьшилась, скажем, на 5. 

upd: 
Есть такой вот скрипт: 

Скрытый текст
local old_ai_id = 0
local check_ammo = false

function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "оружие" then
				check_ammo = true
				on_change_wpn(ai)
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_shoot() end
		end
	end
end



function on_change_wpn( obj )
	ammo_old = obj:get_ammo_in_magazine()
end

function on_actor_shoot()
--тут что делать после выстрела
end

 

Он, в целом, работает - но проблема в том, что работает одноразово. Выстрелил  - сработало. Чтобы сработало ещё раз, нужно снять с себя оружие и повесить его обратно в слот. 

Намекните как править

God save Hatsune Miku!

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

upd: 

работать перестает после перезарядки оружия
Перезарядил, нужно вытащить из слота и поставить обратно.  печально. 

upd: нет, дело не в перезарядке, "ломается", когда истратил все патроны, т.е. когда колво-патронов становится равно 0

Или ,всё таки, в перезарядке

upd: 

разобрался

Если вдруг кому-то понадобится в будущем данный костыль, вот: 
*Отследить выстрел из оружия/отследить выстрел при стрельбе*

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

1. Основная функция, вешаем на апдейт: 

local check_ammo = false
local old_ai_id = 0
function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "имя секции оружия" then
				check_ammo = true
				ammo_old = ai:get_ammo_in_magazine()
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_pay() end
		end
	end
end

2. Функция on_actor_pay():

function on_actor_pay()
-- тут код того, что вы хотите сделать при выстреле
this.start_timer() - запуск таймера
end

3. таймер: 

   function action_timer()
      old_ai_id = 0
   end
 
   function start_timer()
      local iTimer = time_global() + 1000
 
      local function check_timer()
         return time_global() > iTimer
      end
 
      level.add_call(check_timer, action_timer)
   end

Таймер нужен, чтобы присвоить переменной old_ai_id значение 0 через секунду. (этого времени хватает для "перезарядки" оружия) если присвоить переменной old_ai_id значение 0 до того, как оружие перезарядится - функция on_actor_pay() будет срабатывать много раз, пока оружие не перезарядится. Находясь в апдейте - это действительно много раз. 

4. функция preload(), тоже на апдейт:

function preload()
local ai = db.actor:active_item()
	if ai and ai:section() == "имя секции оружия" then
	local curr_ammo_preload = ai:get_ammo_in_magazine()
		if curr_ammo_preload == 0 then
		check_ammo = false
		old_ai_id = 0
		end
	end
end

Нужна для решения бага, который возникал в случае самовольной разрядки оружия, после которого функция "gun" переставала работать. 

 

upd: Да, костыль. Да, корявый. Да, нагружает апдейт.  Но это лучшее решение для тех, кто не хочет/не может качать, к примеру, ОГСР двиг, в котором, как сказал ранее товарищ @Zander_driver, есть для этого каллбек. 

  • Смешно 1

God save Hatsune Miku!

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

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...