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

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

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

 --'amk.spawn_item_in_inv("matras")
	 end
end

function test_for_need_sleep_tr_item(oid)
	if alife():object(oid)==nil then
	    if news_main then
	      news_main.create_treasurebox()
	    end
	end
end

Он появляется. просто при использовании исчезает, что не так, подскажите нубу, в скриптах я он и есть. :blush:

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

@Dennis_Chikin, ты меня не понял, мне просто нужно что бы спальник не появлялся в инвентаре при новой игре. Он будет квестовым предметом. Вот кусок из амк_мод.скрипт. В нем можно оключить спавн спальника в инвентарь?

--'*******************************************************************************
--'   **   **   **   **   **    **   **   **      SLEEP_AMK          **   **   **   **   **    **   **   **   **
--'*******************************************************************************
function reduce_need_sleep(time)
	local tmp=amk.load_variable("gg_need_sleep",0)
	tmp=tmp-time*120
	if tmp<0 then tmp=0 end
	amk.save_variable("gg_need_sleep_nrg",0)
	amk.save_variable("block_sleep_menu",0)
	amk.save_variable("gg_need_sleep",tmp)
	test_sleep_pp()
end

function test_for_need_sleep()
	if sleep_manager.is_sleep_active() == false then 
		amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)+1) 
		test_sleep_pp()
	end
	amk.g_start_timer("gg_need_sleep",0,0,6)
end

function test_sleep_pp()
	local tmp=amk.load_variable("gg_need_sleep",0)
	if tmp>360 then
		sleep_manager.main(5+amk.load_variable("gg_need_sleep_nrg",0))
	end
	if tmp>300 then
		level.add_pp_effector("yantar_underground_psi.ppe", 999, true)
		level.set_pp_effector_factor(999, 5.0)  
	end
	if tmp<=300 then
		level.remove_pp_effector(999)
	end
end

function check_sleep_item(obj)
	local flagg = amk.load_variable("flagg")
	local section = obj:section()
	local stype=nil
	
	if section=="energy_drink" then
		stype="nrg"
	--'elseif (section=="medkit" or section=="medkit_army" or section=="medkit_scientic") then
	--'	stype="med"
	elseif section=="matras" then
		stype="matras"
	elseif section=="repbox_s1" and flagg ~= 1 then 
		amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 1} )) 
	elseif section=="repbox_s2" and flagg ~= 1 then 
		amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 2} )) 
	elseif section=="repbox_s6" and flagg ~= 1 then 
		amk.start_timer("sleep_repbox",0.1,amk.pack_array_to_string( {obj:id(), obj:condition(), 6} )) 
	elseif section=="treasure_item" then
		stype="tr_item"
	end
 
	if stype~=nil then
		amk.start_timer("sleep_"..stype,0.1,obj:id())
	end
end

function test_for_need_sleep_nrg(oid)
	if alife():object(oid)==nil then
		local n=amk.load_variable("gg_need_sleep_nrg",0)
		if n<3 then
			amk.save_variable("gg_need_sleep_nrg",n+1)
			amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)-30+n*10) 
			test_sleep_pp()
		end  
		amk.g_start_timer("block_sleep_menu",0,1,0)
		amk.save_variable("block_sleep_menu",1)
	end
end
--[[
function test_for_need_sleep_med(oid)
	if alife():object(oid)==nil then
		amk.save_variable("gg_need_sleep",amk.load_variable("gg_need_sleep",0)+5) 
		test_sleep_pp()
	end
end
]]--
function test_for_need_sleep_matras(oid)
	if alife():object(oid)==nil then
		local enemy=false
		local obj
		local level_object_by_id = level.object_by_id
		local actor = db.actor
		local actorPos = actor:position()
		for npcId, npc in pairs(db.storage) do
			obj = level_object_by_id(npcId)
			if obj then
				if (( IsStalker(obj) and amk.get_npc_relation(obj,db.actor)=="enemy" ) or 
					IsMonster(obj)) and obj:position():distance_to(db.actor:position())<40 
					and obj:see(db.actor) then
					enemy=true
					break
				end
			end
		end
		if enemy==true then
			amk.send_tip(game.translate_string("not_need_sleep_enemy"),nil,nil,5)
		else
			if amk.load_variable("blowout",-1)>-1 and amk.load_variable("blowout",-1)<5 then
				amk.send_tip(game.translate_string("blowout_not_sleep"),nil,nil,5)
			else
				if amk.load_variable("block_sleep_menu",0)==0 then
						--if amk.load_variable("gg_need_sleep",0)>10 then
							if amk.load_variable("gg_need_sleep",0)>0 then
							local spwn=ui_cheat.cheat(get_hud())
							level.start_stop_menu(spwn,true)
						else
							amk.send_tip(game.translate_string("not_need_sleep"),nil,nil,5)
						end
					else
						amk.send_tip(game.translate_string("not_need_sleep_nrg"),nil,nil,5) 
				end
			end
		 end
	    amk.spawn_item_in_inv("matras")
	 end
end

function test_for_need_sleep_tr_item(oid)
	if alife():object(oid)==nil then
	    if news_main then
	      news_main.create_treasurebox()
	    end
	end
end

 

 

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

amk.spawn_item_in_inv("matras") -- это создание спальника.

Но это, вроде, не новая игра, а именно переспавн. При использовании.

 

Вообще я не знаю, в какой игре он при старте создается - вроде бы везде по диалогу.

Но в любом случае надо найти аналогичные строчки, с созданием этого матраса, тупо поиском по файлам, и убрать.

В этих кусках кода "стартового" создания нет.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
Хочу сделать чтобы при взятии записки из тайника появлялся другой тайник (как в ОП-2 Коллекционер). В файле bind_stalker.script в самый низ этой функции добавил:
 

function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
if xrs_ai then xrs_ai.actor_item_take(obj) end
    --game_stats.update_take_item (obj, self.object)
inventory.on_item_take(obj)
-- added by xStream for AMK miniSDK
amk.on_item_take(obj)
-- end of addition
repack_ammo.on_take(obj)
if rx_ai then
rx_ai.actor_item_take(obj)end
art_hit.hit_by_art(obj)
--verg_art_hit.on_item_take(obj)
 
--visual_fix
if obj:clsid() == clsid.equ_stalker_s or obj:clsid() == clsid.equ_exo then
local outfit = db.actor:get_current_outfit()
if outfit and outfit:id() ~= obj:id() then
db.actor:transfer_item(outfit, db.actor)
 
if db.actor then
name = obj:section()
if db.actor:object("bread") ~= nil then
db.actor:give_info_portion("boxkvest2_dal")
end
end
end
end
end
 
При этом инфопоршень выглядит так:
<info_portion id="boxkvest2_dal"><action>kvestovik.spawn_boxkvest2</action></info_portion>
 
Но при наличии хлеба тайник boxkvest2 не появляется. Что не так?

 

@Хемуль36рус, По моему в акторе это настраивается, там где аттачмент.

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

 

 

 

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

Вот прямо так добавил то, что зеленым, и оно даже не вылетает ? Хотя и не работает ?

 

Во-первых, взятие из тайника, это function actor_binder:take_item_from_box()

Во-вторых,

if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end

Где obj - второй аргумент take_item_from_box() - вот что там в скобках после запятой, то и должно быть.

В-третьих, даже если имеется kvestovik.spawn_boxkvest2(), и оно написано правильно, а не так, как извращен bind_stalker, то где именно оно есть, чтобы вообще срабатывало ?

 

Ну и это дурной тон, пихать в xml кучу всякого.

здесь же, в take_item_from_box() пишется if obj:section() == "bread" then kvestovik.spawn_boxkvest2() end, а уже там выдается инфо, и вообще все, что душе угодно.

 

 

Кстати, сам себя не похвалишь - ни кто не похвалит. http://www.amk-team.ru/forum/index.php?showtopic=8830&p=893852- про похождения Петрухи и прочих Кротов с долговцами в оффлайне.

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

@Dennis_Chikin, Спасибо, работает и с одной if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end. А второе условие  if obj:section() == "bread" then kvestovik.spawn_boxkvest2() end я так понял, для вызова функции напрямую без поршня? 

Да. dc

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

 

 

 

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

Может кто поможет с атакой кровососа?

Есть понятное:

 

