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

Создание NPC "привязанного к точке" без редактирования all.spawn


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

Создал своего снайпера на Янтаре, а игра сразу же вылетает пишет какую-то ошибкe в янтарском character_desc.

вот как сталкера прописал в это файле

<!---------------------------Chuvak----------------------->

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

<name>Чувак</name>

<icon>ui_npc_u_stalker_neytral_hood_9</icon>

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

<bio>биографиячувака</bio>

 

<class>yan_general_ecolog</class>

<community>stalker</community><terrain_sect>stalker_terrain</terrain_sect>

<money min="600" max="2000" infinitive="0"></money>

 

<rank>900</rank>

<reputation>1000</reputation>

 

<visual>actors\neytral\stalker_neytral_exoskeleton</visual>

<snd_config>characters_voice\human_01\stalker\</snd_config>

<crouch_type>-1</crouch_type>

wpn_val \n

ammo_9x39_ap = 5 \n

#include "gameplay\character_items.xml"\n

#include "gameplay\character_food.xml" \n

#include "gameplay\character_drugs.xml"

</supplies>

 

#include "gameplay\character_criticals_4.xml"

#include "gameplay\character_dialogs.xml"

 

</specific_character>

 

 

вот такую ошибку выдает

Expression : false

Function : CXml::Init

File : E:\stalker\patch_1_0004\xrXMLParser\xrXMLParser.cpp

Line : 87

Description : XML file:gameplay\character_desc_yantar.xml value: errDescr:Error reading end tag.

 

Подскажите, пожалуйста, что не так??

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

shooting unicorn, возьми переводчик и переведи лог вылета, многое станет понятно...

проверь синтаксис.

Возможно всё, ну или почти всё.
Ссылка на комментарий

shooting unicorn ошибка какаята вот перевод лога

 

Выражение: ложный

Функция: CXml:: Init

Файл: E:\stalker\patch_1_0004\xrXMLParser\xrXMLParser.cpp

Линия: 87

Описание: XML file:gameplay \character_desc_yantar.xml ценность: конечный тэг чтения errDescr:Error.

 

 

Не соответствует правилам. N6260

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

8push5, Niko1995, спасибо :)

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

 

теперь только вот при загрузке новый игры выдают ошибку в скрипте, хотя вроде все, как написано сделал.

 

скрипт

class "actor_binder" (object_binder)

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

function actor_binder:__init (obj) super(obj)

self.bCheckStart = false

self.weather_manager = level_weathers.WeatherManager()

self.actor_detector = xr_detector.actor_detector()

if sniper_add.load_variable("spawn_sniper",false)==false then

sniper_add.start_add_spawn()

sniper_add.save_variable("spawn_sniper",true)

end

end

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

 

 

 

ошибка

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:27: attempt to index global 'sniper_add' (a nil value)

 

 

Подскажете, пожалуйста, что не так??

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

spawn_sniper_one()

end

 

function chuvak_stalker()--\\spawn_sniper_one()

local x= 38.645313262939

local y= -11.880430221558

local z= -247.4303894043

local level_vertex= 58144

local game_vertex_id= 1478

alife():create(yan_stalker,vector():set(x,y,z),level_vertex,game_vertex_id)

end

 

function save_variable(variable_name, value)

xr_logic.pstor_store(db.actor, variable_name, value)

end

function load_variable(variable_name, value_if_not_found)

return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)

end

 

 

 

 

 

Вроде всё так, как надо.

скажите, плизз, что не так??

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

Что-то меня безлоговые вылеты мучают... Логика точь в точь как у торговца. Причем вылет этот не сразу при спавне нового непися, а через, примерно, минуту. В чем может быть проблема?

И еще вопрос: что прописать и где, чтобы непись мог давать квесты типа "Мне нужна работа, есть что на примете?"?.

Мне "Винторез" - единственный друг, надежда, опора и сила.
Уродов сегодня так много вокруг, патронов бы только хватило. (с)

Официальный Discord-сервер по NS OGSR. 
Неофициальный филиал "У Костра", но тоже Discord-сервер.

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

Помогите с ситуацией пожалуйста:

Я заспавнил нового нпс поставил ему в логике чтобы он стоял около двери бункера сидоровича но когда вышел то обнаружил его в деревне сидящим у костра и он даже не думал идти на свои координаты.как его привязать к точке?в его логике я прописал no_move = true .это должно было его заставить стоять на месте.почему он ушел с координат непонятно.

Строгое предупреждение от модератора n6260
Режимридонлитебенатроесутокдогадайсясамзачто.

Замедляю полураспад души стержнями музыки

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

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

 

Сюжетное продолжение чистого неба
Зона обр.2010г.
S.T.A.L.K.E.R.-Расширение территорий

 

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

По секрету так не бывает

НПС и монстры не могут просто ходить по зоне

это все илюзия <_< они идут в свободные гулаги даже если гулаги на другой локации

если свободных мест в гулагах нет и они не имеют собственной логики они будут просто удаленны из симуляции (при выходе из он лайн радиуса)

 

Возможно я ошибаюсь ;)

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

Попробуйте использовать Пвелитель зоны,

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

очень атмосферно получилось-ходит и никому не мешает

Сюжетное продолжение чистого неба
Зона обр.2010г.
S.T.A.L.K.E.R.-Расширение территорий

 

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

Один вопрос если ты уйдеш на другую локацию а потом вернешся они на месте или куда то ушли :rolleyes:

Да и есть возможность спавнить нпс при заходе на локацию (возможно там это так и сделанно + увеличен стандартный а лайф радиус).

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

Мне всё-равно куда они денутся после перехода на новую локацию, я новичок в этом деле и уже составил список объектов и координаты к ним и мне надо их заспавнить, что для этого делать

Сюжетное продолжение чистого неба
Зона обр.2010г.
S.T.A.L.K.E.R.-Расширение территорий

 

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

function твое_имя()

local obj

 

local a = vector()

a.x = -254.9029 координаты

a.y = -18.0704

a.z = -116.2938

 

obj = alife():create("esc_stalker_respawn_2", a, 8190, 8,65535)

 

 

end

 

 

esc_stalker_respawn_2 имя секции из спав секцион

 

8190, 8, левел и гейм вертексы

 

 

 

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

Зачем тебе бинд сталкер ?

 

Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml

 

Код

<action>имя файла с расширением script.твое_имя функции из этого файла</action>

(gamedata/gameplay) под Код:

Код

<game_information_portions>

Код

<info_portion id="storyline_actor_start">

<task>storyline_eliminate_gunslinger</task>

Выглядеть это будет так:

 

файл gamedata/gameplay/info_portions.xml

<game_information_portions>

<info_portion id="storyline_actor_start">

<task>storyline_eliminate_gunslinger</task>

<action>имя файла с расширением.script.твое_имя функции из этого файла</action>

</info_portion>

 

заспаунится в начале игры

 

 

З.Ы Все это и многое другое есть в соседних темах

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

А в ЗП куда писать, там есть <game_information_portions>

но нет <info_portion id="storyline_actor_start">

 

пробовал в диалоги писать,

после <action>dialogs.break_dialog</action> написал

<action>all_spawn_tank.script.function all_spawn_tank</action>

и по идее после слов: пока и закрытия диалога должен сработать спавн, но не работает

P.S. вы на подумайте что я такой тупой, просто уже несколько дней не получаю нужного результата

Сюжетное продолжение чистого неба
Зона обр.2010г.
S.T.A.L.K.E.R.-Расширение территорий

 

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

tankist

В принципе можно повесить на этот поршень, я думаю...

он как раз за спавн на затоне отвечает....

<info_portion id="zat_b38_spawn_all"></info_portion>

Либо постарайся отследить инфопоршни вертолетов

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

Сталкеры, помогите, пожалуйста.

ткните пальцем где именно ошибка.

function init (obj)

xr_motivator.AddToMotivator(obj)

end

 

function actor_init (npc)

npc:bind_object(actor_binder(npc))

end

 

