SHOW:
|
|
- or go back to the newest paste.
1 | ### Eclipse Workspace Patch 1.0 | |
2 | #P aCis_datapack | |
3 | Index: data/html/admin/zone.htm | |
4 | =================================================================== | |
5 | --- data/html/admin/zone.htm (revision 15) | |
6 | +++ data/html/admin/zone.htm (working copy) | |
7 | @@ -6,11 +6,12 @@ | |
8 | <td width=45><button value="Back" action="bypass -h admin_admin4" width=45 height=15 back="sek.cbui94" fore="sek.cbui92"></td> | |
9 | </tr> | |
10 | </table><br> | |
11 | - <center><table width=225> | |
12 | + <center><table width=260> | |
13 | <tr> | |
14 | - <td><button value="Refresh" action="bypass -h admin_zone_check" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"></td> | |
15 | - <td><button value="Visualize all" action="bypass -h admin_zone_visual all" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"></td> | |
16 | - <td><button value="Clear" action="bypass -h admin_zone_visual clear" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"></td> | |
17 | + <td><button value="Create" action="bypass -h admin_create_zone" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
18 | + <td><button value="Refresh" action="bypass -h admin_zone_check" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
19 | + <td><button value="Visualize" action="bypass -h admin_zone_visual all" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
20 | + <td><button value="Clear" action="bypass -h admin_zone_visual clear" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
21 | </tr> | |
22 | </table> | |
23 | <br><img src="l2ui.SquareGray" width=270 height=1><br> | |
24 | Index: data/html/admin/zone_create.htm | |
25 | =================================================================== | |
26 | --- data/html/admin/zone_create.htm (revision 0) | |
27 | +++ data/html/admin/zone_create.htm (revision 0) | |
28 | @@ -0,0 +1,33 @@ | |
29 | +<html><title>Zone Creation</title><body> | |
30 | + <table width=270> | |
31 | + <tr> | |
32 | + <td width=45><button value="Main" action="bypass -h admin_admin" width=45 height=15 back="sek.cbui94" fore="sek.cbui92"></td> | |
33 | + <td width=180 align=center>Zone Creation</td> | |
34 | + <td width=45><button value="Back" action="bypass -h admin_zone_check" width=45 height=15 back="sek.cbui94" fore="sek.cbui92"></td> | |
35 | + </tr> | |
36 | + </table><br> | |
37 | + <center> | |
38 | + <img src=l2ui.SquareGray width=270 height=1> | |
39 | + <table width=270> | |
40 | + <tr> | |
41 | + <td width=65>Type:</td> | |
42 | + <td width=140><combobox width="100" var="zoneType" list=NPoly;Cuboid;Cylinder></td> | |
43 | + <td align=right width=65><button value="Select" action="bypass admin_setType $zoneType" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
44 | + </tr> | |
45 | + </table><br> | |
46 | + <img src=l2ui.SquareGray width=270 height=1> | |
47 | + <table width=270> | |
48 | + <tr><td width=140>Type: <font color=LEVEL>%zoneShape%</font></td></tr> | |
49 | + <tr><td width=140>%locsSize%</td></tr> | |
50 | + </table> | |
51 | + <img src=l2ui.SquareGray width=270 height=1><br> | |
52 | + <table width=280> | |
53 | + <tr> | |
54 | + <td align=center width=70>%proceed%</td> | |
55 | + <td align=center width=70>%undo%</td> | |
56 | + <td align=center width=70><button value="Add Loc" action="bypass admin_saveLoc" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
57 | + <td align=center width=70><button value="Reset" action="bypass admin_reset" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td> | |
58 | + </tr> | |
59 | + </table> | |
60 | + <br><br>%dist% | |
61 | +</center></body></html> | |
62 | \ No newline at end of file | |
63 | Index: data/xml/adminCommands.xml | |
64 | =================================================================== | |
65 | --- data/xml/adminCommands.xml (revision 15) | |
66 | +++ data/xml/adminCommands.xml (working copy) | |
67 | @@ -335,4 +335,13 @@ | |
68 | <!-- ZONE --> | |
69 | <aCar name="admin_zone_check" accessLevel="7"/> | |
70 | <aCar name="admin_zone_visual" accessLevel="7"/> | |
71 | + | |
72 | + <!-- ZONE CREATE --> | |
73 | + <aCar name="admin_create_zone" accessLevel="7"/> | |
74 | + <aCar name="admin_setType" accessLevel="7"/> | |
75 | + <aCar name="admin_saveLoc" accessLevel="7"/> | |
76 | + <aCar name="admin_setRad" accessLevel="7"/> | |
77 | + <aCar name="admin_reset" accessLevel="7"/> | |
78 | + <aCar name="admin_removeLoc" accessLevel="7"/> | |
79 | + <aCar name="admin_storeLocs" accessLevel="7"/> | |
80 | </list> | |
81 | \ No newline at end of file | |
82 | #P aCis_gameserver | |
83 | Index: java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java | |
84 | =================================================================== | |
85 | --- java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (revision 15) | |
86 | +++ java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (working copy) | |
87 | @@ -46,6 +46,7 @@ | |
88 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTarget; | |
89 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTeleport; | |
90 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminZone; | |
91 | +import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminZoneCreation; | |
92 | ||
93 | public class AdminCommandHandler | |
94 | { | |
95 | @@ -96,6 +97,7 @@ | |
96 | registerHandler(new AdminTarget()); | |
97 | registerHandler(new AdminTeleport()); | |
98 | registerHandler(new AdminZone()); | |
99 | + registerHandler(new AdminZoneCreation()); | |
100 | } | |
101 | ||
102 | private void registerHandler(IAdminCommandHandler handler) | |
103 | Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminZoneCreation.java | |
104 | =================================================================== | |
105 | --- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminZoneCreation.java (revision 0) | |
106 | +++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminZoneCreation.java (revision 0) | |
107 | @@ -0,0 +1,322 @@ | |
108 | +package net.sf.l2j.gameserver.handler.admincommandhandlers; | |
109 | + | |
110 | +import java.io.BufferedWriter; | |
111 | +import java.io.File; | |
112 | +import java.io.FileWriter; | |
113 | +import java.io.IOException; | |
114 | +import java.text.SimpleDateFormat; | |
115 | +import java.util.ArrayList; | |
116 | +import java.util.Date; | |
117 | +import java.util.List; | |
118 | +import java.util.StringTokenizer; | |
119 | + | |
120 | +import net.sf.l2j.gameserver.handler.IAdminCommandHandler; | |
121 | +import net.sf.l2j.gameserver.model.actor.instance.Player; | |
122 | +import net.sf.l2j.gameserver.model.location.Location; | |
123 | +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; | |
124 | + | |
125 | +/** | |
126 | + * @author melron | |
127 | + */ | |
128 | +public class AdminZoneCreation implements IAdminCommandHandler | |
129 | +{ | |
130 | + private static final List<Location> savedLocs = new ArrayList<>(); | |
131 | + private static final String fileName = "coordinates" + "%s" + ".xml"; | |
132 | + private static ZoneShape shape = ZoneShape.NONE; | |
133 | + private static final int zDifference = 1000; | |
134 | + private static final String maxLocs = "You have reached the maximum locations for this shape."; | |
135 | + private static int radius = 0; | |
136 | + | |
137 | + private static enum ZoneShape | |
138 | + { | |
139 | + NONE, | |
140 | + NPoly, | |
141 | + Cuboid, | |
142 | + Cylinder | |
143 | + } | |
144 | + | |
145 | + private static final String[] ADMIN_COMMANDS = | |
146 | + { | |
147 | + "admin_create_zone", | |
148 | + "admin_setType", | |
149 | + "admin_setRad", | |
150 | + "admin_saveLoc", | |
151 | + "admin_reset", | |
152 | + "admin_removeLoc", | |
153 | + "admin_storeLocs", | |
154 | + }; | |
155 | + | |
156 | + @Override | |
157 | + public boolean useAdminCommand(String command, Player activeChar) | |
158 | + { | |
159 | + final StringTokenizer st = new StringTokenizer(command); | |
160 | + st.nextToken(); | |
161 | + if (command.startsWith("admin_create_zone")) | |
162 | + openHtml(activeChar); | |
163 | + else if (command.startsWith("admin_setType")) | |
164 | + { | |
165 | + clear(); | |
166 | + shape = ZoneShape.valueOf(st.nextToken()); | |
167 | + switch (shape) | |
168 | + { | |
169 | + case NPoly: | |
170 | + activeChar.sendMessage("You can add unlimited but atleast 3 coordinates in this shape."); | |
171 | + break; | |
172 | + case Cuboid: | |
173 | + activeChar.sendMessage("You must add 2 coordinates (in order to make a square) in this shape."); | |
174 | + break; | |
175 | + case Cylinder: | |
176 | + activeChar.sendMessage("You must add 1 coordinates and radius (in order to make a circle) in this shape."); | |
177 | + break; | |
178 | + default: | |
179 | + activeChar.sendMessage("You have to select the zone shape first."); | |
180 | + } | |
181 | + openHtml(activeChar); | |
182 | + } | |
183 | + else if (command.startsWith("admin_saveLoc")) | |
184 | + { | |
185 | + if (canSaveLoc(activeChar)) | |
186 | + { | |
187 | + final Location loc = new Location(activeChar.getX(), activeChar.getY(), activeChar.getZ()); | |
188 | + if (savedLocs.add(loc)) | |
189 | + activeChar.sendMessage(loc + " saved.."); | |
190 | + } | |
191 | + openHtml(activeChar); | |
192 | + } | |
193 | + else if (command.startsWith("admin_reset")) | |
194 | + { | |
195 | + clear(); | |
196 | + activeChar.sendMessage("Reset completed."); | |
197 | + openHtml(activeChar); | |
198 | + } | |
199 | + else if (command.startsWith("admin_removeLoc")) | |
200 | + { | |
201 | + if (savedLocs.size() > 0) | |
202 | + activeChar.sendMessage(savedLocs.remove(savedLocs.size() - 1) + " removed."); | |
203 | + openHtml(activeChar); | |
204 | + } | |
205 | + else if (command.startsWith("admin_storeLocs")) | |
206 | + { | |
207 | + if (savedLocs.isEmpty()) | |
208 | + { | |
209 | + activeChar.sendMessage("Empty locs.."); | |
210 | + return false; | |
211 | + } | |
212 | + store(activeChar); | |
213 | + } | |
214 | + else if (command.startsWith("admin_setRad")) | |
215 | + { | |
216 | + if (!st.hasMoreTokens() || !setRadius(parseInt(st.nextToken()))) | |
217 | + activeChar.sendMessage("Invalid value or shape."); | |
218 | + else | |
219 | + activeChar.sendMessage("Radius stored."); | |
220 | + | |
221 | + openHtml(activeChar); | |
222 | + } | |
223 | + return true; | |
224 | + } | |
225 | + | |
226 | + private static int calcZ(boolean minZ) | |
227 | + { | |
228 | + return (savedLocs.stream().mapToInt(loc -> loc.getZ()).sum() / savedLocs.size()) + (minZ ? -zDifference : zDifference); | |
229 | + } | |
230 | + | |
231 | + private static int parseInt(String nextToken) | |
232 | + { | |
233 | + try | |
234 | + { | |
235 | + return Integer.parseInt(nextToken); | |
236 | + } | |
237 | + catch (NumberFormatException e) | |
238 | + { | |
239 | + return 0; | |
240 | + } | |
241 | + } | |
242 | + | |
243 | + private static void store(Player gm) | |
244 | + { | |
245 | + if (!canStoreLocs(gm)) | |
246 | + return; | |
247 | + final String fName = String.format(fileName, "_" + shape.name() + "_" + getTimeStamp()); | |
248 | + String filePath = ""; | |
249 | + try (BufferedWriter writer = new BufferedWriter(new FileWriter(fName))) | |
250 | + { | |
251 | + final File file = new File(fName); | |
252 | + filePath = file.getAbsolutePath().replaceAll("\\\\", "/"); | |
253 | + writer.write(getHeadLine()); | |
254 | + for (Location loc : savedLocs) | |
255 | + writer.write(String.format("\t<node X=\"%s\" Y=\"%s\" />\r\n", loc.getX(), loc.getY())); | |
256 | + | |
257 | + writer.write("</zone>"); | |
258 | + } | |
259 | + catch (IOException e) | |
260 | + { | |
261 | + gm.sendMessage(String.format("Couldn't store coordinates in %s file.", fName)); | |
262 | + e.printStackTrace(); | |
263 | + } | |
264 | + gm.sendMessage("Coordinates has been successfully stored at " + filePath); | |
265 | + clear(); | |
266 | + openHtml(gm); | |
267 | + } | |
268 | + | |
269 | + private static String getTimeStamp() | |
270 | + { | |
271 | + return new SimpleDateFormat("hh-mm-ss").format(new Date()); | |
272 | + } | |
273 | + | |
274 | + private static boolean canStoreLocs(Player gm) | |
275 | + { | |
276 | + switch (shape) | |
277 | + { | |
278 | + case NPoly: | |
279 | + if (savedLocs.size() < 3) | |
280 | + { | |
281 | + gm.sendMessage("You have to set atleast 3 coordinates!"); | |
282 | + return false; | |
283 | + } | |
284 | + return true; | |
285 | + case Cuboid: | |
286 | + if (savedLocs.size() != 2) | |
287 | + { | |
288 | + gm.sendMessage("You have to set 2 coordinates."); | |
289 | + return false; | |
290 | + } | |
291 | + return true; | |
292 | + case Cylinder: | |
293 | + if (savedLocs.size() != 1) | |
294 | + { | |
295 | + gm.sendMessage("Only 1 location required for this shape."); | |
296 | + return false; | |
297 | + } | |
298 | + return true; | |
299 | + default: | |
300 | + gm.sendMessage("You have to select the zone shape first."); | |
301 | + return false; | |
302 | + } | |
303 | + } | |
304 | + | |
305 | + private static boolean canSaveLoc(Player activeChar) | |
306 | + { | |
307 | + switch (shape) | |
308 | + { | |
309 | + case NPoly: | |
310 | + return true; // unlimited locs can be added | |
311 | + case Cuboid: | |
312 | + if (savedLocs.size() >= 2) | |
313 | + { | |
314 | + activeChar.sendMessage(maxLocs); | |
315 | + return false; | |
316 | + } | |
317 | + return true; | |
318 | + case Cylinder: | |
319 | + if (savedLocs.size() >= 1) | |
320 | + { | |
321 | + activeChar.sendMessage("Only 1 locations required for this shape."); | |
322 | + return false; | |
323 | + } | |
324 | + return true; | |
325 | + default: | |
326 | + activeChar.sendMessage("You have to select the zone shape first."); | |
327 | + return false; | |
328 | + } | |
329 | + } | |
330 | + | |
331 | + private static String getHeadLine() | |
332 | + { | |
333 | + switch (shape) | |
334 | + { | |
335 | + case NPoly: | |
336 | + return String.format("<zone shape='NPoly' minZ='%s' maxZ='%s'>\r\n", calcZ(true), calcZ(false)); | |
337 | + case Cuboid: | |
338 | + return String.format("<zone shape='Cuboid' minZ='%s' maxZ='%s'>\r\n", calcZ(true), calcZ(false)); | |
339 | + case Cylinder: | |
340 | + return String.format("<zone shape='Cylinder' minZ='%s' maxZ='%s' rad='%s'>\r\n", calcZ(true), calcZ(false), getRad()); | |
341 | + default: | |
342 | + return ""; | |
343 | + } | |
344 | + } | |
345 | + | |
346 | + private static boolean setRadius(int val) | |
347 | + { | |
348 | + if (shape == ZoneShape.Cylinder) | |
349 | + { | |
350 | + if (val == 0) | |
351 | + return false; | |
352 | + radius = val; | |
353 | + } | |
354 | + | |
355 | + return shape == ZoneShape.Cylinder; | |
356 | + } | |
357 | + | |
358 | + private static int getRad() | |
359 | + { | |
360 | + return radius; | |
361 | + } | |
362 | + | |
363 | + private static void openHtml(Player activeChar) | |
364 | + { | |
365 | + final NpcHtmlMessage html = new NpcHtmlMessage(0); | |
366 | + html.setFile("data/html/admin/zone_create.htm"); | |
367 | + switch (shape) | |
368 | + { | |
369 | + case NONE: | |
370 | + html.replace("%zoneShape%", "Empty"); | |
371 | + html.replace("%locsSize%", "Locations Saved: Null"); | |
372 | + html.replace("%proceed%", ""); | |
373 | + html.replace("%undo%", savedLocs.size() > 0 ? "<button value=\"Undo\" action=\"bypass admin_removeLoc\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
374 | + html.replace("%dist%", ""); | |
375 | + break; | |
376 | + case NPoly: | |
377 | + html.replace("%zoneShape%", shape.name()); | |
378 | + html.replace("%locsSize%", "Locations Saved: " + savedLocs.size()); | |
379 | + html.replace("%proceed%", savedLocs.size() > 2 ? "<button value=\"Store\" action=\"bypass admin_storeLocs\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
380 | + html.replace("%undo%", savedLocs.size() > 0 ? "<button value=\"Undo\" action=\"bypass admin_removeLoc\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
381 | + html.replace("%dist%", ""); | |
382 | + break; | |
383 | + case Cuboid: | |
384 | + html.replace("%zoneShape%", shape.name()); | |
385 | + html.replace("%locsSize%", "Locations Saved: " + savedLocs.size()); | |
386 | + html.replace("%proceed%", savedLocs.size() == 2 ? "<button value=\"Store\" action=\"bypass admin_storeLocs\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
387 | + html.replace("%undo%", savedLocs.size() > 0 ? "<button value=\"Undo\" action=\"bypass admin_removeLoc\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
388 | + html.replace("%dist%", ""); | |
389 | + break; | |
390 | + case Cylinder: | |
391 | + html.replace("%zoneShape%", shape.name()); | |
392 | + html.replace("%locsSize%", "Locations Saved: " + savedLocs.size()); | |
393 | + html.replace("%undo%", savedLocs.size() == 1 ? "<button value=\"Undo\" action=\"bypass admin_removeLoc\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">" : ""); | |
394 | + if (savedLocs.size() == 1) | |
395 | + { | |
396 | + if (radius == 0) | |
397 | + { | |
398 | + html.replace("%proceed%", ""); | |
399 | + html.replace("%dist%", "Set the radius: <edit var=\"Radius\" width=110 height=15> <button value=\"Save\" action=\"bypass admin_setRad $Radius\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">"); | |
400 | + } | |
401 | + else | |
402 | + { | |
403 | + html.replace("%proceed%", "<button value=\"Store\" action=\"bypass admin_storeLocs\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\">"); | |
404 | + html.replace("%dist%", ""); | |
405 | + } | |
406 | + } | |
407 | + else | |
408 | + { | |
409 | + html.replace("%proceed%", ""); | |
410 | + html.replace("%dist%", ""); | |
411 | + } | |
412 | + break; | |
413 | + } | |
414 | + activeChar.sendPacket(html); | |
415 | + } | |
416 | + | |
417 | + private static void clear() | |
418 | + { | |
419 | + shape = ZoneShape.NONE; | |
420 | + savedLocs.clear(); | |
421 | + radius = 0; | |
422 | + } | |
423 | + | |
424 | + @Override | |
425 | + public String[] getAdminCommandList() | |
426 | + { | |
427 | + return ADMIN_COMMANDS; | |
428 | + } | |
429 | +} | |
430 | \ No newline at end of file |