Aran skill & mount quests + New player IDs + MapleSkillMakerFetcher

Aran skill and mount questlines fixed.
Player ID starts counting from 20mil now, preventing clashes with map objects oid's (trying to solve the NPC disappearing issue).
New tool: MapleSkillMakerFetcher. It compiles a SQL script file containing updated Maker data info from the inputted ItemMake.wz.xml.
Updated Maker tables on the DB.
This commit is contained in:
ronancpl
2017-11-14 16:55:37 -02:00
parent 6fbd23f903
commit bc482ee0d2
72 changed files with 41495 additions and 18673 deletions

View File

@@ -273,7 +273,7 @@ public class Commands {
static {
gotomaps.put("gmmap", 180000000);
gotomaps.put("southperry", 60000);
gotomaps.put("amherst", 1010000);
gotomaps.put("amherst", 1000000);
gotomaps.put("henesys", 100000000);
gotomaps.put("ellinia", 101000000);
gotomaps.put("perion", 102000000);
@@ -281,6 +281,8 @@ public class Commands {
gotomaps.put("lith", 104000000);
gotomaps.put("sleepywood", 105040300);
gotomaps.put("florina", 110000000);
gotomaps.put("ereve", 130000000);
gotomaps.put("rien", 140000000);
gotomaps.put("orbis", 200000000);
gotomaps.put("happy", 209000000);
gotomaps.put("elnath", 211000000);
@@ -1795,9 +1797,8 @@ public class Commands {
for (MapleMapObject monstermo : monsters) {
monster = (MapleMonster) monstermo;
if (!monster.getStats().isFriendly()) {
map.killMonster(monster, player, true);
//monster.giveExpToCharacter(player, monster.getExp() * c.getPlayer().getExpRate(), true, 1);
}
map.damageMonster(player, monster, Integer.MAX_VALUE);
}
}
player.dropMessage("Killed " + monsters.size() + " monsters.");
break;

View File

@@ -28,30 +28,75 @@ import server.MapleItemInformationProvider;
import server.MakerItemFactory;
import server.MakerItemFactory.MakerItemCreateEntry;
import tools.Pair;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
/**
*
* @author Jay Estrella
* @author Jay Estrella, Ronan
*/
public final class MakerSkillHandler extends AbstractMaplePacketHandler {
private MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
slea.readInt();
int toCreate = slea.readInt();
MakerItemCreateEntry recipe = MakerItemFactory.getItemCreateEntry(toCreate);
if (canCreate(c, recipe) && !c.getPlayer().getInventory(ii.getInventoryType(toCreate)).isFull()) {
for (Pair<Integer, Integer> p : recipe.getReqItems()) {
int toRemove = p.getLeft();
MapleInventoryManipulator.removeById(c, ii.getInventoryType(toRemove), toRemove, p.getRight(), false, false);
}
MapleInventoryManipulator.addById(c, toCreate, (short) recipe.getRewardAmount());
short createStatus = getCreateStatus(c, recipe);
switch(createStatus) {
case 4: // no req skill level
c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough Maker level to complete this operation."));
break;
case 3: // no meso
c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough mesos to complete this operation."));
break;
case 2: // no req level
c.announce(MaplePacketCreator.serverNotice(1, "You don't have enough level to complete this operation."));
break;
case 1: // no items
c.announce(MaplePacketCreator.serverNotice(1, "You don't have all required items in your inventory to make " + recipe.getRewardAmount() + " " + ii.getName(toCreate) + "."));
break;
default:
if (!c.getPlayer().getInventory(ii.getInventoryType(toCreate)).isFull()) {
for (Pair<Integer, Integer> p : recipe.getReqItems()) {
int toRemove = p.getLeft();
MapleInventoryManipulator.removeById(c, ii.getInventoryType(toRemove), toRemove, p.getRight(), false, false);
}
MapleInventoryManipulator.addById(c, toCreate, (short) recipe.getRewardAmount());
c.announce(MaplePacketCreator.serverNotice(1, "You have created " + recipe.getRewardAmount() + " " + ii.getName(toCreate) + "."));
c.announce(MaplePacketCreator.showMakerEffect());
} else {
c.announce(MaplePacketCreator.serverNotice(1, "Your inventory is full."));
}
}
}
private boolean canCreate(MapleClient c, MakerItemCreateEntry recipe) {
return hasItems(c, recipe) && c.getPlayer().getMeso() >= recipe.getCost() && c.getPlayer().getLevel() >= recipe.getReqLevel() && c.getPlayer().getSkillLevel(c.getPlayer().getJob().getId() / 1000 * 1000 + 1007) >= recipe.getReqSkillLevel();
private short getCreateStatus(MapleClient c, MakerItemCreateEntry recipe) {
if(!hasItems(c, recipe)) {
return 1;
}
if(c.getPlayer().getMeso() < recipe.getCost()) {
return 2;
}
if(c.getPlayer().getLevel() < recipe.getReqLevel()) {
return 3;
}
if(c.getPlayer().getSkillLevel((c.getPlayer().getJob().getId() / 1000) * 10000000 + 1007) < recipe.getReqSkillLevel()) {
return 4;
}
return 0;
}
private boolean hasItems(MapleClient c, MakerItemCreateEntry recipe) {

View File

@@ -112,7 +112,7 @@ public class MakerItemFactory {
}
protected void addReqItem(int itemId, int amount) {
reqItems.add(new Pair<Integer, Integer>(itemId, amount));
reqItems.add(new Pair<>(itemId, amount));
}
}
}

View File

@@ -75,7 +75,7 @@ public class MapleTrade {
return fee;
}
private void lock() {
private void lockTrade() {
locked.set(true);
partner.getChr().getClient().announce(MaplePacketCreator.getTradeConfirmation());
}
@@ -201,7 +201,7 @@ public class MapleTrade {
}
public static void completeTrade(MapleCharacter c) {
c.getTrade().lock();
c.getTrade().lockTrade();
MapleTrade local = c.getTrade();
MapleTrade partner = local.getPartner();
if (partner.isLocked()) {

View File

@@ -387,7 +387,7 @@ public class MapleMap {
}
private int getUsableOID() {
if (runningOid.incrementAndGet() > 2000000000) {
if (runningOid.incrementAndGet() >= 20000000) {
runningOid.set(1000);
}
objectRLock.lock();
@@ -865,6 +865,8 @@ public class MapleMap {
if (!monster.isAlive()) {
return false;
}
/* pyramid not implemented
Pair<Integer, Integer> cool = monster.getStats().getCool();
if (cool != null) {
Pyramid pq = (Pyramid) chr.getPartyQuest();
@@ -885,6 +887,8 @@ public class MapleMap {
killed = true;
}
}
*/
if (damage > 0) {
monster.damage(chr, damage);
if (!monster.isAlive()) { // monster just died
@@ -1070,9 +1074,7 @@ public class MapleMap {
}
public void softKillAllMonsters() {
for (SpawnPoint spawnPoint : monsterSpawn) {
spawnPoint.setDenySpawn(true);
}
closeMapSpawnPoints();
for (MapleMapObject monstermo : getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER))) {
MapleMonster monster = (MapleMonster) monstermo;
@@ -1086,9 +1088,7 @@ public class MapleMap {
}
public void killAllMonstersNotFriendly() {
for (SpawnPoint spawnPoint : monsterSpawn) {
spawnPoint.setDenySpawn(true);
}
closeMapSpawnPoints();
for (MapleMapObject monstermo : getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER))) {
MapleMonster monster = (MapleMonster) monstermo;
@@ -1101,9 +1101,7 @@ public class MapleMap {
}
public void killAllMonsters() {
for (SpawnPoint spawnPoint : monsterSpawn) {
spawnPoint.setDenySpawn(true);
}
closeMapSpawnPoints();
for (MapleMapObject monstermo : getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.MONSTER))) {
MapleMonster monster = (MapleMonster) monstermo;
@@ -2834,6 +2832,12 @@ public class MapleMap {
}
}
public void closeMapSpawnPoints() {
for (SpawnPoint spawnPoint : monsterSpawn) {
spawnPoint.setDenySpawn(true);
}
}
public void restoreMapSpawnPoints() {
for (SpawnPoint spawnPoint : monsterSpawn) {
spawnPoint.setDenySpawn(false);

View File

@@ -5886,6 +5886,14 @@ public class MaplePacketCreator {
mplew.write(effect);
return mplew.getPacket();
}
public static byte[] showMakerEffect() {
final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendOpcode.SHOW_ITEM_GAIN_INCHAT.getValue());
mplew.write(16);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showForeignEffect(int effect) {
return showForeignEffect(-1, effect);