Guild PQ + fixed negative EXP error
Implemented Guild PQ. Fixed a problem introduced earlier where negative EXP would be deemed as "integer overflow", provoking many game breaking issues as result.
This commit is contained in:
@@ -281,8 +281,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
private boolean loggedIn = false;
|
||||
private MapleDragon dragon = null;
|
||||
private boolean useCS; //chaos scroll upon crafting item.
|
||||
private long useDuey;
|
||||
private long npcCd;
|
||||
private long petLootCd;
|
||||
private long lastHpDec = 0;
|
||||
private int newWarpMap = -1;
|
||||
|
||||
private MapleCharacter() {
|
||||
@@ -310,10 +311,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
petLootCd = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public void setHpDecreaseTask(ScheduledFuture<?> mapDotTask) {
|
||||
hpDecreaseTask = mapDotTask;
|
||||
}
|
||||
|
||||
public MapleJob getJobStyle() {
|
||||
int jobtype = this.getJob().getId() / 100;
|
||||
|
||||
@@ -413,12 +410,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
useCS = cs;
|
||||
}
|
||||
|
||||
public long getDuey() {
|
||||
return useDuey;
|
||||
public long getNpcCooldown() {
|
||||
return npcCd;
|
||||
}
|
||||
|
||||
public void setDuey(long d) {
|
||||
useDuey = d;
|
||||
public void setNpcCooldown(long d) {
|
||||
npcCd = d;
|
||||
}
|
||||
|
||||
public void addCooldown(int skillId, long startTime, long length, ScheduledFuture<?> timer) {
|
||||
@@ -1104,7 +1101,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
protected MapleMap getWarpMap(int map) {
|
||||
public MapleMap getWarpMap(int map) {
|
||||
MapleMap target;
|
||||
if (getEventInstance() == null) {
|
||||
target = client.getChannelServer().getMapFactory().getMap(map);
|
||||
@@ -1221,14 +1218,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
client.announce(MaplePacketCreator.updateParty(client.getChannel(), party, PartyOperation.SILENT_UPDATE, null));
|
||||
updatePartyMemberHP();
|
||||
}
|
||||
if (getMap().getHPDec() > 0) {
|
||||
hpDecreaseTask = TimerManager.getInstance().schedule(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
doHurtHp();
|
||||
}
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
if (getMap().getHPDec() > 0) resetHpDecreaseTask();
|
||||
}
|
||||
else {
|
||||
FilePrinter.printError(FilePrinter.MAPLE_MAP, "Character " + this.getName() + " got stuck when moving to map " + map.getId() + ".");
|
||||
@@ -1381,7 +1372,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
|
||||
this.getMap().removeMapObject(ob);
|
||||
mapitem.setPickedUp(true);
|
||||
} else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), false)) {
|
||||
} else if(mapitem.getItemId() == 4031865 || mapitem.getItemId() == 4031866) {
|
||||
// Add NX to account, show effect and make item disappear
|
||||
this.getCashShop().gainCash(1, mapitem.getItemId() == 4031865 ? 100 : 250);
|
||||
this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
|
||||
this.getMap().removeMapObject(ob);
|
||||
mapitem.setPickedUp(true);
|
||||
} else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), true)) {
|
||||
this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
|
||||
this.getMap().removeMapObject(ob);
|
||||
mapitem.setPickedUp(true);
|
||||
@@ -1928,9 +1925,10 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
public void doHurtHp() {
|
||||
private void doHurtHp() {
|
||||
if (!(this.getInventory(MapleInventoryType.EQUIPPED).findById(getMap().getHPDecProtect()) != null || buffMapProtection())) {
|
||||
addHP(-getMap().getHPDec());
|
||||
lastHpDec = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
hpDecreaseTask = TimerManager.getInstance().schedule(new Runnable() {
|
||||
@@ -1940,7 +1938,25 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}, 10000);
|
||||
}
|
||||
|
||||
|
||||
public void resetHpDecreaseTask() {
|
||||
if (hpDecreaseTask != null) {
|
||||
hpDecreaseTask.cancel(false);
|
||||
}
|
||||
|
||||
long lastHpTask = System.currentTimeMillis() - lastHpDec;
|
||||
if(lastHpTask >= 10000) {
|
||||
doHurtHp();
|
||||
} else {
|
||||
hpDecreaseTask = TimerManager.getInstance().schedule(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
doHurtHp();
|
||||
}
|
||||
}, lastHpTask);
|
||||
}
|
||||
}
|
||||
|
||||
public void dropMessage(String message) {
|
||||
dropMessage(0, message);
|
||||
}
|
||||
@@ -2086,14 +2102,24 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
|
||||
if(gain < 0) gain = Integer.MAX_VALUE; // integer overflow, heh.
|
||||
if(party < 0) party = Integer.MAX_VALUE; // integer overflow, heh.
|
||||
int equip = (int)Math.min((long)((gain / 10) * pendantExp), Integer.MAX_VALUE);
|
||||
|
||||
long total = gain + equip + party;
|
||||
gainExpInternal(total, equip, party, show, inChat, white);
|
||||
}
|
||||
|
||||
public void loseExp(int loss, boolean show, boolean inChat) {
|
||||
loseExp(loss, show, inChat, true);
|
||||
}
|
||||
|
||||
public void loseExp(int loss, boolean show, boolean inChat, boolean white) {
|
||||
gainExpInternal(-loss, 0, 0, show, inChat, white);
|
||||
}
|
||||
|
||||
private void gainExpInternal(long gain, int equip, int party, boolean show, boolean inChat, boolean white) {
|
||||
long total = gain;
|
||||
long total = Math.max(gain, -exp.get());
|
||||
|
||||
if (level < getMaxLevel()) {
|
||||
long leftover = 0;
|
||||
long nextExp = exp.get() + total;
|
||||
@@ -4265,9 +4291,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
|
||||
}
|
||||
}
|
||||
if (getExp() > XPdummy) {
|
||||
gainExp(-XPdummy, false, false);
|
||||
loseExp(XPdummy, false, false);
|
||||
} else {
|
||||
gainExp(-getExp(), false, false);
|
||||
loseExp(getExp(), false, false);
|
||||
}
|
||||
}
|
||||
if (getBuffedValue(MapleBuffStat.MORPH) != null) {
|
||||
|
||||
@@ -972,7 +972,7 @@ public class MapleClient {
|
||||
}
|
||||
|
||||
public void setScriptEngine(String name, ScriptEngine e) {
|
||||
engines.put(name, e);
|
||||
engines.put(name, e);
|
||||
}
|
||||
|
||||
public ScriptEngine getScriptEngine(String name) {
|
||||
@@ -980,7 +980,7 @@ public class MapleClient {
|
||||
}
|
||||
|
||||
public void removeScriptEngine(String name) {
|
||||
engines.remove(name);
|
||||
engines.remove(name);
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> getIdleTask() {
|
||||
|
||||
@@ -97,8 +97,8 @@ public class AutobanManager {
|
||||
* 3: ItemIdSort<br>
|
||||
* 4: SpecialMove<br>
|
||||
* 5: UseCatchItem<br>
|
||||
* 6: Item Drop<br>
|
||||
* 7: Chat<br>
|
||||
* 6: Item Drop<br>
|
||||
* 7: Chat<br>
|
||||
*
|
||||
* @param type type
|
||||
* @return Timestamp checker
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
package client.command;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.Rectangle;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
@@ -708,13 +709,25 @@ public class Commands {
|
||||
player.dropMessage(6, "Current map id " + player.getMap().getId() + ", event: '" + ((player.getMap().getEventInstance() != null) ? player.getMap().getEventInstance().getName() : "null") + "'; Players: " + player.getMap().getAllPlayers().size() + ", Mobs: " + player.getMap().countMonsters() + ", Reactors: " + player.getMap().countReactors() + ", Items: " + player.getMap().countItems() + ".");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case "debugevent":
|
||||
if(ServerConstants.USE_DEBUG) {
|
||||
if(player.getEventInstance() == null) player.dropMessage(6, "Player currently not in an event.");
|
||||
else player.dropMessage(6, "Current event name: " + player.getEventInstance().getName() + ".");
|
||||
}
|
||||
break;
|
||||
|
||||
case "debugareas":
|
||||
if(ServerConstants.USE_DEBUG) {
|
||||
player.dropMessage(6, "Configured areas on map " + player.getMapId() + ":");
|
||||
|
||||
byte index = 0;
|
||||
for(Rectangle rect: player.getMap().getAreas()) {
|
||||
player.dropMessage(6, "Id: " + index + " -> posX: " + rect.getX() + " posY: '" + rect.getY() + "' dX: " + rect.getWidth() + " dY: " + rect.getHeight() + ".");
|
||||
index++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "debugreactors":
|
||||
if(ServerConstants.USE_DEBUG) {
|
||||
@@ -722,7 +735,7 @@ public class Commands {
|
||||
|
||||
for(MapleMapObject mmo: player.getMap().getReactors()) {
|
||||
MapleReactor mr = (MapleReactor) mmo;
|
||||
player.dropMessage(6, "Reactor id: " + mr.getId() + " name: '" + mr.getName() + "' -> Type: " + mr.getReactorType() + " State: " + mr.getState() + " Event State: " + mr.getEventState() + " Position: x " + mr.getPosition().getX() + " y " + mr.getPosition().getY() + ".");
|
||||
player.dropMessage(6, "Id: " + mr.getId() + " Oid: " + mr.getObjectId() + " name: '" + mr.getName() + "' -> Type: " + mr.getReactorType() + " State: " + mr.getState() + " Event State: " + mr.getEventState() + " Position: x " + mr.getPosition().getX() + " y " + mr.getPosition().getY() + ".");
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -986,7 +999,7 @@ public class Commands {
|
||||
} else if (sub[0].equals("whereami")) { //This is so not going to work on the first commit
|
||||
player.yellowMessage("Map ID: " + player.getMap().getId());
|
||||
player.yellowMessage("Players on this map:");
|
||||
for (MapleMapObject mmo : player.getMap().getAllPlayer()) {
|
||||
for (MapleMapObject mmo : player.getMap().getPlayers()) {
|
||||
MapleCharacter chr = (MapleCharacter) mmo;
|
||||
player.dropMessage(5, ">> " + chr.getName());
|
||||
}
|
||||
@@ -1203,18 +1216,25 @@ public class Commands {
|
||||
}
|
||||
}
|
||||
if (victim != null) {
|
||||
boolean changingEvent = true;
|
||||
|
||||
if (victim.getEventInstance() != null) {
|
||||
victim.getEventInstance().unregisterPlayer(victim);
|
||||
if(player.getEventInstance() != null && victim.getEventInstance().getLeaderId() == player.getEventInstance().getLeaderId()) {
|
||||
changingEvent = false;
|
||||
}
|
||||
else {
|
||||
victim.getEventInstance().unregisterPlayer(victim);
|
||||
}
|
||||
}
|
||||
//Attempt to join the warpers instance.
|
||||
if (player.getEventInstance() != null) {
|
||||
if (player.getEventInstance() != null && changingEvent) {
|
||||
if (player.getClient().getChannel() == victim.getClient().getChannel()) {//just in case.. you never know...
|
||||
player.getEventInstance().registerPlayer(victim);
|
||||
victim.changeMap(player.getEventInstance().getMapInstance(player.getMapId()), player.getMap().findClosestPortal(player.getPosition()));
|
||||
} else {
|
||||
player.dropMessage("Target isn't on your channel, not able to warp into event instance.");
|
||||
}
|
||||
} else {//If victim isn't in an event instance, just warp them.
|
||||
} else {//If victim isn't in an event instance or is in the same event instance as the one the caller is, just warp them.
|
||||
victim.changeMap(player.getMapId(), player.getMap().findClosestPortal(player.getPosition()));
|
||||
}
|
||||
if (player.getClient().getChannel() != victim.getClient().getChannel()) {//And then change channel if needed.
|
||||
@@ -1348,7 +1368,7 @@ public class Commands {
|
||||
MapleMonster monster = (MapleMonster) monstermo;
|
||||
if (!monster.getStats().isFriendly()) {
|
||||
map.killMonster(monster, player, true);
|
||||
monster.giveExpToCharacter(player, monster.getExp() * c.getPlayer().getExpRate(), true, 1);
|
||||
//monster.giveExpToCharacter(player, monster.getExp() * c.getPlayer().getExpRate(), true, 1);
|
||||
}
|
||||
}
|
||||
player.dropMessage("Killed " + monsters.size() + " monsters.");
|
||||
@@ -1367,7 +1387,7 @@ public class Commands {
|
||||
}
|
||||
|
||||
player.setLevel(Integer.parseInt(sub[1]) - 1);
|
||||
player.gainExp(-player.getExp(), false, false);
|
||||
player.loseExp(player.getExp(), false, false);
|
||||
player.levelUp(false);
|
||||
} else if (sub[0].equals("levelpro")) {
|
||||
if (sub.length < 2){
|
||||
@@ -1381,7 +1401,7 @@ public class Commands {
|
||||
} else if (sub[0].equals("maxstat")) {
|
||||
final String[] s = {"setall", String.valueOf(Short.MAX_VALUE)};
|
||||
executeGMCommand(c, s, heading);
|
||||
player.gainExp(-player.getExp(), false, false);
|
||||
player.loseExp(player.getExp(), false, false);
|
||||
player.setLevel(255);
|
||||
player.setFame(13337);
|
||||
player.setMaxHp(30000);
|
||||
|
||||
Reference in New Issue
Block a user