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:
ronancpl
2017-10-05 17:14:05 -03:00
parent 3a882c7f31
commit 6e1442af30
62 changed files with 670 additions and 85 deletions
+1 -1
View File
@@ -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.
BIN
View File
Binary file not shown.
+4 -1
View File
@@ -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).
+2 -8
View File
@@ -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>
+112
View File
@@ -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){}
+114
View File
@@ -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){}
+10
View File
@@ -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));
}
+47
View File
@@ -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;
}
}
+32
View File
@@ -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;
}
}
+45
View File
@@ -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
View File
@@ -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();
}
}
+30
View File
@@ -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;
}
}
+28
View File
@@ -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();
}
}
+40
View File
@@ -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();
}
}
+4
View File
@@ -0,0 +1,4 @@
function enter(pi) {
pi.openNpc(1063011, "PupeteerPassword");
return false;
}
+14 -7
View File
@@ -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;
}
+17
View File
@@ -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;
}
}
+19
View File
@@ -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;
}
}
+28
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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),
+15
View File
@@ -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);
}
+4 -4
View File
@@ -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();
}
+17 -18
View File
@@ -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);
}
}
+3 -2
View File
@@ -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>