"
На форумах задавалось много вопросов о том, как добавить ГГ деньги. В основном это были скрипты. Есть один очень простой способ добавления денег.
Открываете блокнотом файл character_desc_escape.xml (gamedata/config/gameplay) и ищете строку:
спускаетесь чуть ниже и увидите строчку:
она то нам и нужна. Копируете эту строчку и открываете файл character_desc_general.xml: (в той же папке):
и ищите:
спускайтесь чуть ниже к строчке:
0 в конце этой строчки жмёте Enter (сделайте пустую строчку между 0 и actors\hero\stalker_novice)
и просто вставьте строчку
Всё, теперь у вас столько же денег сколько и у Сидрыча, то есть бесконечно Конечно, если хотите можете сделать их не бесконечными и отрегулировать как хотите
Автор Dark-Killer
Добавление от Бродяги - чтобы сделать деньги небесконечными в строке
исправьте
infinitive="1"
на
infinitive="0"
Нам понадобится файл 'treasure_manager.script'.
В этом файле находим такие строки:
--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
printf("TREASURE USE")
После строки --printf("TREASURE USE")-- пишем
if (npc and db.actor) then
lootmoney.lootmoney(npc)
end
У нас должно выйти
--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
printf("TREASURE USE")
if (npc and db.actor) then
lootmoney.lootmoney(npc)
end
Теперь создаём файл lootmoney.script и в нём пишем
function lootmoney(npc)
if npc ~= nil and not string.find(npc:section(),"arena") and npc:character_community()~="arena_enemy" then
local money = npc:money()
if money ~= nil and money ~=0 then
local deadmoney = money
local npc_rank
npc_rank = ranks.get_obj_rank_name(npc)
if npc_rank ~= nil then
if npc_rank == "novice" and deadmoney >=400 then deadmoney=math.random(25,400)
elseif npc_rank == "experienced" and deadmoney >=500 then deadmoney=math.random(50,500)
elseif npc_rank == "veteran" and deadmoney >=600 then deadmoney=math.random(100,600)
elseif npc_rank == "master" and deadmoney >=700 then deadmoney=math.random(200,700)
end
end
local news_texti = "\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]"..npc:character_name().."\\n%c[255,255,0,0]Обнаружено денег: %c[default]"..game.translate_string(tostring(deadmoney).."руб.")
db.actor:give_game_news(news_texti, "ui\\ui_iconsTotal", Frect():set(0,0,83,47), 1, 4000)
db.actor:give_money(deadmoney)
game_stats.money_quest_update(deadmoney)
npc:give_money(-money)
game_stats.money_quest_update(-money)
end
end
end
Заходим ui_keybinding.xml по адресу \gamedata\config\ui .Там добавляем вот это:
Теперь заходим в ui_st_keybinding.xml там пишем:
Вид от 1-го лица
Вид от 2-го лица
Вид от 3-го лица
Ну вот и всё! Осталось войти в игру и в настройках поставить нужные клавиши для выполнения данных функций в игре.
1 Увеличиваем максимальное количество НПС в se_respawn.script (чтоб было кому участвовать в захвате точек )
-- Таблица ограничений на спаун: всего в симуляции не должно быть больше, чем указано.
local simMaxCount = {
stalker_novice = 43, stalker_regular = 48, stalker_veteran = 43, stalker_master = 20,
monolith_novice = 0, monolith_regular = 30, monolith_veteran = 35, monolith_master = 30,
military_novice = 0, military_regular = 32, military_veteran = 22, military_master = 5,
killer_novice = 0, killer_regular = 18, killer_veteran = 17, killer_master = 10,
ecolog_novice = 1, ecolog_regular = 1, ecolog_veteran = 1, ecolog_master = 1,
dolg_novice = 0, dolg_regular = 33, dolg_veteran = 36, dolg_master = 17,
freedom_novice = 50, freedom_regular = 20, freedom_veteran = 26, freedom_master = 21,
bandit_novice = 40, bandit_regular = 50, bandit_veteran = 18, bandit_master = 10,
zombied_novice = 20, zombied_regular = 15, zombied_veteran = 10, zombied_master = 10,
rat_weak = 0,
tushkano_weak = 150,
flesh_weak = 14, flesh_normal = 38, flesh_strong = 22,
boar_weak = 52, boar_normal = 38, boar_strong = 27,
dog_weak = 53, dog_normal = 126, dog_strong = 130,
pseudodog_weak = 59, pseudodog_normal = 80, pseudodog_strong = 60,
psy_dog_weak = 15, psy_dog_normal = 15, psy_dog_strong = 15,
zombie_weak = 61, zombie_normal = 50, zombie_strong = 35,
snork_weak = 50, snork_normal = 61, snork_strong = 15,
poltergeist_weak = 10,
pseudo_gigant_weak = 23,
controller_weak = 18,
burer_weak = 20,
bloodsucker_weak = 7, bloodsucker_normal = 40, bloodsucker_strong = 15
}
Замените этим
-- Таблица ограничений на спаун: всего в симуляции не должно быть больше, чем указано.
local simMaxCount = {
stalker_novice = 63, stalker_regular = 68, stalker_veteran = 63, stalker_master = 50,
monolith_novice = 0, monolith_regular = 50, monolith_veteran = 55, monolith_master = 50,
military_novice = 0, military_regular = 52, military_veteran = 42, military_master = 25,
killer_novice = 0, killer_regular = 38, killer_veteran = 37, killer_master = 30,
ecolog_novice = 1, ecolog_regular = 1, ecolog_veteran = 1, ecolog_master = 1,
dolg_novice = 0, dolg_regular = 53, dolg_veteran = 56, dolg_master = 37,
freedom_novice = 70, freedom_regular = 40, freedom_veteran = 26, freedom_master = 31,
bandit_novice = 60, bandit_regular = 70, bandit_veteran = 38, bandit_master = 30,
zombied_novice = 40, zombied_regular = 35, zombied_veteran = 30, zombied_master = 30,
rat_weak = 0,
tushkano_weak = 150,
flesh_weak = 14, flesh_normal = 38, flesh_strong = 22,
boar_weak = 52, boar_normal = 38, boar_strong = 27,
dog_weak = 53, dog_normal = 126, dog_strong = 130,
pseudodog_weak = 59, pseudodog_normal = 80, pseudodog_strong = 60,
psy_dog_weak = 15, psy_dog_normal = 15, psy_dog_strong = 15,
zombie_weak = 61, zombie_normal = 50, zombie_strong = 35,
snork_weak = 50, snork_normal = 61, snork_strong = 15,
poltergeist_weak = 10,
pseudo_gigant_weak = 23,
controller_weak = 18,
burer_weak = 20,
bloodsucker_weak = 7, bloodsucker_normal = 40, bloodsucker_strong = 15
}
НЕПЛОХО БЫ ДОБАВИТЬ ДОПОЛНИТЕЛЬНЫЕ РЕСПАВНЫ
(но я не умею кто умеет выложите пожалуйста готовые )
2 Давление группировки к гулагу в gulag_название локации.script
пример кордона (так же с остальными локациями, только немного по другому)
--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname, type)
return nil
end
function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
if gulag_type == "esc_bridge" then
return npc_community == "military" or npc_community == "stalker" or npc_community == "bandit" or npc_community == "killer" or npc_community == "dolg" or npc_community == "freedom"
end
if gulag_type == "esc_specnaz" then
return se_obj:profile_name() == "esc_soldier_specnaz"
end
if gulag_type == "esc_blokpost" then
return npc_community == "military" or npc_community == "stalker" or npc_community == "bandit" or npc_community == "killer" or npc_community == "dolg" or npc_community == "freedom"
end
if gulag_type == "esc_killers" then
return npc_community == "killer"
end
if gulag_type == "esc_lager" then
return npc_community == "stalker" or npc_community == "military" or npc_community == "bandit" or npc_community == "killer" or npc_community == "dolg" or npc_community == "freedom"
end
if gulag_type == "esc_fabrika_bandit" then
return npc_community == "bandit"
end
if gulag_type == "esc_ambush" then
return npc_community == "bandit" or npc_community == "stalker" or npc_community == "military" or npc_community == "killer" or npc_community == "dolg" or npc_community == "freedom"
end
if gulag_type == "esc_corps" then
return npc_community == "stalker"
end
if gulag_type == "esc_assault" then
return npc_community == "stalker"
end
if gulag_type == "esc_stalker_camp" then
return npc_community == "stalker" or npc_community == "military" or npc_community == "bandit" or npc_community == "killer" or npc_community == "dolg" or npc_community == "freedom"
end
return false
end
3 Изменение в general_lager (чтоб не вылетало при входе нпс в локацию)
Заменить всё этим
[chugai_test]
dolg = experienced, novice, master
freedom = experienced, novice, master
[l01_escape]
stalker = novice, experienced
monolith = novice, experienced
military = novice, experienced
killer = novice, experienced
ecolog = novice, experienced
dolg = novice, experienced
freedom = novice, experienced
bandit = novice, experienced
[l02_garbage]
stalker = novice, experienced
monolith = novice, experienced
military = novice, experienced
killer = novice, experienced
ecolog = novice, experienced
dolg = novice, experienced
freedom = novice, experienced
bandit = novice, experienced
zombied = novice, experienced
[l03_agroprom]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l04_darkvalley]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[k01_darkscape]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l04u_labx18]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l06_Rostok]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l07_military]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l08_yantar]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l10_radar]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
[l11_pripyat]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
4 Изменение в smart_terrain_presets.ltx (чтоб не вылетало при входе нпс в локацию)
Заменить всё этим
[ai_test]
stalker = novice, experienced
monolith = novice, experienced
military = novice, experienced
killer = novice, experienced
ecolog = novice, experienced
dolg = novice, experienced
freedom = novice, experienced
bandit = novice, experienced
zombied = novice, experienced
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[chugai_test]
dolg = experienced, novice, master
freedom = experienced, novice, master
pseudodog = weak
[l01_escape]
stalker = novice, experienced
monolith = novice, experienced
military = novice, experienced
killer = novice, experienced
ecolog = novice, experienced
dolg = novice, experienced
freedom = novice, experienced
bandit = novice, experienced
zombied = novice, experienced
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l01_escape_killers]
killer = experienced, veteran, master
[l02_garbage]
stalker = novice, experienced
monolith = novice, experienced
military = novice, experienced
killer = novice, experienced
ecolog = novice, experienced
dolg = novice, experienced
freedom = novice, experienced
bandit = novice, experienced
zombied = novice, experienced
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l03_agroprom]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l03u_agr_underground]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l04_darkvalley]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[k01_darkscape]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l04u_labx18]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l05_bar]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l06_rostok]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l07_military]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l08_yantar]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l08u_brainlab]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l10_radar]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l10u_bunker]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
[l11_pripyat]
stalker = novice, experienced, veteran, master
monolith = novice, experienced, veteran, master
military = novice, experienced, veteran, master
killer = novice, experienced, veteran, master
ecolog = novice, experienced, veteran, master
dolg = novice, experienced, veteran, master
freedom = novice, experienced, veteran, master
bandit = novice, experienced, veteran, master
zombied = novice, experienced, veteran, master
boar = weak, normal, strong
bloodsucker = weak, normal, strong
flesh = weak, normal, strong
dog = weak, normal, strong
pseudodog = weak, normal, strong
giant = weak, normal, strong
zombie = weak, normal, strong
burer = weak, normal, strong
controller = weak, normal, strong
poltergeist = weak, normal, strong
snork = weak, normal, strong
tushkano = weak, normal, strong
Для того, чтобы заспавнить ГГ на другой локации нам понадобится распакованный all.spawn.
После того как распаковали all.spawn, находим файл alife_l01_ecape.ltx и открываем его с помощью блокнота. В этом файле ищем вот такие строки:
[63]
; cse_abstract properties
section_name = actor
name = level_prefix_actor_0001
position = -246.726303100586,-24.7932605743408,-134.433868408203
direction = 0.00431653670966625,-1.39625442028046,-0.00068671052576974
s_flags = 0x29
; cse_alife_object properties
game_vertex_id = 4
distance = 0.699999988079071
level_vertex_id = 11713
object_flags = 0xffffffbf
custom_data = <
[dont_spawn_character_supplies]
[spawn]
wpn_binoc
device_torch
END
; cse_visual properties
visual_name = actors\hero\stalker_novice
; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions =
dynamic_in_restrictions =
upd:health = 1
upd:timestamp = 0x75732029
upd:creature_flags = 0x70
upd:position = -246.726303100586,-24.7932605743408,-134.433868408203
upd:o_model = 0
upd:o_torso = -1.39625442028046,0.00431653670966625,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0
; cse_alife_trader_abstract properties
money = 40
trader_flags = 0
character_profile = actor
; cse_ph_skeleton properties
; cse_alife_creature_actor properties
upd:actor_state = 0xd20
upd:actor_accel_header = 0
upd:actor_accel_data = 0
upd:actor_velocity_header = 0
upd:actor_velocity_data = 0
upd:actor_radiation = 0
upd:actor_weapon = 110
upd:num_items = 0
Для спавна ГГ на другой локации нам надо удалить эти строки из alife_l01_ecape.ltx и поместить в файл того уровня, в который необходимо.
Теперь нам нужно прописать новые координаты не только в строках:
position
Сложность:Легко
Открываем файл.- gamedata\configs\system.ltx
И редактируем следующие строки.
[hud_cursor]
;все размерv в процентах от длинv экрана
cross_length = 0.015 ;длина "палочки" прицела
min_radius = 0.0 ;минимальнvй радиус прицела (при нулевой дисперсии)
max_radius = 1.0 ;максимальнvй радиус
radius_lerp_speed = 0.08 ;скорость интерполљции положений прицела
cross_color = 0.7,0.7,0.7,0.5 ;цвет прицела
disp_scale = 0.08 ;масштаб прицела (относительно радиан)
Создадим квест по поиску АК74У.
Для начала нужно создать диалог, сделаем его у Волка:
Заходим в gamedata\config\gameplay\dialogs_escape.xml и в самом конце до строчки пишем:
esc_kill_bandits_quest_done
escape_volk_ak74u_start
escape_volk_ak74u_quest_0
1
escape_volk_ak74u_quest_1
2
3
escape_volk_ak74u_quest_2
escape_volk_ak74u_start
new_life.spawn_ak74u
escape_volk_ak74u_quest_3
dialogs.break_dialog
new_life.escape_volk_ak74u_have
escape_volk_ak74u_have
escape_volk_ак74u_done
escape_volk_ak74u_quest_completed_0
1
escape_volk_ak74u_quest_completed_1
2
escape_volk_ak74u_quest_completed_2
escape_volk_ak74u_done
new_life.give_volk_ak74u
3
escape_volk_ak74u_quest_completed_3
new_life.complete_volk_quest
Теперь нужно прописать эти диалоги Волку, для этого заходим в gamedata\config\gameplay\character_desc_escape.xml и находим профиль Волка(он называется esc_wolf), перед строкой пишем:
escape_volk_ak74u_quest
escape_volk_ak74u_quest_completed
Нам понадобятся два диалога: 1 для получения квеста, 2 для передачи автомата.
- Это название диалога
esc_kill_bandits_quest_done - эта строка означает что квест появится только если получен инфопоршень esc_kill_bandits_quest_done
escape_volk_ak74u_start - эта строка означает что если получен инфопоршень escape_volk_ak74u_start , то этот диалог больше не появится.
escape_volk_ak74u_quest_0 - это ссылка на текст фразы меченого
1 - это ссылка на текст с id= 1 , а id= 1 это escape_volk_ak74u_quest_1 (ссылка на текст Волка)
2
3 - эти две строчки означают что идет разветвление диалога
escape_volk_ak74u_start - выдача инфопоршня, после которого начинается квест
new_life.spawn_ak74u - функция вызываемая из скрипта new_life, в данном случае спаунится предмет AK74У
dialogs.break_dialog - функция отвечающая за выход из диалога
Во втором диалоге есть строка new_life.escape_volk_ak74u_have - она отвечает за появление диалога если выполняется функция
escape_volk_ak74u_have
Теперь нужно сделать текст диалога на русском языке, для этого заходим в gamedata\config\tex\rus\stable_dialogs_escape.xml и в нём пишем следующее(в конце перед ):
Здорова Волк, для меня есть какая-нибудь работа?
Да, есть одно дело: вобщем шёл сюда в лагерь к Сидырычу, решил пройти через тоннель чтоб воякам денег не платить, а там собак было штук десять. Ну я начал отстреливаться, где-то шестерых убил и патроны кончились, пришлось АКСУ выкинуть, чтоб от стаи собак убежать. Таки лежит там наверно АКСУ. \nНу как, возьмёшься? Только осторожней там, после последнего выброса появились в тоннеле перещающиеся аномалии электра.
Да, я как раз буду рядом проходить, конечно принесу...
Нет, Волк, сам туда иди...
Привет, Волк, ну как оно?...
Сидор водку не даёт, хе хе, а так всё хорошо.
Вот, нашел я твой АКСУ.
Эх спасибо тебе Меченый, вот держи, может на что-нибудь хватит.
Итак, диалог готов, теперь нужно сделать сам квест, для этого заходим в gamedata\config\gameplay\tasks_escape.xml и в самом конце пишем:
Найти потерянный АКСУ
Найти потерянный АКСУ
ui_iconsTotal_weapons
escape_volk_ak74u_done
tex_escape_volk_ak74u
Найти АКСУ
new_life.escape_volk_ak74u_have
escape_volk_ak74u_have
Принести АКСУ Волку
blue_location
escape_volk_ak74u_done
- id квеста
Найти потерянный АКСУ - название квеста
Найти потерянный АКСУ - тоже название квеста))
ui_iconsTotal_weapons - иконка задания
escape_volk_ak74u_done - квест будет выполнен, если был получен инфопоршень escape_volk_ak74u_done
tex_escape_volk_ak74u - ссылка на текстовый файл с описанием задания
Найти АКСУ - название подзадачи
new_life.escape_volk_ak74u_have - проверка на наличие предмета
escape_volk_ak74u_have если функция new_life.escape_volk_ak74u_have выполнилась, то выдаётся инфопоршень escape_volk_ak74u_have и выполняется подзадача
Принести АКСУ Волку - название второй подзадачи
blue_location - указатель на Волка
- id Волка в Файле gamedata\config\game_story_ids.ltx
escape_volk_ak74u_done - если будет получен этот инфопоршень, то выполнится подзадача и соответственно сам квест
Нужно сделать инфопоршни, заходим в gamedata\config\gameplay\info_l01escape.xml и в нём в конце до строчки пишем:
escape_volk_ak74u
Теперь нужно сделать описание квеста, заходим в gamedata\config\gameplay\storyline_info_escape.xml и пишем в конце:
ui\ui_icon_equipment
tex_escape_volk_ak74u
Сделаем описание на русском, заходим в stable_dialogs_escape.xml и в конце до строки пишем:
Волк попросил принести потерянный в туннеле АКСУ
Теперь создадим скриптовый файл new_life в gamedata\scripts\new_life.script и пишем:
function spawn_ak74u()
amk.spawn_item("wpn_ak74u",vector():set(-78.85,-1.29,154.74),163,189935) -- спавн ak74u в тоннеле на кордоне
end
function escape_volk_ak74u_have()
return sak.have_item_namber("wpn_ak74u",1) ~= false -- проверка на нахождение предмета в рюкзаке
end
function give_volk_ak74u(first_speaker, second_speaker) -- передача предмета
sak.out_item_namber("wpn_ak74u", 1)
end
function complete_volk_quest(first_speaker, second_speaker) -- получение награды
dialogs.relocate_money(second_speaker, 1500, "in")
end
Чтобы эти скрипты заработали, нужно создать файлы amk.script и sak.script, в аmk.script пишем
function spawn_item(spawn_item, pos, gv,lv)
if gv==nil then gv=db.actor:game_vertex_id() end
if lv==nil then lv=db.actor:level_vertex_id() end
return alife():create(spawn_item, pos, lv, gv)
end
function remove_item_from_inventory(remove_item,npc)
if npc==nil then npc=db.actor end
if remove_item~=nil then
-- npc:mark_item_dropped(remove_item)
alife():release(alife():object(remove_item:id()), true)
return true
end
return false
end
В sak.script пишем
local items_count=0
local itemin=nil
function have_item_namber(itm,need_namber)
local actor=db.actor
items_count=0
itemin=itm
actor:iterate_inventory(cheking_item,actor)
if items_count>=need_namber then
return true
else
return false
end
end
function cheking_item(actor,item)
local items=item:section()
if items==itemin then
items_count=items_count+1
end
end
function create_items(npc,section,number)
for i=1,number do
alife():create(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id())
end
end
local reloc_params={}
local stalk
function out_item_namber(itm_section,need_number)
reloc_params.itm_section=itm_section
reloc_params.itm_cnt=need_number
reloc_params.itm_cnt_found =0
db.actor:iterate_inventory(checkout_items_count,db.actor)
reloc_params.itm_cnt_found=0
if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then
db.actor:iterate_inventory(out_items_count,db.actor)
end
news_manager.relocate_item(db.actor, "out", itm_section)
reloc_params={}
end
function relocate_item_namber(stalker,itm_section,need_number)
stalk=stalker
reloc_params.itm_section=itm_section
reloc_params.itm_cnt=need_number
reloc_params.itm_cnt_found=0
db.actor:iterate_inventory(checkout_items_count,db.actor)
reloc_params.itm_cnt_found=0
if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then
db.actor:iterate_inventory(reloc_items_count,db.actor)
end
news_manager.relocate_item(db.actor, "out", itm_section)
reloc_params={}
end
function checkout_items_count(actor,item)
if item.section and item:section()==reloc_params.itm_section then
reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1
end
end
function reloc_items_count(actor,item)
if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found
То, что отображается в игре (название)
То, что отображается в игре (описание)
3. Находим в папке gamedata/meshes/actors/soldier файл stalker_military_black.ogf делаем его
копию и переназываем её как хочется.
Например в stalker_military_white.ogf
Открываем её блокнотом и находим это:
act\act_stalker_military_1.
Меняем на любой текст, но главное чтобы символов было столько же, иначе модель не будет работать. Меняем например на это:
_ct_stalker_military
4.Делаем тоже самое с stalker_comander_suit.ogf(gamedata/meshes/equipments).
Получаем stalker_comander_suit_white.ogf
5.Создаём текстуру с названием _ct_stalker_military.dds (можно взять готовую из любого текстурного мода и переназвать как надо.
6.Прописываем в продажу торговцу и радуемся.
Логика для БТР
Всем доброго времени суток. Для начала я объясню, что такое кастом дата. Кастом дата(custom data)- это и есть всё поле "Скрипт", которое можно увидеть, если открыть all.spawn через Xr Spawner или дописав строку custom_data = <
esc_wolf_name
ui_npc_u_stalker_neytral_balon_1
esc_wolf_bio
esc_wolf
wind
[...]
7. Чтобы у персонажа в графе "Группировка" отображалось не "wind", а "Ветер", зарегистрируем соответствующую строку в файле string_table_general.xml:
<?xml version="1.0" encoding="windows-1251" ?>
Ветер
Одиночка
[...]
8. Существует возможность создать для нашей новой группировки места, где они будут ходить (*_terrain брать из m_stalker.ltx):
То есть, к примеру, существует секция:
[stalker_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
Тогда можно создать новую, по аналогии:
[wind_terrain]
255,000,255,255
008,001,255,255 ;Разрешено ходить по опасным местам на баре
012,001,255,255 ;Разрешено ходить по опасным местам на Милитари
010,001,255,255 ;Разрешено ходить по опасным местам на янтаре
Здесь, очевидно, указаны координаты самого уровня. Для каждого уровня существует своя начальная координата.
Продвинутый уровень
Такой метод достаточно примитивен. Это не полноценная группировка. Нам нужны соответствующие диалоги, возможность получения квестов и вступления в группировку, уникальные NPC.
Квесты
Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.
Во-первых, пропишите в список диалогов персонажа следующие строки:
[что-нибудь]_dialog
[что-нибудь]_reward
Примеры названий: tm_trader_dialog, tm_wolf_dialog...
Внимание! Метод не проверен.
Этим мы добавили ему ветку диалога "Есть работа?", а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в task_manager.ltx набор новых заданий.
[...]
;--------Wind------------------------
;----------Kill Stalker----
wind_kill_stalker
;----------Find Item----
wind_find_item
[...]
;tasks for Wind
[wind_find_item]
type = find_item
community = actor
text = [ссылка на текст с рассказом заказчика о задании]
description = [ссылка на текст с описанием задания]
parent = [имя NPC-заказчика]
target = scientific_outfit
reward_money = 5000
reward_reputation = +5
reward_rank = 4
reward_item = wpn_sig_m1
time = 86400
[wind_kill_stalker]
type = kill_stalker
community = actor
text = [ссылка на текст с рассказом заказчика о задании]
description = [ссылка на текст с описанием задания]
parent = [имя NPC-заказчика]
target = sim_stalker_master_master
reward_money = 4000
reward_reputation = +5
reward_rank = 9
reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap
time = 86400
Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании task_manager.ltx читайте в уроке, посвященном однотипным квестам.
Да, и зарегистрируйте сами ветки диалогов в файле dialogs.xml. Вот пример того, как это сделано для заданий "Долга":
task_manager.init_dolg_task_dialog
task_manager.init_dolg_reward_dialog
task_manager.has_active_vendor_task
Соответственно, пройдем туда, куда указывает строка task_manager.init_dolg_task_dialog - в task_manager.script:
function init_dolg_task_dialog(dlg)
get_random_task():init_task_dialog(dlg, "dolg")
По аналогии делаем и с нашим "Ветром".
Вступление в группировку
Реализуем возможность вступления в группировку.
Прописываем в dialogs.script такие action'ы:
-----------------------------------------------------------------------------------
-- Community
-----------------------------------------------------------------------------------
[...]
function actor_set_wind (actor, npc)
printf ("ACTOR NOW IN WIND COMMUNITY"
if db.actor then
db.actor:set_character_community ("actor_wind", 0, 0)
end
return true
end
После чего создадим диалог, и сделаем в нем фразу с action'ом вида actor_set_wind. Советую изучить урок, посвященный диалогам.
Новые NPC
Лучше всего всё вышеприведенное повесить на нового, уникального персонажа.
Хоть с кем хоть с вояками только нужно сделать их либо нейтралами либо другами! а то они будут и стрелять и говорить одновременно а это тупо не правда ли? И так приступим:
Теория
1) Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml
Это, например:
character_desc_zombied.xml character_desc_stalker.xml character_desc_garbage.xml ...
Файлы character_desc_*.xmlможно сравнить со стволом дерева диалогов. В них перечисляется названия прикрепляемых веток диалогов
Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml
escape_trader_start_dialog
escape_trader_talk_info
escape_trader_jobs
tm_trader_dialog
tm_trader_reward
escape_trader_done_blockpost_box
В свою очередь каждая ветка диалога также может ветвится.
2) Ветвление диалогов прописывается уже в других файлах.
Например, ветвление диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml Возьмем оттуда, например, ветвление escape_trader_jobs.
Ветвление имеет довольно большие масштабы, поэтому приведу только часть:
escape_dialog.trader_has_talk_info_wr
tutorial_end
escape_trader_talk_info_1
100
99
9995
...
escape_trader_talk_info_0
1
Здесь …- это проверка выполнения условия. Ветка появится в диалоге, только если условие выполняется. Конкретно escape_dialog.trader_has_talk_info_wr из ветки escape_trader_talk_info - это обращение к функции trader_has_talk_info_wr, находящейся в файле скрипте gamedata/scripts/escape_dialog.script
Функция выглядит так:
function trader_has_talk_info_wr( trader, actor )
return true
end
То есть, судя по его структуре,
escape_dialog.trader_has_talk_info_wr выполняется всегда, т.к. функция всегда возвращает истину и пропускается в списк реплик.
Но для конкретной ветки может быть несколько precondition и других условий.
Далее, tutorial_end - это еще одна проверка, на этот раз на наличие у игрока так называемых infoportions, выдаваемы в процессе ключевых диалогов. В данном случае это проверка на то, закончена ли определенная стадия туториала, или нет. Т.е. ветка допустится в список реплик если стадия туториала закончена.
Более детально мы это разберем в конце статьи.
А далее идут конкретные фразы, содержащие ссылки на вытекающие фразы, например:
escape_trader_talk_info_0
1
Это основа ветки escape_trader_talk_info.
Важно! В любой основной ветке любого диалога фраза будет основой, из которой далее будет все вытекать. Она должна обязательно присутствовать и в вашем диалоге.
1 - это ссылка на вытекающую фразу
:
escape_trader_talk_info_1
100
99
9995
В свою очередь 100, 99, 9995 это ссылки на фразы веточки растущие из фразы .
3) Текст каждой фразы содержится в третьем файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml
Есть несколько вопросов.
Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут
целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного
могу о ближайших окрестностях, где сам ходил.
Эти строки содержат тексты для фраз и
Итого диалоги разложены по трем, а то и более файлам.
Да кстати, путь по веткам может быть зацикленным, если того требует диалог. Например так:
1
2
...
11
12
...
1 - Это возврат к фразе №1 (зацикливание)
111
Практика
Добавим в диалог с Сидоровичем ветку своего собственного изготовления.
Например такую:
Меченый: Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Для этого:
1) В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для trader припишем свою ветку с произвольным названием. Это будет, например,
escape_trader_letat_gusi.
Т.е у нас получится так:
...
escape_trader_start_dialog
escape_trader_talk_info
escape_trader_jobs
tm_trader_dialog
tm_trader_reward
escape_trader_done_blockpost_box
escape_trader_letat_gusi
…
Записываем изменения, с этим файлом пока всё.
2) Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml
Диалогу:
Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?
Сидорович: Чего?!!
Меченый: Ты их совсем, совсем не кормишь?
Сидорович: В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше антирада. А то
мало что таким перегаром дышишь, уже до зеленых человечков долечился... Шутник.
Будет соответствовать такая структура:
1
escape_trader_letat_gusi_1
2
escape_trader_letat_gusi_2
3
escape_trader_letat_gusi_3
Условия наличия ветки в диалоге можно взять из ветки .
Т.е берем условия escape_dialog.trader_has_talk_info_wr и tutorial_end. Можно было, конечно, прописать в скрипте еще одно условие для ветки, чтобы она появилась только один раз, а потом больше не возникала. Но об этом как-нибудь позже.
В итоге у нас получилась такая структура:
escape_dialog.trader_has_talk_info_wr
tutorial_end
escape_trader_letat_gusi_0
1
escape_trader_letat_gusi_1
2
escape_trader_letat_gusi_2
3
escape_trader_letat_gusi_3
Её нужно вставить в любом месте между dialog id'ами других веток в файле dialogs_escape.xml. Главное - не промахнутся и засунуть именно между, а не внутрь одного из dialog id.
После сохранения внесенных изменений с файлом dialogs_escape.xml все.
3) Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml
Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:
Сидрыч, а чего это у тебя зеленые человечки, что по столу бегают, такие худые?
Чего?!
Ты их совсем, совсем не кормишь?
В следующий раз, как пойдешь в зону, бери-ка вместо водяры побольше
антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился...
Шутник.
В любом месте между уже существующими string id. После сохранения изменений, у нас все готово. Можно загружать игру и смотреть что получилось.
Дополнительно
Внимание! После патча 1.002 данный урок перестал работать. Причина - со вторым патчем несовместимо это условие:
escape_dialog.trader_has_talk_info_wr
Дело в том, что во втором патче из файла escape_dialog.script была удалена функция:
function trader_has_talk_info_wr( trader, actor )
return true
end
Можно либо записать эту функцию обратно в escape_dialog.script, либо использовать другие более-менее подходящие условия, например:
escape_dialog.trader_alredy_give_job
Всё. Мы научились писать простые диалоги.
Основы и Принципы
Конфиги про которые речь зайдет находиться, по пути /config/misc
берём любой конфиг, зависит от того что хотим сделать..
unique_items.ltx если хотим создать уникальный бронежилет или оружие только там создаётся апргрейд минимальных набор функций на основе уже созданного базового оружия или
броника, quest_items.ltx там придметы которые выдаться по квестам / диалогам или который находиться по заданию квеста, devices.ltx там две вещи вроде тоже мона засунуть ящик какой-нить или устройство,, items.ltx там практически все предметы.
Можно конечно свой конфиг создать в любом из выше перечисленных файлов засунуть его по средствам инклуда.
Значит первый вариант:
1. инклуд добавляем в основной файл строчку #include "путь относительно файла" в начала файла
и создаём новый файл с таким-же именем;
2. Записать просто в файл.
Конфиг, и создание
---------------------------------------------
К примеру создадим новый придмет.. Колбаса которая дает прирост силы и здоровье, чуток читерный мод получается
открываем items.ltx и тут два варианта, ну выбираем и начинаем копировать обычную колбасу..
потом в конец пишем комментарии они обозначаться точкой с запятой.
К примеру ; Супер Колбаса мод Death_man
вставляем что скопировали и меняем некоторые строчки
Конечно я не стану описывать что и как и где происходит и на что влияет, слишком долго и муторно. Да и эта статья не к этому расположена.
значит вставили!
наше описание description = enc_equipment_food_kolbasa1 заменим после знака равно на super_kolbasa.
inv_name = Kolbasa наше имя объекта, что будет в заголовке при просмотре или продаже.
inv_name_short = Kolbasa короткое имя которое будет обозначаться когда вы смотри на объект, и возможно хотим взять.
Дальше пойдет конфиги, я просто скажу что менять.
У всех значений есть как плюсовое значение так и минусовое..
eat_health = 0 это та самая заветная строчку которая прибавляет нам жизни заменим значение на 1.0
eat_satiety = 0.3 эта сытость мона тоже поменять для пропорци ведь в конце концов это колбаса супер колбаса biggrin изменим на 0.8
eat_power = 0 эта силы как у энерга напитка не будем делать но сделаем к примеру 0.4
eat_radiation = 0 значение радиации к примеру ну тут если мы хотим добиться уменьшение в актери радиации то ставить надо минусовое значение
Ну сохраняем.
Описание и принцип его
---------------------------------------------
Текстовики по пути /config/text/rus/
Теперь описание готовим..
Описание может различаться местами записи, в зависимости где мы добавляли или исправляли.
Для items.ltх в основном это файл string_table_enc_equipment.xml
для unique_items.ltx это два файла как я понял для оружия string_table_enc_weapons.xml и для брони костюма string_table_outfit.xml.
Для quest_items.ltx это string_table_items.xml
Добавление описание для предмета нашего
---------------------------------------------
Вернёмся к нашей суперской колбасе.
Выбираем способ добавление информации.
пишем в файл
здесь из inv_name
На вид обычная колбаса, но залежавшись в зоне быть можеть, а может их кто-то подкидывает к нам.. Она по истине волшебная
здесь inv_short
Волшебная колбаса
здесь устанавливается инфа из дискриптора
Не известного производства волшебная колбаса
Добавление к торговцу
---------------------------------------------
Сохраняем и закрываем.. Проверяем на работу способность.
Как вы спросите? Тут есть много путей но самый легкий это через продавца.. Мы можем сбавить цену на предмет к примеру на один рубль в конфиге: cost = 1
ну есть путь спауна к НПС, убийства потом оного.. И отбираение у него. Спаун в ящиках в инвентаре под нагами через скрипты.
Находим по пути
gamedata\configs\gameplay\character_desc_general.xml
в этом файле находим строчку
Actor
[spawn] \n
device_torch \n
wpn_binoc \n
wpn_knife \n
detector_simple \n
helm_respirator \n
stalker_outfit \n
и после них добавляем например
wpn_ak74 = 1 \n это означает что при старте игры у вас будет обычный калаш
и точно также добавляем любой предмет.
Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC.
Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию. Код:
function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end
Теперь мы в файле npc_profile.xml (в папке gameplay) добавляем нашего НПС. Код:
Trader escape_trader
esc_unik_npc esc_unik_npc
storyline_eliminate_gunslinger
Выглядеть это будет так:
storyline_eliminate_gunslinger
esc_unik_npc.esc_unik_npc
Однако мы не прописали самого НПС, как личность В файле character_desc_escape.xml (gamedata/gameplay) добавляем: Код:
GENERATE_NAME_bandit ui_npc_u_stalker_bandit_3 esc_wolf_bio
esc_otbrosi_1 dolg stalker_terrain
367 -60
characters_voice\human_01\monolith\ -1
actors\bandit\stalker_bandit_3 [spawn] \n
wpn_groza \n
ammo_9x39_pab9 \n
1. include "gameplay\character_items.xml" \n
2. include "gameplay\character_food.xml"
1. include "gameplay\character_criticals_3.xml"
1. include "gameplay\character_dialogs.xml"
Правда тут получится у нас долговец в одежде бандита и говорящего голосом монолитовца xD Всё сохроняем. НПС готов.
Но так же можно добавить нашему НПС диалог) Если хотяте сделать нашему НПС своё имя то в файле stable_bio_name.xml (gamedata/config/text/rus) добавляем: Код:
Факер-мазафакер
А в файле сharacter_desc_escape.xml (gamedata/gameplay) находим нашего уже прописаного НПС и вставляем в секцию (у нас в ней написано GENERATE_NAME_bandit) esc_unik_npc
В этой статье мы научимся создавать новые образцы вооружения. Для начала, мы будем использовать модели из оригинальной игры. Если вы хотите создать оружие, имеющее уникальный внешний вид, ознакомьтесь с уроком по созданию моделей.
Добавим в игру АК101.
Внешний вид
Позаботимся о том, чтобы наше оружие отличалось внешне от того же АК74.
Текстуры
Нарисуем для оружия новую текстуру. Подробно останавливаться на этом процессе не буду, ознакомьтесь с примером, приведенным здесь. Итак, основываясь на текстуре АК74, мы сделали вот такую текстуру:
Файлы текстур мы назвали:
wpn_ak10.dds
wpn_ak10_bump#.dds
wpn_ak10_bump.dds
Модели
Новых моделей мы пока делать не станем, просто воспользуемся дублированными моделями от АК74. Скопируем папку:
gamedata\meshes\weapons\ak47\
И назовем её ak-101. Содержимое, соответственно, переименуем в:
wpn_ak101.ogf
wpn_ak101_hud.ogf.
Теперь пропишем в эти модели созданные нами текстуры. Способ описан здесь.
Иконки
Добавим в игру иконки, которыми оружие будет отображаться в инвентаре. Способ подробно описан здесь.
Вот, что получилось в конечном итоге:
Конфиги
Новое оружие мы будем делать на базе оригинальных конфигурационных файлов. Создадим АК101 на базе конфигов АК74.
Свойства оружия
Скопируем файл из папки:
gamedata\config\ak74.ltx
Назовем его ak101.ltx.
Отредактируем свойства по своему усмотрению (но лучше - в соответствии с достоверной информацией о характеристиках оружия, т.к. АК101 - всё-таки оружие реально существующее). Редактирование конфигов оружия подробно описано в отдельном уроке. В данном случае конфиг был составлен таким образом:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[wpn_ak101]:identity_immunities
GroupControlSection = spawn_group
discovery_dependency =
$spawn = "weapons\ak-101" ; name and section in level editor
$npc = on
$prefetch = 8
scheduled = off ;[] option for ALife Simulator
cform = skeleton
class = WP_AK74 ; class of the weapon that corresponding to CPP class
min_radius = 30 ; [] for AI
max_radius = 100 ; [] for AI
description = enc_weapons1_wpn-ak101
ef_main_weapon_type = 2
ef_weapon_type = 6
;-----------------------------------------------------------------------------------
holder_range_modifier = 1.0 ; во сколько раз увеличивается eye_range
holder_fov_modifier = 0.7 ; во сколько раз увеличивается eye_fov
;-----------------------------------------------------------------------------------
cost = 2;4000
weapon_class = assault_rifle
ammo_limit = 210
ammo_elapsed = 30
ammo_mag_size = 30
fire_modes = 1, -1
ammo_class = ammo_5.56x45_ss190, ammo_5.56x45_ap
grenade_class = ammo_vog-25, ammo_vog-25p
launch_speed = 0
hand_dependence = 1
single_handed = 0
slot = 2
animation_slot = 2
inv_name = wpn-ak101
inv_name_short = wpn-ak101
inv_weight = 3.3
inv_grid_width = 5
inv_grid_height = 2
inv_grid_x = 11
inv_grid_y = 29
kill_msg_x = 0
kill_msg_y = 28
kill_msg_width = 84
kill_msg_height = 28
;-----------------------------------------------------------------------------------
;params of weapon recoil
fire_dispersion_base = 0.15;0.2
control_inertion_factor = 1.1f;1.25f
;отдача
cam_relax_speed =6;5;3.5; 0.15
cam_dispersion = 0.1;0.15
cam_dispersion_inc = 0.2;0.3
cam_dispertion_frac = 0.8;0.9
cam_max_angle = 10.0
cam_max_angle_horz = 20.0
cam_step_angle_horz = 1.1;1
fire_dispersion_condition_factor = 5.7;5
misfire_probability = 0.0055;0.003
misfire_condition_k = 0.06;0.05
condition_shot_dec = 0.00035;0.0001
;-----------------------------------------------------------------------------------
fire_point = 0,0.216,0.638
fire_point2 = 0,0.216,0.730
flame_particles = weapons\generic_weapon05
smoke_particles = weapons\generic_shoot_00
grenade_flame_particles = weapons\generic_weapon01
shell_point = 0,0.216,0.174
shell_particles = weapons\generic_shells
PDM_disp_base = 1.0
PDM_disp_vel_factor = 1.3
PDM_disp_accel_factor = 1.3
PDM_crouch = 1.0
PDM_crouch_no_acc = 1.0
; ttc
hit_power = 0.36, 0.4, 0.43, 0.46
hit_impulse = 140
hit_type = fire_wound
fire_distance = 1700
bullet_speed = 1000
rpm = 750
use_aim_bullet = true
time_to_aim = 1.0
;params when silencer is attached
;similar to corresponding params without prefix silencer_
silencer_hit_power = 0.38
silencer_hit_impulse = 120
silencer_fire_distance = 250
silencer_bullet_speed = 600
hud = wpn_ak101_hud
position = -0.026,-0.172,0
orientation = 0,0,0
;--STRAP PARAMETERS-----------------------------------------------------------------
strap_position = -0.16,-0.40,0.15
strap_orientation = -10,-5,10
strap_bone0 = bip01_spine2
strap_bone1 = bip01_spine1
visual = weapons\ak-101\wpn_ak101
light_color = 0.6,0.5,0.3
light_range = 5
light_var_color = 0.05
light_var_range = 0.5
light_time = 0.2
ph_mass = 5
;addons
scope_status = 2
silencer_status = 2
grenade_launcher_status = 0;2
zoom_enabled = true
scope_zoom_factor = 50
scope_name = wpn_addon_scope
scope_x = 42
scope_y = 3
silencer_name = wpn_addon_silencer
silencer_x = 218
silencer_y = 13
grenade_launcher_name = wpn_addon_grenade_launcher
grenade_launcher_x = 116
grenade_launcher_y = 23
;sounds (name of the sound, volume (0.0 - 1.0), delay (sec))
snd_draw = weapons\ak74_draw
snd_holster = weapons\generic_holster
snd_shoot = weapons\ak74_shot_0
snd_shoot1 = weapons\ak74_shot_1
snd_shoot2 = weapons\ak74_shot_2
snd_shoot3 = weapons\ak74_shot_3
snd_empty = weapons\gen_empty, 0.5
snd_reload = weapons\ak74_reload, 0.7, 0.35
snd_shoot_grenade = weapons\gen_grenshoot
snd_reload_grenade = weapons\gen_grenload, 1.0, 0.8
snd_switch = weapons\groza_switch, 1.0, 0.5
;params when silencer is attached
;similar to corresponding params without prefix silencer_
;silencer_flame_particles = weapons\generic_weapon01
silencer_smoke_particles = weapons\generic_shoot_00
snd_silncer_shot = weapons\w_ak74_shot1
silencer_light_color = 0.6,0.5,0.3
silencer_light_range = 0.01
silencer_light_var_color = 0.05
silencer_light_var_range = 0.5
silencer_light_time = 0.2
;-----------------------------------------------------------------------------
;-- HUD DESCRIPTION
;-----------------------------------------------------------------------------
[wpn_ak101_hud]
allow_inertion = true
;similar to corresponding params in weapon section but for 1st person view
shell_point = -0.065000,0.000000,-0.045000
shell_dir = 0.0, 1.0, 0.0
fire_point = 0.09,0.020,-0.06
fire_point2 = 0.30, 0.00, 0.05
fire_bone = wpn_body
orientation = 0, 0, 0
position = 0, 0, 0.05
visual = weapons\ak-101\wpn_ak101_hud
grenade_bone = wpn_grenade
; animation names
anim_idle = idle
anim_idle_aim = idle_aim
anim_reload = reload
anim_draw = draw_wo_gl
anim_holster = holster_wo_gl
anim_shoot = shoot
; animation names
; attached grenade launcher [GRENADE fire mode]
anim_idle_g = idle_grenade
anim_idle_g_aim = idle_g_aim
anim_reload_g = reload_grenade
anim_shoot_g = shoot_grenade
anim_switch_grenade_on = switch_grenade
anim_switch_grenade_off = switch_grenade_off
anim_draw_g = draw_grenade_mode
anim_holster_g = holster_grenade_mode
; attached grenade launcher [NORMAL fire mode]
anim_idle_gl = idle_w_gl
anim_idle_gl_aim = idle_w_gl_aim
anim_reload_gl = reload_w_gl
anim_draw_gl = draw_w_gl
anim_holster_gl = holster_w_gl
anim_shoot_gl = shoot_w_gl
anim_idle_sprint = idle_sprint
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;HUD offset in zoom mode (to all)
;(use CONSOLE: hud_adjust_mode 0,1,2, then keys WSADQE and P to show current value in console)
zoom_offset = -0.112400,0.016800,-0.115000
zoom_rotate_x = 0.000200
zoom_rotate_y = 0.017500
zoom_hide_crosshair = true
; same as above, but for attached grenade launcher for
; in NORMAL shoot mode
grenade_normal_zoom_offset = -0.112500,0.014000,0.000000
grenade_normal_zoom_rotate_x = -0.000900
grenade_normal_zoom_rotate_y = 0.017200
; same as above, but for attached grenade launcher for
; in GRENADE mode
grenade_zoom_offset = -0.039600,-0.433100,0.000000
grenade_zoom_rotate_x = -0.538700
grenade_zoom_rotate_y = -0.033800
Регистрация
Итак, с характеристиками разобрались. Теперь зарегистрируем оружие в файле weapons.ltx. Для этого пропишем в него строку следующего вида:
#include "w_ak101.ltx"
Также, необходимо прописать модели, используемые для отображения оружия, в prefetch.ltx:
[...]
weapons\abakan\wpn_abakan
weapons\abakan\wpn_abakan_hud
weapons\ak-101\wpn_ak101
weapons\ak-101\wpn_ak101_hud
weapons\ak74\wpn_ak74
w eapons\ak74\wpn_ak74_hud
[...]
Так же не забудте в файле mp_ranks.ltx прописать после available_items (которое внизу) прописать название своего оружия. Это предотвратит вылет при убийстве ГГ.
Добавление в игру
Осталось добавить оружие в игру.
Для открытия двери Сидора создадим esc_trader_door.ltx в директории gamedata/config/scripts(папку scripts создаем) и в нём пишем
[logic]
active = ph_door@closed
[ph_door@locked]
locked = true
snd_open_start = trader_door_unlock
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%
[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %-esc_close_door%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop
[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed
on_info = {+esc_close_door} ph_door@closed
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop
Всё дверь открыта
В этой статье я научу вас делать мутантов или враждебных сталкеров друзьями.
Для этого откроем файл game_relations.ltx. Путь: gamedata/config/creatures. Теперь сделаем, например, бандитов друзьями. Найдем в файле game_relations.ltx таблицу [communities_relations]. В ней мы видим отношения группировок друг к другу и Актеру, также отношение Актера к группировке. По некоторым причинам не могу вставить эту таблицу. Но цифра отношения прописывается на пересечении, как в Морском бою.
Это где-то так:
[communities_relations]
|actor | ... |bandit |
====================================================...
actor = ... -5000
...
bandit = -5000 ....
Теперь вот эти две цифры мы заменим на 5000, убрав запятую, мы должны будем отодвинуть 5000 на 1 пробел вправо:
[communities_relations]
|actor | ... |bandit |
====================================================...
actor = ... 5000
...
bandit = 5000 ....
Также стоит учесть, если вы открываете файл Блокнотом, отношение Бандитов к Актеру будет не прямо под актером, а левее, НО НЕ правее. Сохраняем. Заходим в игру. Бандиты - друзья.
Также их можно сделать нейтралами, написав ноль, но надо отодвинуть 0 на столько пробелов вправо, сколько вы убрали знаков из начального числа. В данном случае -5000, то есть надо отодвинуть 0 вправо на 4 пробела.
Чтобы не было неясностей типа отношение хорошее, а они мне враги, ставьте в отношении группировки к Актеру одинаковым с отношением Актера к группировке. Так можно проделать с любой группировкой.
Теперь разберемся с мутантами. Откроем все тот же game_relations.ltx. Где-то в самом низу видим таблицу [monster_relations]
По аналогии, как и с группировками ставим цифры (с теми же пробелами вправо), только тут нельзя ставить -5000 и т.д. Здесь друг - это "1", нейтрал - "0", враг - "-1", злейший враг - "-2".
Не забывайте прописать как отношение Актера к мутанту, так и отношение мутанта к актеру.
Примечание: Актер - это actor.
Надеюсь, что у вас все получилось. Спасибо за внимание.
Теория
В ТЧ есть единственный момент, когда в результате диалога с НПС, ГГ перемещается. Это диалог с "О-Сознанием". После отказа от вступления, ГГ перемещается на АЭС2. Если использовать эту функцию, можно создать в ТЧ проводника.
Примечание: Проводник не будет перемещаться вместе с вами, как в ЗП. Вы будете перемещаться в одиночку, как в ЧН.
Практика
Для этого:
1). Для этого в gamedata\scripts находим файл dialogs_aes.script. В нём имеется следующая функция:
Код:
function osoznanie_decline(npc, actor)
db.actor:disable_info_portion("oso_init_dialog")
npc:stop_talk()
actor:stop_talk()
xr_effects.enable_ui(db.actor, nil)
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")
db.actor:set_actor_position(point:point(0))
local dir = look:point(0):sub(point:point(0))
db.actor:set_actor_direction(-dir:getH())
end
2). Копируем эту функцию, допустим, в escape_dialog из директории gamedata\scripts
3). Обратите внимание на вот этот фрагмент из функции: db.actor:disable_info_portion("oso_init_dialog"). Здесь функция ссылается на инфопоршень, но на Кордоне данный инфопоршень не прописан.
4). Тогда переименовываем данный инфопоршень так, как вам удобно, например db.actor:disable_info_portion("esc_init_dialog"). Примечание: Название инфопоршня это "esc_init_dialog" (то ,что за скобками, переименовывать не надо). Затем добавляем инфопоршень в файл info_101escape.xml из директории gamedata\config\gameplay. В этом файле добавляем следующее:
5). Итак, функция есть, инфопоршень тоже есть. Теперь нужны координаты. Обратите внимание на следующий фрагмент функции:
Код:
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")
Здесь функция ссылается на определённые координаты на АЭС2. Но нам нужны координаты на Кордоне. Для этого открываем way_101_escape.ltx и там дописываем пути. Например вот так:
Код:
[mon_jump_esc8_look]
points = p0
p0:name = wp00
p0:position = -239.110947,-19.788391,-134.999161
p0:game_vertex_id = 8
p0:level_vertex_id = 16191
[mon_jump_esc8_walk]
points = p0
p0:name = wp00
p0:position = -238.017761,-19.888292,-140.161987
p0:game_vertex_id = 47
p0:level_vertex_id = 17468
Всё пути есть. Только теперь в функции, переименуйте фрагмент:
Код:
local point = patrol("mon_jump_aes2_walk")
local look = patrol("mon_jump_aes2_look")
На фрагмент:
Код:
local point = patrol("mon_jump_esc8_walk")
local look = patrol("mon_jump_esc8_look")
Теперь осталось только привязать всё это к диалогу. Я взял диалог с Кузнецовым.
Открываем файл dialogs_escape.xml и находим следующие строки:
Код:
dialogs.is_not_wounded
esc_bridge_soldiers_start_12
13
Это фраза "Мне надо дальше". Сюда вставляем активизацию нашей функции. Получется следующее:
Код:
dialogs.is_not_wounded
esc_bridge_soldiers_start_12
escape_dialog.osoznanie_decline Здесь следующая структура: Название_скрипта. Название_функции
13
Вот, собственно и всё. Теперь после фразы "Мне надо дальше" вы переместитесь к бункеру Сидоровича.
Я делал также но чуток исправил:
Код:
function osoznanie_decline(npc, actor)
--Поршень не нужен, он всёравно удаляется
npc:stop_talk()
actor:stop_talk()
xr_effects.enable_ui(db.actor, nil)
local point = patrol("mon_jump_aes2_walk")
local look = point -- указать можно только один путь
db.actor:set_actor_position(point:point(0))
local dir = look:point(0):sub(point:point(0))
db.actor:set_actor_direction(-dir:getH())
end
Итак например добавим радио на кордоне,для этого распакуем алл.спавн.
Далее откроем файл alife_l01_escape и в конце пишем это :
[870]
; cse_abstract properties
section_name = physic_object
name = esc_radio
position = -212.914291381836,-22.5382061004639,-126.478126525879 ;это координаты места
direction = 0.00358727108687162,3.10139989852905,0.000144259523949586 ;это направление(в какую сторону будет наш приемник смотреть)
; cse_alife_object properties
game_vertex_id = 0 ; гейм вертекст
distance = 0
level_vertex_id = 594270 ; левл вертекст
object_flags = 0xffffff3a
custom_data = <
[logic]
active = ph_sound1 ; это логика чтобы магнитафон крутил по кругу наши песни
[ph_sound1]
snd = test_music ; это ссылка на то какую музыку он будет играть
END
; cse_visual properties
visual_name = physics\decor\priemnik_gorizont ;визуал
; cse_ph_skeleton properties
skeleton_flags = 1
; cse_alife_object_physic properties
physic_type = 0x3
mass = 10 ; я так понял это его масса только для чего она не понял!
fixed_bones = link
Так со спавном все запаковываем алл.спавн .
Теперь займемся самой музыкой !
Открываем скриптовый файл sound_theme .
В нем прописываем такую функцию :
ph_snd_themes["test_music"] = {"test\\magnitafon\\test_zvuk"}
Теперь обьясню : test_music - это название этой функции (которую прописали в спавне ),
"test\\magnitafon\\1 - это ссылка на наш звук ( значит музыка будет лежать у нас по директории :
gamedata/sounds/test/magnitafon ,а называться наша музыка будет - test_zvuk (можно и положить музыку в другие папки но для этого надо указать в sound_theme другую директорию).
Еще можно прописать несколько файлов и тогда в скрипте уже надо прописать несколько файлов например:
ph_snd_themes["test_music"] = {"test\\magnitafon\\test_zvuk" , "test\\magnitafon\\test_zvuk_2"} и т.д.
Итак осталось положить звуки в соответствующие папки и все !
В файле bind_stalker.script после строки:
--game_stats.update_drop_item (obj, self.object)
Пишем:
Code
-->>Treasure rucksack 2/2
if obj:section()=="rucksack" then
-- запомним id объекта
self.rr_id=obj:id()
end
--<<
После строк:
if guiders.teleported_to_another_level and not guiders.level_changed then
guiders.action_teleport_to_point()
Пишем:
Code
end
-->>Treasure rucksack 1/2
if self.rr_id~=nil then
-- пытаемся получить объект по id
local se_obj=alife():object(self.rr_id)
-- проверяем, что объекта нет
if se_obj==nil or se_obj:section_name()~="rucksack" then
local ruck=alife():create("active_rucksack", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Мой тайник")
news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000)
end
-- сбросим переменную
self.rr_id=nil
На следующей строчке между end и end ставим --<<
Должно получиться так:
Code
end
-->>Treasure rucksack 1/2
if self.rr_id~=nil then
-- пытаемся получить объект по id
local se_obj=alife():object(self.rr_id)
-- проверяем, что объекта нет
if se_obj==nil or se_obj:section_name()~="rucksack" then
local ruck=alife():create("active_rucksack", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара")
news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000)
end
-- сбросим переменную
self.rr_id=nil
end
--<<
end
Сохраняем.
В файле localization.ltx в конец пищем (если создаем отдельный файл описания):
Code
files = rucksack
Сохраняем.
В папке rus создаем файл rucksack.xml, в который пишем название и описание.
В файле devices.ltx в конце пищем:
Code
[rucksack]:identity_immunities
GroupControlSection = spawn_group
discovery_dependency =
$spawn = "food and drugs\antirad"
$prefetch = 32
class = II_ANTIR
cform = skeleton
visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
description = enc_rucksack
inv_weight = 1
inv_name = rucksack
inv_name_short = rucksack_s
inv_grid_width = 2
inv_grid_height = 3
inv_grid_x = 15
inv_grid_y = 27
cost = 1400
;eatable item
eat_health = 0
eat_satiety = 0
eat_power = 0
eat_radiation = 0
eat_alcohol = 0
wounds_heal_perc = 0
eat_portions_num = 1
;food item
animation_slot = 4
;hud item
hud = wpn_vodka_hud
[active_rucksack]:inventory_box
visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
custom_data = scripts\treasure_inventory_box.ltx
radius = 1
Файлы:Любой стандартный диалог
1.Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:
function ваш_текст(first_speaker, second_speaker)
news_manager.send_tip(db.actor, "%c[255,255,128,128]ПРИМЕР:\n%c[default]ВАШ ТЕКСТ", nil, nil, 30000)
end
news_manager.send_tip - это сама функция, которая отсылает сообщение.
"%c[255,255,128,128] - это цвет сообщения, идет по моему по цветам RGB.
%c[default] - это конец кода цвета сообщения, дальше текст идёт в стандартном цвете.
\n - это перенос на другую строчку.
2.В любой диалог пишем функцию:
ваше_название_скрипта.ваш_текст
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13
Пишем
ваше_название_скрипта.ваш_текст
Теперь после того как поговорите с Доктором (NLC5) на ПДА придёт сообщение с вашим текстом.
Тёмная ночь Вам потребуется:
config/weathers/weather_default.ltx
Вначале список - это время, потом характеристики
для каждого часа.
Темная ночь:
[default_weather_02]
ambient = 0.0025, 0.005, 0.0075
hemi_color = 0.025, 0.05, 0.075, 0.1
Для предыдущих блоков стоит тоже отрегулировать чтобы темнота не обрушилась резко.
В файле gamedata\configs\models\objects\light_night.ltx увеличьте range-параметры
Подробное описание конфигов:
[torch_definition]
range = 30 ; дистанция в метрах.
range_r2 = 30 ; дистанция в метрах (для динамического освещения).
color = 0.22,0.22,0.22,0.2 ; цвет, из 4 компонентов значением от 0 до 3.
color_r2 = 1.1,1.1,1.1,0.0 ; цвет, из 4 компонентов значением от 0 до 3
(для динамического освещения).
omni_range = 3 ; дистанция освещения от фонариков неписей в метрах.
omni_range_r2 = 3 ; дистанция освещения от фонариков неписей в метрах (для динамического
освещения).
omni_color = 1.0,1.0,1.0,0.1 ; цвет фонариков неписей, из 4 компонентов
значением от 0 до 3.
omni_color_r2 = 1.0,1.0,1.0,0.1 ; цвет фонариков неписей, из 4 компонентов
значением от 0 до 3 (для динамического освещения).
color_animator = empty ; цвет аниматора (empty - аниматор не используется).
spot_texture = internalinternal_light_torch_r2 ; текстура яркой точки (для динамического
освещения).
spot_angle = 45 ; угол освещения в градусах.
glow_texture = glowglow_torch_r2 ; текстура свечения фонарика, когда он направлен в глаза
(обязательный параметр).
glow_radius = 0.3 ; радиус свечения в метрах.
guide_bone = lights_bone ; кость, к направлению которой привязывается фонарик (изменять
строго не рекомендуется).
Итак, как её сделать и добавить в игру?
Не будем создавать для неё отдельный конфиг - это не рационально.
Наша граната будет наследовать конфиг гранаты grenade_gd-05, только с небольшими изменениями.
Конфиг
Добавим конфиг новой гранаты в файл gamedata\config\weapons\w_f1.ltx
в самом конце файла добавим конфиг нашей гранаты:
[el_grenade]:grenade_gd-05 ;Электрошоковая граната наследует конфиг гранаты grenade_gd-05
inv_name = el_grenade_name ;Название новой гранаты
inv_name_short = el_grenade_name ;Название новой гранаты
description = el_grenade_desc ;Описание новой гранаты
blast = 3 ;хит от гранаты (300%)
blast_r = 5 ;радиус хита (5 м.)
hit_type_blast = shock ;тип хита
snd_explode = anomaly\electra_blast1 ;звук взрыва
explode_particles = anomaly2\electra2_blast ;или anomaly2\electra2_blast_00 ;партикл взрыва
Описание
Теперь добавим описание гранаты в один из файлов в gamedata\config\text\rus\ ну скажем в string_table_enc_weapons.xml
ниже тега добавляем:
ЭШГ-1
Электрошоковая граната.
Добавление в игру
Вот и всё, теперь можно добавлять торговцам:
Ну скажем Бармену - в файле gamedata\config\misc\trade_barman.ltx
после строчки [supplies_start] добавляем:
el_grenade = 10, 0.9
где:
el_grenade - конфигурационное название предмета
10 - макс. кол-во гранат
0.9 - вероятность их появления (0.9 = 90%)
Грэг. Классная статья. А может делать мод вместе. А то делаю и в некоторых местах туплю, а после этого выкладывать не охотца. Одна группа уже есть - может и вторую?
Попробовал бы,да только лень
Хоккеист, У меня сейчас нет времени на создание модов... Только так, балуюсь время от времени...
есть тут кто.че все по вымерли
Большую часть этих уроков я уже видел, некоторые уроки могут пригодится и не модостороителям , я недавно столкнулся с багом при прохождении SGM 2.2 , группа мирных монолитовцев, расстреливала вербовщиков и Свободы и Долга, из за чего я не мог завершить квест, проблему решил изменив отношения группировок в game_relations ,и благополучно завершил квест.
Аркан, Вот видишь, твой пример показывает, что базовые умения правки игровых файлов нужны не только для серьёзных модмейкеров, но и для простого игрока они могут быть полезны...
Очень информативно спасибо автору,давно сборку сделать собвственную хочу,вот только комп приобрету.
Тема классная!
ИМХО
Наш канал в телеграмме - Подписывайся!!! - t.me/stalkeruz_com
Наш чат в телеграмме - Велкам!!! - t.me/joinchat/AhAXYUa0wa1dXbp760kauA