Mounts & map boundings fix + Quest rates + MapleInvalidItemIdFetcher
Fixed a critical bug that would sometimes default the written mount data on the DB, causing data loss. Removed all invalid itemids from the drop data. Added quest rates. Instead of using the player's rates, quest rates stacks up with the server's exp and drop rates when giving quest rewards, making the values the same for all. Adjusted map boundings to better suit the item drop positions inside the field. New tool: MapleInvalidItemIdFetcher. It reads all existing itemids from the wz and reports inexistent itemids on the DB's drop data.
This commit is contained in:
@@ -914,7 +914,7 @@ public class MapleClient {
|
||||
worlda.removePlayer(player);
|
||||
|
||||
player.saveCooldowns();
|
||||
player.saveToDB();
|
||||
player.saveToDB(true);
|
||||
if (player != null) {//no idea, occur :(
|
||||
player.empty(false);
|
||||
}
|
||||
|
||||
@@ -518,8 +518,10 @@ public class Commands {
|
||||
if(player.getCouponDropRate() != 1) showMsg += "Coupon DROP Rate: #k" + player.getCouponDropRate() + "x#k" + "\r\n";
|
||||
showMsg += "DROP Rate: #e#b" + player.getDropRate() + "x#k#n" + "\r\n";
|
||||
|
||||
showMsg += "\r\n" + "#eBOSSDROP RATE#n" + "\r\n";
|
||||
showMsg += "Server BOSSDROP Rate: #e#b" + c.getWorldServer().getBossDropRate() + "x#k#n" + "\r\n";
|
||||
if(ServerConstants.USE_QUEST_RATE) {
|
||||
showMsg += "\r\n" + "#eQUEST RATE#n" + "\r\n";
|
||||
showMsg += "Server QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n";
|
||||
}
|
||||
|
||||
player.showHint(showMsg);
|
||||
break;
|
||||
@@ -529,7 +531,7 @@ public class Commands {
|
||||
showMsg_ += "EXP Rate: #e#b" + player.getExpRate() + "x#k#n" + "\r\n";
|
||||
showMsg_ += "MESO Rate: #e#b" + player.getMesoRate() + "x#k#n" + "\r\n";
|
||||
showMsg_ += "DROP Rate: #e#b" + player.getDropRate() + "x#k#n" + "\r\n";
|
||||
showMsg_ += "BOSSDROP Rate: #e#b" + c.getWorldServer().getBossDropRate() + "x#k#n" + "\r\n";
|
||||
if(ServerConstants.USE_QUEST_RATE) showMsg_ += "QUEST Rate: #e#b" + c.getWorldServer().getQuestRate() + "x#k#n" + "\r\n";
|
||||
|
||||
player.showHint(showMsg_);
|
||||
break;
|
||||
@@ -2252,15 +2254,15 @@ public class Commands {
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Drop Rate has been changed to " + droprate + "x."));
|
||||
break;
|
||||
|
||||
case "bossdroprate":
|
||||
case "questrate":
|
||||
if (sub.length < 2){
|
||||
player.yellowMessage("Syntax: !bossdroprate <newrate>");
|
||||
player.yellowMessage("Syntax: !questrate <newrate>");
|
||||
break;
|
||||
}
|
||||
|
||||
int bossdroprate = Math.max(Integer.parseInt(sub[1]), 1);
|
||||
c.getWorldServer().setBossDropRate(bossdroprate);
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Boss Drop Rate has been changed to " + bossdroprate + "x."));
|
||||
int questrate = Math.max(Integer.parseInt(sub[1]), 1);
|
||||
c.getWorldServer().setQuestRate(questrate);
|
||||
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Quest Rate has been changed to " + questrate + "x."));
|
||||
break;
|
||||
|
||||
case "itemvac":
|
||||
|
||||
@@ -70,12 +70,13 @@ public class ServerConstants {
|
||||
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_MAKER_FEE_HEURISTICS = true; //Apply compiled values for stimulants and reagents into the Maker fee calculations (max error revolves around 50k mesos). Set false to use basic constant values instead (results are never higher than requested by the client-side).
|
||||
public static final boolean USE_QUEST_RATE = false; //Exp/Meso gained by quests uses fixed server exp/meso rate times quest rate as multiplier, instead of player rates.
|
||||
|
||||
//Server Rates And Experience
|
||||
public static final int EXP_RATE = 10;
|
||||
public static final int MESO_RATE = 10;
|
||||
public static final int DROP_RATE = 10;
|
||||
public static final int BOSS_DROP_RATE = 20;
|
||||
public static final int QUEST_RATE = 5; //Multiplier for Exp & Meso gains when completing a quest. Only available when USE_QUEST_RATE is true. Stacks with server Exp & Meso rates.
|
||||
public static final double EQUIP_EXP_RATE = 10.0; //Rate for equipment exp gain, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2).
|
||||
|
||||
public static final double PARTY_BONUS_EXP_RATE = 1.0; //Rate for the party exp reward.
|
||||
|
||||
@@ -60,8 +60,8 @@ public class CreateINI {
|
||||
sb.append("mesorate").append(b).append("=").append(
|
||||
Integer.parseInt(con.readLine(" Meso rate: "))).append("\r\n");
|
||||
|
||||
sb.append("bossdroprate").append(b).append("=").append(
|
||||
Integer.parseInt(con.readLine(" Boss drop rate: "))).append("\r\n");
|
||||
sb.append("questrate").append(b).append("=").append(
|
||||
Integer.parseInt(con.readLine(" Quest rate: "))).append("\r\n");
|
||||
|
||||
System.out.println(nextline);
|
||||
sb.append("\r\n");
|
||||
|
||||
@@ -335,7 +335,7 @@ public class Server implements Runnable {
|
||||
ServerConstants.EXP_RATE,
|
||||
ServerConstants.DROP_RATE,
|
||||
ServerConstants.MESO_RATE,
|
||||
ServerConstants.BOSS_DROP_RATE);
|
||||
ServerConstants.QUEST_RATE);
|
||||
|
||||
worldRecommendedList.add(new Pair<>(i, p.getProperty("whyamirecommended" + i)));
|
||||
worlds.add(world);
|
||||
|
||||
@@ -32,7 +32,6 @@ import tools.data.input.SeekableLittleEndianAccessor;
|
||||
|
||||
|
||||
public class MoveDragonHandler extends AbstractMovementPacketHandler {
|
||||
|
||||
@Override
|
||||
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
final MapleCharacter chr = c.getPlayer();
|
||||
|
||||
@@ -23,12 +23,12 @@ package net.server.channel.handlers;
|
||||
|
||||
import client.MapleClient;
|
||||
import java.util.List;
|
||||
import net.server.channel.handlers.AbstractMovementPacketHandler;
|
||||
import server.movement.LifeMovementFragment;
|
||||
import tools.MaplePacketCreator;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
|
||||
public final class MovePlayerHandler extends AbstractMovementPacketHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
slea.skip(9);
|
||||
final List<LifeMovementFragment> res = parseMovement(slea);
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
*/
|
||||
package net.server.channel.handlers;
|
||||
|
||||
import net.server.channel.handlers.AbstractMovementPacketHandler;
|
||||
import java.awt.Point;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -33,6 +32,7 @@ import tools.MaplePacketCreator;
|
||||
import tools.data.input.SeekableLittleEndianAccessor;
|
||||
|
||||
public final class MoveSummonHandler extends AbstractMovementPacketHandler {
|
||||
@Override
|
||||
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
|
||||
int oid = slea.readInt();
|
||||
Point startPos = new Point(slea.readShort(), slea.readShort());
|
||||
|
||||
@@ -77,7 +77,7 @@ import tools.locks.MonitoredLockType;
|
||||
*/
|
||||
public class World {
|
||||
|
||||
private int id, flag, exprate, droprate, mesorate, bossdroprate;
|
||||
private int id, flag, exprate, droprate, mesorate, questrate;
|
||||
private String eventmsg;
|
||||
private List<Channel> channels = new ArrayList<>();
|
||||
private Map<Integer, MapleMessenger> messengers = new HashMap<>();
|
||||
@@ -114,14 +114,14 @@ public class World {
|
||||
|
||||
private ScheduledFuture<?> charactersSchedule;
|
||||
|
||||
public World(int world, int flag, String eventmsg, int exprate, int droprate, int mesorate, int bossdroprate) {
|
||||
public World(int world, int flag, String eventmsg, int exprate, int droprate, int mesorate, int questrate) {
|
||||
this.id = world;
|
||||
this.flag = flag;
|
||||
this.eventmsg = eventmsg;
|
||||
this.exprate = exprate;
|
||||
this.droprate = droprate;
|
||||
this.mesorate = mesorate;
|
||||
this.bossdroprate = bossdroprate;
|
||||
this.questrate = questrate;
|
||||
runningPartyId.set(1);
|
||||
runningMessengerId.set(1);
|
||||
|
||||
@@ -215,12 +215,12 @@ public class World {
|
||||
}
|
||||
}
|
||||
|
||||
public int getBossDropRate() {
|
||||
return bossdroprate;
|
||||
public int getQuestRate() {
|
||||
return questrate;
|
||||
}
|
||||
|
||||
public void setBossDropRate(int bossdrop) {
|
||||
this.bossdroprate = bossdrop;
|
||||
public void setQuestRate(int quest) {
|
||||
this.questrate = quest;
|
||||
}
|
||||
|
||||
public PlayerStorage getPlayerStorage() {
|
||||
|
||||
@@ -2610,7 +2610,7 @@ public class MapleMap {
|
||||
}
|
||||
|
||||
public void setMapPointBoundings(int px, int py, int h, int w) {
|
||||
mapArea.setBounds(px + 45, py, w - 90, h);
|
||||
mapArea.setBounds(px + 60, py, w - 120, h);
|
||||
}
|
||||
|
||||
public void setMapLineBoundings(int vrTop, int vrBottom, int vrLeft, int vrRight) {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
package server.quest.actions;
|
||||
|
||||
import client.MapleCharacter;
|
||||
import constants.ServerConstants;
|
||||
import provider.MapleData;
|
||||
import provider.MapleDataTool;
|
||||
import server.quest.MapleQuest;
|
||||
@@ -50,7 +51,11 @@ public class ExpAction extends MapleQuestAction {
|
||||
if (chr.isBeginnerJob() && chr.getLevel() < 10) {
|
||||
chr.gainExp(exp, true, true);
|
||||
} else {
|
||||
chr.gainExp(exp * chr.getExpRate(), true, true);
|
||||
if(!ServerConstants.USE_QUEST_RATE) {
|
||||
chr.gainExp(exp * chr.getExpRate(), true, true);
|
||||
} else {
|
||||
chr.gainExp(exp * ServerConstants.EXP_RATE * ServerConstants.QUEST_RATE, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
package server.quest.actions;
|
||||
|
||||
import client.MapleCharacter;
|
||||
import constants.ServerConstants;
|
||||
import provider.MapleData;
|
||||
import provider.MapleDataTool;
|
||||
import server.quest.MapleQuest;
|
||||
@@ -48,6 +49,14 @@ public class MesoAction extends MapleQuestAction {
|
||||
|
||||
@Override
|
||||
public void run(MapleCharacter chr, Integer extSelection) {
|
||||
chr.gainMeso(mesos < 0 ? mesos : mesos * chr.getMesoRate(), true, false, true);
|
||||
if(mesos < 0) {
|
||||
chr.gainMeso(mesos, true, false, true);
|
||||
} else {
|
||||
if(!ServerConstants.USE_QUEST_RATE) {
|
||||
chr.gainMeso(mesos * chr.getMesoRate(), true, false, true);
|
||||
} else {
|
||||
chr.gainMeso(mesos * ServerConstants.MESO_RATE * ServerConstants.QUEST_RATE, true, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user