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:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user