/* This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan Christian Meyer <vimes@odinms.de> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License version 3 as published by the Free Software Foundation. You may not use, modify or distribute this program under any other version of the GNU Affero General Public License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package server.maps; import client.MapleCharacter; import client.MapleClient; import client.MapleTrait.MapleTraitType; import constants.GameConstants; import handling.channel.ChannelServer; import handling.world.MaplePartyCharacter; import java.awt.Point; import server.Randomizer; import server.Timer.MapTimer; import server.life.MapleLifeFactory; import server.quest.MapleQuest; import tools.FileoutputUtil; import tools.packet.CField; public class Event_DojoAgent { private final static int baseAgentMapId = 970030000; // 9500337 = mano private final static Point point1 = new Point(140, 0), point2 = new Point(-193, 0), point3 = new Point(355, 0); public static boolean warpStartAgent(final MapleCharacter c, final boolean party) { final int stage = 1; final int mapid = baseAgentMapId + (stage * 100); final ChannelServer ch = c.getClient().getChannelServer(); for (int i = mapid; i < mapid + 15; i++) { final MapleMap map = ch.getMapFactory().getMap(i); if (map.getCharactersSize() == 0) { clearMap(map, false); c.changeMap(map, map.getPortal(0)); map.respawn(true); return true; } } return false; } public static boolean warpNextMap_Agent(final MapleCharacter c, final boolean fromResting) { final int currentmap = c.getMapId(); final int thisStage = (currentmap - baseAgentMapId) / 100; MapleMap map = c.getMap(); if (map.getSpawnedMonstersOnMap() > 0) { return false; } if (!fromResting) { clearMap(map, true); c.modifyCSPoints(1, 40, true); } final ChannelServer ch = c.getClient().getChannelServer(); if (currentmap >= 970032700 && currentmap <= 970032800) { map = ch.getMapFactory().getMap(baseAgentMapId); c.changeMap(map, map.getPortal(0)); return true; } final int nextmapid = baseAgentMapId + ((thisStage + 1) * 100); for (int i = nextmapid; i < nextmapid + 7; i++) { map = ch.getMapFactory().getMap(i); if (map.getCharactersSize() == 0) { clearMap(map, false); c.changeMap(map, map.getPortal(0)); c.updateInfoQuest(7281, "item=0;chk=0;cNum=0;sec=15;stage=" + (thisStage - 1) + ";lBonus=0"); c.updateInfoQuest(7281, "item=0;chk=0;cNum=0;sec=15;stage=" + (thisStage) + ";lBonus=0"); c.updateInfoQuest(7214, "15"); c.updateInfoQuest(7215, "stage=" + (thisStage + 1) + ";type=1;token=3"); c.updateInfoQuest(7215, "stage=" + (thisStage + 1) + ";type=1;token=3"); map.respawn(true); return true; } } return false; } public static boolean warpStartDojo(final MapleCharacter c, final boolean party, final MapleMap currentmap) { int stage = 1; if (party || stage <= -1 || stage > 38) { stage = 1; } int mapid = currentmap.getId();//925020000 + (stage * 100); boolean canenter = false; final ChannelServer ch = c.getClient().getChannelServer(); for (int x = 0; x < 10; x++) { //15 maps each stage boolean canenterr = true; for (int i = 1; i <= 47; i++) { //only 40 stages, but 47 maps MapleMap map = ch.getMapFactory().getMap(925020000 + 100 * i + x);//normal mode if (map.getCharactersSize() > 0) { canenterr = false; break; } else { clearMap(map, false); } } if (canenterr) { canenter = true; mapid += x; break; } } for (int x = 0; x < 10; x++) { //15 maps each stage // make this better..... boolean canenterr = true; for (int i = 1; i <= 47; i++) { //only 40 stages, but 47 maps MapleMap map = ch.getMapFactory().getMap(925030000 + 100 * i + x);//hard mode if (map.getCharactersSize() > 0) { canenterr = false; break; } else { clearMap(map, false); } } if (canenterr) { canenter = true; mapid += x; break; } } final MapleMap map = ch.getMapFactory().getMap(mapid); final MapleMap mapidd = c.getMap(); if (canenter) { if (party && c.getParty() != null) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = mapidd.getCharacterById(mem.getId()); if (chr != null && chr.isAlive()) { chr.changeMap(map, map.getPortal(0)); } } } else { c.changeMap(map, map.getPortal(0)); } spawnMonster(map, stage); } return canenter; } public static void failed(final MapleCharacter c) { final MapleMap currentmap = c.getMap(); final MapleMap deadMap = c.getClient().getChannelServer().getMapFactory().getMap(925020002); if (c.getParty() != null && c.getParty().getMembers().size() > 1) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { chr.changeMap(deadMap, deadMap.getPortal(0)); } } } } // Resting rooms : // 925020600 ~ 925020609 // 925021200 ~ 925021209 // 925021800 ~ 925021809 // 925022400 ~ 925022409 // 925023000 ~ 925023009 // 925023600 ~ 925023609 // 925024200 ~ 925024209 public static boolean warpNextMap(final MapleCharacter c, final boolean fromResting, final MapleMap currentmap) { try { final int temp = (currentmap.getId() - 925000000) / 100; final int thisStage = (int) (temp - ((temp / 100) * 100)); final int points = getDojoPoints(thisStage); final ChannelServer ch = c.getClient().getChannelServer(); final MapleMap deadMap = ch.getMapFactory().getMap(925020002); if (!c.isAlive()) { //shouldn't happen c.changeMap(deadMap, deadMap.getPortal(0)); return true; } final MapleMap map = ch.getMapFactory().getMap(currentmap.getId() + 100); if (!fromResting && map != null) { clearMap(currentmap, true); if (c.getParty() != null && c.getParty().getMembers().size() > 1) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { final int point = (points * 3); c.getTrait(MapleTraitType.will).addExp(points, c); chr.modifyCSPoints(1, point * 4, true); final int dojo = chr.getIntRecord(GameConstants.DOJO) + point; chr.getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData(String.valueOf(dojo)); //chr.getClient().getSession().write(WvsContext.Mulung_Pts(point, dojo)); } } } else { final int point = (points * 4); c.getTrait(MapleTraitType.will).addExp(points, c); c.modifyCSPoints(1, point * 4, true); final int dojo = c.getIntRecord(GameConstants.DOJO) + point; c.getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData(String.valueOf(dojo)); //c.getClient().getSession().write(WvsContext.Mulung_Pts(point, dojo)); } } if (currentmap.getId() >= 925023800 && currentmap.getId() <= 925023814) { final MapleMap lastMap = ch.getMapFactory().getMap(925020003); if (c.getParty() != null && c.getParty().getMembers().size() > 1) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { if (!chr.isAlive()) { chr.addHP(50); } chr.changeMap(lastMap, lastMap.getPortal(1)); final int point = (points * 3); c.getTrait(MapleTraitType.will).addExp(points, c); final int dojo = chr.getIntRecord(GameConstants.DOJO) + point; chr.getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData(String.valueOf(dojo)); //chr.getClient().getSession().write(WvsContext.Mulung_Pts(point, dojo)); chr.modifyCSPoints(1, 5000, true); } } } else { c.changeMap(lastMap, lastMap.getPortal(1)); final int point = (points * 4); c.getTrait(MapleTraitType.will).addExp(points, c); final int dojo = c.getIntRecord(GameConstants.DOJO) + point; c.getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData(String.valueOf(dojo)); //c.getClient().getSession().write(WvsContext.Mulung_Pts(point, dojo)); c.modifyCSPoints(1, currentmap.getCharactersSize() > 1 ? 5000 : 7500, true); } return true; }if (currentmap.getId() == 925020001){//925030100 925020001 // final MapleMap mappzz = ch.getMapFactory().getMap(925030100);//rooftop // c.changeMap(mappzz, mappzz.getPortal(0)); }else if (currentmap.getId() == 925021100) {//End Normal final MapleMap mappzz = ch.getMapFactory().getMap(925020003);//rooftop c.changeMap(mappzz, mappzz.getPortal(1)); }else if (currentmap.getId() == 925032300) {//End Hard final MapleMap mappzz = ch.getMapFactory().getMap(925020003);//rooftop c.changeMap(mappzz, mappzz.getPortal(1)); c.getClient().getSession().write(CField.UIPacket.openUI(72));// Dojo ui TODO add points? } else { //final int nextmapid = 925020000 + ((thisStage + 1) * 100); if (map != null && map.getCharactersSize() == 0) { clearMap(map, false); if (c.getParty() != null) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { if (!chr.isAlive()) { chr.addHP(50); } chr.changeMap(map, map.getPortal(0)); } } } else { c.changeMap(map, map.getPortal(0)); } // for (int i = 0; i < 2; i++) { // c.updateInfoQuest(7215, "stage=1;type=1;token=3"); // } c.updateInfoQuest(7281, "item=0;chk=0;cNum=0;sec=15;stage=" + (thisStage - 1) + ";lBonus=0"); c.updateInfoQuest(7281, "item=0;chk=0;cNum=0;sec=15;stage=" + (thisStage) + ";lBonus=0"); c.updateInfoQuest(7214, "15"); c.updateInfoQuest(7215, "stage=" + (thisStage + 1) + ";type=1;token=3"); c.updateInfoQuest(7215, "stage=" + (thisStage + 1) + ";type=1;token=3"); spawnMonster(map, thisStage + 1); return true; } else if (map != null) { //wtf, find a new map int basemap = currentmap.getId() / 100 * 100 + 100; for (int x = 0; x < 10; x++) { MapleMap mapz = ch.getMapFactory().getMap(basemap + x); if (mapz.getCharactersSize() == 0) { clearMap(mapz, false); if (c.getParty() != null) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { if (!chr.isAlive()) { chr.addHP(50); } chr.changeMap(mapz, mapz.getPortal(0)); } } } else { c.changeMap(mapz, mapz.getPortal(0)); } for (int i = 0; i < 2; i++) { c.updateInfoQuest(7215, "stage=1;type=1;token=3"); } spawnMonster(mapz, thisStage + 1); return true; } } } final MapleMap mappz = ch.getMapFactory().getMap(925020001); if (c.getParty() != null) { for (MaplePartyCharacter mem : c.getParty().getMembers()) { MapleCharacter chr = currentmap.getCharacterById(mem.getId()); if (chr != null) { chr.dropMessage(5, "An error has occurred and you shall be brought to the beginning."); chr.changeMap(mappz, mappz.getPortal(0)); } } } else { c.dropMessage(5, "An error has occurred and you shall be brought to the beginning."); c.changeMap(mappz, mappz.getPortal(0)); } } } catch (Exception rm) { FileoutputUtil.outputFileError(FileoutputUtil.PacketEx_Log, rm); } return false; } private static void clearMap(final MapleMap map, final boolean check) { if (check) { if (map.getCharactersSize() != 0) { return; } } map.resetFully(); } private static int getDojoPoints(final int stage) { switch (stage) { case 1: case 2: case 3: case 4: case 5: return 1; case 7: case 8: case 9: case 10: case 11: return 2; case 13: case 14: case 15: case 16: case 17: return 3; case 19: case 20: case 21: case 22: case 23: return 4; case 25: case 26: case 27: case 28: case 29: return 5; case 31: case 32: case 33: case 34: case 35: return 6; case 37: case 38: return 7; default: return 0; } } private static void spawnMonster(final MapleMap map, final int stage) { final int mobid; /*mobid = 9300183 + stage; if (mobid < 9300184 || mobid > 9300215) { return; }*/ //// mobid = 9305100 + stage - 1; //// if (mobid < 9305100 || mobid > 9305139) { //// return; //// } //For normal stages final int[] mob1 = {9300209, 9300184, 9300191, 9300185};//bluedad, mano, mushmom, sumpy int stage1 = mob1[Randomizer.nextInt(mob1.length)]; final int[] mob2 = {9300196, 9300187, 9300194, 9300190};//zombiemom, kingslime, dyle, kingclang int stage2 = mob2[Randomizer.nextInt(mob2.length)]; final int[] mob3 = {9300189, 9300204};//faust, eliza int stage3 = mob3[Randomizer.nextInt(mob3.length)]; final int[] mob4 = {9300203, 9300199};//jrbalrog, ninetail int stage4 = mob4[Randomizer.nextInt(mob4.length)]; final int[] mob5 = {9300186, 9300197, 9300193};//deo, zeno, timer int stage5 = mob5[Randomizer.nextInt(mob5.length)]; final int[] mob6 = {9300207, 9300200, 9300195};//snakbar, taerone, papapixie int stage6 = mob6[Randomizer.nextInt(mob6.length)]; final int[] mob7 = {9300192, 9300198};//alishar, lordpirate int stage7 = mob7[Randomizer.nextInt(mob7.length)]; final int[] mob8 = {9300205};//Frankenroid int stage8 = mob8[Randomizer.nextInt(mob8.length)]; final int[] mob9 = {9300206};//chimera int stage9 = mob9[Randomizer.nextInt(mob9.length)]; final int[] mob10 = {9300215};//mugong int stage10 = mob10[Randomizer.nextInt(mob10.length)]; switch (stage) { case 1: mobid = stage1; break; case 2: mobid = stage2; break; case 3: mobid = stage3; break; case 4: mobid = stage4; break; case 5: mobid = stage5; break; case 7: mobid = stage6; break; case 8: mobid = stage7; break; case 9: mobid = stage8; break; case 10: mobid = stage9; break; case 11: if(map.getId() == 925021100){//last stage normal mobid = stage10; }else{ mobid = 9300201;//poison golem } break; case 13: mobid = 9300188; // Giant Centipede break; case 14: mobid = 9300211; // Manon break; case 15: mobid = 9300208; // Snowman break; case 16: mobid = 9300214; // Papulatus break; case 17: mobid = 9305134; // Ani break; case 19: mobid = 9300213; // Leviathan break; case 20: mobid = 9305136; // Dodo break; case 21: mobid = 9305137; // Lilynouch break; case 22: mobid = 9305138; // Lyka break; case 23: mobid = 9305139; // Mu Gong break; default: return; } // switch (stage) { // case 1: // mobid = 9300184; // Mano // break; // case 2: // mobid = 9300185; // Stumpy // break; // case 3: // mobid = 9300186; // Dewu // break; // case 4: // mobid = 9300187; // King Slime // break; // case 5: // mobid = 9300188; // Giant Centipede // break; // case 7: // mobid = 9300189; // Faust // break; // case 8: // mobid = 9300190; // King Clang // break; // case 9: // mobid = 9300191; // Mushmom // break; // case 10: // mobid = 9300192; // Alishar // break; // case 11: // mobid = 9300193; // Timer // break; // case 13: // mobid = 9300194; // Dale // break; // case 14: // mobid = 9300195; // Papa Pixie // break; // case 15: // mobid = 9300196; // Zombie Mushmom // break; // case 16: // mobid = 9300197; // Jeno // break; // case 17: // mobid = 9300198; // Lord Pirate // break; // case 19: // mobid = 9300199; // Old Fox // break; // case 20: // mobid = 9300200; // Tae Roon // break; // case 21: // mobid = 9300201; // Poison Golem // break; // case 22: // mobid = 9300202; // Ghost Priest // break; // case 23: // mobid = 9300203; // Jr. Balrog // break; // case 25: // mobid = 9300204; // Eliza // break; // case 26: // mobid = 9300205; // Frankenroid // break; // case 27: // mobid = 9300206; // Chimera // break; // case 28: // mobid = 9300207; // Snack Bar // break; // case 29: // mobid = 9300208; // Snowman // break; // case 31: // mobid = 9300209; // Blue Mushmom // break; // case 32: // mobid = 9300210; // Crimson Balrog // break; // case 33: // mobid = 9300211; // Manon // break; // case 34: // mobid = 9300212; // Griffey // break; // case 35: // mobid = 9300213; // Leviathan // break; // case 37: // mobid = 9300214; // Papulatus // break; // case 38: // mobid = 9300215; // Mu gong // break; // default: // return; // } if (mobid != 0) { final int rand = Randomizer.nextInt(3); MapTimer.getInstance().schedule(new Runnable() { @Override public void run() { map.spawnMonsterWithEffect(MapleLifeFactory.getMonster(mobid), 15, rand == 0 ? point1 : rand == 1 ? point2 : point3); } }, 3000); } } }