Сообщений: 97
Тем: 32
Зарегистрирован: Sep 2012
Репутация:
2
Есть небольшой квест, в котором нужно заспаунить много мобов, запустить таймер (на час), в течении часа - эти мобы ведут себя как любые другие (т.е. ресаются по своему времени респауна), после того как час истек - нужно удалить из спаунлиста мобов.
Начал искать методы, нашел:
Код: List<L2NpcInstance> MobsArrayOne = new ArrayList<L2NpcInstance>();
...
MobsArrayOne.add(addSpawn(21336, 172159, 20148, -3331, 9074, false, 0));
MobsArrayOne.add(addSpawn(21336, 172333, 20148, -3331, 9074, false, 0));
MobsArrayOne.add(addSpawn(21336, 153134, 20148, -3331, 9074, false, 0));
...
после чего пытался сделать так:
Код: L2NpcInstance npc;
MobsArrayOne.deleteMe();
MobsArrayOne.remove(npc);
но что-то не хочет(
подскажите плз что я делаю не так? существуют ли более простые методы для спауна целой "кучи" и потом её аккуратного удаления?
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
а что конкретно у вас не выходит?
[src=java]
// удаляем нпс из списка
for(L2NpcInstance npc : MobsArrayOne)
npc.deleteMe();
// чистим список
MobsArrayOne.clear();
[/src]
Сообщений: 97
Тем: 32
Зарегистрирован: Sep 2012
Репутация:
2
Не список, а сам спаунлист*
Как заспаунили в мир, так и удалить из таблицы вообще )
Сообщений: 1,485
Тем: 12
Зарегистрирован: Mar 2010
Репутация:
2,994
Так у вас вверху спавн в мир есть,
Цитата:addSpawn(21336, 172159, 20148, -3331, 9074, false, 0)
а bloodshed написал очистку
Сообщений: 197
Тем: 4
Зарегистрирован: Aug 2011
Репутация:
948
Код: ArrayList<L2Npc> spawnedNpcs = new ArrayList<L2Npc>(){{
add(addSpawn(21336, 172159, 20148, -3331, 9074, false, 0));
add(addSpawn(21336, 172159, 20148, -3331, 9074, false, 0));
add(addSpawn(21336, 172159, 20148, -3331, 9074, false, 0));
}};
private void clearList(ArrayList<L2Npc> arrayList){
for (L2Npc npc : arrayList){
npc.decayMe();
}
}
private void spawnList(ArrayList<L2Npc> arrayList){
for (L2Npc npc : arrayList){
npc.spawnMe();
}
}
Написано мб не грамотно, но логика, надеюсь, понятна.
Чето я за слоупочил :<
Хотя поидее уже при создании объекта нпц заспавнится, т.е. не нужно заполнять лист в начале кода. Поэтому лучше, наверное, заспавнить когда надо и при этом уже заносить все это в лист. а потом уже удалять, после формирования листа.
Сообщений: 97
Тем: 32
Зарегистрирован: Sep 2012
Репутация:
2
Биг спс!!!
А как можно сделать по аналогу addSpawn, только если речь идет не о квестах, как я понимаю addSpawn(...) работает только в АИ, а просто в классе не хочет=/, такого метода в L2Npc нету(
Сообщений: 197
Тем: 4
Зарегистрирован: Aug 2011
Репутация:
948
halaymoon Написал:Биг спс!!!
А как можно сделать по аналогу addSpawn, только если речь идет не о квестах, как я понимаю addSpawn(...) работает только в АИ, а просто в классе не хочет=/, такого метода в L2Npc нету(
Разбирайтесь в структуре эмулятора. Никто за вас все писать не будет.
Сообщений: 97
Тем: 32
Зарегистрирован: Sep 2012
Репутация:
2
Вроде бы разобрался, только вот маленькая проблемка: Не хочет удалять мобов из спауна, собсна то о чем я говорил, это и не получилось в самом начале((
Код: protected void spawnMonsters(int respawnDelay)
{
int[][] _npcSpawns = null;
_npcSpawns = MOBS_IN_FIRST;
for(int[] npcSpawn2 : _npcSpawns)
{
FestivalSpawn currSpawn = new FestivalSpawn(npcSpawn2);
L2NpcTemplate npcTemplate = NpcTable.getInstance().getTemplate(currSpawn._npcId);
try
{
L2Spawn npcSpawn = new L2Spawn(npcTemplate);
npcSpawn.setLocx(currSpawn._x); npcSpawn.setLocy(currSpawn._y); npcSpawn.setLocz(currSpawn._z);
npcSpawn.setHeading(Rnd.nextInt(65536));
npcSpawn.setAmount(1);
npcSpawn.setRespawnDelay(respawnDelay);
npcSpawn.startRespawn();
L2NpcInstance festivalMob = (L2NpcInstance) npcSpawn.doSpawn();
SpawnTable.getInstance().addNewSpawn(npcSpawn, false);
_npcInsts.add(festivalMob);
}
catch(Exception e)
{
if(Config.ENABLE_ALL_EXCEPTIONS)
e.printStackTrace();
}
currSpawn = null;
}
}
protected void unspawnMobs()
{
if(_npcInsts != null)
{
for(L2NpcInstance monsterInst : _npcInsts)
if(monsterInst != null)
{
monsterInst.deleteMe();
}
}
}
Вот методы. Спаунит - все нормально, когда вызываю еще раз - спавнит еще . Но вот вызов unspawnMobs() не удаляет предыдущих и вообще ничего не делает =(
Вот лист, куда заносятся нпцшки:
Код: private List<L2NpcInstance> _npcInsts;
Вот сам список мобов:
Код: protected static final int[][] MOBS_IN_FIRST =
{
{172159, 20148, -3331, 0, 21336},
{172181, 20494, -3331, 0, 21336},
{171721, 20311, -3331, 0, 21336}
};
Что здесь может быть не так?(((
Сообщений: 608
Тем: 5
Зарегистрирован: Feb 2009
Репутация:
2,171
[src=java]
for(L2NpcInstance monsterInst : _npcInsts)
if(monsterInst != null)
{
L2Spawn spawn = monsterInst.getSpawn();
if(spawn != null)
spawn.despawnAll();
}
[/src]
так попробуйте
Сообщений: 183
Тем: 8
Зарегистрирован: Dec 2011
Репутация:
89
bloodshed Написал:а что конкретно у вас не выходит?
[src=java]
// удаляем нпс из списка
for(L2NpcInstance npc : MobsArrayOne)
npc.deleteMe();
// чистим список
MobsArrayOne.clear();
[/src]
offtop
А не лучше сразу MobsArrayOne = null, что бы gc очистил весь список , чем каждый элемент по отдельности ?
|