SHOW:
|
|
- or go back to the newest paste.
1 | diff --git a/java/net/sf/l2j/commons/data/xml/XMLDocument.java b/java/net/sf/l2j/commons/data/xml/XMLDocument.java | |
2 | new file mode 100644 | |
3 | index 0000000..c1b16f8 | |
4 | --- /dev/null | |
5 | +++ b/java/net/sf/l2j/commons/data/xml/XMLDocument.java | |
6 | @@ -0,0 +1,82 @@ | |
7 | +package net.sf.l2j.commons.data.xml; | |
8 | + | |
9 | +import java.io.File; | |
10 | +import java.util.logging.Level; | |
11 | +import java.util.logging.Logger; | |
12 | + | |
13 | +import javax.xml.parsers.DocumentBuilderFactory; | |
14 | + | |
15 | +import net.sf.l2j.commons.data.StatSet; | |
16 | + | |
17 | +import org.w3c.dom.Document; | |
18 | +import org.w3c.dom.NamedNodeMap; | |
19 | +import org.w3c.dom.Node; | |
20 | + | |
21 | +/** | |
22 | + * An XML document, relying on a static and single DocumentBuilderFactory. | |
23 | + */ | |
24 | +public abstract class XMLDocument | |
25 | +{ | |
26 | + protected static final Logger LOG = Logger.getLogger(XMLDocument.class.getName()); | |
27 | + | |
28 | + private static final DocumentBuilderFactory BUILDER; | |
29 | + static | |
30 | + { | |
31 | + BUILDER = DocumentBuilderFactory.newInstance(); | |
32 | + BUILDER.setValidating(false); | |
33 | + BUILDER.setIgnoringComments(true); | |
34 | + } | |
35 | + | |
36 | + abstract protected void load(); | |
37 | + | |
38 | + abstract protected void parseDocument(Document doc, File f); | |
39 | + | |
40 | + public void loadDocument(String filePath) | |
41 | + { | |
42 | + loadDocument(new File(filePath)); | |
43 | + } | |
44 | + | |
45 | + /** | |
46 | + * Parse an entire directory or file if found. | |
47 | + * @param file | |
48 | + */ | |
49 | + public void loadDocument(File file) | |
50 | + { | |
51 | + if (!file.exists()) | |
52 | + { | |
53 | + LOG.severe("The following file or directory doesn't exist: " + file.getName()); | |
54 | + return; | |
55 | + } | |
56 | + | |
57 | + if (file.isDirectory()) | |
58 | + { | |
59 | + for (File f : file.listFiles()) | |
60 | + loadDocument(f); | |
61 | + } | |
62 | + else if (file.isFile()) | |
63 | + { | |
64 | + try | |
65 | + { | |
66 | + parseDocument(BUILDER.newDocumentBuilder().parse(file), file); | |
67 | + } | |
68 | + catch (Exception e) | |
69 | + { | |
70 | + LOG.log(Level.SEVERE, "Error loading XML file " + file.getName(), e); | |
71 | + } | |
72 | + } | |
73 | + } | |
74 | + | |
75 | + /** | |
76 | + * This method parses the content of a NamedNodeMap and feed the given StatsSet. | |
77 | + * @param attrs : The NamedNodeMap to parse. | |
78 | + * @param set : The StatsSet to feed. | |
79 | + */ | |
80 | + public static void parseAndFeed(NamedNodeMap attrs, StatSet set) | |
81 | + { | |
82 | + for (int i = 0; i < attrs.getLength(); i++) | |
83 | + { | |
84 | + final Node attr = attrs.item(i); | |
85 | + set.set(attr.getNodeName(), attr.getNodeValue()); | |
86 | + } | |
87 | + } | |
88 | +} | |
89 | \ No newline at end of file | |
90 | diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/GameServer.java | |
91 | index e682cc6..6c1638e 100644 | |
92 | --- a/java/net/sf/l2j/gameserver/GameServer.java | |
93 | +++ b/java/net/sf/l2j/gameserver/GameServer.java | |
94 | @@ -72,6 +72,7 @@ | |
95 | import net.sf.l2j.gameserver.data.xml.StaticObjectData; | |
96 | import net.sf.l2j.gameserver.data.xml.SummonItemData; | |
97 | import net.sf.l2j.gameserver.data.xml.TeleportData; | |
98 | +import net.sf.l2j.gameserver.data.xml.TeleportLocationData; | |
99 | import net.sf.l2j.gameserver.data.xml.WalkerRouteData; | |
100 | import net.sf.l2j.gameserver.geoengine.GeoEngine; | |
101 | import net.sf.l2j.gameserver.handler.AdminCommandHandler; | |
102 | @@ -232,6 +233,7 @@ | |
103 | DimensionalRiftManager.getInstance(); | |
104 | NewbieBuffData.getInstance(); | |
105 | InstantTeleportData.getInstance(); | |
106 | + TeleportLocationData.getInstance(); | |
107 | TeleportData.getInstance(); | |
108 | ||
109 | StringUtil.printSection("Olympiads & Heroes"); | |
110 | diff --git a/java/net/sf/l2j/gameserver/data/xml/TeleportLocationData.java b/java/net/sf/l2j/gameserver/data/xml/TeleportLocationData.java | |
111 | new file mode 100644 | |
112 | index 0000000..a19af62 | |
113 | --- /dev/null | |
114 | +++ b/java/net/sf/l2j/gameserver/data/xml/TeleportLocationData.java | |
115 | @@ -0,0 +1,77 @@ | |
116 | +package net.sf.l2j.gameserver.data.xml; | |
117 | + | |
118 | +import java.io.File; | |
119 | +import java.util.HashMap; | |
120 | +import java.util.Map; | |
121 | + | |
122 | +import net.sf.l2j.commons.data.StatSet; | |
123 | +import net.sf.l2j.commons.data.xml.XMLDocument; | |
124 | + | |
125 | +import net.sf.l2j.gameserver.model.location.TeleportLocation; | |
126 | + | |
127 | +import org.w3c.dom.Document; | |
128 | +import org.w3c.dom.Node; | |
129 | + | |
130 | +public class TeleportLocationData extends XMLDocument | |
131 | +{ | |
132 | + private final Map<Integer, TeleportLocation> _teleports = new HashMap<>(); | |
133 | + | |
134 | + protected TeleportLocationData() | |
135 | + { | |
136 | + load(); | |
137 | + } | |
138 | + | |
139 | + @Override | |
140 | + protected void load() | |
141 | + { | |
142 | + loadDocument("./data/xml/teleportVip.xml"); | |
143 | + LOG.info("Loaded " + _teleports.size() + " teleport locations."); | |
144 | + } | |
145 | + | |
146 | + @Override | |
147 | + protected void parseDocument(Document doc, File file) | |
148 | + { | |
149 | + // StatsSet used to feed informations. Cleaned on every entry. | |
150 | + final StatSet set = new StatSet(); | |
151 | + | |
152 | + // First element is never read. | |
153 | + final Node n = doc.getFirstChild(); | |
154 | + | |
155 | + for (Node o = n.getFirstChild(); o != null; o = o.getNextSibling()) | |
156 | + { | |
157 | + if (!"teleport".equalsIgnoreCase(o.getNodeName())) | |
158 | + continue; | |
159 | + | |
160 | + // Parse and feed content. | |
161 | + parseAndFeed(o.getAttributes(), set); | |
162 | + | |
163 | + // Feed the map with new data. | |
164 | + _teleports.put(set.getInteger("id"), new TeleportLocation(set)); | |
165 | + | |
166 | + // Clear the StatsSet. | |
167 | + set.clear(); | |
168 | + } | |
169 | + } | |
170 | + | |
171 | + public void reload() | |
172 | + { | |
173 | + _teleports.clear(); | |
174 | + | |
175 | + load(); | |
176 | + } | |
177 | + | |
178 | + public TeleportLocation getTeleportLocation(int id) | |
179 | + { | |
180 | + return _teleports.get(id); | |
181 | + } | |
182 | + | |
183 | + public static TeleportLocationData getInstance() | |
184 | + { | |
185 | + return SingletonHolder.INSTANCE; | |
186 | + } | |
187 | + | |
188 | + private static class SingletonHolder | |
189 | + { | |
190 | + protected static final TeleportLocationData INSTANCE = new TeleportLocationData(); | |
191 | + } | |
192 | +} | |
193 | \ No newline at end of file | |
194 | diff --git a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java | |
195 | index 5f11f94..e5aaeba 100644 | |
196 | --- a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java | |
197 | +++ b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java | |
198 | @@ -18,6 +18,7 @@ | |
199 | import net.sf.l2j.gameserver.data.xml.NpcData; | |
200 | import net.sf.l2j.gameserver.data.xml.ScriptData; | |
201 | import net.sf.l2j.gameserver.data.xml.TeleportData; | |
202 | +import net.sf.l2j.gameserver.data.xml.TeleportLocationData; | |
203 | import net.sf.l2j.gameserver.data.xml.WalkerRouteData; | |
204 | import net.sf.l2j.gameserver.handler.IAdminCommandHandler; | |
205 | import net.sf.l2j.gameserver.model.actor.Player; | |
206 | @@ -115,6 +116,7 @@ | |
207 | { | |
208 | InstantTeleportData.getInstance().reload(); | |
209 | TeleportData.getInstance().reload(); | |
210 | + TeleportLocationData.getInstance().reload(); | |
211 | player.sendMessage("Teleport locations have been reloaded."); | |
212 | } | |
213 | else if (type.startsWith("zone")) | |
214 | diff --git a/java/net/sf/l2j/gameserver/model/actor/instance/GatekeeperVip.java b/java/net/sf/l2j/gameserver/model/actor/instance/GatekeeperVip.java | |
215 | new file mode 100644 | |
216 | index 0000000..aebe277 | |
217 | --- /dev/null | |
218 | +++ b/java/net/sf/l2j/gameserver/model/actor/instance/GatekeeperVip.java | |
219 | @@ -0,0 +1,110 @@ | |
220 | +package net.sf.l2j.gameserver.model.actor.instance; | |
221 | + | |
222 | +import java.util.Calendar; | |
223 | +import java.util.StringTokenizer; | |
224 | + | |
225 | +import net.sf.l2j.gameserver.data.xml.TeleportLocationData; | |
226 | +import net.sf.l2j.gameserver.model.actor.Player; | |
227 | +import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; | |
228 | +import net.sf.l2j.gameserver.model.location.TeleportLocation; | |
229 | +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; | |
230 | + | |
231 | + | |
232 | +public final class GatekeeperVip extends Folk | |
233 | +{ | |
234 | + private static final int COND_BUSY_BECAUSE_OF_SIEGE = 1; | |
235 | + private static final int COND_OWNER = 2; | |
236 | + private static final int COND_REGULAR = 3; | |
237 | + | |
238 | + public GatekeeperVip(int objectId, NpcTemplate template) | |
239 | + { | |
240 | + super(objectId, template); | |
241 | + } | |
242 | + | |
243 | + @Override | |
244 | + public void onBypassFeedback(Player player, String command) | |
245 | + { | |
246 | + player.sendPacket(ActionFailed.STATIC_PACKET); | |
247 | + if (!player.isVip()) | |
248 | + { | |
249 | + player.sendMessage("You must be vip to get this npc."); | |
250 | + showChatWindow(player); | |
251 | + return; | |
252 | + } | |
253 | + if (command.startsWith("goto")) | |
254 | + { | |
255 | + final StringTokenizer st = new StringTokenizer(command, " "); | |
256 | + st.nextToken(); | |
257 | + | |
258 | + if (st.countTokens() <= 0) | |
259 | + return; | |
260 | + | |
261 | + final int condition = validateCondition(player); | |
262 | + if (condition == COND_REGULAR || condition == COND_OWNER) | |
263 | + { | |
264 | + if (player.isAlikeDead()) | |
265 | + return; | |
266 | + | |
267 | + final TeleportLocation list = TeleportLocationData.getInstance().getTeleportLocation(Integer.parseInt(st.nextToken())); | |
268 | + if (list == null) | |
269 | + return; | |
270 | + | |
271 | + int price = list.getPrice(); | |
272 | + | |
273 | + if (player.destroyItemByItemId("Teleport ", (list.isNoble()) ? 6651 : 57, price, this, true)) | |
274 | + player.teleToLocation(list); | |
275 | + | |
276 | + player.sendPacket(ActionFailed.STATIC_PACKET); | |
277 | + } | |
278 | + } | |
279 | + else if (command.startsWith("Chat")) | |
280 | + { | |
281 | + Calendar cal = Calendar.getInstance(); | |
282 | + int val = 0; | |
283 | + try | |
284 | + { | |
285 | + val = Integer.parseInt(command.substring(5)); | |
286 | + } | |
287 | + catch (IndexOutOfBoundsException ioobe) | |
288 | + { | |
289 | + } | |
290 | + catch (NumberFormatException nfe) | |
291 | + { | |
292 | + } | |
293 | + | |
294 | + if (val == 1 && cal.get(Calendar.HOUR_OF_DAY) >= 20 && cal.get(Calendar.HOUR_OF_DAY) <= 23 && (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7)) | |
295 | + { | |
296 | + return; | |
297 | + } | |
298 | + showChatWindow(player, val); | |
299 | + } | |
300 | + else | |
301 | + super.onBypassFeedback(player, command); | |
302 | + } | |
303 | + | |
304 | + @Override | |
305 | + public String getHtmlPath(int npcId, int val) | |
306 | + { | |
307 | + String filename = ""; | |
308 | + if (val == 0) | |
309 | + filename = "" + npcId; | |
310 | + else | |
311 | + filename = npcId + "-" + val; | |
312 | + | |
313 | + return "data/html/teleporterVip/" + filename + ".htm"; | |
314 | + } | |
315 | + | |
316 | + private int validateCondition(Player player) | |
317 | + { | |
318 | + if (getCastle() != null) | |
319 | + { | |
320 | + if (getCastle().getSiege().isInProgress()) | |
321 | + return COND_BUSY_BECAUSE_OF_SIEGE; | |
322 | + | |
323 | + if (player.getClan() != null && getCastle().getOwnerId() == player.getClanId()) | |
324 | + return COND_OWNER; | |
325 | + } | |
326 | + | |
327 | + return COND_REGULAR; | |
328 | + } | |
329 | +} | |
330 | \ No newline at end of file | |
331 | diff --git a/java/net/sf/l2j/gameserver/model/location/TeleportLocation.java b/java/net/sf/l2j/gameserver/model/location/TeleportLocation.java | |
332 | new file mode 100644 | |
333 | index 0000000..bfab7f6 | |
334 | --- /dev/null | |
335 | +++ b/java/net/sf/l2j/gameserver/model/location/TeleportLocation.java | |
336 | @@ -0,0 +1,30 @@ | |
337 | +package net.sf.l2j.gameserver.model.location; | |
338 | + | |
339 | +import net.sf.l2j.commons.data.StatSet; | |
340 | + | |
341 | +/** | |
342 | + * A datatype extending {@link Location}, used to retain a single Gatekeeper teleport location. | |
343 | + */ | |
344 | +public class TeleportLocation extends Location | |
345 | +{ | |
346 | + public TeleportLocation(StatSet set) | |
347 | + { | |
348 | + super(set.getInteger("x"), set.getInteger("y"), set.getInteger("z")); | |
349 | + | |
350 | + _price = set.getInteger("price"); | |
351 | + _isNoble = set.getBool("isNoble"); | |
352 | + } | |
353 | + | |
354 | + private final int _price; | |
355 | + private final boolean _isNoble; | |
356 | + | |
357 | + public int getPrice() | |
358 | + { | |
359 | + return _price; | |
360 | + } | |
361 | + | |
362 | + public boolean isNoble() | |
363 | + { | |
364 | + return _isNoble; | |
365 | + } | |
366 | +} | |
367 | \ No newline at end of file | |
368 |