Сообщение от
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
}