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

14.07 около 15.00 форум будет временно отключен для переезда

Скриптование


Svoboда

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

@AndreySol, например, ряд функций в xr_conditions.script - is_alive, is_alive_one, is_alive_all, actor_alive и др.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@_Sk8_AsTeR_, потому что советы надо применять с умом, а не тупо копируя. Если у тебя из диалога вызывается функция, например, такого вида:

function my_func(fs, ss, dn, pi)
  -- какие-то действия
end

где fs и ss - это первый и второй собеседники, а ты внутри функции пишешь, ничего не меняя, npc:object("medkit)", ежу понятно, что переменной npc неоткуда взяться, а искомый персонаж содержится в одной из переменных fs и ss.

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

  • Согласен 2

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

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

Поделиться этим сообщением


Ссылка на сообщение

@_Sk8_AsTeR_, если отвечать по существу вопроса, и если функция give_message_proposed_items вызывается во фразе НПС, тогда:

function give_message_proposed_items(first_speaker, second_speaker)
  if first_speaker:object("medkit") ~= nil then
    -- предмет есть
  else
    -- предмета нет
  end
end

Только тебе вместо "medkit" надо ещё передать в функцию, какой именно предмет ты запрашиваешь, ведь до собственно проверки ты случайным образом берёшь его из таблицы допустимых предметов.

Это первое. А второе - по-хорошему, тебе надо генерить фразы диалога так, чтобы они шли списком: либо "мне нужно 1. это; 2. это; 3. это" от имени ГГ, либо "у меня есть 1. это; 2. это; 3. это" от имени НПС, и с дальнейшим выбором нужного пункта игроком.

Рекомендую взять здесь в скриптах «Чистого Неба» модуль guiders.script и посмотреть, как там реализовано формирование диалога с доступными для перехода точками и выбор из них нужной.

 

Впрочем, не исключено, что кто-нибудь посоветует что-то попроще.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Не стоит игнорировать возможность поискать самому ответы на простые вопросы.

Например, поиск в скриптах оригинала по слову «friend» даёт массу интересных результатов, в том числе dialogs.is_friend(first_speaker, second_speaker) и dialogs.is_not_friend(first_speaker, second_speaker).

Также много полезной информации даст поиск по «enemy» и «relation».

  • Согласен 2

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

function my_spawn()
	-- спавн в инвентаре
	local item = alife():create(section, vector(), 0, 0, db.actor:id())
	-- или спавн где-то снаружи
	-- local item = alife():create(section, position, level_vertex_id, game_vertex_id)
	if item ~= nil then
		level.client_spawn_manager():add(item.id, 0, function (id, obj) obj:set_condition(condition) end)
	end
end

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

  • Полезно 1

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

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

Поделиться этим сообщением


Ссылка на сообщение
3 часа назад, Змея сказал:

как заспавнить НПС скриптом  с одновременным присваиванием СИДа?

Через нет-пакет. Например, с использованием модуля m_netpk от Артоса:

local obj = alife():create(section, pos, lvid, gvid)
if obj then
	local pk = get_netpk(obj, 1)
	if pk:isOk() then
		local data = pk:get()
		data.story_id = p.sid
		pk:set(data)
	end
end

 

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

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

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol, если порыться в самом модуле, можно увидеть, что свойство story_id входит в массив state свойств класса net_cse_alife_object. В то же время в классе net_cse_abstract есть position, direction и др. свойства, но вот именно story_id там нет. Думаю, значение story_id должно прекрасно устанавливаться без дополнительных плясок с бубном, требующихся при работе с абстрактной частью пакета. Мне кажется, что в сопроводиловке к модулю Артос просто описАлся.

Но если я не прав - с удовольствием посыплю голову пеплом. В таком случае в той же сопроводиловке написано, как нужно действовать.

 

10 часов назад, Змея сказал:

Как функцию спавна писать в скрипте?

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

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

 

P.S. По логике: если брать мой пример выше, то содержимое кастом даты можно установить так:

--...
local data = pk:get()
data.custom_data:setString("логика и проч.")
--...

 

Изменено пользователем Kirgudu
  • Согласен 1

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Overfirst, твой пример можно сделать ещё проще, без повторного поиска в массиве: 

--...
if v.id == choice then
--...

А про табуляции отпиши в "вопросы и предложения", сюда админы могут и не заходить. :)

  • Согласен 1

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz, и при чём же тут логическая цепочка? Когда мы пишем "for k, v in pairs(...)", на каждой итерации в переменную k попадает ключ (в нашем случае, например, "good"), а в переменную v - значение (в нашем случае {["price"] = 25*k, ["id"] = 912}), остаётся только сравнить.

Возможно, имеет смысл почитать какую-либо литературу по Lua.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Fenrir02, был такой Dynamic campfire mod от kstn. Посмотри, как там реализовано, и переработай под свои нужды.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@dPlayer, как вариант - событие on_item_take, дальнейший анализ взятого и выдача инфопорции при необходимости.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@dPlayer, ну конечно. Вот сюда: actor_binder:on_item_take (obj). А дальше через секцию объекта или по другим нужным критериям.

Возможно, метод @Charsi более оптимален, но это я подтвердить или опровергнуть не могу.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Graff46, не всё взял, если не ошибаюсь, вот и появились неверные значения. Например, после spawn_story_id должно быть, емнип, чтение визуала (net_cse_alife_dynamic_object_visual).

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

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

Поделиться этим сообщением


Ссылка на сообщение

Вообще, в m_netpk и у меня были связанные с актором непонятки. В этом модуле существуют два класса актора: "net_cse_alife_creature_actor" для ТЧ и "net_se_actor" для ЧН/ЗП. И если с первым классом всё, в принципе, понятно, то, как я обнаружил года полтора назад, для класса "net_se_actor" прописан конструктор от первого класса, "net_cse_alife_creature_actor". Насколько это правомерно с точки зрения языка Lua - сказать не могу, тут нужна помощь специалистов. Собственно, из-за неуверенности и невозможности в то время всё проверить я и не стал ничего править в модуле самостоятельно, хотя стоило, наверное, задать вопрос здесь.

 

@Graff46, по конкретному наполнению нет-пакета актора и смещениям не подскажу - нет сейчас возможности порыться в коде. Но если моё предположение верное, и единственное, почему модуль валится - неверный конструктор, тогда стоит попробовать это исправить и посмотреть, что будет. Ведь что даёт запись двух одинаковых функций "function net_cse_alife_creature_actor:__init(...)" подряд? А то, что первая перезатирается второй, и при инициализации класса для ТЧ начинает вызываться конструктор для ЧН/ЗП.

 

Update:

Цитата

game_death_time: table: 14A05EA8                  -- Тут вроде сбилось?

Нет, тут CTime в виде таблицы, всё правильно. А вот дальше должны быть update-свойства, разве нет? Не помню. (вспомнил: конечно не должны. тут только state-часть)

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Хм, ну ты ж не написал, что у тебя вылет не при чтении пакета, а при записи в лог. :) 

Я тут, кстати, скачал m_netpk и посмотрел код. Обрати внимание, как читаются свойства в классе "net_cse_ph_skeleton":

for _,prop in ipairs(self.st_props) do
	ret[prop.name] = this["_r_"..prop.type](pk)
end
--/ hooks 'bones'
if bit_and(ret.skeleton_flags, 4) ~= 0 then --/ check 'skeleton'
...

Сначала из первой группы свойств, а затем, на основании флагов, из второй и третьей. Ты же в своей переработке все свойства читаешь всегда. Не приведёт ли это к ошибке в один прекрасный момент?
Я б всё-таки попробовал исправить конструктор класса для ЧН/ЗП и проверить чтение нет-пакета актора самим модулем...

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

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

Поделиться этим сообщением


Ссылка на сообщение
Цитата

Ну не знаю, у меня заполнение вроде верное

Потому что соотв. флаг присутствует. Может ли он отсутствовать - понятия не имею, никогда этим не интересовался. Но потенциально твой код допускает ошибку (если, конечно, считать, что код Артоса верен).

Ладно, дальше сам, мне тут сложно теоретизировать без игры. :)

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz, у тебя id заспавненных предметов есть уже сразу после спавна. Зачем корячить ещё и какой-то поиск по десяткам тысяч объектов?

local spawn1 = alife():create( "box_ex", vector():set( (act_pos.x + 1), (act_pos.y), (act_pos.z) ), act:level_vertex_id(), act:game_vertex_id() )
local spawn2 = alife():create( "box_eq", vector():set( (act_pos.x), (act_pos.y), (act_pos.z + 1) ), act:level_vertex_id(), act:game_vertex_id() )
local box_1_id = spawn1.id
local box_2_id = spawn2.id

Возможно, требуется сделать что-то другое, кроме как получить id предметов (например: заспавнить 2 предмета, дождаться выхода в онлайн обоих, после чего что-то сделать с их клиентскими объектами), но тогда опиши человеческим языком, что именно.

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

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

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz, разных способов можно придумать. Например:

Скрытый текст

local spawned = {}

function spawn()
	local act = db.actor
	local item = { "bandage", "medkit" }
	for _,v in ipairs(item) do
		local spawn = alife():create(v, act:position(), act:level_vertex_id(), act:game_vertex_id())
		table.insert(spawned, {id = spawn.id, obj = spawn})
		level.client_spawn_manager():add(spawn.id, -1, test_msg)
	end
end

function test_msg(id, obj)
	if #spawned == 2 then
		for _,v in ipairs(spawned) do
			news_manager.send_tip(db.actor, "obj_section: " .. v.obj:section() .. ", v.id: " .. v.id)
		end
	end
end

 

Кроме того, существует перегрузка метода:

level.client_spawn_manager ():add(spawn.id, -1, spawn_callback, arg)

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

Тогда колбэк будет выглядеть так:

function spawn_callback(arg, id, obj)
	-- переданный дополнительный аргумент идёт первым
end

 

Изменено пользователем Kirgudu
  • Полезно 1

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

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

Поделиться этим сообщением


Ссылка на сообщение
local timer, delta = 0, 10000
local function check_and_execute()
  if timer < time_global() then
    timer = time_global() + delta
    return action_func()
  end
  return false
end

function action_func()
  -- что-то делаем
  -- при необходимости прервать цикл добавляем:
  -- return true
end

-- запуск
level.add_call(check_and_execute, function() end)

 

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
×
×
  • Создать...
⚠ ВНИМАНИЕ! НЕ РЕКОМЕНДУЕМ ПРОИЗВОДИТЬ РЕГИСТРАЦИЮ НА ФОРУМЕ.