diff --git a/aCis/data/xml/dropType.xml b/aCis/data/xml/dropType.xml new file mode 100644 index 0000000..a30f1f7 --- /dev/null +++ b/aCis/data/xml/dropType.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/aCis/java/net/sf/l2j/gameserver/GameServer.java b/aCis/java/net/sf/l2j/gameserver/GameServer.java index d10ac2b..3c23a09 100644 --- a/aCis/java/net/sf/l2j/gameserver/GameServer.java +++ b/aCis/java/net/sf/l2j/gameserver/GameServer.java @@ -60,6 +60,7 @@ import net.sf.l2j.gameserver.data.xml.AugmentationData; import net.sf.l2j.gameserver.data.xml.DoorData; import net.sf.l2j.gameserver.data.xml.DressMeData; +import net.sf.l2j.gameserver.data.xml.DropTypeData; import net.sf.l2j.gameserver.data.xml.FishData; import net.sf.l2j.gameserver.data.xml.HennaData; import net.sf.l2j.gameserver.data.xml.HerbDropData; @@ -238,6 +239,7 @@ StringUtil.printSection("NPCs"); BufferManager.getInstance(); + DropTypeData.getInstance(); HerbDropData.getInstance(); NpcData.getInstance(); WalkerRouteData.getInstance(); diff --git a/aCis/java/net/sf/l2j/gameserver/data/xml/DropTypeData.java b/aCis/java/net/sf/l2j/gameserver/data/xml/DropTypeData.java new file mode 100644 index 0000000..2a6b225 --- /dev/null +++ b/aCis/java/net/sf/l2j/gameserver/data/xml/DropTypeData.java @@ -0,0 +1,84 @@ +package net.sf.l2j.gameserver.data.xml; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import net.sf.l2j.commons.data.xml.IXmlReader; + +import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; +import net.sf.l2j.gameserver.model.item.DropCategory; +import net.sf.l2j.gameserver.model.item.DropType; + +import org.w3c.dom.Document; + +/** + * @author Williams + * + */ +public class DropTypeData implements IXmlReader +{ + private final List _data = new ArrayList<>(); + + public DropTypeData() + { + load(); + } + + @Override + public void load() + { + parseFile("./data/xml/dropType.xml"); + LOGGER.info("Loaded {} drop data.", _data.size()); + } + + @Override + public void parseDocument(Document doc, Path path) + { + forEach(doc, "list", listNode -> + { + forEach(listNode, "drops", dropNode -> + { + final DropType data = new DropType(parseAttributes(dropNode)); + final DropCategory category = new DropCategory(data.getItemId()); + + if (ItemData.getInstance().getTemplate(data.getItemId()) == null) + { + LOGGER.warn("Droplist data for undefined itemId: {}.", data.getItemId()); + return; + } + + category.addDropData(data, false); + + for (NpcTemplate template : NpcData.getInstance().getAllNpcs()) + { + if (data.getType().equalsIgnoreCase(template.getType()) || data.getNpcId() == template.getNpcId()) + template.addDropCategory(category); + } + + _data.add(data); + }); + }); + } + + public void reload() + { + _data.clear(); + load(); + } + + public List getDrops() + { + return _data; + } + + public static DropTypeData getInstance() + { + return SingletonHolder.INSTANCE; + } + + private static class SingletonHolder + { + protected static final DropTypeData INSTANCE = new DropTypeData(); + } +} \ No newline at end of file diff --git a/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java b/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java index f322922..2dc7f5c 100644 --- a/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java +++ b/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java @@ -13,6 +13,7 @@ import net.sf.l2j.gameserver.data.xml.AnnouncementData; import net.sf.l2j.gameserver.data.xml.DoorData; import net.sf.l2j.gameserver.data.xml.DressMeData; +import net.sf.l2j.gameserver.data.xml.DropTypeData; import net.sf.l2j.gameserver.data.xml.EnchantData; import net.sf.l2j.gameserver.data.xml.InstantTeleportData; import net.sf.l2j.gameserver.data.xml.ItemData; @@ -74,6 +75,11 @@ CursedWeaponManager.getInstance().reload(); player.sendMessage("Cursed weapons have been reloaded."); } + else if (type.startsWith("drop")) + { + DropTypeData.getInstance().reload(); + player.sendMessage("Drop have been reloaded."); + } else if (type.startsWith("door")) { DoorData.getInstance().reload(); @@ -160,7 +166,7 @@ public void sendUsage(Player player) { player.sendMessage("Usage : //reload "); - player.sendMessage("Usage : //reload "); + player.sendMessage("Usage : //reload "); player.sendMessage("Usage : //reload "); } diff --git a/aCis/java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java b/aCis/java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java index 2bf8cca..0944739 100644 --- a/aCis/java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java +++ b/aCis/java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java @@ -340,7 +340,38 @@ } return list; } + + public final void addDropCategory(DropCategory category) + { + synchronized (_categories) + { + if (_categories.isEmpty()) + _categories = new ArrayList<>(); // empty means _categories is instance of Collections.emptyList(); - cannot add items to this container + else + { + // category already exists, return + for (DropCategory cat : _categories) + { + if (cat.getCategoryType() == category.getCategoryType()) + return; + } + } + + _categories.add(category); + } + } + public final void removeDropCategory(DropCategory category) + { + synchronized (_categories) + { + if (_categories.isEmpty()) + return; + + _categories.remove(category); + } + } + /** * @return the {@link List} of all possible {@link DropData}s of this {@link NpcTemplate} linked to SPOIL behavior. */ @@ -354,36 +385,7 @@ } return list; } - - /** - * Add a {@link DropData} to a given category. If the category does not exist, create it. - * @param drop : The DropData to add. - * @param categoryType : The category type we refer. - */ - public void addDropData(DropData drop, int categoryType) - { - final boolean isBossType = isType("RaidBoss") || isType("GrandBoss"); - - synchronized (_categories) - { - // Category exists, stores the drop and return. - for (DropCategory cat : _categories) - { - if (cat.getCategoryType() == categoryType) - { - cat.addDropData(drop, isBossType); - return; - } - } - - // Category doesn't exist, create and store it. - final DropCategory cat = new DropCategory(categoryType); - cat.addDropData(drop, isBossType); - - _categories.add(cat); - } - } - + /** * @return the {@link List} of all {@link MinionData}. */ diff --git a/aCis/java/net/sf/l2j/gameserver/model/item/DropType.java b/aCis/java/net/sf/l2j/gameserver/model/item/DropType.java new file mode 100644 index 0000000..fa43cf8 --- /dev/null +++ b/aCis/java/net/sf/l2j/gameserver/model/item/DropType.java @@ -0,0 +1,31 @@ +package net.sf.l2j.gameserver.model.item; + +import net.sf.l2j.commons.data.StatSet; + +/** + * @author Williams + * + */ +public class DropType extends DropData +{ + private final String _type; + private final int _npcId; + + public DropType(StatSet set) + { + super(set.getInteger("itemId"), set.getInteger("minDrop"), set.getInteger("maxDrop"), set.getInteger("chance")); + + _npcId = set.getInteger("npcId", 0); + _type = set.getString("type", ""); + } + + public int getNpcId() + { + return _npcId; + } + + public String getType() + { + return _type; + } +} \ No newline at end of file