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

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

@dsh

В модулях для работы с нет-пакетом(от Artos и АМКшный) есть ф-ции "передергивания" объекта он\офф\он-лайн энное кол-во раз, для того чтоб применились правки в нет-пакете. Но этот вариант сработает только для объектов, которые можно "передернуть" он\офф\он-лайн. К примеру для оружия в руках(и соответственно в инвентаре) актера такое не прокатит, т.к. актера в офф-лайн не увести. Тут можно пробовать трансфер от актера куда-то, там манипуляции с объектом и его нет-пакетом, трансфер обратно актеру - ничем не красивее того, что Вы уже проделываете...

 

P.S. Хотя, может уже есть более адекватные решения, сам бы не прочь узнать.

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

@UnLoaded, эксперименты показывают, что с x-ray extensions прицел можно нацепить визуально:

wpn:set_wpn_int( 936, 1 )

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

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

 

 

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

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

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

Только обратил внимание. У всех такая дикая функция в treasure_manager.script ?

function parse_spawns(line)
	if line == nil then
		return {}
	end

	--' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini
	local t = se_respawn.parse_names(line)
	local n = table.getn(t)
		
	local ret_table = {}
	local k = 1

	while k <= n do
		local spawn = {}
		spawn.section = t[k]
		-- Проверяем что это не последняя запись
		if t[k+1] ~= nil then
			local p = tonumber(t[k+1])
			-- проверяем что вторым числом задана вероятность, а не другая секция спавну
			if p then
				-- забиваем число
				spawn.prob = p
				k = k + 2
			else
				-- забиваем дефолт 1
				spawn.prob = 1
				k = k + 1
			end
		else
			spawn.prob = 1
			k = k + 1
		end
		table.insert(ret_table, spawn)
	end
	return ret_table
end

 

Я её изменил, если кому нужно.

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

Не у всех. ;)  У меня ее вообще нет. Ни в treasure_manager, ни в se_respawn, ни в xr_box, ни даже в smart_terrain.

 

В прошлом году, кстати, ссылку выкладывал. http://www.amk-team.ru/forum/index.php?showtopic=13078&p=902039

И ты же сам там вроде опечатку в древней нафиг ни кому не нужной ветке ветке указывал. ;)

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

@Dennis_Chikin,

 

		t, n = {}, 0
		for d in string_gfind( s, "([%w_%-.\\]+)[%p%s]*" ) do	-- выделяем то, что между запятыми/пробелами
			--log( "info", "spawn_items, d: %s", d )
			if k then	-- если уже прочитан ключ, возможно, сейчас считали число
				--log( "info", "spawn_items, exist k: %s", k )
				n = n + 1		-- но в таблицу что-то добавим по-любому
				v = tonumber( d )
				if v then		-- таки число
					t[n] = { k, v }	-- кладем в таблицу
					k = false	-- следующее, что получим - точно key
				else			-- если это не число, значит - key
					t[n] = { k, 1 } -- а key уже есть, берем дефолт
					k = d		-- полученное сохраняем как новый key
				end
			else k = d	-- ключа нет, значит именно его сейчас и получили
			--log( "info", "spawn_items, new k: %s", k )
		end	end
		if k then n = n + 1; t[n] = { k, 1 } end

 

 

Всё это сложно выглядит.
Я похожее сделал как-то так

 

local t = {}

for w in line:gmatch('[^%,%s]+') do
    local x = tonumber(w)
    if x then
        t[#t].prob = x
    else
        t[#t+1] = {section = w, prob = 1}
    end
end

 

 

И ты же сам там вроде...

Если бы я всё помнил, то уже с ума сошел наверное от забитой оперативы :)

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

По-моему, у тебя здесь получается что-то сильно не то...

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

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

Не медленнее чем у тебя. Даже быстрее. Т.е. для движка разницы нет.

А теперь спроси у людей. Для них есть разница?

 

 

зачем-то опять к старому тормозному формату таблицы

Таблицы это основа языка. Скорость работы с ними - первый из плюсов lua.

Не заслуженное обвинение.

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

Насколько я знаю таблицу pstor'ом не записать, как тогда возможно записать ее в сохранение? Заранее спасибо.

 

http://www.amk-team.ru/forum/index.php?showtopic=13078&p=897169

dc

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

@vampirnik77

Вот из OGSE

 

-- serialize table to string reprezentation
-- in: table|nil|string|number|boolean, nil
-- out: string|nil, boolean(error)
function table.serialize(x, recur)
	local t = type(x)
	recur = recur or {}

	if t == "nil" then
		return "nil"
	elseif t == "string" then
		return string.format("%q", x)
	elseif t == "number" then
		return tostring(x), false
	elseif t == "boolean" then
		return x and "true" or "false"
	elseif getmetatable(x) then
		-- Can not serialize a table that has a metatable associated with it.
		return nil, true
	elseif t == "table" then
		if recur[x] then
			-- Can not serialize recursive tables.
			return nil, true
		end
		recur[x] = true

		if not next(x) then return "{}" end -- need to check if table is empty
		local s, key, val = "{"
		for k, v in pairs(x) do
			key, err = table.serialize(k, recur)
			if err then	--if something srong with table's keys
				return nil, true
			end
			val, err = table.serialize(v, recur)
			if err then	--if something srong with table's values
				return nil, true
			end
			s = s .. "[" .. key .. "]" .. "=" .. val .. ","
		end

		return s:sub(0, s:len() - 1) .. "}"
	end

	-- Can not serialize value of passed type
	return nil, true
end

--unserialize table from string
function table.unserialize(str)
	if type(str)~='string' or str=='' then return {} end
	return loadstring("return " .. str)() or {}
end

Как работать

local str = table.serialize(твоя_таблица)
-- Сохраняешь строку 'str' в pstor.
...
local t = table.unserialize(тут_строка_из_pstor-а) 

 

 

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

Вопрос легенький для ЗП:

Есть два файла пусть будут им названия: 1 - show_time.script, 2 - capture_keys.script.

В первом написан скрипт для показа времени при нажатии на кнопку, а во-втором отлов клавиш.

Где и как указать какой файл что бы скрипт работал. Например что бы работал второй скрипт его надо добавить в bind_stalker.script.  actor_binder:update(delta).

Первый скрипт не может работать без второго, а второй без первого может.

P.S. Если не понятно, то попробую еще раз объяснить, но более ясней!

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

 

 

Где и как указать какой файл что бы скрипт работал

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

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

Например что бы работал второй скрипт его надо добавить в bind_stalker.script.  actor_binder:update(delta).

Для начала посоветую воспользоваться хотя бы X-Ray extentions, там есть правка, которая добавляет новый метод для биндера актора, в который передается текущая нажатая на клавиатуре клавиша.

 

А как это сделать? ну например вот так:

if key == DIK_keys.DIK_NUMPAD1 then
    _s_options.CSpOptions():ShowDialog(true)
end

@vampirnik77, Можно еще так:

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

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

 

 

storage = {}

local type2marker = {
    ['boolean'] = 1,
    ['number'] = 2,
    ['string'] = 3,
    ['table'] = 4
     }

function se_custom_storage:STATE_Write(packet)
	cse_alife_dynamic_object.STATE_Write(self, packet)
	event("StorageSave"):trigger({packet = packet})
	_log_db("-Save:")
	if next(storage) then
		for k, v in pairs(storage) do
			if v ~= nil then
				packet:w_stringZ(k)
				_log_db("Key:[%s]",tostring(k))
				SaveValue = function(Value)
					_log_db("Value:[%s]",tostring(Value))
					local tv = type(Value)
					if type2marker[tv] then
						packet:w_u8(type2marker[tv])
						if tv == 'string' then
							packet:w_stringZ(Value)
						elseif tv == 'boolean' then
							packet:w_bool(Value)
						elseif tv == 'number' then
							packet:w_float(Value)
						elseif tv == 'table' then
							local iTblSize = table.size(Value)
							_log_db("size = [%s]",iTblSize)
							packet:w_u8(iTblSize)
							if iTblSize > 0 then
								packet:w_bool(table.islist(Value))
								if table.islist(Value) then
									for i = 1, iTblSize do
										SaveValue(Value[i])
									end 
								else
									for kk, vv in pairs(Value) do
										_log_db("Key:[%s]",kk)
										packet:w_stringZ(kk)
										SaveValue(vv)
									end 
								end
							end
						end
					else
						_log_db("~Not savable type:=[%s]",tv)
					end
				end
				SaveValue(v)
			end
		end
	end
	_log_db("-Saved")
end

function GetTblSize(tTbl)
if IsTblList(tTbl) then
  return #tTbl
end
local iSize = 0
for k, v in pairs(tTbl) do
  iSize = iSize + 1
end
return iSize
end

function IsTblList(tTbl)
local bList = false
local iCntIdx = #tTbl
if iCntIdx > 0 then
  if next(tTbl) == 1 and not next(tTbl,iCntIdx) then
   for i=2,iCntIdx-1 do
    if tTbl[i] == nil then
     return false
    end
   end
   bList = true
  end
end
return bList
end

if not table.size then
    table.size = this.GetTblSize
end

if not table.islist then
    table.islist = this.IsTblList
end

Выше - это вырезанные куски из моих наработок...

_log_db - мои функции отладки, можно удалить

event("StorageSave"):trigger({packet = packet}) - тоже можно удалить, это создание события... влом кароче объяснять что это)

 

 

 

Или можно выполнить сериализацию, как это сделали огсе, правда в пстор тогда будет сохраняться больше(большая длина байт), так как в их случае, это сплошная строка, где даже bool представлено в виде строки(примерно 5 байт для true), а не одного байта(ну двух байт, так как еще идет запоминание маркера сохраняемого типа), как в случае с моим кодом.

Изменено пользователем Viнt@rь
Ссылка на комментарий

@Viнt@rь, Спасибо, но проблему уже решил, а можно поподробней что за X-Ray extentions? 
И еще вопрос можно замутить с кнопкой (любой, не забинденой) как с фонарем, т.е. нажал на L - фонарь горит, еще раз нажал - фонарь не горит!

И еще вот есть функция:

 

 

  1. if key == DIK_keys.DIK_NUMPAD1 then
  2. _s_options.CSpOptions():ShowDialog(true)
  3. end

Я ее уже видел в файле ui_main_menu.script, ее можно использовать в самой игре как с тем же самым фонарем? или нужен скрипт отлов клавиш?

  1.  

@UnLoaded, Спасибо так и сделал) А я голову ломал как делать, на самом деле все просто)

Ссылка на комментарий
И еще вот есть функция:

ну, для начала, это не функция, а конструкция...

 

Я ее уже видел в файле ui_main_menu.script, ее можно использовать в самой игре как с тем же самым фонарем? или нужен скрипт отлов клавиш?

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

 

http://www.amk-team.ru/forum/index.php?showtopic=10538 - тема совсем по соседству с этой...

Изменено пользователем Viнt@rь
Ссылка на комментарий

@Viнt@rь, А с фонарем как быть? 

Например:

function dik_k()
if dik_k ~= nil then
get_hud():AddCustomStatic("test", true)
get_hud():GetCustomStatic("test"):wnd():TextControl():SetTextST(text)
elseif dik_k ~= nil and get_hud():AddCustomStatic("test", true) then
get_hud():RemoveCustomStatic("test")
end
end

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

Блин запутано все получилось. Я уже который день пытаюсь сделать все как надо не получается!

И вообще dik_k ~= nil Я не понимаю что это, но так он работает!

P.S. Функцию надо учитывать со скриптом отловлей клавиш от Charsi(по крайней мере это имя было написано на сталкерине). Потом поставлю этот экстеншенс.

Ссылка на комментарий
Функцию надо учитывать со скриптом отловлей клавиш от Charsi(по крайней мере это имя было написано на сталкерине).

Выкинь этот костыль и поставь xray-ex, как советовали.

После чего, тебе остается:

1) добавить колбек на нажатие клавиши в bind_stalker

2) вызвать из этого колбека свою функцию

3) ???

4) PROFIT!

 

З.Ы. http://www.amk-team.ru/forum/index.php?showtopic=10538&p=832354

внизу - как добавить колбек в ЗП.

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

, Ну все поставил экстеншенс)) Вообщем вопрос у меня такой: Допустим есть скрипт со временем, при нажатии на кнопку (английскую К) время появляется на худе как статик. Но как сделать так что бы при нажатии на эту же кнопку время убиралось?? Это как с фонариком, нажал на L, фонарь включился, нажал еще раз он выключился! Вот что меня интересует.

Я не пойму, а в ЗП нету отловли отпускания и удержания?? 

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

 

 

Я не пойму, а в ЗП нету отловли отпускания и удержания??

Ни в одном из оригинальных движков(ТЧ\ЧН\ЗП) нет коллбэка на действия с клавиатурой.

 

 

 

Но как сделать так что бы при нажатии на эту же кнопку время убиралось?

Ну так в ф-ции, которая вызывается у тебя по нажатию клавиши, сделать проверку состояния отображения времени:

if not get_hud():GetCustomStatic("твой_статик_отображения_времени") then
       --- если на худе нет статика, то создаем его --
       get_hud():AddCustomStatic("твой_статик_отображения_времени", true)
else
       --- иначе - удаляем
       get_hud():RemoveCustomStatic("твой_статик_отображения_времени")
end

это общая конструкция, которую тебе надо дополнить необходимым содержанием.

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

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

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

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

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

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

Войти

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

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

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