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 |