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

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


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

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

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
Ссылка на комментарий

Отключение монолога Сидоровича:

В файле config\scripts\esc_trader.ltx в самом начале заменить

 

[logic]

active = {+esc_trader_hello_played} mob_trader@new_idle1, mob_trader@new_start_wait

 

на

 

[logic]

active = mob_trader@new_idle1

 

Титры обучения - похоже, надо ковырять config\ui\game_tutorials.xml, но с ними я не разбирался

Мои работы:

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

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

Soul Cube

 

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

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

За что отвечает эта функция?

function generate_test(lname)

if level_vertexes[lname] == 0 then

return nil

end

local gvn,gvx,lvx = game_vertexes[lname][1], game_vertexes[lname][2], level_vertexes[lname]

local new_lv=math.random(1,lvx)

local pos = level.vertex_position(new_lv)

if not check_coordinates_arts(pos,lname) then

return false

end

 

 

И, что не нравится игре?

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: ...\games\s.t.a.l.k.e.r\gamedata\scripts\amk_mod.script:131: attempt to index global 'amk_anoms' (a nil value)

 

 

Спасибо.

 

TREWKO Стоят родимые, при загрузке Болот как раз ентот вылет и происходит. На Солянке. switch_distance = 150

WAWKA Спасибо, пошёл ковырять дальше.

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

У меня была такая ошибка, и у меня она была связана с файлом alife.ltx, так как я в нём пытался увеличить дистанцию алайфа до 2 км. Ну и даже 600 м. У тебя случаем не стоят новые локации?

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

Borsalino, а эти самые новые локации добавлены в amk_anoms.script?

Если нет, то необходимо добавить в:

local level_vertexes (указать имя локации = вертекс уровня)

local level_number (указать имя локации = порядковый номер)

local game_vertexes (указать имя локации = вертекс игры от и до)

level_anoms (если нужны динамически спавнящиеся аномалии)

level_arts (если нужны динамически спавнящиеся артефакты)

local levelname

В items.ltx добавить псевдобинты с названиями лок вида testsak_имялокации

В sak.script в функцию add_tail добавить локи в исключения (на которых не планируется спавн артов)

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

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

 

Можно ли худы костюмов перетащить на чистую игру без всяких АМК? На эффект дыхания, поломку и проч мне в общем-то плевать (хотя не отказался бы), но очень хотелось бы.

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

я создал свой файл скриптов: MyScripts.script

там написал функцию:

BlaBlaBla(oneparam,twoparam)
...
end

вызвал её из другого скрипта вот так:

MyScripts.BlaBlaBla (oneargument,towargument)

у меня вылазит:

[error]Arguments : LUA error: .... - чистое небо\gamedata\scripts\ui_main_menu.script:117: attempt to index global 'MyScripts' (a nil value)

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

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

Expression : fatal error
Function : CSkeletonX::_Load
File : E:\stalker\patch_1_0004\xr_3da\SkeletonX.cpp
Line : 380
Description : <no expression>
Arguments : Invalid vertex type in skinned model 'dynamics\outfit\neutral_assault_outfit:1'

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

IQDDD,

у меня ругается на то, что метод STATE_Write () неизвестен. Что делать?

Объект серверный?

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

Ну значит в ЧН пространство имён io экспортировали. В ТЧ этого точно не было, я спецом проверял. Это как раз и есть стандартные функции Lua для работы с файлами. Смотри справочник по Lua, как с ними работать.

 

attempt to index global 'MyScripts' (a nil value)

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

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

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

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

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

 

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

камрады расскажите подробно о том как происходит лечение НПС когда ему дает аптечку ГГ и когда НПС , как отличается действие разных аптечек (если отличается ) в каком скрипте что отвечает ...

 

з.ы. читать шпаргалку не надо предлагать и так моя настольная книга :blush:

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

Свободу всем Даром!

Моя Зона Full Realism Mod STSoC by Wolkolak

"Безвыходных ситуаций не существует в принципе."(с) Ред Шухов

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

Borsalino, Поставить activeperl, как легкий способ. Потом запустить, батник в папке который лежит скрипт и ехе перла. Если конечно таковой имеется.

http://strawberry-perl.googlecode.com/file...erl-5.8.8.4.exe к примеру, конечно я беру упакованный скрипт, вытряхиваю и пускай по своему усмотрению через батники.

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

wolkolak, xr_wounded.script пример использования... в dialogs_escape.xml, диалоге с толиком <action>dialogs.transfer_medkit</action> / Надеюсь ясно и понятно.

IQDDD, показывай в спройлере, скрипт... Иначе не понятно почему у тебя там нулевая переменная. Мб, не передается, может не определяется..... Итп.

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...