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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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


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

почитал форум так и не понял как сделать нпс бессмертным - помогите плиз! где что менять/прописовать

cc31, надо в секции нпс клас ему присвоить как у Сахара. открываеш его блокнотом в характер_деск_%лока%.хмл ищеш и прописуеш

Vita sine libertate, nihil

Vita sine litteris - mors est

RvP,

cc31, надо в секции нпс клас ему присвоить как у Сахара. открываеш его блокнотом в характер_деск_%лока%.хмл ищеш и прописуеш

чет невыходит, в character_desc_escape ставлю волку в секции esc_wolf класс yan_general_ecolog как у сахарова в character_desc_yantar

при начале новой игры вылет.

где эти классы зарыты? может новый сделать, типа суперсталкер. :)

 

нашел такое описание:

Так же, как сделан бессмертным Сахаров. В m_stalker.ltx прописать еще одну секцию на основе стандартной, где подкрутить иммунитеты. В spawn_sections.ltx нужным сталкерам вместо [спавн_секция]:stalker прописать [спавн_секция]:новая_секция_с_правленым_иммунитетом

немогу понять где в spawn_sections.ltx что прописывать, например секция кулинара

 

[gar_artem_kulinar_spawn]:stalker

$spawn = "respawn\gar_artem_kulinar_spawn"

character_profile = amk_artem_kulinar_class

spec_rank = regular

community = stalker

 

что ему поправить для бессмертия?

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

cc31

Для Артема Кулинара все просто: строку

 

[gar_artem_kulinar_spawn]:stalker

 

правим на

 

[gar_artem_kulinar_spawn]:stalker_sakharov

 

 

А вот с Волком будут проблемы - он зашит в алл.спавне. Вот начало секции Волка

 

[100]

; cse_abstract properties

section_name = stalker

name = esc_wolf

... и т.д.

 

А вот Сахаров:

 

[5228]

; cse_abstract properties

section_name = stalker_sakharov

name = yantar_ecolog_general

... и т.д.

 

Разница выделена жирным шрифтом. И такое, насколько я понимаю, будет с большинством (если не со всеми) квестовыми НПС из оригинала или просто заспавнеными через алл.спавн.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ну так надо в алл.спавне сделать такие исправления и с новой игрой НПС, для которых сделаны эти исправления, будут бессмертными.

Кто весел - тот смеется, кто хочет - тот добьется, кто ищет - тот всегда найдет!

Kirag,

Разница выделена жирным шрифтом. И такое, насколько я понимаю, будет с большинством (если не со всеми) квестовыми НПС из оригинала или просто заспавнеными через алл.спавн.

то есть надо обязательно править алл.спаун?

хотел посмотреть как сделано у доктора - но не могу найти

 

как смотреть/править в xrspawner? вроде нашел волка esc_wolf поменял - в новой игре фиг, дохнет зараза :(

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

Vergas,

local hud = get_hud()
hud:HideActorMenu()

 

Не уверен, но может помочь. И вот второй вариант:

level.disable_input()
level.hide_indicators_safe()
local hud = get_hud()
hud:HideActorMenu()
hud:HidePdaMenu()
level.enable_input()
level.show_indicators()

 

Добавлено через 22 мин.:

Monnoroch, на ум приходит:

actor:give_game_news("", "", [заранее сделанная текстура с чёрным шрифтом], 1000,20000)

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

Как сделать текст сообщений Черным ?

function show_black_msg(text)
  db.actor:give_game_news("%c[255,0,0,0]"..text, "ui\\ui_iconsTotal", Frect():set(0,658,83,47),1000, 20000)
end

юзать так:

show_black_msg("блаблабла")

 

Добавлено через 57 мин.:

IQDDD, заранее на все случаи жизни текстур с нужными текстами не наберешься, да и некошерно это :grin2:

 

Добавлено через 75 мин.:

А вот кто-нибуть пробовал через скрипт закрыть инвентарь?

а какже :beach:

local inventar_menu=level.main_input_receiver()
inventar_menu:GetHolder():start_stop_menu(self,true)

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105

Gonarh, добавление действия в net_spawn работает - оно совершается при загрузке.

Есть одно НО: если перезапустить сталкер - то вот тогда почему-то НЕ работает это действие...

 

Не знаешь,как это решить?

скорее всего синхронизация клиента(основной тормоз) происходит чуть больше времени отображения новости, попробуй увеличь время отображения новости примерно так:

function show_black_msg(text)

db.actor:give_game_news("%c[255,0,0,0]"..text, "ui\\ui_iconsTotal", Frect():set(0,658,83,47),1000, 60000)

end

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105

Да,действительно.

 

Что я делаю: считаю колличество загрузок игры. - коллбэк в конце bind_stalkeer.actor_binder:net_spawn()

И загрузка сразу после запуска игры почему-то не считается.

Пользуюсь amk.save_variable и bind_stalkeer.actor_binder:save(paket) для сохранения колличества.

Загрузка НЕ после перезапуска игры считается отлично.

 

Может что-то не правильно,нельзя этими функциями пользоваться?

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

давай в личку свой аськ - так думаю будет просче обсчаться :)

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105

хмм, похоже отвечает за формы, тестуры и размеры окна мессаджбокс в главном меню, ПЫСовцы делали его похожим на системное

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105

Gonarh, а вот такой вопрос:

1. Как в Lua писать данные в файл, как читать данные из файла?

2. Что такое NET пакеты и зачем они нужны? (это случай не что-то по типу winAPI)

3. Что за Frect():set(0,658,83,47)?

4. В стандартном news_manager:

actor:give_game_news(news_caption, news_text, texture, timeout*1000, showtime)

 

У вас на месте таймаута стоит Frect():set(0,658,83,47)?

5. Расскажите о методах GetHolder() и start_stop_menu(self,true). (Как я понимаю, start_stop_menu (self,true) открывает или закрывает элемент self, в нашем случае инвентарь.)

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

1. Писать нельзя только читать. По крайней мере в классе ini_file в lua_help.script

нет объявлений методов записи

C++ class ini_file {

ini_file (string);

 

function line_count(string);

function r_bool(string, string);

function section_exist(string);

function r_float(string, string);

function r_clsid(string, string);

function r_s32(string, string);

function r_line(ini_file*, string, number, string&, string&);

function r_token(string, string, const token_list&);

function r_vector(string, string);

function r_u32(string, string);

function r_string_wq(string, string);

function r_string(string, string);

function line_exist(string, string);

};

 

создаем в папке gamedata\config\misc файлег moi_dannye.ltx

следующего содержания:

[general_data]

my_param = 1.5

Примерная функция чтения этого параметра

function get_parametr()
  result = 0
  local sini = ini_file("misc\\moi_dannye.ltx")
  if sini and sini:section_exist("general_data") then        
    if sini:line_exist("general_data","my_param") 
    then result = sini:r_float("general_data","my_param") end
  end
  return result
end

учтите что это функция чтения числа с плавающей точкой, для чтения других типов данных используйте соответствующие методы

2. нетпакет это примерно 7,5-8килобайт пользовательских данных куда можно писать/читать свои данные, превышение данного объема ведет к вылетам, на основе этой фичи построены моды, без нетпакета жизнь мододелов была бы существенно затруднена. практически все фишки которых нет в оригинале с деланы при помощи этой хрени.

3. Это координаты куска текстуры gamedata\textures\ui\ui_iconstotal.dds для отображения иконки того кто послал Меченому сообщение

4. Нет не на месте таймаута а на месте "texture"

5. У GetHolder() нет методов ибо это и есть метод 3-х классов ЕМНИП, если чесно влом писать, то чего сам толком не понимаю, действовал сам методом научного тыка читая lua_help.script, все возможные функции, классы, методы, константы игры описаны в этом файле... так шо дерзайте ;)

Изменено пользователем Gonarh
118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
1. Как в Lua писать данные в файл, как читать данные из файла?

2. Что такое NET пакеты и зачем они нужны? (это случай не что-то по типу winAPI)

3. Что за Frect():set(0,658,83,47)?

1. Вообще говоря в стандартном Lua есть функции работы с файлами, но их наличие в конкретной реализации зависит от разработчика. Поскольку Lua фактически является частью хост-приложения, то в нём будут только те библиотеки, которые пожелает оставить разработчик. Вот в данном случае все стандартные библиотеки для работы с файлами были убраны. Если вопрос в том, есть ли способ записи в ltx файл, предоставленный в API самой игры, то походу тоже нет.

 

2. нетпакет - это класс движка игры, экспортированный в Lua. Каждый объект этого класса содержит буфер. Любой серверный объект можно записать в этот буфер и считать из него. Кроме того, в этом классе есть функции для последовательного разбора этого буфера. Техника работы с нетпакетом следующая:

а) создаем объект класса нетпакет, вот так:

local packet = net_packet()

б) читаем в него состояние объекта вот так:

sobj:STATE_Write(packet)

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

local game_vertex_id     = packet:r_u16()
local distance           = packet:r_float()
local direct_control     = packet:r_s32()
local level_vertex_id    = packet:r_s32()
...
и т.д.

г)меняем значения полученные переменных, как нам надо, и затем записываем обратно в нетпакет в том же порядке так:

res:w_u16(game_vertex_id)
res:w_float(distance)
res:w_s32(direct_control)
...
и т.д.

д) записываем нетпакет обратно в объект вот так:

local size  = res:w_tell()
res:r_seek(0)
sobj:STATE_Read(res,size)

Делать всё это можно только с объектами в оффлайне.

Если вдаваться в лирику, то нетпакет - это похоже часть движка, связанная с процессом синхронизации между клиентской и серверной частью. Можно предположить, что при синхронизации клиентской и серверной части объектов клиент записывает в этот самый нетпакет себя и затем посылает этот буфер на серверную сторону (потому и net-пакет). А может сервер клиенту... чёрт его знает.

 

3. Frect():set(0,658,83,47) - это синтаксис создания неименованного объекта пользовательского типа, экспортированного в Lua. В данном случае Frect. Это класс для хранения координат прямоугольника. Сразу после создания для объекта вызывается его метод set, который устанавливает его значения.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

malandrinus, Gonarh, в faction commander для ЧН как-то сделали запись в файл и чтение из него.

Вот кусок кода:

class "Setting"
function Setting:__init()
    self.settingFileName = "gamedata\\faction_commander_setting.txt"
    self.settingTable = {
        command        = { value = "", pattern = ".+",     defaultValue = "default" },
        magnitude     = { value = "", pattern = "%d+",    defaultValue = "0" },
        ai             = { value = "", pattern = "%a+",     defaultValue = "disable" },
        commission    = { value = "", pattern = "%a+",     defaultValue = "commission_off" },
    }

    local file = io.open( self.settingFileName, "r" )
    if file ~= nil then
        for name, info in pairs( self.settingTable ) do
            info.value = file:read( "*line" ) or ""
        end
        file:close()
    end
    
    for name, setting in pairs( self.settingTable ) do
        self:_checkIntegrity( name )
    end
end

function Setting:__finalize()
    local file = io.open( self.settingFileName, "w" )
    if file ~= nil then
        for name, setting in pairs( self.settingTable ) do
            file:write( setting.value, "\n" )
        end
        file:close()
    end
end

function Setting:getValue( name )
    return self.settingTable[ name ].value
end

function Setting:setValue( name, value )
    self.settingTable[ name ].value = value
    self:_checkIntegrity( name )
end

 

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

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

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

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

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

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

Войти

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

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

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