Skillbook announcer + isInJobTree fix

Abdula is now the Skillbook announcer NPC. Fixed some inconguencies with
the isInJobTree function, now properly returning if a skill id does make
presence on a player's current job path or not.
This commit is contained in:
ronancpl
2017-06-05 21:08:35 -03:00
parent 9d00f33783
commit 83d20e3c8b
31 changed files with 426 additions and 285 deletions

View File

@@ -59,8 +59,8 @@ public enum MapleJob {
LEGEND(2000), EVAN(2001),
ARAN1(2100),ARAN2(2110), ARAN3(2111), ARAN4(2112),
EVAN1(2200), EVAN2(2210), EVAN3(2211), EVAN4(2212), EVAN5(2213), EVAN6(2214),
EVAN7(2215), EVAN8(2216), EVAN9(2217), EVAN10(2218);
EVAN1(2200), EVAN2(2210), EVAN3(2211), EVAN4(2212), EVAN5(2213), EVAN6(2214),
EVAN7(2215), EVAN8(2216), EVAN9(2217), EVAN10(2218);
final int jobid;
final static int maxId = 22; // maxId = (EVAN / 100);

View File

@@ -99,6 +99,10 @@ import client.inventory.MaplePet;
import constants.GameConstants;
import constants.ItemConstants;
import constants.ServerConstants;
import constants.skills.Assassin;
import constants.skills.Cleric;
import constants.skills.Priest;
import constants.skills.Spearman;
import java.util.ArrayList;
import server.maps.FieldLimit;
@@ -768,17 +772,17 @@ public class Commands {
victim.updateSingleStat(MapleStat.AVAILABLEAP, victim.getRemainingAp());
}
} else if (sub[0].equals("empowerme")) {
final int[] array = {9001000, 9001001, 9101002, 9101003, 9101008, 2001002, 1101007, 1005, 2301003, 5121009, 1111002, 4111001, 4111002, 4211003, 4211005, 1321000, 2321004, 3121002};
final int[] array = {2311003, 2301004, 1301007, 4101004, 2001002, 1101007, 1005, 2301003, 5121009, 1111002, 4111001, 4111002, 4211003, 4211005, 1321000, 2321004, 3121002};
for (int i : array) {
SkillFactory.getSkill(i).getEffect(SkillFactory.getSkill(i).getMaxLevel()).applyTo(player);
}
} else if (sub[0].equals("buffme")) {
//GM Skills : Haste(Super) - Holy Symbol - Bless - Hyper Body - Echo of Hero
SkillFactory.getSkill(9101001).getEffect(SkillFactory.getSkill(9101001).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(9101002).getEffect(SkillFactory.getSkill(9101002).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(9101003).getEffect(SkillFactory.getSkill(9101003).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(9101008).getEffect(SkillFactory.getSkill(9101008).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(4101004).getEffect(SkillFactory.getSkill(4101004).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(2311003).getEffect(SkillFactory.getSkill(2311003).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(1301007).getEffect(SkillFactory.getSkill(1301007).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(2301004).getEffect(SkillFactory.getSkill(2301004).getMaxLevel()).applyTo(player);
SkillFactory.getSkill(1005).getEffect(SkillFactory.getSkill(1005).getMaxLevel()).applyTo(player);
player.setHp(player.getMaxHp());
player.updateSingleStat(MapleStat.HP, player.getMaxHp());
@@ -787,10 +791,10 @@ public class Commands {
} else if (sub[0].equals("buffmap")) {
for (MapleCharacter chr : player.getMap().getCharacters()){
//GM Skills : Haste(Super) - Holy Symbol - Bless - Hyper Body - Echo of Hero
SkillFactory.getSkill(9101001).getEffect(SkillFactory.getSkill(9101001).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(9101002).getEffect(SkillFactory.getSkill(9101002).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(9101003).getEffect(SkillFactory.getSkill(9101003).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(9101008).getEffect(SkillFactory.getSkill(9101008).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(4101004).getEffect(SkillFactory.getSkill(4101004).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(2311003).getEffect(SkillFactory.getSkill(2311003).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(1301007).getEffect(SkillFactory.getSkill(1301007).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(2301004).getEffect(SkillFactory.getSkill(2301004).getMaxLevel()).applyTo(chr);
SkillFactory.getSkill(1005).getEffect(SkillFactory.getSkill(1005).getMaxLevel()).applyTo(chr);
chr.setHp(chr.getMaxHp());
chr.updateSingleStat(MapleStat.HP, chr.getMaxHp());
@@ -808,7 +812,7 @@ public class Commands {
if(skill != null) skill.getEffect(skill.getMaxLevel()).applyTo(player);
} else if (sub[0].equals("proitem")) {
if (sub.length < 3) {
player.dropMessage("Syntax: !proitem <itemid> <statvalue>");
player.yellowMessage("Syntax: !proitem <itemid> <statvalue>");
return true;
}
@@ -831,63 +835,39 @@ public class Commands {
} else if (sub[0].equals("seteqstat")) {
if (sub.length < 2) {
player.dropMessage("Syntax: !seteqstat <statvalue>");
player.yellowMessage("Syntax: !seteqstat <statvalue>");
return true;
}
int val = Integer.parseInt(sub[1]);
int newStat = Integer.parseInt(sub[1]);
MapleInventory equip = player.getInventory(MapleInventoryType.EQUIP);
for (byte i = 0; i < 101; i++) {
try {
Equip eu = (Equip) equip.getItem(i);
int item = equip.getItem(i).getItemId();
short hand = eu.getHands();
byte level = eu.getLevel();
Equip nItem = new Equip(item, i);
nItem.setStr(eu.getStr()); // STR
nItem.setDex(eu.getDex()); // DEX
nItem.setInt(eu.getInt()); // INT
nItem.setLuk(eu.getLuk()); //LUK
nItem.setWatk(eu.getWatk()); //WA
//All Previous stats excluding the top 5
nItem.setWdef(eu.getWdef());
nItem.setAcc(eu.getHands());
nItem.setAvoid(eu.getAvoid());
nItem.setExpiration(eu.getExpiration());
nItem.setJump(eu.getJump());
nItem.setLevel(eu.getLevel());
nItem.setMatk(eu.getMatk());
nItem.setMdef(eu.getMdef());
nItem.setMp(eu.getMp());
nItem.setOwner(eu.getOwner());
nItem.setSpeed(eu.getSpeed());
nItem.setUpgradeSlots((byte) eu.getUpgradeSlots());
nItem.setHands(eu.getHands());
nItem.setLevel(eu.getLevel());
short incval= (short)val;
nItem.setWdef(incval);
nItem.setAcc(incval);
nItem.setAvoid(incval);
nItem.setJump(incval);
nItem.setMatk(incval);
nItem.setMdef(incval);
nItem.setMp(incval);
nItem.setSpeed(incval);
nItem.setUpgradeSlots((byte) eu.getUpgradeSlots());
nItem.setHands(incval);
nItem.setWatk(incval);
nItem.setDex(incval);
nItem.setInt(incval);
nItem.setStr(incval);
nItem.setLuk(incval);
Item tempItem = c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem((byte) i);
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, (byte)i, tempItem.getQuantity(), false, true);
player.getInventory(MapleInventoryType.EQUIP).addFromDB(nItem);
} catch(Exception e){}
for (byte i = 1; i <= equip.getSlotLimit(); i++) {
try {
Equip eu = (Equip) equip.getItem(i);
if(eu == null) continue;
short incval= (short)newStat;
eu.setWdef(incval);
eu.setAcc(incval);
eu.setAvoid(incval);
eu.setJump(incval);
eu.setMatk(incval);
eu.setMdef(incval);
eu.setMp(incval);
eu.setSpeed(incval);
eu.setHands(incval);
eu.setWatk(incval);
eu.setDex(incval);
eu.setInt(incval);
eu.setStr(incval);
eu.setLuk(incval);
player.forceUpdateItem(eu);
} catch(Exception e){
e.printStackTrace();
}
}
c.getSession().write(MaplePacketCreator.getCharInfo(player));
//c.getSession().write(MaplePacketCreator.getCharInfo(player));
//player.getMap().removePlayer(player);
//player.getMap().addPlayer(player);
} else if (sub[0].equals("spawn")) {
@@ -1369,6 +1349,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.setLevel(255);
player.setFame(13337);
player.setMaxHp(30000);
@@ -1377,6 +1358,9 @@ public class Commands {
player.updateSingleStat(MapleStat.FAME, 13337);
player.updateSingleStat(MapleStat.MAXHP, 30000);
player.updateSingleStat(MapleStat.MAXMP, 30000);
player.revertPlayerRates();
player.setPlayerRates();
player.yellowMessage("Stats maxed out.");
} else if (sub[0].equals("maxskills")) {
for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) {
try {
@@ -1388,10 +1372,10 @@ public class Commands {
nfe.printStackTrace();
break;
} catch (NullPointerException npe) {
npe.printStackTrace();
continue;
}
}
player.yellowMessage("Skills maxed out.");
} else if (sub[0].equals("mesos")) {
if (sub.length >= 2) {
player.gainMeso(Integer.parseInt(sub[1]), true);

View File

@@ -70,12 +70,37 @@ public class GameConstants {
return job == 2000 || (job >= 2100 && job <= 2112);
}
private static boolean isInBranchJobTree(int skillJobId, int jobId, int branchType) {
int branch = (int)(Math.pow(10, branchType));
int skillBranch = (int)(skillJobId / branch) * branch;
int jobBranch = (int)(jobId / branch) * branch;
return skillBranch == jobBranch;
}
private static boolean hasDivergedBranchJobTree(int skillJobId, int jobId, int branchType) {
int branch = (int)(Math.pow(10, branchType));
int skillBranch = (int)(skillJobId / branch);
int jobBranch = (int)(jobId / branch);
return skillBranch != jobBranch && skillBranch % 10 != 0;
}
public static boolean isInJobTree(int skillId, int jobId) {
int skill = skillId / 10000;
if ((jobId - skill) + skill == jobId) {
return true;
}
return false;
int skillJob = skillId / 10000;
if(!isInBranchJobTree(skillJob, jobId, 0)) {
for(int i = 1; i <= 3; i++) {
if(hasDivergedBranchJobTree(skillJob, jobId, i)) return false;
if(isInBranchJobTree(skillJob, jobId, i)) return true;
}
} else {
return true;
}
return false;
}
public static boolean isPqSkill(final int skill) {

View File

@@ -32,5 +32,5 @@ public class Hermit {
public static final int SHADOW_WEB = 4111003;
public static final int SHADOW_MESO = 4111004;
public static final int AVENGER = 4111005;
public static final int FLASH_JUML = 4111006;
public static final int FLASH_JUMP = 4111006;
}

View File

@@ -42,58 +42,58 @@ public final class ItemSortHandler extends AbstractMaplePacketHandler {
MapleInventoryType inventoryType = MapleInventoryType.getByType(slea.readByte());
if(!ServerConstants.USE_ITEM_SORT) {
c.announce(MaplePacketCreator.enableActions());
return;
c.announce(MaplePacketCreator.enableActions());
return;
}
MapleInventory inventory = c.getPlayer().getInventory(inventoryType);
//------------------- RonanLana's SLOT MERGER -----------------
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item srcItem, dstItem;
for(short dst = 0; dst <= inventory.getSlotLimit(); dst++) {
dstItem = inventory.getItem(dst);
if(dstItem == null) continue;
for(short src = (short)(dst + 1); src <= inventory.getSlotLimit(); src++) {
srcItem = inventory.getItem(src);
if(srcItem == null) continue;
if(dstItem.getItemId() != srcItem.getItemId()) continue;
if(dstItem.getQuantity() == ii.getSlotMax(c, inventory.getItem(dst).getItemId())) break;
MapleInventoryManipulator.move(c, inventoryType, src, dst);
}
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item srcItem, dstItem;
for(short dst = 1; dst <= inventory.getSlotLimit(); dst++) {
dstItem = inventory.getItem(dst);
if(dstItem == null) continue;
for(short src = (short)(dst + 1); src <= inventory.getSlotLimit(); src++) {
srcItem = inventory.getItem(src);
if(srcItem == null) continue;
if(dstItem.getItemId() != srcItem.getItemId()) continue;
if(dstItem.getQuantity() == ii.getSlotMax(c, inventory.getItem(dst).getItemId())) break;
MapleInventoryManipulator.move(c, inventoryType, src, dst);
}
}
//------------------------------------------------------------
inventory = c.getPlayer().getInventory(inventoryType);
boolean sorted = false;
while (!sorted) {
short freeSlot = inventory.getNextFreeSlot();
if (freeSlot != -1) {
short itemSlot = -1;
for (short i = (short) (freeSlot + 1); i <= inventory.getSlotLimit(); i = (short) (i + 1)) {
if (inventory.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot > 0) {
MapleInventoryManipulator.move(c, inventoryType, itemSlot, freeSlot);
} else {
sorted = true;
}
} else {
sorted = true;
}
}
c.announce(MaplePacketCreator.finishedSort(inventoryType.getType()));
c.announce(MaplePacketCreator.enableActions());
inventory = c.getPlayer().getInventory(inventoryType);
boolean sorted = false;
while (!sorted) {
short freeSlot = inventory.getNextFreeSlot();
if (freeSlot != -1) {
short itemSlot = -1;
for (short i = (short) (freeSlot + 1); i <= inventory.getSlotLimit(); i = (short) (i + 1)) {
if (inventory.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot > 0) {
MapleInventoryManipulator.move(c, inventoryType, itemSlot, freeSlot);
} else {
sorted = true;
}
} else {
sorted = true;
}
}
c.announce(MaplePacketCreator.finishedSort(inventoryType.getType()));
c.announce(MaplePacketCreator.enableActions());
}
}

View File

@@ -59,7 +59,7 @@ public final class SkillBookHandler extends AbstractMaplePacketHandler {
if (skilldata == null) {
return;
}
Skill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
Skill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
if (skilldata.get("skillid") == 0) {
canuse = false;
} else if ((player.getSkillLevel(skill2) >= skilldata.get("reqSkillLevel") || skilldata.get("reqSkillLevel") == 0) && player.getMasterLevel(skill2) < skilldata.get("masterLevel")) {

View File

@@ -63,6 +63,8 @@ import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import constants.ExpTable;
import constants.ServerConstants;
import java.util.Map;
import java.util.Set;
/**
*
@@ -457,4 +459,17 @@ public class NPCConversationManager extends AbstractPlayerInteraction {
dispose();
return true;
}
public Object[] getAvailableMasteryBooks() {
return MapleItemInformationProvider.getInstance().usableMasteryBooks(this.getPlayer()).toArray();
}
public Object[] getAvailableSkillBooks() {
return MapleItemInformationProvider.getInstance().usableSkillBooks(this.getPlayer()).toArray();
}
public Object[] getNamesWhoDropsItem(Integer itemId) {
return MapleItemInformationProvider.getInstance().getWhoDrops(itemId).toArray();
}
}

View File

@@ -33,6 +33,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.HashSet;
import net.server.Server;
import provider.MapleData;
@@ -49,6 +51,7 @@ import tools.Randomizer;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleJob;
import client.Skill;
import client.SkillFactory;
import client.autoban.AutobanFactory;
import client.inventory.Equip;
@@ -62,6 +65,7 @@ import constants.ItemConstants;
import constants.skills.Assassin;
import constants.skills.Gunslinger;
import constants.skills.NightWalker;
import server.life.MapleMonsterInformationProvider;
/**
*
@@ -1509,6 +1513,58 @@ public class MapleItemInformationProvider {
return list;
}
public Set<String> getWhoDrops(Integer itemId) {
Set<String> list = new HashSet<>();
try {
PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM drop_data WHERE itemid = ? LIMIT 50");
ps.setInt(1, itemId);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
String resultName = MapleMonsterInformationProvider.getMobNameFromId(rs.getInt("dropperid"));
if (resultName != null) {
list.add(resultName);
}
}
rs.close();
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
private boolean canUseSkillBook(MapleCharacter player, Integer skillBookId) {
Map<String, Integer> skilldata = MapleItemInformationProvider.getInstance().getSkillStats(skillBookId, player.getJob().getId());
if(skilldata == null || skilldata.get("skillid") == 0) return false;
Skill skill2 = SkillFactory.getSkill(skilldata.get("skillid"));
return (skilldata.get("skillid") != 0 && ((player.getSkillLevel(skill2) >= skilldata.get("reqSkillLevel") || skilldata.get("reqSkillLevel") == 0) && player.getMasterLevel(skill2) < skilldata.get("masterLevel")));
}
public List<Integer> usableMasteryBooks(MapleCharacter player) {
List<Integer> masterybook = new LinkedList<>();
for(Integer i = 2290000; i <= 2290125; i++) {
if(canUseSkillBook(player, i)) {
masterybook.add(i);
}
}
return masterybook;
}
public List<Integer> usableSkillBooks(MapleCharacter player) {
List<Integer> skillbook = new LinkedList<>();
for(Integer i = 2280000; i <= 2280012; i++) {
if(canUseSkillBook(player, i)) {
skillbook.add(i);
}
}
return skillbook;
}
public class scriptedItem {

View File

@@ -109,12 +109,12 @@ public class MapleMonsterInformationProvider {
while (rs.next()) {
ret.add(
new MonsterDropEntry(
rs.getInt("itemid"),
rs.getInt("chance"),
rs.getInt("minimum_quantity"),
rs.getInt("maximum_quantity"),
rs.getShort("questid")));
new MonsterDropEntry(
rs.getInt("itemid"),
rs.getInt("chance"),
rs.getInt("minimum_quantity"),
rs.getInt("maximum_quantity"),
rs.getShort("questid")));
}
} catch (SQLException e) {
e.printStackTrace();
@@ -155,7 +155,25 @@ public class MapleMonsterInformationProvider {
return retMobs;
}
public static String getMobNameFromID(int id)
public static String getMobNameFromId(int id)
{
try
{
return MapleLifeFactory.getMonster(id).getName();
}
catch (NullPointerException npe)
{
return null; //nonexistant mob
}
catch (Exception e)
{
e.printStackTrace();
System.err.println("Nonexistant mob id " + id);
return null; //nonexistant mob
}
}
public static String getMobNameFromID(int id)
{
try
{