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

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

Большинство неписей получают логику из гулага. Бандиты на АТП очевидно в гулаге.

Я вроде бы ясно указал, что в логике бандитов-NPC на АТП в оригинальной ТЧ нет секции on_death. Логика - это всё, что есть у NPC в кастом + всё, что прописано в гулаге смарттеррейна, если, конечно, NPC под гулагом - по-моему, это очевидно.

Я и не думал, что нужно именно сохранить идентификатор убийцы, а всего лишь получить его - прямо сейчас, онлайн. Разумеется, для первого случая придётся воспользоваться pstor. Что же касается

Неужели ради этого кому-то милее лезть в богомерзкие нетпакеты?

Соглашусь.

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

Столкнулся с проблемой. Стоит версия X-ray Extensions 232. Есть 2 одинаковых ствола. На одном установлен прицел. Я пытаюсь с помощью функций изменения значений в памяти объектов (get_wpn_int , set_wpn_int) установить на втором стволе прицел. А именно: копирую значения по смещению 936 ( флаги установленных аддонов) и по смещению 1008 ( зум фактор ). Вроде бы всё нормально: прицел стоит на стволе, но как будто не используется - нету текстуры прицела, а так же не срабатывает смещение худа как в режиме прицеливания . К примеру с подствольником таких проблем не возникло. Вообщем, как активировать на втором стволе нормальное функционирование прицела? Чего не хватает?

... А наше дело маленькое - с ружьём да по болотам. (с)

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

Решил поработать над скриптами. Вот есть такая дефолтная функция.

function load_sound()
	local snd_ini = ini_file("misc\\script_sound.ltx")

	--' Итерируемся по списку тем.
	if not snd_ini:section_exist("list") then
		abort("There is no section [list] in script_sound.ltx")
	end
	local n = snd_ini:line_count("list")
	local id, value = "",""
	local category = ""

	--' начальная установка
	theme = {}

	for i=0,n-1 do
		result, section, value  = snd_ini:r_line("list",i,"","")

		local type = utils.cfg_get_string(snd_ini, section, "type", db.actor, true, "")

		--' Определяем тип звука.
		if type == "npc" then
			theme[section] = npc_sound(snd_ini, section)
		elseif type == "actor" then
			theme[section] = actor_sound(snd_ini, section)
		elseif type == "3d" then
			theme[section] = object_sound(snd_ini, section)
		elseif type == "looped" then
			theme[section] = looped_sound(snd_ini, section)
		end
	end
end 

 

 

Не целесообразней ли будет, хранить таблицу theme,а не собирать ее каждый раз?

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

В параллельной теме обсуждалось только что. Целесообразнее. Но следует еще доработать.

А потом провести ревизию собственно звуков.

 

Как минимум - local snd_ini = ini_file("misc\\script_sound.ltx") вынести из функции.

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

Да, вот только сохранить у меня пока не получилось. se_stor вызванный из start_game_callback напрочь отказывается сохранять что либо.

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

Доброго времени суток, есть такой код:

 

function give_money(victim,who)
--\Добавление с 6.08.10
--\Получение денег за убийства зомби
	if who:id() == db.actor:id() then --для актора
		if victim and (victim:section() == "zombie_trup2" or victim:section() == "zombie_trup" or victim:section() == "zombie_weak" or victim:section() == "zombie_hell13" or victim:section() == "zombie_babka_weak" or victim:section() == "electro_zombie" or victim:section() == "elekt_zomb1") then
