Модостроение. Спавн и логика
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Спавн и логика Создание объектов на локации и логика поведения этих объектов Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так: Code function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Code Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil) Второй: Code Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic' [/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 03.08.2013, 15:14 | Сообщение # 571 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Или применив такую функцию: [cut]Вызов в логике: Код %=set_nps_in_table_enemies% Функция в скрипте xr_effects.script: Код function set_nps_in_table_enemies(actor, npc, p) local table_nps_1 = {"NPS_1_1","NPS_1_2"} local table_nps_2 = {"NPS_2_1","NPS_2_2"} for k,v in pairs(table_nps_1) do local npc_obj_1 = get_story_object(v) if npc_obj_1 ~= nil then for l,m in pairs(table_nps_2) do local npc_obj_2 =get_story_object(m) if npc_obj_2 ~= nil then npc_obj_1:set_relation(game_object.enemy, npc_obj_2) npc_obj_2:set_relation(game_object.enemy, npc_obj_1) end end end end end , где в таблицах table_nps_1 и table_nps_2 находятся стори_ид персонажей двух групп, которых нужно поссорить между собой.[/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
gamer | Дата: Вс, 04.08.2013, 19:54 | Сообщение # 572 |
Новичок
Пользователи
Сообщений: 82
| Подскажите примерно где искать ети секции.Спс [cut noguest=лог]FATAL ERROR
[error]Expression : SG [error]Function : CRender::model_CreateParticles [error]File : D:\prog_repository\sources\trunk\Layers\xrRenderPC_R2\r2.cpp [error]Line : 410 [error]Description : Particle effect or group doesn't exist [error]Arguments : amik\monsters\phantom\idle
stack trace[/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили gamer за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 04.08.2013, 20:44 | Сообщение # 573 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| gamer, в particles.xr наверное
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
gamer | Дата: Пн, 05.08.2013, 04:07 | Сообщение # 574 |
Новичок
Пользователи
Сообщений: 82
| хотел перетянуть полтера из тч на зп .после етого вылета ....есть лечение?можете помоч? [cut noguest=лог]* [DETAILS] VertexConsts(256), Batch(61) * [DETAILS] 10126 v(20), 5368 p * [DETAILS] Batch(61), VB(197K), IB(31K) * phase time: 17 ms * phase cmem: 357105 K * Loading HOM: d:\program files (x86)\gsc world publishing\s.t.a.l.k.e.r. - Зов Припяти\gamedata\levels\zaton\level.hom * phase time: 38 ms * phase cmem: 357752 K * phase time: 11 ms * phase cmem: 357752 K * phase time: 10 ms * phase cmem: 357752 K * t-report - base: 1402, 674602 K * t-report - lmap: 16, 16386 K * WARNING: player not logged in * phase time: 1517 ms * phase cmem: 384206 K * phase time: 14 ms * phase cmem: 384206 K * [win32]: free[2320332 K], reserved[212692 K], committed[1661216 K] * [ D3D ]: textures[733332 K] * [x-ray]: crt heap[384206 K], process heap[16492 K], game lua[32277 K], render[139 K] * [x-ray]: economy: strings[25136 K], smem[10192 K] compiling shader model_env_lq compiling shader model_env_lq_1 compiling shader model_def_lplanes_1 compiling shader deffer_model_bump_d-hq_1 compiling shader accum_emissivel compiling shader model_def_lplanes_0 compiling shader shadow_direct_model_aref_1 compiling shader model_env_lq_0 ! Unknown command: dump_infos FATAL ERROR [error]Expression : fatal error [error]Function : CInifile::r_string [error]File : D:\prog_repository\sources\trunk\xrCore\Xr_ini.cpp [error]Line : 513 [error]Description : <no expression> [error]Arguments : Can't find variable species in [m_poltergeisti_normal_flame]
stack trace:[/cut]
[cut noguest=m_.....Ltx] [m_poltergeist_e]:monster_base GroupControlSection = spawn_group SpaceRestrictionSection = space_restrictor,zone_mosquito_bald,zone_radioactive $spawn = "monsters\old\poltergeist" ; option for Level Editor $npc = on ; option for Level Editor ;$prefetch = 16 Scheduled = on ; option for ALife Simulator Human = off ; option for ALife Simulator Health = 250 ; option for ALife Simulator MinSpeed = 1.0 ; option for ALife Simulator MaxSpeed = 1.5 ; option for ALife Simulator going_speed = 2.0 ; option for ALife Simulator current_level_going_speed = 1;2 ; option for ALife Simulator search_speed = .5 ; option for ALife Simulator visual = monsters\poltergeist\poltergeist corpse_visual = monsters\poltergeist\poltergeyst_dead icon = ui_npc_monster_poltergeist MaxHealthValue = 150 ; range [0..200] DynamicObjectsCount = 32 smart_terrain_choose_interval = 00:15:00
cform = skeleton ; collision class class = SM_POLTR ; AI class
ef_creature_type = 5 ;10 ; option for evaluation functions ef_weapon_type = 12 ;3 ef_detector_type = 1 panic_threshold = 0.1
script_binding = bind_monster.bind
bone_torso = bip01_spine1 ; bone name bone_head = bip01_head ; bone name bone_fire = bip01_head ; bone name
weapon_usage = 0 ; boolean
type = flamer
;--------------------------------------------------------------------- ; Physics ;--------------------------------------------------------------------- ph_box0_center = 0.0, 0.2, 0.0 ;0.0, 0.9, 0.0 ph_box0_size = 0.50, 0.4, 0.50 ph_box1_center = 0.0, 0.2, 0.0 ph_box1_size = 0.50, 0.4, 0.50 ph_crash_speed_min = 10 ph_crash_speed_max = 30 ph_collision_damage_factor = 0.1 ph_mass = 80 ; also it's the food
destroyed_vis_name = physics\Dead_Body\trupik_crash
;--------------------------------------------------------------------- ph_skeleton_airr_lin_factor = 0.1 ;550.0 (изменно из-за того, что убрано домножение коэффициент 0.002 из кода) ph_skeleton_airr_ang_factor = -0.1 ;0.0 (изменно из-за того, что убрано домножение на коэффициент 0.3 из кода (0.0*0.3=0.0)) ph_skeleton_hinger_factor1 = 1.0 ;1.0 (изменно из-за того, что убрано домножение на коэффициент 5.0 из кода) ph_skeleton_hinge_vel = 0.7 ph_skeleton_ddelay = 10.0 ;Время изменения значения трения в суставе с момента создания шелла, сек
ph_skel_fatal_impulse_factor = 6.0 ph_after_death_velocity_factor= 0.75 ph_skel_shot_up_factor = 0.25 ;---------------------------------------------------------------------
;---------------------------------------------------------------------------- ; Movement::Velocities & Acceleration ;---------------------------------------------------------------------------- ; speed factors linear | angular_real | angular_path | min | max Velocity_Stand = 0, 5.0, 5.0, 0.2, 0.5 Velocity_WalkFwdNormal = 1.7, 2.0, 2.0, 0.2, 2.0 Velocity_WalkFwdDamaged = 1.5, 3.0, 3.0, 0.8, 2.0 Velocity_RunFwdNormal = 4.0, 3.0, 3.0, 0.4, 1.0 Velocity_RunFwdDamaged = 2.5, 3.2, 3.2, 0.4, 1 Velocity_Drag = 0.6, 3.0, 3.0, 1, 1 Velocity_Steal = 1.5, 3.0, 3.0, 1, 1
; Speed factors while invisible Velocity_Invisible_Linear = 5.0 Velocity_Invisible_Angular = 3.5
; acceleration Accel_Generic = 1.5 Accel_Calm = 2.5 Accel_Aggressive = 3.0
;-------------------------------------------------------------------------- ; Attack parameters ;-------------------------------------------------------------------------- ;attack parameters MinAttackDist = 0.5 ;2.1 MaxAttackDist = 2.0
as_min_dist = 0.1 as_step = 0.3
;------------------------------------------------------------------------- ; Entity Conditions ;------------------------------------------------------------------------- DayTime_Begin = 0 DayTime_End = 21 Min_Satiety = 0.7 Max_Satiety = 0.95
distance_to_corpse = 1.8
terrain = poltergeist_terrain
hit_type = strike
;entity condition
satiety_v = 0.0001 ;скорость уменьшения сытости со временем radiation_v = 0.00001 ;скорость уменьшения радиации satiety_power_v = 0.005 ;увеличение силы при уменьшении сытости satiety_health_v = 0.001 ;увеличение здоровья при уменьшении сытости satiety_critical = -1.0 ;критическое значения сытости (в процентах от 0..1) когда здоровье начианает уменьшаться radiation_health_v = 0.0001 ;уменьшение здоровья при воздействии радиации morale_v = 0.1 ;скорость восстановления морали health_hit_part = 1.0 ;процент хита, уходящий на отнимание здоровья power_hit_part = 1.0 ;процент хита, уходящий на отнимание силы psy_health_v = 0.1 ;скорость восстановления psy-здоровья
immunities_sect = poltergeist_immunities
;открытые раны bleeding_v = 0 ;потеря крови при номинальной ране в секунду wound_incarnation_v = 0.3 ;крутизна кривой заживления (какой процент раны останется после заживления в игровую секунду) min_wound_size = 0.01
sleep_health = 1.0 sleep_power = 1.0 sleep_satiety = 1.0 sleep_radiation = 1.0 sleep_psy_health = 1.0
eat_freq = 5.0 eat_slice = 0.01 eat_slice_weight = 10.0
satiety_threshold = 0.5 ; below this value monster fill hunger
;--------------------------------------------------------- ; Sounds and sound parameters ;--------------------------------------------------------- sound_idle = monsters\biting\def_ sound_eat = monsters\biting\def_ sound_aggressive = monsters\biting\def_ sound_attack_hit = monsters\biting\def_ sound_take_damage = monsters\biting\def_ sound_die = monsters\biting\def_ sound_threaten = monsters\biting\def_ sound_landing = monsters\biting\def_ sound_steal = monsters\biting\def_ sound_panic = monsters\biting\def_ sound_growling = monsters\biting\def_ sound_die_in_anomaly = monsters\biting\def_
killer_clsids = Z_MINCER,Z_GALANT,ZS_BFUZZ,ZS_MBALD,ZS_GALAN,ZS_MINCE
idle_sound_delay = 0 eat_sound_delay = 0 attack_sound_delay = 0
sound_distant_idle = monsters\biting\def_ distant_idle_sound_delay = 80000 distant_idle_sound_range = 100.0
SoundThreshold = 0.06 ; range [0..1] max_hear_dist = 60
;------------------------------------------------------------------------- ; Vision ;-------------------------------------------------------------------------
eye_fov = 100 ;120 eye_range = 40 ;60
DynamicObjectsCount = 32
min_view_distance = 0.8 ; коэффициент, который множится на eye_range, в зависимости от угла max_view_distance = 1.0 ; коэффициент, который множится на eye_range, в зависимости от угла visibility_threshold = 100.0 ; значение, при достижении суммой которого объект считается видимым always_visible_distance = 0.5 time_quant = 0.001 decrease_value = 0.01 ; значение, на которое уменьшается вес, если объект попал в фрустум, но отсёкся по каким-то причинам velocity_factor = 0.5 luminocity_factor = 0.5 ; фактор освещения (только для Актёра) transparency_threshold = 0.25
;------------------------------------------------------------------------- ; Morale ;------------------------------------------------------------------------- Morale_Hit_Quant = 0.01 Morale_Attack_Success_Quant = 0.3 Morale_Take_Heart_Speed = 0.1 Morale_Despondent_Speed = 0.1 Morale_Stable_Speed = 0.3 Morale_Despondent_Threashold = 0.5
;------------------------------------------------------------------------- ; Other Stuff (refactoring needed) ;------------------------------------------------------------------------- DamagedThreshold = 0.4
material = creatures\large ;objects\bullet
squad_attack_algorithm = 1 attack_effector = m_poltergeist_attack_effector
attack_params = m_poltergeist_attack_params step_params = m_poltergeist_step_params
anger_hunger_threshold = 0.1 anger_loud_threshold = 0.7
LegsCount = 2 damage = m_poltergeist_damage
;---------------------------
Invisible_Energy_Restore_Velocity = 0.08 Invisible_Energy_Decline_Velocity = 0.02 Invisible_Energy_Critical_Value = 0.02 Invisible_Energy_Activate_Value = 0.99 Invisible_Energy_Aggressive_Restore_Velocity = 0.5
Particles_Damage = monsters\polter_damage Particles_Death = monsters\polter_death Particles_Idle = monsters\polter_idle Particles_Hidden = monsters\polter_linza
;-- Delays -------------------
Delay_Flame_Min = 30000 Delay_Flame_Normal = 30001 Delay_Flame_Aggressive = 30001
Delay_Tele_Min = 0 ;100 Delay_Tele_Normal = 100 ;300 Delay_Tele_Aggressive = 100 ;200
Delay_Scare_Min = 30000 Delay_Scare_Normal = 30001 Delay_Scare_Aggressive = 30001
;---------------------------
;species of monster species = poltergeist rank = 401 spec_rank = normal community = poltergeist
critical_wound_threshold = -1 critical_wound_decrease_quant = 0.
[m_Poltergeist_damage] ;bone_name = <hit_scale>,-1,<wound_scale> ;<hit_scale> - коэфф. изменения хита (уменьшения здоровья) ;<wound_scale> - коэфф. изменения величины открытой раны
default = 1.0, -1, 0.1
bip01_pelvis = 1.0, -1, 0.2 bip01_spine = 1.0, -1, 0.2 bip01_spine1 = 1.0, -1, 0.2 bip01_neck = 1.0, -1, 0.5 bip01_head = 2.0, -1, 0.3 [m_poltergeist_attack_params] ;-------------------------------------------------------------------------------------------------------------------------------------------- - ; anim | time[0..1] | hit_power | impulse | impulse_dir (x,y,z) | Field of hit_test (left,right, top, bottom) | Test Dist ;-------------------------------------------------------------------------------------------------------------------------------------------- - ;Left hand Strike stand_attack_0 = 0.30, 0.20, 50, 0.0, 1.0, 1.0, -1.6, 1.6, -1.6, 1.6, 3.5 ;Left hand Strike2 stand_attack_1 = 0.30, 0.15, 50, 0.0, 1.0, 1.0, -1.6, 1.6, -1.6, 1.6, 3.5
[m_poltergeist_attack_effector]
duality_h = 0.01 duality_v = 0.01 blur = 0.01 gray = 0.5 noise_intensity = 0.0 noise_grain = 1 noise_fps = 30 color_base = 0.65,0.15,0.1 color_gray = 0.333,0.333,0.333 color_add = 0,0,0 time = 0.3 time_attack = 0.05 ; fade in time_release = 0.25 ; fade out
; camera effects ce_time = 0.45 ;time ce_amplitude = -15.0 ce_period_number = 1.5 ;2.0 ce_power = 1.5 ;0.7 ; power
[m_poltergeist_step_params] left right right left ;------------------------------------------------------------------------------------------------------------------ ; anim cycles | time1 | power1 | time2 | power2 | time3 | power3 | time4 | power4 | ;----------------------------------------------------------------------------------------------------------------- stand_walk_fwd_0 = 1, 0.1, 1, 0.34, 1, 0.6, 1, 0.84, 1 stand_walk_fwd_dmg_0 = 1, 0.2, 1, 0.25, 1, 0.5, 1, 0.7, 1 stand_run_0 = 1, 0.1, 1, 0.3, 1, 0.5, 1, 0.55, 1 stand_run_dmg_0 = 1, 0.2, 1, 0.25, 1, 0.7, 1, 0.75, 1
;=========================================================================== ; TERRAIN ;=========================================================================== [poltergeist_terrain] 255,000,255,255
;=========================================================================== ; IMMUNITIES ;=========================================================================== [poltergeist_immunities] burn_immunity = 0.3 ;коэффициенты иммунитета strike_immunity = 0.7 shock_immunity = 0.5 wound_immunity = 0.3 radiation_immunity = 0.0 telepatic_immunity = 1.0 chemical_burn_immunity = 1.0 explosion_immunity = 1.0 fire_wound_immunity = 1.0
[m_poltergeist_normal]:m_poltergeist_e $spawn = "monsters\old\poltergeist_normal" spec_rank = normal rank = 401 community = poltergeist
;=========================================================================== ; TELE ;===========================================================================
[m_poltergeist_normal_tele]:m_poltergeist_normal $spawn = "monsters\poltergeists\poltergeist_normal_tele"
type = telekinetic
Tele_Fly_Time = 0.30 Tele_Fly_Velocity = 30
Tele_Find_Radius = 10 Tele_Object_Min_Mass = 40 Tele_Object_Max_Mass = 500 Tele_Object_Count = 4;7 Tele_Hold_Time = 2000 Tele_Wait_Time = 3000 Tele_Delay_Between_Objects_Time = 1000 Tele_Distance = 30 Tele_Object_Height = 2 Tele_Time_Object_Keep = 15000 Tele_Raise_Speed = 6 Tele_Delay_Between_Objects_Raise_Time = 200
Particles_Damage = monsters\polter_damage Particles_Death = monsters\polter_death Particles_Idle = monsters\polter_idle Particles_Hidden = monsters\polter_linza
Hidden_Particles = monsters\polter_linza ;Hide_Particles = monsters\polter_yadro;monsters\polter_hide
Sound_Idle = monsters\poltergeist\tele_idle_0 sound_take_damage = monsters\poltergeist\tele_damage_ sound_die = monsters\poltergeist\tele_death_
sound_tele_hold = monsters\burer\burer_tele_hold sound_tele_throw = monsters\burer\burer_tele_throw
[m_poltergeist_tele_outdoor]:m_poltergeist_normal_tele $spawn = "monsters\poltergeists\poltergeist_tele_outdoor"
Tele_Find_Radius = 12 ;20
;=========================================================================== ; FLAMER ;===========================================================================
[m_poltergeist_normal_flame]:m_poltergeist_normal $spawn = "monsters\poltergeists\poltergeist_normal_flame"
type = flamer
flame_sound = monsters\poltergeist\attack_hit_flame flame_particles_prepare = monsters\polter_yadro flame_particles_fire = static\monsters_fire_idle flame_particles_stop = static\monsters_fire_stop flame_fire_time_delay = 1000 ;2400 ; don't change - for programmers only flame_fire_time_play = 6000 flame_length = 8.0 flame_hit_value = 0.3 flame_hit_delay = 200 flames_count = 3 flames_delay = 2000 ;3500 ;2000 flame_aura_radius = 10
flame_scan_radius = 10 flame_scan_sound = monsters\burer\burer_scan_affect_0 flame_scan_effector_section = m_poltergeist_scan_effector flame_scan_delay_min_max = 5000,10000
flame_min_dist = 2 flame_max_dist = 15 flame_min_height = 0.5 flame_max_height = 1.0
Particles_Damage = monsters\polter_damage Particles_Death = monsters\polter_death_00 Particles_Idle = monsters\polter_idle_00 Particles_Hidden = monsters\polter_linza_00
Hidden_Particles = monsters\polter_linza_00 ;monsters\polter_hidden Sound_Idle = monsters\poltergeist\fire_idle_0
[m_poltergeist_scan_effector] duality_h = 0.003 duality_v = 0.002 blur = 1.5 gray = 0.3 noise_intensity = 0.0 noise_grain = 2 noise_fps = 8 color_base = 0.55,0.5,0.5;0.637,0.442,0.456 color_gray = 0.333,0.333,0.333 color_add = 0.05,0.0,0.0 time = 10.00 time_attack = 0.3 ; fade in time_release = 0.85 ; fade out
[m_poltergeist_strong_flame]:m_poltergeist_normal_flame $spawn = "monsters\poltergeists\poltergeist_strong_flame"
immunities_sect = poltergeist_immunities_strong flame_hit_value = 0.7
[poltergeist_immunities_strong] burn_immunity = 0.3 ;коэффициенты иммунитета strike_immunity = 0.7 shock_immunity = 0.5 wound_immunity = 0.3 radiation_immunity = 0.0 telepatic_immunity = 1.0 chemical_burn_immunity = 1.0 explosion_immunity = 0.3 fire_wound_immunity = 0.3 [/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили gamer за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 05.08.2013, 09:24 | Сообщение # 575 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| gamer, А зачем перетаскивать, то что уже есть
В секции [m_poltergeisti_normal_flame] отсутствует переменная species.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 05.08.2013, 18:35 | Сообщение # 576 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Делаю квест на зачистку ВНЗ от Альфы в СГМ 2.1. Возникли некоторые трудности в настройке логики сталкеров атакующей группы.
[cut=1 вариант логики][logic] active = move@walking on_death = death
[death] on_info = %+zat_b38_stalker2_death%
[move@walking] surge_hide_point = 1297221 move_dest_number = 1261706 move_look_vertex = 1283903 move_state_when_center = sit_ass move_state_when_move = patrol meet = meet invulnerable = {!actor_enemy} true, false on_info = {+zat_b38_perechod} move@going
[move@going] scheme_type = patrol patrol_count_path = 17 patrol_path_1_state = assault patrol_path_1 = 1298330 patrol_path_2_state = assault patrol_path_2 = 1307790 patrol_path_3_state = assault patrol_path_3 = 1307745 patrol_path_4_state = assault patrol_path_4 = 1266388 patrol_path_5_state = assault patrol_path_5 = 1194220 patrol_path_6_state = assault patrol_path_6 = 1124965 patrol_path_7_state = assault patrol_path_7 = 1051679 patrol_path_8_state = assault patrol_path_8 = 1000653 patrol_path_9_state = assault patrol_path_9 = 940922 patrol_path_10_state = assault patrol_path_10 = 912418 patrol_path_11_state = assault patrol_path_11 = 877687 patrol_path_12_state = assault patrol_path_12 = 801460 patrol_path_13_state = assault patrol_path_13 = 723140 patrol_path_14_state = assault patrol_path_14 = 612254 patrol_path_15_state = assault patrol_path_15 = 524746 patrol_path_16_state = assault patrol_path_16 = 494328 patrol_path_17_state = assault patrol_path_17 = 431926 patrol_countdown = false patrol_no_reaction = false invulnerable = true on_patrol_path = 17|move@firepos
[move@firepos] move_dest_number = 393794 move_look_vertex = 182870 move_state_when_center = hide move_state_when_move = sneak move_combat_disable = true combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = {!actor_enemy} true, false on_info = {+zat_b38_attack} move@assault
[move@assault] move_dest_number = 215308 move_look_vertex = 182870 move_state_when_center = hide move_state_when_move = assault on_info = {+zat_b38_alfa_kill} move@after
[move@after] move_dest_number = 206645 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 243004 meet = meet on_info = {+zat_b38_alfa_base_reward} nil %=release_npc%
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false[/cut] При такой настройке логики сталкеры нейтральны к ГГ, даже когда он стреляет в них в упор. Они бессмертны. Попробовал переделать логику.
[cut=2 вариант логики][logic] active = move@walking on_death = death on_hit = hit
[hit] on_info = {=hit_by_actor} %+zat_b38_stalker_enemy =actor_enemy%
[death] on_info = %+zat_b38_stalker2_death%
[move@walking] surge_hide_point = 1297221 move_dest_number = 1261706 move_look_vertex = 1283903 move_state_when_center = sit_ass move_state_when_move = patrol meet = meet invulnerable = {!actor_enemy} true, false on_info = {+zat_b38_perechod} move@going on_info2 = {+zat_b38_stalker_enemy} nil %=actor_enemy%
[move@going] scheme_type = patrol patrol_count_path = 17 patrol_path_1_state = assault patrol_path_1 = 1298330 patrol_path_2_state = assault patrol_path_2 = 1307790 patrol_path_3_state = assault patrol_path_3 = 1307745 patrol_path_4_state = assault patrol_path_4 = 1266388 patrol_path_5_state = assault patrol_path_5 = 1194220 patrol_path_6_state = assault patrol_path_6 = 1124965 patrol_path_7_state = assault patrol_path_7 = 1051679 patrol_path_8_state = assault patrol_path_8 = 1000653 patrol_path_9_state = assault patrol_path_9 = 940922 patrol_path_10_state = assault patrol_path_10 = 912418 patrol_path_11_state = assault patrol_path_11 = 877687 patrol_path_12_state = assault patrol_path_12 = 801460 patrol_path_13_state = assault patrol_path_13 = 723140 patrol_path_14_state = assault patrol_path_14 = 612254 patrol_path_15_state = assault patrol_path_15 = 524746 patrol_path_16_state = assault patrol_path_16 = 494328 patrol_path_17_state = assault patrol_path_17 = 431926 patrol_countdown = false patrol_no_reaction = false invulnerable = true on_patrol_path = 17|move@firepos on_info = {+zat_b38_stalker_enemy} nil %=actor_enemy%
[move@firepos] move_dest_number = 393794 move_look_vertex = 182870 move_state_when_center = hide move_state_when_move = sneak move_combat_disable = true combat_ignore_cond = true combat_ignore_keep_when_attacked = true invulnerable = {!actor_enemy} true, false on_info = {+zat_b38_attack} move@assault on_info2 = {+zat_b38_stalker_enemy} nil %=actor_enemy%
[move@assault] move_dest_number = 215308 move_look_vertex = 182870 move_state_when_center = hide move_state_when_move = assault on_info = {+zat_b38_alfa_kill} move@after on_info2 = {+zat_b38_stalker_enemy} nil %=actor_enemy%
[move@after] move_dest_number = 206645 move_state_when_center = guard move_state_when_move = walk move_look_vertex = 243004 meet = meet on_info = {+zat_b38_alfa_base_reward} nil %=release_npc% on_info2 = {+zat_b38_stalker_enemy} nil %=actor_enemy%
[meet] abuse = true use = {!actor_enemy} true, false allow_break = true meet_on_talking = false[/cut] Если теперь пальнуть в сталкера, то вся группа краснеет и приходит сообщение о провале квеста, что и требуется. Но теперь, если ГГ убьёт кого угодно в зоне видимости этих сталкеров, то вся группа краснеет и валит ГГ. Нельзя убить даже собаку. Проблема, как я думаю, в функции hit_by_actor. Вопрос, какой функцией её можно заменить?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 05.08.2013, 18:50 | Сообщение # 577 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, hit_by_actor возвращает true в случае если НПС, из логики которого вызвана функция, нанесен хит и нанес его ГГ. - это значит, что в случае нанесения хита, объекту логики обрабатывать событие в секции [hit] Таким образом ДВАЖДЫ фигурирует объект логики, и нанесение хита другому объекту, приводить к выполнению actor_enemy, не должно и причина в чем-то другом.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 05.08.2013, 23:33 | Сообщение # 578 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500 функция hit_by_actor в ЗП работает некорректно. Сам имел тот же глюк, что и в Вашем случае. Рядом со сталкерам стрелял в стену и он становился врагом. Почему? Копать не стал. Просто заменил на killed_by_actor. Всё работает на "пять".
Терпение...... И все получится!
Сообщение отредактировал makdm - Пн, 05.08.2013, 23:39 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 06.08.2013, 19:20 | Сообщение # 579 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, makdm, А ну все понятно, если НПС бессмертный то выстрел даже рядом с ним вызывает хит (так зачем-то сделано в движке) - все он враг. А вот если НПС обычный то в него нужно попасть для вызова хита и функция работает корректно.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
FantomICW | Дата: Чт, 08.08.2013, 23:27 | Сообщение # 580 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| Приветствую! Интересует такой вопрос. Можно ли с секции логики типа ph_door переходить на другие типы схем, как вот ph_code? Или для этого адаптация в скрипте нужна?
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 08.08.2013, 23:47 | Сообщение # 581 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| FantomICW, Может: [cut]Код [logic] active = ph_code@lock
[ph_door@locked] locked = true closed = true snd_open_start = metal_small_open snd_close_start = metal_small_close_start snd_close_stop = metal_small_close_stop ;hit_on_bone = 2|ph_door@close on_use = ph_code@lock
[ph_code@lock] code = 1234 on_code = ph_door@close
[ph_door@close] locked = false closed = true snd_open_start = metal_small_open snd_close_start = metal_small_close_start snd_close_stop = metal_small_close_stop on_use = ph_door@open ;hit_on_bone = 1|ph_door@free|2|ph_door@free
[ph_door@open] locked = false closed = false snd_open_start = metal_small_open snd_close_start = metal_small_close_start snd_close_stop = metal_small_close_stop on_use = ph_door@close ;hit_on_bone = 1|ph_door@free|2|ph_door@free
[ph_door@free] locked = false closed = true no_force = true on_use = ph_door@open [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 09.08.2013, 00:35 | Сообщение # 582 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый Вечер. Заинтересовал такой момент. Допустим, есть строка в логике сталкера: on_info = {+zat_b38_stalker_enemy} nil %=actor_enemy% После выдачи инфопорции zat_b38_stalker_enemy НПС с этой логикой становится враждебен ГГ. Предположим, есть некий сталкер. Сталкеры и "Рассвет" нейтралы друг к другу. Можно ли в логику конкретному сталкеру прописать функцию, при выполнении которой конкретно этот сталкер возненавидит "Рассвет", например? Как эта строка будет выглядеть? Заранее благодарен за советы.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 09.08.2013, 01:11 | Сообщение # 583 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Конкретный сталкер не может ненавидеть конкретную группировку, конкретный сталкер ненавидит конкретного сталкера. Группировку может ненавидеть другая группировка. Отсюда два варианта: 1. Сорить конкретного сталкера со сталкерами конкретной группировки персонально (долго и нудно) 2. Прописать специальную группировку и перевести в нее конкретного НПС при необходимости: Код function change_nps_community(actor, npc, p) if(p[1]~=nil) then npc:set_character_community(p[1], 0, 0) end end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
FantomICW | Дата: Пт, 09.08.2013, 10:34 | Сообщение # 584 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| denis2000, спасибо. Но с текущей логикой моей двери я почему-то столкнулся с вылетом. [cut=Логика]Код [logic] active = ph_door@fully_locked
[ph_door@close] locked = false closed = true snd_open_start = trader_door_open_start snd_close_start = trader_door_close_start snd_close_stop = trader_door_close_stop on_use = ph_door@open
[ph_door@open] locked = false closed = false snd_open_start = trader_door_open_start snd_close_start = trader_door_close_start snd_close_stop = trader_door_close_stop on_use = ph_door@close
[ph_door@free] locked = false closed = true no_force = true on_use = ph_door@open
[ph_door@fully_locked] locked = true closed = true on_use = %=play_snd(device\door_locked)% tip_open = tip_try_open on_info = {=actor_has_item (decoder_1) +actor_needs_to_analize_code} ph_door@analize
[ph_door@analize] locked = true closed = true on_use = ph_code@get_numpad %+sec_trader_door_code_analized =play_snd(device\pda\pda_alarm)% tip_open = tip_analize_code
[ph_code@get_numpad] code = 123 on_code = {+sec_trader_door_code_analized} ph_door@close %+sec_trader_door_opened% [/cut] [cut=Лог]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 : ...rld\Проект с falcon\gamedata\scripts\xr_logic.script:653: attempt to call field '?' (a nil value)
stack trace:[/cut] Возникает при использовании двери с текущей секцией логики ph_door@analize.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 09.08.2013, 11:35 | Сообщение # 585 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| FantomICW, play_snd(device\pda\pda_alarm) - не существующая функция или не правильная передача параметров функции.
И кстати в скрипте ph_code не сделан переход на другую секцию, в случае успешного ввода кода, только вызов функций и установка\сброс инфопорций. Для того чтобы секция преключалась нужно в скрипте ph_code.script в функции codepad:OnNumberReceive(text) внести такие изменения: Код function codepad:OnNumberReceive(text) if self.st.code then if tonumber(text) == self.st.code then if self.st.on_code then printf("ph_code <OnNumberReceive>: on_code [%s]", text) local next_section = xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.on_code.condlist) if next_section ~= nil then xr_logic.switch_to_section(self.object, self.st.ini, next_section) end end end else local condlist = self.st.on_check_code[text] if condlist then printf("ph_code <OnNumberReceive>: on_check_code [%s]", text) xr_logic.pick_section_from_condlist(db.actor, self.object, condlist) end end end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|