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

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


Halford

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

  Monnoroch писал(а):
get_hud()::AddCustomStatic("mon_radiation", true)

очепятка? должно быть только одно двоеточие

 

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

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch,

Total Commander используешь? У меня в подписи есть к нему системный плагин для распаковки. Найти любой файл и распаковать занимает секунды.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение

Monnoroch,

в своё время на офф. форуме IG-2007 сказал вот такую вещь:

  Цитата
Встречались мне ошибки (server reject), которые происходили на сервере при реальном выполнении команд, тогда как на клиенте вызов этой команды не привёл к вылету, а был успешно отработан. Это было при попытке выполнить последовательно два действия над одним предметом: переместить и удалить.

Я так понимаю, что до завершения одного процесса нельзя делать следующее действие.

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

Я также думаю, что это такие действия, которые требуют синхронизации серверной и клиентской стороны. Поскольку синхронизация происходит по сети (или как бы по сети при сингловой игре), то этот процесс занимает изрядное время. Чтобы уменьшить время работы скриптового вызова такие действия делают асинхронными.

 

всё это только мои предположения.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  wolkolak писал(а):
self.npc.health = self.npc.health + 1 это добавляем НПС здоровья ...

а как точно также вылечить рану ?

неправильно лечишь. На запись свойство health - это не само здоровье, а его приращение, так что если хотел добавить единицу, то написать надо было так:

self.npc.health = 1

раненость (неписей) лечить - для этого есть вроде функция wounded(true/false)

степень кровотечения можно получить функцией get_bleeding()

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

По моему, эквивалент бинта будет с типом урона wound.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Writer писал(а):
Вопрос: Как пользоваться "Скрипт, выводящий на экран данные о положении ГГ."...как сохранить вычисленные координаты на комп или их списывать прийдется?
  8push5 писал(а):
есть такая программа ... она гораздо удобнее для снятия координат

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

local pos = db.actor:position()
local gvid = db.actor:game_vertex_id()
local lvid = db.actor:level_vertex_id()
get_console():execute(string.format("x=%d_y=%d_z=%d_lvid=%d_gvid=%d", pos.x, pos.y, pos.z, lvid, gvid))
get_console():execute("flush")

И у вас в логе есть вся информация. Даже из игры выходить не надо.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Saler писал(а):
Так вот хочу спросить, это сложно или нет? Если есть готовая лока для сингла, как ее можно прицепить, как в АМК?

Есть отдельная тема Сообщество Мапперов. Там и карт куча и рекомендации имеются, как их подключать.

 

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

  n6260 писал(а):
4. Что бы локу из сингла вставить в игру надо достаточно долго заморачиватся. Не сказать что сильно сложно, но достаточно заморочено. И комп нужен чем мощнее, тем лучше.

Насчёт заморачиваться - это да, а вот насчёт компа помощней - не уверен. Если локация уже скомпилена, то зачем там исключительные мощности?

 

Сообщение от администратора _And_
Так я в смысле компиляции и писал.
  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение

Ковыряю физику объектов. Есть большая непонятка. Код такой:

local pshell = cobj:get_physics_shell() -- получаю для онлайнового объекта его физическое тело
if pshell then
    local jn = pshell:get_joints_number() -- получаю количество костей
end

И вот странность. Для дохлых сталкеров полученное число костей выходит 11, при том, что их 45. Для некоторых моделей и вовсе число костей нулевое, при том, что как минимум одна-то кость точно есть. Соответственно и получить кость не выходит, т.е. вызов pshell:get_joint_by_bone_name(<имя_кости>) приводит к вылету.

Кости точно имеются в наличии все, какие прописаны в модели. В этом можно убедиться, получив положение произвольной кости с помощью метода cobj:bone_position(<имя_кости>)

 

Знает кто-нибудь, в чём дело?

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  =WareZ= писал(а):
Хм... тут ночью в скриптах копался, и наткнулся на один интересный скрипт

...

А Xr_game.dll можно ли декомпилить. Если да, то чем?

Можно ли? Да.

Чем? Дизассемблером, чем же ещё.

К этому надо знать кучу разных и непростых вещей и иметь _очень_ много свободного времени и аццкого терпенья.

 

  8push5 писал(а):
это лишь регистрация классов прописанных в движке, все настройки классов хранятся тоже в движке

Классы, прописанные в движке, регистрировать не надо. Они и так прекрасно работают. Это регистрация скриптовых серверных классов - создание связки "серверный класс / клиентский класс" и привязка этой пары к определённому clsid.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  =WareZ= писал(а):
то есть при использовании клиентского класса можно теоретически создать новый класс наподобие бинокля(имеется в виду зум и активные рамки), но чтоб NPS воспринимали его как оружие

Не так уж много там можно сделать. Нельзя заменить класс на другой и комбинировать клиентский и серверный в произвольном сочетании. Они должны друг другу строго соответствовать. Поэтому это работает только для тех объектов, для которых есть свой персональный класс, унаследованный от CGameObject. А их не так уж и много, и большинство уже и так там использованы. Кроме того, свой серверный класс надо создавать на основе существующего. при этом ты его не заменяешь, а как бы дополняешь. Там опять же возможности весьма ограничены. Можно дополнительные данные сохранить и ещё кое-что по мелочи. Принципиально изменить поведение объектов невозможно.

 

 

  Stalker Hartman писал(а):
Другого способа показать лог не было

А он разве не в буфере обмена?

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Министр писал(а):
Кстати, в оригинальной геймдате он у меня есть...
  Stalker Hartman писал(а):
Заново распаковал Data Unpacker'ом.Нет файла...

На самом деле нет. Кстати, рекомендую использовать для распаковки плагины для Total Commandera (см. мою подпись). Отдельно взятый файл искать существенно удобнее.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Writer писал(а):
Arguments : LUA error: d:\games\s.t.a.l.k.e.r\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)[/code]

 

Вообще не пойму причем здесь _g.script

_g.script содержит много общих функций, на которые ссылаются из других файлов. Примерно в районе 20-й строки должна быть функция вывода в лог. Видимо она у тебя где-то вызывается и её передаются неправильные аргументы. Хоть бы привёл кусок своего _g.script, а то гадай, что у тебя там в 20-й строке.

 

  andrewrap писал(а):
Товарищи кто может помогите посмотрите мои файлы-пытался заспавнить зомбей в лагере новичков-они не появляются! ссылка выше

Как минимум, неправильно задаются координаты спавна. Для спавна надо указывать координаты и соответствующие этим координатам gvid и lvid. Облёт камерой тебе в этом не поможет. Надо побегать самому и в точках спавна снять эти параметры.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  andrewrap писал(а):
а куда вписывать левел вертекс и гейм вертекс? в уроке про них ничего не сказано

Какую статью ты имеешь в виду? Об этом везде пишут в первую очередь.

alife():create(section, pos, lvid, gvid)

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Gonarh писал(а):
группировка всего лишь одна - woman
:grin2:
  Gonarh писал(а):
народ, могет ли быть такой вылет изза битого сейва

Может быть всё, что угодно. Что такое битый сейв? Это когда в нетпакет при сохранении (а больше ничего не сохраняется) попадает мусор. Это может случиться по нескольким причинам:

- неверный алгоритм. Пишется не то, что читается. Таких ситуаций может быть море и как-то их классифицировать сложно.

- переполнение буфера. Записал слишком много, вышел за пределы нетпакета и наехал на чужие структуры данных. Хотя это обычно вызывает немедленные вылеты, но может вызвать и отложенный вылет.

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

 

Это всё разумеется из области предположений.

 

 

  andrewrap писал(а):
я про статью на официальном мод портале-она называется "спавн через скрипт"

Читай внимательней. Там про левел и гейм вертексы в самых первых строках говорится.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Writer писал(а):
вот немного _g.script

в районе 20-й строки было бы достаточно. Вот этот фрагмент:

function printf(fmt,...)
    log(string.format(fmt,...)) -- это 20-я строка
end

Видим, что ошибка происходит в функции format. У неё должны быть дополнительные аргументы. Но сказать какие, можно только узнав строку fmt. Попробуй вставить туда дополнительную строчку:

function printf(fmt,...)
    get_console():execute(string.gsub(fmt, " ", "_"))
    log(string.format(fmt,...)) -- это 20-я строка
end

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

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  Writer писал(а):
Вот что выдает выше лога

! Unknown command: %s

Это означает, что где-то стоит вызов:

printf("%s", <второй аргумент - строка>)

и этот второй аргумент либо равен nil либо просто отсутствует.

Вот где этот вызов стоит, там и надо копать. Выяснять, почему там не передаётся строка. Мест таких наверняка не одно, но это уже зацепка.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  DimOriN писал(а):
Народ. Кто нибудь пробовал пользоваться фукуцией file_rename ?

    local f1 = getFS():update_path("$game_data$","ai\\test\\a.txt")
    local f2 = getFS():update_path("$game_data$","ai\\test\\a1.txt")
    local overwrite_existing_files = true
    local res = getFS():file_rename(f1, f2, overwrite_existing_files)

Работает. Файл gamedata\ai\test\a.txt.

Кроме $game_data$ есть и ещё пути. Их список можно посмотреть в fs.ltx, хотя вроде как работают не все. "Левые" файлы и каталоги мне удалось сделать и переименовать только в пределах папки gamedata.

 

Дополнение:

Файл должен существовать до запуска игры (до запуска программы, а не загрузки уровня). После уже игра отслеживает изменение имени, но если файл появится во время игры, то игра его проигнорирует.

Изменено пользователем malandrinus
  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  DimOriN писал(а):
ясно, спасиба пыс хотябы за геймдату... я просто пытался переименовывать сейвы... как то не особо получилось =)

Вношу поправку. В папке сейвов тоже работает. Надо использовать корень $game_saves$

Да может и в остальных папках тоже работает. Просто если не работает, то нифига не говорит, поэтому сложно ошибки определять.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  DimOriN писал(а):
есть ли в луа какой нибудь таймер-тормоз на подобие sleep в делфи?

В смысле? Поставь цикл длинный, вот и тормоз будет. Если имеешь в виду поток в суспенд отправить, то этого нет. Функции луа вызываются как подпрограммы движка. Тормозишь функцию луа - тормозишь по любому всю игру.

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  DimOriN писал(а):
нужно наоборот разгрузить машину от сильной нагрузки... погуглил, действительно в луа это проблемный момент ((

Спецификой Lua является то, что сам по себе он не предоставляет почти ничего, только даёт доступ к функциям хост-приложения. Были бы экспортированы, к примеру, функции для создания и синхронизации потоков - были бы потоки. А в самом Lua искать их бессмысленно =)

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  DimOriN писал(а):
Переименовывает сейвы из абра-кадабра-типа-сейв в Имя_Локации__Время

По окончании операции - вылет на раб стол (помогайте ламеру)

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

  Полезный утиль (Показать)

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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