Minor tweak on Exp system + Diet's Cygnus quest line
Changed minimum level required to gain EXP of mob from -5 to -20 the mob level (players below that level sees a red-colored font when displaying higher-leveled mob HPbar). Thanks to DietStory dev team, fixed some quests for KoC.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#Wed, 04 Oct 2017 01:18:34 -0300
|
||||
#Thu, 05 Oct 2017 16:16:32 -0300
|
||||
|
||||
|
||||
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -565,4 +565,7 @@ Adicionado prote
|
||||
Corrigido bug em sistema de distribuição de EXP para party.
|
||||
Corrigido bug de overflow em distribuição de EXP.
|
||||
Corrigido bug com scrolls não usando slots quando resultam em sucesso.
|
||||
Refatorado sistema de schedules para disease expiretimes.
|
||||
Refatorado sistema de schedules para disease expiretimes.
|
||||
|
||||
05 Outubro 2017,
|
||||
Alterado level mínimo para receber exp de um mob de base level - 5 para - 20 (cliente destaca infos do mob em vermelho se o jogador está abaixo desta faixa).
|
||||
@@ -3,15 +3,9 @@
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="1"/>
|
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||
<group>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/SendOpcode.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/TakeDamageHandler.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/AbstractPlayerInteraction.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/npc/NPCConversationManager.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/data/output/GenericLittleEndianWriter.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/life/MobSkill.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleItemInformationProvider.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/MaplePacketCreator.java</file>
|
||||
<file>file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/life/MapleMonster.java</file>
|
||||
</group>
|
||||
</open-files>
|
||||
</project-private>
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
var minPlayers = 1;
|
||||
var timeLimit = 10; //10 minutes
|
||||
var eventTimer = 1000 * 60 * timeLimit;
|
||||
var entryMap = 101000000;
|
||||
var exitMap = 101000000;
|
||||
var eventMap = 910110000;
|
||||
|
||||
function init(){}
|
||||
|
||||
function setup(difficulty, lobbyId){
|
||||
var eim = em.newInstance("Cygnus_Magic_Library_" +lobbyId);
|
||||
eim.getInstanceMap(eventMap).resetFully();
|
||||
eim.getInstanceMap(eventMap).allowSummonState(false);
|
||||
respawn(eim);
|
||||
eim.startEventTimer(eventTimer);
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim){}
|
||||
|
||||
function respawn(eim){
|
||||
var map = eim.getMapInstance(entryMap);
|
||||
map.allowSummonState(true);
|
||||
map.instanceMapRespawn();
|
||||
eim.schedule("respawn", 10000);
|
||||
}
|
||||
|
||||
function playerEntry(eim, player){
|
||||
var magicLibrary = eim.getMapInstance(eventMap);
|
||||
player.changeMap(magicLibrary, magicLibrary.getPortal(1));
|
||||
}
|
||||
|
||||
function scheduledTimeout(eim){
|
||||
var party = eim.getPlayers();
|
||||
|
||||
for(var i = 0; i < party.size(); i++)
|
||||
playerExit(eim, party.get(i));
|
||||
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function playerRevive(eim, player){
|
||||
player.setHp(50);
|
||||
player.setStance(0);
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(entryMap);
|
||||
return false;
|
||||
}
|
||||
|
||||
function playerDead(eim, player){}
|
||||
|
||||
function playerDisconnected(eim, player){
|
||||
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();
|
||||
}
|
||||
|
||||
function monsterValue(eim, mobId){
|
||||
return -1;
|
||||
}
|
||||
|
||||
function leftParty(eim, player){
|
||||
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){}
|
||||
|
||||
function playerUnregistered(eim, player){}
|
||||
|
||||
function playerExit(eim, player){
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(entryMap, 2);
|
||||
}
|
||||
|
||||
function moveMap(eim, player){
|
||||
if(player.getMap().getId() == exitMap){
|
||||
removePlayer(eim, player);
|
||||
eim.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
function removePlayer(eim, player){
|
||||
eim.unregisterPlayer(player);
|
||||
player.getMap().removePlayer(player);
|
||||
player.setMap(entryMap);
|
||||
}
|
||||
|
||||
function cancelSchedule(){}
|
||||
|
||||
function dispose(){}
|
||||
|
||||
function clearPQ(eim){}
|
||||
|
||||
function monsterKilled(mob, eim){}
|
||||
|
||||
function allMonstersDead(eim){}
|
||||
@@ -0,0 +1,114 @@
|
||||
var minPlayers = 1;
|
||||
var timeLimit = 10; //10 minutes
|
||||
var eventTimer = 1000 * 60 * timeLimit;
|
||||
var entryMap = 910510001;
|
||||
var exitMap = 105070300;
|
||||
var eventMap = 910510000;
|
||||
|
||||
function init(){}
|
||||
|
||||
function setup(difficulty, lobbyId){
|
||||
var eim = em.newInstance("Puppeteer_" +lobbyId);
|
||||
eim.getInstanceMap(eventMap).resetFully();
|
||||
eim.getInstanceMap(eventMap).allowSummonState(false);
|
||||
respawn(eim);
|
||||
eim.startEventTimer(eventTimer);
|
||||
return eim;
|
||||
}
|
||||
|
||||
function afterSetup(eim){}
|
||||
|
||||
function respawn(eim){
|
||||
var map = eim.getMapInstance(entryMap);
|
||||
map.allowSummonState(true);
|
||||
map.instanceMapRespawn();
|
||||
eim.schedule("respawn", 10000);
|
||||
}
|
||||
|
||||
function playerEntry(eim, player){
|
||||
var cave = eim.getMapInstance(eventMap);
|
||||
player.changeMap(cave);
|
||||
}
|
||||
|
||||
function scheduledTimeout(eim){
|
||||
var party = eim.getPlayers();
|
||||
|
||||
for(var i = 0; i < party.size(); i++)
|
||||
playerExit(eim, party.get(i));
|
||||
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
function playerRevive(eim, player){
|
||||
player.setHp(50);
|
||||
player.setStance(0);
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(entryMap);
|
||||
return false;
|
||||
}
|
||||
|
||||
function playerDead(eim, player){}
|
||||
|
||||
function playerDisconnected(eim, player){
|
||||
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();
|
||||
}
|
||||
|
||||
function monsterValue(eim, mobId){
|
||||
return -1;
|
||||
}
|
||||
|
||||
function leftParty(eim, player){
|
||||
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){}
|
||||
|
||||
function playerUnregistered(eim, player){}
|
||||
|
||||
function playerExit(eim, player){
|
||||
eim.unregisterPlayer(player);
|
||||
player.changeMap(entryMap, 2);
|
||||
}
|
||||
|
||||
function moveMap(eim, player){
|
||||
if(player.getMap().getId() == exitMap || player.getMap().getId() == entryMap){
|
||||
removePlayer(eim, player);
|
||||
eim.stopEventTimer();
|
||||
eim.setEventCleared();
|
||||
eim.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
function removePlayer(eim, player){
|
||||
eim.unregisterPlayer(player);
|
||||
player.getMap().removePlayer(player);
|
||||
player.setMap(entryMap);
|
||||
}
|
||||
|
||||
function cancelSchedule(){}
|
||||
|
||||
function dispose(){}
|
||||
|
||||
function clearPQ(eim){}
|
||||
|
||||
function monsterKilled(mob, eim){}
|
||||
|
||||
function allMonstersDead(eim){}
|
||||
@@ -0,0 +1,10 @@
|
||||
importPackage(Packages.server.life);
|
||||
|
||||
function start(ms){
|
||||
var mobId = 9300285;
|
||||
var player = ms.getPlayer();
|
||||
var map = player.getMap();
|
||||
|
||||
if(ms.isQuestStarted(20730) && ms.getQuestProgress(20730, 9300285) == 0)
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(680, 258));
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
NPC: Corner of the Magic Library
|
||||
MAP: Hidden Street - Magic Library (910110000)
|
||||
QUEST: Maybe it's Grendel! (20718)
|
||||
*/
|
||||
importPackage(Packages.server.life);
|
||||
|
||||
var status;
|
||||
var mobId = 2220100; //Blue Mushroom
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
if(status == 0){
|
||||
cm.sendOk("A mysterious black figure appeared and summoned a lot of angry monsters!");
|
||||
}
|
||||
else if(status == 1){
|
||||
var player = cm.getPlayer();
|
||||
var map = player.getMap();
|
||||
|
||||
for(var i = 0; i < 10; i++)
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(117, 183));
|
||||
for(var i = 0; i < 10; i++)
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(4, 183));
|
||||
for(var i = 0; i < 10; i++)
|
||||
map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(-109, 183));
|
||||
|
||||
cm.completeQuest(20718, 1103003);
|
||||
cm.gainExp(4000 * cm.getPlayer().getExpRate());
|
||||
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
NPC: Corner of the Magic Library
|
||||
MAP: Hidden Street - Magic Library (910110000)
|
||||
QUEST: Maybe it's Grendel! (20718)
|
||||
*/
|
||||
|
||||
var status;
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
if(status == 0){
|
||||
cm.sendOk("Nothing remarkable here.");
|
||||
}
|
||||
else if(status == 1){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
NPC: Small Tree Stump
|
||||
MAP: Victoria Road - Top of the Tree That Grew (101010103)
|
||||
QUEST: Maybe it's Arwen! (20716)
|
||||
*/
|
||||
|
||||
var status;
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
if(status == 0){
|
||||
if(cm.isQuestStarted(20716)){
|
||||
if(!cm.hasItem(4032142)){
|
||||
if(cm.canHold(4032142)){
|
||||
cm.gainItem(4032142, 1);
|
||||
cm.sendOk("You bottled up some of the clear tree sap. #i4032142#");
|
||||
}
|
||||
else
|
||||
cm.sendOk("Make sure you have a free spot in your ETC inventory.");
|
||||
}
|
||||
else
|
||||
cm.sendOk("A never ending flow of sap is coming from this small tree stump.");
|
||||
}
|
||||
else
|
||||
cm.sendOk("A never ending flow of sap is coming from this small tree stump.");
|
||||
}
|
||||
else if(status == 1){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
+13
-17
@@ -25,26 +25,22 @@ function action(mode, type, selection){
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
if(cm.isQuestStarted(20710)){
|
||||
if(!cm.hasItem(4032136)){
|
||||
cm.sendNext("You have found a #b#t4032136##k in the trash can! #i4032136#");
|
||||
|
||||
if(cm.canHold(4032136)){
|
||||
cm.gainItem(4032136, 1);
|
||||
if(status == 0) {
|
||||
if(cm.isQuestStarted(20710)) {
|
||||
if(!cm.hasItem(4032136)) {
|
||||
if(cm.canHold(4032136)) {
|
||||
cm.gainItem(4032136, 1);
|
||||
cm.sendNext("You have found a #b#t4032136##k in the trash can! #i4032136#");
|
||||
} else {
|
||||
cm.sendOk("#i4032136# Not enough space in your ETC inventory.");
|
||||
}
|
||||
} else {
|
||||
cm.sendOk("Just a trash can sitting there.");
|
||||
}
|
||||
else{
|
||||
cm.sendOk("#i4032136# Not enough space in your ETC inventory.");
|
||||
}
|
||||
cm.dispose();
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
cm.sendOk("Just a trash can sitting there.");
|
||||
cm.dispose();
|
||||
}
|
||||
}
|
||||
else{
|
||||
cm.sendOk("Just a trash can sitting there.");
|
||||
} else if(status == 1){
|
||||
cm.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
var status;
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
|
||||
if(status == 0){
|
||||
cm.sendNext("What the... you don't belong here!");
|
||||
}
|
||||
else if(status == 1){
|
||||
var puppet = cm.getEventManager("Puppeteer");
|
||||
puppet.setProperty("player", cm.getPlayer().getName());
|
||||
puppet.startInstance(cm.getPlayer());
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
var status;
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
if(status == 0){
|
||||
cm.sendNext("...a black shadowy figure came out and attacked you? How can this take place at #b#p1032001##k's house? This sounds like one big conspiracy here...");
|
||||
}
|
||||
else if(status == 1){
|
||||
cm.sendNextPrev("I'll have to sort this all out in my mind. Talk to me in a bit.");
|
||||
}
|
||||
else if(status == 2){
|
||||
cm.dispose();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
var status;
|
||||
|
||||
function start(){
|
||||
status = -1;
|
||||
action(1, 0, 0);
|
||||
}
|
||||
|
||||
function action(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
cm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
|
||||
if(status == 0){
|
||||
cm.sendGetText("A suspicious voice pierces through the silence. #bPassword#k!");
|
||||
}
|
||||
else if(status == 1){
|
||||
if(cm.getText() == "Francis is a genius Puppeteer!"){
|
||||
|
||||
if(cm.isQuestCompleted(20730) || !cm.isQuestStarted(20730) || (cm.isQuestStarted(20730) && cm.getQuestProgress(20730, 9300285) > 0))
|
||||
cm.warp(910510000, 1);
|
||||
else if(cm.isQuestStarted(20730))
|
||||
cm.warp(910510001, 1);
|
||||
|
||||
cm.dispose();
|
||||
}
|
||||
else{
|
||||
cm.sendOk("#rWrong!");
|
||||
}
|
||||
}
|
||||
else if(status == 2){
|
||||
cm.dispose();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
function enter(pi) {
|
||||
pi.openNpc(1063011, "PupeteerPassword");
|
||||
return false;
|
||||
}
|
||||
@@ -3,24 +3,31 @@
|
||||
Copyright (C) 2008 Patrick Huy <[email protected]>
|
||||
Matthias Butz <[email protected]>
|
||||
Jan Christian Meyer <[email protected]>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation 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/>.
|
||||
|
||||
Edited by: Kevin
|
||||
*/
|
||||
function enter(pi) {
|
||||
pi.playPortalSound();
|
||||
pi.warp(101000003, 8);
|
||||
return true;
|
||||
}
|
||||
if(pi.isQuestStarted(20718)){
|
||||
pi.playPortalSound();
|
||||
var cml = pi.getEventManager("Cygnus_Magic_Library");
|
||||
cml.setProperty("player", pi.getPlayer().getName());
|
||||
cml.startInstance(pi.getPlayer());
|
||||
}
|
||||
else{
|
||||
pi.playPortalSound();
|
||||
pi.warp(101000003, 8);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
function enter(pi) {
|
||||
if(pi.getMap().countMonster(9300285) > 0){
|
||||
pi.getPlayer().message("Defeat the Puppeteer before leaving.");
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
var eim = pi.getEventInstance();
|
||||
if(eim != null){
|
||||
eim.stopEventTimer();
|
||||
eim.dispose();
|
||||
}
|
||||
|
||||
pi.playPortalSound();
|
||||
pi.warp(105070300, 3);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
function enter(pi) {
|
||||
if(pi.getMap().countMonster(2220100) > 0){
|
||||
pi.getPlayer().message("Cannot leave until all Blue Mushrooms have been defeated.");
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
var eim = pi.getEventInstance();
|
||||
eim.stopEventTimer();
|
||||
eim.dispose();
|
||||
|
||||
pi.playPortalSound();
|
||||
pi.warp(101000000, 26);
|
||||
|
||||
if(pi.isQuestCompleted(20718))
|
||||
pi.openNpc(1103003, "MaybeItsGrendel_end");
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
QUEST: Before the Mission in Perion Begins
|
||||
NPC: Neinheart
|
||||
*/
|
||||
|
||||
var status = -1;
|
||||
|
||||
function start(mode, type, selection){
|
||||
if(mode == -1 || (mode == 0 && status == 0)){
|
||||
qm.dispose();
|
||||
return;
|
||||
}
|
||||
else if(mode == 0)
|
||||
status--;
|
||||
else
|
||||
status++;
|
||||
|
||||
|
||||
else if(status == 0){
|
||||
qm.sendAcceptDecline("How's the leveling up so far? By this time, you might be able to participate in the Party Quest at #m103000000#. Leveling up is important, yes, but we need you now to take on a mission as a Cygnus Knight. We just received a new information that may help us.");
|
||||
}
|
||||
else if(status == 1){
|
||||
qm.forceStartQuest();
|
||||
qm.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
function end(mode, type, selection){}
|
||||
+3
-1
@@ -21080,7 +21080,9 @@ INSERT INTO `shops` (`shopid`, `npcid`) VALUES
|
||||
INSERT INTO `shops` (`shopid`, `npcid`) VALUES
|
||||
( 57, 2002001 ),
|
||||
(1052116, 1052116),
|
||||
(1301000, 1301000);
|
||||
(1301000, 1301000),
|
||||
(1200001, 1200001),
|
||||
(1200002, 1200002);
|
||||
|
||||
INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES
|
||||
( 57, 3990000, 500, 1 ),
|
||||
|
||||
+15
-5
@@ -19780,7 +19780,16 @@ USE `maplesolaxia`;
|
||||
(1110100, 4001369, 1, 1, 28259, 10000),
|
||||
(1210101, 4001370, 1, 1, 28260, 10000),
|
||||
(1110101, 4001371, 1, 1, 28261, 10000),
|
||||
(3300003, 4001317, 1, 1, 2326, 20000);
|
||||
(3300003, 4001317, 1, 1, 2326, 20000),
|
||||
(1210102, 4001364, 1, 1, 28192, 10000),
|
||||
(1120100, 4001365, 1, 1, 28192, 10000),
|
||||
(1210103, 4032137, 1, 1, 20711, 40000),
|
||||
(1210103, 4032139, 1, 1, 20713, 40000),
|
||||
(1210101, 4001357, 1, 1, 28244, 70000),
|
||||
(1120100, 4001361, 1, 1, 28250, 70000),
|
||||
(2230110, 4032146, 1, 1, 20722, 40000),
|
||||
(2230111, 4032147, 1, 1, 20723, 40000);
|
||||
|
||||
# (dropperid, itemid, minqty, maxqty, questid, chance)
|
||||
|
||||
# delete item drops from other mobs named Freezer
|
||||
@@ -19910,9 +19919,9 @@ USE `maplesolaxia`;
|
||||
UPDATE drop_data SET questid=6191 WHERE itemid=4001107;
|
||||
UPDATE drop_data SET questid=28344 WHERE itemid=4032475;
|
||||
|
||||
UPDATE drop_data SET questid=7777 WHERE itemid=4001358; #id 7777 for ALL "quest items" with no v83 quest.
|
||||
UPDATE drop_data SET questid=7777 WHERE itemid=4001359;
|
||||
UPDATE drop_data SET questid=7777 WHERE itemid=4001342;
|
||||
UPDATE drop_data SET questid=28248 WHERE itemid=4001358;
|
||||
UPDATE drop_data SET questid=28248 WHERE itemid=4001359;
|
||||
UPDATE drop_data SET questid=7777 WHERE itemid=4001342; #id 7777 for ALL "quest items" with no v83 quest.
|
||||
UPDATE drop_data SET questid=7777 WHERE itemid=4031906;
|
||||
UPDATE drop_data SET chance=0 WHERE itemid=2050099;
|
||||
UPDATE drop_data SET chance=40000 WHERE itemid=4031991;
|
||||
@@ -21091,7 +21100,8 @@ USE `maplesolaxia`;
|
||||
(9102001, 2020000, 2, -1),
|
||||
(9102001, 2020001, 2, -1),
|
||||
(9102001, 2020002, 2, -1),
|
||||
(2002018, 4161014, 1, 3099);
|
||||
(2002018, 4161014, 1, 3099),
|
||||
(1012000, 4032143, 6, 20717);
|
||||
|
||||
# adding wish tickets on APQ boxes
|
||||
INSERT INTO `reactordrops` (`reactorid`, `itemid`, `chance`, `questid`) VALUES
|
||||
|
||||
+21
-21
@@ -263,27 +263,27 @@ INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `pitch`, `position`) VALU
|
||||
(1200001, 1322005, 50, 0, 35),
|
||||
(1200001, 1312004, 50, 0, 36),
|
||||
(1200001, 1302000, 50, 0, 37),
|
||||
(1203590, 2330000, 600, 0, 104),
|
||||
(1203590, 2070000, 500, 0, 108),
|
||||
(1203590, 2061000, 1, 0, 120),
|
||||
(1203590, 2060000, 1, 0, 124),
|
||||
(1203590, 2030000, 400, 0, 132),
|
||||
(1203590, 2020028, 3000, 0, 136),
|
||||
(1203590, 2010004, 310, 0, 140),
|
||||
(1203590, 2010003, 100, 0, 144),
|
||||
(1203590, 2010001, 106, 0, 148),
|
||||
(1203590, 2010002, 50, 0, 152),
|
||||
(1203590, 2010000, 30, 0, 156),
|
||||
(1203590, 2002005, 500, 0, 160),
|
||||
(1203590, 2002004, 500, 0, 164),
|
||||
(1203590, 2002002, 500, 0, 168),
|
||||
(1203590, 2002001, 400, 0, 172),
|
||||
(1203590, 2002000, 500, 0, 176),
|
||||
(1203590, 2000006, 620, 0, 180),
|
||||
(1203590, 2000003, 200, 0, 184),
|
||||
(1203590, 2000002, 320, 0, 188),
|
||||
(1203590, 2000001, 160, 0, 192),
|
||||
(1203590, 2000000, 50, 0, 196),
|
||||
(1200002, 2330000, 600, 0, 104),
|
||||
(1200002, 2070000, 500, 0, 108),
|
||||
(1200002, 2061000, 1, 0, 120),
|
||||
(1200002, 2060000, 1, 0, 124),
|
||||
(1200002, 2030000, 400, 0, 132),
|
||||
(1200002, 2020028, 3000, 0, 136),
|
||||
(1200002, 2010004, 310, 0, 140),
|
||||
(1200002, 2010003, 100, 0, 144),
|
||||
(1200002, 2010001, 106, 0, 148),
|
||||
(1200002, 2010002, 50, 0, 152),
|
||||
(1200002, 2010000, 30, 0, 156),
|
||||
(1200002, 2002005, 500, 0, 160),
|
||||
(1200002, 2002004, 500, 0, 164),
|
||||
(1200002, 2002002, 500, 0, 168),
|
||||
(1200002, 2002001, 400, 0, 172),
|
||||
(1200002, 2002000, 500, 0, 176),
|
||||
(1200002, 2000006, 620, 0, 180),
|
||||
(1200002, 2000003, 200, 0, 184),
|
||||
(1200002, 2000002, 320, 0, 188),
|
||||
(1200002, 2000001, 160, 0, 192),
|
||||
(1200002, 2000000, 50, 0, 196),
|
||||
(1301000, 2330000, 600, 0, 1),
|
||||
(1301000, 2070000, 500, 0, 2),
|
||||
(1301000, 2061000, 1, 0, 3),
|
||||
|
||||
@@ -297,6 +297,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
private short extraRecInterval;
|
||||
private int targetHpBarHash = 0;
|
||||
private long targetHpBarTime = 0;
|
||||
private long nextUnderlevelTime = 0;
|
||||
private int banishMap = -1;
|
||||
private int banishSp = -1;
|
||||
private long banishTime = 0;
|
||||
@@ -7074,6 +7075,20 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
public void showUnderleveledInfo(MapleMonster mob) {
|
||||
chrLock.lock();
|
||||
try {
|
||||
long curTime = System.currentTimeMillis();
|
||||
if(nextUnderlevelTime < curTime) {
|
||||
nextUnderlevelTime = curTime + (60 * 1000); // show underlevel info again after 1 minute
|
||||
|
||||
showHint("You have gained #rno experience#k from defeating #e#b" + mob.getName() + "#k#n (lv. #b" + mob.getLevel() + "#k)! Take note you must have around the same level as the mob to start earning EXP from it.");
|
||||
}
|
||||
} finally {
|
||||
chrLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void showHint(String msg) {
|
||||
client.announceHint(msg);
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ public class ServerConstants {
|
||||
public static final boolean USE_ERASE_UNTRADEABLE_DROP = true; //Forces flagged untradeable items to disappear when dropped.
|
||||
public static final boolean USE_ERASE_PET_ON_EXPIRATION = false;//Forces pets to be removed from inventory when expire time comes, rather than converting it to a doll.
|
||||
public static final boolean USE_BUFF_MOST_SIGNIFICANT = true; //When applying buffs, the player will stick with the highest stat boost among the listed, rather than overwriting stats.
|
||||
public static final boolean USE_UNDERLEVELED_EXP_GAIN = false; //Players below the threshold level will gain no experience from defeating higher leveled mobs.
|
||||
public static final boolean USE_UNDERLEVELED_EXP_BLOCK = true; //Players 20 levels below the killed mob will gain no experience from defeating it.
|
||||
|
||||
//Server Rates And Experience
|
||||
public static final int EXP_RATE = 10;
|
||||
@@ -78,9 +78,9 @@ public class ServerConstants {
|
||||
|
||||
//Some Gameplay Enhancing Configurations
|
||||
//Scroll Configuration
|
||||
public static final boolean USE_PERFECT_GM_SCROLL = false; //Scrolls from GMs never uses up slots nor fails.
|
||||
public static final boolean USE_PERFECT_SCROLLING = false; //Scrolls doesn't use slots upon failure.
|
||||
public static final boolean USE_ENHANCED_CHSCROLL = false; //Equips even more powerful with chaos upgrade.
|
||||
public static final boolean USE_PERFECT_GM_SCROLL = true; //Scrolls from GMs never uses up slots nor fails.
|
||||
public static final boolean USE_PERFECT_SCROLLING = true; //Scrolls doesn't use slots upon failure.
|
||||
public static final boolean USE_ENHANCED_CHSCROLL = true; //Equips even more powerful with chaos upgrade.
|
||||
public static final boolean USE_ENHANCED_CRAFTING = true; //Applys chaos scroll on every equip crafted.
|
||||
public static final int SCROLL_CHANCE_RATE = 0; //Number of rolls for success on a scroll, set 0 for default.
|
||||
public static final int CHSCROLL_STAT_RANGE = 6; //Stat upgrade range (-N, N) on chaos scrolls.
|
||||
|
||||
@@ -222,6 +222,38 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
|
||||
}
|
||||
}
|
||||
|
||||
public void startQuest(short id, int npcId) {
|
||||
try {
|
||||
MapleQuest.getInstance(id).forceStart(getPlayer(), npcId);
|
||||
} catch (NullPointerException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void startQuest(int id, int npcId) {
|
||||
try {
|
||||
MapleQuest.getInstance(id).forceStart(getPlayer(), npcId);
|
||||
} catch (NullPointerException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void completeQuest(short id, int npcId) {
|
||||
try {
|
||||
MapleQuest.getInstance(id).forceComplete(getPlayer(), npcId);
|
||||
} catch (NullPointerException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void completeQuest(int id, int npcId) {
|
||||
try {
|
||||
MapleQuest.getInstance(id).forceComplete(getPlayer(), npcId);
|
||||
} catch (NullPointerException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public int getMeso() {
|
||||
return getPlayer().getMeso();
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
@@ -257,13 +258,13 @@ public class MapleMonster extends AbstractLoadedMapleLife {
|
||||
return takenDamage.containsKey(chr.getId());
|
||||
}
|
||||
|
||||
private void distributeExperienceToParty(int pid, int exp, int killer, Map<Integer, Integer> expDist) {
|
||||
private void distributeExperienceToParty(int pid, int exp, int killer, Map<Integer, Integer> expDist, Set<MapleCharacter> underleveled) {
|
||||
List<MapleCharacter> members = new LinkedList<>();
|
||||
MapleCharacter pchar = getMap().getAnyCharacterFromParty(pid);
|
||||
if(pchar != null) {
|
||||
for(MapleCharacter chr : pchar.getPartyMembersOnSameMap()) {
|
||||
members.add(chr);
|
||||
}
|
||||
for(MapleCharacter chr : pchar.getPartyMembersOnSameMap()) {
|
||||
members.add(chr);
|
||||
}
|
||||
} else {
|
||||
MapleCharacter chr = getMap().getCharacterById(killer);
|
||||
if(chr == null) return;
|
||||
@@ -271,25 +272,16 @@ public class MapleMonster extends AbstractLoadedMapleLife {
|
||||
members.add(chr);
|
||||
}
|
||||
|
||||
final int minLevel = getLevel() - 5;
|
||||
int partyLevel = 0;
|
||||
int leechMinLevel = 0;
|
||||
int leechMinLevel = (ServerConstants.USE_UNDERLEVELED_EXP_BLOCK) ? getLevel() - 20 : 0; //NO EXP WILL BE GIVEN for those who are underleveled!
|
||||
|
||||
if(!ServerConstants.USE_UNDERLEVELED_EXP_GAIN) { //NO EXP WILL BE GIVEN for those who are underleveled!
|
||||
leechMinLevel = minLevel;
|
||||
|
||||
for (MapleCharacter mc : members) {
|
||||
if (mc.getLevel() >= minLevel) {
|
||||
leechMinLevel = Math.min(mc.getLevel() - 5, leechMinLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int leechCount = 0;
|
||||
for (MapleCharacter mc : members) {
|
||||
if (mc.getLevel() >= leechMinLevel) {
|
||||
partyLevel += mc.getLevel();
|
||||
leechCount++;
|
||||
} else {
|
||||
underleveled.add(mc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,6 +319,7 @@ public class MapleMonster extends AbstractLoadedMapleLife {
|
||||
}
|
||||
|
||||
Collection<MapleCharacter> chrs = map.getCharacters();
|
||||
Set<MapleCharacter> underleveled = new LinkedHashSet<>();
|
||||
for (MapleCharacter mc : chrs) {
|
||||
if (expDist.containsKey(mc.getId())) {
|
||||
boolean isKiller = (mc.getId() == killerId);
|
||||
@@ -340,16 +333,22 @@ public class MapleMonster extends AbstractLoadedMapleLife {
|
||||
long pXP = (long)xp + (partyExp.containsKey(pID) ? partyExp.get(pID) : 0);
|
||||
partyExp.put(pID, (int)Math.min(pXP, Integer.MAX_VALUE));
|
||||
} else {
|
||||
if(ServerConstants.USE_UNDERLEVELED_EXP_GAIN || mc.getLevel() >= this.getLevel() - 5) {
|
||||
if(!ServerConstants.USE_UNDERLEVELED_EXP_BLOCK || mc.getLevel() >= getLevel() - 20) {
|
||||
//NO EXP WILL BE GIVEN for those who are underleveled!
|
||||
giveExpToCharacter(mc, xp, isKiller, 1);
|
||||
} else {
|
||||
underleveled.add(mc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Entry<Integer, Integer> party : partyExp.entrySet()) {
|
||||
distributeExperienceToParty(party.getKey(), party.getValue(), killerId, expDist);
|
||||
distributeExperienceToParty(party.getKey(), party.getValue(), killerId, expDist, underleveled);
|
||||
}
|
||||
|
||||
for(MapleCharacter mc : underleveled) {
|
||||
mc.showUnderleveledInfo(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2209,8 +2209,9 @@
|
||||
<int name="pt" value="2"/>
|
||||
<int name="x" value="-216"/>
|
||||
<int name="y" value="260"/>
|
||||
<int name="tm" value="105070300"/>
|
||||
<string name="tn" value="in00"/>
|
||||
<int name="tm" value="999999999"/>
|
||||
<string name="tn" value=""/>
|
||||
<string name="script" value="exit_puppeteer"/>
|
||||
</imgdir>
|
||||
</imgdir>
|
||||
</imgdir>
|
||||
|
||||
Reference in New Issue
Block a user