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

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

Какая игра? По идее трупы монстров должны попадать в общий чистильщик (правда я не видел, где это происходит, так что не уверен, кто в курсе как именно игра их удаляет?) и пропадать по превышению определённого кол-ва тел.

 

Функцию можешь такую:

function clear_monster_corpses()
    for id = 1, 65534 do
        local obj = level.object_by_id(id)
           if obj~=nil and isMonster(obj) and not obj:alive() then
             local sobj = alife():object(id)
             alife():release(sobj, true)
           end
      end
end

 

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

 

 

Кстати, а существует ли способ удалить объект из игры, не получая его серверного объекта?

 

SibireaStalker

ЗП? Тогда квест вроде правильно вызываешь, а вообще стоит сперва попробовать самому вызвать в игре, а если не работает, то тогда уже писать тут. :)

 

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

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

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

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

*Shoker*, учитывая, что все монстры 'биндятся', а это значит, что заносятся в таблицу db.storage, итерировать по всему списку игровых ID расточительно. Достаточно:

for id,v in pairs(db.storage) do
  if level.object_by_id(id) then
    local sobj = alife():object(id)
    if sobj and IsMonster(sobj) and not sobj:alive() then 
      alife():release(sobj, true)
    end
  end
end

 

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

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

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

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

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

Можно ли как-то отключить удаление лута из инвентаря трупов, путём редактирования death_manager.script?

Лучше спросить глупость, чем её совершить.

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

лнкс

Разберись о чем говоришь и что отключать хочешь - тогда переформулируй вопрос.

Loot - ограбление/грабить/мародерствовать

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

Т.о. "удалить лут из инвентаря" невозможно, т.к. это действие (удаление+спавн).

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

 

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

Соответственно и пути решения различны.

 

 

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

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

Удаляются ножи, пда, фонарики,детекторы и прочее. Меня интересует отмена этого удаления. Теперь понятно?

Лучше спросить глупость, чем её совершить.

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

Как выдать квест через логику при вхождении в определенный смарт

 

1. Прочти п.6 в шапке темы.

2. Если ты ждешь готовой статьи или готового кода для твоего решения - думаю что врядли дождешься.

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

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

--/ Artos

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

лнкс

Для однозначного понимания вопроса нехватает еще малости - читаем в шапке:

6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;

Поэтому привожу только один вариант применительно к версии игры ТЧ:

В скрипте 'death_manager.script' в строке 177 (в самом конце функции 'keep_item') закомментируй (поставь впереда строки '--') так:

 

--alife():release(alife():object(item:id()), true)

 

Если иная версия игры иль правленый файл (из мода) - делай по аналогии. Понятно?

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

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

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

Здравствуйте у меня происходит вылет когда заканчивается монолог сидора вот с таким логом

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

Line : 73

Description : <no expression>

Arguments : LUA error: ...hadow of chernobyl\gamedata\scripts\state_mgr.script:145: C stack overflow

 

помогте опредилить почкму вылет?

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

dark_stalker

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

Где-то в кодах у тебя образовалась зацикленность, что приводит к переполнению стека.

Искать и разрывать цикл. Подспорьем может быть определение объекта (имени) в том эвалуаторе из 'state_mgr.script' на который указывает запись в логе и искать циклы связанные с этим объектом.

Но, вполне возможно, что спавнится некий объект (НПС/моб) по некорректной позиции (типа "в стене") и не может выбраться ...

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

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

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

А какой имено обьект опредилить возможно?

Это может быть из за того что я аи сетку изминил?

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

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

Выведи в лог имя объекта 'self.object:name()' в том эвалуаторе, к которому принадлежит строка указанного в логе ошибки - получишь всех, которые движутся. По часто и/или последнему упоминающемуся имени и ищи ...

 

Ну и естественно, сменив сетку AI следует перепроверить/скорректировать все координаты ...

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

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

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

Как узнать код клавиши из user.ltx? Поясню:

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

Freedom

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

_Призрак_

Прочитать файл 'user.ltx' и из него взять значение интересующего тебя параметра (bind wpn_2 k2).

Можно это делать один раз на старте игры, но ... игрок в процессе игры может перебиндить - значит перечитывать стоит 'по выходу' из главного меню.

 

function Read_ScreenResolution()
  get_console():execute("cfg_save tmp") --/ копия/запись настроек из 'user.ltx' в файл 'tmp.ltx'
  local f = getFS() --/ объект класса FS
  local oFile = f:exist("$app_data_root$","tmp.ltx")
  local iSize = oFile and oFile.size_real --/ размер файла (байт)
  if iSize and iSize > 0 and iSize < 8192 then --/ ограничитель размера 'читалки'
    local oReader = f:r_open(oFile.name) --/ объект/линк 'читалки файла'
    if oReader then
      local tSymbols,iByte,i = {},0,0 --/ временный массив и переменные для чтения
      --/ последовательно по-байтно читаем от начала и до конца файла (или до NULL)
      oReader:r_seek(0) --/ устанавливаем 'читалку' в начало
      for i=1,iSize do
        iByte = oReader:r_u8() --/ читаем текущий байт
        if iByte == 0 then --/ нуль-терминатор? (NULL == 0x00)
          break --/ прерываем чтение
        end
        table.insert(tSymbols, string.char(iByte)) --/ конвертируем байт в символ и добавляем в таблицу
      end
      local sStr = table.concat(tSymbols) --/ конкатенация всех символов в единую строку
      --/ вырезаем из строки файла значение искомого параметра
      local sVidMode = sStr:match('vid_mode%s*(%w+)')
      if sVidMode and sVidMode ~= "" then --/ обнаружен?
        print("Read_ScreenResolution:VidMode=[%s]:[%s]", sVidMode, sVidMode, ">") --/> Прочитали!!!
      end
    end
    f:file_delete(oFile.name) --/ удаляем tmp-файл
  end
end

 

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

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

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

Здраствуйте.

Вот создал нового торговца в ЗП, и прописал ему такую логику:

[logic]
prior = 200
active = remark
danger = danger_ignore
level_spot = trader
can_select_weapon = false
trade = misc\trade\trade_otshel.ltx

[danger_ignore]
ignore_distance = 5

[remark]
no_move = true

 

(Если я не ошибаюсь, то торговец должен торговать и стоять на месте.)

Но при подходе к торговцу получаю вылет:

Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....e.r. - Cia I?eiyoe\gamedata\scripts\xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil)

 

(Опять же, как я правильно понял, это неверная логика.)

Подскажите, в чём моя ошибка? Заранее спасибо.

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

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

 

P.S. Пытался обращаться к автору мода, но к сожалению его очень давно нет на форуме, с июня этого года.

 

 

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

Ulman, так ты будешь о-о-очень долго спрашивать.

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

Ну а пока немного общей теории и далее ковыряй самостоятельно:

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

Однако, если величина увеличения здоровья ('eat_health'), которую дает съеденная аптечка недостаточна для достижения порогового значения, по которому определяется ранен ли НПС - то вновь включится схема ранения и НПС примет соответствующую позу.

"Резиновая аптечка", как помнится, именно и предназначена для затягивания процесса выздоравливания (хотя вроде только для актора). Если она (аптечка) в своем конфиге имеет малое значение 'eat_health' - то и не будет вылечивать 'за раз'.

 

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

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

Строка лога ошибки: 'xr_logic.script:939: bad argument #1 to 'gfind' (string expected, got nil)' - говорит о том, что в функцию xr_logic.parse_condlist(npc, section, field, src) не был передан аргумент 'src' (т.е. некое значение параметра для некоей схемы).

Попробуй в начало функции 'parse_condlist' поставить вывод в лог значений npc:name(), section, field - тогда сможешь понять, для какого НПС из какой схемы и в каком параметре у тебя ошибка.

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

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

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

Ulman

Из того что приходит в голову

1) В случае лечения нпс через диалог, вызывать функцию которая принудительно восстановит здоровье непися до нормы

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

У меня в своей реализации постепенно действующих аптечек сделано по второму методу

function relocate_item_section(victim, section, type)

    if db.actor and victim then
        if type == "in" then

            --' Трансферить нужно только квестовые предметы.
            if quest_section[section] == true and
               victim:object(section) ~= nil 
            then
                victim:transfer_item(victim:object(section), db.actor)
            else
                alife():create(section,    
                        db.actor:position(),
                        db.actor:level_vertex_id(),    
                        db.actor:game_vertex_id(),
                        db.actor:id())
            end
        elseif type == "out" then
            if section == "two_medkit" then
            twoteam_usetime.relocate_medkit("two_medkit", "medkit", victim)
            elseif section == "two_medkit_army" then 
            twoteam_usetime.relocate_medkit(section, "medkit_army", victim)
            elseif section == "two_medkit_scientic" then
            twoteam_usetime.relocate_medkit(section, "medkit_scientic", victim)
            else
            db.actor:transfer_item(db.actor:object(section), victim)
            end
        end
        news_manager.relocate_item(db.actor, type, section)
    end
end

 

function relocate_medkit(section, target_section, target)
twoteam.set_rundrop_data(true)
local medobj = db.actor:object(section)
if medobj == nil then return end
if alife() then
local seobj = alife():object(medobj:id())
if seobj then alife():release(seobj, true) end
spawn.inv(target_section, target:id())
end
end

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

 

 

Вопрос такой, при удалении методом alife():release некоторые объекты надо переводить в оффлайн, некоторые можно прямо из онлайна удалять. Кто-нибудь занимался сбором информации, какие надо а какие-нет? Понимаю, вопрос лениво выглядит, но нехватка свободного времени заставляет искать готовый ответ в виде по-возможности полного "справочника" какие надо переводить а какие нет. Заранее спасибо за ответ.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Zander_driver

Думаю нет и не будет потребного для тебя 'справочника' (по многим причинам).

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

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

 

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

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

Заспавнил торговца через смарт терраин. Получил вылет.

Что не так вот здесь:

squad_descr.ltx

 

[darkscape_stalker]:online_offline_group

faction = stalker

sympathy = 1

npc = otshel

target_smart = darkscape_stalker_smart

spawn_point = zat_stalker_base_smart_spawn_barmen

story_id = darkscape_stalker

 

 

darkscape_stalker_smart.ltx

 

[smart_terrain];darkscape_stalker_smart

max_population = 1

 

[exclusive]

;darksape_stalker = darkscape\otshel_logic.ltx

 

 

otshel_logic.ltx

 

[logic@darksape_stalker]

suitable = {=check_npc_name(otshel)} true

trade = misc\trade\trade_otshel.ltx

prior = 200

active = animpoint@bar_les

can_select_weapon = false

level_spot = trader

 

[animpoint@bar_les]

cover_name = zat_a2_sc_barmen

avail_animations = animpoint_stay_table_no_rnd

use_camp = false

meet = meet

combat_ignore_cond = true

combat_ignore_keep_when_attacked = true

invulnerable = true

gather_items_enabled = false

help_wounded_enabled = false

corpse_detection_enabled = false

 

 

 

simulation.ltx

 

;;;;;;;;;;;;;;;;;;;;;;;; darkscape ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[start_position_darkscape]

darkscape_stalker = darkscape_stalker_smart

 

 

 

Секция спавна

 

[124]

; cse_abstract properties

section_name = smart_terrain

name = darksape_stalker_smart

position = 250.339569091797,-0.22316600382328,-195.362701416016

direction = 0.106533996760845,-1.49463295936584,0.104124002158642

 

; cse_alife_object properties

game_vertex_id = 0

distance = 9.80000019073486

level_vertex_id = 58518

object_flags = 0xffffff3e

custom_data = <<END

[smart_terrain]

cfg = scripts\darkscape\smart\darksape_stalker_smart.ltx

END

 

; cse_shape properties

shapes = shape0

shape0:type = sphere

shape0:offset = 0,0,0

shape0:radius = 20

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

; se_smart_terrain properties

 

 

 

Помогите. Бьюсь со смартами уже вторую неделю.... Направте на правильный путь.

Вот лог вылета:

 

Expression : !m_error_code

Function : raii_guard::~raii_guard

File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

Line : 748

Description : ...e.r. - Cia I?eiyoe\gamedata\scripts\sim_board.script:226: attempt to index local 'spawn_smart' (a nil value)

 

 

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

А верcию и патч игры - нам всем Пушкин подскажет?

--/ Artos

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

zoidberg123456789, у тебя почему то нет смарта darkscape_stalker_smart. Проверь запаковал ли ты спавн, без ошибок запаковался ли спавн, не забыл ли ты его потом переименовать из all.spawn.new в all.spawn

 

Указывай, плз, адресата в своем ответе. --/ Artos

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

Freedom

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

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

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

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

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

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

Войти

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

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

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