Reformat and clean up "server" package
This commit is contained in:
@@ -48,10 +48,12 @@ import java.util.concurrent.locks.Lock;
|
||||
public class CashShop {
|
||||
public static class CashItem {
|
||||
|
||||
private int sn, itemId, price;
|
||||
private long period;
|
||||
private short count;
|
||||
private boolean onSale;
|
||||
private final int sn;
|
||||
private final int itemId;
|
||||
private final int price;
|
||||
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) {
|
||||
this.sn = sn;
|
||||
@@ -120,8 +122,9 @@ public class CashShop {
|
||||
}
|
||||
|
||||
public static class SpecialCashItem {
|
||||
private int sn, modifier;
|
||||
private byte info; //?
|
||||
private final int sn;
|
||||
private final int modifier;
|
||||
private final byte info; //?
|
||||
|
||||
public SpecialCashItem(int sn, int modifier, byte info) {
|
||||
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 ItemFactory factory;
|
||||
private List<Item> inventory = new ArrayList<>();
|
||||
private List<Integer> wishList = new ArrayList<>();
|
||||
private final List<Item> inventory = new ArrayList<>();
|
||||
private final List<Integer> wishList = new ArrayList<>();
|
||||
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 {
|
||||
this.accountId = accountId;
|
||||
|
||||
@@ -22,8 +22,9 @@
|
||||
package server;
|
||||
|
||||
import client.inventory.Item;
|
||||
import java.util.Calendar;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class DueyPackage {
|
||||
private String sender = null;
|
||||
@@ -61,11 +62,11 @@ public class DueyPackage {
|
||||
public void setMesos(int set) {
|
||||
mesos = set;
|
||||
}
|
||||
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
public void setMessage(String m) {
|
||||
message = m;
|
||||
}
|
||||
@@ -86,7 +87,7 @@ public class DueyPackage {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean isDeliveringTime() {
|
||||
Calendar ts = timestamp;
|
||||
if (ts != null) {
|
||||
@@ -99,13 +100,13 @@ public class DueyPackage {
|
||||
public void setSentTime(Timestamp ts, boolean quick) {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTimeInMillis(ts.getTime());
|
||||
|
||||
|
||||
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
|
||||
cal.add(Calendar.DATE, -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.timestamp = cal;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,18 +22,20 @@
|
||||
package server;
|
||||
|
||||
import client.inventory.Item;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Traitor
|
||||
*/
|
||||
public class MTSItemInfo {
|
||||
private int price;
|
||||
private Item item;
|
||||
private String seller;
|
||||
private int id;
|
||||
private int year, month, day = 1;
|
||||
private final int price;
|
||||
private final Item item;
|
||||
private final String seller;
|
||||
private final int id;
|
||||
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) {
|
||||
this.item = item;
|
||||
|
||||
@@ -31,33 +31,32 @@ import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Jay Estrella, Ronan
|
||||
*/
|
||||
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) {
|
||||
MakerItemCreateEntry makerEntry = ii.getMakerItemEntry(toCreate);
|
||||
if(makerEntry.isInvalid()) {
|
||||
if (makerEntry.isInvalid()) {
|
||||
return makerEntry;
|
||||
}
|
||||
|
||||
// THEY DECIDED FOR SOME BIZARRE PATTERN ON THE FEE THING, ALMOST RANDOMIZED.
|
||||
if(stimulantid != -1) {
|
||||
|
||||
// THEY DECIDED FOR SOME BIZARRE PATTERN ON THE FEE THING, ALMOST RANDOMIZED.
|
||||
if (stimulantid != -1) {
|
||||
makerEntry.addCost(getMakerStimulantFee(toCreate));
|
||||
}
|
||||
|
||||
if(!reagentids.isEmpty()) {
|
||||
for(Entry<Integer, Short> r : reagentids.entrySet()) {
|
||||
|
||||
if (!reagentids.isEmpty()) {
|
||||
for (Entry<Integer, Short> r : reagentids.entrySet()) {
|
||||
makerEntry.addCost((getMakerReagentFee(toCreate, ((r.getKey() % 10) + 1))) * r.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
makerEntry.trimCost(); // "commit" the real cost of the recipe.
|
||||
return makerEntry;
|
||||
}
|
||||
|
||||
|
||||
public static MakerItemCreateEntry generateLeftoverCrystalEntry(int fromLeftoverid, int crystalId) {
|
||||
MakerItemCreateEntry ret = new MakerItemCreateEntry(0, 0, 1);
|
||||
ret.addReqItem(fromLeftoverid, 100);
|
||||
@@ -73,13 +72,13 @@ public class MakerItemFactory {
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
int eqpLevel = ii.getEquipLevelReq(itemid);
|
||||
|
||||
switch(et) {
|
||||
switch (et) {
|
||||
case CAP:
|
||||
return 1145.736246 * Math.exp(0.03336832546 * eqpLevel);
|
||||
|
||||
@@ -108,13 +107,13 @@ public class MakerItemFactory {
|
||||
return 14000;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
int eqpLevel = ii.getEquipLevelReq(itemid);
|
||||
|
||||
switch(et) {
|
||||
switch (et) {
|
||||
case CAP:
|
||||
return 5592.01613 * Math.exp(0.02914576018 * eqpLevel) * reagentLevel;
|
||||
|
||||
@@ -143,20 +142,21 @@ public class MakerItemFactory {
|
||||
return 8000 * reagentLevel;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class MakerItemCreateEntry {
|
||||
private int reqLevel, reqMakerLevel;
|
||||
private final int reqLevel;
|
||||
private final int reqMakerLevel;
|
||||
private double cost;
|
||||
private int reqCost;
|
||||
private 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>> reqItems = new ArrayList<>(); // itemId / amount
|
||||
private final List<Pair<Integer, Integer>> gainItems = new ArrayList<>(); // itemId / amount
|
||||
|
||||
public MakerItemCreateEntry(int cost, int reqLevel, int reqMakerLevel) {
|
||||
this.cost = cost;
|
||||
this.reqLevel = reqLevel;
|
||||
this.reqMakerLevel = reqMakerLevel;
|
||||
}
|
||||
|
||||
|
||||
public MakerItemCreateEntry(MakerItemCreateEntry mi) {
|
||||
this.cost = mi.cost;
|
||||
this.reqLevel = mi.reqLevel;
|
||||
@@ -170,7 +170,7 @@ public class MakerItemFactory {
|
||||
public List<Pair<Integer, Integer>> getReqItems() {
|
||||
return reqItems;
|
||||
}
|
||||
|
||||
|
||||
public List<Pair<Integer, Integer>> getGainItems() {
|
||||
return gainItems;
|
||||
}
|
||||
@@ -186,7 +186,7 @@ public class MakerItemFactory {
|
||||
public int getCost() {
|
||||
return reqCost;
|
||||
}
|
||||
|
||||
|
||||
public void addCost(double amount) {
|
||||
cost += amount;
|
||||
}
|
||||
@@ -194,16 +194,16 @@ public class MakerItemFactory {
|
||||
protected void addReqItem(int itemId, int amount) {
|
||||
reqItems.add(new Pair<>(itemId, amount));
|
||||
}
|
||||
|
||||
|
||||
protected void addGainItem(int itemId, int amount) {
|
||||
gainItems.add(new Pair<>(itemId, amount));
|
||||
}
|
||||
|
||||
|
||||
public void trimCost() {
|
||||
reqCost = (int) (cost / 1000);
|
||||
reqCost *= 1000;
|
||||
}
|
||||
|
||||
|
||||
public boolean isInvalid() { // thanks Rohenn, Wh1SK3Y for noticing some items not getting checked properly
|
||||
return reqLevel < 0;
|
||||
}
|
||||
|
||||
@@ -1648,7 +1648,9 @@ public class StatEffect {
|
||||
private boolean isCureAllAbnormalStatus() {
|
||||
if (skill) {
|
||||
return isHerosWill(sourceid);
|
||||
} else return sourceid == 2022544;
|
||||
} else {
|
||||
return sourceid == 2022544;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isHerosWill(int skillid) {
|
||||
|
||||
@@ -22,20 +22,19 @@ package server;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class ThreadManager {
|
||||
private static ThreadManager instance = new ThreadManager();
|
||||
|
||||
private static final ThreadManager instance = new ThreadManager();
|
||||
|
||||
public static ThreadManager getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
private ThreadPoolExecutor tpe;
|
||||
|
||||
|
||||
private ThreadManager() {}
|
||||
|
||||
|
||||
private class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {
|
||||
|
||||
@Override
|
||||
@@ -45,23 +44,24 @@ public class ThreadManager {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void newTask(Runnable r) {
|
||||
tpe.execute(r);
|
||||
}
|
||||
|
||||
|
||||
public void start() {
|
||||
RejectedExecutionHandler reh = new RejectedExecutionHandlerImpl();
|
||||
ThreadFactory tf = Executors.defaultThreadFactory();
|
||||
|
||||
|
||||
tpe = new ThreadPoolExecutor(20, 1000, 77, TimeUnit.SECONDS, new ArrayBlockingQueue<>(50), tf, reh);
|
||||
}
|
||||
|
||||
|
||||
public void stop() {
|
||||
tpe.shutdown();
|
||||
try {
|
||||
tpe.awaitTermination(5, TimeUnit.MINUTES);
|
||||
} catch (InterruptedException ie) {}
|
||||
} catch (InterruptedException ie) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -34,12 +34,12 @@ import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class TimerManager implements TimerManagerMBean {
|
||||
private static TimerManager instance = new TimerManager();
|
||||
|
||||
private static final TimerManager instance = new TimerManager();
|
||||
|
||||
public static TimerManager getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
private ScheduledThreadPoolExecutor ses;
|
||||
|
||||
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?
|
||||
stpe.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
|
||||
stpe.setRemoveOnCancelPolicy(true);
|
||||
|
||||
|
||||
stpe.setKeepAliveTime(5, TimeUnit.MINUTES);
|
||||
stpe.allowCoreThreadTimeOut(true);
|
||||
|
||||
|
||||
ses = stpe;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
ses.shutdownNow();
|
||||
}
|
||||
|
||||
|
||||
public Runnable purge() {//Yay?
|
||||
return () -> {
|
||||
Server.getInstance().forceUpdateCurrentTime();
|
||||
ses.purge();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public ScheduledFuture<?> register(Runnable r, long repeatTime, long delay) {
|
||||
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) {
|
||||
return ses.schedule(new LoggingSaveRunnable(r), delay, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
|
||||
public ScheduledFuture<?> scheduleAtTimestamp(Runnable r, long timestamp) {
|
||||
return schedule(r, timestamp - System.currentTimeMillis());
|
||||
}
|
||||
@@ -118,7 +118,7 @@ public class TimerManager implements TimerManagerMBean {
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTaskCount() {
|
||||
public long getTaskCount() {
|
||||
return ses.getTaskCount();
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ public class TimerManager implements TimerManagerMBean {
|
||||
return ses.isTerminated();
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static class LoggingSaveRunnable implements Runnable {
|
||||
Runnable r;
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ package server.events;
|
||||
*/
|
||||
public abstract class Events {
|
||||
public Events() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public abstract int getInfo();
|
||||
}
|
||||
@@ -9,13 +9,12 @@ import client.Character;
|
||||
import client.SkillFactory;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author kevintjuh93
|
||||
*/
|
||||
public class RescueGaga extends Events {
|
||||
|
||||
|
||||
private int completed;
|
||||
|
||||
|
||||
public RescueGaga(int completed) {
|
||||
super();
|
||||
this.completed = completed;
|
||||
@@ -33,7 +32,7 @@ public class RescueGaga extends Events {
|
||||
public int getInfo() {
|
||||
return getCompleted();
|
||||
}
|
||||
|
||||
|
||||
public void giveSkill(Character chr) {
|
||||
int skillid = 0;
|
||||
switch (chr.getJobType()) {
|
||||
@@ -44,7 +43,7 @@ public class RescueGaga extends Events {
|
||||
case 2:
|
||||
skillid = 10001014;
|
||||
}
|
||||
|
||||
|
||||
long expiration = (System.currentTimeMillis() + 3600 * 24 * 20 * 1000);//20 days
|
||||
if (completed < 20) {
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,65 +1,64 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class ElNath extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
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,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2000004, 2000005,
|
||||
/* 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,
|
||||
|
||||
/* Common equipment */
|
||||
1402010, 1032003, 1442013, 1432009, 1302022, 1302029, 1322021, 1302026, 1442017, 1322023, 1102011, 1032008, 1322026,
|
||||
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,
|
||||
/* Useable drop */
|
||||
2000004, 2000005,
|
||||
|
||||
/* Warrior equipment */
|
||||
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,
|
||||
/* Common equipment */
|
||||
1402010, 1032003, 1442013, 1432009, 1302022, 1302029, 1322021, 1302026, 1442017, 1322023, 1102011, 1032008, 1322026,
|
||||
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,
|
||||
|
||||
/* Magician equipment */
|
||||
1382001, 1372007, 1382010, 1382007, 1372000, 1372003, 1382011, 1382006, 1382000,
|
||||
/* Warrior equipment */
|
||||
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 */
|
||||
1452004, 1452000, 1452010, 1452015, 1452014, 1462012, 1462010, 1452017, 1462000, 1452008, 1452006, 1462006, 1452007,
|
||||
1452002, 1402001,
|
||||
/* Magician equipment */
|
||||
1382001, 1372007, 1382010, 1382007, 1372000, 1372003, 1382011, 1382006, 1382000,
|
||||
|
||||
/* Thief equipment */
|
||||
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,
|
||||
/* Bowman equipment */
|
||||
1452004, 1452000, 1452010, 1452015, 1452014, 1462012, 1462010, 1452017, 1462000, 1452008, 1452006, 1462006, 1452007,
|
||||
1452002, 1402001,
|
||||
|
||||
/* Pirate equipment */
|
||||
1072294, 1492009
|
||||
/* Thief equipment */
|
||||
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
|
||||
public int[] getRareItems() {
|
||||
return new int [] {2043803, 1102085};
|
||||
}
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{2022439, 2040804, 2040805, 2340000};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{2043803, 1102085};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class Ellinia extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[] {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Scroll */
|
||||
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,
|
||||
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,
|
||||
|
||||
|
||||
/* Pirate equipment */
|
||||
1002625, 1002616, 1482005, 1052098, 1482003,
|
||||
1482001, 1492004, 1002622, 1492005, 1082195
|
||||
};
|
||||
}
|
||||
1002625, 1002616, 1482005, 1052098, 1482003,
|
||||
1482001, 1492004, 1002622, 1492005, 1082195
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {1082149, 1002391, 1002419};
|
||||
}
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{1082149, 1002391, 1002419};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int [] {};
|
||||
}
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,35 +23,34 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX)
|
||||
*/
|
||||
* @author Alan (SharpAceX)
|
||||
*/
|
||||
|
||||
public abstract class GachaponItems {
|
||||
|
||||
public abstract int [] getCommonItems();
|
||||
public abstract int [] getUncommonItems();
|
||||
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 abstract int[] getCommonItems();
|
||||
public abstract int[] getUncommonItems();
|
||||
public abstract int[] getRareItems();
|
||||
|
||||
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;
|
||||
}
|
||||
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) {
|
||||
if (tier == 0) {
|
||||
return commonItems;
|
||||
} else if (tier == 1) {
|
||||
return uncommonItems;
|
||||
} else if (tier == 2) {
|
||||
return rareItems;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,47 +1,46 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX)
|
||||
* @author Ronan - added ores and reworked global loots
|
||||
*/
|
||||
* @author Alan (SharpAceX)
|
||||
* @author Ronan - added ores and reworked global loots
|
||||
*/
|
||||
|
||||
public class Global extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[] {
|
||||
/* Potions */
|
||||
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
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
/* Potions */
|
||||
2000004, 2000005, 2001002, 2001001, 2020012, 2020013, 2020014, 2020015,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[] {
|
||||
/* Potions */
|
||||
2022179, 2022273, 2022282, 2022283, 2022285, 2022245, 2022182,
|
||||
|
||||
/* Scrolls */
|
||||
2049003
|
||||
};
|
||||
}
|
||||
/* 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
|
||||
public int[] getRareItems() {
|
||||
return new int[] {
|
||||
/* Scrolls */
|
||||
2049100, 2340000,
|
||||
|
||||
/* Chairs */
|
||||
3010063, 3010064
|
||||
};
|
||||
}
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{
|
||||
/* Potions */
|
||||
2022179, 2022273, 2022282, 2022283, 2022285, 2022245, 2022182,
|
||||
|
||||
/* Scrolls */
|
||||
2049003
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{
|
||||
/* Scrolls */
|
||||
2049100, 2340000,
|
||||
|
||||
/* Chairs */
|
||||
3010063, 3010064
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,61 +1,60 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class Henesys extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int [] {
|
||||
|
||||
/* Scroll */
|
||||
2040001, 2041002, 2040702, 2043802, 2040402, 2043702, 2044813,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable Drops */
|
||||
2000004, 2000005, 2020012, 2030007,
|
||||
/* Scroll */
|
||||
2040001, 2041002, 2040702, 2043802, 2040402, 2043702, 2044813,
|
||||
|
||||
/* Common equipment */
|
||||
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,
|
||||
/* Useable Drops */
|
||||
2000004, 2000005, 2020012, 2030007,
|
||||
|
||||
/* Warrior equipment */
|
||||
1092011, 1092014, 1302003, 1432001, 1312011, 1002088, 1041020, 1322015, 1442004, 1422008, 1302056, 1432000, 1442005,
|
||||
/* Common equipment */
|
||||
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 */
|
||||
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,
|
||||
/* Warrior equipment */
|
||||
1092011, 1092014, 1302003, 1432001, 1312011, 1002088, 1041020, 1322015, 1442004, 1422008, 1302056, 1432000, 1442005,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452004, 1452023, 1060057, 1432001, 1040071, 1002137, 1462009, 1452017, 1040025, 1041027, 1452005, 1452007, 1061057,
|
||||
/* Magician equipment */
|
||||
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 */
|
||||
1472006, 1472019, 1060084, 1472028, 1472004, 1002179, 1082074, 1472029, 1040100, 1332015, 1432001, 1040097, 1060071,
|
||||
1472007, 1472002, 1051009, 1041044, 1041003, 1332016, 1472020, 1332003,
|
||||
|
||||
/* Pirate equipment */
|
||||
1002622, 1082204, 1082213, 1082198, 1002631, 1052122, 1482012, 1052131, 1482007, 1482004, 1072318, 1492007
|
||||
/* Bowman equipment */
|
||||
1452004, 1452023, 1060057, 1432001, 1040071, 1002137, 1462009, 1452017, 1040025, 1041027, 1452005, 1452007, 1061057,
|
||||
|
||||
};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1472006, 1472019, 1060084, 1472028, 1472004, 1002179, 1082074, 1472029, 1040100, 1332015, 1432001, 1040097, 1060071,
|
||||
1472007, 1472002, 1051009, 1041044, 1041003, 1332016, 1472020, 1332003,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[] {2040805, 1102041, 1102042, 1442018};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1002622, 1082204, 1082213, 1082198, 1002631, 1052122, 1482012, 1052131, 1482007, 1482004, 1072318, 1492007
|
||||
|
||||
@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[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,59 +1,58 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class KerningCity extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int [] {
|
||||
|
||||
/* Scroll */
|
||||
2041016, 2043302, 2040902, 2044804, 2044906,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2000004, 2000005, 2022025, 2022027,
|
||||
/* Scroll */
|
||||
2041016, 2043302, 2040902, 2044804, 2044906,
|
||||
|
||||
/* Common equipment */
|
||||
1442013, 1432009, 1322021, 1050018, 1002392, 1002394, 1442004, 1372002, 1002418, 1002033, 1092008,
|
||||
1082148, 1062001, 1302017, 1032023, 1102013, 1102040, 1002041, 1002097,
|
||||
/* Useable drop */
|
||||
2000004, 2000005, 2022025, 2022027,
|
||||
|
||||
/* Warrior equipment */
|
||||
1332026, 1051010, 1432001, 1422005, 1332019, 1302010, 1002056, 1060011, 1322011, 1432004, 1002028,
|
||||
1051000, 1442007, 1302002,
|
||||
/* Common equipment */
|
||||
1442013, 1432009, 1322021, 1050018, 1002392, 1002394, 1442004, 1372002, 1002418, 1002033, 1092008,
|
||||
1082148, 1062001, 1302017, 1032023, 1102013, 1102040, 1002041, 1002097,
|
||||
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1082020, 1050039, 1372000, 1002215, 1051034, 1040019, 1061034, 1382003, 1382006,
|
||||
1050025,
|
||||
/* Warrior equipment */
|
||||
1332026, 1051010, 1432001, 1422005, 1332019, 1302010, 1002056, 1060011, 1322011, 1432004, 1002028,
|
||||
1051000, 1442007, 1302002,
|
||||
|
||||
/* Bowman equipment */
|
||||
1002118, 1061081, 1452011, 1462012, 1452006, 1452007,
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1082020, 1050039, 1372000, 1002215, 1051034, 1040019, 1061034, 1382003, 1382006,
|
||||
1050025,
|
||||
|
||||
/* Thief equipment */
|
||||
1472010, 1472029, 1041048, 1041095, 1060031, 1061033, 1041049, 1472011, 1040096, 1472033, 1332026,
|
||||
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
|
||||
};
|
||||
}
|
||||
/* Bowman equipment */
|
||||
1002118, 1061081, 1452011, 1462012, 1452006, 1452007,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[] {2040805, 1082149, 1102041};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1472010, 1472029, 1041048, 1041095, 1060031, 1061033, 1041049, 1472011, 1040096, 1472033, 1332026,
|
||||
1051006, 1082074, 1472025, 1061106, 1040084, 1332015, 1472000, 1332019, 1002183, 1002209, 1092020,
|
||||
1332029, 1092019, 1061099, 1060106, 1040032, 1040059, 1332003, 1040060, 1060046, 1472005, 1332027,
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[] {};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1082192, 1072288, 1492003, 1052113, 1052104,
|
||||
1492002, 1052095, 1492001, 1002613, 1492004
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{2040805, 1082149, 1102041};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,56 +1,55 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class Ludibrium extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
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,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2000004, 2000005, 4006000, 4006001,
|
||||
/* 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,
|
||||
|
||||
/* Common equipment */
|
||||
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,
|
||||
/* Useable drop */
|
||||
2000004, 2000005, 4006000, 4006001,
|
||||
|
||||
/* Beginner equipment */
|
||||
1332021, 1422011,
|
||||
/* Common equipment */
|
||||
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 */
|
||||
1402017, 1422005, 1002023, 1332016, 1432005,
|
||||
/* Beginner equipment */
|
||||
1332021, 1422011,
|
||||
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1002064, 1002038, 1002013, 1002036, 1382011, 1002035, 1002065, 1382014, 1372001,
|
||||
/* Warrior equipment */
|
||||
1402017, 1422005, 1002023, 1332016, 1432005,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452026, 1002162, 1002164, 1462018, 1002165, 1452014, 1002163, 1452012, 1002161, 1452009, 1462007,
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1002064, 1002038, 1002013, 1002036, 1382011, 1002035, 1002065, 1382014, 1372001,
|
||||
|
||||
/* Thief Equipment */
|
||||
1332022, 1002175, 1002172, 1002174, 1040096, 1472033, 1002173, 1332054, 1472054, 1002171, 1332016,
|
||||
/* Bowman equipment */
|
||||
1452026, 1002162, 1002164, 1462018, 1002165, 1452014, 1002163, 1452012, 1002161, 1452009, 1462007,
|
||||
|
||||
/* Pirate equipment */
|
||||
1002646
|
||||
|
||||
};
|
||||
}
|
||||
/* Thief Equipment */
|
||||
1332022, 1002175, 1002172, 1002174, 1040096, 1472033, 1002173, 1332054, 1472054, 1002171, 1332016,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {2040805, 1002419, 1442018};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1002646
|
||||
|
||||
@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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class MushroomShrine extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
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,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Common equipment */
|
||||
1102040, 1002392, 1432009, 1002393, 1002394, 1082147, 1082148, 1032028, 1002585, 1002586, 1432013, 1022047, 1322027,
|
||||
1012056, 1432018,
|
||||
/* 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,
|
||||
|
||||
/* Beginner equipment */
|
||||
1072264, 1072262, 1072263,
|
||||
/* Common equipment */
|
||||
1102040, 1002392, 1432009, 1002393, 1002394, 1082147, 1082148, 1032028, 1002585, 1002586, 1432013, 1022047, 1322027,
|
||||
1012056, 1432018,
|
||||
|
||||
/* Warrior equipment */
|
||||
1060074, 1322002, 1002340, 1442004, 1402037, 1422008, 1050022,
|
||||
/* Beginner equipment */
|
||||
1072264, 1072262, 1072263,
|
||||
|
||||
/* Mage equipment */
|
||||
1382037, 1060014, 1051026, 1050056, 1050029, 1051030, 1382036, 1372032, 1041015, 1382015, 1372008, 1382008,
|
||||
/* Warrior equipment */
|
||||
1060074, 1322002, 1002340, 1442004, 1402037, 1422008, 1050022,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452018, 1041068, 1462007,
|
||||
/* Mage equipment */
|
||||
1382037, 1060014, 1051026, 1050056, 1050029, 1051030, 1382036, 1372032, 1041015, 1382015, 1372008, 1382008,
|
||||
|
||||
/* Thief equipment */
|
||||
1060052, 1472013, 1002180, 1002170, 1060073, 1060099,
|
||||
|
||||
/* Pirate equipment */
|
||||
1492004, 1492012, 1482009, 1072303, 1002637, 1052107, 1082189, 1052116, 1072309
|
||||
/* Bowman equipment */
|
||||
1452018, 1041068, 1462007,
|
||||
|
||||
};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1060052, 1472013, 1002180, 1002170, 1060073, 1060099,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {2040811, 2040810, 2040815, 1102041, 1102042, 1082149};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1492004, 1492012, 1482009, 1072303, 1002637, 1052107, 1082189, 1052116, 1072309
|
||||
|
||||
@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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate items
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate items
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class NautilusHarbor extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[] {
|
||||
/* Scroll */
|
||||
2040605, 2040626, 2040609, 2040607, 2041029, 2041027, 2041031, 2041037, 2041033, 2041039, 2041041, 2041035,
|
||||
2040809, 2040813, 2040015, 2040009, 2040011, 2040013, 2040509, 2040521, 2040519, 2040507, 2040905, 2040909,
|
||||
2040907, 2040713, 2040715, 2040717, 2040405, 2040409, 2040407, 2040426, 2040303, 2040307, 2040309, 2044505,
|
||||
2044705, 2044605, 2043305, 2043105, 2043205, 2043005, 2043007, 2044405, 2044305, 2043805, 2044105, 2044205,
|
||||
2044005, 2043705, 2044901,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
/* Scroll */
|
||||
2040605, 2040626, 2040609, 2040607, 2041029, 2041027, 2041031, 2041037, 2041033, 2041039, 2041041, 2041035,
|
||||
2040809, 2040813, 2040015, 2040009, 2040011, 2040013, 2040509, 2040521, 2040519, 2040507, 2040905, 2040909,
|
||||
2040907, 2040713, 2040715, 2040717, 2040405, 2040409, 2040407, 2040426, 2040303, 2040307, 2040309, 2044505,
|
||||
2044705, 2044605, 2043305, 2043105, 2043205, 2043005, 2043007, 2044405, 2044305, 2043805, 2044105, 2044205,
|
||||
2044005, 2043705, 2044901,
|
||||
|
||||
/* Useable drop */
|
||||
2012000, 2000004, 2020008, 2000005, 2012002, 2101004, 2101005, 2101002, 2101003, 4006000,
|
||||
/* Useable drop */
|
||||
2012000, 2000004, 2020008, 2000005, 2012002, 2101004, 2101005, 2101002, 2101003, 4006000,
|
||||
|
||||
/* Warrior equipment */
|
||||
1092014, 1402017,
|
||||
/* Warrior equipment */
|
||||
1092014, 1402017,
|
||||
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1002064, 1002038, 1382037, 1372000, 1002013, 1002035, 1002065, 1382000,
|
||||
/* Magician equipment */
|
||||
1002037, 1002034, 1002064, 1002038, 1382037, 1372000, 1002013, 1002035, 1002065, 1382000,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452018,
|
||||
/* Bowman equipment */
|
||||
1452018,
|
||||
|
||||
/* Thief equipment */
|
||||
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
|
||||
};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1472010, 1002175, 1472017, 1472025,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[] {2040811, 2040815, 2101001};
|
||||
}
|
||||
/* 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,
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[] {};
|
||||
}
|
||||
/* Knuckler Scrolls */
|
||||
2044800, 2044801, 2044802, 2044803, 2044804, 2044805, 2044806, 2044807, 2044808, 2044809,
|
||||
|
||||
/* Gun Scrolls */
|
||||
2044900, 2044901, 2044902, 2044903, 2044904
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{2040811, 2040815, 2101001};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,55 +1,54 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots, thanks Vcoc for noticing somewhat unbalanced loots in NLC
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @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/
|
||||
*/
|
||||
|
||||
public class NewLeafCity extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
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,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Common equipment */
|
||||
1102040, 1102086, 1082145, 1032027, 1082146, 1002395, 1002083, 1002392, 1002587, 1022047,
|
||||
/* 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,
|
||||
|
||||
/* Warrior equipment */
|
||||
1312002, 1432013, 1060030, 1422008, 1050022, 1050011, 1402013, 1402017, 1302012,
|
||||
/* Common equipment */
|
||||
1102040, 1102086, 1082145, 1032027, 1082146, 1002395, 1002083, 1002392, 1002587, 1022047,
|
||||
|
||||
/* Mage equipment */
|
||||
1002074, 1050029, 1040093, 1050056, 1050039, 1382008,
|
||||
/* Warrior equipment */
|
||||
1312002, 1432013, 1060030, 1422008, 1050022, 1050011, 1402013, 1402017, 1302012,
|
||||
|
||||
/* Bowman equipment */
|
||||
1002159, 1061051, 1040023,
|
||||
/* Mage equipment */
|
||||
1002074, 1050029, 1040093, 1050056, 1050039, 1382008,
|
||||
|
||||
/* Thief equipment */
|
||||
1061054, 1061106, 1002249, 1040084, 1060052, 1472054,
|
||||
|
||||
/* Pirate equipment */
|
||||
1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207, 1082210, 1082213,
|
||||
1482010, 1482011, 1002640, 1482012, 1492010, 1492011, 1492012
|
||||
};
|
||||
}
|
||||
/* Bowman equipment */
|
||||
1002159, 1061051, 1040023,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[] {2022284, 2040811, 2040815, 2040811, 1102041, 1102042, 1082149};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1061054, 1061106, 1002249, 1040084, 1060052, 1472054,
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[] {};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1002640, 1002643, 1002646, 1052125, 1052128, 1052131, 1072312, 1072315, 1072318, 1082207, 1082210, 1082213,
|
||||
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[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,57 +1,56 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class Perion extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int [] {
|
||||
|
||||
/* Scrolls */
|
||||
2044907, 2044802,
|
||||
|
||||
/* Useable drop */
|
||||
2000004, 2000005,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Common equipment */
|
||||
1402010, 1302022, 1002060, 1322021, 1082147, 1002006, 1002026, 1002392, 1322025, 1322027, 1102000, 1082150,
|
||||
1332020, 1322007, 1302021, 1002395, 1082148, 1322012, 1302017, 1322010, 1032000, 1102013, 1002097,
|
||||
/* Scrolls */
|
||||
2044907, 2044802,
|
||||
|
||||
/* Warrior equipment */
|
||||
1322020, 1312007, 1312008, 1302004, 1312006, 1082036, 1082117, 1061088, 1302008, 1422005, 1002048, 1061087,
|
||||
1302018, 1322017, 1422001, 1040103, 1060077, 1002022, 1002050, 1442000, 1432030, 1402037, 1092002, 1041092,
|
||||
1050006, 1432004, 1061019, 1432000, 1060009, 1051000, 1002021, 1322014, 1432005,
|
||||
/* Useable drop */
|
||||
2000004, 2000005,
|
||||
|
||||
/* Magician equipment */
|
||||
1051032, 1040018, 1051027, 1372007, 1050049, 1002036, 1382012, 1002217, 1051033, 1382006, 1050048,
|
||||
/* Common equipment */
|
||||
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 */
|
||||
1061061, 1060062, 1040075, 1462013, 1041065, 1452006,
|
||||
|
||||
/* Thief equipment */
|
||||
1040095, 1060084, 1002182, 1041049, 1002247, 1332024, 1332009, 1060024, 1332015, 1041060, 1061032, 1041074,
|
||||
1041003, 1332016, 1472020, 1332003, 1041059,
|
||||
/* Warrior equipment */
|
||||
1322020, 1312007, 1312008, 1302004, 1312006, 1082036, 1082117, 1061088, 1302008, 1422005, 1002048, 1061087,
|
||||
1302018, 1322017, 1422001, 1040103, 1060077, 1002022, 1002050, 1442000, 1432030, 1402037, 1092002, 1041092,
|
||||
1050006, 1432004, 1061019, 1432000, 1060009, 1051000, 1002021, 1322014, 1432005,
|
||||
|
||||
/* Pirate equipment */
|
||||
1482001, 1492002, 1052113, 1002616, 1072294, 1492004, 1482006, 1082192, 1082189, 1082195
|
||||
};
|
||||
}
|
||||
/* Magician equipment */
|
||||
1051032, 1040018, 1051027, 1372007, 1050049, 1002036, 1382012, 1002217, 1051033, 1382006, 1050048,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {1082149, 1002391, 1002419, 1102041};
|
||||
}
|
||||
/* Bowman equipment */
|
||||
1061061, 1060062, 1040075, 1462013, 1041065, 1452006,
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int [] {};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1040095, 1060084, 1002182, 1041049, 1002247, 1332024, 1332009, 1060024, 1332015, 1041060, 1061032, 1041074,
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/06/gachapon-showa-towns-sauna-female-spa.html
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/06/gachapon-showa-towns-sauna-female-spa.html
|
||||
*/
|
||||
|
||||
public class ShowaSpaFemale extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int [] {
|
||||
|
||||
/* Scroll */
|
||||
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2041309,
|
||||
2044010, 2044803, 2044814, 2044904, 2044902, 2044901,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2022016, 2000005, 2022025, 2022027,
|
||||
/* Scroll */
|
||||
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2041309,
|
||||
2044010, 2044803, 2044814, 2044904, 2044902, 2044901,
|
||||
|
||||
/* Common equipment */
|
||||
1402000, 1402013, 1002418, 1022047, 1082145, 1082147, 1082146, 1082178, 1082175,
|
||||
/* Useable drop */
|
||||
2022016, 2000005, 2022025, 2022027,
|
||||
|
||||
/* Common setup */
|
||||
3010073, 3010099,
|
||||
/* Common equipment */
|
||||
1402000, 1402013, 1002418, 1022047, 1082145, 1082147, 1082146, 1082178, 1082175,
|
||||
|
||||
/* Warrior equipment */
|
||||
1422013, 1432030,
|
||||
/* Common setup */
|
||||
3010073, 3010099,
|
||||
|
||||
/* Magician equipment */
|
||||
1372002, 1382003,
|
||||
/* Warrior equipment */
|
||||
1422013, 1432030,
|
||||
|
||||
/* Bowman equipment */
|
||||
1040023,
|
||||
/* Magician equipment */
|
||||
1372002, 1382003,
|
||||
|
||||
/* Thief equipment */
|
||||
1332003, 1002209,
|
||||
/* Bowman equipment */
|
||||
1040023,
|
||||
|
||||
/* Pirate equipment */
|
||||
1082198, 1082213, 1482007, 1492004, 1002646
|
||||
|
||||
};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1332003, 1002209,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {2040916, 1102042};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1082198, 1082213, 1482007, 1492004, 1002646
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int [] {};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{2040916, 1102042};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,60 +1,59 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/05/gachapon-showa-towns-sauna.html
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots src: http://maplesecrets.blogspot.com/2011/05/gachapon-showa-towns-sauna.html
|
||||
*/
|
||||
|
||||
public class ShowaSpaMale extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int [] {
|
||||
|
||||
/* Scroll */
|
||||
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2044902,
|
||||
2044901, 2044811, 2044903, 2044804,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2022016, 2000005, 2022025, 2022027,
|
||||
/* Scroll */
|
||||
2048005, 2048002, 2043202, 2044602, 2043214, 2041307, 2041035, 2044104, 2044505, 2044305, 2043304, 2044902,
|
||||
2044901, 2044811, 2044903, 2044804,
|
||||
|
||||
/* Common equipment */
|
||||
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,
|
||||
/* Useable drop */
|
||||
2022016, 2000005, 2022025, 2022027,
|
||||
|
||||
/* Common setup */
|
||||
3010073, 3010111,
|
||||
/* Common equipment */
|
||||
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 */
|
||||
1412005, 1402048, 1402049, 1322011, 1302003, 1302004, 1302008,
|
||||
/* Common setup */
|
||||
3010073, 3010111,
|
||||
|
||||
/* Magician equipment */
|
||||
1372000, 1372009, 1372001, 1372011, 1382006, 1382014,
|
||||
/* Warrior equipment */
|
||||
1412005, 1402048, 1402049, 1322011, 1302003, 1302004, 1302008,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452018, 1452006, 1452008, 1452005, 1462002, 1462007, 1462003, 1002169,
|
||||
/* Magician equipment */
|
||||
1372000, 1372009, 1372001, 1372011, 1382006, 1382014,
|
||||
|
||||
/* Thief equipment */
|
||||
1472023, 1332012, 1332017, 1332022, 1332006, 1332029, 1040097,
|
||||
/* Bowman equipment */
|
||||
1452018, 1452006, 1452008, 1452005, 1462002, 1462007, 1462003, 1002169,
|
||||
|
||||
/* Pirate equipment */
|
||||
1052107, 1082204, 1072318, 1002637, 1482009, 1492007
|
||||
|
||||
};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1472023, 1332012, 1332017, 1332022, 1332006, 1332029, 1040097,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {2040916, 1102042};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1052107, 1082204, 1072318, 1002637, 1482009, 1492007
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int [] {};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int[]{2040916, 1102042};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,59 +1,58 @@
|
||||
package server.gachapon;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
*
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
* @author Alan (SharpAceX) - gachapon source classes stub & pirate equipment
|
||||
* @author Ronan - parsed MapleSEA loots
|
||||
* <p>
|
||||
* MapleSEA-like loots thanks to AyumiLove - src: https://ayumilovemaple.wordpress.com/maplestory-gachapon-guide/
|
||||
*/
|
||||
|
||||
public class Sleepywood extends GachaponItems {
|
||||
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
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,
|
||||
@Override
|
||||
public int[] getCommonItems() {
|
||||
return new int[]{
|
||||
|
||||
/* Useable drop */
|
||||
2012000, 2012003, 2020007, 2000004, 2012001, 2020008, 2070006, 2020012, 2000005, 2030007, 2012002, 2002001, 2070005,
|
||||
/* 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,
|
||||
|
||||
/* Common equipment */
|
||||
1032003, 1432009, 1102014, 1102018, 1002392, 1322026, 1032022, 1312012, 1332020, 1092030, 1032016, 1032015, 1032014,
|
||||
1322024, 1032013, 1322022, 1102016, 1032012, 1032023, 1402014, 1032000, 1102017,
|
||||
/* Useable drop */
|
||||
2012000, 2012003, 2020007, 2000004, 2012001, 2020008, 2070006, 2020012, 2000005, 2030007, 2012002, 2002001, 2070005,
|
||||
|
||||
/* Warrior equipment */
|
||||
1402017, 1051010, 1432011, 1442006, 1322002, 1422004, 1432010, 1051011, 1060018, 1432000, 1422003, 1412003, 1422000,
|
||||
/* Common equipment */
|
||||
1032003, 1432009, 1102014, 1102018, 1002392, 1322026, 1032022, 1312012, 1332020, 1092030, 1032016, 1032015, 1032014,
|
||||
1322024, 1032013, 1322022, 1102016, 1032012, 1032023, 1402014, 1032000, 1102017,
|
||||
|
||||
/* Magician equipment */
|
||||
1002034, 1002142, 1382010, 1002013, 1382008, 1382011, 1050047, 1002065,
|
||||
/* Warrior equipment */
|
||||
1402017, 1051010, 1432011, 1442006, 1322002, 1422004, 1432010, 1051011, 1060018, 1432000, 1422003, 1412003, 1422000,
|
||||
|
||||
/* Bowman equipment */
|
||||
1452003, 1002165, 1040068, 1462013, 1462011, 1462012, 1061050, 1462010, 1002161,
|
||||
/* Magician equipment */
|
||||
1002034, 1002142, 1382010, 1002013, 1382008, 1382011, 1050047, 1002065,
|
||||
|
||||
/* Thief equipment */
|
||||
1332022, 1002175, 1040042, 1472004, 1040057, 1332031, 1332023, 1332010, 1002171, 1060046,
|
||||
|
||||
/* Pirate equipment */
|
||||
1002631, 1002634, 1002637, 1052116, 1052119, 1052122, 1072303, 1072306, 1072309, 1082198, 1082201, 1082204, 1482007,
|
||||
1482008, 1482009
|
||||
};
|
||||
}
|
||||
/* Bowman equipment */
|
||||
1452003, 1002165, 1040068, 1462013, 1462011, 1462012, 1061050, 1462010, 1002161,
|
||||
|
||||
@Override
|
||||
public int[] getUncommonItems() {
|
||||
return new int [] {2040804, 2040817, 2040805, 2340000, 1082149, 1442018};
|
||||
}
|
||||
/* Thief equipment */
|
||||
1332022, 1002175, 1040042, 1472004, 1040057, 1332031, 1332023, 1332010, 1002171, 1060046,
|
||||
|
||||
@Override
|
||||
public int[] getRareItems() {
|
||||
return new int [] {};
|
||||
}
|
||||
/* Pirate equipment */
|
||||
1002631, 1002634, 1002637, 1052116, 1052119, 1052122, 1072303, 1072306, 1072309, 1082198, 1082201, 1082204, 1482007,
|
||||
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) {
|
||||
this(stats, (int)(statModifier * stats.getLevel()), pqMob);
|
||||
this(stats, (int) (statModifier * stats.getLevel()), pqMob);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,21 +24,22 @@ package server.life;
|
||||
public enum Element {
|
||||
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 Element(int v) {
|
||||
this.value = v;
|
||||
|
||||
Element(int v) {
|
||||
this.value = v;
|
||||
}
|
||||
|
||||
private Element(int v, boolean special) {
|
||||
this.value = v;
|
||||
this.special = special;
|
||||
Element(int v, boolean special) {
|
||||
this.value = v;
|
||||
this.special = special;
|
||||
}
|
||||
|
||||
public boolean isSpecial() {
|
||||
return special;
|
||||
return special;
|
||||
}
|
||||
|
||||
|
||||
public static Element getFromChar(char c) {
|
||||
switch (Character.toUpperCase(c)) {
|
||||
case 'F':
|
||||
@@ -52,14 +53,14 @@ public enum Element {
|
||||
case 'H':
|
||||
return HOLY;
|
||||
case 'D':
|
||||
return DARKNESS;
|
||||
return DARKNESS;
|
||||
case 'P':
|
||||
return NEUTRAL;
|
||||
}
|
||||
throw new IllegalArgumentException("unknown elemnt char " + c);
|
||||
}
|
||||
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
package server.life;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Danny (Leifde)
|
||||
*/
|
||||
public class MobAttackInfo {
|
||||
|
||||
@@ -32,12 +32,11 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Danny (Leifde)
|
||||
*/
|
||||
public class MobAttackInfoFactory {
|
||||
private static Map<String, MobAttackInfo> mobAttacks = new HashMap<>();
|
||||
private static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.MOB);
|
||||
private static final Map<String, MobAttackInfo> mobAttacks = new HashMap<>();
|
||||
private static final DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.MOB);
|
||||
|
||||
public static MobAttackInfo getMobAttackInfo(Monster mob, int attack) {
|
||||
MobAttackInfo ret = mobAttacks.get(mob.getId() + "" + attack);
|
||||
@@ -55,11 +54,11 @@ public class MobAttackInfoFactory {
|
||||
mobData = dataSource.getData(StringUtil.getLeftPaddedStr(linkedmob + ".img", '0', 11));
|
||||
}
|
||||
Data attackData = mobData.getChildByPath("attack" + (attack + 1) + "/info");
|
||||
|
||||
|
||||
if (attackData == null) {
|
||||
return null;
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Data deadlyAttack = attackData.getChildByPath("deadlyAttack");
|
||||
int mpBurn = DataTool.getInt("mpBurn", attackData, 0);
|
||||
int disease = DataTool.getInt("disease", attackData, 0);
|
||||
@@ -70,7 +69,7 @@ public class MobAttackInfoFactory {
|
||||
ret.setMpBurn(mpBurn);
|
||||
ret.setDiseaseSkill(disease);
|
||||
ret.setDiseaseLevel(level);
|
||||
ret.setMpCon(mpCon);
|
||||
ret.setMpCon(mpCon);
|
||||
}
|
||||
mobAttacks.put(mob.getId() + "" + attack, ret);
|
||||
}
|
||||
|
||||
@@ -39,13 +39,14 @@ import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Danny (Leifde)
|
||||
*/
|
||||
public class MobSkill {
|
||||
|
||||
private int skillId, skillLevel, mpCon;
|
||||
private List<Integer> toSummon = new ArrayList<>();
|
||||
private final int skillId;
|
||||
private final int skillLevel;
|
||||
private int mpCon;
|
||||
private final List<Integer> toSummon = new ArrayList<>();
|
||||
private int spawnEffect, hp, x, y, count;
|
||||
private long duration, cooltime;
|
||||
private float prop;
|
||||
@@ -251,7 +252,7 @@ public class MobSkill {
|
||||
int summonLimit = monster.countAvailableMobSummons(summons.size(), skillLimit);
|
||||
if (summonLimit >= 1) {
|
||||
boolean bossRushMap = GameConstants.isBossRush(map.getId());
|
||||
|
||||
|
||||
Collections.shuffle(summons);
|
||||
for (Integer mobId : summons.subList(0, summonLimit)) {
|
||||
Monster toSpawn = LifeFactory.getMonster(mobId);
|
||||
|
||||
@@ -40,14 +40,13 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Danny (Leifde)
|
||||
*/
|
||||
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 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 MonitoredReadLock rL = MonitoredReadLockFactory.createLock(dataLock);
|
||||
private final static MonitoredWriteLock wL = MonitoredWriteLockFactory.createLock(dataLock);
|
||||
|
||||
@@ -21,18 +21,18 @@
|
||||
package server.life;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LightPepsi
|
||||
*/
|
||||
|
||||
public class MonsterDropEntry {
|
||||
public MonsterDropEntry(int itemId, int chance, int Minimum, int Maximum, short questid) {
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questid;
|
||||
this.Minimum = Minimum;
|
||||
this.Maximum = Maximum;
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questid;
|
||||
this.Minimum = Minimum;
|
||||
this.Maximum = Maximum;
|
||||
}
|
||||
|
||||
public short questid;
|
||||
public int itemId, chance, Minimum, Maximum;
|
||||
}
|
||||
@@ -21,18 +21,18 @@
|
||||
package server.life;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LightPepsi
|
||||
*/
|
||||
public class MonsterGlobalDropEntry {
|
||||
public MonsterGlobalDropEntry(int itemId, int chance, int continent, int Minimum, int Maximum, short questid) {
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questid;
|
||||
this.continentid = continent;
|
||||
this.Minimum = Minimum;
|
||||
this.Maximum = Maximum;
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questid;
|
||||
this.continentid = continent;
|
||||
this.Minimum = Minimum;
|
||||
this.Maximum = Maximum;
|
||||
}
|
||||
|
||||
public int itemId, chance, Minimum, Maximum, continentid;
|
||||
public short questid;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package server.life;
|
||||
|
||||
import client.Character;
|
||||
|
||||
public interface MonsterListener {
|
||||
|
||||
|
||||
void monsterKilled(int aniTime);
|
||||
void monsterDamaged(Character from, int trueDmg);
|
||||
void monsterHealed(int trueHeal);
|
||||
|
||||
@@ -28,12 +28,17 @@ import java.awt.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class SpawnPoint {
|
||||
private int monster, mobTime, team, fh, f;
|
||||
private Point pos;
|
||||
private final int monster;
|
||||
private final int mobTime;
|
||||
private final int team;
|
||||
private final int fh;
|
||||
private final int f;
|
||||
private final Point pos;
|
||||
private long nextPossibleSpawn;
|
||||
private int mobInterval = 5000;
|
||||
private AtomicInteger spawnedMonsters = new AtomicInteger(0);
|
||||
private boolean immobile, denySpawn = false;
|
||||
private final AtomicInteger spawnedMonsters = new AtomicInteger(0);
|
||||
private final boolean immobile;
|
||||
private boolean denySpawn = false;
|
||||
|
||||
public SpawnPoint(final Monster monster, Point pos, boolean immobile, int mobTime, int mobInterval, int team) {
|
||||
this.monster = monster.getId();
|
||||
@@ -46,34 +51,30 @@ public class SpawnPoint {
|
||||
this.mobInterval = mobInterval;
|
||||
this.nextPossibleSpawn = Server.getInstance().getCurrentTime();
|
||||
}
|
||||
|
||||
|
||||
public int getSpawned() {
|
||||
return spawnedMonsters.intValue();
|
||||
}
|
||||
|
||||
|
||||
public void setDenySpawn(boolean val) {
|
||||
denySpawn = val;
|
||||
}
|
||||
|
||||
|
||||
public boolean getDenySpawn() {
|
||||
return denySpawn;
|
||||
}
|
||||
|
||||
public boolean shouldSpawn() {
|
||||
if (denySpawn || mobTime < 0 || spawnedMonsters.get() > 0) {
|
||||
if (denySpawn || mobTime < 0 || spawnedMonsters.get() > 0) {
|
||||
return false;
|
||||
}
|
||||
return nextPossibleSpawn <= Server.getInstance().getCurrentTime();
|
||||
}
|
||||
|
||||
public boolean shouldForceSpawn() {
|
||||
if (mobTime < 0 || spawnedMonsters.get() > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return mobTime >= 0 && spawnedMonsters.get() <= 0;
|
||||
}
|
||||
|
||||
|
||||
public Monster getMonster() {
|
||||
Monster mob = new Monster(LifeFactory.getMonster(monster));
|
||||
mob.setPosition(new Point(pos));
|
||||
@@ -92,10 +93,10 @@ public class SpawnPoint {
|
||||
}
|
||||
spawnedMonsters.decrementAndGet();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void monsterDamaged(Character from, int trueDmg) {}
|
||||
|
||||
|
||||
@Override
|
||||
public void monsterHealed(int trueHeal) {}
|
||||
});
|
||||
@@ -104,7 +105,7 @@ public class SpawnPoint {
|
||||
}
|
||||
return mob;
|
||||
}
|
||||
|
||||
|
||||
public int getMonsterId() {
|
||||
return monster;
|
||||
}
|
||||
@@ -120,11 +121,11 @@ public class SpawnPoint {
|
||||
public final int getFh() {
|
||||
return fh;
|
||||
}
|
||||
|
||||
|
||||
public int getMobTime() {
|
||||
return mobTime;
|
||||
}
|
||||
|
||||
|
||||
public int getTeam() {
|
||||
return team;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
package server.maps;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author AngelSL
|
||||
*/
|
||||
public enum FieldLimit {
|
||||
@@ -44,7 +43,7 @@ public enum FieldLimit {
|
||||
//ANTI_MACRO_LIMIT(0x10000), // No notes
|
||||
CANNOTJUMPDOWN(0x20000),
|
||||
//SUMMON_NPC_LIMIT(0x40000); // Seems to .. disable Rush if 0x2 is set
|
||||
|
||||
|
||||
//......... EVEN MORE LIMITS ............
|
||||
//SUMMON_NPC_LIMIT(0x40000),
|
||||
NO_EXP_DECREASE(0x80000),
|
||||
@@ -52,10 +51,10 @@ public enum FieldLimit {
|
||||
//PARCEL_OPEN_LIMIT(0x200000),
|
||||
DROP_LIMIT(0x400000);
|
||||
//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;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,14 +45,14 @@ public class MapMonitor {
|
||||
monitorSchedule.cancel(false);
|
||||
monitorSchedule = null;
|
||||
}
|
||||
|
||||
|
||||
map.killAllMonsters();
|
||||
map.clearDrops();
|
||||
if (portal != null) {
|
||||
portal.setPortalStatus(Portal.OPEN);
|
||||
}
|
||||
map.resetReactors();
|
||||
|
||||
|
||||
map = null;
|
||||
portal = null;
|
||||
}
|
||||
|
||||
@@ -34,34 +34,34 @@ import java.util.List;
|
||||
* @author Ronan - made MapleTV mechanics synchronous
|
||||
*/
|
||||
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) {
|
||||
Server server = Server.getInstance();
|
||||
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());
|
||||
}
|
||||
}
|
||||
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) {
|
||||
Server server = Server.getInstance();
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,7 +334,9 @@ public class Reactor extends AbstractMapObject {
|
||||
if (this.getDelay() > 0) {
|
||||
this.delayedRespawn();
|
||||
}
|
||||
} else return !this.inDelayedRespawn();
|
||||
} else {
|
||||
return !this.inDelayedRespawn();
|
||||
}
|
||||
} finally {
|
||||
reactorLock.unlock();
|
||||
}
|
||||
|
||||
@@ -23,10 +23,11 @@ package server.maps;
|
||||
public class ReactorDropEntry {
|
||||
|
||||
public ReactorDropEntry(int itemId, int chance, int questId) {
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questId;
|
||||
this.itemId = itemId;
|
||||
this.chance = chance;
|
||||
this.questid = questId;
|
||||
}
|
||||
|
||||
public int itemId, chance, questid;
|
||||
public int assignedRangeStart, assignedRangeLength;
|
||||
}
|
||||
@@ -22,7 +22,8 @@
|
||||
package server.maps;
|
||||
|
||||
public class SavedLocation {
|
||||
private int mapid = 102000000, portal;
|
||||
private int mapid = 102000000;
|
||||
private final int portal;
|
||||
|
||||
public SavedLocation(int mapid, int portal) {
|
||||
this.mapid = mapid;
|
||||
|
||||
@@ -25,7 +25,7 @@ public enum SummonMovementType {
|
||||
STATIONARY(0), FOLLOW(1), CIRCLE_FOLLOW(3);
|
||||
private final int val;
|
||||
|
||||
private SummonMovementType(int val) {
|
||||
SummonMovementType(int val) {
|
||||
this.val = val;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +21,13 @@
|
||||
*/
|
||||
package server.movement;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.*;
|
||||
|
||||
public abstract class AbstractLifeMovement implements LifeMovement {
|
||||
private Point position;
|
||||
private int duration;
|
||||
private int newstate, type;
|
||||
private final Point position;
|
||||
private final int duration;
|
||||
private final int newstate;
|
||||
private final int type;
|
||||
|
||||
public AbstractLifeMovement(int type, Point position, int duration, int newstate) {
|
||||
super();
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
package server.movement;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.*;
|
||||
|
||||
public interface LifeMovement extends LifeMovementFragment {
|
||||
Point getPosition();
|
||||
|
||||
@@ -35,36 +35,35 @@ import java.util.Map.Entry;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class AriantColiseum {
|
||||
|
||||
|
||||
private Expedition exped;
|
||||
private MapleMap map;
|
||||
|
||||
private Map<Character, Integer> score;
|
||||
private Map<Character, Integer> rewardTier;
|
||||
|
||||
private final Map<Character, Integer> score;
|
||||
private final Map<Character, Integer> rewardTier;
|
||||
private boolean scoreDirty = false;
|
||||
|
||||
|
||||
private ScheduledFuture<?> ariantUpdate;
|
||||
private ScheduledFuture<?> ariantFinish;
|
||||
private ScheduledFuture<?> ariantScoreboard;
|
||||
|
||||
|
||||
private int lostShards = 0;
|
||||
|
||||
|
||||
private boolean eventClear = false;
|
||||
|
||||
|
||||
public AriantColiseum(MapleMap eventMap, Expedition expedition) {
|
||||
exped = expedition;
|
||||
exped.finishRegistration();
|
||||
|
||||
|
||||
map = eventMap;
|
||||
map.resetFully();
|
||||
|
||||
|
||||
int pqTimer = 10 * 60 * 1000;
|
||||
int pqTimerBoard = (9 * 60 * 1000) + 50 * 1000;
|
||||
|
||||
|
||||
List<Character> players = exped.getActiveMembers();
|
||||
score = new HashMap<>();
|
||||
rewardTier = new HashMap<>();
|
||||
@@ -74,73 +73,73 @@ public class AriantColiseum {
|
||||
mc.updateAriantScore();
|
||||
rewardTier.put(mc, 0);
|
||||
}
|
||||
|
||||
|
||||
for (Character mc : players) {
|
||||
mc.sendPacket(PacketCreator.updateAriantPQRanking(score));
|
||||
}
|
||||
|
||||
|
||||
setAriantScoreBoard(TimerManager.getInstance().schedule(() -> showArenaResults(), pqTimerBoard));
|
||||
|
||||
|
||||
setArenaFinish(TimerManager.getInstance().schedule(() -> enterKingsRoom(), pqTimer));
|
||||
|
||||
|
||||
setArenaUpdate(TimerManager.getInstance().register(() -> broadcastAriantScoreUpdate(), 500, 500));
|
||||
}
|
||||
|
||||
|
||||
private void setArenaUpdate(ScheduledFuture<?> ariantUpdate) {
|
||||
this.ariantUpdate = ariantUpdate;
|
||||
}
|
||||
|
||||
|
||||
private void setArenaFinish(ScheduledFuture<?> arenaFinish) {
|
||||
this.ariantFinish = arenaFinish;
|
||||
}
|
||||
|
||||
|
||||
private void setAriantScoreBoard(ScheduledFuture<?> ariantScore) {
|
||||
this.ariantScoreboard = ariantScore;
|
||||
}
|
||||
|
||||
|
||||
private void cancelArenaUpdate() {
|
||||
if (ariantUpdate != null) {
|
||||
ariantUpdate.cancel(true);
|
||||
ariantUpdate = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void cancelArenaFinish() {
|
||||
if (ariantFinish != null) {
|
||||
ariantFinish.cancel(true);
|
||||
ariantFinish = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void cancelAriantScoreBoard() {
|
||||
if (ariantScoreboard != null) {
|
||||
ariantScoreboard.cancel(true);
|
||||
ariantScoreboard = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void cancelAriantSchedules() {
|
||||
cancelArenaUpdate();
|
||||
cancelArenaFinish();
|
||||
cancelAriantScoreBoard();
|
||||
}
|
||||
|
||||
|
||||
public int getAriantScore(Character chr) {
|
||||
Integer chrScore = score.get(chr);
|
||||
return chrScore != null ? chrScore : 0;
|
||||
}
|
||||
|
||||
|
||||
public void clearAriantScore(Character chr) {
|
||||
score.remove(chr);
|
||||
}
|
||||
|
||||
|
||||
public void updateAriantScore(Character chr, int points) {
|
||||
if (map != null) {
|
||||
score.put(chr, points);
|
||||
scoreDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void broadcastAriantScoreUpdate() {
|
||||
if (scoreDirty) {
|
||||
for (Character chr : score.keySet()) {
|
||||
@@ -149,26 +148,26 @@ public class AriantColiseum {
|
||||
scoreDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int getAriantRewardTier(Character chr) {
|
||||
Integer reward = rewardTier.get(chr);
|
||||
return reward != null ? reward : 0;
|
||||
}
|
||||
|
||||
|
||||
public void clearAriantRewardTier(Character chr) {
|
||||
rewardTier.remove(chr);
|
||||
}
|
||||
|
||||
|
||||
public void addLostShards(int quantity) {
|
||||
lostShards += quantity;
|
||||
}
|
||||
|
||||
|
||||
public void leaveArena(Character chr) {
|
||||
if (!(eventClear && GameConstants.isAriantColiseumArena(chr.getMapId()))) {
|
||||
leaveArenaInternal(chr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private synchronized void leaveArenaInternal(Character chr) {
|
||||
if (exped != null) {
|
||||
if (exped.removeMember(chr)) {
|
||||
@@ -177,53 +176,53 @@ public class AriantColiseum {
|
||||
dispose();
|
||||
}
|
||||
chr.setAriantColiseum(null);
|
||||
|
||||
|
||||
int shards = chr.countItem(4031868);
|
||||
chr.getAbstractPlayerInteraction().removeAll(4031868);
|
||||
chr.updateAriantScore(shards);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void playerDisconnected(Character chr) {
|
||||
leaveArenaInternal(chr);
|
||||
}
|
||||
|
||||
|
||||
private void showArenaResults() {
|
||||
eventClear = true;
|
||||
|
||||
|
||||
if (map != null) {
|
||||
map.broadcastMessage(PacketCreator.showAriantScoreBoard());
|
||||
map.killAllMonsters();
|
||||
|
||||
|
||||
distributeAriantPoints();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static boolean isUnfairMatch(Integer winnerScore, Integer secondScore, Integer lostShardsScore, List<Integer> runnerupsScore) {
|
||||
if (winnerScore <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
double runnerupsScoreCount = 0;
|
||||
for (Integer i : runnerupsScore) {
|
||||
runnerupsScoreCount += i;
|
||||
}
|
||||
|
||||
|
||||
runnerupsScoreCount += lostShardsScore;
|
||||
secondScore += lostShardsScore;
|
||||
|
||||
|
||||
double matchRes = runnerupsScoreCount / winnerScore;
|
||||
double runnerupRes = ((double) secondScore) / winnerScore;
|
||||
|
||||
|
||||
return matchRes < 0.81770726891980117713114871015349 && (runnerupsScoreCount < 7 || runnerupRes < 0.5929);
|
||||
}
|
||||
|
||||
|
||||
public void distributeAriantPoints() {
|
||||
int firstTop = -1, secondTop = -1;
|
||||
Character winner = null;
|
||||
List<Integer> runnerups = new ArrayList<>();
|
||||
|
||||
|
||||
for (Entry<Character, Integer> e : score.entrySet()) {
|
||||
Integer s = e.getValue();
|
||||
if (s > firstTop) {
|
||||
@@ -233,17 +232,17 @@ public class AriantColiseum {
|
||||
} else if (s > secondTop) {
|
||||
secondTop = s;
|
||||
}
|
||||
|
||||
|
||||
runnerups.add(s);
|
||||
rewardTier.put(e.getKey(), (int) Math.floor(s / 10));
|
||||
}
|
||||
|
||||
|
||||
runnerups.remove(firstTop);
|
||||
if (isUnfairMatch(firstTop, secondTop, map.getDroppedItemsCountById(4031868) + lostShards, runnerups)) {
|
||||
rewardTier.put(winner, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private ExpeditionType getExpeditionType() {
|
||||
ExpeditionType type;
|
||||
if (map.getId() == 980010101) {
|
||||
@@ -253,28 +252,28 @@ public class AriantColiseum {
|
||||
} else {
|
||||
type = ExpeditionType.ARIANT2;
|
||||
}
|
||||
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
private void enterKingsRoom() {
|
||||
exped.removeChannelExpedition(map.getChannelServer());
|
||||
cancelAriantSchedules();
|
||||
|
||||
|
||||
for (Character chr : map.getAllPlayers()) {
|
||||
chr.changeMap(980010010, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private synchronized void dispose() {
|
||||
if (exped != null) {
|
||||
exped.dispose(false);
|
||||
|
||||
|
||||
for (Character chr : exped.getActiveMembers()) {
|
||||
chr.setAriantColiseum(null);
|
||||
chr.changeMap(980010000, 0);
|
||||
}
|
||||
|
||||
|
||||
map.getWorldServer().registerTimedMapObject(() -> {
|
||||
score.clear();
|
||||
exped = null;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package server.partyquest;
|
||||
|
||||
import java.awt.Point;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author David
|
||||
*/
|
||||
public class GuardianSpawnPoint {
|
||||
|
||||
@@ -93,13 +93,13 @@ public class MonsterCarnival {
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 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
|
||||
effectTimer = TimerManager.getInstance().schedule(() -> complete(), map.getTimeDefault() * 1000 - 10 * 1000);
|
||||
respawnTask = TimerManager.getInstance().register(() -> respawn(), YamlConfig.config.server.RESPAWN_INTERVAL);
|
||||
|
||||
|
||||
cs.initMonsterCarnival(cpq1, room);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -109,7 +109,7 @@ public class MonsterCarnival {
|
||||
private void respawn() {
|
||||
map.respawn();
|
||||
}
|
||||
|
||||
|
||||
public void playerDisconnected(int charid) {
|
||||
int team = -1;
|
||||
for (PartyCharacter mpc : leader1.getParty().getMembers()) {
|
||||
@@ -155,7 +155,7 @@ public class MonsterCarnival {
|
||||
public boolean canSummonR() {
|
||||
return summonsR < map.getMaxMobs();
|
||||
}
|
||||
|
||||
|
||||
public void summonR() {
|
||||
summonsR++;
|
||||
}
|
||||
@@ -163,11 +163,11 @@ public class MonsterCarnival {
|
||||
public boolean canSummonB() {
|
||||
return summonsB < map.getMaxMobs();
|
||||
}
|
||||
|
||||
|
||||
public void summonB() {
|
||||
summonsB++;
|
||||
}
|
||||
|
||||
|
||||
public boolean canGuardianR() {
|
||||
int teamReactors = 0;
|
||||
for (Reactor react : map.getAllReactors()) {
|
||||
@@ -175,10 +175,10 @@ public class MonsterCarnival {
|
||||
teamReactors += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return teamReactors < map.getMaxReactors();
|
||||
}
|
||||
|
||||
|
||||
public boolean canGuardianB() {
|
||||
int teamReactors = 0;
|
||||
for (Reactor react : map.getAllReactors()) {
|
||||
@@ -186,7 +186,7 @@ public class MonsterCarnival {
|
||||
teamReactors += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return teamReactors < map.getMaxReactors();
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ public class MonsterCarnival {
|
||||
leader2.getParty().setEnemy(null);
|
||||
map.dispose();
|
||||
map = null;
|
||||
|
||||
|
||||
cs.finishMonsterCarnival(cpq1, room);
|
||||
}
|
||||
|
||||
@@ -345,9 +345,9 @@ public class MonsterCarnival {
|
||||
chrMap.dropMessage(5, LanguageConstants.getMessage(chrMap, LanguageConstants.CPQExtendTime));
|
||||
}
|
||||
startTime = System.currentTimeMillis() + 3 * 60 * 1000;
|
||||
|
||||
|
||||
map.broadcastMessage(PacketCreator.getClock(3 * 60));
|
||||
|
||||
|
||||
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
|
||||
}
|
||||
@@ -355,10 +355,10 @@ public class MonsterCarnival {
|
||||
public void complete() {
|
||||
int cp1 = this.redTotalCP;
|
||||
int cp2 = this.blueTotalCP;
|
||||
|
||||
|
||||
this.redTimeupCP = cp1;
|
||||
this.blueTimeupCP = cp2;
|
||||
|
||||
|
||||
if (cp1 == cp2) {
|
||||
return;
|
||||
}
|
||||
@@ -368,7 +368,7 @@ public class MonsterCarnival {
|
||||
if (chnl != chnl1) {
|
||||
throw new RuntimeException("Os lideres estao em canais diferentes.");
|
||||
}
|
||||
|
||||
|
||||
map.killAllMonsters();
|
||||
for (PartyCharacter mpc : leader1.getParty().getMembers()) {
|
||||
Character mc = mpc.getPlayer();
|
||||
@@ -509,11 +509,11 @@ public class MonsterCarnival {
|
||||
this.blueCP = CP;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int getRoom() {
|
||||
return this.room;
|
||||
}
|
||||
|
||||
|
||||
public MapleMap getEventMap() {
|
||||
return this.map;
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ import java.util.List;
|
||||
public class MonsterCarnivalParty {
|
||||
|
||||
private List<Character> members = new LinkedList<>();
|
||||
private Character leader;
|
||||
private byte team;
|
||||
private final Character leader;
|
||||
private final byte team;
|
||||
private short availableCP = 0, totalCP = 0;
|
||||
private int summons = 8;
|
||||
private boolean winner = false;
|
||||
@@ -77,10 +77,11 @@ public class MonsterCarnivalParty {
|
||||
}
|
||||
|
||||
public void warpOut() {
|
||||
if (winner == true)
|
||||
if (winner == true) {
|
||||
warpOut(980000003 + (leader.getMonsterCarnival().getRoom() * 100));
|
||||
else
|
||||
} else {
|
||||
warpOut(980000004 + (leader.getMonsterCarnival().getRoom() * 100));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean allInMap(MapleMap map) {
|
||||
|
||||
@@ -32,7 +32,6 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author kevintjuh93
|
||||
*/
|
||||
public class PartyQuest {
|
||||
@@ -49,8 +48,9 @@ public class PartyQuest {
|
||||
for (PartyCharacter pchr : party.getMembers()) {
|
||||
if (pchr.getChannel() == channel && pchr.getMapId() == mapid) {
|
||||
Character chr = Server.getInstance().getWorld(world).getChannel(channel).getPlayerStorage().getCharacterById(pchr.getId());
|
||||
if (chr != null)
|
||||
if (chr != null) {
|
||||
this.participants.add(chr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -67,46 +67,48 @@ public class PartyQuest {
|
||||
synchronized (participants) {
|
||||
participants.remove(chr);
|
||||
chr.setPartyQuest(null);
|
||||
if (participants.isEmpty()) super.finalize();
|
||||
if (participants.isEmpty()) {
|
||||
super.finalize();
|
||||
}
|
||||
//System.gc();
|
||||
}
|
||||
}
|
||||
|
||||
public static int getExp(String PQ, int level) {
|
||||
if (PQ.equals("HenesysPQ")){
|
||||
return 1250 * level / 5;
|
||||
} else if(PQ.equals("KerningPQFinal")){
|
||||
return 500 * level / 5;
|
||||
} else if(PQ.equals("KerningPQ4th")){
|
||||
return 400 * level / 5;
|
||||
} else if(PQ.equals("KerningPQ3rd")){
|
||||
return 300 * level / 5;
|
||||
} else if(PQ.equals("KerningPQ2nd")){
|
||||
return 200 * level / 5;
|
||||
} else if(PQ.equals("KerningPQ1st")){
|
||||
return 100 * level / 5;
|
||||
} else if(PQ.equals("LudiMazePQ")){
|
||||
return 2000 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ1st")) {
|
||||
return 100 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ2nd")) {
|
||||
return 250 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ3rd")) {
|
||||
return 350 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ4th")) {
|
||||
return 350 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ5th")) {
|
||||
return 400 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ6th")) {
|
||||
return 450 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ7th")) {
|
||||
return 500 * level / 5;
|
||||
} else if(PQ.equals("LudiPQ8th")) {
|
||||
return 650 * level / 5;
|
||||
} else if(PQ.equals("LudiPQLast")) {
|
||||
return 800 * level / 5;
|
||||
}
|
||||
FilePrinter.printError(FilePrinter.NPC, "Unhandled PartyQuest: " + PQ);
|
||||
return 0;
|
||||
}
|
||||
public static int getExp(String PQ, int level) {
|
||||
if (PQ.equals("HenesysPQ")) {
|
||||
return 1250 * level / 5;
|
||||
} else if (PQ.equals("KerningPQFinal")) {
|
||||
return 500 * level / 5;
|
||||
} else if (PQ.equals("KerningPQ4th")) {
|
||||
return 400 * level / 5;
|
||||
} else if (PQ.equals("KerningPQ3rd")) {
|
||||
return 300 * level / 5;
|
||||
} else if (PQ.equals("KerningPQ2nd")) {
|
||||
return 200 * level / 5;
|
||||
} else if (PQ.equals("KerningPQ1st")) {
|
||||
return 100 * level / 5;
|
||||
} else if (PQ.equals("LudiMazePQ")) {
|
||||
return 2000 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ1st")) {
|
||||
return 100 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ2nd")) {
|
||||
return 250 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ3rd")) {
|
||||
return 350 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ4th")) {
|
||||
return 350 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ5th")) {
|
||||
return 400 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ6th")) {
|
||||
return 450 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ7th")) {
|
||||
return 500 * level / 5;
|
||||
} else if (PQ.equals("LudiPQ8th")) {
|
||||
return 650 * level / 5;
|
||||
} else if (PQ.equals("LudiPQLast")) {
|
||||
return 800 * level / 5;
|
||||
}
|
||||
FilePrinter.printError(FilePrinter.NPC, "Unhandled PartyQuest: " + PQ);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ import tools.PacketCreator;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author kevintjuh93
|
||||
*/
|
||||
public class Pyramid extends PartyQuest {
|
||||
@@ -82,7 +81,9 @@ public class Pyramid extends PartyQuest {
|
||||
count = 0;
|
||||
gaugeSchedule = TimerManager.getInstance().register(() -> {
|
||||
gauge -= decrease;
|
||||
if (gauge <= 0) warp(926010001);
|
||||
if (gauge <= 0) {
|
||||
warp(926010001);
|
||||
}
|
||||
|
||||
}, 1000);
|
||||
}
|
||||
@@ -90,23 +91,31 @@ public class Pyramid extends PartyQuest {
|
||||
|
||||
public void kill() {
|
||||
kill++;
|
||||
if (gauge < 100) count++;
|
||||
if (gauge < 100) {
|
||||
count++;
|
||||
}
|
||||
gauge++;
|
||||
broadcastInfo("hit", kill);
|
||||
if (gauge >= 100) gauge = 100;
|
||||
if (gauge >= 100) {
|
||||
gauge = 100;
|
||||
}
|
||||
checkBuffs();
|
||||
}
|
||||
|
||||
public void cool() {
|
||||
cool++;
|
||||
int plus = coolAdd;
|
||||
if ((gauge + coolAdd) > 100) plus -= ((gauge + coolAdd) - 100);
|
||||
if ((gauge + coolAdd) > 100) {
|
||||
plus -= ((gauge + coolAdd) - 100);
|
||||
}
|
||||
gauge += plus;
|
||||
count += plus;
|
||||
if (gauge >= 100) gauge = 100;
|
||||
if (gauge >= 100) {
|
||||
gauge = 100;
|
||||
}
|
||||
broadcastInfo("cool", cool);
|
||||
checkBuffs();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void miss() {
|
||||
@@ -118,10 +127,11 @@ public class Pyramid extends PartyQuest {
|
||||
|
||||
public int timer() {
|
||||
int value;
|
||||
if (stage > 0)
|
||||
if (stage > 0) {
|
||||
value = 180;
|
||||
else
|
||||
} else {
|
||||
value = 120;
|
||||
}
|
||||
|
||||
timer = TimerManager.getInstance().schedule(() -> {
|
||||
stage++;
|
||||
@@ -146,7 +156,9 @@ public class Pyramid extends PartyQuest {
|
||||
gaugeSchedule = null;
|
||||
timer.cancel(false);
|
||||
timer = null;
|
||||
} else stage = 0;
|
||||
} else {
|
||||
stage = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void broadcastInfo(String info, int amount) {
|
||||
@@ -157,7 +169,9 @@ public class Pyramid extends PartyQuest {
|
||||
}
|
||||
|
||||
public boolean useSkill() {
|
||||
if (skill < 1) return false;
|
||||
if (skill < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
skill--;
|
||||
broadcastInfo("skill", skill);
|
||||
@@ -169,8 +183,9 @@ public class Pyramid extends PartyQuest {
|
||||
if (buffcount == 0 && total >= 250) {
|
||||
buffcount++;
|
||||
ItemInformationProvider ii = ItemInformationProvider.getInstance();
|
||||
for (Character chr : getParticipants())
|
||||
for (Character chr : getParticipants()) {
|
||||
ii.getItemEffect(2022585).applyTo(chr);
|
||||
}
|
||||
|
||||
} else if (buffcount == 1 && total >= 500) {
|
||||
buffcount++;
|
||||
@@ -212,20 +227,34 @@ public class Pyramid extends PartyQuest {
|
||||
if (exp == 0) {
|
||||
int totalkills = (kill + cool);
|
||||
if (stage == 5) {
|
||||
if (totalkills >= 3000) rank = 0;
|
||||
else if (totalkills >= 2000) rank = 1;
|
||||
else if (totalkills >= 1500) rank = 2;
|
||||
else if(totalkills >= 500) rank = 3;
|
||||
else rank = 4;
|
||||
if (totalkills >= 3000) {
|
||||
rank = 0;
|
||||
} else if (totalkills >= 2000) {
|
||||
rank = 1;
|
||||
} else if (totalkills >= 1500) {
|
||||
rank = 2;
|
||||
} else if (totalkills >= 500) {
|
||||
rank = 3;
|
||||
} else {
|
||||
rank = 4;
|
||||
}
|
||||
} else {
|
||||
if (totalkills >= 2000) rank = 3;
|
||||
else rank = 4;
|
||||
if (totalkills >= 2000) {
|
||||
rank = 3;
|
||||
} else {
|
||||
rank = 4;
|
||||
}
|
||||
}
|
||||
|
||||
if (rank == 0) exp = (60500 + (5500 * mode.getMode()));
|
||||
else if(rank == 1) exp = (55000 + (5000 * mode.getMode()));
|
||||
else if (rank == 2) exp = (46750 + (4250 * mode.getMode()));
|
||||
else if (rank == 3) exp = (22000 + (2000 * mode.getMode()));
|
||||
if (rank == 0) {
|
||||
exp = (60500 + (5500 * mode.getMode()));
|
||||
} else if (rank == 1) {
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -29,29 +29,28 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class BuffAction extends AbstractQuestAction {
|
||||
int itemEffect;
|
||||
|
||||
public BuffAction(Quest quest, Data data) {
|
||||
super(QuestActionType.BUFF, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer extSelection) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
itemEffect = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
ItemInformationProvider.getInstance().getItemEffect(itemEffect).applyTo(chr);
|
||||
}
|
||||
int itemEffect;
|
||||
|
||||
public BuffAction(Quest quest, Data data) {
|
||||
super(QuestActionType.BUFF, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer extSelection) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
itemEffect = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
ItemInformationProvider.getInstance().getItemEffect(itemEffect).applyTo(chr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,33 +29,32 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class ExpAction extends AbstractQuestAction {
|
||||
int exp;
|
||||
|
||||
public ExpAction(Quest quest, Data data) {
|
||||
super(QuestActionType.EXP, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
exp = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
runAction(chr, exp);
|
||||
}
|
||||
|
||||
public static void runAction(Character chr, int gain) {
|
||||
if (!YamlConfig.config.server.USE_QUEST_RATE) {
|
||||
chr.gainExp(gain * chr.getExpRate(), true, true);
|
||||
} else {
|
||||
chr.gainExp(gain * chr.getQuestExpRate(), true, true);
|
||||
}
|
||||
int exp;
|
||||
|
||||
public ExpAction(Quest quest, Data data) {
|
||||
super(QuestActionType.EXP, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
exp = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
runAction(chr, exp);
|
||||
}
|
||||
|
||||
public static void runAction(Character chr, int gain) {
|
||||
if (!YamlConfig.config.server.USE_QUEST_RATE) {
|
||||
chr.gainExp(gain * chr.getExpRate(), true, true);
|
||||
} else {
|
||||
chr.gainExp(gain * chr.getQuestExpRate(), true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,26 +28,25 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class FameAction extends AbstractQuestAction {
|
||||
int fame;
|
||||
|
||||
public FameAction(Quest quest, Data data) {
|
||||
super(QuestActionType.FAME, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
fame = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
chr.gainFame(fame);
|
||||
}
|
||||
int fame;
|
||||
|
||||
public FameAction(Quest quest, Data data) {
|
||||
super(QuestActionType.FAME, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
fame = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
chr.gainFame(fame);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,29 +26,28 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class InfoAction extends AbstractQuestAction {
|
||||
|
||||
private String info;
|
||||
private int questID;
|
||||
|
||||
public InfoAction(Quest quest, Data data) {
|
||||
super(QuestActionType.INFO, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
private String info;
|
||||
private final int questID;
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
info = DataTool.getString(data, "");
|
||||
}
|
||||
public InfoAction(Quest quest, Data data) {
|
||||
super(QuestActionType.INFO, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
info = DataTool.getString(data, "");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
chr.getAbstractPlayerInteraction().setQuestProgress(questID, info);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
chr.getAbstractPlayerInteraction().setQuestProgress(questID, info);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -43,316 +43,324 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
* @author Ronan
|
||||
*/
|
||||
public class ItemAction extends AbstractQuestAction {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
List<ItemData> items = new ArrayList<>();
|
||||
|
||||
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 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();
|
||||
public ItemAction(Quest quest, Data data) {
|
||||
super(QuestActionType.ITEM, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
if (it.getQuantity() > 0) {
|
||||
toAddItemids.add(it.getItemId());
|
||||
toAddQuantity.add((int) it.getQuantity());
|
||||
} else {
|
||||
toRemoveItemids.add(it.getItemId());
|
||||
toRemoveQuantity.add(-1 * ((int) it.getQuantity()));
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
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());
|
||||
toAddQuantity.add((int) it.getQuantity());
|
||||
} else {
|
||||
toRemoveItemids.add(it.getItemId());
|
||||
toRemoveQuantity.add(-1 * ((int) it.getQuantity()));
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MesoAction extends AbstractQuestAction {
|
||||
int mesos;
|
||||
|
||||
public MesoAction(Quest quest, Data data) {
|
||||
super(QuestActionType.MESO, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
mesos = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
runAction(chr, mesos);
|
||||
}
|
||||
|
||||
public static void runAction(Character chr, int gain) {
|
||||
if (gain < 0) {
|
||||
chr.gainMeso(gain, true, false, true);
|
||||
} else {
|
||||
if (!YamlConfig.config.server.USE_QUEST_RATE) {
|
||||
chr.gainMeso(gain * chr.getMesoRate(), true, false, true);
|
||||
} else {
|
||||
chr.gainMeso(gain * chr.getQuestMesoRate(), true, false, true);
|
||||
}
|
||||
}
|
||||
int mesos;
|
||||
|
||||
public MesoAction(Quest quest, Data data) {
|
||||
super(QuestActionType.MESO, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
mesos = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
runAction(chr, mesos);
|
||||
}
|
||||
|
||||
public static void runAction(Character chr, int gain) {
|
||||
if (gain < 0) {
|
||||
chr.gainMeso(gain, true, false, true);
|
||||
} else {
|
||||
if (!YamlConfig.config.server.USE_QUEST_RATE) {
|
||||
chr.gainMeso(gain * chr.getMesoRate(), true, false, true);
|
||||
} else {
|
||||
chr.gainMeso(gain * chr.getQuestMesoRate(), true, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,26 +30,25 @@ import server.quest.QuestActionType;
|
||||
import tools.PacketCreator;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class NextQuestAction extends AbstractQuestAction {
|
||||
int nextQuest;
|
||||
|
||||
public NextQuestAction(Quest quest, Data data) {
|
||||
super(QuestActionType.NEXTQUEST, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
nextQuest = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
chr.sendPacket(PacketCreator.updateQuestFinish((short) questID, status.getNpc(), (short) nextQuest));
|
||||
}
|
||||
int nextQuest;
|
||||
|
||||
public NextQuestAction(Quest quest, Data data) {
|
||||
super(QuestActionType.NEXTQUEST, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
nextQuest = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
chr.sendPacket(PacketCreator.updateQuestFinish((short) questID, status.getNpc(), (short) nextQuest));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,35 +30,35 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class PetSkillAction extends AbstractQuestAction {
|
||||
int flag;
|
||||
|
||||
public PetSkillAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETSKILL, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
flag = DataTool.getInt("petskill", data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer extSelection) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
if(!(status.getStatus() == QuestStatus.Status.NOT_STARTED && status.getForfeited() > 0))
|
||||
return false;
|
||||
|
||||
return chr.getPet(0) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
chr.getPet(0).setFlag((byte) ItemConstants.getFlagByInt(flag));
|
||||
}
|
||||
int flag;
|
||||
|
||||
public PetSkillAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETSKILL, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
flag = DataTool.getInt("petskill", data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer extSelection) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
if (!(status.getStatus() == QuestStatus.Status.NOT_STARTED && status.getForfeited() > 0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return chr.getPet(0) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class PetSpeedAction extends AbstractQuestAction {
|
||||
|
||||
public PetSpeedAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETTAMENESS, quest);
|
||||
questID = quest.getId();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
Client c = chr.getClient();
|
||||
|
||||
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain owner speed
|
||||
if(pet == null) return;
|
||||
|
||||
c.lockClient();
|
||||
try {
|
||||
pet.addPetFlag(c.getPlayer(), Pet.PetFlag.OWNER_SPEED);
|
||||
} finally {
|
||||
c.unlockClient();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public PetSpeedAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETTAMENESS, quest);
|
||||
questID = quest.getId();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
Client c = chr.getClient();
|
||||
|
||||
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain owner speed
|
||||
if (pet == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
c.lockClient();
|
||||
try {
|
||||
pet.addPetFlag(c.getPlayer(), Pet.PetFlag.OWNER_SPEED);
|
||||
} finally {
|
||||
c.unlockClient();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,36 +28,37 @@ import server.quest.Quest;
|
||||
import server.quest.QuestActionType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class PetTamenessAction extends AbstractQuestAction {
|
||||
int tameness;
|
||||
|
||||
public PetTamenessAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETTAMENESS, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
tameness = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
Client c = chr.getClient();
|
||||
|
||||
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain tameness
|
||||
if(pet == null) return;
|
||||
|
||||
c.lockClient();
|
||||
try {
|
||||
pet.gainClosenessFullness(chr, tameness, 0, 0);
|
||||
} finally {
|
||||
c.unlockClient();
|
||||
}
|
||||
}
|
||||
int tameness;
|
||||
|
||||
public PetTamenessAction(Quest quest, Data data) {
|
||||
super(QuestActionType.PETTAMENESS, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
tameness = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
Client c = chr.getClient();
|
||||
|
||||
Pet pet = chr.getPet(0); // assuming here only the pet leader will gain tameness
|
||||
if (pet == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
c.lockClient();
|
||||
try {
|
||||
pet.gainClosenessFullness(chr, tameness, 0, 0);
|
||||
} finally {
|
||||
c.unlockClient();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,34 +32,33 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class QuestAction extends AbstractQuestAction {
|
||||
int mesos;
|
||||
Map<Integer, Integer> quests = new HashMap<>();
|
||||
|
||||
public QuestAction(Quest quest, Data data) {
|
||||
super(QuestActionType.QUEST, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data qEntry : data) {
|
||||
int questid = DataTool.getInt(qEntry.getChildByPath("id"));
|
||||
int stat = DataTool.getInt(qEntry.getChildByPath("state"));
|
||||
quests.put(questid, stat);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
for(Integer questID : quests.keySet()) {
|
||||
int stat = quests.get(questID);
|
||||
chr.updateQuestStatus(new QuestStatus(Quest.getInstance(questID), QuestStatus.Status.getById(stat)));
|
||||
}
|
||||
}
|
||||
int mesos;
|
||||
Map<Integer, Integer> quests = new HashMap<>();
|
||||
|
||||
public QuestAction(Quest quest, Data data) {
|
||||
super(QuestActionType.QUEST, quest);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data qEntry : data) {
|
||||
int questid = DataTool.getInt(qEntry.getChildByPath("id"));
|
||||
int stat = DataTool.getInt(qEntry.getChildByPath("state"));
|
||||
quests.put(questid, stat);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
for (Integer questID : quests.keySet()) {
|
||||
int stat = quests.get(questID);
|
||||
chr.updateQuestStatus(new QuestStatus(Quest.getInstance(questID), QuestStatus.Status.getById(stat)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,88 +36,87 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class SkillAction extends AbstractQuestAction {
|
||||
int itemEffect;
|
||||
Map<Integer, SkillData> skillData = new HashMap<>();
|
||||
|
||||
public SkillAction(Quest quest, Data data) {
|
||||
super(QuestActionType.SKILL, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data sEntry : data) {
|
||||
byte skillLevel = 0;
|
||||
int skillid = DataTool.getInt(sEntry.getChildByPath("id"));
|
||||
Data skillLevelData = sEntry.getChildByPath("skillLevel");
|
||||
if(skillLevelData != null)
|
||||
skillLevel = (byte) DataTool.getInt(skillLevelData);
|
||||
int masterLevel = DataTool.getInt(sEntry.getChildByPath("masterLevel"));
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
Data applicableJobs = sEntry.getChildByPath("job");
|
||||
if(applicableJobs != null) {
|
||||
for (Data applicableJob : applicableJobs.getChildren()) {
|
||||
jobs.add(DataTool.getInt(applicableJob));
|
||||
}
|
||||
}
|
||||
|
||||
skillData.put(skillid, new SkillData(skillid, skillLevel, masterLevel, jobs));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
for(SkillData skill : skillData.values()) {
|
||||
Skill skillObject = SkillFactory.getSkill(skill.getId());
|
||||
if(skillObject == null) continue;
|
||||
|
||||
boolean shouldLearn = false;
|
||||
|
||||
if(skill.jobsContains(chr.getJob()) || skillObject.isBeginnerSkill())
|
||||
shouldLearn = true;
|
||||
|
||||
byte skillLevel = (byte) Math.max(skill.getLevel(), chr.getSkillLevel(skillObject));
|
||||
int masterLevel = Math.max(skill.getMasterLevel(), chr.getMasterLevel(skillObject));
|
||||
if (shouldLearn) {
|
||||
chr.changeSkillLevel(skillObject, skillLevel, masterLevel, -1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private class SkillData {
|
||||
protected int id, level, masterLevel;
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
public SkillData(int id, int level, int masterLevel, List<Integer> jobs) {
|
||||
this.id = id;
|
||||
this.level = level;
|
||||
this.masterLevel = masterLevel;
|
||||
this.jobs = jobs;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
public int getMasterLevel() {
|
||||
return masterLevel;
|
||||
}
|
||||
|
||||
public boolean jobsContains(Job job) {
|
||||
return jobs.contains(job.getId());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
int itemEffect;
|
||||
Map<Integer, SkillData> skillData = new HashMap<>();
|
||||
|
||||
public SkillAction(Quest quest, Data data) {
|
||||
super(QuestActionType.SKILL, quest);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data sEntry : data) {
|
||||
byte skillLevel = 0;
|
||||
int skillid = DataTool.getInt(sEntry.getChildByPath("id"));
|
||||
Data skillLevelData = sEntry.getChildByPath("skillLevel");
|
||||
if (skillLevelData != null) {
|
||||
skillLevel = (byte) DataTool.getInt(skillLevelData);
|
||||
}
|
||||
int masterLevel = DataTool.getInt(sEntry.getChildByPath("masterLevel"));
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
Data applicableJobs = sEntry.getChildByPath("job");
|
||||
if (applicableJobs != null) {
|
||||
for (Data applicableJob : applicableJobs.getChildren()) {
|
||||
jobs.add(DataTool.getInt(applicableJob));
|
||||
}
|
||||
}
|
||||
|
||||
skillData.put(skillid, new SkillData(skillid, skillLevel, masterLevel, jobs));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Character chr, Integer extSelection) {
|
||||
for (SkillData skill : skillData.values()) {
|
||||
Skill skillObject = SkillFactory.getSkill(skill.getId());
|
||||
if (skillObject == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean shouldLearn = skill.jobsContains(chr.getJob()) || skillObject.isBeginnerSkill();
|
||||
|
||||
byte skillLevel = (byte) Math.max(skill.getLevel(), chr.getSkillLevel(skillObject));
|
||||
int masterLevel = Math.max(skill.getMasterLevel(), chr.getMasterLevel(skillObject));
|
||||
if (shouldLearn) {
|
||||
chr.changeSkillLevel(skillObject, skillLevel, masterLevel, -1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private class SkillData {
|
||||
protected int id, level, masterLevel;
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
public SkillData(int id, int level, int masterLevel, List<Integer> jobs) {
|
||||
this.id = id;
|
||||
this.level = level;
|
||||
this.masterLevel = masterLevel;
|
||||
this.jobs = jobs;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
public int getMasterLevel() {
|
||||
return masterLevel;
|
||||
}
|
||||
|
||||
public boolean jobsContains(Job job) {
|
||||
return jobs.contains(job.getId());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -26,25 +26,24 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class BuffExceptRequirement extends AbstractQuestRequirement {
|
||||
private int buffId = -1;
|
||||
|
||||
public BuffExceptRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// item buffs are negative
|
||||
buffId = -1 * Integer.parseInt(DataTool.getString(data));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return !chr.hasBuffFromSourceid(buffId);
|
||||
}
|
||||
private int buffId = -1;
|
||||
|
||||
public BuffExceptRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// item buffs are negative
|
||||
buffId = -1 * Integer.parseInt(DataTool.getString(data));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return !chr.hasBuffFromSourceid(buffId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,25 +26,24 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class BuffRequirement extends AbstractQuestRequirement {
|
||||
private int buffId = 1;
|
||||
|
||||
public BuffRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// item buffs are negative
|
||||
buffId = -1 * Integer.parseInt(DataTool.getString(data));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.hasBuffFromSourceid(buffId);
|
||||
}
|
||||
private int buffId = 1;
|
||||
|
||||
public BuffRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// item buffs are negative
|
||||
buffId = -1 * Integer.parseInt(DataTool.getString(data));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.hasBuffFromSourceid(buffId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,26 +28,25 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class CompletedQuestRequirement extends AbstractQuestRequirement {
|
||||
private int reqQuest;
|
||||
|
||||
|
||||
public CompletedQuestRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.COMPLETED_QUEST);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqQuest = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getCompletedQuests().size() >= reqQuest;
|
||||
}
|
||||
private int reqQuest;
|
||||
|
||||
|
||||
public CompletedQuestRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.COMPLETED_QUEST);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqQuest = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getCompletedQuests().size() >= reqQuest;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,32 +30,30 @@ import server.quest.QuestRequirementType;
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class EndDateRequirement extends AbstractQuestRequirement {
|
||||
private String timeStr;
|
||||
|
||||
|
||||
public EndDateRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.END_DATE);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
timeStr = DataTool.getString(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
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);
|
||||
return cal.getTimeInMillis() >= System.currentTimeMillis();
|
||||
}
|
||||
private String timeStr;
|
||||
|
||||
|
||||
public EndDateRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.END_DATE);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
timeStr = DataTool.getString(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
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);
|
||||
return cal.getTimeInMillis() >= System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,29 +28,28 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class FieldEnterRequirement extends AbstractQuestRequirement {
|
||||
private int mapId = -1;
|
||||
|
||||
|
||||
public FieldEnterRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.FIELD_ENTER);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
Data zeroField = data.getChildByPath("0");
|
||||
if (zeroField != null) {
|
||||
mapId = DataTool.getInt(zeroField);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return mapId == chr.getMapId();
|
||||
}
|
||||
private int mapId = -1;
|
||||
|
||||
|
||||
public FieldEnterRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.FIELD_ENTER);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
Data zeroField = data.getChildByPath("0");
|
||||
if (zeroField != null) {
|
||||
mapId = DataTool.getInt(zeroField);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return mapId == chr.getMapId();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,36 +31,35 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class InfoExRequirement extends AbstractQuestRequirement {
|
||||
private List<String> infoExpected = new ArrayList<>();
|
||||
private int questID;
|
||||
|
||||
|
||||
public InfoExRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INFO_EX);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// Because we have to...
|
||||
for(Data infoEx : data.getChildren()) {
|
||||
Data value = infoEx.getChildByPath("value");
|
||||
infoExpected.add(DataTool.getString(value, ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<String> getInfo() {
|
||||
return infoExpected;
|
||||
private final List<String> infoExpected = new ArrayList<>();
|
||||
private final int questID;
|
||||
|
||||
|
||||
public InfoExRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INFO_EX);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
// Because we have to...
|
||||
for (Data infoEx : data.getChildren()) {
|
||||
Data value = infoEx.getChildByPath("value");
|
||||
infoExpected.add(DataTool.getString(value, ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class InfoNumberRequirement extends AbstractQuestRequirement {
|
||||
|
||||
private short infoNumber;
|
||||
private int questID;
|
||||
|
||||
public InfoNumberRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INFO_NUMBER);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
private short infoNumber;
|
||||
private final int questID;
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
infoNumber = (short) DataTool.getIntConvert(data, 0);
|
||||
}
|
||||
public InfoNumberRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INFO_NUMBER);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
infoNumber = (short) DataTool.getIntConvert(data, 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public short getInfoNumber() {
|
||||
return infoNumber;
|
||||
}
|
||||
public short getInfoNumber() {
|
||||
return infoNumber;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,69 +29,69 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class IntervalRequirement extends AbstractQuestRequirement {
|
||||
private int interval = -1;
|
||||
private int questID;
|
||||
|
||||
public IntervalRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INTERVAL);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
public int getInterval() {
|
||||
return interval;
|
||||
private int interval = -1;
|
||||
private final int questID;
|
||||
|
||||
public IntervalRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.INTERVAL);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
public int getInterval() {
|
||||
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();
|
||||
long leftTime = futureTime - System.currentTimeMillis();
|
||||
switch (mode) {
|
||||
case 2:
|
||||
int hours = (int) ((leftTime / (1000 * 60 * 60)));
|
||||
str.append(hours + " hours, ");
|
||||
|
||||
byte mode = 0;
|
||||
if(leftTime / (60*1000) > 0) {
|
||||
mode++; //counts minutes
|
||||
case 1:
|
||||
int minutes = (int) ((leftTime / (1000 * 60)) % 60);
|
||||
str.append(minutes + " minutes, ");
|
||||
|
||||
if(leftTime / (60*60*1000) > 0)
|
||||
mode++; //counts hours
|
||||
}
|
||||
|
||||
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();
|
||||
default:
|
||||
int seconds = (int) (leftTime / 1000) % 60;
|
||||
str.append(seconds + " seconds");
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
|
||||
if (check || check2) {
|
||||
return true;
|
||||
} else {
|
||||
chr.message("This quest will become available again in approximately " + getIntervalTimeLeft(chr, this) + ".");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return str.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
|
||||
if (check || check2) {
|
||||
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;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class ItemRequirement extends AbstractQuestRequirement {
|
||||
Map<Integer, Integer> items = new HashMap<>();
|
||||
|
||||
|
||||
public ItemRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.ITEM);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data itemEntry : data.getChildren()) {
|
||||
int itemId = DataTool.getInt(itemEntry.getChildByPath("id"));
|
||||
int count = DataTool.getInt(itemEntry.getChildByPath("count"), 0);
|
||||
|
||||
items.put(itemId, count);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
ItemInformationProvider ii = ItemInformationProvider.getInstance();
|
||||
for(Integer itemId : items.keySet()) {
|
||||
int countNeeded = items.get(itemId);
|
||||
int count = 0;
|
||||
|
||||
InventoryType iType = ItemConstants.getInventoryType(itemId);
|
||||
|
||||
if (iType.equals(InventoryType.UNDEFINED)) {
|
||||
return false;
|
||||
}
|
||||
for (Item item : chr.getInventory(iType).listById(itemId)) {
|
||||
count += item.getQuantity();
|
||||
}
|
||||
//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(chr.isGM()) {
|
||||
for (Item item : chr.getInventory(InventoryType.EQUIPPED).listById(itemId)) {
|
||||
count += item.getQuantity();
|
||||
}
|
||||
} else {
|
||||
if(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.");
|
||||
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;
|
||||
Map<Integer, Integer> items = new HashMap<>();
|
||||
|
||||
|
||||
public ItemRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.ITEM);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data itemEntry : data.getChildren()) {
|
||||
int itemId = DataTool.getInt(itemEntry.getChildByPath("id"));
|
||||
int count = DataTool.getInt(itemEntry.getChildByPath("count"), 0);
|
||||
|
||||
items.put(itemId, count);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
ItemInformationProvider ii = ItemInformationProvider.getInstance();
|
||||
for (Integer itemId : items.keySet()) {
|
||||
int countNeeded = items.get(itemId);
|
||||
int count = 0;
|
||||
|
||||
InventoryType iType = ItemConstants.getInventoryType(itemId);
|
||||
|
||||
if (iType.equals(InventoryType.UNDEFINED)) {
|
||||
return false;
|
||||
}
|
||||
for (Item item : chr.getInventory(iType).listById(itemId)) {
|
||||
count += item.getQuantity();
|
||||
}
|
||||
//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 (chr.isGM()) {
|
||||
for (Item item : chr.getInventory(InventoryType.EQUIPPED).listById(itemId)) {
|
||||
count += item.getQuantity();
|
||||
}
|
||||
} else {
|
||||
if (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.");
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,36 +32,34 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class JobRequirement extends AbstractQuestRequirement {
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
public JobRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.JOB);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data jobEntry : data.getChildren()) {
|
||||
jobs.add(DataTool.getInt(jobEntry));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for(Integer job : jobs) {
|
||||
if (chr.getJob().equals(Job.getById(job)) || chr.isGM()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
List<Integer> jobs = new ArrayList<>();
|
||||
|
||||
public JobRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.JOB);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data jobEntry : data.getChildren()) {
|
||||
jobs.add(DataTool.getInt(jobEntry));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for (Integer job : jobs) {
|
||||
if (chr.getJob().equals(Job.getById(job)) || chr.isGM()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,30 +28,28 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MaxLevelRequirement extends AbstractQuestRequirement {
|
||||
private int maxLevel;
|
||||
|
||||
|
||||
public MaxLevelRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MAX_LEVEL);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
maxLevel = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return maxLevel >= chr.getLevel();
|
||||
}
|
||||
private int maxLevel;
|
||||
|
||||
|
||||
public MaxLevelRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MAX_LEVEL);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
maxLevel = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return maxLevel >= chr.getLevel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,30 +26,29 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class MesoRequirement extends AbstractQuestRequirement {
|
||||
private int meso = 0;
|
||||
|
||||
public MesoRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MESO);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
meso = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
if (chr.getMeso() >= meso) {
|
||||
return true;
|
||||
} else {
|
||||
chr.dropMessage(5, "You don't have enough mesos to complete this quest.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
private int meso = 0;
|
||||
|
||||
public MesoRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MESO);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
meso = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
if (chr.getMeso() >= meso) {
|
||||
return true;
|
||||
} else {
|
||||
chr.dropMessage(5, "You don't have enough mesos to complete this quest.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,27 +28,26 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MinLevelRequirement extends AbstractQuestRequirement {
|
||||
private int minLevel;
|
||||
|
||||
|
||||
public MinLevelRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MIN_LEVEL);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
minLevel = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getLevel() >= minLevel;
|
||||
}
|
||||
private int minLevel;
|
||||
|
||||
|
||||
public MinLevelRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MIN_LEVEL);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
minLevel = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getLevel() >= minLevel;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,39 +29,40 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MinTamenessRequirement extends AbstractQuestRequirement {
|
||||
private int minTameness;
|
||||
|
||||
|
||||
public MinTamenessRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MIN_PET_TAMENESS);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
minTameness = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
int curCloseness = 0;
|
||||
|
||||
for(Pet pet : chr.getPets()) {
|
||||
if(pet == null) continue;
|
||||
|
||||
if(pet.getCloseness() > curCloseness)
|
||||
curCloseness = pet.getCloseness();
|
||||
}
|
||||
|
||||
return curCloseness >= minTameness;
|
||||
}
|
||||
private int minTameness;
|
||||
|
||||
|
||||
public MinTamenessRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MIN_PET_TAMENESS);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
minTameness = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
int curCloseness = 0;
|
||||
|
||||
for (Pet pet : chr.getPets()) {
|
||||
if (pet == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pet.getCloseness() > curCloseness) {
|
||||
curCloseness = pet.getCloseness();
|
||||
}
|
||||
}
|
||||
|
||||
return curCloseness >= minTameness;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,57 +33,56 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MobRequirement extends AbstractQuestRequirement {
|
||||
Map<Integer, Integer> mobs = new HashMap<>();
|
||||
private int questID;
|
||||
|
||||
public MobRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MOB);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data questEntry : data.getChildren()) {
|
||||
int mobID = DataTool.getInt(questEntry.getChildByPath("id"));
|
||||
int countReq = DataTool.getInt(questEntry.getChildByPath("count"));
|
||||
mobs.put(mobID, countReq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
for(Integer mobID : mobs.keySet()) {
|
||||
int countReq = mobs.get(mobID);
|
||||
int progress;
|
||||
|
||||
try {
|
||||
progress = Integer.parseInt(status.getProgress(mobID));
|
||||
} catch (NumberFormatException ex) {
|
||||
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, ex, "Mob: " + mobID + " Quest: " + questID + "CID: " + chr.getId() + " Progress: " + status.getProgress(mobID));
|
||||
return false;
|
||||
}
|
||||
|
||||
if(progress < countReq)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getRequiredMobCount(int mobid) {
|
||||
if(mobs.containsKey(mobid)) {
|
||||
return mobs.get(mobid);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Map<Integer, Integer> mobs = new HashMap<>();
|
||||
private final int questID;
|
||||
|
||||
public MobRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MOB);
|
||||
questID = quest.getId();
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data questEntry : data.getChildren()) {
|
||||
int mobID = DataTool.getInt(questEntry.getChildByPath("id"));
|
||||
int countReq = DataTool.getInt(questEntry.getChildByPath("count"));
|
||||
mobs.put(mobID, countReq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
QuestStatus status = chr.getQuest(Quest.getInstance(questID));
|
||||
for (Integer mobID : mobs.keySet()) {
|
||||
int countReq = mobs.get(mobID);
|
||||
int progress;
|
||||
|
||||
try {
|
||||
progress = Integer.parseInt(status.getProgress(mobID));
|
||||
} catch (NumberFormatException ex) {
|
||||
FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, ex, "Mob: " + mobID + " Quest: " + questID + "CID: " + chr.getId() + " Progress: " + status.getProgress(mobID));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (progress < countReq) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getRequiredMobCount(int mobid) {
|
||||
if (mobs.containsKey(mobid)) {
|
||||
return mobs.get(mobid);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,26 +28,25 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class MonsterBookCountRequirement extends AbstractQuestRequirement {
|
||||
private int reqCards;
|
||||
|
||||
|
||||
public MonsterBookCountRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MONSTER_BOOK);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqCards = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getMonsterBook().getTotalCards() >= reqCards;
|
||||
}
|
||||
private int reqCards;
|
||||
|
||||
|
||||
public MonsterBookCountRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.MONSTER_BOOK);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqCards = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return chr.getMonsterBook().getTotalCards() >= reqCards;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,29 +28,28 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class NpcRequirement extends AbstractQuestRequirement {
|
||||
private int reqNPC;
|
||||
|
||||
public NpcRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.NPC);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqNPC = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return npcid != null && npcid == reqNPC;
|
||||
}
|
||||
|
||||
public int get() {
|
||||
return reqNPC;
|
||||
}
|
||||
private int reqNPC;
|
||||
|
||||
public NpcRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.NPC);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqNPC = DataTool.getInt(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return npcid != null && npcid == reqNPC;
|
||||
}
|
||||
|
||||
public int get() {
|
||||
return reqNPC;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,36 +32,38 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class PetRequirement extends AbstractQuestRequirement {
|
||||
List<Integer> petIDs = new ArrayList<>();
|
||||
|
||||
|
||||
public PetRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.PET);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for(Data petData : data.getChildren()) {
|
||||
petIDs.add(DataTool.getInt(petData.getChildByPath("id")));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for(Pet pet : chr.getPets()) {
|
||||
if(pet == null) continue; // thanks Arufonsu for showing a NPE occurring here
|
||||
|
||||
if(petIDs.contains(pet.getItemId()))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
List<Integer> petIDs = new ArrayList<>();
|
||||
|
||||
|
||||
public PetRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.PET);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data petData : data.getChildren()) {
|
||||
petIDs.add(DataTool.getInt(petData.getChildByPath("id")));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for (Pet pet : chr.getPets()) {
|
||||
if (pet == null) {
|
||||
continue; // thanks Arufonsu for showing a NPE occurring here
|
||||
}
|
||||
|
||||
if (petIDs.contains(pet.getItemId())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,45 +29,44 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Tyler (Twdtwd)
|
||||
*/
|
||||
public class QuestRequirement extends AbstractQuestRequirement {
|
||||
Map<Integer, Integer> quests = new HashMap<>();
|
||||
|
||||
public QuestRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.QUEST);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data questEntry : data.getChildren()) {
|
||||
int questID = DataTool.getInt(questEntry.getChildByPath("id"));
|
||||
int stateReq = DataTool.getInt(questEntry.getChildByPath("state"));
|
||||
quests.put(questID, stateReq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for(Integer questID : quests.keySet()) {
|
||||
int stateReq = quests.get(questID);
|
||||
QuestStatus qs = chr.getQuest(Quest.getInstance(questID));
|
||||
|
||||
if(qs == null && QuestStatus.Status.getById(stateReq).equals(QuestStatus.Status.NOT_STARTED))
|
||||
continue;
|
||||
|
||||
if(qs == null || !qs.getStatus().equals(QuestStatus.Status.getById(stateReq))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
Map<Integer, Integer> quests = new HashMap<>();
|
||||
|
||||
public QuestRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.QUEST);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
for (Data questEntry : data.getChildren()) {
|
||||
int questID = DataTool.getInt(questEntry.getChildByPath("id"));
|
||||
int stateReq = DataTool.getInt(questEntry.getChildByPath("state"));
|
||||
quests.put(questID, stateReq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
for (Integer questID : quests.keySet()) {
|
||||
int stateReq = quests.get(questID);
|
||||
QuestStatus qs = chr.getQuest(Quest.getInstance(questID));
|
||||
|
||||
if (qs == null && QuestStatus.Status.getById(stateReq).equals(QuestStatus.Status.NOT_STARTED)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (qs == null || !qs.getStatus().equals(QuestStatus.Status.getById(stateReq))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,28 +26,27 @@ import server.quest.Quest;
|
||||
import server.quest.QuestRequirementType;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class ScriptRequirement extends AbstractQuestRequirement {
|
||||
private boolean reqScript;
|
||||
|
||||
public ScriptRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqScript = !DataTool.getString(data, "").isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean get() {
|
||||
return reqScript;
|
||||
}
|
||||
private boolean reqScript;
|
||||
|
||||
public ScriptRequirement(Quest quest, Data data) {
|
||||
super(QuestRequirementType.BUFF);
|
||||
processData(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processData(Data data) {
|
||||
reqScript = !DataTool.getString(data, "").isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Character chr, Integer npcid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean get() {
|
||||
return reqScript;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user