ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как спаунить мобов в определенное время (https://forum.antichat.xyz/showthread.php?t=792526)

Artemis_37 20.09.2024 23:58

Я использую lucera2 interlude и пытаюсь сделать пользовательский код, в котором я могу спаунить много монстров в нескольких зонах в зависимости от дня с координатами x y z. Я хочу спросить, как правильно сделать этот скрипт.

Мои попытки на данный момент:

- Мобы спаунятся, но ходят бесконечно.

- Мобы появляются, но во всех зонах.

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

*Я пытаюсь сделать следующее с TeleporterInstance

Используемый метод:

- с помощью xml-файла

- по списку массивов

Мне нужно знать следующее:

- Как спаунить/деспаунить монстров

- Как спавнить мобов в 00:00 каждый день, когда зона меняется.

- (Рекогносцировка для спавна через xml готова)

- Как добавить объявление в чат героев (%) о том, что зона меняется. (Время 00:01)


просто примечание: я новичок в программировании на java.

Если у кого-то есть свободное время, пожалуйста, объясните мне, как я могу решить эту задачу. Спасибо!

Maksim 21.09.2024 01:57

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

Деспавн можно посмотреть в квестах.

Еще как реализован спавн/деспавн мамона в катах.

Это все что могу сказать, на руках нет сборки.

Gaikotsu 21.09.2024 04:11

Цитата:

Сообщение от Demoncool

Calendar поможет рассчитать время для следующего спавна и время можно хранить в кэше/бд и его передавать в Announcements

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

Тут лучше и удобней будет использовать работу с временем в стиле Cron для получений времени спавна и т.д., например через класс SchedulingPattern, который можно стянуть из того же овера, если в люцере нет ничего похожего. Ну или можно прицепить какую нибудь либу для работы с этим, например Quartz, правда это как из пушки по воробьям будет в этом случае

Ну а в случае с SchedulingPattern получение нужного времени можно уложить чуть ли не в одну-две строки кода.

Вот как пример - начиная отсчет от текущего времени получит время наступления следующих 6:30 ночи или 18:30 вечера.

Java:


Код:

long
time
=
new
SchedulingPattern
(
"30 6 * * *|30 18 * * *"
)
.
next
(
System
.
currentTimeMillis
(
)
)
;

Цитата:

Сообщение от Artemis_37

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

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

Gaikotsu 21.09.2024 04:46

Ну я у себя для поддержки спавнов в конкретное время как раз в стандартные спавнеры овера впилил поддержку SchedulingPattern, что в целом удобно.

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

Ну т.е. к примеру был респ в час +/- полчаса

XML:


Код:


просто задал вот так и будет респ при наступлении каждого нового четного часа

XML:


Код:



๖ۣۣۜRide 21.09.2024 06:12

Цитата:

Сообщение от Demoncool

ThreadPoolManager поможет удалить всех мобов, чтобы удалить нужно при спавне добавить всех мобов в список и через н-время удалять, также будет спавнить мобов по времени календаря
Announcements даст анонсы всем игрокам
Calendar поможет рассчитать время для следующего спавна и время можно хранить в кэше/бд и его передавать в Announcements
Список нужных Location + Rnd по локациям даст рандом локу, которую также можно записать и передать в анонс

малыш ты уже давно устарел и те на ком ты наварил бабок же давно поумнели

PS2 а твой совет это просто совет школьника а ты орая я протгер прогер

Artemis_37 21.09.2024 10:24

Цитата:

Сообщение от Gaikotsu

Ну я у себя для поддержки спавнов в конкретное время как раз в стандартные спавнеры овера впилил поддержку SchedulingPattern, что в целом удобно.
В итоге теперь могу в любом спавне вместо обычного респа через заданное время тупо задать время в виде строки для cron и оно будет работать как от него и ожидается.
Ну т.е. к примеру был респ в час +/- полчаса

XML:


Код:


просто задал вот так и будет респ при наступлении каждого нового четного часа

XML:


Код:



Это хороший пример, но в моем случае все немного иначе.

Вот текущий код, как я загружаю монстров из xml-файла. Теперь у меня нет проблем, когда я бью монстра. (Он не телепортируется). Единственная проблема заключается в том, что код порождает монстров во всех зонах, а не только в активной зоне на текущий день.

Вот текущий код, как я загружаю монстров из xml-файла. Теперь у меня нет проблем, когда я бью монстра. (Он не телепортируется). Единственная проблема заключается в том, что код порождает монстров во всех зонах, а не только в активной зоне на текущий день.

В целом, мой код не хочет депаунить монстров в 00:00.

Кстати, у некоторых монстров время респауна 60 секунд, а у некоторых 800 секунд, так что я не могу использовать ваш пример с cron. Это будет хорошо для рейдовых боссов.

Java:


Код:

public
class
TeleporterInstance
extends
MerchantInstance
{
private
static
final
String
DATA_PATH
=
"data/spawn/"
;
private
static
ScheduledFuture

zoneRotationTask
;
private
static
List

activeNpcs
=
new
ArrayList
<>
(
)
;
// Constructor for TeleporterInstance
public
TeleporterInstance
(
int
objectId
,
NpcTemplate
template
)
{
super
(
objectId
,
template
)
;
startAutoZoneRotation
(
)
;
// Automatically start zone rotation when NPC is created
}
// Automatically schedules zone rotation every day at midnight
public
static
void
startAutoZoneRotation
(
)
{
runZoneRotation
(
)
;
// Perform an immediate rotation
long
timeUntilNextDay
=
calculateTimeUntilMidnight
(
)
;
// Schedule daily zone rotation at 00:00
zoneRotationTask
=
ThreadPoolManager
.
getInstance
(
)
.
scheduleAtFixedRate
(
TeleporterInstance
:
:
runZoneRotation
,
timeUntilNextDay
,
86400000
)
;
// 24 hours
}
// Run the zone rotation logic (spawn/despawn NPCs)
public
static
void
runZoneRotation
(
)
{
// Get the current day of the week to determine the active zone
DayOfWeek
currentDay
=
LocalDate
.
now
(
)
.
getDayOfWeek
(
)
;
String
dayName
=
currentDay
.
name
(
)
.
toLowerCase
(
)
;
// Get day in lowercase (e.g., "monday")
// Load NPCs from XML based on the day of the week
loadNpcsForDay
(
dayName
)
;
}
// Load NPCs for the current day from XML files
public
static
void
loadNpcsForDay
(
String
dayName
)
{
// Define zone names for each day and load respective XML files
String
[
]
zones
=
{
"devilsisle"
,
"cruma_marshlands"
,
"pagan_temple"
,
"ruins_of_despair"
}
;
// Despawn current NPCs, if any
despawnNpcs
(
)
;
// Load and spawn NPCs for each zone
for
(
String
zone
:
zones
)
{
String
filename
=
DATA_PATH
+
dayName
+
"_"
+
zone
+
".xml"
;
spawnNpcsFromXml
(
filename
)
;
}
// Announce the new active zone to players
Announcements
.
getInstance
(
)
.
announceByCustomMessage
(
"CustomZonesEvent.ZoneActive."
+
dayName
,
null
)
;
}
// Spawn NPCs from the given XML file
private
static
void
spawnNpcsFromXml
(
String
filename
)
{
try
{
// Initialize the XML parser
DocumentBuilderFactory
factory
=
DocumentBuilderFactory
.
newInstance
(
)
;
DocumentBuilder
builder
=
factory
.
newDocumentBuilder
(
)
;
Document
doc
=
builder
.
parse
(
new
File
(
filename
)
)
;
NodeList
spawnList
=
doc
.
getElementsByTagName
(
"spawn"
)
;
for
(
int
i
=
0
;
i
 element inside
NodeList
npcList
=
spawnElement
.
getElementsByTagName
(
"npc"
)
;
for
(
int
j
=
0
;
j

{
// Despawn the NPC and respawn it after the delay
if
(
!
npc
.
isDeleted
(
)
)
{
npc
.
deleteMe
(
)
;
activeNpcs
.
remove
(
npc
)
;
}
spawnAndRespawnNpc
(
npcId
,
x
,
y
,
z
,
respawnTime
)
;
// Recursively respawn the NPC
}
,
respawnTime
*
1000L
)
;
// Convert respawn time to milliseconds
}


Gaikotsu 21.09.2024 16:31

Цитата:

Сообщение от Artemis_37

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

мне кажется или ты вон в loadNpcsForDay как раз по всем зонам пробегаешься циклом и потому у тебя и везде спавн идет?

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

З.Ы. в люцере поддержки групп спавнов нет кстати что ли? а то вместо подгрузки разных файлов спавнов можно было бы манипулировать посто спавном/деспавном по именам групп.

Artemis_37 21.09.2024 19:08

Цитата:

Сообщение от Gaikotsu

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

З.Ы. в люцере поддержки групп спавнов нет кстати что ли? а то вместо подгрузки разных файлов спавнов можно было бы манипулировать посто спавном/деспавном по именам групп.

Хорошая идея с названиями групп.

HTML:


Код:


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

В отношении loadNpcsForDay я сделал некоторые изменения.

Java:


Код:

// Load NPCs for the current day from XML files
public
static
void
loadNpcsForDay
(
String
dayName
)
{
// Define zone names for each day and load respective XML files
String
[
]
zones
=
{
"devilsisle"
,
"cruma_marshlands"
,
"pagan_temple"
,
"ruins_of_despair"
}
;
// Despawn NPCs for the previous days
for
(
String
zone
:
zones
)
{
if
(
!
zone
.
equals
(
dayName
)
)
{
despawnNpcsFromZone
(
zone
)
;
// Despawn NPCs that are not for the current day
}
}
// Now, spawn NPCs for the current day
String
filename
=
DATA_PATH
+
dayName
+
"_"
+
"zone"
+
".xml"
;
spawnNpcsFromXml
(
filename
,
dayName
)
;
// Announce the new active zone to players
Announcements
.
getInstance
(
)
.
announceByCustomMessage
(
"CustomZonesEvent.ZoneActive."
+
dayName
,
null
)
;
}
// Spawn NPCs from the given XML file
private
static
void
spawnNpcsFromXml
(
String
filename
,
String
zoneName
)
{
try
{
// Initialize the XML parser
DocumentBuilderFactory
factory
=
DocumentBuilderFactory
.
newInstance
(
)
;
DocumentBuilder
builder
=
factory
.
newDocumentBuilder
(
)
;
Document
doc
=
builder
.
parse
(
new
File
(
filename
)
)
;
NodeList
spawnList
=
doc
.
getElementsByTagName
(
"spawn"
)
;
List

spawnedNpcs
=
new
ArrayList
<>
(
)
;
for
(
int
i
=
0
;
i
 element inside
NodeList
npcList
=
spawnElement
.
getElementsByTagName
(
"npc"
)
;
for
(
int
j
=
0
;
j

{
// Despawn the NPC and respawn it after the delay
if
(
!
npc
.
isDeleted
(
)
)
{
npc
.
deleteMe
(
)
;
}
spawnAndRespawnNpc
(
npcId
,
x
,
y
,
z
,
respawnTime
)
;
// Recursively respawn the NPC
}
,
respawnTime
*
1000L
)
;
// Convert respawn time to milliseconds
return
npc
;
// Return the spawned NPC
}

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


Время: 03:26