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

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


Halford

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

Вот порылся в файлах

нашел список оружия при которой возникает квест с Корягой про украденное оружие:

    wpn_groza_nimble
    wpn_vintorez_nimble
    wpn_desert_eagle_nimble
    wpn_fn2000_nimble
    wpn_g36_nimble
    wpn_protecta_nimble
    wpn_mp5_nimble
    wpn_sig220_nimble
    wpn_spas12_nimble
    wpn_usp_nimble
    wpn_svu_nimble
    wpn_svd_nimble

Поделиться этим сообщением


Ссылка на сообщение

Полтергейст,

Вроде после этих изменений меняется только класс с S_PDA на II_ATTCH, больше ничего.

так может в этом и дело - отслеживание идет на уровне классов

ну например в классе вызывается какая то функция

 

 

Поделиться этим сообщением


Ссылка на сообщение

ViRUS,

не уверен

1. там негде нету or

вот пример квест сдачи монолитовцев файл tm_jupiter.ltx

condlist_0 = {+jup_b4_monolith_squad_in_duty} complete %+jup_b4_monolith_squad_redy_go_yanov%
condlist_1 = {+jup_b4_monolith_squad_in_freedom} complete %+jup_b4_monolith_squad_redy_go_yanov%

похоже что каждый вариант свой condlist

т.е. попробуй

Condlist_0 = {=actor_has_item(scientific_outfit) complete

Condlist_1 ={=actor_has_item(scientific_outfit)} complete

 

Поделиться этим сообщением


Ссылка на сообщение

Jurok,

У меня есть один вопрос. Как убрать основные задания в ЗП? Хочу сделать полный фриплей с самого начала игры.

 

глянь файлы

outro_good.script

outro_cond.script

 

Поделиться этим сообщением


Ссылка на сообщение

Guzerus,

это из патча 1.6.01

-- run_string log("----->"..tostring(xr_statistic.actor_statistic.best_monster).." "..tostring(xr_statistic.actor_statistic.best_monster_rank))

actor_statistic = {

surges = 0,

completed_quests = 0,

killed_monsters = 0,

killed_stalkers = 0,

founded_secrets = 0,

artefacts_founded = 0,

best_monster = nil,

favorite_weapon_sect = nil,

best_monster_rank = 0,

}

 

monster_classes = {

[clsid.bloodsucker_s] = "bloodsucker",

[clsid.boar_s] = "boar",

[clsid.burer_s] = "burer",

[clsid.chimera_s] = "chimera",

[clsid.controller_s] = "controller",

[clsid.dog_s] = "dog",

[clsid.flesh_s] = "flesh",

[clsid.gigant_s] = "gigant",

[clsid.poltergeist_s] = "poltergeist",

[clsid.psy_dog_s] = "psy_dog",

[clsid.pseudodog_s] = "pseudodog",

[clsid.snork_s ] = "snork",

[clsid.tushkano_s ] = "tushkano",

}

 

weapons_table = {

abakan = 0,

ak74 = 0,

ak74u = 0,

beretta = 0,

bm16 = 0,

colt1911 = 0,

desert = 0,

f1 = 0,

fn2000 = 0,

fort = 0,

g36 = 0,

gauss = 0,

groza = 0,

hpsa = 0,

knife = 0,

l85 = 0,

lr300 = 0,

mp5 = 0,

pb = 0,

pkm = 0,

pm = 0,

protecta = 0,

rg = 0,

rgd5 = 0,

rpg7 = 0,

sig220 = 0,

sig550 = 0,

spas12 = 0,

svd = 0,

svu = 0,

toz34 = 0,

usp45 = 0,

val = 0,

vintorez = 0,

walther = 0,

wincheaster1300 = 0,

}

 

artefacts_table = {

af_cristall = false,

af_blood = false,

af_electra_sparkler = false,

af_cristall_flower = false,

af_medusa = false,

af_fireball = false,

af_mincer_meat = false,

af_electra_flash = false,

af_night_star = false,

af_dummy_glassbeads = false,

af_soul = false,

af_electra_moonlight = false,

af_dummy_battery = false,

af_vyvert = false,

af_fuzz_kolobok = false,

af_gravi = false,

af_eye = false,

af_baloon = false,

af_dummy_dummy = false,

af_gold_fish = false,

af_fire = false,

af_glass = false,

af_ice = false,

}

 

taken_artefacts = {}

 

function inc_surges_counter()

actor_statistic.surges = actor_statistic.surges + 1

end

function inc_completed_quests_counter()

actor_statistic.completed_quests = actor_statistic.completed_quests + 1

end

function inc_killed_monsters_counter()

actor_statistic.killed_monsters = actor_statistic.killed_monsters + 1

end

function inc_killed_stalkers_counter()

actor_statistic.killed_stalkers = actor_statistic.killed_stalkers + 1

end

function inc_founded_artefacts_counter(art_id)

if(taken_artefacts[art_id]==nil) then

actor_statistic.artefacts_founded = actor_statistic.artefacts_founded + 1

taken_artefacts[art_id] = art_id

local s_art = alife():object(art_id)

if(s_art and s_art:section_name()) then

artefacts_table[s_art:section_name()] = true

end

end

end

function inc_founded_secrets_counter()

actor_statistic.founded_secrets = actor_statistic.founded_secrets + 1

end

 

function set_best_monster(obj)

if IsStalker(obj) then

-- actor_statistic.best_monster = "stalker"

else

local community = monster_classes[get_clsid(obj)]

if not(community) then

abort("Statistic ERROR: cannot find monster class for [%s] clsid [%s]", obj:name(), tostring(get_clsid(obj)))

end

local s_obj = alife():object(obj:id())

if(s_obj) then

local rank = s_obj:rank()

if(community=="flesh") then

if(rank==3) then

community = community.."_strong"

else

community = community.."_weak"

end

elseif(community=="poltergeist") then

if(rank==12) then

community = community.."_flame"

else

community = community.."_tele"

end

elseif(community=="boar") then

if(rank==6) then

community = community.."_strong"

else

community = community.."_weak"

end

elseif(community=="pseudodog" or community=="psy_dog") then

if(rank==13) then

community = community.."_strong"

else

community = community.."_weak"

end

elseif(community=="bloodsucker") then

if(rank==16) then

community = community.."_strong"

elseif(rank==15) then

community = community.."_normal"

else

community = community.."_weak"

end

end

if(rank>actor_statistic.best_monster_rank) then

actor_statistic.best_monster_rank = rank

actor_statistic.best_monster = community

end

end

end

end

 

function set_best_weapon(hit_amount)

local active_item = db.actor:active_item()

if(active_item) then

local s_obj = alife():object(active_item:id())

if(s_obj) then

local s = s_obj:section_name()

for w in string.gfind(s, "%w+") do

if(weapons_table[w]~=nil) then

weapons_table[w] = weapons_table[w] + hit_amount

end

end

end

local amount = 0

for k,v in pairs(weapons_table) do

if(v>amount) then

amount = v

if(k=="rgd5" or k=="f1") then

actor_statistic.favorite_weapon_sect = "grenade_"..k

else

actor_statistic.favorite_weapon_sect = "wpn_"..k

end

if(k=="desert") then

actor_statistic.favorite_weapon_sect = "wpn_desert_eagle"

elseif(k=="rg") then

actor_statistic.favorite_weapon_sect = "wpn_rg-6"

end

end

end

end

end

 

function save(package)

package:w_u16(actor_statistic.surges)

package:w_u16(actor_statistic.completed_quests)

package:w_u32(actor_statistic.killed_monsters)

package:w_u32(actor_statistic.killed_stalkers)

package:w_u16(actor_statistic.founded_secrets)

package:w_u16(actor_statistic.artefacts_founded)

package:w_u32(actor_statistic.best_monster_rank)

package:w_stringZ(tostring(actor_statistic.best_monster))

package:w_stringZ(tostring(actor_statistic.favorite_weapon_sect))

local i = 0

for k,v in pairs(weapons_table) do

i = i + 1

end

package:w_u8(i)

for k,v in pairs(weapons_table) do

package:w_stringZ(tostring(k))

package:w_float(v)

end

i = 0

for k,v in pairs(artefacts_table) do

i = i + 1

end

package:w_u8(i)

for k,v in pairs(artefacts_table) do

package:w_stringZ(tostring(k))

package:w_bool(v)

end

i = 0

for k,v in pairs(taken_artefacts) do

i = i + 1

end

package:w_u8(i)

for k,v in pairs(taken_artefacts) do

package:w_u32(k)

end

end

 

function load(package)

actor_statistic = {}

actor_statistic.surges = package:r_u16()

actor_statistic.completed_quests = package:r_u16()

actor_statistic.killed_monsters = package:r_u32()

actor_statistic.killed_stalkers = package:r_u32()

actor_statistic.founded_secrets = package:r_u16()

actor_statistic.artefacts_founded = package:r_u16()

actor_statistic.best_monster_rank = package:r_u32()

local str = package:r_stringZ()

if(str~="nil") then

actor_statistic.best_monster = str

end

str = package:r_stringZ()

if(str~="nil") then

actor_statistic.favorite_weapon_sect = str

end

weapons_table = {}

local n = package:r_u8()

for i = 1,n do

local k = package:r_stringZ()

local v = package:r_float()

weapons_table[k] = v

end

artefacts_table = {}

n = package:r_u8()

for i = 1,n do

log("n "..tostring(n))

local k = package:r_stringZ()

local v = package:r_bool()

artefacts_table[k] = v

end

 

taken_artefacts = {}

n = package:r_u8()

for i = 1,n do

local k = package:r_u32()

taken_artefacts[k] = k

end

end

 

function pioneer_functor()

if not has_alife_info("pioneer_achievement_gained") then

if has_alife_info("zat_b14_give_item_linker")

and has_alife_info("jup_b1_complete_end")

and has_alife_info("jup_b206_anomalous_grove_done") then

db.actor:give_info_portion("pioneer_achievement_gained")

news_manager.send_tip(db.actor, "st_ach_pioneer", nil, "pioneer", nil, nil)

end

end

return has_alife_info("pioneer_achievement_gained")

end

 

function mutant_hunter_functor()

if not has_alife_info("mutant_hunter_achievement_gained") then

if has_alife_info("jup_b208_burers_hunt_done")

and has_alife_info("jup_b211_scene_done")

and has_alife_info("jup_b212_jupiter_chimera_hunt_done") then

db.actor:give_info_portion("mutant_hunter_achievement_gained")

news_manager.send_tip(db.actor, "st_ach_mutant_hunter", nil, "mutant_hunter", nil, nil)

end

end

return has_alife_info("mutant_hunter_achievement_gained")

end

 

function detective_functor()

if not has_alife_info("detective_achievement_gained") then

if has_alife_info("zat_b22_barmen_gave_reward") then

db.actor:give_info_portion("detective_achievement_gained")

news_manager.send_tip(db.actor, "st_ach_detective", nil, "detective", nil, nil)

end

end

return has_alife_info("detective_achievement_gained")

end

 

function one_of_the_lads_functor()

if not has_alife_info("one_of_the_lads_gained") then

if has_alife_info("zat_b30_sultan_loose") and has_alife_info("zat_b7_actor_help_stalkers") then

db.actor:give_info_portion("one_of_the_lads_gained")

news_manager.send_tip(db.actor, "st_ach_one_of_the_lads", nil, "one_of_the_lads", nil, nil)

end

end

return has_alife_info("one_of_the_lads_gained")

end

 

function kingpin_functor()

if not has_alife_info("kingpin_gained") then

if has_alife_info("zat_b30_barmen_under_sultan") and has_alife_info("zat_b7_actor_help_bandits") then

db.actor:give_info_portion("kingpin_gained")

news_manager.send_tip(db.actor, "st_ach_kingpin", nil, "kingpin", nil, nil)

end

end

return has_alife_info("kingpin_gained")

end

 

function herald_of_justice_functor()

if not has_alife_info("herald_of_justice_achievement_gained") then

if has_alife_info("jup_b25_flint_blame_done_to_duty")

or has_alife_info("jup_b25_flint_blame_done_to_freedom")

or has_alife_info("zat_b106_found_soroka_done") then

db.actor:give_info_portion("herald_of_justice_achievement_gained")

news_manager.send_tip(db.actor, "st_ach_herald_of_justice", nil, "herald_of_justice", nil, nil)

end

end

return has_alife_info("herald_of_justice_achievement_gained")

end

 

function seeker_functor()

if has_alife_info("sim_bandit_attack_harder") then

return true

end

for k,v in pairs(artefacts_table) do

if not v then

return false

end

end

-- Бандиты симуляционно больше преследуют игрока

db.actor:give_info_portion("sim_bandit_attack_harder")

news_manager.send_tip(db.actor, "st_ach_seeker", nil, "seeker", nil, nil)

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"stalker", 200})