local n = math.random(5,40)
dialogs.relocate_money(db.actor,n,"in")
elseif victim and (victim:section() == "zombie_normal" or victim:section() == "zombie_hell14" or victim:section() == "zombie_hell12" or victim:section() == "zombie_hell10" or victim:section() == "zombie_hell1" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie" or victim:section() == "elekt_zomb2" or victim:section() == "elekt_zomb3" or victim:section() == "elekt_zomb4") then
local n = math.random(20,70)
dialogs.relocate_money(db.actor,n,"in")
elseif victim and (victim:section() == "zombie_ghost" or victim:section() == "zombie_blow" or victim:section() == "zombie_beee" or victim:section() == "zombie_hell15" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie_immortal" or victim:section() == "zombie_hell9" or victim:section() == "zombie_hell8" or victim:section() == "zombie_hell7" or victim:section() == "zombie_hell6" or victim:section() == "zombie_hell5" or victim:section() == "zombie_hell4" or victim:section() == "elekt_zomb5" or victim:section() == "elekt_zomb6" or victim:section() == "elekt_zomb5" or victim:section() == "controller_babka") then
local n = math.random(60,110)
dialogs.relocate_money(db.actor,n,"in")
elseif victim and (victim:section() == "zombie_plague_komar" or victim:section() == "zombie_plague" or victim:section() == "zombie_babka_strong" or victim:section() == "zombie_strong" or victim:section() == "ghoul" or victim:section() == "vodjanoj" or victim:section() == "controller_flame" or victim:section() == "elekt_zomb8" or victim:section() == "electro_zombie_0" or victim:section() == "electro_zombie_1" or victim:section() == "electro_zombie_2" or victim:section() == "electro_zombie_3") then
local n = math.random(120,500)
dialogs.relocate_money(db.actor,n,"in")
		end
	end
			if who:id() ~= db.actor:id() and not IsMonster(who) then --\для непися
				if victim and (victim:section() == "zombie_trup2" or victim:section() == "zombie_trup" or victim:section() == "zombie_weak" or victim:section() == "zombie_hell13" or victim:section() == "zombie_babka_weak" or victim:section() == "electro_zombie" or victim:section() == "elekt_zomb1") then
local n = math.random(5,40)
				who:give_money(n)
				game_stats.money_quest_update(n)
				news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000)
elseif victim and (victim:section() == "zombie_normal" or victim:section() == "zombie_hell14" or victim:section() == "zombie_hell12" or victim:section() == "zombie_hell10" or victim:section() == "zombie_hell1" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie" or victim:section() == "carlic_weak" or victim:section() == "vypolzen_red" or victim:section() == "elekt_zomb2" or victim:section() == "elekt_zomb3" or victim:section() == "elekt_zomb4") then
local n = math.random(20,70)
				who:give_money(n)
				game_stats.money_quest_update(n)
--				news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000)
elseif victim and (victim:section() == "zombie_ghost" or victim:section() == "zombie_blow" or victim:section() == "zombie_beee" or victim:section() == "zombie_hell15" or victim:section() == "zombie_babka_normal" or victim:section() == "zombie_immortal" or victim:section() == "zombie_hell9" or victim:section() == "zombie_hell8" or victim:section() == "zombie_hell7" or victim:section() == "zombie_hell6" or victim:section() == "zombie_hell5" or victim:section() == "zombie_hell4" or victim:section() == "elekt_zomb5" or victim:section() == "elekt_zomb6" or victim:section() == "elekt_zomb5" or victim:section() == "controller_babka") then
local n = math.random(60,110)
				who:give_money(n)
				game_stats.money_quest_update(n)
--				news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000)
elseif victim and (victim:section() == "zombie_plague_komar" or victim:section() == "zombie_plague" or victim:section() == "zombie_babka_strong" or victim:section() == "zombie_strong" or victim:section() == "ghoul" or victim:section() == "vodjanoj" or victim:section() == "controller_flame" or victim:section() == "wolf" or victim:section() == "elekt_zomb8" or victim:section() == "electro_zombie_0" or victim:section() == "electro_zombie_1" or victim:section() == "electro_zombie_2" or victim:section() == "electro_zombie_3") then
local n = math.random(120,500)
				who:give_money(n)
				game_stats.money_quest_update(n)
--				news_manager.send_tip(db.actor,who:name().." получил "..n.." рублей", nil, nil, 2000)
			end
		end
end 

 


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

Я пытался убрать под спойлер, но не получилось - код делился пополам и без спойлера. Спасибо.

Изменено пользователем Romann
Добавлено  HellRatz,

Не плохо бы такие полотна под спойлер прятать.

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

@Romann, код, конечно, страшный))

Для начала надо бы кэшировать секцию перед проверкой, чтобы столько раз ее не получать.

И еще, лучше составить таблицу, где секция = количество денег, чтобы столько раз не перебирать elseif...or...then, а брать значения оттуда.

И чтобы было имя из характера, надо делать character_name().

  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
как можно исправить?

Я бы переписал так:

 

 

 



