aromatizer 4 429 Опубликовано 11 Мая 2016 Поделиться Опубликовано 11 Мая 2016 (изменено) Т.е. для моего печального случая с ТТ2 решения нет? Оставить надежду навсегда? Изменено 11 Мая 2016 пользователем aromatizer Отношения между людьми- главная ценность в человеческом обществе.Любая полученная информация- это только повод для размышлений, а не побуждение к действию.Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAEНакопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt Ссылка на комментарий
Serge! 127 Опубликовано 11 Мая 2016 Поделиться Опубликовано 11 Мая 2016 (изменено) Оставить надежду навсегда? Надежда умирает последней и очень мучительно. А пока можно попробовать переписать таблицу 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",}, ... } Изменено 11 Мая 2016 пользователем Serge! 1 Ссылка на комментарий
aromatizer 4 429 Опубликовано 11 Мая 2016 Поделиться Опубликовано 11 Мая 2016 (изменено) Я всегда знал что варианты решения есть всегда и их больше, чем один. Разобрался с авторазряжалкой: надо было не целиком копипастить выложенную функцию, а вставить код в уже существующую. Спасибо всем за помощь. Вот рабочий скрипт: -- 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 = 0local weapon_classes_w_ammo = {}--список аммо для каждой секции. по сути кэшlocal weapon_ammo = {}--сюда занести секции оружия которое не надо разряжать. Zander_driver, dshlocal 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() thenlocal msg_no_ws = string.gsub("=="..src.."==>"..msg, "%s", "_")get_console():execute(msg_no_ws)end--]]--endfunction 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) doendfunction 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()) endreturn weapon_classes_w_ammo[id] == trueelse-- ts_log("is_weapon_w_ammo\t\t","ERR.is_weapon_w_ammo:id=nil")return falseendendfunction 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 thennews_text = msgendif timeout == nil then timeout = 0 endif showtime == nil then showtime = 5 endif timeout == 0 thenlocal player = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])-- ' Играем дефолтный звукplayer:play(db.actor, timeout, sound_object.s2d)endlocal ts_news = news_caption.."\\n"..news_textdb.actor:give_game_news(ts_news, texture, Frect():set( 0, 658, 83, 47), timeout*1000, showtime*1000)end--взято с OGSMfunction spawn_ammo_in_inv(section,number,npc)if npc==nil thennpc=db.actorend-- 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 thenreturn se_respawn.create_ammo(section,npc:position(),npc:level_vertex_id(),npc:game_vertex_id(),npc:id(),number)endendfunction ts_ammo_discharge(wpn)local name = wpn:name()local wpsec = wpn:section()if ex_sects[ wpsec ] then return end --не разряжаем оружие из таблицы исключений. dshlocal ammo_count = wpn:get_ammo_in_magazine()if ammo_count>0 thenlocal 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") thenlocal 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()elseif section_ammo == nil thensection_ammo = ""endts_log("ts_ammo_discharge\t\t", "Object = "..name.." Ammo section fail: "..section_ammo)endendendfunction parse_names_mod( s )local t = {}--отсечка коментарияlocal pos = string.find(s,";")local ps = ""if pos ~= nil and pos > 0 thenps = string.sub(s,1, pos - 1)elseps = sendfor name in string.gfind( ps, "([%w_.\\-]+)%p*" ) dotable.insert( t, name )endreturn tend--найти аммо по номеруfunction ts_ammo_by_num(section, num)local ammo_listif weapon_ammo[section] ~= nil and weapon_ammo[section] ~= "" thenammo_list = weapon_ammo[section]-- ts_log("ts_ammo_by_num",section.." => Found: "..ammo_list)elselocal 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) endlocal t=parse_names_mod(ammo_list)local cnt = table.getn(t)if cnt == 0 thenreturn nilelseif num >= cnt thenreturn t[1]elsereturn t[num+1]endendfunction test_discharge_weapon(ItemObj)if ItemObj == nil thenreturn falseend-- ts_log("test_discharge_weapon\t",ItemObj:name())if notest_time == 0 thennotest_time = game.time()+6000elseif notest_time>game.time() thenreturn falseelseif is_weapon_w_ammo(ItemObj) thenlocal 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()endlocal 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()endif ItemId ~= IdPistol and ItemId ~= IdAutomat thents_ammo_discharge(ItemObj)else-- ts_log("test_discharge_weapon\t", "item "..ItemObj:name().." in slot")endendendfunction ts_on_net_spawn()-- ts_log("ts_on_net_spawn","..")notest_time = 0endfunction ts_on_item_take(obj)if notest_time>game.time() thenreturn falseend-- 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)endendfunction ts_on_item_drop(obj)if not db.actor:has_info("ui_inventory") thenreturn falseendif notest_time>game.time() thenreturn falseend-- 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)endend Изменено 11 Мая 2016 пользователем aromatizer Отношения между людьми- главная ценность в человеческом обществе.Любая полученная информация- это только повод для размышлений, а не побуждение к действию.Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAEНакопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt Ссылка на комментарий
=VENOM= 50 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 @Romann, что касается вылета, судя по логу, таблица quest_npc пуста. Я оставил её в примере пустой: local quest_npc = {} В неё нужно занести квестовых персонажей, по именам, примерно так: local quest_npc = { "esc_wolf", "esc_fox"} В этом случае будут обработаны все сталкеры, за исключением Волка и Лиса. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Я всегда знал что варианты решения есть всегда и их больше, чем один Зачем тогда такие странные вопросы задавать. Т.е. для моего печального случая с ТТ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. Ссылка на комментарий
Romann 619 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 (изменено) судя по логу, таблица quest_npc пуста Ну естественно она не была пуста , вот так было: 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" } Изменено 12 Мая 2016 пользователем 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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
aromatizer 4 429 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 (изменено) А dsh на предыдущей странице писал что таблицы надо заполнять вот так: local quest_nps = {["esc_wolf" ] = true, ["esc_fox" ] = true, ["esc_shustryi" ] = true } Изменено 12 Мая 2016 пользователем aromatizer 1 Отношения между людьми- главная ценность в человеческом обществе.Любая полученная информация- это только повод для размышлений, а не побуждение к действию.Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAEНакопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt Ссылка на комментарий
dsh 3 824 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Ой, какая большая таблица. Я бы посоветовал, для определения квестового персонажа, в первую очередь проверять наличие story_id, и только потом, если его нету, смотреть в таблицу. Это позволит уменьшить эту таблицу, если не избавиться от нее совсем. Всё-таки, наличие story_id с большой вероятностью будет означать, что этот персонаж квестовый. Обратное не верно. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Serge! 127 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 (изменено) А dsh на предыдущей странице писал что таблицы надо заполнять вот так: Это тоже самое, только вид сбоку. В последнем случае мы имеем массив, а в первом - таблицу значений. Таблица в данном случае избыточна, т.е. просто зря тратится память. Изменено 12 Мая 2016 пользователем Serge! Ссылка на комментарий
_Призрак_ 11 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Для того чтобы определить есть ли значение в массиве его в худшем случае нужно полностью перебрать (сложность O(n)), а в случае хеша алгоритмическая сложность точно ниже (скорее всего что то типа O(logn), но я точно не знаю, зависит от реализации, сужу по тому как это сделано в других языках/системах. Есть базы данных где доступ осуществляется вообще за константу) Freedom Ссылка на комментарий
=VENOM= 50 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 @Romann, смайлик, конечно, забавный, но я его, пожалуй, вам обратно переадресую. И вот почему. Вы не думали, что имя объявляемой таблицы и имя таблицы в коде - при обращении к ней - должны совпадать? Проверьте: У меня в коде quest_npC У вас local quest_npS Только что откатал вашу таблицу (с исправленным именем) на чистом ТЧ1.0004 - всё работает совершенно спокойно, без вылетов. 2 Ссылка на комментарий
Serge! 127 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 зависит от реализации, сужу по тому как это сделано в других языках/системахВ общем случае это так и есть. Однако в Lua, изначально ориентированном на обработку массивов, внутренняя организация очень быстрая и при таких мизерных размерах этих структур в Сталкере разницы практически не будет. К тому же алгоритм реализации цикла for в Lua один из самых быстрых и оптимальных. Так что кодовая оптимизация становится определяющей. ИМХО. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Всё-таки, наличие 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. Ссылка на комментарий
Romann 619 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 при обращении к ней - должны совпадать? Проверьте Извиняюсь за не внимательность. всё работает совершенно спокойно, без вылетов. Вылета нет, но не работает, т.е. схема совсем не срабатывает, на всех нпс. Вот полностью эта функция: 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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
dsh 3 824 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 (изменено) if not quest_npc[obj:name()] Как минимум не нужно делать так, а нужно делать if not quest_npc[obj:section_name()] Это первое, что в глаза бросается. А вообще, что-то я не въезжаю, а зачем перебираются все объекты игрового мира? Что это вообще делает-то? Мутный какой-то скрипт. Изменено 12 Мая 2016 пользователем dsh dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
=VENOM= 50 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Да уж... привёл я перебор всего и вся в игре (с показательным исключением из обработки пары NPC по имени) просто в качестве примера, а его (пример) зачем-то запихнули в свой скрипт... Ссылка на комментарий
dsh 3 824 Опубликовано 12 Мая 2016 Поделиться Опубликовано 12 Мая 2016 Ну дык. Вот почему на прошлой странице я и писал про то, как не надо никогда делать, а как надо всегда делать. Именно по этому. Приводишь пример, а потом обнаруживаешь его где-то, используемый совсем не для того и не там и не так. А потом вообще находишь это склонированным в десятке других скриптов. 2 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 13 Мая 2016 Поделиться Опубликовано 13 Мая 2016 (изменено) Регулярное сканирование всех объектов в в игре, а потом проверка по длинным спискам (хорошо если не 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 перекрестных ссылок. Изменено 13 Мая 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Romann 619 Опубликовано 13 Мая 2016 Поделиться Опубликовано 13 Мая 2016 А вот под сами таблицы отдельный файл выделить, чтобы перестать уже адову акробатику Вот по поводу таблиц - кто может объяснить подробно, как использовать этот способ? Как я понял, не будет надобности в скриптах городить таблицы, а составлять их в конфигах в '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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
naxac 2 445 Опубликовано 13 Мая 2016 Поделиться Опубликовано 13 Мая 2016 @Romann, проще уж в скриптах, чем писать каждый раз ини, сохраняя массивы, а потом их загружать. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти