Advertisement
Guest User

aCis 376 Easy Create Zone

a guest
Dec 23rd, 2018
818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.31 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement