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

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

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


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

  Информация (Показать)

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

 

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

  Читать рекомендуется. (Показать)

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


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

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

 

@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
Ссылка на комментарий

 

 

  Zander_driver писал(а):
оказывается я не умею пользоваться 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
Ссылка на комментарий
  macron писал(а):
       if gluk_object ~= nil

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

 

 

 

  LightOver 12.1 писал(а):
проверка программой на эту строку показывает ещё. 

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

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

 

 

  macron писал(а):
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, зитс импосибл, только движок, только хардкор. Заряди функцию отыгрывания звука, или прямо в движке закостыль свою музяку где-там тебе велят.

Изменено пользователем Карлан
Ссылка на комментарий
local actor = db.actor
local n_s
local slot = actor:item_in_slot(n_s):section()

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

Будет ли сие работать? 

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

@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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

Полезное: модули АртосаXML парсер

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

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

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

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

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

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

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

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

Войти

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

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

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