function give_money(victim,who)
    local mon5_40,mon20_70,mon60_110,mon120_500 = math.random(5,40),math.random(20,70),math.random(60,110),math.random(120,500)
    local tbl_zom = {
        "zombie_trup2" = mon5_40,
        "zombie_trup" = mon5_40,
        "zombie_weak" = mon5_40,
        "zombie_hell13" = mon5_40,
        "zombie_babka_weak" = mon5_40,
        "electro_zombie" = mon5_40,
        "elekt_zomb1" = mon5_40,
        "zombie_normal" = mon20_70,
        "zombie_hell14" = mon20_70,
        "zombie_hell12" = mon20_70,
        "zombie_hell10" = mon20_70,
        "zombie_hell1" = mon20_70,
        "zombie_babka_normal" = mon20_70,
        "zombie" = mon20_70,
        "elekt_zomb2" = mon20_70,
        "elekt_zomb3" = mon20_70,
        "elekt_zomb4" = mon20_70,
        "zombie_ghost" = mon60_110,
        "zombie_blow" = mon60_110,
        "zombie_beee" = mon60_110,
        "zombie_hell15" = mon60_110,
--		"zombie_babka_normal" = mon60_110,
        "zombie_immortal" = mon60_110,
        "zombie_hell9" = mon60_110,
        "zombie_hell8" = mon60_110,
        "zombie_hell7" = mon60_110,
        "zombie_hell6" = mon60_110,
	"zombie_hell5" = mon60_110,
	"zombie_hell4" = mon60_110,
        "elekt_zomb5" = mon60_110,
        "elekt_zomb6" = mon60_110,
        "controller_babka" = mon60_110,
        "zombie_plague_komar" = mon120_500,
        "zombie_plague" = mon120_500,
        "zombie_babka_strong" = mon120_500,
        "zombie_strong" = mon120_500,
        "ghoul" = mon120_500,
        "vodjanoj" = mon120_500,
        "controller_flame" = mon120_500,
        "elekt_zomb8" = mon120_500,
        "electro_zombie_0" = mon120_500,
        "electro_zombie_1" = mon120_500,
        "electro_zombie_2" = mon120_500,
        "electro_zombie_3" = mon120_500,
        }
    local zom_sec = victim:section()
    if victim and tbl_zom[zom_sec] then
        if who:id() == db.actor:id() then
            dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
        elseif not IsMonster(who) then
            who:give_money(tbl_zom[zom_sec])
            game_stats.money_quest_update(tbl_zom[zom_sec])
            news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
        end
    end
end 

 

 

Изменено пользователем Serge!
  • Спасибо 1
Ссылка на комментарий

 

 

Я бы переписал так:

Вылетает по вызову этой функции:

 

Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_monster.script:611: attempt to index global 'sk_zombie_life' (a nil value)

 

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

Возможно надо попробовать переписать фрагмент кода 

local zom_sec = victim:section()
    if victim and tbl_zom[zom_sec] then
        if who:id() == db.actor:id() then
            dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
        elseif not IsMonster(who) then
            who:give_money(tbl_zom[zom_sec])
            game_stats.money_quest_update(tbl_zom[zom_sec])
            news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
        end
    end

вот так

if victim then
        local zom_sec = victim:section()
        if tbl_zom[zom_sec] then
            if who:id() == db.actor:id() then
                dialogs.relocate_money(db.actor,tbl_zom[zom_sec],"in")
            elseif not IsMonster(who) then
                who:give_money(tbl_zom[zom_sec])
                game_stats.money_quest_update(tbl_zom[zom_sec])
                news_manager.send_tip(db.actor,who:character_name().." получил "..tostrng(tbl_zom[zom_sec]).." рублей", nil, nil, 2000)
	    end
        end
    end

а вообще лучше бы знать куда Вы это хотите вставить. Я ориентируюсь на оригинал ТЧ. В нём bind_monster.script содержит всего 187 строк, а у Вас ошибка в 611 строке. Очень большая модификация!

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

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

 

 

Вылетает по вызову этой функции:

 

 

Возможно надо попробовать переписать фрагмент кода 

В общем максимум, до работоспособности, получилось сделать так:

 

 

function give_money(victim,who)
local nov_zomb = {
"zombie_trup2",
"zombie_trup",
"zombie_weak",
"zombie_hell13",
"zombie_babka_weak",
"burer_weak",
"fracture_weak",
"oboroten",
"electro_zombie",
"elekt_zomb1"
}
local exp_zomb = {
"zombie_normal",
"zombie_hell14",
"zombie_hell12",
"zombie_hell10",
"zombie_hell1",
"zombie_babka_normal",
"zombie",
"burer_normal",
"vypolzen_red",
"elekt_zomb2",
"elekt_zomb3",
"elekt_zomb4"
}
local vet_zomb = {
"zombie_ghost",
"zombie_blow",
"zombie_beee",
"zombie_hell15",
"zombie_babka_normal",
"zombie_immortal",
"zombie_hell9",
"zombie_hell8",
"zombie_hell7",
"zombie_hell6",
"zombie_hell5",
"zombie_hell4",
"dog_zombie",
"dog_skeleton",
"controller_babka",
"elekt_zomb5",
"elekt_zomb6",
"elekt_zomb7"
}
local mast_zomb = {
"zombie_plague_komar",
"zombie_plague",
"zombie_babka_strong",
"zombie_strong",
"ghoul",
"vodjanoj",
"snork_jumper",
"spider",
"molerat",
"deathclaw_weak",
"controller_flame",
"elekt_zomb8",
"electro_zombie_0",
"electro_zombie_1",
"electro_zombie_2",
"electro_zombie_3"
}
	if who:id() == db.actor:id() then --для актора
    if victim and victim:section(nov_zomb) then
	local n = math.random(5,40)
    dialogs.relocate_money(db.actor,n,"in")
elseif victim and victim:section(exp_zomb) then
	local n = math.random(20,70)
    dialogs.relocate_money(db.actor,n,"in")
elseif victim and victim:section(vet_zomb) then
	local n = math.random(60,110)
    dialogs.relocate_money(db.actor,n,"in")
elseif victim and victim:section(mast_zomb) then
	local n = math.random(120,500)
    dialogs.relocate_money(db.actor,n,"in")
		end
	end
	if who:id() ~= db.actor:id() and not IsMonster(who) then --\для непися
    if victim and victim:section(nov_zomb) then
	local n = math.random(5,40)
				who:give_money(n)
				game_stats.money_quest_update(n)
				news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", nil, nil, 2000)
elseif victim and victim:section(exp_zomb) then
	local n = math.random(20,70)
				who:give_money(n)
				game_stats.money_quest_update(n)
				news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", nil, nil, 2000)
elseif victim and victim:section(vet_zomb) then
	local n = math.random(60,110)
				who:give_money(n)
				game_stats.money_quest_update(n)
				news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", 0, 15, nil, nil, 2000)
elseif victim and victim:section(mast_zomb) then
	local n = math.random(120,500)
				who:give_money(n)
				game_stats.money_quest_update(n)
				news_manager.send_tip(db.actor,who:character_name().." получил "..n.." рублей", 0, 15, nil, nil, 2000)
			end
		end
end

 

 

 

 

а вообще лучше бы знать куда Вы это хотите вставить. Я ориентируюсь на оригинал ТЧ. В нём bind_monster.script содержит всего 187 строк, а у Вас ошибка в 611 строке. Очень большая модификация!

ОП-2 это ).

П.С.: Подскажите как поменять цвет текста, выводимых сообщений?

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

 

 

В общем максимум, до работоспособности, получилось сделать так:

Нет комментариев.

 

 

Подскажите как поменять цвет текста, выводимых сообщений?

Не знаю, но думаю что никак, т.к. это функция движка.

Ссылка на комментарий
Подскажите как поменять цвет текста, выводимых сообщений?

news_manager.send_tip(db.actor, "%c[255,255,128,128]Текст 1:\n%c[default]Текст 2", nil, nil, 1000) 

 

где:

%c[255,255,128,128] - это цвет сообщения. 

%c[default]- это конец кода цвета сообщения, дальше текст идёт в стандартном цвете.

\n - перенос строки.

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

@TIGER_VLAD, Спасибо! (модераторам, про кнопочку спасибо я знаю), век живи - век учись.

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

Привет ребята! Сам в Lua мало понимаю, так что спрошу тут)

Требуется сделать небольшую вещь - нужно выполнять произвольный код 3 раза за игровые сутки. Без условий.

И да, 3 раза рандомно за 24 часа, т.е в какой час - только math.random.

 

Я максимум что смогу время игровое получить, но как потом проверку в игре делать, в bind_stalker.update() записать -  не всегда прокатывает...

В общем жду от вас помощи :)  

Не соответствует правилам.

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

@vampirnik77, а зачем, простите, сохранять в se_stor? неужели недостаточно собрать таблицу один раз при запуске игры / нетспавне актора и просто в памяти ее хранить.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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, Я еще плохо разбираюсь, но разве при загрузке сохранок память не очищается? 

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

Всем привет, подскажите пожалуйста скрипт для пропуска квестовых нпс. Ну к примеру есть определённая схема, и нужно чтоб она не применялась к квестовикам (ну вот как уборщик не убирает трупы квестовиков), есть таблица квест. нпс:

local quest_nps = {
...,
...,
...
}

Подскажите код, чтобы схема пропускала эту таблицу, и не срабатывала на кв. нпс..

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

@Romann, могу только предположить, что в таблице квестовых NPC будут указаны их имена. Тогда, если нам требуется обработка всех сталкеров (серверных объектов, на всех локациях):

local quest_npc = {}
for a=1,65535 do
local obj = alife():object(a)
  if obj then
   if IsStalker(obj) then
    if not quest_npc[obj:name()] then
     -- обработчик сталкера - серверного объекта
    end
   end
  end
end

Если же требуется обработка именно сталкеров-NPC (они доступны только на текущей локации), тогда:

local quest_npc = {}
for a=1,65535 do
local obj=level.object_by_id(a)
  if obj then
   if IsStalker(obj) then
    if not quest_npc[obj:name()] then
     -- обработчик сталкера - NPC
    end
   end
  end
end
  • Спасибо 1
Ссылка на комментарий

Помогите с похожей проблемой: добавил авторазряжалку в ТТ2 и она весьма не кстати разряжает гравипушку(wpn_gravigun) на классе WP_SVD и  огнемет(wpn_flame) на классе WP_LR300. Как понял, скрипт работает именно с классами оружия, а не по названию.  Поправте, пожалуста, код, чтобы он не разряжал гравипушку и огнемет. 

Авторазряжалка:

-- 08.04.2016

-- KroshkaRoo aka Romz
-- TS MOD для SoC вообще и ОГСЕ в частности.

--TS MOD для COP-- накопировано и накнопано Tonny S. (aka Tonny на AMK-форуме)
--часть функций или их частей выковыряна из AMK, скриптов SAK и др.

--[[--
для использования авторазряжалки следует:
- в скрипте bind_stalker.script:
- function actor_binder:net_spawn(data)
в конец добавить
ts_mod_soc.ts_on_net_spawn() --TS_MOD--

- function actor_binder:take_item_from_box(box, item)
в конец добавить
ts_mod_soc.ts_on_item_take(item) --TS_MOD--

- function actor_binder:on_item_take (obj)
в конец добавить
ts_mod_soc.ts_on_item_take(item) --TS_MOD--

- function actor_binder:on_item_drop (obj)
ts_mod_soc.ts_on_item_drop(obj) --TS_MOD--

- в скрипте _g.script
- function start_game_callback()
в конец добавить
ts_mod_soc.ts_init_module() --TS_MOD--
--]]--

local notest_time = 0

local weapon_classes_w_ammo = {}

--список аммо для каждой секции. по сути кэш
local weapon_ammo = {}

--лог в текстовый файл
function ts_log(src,msg)

local g_time = game.get_game_time()
local t = game.CTime()

t:set(2012,5,1,0,0,1,1)
local t_diff = g_time:diffSec(t)

local f=io.open("ts_log.txt","a")
--local c_time = time_global()
f:write(string.format("(%s) = %s => %s " ,t_diff,src,msg),"\n" )
f:close()

--[[--
if get_console() then
local msg_no_ws = string.gsub("=="..src.."==>"..msg, "%s", "_")
get_console():execute(msg_no_ws)
end
--]]--

end

function ts_init_module()

