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

[CoP] Ковыряемся в файлах


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

Whisper смотри тему: Создание квестов, там все для тех кто на бронепоезде описано.

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

Larry76, теперь есть, но он всё равно кудато идёт. И ещё вопрос: Дело в том, что мой Страж не хочет со мной базарить (ссылается на какогото бугра, которому надо по ушам катать, говорить что его не казённые!). Где ему надо править, чтобы они были казёнными?

 

 

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

strai вот так попробуй

 

 

----------------------------------------------------------------------------------------------------------------------

-- Схема встречи двух сталкеров

-- автор: Диденко Руслан (Stohe)

-- переработано: Рыженков Алексей(_Zero_cooL_)

-- TODO:

----------------------------------------------------------------------------------------------------------------------

 

---------------------------------------------------------------------------------------------------------------------

--Evaluators

----------------------------------------------------------------------------------------------------------------------

--' Возвращает есть ли у нас контакт с другим сталкером

class "evaluator_contact" (property_evaluator)

function evaluator_contact:__init(name, storage) super (nil, name)

self.a = storage

end

function evaluator_contact:evaluate()

if self.a.meet_set ~= true then return false end

 

-- if self.a.meet_only_at_path == true and not db.storage[self.object:id()].move_mgr:arrived_to_first_waypoint() then

-- return false

-- end

 

if db.actor then

if not db.actor:alive() then

return false

end

 

self.a.meet_manager:update()

 

if xr_wounded.is_wounded(self.object) then

return false

end

 

if self.object:best_enemy() ~= nil then

return false

end

 

if self.mgr == nil then

self.mgr = self.object:motivation_action_manager()

end

if self.mgr:evaluator(stalker_ids.property_enemy):evaluate() then

self.a.meet_manager.use = "false"

self.object:disable_talk()

return false

end

 

return self.a.meet_manager.current_distance ~= nil

else

return false

end

end

 

----------------------------------------------------------------------------------------------------------------------

--Actions

----------------------------------------------------------------------------------------------------------------------

--' Приглашение к тороговле

class "action_meet_wait" (action_base)

function action_meet_wait:__init (npc_name,action_name, storage, char_ini) super (nil, action_name)

self.char_ini = char_ini

self.a = storage

end

function action_meet_wait:initialize()

action_base.initialize(self)

self.object:set_desired_position()

self.object:set_desired_direction()

 

end

function action_meet_wait:execute ()

action_base.execute(self)

self.a.meet_manager:update_state()

end

function action_meet_wait:finalize ()

action_base.finalize(self)

end

 

 

 

-- Функционал

--[[

 

-- звук на юзание CB

 

]]

 

class "Cmeet_manager"

function Cmeet_manager:__init(npc, storage)

self.npc = npc

self.a = storage

 

self.startdialog = nil

self.abuse_mode = nil

self.trade_enable = nil

self.use = nil

self.allow_break = nil

self.npc_is_camp_director = false

 

self.curent_distance = nil -- nil - мит не активен, close - близко, far - далеко

 

self.hello_passed = false -- Говорили ли мы привет

self.bye_passed = false -- Говорили ли мы пока

end

function Cmeet_manager:update_state()

local state = nil

local victim = nil

 

if self.current_distance == "close" then

-- анимация, пока в близком радиусе

state = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_anim)

 

-- направление, пока в близком радиусе

victim = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_victim)

 

elseif self.current_distance == "far" then

-- анимация, пока в дальнем радиусе

state = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_anim)

 

-- направление, пока в близком радиусе

victim = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_victim)

 

end

 

if tostring(victim) ~= "nil" then

local sim = alife()

if sim then

victim = get_story_object(victim)

end

else

victim = nil

end

if tostring(state) ~= "nil" then

if victim == nil then

state_mgr.set_state(self.npc, state, nil, nil, nil)

else

state_mgr.set_state(self.npc, state, nil, nil, {look_object = victim})

end

end

 

local snd = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_snd)

 

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

if tostring(snd) ~= "nil" then

xr_sound.set_sound_play(self.npc:id(), snd)

end

 

end

function Cmeet_manager:set_start_distance()

if db.actor == nil then

self.hello_passed = false

self.bye_passed = false

self.current_distance = nil

return

end

 

if not self.npc:alive() then

self.hello_passed = false

self.bye_passed = false

self.current_distance = nil

return

end

 

-- Определение, в каком радиусе находимся

local distance = self.npc:position():distance_to(db.actor:position())

 

local actor_visible = self.npc:see(db.actor)

 

local is_object_far = actor_visible and distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_distance))

local is_object_close = (actor_visible and distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_distance))) or self.npc:is_talking()

 

if is_object_close == true then

self.hello_passed = true

self.current_distance = "close"

elseif is_object_far == true then

self.bye_passed = true

self.current_distance = "far"

elseif distance > self.a.reset_distance then

self.hello_passed = false

self.bye_passed = false

self.current_distance = nil

else

self.current_distance = nil

end

 

end

function Cmeet_manager:update()

-- Определение, в каком радиусе находимся

local distance = self.npc:position():distance_to(db.actor:position())

 

local actor_visible = self.npc:see(db.actor)

 

if actor_visible then

--printf("%s check distance %s <= %s <= %s", self.npc:name(), distance, tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_snd_distance)), tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_snd_distance)) )

if distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_snd_distance)) then

-- Коллбек на приближение

-- звук при приближении

if self.hello_passed == false then

local snd = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_snd_hello)

if tostring(snd) ~= "nil" and not state_mgr.is_npc_in_combat(self.npc) then

xr_sound.set_sound_play(self.npc:id(), snd)

end

 

self.hello_passed = true

end

 

elseif distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_snd_distance)) then

if self.hello_passed == true then

-- Коллбек на отдаление

-- звук при отдалении

if self.bye_passed == false then

local snd = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_snd_bye)

if tostring(snd) ~= "nil" and not state_mgr.is_npc_in_combat(self.npc) then

xr_sound.set_sound_play(self.npc:id(), snd)

end

 

self.bye_passed = true

end

end

end

end

 

local is_object_far = actor_visible and distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.far_distance))

local is_object_close = (actor_visible and distance <= tonumber(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_distance))) or (self.npc:is_talking() and self.a.meet_on_talking)

 

--printf("!!! %s %s %s", self.npc:name(), tostring(is_object_far), tostring(is_object_close))

--printf("%s", xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.close_distance))

 

if is_object_close == true then

if self.current_distance ~= "close" then

self.current_distance = "close"

end

elseif is_object_far == true then

self.current_distance = "far"

elseif distance > self.a.reset_distance then

-- ресет флажков при выходе в дальний радиус CB

self.hello_passed = false

self.bye_passed = false

self.current_distance = nil

else

self.current_distance = nil

end

 

 

-- Можно или нет оборвать диалог

local allow_break = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.allow_break)

if self.allow_break ~= (allow_break == "true") then

self.allow_break = (allow_break == "true")

end

 

-- стартовый диалог

if self.a.meet_dialog ~= nil then

local start_dialog = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.meet_dialog)

if self.startdialog ~= start_dialog then

self.startdialog = start_dialog

--printf("*DIALOGS %s* SET [%s]", self.npc:name(), tostring(start_dialog))

if start_dialog == nil or start_dialog == "nil" then

-- восстановление начального

--printf("RESTORE")

self.npc:restore_default_start_dialog()

else

--printf("SET %s allow_break %s", start_dialog, tostring(self.allow_break))

-- установка нового

self.npc:set_start_dialog(start_dialog)

if self.npc:is_talking() then

db.actor:run_talk_dialog(self.npc, not(self.allow_break))

end

end

end

end

 

 

local is_talking = self.npc:is_talking()

 

 

local use = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.use)

 

-- Проверяем, играем ли мы что то в кампе

if self.npc_is_camp_director == true then

use = "false"

end

 

 

--printf("%s self.use[%s] use [%s]", self.npc:name(), tostring(self.use), tostring(use))

--print_table(self.a.use)

-- доступность юзания

if self.use ~= use then

if use == "self" then

if not is_talking and device().precache_frame < 1 then

self.npc:enable_talk()

--printf("SET allow_break %s", tostring(self.allow_break))

self.npc:allow_break_talk_dialog(self.allow_break)

db.actor:run_talk_dialog(self.npc, not(self.allow_break))

end

end

if device().precache_frame < 1 then

self.use = use

end

end

 

 

local use_text = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.use_text)

if use_text ~= "nil" then

self.npc:set_tip_text(use_text)

else

if self.npc:is_talk_enabled() then

self.npc:set_tip_text("character_use")

else

self.npc:set_tip_text("")

end

end

 

self.npc:allow_break_talk_dialog(self.allow_break)

--[[

if is_talking then

db.actor:allow_break_talk_dialog(self.allow_break)

end

]]

-- Проверяем включать ли обижание на заюзывание

local abuse = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.abuse)

if self.abuse_mode ~= abuse then

if abuse == "true" then

xr_abuse.enable_abuse(self.npc)

else

xr_abuse.disable_abuse(self.npc)

end

self.abuse_mode = abuse

end

 

-- доступность торговли

if xr_wounded.is_wounded(self.npc) then

self.trade_enable = false

else

local trade_enable = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.trade_enable)

--printf("npc [%s] self %s *** %s", self.npc:name(), tostring(self.trade_enable), tostring(trade_enable))

if self.trade_enable ~= trade_enable then

if trade_enable == "true" then

self.npc:enable_trade()

else

self.npc:disable_trade()

end

self.trade_enable = trade_enable

end

end

end

 

function notify_on_use(victim, who)

