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

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

macron, скорее, наоборот, забыл уже, как оно раньше было. Посмотрю.

 

 

k01jan,

И отдельно:

 

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

 

Вот тоже сколько раз писалось: не делайте ничего по on_death, кроме минимально необходимого. И даже по апдейту после него не делайте. Минимум 2 секунды выждать, и то - это эмпирика, которая на конкретной машине под конкретный движок получена. Ага, особенно, если "перестрелка яростная".

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

Вопрос по скриптовому ускорению мышиного курсора в UI-менюшках снимается в связи с движковой реализацией данной фичи. :)

  • Нравится 1
Ссылка на комментарий

1. Как средствами LUA реализовать JUMP (или "адресуемый" renurn) ?
2. Функция wait() в Сталкере (или в LUA?) реально работает?
 
Уважаемые долгожители!  (Всех Вам благ и долгих лет!) Не пожалейте для новичка аптечки.
(Мозги уже совсем раком встали - видать контролёру не понравился.)

 

Суть проблемы:

Есть объект (один) - Timer (фактически - будильник), основа взята из amk.script к ТЧ.

Существует некое множество объектов (npc и т.п.), желающих этот Timer использовать.

Задача: вернуть управление  в конкретную точку.  Не представляю в принципе как реализовать???

 Нужен пример кода на  LUA для функций типа:

-- function return_to_caller(return_point, true)  end --  или иной вариант

-- function jump(return_point) end

------[[ return_point = list_name.func_name() ]]-------------------- 

 

P.S. Всем ветеранам с новичка причитается пиво (много!) Вы главное "ни куда не девайтесь"!

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

1.

function fn1( ... ) {здесь могла быть Ваша реклама} end

local t = { ["myfunc1"] = fn1 }

function call_something( name, ... ) if t[name] then t[name]( ... ) end

 

Не подойдет ? А вернется - откуда вызвано. Другое - против идеологии языка, и в общем-то трудно представить: зачем бы оно.

 

2. Я бы не назвал это "работает".

 

3. А зачем здесь спойлер-то ? Под спойлер обычно телеги многобуквенные запихивают, или еще какое видео богомерзкое.

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

@MaXXumyS,

На такой вопрос тебе никто не ответит. Что конкретно ты хочешь?

 

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

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

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

 

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

@Malandrinus,

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

Или посоветуйте какой - нибудь скрипт похожий .

Ссылка на комментарий
@MaXXumyS, Что за батарейка? Элемент питания или артефакт? И что значит "от батарейки"? Слишком неконкретно звучит. Что именно в терминах игры ты хочешь с этой батарейкой сделать? Конкретнее, на пояс разместить, использовать, ещё что-то?
 

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

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

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

 

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

Двумя постами раньше Dennis_Chikin писал:
Не подойдёт? ... Другое - против идеологии языка, и в общем-то трудно представить: зачем бы оно.
 
Не просто подойдет, а просто обалдеть!!! :good:
Результат работы первой строки иначе как глюком (в LUA) не назовёшь. По полочкам ещё не разложил, хотя в какую сторону думать понятно.
 
  Но каков результат его использования!  Применив стандартные средства языка Вы фактически спасли LUA от позора - непригодность для описания акторов (теория акторов/actor/обмен сообщениями - отсутствие стандартных средств поддержки) и, как следствие, непригодность для описания многоагентных систем. Фактически всякий актор может быть определён как самостоятельный поток (программный) высшего логического уровня. В LUA- идеологии можно было пытаться "городить огород" из отдельных "шунков", что в принципе неверно. Либо, как и сделано в игре, "дописывать язык" за счёт подключения собственных Си, ЕХЕ и т.п. модулей.
 
зачем бы оно - Сталкер полноценная (почти) многоагентная система, где каждый "живой" персонаж является актором (кроме объекта "actor"!) и имеет собственный поток (цепочка: obj_id, Logic, xr_logic, binders, bind_tipe_obj). Понятно, что луашные "шунки" авторы использовать не стали. Логическая дыра (возможность взаимодействия потоков) на уровне LUA ни куда не делась. Вы её фактически закрыли. Теперь стало возможным реализовать в игре два отсутствующих у акторов свойства (по определению обязательных!) - способность обмениваться сообщениями и способность воспроизводить себе подобных.
Примеры применения:
1. Gamer (достаточно прокачанный), подходит к любому новичку (выбранному по своему усмотрению) и в процессе обмена сообщениями может научить его стрелять и т.п. При этом авторам игры/мода ничего, кроме общих правил, заранее прописывать не нужно. Замечу, что сами диалоги это лишь имитация такого обмена. Инфопоршны это вообще иная песня. Они, как и Action, должны быть конкретно прописаны заранее (т.е. предусмотрены авторами).
2. Собака-самка (белый цвет) после контакта с псом-самцом (тёмный цвет) может вызвать спавн дополнительных особей в своём гулаге. Если Gamer их заранее не отстреляет, то так и произойдёт. 
 
Ещё раз подчеркну, авторам нужно лишь описать общие принципы (взаимодействия) для классов акторов. и всё!!! После этого зона реально будет жить собственной (уникальной в каждом компьютере) жизнью. При этом Gamer сможет эффективно воздействовать на ход её развития. А жизнь эта - бесконечна (пока не выключили компьютер :D).
 
P.S. Уважаемые, подскажите ни разу не программисту, как подключить спойлер (в личку или на mail). Портянка вместо поста не есть хорошо.

текст["/"spoiler]

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

1. Как средствами LUA реализовать JUMP (или "адресуемый" renurn) ?

Называй пожалуйста язык Lua. Это не аббревиатура, а имя собственное, португальское слово "Луна".

В сталкере - версия Lua 5.1, там goto нет. В любом случае вряд ли ты найдёшь язык, где можно было бы сделать переход в другую функцию (что скорее всего ты и хочешь). Это абсолютно не вписывается в идею структурного программирования. Любой язык, основанный на стеке, текущем контексте и т.п. (а это в общем почти все языки) такого не позволит. В самом деле, как ты себе представляешь переход из произвольной точки программы в другую произвольную точку программы? Каждый оператор в каждой функции выполняется в стеке этой функции с учётом всего окружения, в котором эта функция была вызвана. Более того, это окружение формируется всей предысторией выполнения перед вызовом этой строки. Вне этого окружения и стека этот конкретный оператор попросту не будет работать, а именно это ты и хочешь, из определённого контекста перейти в произвольную точку совершенно другого. Короче, так не бывает.

 

2. Функция wait() в Сталкере (или в LUA?) реально работает?

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

 

Есть объект (один) - Timer (фактически - будильник), основа взята из amk.script к ТЧ.

Существует некое множество объектов (npc и т.п.), желающих этот Timer использовать.

Задача: вернуть управление в конкретную точку. Не представляю в принципе как реализовать???

Конкретно это "вернуть управление в конкретную точку" вообще невозможно. Смотри выше.

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

 

Нужен пример кода на LUA для функций типа:

-- function return_to_caller(return_point, true) end -- или иной вариант

Очень хорошо иллюстрирует невозможность твоего желания. Вот ты переходишь куда-то, да ещё и пытаешься передать туда значение true. А каким образом совершенно произвольная точка программы узнает, что её что-то там передали?

 

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

 

Таким образом ты пытаешься решить свою задачу с использованием несуществующих возможностей. В итоге, приходим к следующему. То, что делается по таймерам, должно быть оформлено как независимые функции, таймеры должны быть разные и в итоге должны вызывать эти разные функции. Каждый таймер в итоге вызовет свою функцию. Задача исчерпана.

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

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

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

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

 

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

MaXXumyS, если интересует собственно соль, то почему-бы не глянуть тему именно в соли, и не взять готовое ? actor_devices.script - там на кончающейся батарейке сделаны миниган и костюм нудиста, и на ту же самую функцию можно повесить что угодно еще.

 

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



Simonov50, подозреваю, что для всего описанного даже и передача функции параметром не нужна.
Просто передавать в функцию объект, и там работать с его переменными:

function fn( obj )
obj.n_used = ( obj.n_used or 0 ) + 1 -- сколько раз с ним что-то делали
end Изменено пользователем Dennis_Chikin
Ссылка на комментарий

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

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

На очереди net_packet. Простой, но весьма важный класс.

..........

Несколько замечаний:

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

Это цитата от поста про object_binder и net_packet. Собственно вопрос: а как узнать структуру нет-пакета? 

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

Здравствуйте. У меня есть очень нестандартный вопрос. Я сейчас ковыряюсь с МП частью ЗП и столкнулся с проблемой пересылки пользовательских сообщений от сервера к клиенту и наоборот. Немного посмотрев в двигатель я понял что сделать это можно, но на ассемблере это займет кучу места и много времени, поэтому хотелось бы сделать это так сказать "нативными" средствами. Для начала нужно рассказать про ограничения в МП:

1) На стороне клиента не виден метод alife() - следовательно нельзя получать серверные объекты. На стороне сервера же мы можем использовать alife()

2) Мы играем на mp_actor, однако на карте все равно присутствует синглплеерный игрок (он невидим, однако его клиентский объект можно получить по id)

3) Что касается биндеров, то у нас вызываются init, net_spawn, net_destroy. С помощью fastcall получилось сделать апгрейд

 

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

Повспоминав методы доступные для game_object я нашел только give_info_portion который отправляет нет_пакет с именем поршня, однако этот вариант сильно ограничен в возможностях

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

@Старлей,

Сейчас существует не один вариант автоматизированной работы с нетпакетом .

Но поскольку хочешь увидеть структуру, то нужно смотреть в ACDC.

Там отслеживать последовательности... В общем вспомнил, что несколько лет назад делал себе утилиту для создания пакета.

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

http://rghost.ru/54850426

А я её удалю наконец, раз на глаза попалась :)

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

Всем доброго времени суток! У меня вопрос: Как сохранить значение переменной при переходах между локациями и загрузкой\сохранением? Дело в том, что я написал ф-цию которая высчитывает некоторое число и присваивает его переменной, далее ф-ция должна будет возвратить истину если игровой час (время в игре) соответствует значению переменной, проблема в том, что при переходе на другую локацию значение переменной "сбрасывается". ТЧ. 
P.S. Я не уверен, но вроде как для таких случаев разработчики прописывали целую систему записи переменных, но как этим пользоваться - я не знаю.

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

Graff46

Сохряняй это значение в pstor актера, и загружай оттуда-же, а pstor автоматически сохраняется в сэйв игры при переходах и сохр\загр.

Алгоритм следующий - в биндере актора в методе actor_binder:save(packet) записываешь свои данные в pstor, а в actor_binder:net_spawn(data) загружаешь. И будет тебе счастье.

  • Нравится 1
Ссылка на комментарий

db.storage[0].pstor.переменная = значение.

 

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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