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

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


Svoboда

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

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

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

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


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

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

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

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


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

Помогите с похожей проблемой: добавил авторазряжалку в ТТ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

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


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

 

 

навскидку

Навскидку мне не поможет: не знаком с программированием. Поэтому и выложил скрипт целиком в надежде получить готовое решение.

 

 

А при взятии стволов из ящиков оно у вас нормально работает?

Вроде нормально, а в чем подвох? Оружие в ящик перекладывается с инвентаря ГГ, т.е. уже разряженное при попадании в него.

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

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


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

 

 

тайники в которых может быть оружие не побывавшее в инвентаре ГГ.

Только что проверил:  разряжается оружие при взятии из тайника.

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

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


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

Так одно дело прочитать, а вот дотунькать что имелось ввиду- совсем другое.)

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

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


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

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

Авторазряжалка избавляет от рутинной ручной разрядки оружия в инвентаре и, по сути, исправляет недоработку разработчиков. Естественно, в модах с магазинным питанием она не нужна и даже вредна.

Чет, не хочет у меня работать: или вылет или не разряжает все оружие. Вылет:

 

Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: d:\games\tt2+aa2\gamedata\scripts\_g.script:1248: attempt to index global 'ts_mod_soc' (a nil value)

 

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

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

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


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

Так скопипастил- и не работает. А вылеты уже из-за метода ненаучного тыка.

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

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

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

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


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

Т.е.  для моего печального случая с ТТ2  решения нет? Оставить надежду навсегда?

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

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

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


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

Я всегда знал что варианты решения есть всегда и их больше, чем один. Разобрался с авторазряжалкой: надо было не  целиком копипастить выложенную функцию, а вставить код в уже существующую. Спасибо всем за помощь. Вот рабочий скрипт:

-- 08.04.2016

-- KroshkaRoo aka Romz
-- TS MOD для SoC вообще и ОГСЕ в частности.
--TS MOD для COP-- накопировано и накнопано Tonny S. (aka Tonny на AMK-форуме)
--часть функций или их частей выковыряна из AMK, скриптов SAK и др.
-- 2016.05.12 Добавлена таблица исключений для оружия не нуждающегося в авторазряжании. Авторы: Zander_driver и dsh
-- Оружие, перекладываемое из инвентаря и выброшенное/выбитое из рук не разряжается.
--[[--
для использования авторазряжалки следует:
- в скрипте 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-- этот вызов не нужен Zander_driver

- 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 = {}

--сюда занести секции оружия которое не надо разряжать. Zander_driver, dsh
local ex_sects = {
[ "wpn_gravigun" ] = true,
[ "wpn_flame" ] = true
}


--лог в текстовый файл
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 wpsec = wpn:section()
if ex_sects[ wpsec ] then return end --не разряжаем оружие из таблицы исключений. dsh
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

 

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

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

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


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

А dsh на предыдущей странице писал что таблицы надо заполнять вот так:

local quest_nps = {
["esc_wolf" ] = true,

["esc_fox" ] = true,

["esc_shustryi" ] = true

}

Изменено пользователем aromatizer
  • Не нравится 1

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

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


Ссылка на сообщение
Например, чтобы можно было использовать костёр на локации

Возможно, тебе пригодится вот это:https://yadi.sk/d/vut19xuZrgzNB

Чье, откуда и как- не помню. Случайно наткнулся у себя на винте и вспомнил твой пост. 

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

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

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


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

Если в СЗ тоже будут подробные комментарии, то мод однозначно станет востребованной платформой для создания других проектов. 

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

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

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

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


Ссылка на сообщение
22 часа назад, Serge_888 сказал:

Делал для ЗП магазинный гранатомёт с отъёмным магазином

Эта штука называется XM29 OICW. Через сквозной оптический прицел будет весело пулять гранатами. Например, как здесь: https://yadi.sk/i/sGH6mXoELpbt3Q

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

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

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


Ссылка на сообщение
1 час назад, Fenrir02 сказал:

переходить в оффлайн, находясь при этом в радиусе switch_distance актора

Если такое происходит на граничной дистанции, то это нормально: там есть гистерезис на вход/выход.

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

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


Ссылка на сообщение
2 часа назад, mdm64 сказал:

есть довольно много больших диалогов и другой текстовой информации

Предлагаю пару простых вариантов:

1. В gamedata/config/alife.ltx:  time_factor = 3 или меньше. Это уменьшит скорость течения времени в игре.

2. Ставить игру на паузу при чтении текстов. Соответственно, надпись "пауза" переместить так, чтобы не мешала.

  • Согласен 1

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

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


Ссылка на сообщение
2 часа назад, mdm64 сказал:

У меня обычно стоит time_factor = 10, и то потери игрового времени напрягают

Не понял: переведи. А так-то time_factor = 10 предназначен для того, чтобы игрок быстрее бежал вперед, а не вдумчиво читал простыни текстов.) Думается мне, что оптимальное значение time_factor = 3.

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

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

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


Ссылка на сообщение
19 часов назад, mdm64 сказал:

контрреволюционно выглядит ситуация, когда ГГ за 3-10 минут выносит хорошо вооружённую многочисленную базу, тратя на переход из одного здания в другое несколько секунд.

:offtopic:Контрреволюционно и печально не то, что за 3 -10 минут, а то, что хорошо вооружённую многочисленную базу выносит в одиночку: такой экшон будет интересен разве что детишкам.

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

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

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


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

:offtopic:Поэтому-то созданная игра и является зеркалом души разработчика.:guru:

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

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

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


Ссылка на сообщение
19 минут назад, Капрал Хикс сказал:

буду модифицировать под звуки в костюме с противогазом

Как сделаешь, выложи пожалуйста: давненько сам подумывал о такой полезной фиче. Кстати, что думаешь на счет озвучки необходимости перезарядки оружия, когда закончились патроны в магазине?

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

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

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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