Reformat and clean up "server" package
This commit is contained in:
@@ -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