local game_difficulty_by_num = {

[0] = "gd_novice",

[1] = "gd_stalker",

[2] = "gd_veteran",

[3] = "gd_master"

}

 

lasthealth = 0

lasttime = 0

post_process = 0

local weapon_hide = false

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

class "actor_binder" (object_binder)

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

function actor_binder:__init (obj) super(obj)

self.bCheckStart = false

self.weather_manager = level_weathers.WeatherManager()

self.actor_detector = xr_detector.actor_detector()

end

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

 

function actor_binder:net_spawn(data)

printf("actor net spawn")

 

level.show_indicators()

 

self.bCheckStart = true

self.weapon_hide = false -- спрятано или нет оружие при разговоре.

weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

 

if object_binder.net_spawn(self,data) == false then

return false

end

 

db.add_actor(self.object)

 

if self.st.disable_input_time == nil then

level.enable_input()

end

 

self.weather_manager:reset()

-- game_stats.initialize ()

 

if(actor_stats.add_to_ranking~=nil)then

actor_stats.add_to_ranking(self.object:id())

end

 

--' Загружаем настройки дропа

 

death_manager.init_drop_settings()

-- alterei

abc.doabcevents("load")

return true

end

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

function actor_binder:net_destroy()

if(actor_stats.remove_from_ranking~=nil)then

actor_stats.remove_from_ranking(self.object:id())

end

-- game_stats.shutdown ()

db.del_actor(self.object)

 

sr_light.clean_up ()

 

self.object:set_callback(callback.inventory_info, nil)

self.object:set_callback(callback.article_info, nil)

self.object:set_callback(callback.on_item_take, nil)

self.object:set_callback(callback.on_item_drop, nil)

--self.object:set_callback(callback.actor_sleep, nil)

self.object:set_callback(callback.task_state, nil)

self.object:set_callback(callback.level_border_enter, nil)

self.object:set_callback(callback.level_border_exit, nil)

self.object:set_callback(callback.take_item_from_box, nil)

 

if sr_psy_antenna.psy_antenna then

sr_psy_antenna.psy_antenna:destroy()

sr_psy_antenna.psy_antenna = false

end

 

xr_sound.stop_all_sound_object()

 

object_binder.net_destroy(self)

 

end

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

function actor_binder:reinit()

object_binder.reinit(self)

 

local npc_id = self.object:id()

 

db.storage[npc_id] = { }

 

self.st = db.storage[npc_id]

self.st.pstor = nil

 

self.next_restrictors_update_time = -10000

 

self.object:set_callback(callback.inventory_info, self.info_callback, self)

self.object:set_callback(callback.article_info, self.article_callback, self)

self.object:set_callback(callback.on_item_take, self.on_item_take, self)

self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)

self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats

--self.object:set_callback(callback.actor_sleep, self.sleep_callback, self)

self.object:set_callback(callback.task_state, self.task_callback, self)

--self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self)

self.object:set_callback(callback.level_border_enter, self.level_border_enter, self)

self.object:set_callback(callback.level_border_exit, self.level_border_exit, self)

self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)

end

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

function actor_binder:take_item_from_box(box, item)

local story_id = box:story_id()

if story_id == nil then

return

end

 

treasure_manager.take_item_from_box(box, story_id)

--[[

local respawner = se_respawn.get_respawner_by_parent(story_id)

if respawner == nil then

return

end

 

--' Необходимо уменьшить счетчик в респавнере

respawner:remove_spawned(item:id())

 

local smart_terrain = db.strn_by_respawn[respawner:name()]

if smart_terrain == nil then

return

end

 

local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())

if npc ~= nil then

xr_sound.set_sound_play(npc, "reac_box")

xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)

end

]]

end

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

function actor_binder:level_border_enter(npc, info_id)

self.actor_detector:actor_enter()

end

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

function actor_binder:level_border_exit(npc, info_id)

self.actor_detector:actor_exit()

end

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

function actor_binder:info_callback(npc, info_id)

printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)

--' Сюжет

level_tasks.proceed(self.object)

-- Отметки на карте

level_tasks.process_info_portion(info_id)

end

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

function actor_binder:on_trade (item, sell_bye, money)

if sell_bye == true then

game_stats.money_trade_update (money)

else

game_stats.money_trade_update (-money)

end

end

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

function actor_binder:article_callback(npc, group, name)

--printf("article_callback [%s][%s]", group, name)

if device().precache_frame >1 then return end

 

if group == "Diary" then

news_manager.send_encyclopedy("diary", group)

else

news_manager.send_encyclopedy("encyclopedy", group)

end

end

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

function actor_binder:on_item_take (obj)

level_tasks.proceed(self.object)

--game_stats.update_take_item (obj, self.object)

end

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

function actor_binder:on_item_drop (obj)

abc.doabcevents(obj)

level_tasks.proceed(self.object)

--game_stats.update_drop_item (obj, self.object)

end

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

 

function actor_binder:task_callback(_task, _objective, _state)

task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)

if _objective:get_idx() == 0 then

if _state == task.fail then

news_manager.send_task(db.actor, "fail", _task, _objective)

elseif _state == task.completed then

task_manager.reward_by_task(_task)

news_manager.send_task(db.actor, "complete", _task, _objective)

else

news_manager.send_task(db.actor, "new", _task, _objective)

end

else

if _task:get_objective(0):get_state() == task.in_progress then

news_manager.send_task(db.actor, "update", _task, _objective)

end

end

end

 

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

function actor_binder:map_location_added_callback(spot_type_str, object_id)

-- alterei

local isvanished = "no"

if db.vanish ~= nil then

if db.vanish:id() == object_id then

isvanished = "yes"

end

end

if isvanished == "no" then

 

 

if (false==app_ready()) or (device().precache_frame>1) then return end

--'news_manager.send_task(db.actor, "new")

end

 

end

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

slivngvi = false

function actor_binder:update(delta)

object_binder.update(self, delta)

 

-- DEBUG slowdown

-- slowdown.update()

 

local time = time_global()

 

game_stats.update (delta, self.object)

 

-- апдейт погоды

self.weather_manager:update()

 

-- апдейт схемы детектора

self.actor_detector:update()

 

-- апдейт звуковой схемы актера

xr_sound.update_actor()

 

--' Проверка потери жизни

--[[

if self.object.health - lasthealth > 0.001 or

self.object.health - lasthealth < -0.001 then

printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)

lasthealth = self.object.health

lasttime = game.time()

end

]]

-- Обновление отключения ввода с клавиатуры.

if self.st.disable_input_time ~= nil and

game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle

then

level.enable_input()

self.st.disable_input_time = nil

end

-- Обновление сна с переносом чувака в указанную позицию

if self.st.sleep_relocate_time ~= nil and

game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle

then

self.object:set_actor_position(self.st.sleep_relocate_point)

local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)

self.object:set_actor_direction(dir:getH())

self.st.sleep_relocate_time = nil

end

 

-- Апдейт прятание оружия игрока во время диалога

if weapon_hide == true or self.object:is_talking() then

if self.weapon_hide == false then

self.object:hide_weapon()

self.weapon_hide = true

end

else

if self.weapon_hide == true then

self.object:restore_weapon()

self.weapon_hide = false

end

end

 

-- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени

if self.next_restrictors_update_time < time then

bind_restrictor.actor_update(delta)

 

self.next_restrictors_update_time = time + 200

 

 

 

task_manager.actor_update()

 

end

abc.doabcevents()

-- обновление постпроцессов

if post_process ~= 0 then

if post_process:update () == true then

post_process = 0

end

end

 

-- обновление пси-антенны

if sr_psy_antenna.psy_antenna then

sr_psy_antenna.psy_antenna:update(delta)

end

 

--' Вывод сообщения о большой радиации

if self.object.radiation >= 0.7 then

local hud = get_hud()

local custom_static = hud:GetCustomStatic("cs_radiation_danger")

if custom_static == nil then

hud:AddCustomStatic("cs_radiation_danger", true)

hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")

end

else

local hud = get_hud()

local custom_static = hud:GetCustomStatic("cs_radiation_danger")

if custom_static ~= nil then

hud:RemoveCustomStatic("cs_radiation_danger")

end

end

 

 

 

if self.bCheckStart then

printf("SET DEFAULT INFOS")

 

if not has_alife_info("storyline_actor_start") and

(level.name() == "l01_escape")

then

self.object:give_info_portion("storyline_actor_start")

_G.g_start_avi = true

printf("*AVI* RUN START AVI")

end

 

-- if not has_alife_info("encyclopedy") then

-- self.object:give_info_portion("encyclopedy")

-- end

 

if not has_alife_info("global_dialogs") then

self.object:give_info_portion("global_dialogs")

end

 

if not has_alife_info("level_changer_icons") then

self.object:give_info_portion("level_changer_icons")

end

 

level_tasks.add_lchanger_location()

 

self.bCheckStart = false

end

if sniper_add.load_variable("spawn_sniper",false)==false then

sniper_add.start_add_spawn()

sniper_add.save_variable("spawn_sniper",true)

end

end

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

function actor_binder:save(packet)

 

-- alterei coloquei local treasure

local save_treasure_manager = true

printf("actor_binder:save(): self.object:name()='%s'", self.object:name())

object_binder.save(self, packet)

 

-- alterei coloquei if

local game_difficulty = level.get_game_difficulty()

if save_treasure_manager == true then

packet:w_u8(level.get_game_difficulty() + 128)

else

packet:w_u8(level.get_game_difficulty())

end

-- fim

 

--' Сохраняем данные об отключенном вводе

if self.st.disable_input_time == nil then

packet:w_bool(false)

else

packer:w_bool(true)

utils.w_CTime(packet, self.st.disable_input_time)

end

 

xr_logic.pstor_save_all(self.object, packet)

self.weather_manager:save(packet)

 

sr_psy_antenna.save( packet )

-- alterei coloquei IF

if save_treasure_manager == true then

treasure_manager.save(packet)

end

-- fim

task_manager.save(packet)

self.actor_detector:save(packet)

end

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

function actor_binder:load(reader)

printf("actor_binder:load(): self.object:name()='%s'", self.object:name())

object_binder.load(self, reader)

printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name())

-- alterei coloquei if

local game_difficulty = reader:r_u8()

local load_treasure_manager = false

if game_difficulty >= 128 then

game_difficulty = game_difficulty - 128

load_treasure_manager = true

end

 

-- fim

if reader:r_eof() then

abort("SAVE FILE IS CORRUPT")

end

 

local stored_input_time = reader:r_u8()

if stored_input_time == true then

self.st.disable_input_time = utils.r_CTime(reader)

end

 

xr_logic.pstor_load_all(self.object, reader)

self.weather_manager:load(reader)

 

sr_psy_antenna.load(reader)

-- alterei coloquei if

if load_treasure_manager == true then

treasure_manager.load(reader)

end

-- fim

task_manager.load(reader)

self.actor_detector:load(reader)

end

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

 

--старт префетча звуков

--if string.find(command_line(), "-noprefetch") == nil then

-- sound_prefetch.prefetch_sounds()

--end

 

 

-- Weapon functions

function hide_weapon()

weapon_hide = true

end

function restore_weapon()

weapon_hide = false

end

 

 

// this is test for section iteration

/**

local function test_section_iteration(file_name, section_name)

printf ("file : %s",file_name)

printf ("section : %s",section_name)

 

local file = ini_file(file_name)

local n = file:line_count(section_name)

printf ("lines : %d",n)

 

local id, value = "", "", result

for i=0,n-1 do

result, id, value = file:r_line(section_name,i,"","")

printf ("line %d : %s = %s",i,id,value)

end

end

 

test_section_iteration("system.ltx","space_restrictor")

/**/

 

 

 

 

 

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...s\s.t.a.l.k.e.r\gamedata\scripts\bind_stalker.script:359: attempt to index global 'sniper_add' (a nil value)

 

 

не могу найти и понять в чем ошибка :dash2:

 

вылетает при начале новой игры

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

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

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

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

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

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

Войти

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

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

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