Автор обновленного кода: ColR_iT Автор старый вариант кода: Modoskea
Описание: Рандомно выдаем предмет в данном случаи оружие и патроны для него Разбираем на примере создания рандомного оружия при старте: Заходим в папку - gamedata\scripts\ Там находим файл bind_stalker.script Открываем ищем строку (Если кто не знает быстрый поиск Ctrl+F) - actor_binder:net_spawn(data) Данный метод проверяется один раз при создании объекта. Под этим методом есть строка: printf("actor net spawn")
Вот под ними пишем:
self:items_start_random() -- весь код будет в функции items_start_random
Код будет выглядит так:
Код
function actor_binder:net_spawn(data) printf("actor net spawn")
self:items_start_random()
Теперь создаем функцию items_start_random И пишем ее в этом же скрипте под функцию function actor_binder:net_spawn(data) код будет такой :
Код
function actor_binder:items_start_random() local rifles = {"wpn_ak74", "wpn_ak74u", "wpn_bm16", "wpn_toz34", "wpn_mp5"} local pistols = {"wpn_pm", "wpn_pb", "wpn_fort", "wpn_walther", "wpn_hpsa"} --# Кешируем актора. local actor = db.actor --# Проверяем инфопоршень. if has_alife_info("start_item_random") then return end --# Выбираем случайно орижие для обоих слотов. local ra1 = pistols[math.random(#pistols)] local ra2 = rifles[math.random(#rifles)] --# Спавним оба оружия актору в инвентарь. alife():create(ra1, vector(), 0, 0, actor:id()) alife():create(ra2, vector(), 0, 0, actor:id()) --# Для двух выбранных оружий заспавним патроны в разбросе от 1 до 6 пачек к каждому. for num = 1, 2 do local ammo_class = system_ini():line_exist(this["ra"..num], "ammo_class") and system_ini():r_string(this["ra"..num], "ammo_class") local ammo = ammo_class:match("(.*)%,") for i = 1,math.random(1,6) do alife():create(ammo, vector(), 0, 0, actor:id()) end end --# Выдадим инфопорцию, чтобы не спавнить всё это добро при каждой загрузке. actor:give_info_portion("start_item_random") --Выдаем инфо поршень end
Что бы выглядело так:
Код
function actor_binder:net_spawn(data) printf("actor net spawn")
self:items_start_random()
level.show_indicators()
self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.
if object_binder.net_spawn(self,data) == false then return false end
db.add_actor(self.object)
if self.st.disable_input_time == nil then level.enable_input() end
return true end ----------------------------------------------------------------------------------------------------------------------
function actor_binder:items_start_random() local rifles = {"wpn_ak74", "wpn_ak74u", "wpn_bm16", "wpn_toz34", "wpn_mp5"} local pistols = {"wpn_pm", "wpn_pb", "wpn_fort", "wpn_walther", "wpn_hpsa"} --# Кешируем актора. local actor = db.actor --# Проверяем инфопоршень. if has_alife_info("start_item_random") then return end --# Выбираем случайно орижие для обоих слотов. local ra1 = pistols[math.random(#pistols)] local ra2 = rifles[math.random(#rifles)] --# Спавним оба оружия актору в инвентарь. alife():create(ra1, vector(), 0, 0, actor:id()) alife():create(ra2, vector(), 0, 0, actor:id()) --# Для двух выбранных оружий заспавним патроны в разбросе от 1 до 6 пачек к каждому. for num = 1, 2 do local ammo_class = system_ini():line_exist(this["ra"..num], "ammo_class") and system_ini():r_string(this["ra"..num], "ammo_class") local ammo = ammo_class:match("(.*)%,") for i = 1,math.random(1,6) do alife():create(ammo, vector(), 0, 0, actor:id()) end end --# Выдадим инфопорцию, чтобы не спавнить всё это добро при каждой загрузке. actor:give_info_portion("start_item_random") --Выдаем инфо поршень end
Теперь создадим инфо поршень start_item_random думаю тут нечего сложного нет.
Описание: Рандомно выдаем предмет в данном случаи оружие и патроны для него Разбираем на примере создания рандомного оружия при старте: Заходим в папку - gamedata\scripts\ Там находим файл bind_stalker.script Открываем ищем строку (Если кто не знает быстрый поиск Ctrl+F) - function actor_binder:reinit() Данный метод проверяется один раз при создании объекта. Под этим методом есть строка: object_binder.reinit(self)
Вот под ними пишем:
self:items_start_random() -- весь код будет в функции items_start_random
Код будет выглядит так:
Код
function actor_binder:reinit() object_binder.reinit(self)
self:items_start_random()
Теперь создаем функцию items_start_random И пишем ее в этом же скрипте под функцию function actor_binder:reinit() код будет такой :
Код
function actor_binder:items_start_random() local object = self.object -- берем локальную объекта актера за object if not has_alife_info("start_item_random") then --Проверка на отсутствие инфо поршня local wpn_slot2 = { --Локальная с 5 секциями оружия во 2 слот [1] = "ak74", [2] = "ak74u", [3] = "bm16", [4] = "toz34", [5] = "mp5" }; local wpn_gun = { --Локальная с 5 секциями оружия во 1 слот (пистолет) [1] = "pm", [2] = "pb", [3] = "fort", [4] = "walther", [5] = "hpsa" }; local ra1, ra2 = math.random(1,5), math.random(1,5) --две локальные рандома от 1 до 5 alife():create("wpn_"..wpn_gun[ra2], object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) alife():create("wpn_"..wpn_slot2[ra1], object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) -- За счет рандома ra1 выбираем случайное оружие во 2 слот и спавним в инвентарь объекта -- За счет рандома ra2 выбираем случайное оружие в 1 слот и спавним в инвентарь объекта
-- С оружием все оно у нас появляется рандомно, а как же патроны? вот они в низу V for i = 1,math.random(1,6) do -- Тут у нас цикл патроны появиться тоже примерно радомно от 1 до 6 пачек if ra1 <= 2 then --[[Ищем какое нам выдано оружие по родному из локального массива wpn_slot2 и если ак74 или ак74у то спавним патроны 5.45 со стальными идентично -]] alife():create("ammo_5.45x39_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) elseif ra1 == 3 or ra1 == 4 then alife():create("ammo_12x70_buck", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) elseif ra1 == 5 then alife():create("ammo_9x19_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) end if ra2 <= 3 then alife():create("ammo_9x18_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) else alife():create("ammo_9x19_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) end end object:give_info_portion("start_item_random") --Выдаем инфо поршень end end
Что бы выглядело так:
Код
function actor_binder:reinit() object_binder.reinit(self)
function actor_binder:items_start_random() local object = self.object -- берем локальную объекта актера за object if not has_alife_info("start_item_random") then --Проверка на отсутствие инфо поршня local wpn_slot2 = { --Локальная с 5 секциями оружия во 2 слот [1] = "ak74", [2] = "ak74u", [3] = "bm16", [4] = "toz34", [5] = "mp5" }; local wpn_gun = { --Локальная с 5 секциями оружия во 1 слот (пистолет) [1] = "pm", [2] = "pb", [3] = "fort", [4] = "walther", [5] = "hpsa" }; local ra1, ra2 = math.random(1,5), math.random(1,5) --две локальные рандома от 1 до 5 alife():create("wpn_"..wpn_gun[ra2], object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) alife():create("wpn_"..wpn_slot2[ra1], object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) -- За счет рандома ra1 выбираем случайное оружие во 2 слот и спавним в инвентарь объекта -- За счет рандома ra2 выбираем случайное оружие в 1 слот и спавним в инвентарь объекта
-- С оружием все оно у нас появляется рандомно, а как же патроны? вот они в низу V for i = 1,math.random(1,6) do -- Тут у нас цикл патроны появиться тоже примерно радомно от 1 до 6 пачек if ra1 <= 2 then --[[Ищем какое нам выдано оружие по родному из локального массива wpn_slot2 и если ак74 или ак74у то спавним патроны 5.45 со стальными идентично -]] alife():create("ammo_5.45x39_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) elseif ra1 == 3 or ra1 == 4 then alife():create("ammo_12x70_buck", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) elseif ra1 == 5 then alife():create("ammo_9x19_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) end if ra2 <= 3 then alife():create("ammo_9x18_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) else alife():create("ammo_9x19_fmj", object:position(), object:level_vertex_id(), object:game_vertex_id(), object:id()) end end object:give_info_portion("start_item_random") --Выдаем инфо поршень end end
Теперь создадим инфо поршень start_item_random думаю тут нечего сложного нет.
Сообщение отредактировал MODOSKEA - Пятница, 03.01.2014, 20:40
Я вдохновлен) Будут статьи) Дай Бог больше свободного времени и меньше проблем в реале, и мы с Хованом может продолжим PDF-серию уроков по Gui) А я пока "Modmaker's Notes" выпускать буду почаще)
Полезный урок, но... прочитай первую строку моей подписи. Без обид.
ЦитатаMODOSKEA ()
Данная строка проверяется один раз при создании объекта.
Здесь как минимум есть неточности, если смотреть глубже, то это уже ошибки. Во-первых, это не "строка", а метод класса (можно сказать функция, если пугают названия). Во-вторых, этот метод вызывается каждый раз при создании объекта класса actor_binder, т.е. при спавне актора, а спавн происходит далеко не единожды: при начале новой игры, при переходе на новый уровень (точнее когда игрок уже на нём появился) и при каждой загрузке сохранения. Так что метод будет вызываться постоянно и только наличие проверки инофопорции будет препятствием к постоянному спавну чего-нибудь игроку в "карман". Ко всему дописывать для этого целый метод... проще подцепить аналогичную функцию на рестриктор который находился бы под игроком в момент начала новой игры, и при выполнении функции перевести рестриктор в nil, а то и вовсе его удалить - никаких лишних проверок. P.S. вечером скину упрощённый вариант твоей функции тебе в ЛС, посчитаешь нужным - поправишь в шапке, потому как нынешний вариант никуда не годится.
Сообщение отредактировал ColR_iT - Пятница, 03.01.2014, 16:17
Во-первых, это не "строка", а метод класса (можно сказать функция, если пугают названия).
Я частенько путаюсь в словах когда что-то пытаюсь объяснить в тексте, спасибо по правлю
ЦитатаColR_iT ()
не единожды: при начале новой игры, при переходе на новый уровень (точнее когда игрок уже на нём появился) и при каждой загрузке сохранения.
Знаю по этому и стоит поршень.
ЦитатаColR_iT ()
подцепить аналогичную функцию на рестриктор
Знаю, можно но что бы по короче написать вписал сюда. В начале хотел на апдейт повесит но кое кто сказал зачем и я подумал луче сюда, так же привел в перемер себе что можно на рестиктор но решил что так по короче без него напишу
ЦитатаColR_iT ()
P.S. вечером скину упрощённый вариант твоей функции тебе в ЛС, посчитаешь нужным - поправишь в шапке, потому как нынешний вариант никуда не годится. ;)
Спасибо
Сообщение отредактировал MODOSKEA - Пятница, 03.01.2014, 16:23
Да упаси Зона!))) На апдейт можно только если действие постоянно происходит или является стабильным. Например, всякие AddCustomStatic для постоянных элементов худа.
Да упаси Зона!))) На апдейт можно только если действие постоянно происходит или является стабильным. Например, всякие AddCustomStatic для постоянных элементов худа.
ЦитатаMODOSKEA ()
хотел
ЦитатаMODOSKEA ()
подумал луче сюда, так же привел в перемер себе что можно на рестиктор но решил что так по короче без него напишу