diff --git a/aCis/java/net/sf/l2j/gameserver/model/actor/instance/Merchant.java b/aCis/java/net/sf/l2j/gameserver/model/actor/instance/Merchant.java index 7a627a1..be5333b 100644 --- a/aCis/java/net/sf/l2j/gameserver/model/actor/instance/Merchant.java +++ b/aCis/java/net/sf/l2j/gameserver/model/actor/instance/Merchant.java @@ -6,12 +6,17 @@ import net.sf.l2j.Config; import net.sf.l2j.gameserver.data.cache.HtmCache; import net.sf.l2j.gameserver.data.manager.BuyListManager; +import net.sf.l2j.gameserver.data.xml.MerchantSayData; import net.sf.l2j.gameserver.data.xml.MultisellData; +import net.sf.l2j.gameserver.enums.FloodProtector; +import net.sf.l2j.gameserver.model.MerchantSay; import net.sf.l2j.gameserver.model.actor.Player; import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; import net.sf.l2j.gameserver.model.buylist.NpcBuyList; import net.sf.l2j.gameserver.model.item.instance.ItemInstance; import net.sf.l2j.gameserver.network.serverpackets.BuyList; +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay; +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.network.serverpackets.SellList; import net.sf.l2j.gameserver.network.serverpackets.ShopPreviewList; @@ -32,6 +37,15 @@ @Override public String getHtmlPath(int npcId, int val) { + final MerchantSay says = MerchantSayData.getInstance().getNpc(getNpcId()); + if (says == null) + return ""; + + broadcastPacket(new CreatureSay(getObjectId(), says.getType(), getName(), says.getText())); + + if (says.isEffects()) + broadcastPacket(new MagicSkillUse(this, this, 2024, 1, 5, 0)); + String filename = ""; if (val == 0) @@ -148,6 +162,9 @@ @Override public void showChatWindow(Player player, int val) { + if (!player.getClient().performAction(FloodProtector.SOCIAL)) + return; + // Generic PK check. Send back the HTM if found and cancel current action. if (!Config.KARMA_PLAYER_CAN_SHOP && player.getKarma() > 0 && showPkDenyChatWindow(player, "merchant")) return; diff --git a/aCis/java/net/sf/l2j/gameserver/data/xml/MerchantSayData.java b/aCis/java/net/sf/l2j/gameserver/data/xml/MerchantSayData.java new file mode 100644 index 0000000..8d089c8 --- /dev/null +++ b/aCis/java/net/sf/l2j/gameserver/data/xml/MerchantSayData.java @@ -0,0 +1,70 @@ +package net.sf.l2j.gameserver.data.xml; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import net.sf.l2j.commons.data.xml.IXmlReader; + +import net.sf.l2j.gameserver.enums.SayType; +import net.sf.l2j.gameserver.model.MerchantSay; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; + +/** + * @author willi + * + */ +public class MerchantSayData implements IXmlReader +{ + private final Map _says = new HashMap<>(); + + public MerchantSayData() + { + load(); + } + + public void reload() + { + _says.clear(); + load(); + } + + @Override + public void load() + { + parseFile("./data/xml/merchantSays.xml"); + LOGGER.info("Loaded {} merchants says.", _says.size()); + } + + @Override + public void parseDocument(Document doc, Path path) + { + forEach(doc, "list", listNode -> forEach(listNode, "settings", enchantNode -> + { + NamedNodeMap attrs = enchantNode.getAttributes(); + + final int npcId = Integer.valueOf(attrs.getNamedItem("npcId").getNodeValue()); + final String text = attrs.getNamedItem("text").getNodeValue(); + final SayType say = Enum.valueOf(SayType.class, attrs.getNamedItem("sayType").getNodeValue()); + final boolean effect = Boolean.valueOf(attrs.getNamedItem("effect").getNodeValue()); + + _says.put(npcId, new MerchantSay(npcId, text, say, effect)); + })); + } + + public MerchantSay getNpc(int npcId) + { + return _says.get(npcId); + } + + public static MerchantSayData getInstance() + { + return SingletonHolder.INSTANCE; + } + + private static class SingletonHolder + { + protected static final MerchantSayData INSTANCE = new MerchantSayData(); + } +} \ No newline at end of file diff --git a/aCis/java/net/sf/l2j/gameserver/model/MerchantSay.java b/aCis/java/net/sf/l2j/gameserver/model/MerchantSay.java new file mode 100644 index 0000000..256d7af --- /dev/null +++ b/aCis/java/net/sf/l2j/gameserver/model/MerchantSay.java @@ -0,0 +1,43 @@ +package net.sf.l2j.gameserver.model; + +import net.sf.l2j.gameserver.enums.SayType; + +/** + * @author willi + * + */ +public class MerchantSay +{ + private final int _npcId; + private final String _text; + private final SayType _type; + private final boolean _effect; + + public MerchantSay(int npcId, String text, SayType type, boolean effect) + { + _npcId = npcId; + _text = text; + _type = type; + _effect = effect; + } + + public int getNpcId() + { + return _npcId; + } + + public String getText() + { + return _text; + } + + public SayType getType() + { + return _type; + } + + public boolean isEffects() + { + return _effect; + } +} \ 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 2dc7f5c..4234d11 100644 --- a/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java +++ b/aCis/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java @@ -17,6 +17,7 @@ import net.sf.l2j.gameserver.data.xml.EnchantData; import net.sf.l2j.gameserver.data.xml.InstantTeleportData; import net.sf.l2j.gameserver.data.xml.ItemData; +import net.sf.l2j.gameserver.data.xml.MerchantSayData; import net.sf.l2j.gameserver.data.xml.MultisellData; import net.sf.l2j.gameserver.data.xml.NpcData; import net.sf.l2j.gameserver.data.xml.PolymorphData; @@ -105,6 +106,11 @@ ItemData.getInstance().reload(); player.sendMessage("Items' templates have been reloaded."); } + else if (type.equals("merchantsay")) + { + MerchantSayData.getInstance().reload(); + player.sendMessage("The merchant say has been reloaded."); + } else if (type.equals("multisell")) { MultisellData.getInstance().reload(); @@ -166,7 +172,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/GameServer.java b/aCis/java/net/sf/l2j/gameserver/GameServer.java index 80ff747..3d7df81 100644 --- a/aCis/java/net/sf/l2j/gameserver/GameServer.java +++ b/aCis/java/net/sf/l2j/gameserver/GameServer.java @@ -61,12 +61,14 @@ 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; import net.sf.l2j.gameserver.data.xml.InstantTeleportData; import net.sf.l2j.gameserver.data.xml.ItemData; import net.sf.l2j.gameserver.data.xml.MapRegionData; +import net.sf.l2j.gameserver.data.xml.MerchantSayData; import net.sf.l2j.gameserver.data.xml.MultisellData; import net.sf.l2j.gameserver.data.xml.NewbieBuffData; import net.sf.l2j.gameserver.data.xml.NpcData; @@ -255,6 +258,7 @@ TeleportData.getInstance(); RaidBossInfoManager.getInstance(); PolymorphData.getInstance(); + MerchantSayData.getInstance(); if (Config.FIND_COOL_NPCS_EASY) { diff --git a/aCis/data/xml/merchantSays.xml b/aCis/data/xml/merchantSays.xml new file mode 100644 index 0000000..73f515e --- /dev/null +++ b/aCis/data/xml/merchantSays.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/aCis/data/html/admin/server_menu.htm b/aCis/data/html/admin/server_menu.htm index 03c1fa2..e54b9b5 100644 --- a/aCis/data/html/admin/server_menu.htm +++ b/aCis/data/html/admin/server_menu.htm @@ -18,7 +18,7 @@ Reload - +