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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Вот попробовал поэксперементировать с ражиацией, вот такое нашлёпал:

function rada()
local actor = db.actor
    if  actor.radiation >= 0.3 then
        if  actor:object("antirad") then
            actor:eat("antirad")
                end 
    end
end

Но не пашет, антирад не используется. Я правильно радиацию проверяю? Вроде всё как описанно но не работает :(

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

В логике есть схема проверки на присутствие конкретного нпс в спейс-рестрикторе:

on_npc_in_zone = npc_story_id | restrictor_name | scheme

А как сделать чтобы условие срабатывало на любого нпс, а не на конкретного?

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

Всем привет, размышлял тут на досуге о создании проводников, чтоб водили по локации без перехода на другую, и пришла в голову такая схема - игрок говорит с проводником, тот соглашается его отвести, отводит, !и вот самое главное! остаётся в том райёне куда отвёл, либо идет к ближайшей точке отдыха\сбора нпс и дожидается гг там пока гг снова не понадобятся его услуги. Со скриптом маломальски допетрил, но вот как написать проводнику такую логику? Да и ещё надо учитывать то, что во время выброса или нападения врагов проводник должен вести себя как обычный нпс - прятаться\отстреливаться. Может кто помочь с написанием логики?

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

TRAMP14

Вариант с использованием файла amk.script

function Get_Visual_by_Wolf()
  local se_obj = alife():story_object(6) --  получаем серверный объект по его sid - в данном случае это Волк
  if se_obj then
    local t = amk.read_stalker_params(se_obj)
    if t ~= nil then
      local vis = t.visual
      vis = amk.str_explode("\\",vis)
      vis = vis[3]
      get_console():execute("Визуал_Волка="..vis)   
    else
      get_console():execute("Ошибка_чтения_визуала_Волка!")
    end
  else
    get_console():execute("Волка_в_игре_НЕТ!")
  end
end

 

 

Автономный вариант

function GetStalkerParams(sobj)
local packet = net_packet()
packet:w_begin(0)
packet:r_seek(2)
sobj:STATE_Write(packet)

local tData ={}
-- Свойства cse_trader
tData.money = packet:r_s32()
tData.profile = packet:r_stringZ()
tData.infammo = packet:r_s32()
tData.class = packet:r_stringZ()
tData.communityid = packet:r_s32()
tData.rank = packet:r_s32()
tData.reputation = packet:r_s32()
tData.charname = packet:r_stringZ()

-- Свойства cse_alife_object
tData.gvid = packet:r_u16()
tData.obf32u1 = packet:r_float()
tData.obs32u2 = packet:r_s32()
tData.lvid = packet:r_s32()
tData.oflags = packet:r_s32()
tData.custom = packet:r_stringZ()
tData.sid = packet:r_s32()
tData.obs32u3 = packet:r_s32()

-- Свойства cse_visual
tData.visual = packet:r_stringZ()
return tData
end 

--// Распечатка всех данных полученной таблицы
function PrintPacket()
local tData = GetStalkerParams(alife():story_object(6))
for k, v in pairs(tData) do 
get_console():execute("load ~ "..string.format("[%s]=%s", k, v))
end
end

Обращение к полю visual аналогично:

local tData = GetStalkerParams(alife():story_object(6))

local vis = tData.visual --// только строка в данном случае будет такого вида actors\neytral\stalker_neytral_balon_1

выпарсить из нее именно название можно как при помощи функции amk.str_explode(), так и при помощи функции StringSplit() ,которую я выкладывал в справочнике.

 

Изменено пользователем Garry_Galler
Ссылка на комментарий
tData.money = packet:r_s32()
tData.profile = packet:r_stringZ()
tData.infammo = packet:r_s32()
tData.class = packet:r_stringZ()
tData.communityid = packet:r_s32()
tData.rank = packet:r_s32()
tData.reputation = packet:r_s32()
tData.charname = packet:r_stringZ()

-- Свойства cse_alife_object
tData.gvid = packet:r_u16()
tData.obf32u1 = packet:r_float()
tData.obs32u2 = packet:r_s32()
tData.lvid = packet:r_s32()
tData.oflags = packet:r_s32()
tData.custom = packet:r_stringZ()
tData.sid = packet:r_s32()
tData.obs32u3 = packet:r_s32()

 

Получается таким же способом можно проверить деньги, вертексы, профили, логику и тп?

p/s/ Нет пакет полезная штука однако :D

p/s/s/ Нашёл в оригинальных скриптах такую строку

wait(цифра)

. Это как в других языках delay или как таймер? Или она вообщене работает?

p/s/s/s/ Спасибо!

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

TRAMP14

Получается таким же способом можно проверить деньги, вертексы, профили, логику и тп?

Именно так.

-----------------------------------------------------------------

wait(time) - это глобальная функция (находится в _g.script) задержки выполнения программы на указанное время (аналог Sleep() в других языках)). Для этого скрипт должен быть запущен как coroutine(подпрограмма) - что это такое читай в документации по lua.

Работает ли в сталкере - трудно сказать, я пробовал ее использовать(давно это было), результатов уже не помню, но по всей видимости ничего полезного не получил :-).

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

TRAMP14,

А можно как либо получить визуал непися?

В ЗП есть функции get_visual_name и set_visual_name. Ну если не ЗП, то через нетпакет, как здесь уже объясняли.

 

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

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

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

 

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

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

local tbl = {bandit = "medkit", stalker = "antirad", killer = "vodka"}
for k, v in pairs(tbl) do
if  common == k then
    alife():create(v, pos, lv, gv, id)
end
end

Скажите пожалуйста я правильно разобрался с таблицами? Или надо по другому?

p/s/ common - группировака непися, сокращённо

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

TRAMP14

В принципе всё верно, и хотя в таблице мало полей, я бы всё-таки после функции спавна поставил break :

if  common == k then
    alife():create(v, pos, lv, gv, id)
    break
end

Ведь если при первом же обороте будет найдено поле, то зачем "крутить" таблицу до конца?

 

Как вариант можно сделать и без pairs.

local tbl = {bandit = "medkit", stalker = "antirad", killer = "vodka"}
local item = tbl[common]
if item then
    alife():create(item, pos, lv, gv, id)
end

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

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

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

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

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

А поподробней можно.Я не скриптер.Но работаю один .Осваиваю.Что,куда,точно,подскажите,как?Просто заселил новые локации,мне нужно много неписей и мутантов респавнить.

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

panzyuza,

Если тебе нужно респаунить НПС, то почитай эту тему, может помочь - http://www.amk-team.ru/forum/index.php?showtopic=5734

 

Модератор(ы) - могу ли я здесь указать ссылку на пост в другой теме, вроде ему(посту) самое место тут - ошибся малость темой.

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

У меня такой вопросик - как сделать, чтобы предметы не прописывались в smart_terrain? Не знаю, как так получается, но в какой-то смарт пытается прописаться какой-нибудь предмет, например, пачка патронов (вызывает register_npc()). Этот глюк, похоже, был и раньше, только smart_terrain.script до редактирования пропускал этот баг (не было отложенного заполнения npc_info -> не вызывались методы, которые есть только у живности), но его ловил amk_offline_alife при вызове npc:alive() (писал, что нет такого метода). Тогда я не обращал на это внимание и просто поставил проверку на наличие функции alive и закрыл на это глаза, оказалось, что зря. Как с этим можно бороться? Фильтрация в suitable(), enabled() и register_npc() не помогает.

 

 

проверять пока он не помрёт и после смерти удалить труп и заспавнить его по новой. И так по кругу

Тогда это нужно делать через se_stalker.script. Отследить по имени секции и при вызове on_death() удалить объект и создать заново. Естественно, удалять только через планировщик отложенного удаления (как в теме про вылеты без логов, только поправить ошибки). Спавнить скорее всего тоже таким же способом, иначе он заспавнится ещё до удаления.

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

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

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

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

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

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

Войти

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

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

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