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

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

Т.е.  для моего печального случая с ТТ2  решения нет? Оставить надежду навсегда?

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

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

Ссылка на комментарий
Оставить надежду навсегда?

Надежда умирает последней и очень мучительно.

А пока можно попробовать переписать таблицу weapon_classes_w_ammo вот в таком виде:

weapon_classes_w_ammo = {
    [clsid.wpn_ak74] = {adc = true, ex = {}},
...
    [clsid.wpn_lr300] = {adc = true, ex = {"wpn_flame",}},
...
    [clsid.wpn_svd] = {adc = true, ex = {"wpn_gravigun",}},
...
    [clsid.wpn_binocular] = {adc = false, ex = {}}, 
...
}

потом в функции проверить надо ли разрядить данный класс оружия и не является ли он исключением.

Как это сделать? это уже другой вопрос и не очень сложный.

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

weapon_classes_w_ammo = { 
[clsid.wpn_ak74] = {},
 ... 
[clsid.wpn_lr300] = {"wpn_flame",},
 ...
}
Изменено пользователем Serge!
  • Полезно 1
Ссылка на комментарий

Я всегда знал что варианты решения есть всегда и их больше, чем один. Разобрался с авторазряжалкой: надо было не  целиком копипастить выложенную функцию, а вставить код в уже существующую. Спасибо всем за помощь. Вот рабочий скрипт:

-- 08.04.2016

-- KroshkaRoo aka Romz
-- TS MOD для SoC вообще и ОГСЕ в частности.
--TS MOD для COP-- накопировано и накнопано Tonny S. (aka Tonny на AMK-форуме)
--часть функций или их частей выковыряна из AMK, скриптов SAK и др.
-- 2016.05.12 Добавлена таблица исключений для оружия не нуждающегося в авторазряжании. Авторы: Zander_driver и dsh
-- Оружие, перекладываемое из инвентаря и выброшенное/выбитое из рук не разряжается.
--[[--
для использования авторазряжалки следует:
- в скрипте bind_stalker.script:
- function actor_binder:net_spawn(data)
в конец добавить
ts_mod_soc.ts_on_net_spawn() --TS_MOD--

- function actor_binder:take_item_from_box(box, item)
в конец добавить
ts_mod_soc.ts_on_item_take(item) --TS_MOD-- этот вызов не нужен Zander_driver

- function actor_binder:on_item_take (obj)
в конец добавить
ts_mod_soc.ts_on_item_take(item) --TS_MOD--

- function actor_binder:on_item_drop (obj)
ts_mod_soc.ts_on_item_drop(obj) --TS_MOD--

- в скрипте _g.script
- function start_game_callback()
в конец добавить
ts_mod_soc.ts_init_module() --TS_MOD--
--]]--

local notest_time = 0

local weapon_classes_w_ammo = {}

--список аммо для каждой секции. по сути кэш
local weapon_ammo = {}

--сюда занести секции оружия которое не надо разряжать. Zander_driver, dsh
local ex_sects = {
[ "wpn_gravigun" ] = true,
[ "wpn_flame" ] = true
}


--лог в текстовый файл
function ts_log(src,msg)

local g_time = game.get_game_time()
local t = game.CTime()

t:set(2012,5,1,0,0,1,1)
local t_diff = g_time:diffSec(t)

local f=io.open("ts_log.txt","a")
--local c_time = time_global()
f:write(string.format("(%s) = %s => %s " ,t_diff,src,msg),"\n" )
f:close()

--[[--
if get_console() then
local msg_no_ws = string.gsub("=="..src.."==>"..msg, "%s", "_")
get_console():execute(msg_no_ws)
end
--]]--

end

function ts_init_module()

weapon_classes_w_ammo = {
[clsid.wpn_ak74] = true,
[clsid.wpn_ak74_s] = true,
[clsid.wpn_bm16] = true,
[clsid.wpn_bm16_s] = true,
[clsid.wpn_fn2000] = true,
[clsid.wpn_fort] = true,
[clsid.wpn_grenade_launcher] = true,
[clsid.wpn_groza] = true,
[clsid.wpn_groza_s] = true,
[clsid.wpn_hpsa] = true,
[clsid.wpn_hpsa_s] = true,
[clsid.wpn_lr300] = true,
[clsid.wpn_lr300_s] = true,
[clsid.wpn_pm] = true,
[clsid.wpn_pm_s] = true,
[clsid.wpn_rg6] = true,
[clsid.wpn_rg6_s] = true,
[clsid.wpn_rpg7] = true,
[clsid.wpn_rpg7_s] = true,
[clsid.wpn_shotgun] = true,
[clsid.wpn_shotgun_s] = true,
[clsid.wpn_stat_mgun] = true,
[clsid.wpn_svd] = true,
[clsid.wpn_svd_s] = true,
[clsid.wpn_svu] = true,
[clsid.wpn_svu_s] = true,
[clsid.wpn_usp45] = true,
[clsid.wpn_usp45_s] = true,
[clsid.wpn_val] = true,
[clsid.wpn_val_s] = true,
[clsid.wpn_vintorez] = true,
[clsid.wpn_vintorez_s] = true,
[clsid.wpn_binocular] = false,
[clsid.wpn_binocular_s] = false,
[clsid.wpn_grenade_f1] = false,
[clsid.wpn_grenade_fake] = false,
[clsid.wpn_grenade_rgd5] = false,
[clsid.wpn_grenade_rpg7] = false,
[clsid.wpn_knife] = false,
[clsid.wpn_knife_s] = false,
[clsid.wpn_mounted] = false
}

--for k,v in pairs(weapon_classes_w_ammo) do

end


function is_weapon_w_ammo(object)
local id = get_clsid(object)
if id then
-- if weapon_classes_w_ammo[id] then ts_log("is_weapon_w_ammo\t\t", "ID "..tostring(id).. " object "..object:name()) end
return weapon_classes_w_ammo[id] == true
else
-- ts_log("is_weapon_w_ammo\t\t","ERR.is_weapon_w_ammo:id=nil")
return false
end
end

function ts_get_weapon_ammo_type(sobj)

local stpk=net_packet()

cse_alife_item_weapon.STATE_Write( sobj, stpk )
local size=stpk:w_tell()

stpk:r_seek(size-1)

return stpk:r_u8()
end

-- упрощённый вызов новости
function ts_tip(news_caption, msg, showtime, timeout)

local news_text = "#системная ошибка. перезагрузите ваш PDA"
local texture = "ui\\ui_iconsTotal"

if msg then
news_text = msg
end

if timeout == nil then timeout = 0 end
if showtime == nil then showtime = 5 end
if timeout == 0 then
local player = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])
-- ' Играем дефолтный звук
player:play(db.actor, timeout, sound_object.s2d)
end
local ts_news = news_caption.."\\n"..news_text
db.actor:give_game_news(ts_news, texture, Frect():set( 0, 658, 83, 47), timeout*1000, showtime*1000)
end

--взято с OGSM
function spawn_ammo_in_inv(section,number,npc)
if npc==nil then
npc=db.actor
end

-- ts_log("spawn_ammo_in_inv","sect ["..tostring(section).."] npc ["..npc:name().."]" .."\n".."position [ x = "..tostring(npc:position().x)..", y = "..tostring(npc:position().y)..", z = "..tostring(npc:position().z).."]".."\n".." level_vertex_id ["..tostring(npc:level_vertex_id()).."]" .."\n".." game_vertex_id ["..tostring(npc:game_vertex_id()).."]" .."\n".." npc ID ["..tostring(npc:id()).."]" .."\n".." number ["..tostring(number).."]")
if number > 0 then
return se_respawn.create_ammo(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id(),
number)
end
end

function ts_ammo_discharge(wpn)
local name = wpn:name()
local wpsec = wpn:section()
if ex_sects[ wpsec ] then return end --не разряжаем оружие из таблицы исключений. dsh
local ammo_count = wpn:get_ammo_in_magazine()
if ammo_count>0 then
local ammo_type = ts_get_weapon_ammo_type( alife():object(wpn:id()))
-- ts_log("ts_ammo_discharge\t\t", name.." ammo_count = "..ammo_count.." ammo_type = "..ammo_type)
local section_ammo = ts_ammo_by_num(wpn:section(),ammo_type)
if section_ammo~=nil and string.find(section_ammo,"ammo") then
local str1 = string.format(" Боеприпас %s (%d шт.)",game.translate_string(string.gsub(section_ammo,"_","-").."_s"), ammo_count)
-- ts_log("ts_ammo_discharge\t\t",str1)
ts_tip("Патроны",str1)
spawn_ammo_in_inv(section_ammo, ammo_count, nil)
wpn:unload_magazine()
else
if section_ammo == nil then
section_ammo = ""
end
ts_log("ts_ammo_discharge\t\t", "Object = "..name.." Ammo section fail: "..section_ammo)
end

end
end

function parse_names_mod( s )
local t = {}

--отсечка коментария
local pos = string.find(s,";")
local ps = ""
if pos ~= nil and pos > 0 then
ps = string.sub(s,1, pos - 1)
else
ps = s
end

for name in string.gfind( ps, "([%w_.\\-]+)%p*" ) do
table.insert( t, name )
end

return t
end

--найти аммо по номеру
function ts_ammo_by_num(section, num)
local ammo_list

if weapon_ammo[section] ~= nil and weapon_ammo[section] ~= "" then
ammo_list = weapon_ammo[section]
-- ts_log("ts_ammo_by_num",section.." => Found: "..ammo_list)
else
local ltx = system_ini()
ammo_list = ltx:r_string(section,"ammo_class")
weapon_ammo[section] = ammo_list
-- ts_log("ts_ammo_by_num",section.." => Loaded: "..ammo_list)
end

-- for n,v in pairs(parse_names(ammo_list)) do ts_log("ts_ammo_by_num","....."..n.." -> "..v) end

local t=parse_names_mod(ammo_list)

local cnt = table.getn(t)
if cnt == 0 then
return nil
elseif num >= cnt then
return t[1]
else
return t[num+1]
end

end

function test_discharge_weapon(ItemObj)
if ItemObj == nil then
return false
end
-- ts_log("test_discharge_weapon\t",ItemObj:name())

if notest_time == 0 then
notest_time = game.time()+6000
elseif notest_time>game.time() then
return false
elseif is_weapon_w_ammo(ItemObj) then
local ItemId = ItemObj:id()

local PistolSlot = db.actor:item_in_slot(1)
if PistolSlot then
-- ts_log("test_discharge_weapon\t", "item "..PistolSlot:name().." in slot 1")
IdPistol = PistolSlot:id()
end

local AutomaticSlot = db.actor:item_in_slot(2)
if AutomaticSlot then
-- ts_log("test_discharge_weapon\t", "item "..AutomaticSlot:name().." in slot 2")
IdAutomat = AutomaticSlot:id()
end