--printf("NOTIFY [%s] used by [%s]", victim:name(), who:name())

 

-- Если мы мертвы - на юзание не реагировать

if not victim:alive() then

return

end

 

local st = db.storage[victim:id()].meet

 

if st == nil then

return

end

 

local snd = xr_logic.pick_section_from_condlist(db.actor, victim, st.snd_on_use)

if tostring(snd) ~= "nil" then

xr_sound.set_sound_play(victim:id(), snd)

end

 

 

local meet_manager = st.meet_manager

 

if meet_manager.use == "false" and meet_manager.abuse_mode == "true" and

game_relations.get_npcs_relation(victim, db.actor) == game_object.friend

then

xr_abuse.add_abuse(victim, 1)

end

end

 

 

----------------------------------------------------------------------------------------------------------------------

-- binder

----------------------------------------------------------------------------------------------------------------------

function add_to_binder(object, char_ini, scheme, section, st)

local operators = {}

local properties = {}

 

local manager = object:motivation_action_manager()

 

properties["contact"] = xr_evaluators_id.stohe_meet_base + 1

properties["wounded"] = xr_evaluators_id.sidor_wounded_base

properties["abuse"] = xr_evaluators_id.abuse_base

properties["wounded_exist"] = xr_evaluators_id.wounded_exist

properties["corpse_exist"] = xr_evaluators_id.corpse_exist

 

operators["contact"] = xr_actions_id.stohe_meet_base + 1

operators["state_mgr_to_idle_alife"] = xr_actions_id.state_mgr + 2

 

-- Evaluators

manager:add_evaluator (properties["contact"], evaluator_contact("meet_contact", st))

 

-- Actions

local action = action_meet_wait (object:name(),"action_process_meet", st, char_ini)

action:add_precondition (world_property(stalker_ids.property_alive, true))

action:add_precondition (world_property(stalker_ids.property_enemy, false))

action:add_precondition (world_property(stalker_ids.property_danger,false))

action:add_precondition (world_property(stalker_ids.property_anomaly,false))

 

action:add_precondition (world_property(stalker_ids.property_items, false))

action:add_precondition (world_property(properties["wounded_exist"],false))

action:add_precondition (world_property(properties["corpse_exist"], false))

 

action:add_precondition (world_property(properties["contact"], true))

action:add_precondition (world_property(properties["wounded"], false))

action:add_precondition (world_property(properties["abuse"], false))

action:add_effect (world_property(properties["contact"], false))

manager:add_action (operators["contact"], action)

 

action = manager:action (xr_actions_id.alife)

action:add_precondition (world_property(properties["contact"], false))

 

action = manager:action (operators["state_mgr_to_idle_alife"])

action:add_precondition (world_property(properties["contact"], false))

 

st.meet_manager = Cmeet_manager(object, st)

 

xr_logic.subscribe_action_for_events(object, st, st.meet_manager)

end

 

 

 

------------

-- Вызывается только в начале на чтении логики, создает экшены, эвалуаторы и производит

-- первичную настройку.

function set_meet(npc, ini, scheme, section)

local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)

end

-- Вызывается на переключении на новую секцию. Производит вычитывание настроек из текущей секции.

function reset_meet(npc, scheme, st, section)

local meet_section

-- printf("[%s]", utils.to_str(st.section_logic))

if scheme == nil or scheme == "nil" then

meet_section = utils.cfg_get_string(st.ini, st.section_logic, "meet", npc, false, "")

else

meet_section = utils.cfg_get_string(st.ini, section, "meet", npc, false, "")

end

 

init_meet(npc, st.ini, meet_section, st.meet, scheme)

end

 

 

-- Функция чтения настроек. В нее передается секция, откуда их нужно читать.

function init_meet(npc, ini, section, st, scheme)

--printf("MEET SECTION [%s][%s][%s]", tostring(st.meet_section), tostring(section), tostring(scheme))

 

if tostring(section) == st.meet_section and

tostring(section) ~= "nil"

then

return

end

 

st.meet_section = utils.tostring(section)

 

-- Что можно настраивать в meet

--[[

[meet]

close_distance = {=actor_has_weapon} 3, 3

close_anim = {=actor_has_weapon} a, b

close_snd_hello = {=actor_has_weapon} a, b

close_snd_bye = {=actor_has_weapon} a, b

close_victim = {=actor_has_weapon} a, b

 

 

far_distance = {=actor_has_weapon} 30, 30

far_anim = {=actor_has_weapon} a, b

far_snd = {=actor_has_weapon} a, b

far_victim = {=actor_has_weapon} a, b

 

 

snd_on_use = {=in_battle} a, {=no_talk} b, c

 

use = {=actor_has_weapon} true, false -- self - юзает сам

meet_dialog = {=actor_has_weapon} a

abuse = {=in_battle} true, false

trade_enable = {=in_battle} true, false

allow_break = {=in_battle} true, false

 

Ненастраиваемые параметры:

 

reset_distance = 30

 

]]

 

-- Устанавливаем дефолты

local def = {}

 

local relation = game_relations.get_npcs_relation(npc, db.actor)

 

if relation == game_object.enemy then

def.close_distance = "0"

def.close_anim = "nil"

def.close_snd_distance = "0"

def.close_snd_hello = "nil"

def.close_snd_bye = "nil"

def.close_victim = "nil"

def.far_distance = "0"

def.far_anim = "nil"

def.far_snd_distance = "0"

def.far_snd = "nil"

def.far_victim = "nil"

def.snd_on_use = "nil"

def.use = "false"

def.meet_dialog = "nil"

def.abuse = "false"

def.trade_enable = "true"

def.allow_break = "true"

def.meet_on_talking = "false"

def.use_text = "nil"

 

else

def.close_distance = "{=is_wounded} 0, 3"

def.close_anim = "{=is_wounded} nil, {=actor_has_weapon} threat_na, talk_default"

def.close_snd_distance = "{=is_wounded} 0, 3"

def.close_snd_hello = "{=is_wounded} nil, {=actor_enemy} nil, {=actor_has_weapon} meet_hide_weapon, meet_hello"

def.close_snd_bye = "{=is_wounded} nil, {=actor_enemy} nil, {=actor_has_weapon} nil, meet_hello"

def.close_victim = "{=is_wounded} nil, actor"

def.far_distance = "{=is_wounded} 0, 5"

def.far_anim = "nil"

def.far_snd_distance = "{=is_wounded} 0, 5"

def.far_snd = "nil"

def.far_victim = "nil"

def.snd_on_use = "{=is_wounded} nil, {=actor_enemy} nil, {=has_enemy} meet_use_no_fight, {=actor_has_weapon} meet_use_no_weapon, {!dist_to_actor_le(3)} nil"

def.use = "{=is_wounded} false, {=actor_enemy} false, {=has_enemy} false, {=actor_has_weapon} false, {=dist_to_actor_le(3)} true, false"

def.meet_dialog = "nil"

def.abuse = "{=has_enemy} false, true"

def.trade_enable = "true"

def.allow_break = "true"

def.meet_on_talking = "true"

def.use_text = "nil"

end

 

 

if tostring(section) == "no_meet" then

st.close_distance = xr_logic.parse_condlist(npc, section, "close_distance", "0")

st.close_anim = xr_logic.parse_condlist(npc, section, "close_anim", "nil")

st.close_snd_distance=xr_logic.parse_condlist(npc, section, "close_distance", "0")

st.close_snd_hello = xr_logic.parse_condlist(npc, section, "close_snd_hello", "nil")

st.close_snd_bye = xr_logic.parse_condlist(npc, section, "close_snd_bye", "nil")

st.close_victim = xr_logic.parse_condlist(npc, section, "close_victim", "nil")

 

st.far_distance = xr_logic.parse_condlist(npc, section, "far_distance", "0")

st.far_anim = xr_logic.parse_condlist(npc, section, "far_anim", "nil")

st.far_snd_distance = xr_logic.parse_condlist(npc, section, "far_distance", "0")

st.far_snd = xr_logic.parse_condlist(npc, section, "far_snd", "nil")

st.far_victim = xr_logic.parse_condlist(npc, section, "far_victim", "nil")

 

st.snd_on_use = xr_logic.parse_condlist(npc, section, "snd_on_use", "nil")

st.use = xr_logic.parse_condlist(npc, section, "use", "false")

st.meet_dialog = xr_logic.parse_condlist(npc, section, "meet_dialog", "nil")

st.abuse = xr_logic.parse_condlist(npc, section, "abuse", "false")

st.trade_enable = xr_logic.parse_condlist(npc, section, "trade_enable", "true")

st.allow_break = xr_logic.parse_condlist(npc, section, "allow_break", "true")

st.meet_on_talking = xr_logic.parse_condlist(npc, section, "meet_on_talking", "false")

st.use_text = xr_logic.parse_condlist(npc, section, "use_text", "nil")

 

st.reset_distance = 30

st.meet_only_at_path = true

 

else

st.close_distance = xr_logic.parse_condlist(npc, section, "close_distance", utils.cfg_get_string(ini, section, "close_distance", npc, false, "", def.close_distance))

st.close_anim = xr_logic.parse_condlist(npc, section, "close_anim", utils.cfg_get_string(ini, section, "close_anim", npc, false, "", def.close_anim))

st.close_snd_distance=xr_logic.parse_condlist(npc, section, "close_snd_distance", utils.cfg_get_string(ini, section, "close_snd_distance", npc, false, "",def.close_distance))

st.close_snd_hello = xr_logic.parse_condlist(npc, section, "close_snd_hello", utils.cfg_get_string(ini, section, "close_snd_hello", npc, false, "", def.close_snd_hello))

