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

Прозекторская

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

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

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

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

"больше 32 НПЦ попадает" - хе-хе. Толсто. ;)

А вот зря. Если забить в гулагах на группы/сквады, то НПЦ на уровне запишутся в группу 0 сквад 0 :) Легко превышает 32. В той же солянке такое было.

 

Вот как здесь. По-хорошему на блокпосте своя группа со своими сквадами, под мостом своя группа должна быть.

  • Спасибо 1
Ссылка на комментарий

Просто, 32 непися в онлайне - это уже слегка перебор по-любому. Ну и как выяснили, столько и не надо, чтоб эффекты УЖЕ получить.

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

(для поиска: se_respawn, респавн)

Итак, наконец, мы добрались до собственно потрохов: почему попытки что-то "подкручивать" лишь усугубляют. Вот не думал, что это кому-то надо объяснять, однако ж, на дворе шел 2015 год...)

Возьмем для наглядности скрипт из amk. Ибо, как уже замечено, на дворе - 2015-й.
Ну, одна строчка в update(), который, собственно, и вызывается в онлайне, самоочевидна. А вот далее (ну, вы поняли):

function se_respawn:execute()
	if self.already_once_spawned == true then return end
	if self.idle_spawn_min == -1 then return end

	if self.respawn_time < game.get_game_time() then
		local idle_time = game.CTime()
		idle_time:setHMSms( math.random( 24, 32 ), 0, 0,
			math.random( self.idle_spawn_min, self.idle_spawn_max ) * 1000 )
		self.respawn_time = game.get_game_time() + idle_time
		self:spawn()
	end
end

Первые 2 здесь - это для прости-господи респавнеров, которые срабатывают либо один раз в жизни, либо, кому-то показалось проще вместо alife():create() городить огород с прибиванием гвоздями в олспавне. Ну, да, борьба с читерами - это - святое. То, что такой "респавнер" замечательно грохается, либо, все что нужно, спавнится 100500 разными способами в куда угодно в любых количествах - ну а кого это волнует ? Зато виртуальные читеры в очередной раз виртуально посрамлены.

Но вот дальше... А дальше, проверяется, не настало ли время очередного респавна, каким-то образом вычисленное и сохраненное. И ежели настало - тадам... Нет, мы ЕЩЕ ничего не спавним. Мы вычисляем время СЛЕДУЮЩЕГО респавна !

Все все поняли ? Нет ? Время следующего, Карл !
То есть, не важно, надо спавнить, не надо спавнить... Оно будет вычислено, и будет дожидаться следующей проверки. В том числе, если спавнить ничего не надо.
Теперь, внимание, вопрос: если надо заспавнить через секунду после вычисления ? Ответ: ПРАВИЛЬНО. Вот когда настанет это самое вычисленное, тогда и...
А если, нет, ну совершенно случайно, игрок в прошелся по всем нашим 100 лагерям по 300 неписей (все, разумеется, с одинаковыми тимами, сквадами и группами, хотя к данному вопросу это отношения уже не имеет), и все зачистил, а через секунду наступило время спавна ? И еще раз - ПРАВИЛЬНО. Игрок получает на голову все свои 300 монстров для всех 100 лагерей.
Ура, товарищи !

Ну, то, что некий рэндом этого самого времени теоретически должен вычисляться из 2-х цифр, а если взять первый попавшийся олспавн, мы скорее всего увидим там ОДНУ цифру в типа 10 игровых минут (то есть, одну реальную минуту), из которой и предполагается вычислять рэндом, это уже так - мелочи жизни.
Собственно в idle_time:setHMSms( math.random( 24, 32 )... мы уже видим попытку бороться с авторами олспавнов, вводя принудительно задержку от 24 до 32 в данном случае часов, к его 10 минутам), но, см. пункт 1-й, про то, как это время вычисляется и используется.

Теперь, надо ли кому-либо объяснять, как используются значения min_count, max_count и max_spawn, или все понятно, так сказать, по аналогии ?
Замечу лишь, что даже правильно прописав вот эти самые min_count и max_count в силу опять же описанного выше, все будет заполнено под завязку, а разница лишь в том, за один заход, или за несколько.

Вопрос: что с этим можно сделать ?
Очевидно что, во-первых, вычислять время следующего спавна только после того, как спавн ДЕЙСТВИТЕЛЬНО случился тьфу, не случился, а ПОНАДОБИЛСЯ. Или не случился, но по уважительной причине. Иначе следует проверять, не пора ли, но вот спавн начинать вот как раз через вычисленное время. Заодно, хе-хе, и рандомизируется, как надо.

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

