This is to be placed in the event folder. Feel free to change the maps id to your PQ (var instanceMaps = new Array(230020101,...... and em.getChannelServer().getMapFactory().getMap(280090000);Code:importPackage(net.sf.odinms.world); var exitMap; var instanceId; var minPlayers = 3 function init() { instanceId = 1; em.setProperty("shuffleReactors","true"); } function monsterValue(eim, mobId) { return 1; } function setup() { exitMap = em.getChannelServer().getMapFactory().getMap(280090000); //room of tragedy var instanceName = "YWPQ" + instanceId; //YWPQ maps increasing gradually //var instanceMaps = new Array(230020101, 910010100, 221030501, 100000001, 924000002, 109040002, 109040003, 109040004, 109050000, // 108000202, 922010600, 923010000, 280020000, 280020001); var eim = em.newInstance(instanceName); var mf = eim.getMapFactory(); instanceId++; var map = mf.getMap(230020101); map.shuffleReactors(); //no time limit yet until clock can be visible in all maps //em.schedule("timeOut", 60 * 60000); return eim; } function playerEntry(eim, player) { var map = eim.getMapInstance(230020101); player.changeMap(map, map.getPortal(0)); //TODO: hold time across map changes //player.getClient().getSession().write(net.sf.odinms.tools.MaplePacketCreator.getClock(1800)); } function playerDead(eim, player) { if (player.isAlive()) { //don't trigger on death, trigger on manual revive if (eim.isLeader(player)) { //check for party leader //boot whole party and end var party = eim.getPlayers(); for (var i = 0; i < party.size(); i++) { playerExit(eim, party.get(i)); } eim.dispose(); } else { //boot dead player // If only 1 player is left, uncompletable: var party = eim.getPlayers(); if (party.size() < minPlayers) { for (var i = 0; i < party.size(); i++) { playerExit(eim,party.get(i)); } eim.dispose(); } else playerExit(eim, player); } } } function playerRevive(eim, player) { if (eim.isLeader(player)) { //check for party leader //boot whole party and end var party = eim.getPlayers(); for (var i = 0; i < party.size(); i++) { playerExit(eim, party.get(i)); } eim.dispose(); } else { //boot dead player // If only 2 players are left, uncompletable: var party = eim.getPlayers(); if (party.size() <= minPlayers) { for (var i = 0; i < party.size(); i++) { playerExit(eim,party.get(i)); } eim.dispose(); } else playerExit(eim, player); } } function playerDisconnected(eim, player) { if (eim.isLeader(player)) { //check for party leader //boot whole party and end var party = eim.getPlayers(); for (var i = 0; i < party.size(); i++) { if (party.get(i).equals(player)) { removePlayer(eim, player); } else { playerExit(eim, party.get(i)); } } eim.dispose(); } else { //boot d/ced player // If only 2 players are left, uncompletable: var party = eim.getPlayers(); if (party.size() < minPlayers) { for (var i = 0; i < party.size(); i++) { playerExit(eim,party.get(i)); } eim.dispose(); } else playerExit(eim, player); } } function leftParty(eim, player) { // If only 2 players are left, uncompletable: var party = eim.getPlayers(); if (party.size() < minPlayers) { for (var i = 0; i < party.size(); i++) { playerExit(eim,party.get(i)); } eim.dispose(); } else playerExit(eim, player); } function disbandParty(eim) { //boot whole party and end var party = eim.getPlayers(); for (var i = 0; i < party.size(); i++) { playerExit(eim, party.get(i)); } eim.dispose(); } function playerExit(eim, player) { eim.unregisterPlayer(player); player.changeMap(exitMap, exitMap.getPortal(0)); } //for offline players function removePlayer(eim, player) { eim.unregisterPlayer(player); player.getMap().removePlayer(player); player.setMap(exitMap); } function clearPQ(eim) { //YWPQ does nothing special with winners var party = eim.getPlayers(); for (var i = 0; i < party.size(); i++) { playerExit(eim, party.get(i)); } eim.dispose(); } function allMonstersDead(eim) { //do nothing; YWPQ has nothing to do with monster killing } function cancelSchedule() { } function timeOut() { var iter = em.getInstances().iterator(); while (iter.hasNext()) { var eim = iter.next(); if (eim.getPlayerCount() > 0) { var pIter = eim.getPlayers().iterator(); while (pIter.hasNext()) { playerExit(eim, pIter.next()); } } eim.dispose(); } }
Change var minPlayers = 3 to your preference. In this case, it will kick you out of the PQ if your party size is less than 3.
Change var instanceName = "YWPQ" to whatever name you want.
In world.properties, add YWPQ(change to whatever you want, must be same as above)
Example: net.sf.odinms.channel.events= lolcastle,3rdjob,ZakumPQ,KerningPQ,LudiPQ,GuildQuest,DollHouse,YWPQ(change this)
For me i used Malady as my NPC haha. Basically copied from kerning PQ and changed some stuff.Code:var status = 0; var minLevel = 80; var maxLevel = 200; var minPlayers = 2; var maxPlayers = 4; function start() { status = -1; action(1, 0, 0); } function action(mode, type, selection) { if (mode == -1) { cm.dispose(); } else { if (mode == 0 && status == 0) { cm.dispose(); return; } if (mode == 1) status++; else status--; if (status == 0) { // Malady has no preamble, directly checks if you're in a party if (cm.getParty() == null) { // no party cm.sendOk("How about you and your party members collectively beating a quest? Here you'll find obstacles and problems where you won't be able to beat it without great teamwork. If you want to try it, please tell the #bleader of your party#k to talk to me."); cm.dispose(); return; } if (!cm.isLeader()) { // not party leader cm.sendOk("If you want to try the quest, please tell the #bleader of your party#k to talk to me."); cm.dispose(); } else { // check if all party members are within 80-200 range, etc. var party = cm.getParty().getMembers(); var mapId = cm.getChar().getMapId(); var next = true; var levelValid = 0; var inMap = 0; // Temp removal for testing if (party.size() < minPlayers || party.size() > maxPlayers) next = false; else { for (var i = 0; i < party.size() && next; i++) { if ((party.get(i).getLevel() >= minLevel) && (party.get(i).getLevel() <= maxLevel)) levelValid += 1; if (party.get(i).getMapid() == mapId) inMap += 1; } if (levelValid < minPlayers || inMap < minPlayers) next = false; } if (next) { // Kick it into action. Malady says nothing here, just warps you in. var em = cm.getEventManager("YWPQ"); if (em == null) { cm.sendOk("This PQ is not currently available."); } else { // Begin the PQ. em.startInstance(cm.getParty(),cm.getChar().getMap()); // Remove pass/coupons party = cm.getChar().getEventInstance().getPlayers(); cm.removeFromParty(4001008, party); cm.removeFromParty(4001007, party); } cm.dispose(); } else { cm.sendOk("Your party is not a party of four. Please make sure all your members are present and qualified to participate in this quest. I see #b" + levelValid.toString() + " #kmembers are in the right level range, and #b" + inMap.toString() + "#k are here. If this seems wrong, #blog out and log back in,#k or reform the party."); cm.dispose(); } } } else { cm.sendOk("Dialog is broken."); cm.dispose(); } } }
Change the min/max level and players to whatever you want.Edit the maps in the events.js .
1st map would be stage 1 of your PQ.
Don't flame me as its my 1st guide/release XD



Reply With Quote![[Tut] How to make your custom PQ check for party size](http://ragezone.com/hyper728.png)