weapon_classes_w_ammo = {
[clsid.wpn_ak74] = true,
[clsid.wpn_ak74_s] = true,
[clsid.wpn_bm16] = true,
[clsid.wpn_bm16_s] = true,
[clsid.wpn_fn2000] = true,
[clsid.wpn_fort] = true,
[clsid.wpn_grenade_launcher] = true,
[clsid.wpn_groza] = true,
[clsid.wpn_groza_s] = true,
[clsid.wpn_hpsa] = true,
[clsid.wpn_hpsa_s] = true,
[clsid.wpn_lr300] = true,
[clsid.wpn_lr300_s] = true,
[clsid.wpn_pm] = true,
[clsid.wpn_pm_s] = true,
[clsid.wpn_rg6] = true,
[clsid.wpn_rg6_s] = true,
[clsid.wpn_rpg7] = true,
[clsid.wpn_rpg7_s] = true,
[clsid.wpn_shotgun] = true,
[clsid.wpn_shotgun_s] = true,
[clsid.wpn_stat_mgun] = true,
[clsid.wpn_svd] = true,
[clsid.wpn_svd_s] = true,
[clsid.wpn_svu] = true,
[clsid.wpn_svu_s] = true,
[clsid.wpn_usp45] = true,
[clsid.wpn_usp45_s] = true,
[clsid.wpn_val] = true,
[clsid.wpn_val_s] = true,
[clsid.wpn_vintorez] = true,
[clsid.wpn_vintorez_s] = true,
[clsid.wpn_binocular] = false,
[clsid.wpn_binocular_s] = false,
[clsid.wpn_grenade_f1] = false,
[clsid.wpn_grenade_fake] = false,
[clsid.wpn_grenade_rgd5] = false,
[clsid.wpn_grenade_rpg7] = false,
[clsid.wpn_knife] = false,
[clsid.wpn_knife_s] = false,
[clsid.wpn_mounted] = false}

--for k,v in pairs(weapon_classes_w_ammo) do

end


function is_weapon_w_ammo(object)
local id = get_clsid(object)
if id then
-- if weapon_classes_w_ammo[id] then ts_log("is_weapon_w_ammo\t\t", "ID "..tostring(id).. " object "..object:name()) end
return weapon_classes_w_ammo[id] == true
else
-- ts_log("is_weapon_w_ammo\t\t","ERR.is_weapon_w_ammo:id=nil")
return false
end
end

function ts_get_weapon_ammo_type(sobj)

local stpk=net_packet()

cse_alife_item_weapon.STATE_Write( sobj, stpk )
local size=stpk:w_tell()

stpk:r_seek(size-1)

return stpk:r_u8()
end

-- упрощённый вызов новости
function ts_tip(news_caption, msg, showtime, timeout)

local news_text = "#системная ошибка. перезагрузите ваш PDA"
local texture = "ui\\ui_iconsTotal"

if msg then
news_text = msg
end

if timeout == nil then timeout = 0 end
if showtime == nil then showtime = 5 end
if timeout == 0 then
local player = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])
-- ' Играем дефолтный звук
player:play(db.actor, timeout, sound_object.s2d)
end
local ts_news = news_caption.."\\n"..news_text
db.actor:give_game_news(ts_news, texture, Frect():set( 0, 658, 83, 47), timeout*1000, showtime*1000)
end

--взято с OGSM
function spawn_ammo_in_inv(section,number,npc)
if npc==nil then
npc=db.actor
end

-- ts_log("spawn_ammo_in_inv","sect ["..tostring(section).."] npc ["..npc:name().."]" .."\n".."position [ x = "..tostring(npc:position().x)..", y = "..tostring(npc:position().y)..", z = "..tostring(npc:position().z).."]".."\n".." level_vertex_id ["..tostring(npc:level_vertex_id()).."]" .."\n".." game_vertex_id ["..tostring(npc:game_vertex_id()).."]" .."\n".." npc ID ["..tostring(npc:id()).."]" .."\n".." number ["..tostring(number).."]")
if number > 0 then
return se_respawn.create_ammo(section,
npc:position(),
npc:level_vertex_id(),
npc:game_vertex_id(),
npc:id(),
number)
end
end

function ts_ammo_discharge(wpn)
local name = wpn:name()
local ammo_count = wpn:get_ammo_in_magazine()
if ammo_count>0 then
local ammo_type = ts_get_weapon_ammo_type( alife():object(wpn:id()))
-- ts_log("ts_ammo_discharge\t\t", name.." ammo_count = "..ammo_count.." ammo_type = "..ammo_type)
local section_ammo = ts_ammo_by_num(wpn:section(),ammo_type)
if section_ammo~=nil and string.find(section_ammo,"ammo") then
local str1 = string.format(" Боеприпас %s (%d шт.)",game.translate_string(string.gsub(section_ammo,"_","-").."_s"), ammo_count)
-- ts_log("ts_ammo_discharge\t\t",str1)
ts_tip("Патроны",str1)
spawn_ammo_in_inv(section_ammo, ammo_count, nil)
wpn:unload_magazine()
else
if section_ammo == nil then
section_ammo = ""
end
ts_log("ts_ammo_discharge\t\t", "Object = "..name.." Ammo section fail: "..section_ammo)
end

end
end

function parse_names_mod( s )
local t = {}

--отсечка коментария
local pos = string.find(s,";")
local ps = ""
if pos ~= nil and pos > 0 then
ps = string.sub(s,1, pos - 1)
else
ps = s
end

for name in string.gfind( ps, "([%w_.\\-]+)%p*" ) do
table.insert( t, name )
end

return t
end

--найти аммо по номеру
function ts_ammo_by_num(section, num)
local ammo_list

if weapon_ammo[section] ~= nil and weapon_ammo[section] ~= "" then
ammo_list = weapon_ammo[section]
-- ts_log("ts_ammo_by_num",section.." => Found: "..ammo_list)
else
local ltx = system_ini()
ammo_list = ltx:r_string(section,"ammo_class")
weapon_ammo[section] = ammo_list
-- ts_log("ts_ammo_by_num",section.." => Loaded: "..ammo_list)
end

-- for n,v in pairs(parse_names(ammo_list)) do ts_log("ts_ammo_by_num","....."..n.." -> "..v) end

local t=parse_names_mod(ammo_list)

local cnt = table.getn(t)
if cnt == 0 then
return nil
elseif num >= cnt then
return t[1]
else
return t[num+1]
end

end

function test_discharge_weapon(ItemObj)
if ItemObj == nil then
return false
end
-- ts_log("test_discharge_weapon\t",ItemObj:name())

if notest_time == 0 then
notest_time = game.time()+6000
elseif notest_time>game.time() then
return false
elseif is_weapon_w_ammo(ItemObj) then
local ItemId = ItemObj:id()

local PistolSlot = db.actor:item_in_slot(1)
if PistolSlot then
-- ts_log("test_discharge_weapon\t", "item "..PistolSlot:name().." in slot 1")
IdPistol = PistolSlot:id()
end

local AutomaticSlot = db.actor:item_in_slot(2)
if AutomaticSlot then
-- ts_log("test_discharge_weapon\t", "item "..AutomaticSlot:name().." in slot 2")
IdAutomat = AutomaticSlot:id()
end

if ItemId ~= IdPistol and ItemId ~= IdAutomat then
ts_ammo_discharge(ItemObj)
else
-- ts_log("test_discharge_weapon\t", "item "..ItemObj:name().." in slot")
end
end
end

function ts_on_net_spawn()
-- ts_log("ts_on_net_spawn","..")
notest_time = 0
end

function ts_on_item_take(obj)
if notest_time>game.time() then
return false
end

-- ts_log("ts_on_item_take\t\t","...")
if obj ~= nil then
-- ts_log("ts_on_item_take\t\t", obj:name())
test_discharge_weapon(obj)
end
end

function ts_on_item_drop(obj)
if not db.actor:has_info("ui_inventory") then
return false
end

if notest_time>game.time() then
return false
end

-- ts_log("ts_on_item_drop\t\t","...")
if obj ~= nil then
-- ts_log("ts_on_item_drop\t\t", obj:name())
test_discharge_weapon(obj)
end
end

 

Попытки перевести гравипушку и огнемет на классы из исключений в таблице не увенчались успехом. Может быть, возможно перевести скрипт на работу именно с названием оружия. Так сказать, пожертвовать универсальностью в пользу исключения неприятных моментов( в моде ТТ2 огнемет зарядить может только Шуруп). 

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

Отношения между людьми- главная ценность в человеческом обществе.
Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

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

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

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

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

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

Войти

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

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

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