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

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

В продолжение этого поста: http://www.amk-team.ru/forum/index.php?s=&...st&p=683822

Решил получить через getFS() путь к папке с логами игры. Но в лучших традициях сталкера, функция getFS():get_path(string) не работает и вылетает.

Существует ли рабочий способ получить путь к папке с логами?

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

*Shoker*, ну тебе же уже дважды давался по сути прототип доступа к файлу по пути:

local fname = getFS():update_path("$game_saves$", filename..".msf")

- это для твоих сэйвов, если их переместить из искуственно создаваемой тобою папки в "штатную".

Очевидно, что для логов должно быть нечто типа:

local fname = getFS():update_path("$logs$", "xray_"..username..".log")

- где остается подставить для username имя пользователя-игрока (обычно "$user$", но это уже не из Lua).

 

И, если получаешь ошибку при применении заведомо рабочей функции/метода - то приводи контекст кода, а не только констаттируй что "у меня это не работает". Часто неправильное место и/или условия/аргументы являются причиной ошибки.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Как создать скрипт общего спавна?В моде Lost World такой есть(lwc_game_spawn.ltx),через него очень просто предметы и НПС спавнить без каких либо манипуляций с другими файлами,но как такое в оригинале реализовать можно.

Tetris 9in1, 2 кб ОЗУ, 1kHz(одноядерный),2х цветовой широкоформатный дисплей.%C1%EE%FF%E3%F3%E7.gif

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

Всем привет. Как в ЗП сделать, чтобы во время диалога после фразы "давай выпьем" актёр пил водку, даже если в инвентаре её нету?

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

Боягуз, а что мешает сделать аналогично? Впиши весь спавн в одину функцию, а затем в начале игры вызови её.

 

Умный_колобок

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

Спавн делаешь функцией:

alife():create ("vodka", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

"Употребить" водку можно функцией:

db.actor:eat("vodka")

Условия составляешь сам, как тебе нужно.

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

Не все так просто ... Чтобы выпить - бутылка должна быть у актора, а только что заспавненная бутылка - еще не доступна для этого (eat применим к гейм-объектам, а не к серверным).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

 

Как делал:

1. Сначала создал в конфигах вот такую секцию

[zone_restriction]:zone_mosquito_bald
class            = Z_MBALD

min_start_power        = 1
max_start_power        = 1
hit_impulse_scale    = 0.001
effective_radius    = 6.0
hit_type        = telepatic

visible_by_detector = off

artefacts        = 

spawn_blowout_artefacts = off
min_artefact_count    = 0
max_artefact_count    = 0
BirthProbability    = 0.0

 

2. В se_zones прописал спавн объекта с этой секцией при переходе аномалий в онлайн (поле m_restrictor_id сохраняется/загружается в STATE_Read, STATE_Write):

function se_zone_anom:on_spawn()
    cse_anomalous_zone.on_spawn(self)
    if self.m_restrictor_id == 65535 or self.m_restrictor_id == nil then
        local sim = alife()
        if sim then
            local restrictor = sim:create("zone_restriction", self.position, self.m_level_vertex_id, self.m_game_vertex_id)
            self.m_restrictor_id = restrictor.id
        end
    end
end

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

В связи с этим у меня 2 вопроса:

1) Каков радиус аномалии (то есть самого рестриктора) по умолчанию, если я спавню его таким способом?

2) В чём тут ошибка?

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

Полтергейст

1. Какое-то странное понятие у тебя о "двухслойности". Делая простым копированием новую секцию на базе имеющейся - ни о какой "двуслойности" создаваемого не стОит говорить. Если же под "двухслойностью" ты понимаешь спавн в ту же точку, что и исходная аномалия, некоего рестриктора ... то у тебя будет целый "наполеон", т.к. при каждой загрузке в ту же точку у тебя будет спавниться новый "слой" ...

2. Дефолтно при спавне для рестрикторов (и дочерних объектов на базе этого класса) нет ни какого радиуса, т.к. таблица параметров 'shapes' пуста, т.е. зона не имеет ни формы ни иных линейных измерений, зависимых от формы.

Твоя ошибка в том, что взялся "конструировать" не имея представления ни из чего собрался делать, ни что же должно получиться. Вначале почитай материалы на эту тему.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Вопрос, а restrictor_type = 0 это по идее обозначает что рестриктор не является ограничителем? (Not a restrictor в СДК)

Почемуто в ЧН если просто заспавненный через alife() непись цепляет телом такой рестриктор, игра зависает. Если у рестриктора например тип 2 (в ACDC) то всё нормально, но он мешал работать моей скриптовой схеме (НПС из сквадов застревали у границ рестриктора).

 

Как ещё можно убрать у непися все ограничения, не изменяя тип рестриктора, что нужно сделать в скриптовой схеме? Использовать remove_all_restrictions() ?

У меня remove_all_restrictions в схеме есть но вызывается лишь при первом вызове экшена (action_) "бежать в укрытие" в функции initialize()

Может его нужно поставить на апдейт? И насколько вообще опасно убирать у НПС все ограничения, они ему автоматически пропишутся снова, когда моя схема остановится, и НПС вернётся под гулаговую работу?

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Artos

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

Не будет. Я же написал - self.m_restrictor_id сохраняется и загружается, то есть после сохранения/загрузки или перехода в оффлайн повтороного спавна не будет. Двухслойным назвал из-за того, что планировалось сделать, чтобы аномалия была внутри этого рестриктора.

 

таблица параметров 'shapes' пуста, т.е. зона не имеет ни формы ни иных линейных измерений, зависимых от формы.

То есть мне нужно разобрать net_packet'ы и заполнить эту таблицу? В таком случае, можно ли просто скопировать их с аномалии?

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

Полтергейст, все же перепрочти мои последние слова из предыдущего топика ...

Если ты знаешь иной способ доступа к параметрам 'shapes', как не нет-пакеты, то используй его. Но если ты собирешься копировать в "разобранный" нет-пакет, то вспомни, что "скопировать" сможешь, тоже только из такого же "разобранного" нет-пакета аномалии.

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

Ну и, что-то мне подсказывает, что твои сохранения и считывания self.m_restrictor_id - словеса, ничем не подкрепленые, т.к. если и сохраняешь что-то, то опять же в нет-пакете, о котором только сейчас заговорил ... И, учитывая, что доспавниваешь собственно вторую аномалию, а не рестриктор - то у тебя вообще бесконечная цепочка спавна в одну и ту же точку должна получаться, как бы ты ни сохранял. Или ты считаешь, что твоя вторая аномалия в точке не будет также выходить в он-лайн и не будет провоцировать себе же в пару свой "второй-третий слой"? ... и так далее ... ;-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
ColR_iT, Правду говорят,на путь истинный наставить нужно!Ещё вопрос по етому поводу:до какой функции можно прикрутить етот скрипт,чтоб спавн происходил сразу же после начала НИ?Прописать в диалог Сидоровичу ето не то.Думал к заданию "Убить Стрелка" приделать,но я незнаю как к без диалоговым заданиям активацию функции делать.

Tetris 9in1, 2 кб ОЗУ, 1kHz(одноядерный),2х цветовой широкоформатный дисплей.%C1%EE%FF%E3%F3%E7.gif

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

Боягуз, задание "Убить Стрелка" выдаётся через инфопорцию storyline_actor_start, которую актор получает в начале игры. Допиши к выдачи задания и вызов функции при помощи тегов <action></action>.

P.S. Вопрос уже уходит от смысла темы, думаю будет уместным переместится в "ковырялку".

 

[spoiler=To Whisper]Твой вопрос был перемещён в "ковырялку", где ему место.

 

Изменено пользователем ColR_iT
Ссылка на комментарий
*Shoker*, у нас тоже был баг изза restrictor_type = 0, но повисал, судя по всему, апдейт актора, так как все остальное работает исправно, советую тебе попробывать restrictor_type = 3 - самый обычный(стандартный), пыс только его и используют(почти), а у нас, после исправления всех типов на 3 с 0, перестал повисать апдей актора.
Ссылка на комментарий

Как я могу спросить, если NPC мертв в сценарии?

какой из них подходит?

local npc
local npc_dead = db.storage[npc:id()].death

или

npc = level_object_by_sid(p[1])
return not npc or not npc:alive()

или иного сценария?

может ли кто-нибудь сказать мне об этом

спасибо

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

olaf1

Для проверки npc_dead (мертв ли НПС) достаточно:

if npc then
  return npc:alive() == false --/> npc_dead (true)
end

Использовать level_object_by_sid (p[1]) неразумно. Если требуется получить об'ект по его story_id (p[1]), то незачем заморачиваться на излишествах готовой фунции и сделать проще:

local npc = alife():story_object(p[1]) --/< server_object by story_id
if npc and npc.alive then
  return npc:alive() == false --/> npc_dead (true)
else
  return nil --/ NPC not exist (нет в игре)
end

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Как я могу продолжать использовать, потому что, когда я делаю это с помощью скрипта и хочет использовать его в качестве условного if?

Я даже не могу в результате чего я

if npc then
  return npc:alive() == false
end
if npc:alive() == false then
......

кто-то может помочь мне, потому что?

спасибо

 

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

olaf1, сколько вам лет?

Вы задаете такие банальные вопросы, что только тот, кто ничего не читал по Lua не может на них отвечать.

Ведь очевидно же что если требуется однократная поверка внутри скрипта, то это может быть так:

if npc and npc:alive() == false then
...

Вновь советую почитать мануалы по Lua и поупражняться самостоятельно писать постенькие скрипты.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Как то тут писал о том, что у меня местами из за бродячих сталкеров игра (ЧН) зависала.

Я нашёл одну причину - это оказались виноваты рестрикторы с типом 0 (возможно ещё от чего то зависит), попадание одиночного НПС в который вызывало зависание. Но потом я столкнулся с таким же висяком на другой локации (Свалке), в месте, где ни одного рестриктора небыло.

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

 

e58251f421.jpg

 

Собственно уже просто интересно, могут ли быть другие решения для этого случая, кроме как удаление двери? Хотя бы научить непися эту дверь "открывать" хотя по хорошему вообще должна быть закрыта всегда. Или в крайнем случае ходить по кругу внутри огороженного участка АИ сетки. Да тупо в дверь носом упираться.

 

Почему вообще именно эта дверь, которая является обычным физ. объектом, как то влияет на расчёт пути сталкера. Обычно если сталкер встречается с дверью, и она не открывается, он просто прёт напролом, а тут виснет. Значит есть всё же в движке расчёт препятствий получается...

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
и, что-то мне подсказывает, что твои сохранения и считывания self.m_restrictor_id - словеса, ничем не подкрепленые, т.к. если и сохраняешь что-то, то опять же в нет-пакете, о котором только сейчас заговорил ..

Сохранение/загрузка реализованы вот таким кодом:

function se_zone_anom:STATE_Write(packet)
    cse_anomalous_zone.STATE_Write(self, packet)
    packet:w_u16(self.m_restrictor_id)
end
function se_zone_anom:STATE_Read( packet, size )
    cse_anomalous_zone.STATE_Read( self, packet, size )
    self.m_restrictor_id = packet:r_u16()
end

 

у тебя вообще бесконечная цепочка спавна в одну и ту же точку должна получаться, как бы ты ни сохранял. Или ты считаешь, что твоя вторая аномалия в точке не будет также выходить в он-лайн и не будет провоцировать себе же в пару свой "второй-третий слой"?

Так у второй аномалии не скриптовый класс, поэтому класс se_zone_anom её вообще не касается.

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

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

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

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

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

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

Войти

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

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

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