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

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


Svoboда

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

(изменено)

Господа, время доброго!

У меня вот какой интересный вопросец. У меня реализован скрипт, читающий нетпакеты всех НПС, после чего имена всех мне интересующих записываются в таблицу:

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

for i = 1, 65535 do
		local sobj = alife():object(i)
		if (sobj) and IsNpcStalker(sobj) then --отсеиваем все объекты кроме интересующих:нейтралы, свобода, долг 
		local pk = get_netpk(sobj) --рабоатем с нетпакетом объекта
			if pk and pk:isOk() 
			then
				local data = pk:get() --тягаем нетпакет
				local charname = data.character_name --получаем имя объекта
				table.insert(tab,charname) --пишем имя в таблицу tab
			end	
		end
	end
end

 

Далее с разными целями я использую рандомные имена существующих НПС из таблицы следующим образом: 

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

function name_npc()
return tab[math.random(#tab)]
end

 

И вот какой у меня вопрос: каким образом в таблицу одновременно с именем_кличкой НПС записывать его Id? А после каким образом можно через функцию "name_npc()" прочитать только одну из двух переменных?

Таким образом я хочу реализовать фишку, что когда приходило бы сообщение в сталкерскую сеть от нпс: 

amk.send_tip("тело сообщения", testt.name_npc(), время, 15, "common_channel")

, то у этого НПС отнималось определенное кол-во денег, за СМС.

 

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

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


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

Дня доброго! Подскажите, каким образом можно получить кол-во денег у НПС в конкретный момент, зная его ID?

Например группировку можно получить с помощью obj:community(), а как кол-во денег получить? Есть мыслишки?

 

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


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

@Overfirst, вот таким образом мы получаем ID объектов и пишем все в таблицу, работа с нет-пакетами:

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

function table_update_pda()
tab = {"пусто"}
local iid
tab_newbIes = {"new"}
	for i = 1, 65535 do
		local sobj = alife():object(i)
		if (sobj) and IsNpcStalker(sobj) then 
		local pk = get_netpk(sobj)
			if pk and pk:isOk() 
			then
				local data = pk:get()
				local charname = data.character_name
				table.insert(tab, {id = sobj.id, name = data.character_name})
			end	
		end
	end
end

 

А далее пытаемся работать с полученными ID. У меня получилось вывести на экран игровым сообщением ID случайного непися. Теперь задача - вывести на экран кол-во денег у танного ID непися:

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

function name_npc()
	local npc = ogo() --рандомируем значение из таблицы tab
	local iid = npc.id -- присваем id непися. Работает! Проверял - выводил на экран через amk.send_tip. 
	local obj = alife():object(iid)
	local mon = obj:money() -- с "money()" не работает. Работает с ":community()". Выводится на экран группировка данного ID непися. Но деньги - никак
	amk.send_tip(mon, "деньги", 4, 15, "common_channel")
	return npc.name
end

function ogo()
	return tab[math.random(#tab)]
end

 

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

attempt to call method 'money' (a nil value)

Ссылка на строку: local mon = obj:money()

 

 

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


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

@Kirgudu@naxac, господа уважаемые, а сразу вопрос сходу - каким бы образом можно было бы отнять деньги у нпс(записать это в нетпакет?)?

То есть по большому счету моя основная задача не вывести деньги на экран (вывод денег на экран это метод проверки, что все работает), а отнять у данного ID нпс кол-во денег. 

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


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

Ребята, кто мне помогал, огромное спасибо! Теперь все НПС платно отправляют СМСки в чат, ибо нефиг халявничать! 

Возник следующий вопрос: тратить НПС деньги научились, а где бы им подзаработать? Реализована ли в НС какая-нибудь схема, где НПС в оффлайне продают ненужный лут?

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


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

@AndreySol, а разве они оффлайн не подбирают?

Они умеют в оффлайне драться, например, и вроде там же арты подбирают те же. amk_offline_alife.script

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

--есть бесхозное оружие
	amk.oau_reason="cn offline_alife chp13 "..tostring(victim and victim:name())
						on_weapons_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif #vdata.artefacts>0 then
					--есть арты
	amk.oau_reason="cn offline_alife chp14 "..tostring(victim and victim:name())
						on_artifacts_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif #vdata.inv_boxes>0 then
					--есть контейнеры. Надо обыскать.
	amk.oau_reason="cn offline_alife chp18 "..tostring(victim and victim:name())
						on_inv_boxes_found(victim, vdata)
						break	--прерываем цикл - событие отработано
					elseif items[victim.id] and #items[victim.id] > 0 then
					--попробуем продать всякого
	amk.oau_reason="cn offline_alife chp15 "..tostring(victim and victim:name())
						-- amk.mylog("Offline: lets trade")
	amk.oau_reason="cn offline_alife chp17 "..tostring(victim and victim:name())
						process_trade(victim)
						-- amk.mylog("Offline: trade done")
						break

 

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

function on_artifacts_found(victim, vdata)
	if (victim == nil or vdata == nil) then return end
	local obj, v_obj
	local object
	local v_id = victim.id
	local b_stalker = false
	-- Если сталкер - дадим опыт.
	if victim and IAmAStalker[victim:clsid()] and victim.community then
		local m_comm  = victim:community()
		if (m_comm == "stalker" or m_comm == "dolg" or m_comm == "freedom") then
			b_stalker = true
		end
	end
	for i=1, #vdata.artefacts do
		v_obj = vdata.artefacts[i]
		if (v_obj) then
			object = alife():object(v_obj.id)
			if (object and object:name() == v_obj.name) then
				obj = pick_item(victim, object)
				if (obj) then
					if (b_stalker == true) then
						victim:set_rank(victim:rank() + rate_art_found)
					end
				end
			end
		end
	end
	process_trade(victim)
end

 

 

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

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


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

Времени доброго! А подскажите пожалуйста, куда ковырнуть, чтобы навыки по обходу аномалий у NPC откорректировать? Только я в них влетаю, ни одного трупа НПС от аномалий :|

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


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

@Graff46, а в солянке та же схема интегрирована от товарища Ред?

Просто поведение НПС  несколько отличается - соляночной от этого мода.

В солянке НПС плавно обходят аномалии, а в моде они начинают впадать в режим "готов стрелять" и с пушкой в руках оббегают аномалию по маленькому шагу, выглядит очень странно

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


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

@naxac, Вот и я о том же думал, только бы понять теперь куда там копать, чтобы подкрутить НПС шансы обойти аномалии. 

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


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

Господа, дня доброго! Помогите пожалуйста

Экспериментирую со скриптовой озвучкой, вот что имеется:

 

Задаём переменной значение, какие звуки играть:

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

snd_name = string.format(
      "characters_voice\\loot\\%s\\loot_%s_%s", comm, good_bad, math.random( 3 )  --первая %s это определение папки с названием фракции, вторая %s это выбор имени звукового файла(good_loot или bad_loot), третья %s - рандом из трёх звуков в папке
    )

 

Далее отрывок кода, заставляющий звук проигрываться:

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

local snd_obj = xr_sound.get_safe_sound_object( snd_name )
  if snd_obj and not snd_obj:playing() then
	amk.send_tip("ЗВУК", "ЗВУК", 2, 15, "common_channel") --проверка что функция до сюда дошла
    snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 1.0 )

 

Всё воспроизводится, но не могу допетрить вот что:

(первый спойлер), как мне скриптово описать выбор соответствующей нужной папки (human_01, human_02, human_03), чтобы голос был соответствующий? Фракция, например, определяется путём npc:character_community(), а папки human_01, human_02, human_03 как сделать?

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


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

Господа, время доброго! Прошу подсказки

Имеется момент, где мы проигрываем звук:

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

snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 1.0 )

 

Звук проигрывается, но строго в позиции НПС. Если НПС отойдет, то звук продолжается на том же месте, где непися уже нет. Вопрос: как скриптово заставить звук проиграться от лица НПС, будто обычная озвучка? 

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


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

Доброго времени! Подскажите пожалуйста, каким образом можно проиграть звук (фразу) от лица НПС? 

Пытаюсь разобраться с "xr_sound.set_sound_play( npc, "sound_theme", math.random( 2000,3000 ) )"? но безуспешно... Есть у кого примеры?

 

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


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

@gam, @BFG, прошу прощения, сам разобрался. Оказывается и моя структура рабочая, только я запамятовал что после редактирования скриптов со звуковой составляющей нужно игру перезапускать, сейв-лоада не достаточно для звуков х) 

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


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

Господа, а каким образом можно реализовать сохранение\загрузку значения своей глобальной переменной? Условная глобальная переменная всегда будет иметь какое-то одно числовое значение, которое будет изменяться. Каким образом её правильно объявить как глобальную, чтобы она писалась в сейв и читалась потом? 

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


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

@Kirgudu, Приветствую! Твой метод работает, но при попытке сохраниться получаю:

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

Arguments     : LUA error: ....t.a.l.k.e.r\gamedata\scripts\fake_net_packet.script:60: bad argument #1 to 'len' (string expected, got table)
 

вот какой кусок кода для теста написал:

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

function edit()
local mmoney = xr_logic.pstor_retrieve(db.actor, bank)
	if mmoney == nil then 
		amk.send_tip("нил", "нил", 1, 15, "common_channel") --отчет что значение = нил
		xr_logic.pstor_store(db.actor, bank, 0) --сразу присвоем переменной нуль
	else
		xr_logic.pstor_store(db.actor, bank, mmoney + 100) --прибавим для теста соточку
		local itog = xr_logic.pstor_retrieve(db.actor, bank) 
		amk.send_tip(itog, itog, 2, 15, "common_channel") -- глянем что получается
	end
end

 

В итоге на экран у меня выводится значение переменной, которая увеличивается на 100 с каждым выполнением функции, т.е. всё работает, однако невозможно сохраниться. Что может быть?

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


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

@naxac, прошу прощения, а я вроде этим же синтаксисом и пользовался:

xr_logic.pstor_store(db.actor, "variable_name", value)  -- твое

xr_logic.pstor_store(db.actor, bank, 0) --моё

 

Где ошибка?

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


Ссылка на сообщение
(изменено)
1 час назад, Kirgudu сказал:

Что в ней, не таблица ли?

Кстати, интересный момент. Я эту переменную bank вприцнипе нигде и никак не объявлял. Ф-ция pstor_store тем не менее все равно ею оперирует. В какой момент движок начинает думать что это таблица? 

UPD

Аааааа, имя переменной в кавычки, хы.

Проблему устранил, снимаю шляпу перед @Kirgudu 

Тут же вопрос по теме, каким способом и какова вероятность убить сейвы подобными манипуляциями? Есть у вас печальные примеры?

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

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


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

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

AMK-Team.ru

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