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

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


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

Строгое предупреждение от модератора Halford
Это к чему вообще?

Превью что такое не знаем. Пред в шкалу.

Может как-то так?

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

Товарищи скриптеры, у меня маленькая проблема. Нужна функция которая при вызове рандомно выдает один из 6ти инфопоршней. И проверка, если он выдан то его повторно не выдовать, а выдать другой поршен. 2е и функцию прекондишн, если выданы все 6 поршней то диалог не показывать.

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

max_max_08

как то так делай

таблица поршней - оставляем вверху
local info_random = {"info_1","info_2","info_3","info_4","info_5","info_6"}  

прекондишен типа так 

function check_info()
if (has_alife_info("info_1") and has_alife_info("info_2") and 
has_alife_info("info_3") and has_alife_info("info_4") and has_alife_info("info_5") and has_alife_info("info_6")) then 
return false  -- то есть если все поршни выданы то вернем ложь - прекондишен не выполняется - диалог не появляется 
    end
      return true  --иначе вернем правда
end

рандомные поршни так

function info_rnd()
if not check_info() then  
--проверим есть ли еще не выданные поршни - если нет то прекращаем чтение дабы не получить бесконечный вызов
return end 
--выберем поршень по случайному индексу из всех  индексов таблицы
local info = info_random[math.random(#info_random)]
if not has_alife_info(info) then  --если нет поршня то включим
db.actor:give_info_portion(info)
else
info_rnd() --делаем рекурсивный вызов если условие не выполняется  
end
end

 

функции местами не менять.

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

Подскажите как настраивать мехонический прицел у оружий(при неажатие правой кнопки мыши прицеливание происходит через механический прицел оружия)?

 

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

В принцепе понял как делать но всё не попаду в точку, откос метор на метор. Нет ли спец-проги по такой части или урока по такой часте, или хотяб в каких единицах там измеряется? Заранее спасибо за ответы!)

ЯДиск папка с крутым схроном!

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

Garry_Galler,

function check_info()
return not (has_alife_info("info_1") and has_alife_info("info_2") and has_alife_info("info_3") and has_alife_info("info_4") and has_alife_info("info_5") and has_alife_info("info_6")) 
end

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

Ищешь в папке scripts файл dialogs_*.scripts В него ,в конец файла, копируешь текст.

И в диалоге с каким-то неписем пишешь.

<action>Dialogs_*.ТВОЁ ИМЯ ФУНКЦИИ</action>

* это не знак такой,а окончание имени файла.

 

Изменено пользователем Guzerus
Мой ник читается гузерус.
Ссылка на комментарий

Ребят! подскажите как можно сделать поменьше монстров на локациях? или убрать некоторых совсем? внятного ответа никто дать не может...

Сообщение от модератора n6260
Усыпить. Прописать им бодрствование с 00.00 до 01.00. В моей шпаргалке написано.
Ссылка на комментарий

se_respawn.script - этим всё сказано.

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

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

 

alife():create(section,position,levelvertex,gamevertex)

 

со скриншота возьмешь данные:

levelvertex - lvid

gamevertex - gvid

 

position:

надо создать переменную "position" (имя может быть любое)

local position = vector().set(СЮДА ПИШЕШЬ ТО, ЧТО НА СКРИНЕ ПОСЛЕ СЛОВА "POS" С ЗАПЯТЫМИ)

 

section - не знаю какая секция может быть у тайника - придется тебе поискать

 

+ к этому тебе еще надо найти мануал по тайникам (где-то точно есть)

 

+ вот статья как спавнить, чтобы это появлялось в начале игры:

http://stalkerin.gameru.net/wiki/index.php...D0%B7_db.script

i-igroman.ru - Мой, принципиально новый сайт о компьютерных играх

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

malandrinus

на данный момент "сомнительная" с технической точки зрения идея работает.

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

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

мне интересно у меня все данные только в один пакет пишутся?

то есть если они сохраняются через биндер объекта схрона, то пакет выделяется только один? на объект-схрон вообще или на каждый схрон - вот этого я пока не уяснил...

если на объект вообще - то можно я так понимаю создать несколько однотипных биндеров и каждый вписать в конфиг одного из схронов (пока биндер общий на все - вписан в базовую секцию - остальные наследуются от основной) и затем в каждом биндере сохранять только одну из таблиц - а у меня их сейчас четыре штуки для разных данных.Так?

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

Garry_Galler,

уф... ну давай поговорим о базовых понятиях ООП.

 

То, что написано в файле биндера и то, что указывается в секции - это класс. Класс - это не объект, это описание объекта, тип, если угодно (хотя здесь это не совсем тип). Когда создаётся онлайновый объект, то создаётся объект класса. И к онлайновому объекту прицеплен именно объект. Потому кстати и биндер (binder), что от слова bind (привязывать, присоединять). Ещё раз: у каждого клиентского объекта свой объект биндера, даже если эти объекты одного класса.

С точки зрения синтаксиса дилемма "один класс / много объектов" решается просто. У каждого метода есть скрытый первый аргумент self, в котором методу передаётся ссылка на конкретный объект. Таким образом один и тот-же метод может обслуживать множество объектов. Это достаточно типичный подход, используемый в большинстве современных языков.

Таким образом self - это всегда текущий объект биндера. self.object - это соответственно клиентский объект, к которому этот биндер прицеплен.

 

С нетпакетами ситуация такая. У каждого объекта есть буфер на 8кб, в котором объект хранит своё состояние. Это не нетпакет, а просто буфер. Нетпакет - это просто средство получать и записывать туда информацию. Сам по себе нетпакет - это обычный объект, которой можно создать и который автоматом удалится сборщиком мусора. Ещё раз, данные сохраняются в объекте, через нетпакет они просто туда передаются, для чего имеются методы класса биндера. Если уж быть корректным до конца, то в биндере на чтение используется не нетпакет, а почему-то reader.

На практике терминология постоянно смешивается. Биндером называют и класс и объекты, говорят "сохранить в нетпакете", "сохранить в биндере" и т.п. Это и понятно, трудно в обычном разговоре постоянно сохранять предельную точность.

 

По поводу стиля сохранения. Таки желательно придерживаться верной стратегии:

1. Сохранять минимум информации

2. Сохранять там, где надо.

По первому пункту самая общая рекомендация - избегайте избыточности. Если конкретнее:

- если есть строка, выбираемая из заранее известного набора, то лучше сохранять её номер, а не целиком строку

- если можно что-то вычислить на основе другого, то лучше вычислить

- для логических переменных можно использовать двоичные флажки

Отдельного разговора заслуживают строки. Вообще нужда сохранять именно строки возникает не так уж часто. Между тем, как я заметил, народ почему-то весьма злоупотребляет строками. Как-то видел сохранение массива с переводом его в строку вида "a,b,c,d", сохранением в виде строки, а при чтении элементы распарсивались обратно. Ужас! Нет как правило никакой необходимости сохранять не строковые данные в виде текста. Они при этом занимают больше места и тратится существенно больше времени. Особенно при чтении как в случае с массивом выше, где фактически использовались регулярные выражения (!). Дополнительная неприятность - что место под хранение нужно заранее непредсказуемого размера, что делает невозможным предварительную оценку свободного места в буфере.

 

Насчёт второго пункта соображения простые. Если данные относятся к конкретному объекту, то в нём и надо сохранять ("в его биндере"). Точнее здесь не скажешь. В конкретном случае надо включать мозг и думать, где и как сохранить.

 

 

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

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

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

 

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

дайте полный список гейм\левел вертексов всех уровней

Сообщение от модератора Halford
ОМГ! А зачем левелов? Геймвертексы можно еще с помощью ggtool.pl пробить...
Ссылка на комментарий

В общем вопрос насчёт активации артов: Вот есть у мня арт я его активировал, кинул, появилась ановалия, но аномалия не долго стоит на месте и исчезнает. Вопрос: что сделать чтобы аномалия стояла вечно на месте, (Ну хотябы побольше времени, примерно пол часа по реальному времени) и действовала? Спасибо заранее за ответы!

 

Строгое предупреждение от модератора n6260
Попробуйте писать без ошибок.

 

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

n6260 ок, но главное чтобы было понятно.

ЯДиск папка с крутым схроном!

Ссылка на комментарий
дайте полный список гейм\левел вертексов всех уровней

Про список геймвертексов я здесь писал. Или, как верно говорят, используй ggtool.pl. Левелвертексы можно для текущего уровня перебрать с помошью функции level.vertex_position(i). только так не узнать, сколько их, и это только для текущего. Можно пробежаться по уровням и перебирать до вылета.

Если совсем сильно надо, то смотрим исходники Бардака, и разбираем ручками файл level.ai нужного уровня.

Только в самом деле зачем нужен список из миллионов левелвертексов? Кроме того, от мода к моду списки гейм и левел вертексов меняются.

 

P.S.: Комрады, а зацените, какая нынче мОлодежь пошла. Не как узнать, не какой функцией, не где посмотреть... Дай ему, вынь да положь =)

 

 

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

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

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

 

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

Назрел вопрос. При заходе на локу выдаю инфопоршень и шлю типс. Типс срабатывает да только дважды - два идентичных сообщения.

Все это "висит" на апдейте... Дык вот, куда его "перевесить" или как заставить типс высветится только один раз?

Ссылка на комментарий
P.S.: Комрады, а зацените, какая нынче мОлодежь пошла. Не как узнать, не какой функцией, не где посмотреть... Дай ему, вынь да положь =)

Угу, зажрались товарищи :mad:

 

Вопрос: что сделать чтобы аномалия стояла вечно на месте, (Ну хотябы побольше времени, примерно пол часа по реальному времени) и действовала?

не знаю как правильно, но я в секции [artefact_spawn_zones]

в файле config\misc\artefacts.ltx выставил силу аномалии в 10 раз больше оригинала, и она у меня довольно долго была

 

118 101 110 105 44 32 118 105 100 105 44 32 118 105 99 105
Ссылка на комментарий
Типс срабатывает да только дважды - два идентичных сообщения.

Все это "висит" на апдейте...

Интересно, почему так? Реально выдаётся при следующем апдейте?

Думаю, надо делать это в netspawn. По идее, что переход на другой уровень, что загрузка игры происходят одинаково. При этом актор переходит в онлайн и однократно срабатывает netspawn биндера.

 

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

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

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

 

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

malandrinus

за подробный пост большое спасибо. Не буду лукавить - ООП для меня пока темный лес.

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

 

PS: string.format конечно хорошая функция но...пока с этими модификаторами разберешься - плюнешь и конкатенацию сделаешь :ny_ph34r_1:

вот как мне отформатировать строку из шести строк чтобы там и знаки препинания и пробелы были..

типа такой text = obj_name.." "..verb.." "..adjective.." "..substantive.." "..str.."."..habar.."."

 

monnoroch

решил я сделать девайс для сохранения - объект флешка, куда индивидуально сохраняю только таблицу мессиджей.

Вылетает на охранении 50-го мессиджа (раньше на 45-ом когда сохранял общаком все таблицы в один объект).

 

Не могу понять почему меня не срабатывает проверка перед записью в пакет, что в нем еще есть место.

function flash_binder:save(packet)
if 180 + packet:w_tell() > 8192 then
    news_manager.send_tip(db.actor, "Места для записи больше нет.", 0, "default", 10000)
    return end
    get_console():execute("flash_binder:save")
    object_binder.save(self, packet)
    taynik_rnd.message_save(packet)
end

 

Я что то не так сделал? вообще эту проверку сюда надо вписывать?

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

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

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

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

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

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

Войти

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

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

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