Wollandessa 2 Опубликовано 27 января Всем привет парни , натолкните пожалуйста. При проверке инстансы Тиады оказалось что фонтаны тут же респаются в течение секунд 10 , мобов с них очень много вылазиет и все они этим полчищем валят игроков. Нашел id этих фонтанов - 18696 - но почему то в базе нигде нет их данных в плане редактирования их респа. Тыкните пожалуйста куда копать, в spawnlist нет, в npc - только сами статы. Сборка Дениса, Open-Team. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gaikotsu 620 Опубликовано 31 января Скорее всего через AI той же Тиат спавн идет. Ищи в скриптах по ид, где эти фонтаны упоминаются и дальше уже разбирайся что и как. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 1 февраля спасибо большое , буду копать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 7 февраля Gaikotsu, спасибо большое,нашел в АИ айди этого моба со следующим кодом. private static final int TIAT_TRANSFORMATION_SKILL_ID = 5974; private static final L2Skill TIAT_TRANSFORMATION_SKILL = SkillTable.getInstance().getInfo(TIAT_TRANSFORMATION_SKILL_ID, 1); private boolean _notUsedTransform = true; private static final int TRAPS_COUNT = 4; private static final Location[] TRAP_LOCS = { new Location(-248776, 206872, -11968), new Location(-252024, 206872, -11968), new Location(-251544, 209592, -11968), new Location(-249256, 209592, -11968) }; private ArrayList<L2MonsterInstance> _traps = new ArrayList<L2MonsterInstance>(TRAPS_COUNT); private ScheduledFuture<?> _trapsSpawnTask; private ScheduledFuture<?> _DeadMovieTask; private static final long TRAPS_SPAWN_INTERVAL = 3 * 60 * 1000; // 3 РјРёРЅ private static final long COLLAPSE_BY_INACTIVITY_INTERVAL = 10 * 60 * 1000; // 10 РјРёРЅ private long _lastAttackTime = 0; private static final int TRAP_NPC_ID = 18696; private static final int TIAT_MINION_ID = 29162; private long _lastFactionNotifyTime = 0; Подскажите где что поменять чтобы респ фонтанов стал минуты 2 хотя бы а не 30 секунд. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Formatter 14 Опубликовано 7 февраля Там же в коде нужно смотреть как сделан спаун этих фонтанов, вероятно там явно указано время, а не переменная TRAPS_SPAWN_INTERVAL, что то вроде этого: actor.getReflection().addSpawnWithRespawn(TRAP_NPC_ID, TRAP_LOCS, 0, тут время); Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 8 февраля Весь лог АИ Тиады ! Так и не нашел респа - тыкните пожалуйста носом) package ai; import java.util.ArrayList; import java.util.concurrent.ScheduledFuture; import l2open.common.*; import l2open.config.ConfigValue; import l2open.gameserver.ai.CtrlEvent; import l2open.gameserver.ai.Fighter; import l2open.gameserver.idfactory.IdFactory; import l2open.gameserver.instancemanager.ServerVariables; import l2open.gameserver.model.L2Character; import l2open.gameserver.model.L2Player; import l2open.gameserver.model.L2Skill; import l2open.gameserver.model.Reflection; import l2open.gameserver.model.instances.L2MonsterInstance; import l2open.gameserver.model.instances.L2NpcInstance; import l2open.gameserver.serverpackets.ExShowScreenMessage; import l2open.gameserver.serverpackets.ExStartScenePlayer; import l2open.gameserver.serverpackets.ExShowScreenMessage.ScreenMessageAlign; import l2open.gameserver.tables.NpcTable; import l2open.gameserver.tables.SkillTable; import l2open.util.Location; import l2open.util.Log; /** * AI Р±РѕСЃР° Tiat (ID: 29163). * * @author SYS */ public class Tiat extends Fighter { private static final int TIAT_TRANSFORMATION_SKILL_ID = 5974; private static final L2Skill TIAT_TRANSFORMATION_SKILL = SkillTable.getInstance().getInfo(TIAT_TRANSFORMATION_SKILL_ID, 1); private boolean _notUsedTransform = true; private static final int TRAPS_COUNT = 4; private static final Location[] TRAP_LOCS = { new Location(-248776, 206872, -11968), new Location(-252024, 206872, -11968), new Location(-251544, 209592, -11968), new Location(-249256, 209592, -11968) }; private ArrayList<L2MonsterInstance> _traps = new ArrayList<L2MonsterInstance>(TRAPS_COUNT); private ScheduledFuture<?> _trapsSpawnTask; private ScheduledFuture<?> _DeadMovieTask; private static final long TRAPS_SPAWN_INTERVAL = 3 * 60 * 1000; // 3 РјРёРЅ private static final long COLLAPSE_BY_INACTIVITY_INTERVAL = 10 * 60 * 1000; // 10 РјРёРЅ private long _lastAttackTime = 0; private static final int TRAP_NPC_ID = 18696; private static final int TIAT_MINION_ID = 29162; private long _lastFactionNotifyTime = 0; public Tiat(L2Character actor) { super(actor); } @Override public boolean isGlobalAI() { return true; } @Override protected void onEvtSpawn() { L2NpcInstance actor = getActor(); if(actor == null) return; actor.p_block_move(true, null); } @Override protected void ATTACKED(L2Character attacker, int damage, L2Skill skill) { L2NpcInstance actor = getActor(); if(actor == null) return; _lastAttackTime = System.currentTimeMillis(); if(_notUsedTransform && actor.getCurrentHpPercents() < 50) { actor.p_block_move(false, null); _notUsedTransform = false; // Если РІРґСЂСѓРі запущен таск, останавливаем его if(_trapsSpawnTask != null) { System.out.println("WARNING! Tiat AI: _trapsSpawnTask already running!"); _trapsSpawnTask.cancel(true); _trapsSpawnTask = null; } _trapsSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new TrapsSpawnTask(), 1, TRAPS_SPAWN_INTERVAL); clearTasks(); addTaskBuff(actor, TIAT_TRANSFORMATION_SKILL); } if(System.currentTimeMillis() - _lastFactionNotifyTime > actor.minFactionNotifyInterval) { for(L2NpcInstance npc : actor.getAroundNpc(10000, 500)) if(npc.getNpcId() == TIAT_MINION_ID) npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, new Object[] { attacker, 1 }); _lastFactionNotifyTime = System.currentTimeMillis(); } super.ATTACKED(attacker, damage, skill); } @Override protected boolean thinkActive() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return true; // Коллапсируем инстанс, если Тиата РЅРµ били более 10 РјРёРЅ if(_lastAttackTime != 0 && _lastAttackTime + COLLAPSE_BY_INACTIVITY_INTERVAL < System.currentTimeMillis()) { final Reflection r = actor.getReflection(); // Очищаем инстанс, запускаем 5 РјРёРЅ коллапс r.clearReflection(5, true); // Показываем финальный ролик РїСЂРё фейле серез секунду после очистки инстанса ThreadPoolManager.getInstance().schedule(new RunnableImpl(){ @Override public void runImpl() { for(L2Player pl : r.getPlayers()) if(pl != null) pl.showQuestMovie(ExStartScenePlayer.SCENE_TIAT_FAIL); } }, 1000); return true; } return super.thinkActive(); } @Override protected void MY_DYING(L2Character killer) { _notUsedTransform = true; _lastAttackTime = 0; _lastFactionNotifyTime = 0; if(_trapsSpawnTask != null) { _trapsSpawnTask.cancel(true); _trapsSpawnTask = null; } L2NpcInstance actor = getActor(); if(actor == null) return; // Переключаем SoD РІ режим СЃР±РѕСЂР° атрибут камней if(actor.getTemplate().killscount >= ConfigValue.SeedofDestructionOpenKillFirst && actor.getTemplate().killscount % ConfigValue.SeedofDestructionOpenKill == 0) if(ServerVariables.getLong("SoD_opened", 0) * 1000L + ConfigValue.SeedofDestructionOpenTime * 60 * 60 * 1000L < System.currentTimeMillis()) ServerVariables.set("SoD_opened", System.currentTimeMillis() / 1000L); final Reflection r = actor.getReflection(); r.setReenterTime(); for(L2NpcInstance npc : r.getNpcs()) if(npc != null) npc.deleteMe(); // Очищаем инстанс, запускаем 5 РјРёРЅ коллапс r.clearReflection(5, true); // Показываем финальный ролик серез секунду после очистки инстанса if(_DeadMovieTask == null) _DeadMovieTask = ThreadPoolManager.getInstance().schedule(new MovieTask(r), 1000); } public class MovieTask extends l2open.common.RunnableImpl { private Reflection _r; public MovieTask(Reflection r) { _r = r; } public void runImpl() { for(L2Player pl : _r.getPlayers()) if(pl != null) pl.showQuestMovie(ExStartScenePlayer.SCENE_TIAT_SUCCESS); } } @Override protected boolean randomWalk() { return false; } public class TrapsSpawnTask extends l2open.common.RunnableImpl { public void runImpl() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return; actor.broadcastPacket(new ExShowScreenMessage("Воины защитите свою Королеву.", 3000, ScreenMessageAlign.MIDDLE_CENTER, false)); Reflection r = actor.getReflection(); for(int index = 0; index < TRAPS_COUNT; index++) { // РќРµ спауним ловушки, если РѕРЅРё уже есть РІ том месте L2MonsterInstance oldTrap = null; if(index < _traps.size()) oldTrap = _traps.get(index); if(oldTrap != null && !oldTrap.isDead()) continue; L2MonsterInstance trap = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(TRAP_NPC_ID)); trap.setSpawnedLoc(TRAP_LOCS[index]); trap.setReflection(r); trap.onSpawn(); trap.spawnMe(trap.getSpawnedLoc()); r.addSpawn(trap.getSpawn()); Log.add("TrapsSpawnTask["+trap+"]["+r+"]: "+trap.getLoc(), "debug_tiat_spawn"); if(index < _traps.size()) _traps.remove(index); _traps.add(index, trap); } } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 8 февраля Нашел именно АИ этого НПСа. Но респа все равно не вижу package ai; import java.util.concurrent.ScheduledFuture; import l2open.common.ThreadPoolManager; import l2open.gameserver.ai.CtrlEvent; import l2open.gameserver.ai.DefaultAI; import l2open.gameserver.idfactory.IdFactory; import l2open.gameserver.model.L2Character; import l2open.gameserver.model.L2ObjectsStorage; import l2open.gameserver.model.Reflection; import l2open.gameserver.model.instances.L2MonsterInstance; import l2open.gameserver.model.instances.L2NpcInstance; import l2open.gameserver.serverpackets.ExShowScreenMessage; import l2open.gameserver.serverpackets.ExShowScreenMessage.ScreenMessageAlign; import l2open.gameserver.tables.NpcTable; import l2open.util.Location; import l2open.util.Rnd; import l2open.util.reference.*; /** * AI Dimension Moving Device РІ Seed of Destruction: * * Р�Р· ловушки спаунятся РјРѕР±С‹ СЃ задержкой РІ 3 сек через 5 сек после спауна РІ следующей последовательности: * Dragon Steed Troop Commander * White Dragon Leader * Dragon Steed Troop Healer (not off-like) * Dragon Steed Troop Magic Leader * Dragon Steed Troop Javelin Thrower * * @author SYS */ public class DimensionMovingDevice extends DefaultAI { private static final int TIAT_NPC_ID = 29163; private static final int INIT_DELAY = 5 * 1000; // 5 сек private static final int MOBS_DELAY = 3 * 1000; // 3 сек private static final int MOBS_WAVE_DELAY = 90 * 1000; // 1.5 РјРёРЅ между волнами РјРѕР±РѕРІ private static final int[] MOBS = { 22538, // Dragon Steed Troop Commander 22540, // White Dragon Leader 22547, // Dragon Steed Troop Healer 22542, // Dragon Steed Troop Magic Leader 22548 // Dragon Steed Troop Javelin Thrower }; private static final Location TIATROOM_LOC = new Location(-250408, 208568, -11968); private ScheduledFuture<?> _mobssSpawnTask; private long _search_timeout = 0; private static long _spawnTime = 0; // static для всех ловушек private HardReference<? extends L2NpcInstance> _tiat_ref = HardReferences.emptyRef(); public DimensionMovingDevice(L2Character actor) { super(actor); } @Override public boolean isGlobalAI() { return true; } @Override protected void onEvtSpawn() { L2NpcInstance actor = getActor(); if(actor == null) return; _spawnTime = System.currentTimeMillis(); if(_mobssSpawnTask == null) _mobssSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new MobssSpawnTask(), INIT_DELAY, MOBS_WAVE_DELAY); } @Override protected void MY_DYING(L2Character killer) { if(_mobssSpawnTask != null) { _mobssSpawnTask.cancel(true); _mobssSpawnTask = null; } _spawnTime = 0; L2NpcInstance actor = getActor(); if(actor == null) return; if(checkAllDestroyed(actor.getNpcId(), actor.getReflection().getId())) { L2NpcInstance tiat = findTiat(actor.getReflection().getId()); if(tiat != null && !tiat.isDead()) tiat.broadcastPacket(new ExShowScreenMessage("You'll regret challenging me!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false)); } super.MY_DYING(killer); } /** * Возвращает L2NpcInstance Р±РѕСЃР° Tiat РІ отражении actor-Р°. * Если РЅРµ найден, возвращает null. */ private L2NpcInstance findTiat(long refId) { L2NpcInstance _tiat = _tiat_ref.get(); if(_tiat != null) return _tiat; // Р�щем Тиата РЅРµ чаще, чем раз РІ 10 секунд, если РїРѕ каким-то причинам его нету if(System.currentTimeMillis() > _search_timeout) { _search_timeout = System.currentTimeMillis() + 10000; for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(TIAT_NPC_ID, true)) if(npc.getReflection().getId() == refId) { _tiat_ref = npc.getRef(); return npc; } } return null; } /** * Проверяет, уничтожены ли РІСЃРµ Dimension Moving Device РІ текущем измерении * @return true если РІСЃРµ уничтожены */ private static boolean checkAllDestroyed(int mobId, long refId) { for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(mobId, true)) if(npc.getReflection().getId() == refId) return false; return true; } @Override protected boolean randomWalk() { return false; } /** * Таск запускает волну спауна РјРѕР±РѕРІ */ public class MobssSpawnTask extends l2open.common.RunnableImpl { public void runImpl() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return; // РќРµ кричим РїСЂРё первой волне РјРѕР±РѕРІ L2NpcInstance tiat = findTiat(actor.getReflection().getId()); if(tiat != null && !tiat.isDead() && _spawnTime + MOBS_WAVE_DELAY < System.currentTimeMillis()) tiat.broadcastPacket(new ExShowScreenMessage("Уничтожить незванцев !!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false)); long delay = 0; for(int mobId : MOBS) { ThreadPoolManager.getInstance().schedule(new SpawnerTask(mobId), delay); delay += MOBS_DELAY; } } } /** * Таск спаунит РјРѕР±РѕРІ РІ волне */ public class SpawnerTask extends l2open.common.RunnableImpl { private int _mobId; public SpawnerTask(int mobId) { _mobId = mobId; } public void runImpl() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return; Reflection r = actor.getReflection(); L2MonsterInstance mob = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(_mobId)); mob.setSpawnedLoc(actor.getLoc()); mob.setReflection(r); mob.onSpawn(); mob.spawnMe(mob.getSpawnedLoc()); mob.setRunning(); mob.getAI().setMaxPursueRange(20000); mob.getAI().setGlobalAggro(0); // После спауна РјРѕР±С‹ бегут Рє тиату или РІ фортресс, если тиата еще нету L2NpcInstance tiat = findTiat(r.getId()); Location homeLoc; if(tiat != null && !tiat.isDead()) { homeLoc = Rnd.coordsRandomize(tiat.getLoc(), 200, 500); mob.setSpawnedLoc(homeLoc); mob.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, tiat.getRandomHated(), 1); mob.getAI().addTaskMove(homeLoc, true); } else { homeLoc = Rnd.coordsRandomize(TIATROOM_LOC, 200, 500); mob.setSpawnedLoc(homeLoc); mob.getAI().addTaskMove(homeLoc, true); } } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Saltfire 83 Опубликовано 8 февраля (изменено) 2 часа назад, Wollandessa сказал: Нашел именно АИ этого НПСа. Но респа все равно не вижу Spawn.java или L2Spawn.java аи то тут причем. Изменено 8 февраля пользователем Saltfire 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
JoeyTribbiani 821 Опубликовано 8 февраля @Wollandessa будьте так любезны в следующий раз(ы) публиковать код под спойлер. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 8 февраля Хорошо, извините пожалуйста 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Wollandessa 2 Опубликовано 8 февраля 41 минуту назад, Saltfire сказал: Spawn.java или L2Spawn.java аи то тут причем. Там точно нет, уперся в это Спойлер * AI Dimension Moving Device РІ Seed of Destruction: * * Р�Р· ловушки спаунятся РјРѕР±С‹ СЃ задержкой РІ 3 сек через 5 сек после спауна РІ следующей последовательности: * Dragon Steed Troop Commander * White Dragon Leader * Dragon Steed Troop Healer (not off-like) * Dragon Steed Troop Magic Leader * Dragon Steed Troop Javelin Thrower * * @author SYS */ public class DimensionMovingDevice extends DefaultAI { private static final int TIAT_NPC_ID = 29163; private static final int INIT_DELAY = 5 * 1000; // 5 сек private static final int MOBS_DELAY = 3 * 1000; // 3 сек private static final int MOBS_WAVE_DELAY = 90 * 1000; // 1.5 РјРёРЅ между волнами РјРѕР±РѕРІ private static final int[] MOBS = { 22538, // Dragon Steed Troop Commander 22540, // White Dragon Leader 22547, // Dragon Steed Troop Healer 22542, // Dragon Steed Troop Magic Leader 22548 // Dragon Steed Troop Javelin Thrower }; private static final Location TIATROOM_LOC = new Location(-250408, 208568, -11968); private ScheduledFuture<?> _mobssSpawnTask; private long _search_timeout = 0; private static long _spawnTime = 0; // static для всех ловушек private HardReference<? extends L2NpcInstance> _tiat_ref = HardReferences.emptyRef(); public DimensionMovingDevice(L2Character actor) { super(actor); } @Override public boolean isGlobalAI() { return true; } @Override protected void onEvtSpawn() { L2NpcInstance actor = getActor(); if(actor == null) return; _spawnTime = System.currentTimeMillis(); if(_mobssSpawnTask == null) _mobssSpawnTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new MobssSpawnTask(), INIT_DELAY, MOBS_WAVE_DELAY); } @Override protected void MY_DYING(L2Character killer) { if(_mobssSpawnTask != null) { _mobssSpawnTask.cancel(true); _mobssSpawnTask = null; } _spawnTime = 0; L2NpcInstance actor = getActor(); if(actor == null) return; if(checkAllDestroyed(actor.getNpcId(), actor.getReflection().getId())) { L2NpcInstance tiat = findTiat(actor.getReflection().getId()); if(tiat != null && !tiat.isDead()) tiat.broadcastPacket(new ExShowScreenMessage("You'll regret challenging me!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false)); } super.MY_DYING(killer); } /** * Возвращает L2NpcInstance Р±РѕСЃР° Tiat РІ отражении actor-Р°. * Если РЅРµ найден, возвращает null. */ private L2NpcInstance findTiat(long refId) { L2NpcInstance _tiat = _tiat_ref.get(); if(_tiat != null) return _tiat; // Р�щем Тиата РЅРµ чаще, чем раз РІ 10 секунд, если РїРѕ каким-то причинам его нету if(System.currentTimeMillis() > _search_timeout) { _search_timeout = System.currentTimeMillis() + 10000; for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(TIAT_NPC_ID, true)) if(npc.getReflection().getId() == refId) { _tiat_ref = npc.getRef(); return npc; } } return null; } /** * Проверяет, уничтожены ли РІСЃРµ Dimension Moving Device РІ текущем измерении * @return true если РІСЃРµ уничтожены */ private static boolean checkAllDestroyed(int mobId, long refId) { for(L2NpcInstance npc : L2ObjectsStorage.getAllByNpcId(mobId, true)) if(npc.getReflection().getId() == refId) return false; return true; } @Override protected boolean randomWalk() { return false; } /** * Таск запускает волну спауна РјРѕР±РѕРІ */ public class MobssSpawnTask extends l2open.common.RunnableImpl { public void runImpl() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return; // РќРµ кричим РїСЂРё первой волне РјРѕР±РѕРІ L2NpcInstance tiat = findTiat(actor.getReflection().getId()); if(tiat != null && !tiat.isDead() && _spawnTime + MOBS_WAVE_DELAY < System.currentTimeMillis()) tiat.broadcastPacket(new ExShowScreenMessage("Whoaaaaaa!!!!", 3000, ScreenMessageAlign.MIDDLE_CENTER, false)); long delay = 0; for(int mobId : MOBS) { ThreadPoolManager.getInstance().schedule(new SpawnerTask(mobId), delay); delay += MOBS_DELAY; } } } /** * Таск спаунит РјРѕР±РѕРІ РІ волне */ public class SpawnerTask extends l2open.common.RunnableImpl { private int _mobId; public SpawnerTask(int mobId) { _mobId = mobId; } public void runImpl() { L2NpcInstance actor = getActor(); if(actor == null || actor.isDead()) return; Reflection r = actor.getReflection(); L2MonsterInstance mob = new L2MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(_mobId)); mob.setSpawnedLoc(actor.getLoc()); mob.setReflection(r); mob.onSpawn(); mob.spawnMe(mob.getSpawnedLoc()); mob.setRunning(); mob.getAI().setMaxPursueRange(20000); mob.getAI().setGlobalAggro(0); // После спауна РјРѕР±С‹ бегут Рє тиату или РІ фортресс, если тиата еще нету L2NpcInstance tiat = findTiat(r.getId()); Location homeLoc; if(tiat != null && !tiat.isDead()) { homeLoc = Rnd.coordsRandomize(tiat.getLoc(), 200, 500); mob.setSpawnedLoc(homeLoc); mob.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, tiat.getRandomHated(), 1); mob.getAI().addTaskMove(homeLoc, true); } else { homeLoc = Rnd.coordsRandomize(TIATROOM_LOC, 200, 500); mob.setSpawnedLoc(homeLoc); mob.getAI().addTaskMove(homeLoc, true); } } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты