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

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

@naxac, понял. То есть никакие доп.функции из АМК мне не придется адаптировать?

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

@MegaStalker, придется.

load_table/save_table - функции для сохранения/загрузки таблиц из пстора

read_stalker_params/write_stalker_params - для чтения/записи нет-пакета нпс.

Для нет-пакетов я бы рекомендовал что-нибудь другое использовать, не из АМК, т.к. там местами неверно пакет читается/пишется. Модуль m_netpk от Артоса например.

А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет.

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

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

naxac.gif

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

А таблицы в АМК пакуются в строки - тоже так себе, но если альтернативы нет, то пойдет. 

А чем плох этот вариант? И какие бывают альтернативы? Я просто пользуюсь хранилищем в 7 патче и о размерах сохраняемого особо никогда не задумываюсь  :)

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

А чем плох этот вариант? И какие бывают альтернативы?

Слишком он тормозной, мне кажется, особенно для использования на апдейте.

Альтернативы - например, сохранение напрямую, без паковки

function save_pstor_table(pk, tbl, obj)
	local tp
	for k, v in pairs(tbl) do
		if v == true then
			pk:w_u8(pstor_true)
		elseif v == false then
			pk:w_u8(pstor_false)
		else
			tp = type(v)
			if tp == "number" then
				pk:w_u8(pstor_number)
				pk:w_float(v)
			elseif tp == "string" then
				pk:w_u8(pstor_string)
				pk:w_stringZ(v)
			elseif tp == "table" then
				pk:w_u8(pstor_table)
				xr_logic.save_pstor_table(pk, v, obj)
			elseif tp == "userdata" then
				pk:w_u8(pstor_custom)
				pk:w_stringZ(v.classname == k and "" or v.classname)
				v:save(pk)
			else
				abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]",
					obj:name(), tv, k, utils.to_str(v))
			end
		end
		pk:w_stringZ(k)
	end
	pk:w_u8(pstor_end_table)
end

function load_pstor_table(pk, tbl, obj)
	local k, v, n
	while true do
		n = pk:r_u8()
		if n == pstor_end_table then
			return tbl
		else
			if n == pstor_true then
				v = true
			elseif n == pstor_false then
				v = false
			elseif n == pstor_number then
				v = pk:r_float()
			elseif n == pstor_string then
				v = pk:r_stringZ()
			elseif n == pstor_table then
				v = {}
				xr_logic.load_pstor_table(pk, v, obj)
			elseif n == pstor_custom then
				local cls = reader:r_stringZ()
				if cls == "" then cls = k end
				v = pstor_custom_impl[cls]()
				v:load(pk)
			else
				abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name())
				v = nil
			end
			k = pk:r_stringZ()
			tbl[k] = v
		end
	end
end

function pstor_save_all(obj, packet)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	save_pstor_table(packet, pstor, obj)
end

function pstor_load_all(obj, reader)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	if (not db.actor) and npc_id ~= 0 then
		abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script")
	end
	load_pstor_table(reader, pstor, obj)
end

 

  • Нравится 2

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

naxac.gif

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

@naxac, ого, классно сделано! И относительно понятно для человека, никогда не писавшего скрипты. Представить себе не могу, чтобы я без твоей помощи делал.

@naxac, смотри, я постарался поменять кое-что в соотвествии с твоими функциями. Просьба поправить, если где-то что-то не так(я скрипты только начал изучать)

 

self.chtime=time_global()+2000
		if self.object:clsid()==clsid.controller_s and self.object:alive() then
			local npc=self.object:get_enemy()
			if npc then
				if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and 
				   npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then
        
					local sobj=alife():object( npc:id() )
					if sobj and sobj.online then
						local zomb=load_pstor_table("zombies")
						zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)}
						save_pstor_table("zombies",zomb)															
						npc:set_character_community("zombied",0,0)
						local orgtbl=pstor_load_all(sobj)
						if (not string.find(orgtbl.profile,"_zombi")) then
							orgtbl.profile=orgtbl.profile.."_zombi"
						end
						pstor_save_all(orgtbl,sobj)
					end
				end
			end
		end
===============================Реализация функций для скрипта(вынести в отдельный файл!)=======================================

function save_pstor_table(pk, tbl, obj)
	local tp
	for k, v in pairs(tbl) do
		if v == true then
			pk:w_u8(pstor_true)
		elseif v == false then
			pk:w_u8(pstor_false)
		else
			tp = type(v)
			if tp == "number" then
				pk:w_u8(pstor_number)
				pk:w_float(v)
			elseif tp == "string" then
				pk:w_u8(pstor_string)
				pk:w_stringZ(v)
			elseif tp == "table" then
				pk:w_u8(pstor_table)
				xr_logic.save_pstor_table(pk, v, obj)
			elseif tp == "userdata" then
				pk:w_u8(pstor_custom)
				pk:w_stringZ(v.classname == k and "" or v.classname)
				v:save(pk)
			else
				abort("xr_logic.save_pstor_table for %s: not registered type '%s' encountered [ %s :: %s ]",
					obj:name(), tv, k, utils.to_str(v))
			end
		end
		pk:w_stringZ(k)
	end
	pk:w_u8(pstor_end_table)
end

function load_pstor_table(pk, tbl, obj)
	local k, v, n
	while true do
		n = pk:r_u8()
		if n == pstor_end_table then
			return tbl
		else
			if n == pstor_true then
				v = true
			elseif n == pstor_false then
				v = false
			elseif n == pstor_number then
				v = pk:r_float()
			elseif n == pstor_string then
				v = pk:r_stringZ()
			elseif n == pstor_table then
				v = {}
				xr_logic.load_pstor_table(pk, v, obj)
			elseif n == pstor_custom then
				local cls = reader:r_stringZ()
				if cls == "" then cls = k end
				v = pstor_custom_impl[cls]()
				v:load(pk)
			else
				abort("У объекта [%s] повреждён пстор, этим сохранением нельзя пользоваться - удалите его и переиграйте с предыдущего.", obj:name())
				v = nil
			end
			k = pk:r_stringZ()
			tbl[k] = v
		end
	end
end

function pstor_save_all(obj, packet)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	save_pstor_table(packet, pstor, obj)
end

function pstor_load_all(obj, reader)
	local npc_id = obj:id()
	local pstor = db.storage[npc_id].pstor
	if not pstor then
		pstor = {}
		db.storage[npc_id].pstor = pstor
	end
	if (not db.actor) and npc_id ~= 0 then
		abort("Не создан актор. Возможно, синтаксическая ошибка в bind_stalker.script")
	end
	load_pstor_table(reader, pstor, obj)
end 

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

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

Можно ли в ТЧ скриптовым способом, в обход движка, запретить перемещать артефакты на пояс при отсутствии надетого на ГГ определённого костюма (со встроенным контейнером для артов)? В идеале бы неплохо разное количество переносимых артов для разных костюмов как в ЧН / ЗП...

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

@MegaStalker, ты меня не понял. Я привел пример, как переписать сохранение пстора в xr_logic.script для возможности хранения таблиц. Читать нетпакет этими функциями нельзя, как нельзя и сохранять таблицы напрямую.

 

if (self.chtime or 0) < time_global() then
        self.chtime=time_global()+2000
		if self.object:clsid()==clsid.controller_s and self.object:alive() then
			local npc=self.object:get_enemy()
			if npc then
				if npc:id()~=db.actor:id() and npc:clsid()==clsid.script_stalker and self.object:see(npc) and 
				   npc:character_community()~="zombied" and self.object:position():distance_to(npc:position())<30 then
        
					local sobj=alife():object( npc:id() )
					if sobj and sobj.online then
						local zomb = xr_logic.pstor_retrieve(db.actor, "zombies", {})
						zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)}
						xr_ligic.pstor_store(db.actor, "zombies", zomb)															
						npc:set_character_community("zombied",0,0)
						local orgtbl=amk.read_stalker_params(sobj)
						if (not string.find(orgtbl.profile,"_zombi")) then
							orgtbl.profile=orgtbl.profile.."_zombi"
						end
						amk.write_stalker_params(orgtbl,sobj)
					end
				end
			end
		end
    end

 

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

naxac.gif

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

Капрал Хикс, да можно конечно, но правки движка все равно понадобятся (X-RAY EXTENSIONS например уже подойдет). Добавляйте в конфиг костюма нужную строку, затем когда что-то попало к нам на пояс, проверяем сколько может на поясе лежать артефактов и скидываем "лишние". Ну а как нарисовать картинку поверх ячейки артефактов: мол она недоступна, отслеживаем нужные инфопоршня на открытие / закрытие инвентаря и рисуем, примеров достаточно  :).

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

@naxac, я совсем запутался. Вот смотри, у меня есть указанный тобой файл, для своего удобства я оставил в нем только твои функции. А как мне их теперь применить в самом скрипте зомбирования? Мне надо переименовывать что-то или как? Ведь в скрипте имя функции одно, а в файле xr_logic другое.

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

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

Всем привет. Есть какие-то варианты отключения звука шагов в определенный момент? Ну или как-то заменять звук шагов на свой звук(пустой) ?

Ссылка на комментарий
@TIGER_VLAD,мне в голову приходит только одна мысль. Я знаю, что звук шагов привязан к костюму. Полагаю, если сделать два одинаковых костюма и один из них сделать без звука шагов, то в нужный момент можно актора переодевать.
  • Спасибо 1
Ссылка на комментарий

@dsh, да знаю, этот момент( как-то раз неправильно настроил костюм в SDK и звук шагов пропал). Такой вариант не хочу использовать и так костылей хватает у меня))

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

TIGER_VLAD

Такой вариант не хочу использовать и так костылей хватает у меня

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

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

@Kondr48

окей, параметр в костюмы дописать не проблема...

А что конкретно из X-ray extensions подключать? У меня SVN_portable_r230, если что. И где подсмотреть примеры скриптов?

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

 

Капрал Хикс, что конкретно сказать не могу. Все функции для работы с инвентарем и поясом нужны (ну они скорее всего по умолчанию идут) плюс колбеки, аналогично. А примеров использования колбеков, функций этих и рисования скриптом в инвентаре элементов больше чем достаточно в том же OGSE 0.6.9.3.

 

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

Народ, никак не могу из указанного мной скрипта найти функции - такие, как amk.write, amk.read... Все скрипты перерыл, они упоминаются - но алгоритмы самих функций не могу найти. Вопрос - где находятся объявления этих функций и можно ли переписать скрипт без их использования?

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

MegaStalker

Таких функций там и нет, есть вот такие: "amk.write_stalker_params и amk.read_stalker_params" Соот. amk. - название файла где лежит функция - write_stalker_params и read_stalker_params!!!

 

function write_stalker_params(tbl,sobj)
local stpk=net_packet()
local uppk=net_packet()
amk.fill_stalker_packet(tbl,stpk,uppk)
local size=stpk:w_tell()
local size1=uppk:w_tell()
-- amk.mylog("wsp "..size.." "..size1)
stpk:r_seek(0)
uppk:r_seek(0)
sobj:STATE_Read(stpk,size)
sobj:UPDATE_Read(uppk)
local npc=level.object_by_id(sobj.id)
if npc then
amk.convert_npc[sobj.id]=true
switch_offline(npc)
end
end

function read_stalker_params(sobj)
local stpk=net_packet()
local uppk=net_packet()
sobj:STATE_Write(stpk)
sobj:UPDATE_Write(uppk)
local size=stpk:w_tell()
local size1=uppk:w_tell()
-- amk.mylog("rsp "..size.." "..size1)
stpk:r_seek(0)
uppk:r_seek(0)
local tbl=amk.parse_stalker_packet({},stpk,uppk,size)
-- amk.mylog("rsp "..size.." "..size1.." "..stpk:r_tell())
return tbl
end

 

Но у АМК все взаимосвязано, одно на другое ссылается и т. д. поэтому придется использовать файл целиком либо корректировать по своему усмотрению если сможешь конечно... :)

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

Жизнь следует измерять поступками, а не временем...

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

Мне не ведомо зачем они потребовались MegaStalker,у меня лично используются при присвоении SID-ов через скрипт. 

Примерно так:

 

function aes2_monolit22()
local obj = alife():create("aes2_monolit_kvest",vector():set(272.838,0.150,151.652),96637,2576)
local tbl = amk.read_stalker_params(obj)
tbl.sid = 5514
amk.write_stalker_params(tbl, obj)
end

 

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

Жизнь следует измерять поступками, а не временем...

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

@Kondr48, я хочу поиграть в мод CoC, который по сути является платформой для собственных модов. Поэтому я хотел перенести из АМК зомбирование неписей контролёром. Но поскольку ссылок тут на другие функции, судя по всему, целая туча, мне проще всего будет использовать весь файл скрипта. За информацию большое спасибо, она мне еще пригодится в будущем.

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

Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда...

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

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

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

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

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

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

Войти

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

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

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