=VENOM= 50 Опубликовано 1 Апреля 2016 Поделиться Опубликовано 1 Апреля 2016 Судя по логу вылета, возможно, есть какая-то ошибка в конструкции квеста. И ещё в ЛС загляни - там пара вопросов тоже имеется. Ссылка на комментарий
losiara 13 Опубликовано 1 Апреля 2016 Поделиться Опубликовано 1 Апреля 2016 (изменено) Вечер добрый!!! Порылся на просторах интернета и обнаружил прекрасный скрипт спавна(чего либо) по координатам, в инвентарь, одинаковых либо разных предметов(НПС, монстров), в общем чего угодно написанный некогда singapur22. Сам пользуюсь им для спавна НПС, монстров. Вот и возникла необходимость немного подредактировать его в плане изменения точки разброса при появлении НПС, дабы они не выходили из одной точки, а появлялись в определенном радиусе от точки спавна. Сам скрипт общая функция: function uni_random_spawn(items, tbl, kol)local lv_id, gv_id, obj, item, ms, kol2local kol1 = 1local id = 65535local pos = vector()if type(tbl) == 'table' thenms = math.random(#tbl)endif type(tbl) == 'table' and type(tbl[ms]) == 'table' thenpos.x = tbl[ms][1]pos.y = tbl[ms][2]pos.z = tbl[ms][3]lv_id = tbl[ms][4]gv_id = tbl[ms][5]elseif type(tbl) == 'table' and type(tbl[ms]) == 'number' thenms = tbl[ms]obj = level_object_by_sid(ms)if obj == nil thenobj = alife():story_object( ms )id = obj.idpos = obj.positionlv_id = obj.m_level_vertex_idgv_id = obj.m_game_vertex_idelseid = obj:id()pos = obj:position()lv_id = obj:level_vertex_id()gv_id = obj:game_vertex_id()endelseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' thenobj = db.actorid = obj:id()pos = obj:position()lv_id = obj:level_vertex_id()gv_id = obj:game_vertex_id()elseif type(tbl) == 'number' thenobj = level_object_by_sid(tbl)if obj == nil thenobj = alife():story_object( tbl )id = obj.idpos = obj.positionlv_id = obj.m_level_vertex_idgv_id = obj.m_game_vertex_idelseid = obj:id()pos = obj:position()lv_id = obj:level_vertex_id()gv_id = obj:game_vertex_id()endendendif kol == nil thenkol = 1endfor s=1, kol doif type(items) == 'table' thenitem = math.random(#items)if type(items[item]) == 'number' thenitem = item - 1endif type(items[item+1]) == 'number' thenkol1 = items[item+1]enditem = items[item]elseitem = itemsendfor i=1, kol1 doif type(item) == 'table' thenfor k, v in ipairs(item) doif type(item[k+1]) == 'number' thenkol2 = item[k+1]elsekol2 = 1endif type(item[k]) ~= 'number' thenfor j=1, kol2 doalife():create(v, pos, lv_id, gv_id, id)endendendelsealife():create(item, pos, lv_id, gv_id, id)endendendend и скрипт с вызовом: 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 на несколько метров. Подскажите как изменить скрипт если возможно. Спасибо!!! Изменено 1 Апреля 2016 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
FonSwong 33 Опубликовано 1 Апреля 2016 Поделиться Опубликовано 1 Апреля 2016 В огсе нашёл: 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 хита. Но все три разными функциями. От чего это зависит? Наверное от смещения?? Как узнать какие функции использовать для перезаписи других значений хита?? Ссылка на комментарий
Zander_driver 10 341 Опубликовано 2 Апреля 2016 Поделиться Опубликовано 2 Апреля 2016 Подскажите как изменить скрипт если возможно. Выкинуть. валяются они в одной куче Потому что функциями из семейства 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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
=VENOM= 50 Опубликовано 2 Апреля 2016 Поделиться Опубликовано 2 Апреля 2016 (изменено) ... С уважением, но очень уж какие-то сложные у вас инструменты. Я предложу сделать так (по-минимуму, т.к. минимум - это ассемблер, а ассемблер - это всё моё): Для спона заданного количества объектов на случайных координатах относительно центра заданной точки на текущей локации: 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 удалить ... Изменено 2 Апреля 2016 пользователем =VENOM= Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Апреля 2016 Поделиться Опубликовано 2 Апреля 2016 (изменено) Я вот читаю последние, где-то, 3-4 страницы, здесь, и в нескольких соседних темах, и тихо, хм, удивляюсь. Все - сплошь гениальные спецы, которые делают все лучше всех. Так как те, кто не гениальные и не лучшие в убогости своей способны вам помочь ? Очевидно, ни как. Удел наш - почтительно внимать Величайшим, и пресмыкаться, посыпая голову пеплом, в осознании своей никчемности. Изменено 2 Апреля 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
dukekan 5 Опубликовано 3 Апреля 2016 Поделиться Опубликовано 3 Апреля 2016 Вот здесь : http://www.amk-team.ru/forum/topic/6185-skriptovanie/page-349#entry985779 есть упоминание о правке в XE о получениии (и установке) свойств артефактов по смещению. Никто не натыкался на похожее, только под ЗП? Ссылка на комментарий
vampirnik77 121 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 (изменено) Присоединяюсь к вопросу выше. И еще вопросец есть, можно ли в окне создавать кнопки дин. размера и дин. координатами? Не описывая все в xml.P.s Платформа ЗП Изменено 5 Апреля 2016 пользователем vampirnik77 Официальная страница проекта Neof-One Crew Ссылка на комментарий
Romz 142 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 (изменено) Всем привет. Нужна некоторая помощь.Есть мод для Зова Припяти - авторазряжание подбираемых стволов.И в нём есть вот такая функция 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 для разных стволов. Я так подозреваю, она неверное место нетпакета для ТЧ читает. А так как сам я в нетпакетах ни в зуб ногой, то и прошу помощи уважаемого сообщества. Как эту заразу переписать, чтобы она верное значение в ТЧ выдавала? Поиском по темам пробежался, но ничего не попалось... Изменено 5 Апреля 2016 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
naxac 2 447 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 (изменено) @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 Изменено 5 Апреля 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dsh 3 824 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 (изменено) @naxac, не, ну в самом деле, ну это уже какой-то совет из серии выстрелю себе в ногу. Ну есть же m_net_utils или xs_netpk. А, впрочем, ты прав. Бесполезно это. Какая разница, какую магию эта лабуда использует, если она так сделана, как сделана. Изменено 5 Апреля 2016 пользователем dsh dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Romz 142 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 @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 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
naxac 2 447 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 @Romz, упс, смещение не то. Не -2, а -1 должно быть. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dsh 3 824 Опубликовано 5 Апреля 2016 Поделиться Опубликовано 5 Апреля 2016 (изменено) @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 ) Будем надеяться, что не попадется оружия с активированным подствольником. Впрочем, оригинал эту ситуацию тоже не обрабатывает. Изменено 5 Апреля 2016 пользователем dsh 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Romz 142 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 OGSE?Ага. лучше используйНе хотелось бы. Я планирую максимально привести к оригиналу ТЧ и выложить в общий доступ. Вдруг кому ещё понадобится. Хотя можно и проверками обвязать на два варианта... 1 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Zander_driver 10 341 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 Вообще, я бы для всех подобных случаев использовал бы m_net_utils/m_netpk и не парился. Зачем изобретать велосипед. можно ли в окне создавать кнопки дин. размера и дин. координатами? Не описывая все в xml. Можно вообще любые элементы худа, окна статики и их наполнение любого вида и размера рисовать как вздумается и без xml. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
vampirnik77 121 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 @Zander_driver, Вот хотелось бы овладеть этой магией) Официальная страница проекта Neof-One Crew Ссылка на комментарий
Zander_driver 10 341 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 @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 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Serge! 127 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 (изменено) Можно вообще любые элементы худа, окна статики и их наполнение любого вида и размера рисовать как вздумается и без xml. У меня при создании скриптом (без xml) у списка полоска прокрутки всегда стоит слева и направо её загнать не получается. Всё остальное легко, но не всегда такой путь лучший. Изменено 6 Апреля 2016 пользователем Serge! Ссылка на комментарий
vampirnik77 121 Опубликовано 6 Апреля 2016 Поделиться Опубликовано 6 Апреля 2016 @Zander_driver, Да, но не провернуть такое в зп, функционал урезан до потери пульса( Официальная страница проекта Neof-One Crew Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти