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

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

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

 

Стоп, я кажется слегка разобрался. Вот, видимо, функция, которая отвечает за зомбирование.

 

self.chtime=time_global()+2000


if self.object:clsid()==clsid.controller_s and self.object:alive() then
amk.mylog("zombifying")
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=amk.load_table("zombies")
zomb[sobj.id]={master=self.object:id(),comm=npc:character_community(),gw=npc:goodwill(db.actor)}
amk.save_table("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.mylog("zombied "..npc:name().." profile "..orgtbl.profile)
amk.write_stalker_params(orgtbl,sobj)
end
end
end
end

 

 

Я разобрался с видимостью врага, дистанцией до него и т.д. Но я не понимаю, каким боком к этой функции относится время и куда сохраняется зомбирование непися? Ну и самое главное - что такое amk.mylog?

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

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

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

@MegaStalker,

self.chtime=time_global()+2000

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

Данные о зомбированных хранятся в таблице "zombies", в псторе актера.

amk.mylog() - это просто вывод в лог для отладки.

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

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

naxac.gif

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

@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

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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