return true

end

 

function battle_systems_master_functor()

if not has_alife_info("battle_systems_master_achievement_gained") then

if has_alife_info("zat_b3_all_instruments_brought") then

news_manager.send_tip(db.actor, "st_ach_battle_systems_master", nil, "battle_systems_master", nil, nil)

db.actor:give_info_portion("battle_systems_master_achievement_gained")

end

end

return has_alife_info("battle_systems_master_achievement_gained")

end

 

function high_tech_master_functor()

if not has_alife_info("high_tech_master_achievement_gained") then

if has_alife_info("jup_b217_tech_instrument_1_brought")

and has_alife_info("jup_b217_tech_instrument_2_brought")

and has_alife_info("jup_b217_tech_instrument_3_brought") then

news_manager.send_tip(db.actor, "st_ach_high_tech_master", nil, "high_tech_master", nil, nil)

db.actor:give_info_portion("high_tech_master_achievement_gained")

end

end

return has_alife_info("high_tech_master_achievement_gained")

end

 

function skilled_stalker_functor()

if not has_alife_info("skilled_stalker_achievement_gained") then

if has_alife_info("actor_was_in_many_bad_places") then

news_manager.send_tip(db.actor, "st_ach_skilled_stalker", nil, "skilled_stalker", nil, nil)

db.actor:give_info_portion("skilled_stalker_achievement_gained")

end

end

return has_alife_info("skilled_stalker_achievement_gained")

end

 

function leader_functor()

-- логика бонуса: pri_a21_base_restrictor.ltx

if not has_alife_info("leader_achievement_gained") then

if has_alife_info("jup_a10_vano_agree_go_und")

and has_alife_info("jup_b218_soldier_hired")

and has_alife_info("jup_b218_monolith_hired") then

news_manager.send_tip(db.actor, "st_ach_leader", nil, "leader", nil, nil)

db.actor:give_info_portion("leader_achievement_gained")

end

end

return has_alife_info("leader_achievement_gained")

end

 

function diplomat_functor()

if not has_alife_info("diplomat_achievement_gained") then

if has_alife_info("jup_a12_wo_shooting")

and (has_alife_info("jup_a10_bandit_take_all_money") or has_alife_info("jup_a10_bandit_take_money")) then

news_manager.send_tip(db.actor, "st_ach_diplomat", nil, "diplomat", nil, nil)

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"stalker", 200})

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"freedom", 200})

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"dolg", 200})

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"bandit", 200})

db.actor:give_info_portion("diplomat_achievement_gained")

end

end

return has_alife_info("diplomat_achievement_gained")

end

 

function research_man_functor()

if has_alife_info("research_man_gained") then

return true

end

local info_table = {

[1] = "jup_b16_task_done",

[2] = "jup_b1_task_done",

[3] = "jup_b46_task_done",

[4] = "jup_b47_task_end",

[5] = "jup_b32_task_done",

[6] = "jup_b6_task_done",

[7] = "jup_b206_task_done",

[8] = "jup_b209_task_done"

}

local count = 0

for k,v in pairs (info_table) do

if has_alife_info(v) then

count = count + 1

end

if count >= 4 then

db.actor:give_info_portion("research_man_gained")

news_manager.send_tip(db.actor, "st_ach_research_man", nil, "research_man", nil, nil)

return true

end

end

return false

end

 

function friend_of_duty_functor()

if not has_alife_info("sim_duty_help_harder") then

if has_alife_info("jup_b4_monolith_squad_in_duty")

and has_alife_info("jup_b46_duty_founder_pda_to_duty")

and has_alife_info("jup_b207_sell_dealers_pda_duty")

and has_alife_info("jup_b25_flint_blame_done_to_duty") then

db.actor:give_info_portion("sim_duty_help_harder")

news_manager.send_tip(db.actor, "st_ach_friend_of_duty", nil, "friend_of_duty", nil, nil)

end

end

return has_alife_info("sim_duty_help_harder")

end

 

function friend_of_freedom_functor()

if not has_alife_info("sim_freedom_help_harder") then

if has_alife_info("jup_b4_monolith_squad_in_freedom")

and has_alife_info("jup_b46_duty_founder_pda_to_freedom")

and has_alife_info("jup_b207_sell_dealers_pda_freedom")

and has_alife_info("jup_b25_flint_blame_done_to_freedom") then

db.actor:give_info_portion("sim_freedom_help_harder")

news_manager.send_tip(db.actor, "st_ach_friend_of_freedom", nil, "friend_of_freedom", nil, nil)

end

end

return has_alife_info("sim_freedom_help_harder")

end

 

function balance_advocate_functor()

if not has_alife_info("balance_advocate_gained") then

if has_alife_info("jup_b46_duty_founder_pda_to_stalkers")

and has_alife_info("jup_b207_dealers_pda_sold_owl")

and has_alife_info("zat_b106_found_soroka_done") then

db.actor:give_info_portion("balance_advocate_gained")

news_manager.send_tip(db.actor, "st_ach_balance_advocate", nil, "balance_advocate", nil, nil)

end

end

return has_alife_info("balance_advocate_gained")

end

 

function wealthy_functor()

if db.actor:money() >= 100000 and not has_alife_info("actor_wealthy") then

db.actor:give_info_portion("actor_wealthy")

news_manager.send_tip(db.actor, "st_ach_wealthy", nil, "wealthy", nil, nil)

end

return has_alife_info("actor_wealthy")

end

 

function keeper_of_secrets_functor()

-- логика бонуса: pri_b305_logic.ltx

if not has_alife_info("keeper_of_secrets_achievement_gained") then

if has_alife_info("pri_b305_all_strelok_notes_given") then

db.actor:give_info_portion("keeper_of_secrets_achievement_gained")

news_manager.send_tip(db.actor, "st_ach_keeper_of_secrets", nil, "keeper_of_secrets", nil, nil)

end

end

return has_alife_info("keeper_of_secrets_achievement_gained")

end

 

function marked_by_zone_functor()

if has_alife_info("actor_marked_by_zone_3_times") then

return true

end

local counter_name = "actor_marked_by_zone_cnt"

local cnt_value = xr_logic.pstor_retrieve(db.actor, counter_name, 0)

if cnt_value > 2 then

db.actor:give_info_portion("actor_marked_by_zone_3_times")

news_manager.send_tip(db.actor, "st_ach_marked_by_zone", nil, "marked_by_zone", nil, nil)

return true

end

 

return false

end

 

function information_dealer_functor()

if has_alife_info("actor_information_dealer") then

return true

end

 

local info_table = {

[1] = "zat_b40_pda_1_saled",

[2] = "zat_b40_pda_2_saled",

[3] = "jup_b46_duty_founder_pda_sold",

[4] = "jup_b207_merc_pda_with_contract_sold",

[5] = "jup_b207_dealers_pda_sold",

[6] = "jup_a9_evacuation_info_sold",

[7] = "jup_a9_meeting_info_sold",

[8] = "jup_a9_losses_info_sold",

[9] = "jup_a9_delivery_info_sold",

[10] = "zat_b12_documents_sold_1",

[11] = "zat_b12_documents_sold_2",

[12] = "zat_b12_documents_sold_3",

[13] = "zat_b40_notebook_saled",

[14] = "device_flash_snag_sold",

[15] = "device_pda_port_bandit_leader_sold",

[16] = "jup_b10_ufo_memory_2_sold"

}

local count = 0

for k,v in pairs (info_table) do

if has_alife_info(v) then

count = count + 1

end

if count >= 10 then

news_manager.send_tip(db.actor, "st_ach_information_dealer", nil, "information_dealer", nil, nil)

db.actor:give_info_portion("actor_information_dealer")

return true

end

end

return has_alife_info("actor_information_dealer")

end

 

function friend_of_stalkers_functor()

if not has_alife_info("sim_stalker_help_harder") then

if has_alife_info("jup_b220_trapper_zaton_chimera_hunted_told")

and has_alife_info("jup_a12_stalker_prisoner_helped")

and has_alife_info("jup_a10_vano_give_task_end")

and has_alife_info("zat_b5_stalker_leader_end")

and has_alife_info("zat_b7_task_end") then

db.actor:give_info_portion("sim_stalker_help_harder")

news_manager.send_tip(db.actor, "st_ach_friend_of_stalkers", nil, "friend_of_stalkers", nil, nil)

xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"stalker", 100})

end

end

return has_alife_info("sim_stalker_help_harder")

end

 

 

Поделиться этим сообщением


Ссылка на сообщение

кровоSTALKER,

Квесты затон

\configs\misc\tm_zaton.ltx

+ еще

\configs\scripts\zaton\*.ltx

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

Поделиться этим сообщением


Ссылка на сообщение

psevdoгринго,

В ранних версиях ТЧ и ЧН

трансорт был в наличии но отключен

в ЗП если не ошибаюсь его нет вообще

Поделиться этим сообщением


Ссылка на сообщение

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

Параметры сквадов находятся в файлах вида squad_descr_<локация>.ltx в папке configs/misc. И в этих файлах, открываемых обычным Блокнотом, каждому скваду соответсвует секция, где указываются как минимум три обязательных параметра: фракция - faction, состав - npc, и, что нам требуется, цель - target_smart - пункт на карте, который этот сквад должен захватить/удерживать.

Smart - смарт-террейн - это зона, внутри которой NPC выполняют какую-либо работу: отдыхают у костра, патрулируют, стоят часовыми - в общем, могут расположиться лагерем или что-то в этом роде.

Чтобы заставить сквад захватить точку, надо указать ему в качестве цели соответствующий ей смарт. Названия точек - "Северный блокпост", "Временный лагерь" и т.д. - прописаны в st_smart_terrain_names.xml в папке configs/text/rus.

Каким смартам соответствуют эти названия - смотрим в папке misc файл smart_names.ltx (хотя и так легче легкого догадаться по string id).

Например, если мы хотим, чтобы отряды сталкеров захватили точку "Кладбище техники" - то местечко, где в ЧН расположился "концлагерь", а в ТЧ - лагерь Беса, - то в target_smart сквадам "одиночек" пишем smart_terrain_3_7.

 

spawn_point - по ходу чтока где должна спавниться группа

3. предметы, отдельные неписи спавняться через create , а там нужны координаты другое дело что можно сделать табличку соответствия

название места - координаты

Поделиться этим сообщением


Ссылка на сообщение

psevdoгринго,

как вариант

в bind_stalker

 

Start flag=true;  в начале
;потом в проверках
if Start_Flag Then 
    MyFunction()
    StratFlag=false
endif

Поделиться этим сообщением


Ссылка на сообщение

slayer_kch,

В секции [cat_normal]

отсутствует переменная satiety_threshold

вот что дал поиск по переменной в и-нете

при прохождении уже "Свалки" игра вылетает с логом

"Can't find variable satiety_threshold in [fracture_weak]

" на 351 строке - Проблема - ошибка составителя - в архив включен неверный m_fracture.ltx - моб-Излом.

вот изучайте на досуге

Многие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.

 

Для примера возьму кошек (уж очень они мне нравятся)

 

Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().

 

Вылет при появлении

Обычно сопровождается сообщением в логе:

 

Arguments : Can't open section 'cat_weak'

Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция

 

[m_cat_e]:monster_base

Но для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида

 

[cat_weak]:m_cat_e

то есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:

 

Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak]

Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:

 

smart_terrain_choose_interval = 00:15:00

Запускаем, вылетаем с ошибкой:

 

Arguments : Can't find variable satiety_threshold in [cat_weak]

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

 

Ну, на всякий случай, нужно добавить еще две строчки:

 

critical_wound_threshold = 0.4

critical_wound_decrease_quant = 0.

После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходит

 

Вылет при убийстве

Это знаменитая ошибка:

 

Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........

Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.

 

Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменной

 

local killCountProps = {...}

в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:

 

cat_weak = 1, cat_normal = 2, cat_strong = 3,

Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:

 

monster_classes = {

кошек нет и здесь, добавляем:

 

[clsid.cat_s] = "cat",

Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.

 

Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:

 

is_object_monster(obj)

кошек нет, добавляем рядом с собаками:

 

otype == clsid.cat or

IsMonster (object, class_id)

кошки есть, ничего не трогаем.

 

Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строку

 

cs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")

и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случился

 

Вылет при обыске

Ну тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.

 

Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.

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

 

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

 

Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляем

 

icon = ui_frame_error_sign_red

Это будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.

 

Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.

 

 

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

Поделиться этим сообщением


Ссылка на сообщение

psevdoгринго,

естественно - в твоем коде npc - gросто текстовая переменная

а ты с ней обращаешься как с объектом

поэтому как вариант

function spawn_killers_pda()
   name1= "zat_b103_lost_merc_leader"
   for a=1,65535,1 do
      npc = alife():object(a)
      if npc and string.find(npc:name(),name1) then
        alife():create("killers_pda", npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id())
        return
      end
    end
end

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

Поделиться этим сообщением


Ссылка на сообщение

Shredder,

Поиск в гугле дал это:

create_anom("zone_mine_electric",2,-295.39,1.24,-3.30,1,135)

2 - это радиус аномалии

1 - level Vertex

135 - game_vertex Болот

Также некоторые аномалии требуют наличия слова "field" , если игра вылетает с ошибкой nearest_s значит надо поставить эту фигную

 

 

Поделиться этим сообщением


Ссылка на сообщение

Karaga_big, а и не надо обратно паковать

оставь в gamedata только измкененные файлы остальные игра возьмет из configs.db

Поделиться этим сообщением


Ссылка на сообщение

SDR-team, а ты для сравнения посмотри как реализовано это в квесте логово кровососов

Там Глухарь периодически бросает фразы

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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