Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Спавн и логика
denis2000Дата: Пн, 10.10.2011, 21:20 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Спавн и логика

Создание объектов на локации и логика поведения этих объектов

Если у вас появились вопросы по созданию динамических объектов в игре (НПС, монстры, аномалии, и т.п.) и настройке их "поведения". Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
denis2000Дата: Сб, 03.08.2013, 15:14 | Сообщение # 571
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
gamerДата: Вс, 04.08.2013, 19:54 | Сообщение # 572
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

Подскажите примерно где искать ети секции.Спс
[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]
 
FantomICWДата: Вс, 04.08.2013, 20:44 | Сообщение # 573
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

gamer, в particles.xr наверное


 
gamerДата: Пн, 05.08.2013, 04:07 | Сообщение # 574
Новичок
Пользователи
Сообщений: 82
Награды: 0
Репутация: [ 0 ]

хотел перетянуть полтера из тч на зп .после етого вылета ....есть лечение?можете помоч?
[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]
 
denis2000Дата: Пн, 05.08.2013, 09:24 | Сообщение # 575
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

gamer, А зачем перетаскивать, то что уже есть

В секции [m_poltergeisti_normal_flame] отсутствует переменная species.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пн, 05.08.2013, 18:35 | Сообщение # 576
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Делаю квест на зачистку ВНЗ от Альфы в СГМ 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. Вопрос, какой функцией её можно заменить?
 
denis2000Дата: Пн, 05.08.2013, 18:50 | Сообщение # 577
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, hit_by_actor возвращает true в случае если НПС, из логики которого вызвана функция, нанесен хит и нанес его ГГ.
Код
on_hit = hit
- это значит, что в случае нанесения хита, объекту логики обрабатывать событие в секции [hit]
Таким образом ДВАЖДЫ фигурирует объект логики, и нанесение хита другому объекту, приводить к выполнению actor_enemy, не должно и причина в чем-то другом.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
makdmДата: Пн, 05.08.2013, 23:33 | Сообщение # 578
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

sergej5500 функция hit_by_actor в ЗП работает некорректно. Сам имел тот же глюк, что и в Вашем случае.
Рядом со сталкерам стрелял в стену и он становился врагом.
Почему? Копать не стал. Просто заменил на killed_by_actor. Всё работает на "пять".


Терпение......
И все получится!


Сообщение отредактировал makdm - Пн, 05.08.2013, 23:39
 
denis2000Дата: Вт, 06.08.2013, 19:20 | Сообщение # 579
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, makdm, А ну все понятно, если НПС бессмертный то выстрел даже рядом с ним вызывает хит (так зачем-то сделано в движке) - все он враг. А вот если НПС обычный то в него нужно попасть для вызова хита и функция работает корректно.

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Чт, 08.08.2013, 23:27 | Сообщение # 580
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

Приветствую!
Интересует такой вопрос. Можно ли с секции логики типа ph_door переходить на другие типы схем, как вот ph_code? Или для этого адаптация в скрипте нужна?



 
denis2000Дата: Чт, 08.08.2013, 23:47 | Сообщение # 581
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пт, 09.08.2013, 00:35 | Сообщение # 582
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый Вечер. Заинтересовал такой момент. Допустим, есть строка в логике сталкера:
on_info = {+zat_b38_stalker_enemy} nil %=actor_enemy%
После выдачи инфопорции zat_b38_stalker_enemy НПС с этой логикой становится враждебен ГГ. Предположим, есть некий сталкер. Сталкеры и "Рассвет" нейтралы друг к другу. Можно ли в логику конкретному сталкеру прописать функцию, при выполнении которой конкретно этот сталкер возненавидит "Рассвет", например? Как эта строка будет выглядеть? Заранее благодарен за советы.
 
denis2000Дата: Пт, 09.08.2013, 01:11 | Сообщение # 583
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
FantomICWДата: Пт, 09.08.2013, 10:34 | Сообщение # 584
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

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.



 
denis2000Дата: Пт, 09.08.2013, 11:35 | Сообщение # 585
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
Поиск: