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

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

Artos, а если в моей функции заместо передачи параметра story_id просто написать npc:id(), не будет ли это чревато последствиями?

 

Не путай игровые ID со 'story_id' иль другими. Это совершенно разные вещи.

Чревато тем, что в данном конкретном случае ты и не пропишешь в конфиг динамически(!) выдаваемый объекту идентификатор и он (ID) обрабатывается именно как 'story_id' (level_object_by_sid). Т.е. придется менять метод.

 

P.S. Поправлюсь, если использовать именно входной аргумент 'npc' - то в принципе подобное возможно.

Тогда и не зачем вводить и определять cNpc, а только (пере)проверить наличие этого объекта (НПС) в игре.

(плз, более информативно задавай вопрос, т.к. 'куцая' информация на некий прежде заданный вопрос порой приводит к 'не вникнул в тему')

--/ Artos

 

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

А перепроверить наличие можно такой функцией?

if npc ~= nil and npc:alive() then

 

1. Это не функция, а условие проверки внутри функции;

2. В принципе можно и так, хотя 'npc:alive()' - излишне, логика для 'уже' трупов все одно не обрабатывается.

Если хочешь 'наверняка', то можно например так:

if npc and level.object_by_id( npc:id() ) then --/ гейм-объект в игре?

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

--/ Artos

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

panzyuza, ColR_iT, Tris

 

Вновь о 'known_info' и выдаче инфопоршня при обыске трупа:

 

1. Как уже ранее писал, этот параметр обрабатывается при спавне объекта (NPC) и сразу же(!) при наличии в нем информации о инфопорiне - этот инфопоршень выдается данному конкретному NPC. Актору(ГГ) этот инфопоршень недоступен.

2. При смерти NPC (обыскать можно только труп) на практике проверено - при обыске трупа актору (ГГ) выдаются все выданные для обыскиваемого NPC инфопоршни. Т.к. процесс такой передачи отсутствует в кодах игры - следует предположить, что данный функционал (передаче всех известных/выданных инфопоршней от НПС актору) прописан в движке.

 

Т.о. используя параметр 'known_info' в конфигах логики НПС или же просто выдавая в процессе игры (в момент 'net_spawn'а) требуемый инфопоршень конкретному НПС можно передавать этот инфопоршень актору в момент обыска трупа этого НПС.

ИМХО, подобное свойство передачи инфопоршня можно использовать далеко не только из логики (требует еще перепроверки нюансов). Простор для идей немаленький. :-)

(еще раз приношу извинения за ранее некорректные выводы основанные на кодах игры без учета функционала движка).

Изменено пользователем Artos
  • Спасибо 1

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

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

Как можно узнать класс возвращаемого функцией объекта?

Допустим функция get_console() вернет объект класса CConsole, но как узнать что именно CConsole, а не какой нибудь еще?

ТЧ 1.0004. SAP и Trans mod

github

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

Desertir, именно тут сравнить, а в произвольном случае - никак

 

рефлексия из этого луабинда выпилена полностью

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

Vita sine libertate, nihil

Vita sine litteris - mors est

Ссылка на комментарий
Desertir, По сути, как уже было сказано RvP, никак. Но... Смотря где и зачем тебе это нужно. Классы всегда можно переопределить (унаследовать), и назначить им дополнительные методы и(или) свойства. Унаследовать можно конечно не все классы, но многие (условий наследования несколько). Есть ещё одно незначительное условие, названия переопределяемых классов придётся поменять, что потребует их переименование во всей скриптовой системе. Изменено пользователем singapur22

Опаа-а!!! Ливер вылез!

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

Доброго времени суток.

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

 

Подойдёт ли такой способ?

[meet]
close_anim = nil
close_snd_hello = nil
close_snd_bye = nil
trade_enable = false
snd_on_use = nil
use = [b]{=check_enemy_name(sim_default) =fighting_dist_ge(20)} false[/b]

 

Задавая вопрос - уточняйте версию игры, если имеются различия для ТЧ/ЧН/ЗП!

 

Прерывание схемы 'meet' происходит автоматически при срабатывании 'combat_ignore' (если не отключено), где и можно задавать дистанции.

 

Условие же для 'use' и не закроет окно диалога, а не даст его открыть.

И необходимо прописывать так, чтобы в любом случае он возвращало 'true' или 'false', т.е. типа:

use = {=check_enemy_name(sim_default) =fighting_dist_ge(20)} false, true

--/ Artos

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

Напомните, какой функцией можно переместить предмет в определённый слот, зарание спасибо.

 

Задавая вопрос, стОит озаботиться тем. чтобы его поняли. И тем более для подобных вопросов следует уточнять версию игры (ТЧ/ЧН/ЗП).

Каждый предмет приписан некоторому слоту и перемещать в 'определенный' (кем?) слот - ну ни как не получится.

Т.е. какому слоту прописан и если он свободен - в тот слот и попадет предмет при его взятии (ТЧ/ЧН).

--/Artos

 

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

> Каждый предмет приписан некоторому слоту и перемещать в 'определенный' (кем?) слот - ну ни как не получится.

В ЗП появились равнозначные слоты (1-2), суть в том, что если поднять предмет, он перемещается во 2 слот оружия, ежели второй слот оружия занят, он не занимает первый слот, хотя должен. Для этого я хочу скриптово поместить оружие в 1 слот. Но вот функцию найти не могу :(

Тест был на автоматах, возможно пистолеты он таки поместит в 1 слот.

 

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

Я заменяю оружие путём его удаления\спауна нового, но при этом граната пропадает...

С патронами проблем нету, а что делать с гранатой?

Метод unload_magazine() выставляет патроны в 0 (чёртовы GSC), надо глянуть как он обращается с гранатой, но подозреваю что также.

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

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

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

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

*Shoker*

Вот и нужно было уточнять версию игры, если имеются некие отличия.

 

Хотя в ЗП и появились равнозначные слоты (а это всего лишь 1 и 2), но сути для оружия не меняет.

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

Предмету прописан конкретный ОДИН слот и именно в него этот предмет может автоматически при 'взятии' помещаться, если 'прописанный' слот свободен. В другой 'разрешенный' слот автоматически предмет не попадет.

Сорри, но функции именно 'ручного' помещения предмета в конкретный слот мне неизвестны.

Судя по 'напомните' в твоем вопросе - тебе они были известны? Может вспомнишь и просвятишь нас?;-)

 

Для работы с подствольными зарядами тебе придется работать с нет-пакетами ... Хотя их наличие можно проверить тем же 'get_ammo_in_magazine()', но при условии установленного режима использования именно подствольника.

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

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

Ссылка на комментарий
Может вспомнишь и просвятишь нас? ;-)
Просто в ЗП при старте игры автоматически предметы кладутся в слоты быстрого юзанья.

Я щас нашёл, оказалось это консольная команда и тока для них :(

(slot_1, slot_2 ...)

 

Для работы с подствольными зарядами тебе придется работать с нет-пакетами
Не просвятишь где именно смотреть, в какой cse_ ? :)

 

но при условии установленного режима использования именно подствольника.
Не вариант. Изменено пользователем ColR_iT
Пользуемся тегами!

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

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

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

*Shoker*

Ну ... при необходимости и достаточности - и консольную команду можно вызывать скриптом. :-)

 

Посмотреть работу с подствольниками и зарядами в них можно, например, в модулях расширеной арены (m_aem.script -> CArenaExt:UnLoad_Shells()) и в менеджере оружия (m_wpn_mgr.script) из Simbion-мода. Не помню, есть ли в исходных оригинальных модах.

 

Примечание: Учитывая, что пакеты для разных классов оружия довольно схожи - возможно и портирование кусков (иль целиком) пакетов от старого к новому объекту ... без их детального разбора. Но конечно же это уже идет конкретика и коды писать под определенные условия.

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

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

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

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

Спавню НПС с такой логикой -

custom_data = <<END

 

[spawner]

cond = {+info_portion_swanp_kvest_adept_1_start}

 

[smart_terrains]

none = true

 

[logic]

on_death = death

active = camper

 

[death]

on_info = %+info_portion_swanp_kvest_adept_1_kill_sniper%

 

[camper]

path_walk = swamp_sniper_merk_walk_1

path_look = swamp_sniper_merk_look_1

sniper = true

END

 

Может кто подсказать проверку на день\ночь? Нужно чтоб он появлялся только ночью, а днём уходил в оффлайн.

 

B штатном 'xr_conditions.script' имеется 'is_day(actor, npc)', но не уверен, что для [spawner] подойдет ...

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

--/ Artos

 

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

 

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

Artos, проверка прекрасно работает и снайпер появляется вечером как часы, спасибо.

 

И ещё вопросик - может кто подсказать как сделать, чтобы при обыске трупа ГГ выдавался инфопоршень?

А поднять глаза чуть выше (пост #2643) - что мешает? --/ Artos

 

Сообщение от модератора ColR_iT
Ребята, ну правда, прочитывайте хотябы страниц пять предыдущих постов!
Изменено пользователем ColR_iT

Prefiero morir de pie, que vivir siempre arrodillado.
 

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

Вопрос по логике (ЗП)

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

 

Командир отряда НЕ назначается, им автоматически становится первый, что был 'принят' в отряд (при спавне).

Пока командир не погибнет или не будет исключен из отряда - никакой демократии!

--/ Artos

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

Использую эту функция как замену str_explode (я думаю многие её уже видели, т.к она тут обсуждалась какое то время назад)

 

function str_expl(sStr, Mode, sDiv, sPattern)
    local tRet = {}
    local sPatt
    if sDiv and  not sPattern then --// если сепаратор  задан: разделяем по нему
    --// если нет шаблона - используем универсальный
    sPatt = '[^%s%'..sDiv..']+'
--// если сепаратор указан как nil, но указан  шаблон: используем его
    elseif not sDiv and  sPattern then
    sPatt=sPattern
    else--/ если сепаратор и шаблон  не указаны: разделяем слова
    sPatt = '[%w%_]+'
    end
    if Mode == nil then --// обычный массив
        for sValue in sStr:gmatch(sPatt) do
            table.insert(tRet, sValue)
        end
    elseif Mode == true then --// таблица '[значение]=true'
        for sValue in sStr:gmatch(sPatt) do
            tRet[sValue] = true
        end
    elseif type(Mode) == "number" then --//таблица '[idx] = число или стринг'
        for sValue in sStr:gmatch(sPatt) do
        tRet[#tRet+1] = tonumber(sValue) or sValue
        end
    end
  return tRet
end

 

 

Суть в чём, есть текст вида X|Какое то название

При таком вызове - str_expl("X|Какое то название", nil, "|", nil), я ожидаю нарезки по | , что и делает старый вариант от АМК, возвращая две строки. Новый вариант разрезает ещё и по пробелам (по крайнем мере мне возвращается вторым аргументом тока первое слово до пробела.)

 

Вопрос: Т.к я не указываю sPattern, я понял что разраезается по этому шаблону: sPatt = '[^%s%'..sDiv..']+'

 

Ну так вот, как мне переделать шаблон, чтобы он по умолчанию учитывал и обрезал только по тому элементу, что я ему дал (в данном случае "|")

Я думаю достаточно (?) просто оставить sPatt = sDiv ? Но пишу я не только из за этого, а просто хочу спросить, можно ли улучшить эту функцию, чтобы обрезала только первый пробел (при условии что он есть)

Тоесть допустим если я передам "X| Какое то название", где есть пробел после |, он вернёт "XI" и "Какое то название" а не "XI" и "акое то название", то есть вернёт 2 строку без учёта первого пробела(ов) после разделителя I

 

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

Очень важно наличие универсальной функции, вариант писать шаблон под каждый str_explode не подходит. (да и не особо я понимаю как их составлять)

 

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

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

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

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

*Shoker*

Без проблем, мог бы и сам подсмотреть в известном тебе моде. ;-)

Заменяем патерн для сепаратора на такой:

sPatt = '%s*([^'..sDiv..']+)' --/ исключая начальные пробелы

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

Более уместно сделать и с его обрезанием:

sPatt = '%s*([^'..sDiv..']+)%s*' --/ исключая начальные и заключительные пробелы

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

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

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

Итого получится такая функция:

function str_expl(sStr, Mode, sDiv, sPattern)
  local tRet = {}
  local sPatt = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам')
  --/ если задан сепаратор: разделяем по сепаратору
  if type(sDiv) == "string" then
    sPatt = '%s*([^'..sDiv..']+)%s*' --/ по разделителю (исключая начальные и заключительные пробелы)
  --/ если указан шаблон: используем шаблон
  elseif type(sPattern) == "string" then
    sPatt = sPattern
  end
  if Mode == nil then --/ обычный массив
    for sValue in sStr:gmatch(sPatt) do
      table.insert(tRet, sValue)
    end
  elseif Mode == true then --/ таблица '[значение]=true'
    for sValue in sStr:gmatch(sPatt) do
      tRet[sValue] = true
    end
  elseif type(Mode) == "number" then --/ таблица '[idx] = число или стринг'
    for sValue in sStr:gmatch(sPatt) do
      tRet[#tRet+1] = tonumber(sValue) or sValue
    end
  end
  return tRet --/> возвращаем таблицу
end

 

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

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

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

Спасибо за исправление :)

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

В частности что это такое - ([^' и прочие комбинации.

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

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

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

В любом справочнике по luа. В сети их не так уж и мало.

Правда сухие фразы определений это плохой помощник для новичка.

Может прийдет вдохновение - напишу подробнее.

 

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

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

Если расставлять приоритеты (в принципе), то борясь за каждую миллисекунду всякими контролями можно пренебречь.

И если я сам пишу код, то наверняка знаю что, куда и как писать. И зачем мне думать, что кто-то там полезет в него и накосячит. Я, например, могу пожертвовать этим ради скорости. Не знают - нечего лезть.

 

Т.е. вот это :

local sPatt = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам')
  --/ если задан сепаратор: разделяем по сепаратору
  if type(sDiv) == "string" then
    sPatt = '%s*([^'..sDiv..']+)%s*' --/ по разделителю (исключая начальные и заключительные пробелы)
  --/ если указан шаблон: используем шаблон
  elseif type(sPattern) == "string" then
    sPatt = sPattern
  end

Я записал бы так (пусть, например, паттерн будет приоритетнее сепаратора):

local sPatt = sPattern or sDiv and '%s*([^'..sDiv..']+)%s*' or '[%w%_]+'

А если уж ставил бы проверки, то тотальные.

Первой же строкой что-то типа :

if not sStr then return '' end

sDiv экранировать спец. символы (вдруг кто-то забыл, не знал)

sPattern в локальной функции сделал бы проверку на корректность составления паттерна (то, что я до сих пор не внёс в script Syntax Checker)

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

Gun12

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

 

Ты конечно прав насчет 'борьбы за лишние милисекунды', но(!) такая борьба возможна только при жестко заданных условиях. И, к сожалению, скорость и универсальность - обычно достигаются взаимоисключающими методами/способами.

 

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

Нечто типа:

function str_expl(sStr, sDiv, Mode, bNoClear)
  if not (sStr and sStr ~= '') then return {} --/> нечего разделять
  local tRet = {}
  local sPattern = '[%w%_]+' --/ дефолтный патерн (разделение по 'словам')
  if type(sDiv) == "string" then --/ если задан сепаратор: разделяем по нему
    if bNoClear then --/ если НЕ указано 'чистить пробелы'
      sPattern = '([^'..sDiv..']+)'
    else --/ иначе с чисткой пробелов
      sPattern = '%s*([^'..sDiv..']+)%s*'
    end
  end
  --/ разделяем строку по патерну
  if Mode == nil then --/ обычный массив
    for sValue in sStr:gmatch(sPattern) do
      table.insert(tRet, sValue)
    end
  else
    local sTypeMode = type(Mode)
    if sTypeMode == "boolean" then --/ таблица '[значение] = true или false'
      for sValue in sStr:gmatch(sPattern) do
        tRet[sValue] = Mode
      end
    elseif sTypeMode == "number" then --/ таблица '[idx] = число или стринг'
      for sValue in sStr:gmatch(sPattern) do
        tRet[#tRet+1] = tonumber(sValue) or sValue
      end
    end
  end
  return tRet --/> возвращаем таблицу
end

 

- в >90% случаев потребуется всего лишь вызов типа str_expl( string, ',' ) - просто, ясно, быстро и надежно. :-)

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

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

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

Добрый вечер, меня интересует такой вопрос:

Можно ли скриптовой функцией применить апгрейд на ствол? Если сие возможно, то какой функцией?

Заранее спасибо.

 

ТЧ, ЧН, ЗП? ColR_iT

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

Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

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

А нету ли технологии, которая бы обьединяла сталкеров в симуляционные отряды с указанием приоритетных смарттерейнов?Скажем так, аналог системы симуляции ЗП, но под ТЧ?

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

 

Собственно это и будет технология. :) ColR_iT

 

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

 

Что же тебя постоянно тянет на флуд и оффтопик? :-)

Подобные вопросы следует адресовать в топиках типа "Ищу моды ы которых ..." иль "Идеи и их реализация"

В данном топике (ИМХО) все же обсуждается конкретика, основанная на уже готовых наработках/кодах/классах.

--/ Artos

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

Artos

Да я вот тоже до сих пор ломаю голову, зачем нужно вот это :

elseif type(Mode) == "number" then --//таблица '[idx] = число или стринг'
        for sValue in sStr:gmatch(sPatt) do
        tRet[#tRet+1] = tonumber(sValue) or sValue
        end
    end

 

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

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

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

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

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

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

Войти

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

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

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