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

Скриптование


Svoboда

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

(изменено)

@abramcumner, А почему складываем время, прошедшее с последнего выброса, с временем между выбросами? И как из этого получилось время до следующего выброса?


 

 

Вариант abramcumner относится к CTime.
Ааа, понятно тогда Изменено пользователем Romz

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Kirgudu, Не, ну из приведённых мной кусков кода, может быть, конечно, не очень понятно, что и как, но у меня get_last_*_time возвращает, в секундах, время, прошедшее со времени окончания предыдущего выброса. А get_delta - возвращает текущий промежуток между выбросами. Тоже в секундах.

@Kirgudu, С секундами проще. Промежуток между выбросами - максимум четверо суток (игровых). CTime для моих задач, ИМХО, черезмерно.

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

Не обращайте внимания на мой пост - только запутал.
Не, почему же. В свете того, что работает с CTime, может кому-то ещё пригодится.

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вопрос к знающим.

Модуль se_stor на ЗП периодически, на переходе между локами, не сохраняет статистику ГГ, либо же не может её считать из сохранения.

В ЗП переход осуществляется же посредством проводников, и сохранения делаются дважды - первое на старой локе, возле проводника, именное, а второе - автосейв при переходе на локу, как в остальных играх серии. Так вот, иногда при переходе автосейв бъётся. Вылет с руганью, что se_stor не может прочитать статистику из чанка. При этом, если загрузиться с предыдущего сохранения, которое именное ("... - переход с ... на ...), и опять перейти, то уже переход осуществляется нормально, и статистика сохраняется и считывается. И в дальнейшем можно играть без проблем довольно продолжительное время, и переходить с локи на локу без каких-либо проблем, до момента Х, когда при очередном переходе не сохраняется, либо не считывается опять статистика.

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

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

Скрипты статистики я не трогал, сразу говорю...

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Всем привет.  Нужна некоторая помощь.
Есть мод для Зова Припяти - авторазряжание подбираемых стволов.
И в нём есть вот такая функция

 

function ts_get_weapon_ammo_type(sobj)
  local stpk=net_packet()
  stpk:w_begin(0)
  sobj:STATE_Write(stpk)
  local size=stpk:w_tell()

  stpk:r_seek(size-2)

  return stpk:r_u8()
end

 

По контексту должна возвращать тип боеприпаса в стволе, в виде номера 0 или 1, что соответствует обычному или бронебойному патрону (например). При правленом движке, если количество типов боеприпасов для ствола может быть больше, то и цифры могут быть больше.

Я пытаюсь этот мод прикрутить для работы в ТЧ.

Так вот, в ТЧ вышеприведённая функция выдаёт неверное значение. В моём случае - двухзначный номер, 66 или 25 для разных стволов.

Я так подозреваю, она неверное место нетпакета для ТЧ читает.

А так как сам я в нетпакетах ни в зуб ногой, то и прошу помощи уважаемого сообщества.

Как эту заразу переписать, чтобы она верное значение в ТЧ выдавала?

Поиском по темам пробежался, но ничего не попалось...

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@naxac, Не-а, не взлетело... То же самое, только сбоку. Для того ствола, для которого выдавала 25, теперь выдаёт 89.


Чтоб было понятнее, вот кусок мода, который, собственно, отвечает за определение типа боеприпаса в стволе.

 

 

function ts_get_weapon_ammo_type(sobj)
  local pk = net_packet()
  cse_alife_item_weapon.STATE_Write( sobj, pk )
  pk:r_seek( pk:w_tell() - 2 )
  return pk:r_u8()
end

function ts_ammo_discharge(wpn)
	local	name = wpn:name()
	local	ammo_count = wpn:get_ammo_in_magazine()
	if ammo_count>0 then
		local ammo_type = ts_get_weapon_ammo_type( alife():object(wpn:id()) )
		ts_log("ts_ammo_discharge", name.." => ammo_count="..ammo_count.."  ammo_type="..ammo_type)
		local section_ammo = ts_ammo_by_num(wpn:section(),ammo_type)
		if section_ammo~=nil and string.find(section_ammo,"ammo") then
			local str1 = string.format("боеприпас %s (%d)",string.sub(section_ammo,6,30), ammo_count)
			ts_log("ts_ammo_discharge",str1)
			ogse.send_tip(str1,"Патроны")
			--add_hud("hud_event","Патроны: "..str1)
			--ts_hud_msg(str1,3)
			ogse.spawn_ammo_in_inv(section_ammo, ammo_count, nil)
			wpn:unload_magazine()
		else
			if section_ammo == nil then
				section_ammo = "<nil>"
			end
			ts_log("ts_ammo_discharge","Ammo section fail: "..section_ammo)
		end

	end
end

function parse_names_mod( s )
	local t = {}

	--отсечка коментария
	local pos =  string.find(s,";")
	local ps = ""
	if pos ~= nil and pos > 0 then
		ps = string.sub(s,1, pos - 1)
	else
		ps = s
	end

	for name in string.gfind( ps, "([%w_.\\-]+)%p*" ) do
		table.insert( t, name )
	ts_log("ts_ammo_by_num => parse_names_mod ",name)
	end

	return t
end

--найти аммо по номеру
function ts_ammo_by_num(section,num)

	local ammo_list

	ts_log(tostring(weapon_ammo[section]), "")
	if weapon_ammo[section] ~= nil and weapon_ammo[section] ~= "" then
		ammo_list = weapon_ammo[section]
		ts_log("ts_ammo_by_num",section.." => Found: "..ammo_list)
	else
		local ltx = system_ini()
		ammo_list = ltx:r_string(section,"ammo_class")
		weapon_ammo[section] = ammo_list
		ts_log("ts_ammo_by_num",section.." => Loaded: "..ammo_list)
	end


	for n,v in pairs(parse_names(ammo_list)) do
		ts_log("ts_ammo_by_num","....."..n.." -> "..v)
	end

	local t=parse_names_mod(ammo_list)

	local cnt = table.getn(t)
	ts_log("ts_ammo_by_num","....."..tostring(cnt))
	if cnt == 0 then
		return nil
	elseif num >= cnt then
		return t[1]
	else
		return t[num+1]
	end

end

 

 

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

OGSE?
Ага.

 

лучше используй
Не хотелось бы. Я планирую максимально привести к оригиналу ТЧ и выложить в общий доступ. Вдруг кому ещё понадобится. Хотя можно и проверками обвязать на два варианта...
  • Нравится 1

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

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

Суть его вот в чём.

ТЧ при переходе на другую локу сперва делает автосохранение, а потом прибивает актора (пишу как сам понял на основе проведённых экспериментов).

Так вот, похоже, что уничтожение инвентаря воспринимается движком как выкидывание всего из него. Сделал такой вывод на основе того, что вызывается метод "actor_binder:on_item_drop". А увидел я это потому, что из этого метода происходит вызов скрипта авторазряжания. О чём он и сообщает в логе, и сообщениями на экране, т.к. пытается разряжать всё, что есть в инвентаре с патронами, кроме стволов в слотах. А на следующей локе, после спавна актора, его состояние, и, в частности, содержимое инвентаря, грузится из автосохранения, поэтому патроны не размножаются.

Собственно, баг заключается в том, что некоторые патроны не нравятся se_respawn.create_ammo, который вызывается для собственно спавна патронов в инвентарь. Или же, что более вероятно, он просто не успевает заспавнить патроны, потому что актора и его инвентаря уже нет. Как результат,

 

вылет с логом

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
CScriptEngine::lua_error
LUA error: %s
c:\gam\ogse20\gamedata\scripts\se_respawn.script:1059: attempt to index local 'sitem' (a nil value)
info-called from CPP

Хочу заметить, что se_respawn.create_ammo в ОГСЕ отличается от такового в чистой ТЧ 1.0006

Для сравнения: это из чистого ТЧ

function create_ammo(section, position, lvi, gvi, pid, num)
	local ini = system_ini()

	local num_in_box = ini:r_u32(section, "box_size")

	while num > num_in_box do
		alife():create_ammo(section, position, lvi,	gvi, pid, num_in_box)
		num = num - num_in_box
	end
	alife():create_ammo(section, position, lvi,	gvi, pid, num)
end

и из ОГСЕ 2.08

function create_ammo(section, position, lvi, gvi, pid, num)
	local ini = system_ini()

	local num_in_box = ini:r_u32(section, "box_size")

	while num > num_in_box do
		local sitem = alife():create_ammo(section, position, lvi, gvi, pid, num_in_box)
		local sammo = alife():object(sitem.id)
		sammo:use_ai_locations(false)
		num = num - num_in_box
	end
	local sitem = alife():create_ammo(section, position, lvi, gvi, pid, num)
	local sammo = alife():object(sitem.id)--   <---- СТРОКА 1059
	sammo:use_ai_locations(false)
end

Есть ли какой-то способ в ТЧ отследить начало перехода на другую локу? Желательно - до автосейва.

Я пробовал в скрипты подставлять конструкцию

if(device().precache_frame > 1) then return end
Не срабатывает. Проверка на существование актора, типа
if db.actor then чтото делаем end
тоже не прокатывает.

Бъюсь уже второй день...

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

К моему посту выше: http://www.amk-team.ru/forum/topic/6185-skriptovanie/?p=1005130

В качестве временной затычки добавил в se_respawn от ОГСЕ функцию se_respawn.create_ammo от оригинала, но под другим именем. И для работы скрипта авторазряжания вызываю её. В этом случае вылет не происходит, хотя actor_binder:on_item_drop продолжает вызываться при переходе. И, судя по логам, при завершении игры. Т.е. при любом развоплощении актора.

Добавление se_respawn.create_ammo от ТЧ в сам скрипт ts_mod_soc.script результата не принёс, игра начала просто валиться с FATAL ERROR, без указания на причину подобного.

На чистом ТЧ 1.0006 скрипт в первоначальном виде работает без вылетов, хотя на переходах пытается, по вышеуказанной причине, разряжать всё, что с патронами есть в инвентаре.

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

при перезагрузке содержимое инвентаря актера уничтожается, как и сам актер
Это то понятно. Просто в ТЧ оно как-то очень медленно уничтожается. В ЗП с этим скриптом таких проблем не было. Он даже не пытался на переходе сработать.

 

if alife():object(item:id()) == nil then return end
Не взлетело. Тот же самый вылет. Я, в принципе, пытался ставить проверку на существование целого актора, тоже безуспешно.

Надо отследить событие перехода и при его начале обрубать on_item_drop и on_item_take заодно.

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

if level.present() then
Не проканало.

 

при переходе на другую локацию перед сохранением актору прописывается новая позиция
Возможно и так, но actor_binder:on_item_drop, похоже, срабатывает раньше.

Вот, для примера, две позиции актора: первая - это ГГ стоит возле перехода на Кордоне, а вторая - ГГ шагнул в переход, согласился, что он будет переходить, и игра вылетела

 

position [ x = 14.738349914551, y = 16.390243530273, z = 680.48516845703]
 level_vertex_id [290085]
 game_vertex_id [207]

position [ x = 15.06812286377, y = 16.482328414917, z = 684.87188720703]
 level_vertex_id [290880]
 game_vertex_id [207]

 

 

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, Вот в этом месте я не уверен. Позицию в лог выдаёт такая конструкция

npc=db.actor -- это так и у Tonny 
ts_log("spawn_ammo_in_inv","sect ["..tostring(section).."] npc ["..npc:name().."]" .."\n".."position [ x = "..tostring(npc:position().x)..", y = "..tostring(npc:position().y)..", z = "..tostring(npc:position().z).."]".."\n".." level_vertex_id ["..tostring(npc:level_vertex_id()).."]" .."\n".." game_vertex_id ["..tostring(npc:game_vertex_id()).."]" .."\n".." npc ID ["..tostring(npc:id()).."]" .."\n".." number ["..tostring(num_ammo).."]")

 

 

в файле биндера объявил переменную
Дык, при переходе же переменные обнуляются? Я с этим ещё в ЗП столкнулся. Из-за чего и пришлось городить весь огород с se_stor.

Хотя, она может и не успеть обнулиться к моменту начала переноса


@Zander_driver, У скрипта есть вызов в _g.start_game_callback. Можно внутри этого вызова сохранить текущую локу.

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, @Zander_driver, Засунул сохранение локи в actor_binder:__init. Лока успешно сохранилась

 

function ts_on_init()
	level_name = level.name()
	ts_log("ts_on_init\t\t","level_name = "..tostring(level_name))
end

 

Но при переходе в нужном месте лока не сменилась

 

function ts_on_item_drop(obj)
local lname = level.name()
ts_log("ts_on_item_drop\t\t","level_name = "..tostring(level_name))
ts_log("ts_on_item_drop\t\t","lname = "..tostring(lname))
if lname == level_name then

 

 

Лог происходящего при переходе

 

(908792.6875) = ts_on_init		 => level_name = l01_escape 
(908803.1875) = ts_on_item_drop		 => level_name = l01_escape 
(908803.1875) = ts_on_item_drop		 => lname = l01_escape 
...
овердофига строк
...
(908960.8125) = ts_on_item_drop		 => ... 
(908960.8125) = ts_on_item_drop		 => level_name = l01_escape 
(908960.8125) = ts_on_item_drop		 => lname = l01_escape 
(908960.8125) = ts_on_item_drop		 => ... 
(908960.8125) = ts_ammo_discharge		 => wpn_swd_svd20_grip_pso148402 ammo_count = 20 ammo_type = 1 
(908960.8125) = ts_ammo_discharge		 =>  Боеприпас 7,62х54 мм 7H14 (20 шт.) 
(908960.8125) = spawn_ammo_in_inv => sect [ammo_7.62x54_7h14] npc [single_player]
position [ x = 15.305265426636, y = 16.479644775391, z = 684.7421875]
 level_vertex_id [290880]
 game_vertex_id [207]
 npc ID [0]
 number [20] 
(908960.8125) = ts_on_item_drop		 => level_name = l01_escape 
(908960.8125) = ts_on_item_drop		 => lname = l01_escape 
(908960.8125) = ts_on_item_drop		 => ... 
...
ещёмногострок
...
(908960.8125) = ts_on_item_drop		 => level_name = l01_escape 
(908960.8125) = ts_on_item_drop		 => lname = l01_escape 
(908960.8125) = ts_on_item_drop		 => ... 
(908960.8125) = ts_on_init		 => level_name = l02_garbage 

 

Или я как-то не так это делаю?


Попробовал определить локу вот так

 

local sim = alife() -- получаем сам объект класса alife_simulator
local sactor = sim:actor() -- получаем серверный объект для актора
local lid = sim:level_id() -- если подставить sactor, то ругается, что у него нет level_id и вылетает
local lname = sim:level_name(lid)

 

Тоже с вышеприведённым результатом

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

трабла в самом изначальном решении разряжать оружие в on_item_drop... В чем смысл-то ?
Сие надо бы у автора сего творения спрашивать. Я лишь пытаюсь заставить это нормально работать под ТЧ вообще и ОГСЕ в частности. И если в чистом ТЧ оно работает без вылетов, несмотря на срабатывание actor_binder:on_item_drop на переходах, то в ОГСЕ свои грабли, которые именно на переходах мешают.

Смысл сего действа в том, чтобы при подборе\изъятии ствола, он автоматом скидывал патроны в инвентарь. Если в чистом ТЧ, пока я заради проверки добежал от Сидоровича до перехода, у ГГ уже 500 патронов ля ПМа, 150 для MP-5 и 4 пачки дроби, то в ОГСЕ с неписей выпадает 5 патронов в инвентаре и 3 в стволе, но раз так на десятый. И хотя концепцию "Бомж в ЗО" у них так реализовать не получилось, но в начале игры с хламом к Сидоровичу побегать таки приходится, и неписей поотстреливать только заради лишнего патрона. И вот, чтобы кадый ствол в инвентаре не тыкать, нужен сей замечательный прибамбас.


 

 

В чем смысл-то ?

Или ты о чём?

  • Нравится 1

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@Kirgudu, Вот два набора координат, полученных при переходе. Первое - твоим методом, второе - тем, что было. Отличия только в LevelVertex.

 

 

(908846.0625) = spawn_ammo_in_inv => sect [ammo_7.62x54_7h14] npc [single_player]
position [ x = 15.177068710327, y = 16.481603622437, z = 684.85302734375]
 level_vertex_id [290088]
 game_vertex_id [207]
 npc ID [0]
 number [20] 
(908846.0625) = spawn_ammo_in_inv => sect [ammo_7.62x54_7h14] npc [single_player]
position [ x = 15.177068710327, y = 16.481603622437, z = 684.85302734375]
 level_vertex_id [290880]
 game_vertex_id [207]
 npc ID [0]
 number [20] 

 

 

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

 

 

оно срабатывает массово ПОСЛЕ входа актора на новую локацию
Но размножения патронов не вызывает, т.к. состояние инвентаря читается из автосохранения.

А на actor_binder:on_item_drop можно, как мне тут подсказали, сделать проверку на открытый инвентарь. Т.к. осмыленный выброс происходит из открытого инвентаря.

 

 

if idGv and game_graph():valid_vertex_id(idGv) then local oVertex = game_graph():vertex(idGv) if oVertex then local idLevel = oVertex:level_id() end end
idLevel = nil

Причём, в любом случае, и при ручном выбросе, и при переходе.

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@aromatizer, Вообще-то, здесь не место для таких обсуждений. Завязываем, а то прилетит.
@Kirgudu, @Zander_driver, Проблема решилась таким образом.
Добавляем в начало функции ts_mod_soc.ts_on_item_drop проверку на открытый инвентарь

if db.actor:has_info("ui_inventory") then

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

  • Нравится 2

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

@=VENOM=, Да, там проверка, что ствол не в слоте. Чтобы, значит, если у тебя его выбьет, он не разрядился и ты без патронов не остался.

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение

Блин, кто сегодня скачать успел - перекачайте, плиз. В одном месте забыл переменную переименовать :t1807:

Ссылка та же. Я.Диск

  • Спасибо 1

Шаман - СисАдмин

Всяко-разно: для ЧН

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...