if ItemId ~= IdPistol and ItemId ~= IdAutomat then
ts_ammo_discharge(ItemObj)
else
-- ts_log("test_discharge_weapon\t", "item "..ItemObj:name().." in slot")
end
end
end

function ts_on_net_spawn()
-- ts_log("ts_on_net_spawn","..")
notest_time = 0
end

function ts_on_item_take(obj)
if notest_time>game.time() then
return false
end

-- ts_log("ts_on_item_take\t\t","...")
if obj ~= nil then
-- ts_log("ts_on_item_take\t\t", obj:name())
test_discharge_weapon(obj)
end
end

function ts_on_item_drop(obj)
if not db.actor:has_info("ui_inventory") then
return false
end

if notest_time>game.time() then
return false
end

-- ts_log("ts_on_item_drop\t\t","...")
if obj ~= nil then
-- ts_log("ts_on_item_drop\t\t", obj:name())
test_discharge_weapon(obj)
end
end

 

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

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

@Romann, что касается вылета, судя по логу, таблица quest_npc пуста. Я оставил её в примере пустой:

local quest_npc = {}

В неё нужно занести квестовых персонажей, по именам, примерно так:

local quest_npc = {
"esc_wolf",
"esc_fox"}

В этом случае будут обработаны все сталкеры, за исключением Волка и Лиса.

 

 

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

 

 

Я всегда знал что варианты решения есть всегда и их больше, чем один

Зачем тогда такие странные вопросы задавать.

 

 

Т.е. для моего печального случая с ТТ2 решения нет?

вариантов решения всегда и везде - что-то около бесконечности. Иногда в степени бесконечность. Крайне редко бывает как-то иначе, и то чаще всего из-за неправильной постановки условий задачи.

  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
судя по логу, таблица quest_npc пуста

Ну естественно она не была пуста :facepalm: , вот так было:

 

 

local quest_nps = {
"esc_wolf",
"esc_fox",
"esc_shustryi",
"arhara_zaton",
"volna_svidetel",
"Escape_dinamite",
"svalka_plot_stalk",
"esc_kidalo",
"warlab_stalker_oso",
"mil_Svoboda_leader",
"bodi_pantera1",
"stalk_kluk",
"land_green_stalk_4",
"piligrim",
"mil_Svoboda_engineer",
"esc_hunter_zaschita_2",
"Mil_Kap",
"alexandrych_marsh",
"marsh_ariadna",
"esc_fanat",
"Escape_novice_lager_volk",
"esc_pantera_zadan_soldier",
"kidalo_friend3",
"kidalo_friend2",
"kidalo_friend1",
"zat_kidalo2",
"zat_romale",
"zat_kidalo",
"upiter_baty",
"kuzmat_zaton",
"buusty_zaton",
"volna_svidetel",
"esc_kuzmat",
"esc_buusty",
"mil_stalker_killer",
"yan_ecolog_help1",
"agr_nebo_chromov1"
,"labirint_shade_monolit1",
"warlab_sekret_ekolog1",
"land_sniper_chimaera1",
"dar_corpse_kalugin1",
"yantar_baty1",
"dohlji_ljsji",
"journalist_npc",
"gromoboi_volna",
"locman_volna",
"elbrus_volna",
"fenix_volna",
"kogot_volna",
"nazar_volna",
"grif_volna",
"chudak_npc",
"nazar_npc",
"dasha_npc",
"masha_npc",
"zaton_dasha",
"zaton_masha",
"noi_npc",
"grom_npc",
"klesh_npc",
"fotograf_npc",
"dragunof_npc",
"sar_monolith",
"cit_doctor",
"aes_sidorovich",
"aes_monolit2",
"aes_monolit1",
"aes_kvartet",
"aes_pustelga",
"aes_sapsan",
"rad_suicide",
"rad_entrance_guard2",
"rad_entrance_guard1",
"yan_specnaz_corpse",
"yan_mapspot_from_vasilyev",
"yan_semenov_help",
"yan_vasilyev",
"yan_general_ecolog",
"yan_ecolog_help",
"pri_monolith_leader",
"pri_wave4_monolith8",
"pri_wave2_monolith_victim2",
"pri_wave2_monolith_victim1",
"Mil_Dolg_Khutor",
"Mil_Miser",
"Mil_Freedom_base",
"Mil_Sniper2",
"Mil_Sniper3",
"Mil_Sniper1",
"Mil_Controller",
"Mil_Cook",
"Mil_Hunter3",
"Mil_Hunter2",
"Mil_Hunter1",
"Mil_patrol_kamikadze3",
"Mil_patrol_kamikadze2",
"Mil_patrol_kamikadze1",
"Mil_Informator",
"Mil_Killer3",
"Mil_Killer2",
"Mil_Killer1",
"Mil_Silence",
"Mil_Courier",
"Mil_Freedom_Kamikadze",
"Mil_Dolg_Zoneguard",
"Mil_Lukash",
"Mil_Sniper",
"Mil_Crazy",
"Mil_Master_Max",
"Freedom_patrol_commander_level",
"Freedom_patrol_commander_base",
"rostok_kruglov_finish",
"rostok_offline_walker_4",
"rostok_offline_walker_3",
"rostok_offline_walker_2",
"rostok_offline_walker_1",
"rostok_banda_volkodava",
"rostok_naemnik",
"bar_dolg_locator",
"bar_arena_locator",
"bar_bar_locator",
"bar_barin",
"bar_zastava_commander",
"bar_psih",
"bar_dolg_guard_commander",
"bar_bar_osvedomitel",
"bar_svoboda_ambush_tiran",
"bar_crazy_veterans_leader",
"bar_drunk_dolg",
"bar_freedom_volkodav",
"bar_water_tower",
"bar_dolg_general_voronin",
"bar_dolg_polkovnik_petrenko",
"bar_dolg_captain_ivancov",
"bar_hunter",
"bar_ecolog_professor",
"bar_hunter_toz","val",
"val_bandit_rpg_dead",
"val_borov",
"val_escort_wounded",
"val_sos_stalker",
"val_stopper_soldier3",
"val_stopper_soldier2",
"val_stopper_soldier1",
"val_tunnel_bandit",
"val_escort_guard2",
"val_escort_guard1",
"val_escort_nap1",
"val_sacrifice_guard2",
"val_sacrifice_guard1",
"val_prisoner",
"val_escort_captive",
"agro_adrenalin",
"agr_stalker_look_point",
"agr_captains_chamber",
"agr_factory_skirmish1",
"gar_stalker_flame_quest23",
"gar_stalker_corpse",
"gar_seryi_drug_wounded",
"gar_spot_bandit_agr",
"gar_spot_dolg_blokpost",
"gar_spot_swamp",
"gar_bandit_post",
"gar_newbie_in_tunnel",
"gar_wounded",
"gar_dolg_blockpost",
"gar_bandits_leader",
"gar_boars_nest",
"gar_dm_novice",
"gar_dm_bandit3",
"gar_dm_bandit2",
"gar_dm_bandit1",
"Garbage_Seriy",
"escape_provodnik",
"esc_dead_tunel_novice",
"esc_kuznetsov",
"soldiers_bridge",
"esc_wounded_follower_2",
"esc_secret_shustryi",
"esc_lager_leader",
"esc_leader_killers",
"esc_bandits_factory",
"esc_level_patrol",
"esc_helicopter",
"esc_vagon_newbie2",
"esc_vagon_newbie1",
"Escape_raid_commander2",
"Escape_raid_commander1",
"Escape_bridge_stalkers",
"Escape_novice_lager_volk",
"Escape_stalker_from_raid",
"Escape_tutorial_wounded",
"Escape_Trader",
"Escape_trader_self",
"Escape_blockpost_case",
"esc_kostya",
"rostok_stalker",
"bar_rostok_james",
"radar_monolit_dead",
"mil_trader_gavr",
"marsh_dan",
"dark_bland",
"agr_ratcatcher_new",
"marsh_barman",
"marsh_remont",
"val_bandit_krisyk",
"val_bandit_trader",
"Sherstuk",
"bar_docent",
"dolgovazyi",
"Doktor1",
"Doktor",
"Sak",
"military_ecolog_agro1",
"yakut_agro",
"stalker_agro_und",
"yakut_agro2",
"new_prizrak",
"rost_siv",
"esc_zver",
"esc_tirex",
"stalker_rost_sysh",
"sniper_kosoi",
"mil_naemnik_zondr",
"stalker_green_zahar",
"naem_zahar1",
"ecolog_wound_bunker",
"tamaz_garbage",
"new_prizrak_treasure3",
"new_prizrak_treasure2",
"new_prizrak_treasure1",
"tamaz_body2",
"esc_akim",
"peshera_shaxter",
"land_medik",
"land_sniper_chimaera",
"gen_solvador1",
"gen_andersen1",
"prip_dok_arh",
"atp_mobil_torgovetz",
"chaes2_mono_fugas",
"gen_sapsan1",
"chaes1_prizrak",
"devchonka",
"new_kluk_nz",
"generators_udav",
"marsh_udav",
"generators_zvezdochet",
"generators_prizrak",
"marsh_pantera",
"village_pantera",
"kolmogor",
"radar_vitamin",
"warlab_golograma",
"tehnik_golograma",
"warlab_vitamin",
"pantera",
"aver_hunter_stalk_4",
"otshelnik",
"land_lazaret_starik",
"labirint_shade_monolit",
"atp_kalinin",
"puzir_crest",
"bkot",
"shadowman",
"kot_hos",
"black_doctor",
"scromnyi",
"kashei",
"borman",
"kalmyak",
"esc_saha",
"clear_scy_leader",
"city_starshoy",
"zapasnoy_foto_muzhik",
"esc_foto_muzhik",
"milit_zapas_fotomuzhik",
"military_fotomuzhik",
"dcity_last_rasstrel1",
"dsity_rasstrel2",
"dsity_rasstrel1",
"molniy",
"aver_zlobnuy",
"esc_pantera_bomba",
"esc_father_pant",
"trezv_kapitan",
"agro_chsovoy_trezv",
"yantar_chernomor",
"forest_lastday_snip1",
"pripyt_kluk",
"radist_after",
"stalk_radist",
"nevid_monolit",
"odnonogiy_stalk",
"yantar_baty",
"final_piligrim",
"final_dok_arh",
"final_prizrak",
"final_arhara",
"final_petrenko",
"final_otshelnik",
"final_muxa",
"forest_lesnik",
"pri_dimak","aaz_upi",
"dyak",
"mil_Svoboda_zoneguard",
"warlab_solvador2",
"bar_zastava_commander_1",
"andersen",
"zemlyk",
"bar_bar_guard",
"military_vitamin",
"peshera_plennyi",
"peshera_stahanov",
"peshera_xabaruch",
"ozersky",
"volazar_new",
"volazar",
"vesker_zaton",
"gena_oso",
"elsa_yantar",
"snegir_kordon",
"snegir_2chaes",
"maria_kordon",
"bibliofrend_talk_black_zaton",
"bibliofrend_talk_zaton",
"wolffrend_talk_zaton",
"wolffrend_talk_zaton2",
"anna_zaton2",
"proper70_zaton",
"ariadna_zaton",
"kotobegemot_zaton",
"snp_ucheniy2",
"snp_nolik",
"ariadna_bar",
"ludmila_zaton",
"boroda_zaton",
"brodaga_zaton",
"snp_ucheniy1",
"snp_semetskiy",
"fenrir_jupiter",
"suslov_marsh",
"anna_jupiter",
"resident_evil_jupiter",
"proper70_jupiter",
"lobsang_zaton",
"bubulyka_zaton",
"anna_zaton",
"resident_evil_zaton",
"fenrir_zaton",
"kotobegemot_bar",
"akill_npc",
"tm_brother_2chaes",
"stalker_green_zahar",
"bar_zastava_guard_3",
"bar_zastava_commander_1",
"sim_dolg_veteran_barin",
"bar_arena_manager",
"rostok_stalker",
"bar_stalker_freeman",
"bar_arena_man",
"bar_stalker_0001",
"bar_bar_lisiy",
"bar_bar_drunk_dolg",
"bar_bar_visitor_hunter",
"bar_bar_osvedomitel",
"bar_bar_guard",
"bar_dolg_regular_5",
"bar_dolg_leader",
"bar_dolg_petrenko",
"bar_dolg_ivancov",
"val_bandit_trader",
"val_lager_bandits_borov",
"val_sos_wounded",
"val_escort_nap1",
"val_escort_captive",
"himik_zl",
"prigorshnya_zl",
"himik_trup","gek",
"chuk",
"sak_military_stalker",
"agr_ratcatcher",
"agr_krot",
"gar_dm_novice",
"gar_seryi",
"amk_vitek_voron",
"amk_artem_kulinar",
"gar_dolg_blokpost_4",
"gar_hellcar",
"peshera_plennyi",
"peshera_stahanov",
"peshera_xabaruch",
"esc_pantera_zadan_soldier",
"esc_provodnik",
"esc_bridge_soldier5",
"esc_stalker_fanat",
"esc_novice_attacker1",
"esc_vagon_wounded"
} 

 

 

Изменено пользователем Romann
  • Не согласен 1
 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

А dsh на предыдущей странице писал что таблицы надо заполнять вот так:

local quest_nps = {
["esc_wolf" ] = true,

["esc_fox" ] = true,

["esc_shustryi" ] = true

}

Изменено пользователем aromatizer
  • Не нравится 1

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

Ой, какая большая таблица. Я бы посоветовал, для определения квестового персонажа, в первую очередь проверять наличие story_id, и только потом, если его нету, смотреть в таблицу. Это позволит уменьшить эту таблицу, если не избавиться от нее совсем. Всё-таки, наличие story_id с большой вероятностью будет означать, что этот персонаж квестовый. Обратное не верно.

Ссылка на комментарий
А dsh на предыдущей странице писал что таблицы надо заполнять вот так:

Это тоже самое, только вид сбоку. В последнем случае мы имеем массив,  а в первом - таблицу значений. Таблица в данном случае избыточна, т.е. просто зря тратится память.

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

Для того чтобы определить есть ли значение в массиве его в худшем случае нужно полностью перебрать (сложность O(n)), а в случае хеша алгоритмическая сложность точно ниже (скорее всего что то типа O(logn), но я точно не знаю, зависит от реализации, сужу по тому как это сделано в других языках/системах. Есть базы данных где доступ осуществляется вообще за константу)

Freedom

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

@Romann, смайлик, конечно, забавный, но я его, пожалуй, вам обратно переадресую. И вот почему. Вы не думали, что имя объявляемой таблицы и имя таблицы в коде - при обращении к ней - должны совпадать? Проверьте:

У меня в коде

quest_npC

 

У вас

local quest_npS

 

Только что откатал вашу таблицу (с исправленным именем) на чистом ТЧ1.0004 - всё работает совершенно спокойно, без вылетов.

 

 

 

  • Нравится 2
Ссылка на комментарий

 

 

зависит от реализации, сужу по тому как это сделано в других языках/системах
В общем случае это так и есть. Однако в Lua, изначально ориентированном на обработку массивов, внутренняя организация очень быстрая и при таких мизерных размерах этих структур в Сталкере разницы практически не будет. К тому же алгоритм реализации цикла for в Lua один из самых быстрых и оптимальных. Так что кодовая оптимизация становится определяющей. ИМХО.
Ссылка на комментарий

 

 

Всё-таки, наличие story_id с большой вероятностью будет означать, что этот персонаж квестовый. Обратное не верно.

Вот это на самом деле, лежит на совести разработчика. Того кто этих нпс создает, настраивает. Несложно любому взять себе просто за правило - каждый квестовый нпс обязан иметь story_id, и тогда отсутствие story_id всегда можно будет считать признаком того что персонаж не квестовый, до тех пор пока это правило соблюдается. Это несложно сделать любому даже начинающему мододелу, и это здорово экономит время и усилия при реализации всех действий где с квестовыми и не-квестовыми нпс нужно поступать различным образом.

  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

 

 

при обращении к ней - должны совпадать? Проверьте

Извиняюсь за не внимательность.

 

 

всё работает совершенно спокойно, без вылетов.

Вылета нет, но не работает, т.е. схема совсем не срабатывает, на всех нпс. Вот полностью эта функция:

 

 


function life_zombie()
	local function Nilim() --\дабы не писать много, заделаем в одну функцию и будем ее подгружать
ZombieVictim = nil--\нилим юзердату жертвы и таймер
ZombieTime  = nil
ZombieFlag = true
end

    if (ZombieVictim and ZombieTime) then 
		if  ZombieTime<time_global() then
				if not ZombieFlag then
--\Добавление с 2.08.10
--\Чтобы был хоть какой-то шмот, Зомбированные не превращаются в зомби
if ZombieVictim:character_community() == "zombied" or string.find(ZombieVictim:section(),"arena") or ZombieVictim:character_community()=="arena_enemy" then
Nilim()
else
--\Добавление с 5.08.10
--\Неписей с квестовыми предметами пропускать

--\Добавление с 5.08.10
--\Неписей с квестовыми предметами пропускать
local quest_npc = {
"esc_wolf",
"esc_fox",
"esc_shustryi",
"arhara_zaton",
"volna_svidetel",
"Escape_dinamite",
"svalka_plot_stalk",
"esc_kidalo",
"warlab_stalker_oso",
"mil_Svoboda_leader",
"bodi_pantera1",
"stalk_kluk",
"land_green_stalk_4",
"piligrim",
"mil_Svoboda_engineer",
"esc_hunter_zaschita_2",
"Mil_Kap",
"alexandrych_marsh",
"marsh_ariadna",
"esc_fanat",
"Escape_novice_lager_volk",
"esc_pantera_zadan_soldier",
"kidalo_friend3",
"kidalo_friend2",
"kidalo_friend1",
"zat_kidalo2",
"zat_romale",
"zat_kidalo",
"upiter_baty",
"kuzmat_zaton",
"buusty_zaton",
"volna_svidetel",
"esc_kuzmat",
"esc_buusty",
"mil_stalker_killer",
"yan_ecolog_help1",
"agr_nebo_chromov1"
,"labirint_shade_monolit1",
"warlab_sekret_ekolog1",
"land_sniper_chimaera1",
"dar_corpse_kalugin1",
"yantar_baty1",
"dohlji_ljsji",
"journalist_npc",
"gromoboi_volna",
"locman_volna",
"elbrus_volna",
"fenix_volna",
"kogot_volna",
"nazar_volna",
"grif_volna",
"chudak_npc",
"nazar_npc",
"dasha_npc",
"masha_npc",
"zaton_dasha",
"zaton_masha",
"noi_npc",
"grom_npc",
"klesh_npc",
"fotograf_npc",
"dragunof_npc",
"sar_monolith",
"cit_doctor",
"aes_sidorovich",
"aes_monolit2",
"aes_monolit1",
"aes_kvartet",
"aes_pustelga",
"aes_sapsan",
"rad_suicide",
"rad_entrance_guard2",
"rad_entrance_guard1",
"yan_specnaz_corpse",
"yan_mapspot_from_vasilyev",
"yan_semenov_help",
"yan_vasilyev",
"yan_general_ecolog",
"yan_ecolog_help",
"pri_monolith_leader",
"pri_wave4_monolith8",
"pri_wave2_monolith_victim2",
"pri_wave2_monolith_victim1",
"Mil_Dolg_Khutor",
"Mil_Miser",
"Mil_Freedom_base",
"Mil_Sniper2",
"Mil_Sniper3",
"Mil_Sniper1",
"Mil_Controller",
"Mil_Cook",
"Mil_Hunter3",
"Mil_Hunter2",
"Mil_Hunter1",
"Mil_patrol_kamikadze3",
"Mil_patrol_kamikadze2",
"Mil_patrol_kamikadze1",
"Mil_Informator",
"Mil_Killer3",
"Mil_Killer2",
"Mil_Killer1",
"Mil_Silence",
"Mil_Courier",
"Mil_Freedom_Kamikadze",
"Mil_Dolg_Zoneguard",
"Mil_Lukash",
"Mil_Sniper",
"Mil_Crazy",
"Mil_Master_Max",
"Freedom_patrol_commander_level",
"Freedom_patrol_commander_base",
"rostok_kruglov_finish",
"rostok_offline_walker_4",
"rostok_offline_walker_3",
"rostok_offline_walker_2",
"rostok_offline_walker_1",
"rostok_banda_volkodava",
"rostok_naemnik",
"bar_dolg_locator",
"bar_arena_locator",
"bar_bar_locator",
"bar_barin",
"bar_zastava_commander",
"bar_psih",
"bar_dolg_guard_commander",
"bar_bar_osvedomitel",
"bar_svoboda_ambush_tiran",
"bar_crazy_veterans_leader",
"bar_drunk_dolg",
"bar_freedom_volkodav",
"bar_water_tower",
"bar_dolg_general_voronin",
"bar_dolg_polkovnik_petrenko",
"bar_dolg_captain_ivancov",
"bar_hunter",
"bar_ecolog_professor",
"bar_hunter_toz","val",
"val_bandit_rpg_dead",
"val_borov",
"val_escort_wounded",
"val_sos_stalker",
"val_stopper_soldier3",
"val_stopper_soldier2",
"val_stopper_soldier1",
"val_tunnel_bandit",
"val_escort_guard2",
"val_escort_guard1",
"val_escort_nap1",
"val_sacrifice_guard2",
"val_sacrifice_guard1",
"val_prisoner",
"val_escort_captive",
"agro_adrenalin",
"agr_stalker_look_point",
"agr_captains_chamber",
"agr_factory_skirmish1",
"gar_stalker_flame_quest23",
"gar_stalker_corpse",
"gar_seryi_drug_wounded",
"gar_spot_bandit_agr",
"gar_spot_dolg_blokpost",
"gar_spot_swamp",
"gar_bandit_post",
"gar_newbie_in_tunnel",
"gar_wounded",
"gar_dolg_blockpost",
"gar_bandits_leader",
"gar_boars_nest",
"gar_dm_novice",
"gar_dm_bandit3",
"gar_dm_bandit2",
"gar_dm_bandit1",
"Garbage_Seriy",
"escape_provodnik",
"esc_dead_tunel_novice",
"esc_kuznetsov",
"soldiers_bridge",
"esc_wounded_follower_2",
"esc_secret_shustryi",
"esc_lager_leader",
"esc_leader_killers",
"esc_bandits_factory",
"esc_level_patrol",
"esc_helicopter",
"esc_vagon_newbie2",
"esc_vagon_newbie1",
"Escape_raid_commander2",
"Escape_raid_commander1",
"Escape_bridge_stalkers",
"Escape_novice_lager_volk",
"Escape_stalker_from_raid",
"Escape_tutorial_wounded",
"Escape_Trader",
"Escape_trader_self",
"Escape_blockpost_case",
"esc_kostya",
"rostok_stalker",
"bar_rostok_james",
"radar_monolit_dead",
"mil_trader_gavr",
"marsh_dan",
"dark_bland",
"agr_ratcatcher_new",
"marsh_barman",
"marsh_remont",
"val_bandit_krisyk",
"val_bandit_trader",
"Sherstuk",
"bar_docent",
"dolgovazyi",
"Doktor1",
"Doktor",
"Sak",
"military_ecolog_agro1",
"yakut_agro",
"stalker_agro_und",
"yakut_agro2",
"new_prizrak",
"rost_siv",
"esc_zver",
"esc_tirex",
"stalker_rost_sysh",
"sniper_kosoi",
"mil_naemnik_zondr",
"stalker_green_zahar",
"naem_zahar1",
"ecolog_wound_bunker",
"tamaz_garbage",
"new_prizrak_treasure3",
"new_prizrak_treasure2",
"new_prizrak_treasure1",
"tamaz_body2",
"esc_akim",
"peshera_shaxter",
"land_medik",
"land_sniper_chimaera",
"gen_solvador1",
"gen_andersen1",
"prip_dok_arh",
"atp_mobil_torgovetz",
"chaes2_mono_fugas",
"gen_sapsan1",
"chaes1_prizrak",
"devchonka",
"new_kluk_nz",
"generators_udav",
"marsh_udav",
"generators_zvezdochet",
"generators_prizrak",
"marsh_pantera",
"village_pantera",
"kolmogor",
"radar_vitamin",
"warlab_golograma",
"tehnik_golograma",
"warlab_vitamin",
"pantera",
"aver_hunter_stalk_4",
"otshelnik",
"land_lazaret_starik",
"labirint_shade_monolit",
"atp_kalinin",
"puzir_crest",
"bkot",
"shadowman",
"kot_hos",
"black_doctor",
"scromnyi",
"kashei",
"borman",
"kalmyak",
"esc_saha",
"clear_scy_leader",
"city_starshoy",
"zapasnoy_foto_muzhik",
"esc_foto_muzhik",
"milit_zapas_fotomuzhik",
"military_fotomuzhik",
"dcity_last_rasstrel1",
"dsity_rasstrel2",
"dsity_rasstrel1",
"molniy",
"aver_zlobnuy",
"esc_pantera_bomba",
"esc_father_pant",
"trezv_kapitan",
"agro_chsovoy_trezv",
"yantar_chernomor",
"forest_lastday_snip1",
"pripyt_kluk",
"radist_after",
"stalk_radist",
"nevid_monolit",
"odnonogiy_stalk",
"yantar_baty",
"final_piligrim",
"final_dok_arh",
"final_prizrak",
"final_arhara",
"final_petrenko",
"final_otshelnik",
"final_muxa",
"forest_lesnik",
"pri_dimak","aaz_upi",
"dyak",
"mil_Svoboda_zoneguard",
"warlab_solvador2",
"bar_zastava_commander_1",
"andersen",
"zemlyk",
"bar_bar_guard",
"military_vitamin",
"peshera_plennyi",
"peshera_stahanov",
"peshera_xabaruch",
"ozersky",
"volazar_new",
"volazar",
"vesker_zaton",
"gena_oso",
"elsa_yantar",
"snegir_kordon",
"snegir_2chaes",
"maria_kordon",
"bibliofrend_talk_black_zaton",
"bibliofrend_talk_zaton",
"wolffrend_talk_zaton",
"wolffrend_talk_zaton2",
"anna_zaton2",
"proper70_zaton",
"ariadna_zaton",
"kotobegemot_zaton",
"snp_ucheniy2",
"snp_nolik",
"ariadna_bar",
"ludmila_zaton",
"boroda_zaton",
"brodaga_zaton",
"snp_ucheniy1",
"snp_semetskiy",
"fenrir_jupiter",
"suslov_marsh",
"anna_jupiter",
"resident_evil_jupiter",
"proper70_jupiter",
"lobsang_zaton",
"bubulyka_zaton",
"anna_zaton",
"resident_evil_zaton",
"fenrir_zaton",
"kotobegemot_bar",
"akill_npc",
"tm_brother_2chaes",
"stalker_green_zahar",
"bar_zastava_guard_3",
"bar_zastava_commander_1",
"sim_dolg_veteran_barin",
"bar_arena_manager",
"rostok_stalker",
"bar_stalker_freeman",
"bar_arena_man",
"bar_stalker_0001",
"bar_bar_lisiy",
"bar_bar_drunk_dolg",
"bar_bar_visitor_hunter",
"bar_bar_osvedomitel",
"bar_bar_guard",
"bar_dolg_regular_5",
"bar_dolg_leader",
"bar_dolg_petrenko",
"bar_dolg_ivancov",
"val_bandit_trader",
"val_lager_bandits_borov",
"val_sos_wounded",
"val_escort_nap1",
"val_escort_captive",
"himik_zl",
"prigorshnya_zl",
"himik_trup","gek",
"chuk",
"sak_military_stalker",
"agr_ratcatcher",
"agr_krot",
"gar_dm_novice",
"gar_seryi",
"amk_vitek_voron",
"amk_artem_kulinar",
"gar_dolg_blokpost_4",
"gar_hellcar",
"peshera_plennyi",
"peshera_stahanov",
"peshera_xabaruch",
"esc_pantera_zadan_soldier",
"esc_provodnik",
"esc_bridge_soldier5",
"esc_stalker_fanat",
"esc_novice_attacker1",
"esc_vagon_wounded"
}
--local quest_npc = {}
for a=1,65535 do
local obj = alife():object(a)
  if obj then
   if IsStalker(obj) then
    if not quest_npc[obj:name()] then
     -- обработчик сталкера - серверного объекта

				else --\для обычный неписей делаем стандарт
--\Добавление с 1.08.10
--\Так как играть невозможно с рандомными зомби, пришлось прибегнуть к рангам неписей
			local Zombie_rank
			Zombie_rank = ranks.get_obj_rank_name(ZombieVictim)
			if Zombie_rank ~= nil then
--\Добавление с 5.08.10
--\Выпадение патронов с трупов
--\Решил отказаться от этой идеи, т.к. грузит комп. Сделал легче: с мастеров падают рандомные патроны.
				if Zombie_rank == "novice" then
				alife():release(alife():object(ZombieVictim:id()), true)
				alife():create(novice_zombies[math.random(table.getn(novice_zombies))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
Nilim()
				elseif Zombie_rank == "experienced" then
				alife():release(alife():object(ZombieVictim:id()), true)
				alife():create(experienced_zombies[math.random(table.getn(experienced_zombies))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
Nilim()
				elseif Zombie_rank == "veteran" then
				alife():release(alife():object(ZombieVictim:id()), true)
				alife():create(veteran_zombies[math.random(table.getn(veteran_zombies))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
				alife():create(ammo[math.random(table.getn(ammo))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
Nilim()
				elseif Zombie_rank == "master" then
				alife():release(alife():object(ZombieVictim:id()), true)
				alife():create(master_zombies[math.random(table.getn(master_zombies))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
				alife():create(ammo[math.random(table.getn(ammo))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
				alife():create(ammo[math.random(table.getn(ammo))], ZombieVictim:position() , ZombieVictim:level_vertex_id() , ZombieVictim:game_vertex_id())
Nilim()
				end
			end
		end
	end
end
    end
   end
  end
end
            else
    ZombieFlag = false
        end
    end
--end
 

 

 

 

Как видно, ваш код на 522 строчке, все "end" пришлось перенести в конец общей функции(на 562 строчку), иначе синтаксическая ошибка. Вот в таком виде функция/схема совсем не работает. Каким образом её тогда реализовать?

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий
if not quest_npc[obj:name()]

 

Как минимум не нужно делать так, а нужно делать

if not quest_npc[obj:section_name()]

Это первое, что в глаза бросается. А вообще, что-то я не въезжаю, а зачем перебираются все объекты игрового мира? Что это вообще делает-то?

 

Мутный какой-то скрипт.

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

Да уж... привёл я перебор всего и вся в игре (с показательным исключением из обработки пары NPC по имени) просто в качестве примера, а его (пример) зачем-то запихнули в свой скрипт...

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

Ну дык. Вот почему на прошлой странице я и писал про то, как не надо никогда делать, а как надо всегда делать. Именно по этому. Приводишь пример, а потом обнаруживаешь его где-то, используемый совсем не для того и не там и не так. А потом вообще находишь это склонированным в десятке других скриптов.

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

Регулярное сканирование всех объектов в в игре, а потом проверка по длинным спискам (хорошо если не if ... then r = true end if ... then r = true end ... if r == true then return true) - это, во-первых, по тому что в игре должно быть не легко и не радостно , во-вторых, здесь так принято, а в-третьих, сам Великий {Ненужное Вписать} так сделал, так что Не Сметь Покушаться На Святое !

 

Хотя, да, sidы с самого начала были придуманы для квестовых объектов, и по ним все проверяется.

 

Что до мегатаблиц с id, которые регулярно слетают - то такие таблицы должны заполняться/изменяться ТОЛЬКО через se_чего-то_там.on_register()/on_unregister().

 

P.S. А вот под сами таблицы отдельный файл выделить, чтобы перестать уже адову акробатику с

script1.var1 = script2.var1

script2.var1 = script1.var1

и вариантами оной о 100500 перекрестных ссылок.

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

 

 

А вот под сами таблицы отдельный файл выделить, чтобы перестать уже адову акробатику

Вот по поводу таблиц - кто может объяснить подробно, как использовать этот способ? Как я понял, не будет надобности в скриптах городить таблицы, а составлять их в конфигах в 'all_sections.ltx'..? 

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

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

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

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

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

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

Войти

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

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

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