Да, еще неплохо бы спавн не сразу по 100 штук всего и по-больше, а по 1 штук за апдейт. Тогда и табунами не будут ходить, во-первых, а во-вторых, прекратятся эти безобразные рывки, которые проиходят при спавне запланированного табуна в 300 (нет, лучше - в 500 электропсикислотноогнеметных химер залпового огня), а потом удаления 499 лишних).

Впрочем, это у нас русский форум , а на дворе кончается всего-лишь 2015 год ...


P.S. Да, собственно, это и есть причина, по которой с респавнерами, как чем-то, подлежащим апдейту через движок, надо кончать. 8 лет назад еще.
Переносить на опрос, скажем, по одному СМАРТУ в 5 секунд в моменты, когда движок не загружен, а там уже проводить обслуживание, вычисление количеств/времени, и проверять уже это самое вычисленное.

Для чего же на самом деле хорош респавнер, как он есть - это реализовать через него, скажем, спавн артов, привязанных к аномалиям. (Случайный/спавн при сработке, "варка" и т.д).
Вот здесь - да, определили, что аномалия должна чего-то там родить через какое-то время, создали спавнер, он отработал - удалили. Сам он к аномалии больше не привязан - то есть, все вот эти динамические аномалии, выбросы, и т.д. - великолепно переживет, и сохранит что надо, до нужного момента. А не хранить всякую ересь в нетпакете актора.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий
Итак, в момент, когда актор оказывается перед глазами стоящего под мостом, он же оказывается в памяти "телезрителя", находящегося за 500 метров. Но в принудительном онлайне.

Если, затем, подойти на 300 метров к телезрителю, сохраниться, и загрузиться - телезритель сорвется в бой, и пойдет в сторону актора с недобрыми намерениями.

Я делаю так - в биндере на этапе reinit принудительно очищаю все запомненные объекты через enable_memory_object, и отключаю неписям зрения (enable_vision). Включаю обратно только после того, как игра загрузилась полностью (т.е. игрок уже не видит экран загрузки). Помимо этого прописал в enemy_callback и схеме xr_danger игнорирование всех врагов и опасностей до того, как игра загрузится. Частично это помогло. Во всяком случае почти исчезли ситуации, когда никем не обнаруженный игрок сохранился где-то спрятавшись за углом, а потом загрузился и все сразу его заметили.

Насколько это влияет на это "дальновидение" - не знаю, специально не проверял, т.к. принудительный оффлайн намертво отключил. Можно ещё попробовать вызвать skip_transfer_enemy(true), но вроде бы это только для зверей...

  • Полезно 3
Ссылка на комментарий

"Это не есть верно. Форумы существуют для обсуждения. В противовес подпольям с кривыми велосипедами."

 

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

"Можно ещё попробовать вызвать skip_transfer_enemy(true)"

 

в каком месте и зачем?

"Да, еще неплохо бы спавн не сразу по 100 штук всего и по-больше, а по 1 штук за апдейт. Тогда и табунами не будут ходить, во-первых, а во-вторых, прекратятся эти безобразные рывки, которые проиходят при спавне запланированного табуна в 300 (нет, лучше - в 500 электропсикислотноогнеметных химер залпового огня), а потом удаления 499 лишних)."

 

с такими телегами надо идти к тем у кого эти 500 электрохимер спавнятся - тут без базара, но им оно я думаю по барабану, а 5-10 объектов работают без рывков, а этого количетсво достаточно для создания чего-то нормального, а там где 500 электробюреров спавнятся ну я уже описывал свои эмоции от просмотра этого

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

Разовый спавн 10 объектов, особенно, в цикле - спавн-попытка регистрации-удаление - вполне заметный рывок. На первом проходе всех апдейтов (10-20 минут после НИ), актор движется вот этими самыми рывками. Попытка выдать их за "эффект слабого здоровья" - довольно наивна.

 

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

Ссылка на комментарий
Да, еще неплохо бы спавн не сразу по 100 штук всего и по-больше, а по 1 штук за апдейт

Это вопрос решался (и решился) достаточно давно.

Поищите сами, ну или я найду дам ссылку на посты мои (про coroutine) и её возможности и Artos-а о реализации этой возможности.

Речь идет о распределении с помощью coroutine по времени или объеме обрабатываемых данных.

Будь то массовый спавн, перебор for i=1, какое-то очень большое число, или ещё что-то тяжелое, всё это распределяется на выбранное время, кол-во апдейтов, объем информации...или как-то ещё.

.....

Ссылку на пост Artos-a нашел http://www.amk-team.ru/forum/index.php?showtopic=11584&page=6#entry641931

О. а вот что и я накалякал http://www.amk-team.ru/forum/index.php?showtopic=7450&page=16#entry622983

Всего 4 года прошло :)

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

 

 

А вот зря. Если забить в гулагах на группы/сквады, то НПЦ на уровне запишутся в группу 0 сквад 0

Как у меня например :facepalm:

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

 

 

это для прости-господи респавнеров

Почитал. порадовался что убил к черту все респавнеры) вот реально не надо вообще ни зачем.

 

 

Для чего же на самом деле хорош респавнер, как он есть - это реализовать через него, скажем, спавн артов, привязанных к аномалиям. (Случайный/спавн при сработке, "варка" и т.д).

И даже за этим - не нужен. Имхо и поидее, "рождать" должна живая аномалия. А если аномалия сгинула то и появиться уже ничего не должно.

 

 

А не хранить всякую ересь в нетпакете актора.

Спаси и сохрани)

 

Буду рад таки когда нибудь узреть доскональный разбор - что передается телепатически при одинаковом скваде, и при одинаковой тиме. В чем их суть различие...
А дабы отрубить всяческую телепатию, мне я так понимаю, надо для каждого нпс на локе генерить уникальные сквад и тим? Или бери выше - для всех нпс в игре на всех локах?

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

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

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

Сквад - "союзнические отношения" между соседними смартами.

 

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

 

А вот если надо, чтобы тот блокпост по тревоге занимал места, как написано в работах для 2-го стейта, а не вылезал всей толпой бегать по всей локации за оным актором (ну и тем более - агропром) - у того патруля, и у капитана с охранниками и снайперами должен быть разный тим. Ну и его смену надо дорабатывать  - "штатных" средств нет.

 

 

По аномальками и респавнерам  - не, реально удобно. Вот аномальке заказали арт родить, а аномалии у нас динамические. Создаем респавнер, прописываем в него арт, и благополучно забываем. Если хотим, чтобы с исчезновением аномалии больше ничего не рождалось - можно ж в том респавнере проверку на существование аномалии добавить. Или еще что. Именно смысл в том, что вообще-то - полная свобода.

Он же и за судьбой рожденных артов может следить.

По крайней мере, это ЕДИНСТВЕННАЯ польза, которую я лично от них обнаружил. ;)

 

 

2 Nazgool: чтобы применить какой-то метод, сначала надо знать, что есть необходимость в его применении. И даже через coroutine, вызывая цикл на 100 созданий, запихиваний в смарты (с перебором всех существующих) и удалений - все равно получим цикл на 100 этих самых.

Вот от том, собственно, и пост.

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

Корутины профита не дают, луа однопоточен, эти антифризы надо делать где-то поглубже ;). Попытки кстати были, и кстати удачные.

 

@Dennis_Chikin, по тимам и сквадам, я верно понял что надо писать какие-то алгоритмы саморасчета уникальности этих самых? Хотя-бы в пределах онлайна.

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

По сквадам - не нужно. Переопределяется а ослпавне для смарта, или принудительно в работах.

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

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

 

"Попытки кстати были, и кстати удачные." ;) а потом идем в соседнюю тему, и читаем вопросы, задаваемые в 2015 году. Про dunin_ammo.script, например. И там же читаем совет прописать новые патроны в сами-знаете-куда. Причем в общем-то другого ни кто и не даст, ибо эту рухлядь править...

 

Хе, вчера в очередной раз делал "совместимость" по сэйвам для скрипта, который "почему-то перестал работать", чтобы заменить его на человеческий. Выдирал цепочку c self.weather_manager = level_weather.get_weather_manager()

self.weather_manager:on_save() и вставлял считывание по флажку stringZ и какого-то int'а.

В тот же самый нетпакет того же самого актора, Карл. Через 5 скриптов ! В 2015ом году.

Вместо, банального, db.storage[0].pstor, если уж так хочется это уродливое каждый раз руками набивать.

 

Кстати, выложи уже сюда xr_spawner и тот вертолет. А то тебе же потом и предъявят, что ты типа "код спер". А то мне вот опять же не далее как вчера уже в очередной раз успели моим файлом 2009го года в нос потыкать. Как плагиатору.

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

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

 

Но этих двух уродцев правда надо показать:

ЭТО РЕАЛЬНО ВЕСЬ XR_SPAWNER, больше от него там вообще ничего не надо.

--// from xr_spawner.script
function check_spawn(sobj)
	local cond = xr_logic.cfg_get_condlist (sobj:spawn_ini(), "spawner", "cond", sobj)
	return xr_logic.pick_section_from_condlist(actor, level.object_by_id(sobj.id) or nil, cond.condlist)
end

а это реально весь heli_snd:

--// Карлан: перепишем что-ли
--// example of call: heli_snd.play_snd(self.st, "damage", 3)
local snd_cnt = {see_enemy = 7, hit = 9, damage = 4, death = 6}
function play_snd(st, snd_set, priority)
	if not st.mute and (not st.snd_obj or not st.snd_obj:playing() or st.snd_priority < priority) then
		if st.snd_obj then
			st.snd_obj:stop()
		end
		st.snd_obj = xr_sound.get_safe_sound_object("helicopter\\"..snd_set.."_"..math.random(snd_cnt[snd_set]))
		st.snd_obj:play(actor, 0, sound_object.s2d)
		st.snd_priority = priority
	end
end

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

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

Детектор просто снесен давно.

 

По поводу перепаковок - тоже существует уже лет, этак, 7 - куча альтернативных. Не говоря об "умных тайниках" и "умных рюкзаках", куда кладется сколько надо, и достается тоже сколько надо, а таскающие по локациям 10000 пачек по одному патрону - ну, если задаться целью вызвать крах игры - эта цель будет достигнута так или иначе. И даже гораздо более простыми средствами.

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

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

Конкретно я не сторонник подгузников, и если мне надо будет что-то разгрузкоподобное, то добавлю "поясов" в движке, а всякие гранаты-аптечки и так уже можно визуализировать вот тебе и разгрузка без всякой фейковой требухи типа привет из 2010. На самом деле наверное хорошо что о великих пока нет в движке, а то были бы уже не только крахи игры а крахи игры вместе со всем системным блоком ;).


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

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

Весь детектор - 2 строки в непосредственно биндсталкере, или в любом удобном месте. Динамически подключаемые. И то - не используется, по тому как есть только одна локация, где нечто подобное в принципе предусмотрено.

 

А подгузники, и иже с ними - они просто фактом появления сделали то старье ненужным. Сами-то подгузники можно и не включать.

И, да, лично мне умные тайники больше нравятся.

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

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

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

Сохранение не нужно. Хиты великолепно сохраняются в акторе. Сколько получил - все его.

Интенсивность новых великолепно считается по дистанции до выбранной точки.

И, кстати, "рестрикторов" там тоже не надо. Рестриктор делает то же самое, но через 10 петель кишечника. Надо, на уровне, по инфе, добавить рассчет расстояния и выдачу хита. Если не уровень, и не инфа, не добавлять ничего.

Изменено пользователем Dennis_Chikin
  • Спасибо 1
Ссылка на комментарий
По аномальками и респавнерам - не, реально удобно. Вот аномальке заказали арт родить, а аномалии у нас динамические. Создаем респавнер, прописываем в него арт, и благополучно забываем. Если хотим, чтобы с исчезновением аномалии больше ничего не рождалось - можно ж в том респавнере проверку на существование аномалии добавить. Или еще что. Именно смысл в том, что вообще-то - полная свобода. Он же и за судьбой рожденных артов может следить. По крайней мере, это ЕДИНСТВЕННАЯ польза, которую я лично от них обнаружил. ;)

Ну то же самое можно делать записывая нужные данные просто в нетпакет самой аномалии, и немного поколдовав над кодом... согласен возни в данном частном случае больше. Зато респавнеры выпилены полностью и без сожалений)

 

 

По сквадам - не нужно. Переопределяется а ослпавне для смарта, или принудительно в работах. По тимам - в общем, тоже не особенно надо, поскольку все равно ручная работа. А вот средства задать его, так же, как и сквад - да, надо. Этой проблемы нет при изначальном спавне, и, в принципе, при тщательном ручном прописывании связок работы-принимаемые профили, но вот когда спавниться что угодно, где угодно, и захватывается чем угодно - ой таки вэй.

Ну вот таки вместо кучи ручной и несколько кропотливой работы можно все же попробовать доверить все автоматике. Все ж гулаги у меня под gulag_general.script работают, послав далеко все остальные gulag_XXX и избавив разработчика (не только меня..) от необходимости руками брать молоток и прибивать гвоздями то что прибиваться не должно вообще, даже если есть в этом сюжетная необходимость.

Так что таки да, было бы неплохо чтоб автоматика плавала не напарываясь на подводные камни сквадотимов.

 

Edit:

Немного покопался... метод онлайнового объекта нпс obj:change_team(team, squad, group) - разве не позволяет там где надо установить то что надо? или я что то не понимаю

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

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

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

"obj:change_team(team, squad, group) - разве не позволяет там где надо установить то что надо?"

 

как-бы давно уже:

function change_team_sqaud_group(obj, team, squad, group)
if is_game_object(obj) then
obj:change_team(team, squad, group)
else
obj.team = team
obj.squad = squad
obj.group = group
end
end
по поводу автоматики - можно и под стандартные гулаги написать нечто лицеприятное. Изменено пользователем Карлан
  • Спасибо 1
Ссылка на комментарий

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

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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