-- Поцелуй кровососа (Авторы: Artos, Charsi, Shadows)
if self.object:clsid()==clsid.bloodsucker_s and self.object:section()~="bloodsucker_effector" then
local oTarget = self.object:get_enemy()
if oTarget and IsStalker(oTarget) and self.object:see(oTarget) then
local iDist = self.object:position():distance_to(oTarget:position())
if iDist <= 3 then
local iTime = time_global()
if (self.timer_anim or 0) < iTime then
self.timer_anim = iTime + 2000
if oTarget:id()~=0 and self.object:position():distance_to(db.actor:position()) < 5 then
sound_object("monsters\\bloodsucker\\vampire_sucking"):play_at_pos(db.actor,vector():set(0,0,1),0,sound_object.s2d)
end
if oTarget:id()==0 then
if NextAttack < iTime and self.object.health < 0.5 then
NextAttack = iTime + 18000
RestoreActor = iTime + 4500
DirActor = true
db.actor:hide_weapon()
level.disable_input()
level.hide_indicators()
level.add_call(bloodsucker_vampire_timer,bloodsucker_actor_release)
level.add_pp_effector("escape.ppe",1975,true)
level.add_cam_effector("camera_effects\\drunk.anm",1978,false,"")
local oSnd = sound_object("monsters\\bloodsucker\\vampire_sucking")
if not (oSnd and oSnd:playing()) then oSnd:play_no_feedback(oTarget,sound_object.s2d,0,vector(),5.0) end
end
if DirActor then
local pos = self.object:position()
local vDir = pos:sub(oTarget:position())
db.actor:set_actor_direction(-vDir:getH())
vDir:normalize()
local pos = self.object:position():sub(vDir)
db.actor:set_actor_position(pos)
end
end
end
if self.timer_anim and self.timer_anim >= iTime and DirActor then
db.actor.health = -0.002
self.object.health = 0.008
end
end
end
end

 

И есть смутное:

 

--/#+# 'засос кровососа боксёра' --------------------------------------------------
if self.object:clsid() == clsid.bloodsucker_s and self.object.health > 0.25 then
local oTarget = self.object:get_enemy()
if oTarget and IsStalker(oTarget) and self.object:see(oTarget) then
--/ если у кровососа есть враг/цель и кровосос его видит то ...
local iDist = self.object:position():distance_to(oTarget:position())
if iDist <= 2 then --/ дистанция для анимации 'засоса'
local iTime = time_global()
--/ таймер для анимации и хита ...
if (self.timer_anim or 0) < iTime then
self.timer_anim = iTime + 500 --/ таймер анимации ~ 0.5 сек
if self.object:animation_count() > 0 then
self.object:clear_animations()
end
self.object:add_animation("wounded_2_out") --/ варианты: "vampire_0" | "idle"
--/ озвучка 'засоса'
local oSnd = sound_object("material\\dead-body\\collide\\hithard06hl")
oSnd:play_no_feedback(oTarget, sound_object.s2d, 0, vector(), 5.0)
end
--/ хит жертве (притягиваем)
if (self.timer_hit or 0) < iTime and (self.timer_anim and self.timer_anim + 200 >= iTime) then
self.timer_hit = iTime + 10 --/ таймер хита ~ 0.1 сек
local vDir = self.object:direction() --/ вектор кровососа
local vDirHit = vector_rotate_y(vDir,179.0)
local h = hit()
h.draftsman = self.object
h.direction = vDirHit --/ направление хита
h:bone("bip01_spine") --/ для учета 'брони'
h.power = 0.02
level.add_cam_effector("camera_effects\\fusker.anm",959,false,"")
h.impulse = 50/iDist --/ чем ближе - тем сильнее 'засос'
h.type = hit.wound --hit.strike
oTarget:hit(h) --/ наносим хит жертве
--/ разворот жертвы на кровососа. TODO: требует доработки/замены!
if oTarget:id() == db.actor:id() then --/ жертва == актор? (а нужно?)
oTarget:set_actor_direction(vDirHit:getH())
end
end
end
end
end
--/<-----------------------------------------------------------------------

 

 

Второе выдернуто из http://www.amk-team.ru/forum/index.php?showtopic=12793

Ну хит я подрезал, ну время атаки можно. Но атака идёт бесконечно и без пауз. Практически нереально выжить. Врезать первый вариант не получается - анимация другая. Можно сделать паузу между атаками во втором варианте?

Ссылка на комментарий
Спасибо, работает и с одной if obj:section() == "bread" then db.actor:give_info_portion( "boxkvest2_dal" ) end

Похоже, что любое взятие хлебушка из любого инвентарного ящика будет проходить проверку, и соответственно выполнять назначенное действие... Условия проверки надо доработать, в соответствии с одноразовостью(или нет ?) действия.

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

Привет всем, возник вопрос: как можно моментально узнать мёртв ли объект или нет? Нужно узнать почти сразу же - мёртв ли сталкер после метода obj:kill(obj). Метод obj:alive() не предлагать, пробовал - метод говорит что сталкер всё ещё жив.

... А наше дело маленькое - с ружьём да по болотам. (с)

Ссылка на комментарий
Нужно узнать почти сразу же - мёртв ли сталкер после метода obj:kill(obj). Метод obj:alive() не предлагать, пробовал - метод говорит что сталкер всё ещё жив.


local bAlive = true

function MobKill(obj)

obj:kill(obj)

bAlive = false

end

 

function aaa()

if not bAlive then

...

end

end

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

, с переменными как то не оч. Всё думаю как бы моментально изменить значения у серверного объекта и по нему ориентироваться в другой функции, ток не знаю какое значение менять, чтобы оно осталось даже если игра будет перезагружена. (коммьюнити не предлагать - этот "ориентир" уже используется)

Я бы попробовал расписать: что надо, что есть, и в чем это выражается в каких случаях. Где именно проблема, как ее увидеть. Соответствующая тема как раз открыта. dc

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

... А наше дело маленькое - с ружьём да по болотам. (с)

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

@Max_Raf, вроде кроме метода alive в скрипты ничего не экспортировано по этой теме. Так что остается либо такой костыль, либо если смогешь, то меняй в памяти какой-нибудь байт у этого объекта, а потом его читай где надо.

 

З.Ы. health == 0 кстати пробовал?

 

 

 

чтобы оно осталось даже если игра будет перезагружена.

Так ведь после перезагрузки, если объект будет мертв, то и alive вернет фальс.

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

, пробовал, вроде не сработало. Ща ещё раз гляну.

 

Да проблемы по сути нету никакой. Просто есть 3 функции. В первой сталкер самовыпиливается и функция завершается. Затем после неё идёт вторая функция в которой нужно проверить жив ли сталкер (идёт вторая) или нет (идёт третья). Вот и вопрос: как узнать почти что сразу, самовыпилился ли он для второй функции, иначе сработает третья функция. По сути можно и переменными в таблице, но интересно, есть ли другой способ без лишних заборов? К примеру коммьюнити ему сменить и потом проверять по ней (но это уже используется)

, а если надо почти моментально? Получается надо и переменные и метод alive() вместе... но забор ведь)

 

иными словами: нужен определённый "флаг" трупа который выставляется моментально.

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

... А наше дело маленькое - с ружьём да по болотам. (с)

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

1. obj.just_killed = true

2. if obj.just_killed or not obj:alive() then ...

else ...

end

 

Переменная может быть любая из свободных.

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

@Dennis_Chikin, мм способ по сути такой же как и у  .  Ладно, попробую чо нить придумать сам. Всем спс. 

... А наше дело маленькое - с ружьём да по болотам. (с)

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

 

 

3 функции. В первой сталкер самовыпиливается

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

Или это - "забор"?

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

, а функция kill точно жизни в 0 уводит? Я помню, что вроде она может и в отрицательную степь увести, но тебе с движком оно виднее.

local bAlive = true function MobKill(obj) obj:kill(obj) bAlive = false end function aaa() if not bAlive then ... end end

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

 

А так способ предложенный Денисом хороший (подобные вещи в юзердату писать), меньше мусора будет в дальнейшем.

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

@Struck

 

про kill:   в первой функции ставил health в ноль вот так obj.health = - obj.health , затем во второй проверял obj.health <= 0. Итог - не прокатило. Но проверю ещё раз, мало ли напортачил.

 

про bAlive и юзердату: (я не говорил что они не пашут)  методы считай не особо отличаются, просто разные места для сохранений флага. Я видимо слабо уточнил - надо бы такой флаг, который бы остался даже при перезагрузке и был привязан к объекту, как пример - смена коммьюнити. 

 

 

 

P.S. Я много чего не знаю.

 

Да забейте ребят, проблемы нет. Просто любопытно.

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

... А наше дело маленькое - с ружьём да по болотам. (с)

Ссылка на комментарий
obj.just_killed = true

Разве новые свойства таким образом можно задавать?

 

Why not ? Ни чем не отличается от self.what_you_know = something из себя. dc

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

"надо бы такой флаг, который бы остался даже при перезагрузке" -

Но зачем ???

Можно еще db.storage[npc_id].pstor.your_var = true. Но а смысл ? Если :alive() замечательно работает ?

Еще есть серверный объект, которому пишут в пакет, но зачем же ???

 

Короче, правильный ответ в этой телевикторине не угадал ни кто. 8(

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

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

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

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

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

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

Войти

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

Войти

AMK-Team.ru

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