diff --git a/L2J_Mobius_Test/dist/game/config/AdminCommands.xml b/L2J_Mobius_Test/dist/game/config/AdminCommands.xml index c9e9d858dd..31e3345b88 100644 --- a/L2J_Mobius_Test/dist/game/config/AdminCommands.xml +++ b/L2J_Mobius_Test/dist/game/config/AdminCommands.xml @@ -27,6 +27,8 @@ + + diff --git a/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor.htm b/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor.htm new file mode 100644 index 0000000000..1caedfac39 --- /dev/null +++ b/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor.htm @@ -0,0 +1,29 @@ + + + Zone Editor + + +
+ + + + + + + +
+
+
+ +
+ +Zones + +
+ + %zones% +
+
+
+ + \ No newline at end of file diff --git a/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor_create.htm b/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor_create.htm new file mode 100644 index 0000000000..82ec7dc75e --- /dev/null +++ b/L2J_Mobius_Test/dist/game/data/html/admin/zone_editor_create.htm @@ -0,0 +1,63 @@ + + + Zone Creator + + +
+ + + + + + + +
+
+
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + %pages% + +
+ +Name: %name% + + + + + + + + + + + + + +
#XYZEditTeleDele
+ +%nodes% +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Test/dist/game/data/scripts/ai/individual/Core.java b/L2J_Mobius_Test/dist/game/data/scripts/ai/individual/Core.java index 686879e4f8..b44b0a618c 100644 --- a/L2J_Mobius_Test/dist/game/data/scripts/ai/individual/Core.java +++ b/L2J_Mobius_Test/dist/game/data/scripts/ai/individual/Core.java @@ -97,7 +97,7 @@ public final class Core extends AbstractNpcAI } @Override - public void saveGlobalData() + public void onSave() { saveGlobalQuestVar("Core_Attacked", Boolean.toString(_firstAttacked)); } diff --git a/L2J_Mobius_Test/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Test/dist/game/data/scripts/handlers/MasterHandler.java index 4dd409e4e6..548529e5cb 100644 --- a/L2J_Mobius_Test/dist/game/data/scripts/handlers/MasterHandler.java +++ b/L2J_Mobius_Test/dist/game/data/scripts/handlers/MasterHandler.java @@ -130,6 +130,7 @@ import handlers.admincommandhandlers.AdminUnblockIp; import handlers.admincommandhandlers.AdminVitality; import handlers.admincommandhandlers.AdminWall; import handlers.admincommandhandlers.AdminZone; +import handlers.admincommandhandlers.AdminZones; import handlers.bypasshandlers.AlternateClassMaster; import handlers.bypasshandlers.ArcanCityMovie; import handlers.bypasshandlers.Augment; @@ -383,6 +384,7 @@ public final class MasterHandler AdminPetition.class, AdminPForge.class, AdminPledge.class, + AdminZones.class, AdminPolymorph.class, AdminPremium.class, AdminPrimePoints.class, diff --git a/L2J_Mobius_Test/dist/game/data/scripts/handlers/admincommandhandlers/AdminZones.java b/L2J_Mobius_Test/dist/game/data/scripts/handlers/admincommandhandlers/AdminZones.java new file mode 100644 index 0000000000..bd43b756ec --- /dev/null +++ b/L2J_Mobius_Test/dist/game/data/scripts/handlers/admincommandhandlers/AdminZones.java @@ -0,0 +1,580 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package handlers.admincommandhandlers; + +import java.awt.Color; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.enums.PlayerAction; +import com.l2jmobius.gameserver.handler.IAdminCommandHandler; +import com.l2jmobius.gameserver.instancemanager.ZoneManager; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.PageResult; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.ListenerRegisterType; +import com.l2jmobius.gameserver.model.events.annotations.Priority; +import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent; +import com.l2jmobius.gameserver.model.events.annotations.RegisterType; +import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerDlgAnswer; +import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerMoveRequest; +import com.l2jmobius.gameserver.model.events.returns.TerminateReturn; +import com.l2jmobius.gameserver.model.zone.L2ZoneType; +import com.l2jmobius.gameserver.model.zone.form.ZoneNPoly; +import com.l2jmobius.gameserver.network.serverpackets.ConfirmDlg; +import com.l2jmobius.gameserver.network.serverpackets.ExServerPrimitive; +import com.l2jmobius.gameserver.network.serverpackets.ExShowTerritory; +import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage; +import com.l2jmobius.gameserver.util.HtmlUtil; +import com.l2jmobius.gameserver.util.Util; +import com.l2jmobius.util.Rnd; + +import ai.AbstractNpcAI; + +/** + * @author UnAfraid + */ +public class AdminZones extends AbstractNpcAI implements IAdminCommandHandler +{ + private static final Logger _log = Logger.getLogger(AdminPathNode.class.getName()); + private final Map _zones = new ConcurrentHashMap<>(); + + private static final String[] COMMANDS = + { + "admin_zones", + }; + + public AdminZones() + { + super(AdminZones.class.getSimpleName(), "handlers"); + } + + @Override + public boolean useAdminCommand(String command, L2PcInstance activeChar) + { + final StringTokenizer st = new StringTokenizer(command); + final String cmd = st.nextToken(); + switch (cmd) + { + case "admin_zones": + { + if (!st.hasMoreTokens()) + { + buildZonesEditorWindow(activeChar); + return false; + } + final String subCmd = st.nextToken(); + switch (subCmd) + { + case "load": + { + if (st.hasMoreTokens()) + { + String name = ""; + while (st.hasMoreTokens()) + { + name += st.nextToken() + " "; + } + loadZone(activeChar, name.trim()); + } + break; + } + case "create": + { + buildHtmlWindow(activeChar, 0); + break; + } + case "setname": + { + String name = ""; + while (st.hasMoreTokens()) + { + name += st.nextToken() + " "; + } + if (!name.isEmpty()) + { + name = name.substring(0, name.length() - 1); + } + setName(activeChar, name); + break; + } + case "start": + { + enablePicking(activeChar); + break; + } + case "finish": + { + disablePicking(activeChar); + break; + } + case "show": + { + showPoints(activeChar); + final ConfirmDlg dlg = new ConfirmDlg("When enable show territory you must restart client to remove it, are you sure about that?"); + dlg.addTime(15 * 1000); + activeChar.sendPacket(dlg); + activeChar.addAction(PlayerAction.ADMIN_SHOW_TERRITORY); + break; + } + case "hide": + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if (holder != null) + { + final ExServerPrimitive exsp = new ExServerPrimitive("DebugPoint_" + activeChar.getObjectId(), activeChar.getX(), activeChar.getY(), activeChar.getZ()); + exsp.addPoint(Color.BLACK, 0, 0, 0); + activeChar.sendPacket(exsp); + } + break; + } + case "change": + { + if (!st.hasMoreTokens()) + { + activeChar.sendMessage("Missing node index!"); + break; + } + final String indexToken = st.nextToken(); + if (!Util.isDigit(indexToken)) + { + activeChar.sendMessage("Node index should be int!"); + break; + } + final int index = Integer.parseInt(indexToken); + changePoint(activeChar, index); + break; + } + case "delete": + { + if (!st.hasMoreTokens()) + { + activeChar.sendMessage("Missing node index!"); + break; + } + final String indexToken = st.nextToken(); + if (!Util.isDigit(indexToken)) + { + activeChar.sendMessage("Node index should be int!"); + break; + } + final int index = Integer.parseInt(indexToken); + deletePoint(activeChar, index); + showPoints(activeChar); + break; + } + case "clear": + { + _zones.remove(activeChar.getObjectId()); + break; + } + case "dump": + { + dumpPoints(activeChar); + break; + } + case "list": + { + final int page = Util.parseNextInt(st, 0); + buildHtmlWindow(activeChar, page); + return false; + } + } + break; + } + } + buildHtmlWindow(activeChar, 0); + return false; + } + + private void buildZonesEditorWindow(L2PcInstance activeChar) + { + final StringBuilder sb = new StringBuilder(); + final List zones = ZoneManager.getInstance().getZones(activeChar); + for (L2ZoneType zone : zones) + { + if (zone.getZone() instanceof ZoneNPoly) + { + sb.append(""); + sb.append("" + zone.getName() + ""); + sb.append(""); + } + } + + final NpcHtmlMessage msg = new NpcHtmlMessage(0, 1); + msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/zone_editor.htm"); + msg.replace("%zones%", sb.toString()); + activeChar.sendPacket(msg); + } + + /** + * @param activeChar + * @param zoneName + */ + private void loadZone(L2PcInstance activeChar, String zoneName) + { + activeChar.sendMessage("Searching for zone: " + zoneName); + final List zones = ZoneManager.getInstance().getZones(activeChar); + L2ZoneType zoneType = null; + for (L2ZoneType zone : zones) + { + if (zone.getName().equalsIgnoreCase(zoneName)) + { + zoneType = zone; + activeChar.sendMessage("Zone found: " + zone.getId()); + break; + } + } + + if ((zoneType != null) && (zoneType.getZone() instanceof ZoneNPoly)) + { + final ZoneNPoly zone = (ZoneNPoly) zoneType.getZone(); + final ZoneNodeHolder holder = _zones.computeIfAbsent(activeChar.getObjectId(), val -> new ZoneNodeHolder()); + holder.getNodes().clear(); + holder.setName(zoneType.getName()); + for (int i = 0; i < zone.getX().length; i++) + { + final int x = zone.getX()[i]; + final int y = zone.getY()[i]; + holder.addNode(new Location(x, y, GeoData.getInstance().getSpawnHeight(x, y, Rnd.get(zone.getLowZ(), zone.getHighZ())))); + } + showPoints(activeChar); + } + } + + /** + * @param activeChar + * @param name + */ + private void setName(L2PcInstance activeChar, String name) + { + if (name.contains("<") || name.contains(">") || name.contains("&") || name.contains("\\") || name.contains("\"") || name.contains("$")) + { + activeChar.sendMessage("You cannot use symbols like: < > & \" $ \\"); + return; + } + _zones.computeIfAbsent(activeChar.getObjectId(), key -> new ZoneNodeHolder()).setName(name); + } + + /** + * @param activeChar + */ + private void enablePicking(L2PcInstance activeChar) + { + if (!activeChar.hasAction(PlayerAction.ADMIN_POINT_PICKING)) + { + activeChar.addAction(PlayerAction.ADMIN_POINT_PICKING); + activeChar.sendMessage("Point picking mode activated!"); + } + else + { + activeChar.sendMessage("Point picking mode is already activated!"); + } + } + + /** + * @param activeChar + */ + private void disablePicking(L2PcInstance activeChar) + { + if (activeChar.removeAction(PlayerAction.ADMIN_POINT_PICKING)) + { + activeChar.sendMessage("Point picking mode deactivated!"); + } + else + { + activeChar.sendMessage("Point picking mode was not activated!"); + } + } + + /** + * @param activeChar + */ + private void showPoints(L2PcInstance activeChar) + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if (holder != null) + { + if (holder.getNodes().size() < 3) + { + activeChar.sendMessage("In order to visualize this zone you must have at least 3 points."); + return; + } + final ExServerPrimitive exsp = new ExServerPrimitive("DebugPoint_" + activeChar.getObjectId(), activeChar.getX(), activeChar.getY(), activeChar.getZ()); + int index = 1; + for (Location loc : holder.getNodes()) + { + exsp.addPoint("Point: " + index, Color.GREEN, true, loc); + index++; + } + final List list = holder.getNodes(); + for (int i = 1; i < list.size(); i++) + { + final Location prevLoc = list.get(i - 1); + final Location nextLoc = list.get(i); + exsp.addLine("Point " + i + " > " + (i + 1), Color.WHITE, true, prevLoc, nextLoc); + } + exsp.addLine("Point " + list.size() + " > 1", Color.WHITE, true, list.get(list.size() - 1), list.get(0)); + activeChar.sendPacket(exsp); + } + } + + /** + * @param activeChar + * @param index + */ + private void changePoint(L2PcInstance activeChar, int index) + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if (holder != null) + { + final Location loc = holder.getNodes().get(index); + if (loc != null) + { + enablePicking(activeChar); + holder.setChangingLoc(loc); + } + } + } + + /** + * @param activeChar + * @param index + */ + private void deletePoint(L2PcInstance activeChar, int index) + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if (holder != null) + { + final Location loc = holder.getNodes().get(index); + if (loc != null) + { + holder.getNodes().remove(loc); + activeChar.sendMessage("Node " + index + " has been removed!"); + if (holder.getNodes().isEmpty()) + { + activeChar.sendMessage("Since node list is empty destroying session!"); + _zones.remove(activeChar.getObjectId()); + } + } + } + } + + /** + * @param activeChar + */ + private void dumpPoints(final L2PcInstance activeChar) + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if ((holder != null) && !holder.getNodes().isEmpty()) + { + if (holder.getName().isEmpty()) + { + activeChar.sendMessage("Set name first!"); + return; + } + + final Location firstNode = holder.getNodes().get(0); + final StringBuilder sb = new StringBuilder(); + sb.append("" + Config.EOL); + sb.append("" + Config.EOL); + sb.append("\t" + Config.EOL); + for (Location loc : holder.getNodes()) + { + sb.append("\t\t" + Config.EOL); + } + sb.append("\t" + Config.EOL); + sb.append("" + Config.EOL); + try + { + File file = new File(Config.DATAPACK_ROOT, "log/points/" + activeChar.getAccountName() + "/" + holder.getName() + ".xml"); + if (file.exists()) + { + int i = 0; + while ((file = new File(Config.DATAPACK_ROOT, "log/points/" + activeChar.getAccountName() + "/" + holder.getName() + i + ".xml")).exists()) + { + i++; + } + } + if (!file.getParentFile().isDirectory()) + { + file.getParentFile().mkdirs(); + } + Files.write(file.toPath(), sb.toString().getBytes(StandardCharsets.UTF_8)); + activeChar.sendMessage("Successfully written on: " + file.getAbsolutePath().replace(Config.DATAPACK_ROOT.getAbsolutePath(), "")); + } + catch (Exception e) + { + activeChar.sendMessage("Failed writing the dump: " + e.getMessage()); + _log.log(Level.WARNING, "Failed writing point picking dump for " + activeChar.getName() + ":" + e.getMessage(), e); + } + } + } + + @RegisterEvent(EventType.ON_PLAYER_MOVE_REQUEST) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + @Priority(Integer.MAX_VALUE) + public TerminateReturn onPlayerPointPicking(OnPlayerMoveRequest event) + { + final L2PcInstance activeChar = event.getActiveChar(); + if (activeChar.hasAction(PlayerAction.ADMIN_POINT_PICKING)) + { + final Location newLocation = event.getLocation(); + final ZoneNodeHolder holder = _zones.computeIfAbsent(activeChar.getObjectId(), key -> new ZoneNodeHolder()); + final Location changeLog = holder.getChangingLoc(); + if (changeLog != null) + { + changeLog.setXYZ(newLocation); + holder.setChangingLoc(null); + activeChar.sendMessage("Location " + (holder.indexOf(changeLog) + 1) + " has been updated!"); + disablePicking(activeChar); + } + else + { + holder.addNode(newLocation); + activeChar.sendMessage("Location " + (holder.indexOf(changeLog) + 1) + " has been added!"); + } + // Auto visualization when nodes >= 3 + if (holder.getNodes().size() >= 3) + { + showPoints(activeChar); + } + buildHtmlWindow(activeChar, 0); + + return new TerminateReturn(true, true, false); + } + return null; + } + + @RegisterEvent(EventType.ON_PLAYER_DLG_ANSWER) + @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS) + public void onPlayerDlgAnswer(OnPlayerDlgAnswer event) + { + final L2PcInstance activeChar = event.getActiveChar(); + if (activeChar.removeAction(PlayerAction.ADMIN_SHOW_TERRITORY) && (event.getAnswer() == 1)) + { + final ZoneNodeHolder holder = _zones.get(activeChar.getObjectId()); + if (holder != null) + { + final List list = holder.getNodes(); + if (list.size() < 3) + { + activeChar.sendMessage("You must have at least 3 nodes to use this option!"); + return; + } + + final Location firstLoc = list.get(0); + final ExShowTerritory exst = new ExShowTerritory(firstLoc.getZ() - 100, firstLoc.getZ() + 100); + list.forEach(exst::addVertice); + activeChar.sendPacket(exst); + activeChar.sendMessage("In order to remove the debug you must restart your game client!"); + } + } + } + + @Override + public String[] getAdminCommandList() + { + return COMMANDS; + } + + private void buildHtmlWindow(final L2PcInstance activeChar, final int page) + { + final NpcHtmlMessage msg = new NpcHtmlMessage(0, 1); + msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/zone_editor_create.htm"); + final ZoneNodeHolder holder = _zones.computeIfAbsent(activeChar.getObjectId(), key -> new ZoneNodeHolder()); + final AtomicInteger position = new AtomicInteger(page * 20); + final PageResult result = HtmlUtil.createPage(holder.getNodes(), page, 20, i -> + { + return ""); } diff --git a/L2J_Mobius_Test/dist/game/data/scripts/quests/Q00146_TheZeroHour/Q00146_TheZeroHour.java b/L2J_Mobius_Test/dist/game/data/scripts/quests/Q00146_TheZeroHour/Q00146_TheZeroHour.java index 002245f424..c9ead5de6e 100644 --- a/L2J_Mobius_Test/dist/game/data/scripts/quests/Q00146_TheZeroHour/Q00146_TheZeroHour.java +++ b/L2J_Mobius_Test/dist/game/data/scripts/quests/Q00146_TheZeroHour/Q00146_TheZeroHour.java @@ -46,6 +46,12 @@ public class Q00146_TheZeroHour extends Quest registerQuestItems(FANG); } + @Override + public int getNpcStringId() + { + return 640; + } + @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/engines/items/DocumentItem.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/engines/items/DocumentItem.java index 2be18c6b8e..a7942e3e83 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/engines/items/DocumentItem.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/engines/items/DocumentItem.java @@ -17,6 +17,7 @@ package com.l2jmobius.gameserver.engines.items; import java.io.File; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; @@ -106,7 +107,7 @@ public final class DocumentItem extends DocumentBase _currentItem.set.set("name", itemName); _currentItem.set.set("additionalName", additionalName); - final Node first = n.getFirstChild(); + Node first = n.getFirstChild(); for (n = first; n != null; n = n.getNextSibling()) { if ("table".equalsIgnoreCase(n.getNodeName())) @@ -133,9 +134,9 @@ public final class DocumentItem extends DocumentBase else if ("cond".equalsIgnoreCase(n.getNodeName())) { makeItem(); - final Condition condition = parseCondition(n.getFirstChild(), _currentItem.item); - final Node msg = n.getAttributes().getNamedItem("msg"); - final Node msgId = n.getAttributes().getNamedItem("msgId"); + Condition condition = parseCondition(n.getFirstChild(), _currentItem.item); + Node msg = n.getAttributes().getNamedItem("msg"); + Node msgId = n.getAttributes().getNamedItem("msgId"); if ((condition != null) && (msg != null)) { condition.setMessage(msg.getNodeValue()); @@ -143,7 +144,8 @@ public final class DocumentItem extends DocumentBase else if ((condition != null) && (msgId != null)) { condition.setMessageId(Integer.decode(getValue(msgId.getNodeValue(), null))); - if ((n.getAttributes().getNamedItem("addName") != null) && (Integer.decode(getValue(msgId.getNodeValue(), null)) > 0)) + Node addName = n.getAttributes().getNamedItem("addName"); + if ((addName != null) && (Integer.decode(getValue(msgId.getNodeValue(), null)) > 0)) { condition.addName(); } @@ -157,13 +159,17 @@ public final class DocumentItem extends DocumentBase private void makeItem() throws InvocationTargetException { + // If item exists just reload the data. if (_currentItem.item != null) { - return; // item is already created + _currentItem.item.set(_currentItem.set); + return; } + try { - _currentItem.item = (L2Item) Class.forName("com.l2jmobius.gameserver.model.items.L2" + _currentItem.type).getConstructor(StatsSet.class).newInstance(_currentItem.set); + final Constructor itemClass = Class.forName("com.l2jmobius.gameserver.model.items.L2" + _currentItem.type).getConstructor(StatsSet.class); + _currentItem.item = (L2Item) itemClass.newInstance(_currentItem.set); } catch (Exception e) { diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/enums/PlayerAction.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/enums/PlayerAction.java index a4f5f5aa8f..722babb84a 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/enums/PlayerAction.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/enums/PlayerAction.java @@ -22,6 +22,8 @@ package com.l2jmobius.gameserver.enums; public enum PlayerAction { ADMIN_COMMAND, + ADMIN_POINT_PICKING, + ADMIN_SHOW_TERRITORY, USER_ENGAGE; private final int _mask; diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/instancemanager/QuestManager.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/instancemanager/QuestManager.java index 5fc0e039fc..853ad73aad 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/instancemanager/QuestManager.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/instancemanager/QuestManager.java @@ -47,7 +47,11 @@ public final class QuestManager public boolean reload(String questFolder) { final Quest q = getQuest(questFolder); - return (q != null) && q.reload(); + if (q == null) + { + return false; + } + return q.reload(); } /** @@ -58,7 +62,11 @@ public final class QuestManager public boolean reload(int questId) { final Quest q = getQuest(questId); - return (q != null) && q.reload(); + if (q == null) + { + return false; + } + return q.reload(); } /** @@ -110,20 +118,20 @@ public final class QuestManager } /** - * Calls {@link Quest#saveGlobalData()} in all quests and scripts. + * Calls {@link Quest#onSave()} in all quests and scripts. */ public void save() { // Save quests. for (Quest quest : _quests.values()) { - quest.saveGlobalData(); + quest.onSave(); } // Save scripts. for (Quest script : _scripts.values()) { - script.saveGlobalData(); + script.onSave(); } } @@ -135,7 +143,11 @@ public final class QuestManager */ public Quest getQuest(String name) { - return _quests.containsKey(name) ? _quests.get(name) : _scripts.get(name); + if (_quests.containsKey(name)) + { + return _quests.get(name); + } + return _scripts.get(name); } /** @@ -180,11 +192,13 @@ public final class QuestManager { old.unload(); _log.info(getClass().getSimpleName() + ": Replaced quest " + old.getName() + " (" + old.getId() + ") with a new version!"); + } if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS) { - _log.info("Loaded quest " + Util.splitWords(quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName()) + "."); + final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName(); + _log.info("Loaded quest " + Util.splitWords(questName) + "."); } } @@ -215,7 +229,7 @@ public final class QuestManager public boolean unload(Quest ms) { - ms.saveGlobalData(); + ms.onSave(); return removeScript(ms); } diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/EventType.java index 755b0861f4..7ad8a419b8 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/EventType.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/EventType.java @@ -62,6 +62,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerKarma import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLevelChanged; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout; +import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerMoveRequest; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerPKChanged; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange; import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerPvPChanged; @@ -221,6 +222,7 @@ public enum EventType ON_PLAYER_LOGIN(OnPlayerLogin.class, void.class), ON_PLAYER_LOGOUT(OnPlayerLogout.class, void.class), ON_PLAYER_PK_CHANGED(OnPlayerPKChanged.class, void.class), + ON_PLAYER_MOVE_REQUEST(OnPlayerMoveRequest.class, void.class, TerminateReturn.class), ON_PLAYER_PROFESSION_CHANGE(OnPlayerProfessionChange.class, void.class), ON_PLAYER_CHANGE_TO_AWAKENED_CLASS(OnPlayerChangeToAwakenedClass.class, void.class), ON_PLAYER_PVP_CHANGED(OnPlayerPvPChanged.class, void.class), diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerMoveRequest.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerMoveRequest.java new file mode 100644 index 0000000000..fbb066f040 --- /dev/null +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerMoveRequest.java @@ -0,0 +1,53 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.model.events.impl.character.player; + +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.events.EventType; +import com.l2jmobius.gameserver.model.events.impl.IBaseEvent; + +/** + * @author UnAfraid + */ +public class OnPlayerMoveRequest implements IBaseEvent +{ + private final L2PcInstance _activeChar; + private final Location _location; + + public OnPlayerMoveRequest(L2PcInstance activeChar, Location loc) + { + _activeChar = activeChar; + _location = loc; + } + + public L2PcInstance getActiveChar() + { + return _activeChar; + } + + public Location getLocation() + { + return _location; + } + + @Override + public EventType getType() + { + return EventType.ON_PLAYER_MOVE_REQUEST; + } +} diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Armor.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Armor.java index 046d948df6..66eeee3b10 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Armor.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Armor.java @@ -40,6 +40,12 @@ public final class L2Armor extends L2Item public L2Armor(StatsSet set) { super(set); + } + + @Override + public void set(StatsSet set) + { + super.set(set); _type = set.getEnum("armor_type", ArmorType.class, ArmorType.NONE); final int _bodyPart = getBodyPart(); diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2EtcItem.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2EtcItem.java index 29e10372dc..574c955b88 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2EtcItem.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2EtcItem.java @@ -32,11 +32,11 @@ public final class L2EtcItem extends L2Item { private String _handler; private EtcItemType _type; - private final boolean _isBlessed; - private final List _extractableItems; - private final int _extractableCountMin; - private final int _extractableCountMax; - private final boolean _isInfinite; + private boolean _isBlessed; + private List _extractableItems; + private int _extractableCountMin; + private int _extractableCountMax; + private boolean _isInfinite; /** * Constructor for EtcItem. @@ -45,6 +45,12 @@ public final class L2EtcItem extends L2Item public L2EtcItem(StatsSet set) { super(set); + } + + @Override + public void set(StatsSet set) + { + super.set(set); _type = set.getEnum("etcitem_type", EtcItemType.class, EtcItemType.NONE); // l2j custom - L2EtcItemType.SHOT diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Item.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Item.java index 42d3017a3c..88510e673c 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Item.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Item.java @@ -66,7 +66,7 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable public static final int TYPE1_WEAPON_RING_EARRING_NECKLACE = 0; public static final int TYPE1_SHIELD_ARMOR = 1; public static final int TYPE1_ITEM_QUESTITEM_ADENA = 4; - + public static final int TYPE2_WEAPON = 0; public static final int TYPE2_SHIELD_ARMOR = 1; public static final int TYPE2_ACCESSORY = 2; @@ -112,43 +112,43 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable public static final int SLOT_MULTI_ALLWEAPON = SLOT_LR_HAND | SLOT_R_HAND; - private final int _itemId; - private final int _displayId; - private final String _name; - private final String _additionalName; - private final String _icon; - private final int _weight; - private final boolean _stackable; - private final MaterialType _materialType; - private final CrystalType _crystalType; - private final int _equipReuseDelay; - private final int _duration; - private final int _time; - private final int _autoDestroyTime; - private final int _bodyPart; - private final int _referencePrice; - private final int _crystalCount; - private final boolean _sellable; - private final boolean _dropable; - private final boolean _destroyable; - private final boolean _tradeable; - private final boolean _depositable; - private final boolean _auctionable; - private final int _enchantable; - private final boolean _elementable; - private final boolean _questItem; - private final boolean _freightable; - private final boolean _allow_self_resurrection; - private final boolean _is_oly_restricted; - private final boolean _for_npc; - private final boolean _common; - private final boolean _heroItem; - private final boolean _pvpItem; - private final boolean _immediate_effect; - private final boolean _ex_immediate_effect; - private final int _defaultEnchantLevel; - private final ActionType _defaultAction; - private final boolean _isBlessedItem; + private int _itemId; + private int _displayId; + private String _name; + private String _additionalName; + private String _icon; + private int _weight; + private boolean _stackable; + private MaterialType _materialType; + private CrystalType _crystalType; + private int _equipReuseDelay; + private int _duration; + private int _time; + private int _autoDestroyTime; + private int _bodyPart; + private int _referencePrice; + private int _crystalCount; + private boolean _sellable; + private boolean _dropable; + private boolean _destroyable; + private boolean _tradeable; + private boolean _depositable; + private boolean _auctionable; + private int _enchantable; + private boolean _elementable; + private boolean _questItem; + private boolean _freightable; + private boolean _allow_self_resurrection; + private boolean _is_oly_restricted; + private boolean _for_npc; + private boolean _common; + private boolean _heroItem; + private boolean _pvpItem; + private boolean _immediate_effect; + private boolean _ex_immediate_effect; + private int _defaultEnchantLevel; + private ActionType _defaultAction; + private boolean _isBlessedItem; protected int _type1; // needed for item list (inventory) protected int _type2; // different lists for armor, weapon, etc @@ -159,13 +159,13 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable private SkillHolder _unequipSkill = null; private SkillHolder _equipSkill = null; - private final int _useSkillDisTime; - private final int _reuseDelay; - private final int _sharedReuseGroup; + private int _useSkillDisTime; + private int _reuseDelay; + private int _sharedReuseGroup; - private final CommissionItemType _commissionItemType; - private final int _compoundItem; - private final float _compoundChance; + private CommissionItemType _commissionItemType; + private int _compoundItem; + private float _compoundChance; /** * Constructor of the L2Item that fill class variables.
@@ -173,6 +173,11 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable * @param set : StatsSet corresponding to a set of couples (key,value) for description of the item */ protected L2Item(StatsSet set) + { + set(set); + } + + public void set(StatsSet set) { _itemId = set.getInt("item_id"); _displayId = set.getInt("displayId", _itemId); diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Weapon.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Weapon.java index a77aeba526..3a78917498 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Weapon.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/items/L2Weapon.java @@ -40,19 +40,19 @@ import com.l2jmobius.util.StringUtil; */ public final class L2Weapon extends L2Item { - private final WeaponType _type; - private final boolean _isMagicWeapon; - private final int _rndDam; - private final int _soulShotCount; - private final int _spiritShotCount; - private final int _mpConsume; - private final int _baseAttackRange; - private final int _baseAttackAngle; + private WeaponType _type; + private boolean _isMagicWeapon; + private int _rndDam; + private int _soulShotCount; + private int _spiritShotCount; + private int _mpConsume; + private int _baseAttackRange; + private int _baseAttackAngle; /** * Skill that activates when item is enchanted +4 (for duals). */ private SkillHolder _enchant4Skill = null; - private final int _changeWeaponId; + private int _changeWeaponId; // Attached skills for Special Abilities private SkillHolder _skillsOnMagic; @@ -60,15 +60,15 @@ public final class L2Weapon extends L2Item private SkillHolder _skillsOnCrit; private Condition _skillsOnCritCondition = null; - private final int _reducedSoulshot; - private final int _reducedSoulshotChance; + private int _reducedSoulshot; + private int _reducedSoulshotChance; - private final int _reducedMpConsume; - private final int _reducedMpConsumeChance; + private int _reducedMpConsume; + private int _reducedMpConsumeChance; - private final boolean _isForceEquip; - private final boolean _isAttackWeapon; - private final boolean _useWeaponSkillsOnly; + private boolean _isForceEquip; + private boolean _isAttackWeapon; + private boolean _useWeaponSkillsOnly; /** * Constructor for Weapon. @@ -77,6 +77,12 @@ public final class L2Weapon extends L2Item public L2Weapon(StatsSet set) { super(set); + } + + @Override + public void set(StatsSet set) + { + super.set(set); _type = WeaponType.valueOf(set.getString("weapon_type", "none").toUpperCase()); _type1 = L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE; _type2 = L2Item.TYPE2_WEAPON; diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/quest/Quest.java index 61df2357c0..91349c199c 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/quest/Quest.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/quest/Quest.java @@ -125,7 +125,7 @@ public class Quest extends AbstractScript implements IIdentifiable QuestManager.getInstance().addScript(this); } - loadGlobalData(); + onLoad(); } /** @@ -151,17 +151,17 @@ public class Quest extends AbstractScript implements IIdentifiable * Children of this class can implement this function in order to define what variables to load and what structures to save them in.
* By default, nothing is loaded. */ - protected void loadGlobalData() + protected void onLoad() { } /** - * The function saveGlobalData is, by default, called at shutdown, for all quests, by the QuestManager.
+ * The function onSave is, by default, called at shutdown, for all quests, by the QuestManager.
* Children of this class can implement this function in order to convert their structures
* into tuples and make calls to save them to the database, if needed.
* By default, nothing is saved. */ - public void saveGlobalData() + public void onSave() { } @@ -175,6 +175,14 @@ public class Quest extends AbstractScript implements IIdentifiable return _questId; } + /** + * @return the NpcStringId of the current quest, used in Quest link bypass + */ + public int getNpcStringId() + { + return _questId > 10000 ? _questId - 5000 : _questId; + } + /** * Add a new quest state of this quest to the database. * @param player the owner of the newly created quest state @@ -2679,7 +2687,7 @@ public class Quest extends AbstractScript implements IIdentifiable */ public boolean unload(boolean removeFromList) { - saveGlobalData(); + onSave(); // cancel all pending timers before reloading. // if timers ought to be restarted, the quest can take care of it // with its code (example: save global data indicating what timer must be restarted). diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/zone/form/ZoneNPoly.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/zone/form/ZoneNPoly.java index 3c498f9e15..b4618d99c9 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/zone/form/ZoneNPoly.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/model/zone/form/ZoneNPoly.java @@ -134,4 +134,14 @@ public class ZoneNPoly extends L2ZoneForm GeoData.getInstance().getHeight(x, y, _z1) }; } + + public int[] getX() + { + return _p.xpoints; + } + + public int[] getY() + { + return _p.ypoints; + } } diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/clientpackets/MoveBackwardToLocation.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/clientpackets/MoveBackwardToLocation.java index 236fab19d0..1d12cbb94a 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/clientpackets/MoveBackwardToLocation.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/clientpackets/MoveBackwardToLocation.java @@ -24,6 +24,9 @@ import com.l2jmobius.gameserver.instancemanager.JumpManager; import com.l2jmobius.gameserver.instancemanager.JumpManager.JumpWay; import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.events.EventDispatcher; +import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerMoveRequest; +import com.l2jmobius.gameserver.model.events.returns.TerminateReturn; import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.serverpackets.ActionFailed; import com.l2jmobius.gameserver.network.serverpackets.ExFlyMove; @@ -46,7 +49,6 @@ public class MoveBackwardToLocation extends L2GameClientPacket private int _originY; private int _originZ; - @SuppressWarnings("unused") private int _moveMovement; @Override @@ -102,6 +104,16 @@ public class MoveBackwardToLocation extends L2GameClientPacket // Validate position packets sends head level. _targetZ += activeChar.getTemplate().getCollisionHeight(); + if (_moveMovement == 1) + { + final TerminateReturn terminate = EventDispatcher.getInstance().notifyEvent(new OnPlayerMoveRequest(activeChar, new Location(_targetX, _targetY, _targetZ)), activeChar, TerminateReturn.class); + if ((terminate != null) && terminate.terminate()) + { + activeChar.sendPacket(ActionFailed.STATIC_PACKET); + return; + } + } + if (activeChar.getTeleMode() > 0) { // Sayune diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/AbstractHtmlPacket.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/AbstractHtmlPacket.java index c27557d719..28865df914 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/AbstractHtmlPacket.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/AbstractHtmlPacket.java @@ -106,6 +106,11 @@ public abstract class AbstractHtmlPacket extends L2GameServerPacket _html = _html.replaceAll(pattern, value.replaceAll("\\$", "\\\\\\$")); } + public final void replace(String pattern, CharSequence value) + { + replace(pattern, String.valueOf(value)); + } + public final void replace(String pattern, boolean val) { replace(pattern, String.valueOf(val)); diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/ExShowTerritory.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/ExShowTerritory.java new file mode 100644 index 0000000000..6887f2c57e --- /dev/null +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/network/serverpackets/ExShowTerritory.java @@ -0,0 +1,59 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.network.serverpackets; + +import java.util.ArrayList; +import java.util.List; + +import com.l2jmobius.gameserver.model.interfaces.ILocational; + +/** + * Note: There is known issue with this packet, it cannot be removed unless game client is restarted! + * @author UnAfraid + */ +public class ExShowTerritory extends L2GameServerPacket +{ + private final int _minZ; + private final int _maxZ; + private final List _vertices = new ArrayList<>(); + + public ExShowTerritory(int minZ, int maxZ) + { + _minZ = minZ; + _maxZ = maxZ; + } + + public void addVertice(ILocational loc) + { + _vertices.add(loc); + } + + @Override + protected void writeImpl() + { + writeC(0xFE); + writeH(0x8D); + writeD(_vertices.size()); + writeD(_minZ); + writeD(_maxZ); + for (ILocational loc : _vertices) + { + writeD(loc.getX()); + writeD(loc.getY()); + } + } +} diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java index 1e54089f1b..fd41398b67 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/ScriptEngineManager.java @@ -21,6 +21,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -29,6 +30,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Properties; import java.util.ServiceLoader; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -170,7 +172,7 @@ public final class ScriptEngineManager checkExistingFile("ScriptList", SCRIPT_LIST_FILE); final Map> files = new LinkedHashMap<>(); - final List extWithoutEngine = new LinkedList<>(); + final Set extWithoutEngine = new HashSet<>(); Files.lines(SCRIPT_LIST_FILE).forEach(line -> { @@ -202,21 +204,14 @@ public final class ScriptEngineManager final IExecutionContext engine = getEngineByExtension(ext); if (engine == null) { - if (!extWithoutEngine.contains(ext)) + if (extWithoutEngine.add(ext)) { - extWithoutEngine.add(ext); _log.warning("ScriptEngine: No engine registered for extension " + ext + "!"); } return; } - List ll = files.get(engine); - if (ll == null) - { - ll = new LinkedList<>(); - files.put(engine, ll); - } - ll.add(sourceFile); + files.computeIfAbsent(engine, k -> new LinkedList<>()).add(sourceFile); }); for (Entry> entry : files.entrySet()) diff --git a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/java/JavaExecutionContext.java b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/java/JavaExecutionContext.java index fc6011a1c6..984d27cfed 100644 --- a/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/java/JavaExecutionContext.java +++ b/L2J_Mobius_Test/java/com/l2jmobius/gameserver/scripting/java/JavaExecutionContext.java @@ -23,6 +23,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; @@ -99,8 +100,6 @@ public final class JavaExecutionContext extends AbstractExecutionContext options = new LinkedList<>(); addOptionIfNotNull(options, getProperty("source"), "-source"); @@ -133,12 +132,14 @@ public final class JavaExecutionContext extends AbstractExecutionContext sourcePathStrings = new LinkedList<>(); + final List sourcePathStrings = new LinkedList<>(); for (Path sourcePath : sourcePaths) { sourcePathStrings.add(sourcePath.toString()); } + final StringWriter strOut = new StringWriter(); + final PrintWriter out = new PrintWriter(strOut); final boolean compilationSuccess = getScriptingEngine().getCompiler().getTask(out, fileManager, compilationDiagnostics, options, null, fileManager.getJavaFileObjectsFromStrings(sourcePathStrings)).call(); if (!compilationSuccess) { @@ -169,8 +170,8 @@ public final class JavaExecutionContext extends AbstractExecutionContext executionFailures = new LinkedHashMap<>(); - Iterable compiledClasses = fileManager.getCompiledClasses(); + final Map executionFailures = new LinkedHashMap<>(); + final Iterable compiledClasses = fileManager.getCompiledClasses(); for (final Path sourcePath : sourcePaths) { boolean found = false;