st.close_snd_bye = xr_logic.parse_condlist(npc, section, "close_snd_bye", utils.cfg_get_string(ini, section, "close_snd_bye", npc, false, "", def.close_snd_bye))

st.close_victim = xr_logic.parse_condlist(npc, section, "close_victim", utils.cfg_get_string(ini, section, "close_victim", npc, false, "", def.close_victim))

 

st.far_distance = xr_logic.parse_condlist(npc, section, "far_distance", utils.cfg_get_string(ini, section, "far_distance", npc, false, "", def.far_distance))

st.far_anim = xr_logic.parse_condlist(npc, section, "far_anim", utils.cfg_get_string(ini, section, "far_anim", npc, false, "", def.far_anim))

st.far_snd_distance = xr_logic.parse_condlist(npc, section, "far_snd_distance", utils.cfg_get_string(ini, section, "far_snd_distance", npc, false, "", def.far_snd_distance))

st.far_snd = xr_logic.parse_condlist(npc, section, "far_snd", utils.cfg_get_string(ini, section, "far_snd", npc, false, "", def.far_snd))

st.far_victim = xr_logic.parse_condlist(npc, section, "far_victim", utils.cfg_get_string(ini, section, "far_victim", npc, false, "", def.far_victim))

 

st.snd_on_use = xr_logic.parse_condlist(npc, section, "snd_on_use", utils.cfg_get_string(ini, section, "snd_on_use", npc, false, "", def.snd_on_use))

st.use = xr_logic.parse_condlist(npc, section, "use", utils.cfg_get_string(ini, section, "use", npc, false, "", def.use))

st.meet_dialog = xr_logic.parse_condlist(npc, section, "meet_dialog", utils.cfg_get_string(ini, section, "meet_dialog", npc, false, "", def.meet_dialog))

st.abuse = xr_logic.parse_condlist(npc, section, "abuse", utils.cfg_get_string(ini, section, "abuse", npc, false, "", def.abuse))

st.trade_enable = xr_logic.parse_condlist(npc, section, "trade_enable", utils.cfg_get_string(ini, section, "trade_enable", npc, false, "", def.trade_enable))

st.allow_break = xr_logic.parse_condlist(npc, section, "allow_break", utils.cfg_get_string(ini, section, "allow_break", npc, false, "", def.allow_break))

st.meet_on_talking = xr_logic.parse_condlist(npc, section, "meet_on_talking", utils.cfg_get_string(ini, section, "meet_on_talking", npc, false, "", def.meet_on_talking))

st.use_text = xr_logic.parse_condlist(npc, section, "use_text", utils.cfg_get_string(ini, section, "use_text", npc, false, "", def.use_text))

 

 

st.reset_distance = 30

st.meet_only_at_path = true

end

 

st.meet_manager:set_start_distance()

 

--print_table(st.far_distance)

-- флажок, что функция хотя бы раз вызывалась

st.meet_set = true

end

 

function disable_scheme(npc, scheme)

db.storage[npc:id()].actor_dialogs = nil

db.storage[npc:id()].actor_disable = nil

end

 

--- Находится ли чувак в данный момент в состоянии мита

function is_meet(npc)

local manager = npc:motivation_action_manager()

if manager and manager:initialized() then

local id = manager:current_action_id()

if id == xr_actions_id.stohe_meet_base + 1 then

return true

end

end

return false

end

 

function process_npc_usability(npc)

if xr_wounded.is_wounded(npc) then

if npc:relation(db.actor) == game_object.enemy then

npc:disable_talk()

else

local wounded = db.storage[npc:id()].wounded

if wounded.enable_talk then

npc:enable_talk()

else

npc:disable_talk()

end

end

return

end

 

local meet = db.storage[npc:id()].meet

 

local use = meet.meet_manager.use

 

if use == "true" then

if xr_corpse_detection.is_under_corpse_detection(npc) or xr_help_wounded.is_under_help_wounded(npc) then

npc:disable_talk()

else

npc:enable_talk()

end

elseif use == "false" then

npc:disable_talk()

if npc:is_talking() then

npc:stop_talk()

end

end

 

end

 

 

это файл xr_meet.script замени его и тогда с тобой все сталкеры говорить будут.

есть и другой вариант. Ася в профиле, если что стучись

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

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

Та инструкция по которой ты спавнишь нпц для тч-а там можно говорить с кем угодно. В зп же можно говорить только с начальником сквада. так вот тебе просто нужно создать сквад из одного твоего нпц и он говорить точно будет с тобой. Посмотри страницы 2-3 назад я описывал в подробностях как делать.

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

alexwew, спасибо! Но как это "Он для ТЧ"? Не знал что в ТЧ есть затон...

Слушай, а попроше что нибудь есть? А то нифига не понимаю...

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

Да он для тч! Просто так спавнить и в зп можно ноооо говорить не будет нпц с гг. а попроще никак.

Щас напишу как через сквад

Так в алайф локации на которой спавнишь нпц

[103]

; cse_abstract properties

section_name = smart_terrain

name = pri_smart_pseudodog_lair1

position = 176.663238525391,-2.20351982116699,242.033248901367

direction = 0,-0,-0

 

; cse_alife_object properties

game_vertex_id = 966

distance = 5.59999990463257

level_vertex_id = 255666

object_flags = 0xffffff3e

custom_data = <<END

[smart_terrain]

cfg=scripts\marsh\smart\mar_sim_2.ltx

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 1

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; se_smart_terrain properties

 

 

 

Это смарт террейн с логикой

 

в файл логики

[smart_terrain]

squad_id = 27

max_population = 1

respawn_params = respawn@1

arrive_dist=65

 

[respawn@1]

spawn_stalker@master

spawn_stalker@advanced

spawn_stalker@veteran

 

[spawn_stalker@master]

spawn_squads = greh_sim_squad_novice ----это имя сквада, тут что хош пиши.

spawn_num = 1

 

 

 

далее в

[greh_sim_squad_novice]:online_offline_group

faction = freedom

npc_random = sim_default_greh_0 ---- это нпц твой.

npc_in_squad = 1, 1

 

 

 

Вот и все, можно добавить ему пути в вей файл локи.

А и кстати, ид нпц ты свое пиши.

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

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

Находятся они у тя на компе! Если игра есть значит и файлы эти есть, распаковщик вверху в шапке, ну и поиском учить пользоваться?

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

straj, alexwew Стоп,стоп...куда вас понесло? Причём тут сквад?

Вот пример логики для непися одиночного...

Это я заспавнил командира блокпоста. Стоит на месте и даже поговорить\поторговать можно с ним.

Правда ассортимент у него как у обычного сталка(я не стремился его торговцем сделать.)

[logic]

active = remark1

danger = danger

 

[remark1]

meet = meet

gather_items_enabled = false

help_wounded_enabled = false

corpse_detection_enabled = false

use_camp = false

def_state_standing = ward_noweap

def_state_moving1 = patrol

no_retreat = true

target = story | actor

wounded = wounded

 

[smart_terrains]

none = true

 

[meet]

close_snd_hello = = nil

close_snd_bye = = nil

close_anim = guard_na

close_victim = actor

far_anim = nil

far_victim = nil

close_distance = 2

far_distance = 0

close_snd_distance = 3

abuse = false

use = {=actor_enemy} false, true

allow_break = false

meet_on_talking = false

 

[wounded]

hp_state = 0|wounded_heavy@help_heavy

hp_state_see = 0|wounded_heavy@help_heavy

hp_victim = 0|nil

hp_fight = 0|false

hp_cover = 0|false

 

[danger]

ignore_distance = 5

ignore_distance_grenade = 5

ignore_distance_corpse = 5

ignore_distance_hit = 5

ignore_distance_sound = 5

 

Тут даже мусора наверное много,кое-что выкинуть можно,я ещё не разбирался.

 

Просто так спавнить и в зп можно ноооо говорить не будет нпц с гг. а попроще никак.

Здрасте,приехали... А я с кем тогда разговариваю?? :shok:

Изменено пользователем Larry76
Правильно заданный вопрос- уже половина ответа!
Ссылка на комментарий

мм, larry76 я ж по русски вроде написал что может и еще способ есть, но я не знаю его. Вот и написал как вариант спавн начальника сквада в котором 1 нпц. И кстати не вижу ничего глупого в этом.

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

Жизнь-говно. Бабы -консервы.

Забьюсь под стол, чтоб никто не трогал.

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

nuklia,помоги пожалуйста разобраться со смарт-террейнами?

Исходные данные у меня сравнимы с твоими. Кордон подключенный к ЗП(только вертекс не 934 а 1179 т.к. он подключен у меня после Болот)

Сделал всё по твоей инструкции "Перенос и создание карт" пост №90 ,но словил вылет:

FATAL ERROR

 

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:615: attempt to index global 'sim_board' (a nil value)

 

 

Одно из двух.... или я что-то не дописал,либо ты что-то недосказал... ;)

разобрался...я кое-где запятые в файлах не поставил(в частности при добавлении кордона в списки локаций.)

Теперь вопрос в другом: Как заставить их выполнять какую-либо имитацию действий? А то у меня двое подчинённых тупо стоят,а главный лишь изредка прохаживается пару шагов туда-сюда.

 

И ещё, ты бы не мог поделиться опытом,как тебе удалось Сидоровича реанимировать??

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

Изменено пользователем Larry76
Правильно заданный вопрос- уже половина ответа!
Ссылка на комментарий

Народ а никто не скажет как сделать что бы Сталкеры искали арты постоянно, а не только по заданиям Бороды?Ведь здесь наверняка скрипт который включает\выключает эту возможность.

Не соответствует. N6260

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

Всё сделал но он нехочет со мной говорить! И стоять не хочит! Кому надо- могу дать ссыль на мою геймдату. И ещё: где прописывается логика?

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

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

(буду делать для Затона - иначе запутаемся в террейнах и путях):

Создадим сквад из имеющегося уже специфик характера первого попавшегося

к примеру долговца - sim_default_duty_4, определим его в ближайший от начала игры

смарт-террейн - это zat_a1 , а так-же определим точку его спавна из этого смарта -

zat_a1_guard_1_walk (смотрим way_zaton.ltx) - точка двойная, будет ходить по ней

и смотреть в точки zat_a1_guard_1_look

; Здесь содержатся дескрипшены сквадов, которые потом можно создавать используя спец функции.

[zat_bolvan_1_squad]:online_offline_group

faction = stalker

npc = sim_default_duty_4

target_smart = zat_a1

spawn_point = zat_a1_guard_1_walk

story_id = zat_bolvan_1_squad

 

 

Теперь добавим этот сквад в стартовую позицию Затона

;;;;;;;;;;;;;;;;;;;;;; FINAL ZATON ;;;;;;;;;;;;;;;;;;;;;;;;;

 

[start_position_zaton]

zat_bolvan_1_squad = zat_a1

 

 

и в уникальные сквады Затона

;--------- ZATON UNIQUE SQUADS --------

[zat_bolvan_1_squad]:default_squad

sim_avail = false

 

 

Все - сквад готов, команда на спавн получена, начинайте новую игру и

встретите его у камней. У нас получился одиночный дефолтный сквад

 

Теперь пойдем дальше - создадим настоящего эксклюзива с индивидуальной

логикой. Преждще всего создаем специфик характер:

<specific_character id="val_freedom_trader" team_default = "1">

<name>val_freedom_trader_name</name>

<icon>ui_npc_u_freedom_2_mask</icon>

<map_icon x="1" y="0"></map_icon>

<bio></bio>

 

<class>val_freedom_trader</class>

<community>freedom</community> <terrain_sect>stalker_terrain</terrain_sect>

 

<rank>450</rank>

<reputation>0</reputation>

<money min="10000" max="27500" infinitive="1"/>

<visual>actors\stalker_freedom\stalker_freedom_2_mask</visual>

<snd_config>characters_voice\human_01\freedom\</snd_config>

<supplies>

[spawn] \n

device_torch \n

wpn_lr300 \n

ammo_5.56x45_ss190 = 5 \n

wpn_hpsa \n

ammo_9x19_fmj = 5 \n

grenade_f1 = 10 \n

#include "gameplay\character_items.xml"

#include "gameplay\character_food.xml"

#include "gameplay\character_drugs.xml"

</supplies>

#include "gameplay\character_criticals_1.xml"

<start_dialog>zat_a2_stalker_barmen_start_dialog</start_dialog>

 

<actor_dialog>zat_a2_linker_b14_quest_init</actor_dialog>

<actor_dialog>zat_a2_linker_b14_quest_done</actor_dialog>

<actor_dialog>zat_a2_linker_b14_quest_strange_item</actor_dialog>

<actor_dialog>zat_a2_linker_b14_quest_sell_artefact</actor_dialog>

<actor_dialog>zat_a2_linker_b14_quest_wrong</actor_dialog>

<actor_dialog>zat_b57_barmen_about_bloodsucker_lair_dialog</actor_dialog>

<actor_dialog>zat_b57_barman_reward_dialog</actor_dialog>

<actor_dialog>zat_b22_barmen_about_vampire_actor1</actor_dialog>

<actor_dialog>zat_b22_barmen_about_vampire_actor2</actor_dialog>

<actor_dialog>zat_b22_barmen_about_vampire_actor3</actor_dialog>

<actor_dialog>zat_b22_barmen_about_vampire_actor4</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b7_actor_start</actor_dialog>

<actor_dialog>zat_b22_barmen_b5_daring_quest_stalkers</actor_dialog>

<actor_dialog>zat_b22_barmen_about_after_quest_b5_dealer_actor4</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_about_new_detector</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_about_compass</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_compass_give_dialog</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_compass_double_dialog</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_compass_revert_dialog</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_take_business_actor_dialog</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_army</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_about_sci_guards</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_about_sci_helpers</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_about_halfart_jup_b1</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_oasis_art_sell</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b52_about_snag</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b52_about_nimble</actor_dialog>

<actor_dialog>zat_a2_linker_b29_actor_info</actor_dialog>

<actor_dialog>zat_a2_linker_b29_actor_get_adv_task</actor_dialog>

<actor_dialog>zat_a2_linker_b29_actor_give_adv_task</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_b30_take_money_actor_dialog</actor_dialog>

<actor_dialog>zat_a2_stalker_barmen_actor_info</actor_dialog>

 

<actor_dialog>actor_break_dialog</actor_dialog>

 

</specific_character>

 

 

<character id="val_freedom_trader">

<class>val_freedom_trader</class>

</character>

 

 

;-------------------------наш свободовец------------------

[val_freedom_trader]:stalker

$spawn = "respawn\val_freedom_trader"

character_profile = val_freedom_trader

spec_rank = regular

community = freedom

story_id = val_freedom_trader

 

 

Создаем сквад

; Здесь содержатся дескрипшены сквадов, которые потом можно создавать используя спец функции.

[val_freedom_trader_squad]:online_offline_group ; наш свободовец

faction = freedom

npc = val_freedom_trader

target_smart = zat_a1

spawn_point = zat_a1_walker_1_walk

story_id = val_freedom_trader_squad

 

 

;;;;;;;;;;;;;;;;;;;;;; FINAL ZATON ;;;;;;;;;;;;;;;;;;;;;;;;;

 

[start_position_zaton]

val_freedom_trader_squad = zat_a1

 

 

;--------- ZATON UNIQUE SQUADS --------

[val_freedom_trader_squad]:default_squad

sim_avail = false

 

 

Пропишем в смарт-террейне путь к файлу логики чувака

[smart_terrain];zat_a1

squad_id = 54

max_population = 3

 

[exclusive] ; пропишем нашего свободовца в эксклюзивы

val_freedom_trader = zaton\val_freedom_trader.ltx ; где лежит файл логики

 

 

И в заключение сам файл логики

[logic@val_freedom_trader]

active = walker@freedom ; активируем первую схему - патруль между двумя точками

suitable = {=check_npc_name(val_freedom_trader)} ; проверяем - наш ли этот чувак

prior = 100

on_hit = hit

on_death = death

 

 

[walker@freedom]

path_look = guard_1_look ;вейпоинты в way_zaton.ltx - куда смотрит

path_walk = guard_1_walk ;вейпоинты в way_zaton.ltx - где ходит

def_state_standing = guard_na ;какую анимацию использует

on_actor_dist_le_nvis = 10 | walker@freedom_1 ;дистанция до игрока <= 10 без проверки на видимость | переход на др схему

;on_info = {=actor_has_item(detector_advanced)} %=teleport_npc(esc_a1_freedom_guard_1_walk)%

meet = no_meet

 

[walker@freedom_1]:walker@freedom ; производная от первой схемы с изменениями

path_walk = guard_2_walk

path_look = guard_2_look

on_actor_dist_ge_nvis = 10 | walker@freedom ;если дистанция до игрока > 8 без проверки на видимость | возврат в первую схему

meet = meet

 

[meet]

close_snd_hello = zat_a2_stalker_barmen_greeting ; озвучка - приветствие, без звука - nil

close_snd_bye = zat_a2_stalker_barmen_farewell ; озвучка - прощание, без звука - nil

close_anim = guard_na

close_victim = actor

far_anim = nil

far_victim = nil

close_distance = 2

far_distance = 0

close_snd_distance = 3

abuse = false

;use = {=actor_has_item(detector_advanced)} true, false ;условие диалога -есть детектор"медведь" -говорит

use = true

allow_break = false

meet_on_talking = false

 

[wounded]

hp_state = 0|wounded_heavy@help_heavy

hp_state_see = 0|wounded_heavy@help_heavy

hp_victim = 0|nil

hp_fight = 0|false

hp_cover = 0|false

 

[danger]

ignore_distance = 0

ignore_distance_grenade = 0

ignore_distance_corpse = 0

ignore_distance_hit = 0

ignore_distance_sound = 0

 

[hit]

 

[death]

 

 

Обратите внимание на написание точек путей в логике при таком

спавне - имя смарт-террейна не пишется zat_a1_guard_1_look

Сами понимаете, что если сразу двоих сделаете - передерутся и

долговец скорее всего победит - надо кому-нибудь группировку сменить.

Продолжение следует...

 

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

Larry76, когда делаю как написал nuklia - получаю вылет!

Лог:

Expression : fatal error

Function : CInifile::Load

File : D:\prog_repository\sources\trunk\xrCore\Xr_ini.cpp

Line : 274

Description : <no expression>

Arguments : Duplicate section 'start_position_zaton' found.

 

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

Duplicate section 'start_position_zaton' found. Вот твоя проблема.

Ты когда копировал, скопировал всё.

;;;;;;;;;;;;;;;;;;;;;; FINAL ZATON ;;;;;;;;;;;;;;;;;;;;;;;;;

 

[start_position_zaton]

zat_bolvan_1_squad = zat_a1

тебе надо было скопировать только последнюю строчку у тебя [start_position_zaton] уже есть,смотри внимательней.

Правильно заданный вопрос- уже половина ответа!
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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