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

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

Судя по логу вылета, возможно, есть какая-то ошибка в конструкции квеста. И ещё в ЛС загляни - там пара вопросов тоже имеется.

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

Вечер добрый!!!

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

 

function uni_random_spawn(items, tbl, kol)
local lv_id, gv_id, obj, item, ms, kol2
local kol1 = 1
local id = 65535
local pos = vector()

if type(tbl) == 'table' then
ms = math.random(#tbl)
end

if type(tbl) == 'table' and type(tbl[ms]) == 'table' then
pos.x = tbl[ms][1]
pos.y = tbl[ms][2]
pos.z = tbl[ms][3]
lv_id = tbl[ms][4]
gv_id = tbl[ms][5]
else
if type(tbl) == 'table' and type(tbl[ms]) == 'number' then
ms = tbl[ms]
obj = level_object_by_sid(ms)
if obj == nil then
obj = alife():story_object( ms )
id = obj.id
pos = obj.position
lv_id = obj.m_level_vertex_id
gv_id = obj.m_game_vertex_id
else
id = obj:id()
pos = obj:position()
lv_id = obj:level_vertex_id()
gv_id = obj:game_vertex_id()
end
elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then
obj = db.actor
id = obj:id()
pos = obj:position()
lv_id = obj:level_vertex_id()
gv_id = obj:game_vertex_id()
elseif type(tbl) == 'number' then
obj = level_object_by_sid(tbl)
if obj == nil then
obj = alife():story_object( tbl )
id = obj.id
pos = obj.position
lv_id = obj.m_level_vertex_id
gv_id = obj.m_game_vertex_id
else
id = obj:id()
pos = obj:position()
lv_id = obj:level_vertex_id()
gv_id = obj:game_vertex_id()
end
end




end

if kol == nil then
kol = 1
end
for s=1, kol do
if type(items) == 'table' then
item = math.random(#items)
if type(items[item]) == 'number' then
item = item - 1
end
if type(items[item+1]) == 'number' then
kol1 = items[item+1]
end
item = items[item]
else
item = items
end
for i=1, kol1 do
if type(item) == 'table' then
for k, v in ipairs(item) do
if type(item[k+1]) == 'number' then
kol2 = item[k+1]
else
kol2 = 1
end
if type(item[k]) ~= 'number' then
for j=1, kol2 do
alife():create(v, pos, lv_id, gv_id, id)

end
end
end
else
alife():create(item, pos, lv_id, gv_id, id)

end
end
end

end

 

и скрипт с вызовом:

 

function random_spawn_aes_zomb2()
local tbl = {{229.800,0.24,303.014,82930,2547}}
local items = {{'zombie_esc1',2, 'zombie_esc2',2, 'zombie_esc3',2, 'zombie_esc4',3, 'zombie_esc5',1}}

this.uni_random_spawn(items, tbl, kol)
end

 

Это зомбяки с лежачей логикой поднимающиеся при приближении ГГ, но при приближении валяются они в одной куче, что выглядит не очень честно говоря... Хотелось бы как то разбросать их по сетке в оси X и Z на несколько метров.

 

Подскажите как изменить скрипт если возможно.

Спасибо!!!

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

Жизнь следует измерять поступками, а не временем...

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

В огсе нашёл:

write_memory_float(hit_data.power * rad_prot, p_s_hit, hit_offset.power)
write_memory_int(db.actor:cast_game_object(), p_s_hit, hit_offset.who)
write_memory_int16(db.actor:id(), p_s_hit, hit_offset.whoID)

То есть этим как бы перезаписывается power,who и whoID хита. Но все три разными функциями. От чего это зависит? Наверное от смещения?? Как узнать какие функции использовать для перезаписи других значений хита?? :dash2:

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

 

 

Подскажите как изменить скрипт если возможно.

Выкинуть.

 

 

валяются они в одной куче

Потому что функциями из семейства level.vertex_in_direction и иже с ними, тут и не пахнет.

 

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

function get_pos_ranged(lv,gv,ot,range)
--функция генерирует набор точек с разбросом от заданной позиции на указанную дистанцию.
-- работает только на текущей локации, не использовать для спавна на других локациях.
    local pos = {}
    local lvs = {}
    local mask = {{-range,0,-range},{-range,0,0},{-range,0,range},
                  {0,0,-range},{0,0,range},
                  {range,0,-range},{range,0,0},{range,0,range}}
    local lvn = nil
    local a = 1
        lvs[a] = lv
        pos[a] = level.vertex_position(lv)
    local w_mask = mask[a]
        while a < 9 do
        lvn = level.vertex_in_direction(lv,vector():set(w_mask[1],w_mask[2],w_mask[3]),1)
        a = a + 1
            if lvn ~= lv then
            lvs[a] = lvn
            pos[a] = level.vertex_position(lvn)
            w_mask = mask[a]
            end
        end
    for k,v in pairs(lvs) do    
        local flv = true
        for kvak,krak in pairs(ot) do
            local fff = krak
            if fff[2] == v then flv = false end
        end
        if flv then table.insert(ot,{pos[k], v, gv}) end
    end
    return ot
end

function spawn_count(sec, lv, gv, count, range)
--- функция спавна с разбросом. входящие аргументы:
--- секция, кого/что спавнить. левел-вертекс и гейм-вертекс центра желаемой области,
--- число, сколько спавнить, и наконец желаемый радиус разброса объектов друг от друга.
--- могут быть перебои (частичный, неполный спавн) в сложнопересеченной местности с кучей дыр в аи-сетке.
    local t = {}
    t = get_pos_ranged(lv, gv, t, range)
    local spawned = 0
    local sim = alife()
    for k, v in pairs(t) do
        sim:create(sec, v[1], v[2], v[3])
        spawned = spawned + 1
        if spawned >= count then break end
    end
end

 

 

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

 

...

 

 

С уважением, но очень уж какие-то сложные у вас инструменты. Я предложу сделать так (по-минимуму, т.к. минимум - это ассемблер, а ассемблер - это всё моё):

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

function spawn_random_object_on_random_position_on_current_level(lv_id, gv_id, radius, countball, tabmonster)
 local new_lv_id
 local pos
 local new_random_npc
 local new_mob
 for a=1, countball do
  local offset = vector():set(math.random()*6-3, 0, math.random()*6-3)
  offset:normalize()
  new_lv_id = level.vertex_in_direction(lv_id, offset, math.random(0, radius))
  pos = level.vertex_position(new_lv_id)
  new_random_npc = tabmonster[math.random(table.getn(tabmonster))]
  new_mob = alife():create(new_random_npc, pos, new_lv_id, gv_id)
 end
end

На входе функции:

[level_vertex_id центральной точки спона объектов], [game_vertex_id центральной точки спона объектов], [радиус, в котором будут спониться объекты относительно центральной точки], [количество создаваемых объектов], [таблица (ИМЕННО ТАБЛИЦА!) объектов, которые нужно создать]

Переменная new_mob, ясное дело, позволяет сразу же наполнить логикой только что созданный объект (если речь идёт об NPC, например).

Подсказывайте ошибки - я уже успел неслабо приложился к поллитровке, и она у меня сегодня не последняя. Точно не последняя. Успевайте.

Забыл один local удалить :)...

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

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

Очевидно, ни как. Удел наш - почтительно внимать Величайшим, и пресмыкаться, посыпая голову пеплом, в осознании своей никчемности.

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

Вот здесь : http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-349#entry985779

есть упоминание о правке в XE о получениии (и установке) свойств артефактов по смещению. Никто не натыкался на похожее, только под ЗП?

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

Присоединяюсь к вопросу выше. И еще вопросец есть, можно ли в окне создавать кнопки дин. размера и дин. координатами? Не описывая все в xml.
P.s Платформа ЗП 

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

Всем привет.  Нужна некоторая помощь.
Есть мод для Зова Припяти - авторазряжание подбираемых стволов.
И в нём есть вот такая функция

 

function ts_get_weapon_ammo_type(sobj)
  local stpk=net_packet()
  stpk:w_begin(0)
  sobj:STATE_Write(stpk)
  local size=stpk:w_tell()

  stpk:r_seek(size-2)

  return stpk:r_u8()
end

 

По контексту должна возвращать тип боеприпаса в стволе, в виде номера 0 или 1, что соответствует обычному или бронебойному патрону (например). При правленом движке, если количество типов боеприпасов для ствола может быть больше, то и цифры могут быть больше.

Я пытаюсь этот мод прикрутить для работы в ТЧ.

Так вот, в ТЧ вышеприведённая функция выдаёт неверное значение. В моём случае - двухзначный номер, 66 или 25 для разных стволов.

Я так подозреваю, она неверное место нетпакета для ТЧ читает.

А так как сам я в нетпакетах ни в зуб ногой, то и прошу помощи уважаемого сообщества.

Как эту заразу переписать, чтобы она верное значение в ТЧ выдавала?

Поиском по темам пробежался, но ничего не попалось...

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

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, попробуй так:

function ts_get_weapon_ammo_type(sobj)
  local pk = net_packet()
  cse_alife_item_weapon.STATE_Write( sobj, pk )
  pk:r_seek( pk:w_tell() - 2 )
  return pk:r_u8()
end
Изменено пользователем naxac
  • Спасибо 1

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

naxac.gif

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

@naxac, не, ну в самом деле, ну это уже какой-то совет из серии выстрелю себе в ногу. Ну есть же m_net_utils или xs_netpk.

 

А, впрочем, ты прав. Бесполезно это. Какая разница, какую магию эта лабуда использует, если она так сделана, как сделана.

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

@naxac, Не-а, не взлетело... То же самое, только сбоку. Для того ствола, для которого выдавала 25, теперь выдаёт 89.


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

 

 

function ts_get_weapon_ammo_type(sobj)
  local pk = net_packet()
  cse_alife_item_weapon.STATE_Write( sobj, pk )
  pk:r_seek( pk:w_tell() - 2 )
  return pk:r_u8()
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", 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)",string.sub(section_ammo,6,30), ammo_count)
			ts_log("ts_ammo_discharge",str1)
			ogse.send_tip(str1,"Патроны")
			--add_hud("hud_event","Патроны: "..str1)
			--ts_hud_msg(str1,3)
			ogse.spawn_ammo_in_inv(section_ammo, ammo_count, nil)
			wpn:unload_magazine()
		else
			if section_ammo == nil then
				section_ammo = "<nil>"
			end
			ts_log("ts_ammo_discharge","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 )
	ts_log("ts_ammo_by_num => parse_names_mod ",name)
	end

	return t
end

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

	local ammo_list

	ts_log(tostring(weapon_ammo[section]), "")
	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)
	ts_log("ts_ammo_by_num","....."..tostring(cnt))
	if cnt == 0 then
		return nil
	elseif num >= cnt then
		return t[1]
	else
		return t[num+1]
	end

end

 

 

Шаман - СисАдмин

Всяко-разно: для ЧН

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

@Romz, у тебя, похоже, OGSE? Тогда вместо той лабуды, лучше используй:

function ts_get_weapon_ammo_type(sobj)
  local data = m_net_utils.get_weapon_data( sobj )
  return data.ammo_type
end


Или вообще, вместо

		local ammo_type = ts_get_weapon_ammo_type( alife():object(wpn:id()) )

используй

		local ammo_type = ogse_wpn_utils.get_active_ammo_type( wpn )

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

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

 

 

OGSE?
Ага.

 

лучше используй
Не хотелось бы. Я планирую максимально привести к оригиналу ТЧ и выложить в общий доступ. Вдруг кому ещё понадобится. Хотя можно и проверками обвязать на два варианта...
  • Нравится 1

Шаман - СисАдмин

Всяко-разно: для ЧН

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

Вообще, я бы для всех подобных случаев использовал бы m_net_utils/m_netpk и не парился. Зачем изобретать велосипед.

 

 

можно ли в окне создавать кнопки дин. размера и дин. координатами? Не описывая все в xml.

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

  • Полезно 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

@Zander_driver, Вот хотелось бы овладеть этой магией)

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

@vampirnik77,

class "Areal" (CUIScriptWnd)

function Areal:__init(owner, ui_mode, dualmode_target) super()

    self:Init(0,0,703,508)    
    
    self.mainframe = CUIStatic()

    self.mainframe:SetWindowName("main_frame")
    self.mainframe:Init(0,0,1,1)

    self.mainframe:SetFont(GetFontLetterica16Russian())
    self.mainframe:SetTextColor(255, 255, 255, 255)
    self.mainframe:InitTexture("ui\\bar_bl")

    self.mainframe:SetStretchTexture(true)
    self:AttachChild(self.mainframe)
    -- просто в качестве пищи к размышлению...
end

 

 

  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

У меня при создании скриптом (без xml) у списка полоска прокрутки всегда стоит слева и направо её загнать не получается. Всё остальное легко, но не всегда такой путь лучший.

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

@Zander_driver, Да, но не провернуть такое в зп, функционал урезан до потери пульса(

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...