Перейти к содержанию

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

 
 

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


76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
20 часов назад, ian98 сказал:

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

Вот как вариант - 

Спойлер

function remove_random_item()
  local tbl = {}
  db.actor:iterate_inventory(
    function( dummy, obj )
      if obj then
        table.insert( tbl, obj:id() )
      end
    end
  )
  local rnd  = tbl[ math.random( #tbl ) ]
  local sobj = alife():object( rnd )
  if sobj then
    alife():release( sobj, true )
  end
end

 

Можно вызвать эту функцию из любого диалога. Да и не только из диалога.

Должен предупредить, может удалиться и ПДА либо любой другой важный предмет.

Изменено пользователем Sergey_Belichenko
  • Мастер! 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Sergey_Belichenko попробую. Болт может удалиться? Спрашиваю, ибо болт дается не через character_desc или all.spawn, и я не знаю как он дается гг, скриптом наверное. Да и там вроде стол есть, можно туда вбить список предметов на удаление? 

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

76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 

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

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

Изменено пользователем denis2000
  • Мастер! 1

Путь во мгле. Связь времен.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)

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


Ссылка на сообщение
Поделиться на другие сайты
 
3 часа назад, ian98 сказал:

Болт может удалиться

Да, может. Поэтому лучше использовать такой вариант - 

Спойлер

function remove_random_item()
  local important_objects = {  -- Здесь предметы, которые нельзя удалять
    [ "bolt"       ] = true,
    [ "device_pda" ] = true,
  }
  local tbl = {}
  db.actor:iterate_inventory(
    function( dummy, obj )
      if obj and not important_objects[ obj:section() ] then
        table.insert( tbl, obj:id() )
      end
    end
  )
  local rnd  = tbl[ math.random( #tbl ) ]
  local sobj = alife():object( rnd )
  if sobj then
    alife():release( sobj, true )
  end
end

 

здесь в таблице предметы, которые НЕ удалятся при срабатывании функции. Туда ещё лучше добавить фонарик, нож, бинокль и т.д.

Изменено пользователем Sergey_Belichenko
  • Хабар 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Sergey_Belichenko чет не вышло. Подключал через диалог 

        <action>sweet_rewards.remove_random_item</action>


76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 

ian98 Да, там небольшая ошибочка вышла. Вот так нужно -

Спойлер

function remove_random_item()
  local important_objects = {  -- Здесь предметы, которые нельзя удалять
    [ "bolt"       ] = true,
    [ "device_pda" ] = true,
  }
  local tbl = {}
  db.actor:iterate_inventory(
    function( dummy, obj )
      if obj and not important_objects[ obj:section() ] then
        table.insert( tbl, obj:id() )
      end
    end
  )
  local rnd  = tbl[ math.random( table.getn( tbl ) ) ]
  local sobj = alife():object( rnd )
  if sobj then
    news_manager.relocate_item( db.actor, "out", sobj:section_name() )
    alife():release( sobj, true )
  end
end

 

Должно появится сообщение, в котором будет указан предмет, который удалился.

  • Хабар 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Sergey_Belichenko заработало! Большое спасибо


Дополнено 51 минуты спустя

Sergey_Belichenko А можно ли перевооружить нпс с помощью скрипта? Без чехарды с character_desc.

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

76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
10 часов назад, Sergey_Belichenko сказал:

 

  Код (Показать контент)


function remove_random_item()
  local important_objects = {  -- Здесь предметы, которые нельзя удалять
    [ "bolt"       ] = true,
    [ "device_pda" ] = true,
  }
  local tbl = {}
  db.actor:iterate_inventory(
    function( dummy, obj )
      if obj and not important_objects[ obj:section() ] then
        table.insert( tbl, obj:id() )
      end
    end
  )
  local rnd  = tbl[ math.random( table.getn( tbl ) ) ]
  local sobj = alife():object( rnd )
  if sobj then
    news_manager.relocate_item( db.actor, "out", sobj:section_name() )
    alife():release( sobj, true )
  end
end

 

 

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

Спойлер

function if_actor_has_items(first_speaker, second_speaker)
    return first_speaker:object("wpn_abakan") ~= nil or
             first_speaker:object("wpn_ak74") ~= nil or и т.д

Однако, даже не обращая внимания на геморрой с наполнением предметов в эту проверку, игрок может скинуть свой важный хабар на землю и считерить отдав какой-нибудь мусор со 100% шансом, что расстраивает, наверное, и игрока(ему кажется, что это какая-то нелепая дыра), что расстраивает и меня(мне кажется, что это какая-то дыра). Поэтому, вопрос, можно ли устроить проверку общего количества предметов в инвентаре не зацикливаясь на конкретных предметах? Есть какая-то идеальная строчка? А то я нашел вот такую проверку, она не подходит... Ну, и я ее не очень понимаю, так что может ее можно как-то поправить и будет в самый раз

Спойлер

function название функции(first_speaker, second_speaker)
	local item_sections = {
		["medkit"] = 5, -- к примеру 5 аптечек
		["bandage"] = 2} -- и два бинта
 
	local function calc(temp, item)
		local sect = item:section()
		if item_sections[sect] and item_sections[sect]>0 then
			if item_sections[sect]==1 then
				item_sections[sect] = nil
			else
				item_sections[sect] = item_sections[sect] - 1
			end
		end
	end
 
	db.actor:iterate_inventory(calc, db.actor)
	return next(item_sections)==nil
end 

 

 

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

76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
10 часов назад, ian98 сказал:

А можно ли перевооружить нпс с помощью скрипта?

Можно заспаунить ему ствол с патронами, а выберет ли он его или нет, не знаю.

46 минут назад, ian98 сказал:

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

Можно, в таком случае - 

Спойлер

function remove_random_item()
  local important_objects = {  -- Здесь предметы, которые нельзя удалять
    [ "bolt"       ] = true,
    [ "device_pda" ] = true,
  }
  local tbl = {}
  local cnt = 0
  db.actor:iterate_inventory(
    function( dummy, obj )
      if obj and not important_objects[ obj:section() ] then
        cnt = cnt + 1
        table.insert( tbl, obj:id() )
      end
    end
  )
  if cnt == 0 then return end
  local rnd  = tbl[ math.random( table.getn( tbl ) ) ]
  local sobj = alife():object( rnd )
  if sobj then
    news_manager.relocate_item( db.actor, "out", sobj:section_name() )
    alife():release( sobj, true )
  end
end

 

не будет вылета, если в инвентаре нет предметов. Переменная cnt - это счётчик добавленных в таблицу предметов. Если он останется равным нулю, то функция остановится.

  • Мастер! 1

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


Ссылка на сообщение
Поделиться на другие сайты
 
23 минуты назад, Sergey_Belichenko сказал:

Можно заспаунить ему ствол с патронами, а выберет ли он его или нет, не знаю.

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

character_desc_escape.xml


Дополнено 0 минут спустя
Только что, ian98 сказал:

По аналогии с character_desc только одним файлом для всех нпс разом, или выборочно

 

loot.xml


76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
40 минут назад, ian98 сказал:

Я делаю это с помощью клонирования и молюсь найти способ легче

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

45 минут назад, ian98 сказал:

По аналогии с character_desc только одним файлом для всех нпс разом

Тут нужно подумать. Для одного НПС было бы куда проще, а для всех разом нужно составлять огромную таблицу с предметами, вероятностями, профилями НПС и без недостатков, о которых я написал выше.

  • Печаль 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Всем привет! Кто знает помогите - как называется мод (вроде ТЧ) где нужно в озере, по водой, достать документы из рубки корабля?


                                                                       Прямой дороги тебе, сталкер. Мимо аномалий, через артефакты...
                                                                                                          4-4.gif
                                                    Я всегда хотел отвечать людям добром, но жизнь научала отвечать взаимностью...

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


Ссылка на сообщение
Поделиться на другие сайты
 

Sergey_Belichenko так что, это, получается только character_desc клонировать профили? 

И еще вопрос, вот ты мне подарил эту замечательную функцию на удаление случайного предмета, она работает отлично, но есть несколько вопросов. Первый, а можно ли сделать проверку к этой функции на общее кол-во предметов в инвентаре, например 10, чтобы только от 10 предметов в инвентаре гг ее включать? 

Второй, я клянусь, изменив вот эту строчку

Спойлер

news_manager.relocate_item( db.actor, "out", sobj:section_name() )

я какое-то время вместо потери случайного предмета ПОЛУЧАЛ случайный предмет. Причем это было абсолютно реально, я этим предметом мог пользоваться, и это очень странно, ибо строчка отвечает за уведомление по моим недалеким представлениям. Ключевое здесь это какое-то время. Сейчас я не получаю, а также теряю предмет, а мне просто пишет типо я получил его и все, т.е скрипт заработал как надо. Так вот, вопрос, можно ли выдавать подобной функцией предмет? А то я сейчас пользуюсь, эх, вот этой длиннющей функцией

Спойлер

function thank_you_old (npc, npz)
	local reward_item = math.random(1,191)
	if reward_item == 1 then
		dialogs.relocate_item_section(npc, "wpn_abakan", "in")
	end
	if reward_item == 2 then
		dialogs.relocate_item_section(npc, "wpn_ak74", "in")
	end
...

 

 

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

76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
13 часов назад, ian98 сказал:

получается только character_desc клонировать профили

Ну можно и скриптом, только подумать надо, как его грамотнее составить.

13 часов назад, ian98 сказал:

Первый, а можно ли сделать проверку к этой функции на общее кол-во предметов в инвентаре

Спойлер

 Легко, в этой функции измените строку 


if cnt == 0 then return end

на такую -


if cnt < 10 then return end

 

 

13 часов назад, ian98 сказал:

Так вот, вопрос, можно ли выдавать подобной функцией предмет?

Вот попроще функция - 

Спойлер

function give_to_actor_item( sect )  -- Здесь нужна именно секция предмета
  news_manager.relocate_item( db.actor, "in", sect )
  alife():create( sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id() )
end

 

 

Изменено пользователем Sergey_Belichenko
  • Лайк 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Sergey_Belichenko блин, я легко бы отдал тебе свой галиль из кс гов за 50 баксов, только бы избавить себя от страданий с бесконечным ctrl+c ctrl+v в character_desc конфигах. В закрепе примерно то, что я планирую и очень медленно реализую. Я скинул его на случай, если ты принял мое предложение, вызвался помочь подарив мне этот чудоскрипт

gameplay.rar


76561198152189716.png

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


Ссылка на сообщение
Поделиться на другие сайты
 

Всем привет

Где хранятся состояние голода и кровотечения ГГ?

Пробовал использовать параметр satiety и bleeding, но выдает ошибку на неправильный аргумент

db.actor.bleeding()
db.actor.satiety()
Цитата

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
 

Alex Kireev двоеточие после актора, не точка


В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 

vader_33 ошибку выдает, в месте вызова функции


Дополнено 1 минуту спустя

А почему здесь с точкой?

db.actor.health

 

И в чем различие точки и двоеточия?

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

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


Ссылка на сообщение
Поделиться на другие сайты
 

Alex Kireev посмотрите в lua_help.script,  как там написано. Если написано property - значит, точка после актора и без скобочек в конце. Если написано function - значит, после актора двоеточие и скобочки в конце. Щас не у компа, не могу посмотреть

  • Спасибо 1

В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 

vader_33 спасибо я понял функция и объект

14 минут назад, vader_33 сказал:

посмотрите в lua_help.script,  как там написано. Если написано property - значит, точка после актора и без скобочек в конце. Если написано function - значит, после актора двоеточие и скобочки в конце.

Но я так и не нашел там сытность актера и кровотечение, в файле lua_help нет таких ни функций, ни объектов

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


Ссылка на сообщение
Поделиться на другие сайты
 

Alex Kireev , точно было. Кровотечение вроде так :get_bleeding(), насчёт сытости точно не помню, вроде как свойство с точкой и без скобок (но точно не помню)

  • Спасибо 1

В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, vader_33 сказал:

Кровотечение вроде так :get_bleeding(),

Да, я уже нашел, сейчас тестирую спасибо, осталось только разобраться с голодом актера

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


Ссылка на сообщение
Поделиться на другие сайты
 

Alex Kireev , может насчёт сытости я с зп путаю) Надо будет вечером проверить


В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 

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

Еда есть в рюкзаке и выбирается случайным образом из того что в нем есть

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

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


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу