HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 20.09.2024, 23:58
Artemis_37
Участник форума
Регистрация: 22.01.2024
Сообщений: 189
С нами: 1216576

Репутация: 95
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

  #2  
Старый 21.09.2024, 01:57
Maksim
Познавший АНТИЧАТ
Регистрация: 31.01.2017
Сообщений: 1,604
С нами: 4885523

Репутация: 1085


По умолчанию

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

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

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

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

  #3  
Старый 21.09.2024, 04:11
Gaikotsu
Флудер
Регистрация: 15.08.2015
Сообщений: 2,267
С нами: 5654645

Репутация: 0


По умолчанию

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

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

  #4  
Старый 21.09.2024, 04:46
Gaikotsu
Флудер
Регистрация: 15.08.2015
Сообщений: 2,267
С нами: 5654645

Репутация: 0


По умолчанию

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

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

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

XML:


Код:

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

XML:


Код:

 
Ответить с цитированием

  #5  
Старый 21.09.2024, 06:12
๖ۣۣۜRide
Постоянный
Регистрация: 25.10.2022
Сообщений: 524
С нами: 1870912

Репутация: -73


По умолчанию

Цитата:
Сообщение от Demoncool  

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

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

  #6  
Старый 21.09.2024, 10:24
Artemis_37
Участник форума
Регистрация: 22.01.2024
Сообщений: 189
С нами: 1216576

Репутация: 95
По умолчанию

Цитата:
Сообщение от 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
}
 
Ответить с цитированием

  #7  
Старый 21.09.2024, 16:31
Gaikotsu
Флудер
Регистрация: 15.08.2015
Сообщений: 2,267
С нами: 5654645

Репутация: 0


По умолчанию

Цитата:
Сообщение от Artemis_37  

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

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

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

  #8  
Старый 21.09.2024, 19:08
Artemis_37
Участник форума
Регистрация: 22.01.2024
Сообщений: 189
С нами: 1216576

Репутация: 95
По умолчанию

Цитата:
Сообщение от 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
}
Если хотите, я могу выслать вам полный код для ознакомления (если вам интересно).
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.