Reformat and clean up "server" package

This commit is contained in:
P0nk
2021-09-09 23:27:38 +02:00
parent d389665bd7
commit e8ef3a492c
80 changed files with 2104 additions and 2087 deletions
+17 -10
View File
@@ -48,10 +48,12 @@ import java.util.concurrent.locks.Lock;
public class CashShop { public class CashShop {
public static class CashItem { public static class CashItem {
private int sn, itemId, price; private final int sn;
private long period; private final int itemId;
private short count; private final int price;
private boolean onSale; private final long period;
private final short count;
private final boolean onSale;
private CashItem(int sn, int itemId, int price, long period, short count, boolean onSale) { private CashItem(int sn, int itemId, int price, long period, short count, boolean onSale) {
this.sn = sn; this.sn = sn;
@@ -120,8 +122,9 @@ public class CashShop {
} }
public static class SpecialCashItem { public static class SpecialCashItem {
private int sn, modifier; private final int sn;
private byte info; //? private final int modifier;
private final byte info; //?
public SpecialCashItem(int sn, int modifier, byte info) { public SpecialCashItem(int sn, int modifier, byte info) {
this.sn = sn; this.sn = sn;
@@ -240,13 +243,17 @@ public class CashShop {
} }
} }
private int accountId, characterId, nxCredit, maplePoint, nxPrepaid; private final int accountId;
private final int characterId;
private int nxCredit;
private int maplePoint;
private int nxPrepaid;
private boolean opened; private boolean opened;
private ItemFactory factory; private ItemFactory factory;
private List<Item> inventory = new ArrayList<>(); private final List<Item> inventory = new ArrayList<>();
private List<Integer> wishList = new ArrayList<>(); private final List<Integer> wishList = new ArrayList<>();
private int notes = 0; private int notes = 0;
private Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CASHSHOP); private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CASHSHOP);
public CashShop(int accountId, int characterId, int jobType) throws SQLException { public CashShop(int accountId, int characterId, int jobType) throws SQLException {
this.accountId = accountId; this.accountId = accountId;
+7 -6
View File
@@ -22,8 +22,9 @@
package server; package server;
import client.inventory.Item; import client.inventory.Item;
import java.util.Calendar;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Calendar;
public class DueyPackage { public class DueyPackage {
private String sender = null; private String sender = null;
@@ -61,11 +62,11 @@ public class DueyPackage {
public void setMesos(int set) { public void setMesos(int set) {
mesos = set; mesos = set;
} }
public String getMessage() { public String getMessage() {
return message; return message;
} }
public void setMessage(String m) { public void setMessage(String m) {
message = m; message = m;
} }
@@ -86,7 +87,7 @@ public class DueyPackage {
return 0; return 0;
} }
} }
public boolean isDeliveringTime() { public boolean isDeliveringTime() {
Calendar ts = timestamp; Calendar ts = timestamp;
if (ts != null) { if (ts != null) {
@@ -99,13 +100,13 @@ public class DueyPackage {
public void setSentTime(Timestamp ts, boolean quick) { public void setSentTime(Timestamp ts, boolean quick) {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(ts.getTime()); cal.setTimeInMillis(ts.getTime());
if (quick) { if (quick) {
if (System.currentTimeMillis() - ts.getTime() < 24 * 60 * 60 * 1000) { // thanks inhyuk for noticing quick delivery packages unavailable to retrieve from the get-go if (System.currentTimeMillis() - ts.getTime() < 24 * 60 * 60 * 1000) { // thanks inhyuk for noticing quick delivery packages unavailable to retrieve from the get-go
cal.add(Calendar.DATE, -1); cal.add(Calendar.DATE, -1);
} }
} }
this.timestamp = cal; this.timestamp = cal;
} }
} }
+8 -6
View File
@@ -22,18 +22,20 @@
package server; package server;
import client.inventory.Item; import client.inventory.Item;
import java.util.Calendar; import java.util.Calendar;
/** /**
*
* @author Traitor * @author Traitor
*/ */
public class MTSItemInfo { public class MTSItemInfo {
private int price; private final int price;
private Item item; private final Item item;
private String seller; private final String seller;
private int id; private final int id;
private int year, month, day = 1; private final int year;
private final int month;
private int day = 1;
public MTSItemInfo(Item item, int price, int id, int cid, String seller, String date) { public MTSItemInfo(Item item, int price, int id, int cid, String seller, String date) {
this.item = item; this.item = item;
+28 -28
View File
@@ -31,33 +31,32 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
/** /**
*
* @author Jay Estrella, Ronan * @author Jay Estrella, Ronan
*/ */
public class MakerItemFactory { public class MakerItemFactory {
private static ItemInformationProvider ii = ItemInformationProvider.getInstance(); private static final ItemInformationProvider ii = ItemInformationProvider.getInstance();
public static MakerItemCreateEntry getItemCreateEntry(int toCreate, int stimulantid, Map<Integer, Short> reagentids) { public static MakerItemCreateEntry getItemCreateEntry(int toCreate, int stimulantid, Map<Integer, Short> reagentids) {
MakerItemCreateEntry makerEntry = ii.getMakerItemEntry(toCreate); MakerItemCreateEntry makerEntry = ii.getMakerItemEntry(toCreate);
if(makerEntry.isInvalid()) { if (makerEntry.isInvalid()) {
return makerEntry; return makerEntry;
} }
// THEY DECIDED FOR SOME BIZARRE PATTERN ON THE FEE THING, ALMOST RANDOMIZED. // THEY DECIDED FOR SOME BIZARRE PATTERN ON THE FEE THING, ALMOST RANDOMIZED.
if(stimulantid != -1) { if (stimulantid != -1) {
makerEntry.addCost(getMakerStimulantFee(toCreate)); makerEntry.addCost(getMakerStimulantFee(toCreate));
} }
if(!reagentids.isEmpty()) { if (!reagentids.isEmpty()) {
for(Entry<Integer, Short> r : reagentids.entrySet()) { for (Entry<Integer, Short> r : reagentids.entrySet()) {
makerEntry.addCost((getMakerReagentFee(toCreate, ((r.getKey() % 10) + 1))) * r.getValue()); makerEntry.addCost((getMakerReagentFee(toCreate, ((r.getKey() % 10) + 1))) * r.getValue());
} }
} }
makerEntry.trimCost(); // "commit" the real cost of the recipe. makerEntry.trimCost(); // "commit" the real cost of the recipe.
return makerEntry; return makerEntry;
} }
public static MakerItemCreateEntry generateLeftoverCrystalEntry(int fromLeftoverid, int crystalId) { public static MakerItemCreateEntry generateLeftoverCrystalEntry(int fromLeftoverid, int crystalId) {
MakerItemCreateEntry ret = new MakerItemCreateEntry(0, 0, 1); MakerItemCreateEntry ret = new MakerItemCreateEntry(0, 0, 1);
ret.addReqItem(fromLeftoverid, 100); ret.addReqItem(fromLeftoverid, 100);
@@ -73,13 +72,13 @@ public class MakerItemFactory {
} }
return ret; return ret;
} }
private static double getMakerStimulantFee(int itemid) { private static double getMakerStimulantFee(int itemid) {
if(YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) { if (YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) {
EquipType et = EquipType.getEquipTypeById(itemid); EquipType et = EquipType.getEquipTypeById(itemid);
int eqpLevel = ii.getEquipLevelReq(itemid); int eqpLevel = ii.getEquipLevelReq(itemid);
switch(et) { switch (et) {
case CAP: case CAP:
return 1145.736246 * Math.exp(0.03336832546 * eqpLevel); return 1145.736246 * Math.exp(0.03336832546 * eqpLevel);
@@ -108,13 +107,13 @@ public class MakerItemFactory {
return 14000; return 14000;
} }
} }
private static double getMakerReagentFee(int itemid, int reagentLevel) { private static double getMakerReagentFee(int itemid, int reagentLevel) {
if(YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) { if (YamlConfig.config.server.USE_MAKER_FEE_HEURISTICS) {
EquipType et = EquipType.getEquipTypeById(itemid); EquipType et = EquipType.getEquipTypeById(itemid);
int eqpLevel = ii.getEquipLevelReq(itemid); int eqpLevel = ii.getEquipLevelReq(itemid);
switch(et) { switch (et) {
case CAP: case CAP:
return 5592.01613 * Math.exp(0.02914576018 * eqpLevel) * reagentLevel; return 5592.01613 * Math.exp(0.02914576018 * eqpLevel) * reagentLevel;
@@ -143,20 +142,21 @@ public class MakerItemFactory {
return 8000 * reagentLevel; return 8000 * reagentLevel;
} }
} }
public static class MakerItemCreateEntry { public static class MakerItemCreateEntry {
private int reqLevel, reqMakerLevel; private final int reqLevel;
private final int reqMakerLevel;
private double cost; private double cost;
private int reqCost; private int reqCost;
private List<Pair<Integer, Integer>> reqItems = new ArrayList<>(); // itemId / amount private final List<Pair<Integer, Integer>> reqItems = new ArrayList<>(); // itemId / amount
private List<Pair<Integer, Integer>> gainItems = new ArrayList<>(); // itemId / amount private final List<Pair<Integer, Integer>> gainItems = new ArrayList<>(); // itemId / amount
public MakerItemCreateEntry(int cost, int reqLevel, int reqMakerLevel) { public MakerItemCreateEntry(int cost, int reqLevel, int reqMakerLevel) {
this.cost = cost; this.cost = cost;
this.reqLevel = reqLevel; this.reqLevel = reqLevel;
this.reqMakerLevel = reqMakerLevel; this.reqMakerLevel = reqMakerLevel;
} }
public MakerItemCreateEntry(MakerItemCreateEntry mi) { public MakerItemCreateEntry(MakerItemCreateEntry mi) {
this.cost = mi.cost; this.cost = mi.cost;
this.reqLevel = mi.reqLevel; this.reqLevel = mi.reqLevel;
@@ -170,7 +170,7 @@ public class MakerItemFactory {
public List<Pair<Integer, Integer>> getReqItems() { public List<Pair<Integer, Integer>> getReqItems() {
return reqItems; return reqItems;
} }
public List<Pair<Integer, Integer>> getGainItems() { public List<Pair<Integer, Integer>> getGainItems() {
return gainItems; return gainItems;
} }
@@ -186,7 +186,7 @@ public class MakerItemFactory {
public int getCost() { public int getCost() {
return reqCost; return reqCost;
} }
public void addCost(double amount) { public void addCost(double amount) {
cost += amount; cost += amount;
} }
@@ -194,16 +194,16 @@ public class MakerItemFactory {
protected void addReqItem(int itemId, int amount) { protected void addReqItem(int itemId, int amount) {
reqItems.add(new Pair<>(itemId, amount)); reqItems.add(new Pair<>(itemId, amount));
} }
protected void addGainItem(int itemId, int amount) { protected void addGainItem(int itemId, int amount) {
gainItems.add(new Pair<>(itemId, amount)); gainItems.add(new Pair<>(itemId, amount));
} }
public void trimCost() { public void trimCost() {
reqCost = (int) (cost / 1000); reqCost = (int) (cost / 1000);
reqCost *= 1000; reqCost *= 1000;
} }
public boolean isInvalid() { // thanks Rohenn, Wh1SK3Y for noticing some items not getting checked properly public boolean isInvalid() { // thanks Rohenn, Wh1SK3Y for noticing some items not getting checked properly
return reqLevel < 0; return reqLevel < 0;
} }
+3 -1
View File
@@ -1648,7 +1648,9 @@ public class StatEffect {
private boolean isCureAllAbnormalStatus() { private boolean isCureAllAbnormalStatus() {
if (skill) { if (skill) {
return isHerosWill(sourceid); return isHerosWill(sourceid);
} else return sourceid == 2022544; } else {
return sourceid == 2022544;
}
} }
public static boolean isHerosWill(int skillid) { public static boolean isHerosWill(int skillid) {
+12 -12
View File
@@ -22,20 +22,19 @@ package server;
import java.util.concurrent.*; import java.util.concurrent.*;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class ThreadManager { public class ThreadManager {
private static ThreadManager instance = new ThreadManager(); private static final ThreadManager instance = new ThreadManager();
public static ThreadManager getInstance() { public static ThreadManager getInstance() {
return instance; return instance;
} }
private ThreadPoolExecutor tpe; private ThreadPoolExecutor tpe;
private ThreadManager() {} private ThreadManager() {}
private class RejectedExecutionHandlerImpl implements RejectedExecutionHandler { private class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {
@Override @Override
@@ -45,23 +44,24 @@ public class ThreadManager {
} }
} }
public void newTask(Runnable r) { public void newTask(Runnable r) {
tpe.execute(r); tpe.execute(r);
} }
public void start() { public void start() {
RejectedExecutionHandler reh = new RejectedExecutionHandlerImpl(); RejectedExecutionHandler reh = new RejectedExecutionHandlerImpl();
ThreadFactory tf = Executors.defaultThreadFactory(); ThreadFactory tf = Executors.defaultThreadFactory();
tpe = new ThreadPoolExecutor(20, 1000, 77, TimeUnit.SECONDS, new ArrayBlockingQueue<>(50), tf, reh); tpe = new ThreadPoolExecutor(20, 1000, 77, TimeUnit.SECONDS, new ArrayBlockingQueue<>(50), tf, reh);
} }
public void stop() { public void stop() {
tpe.shutdown(); tpe.shutdown();
try { try {
tpe.awaitTermination(5, TimeUnit.MINUTES); tpe.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException ie) {} } catch (InterruptedException ie) {
}
} }
} }
+10 -10
View File
@@ -34,12 +34,12 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class TimerManager implements TimerManagerMBean { public class TimerManager implements TimerManagerMBean {
private static TimerManager instance = new TimerManager(); private static final TimerManager instance = new TimerManager();
public static TimerManager getInstance() { public static TimerManager getInstance() {
return instance; return instance;
} }
private ScheduledThreadPoolExecutor ses; private ScheduledThreadPoolExecutor ses;
private TimerManager() { private TimerManager() {
@@ -68,24 +68,24 @@ public class TimerManager implements TimerManagerMBean {
//this is a no-no, it actually does nothing..then why the fuck are you doing it? //this is a no-no, it actually does nothing..then why the fuck are you doing it?
stpe.setContinueExistingPeriodicTasksAfterShutdownPolicy(false); stpe.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
stpe.setRemoveOnCancelPolicy(true); stpe.setRemoveOnCancelPolicy(true);
stpe.setKeepAliveTime(5, TimeUnit.MINUTES); stpe.setKeepAliveTime(5, TimeUnit.MINUTES);
stpe.allowCoreThreadTimeOut(true); stpe.allowCoreThreadTimeOut(true);
ses = stpe; ses = stpe;
} }
public void stop() { public void stop() {
ses.shutdownNow(); ses.shutdownNow();
} }
public Runnable purge() {//Yay? public Runnable purge() {//Yay?
return () -> { return () -> {
Server.getInstance().forceUpdateCurrentTime(); Server.getInstance().forceUpdateCurrentTime();
ses.purge(); ses.purge();
}; };
} }
public ScheduledFuture<?> register(Runnable r, long repeatTime, long delay) { public ScheduledFuture<?> register(Runnable r, long repeatTime, long delay) {
return ses.scheduleAtFixedRate(new LoggingSaveRunnable(r), delay, repeatTime, TimeUnit.MILLISECONDS); return ses.scheduleAtFixedRate(new LoggingSaveRunnable(r), delay, repeatTime, TimeUnit.MILLISECONDS);
} }
@@ -97,7 +97,7 @@ public class TimerManager implements TimerManagerMBean {
public ScheduledFuture<?> schedule(Runnable r, long delay) { public ScheduledFuture<?> schedule(Runnable r, long delay) {
return ses.schedule(new LoggingSaveRunnable(r), delay, TimeUnit.MILLISECONDS); return ses.schedule(new LoggingSaveRunnable(r), delay, TimeUnit.MILLISECONDS);
} }
public ScheduledFuture<?> scheduleAtTimestamp(Runnable r, long timestamp) { public ScheduledFuture<?> scheduleAtTimestamp(Runnable r, long timestamp) {
return schedule(r, timestamp - System.currentTimeMillis()); return schedule(r, timestamp - System.currentTimeMillis());
} }
@@ -118,7 +118,7 @@ public class TimerManager implements TimerManagerMBean {
} }
@Override @Override
public long getTaskCount() { public long getTaskCount() {
return ses.getTaskCount(); return ses.getTaskCount();
} }
@@ -132,7 +132,7 @@ public class TimerManager implements TimerManagerMBean {
return ses.isTerminated(); return ses.isTerminated();
} }
private static class LoggingSaveRunnable implements Runnable { private static class LoggingSaveRunnable implements Runnable {
Runnable r; Runnable r;
+2 -2
View File
@@ -27,8 +27,8 @@ package server.events;
*/ */
public abstract class Events { public abstract class Events {
public Events() { public Events() {
} }
public abstract int getInfo(); public abstract int getInfo();
} }
+5 -6
View File
@@ -9,13 +9,12 @@ import client.Character;
import client.SkillFactory; import client.SkillFactory;
/** /**
*
* @author kevintjuh93 * @author kevintjuh93
*/ */
public class RescueGaga extends Events { public class RescueGaga extends Events {
private int completed; private int completed;
public RescueGaga(int completed) { public RescueGaga(int completed) {
super(); super();
this.completed = completed; this.completed = completed;
@@ -33,7 +32,7 @@ public class RescueGaga extends Events {
public int getInfo() { public int getInfo() {
return getCompleted(); return getCompleted();
} }
public void giveSkill(Character chr) { public void giveSkill(Character chr) {
int skillid = 0; int skillid = 0;
switch (chr.getJobType()) { switch (chr.getJobType()) {
@@ -44,7 +43,7 @@ public class RescueGaga extends Events {
case 2: case 2:
skillid = 10001014; skillid = 10001014;
} }
long expiration = (System.currentTimeMillis() + 3600 * 24 * 20 * 1000);//20 days long expiration = (System.currentTimeMillis() + 3600 * 24 * 20 * 1000);//20 days
if (completed < 20) { if (completed < 20) {
chr.changeSkillLevel(SkillFactory.getSkill(skillid), (byte) 1, 1, expiration); chr.changeSkillLevel(SkillFactory.getSkill(skillid), (byte) 1, 1, expiration);
@@ -54,5 +53,5 @@ public class RescueGaga extends Events {
chr.changeSkillLevel(SkillFactory.getSkill(skillid), (byte) 2, 2, chr.getSkillExpiration(skillid)); chr.changeSkillLevel(SkillFactory.getSkill(skillid), (byte) 2, 2, chr.getSkillExpiration(skillid));
} }
} }
} }
+46 -47
View File
@@ -1,65 +1,64 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class ElNath extends GachaponItems { public class ElNath extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2041012, 2048003, 2043800, 2043301, 2040301, 2043101, 2043201, 2043001, 2044301, 2043801, 2044201, 2043701, 2044502,
2041011, 2041014, 2044602, 2043302, 2043202, 2043002, 2048005, 2044402, 2044302, 2043802, 2044102, 2044202, 2043702,
2044812,
/* Useable drop */ /* Scroll */
2000004, 2000005, 2041012, 2048003, 2043800, 2043301, 2040301, 2043101, 2043201, 2043001, 2044301, 2043801, 2044201, 2043701, 2044502,
2041011, 2041014, 2044602, 2043302, 2043202, 2043002, 2048005, 2044402, 2044302, 2043802, 2044102, 2044202, 2043702,
2044812,
/* Common equipment */ /* Useable drop */
1402010, 1032003, 1442013, 1432009, 1302022, 1302029, 1322021, 1302026, 1442017, 1322023, 1102011, 1032008, 1322026, 2000004, 2000005,
1442016, 1312000, 1032007, 1322025, 1322027, 1032020, 1442015, 1432017, 1302027, 1302049, 1372006, 1032022, 1032021,
1372004, 1332020, 1322007, 1032006, 1302028, 1322003, 1302007, 1092030, 1302021, 1322024, 1322012, 1032005, 1322022,
1032013, 1302025, 1302013, 1032017, 1032002, 1032001, 1302017, 1432018, 1442012, 1302000, 1032000, 1102013, 1442022,
1372005, 1442021, 1032009, 1302016,
/* Warrior equipment */ /* Common equipment */
1442003, 1312007, 1402008, 1312008, 1412008, 1442009, 1302004, 1312006, 1442016, 1402012, 1302003, 1312005, 1432002, 1402010, 1032003, 1442013, 1432009, 1302022, 1302029, 1322021, 1302026, 1442017, 1322023, 1102011, 1032008, 1322026,
1432001, 1302008, 1040030, 1402015, 1322015, 1432006, 1322002, 1302010, 1322017, 1402003, 1402006, 1322000, 1422001, 1442016, 1312000, 1032007, 1322025, 1322027, 1032020, 1442015, 1432017, 1302027, 1302049, 1372006, 1032022, 1032021,
1442001, 1422004, 1412004, 1322009, 1322011, 1442000, 1412005, 1402002, 1432004, 1442010, 1422008, 1442007, 1422009, 1372004, 1332020, 1322007, 1032006, 1302028, 1322003, 1302007, 1092030, 1302021, 1322024, 1322012, 1032005, 1322022,
1322019, 1412003, 1412007, 1302009, 1412000, 1322014, 1402001, 1402007, 1432005, 1032013, 1302025, 1302013, 1032017, 1032002, 1032001, 1302017, 1432018, 1442012, 1302000, 1032000, 1102013, 1442022,
1372005, 1442021, 1032009, 1302016,
/* Magician equipment */ /* Warrior equipment */
1382001, 1372007, 1382010, 1382007, 1372000, 1372003, 1382011, 1382006, 1382000, 1442003, 1312007, 1402008, 1312008, 1412008, 1442009, 1302004, 1312006, 1442016, 1402012, 1302003, 1312005, 1432002,
1432001, 1302008, 1040030, 1402015, 1322015, 1432006, 1322002, 1302010, 1322017, 1402003, 1402006, 1322000, 1422001,
1442001, 1422004, 1412004, 1322009, 1322011, 1442000, 1412005, 1402002, 1432004, 1442010, 1422008, 1442007, 1422009,
1322019, 1412003, 1412007, 1302009, 1412000, 1322014, 1402001, 1402007, 1432005,
/* Bowman equipment */ /* Magician equipment */
1452004, 1452000, 1452010, 1452015, 1452014, 1462012, 1462010, 1452017, 1462000, 1452008, 1452006, 1462006, 1452007, 1382001, 1372007, 1382010, 1382007, 1372000, 1372003, 1382011, 1382006, 1382000,
1452002, 1402001,
/* Thief equipment */ /* Bowman equipment */
1472006, 1472010, 1332022, 1332011, 1472015, 1472016, 1472023, 1472028, 1472022, 1472011, 1472026, 1332024, 1332009, 1452004, 1452000, 1452010, 1452015, 1452014, 1462012, 1462010, 1452017, 1462000, 1452008, 1452006, 1462006, 1452007,
1472017, 1472013, 1472029, 1472021, 1332015, 1332031, 1332023, 1332004, 1472000, 1332019, 1472027, 1332018, 1472007, 1452002, 1402001,
1332012, 1332016, 1472024, 1332017, 1332003, 1472012, 1472014, 1472005, 1472018, 1472001,
/* Pirate equipment */ /* Thief equipment */
1072294, 1492009 1472006, 1472010, 1332022, 1332011, 1472015, 1472016, 1472023, 1472028, 1472022, 1472011, 1472026, 1332024, 1332009,
1472017, 1472013, 1472029, 1472021, 1332015, 1332031, 1332023, 1332004, 1472000, 1332019, 1472027, 1332018, 1472007,
1332012, 1332016, 1472024, 1332017, 1332003, 1472012, 1472014, 1472005, 1472018, 1472001,
}; /* Pirate equipment */
} 1072294, 1492009
@Override };
public int[] getUncommonItems() { }
return new int [] {2022439, 2040804, 2040805, 2340000};
}
@Override @Override
public int[] getRareItems() { public int[] getUncommonItems() {
return new int [] {2043803, 1102085}; return new int[]{2022439, 2040804, 2040805, 2340000};
} }
@Override
public int[] getRareItems() {
return new int[]{2043803, 1102085};
}
} }
+22 -23
View File
@@ -1,19 +1,18 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class Ellinia extends GachaponItems { public class Ellinia extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int[] { return new int[]{
/* Scroll */ /* Scroll */
2043302, 2040002, 2043102, 2043002, 2044402, 2044302, 2043802, 2044002, 2041017, 2044902, 2043302, 2040002, 2043102, 2043002, 2044402, 2044302, 2043802, 2044002, 2041017, 2044902,
@@ -46,21 +45,21 @@ public class Ellinia extends GachaponItems {
1472010, 1472006, 1332011, 1472031, 1041048, 1472019, 1041095, 1040095, 1002128, 1061077, 1060025, 1041040, 1061033, 1472028, 1472010, 1472006, 1332011, 1472031, 1041048, 1472019, 1041095, 1040095, 1002128, 1061077, 1060025, 1041040, 1061033, 1472028,
1472022, 1472011, 1040096, 1062002, 1002129, 1472026, 1332009, 1060043, 1002249, 1472021, 1040084, 1332015, 1002173, 1002148, 1472022, 1472011, 1040096, 1062002, 1002129, 1472026, 1332009, 1060043, 1002249, 1472021, 1040084, 1332015, 1002173, 1002148,
1332004, 1332018, 1472009, 1061069, 1002176, 1041044, 1061037, 1060032, 1472020, 1040060, 1472018, 1332013, 1332002, 1402001, 1332004, 1332018, 1472009, 1061069, 1002176, 1041044, 1061037, 1060032, 1472020, 1040060, 1472018, 1332013, 1332002, 1402001,
/* Pirate equipment */ /* Pirate equipment */
1002625, 1002616, 1482005, 1052098, 1482003, 1002625, 1002616, 1482005, 1052098, 1482003,
1482001, 1492004, 1002622, 1492005, 1082195 1482001, 1492004, 1002622, 1492005, 1082195
}; };
} }
@Override @Override
public int[] getUncommonItems() { public int[] getUncommonItems() {
return new int [] {1082149, 1002391, 1002419}; return new int[]{1082149, 1002391, 1002419};
} }
@Override @Override
public int[] getRareItems() { public int[] getRareItems() {
return new int [] {}; return new int[]{};
} }
} }
@@ -23,35 +23,34 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX)
* @author Alan (SharpAceX) */
*/
public abstract class GachaponItems { public abstract class GachaponItems {
public abstract int [] getCommonItems(); public abstract int[] getCommonItems();
public abstract int [] getUncommonItems(); public abstract int[] getUncommonItems();
public abstract int [] getRareItems(); public abstract int[] getRareItems();
private final int [] commonItems;
private final int [] uncommonItems;
private final int [] rareItems;
public GachaponItems() {
this.commonItems = getCommonItems();
this.uncommonItems = getUncommonItems();
this.rareItems = getRareItems();
}
public final int[] getItems(int tier) { private final int[] commonItems;
if (tier == 0) { private final int[] uncommonItems;
return commonItems; private final int[] rareItems;
} else if (tier == 1) {
return uncommonItems; public GachaponItems() {
} else if (tier == 2) { this.commonItems = getCommonItems();
return rareItems; this.uncommonItems = getUncommonItems();
} this.rareItems = getRareItems();
return null; }
}
public final int[] getItems(int tier) {
if (tier == 0) {
return commonItems;
} else if (tier == 1) {
return uncommonItems;
} else if (tier == 2) {
return rareItems;
}
return null;
}
} }
+36 -37
View File
@@ -1,47 +1,46 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX)
* @author Alan (SharpAceX) * @author Ronan - added ores and reworked global loots
* @author Ronan - added ores and reworked global loots */
*/
public class Global extends GachaponItems { public class Global extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int[] { return new int[]{
/* Potions */ /* Potions */
2000004, 2000005, 2001002, 2001001, 2020012, 2020013, 2020014, 2020015, 2000004, 2000005, 2001002, 2001001, 2020012, 2020013, 2020014, 2020015,
/* Ores */
4004000, 4004001, 4004002, 4004003, 4004004,
4006000, 4006001,
4010000, 4010001, 4010002, 4010003, 4010004, 4010005, 4010006, 4010007,
4020000, 4020001, 4020002, 4020003, 4020004, 4020005, 4020006, 4020007, 4020008
};
}
@Override /* Ores */
public int[] getUncommonItems() { 4004000, 4004001, 4004002, 4004003, 4004004,
return new int[] { 4006000, 4006001,
/* Potions */ 4010000, 4010001, 4010002, 4010003, 4010004, 4010005, 4010006, 4010007,
2022179, 2022273, 2022282, 2022283, 2022285, 2022245, 2022182, 4020000, 4020001, 4020002, 4020003, 4020004, 4020005, 4020006, 4020007, 4020008
};
/* Scrolls */ }
2049003
};
}
@Override @Override
public int[] getRareItems() { public int[] getUncommonItems() {
return new int[] { return new int[]{
/* Scrolls */ /* Potions */
2049100, 2340000, 2022179, 2022273, 2022282, 2022283, 2022285, 2022245, 2022182,
/* Chairs */ /* Scrolls */
3010063, 3010064 2049003
}; };
} }
@Override
public int[] getRareItems() {
return new int[]{
/* Scrolls */
2049100, 2340000,
/* Chairs */
3010063, 3010064
};
}
} }
+43 -44
View File
@@ -1,61 +1,60 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub
* @author Alan (SharpAceX) - gachapon source classes stub * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class Henesys extends GachaponItems { public class Henesys extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2040001, 2041002, 2040702, 2043802, 2040402, 2043702, 2044813,
/* Useable Drops */ /* Scroll */
2000004, 2000005, 2020012, 2030007, 2040001, 2041002, 2040702, 2043802, 2040402, 2043702, 2044813,
/* Common equipment */ /* Useable Drops */
1432009, 1302022, 1322021, 1302026, 1442017, 1082147, 1102043, 1322026, 1442016, 1402012, 1322025, 1322027, 1302027, 2000004, 2000005, 2020012, 2030007,
1312012, 1062000, 1332020, 1302028, 1372002, 1002033, 1092022, 1302021, 1322009, 1322024, 1082148, 1002012, 1322012,
1322022, 1002020, 1302013, 1082146, 1442014, 1002096, 1302017, 1442012,
/* Warrior equipment */ /* Common equipment */
1092011, 1092014, 1302003, 1432001, 1312011, 1002088, 1041020, 1322015, 1442004, 1422008, 1302056, 1432000, 1442005, 1432009, 1302022, 1322021, 1302026, 1442017, 1082147, 1102043, 1322026, 1442016, 1402012, 1322025, 1322027, 1302027,
1312012, 1062000, 1332020, 1302028, 1372002, 1002033, 1092022, 1302021, 1322009, 1322024, 1082148, 1002012, 1322012,
1322022, 1002020, 1302013, 1082146, 1442014, 1002096, 1302017, 1442012,
/* Magician equipment */ /* Warrior equipment */
1382001, 1041053, 1041029, 1050053, 1051032, 1050073, 1061036, 1002253, 1002034, 1051025, 1050067, 1051052, 1002072, 1092011, 1092014, 1302003, 1432001, 1312011, 1002088, 1041020, 1322015, 1442004, 1422008, 1302056, 1432000, 1442005,
1002144, 1051054, 1050069, 1372007, 1050056, 1050074, 1002254, 1002274, 1002218, 1051055, 1382010, 1002246, 1050039,
1382007, 1372000, 1002013, 1050072, 1002036, 1002244, 1372008, 1382008, 1382011, 1092021, 1051034, 1050047, 1040019,
1041031, 1051033, 1002153, 1002252, 1051024, 1051053, 1050068, 1382003, 1382006, 1050055, 1051031, 1050025, 1002155,
1002245, 1372001,
/* Bowman equipment */ /* Magician equipment */
1452004, 1452023, 1060057, 1432001, 1040071, 1002137, 1462009, 1452017, 1040025, 1041027, 1452005, 1452007, 1061057, 1382001, 1041053, 1041029, 1050053, 1051032, 1050073, 1061036, 1002253, 1002034, 1051025, 1050067, 1051052, 1002072,
1002144, 1051054, 1050069, 1372007, 1050056, 1050074, 1002254, 1002274, 1002218, 1051055, 1382010, 1002246, 1050039,
1382007, 1372000, 1002013, 1050072, 1002036, 1002244, 1372008, 1382008, 1382011, 1092021, 1051034, 1050047, 1040019,
1041031, 1051033, 1002153, 1002252, 1051024, 1051053, 1050068, 1382003, 1382006, 1050055, 1051031, 1050025, 1002155,
1002245, 1372001,
/* Thief equipment */ /* Bowman equipment */
1472006, 1472019, 1060084, 1472028, 1472004, 1002179, 1082074, 1472029, 1040100, 1332015, 1432001, 1040097, 1060071, 1452004, 1452023, 1060057, 1432001, 1040071, 1002137, 1462009, 1452017, 1040025, 1041027, 1452005, 1452007, 1061057,
1472007, 1472002, 1051009, 1041044, 1041003, 1332016, 1472020, 1332003,
/* Pirate equipment */
1002622, 1082204, 1082213, 1082198, 1002631, 1052122, 1482012, 1052131, 1482007, 1482004, 1072318, 1492007
}; /* Thief equipment */
} 1472006, 1472019, 1060084, 1472028, 1472004, 1002179, 1082074, 1472029, 1040100, 1332015, 1432001, 1040097, 1060071,
1472007, 1472002, 1051009, 1041044, 1041003, 1332016, 1472020, 1332003,
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1002622, 1082204, 1082213, 1082198, 1002631, 1052122, 1482012, 1052131, 1482007, 1482004, 1072318, 1492007
return new int[] {2040805, 1102041, 1102042, 1442018};
}
@Override };
public int[] getRareItems() { }
return new int[] {};
} @Override
public int[] getUncommonItems() {
return new int[]{2040805, 1102041, 1102042, 1442018};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+42 -43
View File
@@ -1,59 +1,58 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class KerningCity extends GachaponItems { public class KerningCity extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2041016, 2043302, 2040902, 2044804, 2044906,
/* Useable drop */ /* Scroll */
2000004, 2000005, 2022025, 2022027, 2041016, 2043302, 2040902, 2044804, 2044906,
/* Common equipment */ /* Useable drop */
1442013, 1432009, 1322021, 1050018, 1002392, 1002394, 1442004, 1372002, 1002418, 1002033, 1092008, 2000004, 2000005, 2022025, 2022027,
1082148, 1062001, 1302017, 1032023, 1102013, 1102040, 1002041, 1002097,
/* Warrior equipment */ /* Common equipment */
1332026, 1051010, 1432001, 1422005, 1332019, 1302010, 1002056, 1060011, 1322011, 1432004, 1002028, 1442013, 1432009, 1322021, 1050018, 1002392, 1002394, 1442004, 1372002, 1002418, 1002033, 1092008,
1051000, 1442007, 1302002, 1082148, 1062001, 1302017, 1032023, 1102013, 1102040, 1002041, 1002097,
/* Magician equipment */ /* Warrior equipment */
1002037, 1002034, 1082020, 1050039, 1372000, 1002215, 1051034, 1040019, 1061034, 1382003, 1382006, 1332026, 1051010, 1432001, 1422005, 1332019, 1302010, 1002056, 1060011, 1322011, 1432004, 1002028,
1050025, 1051000, 1442007, 1302002,
/* Bowman equipment */ /* Magician equipment */
1002118, 1061081, 1452011, 1462012, 1452006, 1452007, 1002037, 1002034, 1082020, 1050039, 1372000, 1002215, 1051034, 1040019, 1061034, 1382003, 1382006,
1050025,
/* Thief equipment */ /* Bowman equipment */
1472010, 1472029, 1041048, 1041095, 1060031, 1061033, 1041049, 1472011, 1040096, 1472033, 1332026, 1002118, 1061081, 1452011, 1462012, 1452006, 1452007,
1051006, 1082074, 1472025, 1061106, 1040084, 1332015, 1472000, 1332019, 1002183, 1002209, 1092020,
1332029, 1092019, 1061099, 1060106, 1040032, 1040059, 1332003, 1040060, 1060046, 1472005, 1332027,
/* Pirate equipment */
1082192, 1072288, 1492003, 1052113, 1052104,
1492002, 1052095, 1492001, 1002613, 1492004
};
}
@Override /* Thief equipment */
public int[] getUncommonItems() { 1472010, 1472029, 1041048, 1041095, 1060031, 1061033, 1041049, 1472011, 1040096, 1472033, 1332026,
return new int[] {2040805, 1082149, 1102041}; 1051006, 1082074, 1472025, 1061106, 1040084, 1332015, 1472000, 1332019, 1002183, 1002209, 1092020,
} 1332029, 1092019, 1061099, 1060106, 1040032, 1040059, 1332003, 1040060, 1060046, 1472005, 1332027,
@Override /* Pirate equipment */
public int[] getRareItems() { 1082192, 1072288, 1492003, 1052113, 1052104,
return new int[] {}; 1492002, 1052095, 1492001, 1002613, 1492004
} };
}
@Override
public int[] getUncommonItems() {
return new int[]{2040805, 1082149, 1102041};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+37 -38
View File
@@ -1,56 +1,55 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class Ludibrium extends GachaponItems { public class Ludibrium extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2048000, 2040601, 2041019, 2041007, 2041016, 2041022, 2041001, 2041010, 2041013, 2041004, 2044701, 2043301, 2040301, 2048004, 2048001, 2040901, 2040701, 2040704, 2040707, 2040602, 2041020, 2041008, 2041017, 2041023, 2041002, 2041011, 2041014, 2041005, 2044702, 2043302, 2040302, 2040002, 2044402, 2048005, 2048002, 2040702, 2040705, 2040708, 2044302, 2043802, 2040402, 2043702, 2044811,
/* Useable drop */ /* Scroll */
2000004, 2000005, 4006000, 4006001, 2048000, 2040601, 2041019, 2041007, 2041016, 2041022, 2041001, 2041010, 2041013, 2041004, 2044701, 2043301, 2040301, 2048004, 2048001, 2040901, 2040701, 2040704, 2040707, 2040602, 2041020, 2041008, 2041017, 2041023, 2041002, 2041011, 2041014, 2041005, 2044702, 2043302, 2040302, 2040002, 2044402, 2048005, 2048002, 2040702, 2040705, 2040708, 2044302, 2043802, 2040402, 2043702, 2044811,
/* Common equipment */ /* Useable drop */
1032003, 1432009, 1302022, 1302029, 1102014, 1102018, 1312014, 1302026, 1102015, 1032011, 1312013, 1032008, 1032019, 1032007, 1332030, 1032020, 1032004, 1302027, 1032022, 1312012, 1032021, 1032006, 1302028, 1322003, 1032016, 1032015, 1302024, 1092008, 1032018, 1302021, 1032014, 1332021, 1322012, 1032005, 1032013, 1102012, 1302025, 1302013, 1032002, 1032001, 1032012, 1302017, 1032010, 1402014, 1102017, 1102013, 1442021, 1032009, 2000004, 2000005, 4006000, 4006001,
/* Beginner equipment */ /* Common equipment */
1332021, 1422011, 1032003, 1432009, 1302022, 1302029, 1102014, 1102018, 1312014, 1302026, 1102015, 1032011, 1312013, 1032008, 1032019, 1032007, 1332030, 1032020, 1032004, 1302027, 1032022, 1312012, 1032021, 1032006, 1302028, 1322003, 1032016, 1032015, 1302024, 1092008, 1032018, 1302021, 1032014, 1332021, 1322012, 1032005, 1032013, 1102012, 1302025, 1302013, 1032002, 1032001, 1032012, 1302017, 1032010, 1402014, 1102017, 1102013, 1442021, 1032009,
/* Warrior equipment */ /* Beginner equipment */
1402017, 1422005, 1002023, 1332016, 1432005, 1332021, 1422011,
/* Magician equipment */ /* Warrior equipment */
1002037, 1002034, 1002064, 1002038, 1002013, 1002036, 1382011, 1002035, 1002065, 1382014, 1372001, 1402017, 1422005, 1002023, 1332016, 1432005,
/* Bowman equipment */ /* Magician equipment */
1452026, 1002162, 1002164, 1462018, 1002165, 1452014, 1002163, 1452012, 1002161, 1452009, 1462007, 1002037, 1002034, 1002064, 1002038, 1002013, 1002036, 1382011, 1002035, 1002065, 1382014, 1372001,
/* Thief Equipment */ /* Bowman equipment */
1332022, 1002175, 1002172, 1002174, 1040096, 1472033, 1002173, 1332054, 1472054, 1002171, 1332016, 1452026, 1002162, 1002164, 1462018, 1002165, 1452014, 1002163, 1452012, 1002161, 1452009, 1462007,
/* Pirate equipment */ /* Thief Equipment */
1002646 1332022, 1002175, 1002172, 1002174, 1040096, 1472033, 1002173, 1332054, 1472054, 1002171, 1332016,
};
}
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1002646
return new int [] {2040805, 1002419, 1442018};
}
@Override };
public int[] getRareItems() { }
return new int [] {};
} @Override
public int[] getUncommonItems() {
return new int[]{2040805, 1002419, 1442018};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
@@ -1,58 +1,57 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub
* @author Alan (SharpAceX) - gachapon source classes stub * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class MushroomShrine extends GachaponItems { public class MushroomShrine extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2040305, 2040306, 2040308, 2044604, 2041039, 2041037, 2041035, 2041034, 2041041, 2040608, 2040605, 2040604, 2040611,
2040610, 2040813, 2040808, 2043004, 2040017, 2040015, 2040011, 2040013, 2040405, 2040406, 2040410, 2040511, 2040509,
2040508, 2040519, 2040521, 2040108, 2040904, 2040908, 2043104, 2044104, 2043005, 2043004, 2043006, 2044004, 2044205,
2043304, 2040607, 2040715, 2040713, 2044305, 2044904,
/* Common equipment */ /* Scroll */
1102040, 1002392, 1432009, 1002393, 1002394, 1082147, 1082148, 1032028, 1002585, 1002586, 1432013, 1022047, 1322027, 2040305, 2040306, 2040308, 2044604, 2041039, 2041037, 2041035, 2041034, 2041041, 2040608, 2040605, 2040604, 2040611,
1012056, 1432018, 2040610, 2040813, 2040808, 2043004, 2040017, 2040015, 2040011, 2040013, 2040405, 2040406, 2040410, 2040511, 2040509,
2040508, 2040519, 2040521, 2040108, 2040904, 2040908, 2043104, 2044104, 2043005, 2043004, 2043006, 2044004, 2044205,
2043304, 2040607, 2040715, 2040713, 2044305, 2044904,
/* Beginner equipment */ /* Common equipment */
1072264, 1072262, 1072263, 1102040, 1002392, 1432009, 1002393, 1002394, 1082147, 1082148, 1032028, 1002585, 1002586, 1432013, 1022047, 1322027,
1012056, 1432018,
/* Warrior equipment */ /* Beginner equipment */
1060074, 1322002, 1002340, 1442004, 1402037, 1422008, 1050022, 1072264, 1072262, 1072263,
/* Mage equipment */ /* Warrior equipment */
1382037, 1060014, 1051026, 1050056, 1050029, 1051030, 1382036, 1372032, 1041015, 1382015, 1372008, 1382008, 1060074, 1322002, 1002340, 1442004, 1402037, 1422008, 1050022,
/* Bowman equipment */ /* Mage equipment */
1452018, 1041068, 1462007, 1382037, 1060014, 1051026, 1050056, 1050029, 1051030, 1382036, 1372032, 1041015, 1382015, 1372008, 1382008,
/* Thief equipment */ /* Bowman equipment */
1060052, 1472013, 1002180, 1002170, 1060073, 1060099, 1452018, 1041068, 1462007,
/* Pirate equipment */
1492004, 1492012, 1482009, 1072303, 1002637, 1052107, 1082189, 1052116, 1072309
}; /* Thief equipment */
} 1060052, 1472013, 1002180, 1002170, 1060073, 1060099,
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1492004, 1492012, 1482009, 1072303, 1002637, 1052107, 1082189, 1052116, 1072309
return new int [] {2040811, 2040810, 2040815, 1102041, 1102042, 1082149};
}
@Override };
public int[] getRareItems() { }
return new int [] {1102084, 3010019};
} @Override
public int[] getUncommonItems() {
return new int[]{2040811, 2040810, 2040815, 1102041, 1102042, 1082149};
}
@Override
public int[] getRareItems() {
return new int[]{1102084, 3010019};
}
} }
@@ -1,66 +1,65 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate items
* @author Alan (SharpAceX) - gachapon source classes stub & pirate items * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class NautilusHarbor extends GachaponItems { public class NautilusHarbor extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int[] { return new int[]{
/* Scroll */ /* Scroll */
2040605, 2040626, 2040609, 2040607, 2041029, 2041027, 2041031, 2041037, 2041033, 2041039, 2041041, 2041035, 2040605, 2040626, 2040609, 2040607, 2041029, 2041027, 2041031, 2041037, 2041033, 2041039, 2041041, 2041035,
2040809, 2040813, 2040015, 2040009, 2040011, 2040013, 2040509, 2040521, 2040519, 2040507, 2040905, 2040909, 2040809, 2040813, 2040015, 2040009, 2040011, 2040013, 2040509, 2040521, 2040519, 2040507, 2040905, 2040909,
2040907, 2040713, 2040715, 2040717, 2040405, 2040409, 2040407, 2040426, 2040303, 2040307, 2040309, 2044505, 2040907, 2040713, 2040715, 2040717, 2040405, 2040409, 2040407, 2040426, 2040303, 2040307, 2040309, 2044505,
2044705, 2044605, 2043305, 2043105, 2043205, 2043005, 2043007, 2044405, 2044305, 2043805, 2044105, 2044205, 2044705, 2044605, 2043305, 2043105, 2043205, 2043005, 2043007, 2044405, 2044305, 2043805, 2044105, 2044205,
2044005, 2043705, 2044901, 2044005, 2043705, 2044901,
/* Useable drop */ /* Useable drop */
2012000, 2000004, 2020008, 2000005, 2012002, 2101004, 2101005, 2101002, 2101003, 4006000, 2012000, 2000004, 2020008, 2000005, 2012002, 2101004, 2101005, 2101002, 2101003, 4006000,
/* Warrior equipment */ /* Warrior equipment */
1092014, 1402017, 1092014, 1402017,
/* Magician equipment */ /* Magician equipment */
1002037, 1002034, 1002064, 1002038, 1382037, 1372000, 1002013, 1002035, 1002065, 1382000, 1002037, 1002034, 1002064, 1002038, 1382037, 1372000, 1002013, 1002035, 1002065, 1382000,
/* Bowman equipment */ /* Bowman equipment */
1452018, 1452018,
/* Thief equipment */ /* Thief equipment */
1472010, 1002175, 1472017, 1472025, 1472010, 1002175, 1472017, 1472025,
/* Pirate equipment */
1002610, 1002616, 1002622, 1002628, 1002634, 1002640, 1002646, 1052095, 1052101, 1052107,
1052113, 1052119, 1052125, 1052131, 1072285, 1072291, 1072297, 1072303, 1072309, 1072315,
1082180, 1082186, 1082192, 1082198, 1082204, 1082210, 1482001, 1482003, 1482005, 1482007,
1482009, 1482011, 1492000, 1492002, 1492004, 1492006, 1492008, 1492010, 1492012, 1002613,
1002619, 1002625, 1002631, 1002637, 1002643, 1052098, 1052104, 1052110, 1052116, 1052122,
1052128, 1072288, 1072294, 1072300, 1072306, 1072312, 1072318, 1072338, 1082183, 1082189,
1082195, 1082201, 1082207, 1082213, 1482000, 1482002, 1482004, 1482006, 1482008, 1482010,
1482012, 1492001, 1492003, 1492005, 1492007, 1492009, 1492011,
/* Knuckler Scrolls */
2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044806, 2044807, 2044808, 2044809,
/* Gun Scrolls */
2044900, 2044901, 2044902, 2044903, 2044904
};
}
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1002610, 1002616, 1002622, 1002628, 1002634, 1002640, 1002646, 1052095, 1052101, 1052107,
return new int[] {2040811, 2040815, 2101001}; 1052113, 1052119, 1052125, 1052131, 1072285, 1072291, 1072297, 1072303, 1072309, 1072315,
} 1082180, 1082186, 1082192, 1082198, 1082204, 1082210, 1482001, 1482003, 1482005, 1482007,
1482009, 1482011, 1492000, 1492002, 1492004, 1492006, 1492008, 1492010, 1492012, 1002613,
1002619, 1002625, 1002631, 1002637, 1002643, 1052098, 1052104, 1052110, 1052116, 1052122,
1052128, 1072288, 1072294, 1072300, 1072306, 1072312, 1072318, 1072338, 1082183, 1082189,
1082195, 1082201, 1082207, 1082213, 1482000, 1482002, 1482004, 1482006, 1482008, 1482010,
1482012, 1492001, 1492003, 1492005, 1492007, 1492009, 1492011,
@Override /* Knuckler Scrolls */
public int[] getRareItems() { 2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044806, 2044807, 2044808, 2044809,
return new int[] {};
} /* Gun Scrolls */
2044900, 2044901, 2044902, 2044903, 2044904
};
}
@Override
public int[] getUncommonItems() {
return new int[]{2040811, 2040815, 2101001};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+39 -40
View File
@@ -1,55 +1,54 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment * @author Ronan - parsed MapleSEA loots, thanks Vcoc for noticing somewhat unbalanced loots in NLC
* @author Ronan - parsed MapleSEA loots, thanks Vcoc for noticing somewhat unbalanced loots in NLC * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class NewLeafCity extends GachaponItems { public class NewLeafCity extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int[] { return new int[]{
/* Scroll */
2040406, 2040408, 2040404, 2040411, 2040409, 2044405, 2040610, 2040607, 2040812, 2041039, 2041040, 2041034,
2041030, 2041037, 2043105, 2043304, 2040103, 2040605, 2040611, 2043004, 2043204, 2044204, 2044005, 2040521,
2040510, 2043304, 2040908, 2040904, 2040907, 2040809, 2040812, 2040014, 2040714, 2040712, 2044004, 2043705,
2044505, 2040519, 2040204, 2040104, 2040109, 2044704, 2040906, 2044304, 2043007, 2040307, 2040304, 2040309,
2040208, 2040209, 2044803,
/* Common equipment */ /* Scroll */
1102040, 1102086, 1082145, 1032027, 1082146, 1002395, 1002083, 1002392, 1002587, 1022047, 2040406, 2040408, 2040404, 2040411, 2040409, 2044405, 2040610, 2040607, 2040812, 2041039, 2041040, 2041034,
2041030, 2041037, 2043105, 2043304, 2040103, 2040605, 2040611, 2043004, 2043204, 2044204, 2044005, 2040521,
2040510, 2043304, 2040908, 2040904, 2040907, 2040809, 2040812, 2040014, 2040714, 2040712, 2044004, 2043705,
2044505, 2040519, 2040204, 2040104, 2040109, 2044704, 2040906, 2044304, 2043007, 2040307, 2040304, 2040309,
2040208, 2040209, 2044803,
/* Warrior equipment */ /* Common equipment */
1312002, 1432013, 1060030, 1422008, 1050022, 1050011, 1402013, 1402017, 1302012, 1102040, 1102086, 1082145, 1032027, 1082146, 1002395, 1002083, 1002392, 1002587, 1022047,
/* Mage equipment */ /* Warrior equipment */
1002074, 1050029, 1040093, 1050056, 1050039, 1382008, 1312002, 1432013, 1060030, 1422008, 1050022, 1050011, 1402013, 1402017, 1302012,
/* Bowman equipment */ /* Mage equipment */
1002159, 1061051, 1040023, 1002074, 1050029, 1040093, 1050056, 1050039, 1382008,
/* Thief equipment */ /* Bowman equipment */
1061054, 1061106, 1002249, 1040084, 1060052, 1472054, 1002159, 1061051, 1040023,
/* Pirate equipment */
1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207, 1082210, 1082213,
1482010, 1482011, 1002640, 1482012, 1492010, 1492011, 1492012
};
}
@Override /* Thief equipment */
public int[] getUncommonItems() { 1061054, 1061106, 1002249, 1040084, 1060052, 1472054,
return new int[] {2022284, 2040811, 2040815, 2040811, 1102041, 1102042, 1082149};
}
@Override /* Pirate equipment */
public int[] getRareItems() { 1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207, 1082210, 1082213,
return new int[] {}; 1482010, 1482011, 1002640, 1482012, 1492010, 1492011, 1492012
} };
}
@Override
public int[] getUncommonItems() {
return new int[]{2022284, 2040811, 2040815, 2040811, 1102041, 1102042, 1082149};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+41 -42
View File
@@ -1,57 +1,56 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class Perion extends GachaponItems { public class Perion extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scrolls */
2044907, 2044802,
/* Useable drop */
2000004, 2000005,
/* Common equipment */ /* Scrolls */
1402010, 1302022, 1002060, 1322021, 1082147, 1002006, 1002026, 1002392, 1322025, 1322027, 1102000, 1082150, 2044907, 2044802,
1332020, 1322007, 1302021, 1002395, 1082148, 1322012, 1302017, 1322010, 1032000, 1102013, 1002097,
/* Warrior equipment */ /* Useable drop */
1322020, 1312007, 1312008, 1302004, 1312006, 1082036, 1082117, 1061088, 1302008, 1422005, 1002048, 1061087, 2000004, 2000005,
1302018, 1322017, 1422001, 1040103, 1060077, 1002022, 1002050, 1442000, 1432030, 1402037, 1092002, 1041092,
1050006, 1432004, 1061019, 1432000, 1060009, 1051000, 1002021, 1322014, 1432005,
/* Magician equipment */ /* Common equipment */
1051032, 1040018, 1051027, 1372007, 1050049, 1002036, 1382012, 1002217, 1051033, 1382006, 1050048, 1402010, 1302022, 1002060, 1322021, 1082147, 1002006, 1002026, 1002392, 1322025, 1322027, 1102000, 1082150,
1332020, 1322007, 1302021, 1002395, 1082148, 1322012, 1302017, 1322010, 1032000, 1102013, 1002097,
/* Bowman equipment */ /* Warrior equipment */
1061061, 1060062, 1040075, 1462013, 1041065, 1452006, 1322020, 1312007, 1312008, 1302004, 1312006, 1082036, 1082117, 1061088, 1302008, 1422005, 1002048, 1061087,
1302018, 1322017, 1422001, 1040103, 1060077, 1002022, 1002050, 1442000, 1432030, 1402037, 1092002, 1041092,
/* Thief equipment */ 1050006, 1432004, 1061019, 1432000, 1060009, 1051000, 1002021, 1322014, 1432005,
1040095, 1060084, 1002182, 1041049, 1002247, 1332024, 1332009, 1060024, 1332015, 1041060, 1061032, 1041074,
1041003, 1332016, 1472020, 1332003, 1041059,
/* Pirate equipment */ /* Magician equipment */
1482001, 1492002, 1052113, 1002616, 1072294, 1492004, 1482006, 1082192, 1082189, 1082195 1051032, 1040018, 1051027, 1372007, 1050049, 1002036, 1382012, 1002217, 1051033, 1382006, 1050048,
};
}
@Override /* Bowman equipment */
public int[] getUncommonItems() { 1061061, 1060062, 1040075, 1462013, 1041065, 1452006,
return new int [] {1082149, 1002391, 1002419, 1102041};
}
@Override /* Thief equipment */
public int[] getRareItems() { 1040095, 1060084, 1002182, 1041049, 1002247, 1332024, 1332009, 1060024, 1332015, 1041060, 1061032, 1041074,
return new int [] {}; 1041003, 1332016, 1472020, 1332003, 1041059,
}
/* Pirate equipment */
1482001, 1492002, 1052113, 1002616, 1072294, 1492004, 1482006, 1082192, 1082189, 1082195
};
}
@Override
public int[] getUncommonItems() {
return new int[]{1082149, 1002391, 1002419, 1102041};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
@@ -1,58 +1,57 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub
* @author Alan (SharpAceX) - gachapon source classes stub * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/06/gachapon-showa-towns-sauna-female-spa.html
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/06/gachapon-showa-towns-sauna-female-spa.html */
*/
public class ShowaSpaFemale extends GachaponItems { public class ShowaSpaFemale extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2041309,
2044010, 2044803, 2044814, 2044904, 2044902, 2044901,
/* Useable drop */ /* Scroll */
2022016, 2000005, 2022025, 2022027, 2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2041309,
2044010, 2044803, 2044814, 2044904, 2044902, 2044901,
/* Common equipment */ /* Useable drop */
1402000, 1402013, 1002418, 1022047, 1082145, 1082147, 1082146, 1082178, 1082175, 2022016, 2000005, 2022025, 2022027,
/* Common setup */ /* Common equipment */
3010073, 3010099, 1402000, 1402013, 1002418, 1022047, 1082145, 1082147, 1082146, 1082178, 1082175,
/* Warrior equipment */ /* Common setup */
1422013, 1432030, 3010073, 3010099,
/* Magician equipment */ /* Warrior equipment */
1372002, 1382003, 1422013, 1432030,
/* Bowman equipment */ /* Magician equipment */
1040023, 1372002, 1382003,
/* Thief equipment */ /* Bowman equipment */
1332003, 1002209, 1040023,
/* Pirate equipment */ /* Thief equipment */
1082198, 1082213, 1482007, 1492004, 1002646 1332003, 1002209,
};
}
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1082198, 1082213, 1482007, 1492004, 1002646
return new int [] {2040916, 1102042};
}
@Override };
public int[] getRareItems() { }
return new int [] {};
} @Override
public int[] getUncommonItems() {
return new int[]{2040916, 1102042};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+41 -42
View File
@@ -1,60 +1,59 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub
* @author Alan (SharpAceX) - gachapon source classes stub * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/05/gachapon-showa-towns-sauna.html
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/05/gachapon-showa-towns-sauna.html */
*/
public class ShowaSpaMale extends GachaponItems { public class ShowaSpaMale extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2044902,
2044901, 2044811, 2044903, 2044804,
/* Useable drop */ /* Scroll */
2022016, 2000005, 2022025, 2022027, 2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2044902,
2044901, 2044811, 2044903, 2044804,
/* Common equipment */ /* Useable drop */
1332020, 1312004, 1332032, 1322023, 1322026, 1322022, 1322012, 1302014, 1302049, 1302017, 1332007, 1432009, 2022016, 2000005, 2022025, 2022027,
1432016, 1432017, 1432009, 1402013, 1402044, 1442014, 1442017, 1442016, 1442025, 1002418, 1082178, 1082179,
1082148, 1032027, 1032032, 1102028, 1102086,
/* Common setup */ /* Common equipment */
3010073, 3010111, 1332020, 1312004, 1332032, 1322023, 1322026, 1322022, 1322012, 1302014, 1302049, 1302017, 1332007, 1432009,
1432016, 1432017, 1432009, 1402013, 1402044, 1442014, 1442017, 1442016, 1442025, 1002418, 1082178, 1082179,
1082148, 1032027, 1032032, 1102028, 1102086,
/* Warrior equipment */ /* Common setup */
1412005, 1402048, 1402049, 1322011, 1302003, 1302004, 1302008, 3010073, 3010111,
/* Magician equipment */ /* Warrior equipment */
1372000, 1372009, 1372001, 1372011, 1382006, 1382014, 1412005, 1402048, 1402049, 1322011, 1302003, 1302004, 1302008,
/* Bowman equipment */ /* Magician equipment */
1452018, 1452006, 1452008, 1452005, 1462002, 1462007, 1462003, 1002169, 1372000, 1372009, 1372001, 1372011, 1382006, 1382014,
/* Thief equipment */ /* Bowman equipment */
1472023, 1332012, 1332017, 1332022, 1332006, 1332029, 1040097, 1452018, 1452006, 1452008, 1452005, 1462002, 1462007, 1462003, 1002169,
/* Pirate equipment */ /* Thief equipment */
1052107, 1082204, 1072318, 1002637, 1482009, 1492007 1472023, 1332012, 1332017, 1332022, 1332006, 1332029, 1040097,
};
}
@Override /* Pirate equipment */
public int[] getUncommonItems() { 1052107, 1082204, 1072318, 1002637, 1482009, 1492007
return new int [] {2040916, 1102042};
}
@Override };
public int[] getRareItems() { }
return new int [] {};
} @Override
public int[] getUncommonItems() {
return new int[]{2040916, 1102042};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
+42 -43
View File
@@ -1,59 +1,58 @@
package server.gachapon; package server.gachapon;
/** /**
* * @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment * @author Ronan - parsed MapleSEA loots
* @author Ronan - parsed MapleSEA loots * <p>
* * MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/ */
*/
public class Sleepywood extends GachaponItems { public class Sleepywood extends GachaponItems {
@Override @Override
public int[] getCommonItems() { public int[] getCommonItems() {
return new int [] { return new int[]{
/* Scroll */
2048003, 2048000, 2040601, 2044501, 2041019, 2041016, 2041022, 2041010, 2041013, 2043301, 2040301, 2040801, 2040001,
2040004, 2043101, 2043201, 2043001, 2040504, 2040501, 2048004, 2048001, 2044401, 2040901, 2040701, 2040704, 2040707,
2044301, 2043801, 2044101, 2044201, 2044001, 2040602, 2044502, 2041020, 2041017, 2041023, 2041014, 2041005, 2044702,
2044602, 2043302, 2040302, 2040802, 2040005, 2043202, 2043002, 2040505, 2040502, 2048005, 2048002, 2044402, 2040902,
2040702, 2040705, 2040708, 2044302, 2043802, 2044202, 2044002, 2044801, 2044903, 2044814,
/* Useable drop */ /* Scroll */
2012000, 2012003, 2020007, 2000004, 2012001, 2020008, 2070006, 2020012, 2000005, 2030007, 2012002, 2002001, 2070005, 2048003, 2048000, 2040601, 2044501, 2041019, 2041016, 2041022, 2041010, 2041013, 2043301, 2040301, 2040801, 2040001,
2040004, 2043101, 2043201, 2043001, 2040504, 2040501, 2048004, 2048001, 2044401, 2040901, 2040701, 2040704, 2040707,
2044301, 2043801, 2044101, 2044201, 2044001, 2040602, 2044502, 2041020, 2041017, 2041023, 2041014, 2041005, 2044702,
2044602, 2043302, 2040302, 2040802, 2040005, 2043202, 2043002, 2040505, 2040502, 2048005, 2048002, 2044402, 2040902,
2040702, 2040705, 2040708, 2044302, 2043802, 2044202, 2044002, 2044801, 2044903, 2044814,
/* Common equipment */ /* Useable drop */
1032003, 1432009, 1102014, 1102018, 1002392, 1322026, 1032022, 1312012, 1332020, 1092030, 1032016, 1032015, 1032014, 2012000, 2012003, 2020007, 2000004, 2012001, 2020008, 2070006, 2020012, 2000005, 2030007, 2012002, 2002001, 2070005,
1322024, 1032013, 1322022, 1102016, 1032012, 1032023, 1402014, 1032000, 1102017,
/* Warrior equipment */ /* Common equipment */
1402017, 1051010, 1432011, 1442006, 1322002, 1422004, 1432010, 1051011, 1060018, 1432000, 1422003, 1412003, 1422000, 1032003, 1432009, 1102014, 1102018, 1002392, 1322026, 1032022, 1312012, 1332020, 1092030, 1032016, 1032015, 1032014,
1322024, 1032013, 1322022, 1102016, 1032012, 1032023, 1402014, 1032000, 1102017,
/* Magician equipment */ /* Warrior equipment */
1002034, 1002142, 1382010, 1002013, 1382008, 1382011, 1050047, 1002065, 1402017, 1051010, 1432011, 1442006, 1322002, 1422004, 1432010, 1051011, 1060018, 1432000, 1422003, 1412003, 1422000,
/* Bowman equipment */ /* Magician equipment */
1452003, 1002165, 1040068, 1462013, 1462011, 1462012, 1061050, 1462010, 1002161, 1002034, 1002142, 1382010, 1002013, 1382008, 1382011, 1050047, 1002065,
/* Thief equipment */ /* Bowman equipment */
1332022, 1002175, 1040042, 1472004, 1040057, 1332031, 1332023, 1332010, 1002171, 1060046, 1452003, 1002165, 1040068, 1462013, 1462011, 1462012, 1061050, 1462010, 1002161,
/* Pirate equipment */
1002631, 1002634, 1002637, 1052116, 1052119, 1052122, 1072303, 1072306, 1072309, 1082198, 1082201, 1082204, 1482007,
1482008, 1482009
};
}
@Override /* Thief equipment */
public int[] getUncommonItems() { 1332022, 1002175, 1040042, 1472004, 1040057, 1332031, 1332023, 1332010, 1002171, 1060046,
return new int [] {2040804, 2040817, 2040805, 2340000, 1082149, 1442018};
}
@Override /* Pirate equipment */
public int[] getRareItems() { 1002631, 1002634, 1002637, 1052116, 1052119, 1052122, 1072303, 1072306, 1072309, 1082198, 1082201, 1082204, 1482007,
return new int [] {}; 1482008, 1482009
} };
}
@Override
public int[] getUncommonItems() {
return new int[]{2040804, 2040817, 2040805, 2340000, 1082149, 1442018};
}
@Override
public int[] getRareItems() {
return new int[]{};
}
} }
@@ -49,6 +49,6 @@ public class ChangeableStats extends OverrideMonsterStats {
} }
public ChangeableStats(MonsterStats stats, float statModifier, boolean pqMob) { public ChangeableStats(MonsterStats stats, float statModifier, boolean pqMob) {
this(stats, (int)(statModifier * stats.getLevel()), pqMob); this(stats, (int) (statModifier * stats.getLevel()), pqMob);
} }
} }
+12 -11
View File
@@ -24,21 +24,22 @@ package server.life;
public enum Element { public enum Element {
NEUTRAL(0), PHYSICAL(1), FIRE(2, true), ICE(3, true), LIGHTING(4), POISON(5), HOLY(6, true), DARKNESS(7); NEUTRAL(0), PHYSICAL(1), FIRE(2, true), ICE(3, true), LIGHTING(4), POISON(5), HOLY(6, true), DARKNESS(7);
private int value; private final int value;
private boolean special = false; private boolean special = false;
private Element(int v) {
this.value = v; Element(int v) {
this.value = v;
} }
private Element(int v, boolean special) { Element(int v, boolean special) {
this.value = v; this.value = v;
this.special = special; this.special = special;
} }
public boolean isSpecial() { public boolean isSpecial() {
return special; return special;
} }
public static Element getFromChar(char c) { public static Element getFromChar(char c) {
switch (Character.toUpperCase(c)) { switch (Character.toUpperCase(c)) {
case 'F': case 'F':
@@ -52,14 +53,14 @@ public enum Element {
case 'H': case 'H':
return HOLY; return HOLY;
case 'D': case 'D':
return DARKNESS; return DARKNESS;
case 'P': case 'P':
return NEUTRAL; return NEUTRAL;
} }
throw new IllegalArgumentException("unknown elemnt char " + c); throw new IllegalArgumentException("unknown elemnt char " + c);
} }
public int getValue() { public int getValue() {
return value; return value;
} }
} }
@@ -22,7 +22,6 @@
package server.life; package server.life;
/** /**
*
* @author Danny (Leifde) * @author Danny (Leifde)
*/ */
public class MobAttackInfo { public class MobAttackInfo {
@@ -32,12 +32,11 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Danny (Leifde) * @author Danny (Leifde)
*/ */
public class MobAttackInfoFactory { public class MobAttackInfoFactory {
private static Map<String, MobAttackInfo> mobAttacks = new HashMap<>(); private static final Map<String, MobAttackInfo> mobAttacks = new HashMap<>();
private static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.MOB); private static final DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.MOB);
public static MobAttackInfo getMobAttackInfo(Monster mob, int attack) { public static MobAttackInfo getMobAttackInfo(Monster mob, int attack) {
MobAttackInfo ret = mobAttacks.get(mob.getId() + "" + attack); MobAttackInfo ret = mobAttacks.get(mob.getId() + "" + attack);
@@ -55,11 +54,11 @@ public class MobAttackInfoFactory {
mobData = dataSource.getData(StringUtil.getLeftPaddedStr(linkedmob + ".img", '0', 11)); mobData = dataSource.getData(StringUtil.getLeftPaddedStr(linkedmob + ".img", '0', 11));
} }
Data attackData = mobData.getChildByPath("attack" + (attack + 1) + "/info"); Data attackData = mobData.getChildByPath("attack" + (attack + 1) + "/info");
if (attackData == null) { if (attackData == null) {
return null; return null;
} }
Data deadlyAttack = attackData.getChildByPath("deadlyAttack"); Data deadlyAttack = attackData.getChildByPath("deadlyAttack");
int mpBurn = DataTool.getInt("mpBurn", attackData, 0); int mpBurn = DataTool.getInt("mpBurn", attackData, 0);
int disease = DataTool.getInt("disease", attackData, 0); int disease = DataTool.getInt("disease", attackData, 0);
@@ -70,7 +69,7 @@ public class MobAttackInfoFactory {
ret.setMpBurn(mpBurn); ret.setMpBurn(mpBurn);
ret.setDiseaseSkill(disease); ret.setDiseaseSkill(disease);
ret.setDiseaseLevel(level); ret.setDiseaseLevel(level);
ret.setMpCon(mpCon); ret.setMpCon(mpCon);
} }
mobAttacks.put(mob.getId() + "" + attack, ret); mobAttacks.put(mob.getId() + "" + attack, ret);
} }
+5 -4
View File
@@ -39,13 +39,14 @@ import java.util.List;
import java.util.*; import java.util.*;
/** /**
*
* @author Danny (Leifde) * @author Danny (Leifde)
*/ */
public class MobSkill { public class MobSkill {
private int skillId, skillLevel, mpCon; private final int skillId;
private List<Integer> toSummon = new ArrayList<>(); private final int skillLevel;
private int mpCon;
private final List<Integer> toSummon = new ArrayList<>();
private int spawnEffect, hp, x, y, count; private int spawnEffect, hp, x, y, count;
private long duration, cooltime; private long duration, cooltime;
private float prop; private float prop;
@@ -251,7 +252,7 @@ public class MobSkill {
int summonLimit = monster.countAvailableMobSummons(summons.size(), skillLimit); int summonLimit = monster.countAvailableMobSummons(summons.size(), skillLimit);
if (summonLimit >= 1) { if (summonLimit >= 1) {
boolean bossRushMap = GameConstants.isBossRush(map.getId()); boolean bossRushMap = GameConstants.isBossRush(map.getId());
Collections.shuffle(summons); Collections.shuffle(summons);
for (Integer mobId : summons.subList(0, summonLimit)) { for (Integer mobId : summons.subList(0, summonLimit)) {
Monster toSpawn = LifeFactory.getMonster(mobId); Monster toSpawn = LifeFactory.getMonster(mobId);
@@ -40,14 +40,13 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Danny (Leifde) * @author Danny (Leifde)
*/ */
public class MobSkillFactory { public class MobSkillFactory {
private static Map<String, MobSkill> mobSkills = new HashMap<>(); private static final Map<String, MobSkill> mobSkills = new HashMap<>();
private final static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.SKILL); private final static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.SKILL);
private static Data skillRoot = dataSource.getData("MobSkill.img"); private static final Data skillRoot = dataSource.getData("MobSkill.img");
private final static MonitoredReentrantReadWriteLock dataLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MOBSKILL_FACTORY); private final static MonitoredReentrantReadWriteLock dataLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MOBSKILL_FACTORY);
private final static MonitoredReadLock rL = MonitoredReadLockFactory.createLock(dataLock); private final static MonitoredReadLock rL = MonitoredReadLockFactory.createLock(dataLock);
private final static MonitoredWriteLock wL = MonitoredWriteLockFactory.createLock(dataLock); private final static MonitoredWriteLock wL = MonitoredWriteLockFactory.createLock(dataLock);
@@ -21,18 +21,18 @@
package server.life; package server.life;
/** /**
*
* @author LightPepsi * @author LightPepsi
*/ */
public class MonsterDropEntry { public class MonsterDropEntry {
public MonsterDropEntry(int itemId, int chance, int Minimum, int Maximum, short questid) { public MonsterDropEntry(int itemId, int chance, int Minimum, int Maximum, short questid) {
this.itemId = itemId; this.itemId = itemId;
this.chance = chance; this.chance = chance;
this.questid = questid; this.questid = questid;
this.Minimum = Minimum; this.Minimum = Minimum;
this.Maximum = Maximum; this.Maximum = Maximum;
} }
public short questid; public short questid;
public int itemId, chance, Minimum, Maximum; public int itemId, chance, Minimum, Maximum;
} }
@@ -21,18 +21,18 @@
package server.life; package server.life;
/** /**
*
* @author LightPepsi * @author LightPepsi
*/ */
public class MonsterGlobalDropEntry { public class MonsterGlobalDropEntry {
public MonsterGlobalDropEntry(int itemId, int chance, int continent, int Minimum, int Maximum, short questid) { public MonsterGlobalDropEntry(int itemId, int chance, int continent, int Minimum, int Maximum, short questid) {
this.itemId = itemId; this.itemId = itemId;
this.chance = chance; this.chance = chance;
this.questid = questid; this.questid = questid;
this.continentid = continent; this.continentid = continent;
this.Minimum = Minimum; this.Minimum = Minimum;
this.Maximum = Maximum; this.Maximum = Maximum;
} }
public int itemId, chance, Minimum, Maximum, continentid; public int itemId, chance, Minimum, Maximum, continentid;
public short questid; public short questid;
} }
@@ -1,8 +1,9 @@
package server.life; package server.life;
import client.Character; import client.Character;
public interface MonsterListener { public interface MonsterListener {
void monsterKilled(int aniTime); void monsterKilled(int aniTime);
void monsterDamaged(Character from, int trueDmg); void monsterDamaged(Character from, int trueDmg);
void monsterHealed(int trueHeal); void monsterHealed(int trueHeal);
+20 -19
View File
@@ -28,12 +28,17 @@ import java.awt.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class SpawnPoint { public class SpawnPoint {
private int monster, mobTime, team, fh, f; private final int monster;
private Point pos; private final int mobTime;
private final int team;
private final int fh;
private final int f;
private final Point pos;
private long nextPossibleSpawn; private long nextPossibleSpawn;
private int mobInterval = 5000; private int mobInterval = 5000;
private AtomicInteger spawnedMonsters = new AtomicInteger(0); private final AtomicInteger spawnedMonsters = new AtomicInteger(0);
private boolean immobile, denySpawn = false; private final boolean immobile;
private boolean denySpawn = false;
public SpawnPoint(final Monster monster, Point pos, boolean immobile, int mobTime, int mobInterval, int team) { public SpawnPoint(final Monster monster, Point pos, boolean immobile, int mobTime, int mobInterval, int team) {
this.monster = monster.getId(); this.monster = monster.getId();
@@ -46,34 +51,30 @@ public class SpawnPoint {
this.mobInterval = mobInterval; this.mobInterval = mobInterval;
this.nextPossibleSpawn = Server.getInstance().getCurrentTime(); this.nextPossibleSpawn = Server.getInstance().getCurrentTime();
} }
public int getSpawned() { public int getSpawned() {
return spawnedMonsters.intValue(); return spawnedMonsters.intValue();
} }
public void setDenySpawn(boolean val) { public void setDenySpawn(boolean val) {
denySpawn = val; denySpawn = val;
} }
public boolean getDenySpawn() { public boolean getDenySpawn() {
return denySpawn; return denySpawn;
} }
public boolean shouldSpawn() { public boolean shouldSpawn() {
if (denySpawn || mobTime < 0 || spawnedMonsters.get() > 0) { if (denySpawn || mobTime < 0 || spawnedMonsters.get() > 0) {
return false; return false;
} }
return nextPossibleSpawn <= Server.getInstance().getCurrentTime(); return nextPossibleSpawn <= Server.getInstance().getCurrentTime();
} }
public boolean shouldForceSpawn() { public boolean shouldForceSpawn() {
if (mobTime < 0 || spawnedMonsters.get() > 0) { return mobTime >= 0 && spawnedMonsters.get() <= 0;
return false;
}
return true;
} }
public Monster getMonster() { public Monster getMonster() {
Monster mob = new Monster(LifeFactory.getMonster(monster)); Monster mob = new Monster(LifeFactory.getMonster(monster));
mob.setPosition(new Point(pos)); mob.setPosition(new Point(pos));
@@ -92,10 +93,10 @@ public class SpawnPoint {
} }
spawnedMonsters.decrementAndGet(); spawnedMonsters.decrementAndGet();
} }
@Override @Override
public void monsterDamaged(Character from, int trueDmg) {} public void monsterDamaged(Character from, int trueDmg) {}
@Override @Override
public void monsterHealed(int trueHeal) {} public void monsterHealed(int trueHeal) {}
}); });
@@ -104,7 +105,7 @@ public class SpawnPoint {
} }
return mob; return mob;
} }
public int getMonsterId() { public int getMonsterId() {
return monster; return monster;
} }
@@ -120,11 +121,11 @@ public class SpawnPoint {
public final int getFh() { public final int getFh() {
return fh; return fh;
} }
public int getMobTime() { public int getMobTime() {
return mobTime; return mobTime;
} }
public int getTeam() { public int getTeam() {
return team; return team;
} }
+4 -5
View File
@@ -21,7 +21,6 @@
package server.maps; package server.maps;
/** /**
*
* @author AngelSL * @author AngelSL
*/ */
public enum FieldLimit { public enum FieldLimit {
@@ -44,7 +43,7 @@ public enum FieldLimit {
//ANTI_MACRO_LIMIT(0x10000), // No notes //ANTI_MACRO_LIMIT(0x10000), // No notes
CANNOTJUMPDOWN(0x20000), CANNOTJUMPDOWN(0x20000),
//SUMMON_NPC_LIMIT(0x40000); // Seems to .. disable Rush if 0x2 is set //SUMMON_NPC_LIMIT(0x40000); // Seems to .. disable Rush if 0x2 is set
//......... EVEN MORE LIMITS ............ //......... EVEN MORE LIMITS ............
//SUMMON_NPC_LIMIT(0x40000), //SUMMON_NPC_LIMIT(0x40000),
NO_EXP_DECREASE(0x80000), NO_EXP_DECREASE(0x80000),
@@ -52,10 +51,10 @@ public enum FieldLimit {
//PARCEL_OPEN_LIMIT(0x200000), //PARCEL_OPEN_LIMIT(0x200000),
DROP_LIMIT(0x400000); DROP_LIMIT(0x400000);
//ROCKETBOOSTER_LIMIT(0x800000) //lol we don't even have mechanics <3 //ROCKETBOOSTER_LIMIT(0x800000) //lol we don't even have mechanics <3
private long i;
private FieldLimit(long i) { private final long i;
FieldLimit(long i) {
this.i = i; this.i = i;
} }
+2 -2
View File
@@ -45,14 +45,14 @@ public class MapMonitor {
monitorSchedule.cancel(false); monitorSchedule.cancel(false);
monitorSchedule = null; monitorSchedule = null;
} }
map.killAllMonsters(); map.killAllMonsters();
map.clearDrops(); map.clearDrops();
if (portal != null) { if (portal != null) {
portal.setPortalStatus(Portal.OPEN); portal.setPortalStatus(Portal.OPEN);
} }
map.resetReactors(); map.resetReactors();
map = null; map = null;
portal = null; portal = null;
} }
+29 -29
View File
@@ -34,34 +34,34 @@ import java.util.List;
* @author Ronan - made MapleTV mechanics synchronous * @author Ronan - made MapleTV mechanics synchronous
*/ */
public class MapleTVEffect { public class MapleTVEffect {
private final static boolean[] ACTIVE = new boolean[Server.getInstance().getWorldsSize()];
public static synchronized boolean broadcastMapleTVIfNotActive(Character player, Character victim, List<String> messages, int tvType){
int w = player.getWorld();
if(!ACTIVE[w]) {
broadcastTV(true, w, messages, player, tvType, victim);
return true;
}
return false;
}
private static synchronized void broadcastTV(boolean activity, final int userWorld, List<String> message, Character user, int type, Character partner) { private final static boolean[] ACTIVE = new boolean[Server.getInstance().getWorldsSize()];
Server server = Server.getInstance();
ACTIVE[userWorld] = activity; public static synchronized boolean broadcastMapleTVIfNotActive(Character player, Character victim, List<String> messages, int tvType) {
if (activity) { int w = player.getWorld();
server.broadcastMessage(userWorld, PacketCreator.enableTV()); if (!ACTIVE[w]) {
server.broadcastMessage(userWorld, PacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner)); broadcastTV(true, w, messages, player, tvType, victim);
int delay = 15000; return true;
if (type == 4) { }
delay = 30000;
} else if (type == 5) { return false;
delay = 60000; }
}
TimerManager.getInstance().schedule(() -> broadcastTV(false, userWorld, null, null, -1, null), delay); private static synchronized void broadcastTV(boolean activity, final int userWorld, List<String> message, Character user, int type, Character partner) {
} else { Server server = Server.getInstance();
server.broadcastMessage(userWorld, PacketCreator.removeTV()); ACTIVE[userWorld] = activity;
} if (activity) {
} server.broadcastMessage(userWorld, PacketCreator.enableTV());
server.broadcastMessage(userWorld, PacketCreator.sendTV(user, message, type <= 2 ? type : type - 3, partner));
int delay = 15000;
if (type == 4) {
delay = 30000;
} else if (type == 5) {
delay = 60000;
}
TimerManager.getInstance().schedule(() -> broadcastTV(false, userWorld, null, null, -1, null), delay);
} else {
server.broadcastMessage(userWorld, PacketCreator.removeTV());
}
}
} }
+3 -1
View File
@@ -334,7 +334,9 @@ public class Reactor extends AbstractMapObject {
if (this.getDelay() > 0) { if (this.getDelay() > 0) {
this.delayedRespawn(); this.delayedRespawn();
} }
} else return !this.inDelayedRespawn(); } else {
return !this.inDelayedRespawn();
}
} finally { } finally {
reactorLock.unlock(); reactorLock.unlock();
} }
@@ -23,10 +23,11 @@ package server.maps;
public class ReactorDropEntry { public class ReactorDropEntry {
public ReactorDropEntry(int itemId, int chance, int questId) { public ReactorDropEntry(int itemId, int chance, int questId) {
this.itemId = itemId; this.itemId = itemId;
this.chance = chance; this.chance = chance;
this.questid = questId; this.questid = questId;
} }
public int itemId, chance, questid; public int itemId, chance, questid;
public int assignedRangeStart, assignedRangeLength; public int assignedRangeStart, assignedRangeLength;
} }
+2 -1
View File
@@ -22,7 +22,8 @@
package server.maps; package server.maps;
public class SavedLocation { public class SavedLocation {
private int mapid = 102000000, portal; private int mapid = 102000000;
private final int portal;
public SavedLocation(int mapid, int portal) { public SavedLocation(int mapid, int portal) {
this.mapid = mapid; this.mapid = mapid;
@@ -25,7 +25,7 @@ public enum SummonMovementType {
STATIONARY(0), FOLLOW(1), CIRCLE_FOLLOW(3); STATIONARY(0), FOLLOW(1), CIRCLE_FOLLOW(3);
private final int val; private final int val;
private SummonMovementType(int val) { SummonMovementType(int val) {
this.val = val; this.val = val;
} }
@@ -21,12 +21,13 @@
*/ */
package server.movement; package server.movement;
import java.awt.Point; import java.awt.*;
public abstract class AbstractLifeMovement implements LifeMovement { public abstract class AbstractLifeMovement implements LifeMovement {
private Point position; private final Point position;
private int duration; private final int duration;
private int newstate, type; private final int newstate;
private final int type;
public AbstractLifeMovement(int type, Point position, int duration, int newstate) { public AbstractLifeMovement(int type, Point position, int duration, int newstate) {
super(); super();
@@ -21,7 +21,7 @@
*/ */
package server.movement; package server.movement;
import java.awt.Point; import java.awt.*;
public interface LifeMovement extends LifeMovementFragment { public interface LifeMovement extends LifeMovementFragment {
Point getPosition(); Point getPosition();
@@ -35,36 +35,35 @@ import java.util.Map.Entry;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class AriantColiseum { public class AriantColiseum {
private Expedition exped; private Expedition exped;
private MapleMap map; private MapleMap map;
private Map<Character, Integer> score; private final Map<Character, Integer> score;
private Map<Character, Integer> rewardTier; private final Map<Character, Integer> rewardTier;
private boolean scoreDirty = false; private boolean scoreDirty = false;
private ScheduledFuture<?> ariantUpdate; private ScheduledFuture<?> ariantUpdate;
private ScheduledFuture<?> ariantFinish; private ScheduledFuture<?> ariantFinish;
private ScheduledFuture<?> ariantScoreboard; private ScheduledFuture<?> ariantScoreboard;
private int lostShards = 0; private int lostShards = 0;
private boolean eventClear = false; private boolean eventClear = false;
public AriantColiseum(MapleMap eventMap, Expedition expedition) { public AriantColiseum(MapleMap eventMap, Expedition expedition) {
exped = expedition; exped = expedition;
exped.finishRegistration(); exped.finishRegistration();
map = eventMap; map = eventMap;
map.resetFully(); map.resetFully();
int pqTimer = 10 * 60 * 1000; int pqTimer = 10 * 60 * 1000;
int pqTimerBoard = (9 * 60 * 1000) + 50 * 1000; int pqTimerBoard = (9 * 60 * 1000) + 50 * 1000;
List<Character> players = exped.getActiveMembers(); List<Character> players = exped.getActiveMembers();
score = new HashMap<>(); score = new HashMap<>();
rewardTier = new HashMap<>(); rewardTier = new HashMap<>();
@@ -74,73 +73,73 @@ public class AriantColiseum {
mc.updateAriantScore(); mc.updateAriantScore();
rewardTier.put(mc, 0); rewardTier.put(mc, 0);
} }
for (Character mc : players) { for (Character mc : players) {
mc.sendPacket(PacketCreator.updateAriantPQRanking(score)); mc.sendPacket(PacketCreator.updateAriantPQRanking(score));
} }
setAriantScoreBoard(TimerManager.getInstance().schedule(() -> showArenaResults(), pqTimerBoard)); setAriantScoreBoard(TimerManager.getInstance().schedule(() -> showArenaResults(), pqTimerBoard));
setArenaFinish(TimerManager.getInstance().schedule(() -> enterKingsRoom(), pqTimer)); setArenaFinish(TimerManager.getInstance().schedule(() -> enterKingsRoom(), pqTimer));
setArenaUpdate(TimerManager.getInstance().register(() -> broadcastAriantScoreUpdate(), 500, 500)); setArenaUpdate(TimerManager.getInstance().register(() -> broadcastAriantScoreUpdate(), 500, 500));
} }
private void setArenaUpdate(ScheduledFuture<?> ariantUpdate) { private void setArenaUpdate(ScheduledFuture<?> ariantUpdate) {
this.ariantUpdate = ariantUpdate; this.ariantUpdate = ariantUpdate;
} }
private void setArenaFinish(ScheduledFuture<?> arenaFinish) { private void setArenaFinish(ScheduledFuture<?> arenaFinish) {
this.ariantFinish = arenaFinish; this.ariantFinish = arenaFinish;
} }
private void setAriantScoreBoard(ScheduledFuture<?> ariantScore) { private void setAriantScoreBoard(ScheduledFuture<?> ariantScore) {
this.ariantScoreboard = ariantScore; this.ariantScoreboard = ariantScore;
} }
private void cancelArenaUpdate() { private void cancelArenaUpdate() {
if (ariantUpdate != null) { if (ariantUpdate != null) {
ariantUpdate.cancel(true); ariantUpdate.cancel(true);
ariantUpdate = null; ariantUpdate = null;
} }
} }
private void cancelArenaFinish() { private void cancelArenaFinish() {
if (ariantFinish != null) { if (ariantFinish != null) {
ariantFinish.cancel(true); ariantFinish.cancel(true);
ariantFinish = null; ariantFinish = null;
} }
} }
private void cancelAriantScoreBoard() { private void cancelAriantScoreBoard() {
if (ariantScoreboard != null) { if (ariantScoreboard != null) {
ariantScoreboard.cancel(true); ariantScoreboard.cancel(true);
ariantScoreboard = null; ariantScoreboard = null;
} }
} }
private void cancelAriantSchedules() { private void cancelAriantSchedules() {
cancelArenaUpdate(); cancelArenaUpdate();
cancelArenaFinish(); cancelArenaFinish();
cancelAriantScoreBoard(); cancelAriantScoreBoard();
} }
public int getAriantScore(Character chr) { public int getAriantScore(Character chr) {
Integer chrScore = score.get(chr); Integer chrScore = score.get(chr);
return chrScore != null ? chrScore : 0; return chrScore != null ? chrScore : 0;
} }
public void clearAriantScore(Character chr) { public void clearAriantScore(Character chr) {
score.remove(chr); score.remove(chr);
} }
public void updateAriantScore(Character chr, int points) { public void updateAriantScore(Character chr, int points) {
if (map != null) { if (map != null) {
score.put(chr, points); score.put(chr, points);
scoreDirty = true; scoreDirty = true;
} }
} }
private void broadcastAriantScoreUpdate() { private void broadcastAriantScoreUpdate() {
if (scoreDirty) { if (scoreDirty) {
for (Character chr : score.keySet()) { for (Character chr : score.keySet()) {
@@ -149,26 +148,26 @@ public class AriantColiseum {
scoreDirty = false; scoreDirty = false;
} }
} }
public int getAriantRewardTier(Character chr) { public int getAriantRewardTier(Character chr) {
Integer reward = rewardTier.get(chr); Integer reward = rewardTier.get(chr);
return reward != null ? reward : 0; return reward != null ? reward : 0;
} }
public void clearAriantRewardTier(Character chr) { public void clearAriantRewardTier(Character chr) {
rewardTier.remove(chr); rewardTier.remove(chr);
} }
public void addLostShards(int quantity) { public void addLostShards(int quantity) {
lostShards += quantity; lostShards += quantity;
} }
public void leaveArena(Character chr) { public void leaveArena(Character chr) {
if (!(eventClear && GameConstants.isAriantColiseumArena(chr.getMapId()))) { if (!(eventClear && GameConstants.isAriantColiseumArena(chr.getMapId()))) {
leaveArenaInternal(chr); leaveArenaInternal(chr);
} }
} }
private synchronized void leaveArenaInternal(Character chr) { private synchronized void leaveArenaInternal(Character chr) {
if (exped != null) { if (exped != null) {
if (exped.removeMember(chr)) { if (exped.removeMember(chr)) {
@@ -177,53 +176,53 @@ public class AriantColiseum {
dispose(); dispose();
} }
chr.setAriantColiseum(null); chr.setAriantColiseum(null);
int shards = chr.countItem(4031868); int shards = chr.countItem(4031868);
chr.getAbstractPlayerInteraction().removeAll(4031868); chr.getAbstractPlayerInteraction().removeAll(4031868);
chr.updateAriantScore(shards); chr.updateAriantScore(shards);
} }
} }
} }
public void playerDisconnected(Character chr) { public void playerDisconnected(Character chr) {
leaveArenaInternal(chr); leaveArenaInternal(chr);
} }
private void showArenaResults() { private void showArenaResults() {
eventClear = true; eventClear = true;
if (map != null) { if (map != null) {
map.broadcastMessage(PacketCreator.showAriantScoreBoard()); map.broadcastMessage(PacketCreator.showAriantScoreBoard());
map.killAllMonsters(); map.killAllMonsters();
distributeAriantPoints(); distributeAriantPoints();
} }
} }
private static boolean isUnfairMatch(Integer winnerScore, Integer secondScore, Integer lostShardsScore, List<Integer> runnerupsScore) { private static boolean isUnfairMatch(Integer winnerScore, Integer secondScore, Integer lostShardsScore, List<Integer> runnerupsScore) {
if (winnerScore <= 0) { if (winnerScore <= 0) {
return false; return false;
} }
double runnerupsScoreCount = 0; double runnerupsScoreCount = 0;
for (Integer i : runnerupsScore) { for (Integer i : runnerupsScore) {
runnerupsScoreCount += i; runnerupsScoreCount += i;
} }
runnerupsScoreCount += lostShardsScore; runnerupsScoreCount += lostShardsScore;
secondScore += lostShardsScore; secondScore += lostShardsScore;
double matchRes = runnerupsScoreCount / winnerScore; double matchRes = runnerupsScoreCount / winnerScore;
double runnerupRes = ((double) secondScore) / winnerScore; double runnerupRes = ((double) secondScore) / winnerScore;
return matchRes < 0.81770726891980117713114871015349 && (runnerupsScoreCount < 7 || runnerupRes < 0.5929); return matchRes < 0.81770726891980117713114871015349 && (runnerupsScoreCount < 7 || runnerupRes < 0.5929);
} }
public void distributeAriantPoints() { public void distributeAriantPoints() {
int firstTop = -1, secondTop = -1; int firstTop = -1, secondTop = -1;
Character winner = null; Character winner = null;
List<Integer> runnerups = new ArrayList<>(); List<Integer> runnerups = new ArrayList<>();
for (Entry<Character, Integer> e : score.entrySet()) { for (Entry<Character, Integer> e : score.entrySet()) {
Integer s = e.getValue(); Integer s = e.getValue();
if (s > firstTop) { if (s > firstTop) {
@@ -233,17 +232,17 @@ public class AriantColiseum {
} else if (s > secondTop) { } else if (s > secondTop) {
secondTop = s; secondTop = s;
} }
runnerups.add(s); runnerups.add(s);
rewardTier.put(e.getKey(), (int) Math.floor(s / 10)); rewardTier.put(e.getKey(), (int) Math.floor(s / 10));
} }
runnerups.remove(firstTop); runnerups.remove(firstTop);
if (isUnfairMatch(firstTop, secondTop, map.getDroppedItemsCountById(4031868) + lostShards, runnerups)) { if (isUnfairMatch(firstTop, secondTop, map.getDroppedItemsCountById(4031868) + lostShards, runnerups)) {
rewardTier.put(winner, 1); rewardTier.put(winner, 1);
} }
} }
private ExpeditionType getExpeditionType() { private ExpeditionType getExpeditionType() {
ExpeditionType type; ExpeditionType type;
if (map.getId() == 980010101) { if (map.getId() == 980010101) {
@@ -253,28 +252,28 @@ public class AriantColiseum {
} else { } else {
type = ExpeditionType.ARIANT2; type = ExpeditionType.ARIANT2;
} }
return type; return type;
} }
private void enterKingsRoom() { private void enterKingsRoom() {
exped.removeChannelExpedition(map.getChannelServer()); exped.removeChannelExpedition(map.getChannelServer());
cancelAriantSchedules(); cancelAriantSchedules();
for (Character chr : map.getAllPlayers()) { for (Character chr : map.getAllPlayers()) {
chr.changeMap(980010010, 0); chr.changeMap(980010010, 0);
} }
} }
private synchronized void dispose() { private synchronized void dispose() {
if (exped != null) { if (exped != null) {
exped.dispose(false); exped.dispose(false);
for (Character chr : exped.getActiveMembers()) { for (Character chr : exped.getActiveMembers()) {
chr.setAriantColiseum(null); chr.setAriantColiseum(null);
chr.changeMap(980010000, 0); chr.changeMap(980010000, 0);
} }
map.getWorldServer().registerTimedMapObject(() -> { map.getWorldServer().registerTimedMapObject(() -> {
score.clear(); score.clear();
exped = null; exped = null;
@@ -1,9 +1,8 @@
package server.partyquest; package server.partyquest;
import java.awt.Point; import java.awt.*;
/** /**
*
* @author David * @author David
*/ */
public class GuardianSpawnPoint { public class GuardianSpawnPoint {
@@ -93,13 +93,13 @@ public class MonsterCarnival {
} }
return; return;
} }
// thanks Atoot, Vcoc for noting double CPQ functional being sent to players in CPQ start // thanks Atoot, Vcoc for noting double CPQ functional being sent to players in CPQ start
timer = TimerManager.getInstance().schedule(() -> timeUp(), map.getTimeDefault() * 1000); // thanks Atoot for noticing an irregular "event extended" issue here timer = TimerManager.getInstance().schedule(() -> timeUp(), map.getTimeDefault() * 1000); // thanks Atoot for noticing an irregular "event extended" issue here
effectTimer = TimerManager.getInstance().schedule(() -> complete(), map.getTimeDefault() * 1000 - 10 * 1000); effectTimer = TimerManager.getInstance().schedule(() -> complete(), map.getTimeDefault() * 1000 - 10 * 1000);
respawnTask = TimerManager.getInstance().register(() -> respawn(), YamlConfig.config.server.RESPAWN_INTERVAL); respawnTask = TimerManager.getInstance().register(() -> respawn(), YamlConfig.config.server.RESPAWN_INTERVAL);
cs.initMonsterCarnival(cpq1, room); cs.initMonsterCarnival(cpq1, room);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -109,7 +109,7 @@ public class MonsterCarnival {
private void respawn() { private void respawn() {
map.respawn(); map.respawn();
} }
public void playerDisconnected(int charid) { public void playerDisconnected(int charid) {
int team = -1; int team = -1;
for (PartyCharacter mpc : leader1.getParty().getMembers()) { for (PartyCharacter mpc : leader1.getParty().getMembers()) {
@@ -155,7 +155,7 @@ public class MonsterCarnival {
public boolean canSummonR() { public boolean canSummonR() {
return summonsR < map.getMaxMobs(); return summonsR < map.getMaxMobs();
} }
public void summonR() { public void summonR() {
summonsR++; summonsR++;
} }
@@ -163,11 +163,11 @@ public class MonsterCarnival {
public boolean canSummonB() { public boolean canSummonB() {
return summonsB < map.getMaxMobs(); return summonsB < map.getMaxMobs();
} }
public void summonB() { public void summonB() {
summonsB++; summonsB++;
} }
public boolean canGuardianR() { public boolean canGuardianR() {
int teamReactors = 0; int teamReactors = 0;
for (Reactor react : map.getAllReactors()) { for (Reactor react : map.getAllReactors()) {
@@ -175,10 +175,10 @@ public class MonsterCarnival {
teamReactors += 1; teamReactors += 1;
} }
} }
return teamReactors < map.getMaxReactors(); return teamReactors < map.getMaxReactors();
} }
public boolean canGuardianB() { public boolean canGuardianB() {
int teamReactors = 0; int teamReactors = 0;
for (Reactor react : map.getAllReactors()) { for (Reactor react : map.getAllReactors()) {
@@ -186,7 +186,7 @@ public class MonsterCarnival {
teamReactors += 1; teamReactors += 1;
} }
} }
return teamReactors < map.getMaxReactors(); return teamReactors < map.getMaxReactors();
} }
@@ -238,7 +238,7 @@ public class MonsterCarnival {
leader2.getParty().setEnemy(null); leader2.getParty().setEnemy(null);
map.dispose(); map.dispose();
map = null; map = null;
cs.finishMonsterCarnival(cpq1, room); cs.finishMonsterCarnival(cpq1, room);
} }
@@ -345,9 +345,9 @@ public class MonsterCarnival {
chrMap.dropMessage(5, LanguageConstants.getMessage(chrMap, LanguageConstants.CPQExtendTime)); chrMap.dropMessage(5, LanguageConstants.getMessage(chrMap, LanguageConstants.CPQExtendTime));
} }
startTime = System.currentTimeMillis() + 3 * 60 * 1000; startTime = System.currentTimeMillis() + 3 * 60 * 1000;
map.broadcastMessage(PacketCreator.getClock(3 * 60)); map.broadcastMessage(PacketCreator.getClock(3 * 60));
timer = TimerManager.getInstance().schedule(() -> timeUp(), map.getTimeExpand() * 1000); timer = TimerManager.getInstance().schedule(() -> timeUp(), map.getTimeExpand() * 1000);
effectTimer = TimerManager.getInstance().schedule(() -> complete(), map.getTimeExpand() * 1000 - 10 * 1000); // thanks Vcoc for noticing a time set issue here effectTimer = TimerManager.getInstance().schedule(() -> complete(), map.getTimeExpand() * 1000 - 10 * 1000); // thanks Vcoc for noticing a time set issue here
} }
@@ -355,10 +355,10 @@ public class MonsterCarnival {
public void complete() { public void complete() {
int cp1 = this.redTotalCP; int cp1 = this.redTotalCP;
int cp2 = this.blueTotalCP; int cp2 = this.blueTotalCP;
this.redTimeupCP = cp1; this.redTimeupCP = cp1;
this.blueTimeupCP = cp2; this.blueTimeupCP = cp2;
if (cp1 == cp2) { if (cp1 == cp2) {
return; return;
} }
@@ -368,7 +368,7 @@ public class MonsterCarnival {
if (chnl != chnl1) { if (chnl != chnl1) {
throw new RuntimeException("Os lideres estao em canais diferentes."); throw new RuntimeException("Os lideres estao em canais diferentes.");
} }
map.killAllMonsters(); map.killAllMonsters();
for (PartyCharacter mpc : leader1.getParty().getMembers()) { for (PartyCharacter mpc : leader1.getParty().getMembers()) {
Character mc = mpc.getPlayer(); Character mc = mpc.getPlayer();
@@ -509,11 +509,11 @@ public class MonsterCarnival {
this.blueCP = CP; this.blueCP = CP;
} }
} }
public int getRoom() { public int getRoom() {
return this.room; return this.room;
} }
public MapleMap getEventMap() { public MapleMap getEventMap() {
return this.map; return this.map;
} }
@@ -13,8 +13,8 @@ import java.util.List;
public class MonsterCarnivalParty { public class MonsterCarnivalParty {
private List<Character> members = new LinkedList<>(); private List<Character> members = new LinkedList<>();
private Character leader; private final Character leader;
private byte team; private final byte team;
private short availableCP = 0, totalCP = 0; private short availableCP = 0, totalCP = 0;
private int summons = 8; private int summons = 8;
private boolean winner = false; private boolean winner = false;
@@ -77,10 +77,11 @@ public class MonsterCarnivalParty {
} }
public void warpOut() { public void warpOut() {
if (winner == true) if (winner == true) {
warpOut(980000003 + (leader.getMonsterCarnival().getRoom() * 100)); warpOut(980000003 + (leader.getMonsterCarnival().getRoom() * 100));
else } else {
warpOut(980000004 + (leader.getMonsterCarnival().getRoom() * 100)); warpOut(980000004 + (leader.getMonsterCarnival().getRoom() * 100));
}
} }
public boolean allInMap(MapleMap map) { public boolean allInMap(MapleMap map) {
+42 -40
View File
@@ -32,7 +32,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
*
* @author kevintjuh93 * @author kevintjuh93
*/ */
public class PartyQuest { public class PartyQuest {
@@ -49,8 +48,9 @@ public class PartyQuest {
for (PartyCharacter pchr : party.getMembers()) { for (PartyCharacter pchr : party.getMembers()) {
if (pchr.getChannel() == channel && pchr.getMapId() == mapid) { if (pchr.getChannel() == channel && pchr.getMapId() == mapid) {
Character chr = Server.getInstance().getWorld(world).getChannel(channel).getPlayerStorage().getCharacterById(pchr.getId()); Character chr = Server.getInstance().getWorld(world).getChannel(channel).getPlayerStorage().getCharacterById(pchr.getId());
if (chr != null) if (chr != null) {
this.participants.add(chr); this.participants.add(chr);
}
} }
} }
} }
@@ -67,46 +67,48 @@ public class PartyQuest {
synchronized (participants) { synchronized (participants) {
participants.remove(chr); participants.remove(chr);
chr.setPartyQuest(null); chr.setPartyQuest(null);
if (participants.isEmpty()) super.finalize(); if (participants.isEmpty()) {
super.finalize();
}
//System.gc(); //System.gc();
} }
} }
public static int getExp(String PQ, int level) { public static int getExp(String PQ, int level) {
if (PQ.equals("HenesysPQ")){ if (PQ.equals("HenesysPQ")) {
return 1250 * level / 5; return 1250 * level / 5;
} else if(PQ.equals("KerningPQFinal")){ } else if (PQ.equals("KerningPQFinal")) {
return 500 * level / 5; return 500 * level / 5;
} else if(PQ.equals("KerningPQ4th")){ } else if (PQ.equals("KerningPQ4th")) {
return 400 * level / 5; return 400 * level / 5;
} else if(PQ.equals("KerningPQ3rd")){ } else if (PQ.equals("KerningPQ3rd")) {
return 300 * level / 5; return 300 * level / 5;
} else if(PQ.equals("KerningPQ2nd")){ } else if (PQ.equals("KerningPQ2nd")) {
return 200 * level / 5; return 200 * level / 5;
} else if(PQ.equals("KerningPQ1st")){ } else if (PQ.equals("KerningPQ1st")) {
return 100 * level / 5; return 100 * level / 5;
} else if(PQ.equals("LudiMazePQ")){ } else if (PQ.equals("LudiMazePQ")) {
return 2000 * level / 5; return 2000 * level / 5;
} else if(PQ.equals("LudiPQ1st")) { } else if (PQ.equals("LudiPQ1st")) {
return 100 * level / 5; return 100 * level / 5;
} else if(PQ.equals("LudiPQ2nd")) { } else if (PQ.equals("LudiPQ2nd")) {
return 250 * level / 5; return 250 * level / 5;
} else if(PQ.equals("LudiPQ3rd")) { } else if (PQ.equals("LudiPQ3rd")) {
return 350 * level / 5; return 350 * level / 5;
} else if(PQ.equals("LudiPQ4th")) { } else if (PQ.equals("LudiPQ4th")) {
return 350 * level / 5; return 350 * level / 5;
} else if(PQ.equals("LudiPQ5th")) { } else if (PQ.equals("LudiPQ5th")) {
return 400 * level / 5; return 400 * level / 5;
} else if(PQ.equals("LudiPQ6th")) { } else if (PQ.equals("LudiPQ6th")) {
return 450 * level / 5; return 450 * level / 5;
} else if(PQ.equals("LudiPQ7th")) { } else if (PQ.equals("LudiPQ7th")) {
return 500 * level / 5; return 500 * level / 5;
} else if(PQ.equals("LudiPQ8th")) { } else if (PQ.equals("LudiPQ8th")) {
return 650 * level / 5; return 650 * level / 5;
} else if(PQ.equals("LudiPQLast")) { } else if (PQ.equals("LudiPQLast")) {
return 800 * level / 5; return 800 * level / 5;
} }
FilePrinter.printError(FilePrinter.NPC, "Unhandled PartyQuest: " + PQ); FilePrinter.printError(FilePrinter.NPC, "Unhandled PartyQuest: " + PQ);
return 0; return 0;
} }
} }
+52 -23
View File
@@ -31,7 +31,6 @@ import tools.PacketCreator;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
/** /**
*
* @author kevintjuh93 * @author kevintjuh93
*/ */
public class Pyramid extends PartyQuest { public class Pyramid extends PartyQuest {
@@ -82,7 +81,9 @@ public class Pyramid extends PartyQuest {
count = 0; count = 0;
gaugeSchedule = TimerManager.getInstance().register(() -> { gaugeSchedule = TimerManager.getInstance().register(() -> {
gauge -= decrease; gauge -= decrease;
if (gauge <= 0) warp(926010001); if (gauge <= 0) {
warp(926010001);
}
}, 1000); }, 1000);
} }
@@ -90,23 +91,31 @@ public class Pyramid extends PartyQuest {
public void kill() { public void kill() {
kill++; kill++;
if (gauge < 100) count++; if (gauge < 100) {
count++;
}
gauge++; gauge++;
broadcastInfo("hit", kill); broadcastInfo("hit", kill);
if (gauge >= 100) gauge = 100; if (gauge >= 100) {
gauge = 100;
}
checkBuffs(); checkBuffs();
} }
public void cool() { public void cool() {
cool++; cool++;
int plus = coolAdd; int plus = coolAdd;
if ((gauge + coolAdd) > 100) plus -= ((gauge + coolAdd) - 100); if ((gauge + coolAdd) > 100) {
plus -= ((gauge + coolAdd) - 100);
}
gauge += plus; gauge += plus;
count += plus; count += plus;
if (gauge >= 100) gauge = 100; if (gauge >= 100) {
gauge = 100;
}
broadcastInfo("cool", cool); broadcastInfo("cool", cool);
checkBuffs(); checkBuffs();
} }
public void miss() { public void miss() {
@@ -118,10 +127,11 @@ public class Pyramid extends PartyQuest {
public int timer() { public int timer() {
int value; int value;
if (stage > 0) if (stage > 0) {
value = 180; value = 180;
else } else {
value = 120; value = 120;
}
timer = TimerManager.getInstance().schedule(() -> { timer = TimerManager.getInstance().schedule(() -> {
stage++; stage++;
@@ -146,7 +156,9 @@ public class Pyramid extends PartyQuest {
gaugeSchedule = null; gaugeSchedule = null;
timer.cancel(false); timer.cancel(false);
timer = null; timer = null;
} else stage = 0; } else {
stage = 0;
}
} }
public void broadcastInfo(String info, int amount) { public void broadcastInfo(String info, int amount) {
@@ -157,7 +169,9 @@ public class Pyramid extends PartyQuest {
} }
public boolean useSkill() { public boolean useSkill() {
if (skill < 1) return false; if (skill < 1) {
return false;
}
skill--; skill--;
broadcastInfo("skill", skill); broadcastInfo("skill", skill);
@@ -169,8 +183,9 @@ public class Pyramid extends PartyQuest {
if (buffcount == 0 && total >= 250) { if (buffcount == 0 && total >= 250) {
buffcount++; buffcount++;
ItemInformationProvider ii = ItemInformationProvider.getInstance(); ItemInformationProvider ii = ItemInformationProvider.getInstance();
for (Character chr : getParticipants()) for (Character chr : getParticipants()) {
ii.getItemEffect(2022585).applyTo(chr); ii.getItemEffect(2022585).applyTo(chr);
}
} else if (buffcount == 1 && total >= 500) { } else if (buffcount == 1 && total >= 500) {
buffcount++; buffcount++;
@@ -212,20 +227,34 @@ public class Pyramid extends PartyQuest {
if (exp == 0) { if (exp == 0) {
int totalkills = (kill + cool); int totalkills = (kill + cool);
if (stage == 5) { if (stage == 5) {
if (totalkills >= 3000) rank = 0; if (totalkills >= 3000) {
else if (totalkills >= 2000) rank = 1; rank = 0;
else if (totalkills >= 1500) rank = 2; } else if (totalkills >= 2000) {
else if(totalkills >= 500) rank = 3; rank = 1;
else rank = 4; } else if (totalkills >= 1500) {
rank = 2;
} else if (totalkills >= 500) {
rank = 3;
} else {
rank = 4;
}
} else { } else {
if (totalkills >= 2000) rank = 3; if (totalkills >= 2000) {
else rank = 4; rank = 3;
} else {
rank = 4;
}
} }
if (rank == 0) exp = (60500 + (5500 * mode.getMode())); if (rank == 0) {
else if(rank == 1) exp = (55000 + (5000 * mode.getMode())); exp = (60500 + (5500 * mode.getMode()));
else if (rank == 2) exp = (46750 + (4250 * mode.getMode())); } else if (rank == 1) {
else if (rank == 3) exp = (22000 + (2000 * mode.getMode())); exp = (55000 + (5000 * mode.getMode()));
} else if (rank == 2) {
exp = (46750 + (4250 * mode.getMode()));
} else if (rank == 3) {
exp = (22000 + (2000 * mode.getMode()));
}
exp += ((kill * 2) + (cool * 10)); exp += ((kill * 2) + (cool * 10));
} }
@@ -29,29 +29,28 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class BuffAction extends AbstractQuestAction { public class BuffAction extends AbstractQuestAction {
int itemEffect; int itemEffect;
public BuffAction(Quest quest, Data data) { public BuffAction(Quest quest, Data data) {
super(QuestActionType.BUFF, quest); super(QuestActionType.BUFF, quest);
processData(data); processData(data);
} }
@Override @Override
public boolean check(Character chr, Integer extSelection) { public boolean check(Character chr, Integer extSelection) {
return true; return true;
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
itemEffect = DataTool.getInt(data); itemEffect = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
ItemInformationProvider.getInstance().getItemEffect(itemEffect).applyTo(chr); ItemInformationProvider.getInstance().getItemEffect(itemEffect).applyTo(chr);
} }
} }
@@ -29,33 +29,32 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class ExpAction extends AbstractQuestAction { public class ExpAction extends AbstractQuestAction {
int exp; int exp;
public ExpAction(Quest quest, Data data) { public ExpAction(Quest quest, Data data) {
super(QuestActionType.EXP, quest); super(QuestActionType.EXP, quest);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
exp = DataTool.getInt(data); exp = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
runAction(chr, exp); runAction(chr, exp);
} }
public static void runAction(Character chr, int gain) { public static void runAction(Character chr, int gain) {
if (!YamlConfig.config.server.USE_QUEST_RATE) { if (!YamlConfig.config.server.USE_QUEST_RATE) {
chr.gainExp(gain * chr.getExpRate(), true, true); chr.gainExp(gain * chr.getExpRate(), true, true);
} else { } else {
chr.gainExp(gain * chr.getQuestExpRate(), true, true); chr.gainExp(gain * chr.getQuestExpRate(), true, true);
}
} }
}
} }
@@ -28,26 +28,25 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class FameAction extends AbstractQuestAction { public class FameAction extends AbstractQuestAction {
int fame; int fame;
public FameAction(Quest quest, Data data) { public FameAction(Quest quest, Data data) {
super(QuestActionType.FAME, quest); super(QuestActionType.FAME, quest);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
fame = DataTool.getInt(data); fame = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
chr.gainFame(fame); chr.gainFame(fame);
} }
} }
@@ -26,29 +26,28 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class InfoAction extends AbstractQuestAction { public class InfoAction extends AbstractQuestAction {
private String info;
private int questID;
public InfoAction(Quest quest, Data data) { private String info;
super(QuestActionType.INFO, quest); private final int questID;
questID = quest.getId();
processData(data);
}
@Override public InfoAction(Quest quest, Data data) {
public void processData(Data data) { super(QuestActionType.INFO, quest);
info = DataTool.getString(data, ""); questID = quest.getId();
} processData(data);
}
@Override
public void processData(Data data) {
info = DataTool.getString(data, "");
}
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
chr.getAbstractPlayerInteraction().setQuestProgress(questID, info); chr.getAbstractPlayerInteraction().setQuestProgress(questID, info);
} }
} }
+308 -300
View File
@@ -43,316 +43,324 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
* @author Ronan * @author Ronan
*/ */
public class ItemAction extends AbstractQuestAction { public class ItemAction extends AbstractQuestAction {
List<ItemData> items = new ArrayList<>(); List<ItemData> items = new ArrayList<>();
public ItemAction(Quest quest, Data data) {
super(QuestActionType.ITEM, quest);
processData(data);
}
@Override
public void processData(Data data) {
for (Data iEntry : data.getChildren()) {
int id = DataTool.getInt(iEntry.getChildByPath("id"));
int count = DataTool.getInt(iEntry.getChildByPath("count"), 1);
int period = DataTool.getInt(iEntry.getChildByPath("period"), 0);
Integer prop = null;
Data propData = iEntry.getChildByPath("prop");
if(propData != null)
prop = DataTool.getInt(propData);
int gender = 2;
if (iEntry.getChildByPath("gender") != null)
gender = DataTool.getInt(iEntry.getChildByPath("gender"));
int job = -1;
if (iEntry.getChildByPath("job") != null)
job = DataTool.getInt(iEntry.getChildByPath("job"));
items.add(new ItemData(Integer.parseInt(iEntry.getName()), id, count, prop, job, gender, period));
}
items.sort((o1, o2) -> o1.map - o2.map);
}
@Override
public void run(Character chr, Integer extSelection) {
List<ItemData> takeItem = new LinkedList<>();
List<ItemData> giveItem = new LinkedList<>();
int props = 0, rndProps = 0, accProps = 0;
for(ItemData item : items) {
if(item.getProp() != null && item.getProp() != -1 && canGetItem(item, chr)) {
props += item.getProp();
}
}
int extNum = 0;
if (props > 0) {
rndProps = Randomizer.nextInt(props);
}
for (ItemData iEntry : items) {
if (!canGetItem(iEntry, chr)) {
continue;
}
if(iEntry.getProp() != null) {
if(iEntry.getProp() == -1) {
if(extSelection != extNum++)
continue;
} else {
accProps += iEntry.getProp();
if(accProps <= rndProps) {
continue;
} else {
accProps = Integer.MIN_VALUE;
}
}
}
if(iEntry.getCount() < 0) { // Remove Item
takeItem.add(iEntry);
} else { // Give Item
giveItem.add(iEntry);
}
}
// must take all needed items before giving others
for(ItemData iEntry: takeItem) {
int itemid = iEntry.getId(), count = iEntry.getCount();
InventoryType type = ItemConstants.getInventoryType(itemid);
int quantity = count * -1; // Invert
if(type.equals(InventoryType.EQUIP)) {
if(chr.getInventory(type).countById(itemid) < quantity) {
// Not enough in the equip inventoty, so check Equipped...
if(chr.getInventory(InventoryType.EQUIPPED).countById(itemid) > quantity) {
// Found it equipped, so change the type to equipped.
type = InventoryType.EQUIPPED;
}
}
}
InventoryManipulator.removeById(chr.getClient(), type, itemid, quantity, true, false); public ItemAction(Quest quest, Data data) {
chr.sendPacket(PacketCreator.getShowItemGain(itemid, (short) count, true)); super(QuestActionType.ITEM, quest);
} processData(data);
}
for(ItemData iEntry: giveItem) {
int itemid = iEntry.getId(), count = iEntry.getCount(), period = iEntry.getPeriod(); // thanks Vcoc for noticing quest milestone item not getting removed from inventory after a while
InventoryManipulator.addById(chr.getClient(), itemid, (short) count, "", -1, period > 0 ? (System.currentTimeMillis() + period * 60 * 1000) : -1);
chr.sendPacket(PacketCreator.getShowItemGain(itemid, (short) count, true));
}
}
@Override
public boolean check(Character chr, Integer extSelection) {
List<Pair<Item, InventoryType>> gainList = new LinkedList<>();
List<Pair<Item, InventoryType>> selectList = new LinkedList<>();
List<Pair<Item, InventoryType>> randomList = new LinkedList<>();
List<Integer> allSlotUsed = new ArrayList(5);
for(byte i = 0; i < 5; i++) allSlotUsed.add(0);
for(ItemData item : items) {
if (!canGetItem(item, chr)) {
continue;
}
InventoryType type = ItemConstants.getInventoryType(item.getId());
if(item.getProp() != null) {
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
if(item.getProp() < 0) {
selectList.add(new Pair<>(toItem, type));
} else {
randomList.add(new Pair<>(toItem, type));
}
} else {
// Make sure they can hold the item.
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
gainList.add(new Pair<>(toItem, type));
if(item.getCount() < 0) {
// Make sure they actually have the item.
int quantity = item.getCount() * -1;
int freeSlotCount = chr.getInventory(type).freeSlotCountById(item.getId(), quantity);
if(freeSlotCount == -1) {
if(type.equals(InventoryType.EQUIP) && chr.getInventory(InventoryType.EQUIPPED).countById(item.getId()) > quantity)
continue;
announceInventoryLimit(Collections.singletonList(item.getId()), chr);
return false;
} else {
int idx = type.getType() - 1; // more slots available from the given items!
allSlotUsed.set(idx, allSlotUsed.get(idx) - freeSlotCount);
}
}
}
}
if(!randomList.isEmpty()) {
int result;
Client c = chr.getClient();
List<Integer> rndUsed = new ArrayList(5);
for(byte i = 0; i < 5; i++) rndUsed.add(allSlotUsed.get(i));
for(Pair<Item, InventoryType> it: randomList) {
int idx = it.getRight().getType() - 1;
result = InventoryManipulator.checkSpaceProgressively(c, it.getLeft().getItemId(), it.getLeft().getQuantity(), "", rndUsed.get(idx), false);
if(result % 2 == 0) {
announceInventoryLimit(Collections.singletonList(it.getLeft().getItemId()), chr);
return false;
}
allSlotUsed.set(idx, Math.max(allSlotUsed.get(idx), result >> 1));
}
}
if(!selectList.isEmpty()) {
Pair<Item, InventoryType> selected = selectList.get(extSelection);
gainList.add(selected);
}
if (!canHold(chr, gainList)) {
List<Integer> gainItemids = new LinkedList<>();
for (Pair<Item, InventoryType> it : gainList) {
gainItemids.add(it.getLeft().getItemId());
}
announceInventoryLimit(gainItemids, chr);
return false;
}
return true;
}
private void announceInventoryLimit(List<Integer> itemids, Character chr) {
for (Integer id : itemids) {
if (ItemInformationProvider.getInstance().isPickupRestricted(id) && chr.haveItemWithId(id, true)) {
chr.dropMessage(1, "Please check if you already have a similar one-of-a-kind item in your inventory.");
return;
}
}
chr.dropMessage(1, "Please check if you have enough space in your inventory.");
}
private boolean canHold(Character chr, List<Pair<Item, InventoryType>> gainList) {
List<Integer> toAddItemids = new LinkedList<>();
List<Integer> toAddQuantity = new LinkedList<>();
List<Integer> toRemoveItemids = new LinkedList<>();
List<Integer> toRemoveQuantity = new LinkedList<>();
for (Pair<Item, InventoryType> item : gainList) {
Item it = item.getLeft();
if (it.getQuantity() > 0) {
toAddItemids.add(it.getItemId()); @Override
toAddQuantity.add((int) it.getQuantity()); public void processData(Data data) {
} else { for (Data iEntry : data.getChildren()) {
toRemoveItemids.add(it.getItemId()); int id = DataTool.getInt(iEntry.getChildByPath("id"));
toRemoveQuantity.add(-1 * ((int) it.getQuantity())); int count = DataTool.getInt(iEntry.getChildByPath("count"), 1);
} int period = DataTool.getInt(iEntry.getChildByPath("period"), 0);
}
Integer prop = null;
// thanks onechord for noticing quests unnecessarily giving out "full inventory" from quests that also takes items from players Data propData = iEntry.getChildByPath("prop");
return chr.getAbstractPlayerInteraction().canHoldAllAfterRemoving(toAddItemids, toAddQuantity, toRemoveItemids, toRemoveQuantity); if (propData != null) {
} prop = DataTool.getInt(propData);
private boolean canGetItem(ItemData item, Character chr) {
if (item.getGender() != 2 && item.getGender() != chr.getGender()) {
return false;
}
if (item.job > 0) {
final List<Integer> code = getJobBy5ByteEncoding(item.getJob());
boolean jobFound = false;
for (int codec : code) {
if (codec / 100 == chr.getJob().getId() / 100) {
jobFound = true;
break;
}
}
return jobFound;
}
return true;
}
public boolean restoreLostItem(Character chr, int itemid) {
if (!ItemInformationProvider.getInstance().isQuestItem(itemid)) {
return false;
} }
// thanks danielktran (MapleHeroesD) int gender = 2;
for (ItemData item : items) { if (iEntry.getChildByPath("gender") != null) {
if (item.getId() == itemid) { gender = DataTool.getInt(iEntry.getChildByPath("gender"));
int missingQty = item.getCount() - chr.countItem(itemid); }
if (missingQty > 0) {
if (!chr.canHold(itemid, missingQty)) { int job = -1;
chr.dropMessage(1, "Please check if you have enough space in your inventory."); if (iEntry.getChildByPath("job") != null) {
return false; job = DataTool.getInt(iEntry.getChildByPath("job"));
} }
InventoryManipulator.addById(chr.getClient(), item.getId(), (short) missingQty); items.add(new ItemData(Integer.parseInt(iEntry.getName()), id, count, prop, job, gender, period));
FilePrinter.print(FilePrinter.QUEST_RESTORE_ITEM, chr + " obtained " + itemid + " qty. " + missingQty + " from quest " + questID); }
items.sort((o1, o2) -> o1.map - o2.map);
}
@Override
public void run(Character chr, Integer extSelection) {
List<ItemData> takeItem = new LinkedList<>();
List<ItemData> giveItem = new LinkedList<>();
int props = 0, rndProps = 0, accProps = 0;
for (ItemData item : items) {
if (item.getProp() != null && item.getProp() != -1 && canGetItem(item, chr)) {
props += item.getProp();
}
}
int extNum = 0;
if (props > 0) {
rndProps = Randomizer.nextInt(props);
}
for (ItemData iEntry : items) {
if (!canGetItem(iEntry, chr)) {
continue;
}
if (iEntry.getProp() != null) {
if (iEntry.getProp() == -1) {
if (extSelection != extNum++) {
continue;
}
} else {
accProps += iEntry.getProp();
if (accProps <= rndProps) {
continue;
} else {
accProps = Integer.MIN_VALUE;
} }
return true;
} }
} }
if (iEntry.getCount() < 0) { // Remove Item
takeItem.add(iEntry);
} else { // Give Item
giveItem.add(iEntry);
}
}
// must take all needed items before giving others
for (ItemData iEntry : takeItem) {
int itemid = iEntry.getId(), count = iEntry.getCount();
InventoryType type = ItemConstants.getInventoryType(itemid);
int quantity = count * -1; // Invert
if (type.equals(InventoryType.EQUIP)) {
if (chr.getInventory(type).countById(itemid) < quantity) {
// Not enough in the equip inventoty, so check Equipped...
if (chr.getInventory(InventoryType.EQUIPPED).countById(itemid) > quantity) {
// Found it equipped, so change the type to equipped.
type = InventoryType.EQUIPPED;
}
}
}
InventoryManipulator.removeById(chr.getClient(), type, itemid, quantity, true, false);
chr.sendPacket(PacketCreator.getShowItemGain(itemid, (short) count, true));
}
for (ItemData iEntry : giveItem) {
int itemid = iEntry.getId(), count = iEntry.getCount(), period = iEntry.getPeriod(); // thanks Vcoc for noticing quest milestone item not getting removed from inventory after a while
InventoryManipulator.addById(chr.getClient(), itemid, (short) count, "", -1, period > 0 ? (System.currentTimeMillis() + period * 60 * 1000) : -1);
chr.sendPacket(PacketCreator.getShowItemGain(itemid, (short) count, true));
}
}
@Override
public boolean check(Character chr, Integer extSelection) {
List<Pair<Item, InventoryType>> gainList = new LinkedList<>();
List<Pair<Item, InventoryType>> selectList = new LinkedList<>();
List<Pair<Item, InventoryType>> randomList = new LinkedList<>();
List<Integer> allSlotUsed = new ArrayList(5);
for (byte i = 0; i < 5; i++) {
allSlotUsed.add(0);
}
for (ItemData item : items) {
if (!canGetItem(item, chr)) {
continue;
}
InventoryType type = ItemConstants.getInventoryType(item.getId());
if (item.getProp() != null) {
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
if (item.getProp() < 0) {
selectList.add(new Pair<>(toItem, type));
} else {
randomList.add(new Pair<>(toItem, type));
}
} else {
// Make sure they can hold the item.
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
gainList.add(new Pair<>(toItem, type));
if (item.getCount() < 0) {
// Make sure they actually have the item.
int quantity = item.getCount() * -1;
int freeSlotCount = chr.getInventory(type).freeSlotCountById(item.getId(), quantity);
if (freeSlotCount == -1) {
if (type.equals(InventoryType.EQUIP) && chr.getInventory(InventoryType.EQUIPPED).countById(item.getId()) > quantity) {
continue;
}
announceInventoryLimit(Collections.singletonList(item.getId()), chr);
return false;
} else {
int idx = type.getType() - 1; // more slots available from the given items!
allSlotUsed.set(idx, allSlotUsed.get(idx) - freeSlotCount);
}
}
}
}
if (!randomList.isEmpty()) {
int result;
Client c = chr.getClient();
List<Integer> rndUsed = new ArrayList(5);
for (byte i = 0; i < 5; i++) {
rndUsed.add(allSlotUsed.get(i));
}
for (Pair<Item, InventoryType> it : randomList) {
int idx = it.getRight().getType() - 1;
result = InventoryManipulator.checkSpaceProgressively(c, it.getLeft().getItemId(), it.getLeft().getQuantity(), "", rndUsed.get(idx), false);
if (result % 2 == 0) {
announceInventoryLimit(Collections.singletonList(it.getLeft().getItemId()), chr);
return false;
}
allSlotUsed.set(idx, Math.max(allSlotUsed.get(idx), result >> 1));
}
}
if (!selectList.isEmpty()) {
Pair<Item, InventoryType> selected = selectList.get(extSelection);
gainList.add(selected);
}
if (!canHold(chr, gainList)) {
List<Integer> gainItemids = new LinkedList<>();
for (Pair<Item, InventoryType> it : gainList) {
gainItemids.add(it.getLeft().getItemId());
}
announceInventoryLimit(gainItemids, chr);
return false; return false;
} }
return true;
private class ItemData { }
private final int map, id, count, job, gender, period;
private final Integer prop; private void announceInventoryLimit(List<Integer> itemids, Character chr) {
for (Integer id : itemids) {
public ItemData(int map, int id, int count, Integer prop, int job, int gender, int period) { if (ItemInformationProvider.getInstance().isPickupRestricted(id) && chr.haveItemWithId(id, true)) {
this.map = map; chr.dropMessage(1, "Please check if you already have a similar one-of-a-kind item in your inventory.");
this.id = id; return;
this.count = count; }
this.prop = prop; }
this.job = job;
this.gender = gender; chr.dropMessage(1, "Please check if you have enough space in your inventory.");
this.period = period; }
}
private boolean canHold(Character chr, List<Pair<Item, InventoryType>> gainList) {
public int getId() { List<Integer> toAddItemids = new LinkedList<>();
return id; List<Integer> toAddQuantity = new LinkedList<>();
} List<Integer> toRemoveItemids = new LinkedList<>();
List<Integer> toRemoveQuantity = new LinkedList<>();
public int getCount() {
return count; for (Pair<Item, InventoryType> item : gainList) {
} Item it = item.getLeft();
public Integer getProp() { if (it.getQuantity() > 0) {
return prop; toAddItemids.add(it.getItemId());
} toAddQuantity.add((int) it.getQuantity());
} else {
public int getJob() { toRemoveItemids.add(it.getItemId());
return job; toRemoveQuantity.add(-1 * ((int) it.getQuantity()));
} }
}
public int getGender() {
return gender; // thanks onechord for noticing quests unnecessarily giving out "full inventory" from quests that also takes items from players
} return chr.getAbstractPlayerInteraction().canHoldAllAfterRemoving(toAddItemids, toAddQuantity, toRemoveItemids, toRemoveQuantity);
}
public int getPeriod() {
return period; private boolean canGetItem(ItemData item, Character chr) {
} if (item.getGender() != 2 && item.getGender() != chr.getGender()) {
} return false;
}
if (item.job > 0) {
final List<Integer> code = getJobBy5ByteEncoding(item.getJob());
boolean jobFound = false;
for (int codec : code) {
if (codec / 100 == chr.getJob().getId() / 100) {
jobFound = true;
break;
}
}
return jobFound;
}
return true;
}
public boolean restoreLostItem(Character chr, int itemid) {
if (!ItemInformationProvider.getInstance().isQuestItem(itemid)) {
return false;
}
// thanks danielktran (MapleHeroesD)
for (ItemData item : items) {
if (item.getId() == itemid) {
int missingQty = item.getCount() - chr.countItem(itemid);
if (missingQty > 0) {
if (!chr.canHold(itemid, missingQty)) {
chr.dropMessage(1, "Please check if you have enough space in your inventory.");
return false;
}
InventoryManipulator.addById(chr.getClient(), item.getId(), (short) missingQty);
FilePrinter.print(FilePrinter.QUEST_RESTORE_ITEM, chr + " obtained " + itemid + " qty. " + missingQty + " from quest " + questID);
}
return true;
}
}
return false;
}
private class ItemData {
private final int map, id, count, job, gender, period;
private final Integer prop;
public ItemData(int map, int id, int count, Integer prop, int job, int gender, int period) {
this.map = map;
this.id = id;
this.count = count;
this.prop = prop;
this.job = job;
this.gender = gender;
this.period = period;
}
public int getId() {
return id;
}
public int getCount() {
return count;
}
public Integer getProp() {
return prop;
}
public int getJob() {
return job;
}
public int getGender() {
return gender;
}
public int getPeriod() {
return period;
}
}
} }
@@ -29,38 +29,37 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MesoAction extends AbstractQuestAction { public class MesoAction extends AbstractQuestAction {
int mesos; int mesos;
public MesoAction(Quest quest, Data data) { public MesoAction(Quest quest, Data data) {
super(QuestActionType.MESO, quest); super(QuestActionType.MESO, quest);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
mesos = DataTool.getInt(data); mesos = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
runAction(chr, mesos); runAction(chr, mesos);
} }
public static void runAction(Character chr, int gain) { public static void runAction(Character chr, int gain) {
if (gain < 0) { if (gain < 0) {
chr.gainMeso(gain, true, false, true); chr.gainMeso(gain, true, false, true);
} else { } else {
if (!YamlConfig.config.server.USE_QUEST_RATE) { if (!YamlConfig.config.server.USE_QUEST_RATE) {
chr.gainMeso(gain * chr.getMesoRate(), true, false, true); chr.gainMeso(gain * chr.getMesoRate(), true, false, true);
} else { } else {
chr.gainMeso(gain * chr.getQuestMesoRate(), true, false, true); chr.gainMeso(gain * chr.getQuestMesoRate(), true, false, true);
} }
}
} }
}
} }
@@ -30,26 +30,25 @@ import server.quest.QuestActionType;
import tools.PacketCreator; import tools.PacketCreator;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class NextQuestAction extends AbstractQuestAction { public class NextQuestAction extends AbstractQuestAction {
int nextQuest; int nextQuest;
public NextQuestAction(Quest quest, Data data) { public NextQuestAction(Quest quest, Data data) {
super(QuestActionType.NEXTQUEST, quest); super(QuestActionType.NEXTQUEST, quest);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
nextQuest = DataTool.getInt(data); nextQuest = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
QuestStatus status = chr.getQuest(Quest.getInstance(questID)); QuestStatus status = chr.getQuest(Quest.getInstance(questID));
chr.sendPacket(PacketCreator.updateQuestFinish((short) questID, status.getNpc(), (short) nextQuest)); chr.sendPacket(PacketCreator.updateQuestFinish((short) questID, status.getNpc(), (short) nextQuest));
} }
} }
@@ -30,35 +30,35 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class PetSkillAction extends AbstractQuestAction { public class PetSkillAction extends AbstractQuestAction {
int flag; int flag;
public PetSkillAction(Quest quest, Data data) { public PetSkillAction(Quest quest, Data data) {
super(QuestActionType.PETSKILL, quest); super(QuestActionType.PETSKILL, quest);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
flag = DataTool.getInt("petskill", data); flag = DataTool.getInt("petskill", data);
} }
@Override @Override
public boolean check(Character chr, Integer extSelection) { public boolean check(Character chr, Integer extSelection) {
QuestStatus status = chr.getQuest(Quest.getInstance(questID)); QuestStatus status = chr.getQuest(Quest.getInstance(questID));
if(!(status.getStatus() == QuestStatus.Status.NOT_STARTED && status.getForfeited() > 0)) if (!(status.getStatus() == QuestStatus.Status.NOT_STARTED && status.getForfeited() > 0)) {
return false; return false;
}
return chr.getPet(0) != null;
} return chr.getPet(0) != null;
}
@Override
public void run(Character chr, Integer extSelection) { @Override
chr.getPet(0).setFlag((byte) ItemConstants.getFlagByInt(flag)); public void run(Character chr, Integer extSelection) {
} chr.getPet(0).setFlag((byte) ItemConstants.getFlagByInt(flag));
}
} }
@@ -27,33 +27,34 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class PetSpeedAction extends AbstractQuestAction { public class PetSpeedAction extends AbstractQuestAction {
public PetSpeedAction(Quest quest, Data data) { public PetSpeedAction(Quest quest, Data data) {
super(QuestActionType.PETTAMENESS, quest); super(QuestActionType.PETTAMENESS, quest);
questID = quest.getId(); questID = quest.getId();
} }
@Override @Override
public void processData(Data data) {} public void processData(Data data) {}
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
Client c = chr.getClient(); Client c = chr.getClient();
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain owner speed Pet pet = chr.getPet(0); // assuming here only the pet leader will gain owner speed
if(pet == null) return; if (pet == null) {
return;
c.lockClient(); }
try {
pet.addPetFlag(c.getPlayer(), Pet.PetFlag.OWNER_SPEED); c.lockClient();
} finally { try {
c.unlockClient(); pet.addPetFlag(c.getPlayer(), Pet.PetFlag.OWNER_SPEED);
} } finally {
c.unlockClient();
} }
}
} }
@@ -28,36 +28,37 @@ import server.quest.Quest;
import server.quest.QuestActionType; import server.quest.QuestActionType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class PetTamenessAction extends AbstractQuestAction { public class PetTamenessAction extends AbstractQuestAction {
int tameness; int tameness;
public PetTamenessAction(Quest quest, Data data) { public PetTamenessAction(Quest quest, Data data) {
super(QuestActionType.PETTAMENESS, quest); super(QuestActionType.PETTAMENESS, quest);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
tameness = DataTool.getInt(data); tameness = DataTool.getInt(data);
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
Client c = chr.getClient(); Client c = chr.getClient();
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain tameness Pet pet = chr.getPet(0); // assuming here only the pet leader will gain tameness
if(pet == null) return; if (pet == null) {
return;
c.lockClient(); }
try {
pet.gainClosenessFullness(chr, tameness, 0, 0); c.lockClient();
} finally { try {
c.unlockClient(); pet.gainClosenessFullness(chr, tameness, 0, 0);
} } finally {
} c.unlockClient();
}
}
} }
@@ -32,34 +32,33 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class QuestAction extends AbstractQuestAction { public class QuestAction extends AbstractQuestAction {
int mesos; int mesos;
Map<Integer, Integer> quests = new HashMap<>(); Map<Integer, Integer> quests = new HashMap<>();
public QuestAction(Quest quest, Data data) { public QuestAction(Quest quest, Data data) {
super(QuestActionType.QUEST, quest); super(QuestActionType.QUEST, quest);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
for (Data qEntry : data) { for (Data qEntry : data) {
int questid = DataTool.getInt(qEntry.getChildByPath("id")); int questid = DataTool.getInt(qEntry.getChildByPath("id"));
int stat = DataTool.getInt(qEntry.getChildByPath("state")); int stat = DataTool.getInt(qEntry.getChildByPath("state"));
quests.put(questid, stat); quests.put(questid, stat);
} }
} }
@Override @Override
public void run(Character chr, Integer extSelection) { public void run(Character chr, Integer extSelection) {
for(Integer questID : quests.keySet()) { for (Integer questID : quests.keySet()) {
int stat = quests.get(questID); int stat = quests.get(questID);
chr.updateQuestStatus(new QuestStatus(Quest.getInstance(questID), QuestStatus.Status.getById(stat))); chr.updateQuestStatus(new QuestStatus(Quest.getInstance(questID), QuestStatus.Status.getById(stat)));
} }
} }
} }
@@ -36,88 +36,87 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class SkillAction extends AbstractQuestAction { public class SkillAction extends AbstractQuestAction {
int itemEffect; int itemEffect;
Map<Integer, SkillData> skillData = new HashMap<>(); Map<Integer, SkillData> skillData = new HashMap<>();
public SkillAction(Quest quest, Data data) { public SkillAction(Quest quest, Data data) {
super(QuestActionType.SKILL, quest); super(QuestActionType.SKILL, quest);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
for (Data sEntry : data) { for (Data sEntry : data) {
byte skillLevel = 0; byte skillLevel = 0;
int skillid = DataTool.getInt(sEntry.getChildByPath("id")); int skillid = DataTool.getInt(sEntry.getChildByPath("id"));
Data skillLevelData = sEntry.getChildByPath("skillLevel"); Data skillLevelData = sEntry.getChildByPath("skillLevel");
if(skillLevelData != null) if (skillLevelData != null) {
skillLevel = (byte) DataTool.getInt(skillLevelData); skillLevel = (byte) DataTool.getInt(skillLevelData);
int masterLevel = DataTool.getInt(sEntry.getChildByPath("masterLevel")); }
List<Integer> jobs = new ArrayList<>(); int masterLevel = DataTool.getInt(sEntry.getChildByPath("masterLevel"));
List<Integer> jobs = new ArrayList<>();
Data applicableJobs = sEntry.getChildByPath("job");
if(applicableJobs != null) { Data applicableJobs = sEntry.getChildByPath("job");
for (Data applicableJob : applicableJobs.getChildren()) { if (applicableJobs != null) {
jobs.add(DataTool.getInt(applicableJob)); for (Data applicableJob : applicableJobs.getChildren()) {
} jobs.add(DataTool.getInt(applicableJob));
} }
}
skillData.put(skillid, new SkillData(skillid, skillLevel, masterLevel, jobs));
} skillData.put(skillid, new SkillData(skillid, skillLevel, masterLevel, jobs));
} }
}
@Override
public void run(Character chr, Integer extSelection) { @Override
for(SkillData skill : skillData.values()) { public void run(Character chr, Integer extSelection) {
Skill skillObject = SkillFactory.getSkill(skill.getId()); for (SkillData skill : skillData.values()) {
if(skillObject == null) continue; Skill skillObject = SkillFactory.getSkill(skill.getId());
if (skillObject == null) {
boolean shouldLearn = false; continue;
}
if(skill.jobsContains(chr.getJob()) || skillObject.isBeginnerSkill())
shouldLearn = true; boolean shouldLearn = skill.jobsContains(chr.getJob()) || skillObject.isBeginnerSkill();
byte skillLevel = (byte) Math.max(skill.getLevel(), chr.getSkillLevel(skillObject)); byte skillLevel = (byte) Math.max(skill.getLevel(), chr.getSkillLevel(skillObject));
int masterLevel = Math.max(skill.getMasterLevel(), chr.getMasterLevel(skillObject)); int masterLevel = Math.max(skill.getMasterLevel(), chr.getMasterLevel(skillObject));
if (shouldLearn) { if (shouldLearn) {
chr.changeSkillLevel(skillObject, skillLevel, masterLevel, -1); chr.changeSkillLevel(skillObject, skillLevel, masterLevel, -1);
} }
} }
} }
private class SkillData { private class SkillData {
protected int id, level, masterLevel; protected int id, level, masterLevel;
List<Integer> jobs = new ArrayList<>(); List<Integer> jobs = new ArrayList<>();
public SkillData(int id, int level, int masterLevel, List<Integer> jobs) { public SkillData(int id, int level, int masterLevel, List<Integer> jobs) {
this.id = id; this.id = id;
this.level = level; this.level = level;
this.masterLevel = masterLevel; this.masterLevel = masterLevel;
this.jobs = jobs; this.jobs = jobs;
} }
public int getId() { public int getId() {
return id; return id;
} }
public int getLevel() { public int getLevel() {
return level; return level;
} }
public int getMasterLevel() { public int getMasterLevel() {
return masterLevel; return masterLevel;
} }
public boolean jobsContains(Job job) { public boolean jobsContains(Job job) {
return jobs.contains(job.getId()); return jobs.contains(job.getId());
} }
} }
} }
@@ -26,25 +26,24 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class BuffExceptRequirement extends AbstractQuestRequirement { public class BuffExceptRequirement extends AbstractQuestRequirement {
private int buffId = -1; private int buffId = -1;
public BuffExceptRequirement(Quest quest, Data data) { public BuffExceptRequirement(Quest quest, Data data) {
super(QuestRequirementType.BUFF); super(QuestRequirementType.BUFF);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
// item buffs are negative // item buffs are negative
buffId = -1 * Integer.parseInt(DataTool.getString(data)); buffId = -1 * Integer.parseInt(DataTool.getString(data));
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return !chr.hasBuffFromSourceid(buffId); return !chr.hasBuffFromSourceid(buffId);
} }
} }
@@ -26,25 +26,24 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class BuffRequirement extends AbstractQuestRequirement { public class BuffRequirement extends AbstractQuestRequirement {
private int buffId = 1; private int buffId = 1;
public BuffRequirement(Quest quest, Data data) { public BuffRequirement(Quest quest, Data data) {
super(QuestRequirementType.BUFF); super(QuestRequirementType.BUFF);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
// item buffs are negative // item buffs are negative
buffId = -1 * Integer.parseInt(DataTool.getString(data)); buffId = -1 * Integer.parseInt(DataTool.getString(data));
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return chr.hasBuffFromSourceid(buffId); return chr.hasBuffFromSourceid(buffId);
} }
} }
@@ -28,26 +28,25 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class CompletedQuestRequirement extends AbstractQuestRequirement { public class CompletedQuestRequirement extends AbstractQuestRequirement {
private int reqQuest; private int reqQuest;
public CompletedQuestRequirement(Quest quest, Data data) { public CompletedQuestRequirement(Quest quest, Data data) {
super(QuestRequirementType.COMPLETED_QUEST); super(QuestRequirementType.COMPLETED_QUEST);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
reqQuest = DataTool.getInt(data); reqQuest = DataTool.getInt(data);
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return chr.getCompletedQuests().size() >= reqQuest; return chr.getCompletedQuests().size() >= reqQuest;
} }
} }
@@ -30,32 +30,30 @@ import server.quest.QuestRequirementType;
import java.util.Calendar; import java.util.Calendar;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class EndDateRequirement extends AbstractQuestRequirement { public class EndDateRequirement extends AbstractQuestRequirement {
private String timeStr; private String timeStr;
public EndDateRequirement(Quest quest, Data data) { public EndDateRequirement(Quest quest, Data data) {
super(QuestRequirementType.END_DATE); super(QuestRequirementType.END_DATE);
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { timeStr = DataTool.getString(data);
timeStr = DataTool.getString(data); }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { Calendar cal = Calendar.getInstance();
Calendar cal = Calendar.getInstance(); cal.set(Integer.parseInt(timeStr.substring(0, 4)), Integer.parseInt(timeStr.substring(4, 6)), Integer.parseInt(timeStr.substring(6, 8)), Integer.parseInt(timeStr.substring(8, 10)), 0);
cal.set(Integer.parseInt(timeStr.substring(0, 4)), Integer.parseInt(timeStr.substring(4, 6)), Integer.parseInt(timeStr.substring(6, 8)), Integer.parseInt(timeStr.substring(8, 10)), 0); return cal.getTimeInMillis() >= System.currentTimeMillis();
return cal.getTimeInMillis() >= System.currentTimeMillis(); }
}
} }
@@ -28,29 +28,28 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class FieldEnterRequirement extends AbstractQuestRequirement { public class FieldEnterRequirement extends AbstractQuestRequirement {
private int mapId = -1; private int mapId = -1;
public FieldEnterRequirement(Quest quest, Data data) { public FieldEnterRequirement(Quest quest, Data data) {
super(QuestRequirementType.FIELD_ENTER); super(QuestRequirementType.FIELD_ENTER);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
Data zeroField = data.getChildByPath("0"); Data zeroField = data.getChildByPath("0");
if (zeroField != null) { if (zeroField != null) {
mapId = DataTool.getInt(zeroField); mapId = DataTool.getInt(zeroField);
} }
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return mapId == chr.getMapId(); return mapId == chr.getMapId();
} }
} }
@@ -31,36 +31,35 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class InfoExRequirement extends AbstractQuestRequirement { public class InfoExRequirement extends AbstractQuestRequirement {
private List<String> infoExpected = new ArrayList<>(); private final List<String> infoExpected = new ArrayList<>();
private int questID; private final int questID;
public InfoExRequirement(Quest quest, Data data) { public InfoExRequirement(Quest quest, Data data) {
super(QuestRequirementType.INFO_EX); super(QuestRequirementType.INFO_EX);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
// Because we have to... // Because we have to...
for(Data infoEx : data.getChildren()) { for (Data infoEx : data.getChildren()) {
Data value = infoEx.getChildByPath("value"); Data value = infoEx.getChildByPath("value");
infoExpected.add(DataTool.getString(value, "")); infoExpected.add(DataTool.getString(value, ""));
}
}
@Override
public boolean check(Character chr, Integer npcid) {
return true;
}
public List<String> getInfo() {
return infoExpected;
} }
}
@Override
public boolean check(Character chr, Integer npcid) {
return true;
}
public List<String> getInfo() {
return infoExpected;
}
} }
@@ -26,32 +26,31 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class InfoNumberRequirement extends AbstractQuestRequirement { public class InfoNumberRequirement extends AbstractQuestRequirement {
private short infoNumber;
private int questID;
public InfoNumberRequirement(Quest quest, Data data) { private short infoNumber;
super(QuestRequirementType.INFO_NUMBER); private final int questID;
questID = quest.getId();
processData(data);
}
@Override public InfoNumberRequirement(Quest quest, Data data) {
public void processData(Data data) { super(QuestRequirementType.INFO_NUMBER);
infoNumber = (short) DataTool.getIntConvert(data, 0); questID = quest.getId();
} processData(data);
}
@Override
public void processData(Data data) {
infoNumber = (short) DataTool.getIntConvert(data, 0);
}
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return true; return true;
} }
public short getInfoNumber() { public short getInfoNumber() {
return infoNumber; return infoNumber;
} }
} }
@@ -29,69 +29,69 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class IntervalRequirement extends AbstractQuestRequirement { public class IntervalRequirement extends AbstractQuestRequirement {
private int interval = -1; private int interval = -1;
private int questID; private final int questID;
public IntervalRequirement(Quest quest, Data data) { public IntervalRequirement(Quest quest, Data data) {
super(QuestRequirementType.INTERVAL); super(QuestRequirementType.INTERVAL);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
public int getInterval() { public int getInterval() {
return interval; return interval;
}
@Override
public void processData(Data data) {
interval = DataTool.getInt(data) * 60 * 1000;
}
private static String getIntervalTimeLeft(Character chr, IntervalRequirement r) {
StringBuilder str = new StringBuilder();
long futureTime = chr.getQuest(Quest.getInstance(r.questID)).getCompletionTime() + r.getInterval();
long leftTime = futureTime - System.currentTimeMillis();
byte mode = 0;
if (leftTime / (60 * 1000) > 0) {
mode++; //counts minutes
if (leftTime / (60 * 60 * 1000) > 0) {
mode++; //counts hours
}
} }
@Override
public void processData(Data data) {
interval = DataTool.getInt(data) * 60 * 1000;
}
private static String getIntervalTimeLeft(Character chr, IntervalRequirement r) {
StringBuilder str = new StringBuilder();
long futureTime = chr.getQuest(Quest.getInstance(r.questID)).getCompletionTime() + r.getInterval(); switch (mode) {
long leftTime = futureTime - System.currentTimeMillis(); case 2:
int hours = (int) ((leftTime / (1000 * 60 * 60)));
str.append(hours + " hours, ");
byte mode = 0; case 1:
if(leftTime / (60*1000) > 0) { int minutes = (int) ((leftTime / (1000 * 60)) % 60);
mode++; //counts minutes str.append(minutes + " minutes, ");
if(leftTime / (60*60*1000) > 0) default:
mode++; //counts hours int seconds = (int) (leftTime / 1000) % 60;
} str.append(seconds + " seconds");
switch(mode) {
case 2:
int hours = (int) ((leftTime / (1000*60*60)));
str.append(hours + " hours, ");
case 1:
int minutes = (int) ((leftTime / (1000*60)) % 60);
str.append(minutes + " minutes, ");
default:
int seconds = (int) (leftTime / 1000) % 60 ;
str.append(seconds + " seconds");
}
return str.toString();
} }
@Override return str.toString();
public boolean check(Character chr, Integer npcid) { }
boolean check = !chr.getQuest(Quest.getInstance(questID)).getStatus().equals(QuestStatus.Status.COMPLETED);
boolean check2 = chr.getQuest(Quest.getInstance(questID)).getCompletionTime() <= System.currentTimeMillis() - interval; @Override
public boolean check(Character chr, Integer npcid) {
if (check || check2) { boolean check = !chr.getQuest(Quest.getInstance(questID)).getStatus().equals(QuestStatus.Status.COMPLETED);
return true; boolean check2 = chr.getQuest(Quest.getInstance(questID)).getCompletionTime() <= System.currentTimeMillis() - interval;
} else {
chr.message("This quest will become available again in approximately " + getIntervalTimeLeft(chr, this) + "."); if (check || check2) {
return false; return true;
} } else {
} chr.message("This quest will become available again in approximately " + getIntervalTimeLeft(chr, this) + ".");
return false;
}
}
} }
@@ -35,73 +35,72 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class ItemRequirement extends AbstractQuestRequirement { public class ItemRequirement extends AbstractQuestRequirement {
Map<Integer, Integer> items = new HashMap<>(); Map<Integer, Integer> items = new HashMap<>();
public ItemRequirement(Quest quest, Data data) { public ItemRequirement(Quest quest, Data data) {
super(QuestRequirementType.ITEM); super(QuestRequirementType.ITEM);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
for (Data itemEntry : data.getChildren()) { for (Data itemEntry : data.getChildren()) {
int itemId = DataTool.getInt(itemEntry.getChildByPath("id")); int itemId = DataTool.getInt(itemEntry.getChildByPath("id"));
int count = DataTool.getInt(itemEntry.getChildByPath("count"), 0); int count = DataTool.getInt(itemEntry.getChildByPath("count"), 0);
items.put(itemId, count); items.put(itemId, count);
} }
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
ItemInformationProvider ii = ItemInformationProvider.getInstance(); ItemInformationProvider ii = ItemInformationProvider.getInstance();
for(Integer itemId : items.keySet()) { for (Integer itemId : items.keySet()) {
int countNeeded = items.get(itemId); int countNeeded = items.get(itemId);
int count = 0; int count = 0;
InventoryType iType = ItemConstants.getInventoryType(itemId); InventoryType iType = ItemConstants.getInventoryType(itemId);
if (iType.equals(InventoryType.UNDEFINED)) { if (iType.equals(InventoryType.UNDEFINED)) {
return false; return false;
} }
for (Item item : chr.getInventory(iType).listById(itemId)) { for (Item item : chr.getInventory(iType).listById(itemId)) {
count += item.getQuantity(); count += item.getQuantity();
} }
//Weird stuff, nexon made some quests only available when wearing gm clothes. This enables us to accept it >< //Weird stuff, nexon made some quests only available when wearing gm clothes. This enables us to accept it ><
if (iType.equals(InventoryType.EQUIP) && !ItemConstants.isMedal(itemId)) { if (iType.equals(InventoryType.EQUIP) && !ItemConstants.isMedal(itemId)) {
if(chr.isGM()) { if (chr.isGM()) {
for (Item item : chr.getInventory(InventoryType.EQUIPPED).listById(itemId)) { for (Item item : chr.getInventory(InventoryType.EQUIPPED).listById(itemId)) {
count += item.getQuantity(); count += item.getQuantity();
} }
} else { } else {
if(count < countNeeded) { if (count < countNeeded) {
if(chr.getInventory(InventoryType.EQUIPPED).countById(itemId) + count >= countNeeded) { if (chr.getInventory(InventoryType.EQUIPPED).countById(itemId) + count >= countNeeded) {
chr.dropMessage(5, "Unequip the required " + ii.getName(itemId) + " before trying this quest operation."); chr.dropMessage(5, "Unequip the required " + ii.getName(itemId) + " before trying this quest operation.");
return false; return false;
} }
} }
}
}
if(count < countNeeded || countNeeded <= 0 && count > 0) {
return false;
}
}
return true;
}
public int getItemAmountNeeded(int itemid, boolean complete) {
Integer amount = items.get(itemid);
if (amount != null) {
return amount;
} else {
return complete ? Integer.MAX_VALUE : Integer.MIN_VALUE;
} }
} }
if (count < countNeeded || countNeeded <= 0 && count > 0) {
return false;
}
}
return true;
}
public int getItemAmountNeeded(int itemid, boolean complete) {
Integer amount = items.get(itemid);
if (amount != null) {
return amount;
} else {
return complete ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
}
} }
@@ -32,36 +32,34 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class JobRequirement extends AbstractQuestRequirement { public class JobRequirement extends AbstractQuestRequirement {
List<Integer> jobs = new ArrayList<>(); List<Integer> jobs = new ArrayList<>();
public JobRequirement(Quest quest, Data data) { public JobRequirement(Quest quest, Data data) {
super(QuestRequirementType.JOB); super(QuestRequirementType.JOB);
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { for (Data jobEntry : data.getChildren()) {
for (Data jobEntry : data.getChildren()) { jobs.add(DataTool.getInt(jobEntry));
jobs.add(DataTool.getInt(jobEntry)); }
} }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { for (Integer job : jobs) {
for(Integer job : jobs) { if (chr.getJob().equals(Job.getById(job)) || chr.isGM()) {
if (chr.getJob().equals(Job.getById(job)) || chr.isGM()) { return true;
return true; }
} }
} return false;
return false; }
}
} }
@@ -28,30 +28,28 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MaxLevelRequirement extends AbstractQuestRequirement { public class MaxLevelRequirement extends AbstractQuestRequirement {
private int maxLevel; private int maxLevel;
public MaxLevelRequirement(Quest quest, Data data) { public MaxLevelRequirement(Quest quest, Data data) {
super(QuestRequirementType.MAX_LEVEL); super(QuestRequirementType.MAX_LEVEL);
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { maxLevel = DataTool.getInt(data);
maxLevel = DataTool.getInt(data); }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { return maxLevel >= chr.getLevel();
return maxLevel >= chr.getLevel(); }
}
} }
@@ -26,30 +26,29 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class MesoRequirement extends AbstractQuestRequirement { public class MesoRequirement extends AbstractQuestRequirement {
private int meso = 0; private int meso = 0;
public MesoRequirement(Quest quest, Data data) { public MesoRequirement(Quest quest, Data data) {
super(QuestRequirementType.MESO); super(QuestRequirementType.MESO);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
meso = DataTool.getInt(data); meso = DataTool.getInt(data);
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
if (chr.getMeso() >= meso) { if (chr.getMeso() >= meso) {
return true; return true;
} else { } else {
chr.dropMessage(5, "You don't have enough mesos to complete this quest."); chr.dropMessage(5, "You don't have enough mesos to complete this quest.");
return false; return false;
} }
} }
} }
@@ -28,27 +28,26 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MinLevelRequirement extends AbstractQuestRequirement { public class MinLevelRequirement extends AbstractQuestRequirement {
private int minLevel; private int minLevel;
public MinLevelRequirement(Quest quest, Data data) { public MinLevelRequirement(Quest quest, Data data) {
super(QuestRequirementType.MIN_LEVEL); super(QuestRequirementType.MIN_LEVEL);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
minLevel = DataTool.getInt(data); minLevel = DataTool.getInt(data);
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return chr.getLevel() >= minLevel; return chr.getLevel() >= minLevel;
} }
} }
@@ -29,39 +29,40 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MinTamenessRequirement extends AbstractQuestRequirement { public class MinTamenessRequirement extends AbstractQuestRequirement {
private int minTameness; private int minTameness;
public MinTamenessRequirement(Quest quest, Data data) { public MinTamenessRequirement(Quest quest, Data data) {
super(QuestRequirementType.MIN_PET_TAMENESS); super(QuestRequirementType.MIN_PET_TAMENESS);
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { minTameness = DataTool.getInt(data);
minTameness = DataTool.getInt(data); }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { int curCloseness = 0;
int curCloseness = 0;
for (Pet pet : chr.getPets()) {
for(Pet pet : chr.getPets()) { if (pet == null) {
if(pet == null) continue; continue;
}
if(pet.getCloseness() > curCloseness)
curCloseness = pet.getCloseness(); if (pet.getCloseness() > curCloseness) {
} curCloseness = pet.getCloseness();
}
return curCloseness >= minTameness; }
}
return curCloseness >= minTameness;
}
} }
@@ -33,57 +33,56 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MobRequirement extends AbstractQuestRequirement { public class MobRequirement extends AbstractQuestRequirement {
Map<Integer, Integer> mobs = new HashMap<>(); Map<Integer, Integer> mobs = new HashMap<>();
private int questID; private final int questID;
public MobRequirement(Quest quest, Data data) { public MobRequirement(Quest quest, Data data) {
super(QuestRequirementType.MOB); super(QuestRequirementType.MOB);
questID = quest.getId(); questID = quest.getId();
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { for (Data questEntry : data.getChildren()) {
for (Data questEntry : data.getChildren()) { int mobID = DataTool.getInt(questEntry.getChildByPath("id"));
int mobID = DataTool.getInt(questEntry.getChildByPath("id")); int countReq = DataTool.getInt(questEntry.getChildByPath("count"));
int countReq = DataTool.getInt(questEntry.getChildByPath("count")); mobs.put(mobID, countReq);
mobs.put(mobID, countReq); }
} }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { QuestStatus status = chr.getQuest(Quest.getInstance(questID));
QuestStatus status = chr.getQuest(Quest.getInstance(questID)); for (Integer mobID : mobs.keySet()) {
for(Integer mobID : mobs.keySet()) { int countReq = mobs.get(mobID);
int countReq = mobs.get(mobID); int progress;
int progress;
try {
try { progress = Integer.parseInt(status.getProgress(mobID));
progress = Integer.parseInt(status.getProgress(mobID)); } catch (NumberFormatException ex) {
} catch (NumberFormatException ex) { FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, ex, "Mob: " + mobID + " Quest: " + questID + "CID: " + chr.getId() + " Progress: " + status.getProgress(mobID));
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, ex, "Mob: " + mobID + " Quest: " + questID + "CID: " + chr.getId() + " Progress: " + status.getProgress(mobID)); return false;
return false; }
}
if (progress < countReq) {
if(progress < countReq) return false;
return false; }
} }
return true; return true;
} }
public int getRequiredMobCount(int mobid) { public int getRequiredMobCount(int mobid) {
if(mobs.containsKey(mobid)) { if (mobs.containsKey(mobid)) {
return mobs.get(mobid); return mobs.get(mobid);
} }
return 0; return 0;
} }
} }
@@ -28,26 +28,25 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class MonsterBookCountRequirement extends AbstractQuestRequirement { public class MonsterBookCountRequirement extends AbstractQuestRequirement {
private int reqCards; private int reqCards;
public MonsterBookCountRequirement(Quest quest, Data data) { public MonsterBookCountRequirement(Quest quest, Data data) {
super(QuestRequirementType.MONSTER_BOOK); super(QuestRequirementType.MONSTER_BOOK);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
reqCards = DataTool.getInt(data); reqCards = DataTool.getInt(data);
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return chr.getMonsterBook().getTotalCards() >= reqCards; return chr.getMonsterBook().getTotalCards() >= reqCards;
} }
} }
@@ -28,29 +28,28 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class NpcRequirement extends AbstractQuestRequirement { public class NpcRequirement extends AbstractQuestRequirement {
private int reqNPC; private int reqNPC;
public NpcRequirement(Quest quest, Data data) { public NpcRequirement(Quest quest, Data data) {
super(QuestRequirementType.NPC); super(QuestRequirementType.NPC);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
reqNPC = DataTool.getInt(data); reqNPC = DataTool.getInt(data);
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return npcid != null && npcid == reqNPC; return npcid != null && npcid == reqNPC;
} }
public int get() { public int get() {
return reqNPC; return reqNPC;
} }
} }
@@ -32,36 +32,38 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class PetRequirement extends AbstractQuestRequirement { public class PetRequirement extends AbstractQuestRequirement {
List<Integer> petIDs = new ArrayList<>(); List<Integer> petIDs = new ArrayList<>();
public PetRequirement(Quest quest, Data data) { public PetRequirement(Quest quest, Data data) {
super(QuestRequirementType.PET); super(QuestRequirementType.PET);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
for(Data petData : data.getChildren()) { for (Data petData : data.getChildren()) {
petIDs.add(DataTool.getInt(petData.getChildByPath("id"))); petIDs.add(DataTool.getInt(petData.getChildByPath("id")));
} }
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
for(Pet pet : chr.getPets()) { for (Pet pet : chr.getPets()) {
if(pet == null) continue; // thanks Arufonsu for showing a NPE occurring here if (pet == null) {
continue; // thanks Arufonsu for showing a NPE occurring here
if(petIDs.contains(pet.getItemId())) }
return true;
} if (petIDs.contains(pet.getItemId())) {
return true;
return false; }
} }
return false;
}
} }
@@ -29,45 +29,44 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
*
* @author Tyler (Twdtwd) * @author Tyler (Twdtwd)
*/ */
public class QuestRequirement extends AbstractQuestRequirement { public class QuestRequirement extends AbstractQuestRequirement {
Map<Integer, Integer> quests = new HashMap<>(); Map<Integer, Integer> quests = new HashMap<>();
public QuestRequirement(Quest quest, Data data) { public QuestRequirement(Quest quest, Data data) {
super(QuestRequirementType.QUEST); super(QuestRequirementType.QUEST);
processData(data); processData(data);
} }
/** /**
* * @param data
* @param data */
*/ @Override
@Override public void processData(Data data) {
public void processData(Data data) { for (Data questEntry : data.getChildren()) {
for (Data questEntry : data.getChildren()) { int questID = DataTool.getInt(questEntry.getChildByPath("id"));
int questID = DataTool.getInt(questEntry.getChildByPath("id")); int stateReq = DataTool.getInt(questEntry.getChildByPath("state"));
int stateReq = DataTool.getInt(questEntry.getChildByPath("state")); quests.put(questID, stateReq);
quests.put(questID, stateReq); }
} }
}
@Override
@Override public boolean check(Character chr, Integer npcid) {
public boolean check(Character chr, Integer npcid) { for (Integer questID : quests.keySet()) {
for(Integer questID : quests.keySet()) { int stateReq = quests.get(questID);
int stateReq = quests.get(questID); QuestStatus qs = chr.getQuest(Quest.getInstance(questID));
QuestStatus qs = chr.getQuest(Quest.getInstance(questID));
if (qs == null && QuestStatus.Status.getById(stateReq).equals(QuestStatus.Status.NOT_STARTED)) {
if(qs == null && QuestStatus.Status.getById(stateReq).equals(QuestStatus.Status.NOT_STARTED)) continue;
continue; }
if(qs == null || !qs.getStatus().equals(QuestStatus.Status.getById(stateReq))) { if (qs == null || !qs.getStatus().equals(QuestStatus.Status.getById(stateReq))) {
return false; return false;
} }
} }
return true; return true;
} }
} }
@@ -26,28 +26,27 @@ import server.quest.Quest;
import server.quest.QuestRequirementType; import server.quest.QuestRequirementType;
/** /**
*
* @author Ronan * @author Ronan
*/ */
public class ScriptRequirement extends AbstractQuestRequirement { public class ScriptRequirement extends AbstractQuestRequirement {
private boolean reqScript; private boolean reqScript;
public ScriptRequirement(Quest quest, Data data) { public ScriptRequirement(Quest quest, Data data) {
super(QuestRequirementType.BUFF); super(QuestRequirementType.BUFF);
processData(data); processData(data);
} }
@Override @Override
public void processData(Data data) { public void processData(Data data) {
reqScript = !DataTool.getString(data, "").isEmpty(); reqScript = !DataTool.getString(data, "").isEmpty();
} }
@Override @Override
public boolean check(Character chr, Integer npcid) { public boolean check(Character chr, Integer npcid) {
return true; return true;
} }
public boolean get() { public boolean get() {
return reqScript; return reqScript;
} }
} }