Regulamin forum
Dział "Modyfikacje Gotowe" służy do dyskusji o modyfikacjach, które już są stworzone lub do zadawania pytań na ich temat. Znajdziemy tutaj również linki do ściągnięcia modyfikacji (które powinny, a raczej muszą być w pierwszym poście tematu danej modyfikacji).
Przy zadawaniu pytania związanego z problemem dotyczącym modyfikacji, prosimy o podawanie treści całego loga błędu - koniecznie w tagu [CODE].
Przy cytowaniu plików *.LTX stosować tag [SYNTAX="ini"], przy cytowaniu plików *.script [SYNTAX="lua"] a przy cytowaniu plików *.xml - [SYNTAX="xml"].
Lokalizacja logów: Windows XP - C:\Documents and Settings\All Users\Moje dokumenty\STALKER-SHOC\logs\xray_nazwaużytkownika.log Windows Vista/7 - C:\Users\Public\Documents\STALKER-SHOC\logs\xray_nazwaużytkownika.log Steam - X:\Program Files (x86)\Steam\SteamApps\common\Stalker Shadow of Chernobyl\_appdata_\logs
Pytania na temat modyfikacji zadajemy w wątku dla niej stworzonym lub tworzymy nowy, jeśli takowego nie ma.
Gdy chcemy założyć nowy wątek, obowiązkowe jest przeczytanie tego tematu.
Poprzedni fix został usunięty z powodu w/w błędu, ta mała poprawka Fix 2 - powinna pomóc. Zastępujemy plik z folderu scripts. Nie łączymy Fix'a 2 z poprzednim! Mam nadzieję że będzie dobrze, bo kończą mi się pomysły... Brak hasła do archiwum.
Ostatnio edytowany przez Freeman, 19 Maj 2010, 12:25, edytowano w sumie 1 raz
self.npc_script_version = alife():object(self.object:id()).script_version dialog_manager.load(self.object, reader, self.npc_script_version) trade_manager.load(self.object, reader) end
_________________
Crew – do tego sprowadzają się różnice w/w wpisów – Fix_2 zawiera wpisy uwzględniające nowszy patch 1.0005. Fix dodany również do downloadu w 1 poście.
Sprawa #2 – dla osób chcących dodać mod do własnych kompilacji: blowout’y _________
AI tuning mod zawiera skrypt grabieży ciał [watcher_act.script] – z którego wyłączono sekcje blowout_scheme – odpowiadającą za określone zachowania NPC podczas blowout’ów. Trzeba je uwzględnić podczas dodawania zwarć – inaczej może wystąpić CTD, wówczas gdy schemat zachowań będzie nakazywał np. schronić się, a skrypt grabieży – przeszukiwanie ciał. Niemodowny stalker nie uwzględnia takich zachowań, ponieważ zwarcia mamy tylko 2 na całą grę i podczas nich NPC zachowuję się jak podczas deszczu... xD
Sprawa #3 – dodawanie broni. _________
Odpowiedni skrypt zarządza wyborem broni dla NPC podczas walki, wszelkie bronie dodawać należy w gamedata/config/misc – w pliku rx_weapon_mgr.ltx Dodając broń do moda, nie należy zapomnieć o wpisaniu swojej broni do w/w pliku i przyporządkowaniu jej określonej wartości liczbowej. Co robimy? Znajdujemy sekcję [priors_def] Pod nią znajdziemy listę broni z określonymi wartościami np:
Czyli jeśli np. wpn_val = 34 oznacza to, iż NPC będzie używał tej broni wówczas gdy jest ona przypisana do określonego mutanta i w określonej odległości. Nie oznacza to, iż będzie używał tylko tej broni – NPC używa tego co akurat ma. Ten config służy temu, by mając wiele broni (NPC zbierają broń – ja spotkałem gościa z 9 giwerami) stalker wybrał najlepszą z posiadanej.
A powiedzcie mi czy da się połączyć tego moda z modem "CutOut_Mutants_Returned" ? Przydał by się bo ledwo zacząłem a zombiaki wycięły połowę "Kordonu" innym razem wracam to samo...
Brakiss - CutOut Mutants Returned Mod jest na wersję 1.0003, a ten mod na 1.0004/1.0005 więc pliki trzeba przerabiać od nowa, za dużo roboty, poza tym pod patch 1.0003 jest niewiele modów. Moja rada: dorwij jakiś większy mod wprowadzający mutanty np. Oblivion Lost 2.2/ AMK 1.4/utAMK/ - w każdym razie na nowszą wersję gry. Ja osobiście nie mam czasu na przeróbkę, ale zapytaj modderów.
if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end
--' Çŕăđóćŕĺě íŕńňđîéęč äđîďŕ death_manager.init_drop_settings() if xrs_ai then xrs_ai.actor_net_spawn(self) end if rx_ai then rx_ai.actor_net_spawn() abc_sleep.uptabc("load") return true end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object)
if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy() sr_psy_antenna.psy_antenna = false end
xr_sound.stop_all_sound_object()
object_binder.net_destroy(self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:reinit() object_binder.reinit(self)
---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end
treasure_manager.take_item_from_box(box, story_id) --[[ local respawner = se_respawn.get_respawner_by_parent(story_id) if respawner == nil then return end
--' Íĺîáőîäčěî óěĺíüřčňü ń÷ĺň÷čę â đĺńďŕâíĺđĺ respawner:remove_spawned(item:id())
local smart_terrain = db.strn_by_respawn[respawner:name()] if smart_terrain == nil then return end
local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position()) if npc ~= nil then xr_sound.set_sound_play(npc, "reac_box") xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor) end ]] end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_enter(npc, info_id) self.actor_detector:actor_enter() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_exit(npc, info_id) self.actor_detector:actor_exit() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id) printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) --' Ńţćĺň level_tasks.proceed(self.object) -- Îňěĺňęč íŕ ęŕđňĺ level_tasks.process_info_portion(info_id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_trade (item, sell_bye, money) if sell_bye == true then game_stats.money_trade_update (money) else game_stats.money_trade_update (-money) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:article_callback(npc, group, name) --printf("article_callback [%s][%s]", group, name) if device().precache_frame >1 then return end
if group == "Diary" then news_manager.send_encyclopedy("diary", group) else news_manager.send_encyclopedy("encyclopedy", group) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) if xrs_ai then xrs_ai.actor_item_take(obj) end --game_stats.update_take_item (obj, self.object) if rx_ai then rx_ai.actor_item_take(obj) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) abc_sleep.uptabc(obj) end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:task_callback(_task, _objective, _state) task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state) if _objective:get_idx() == 0 then if _state == task.fail then news_manager.send_task(db.actor, "fail", _task, _objective) elseif _state == task.completed then task_manager.reward_by_task(_task) news_manager.send_task(db.actor, "complete", _task, _objective) else news_manager.send_task(db.actor, "new", _task, _objective) end else if _task:get_objective(0):get_state() == task.in_progress then news_manager.send_task(db.actor, "update", _task, _objective) end end end
---------------------------------------------------------------------------------------------------------------------- function actor_binder:map_location_added_callback(spot_type_str, object_id) if (false==app_ready()) or (device().precache_frame>1) then return end --'news_manager.send_task(db.actor, "new") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update()
--' Ďđîâĺđęŕ ďîňĺđč ćčçíč --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime) lasthealth = self.object.health lasttime = game.time() end ]] -- Îáíîâëĺíčĺ îňęëţ÷ĺíč˙ ââîäŕ ń ęëŕâčŕňóđű. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end -- Îáíîâëĺíčĺ ńíŕ ń ďĺđĺíîńîě ÷óâŕęŕ â óęŕçŕííóţ ďîçčöčţ if self.st.sleep_relocate_time ~= nil and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then self.object:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) self.object:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end
-- Ŕďäĺéň ďđ˙ňŕíčĺ îđóćč˙ čăđîęŕ âî âđĺě˙ äčŕëîăŕ if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end
-- îáíîâëĺíčĺ đĺńňđčęňîđîâ, ęîňîđűĺ ďîä ëîăčęîé, ńđŕáŕňűâŕĺň ÷ĺđĺç číňĺđâŕëű âđĺěĺíč if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta)
self.next_restrictors_update_time = time + 200
task_manager.actor_update() end
-- îáíîâëĺíčĺ ďîńňďđîöĺńńîâ if post_process ~= 0 then if post_process:update () == true then post_process = 0 end end
-- îáíîâëĺíčĺ ďńč-ŕíňĺííű if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end
--' Âűâîä ńîîáůĺíč˙ î áîëüřîé đŕäčŕöčč if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end
if self.bCheckStart then printf("SET DEFAULT INFOS")
if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") end
-- if not has_alife_info("encyclopedy") then -- self.object:give_info_portion("encyclopedy") -- end
if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end
if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end
level_tasks.add_lchanger_location()
self.bCheckStart = false end abc_sleep.uptabc("abc") --if not self.particle then -- self.particle = particles_object([[weather\water]]) -- self.particle:play_at_pos(self.object:position()) --else --self.particle:move_to(self.object:position():add(vector():set(0,1,0)),vector():set(0,0,0)) --end if rx_ai then rx_ai.actor_update() end if xrs_ai then xrs_ai.actor_update(delta) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) printf("actor_binder:save(): self.object:name()='%s'", self.object:name()) object_binder.save(self, packet)
sr_psy_antenna.load(reader) task_manager.load(reader) self.actor_detector:load(reader) end ----------------------------------------------------------------------------------------------------------------------
-- Weapon functions function hide_weapon() weapon_hide = true end function restore_weapon() weapon_hide = false end
// this is test for section iteration /** local function test_section_iteration(file_name, section_name) printf ("file : %s",file_name) printf ("section : %s",section_name)
local file = ini_file(file_name) local n = file:line_count(section_name) printf ("lines : %d",n)
local id, value = "", "", result for i=0,n-1 do result, id, value = file:r_line(section_name,i,"","") printf ("line %d : %s = %s",i,id,value) end end
Daj dłuższy fragment logu, bo akurat ten fatal error nic nie mówi. A co do pytania wyżej: mutanty masz np. w utAMKu, którego i tak nie będziesz musiał łączyć z tą paczką, ponieważ tak na oko wszystko powinno już tam być
Freeman napisał(a):7) Niektóre granaty mogą nie wybuchnąć.
No ciekawe, u mnie albo NPC używają granatów - szajsów, albo są tak zapominalscy, że nie odciągają zawleczki, bo każdy granat nie wybucha . Po walce całą minimapkę mam osraną w symbolach granatów, które mogę se do woli pozbierać
Ogólnie mod robi różnicę, wrogowie nie stoją na środku mapy tylko się kryją i do tego kucają - i częsta próbują okrążać i zachodzić od tyłu przez co nieraz zginąłem . Kolbą potrafią prywalić i jeszcze broń wypada, co jest bardzo uciążliwe.
"Today I didn't even have to use my AK I gotta say it was a good day"