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

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

@Zander_driver, мне одному кажется что ему просто хит коллбек нужен?

 

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

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

 

 

мне одному кажется что ему просто хит коллбек нужен?

 

 

 

Если надо именно попадание - то можно вообще обойтись хит-колбеком неписей, мутантов, и тех кто тебе еще понадобится (если понадобится). Просто проверить кто нанес хит, и все.

Нет, не одному. Просто когда вопрос как минимум наполовину "для Кашпировских", приходится пытаться угадывать разные варианты.


Вопрос наверно нубский, но, кхм, оказывается я не умею пользоваться string.find...

Короче ситуация:

local pos = string.find(ammo_list,border_symbol,1)
    local ammo_return = {}
    local a = 1
    local spos = 1
while pos ~= nil do
        ammo_return[a] = string.sub(ammo_list, spos, pos - 1)
        spos = pos + 1
        pos = string.find(ammo_list, border_symbol, spos)
        a = a + 1
     end

на входе - ammo_list это строка примерно в 30 символов a..z и 0..9. Так же там _ОДИН_ раз попадается символ точка.
т.е. это строка вида "скрипт.функция"

border_symbol = "." т.е. просто символ точки.

таким образом, string.find должен найти в строке точку. почему он ее находит в каждом символе? на выходе этого кода я получаю таблицу заполненную тридцатью пустыми строками...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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, string.find вторым аргументом принимает шаблон. Шаблон "." означает любой символ. Чтобы получить просто символ точки, её нужно экранировать вот так "%."

 

Вообще может имеет смысл использовать gmatch?

local ammo_return = {}
for sName in ammo_list:gmatch("([^%"..border_symbol.."]+)") do
	table.insert(ammo_return, sName)
end
Изменено пользователем Charsi
  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

 

 

оказывается я не умею пользоваться string.find

Дык матчасть жи, gmatch тут самое оно, да, если-бы тебе просто поиск был нужен то gfind, а у find (string,pattern,index) входные.

Ссылка на комментарий
Можете исправить, где-то накосячил, наверное. Пытаюсь создать скрипт, удаляющий объект по заданным xyz координатам. Непосредственно для уничтожения задействован amk.remove_item. Но до него, наверно, даже не доходит.

 



-- удаление объектов совпадающих по координатам с lvl14_stancia_level_changer_0001  

 

-- координаты объекта для уничтожения

local gluk_object:position() = vector():set(116.575942993164, -0.0990743637084961, 518.794067382813)

local actor = db.actor

local lev_name = level.name()

 

function update()

          if actor and lev_name == lname then

               for i=1,65535 do

 

                       local gluk_object = level.object_by_id(i)

 

                       if gluk_object ~= nil

 

                       amk.remove_item(gluk_object)

 

                       else

                       end

 

                end

           end

end


Изменено пользователем macron
Ссылка на комментарий
       if gluk_object ~= nil

then забыл. и вообще функция довольно странная, что хочешь от нее?

 

 

 

проверка программой на эту строку показывает ещё. 

Ну дык этож очевидно-невероятное, я и не стал указывать, макрон же не новичок.

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

 

 

local gluk_object:position() = vector():set(116.575942993164, -0.0990743637084961, 518.794067382813)

проверка программой на эту строку показывает ещё. 

Изменено пользователем LightOver 12.1
Ссылка на комментарий
функция довольно странная, что хочешь от нее?

Сам скрипт должен вызываться из bind_stalker.script в момент сохранения, дабы удалить объекты совпадающие по координатам с левелчейнжерами (игра иногда генерит такие кривые объекты, использующие координаты и parent_id от левелчейнжера, в результате чего бьются сейвы - рождаются вылеты "child registered but not found"). Соответственно, заранее зная и забив точные координаты всех левелчейнжеров в этот скрипт, можно проблему решить. Пока что отрабатываю саму возможность удаления объектов по заданным координатам. Но проблема в том, что умею только совмещать скрипты, в остальном ни хрена не разбираюсь, поэтому мои функции могут быть чрезвычайно странными. :wacko:

Изменено пользователем macron
Добавлено Dennis_Chikin,

По-моему, при сохранении удалениями заниматься как раз и нельзя.

 

А вообще - level.object_by_id() в цикле, проверка секции предмета, проверка на отсутсвие парента, проверка на попадание в бокс из того же amk.script, ну или на вертекс.

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

@macron, да ниче страшного, гляди, есть такая функция distance_to (и еще distance_to_sqr, думаю чем отличаются ясно), и вот сравниваешь где-то так:

local changer = vector():set(x,y,z) --// тут позишн ченджера
local actor, lev_name, dist = db.actor, level.name()

if actor and lev_name == lname then
for i=1,65535 do
local gluk_object = level.object_by_id(i)
if gluk_object then
dist = changer:distance_to(gluk_object:position())
if dist < 5 then --// 'радиус ченджера' ставишь свой
amk.remove_item(gluk_object)
end
end
end
end

Вызывай только не на апдейте ;).

 

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

@Forser, на дефолте только две стадии: старт и синхронизация, в седьмом альпет вроде что-то делал, но я не пробовал, в любом случае можно сделать самому, в общем читай фак если интересно.

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

@Карлан, нужно что-то типа апдейта загрузчика, тобишь чтоб был апдейтер, работающий только во время загрузки игры. Но как понимаю для этого нужно поправить движок. 

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

@Forser, зитс импосибл, только движок, только хардкор. Заряди функцию отыгрывания звука, или прямо в движке закостыль свою музяку где-там тебе велят.

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

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

 

Попробуй:

function check_slot(n)
if db.actor and db.actor:item_in_slot(n) then
local sect = db.actor:item_in_slot(n):section()
if sect and sect..'' and sect == 'item_section' then
--// action
end
end
end
Изменено пользователем Карлан
Ссылка на комментарий
когда в слоте ничего не будет, то будет вылет

Угу, пошаманю. А конструкцию менять не вариант, так как она не для 1-ной функции.

local actor = db.actor
local n_s
local slot_s = actor:item_in_slot(n_s)
local slot = slot_s:section()

function test()
  n_s = номер_слота
     if actor and slot_s
	if slot == "предмет" then
-- функции
	end
    end
 end

А так будет вылет при отсутствии предмета? 

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

@Forser, будет. И даже целых два, как и в первом варианте.

Во-первых, то, что за пределами функции, выполнится уже при инициализации модуля (если, конечно, не заключено в ещё большую внешнюю функцию). А значит попытается присвоить значение переменной slot_s, которая в случае отсутствия чего-либо в слоте станет равной nil. И следующим действием ты сразу пытаешься взять секцию, что с slot_s = nil даст немедленный вылет.

А во-вторых, уже actor:item_in_slot(n_s) при начальном выполнении даст, скорее всего, вылет, так как переменная n_s ещё не инициализирована.

 

Вот вариант:

local get_slot_section = function(n_s)
  local item = db.actor and db.actor:item_in_slot(n_s)
  return item and item:section()
end

function test()
  local section = get_slot_section(номер_слота)
  if section == "предмет" then
    ...
  end
end
Изменено пользователем Kirgudu
  • Спасибо 1
Ссылка на комментарий
Угу, пошаманю. А конструкцию менять не вариант, так как она не для 1-ной функции

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

Изменено пользователем UnLoaded
  • Нравится 2
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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