l2fater

acis源码改动

Jan 14th, 2024 (edited)
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.59 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver
  3. diff --git java/Base/Data/XMLDocument.java java/Base/Data/XMLDocument.java
  4. new file mode 100644
  5. index 0000000..3f06c0f
  6. --- /dev/null
  7. +++ java/Base/Data/XMLDocument.java
  8. @@ -0,0 +1,121 @@
  9. +package Base.Data;
  10. +
  11. +
  12. +
  13. +import java.io.File;
  14. +import java.util.logging.Level;
  15. +import java.util.logging.Logger;
  16. +
  17. +import javax.xml.parsers.DocumentBuilderFactory;
  18. +import javax.xml.transform.OutputKeys;
  19. +import javax.xml.transform.Transformer;
  20. +import javax.xml.transform.TransformerException;
  21. +import javax.xml.transform.TransformerFactory;
  22. +import javax.xml.transform.dom.DOMSource;
  23. +import javax.xml.transform.stream.StreamResult;
  24. +
  25. +import net.sf.l2j.commons.data.StatSet;
  26. +
  27. +import org.w3c.dom.Document;
  28. +import org.w3c.dom.NamedNodeMap;
  29. +import org.w3c.dom.Node;
  30. +
  31. +/**
  32. + * An XML document, relying on a static and single DocumentBuilderFactory.
  33. + */
  34. +public abstract class XMLDocument
  35. +{
  36. + protected static final Logger LOG = Logger.getLogger(XMLDocument.class.getName());
  37. +
  38. + protected Document document;
  39. +
  40. + private static final DocumentBuilderFactory BUILDER;
  41. + static
  42. + {
  43. + BUILDER = DocumentBuilderFactory.newInstance();
  44. + BUILDER.setValidating(false);
  45. + BUILDER.setIgnoringComments(true);
  46. + }
  47. +
  48. + abstract protected void load();
  49. +
  50. + abstract protected void parseDocument(Document doc, File f);
  51. +
  52. + public void loadDocument(String filePath)
  53. + {
  54. + loadDocument(new File(filePath));
  55. + }
  56. +
  57. + public void writeDocument(Document doc, String fileName)
  58. + {
  59. + try
  60. + {
  61. + TransformerFactory transformerFactory = TransformerFactory.newInstance();
  62. + Transformer transformer = transformerFactory.newTransformer();
  63. + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  64. + transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  65. + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
  66. +
  67. + DOMSource source = new DOMSource(doc);
  68. + StreamResult result = new StreamResult(new File(fileName));
  69. +
  70. + transformer.transform(source, result);
  71. + LOG.info("XML file saved to " + fileName);
  72. + }
  73. + catch (TransformerException e)
  74. + {
  75. + LOG.warning("Error saving XML file: " + e.getMessage());
  76. + }
  77. + }
  78. +
  79. + /**
  80. + * Parse an entire directory or file if found.
  81. + * @param file
  82. + */
  83. + public void loadDocument(File file)
  84. + {
  85. + if (!file.exists())
  86. + {
  87. + LOG.severe("The following file or directory doesn't exist: " + file.getName());
  88. + return;
  89. + }
  90. +
  91. + if (file.isDirectory())
  92. + {
  93. + for (File f : file.listFiles())
  94. + {
  95. + loadDocument(f);
  96. + }
  97. + }
  98. + else if (file.isFile())
  99. + {
  100. + try
  101. + {
  102. + parseDocument(BUILDER.newDocumentBuilder().parse(file), file);
  103. + }
  104. + catch (Exception e)
  105. + {
  106. + LOG.log(Level.SEVERE, "Error loading XML file " + file.getName(), e);
  107. + }
  108. + }
  109. + }
  110. +
  111. + public Document getDocument()
  112. + {
  113. + return document;
  114. + }
  115. +
  116. + /**
  117. + * This method parses the content of a NamedNodeMap and feed the given StatsSet.
  118. + * @param attrs : The NamedNodeMap to parse.
  119. + * @param set : The StatsSet to feed.
  120. + */
  121. + public static void parseAndFeed(NamedNodeMap attrs, StatSet set)
  122. + {
  123. + for (int i = 0; i < attrs.getLength(); i++)
  124. + {
  125. + final Node attr = attrs.item(i);
  126. + set.set(attr.getNodeName(), attr.getNodeValue());
  127. + }
  128. + }
  129. +}
  130. diff --git java/Base/TeleportInterface/TeleLocation.java java/Base/TeleportInterface/TeleLocation.java
  131. new file mode 100644
  132. index 0000000..c552092
  133. --- /dev/null
  134. +++ java/Base/TeleportInterface/TeleLocation.java
  135. @@ -0,0 +1,36 @@
  136. +package Base.TeleportInterface;
  137. +
  138. +import net.sf.l2j.commons.data.StatSet;
  139. +
  140. +import net.sf.l2j.gameserver.model.location.Location;
  141. +
  142. +
  143. +/**
  144. + * A datatype extending {@link Location}, used to retain a single Gatekeeper teleport location.
  145. + */
  146. +public class TeleLocation extends Location
  147. +{
  148. + public TeleLocation(StatSet set)
  149. + {
  150. + super(set.getInteger("x"), set.getInteger("y"), set.getInteger("z"));
  151. +
  152. +
  153. + _price = set.getInteger("price");
  154. +
  155. + _isNoble = set.getBool("isNoble");
  156. + }
  157. +
  158. +
  159. + private final int _price;
  160. + private final boolean _isNoble;
  161. +
  162. + public int getPrice()
  163. + {
  164. + return _price;
  165. + }
  166. +
  167. + public boolean isNoble()
  168. + {
  169. + return _isNoble;
  170. + }
  171. +}
  172. \ No newline at end of file
  173. diff --git java/Base/TeleportInterface/TeleportLocationData.java java/Base/TeleportInterface/TeleportLocationData.java
  174. new file mode 100644
  175. index 0000000..74316f8
  176. --- /dev/null
  177. +++ java/Base/TeleportInterface/TeleportLocationData.java
  178. @@ -0,0 +1,82 @@
  179. +package Base.TeleportInterface;
  180. +
  181. +import java.io.File;
  182. +import java.util.HashMap;
  183. +import java.util.Map;
  184. +
  185. +import net.sf.l2j.commons.data.StatSet;
  186. +
  187. +
  188. +
  189. +
  190. +import org.w3c.dom.Document;
  191. +import org.w3c.dom.Node;
  192. +
  193. +import Base.Data.XMLDocument;
  194. +
  195. +/**
  196. + * This class loads and stores {@link TeleLocation}s.
  197. + */
  198. +public class TeleportLocationData extends XMLDocument
  199. +{
  200. + private final Map<Integer, TeleLocation> _teleports = new HashMap<>();
  201. +
  202. + protected TeleportLocationData()
  203. + {
  204. + load();
  205. + }
  206. +
  207. + @Override
  208. + protected void load()
  209. + {
  210. + loadDocument("./data/xml/teleportLocations.xml");
  211. + LOG.info("Loaded {} teleport locations." + _teleports.size());
  212. + }
  213. +
  214. + @Override
  215. + protected void parseDocument(Document doc, File file)
  216. + {
  217. + // StatsSet used to feed informations. Cleaned on every entry.
  218. + final StatSet set = new StatSet();
  219. +
  220. + // First element is never read.
  221. + final Node n = doc.getFirstChild();
  222. +
  223. + for (Node o = n.getFirstChild(); o != null; o = o.getNextSibling())
  224. + {
  225. + if (!"teleport".equalsIgnoreCase(o.getNodeName()))
  226. + continue;
  227. +
  228. + // Parse and feed content.
  229. + parseAndFeed(o.getAttributes(), set);
  230. +
  231. + // Feed the map with new data.
  232. + _teleports.put(set.getInteger("id"), new TeleLocation(set));
  233. +
  234. + // Clear the StatsSet.
  235. + set.clear();
  236. + }
  237. + }
  238. +
  239. + public void reload()
  240. + {
  241. + _teleports.clear();
  242. +
  243. + load();
  244. + }
  245. +
  246. + public TeleLocation getTeleportLocation(int id)
  247. + {
  248. + return _teleports.get(id);
  249. + }
  250. +
  251. + public static TeleportLocationData getInstance()
  252. + {
  253. + return SingletonHolder.INSTANCE;
  254. + }
  255. +
  256. + private static class SingletonHolder
  257. + {
  258. + protected static final TeleportLocationData INSTANCE = new TeleportLocationData();
  259. + }
  260. +}
  261. \ No newline at end of file
  262. diff --git java/net/sf/l2j/gameserver/GameServer.java java/net/sf/l2j/gameserver/GameServer.java
  263. index 852ed11..2c0ee64 100644
  264. --- java/net/sf/l2j/gameserver/GameServer.java
  265. +++ java/net/sf/l2j/gameserver/GameServer.java
  266. @@ -116,6 +116,7 @@
  267. import net.sf.l2j.util.IPv4Filter;
  268.  
  269. import Base.DropMaster.DropMaster;
  270. +import Base.TeleportInterface.TeleportLocationData;
  271.  
  272. public class GameServer
  273. {
  274. @@ -319,6 +320,10 @@
  275.  
  276.  
  277.  
  278. + StringUtil.printSection("Gk Interface");
  279. + TeleportLocationData.getInstance();
  280. +
  281. +
  282.  
  283.  
  284. StringUtil.printSection("System");
  285. diff --git java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java
  286. index ac248d9..5b7cc45 100644
  287. --- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java
  288. +++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminReload.java
  289. @@ -28,6 +28,8 @@
  290. import net.sf.l2j.gameserver.model.World;
  291. import net.sf.l2j.gameserver.model.actor.Player;
  292.  
  293. +import Base.TeleportInterface.TeleportLocationData;
  294. +
  295. public class AdminReload implements IAdminCommandHandler
  296. {
  297. private static final String[] ADMIN_COMMANDS =
  298. @@ -101,6 +103,12 @@
  299. MultisellData.getInstance().reload();
  300. player.sendMessage("The multisell instance has been reloaded.");
  301. }
  302. + else if (type.equals("teleto"))
  303. + {
  304. + TeleportLocationData.getInstance().reload();
  305. + player.sendMessage("Teleport Reloads.");
  306. + }
  307. +
  308. else if (type.equals("npc"))
  309. {
  310. NpcData.getInstance().reload();
  311. @@ -174,7 +182,7 @@
  312. player.sendMessage("Usage : //reload <admin|announcement|buylist|config>");
  313. player.sendMessage("Usage : //reload <crest|cw|door|htm|item|multisell|npc>");
  314. player.sendMessage("Usage : //reload <npcwalker|script|skill|teleport|zone>");
  315. - player.sendMessage("Usage : //reload <spawnlist|sysstring|capsule>");
  316. + player.sendMessage("Usage : //reload <spawnlist|sysstring|teleto|capsule>");
  317. }
  318.  
  319. @Override
  320. diff --git java/net/sf/l2j/gameserver/network/SystemMessageId.java java/net/sf/l2j/gameserver/network/SystemMessageId.java
  321. index 12cf8b2..48a7def 100644
  322. --- java/net/sf/l2j/gameserver/network/SystemMessageId.java
  323. +++ java/net/sf/l2j/gameserver/network/SystemMessageId.java
  324. @@ -11795,6 +11795,7 @@
  325. * Message: Please wait a moment.
  326. */
  327. public static final SystemMessageId PLEASE_WAIT_A_MOMENT;
  328. + public static final SystemMessageId WILL_BE_MOVED_INTERFACE;
  329.  
  330. public static final SystemMessageId DESACTIVATE_SUMMON_ACTACK;
  331. public static final SystemMessageId ACTIVATE_RESPECT_HUNT;
  332. @@ -13776,7 +13777,7 @@
  333. S1_CANNOT_PARTICIPATE_IN_OLYMPIAD_DURING_TELEPORT = new SystemMessageId(2029);
  334. CURRENTLY_LOGGING_IN = new SystemMessageId(2030);
  335. PLEASE_WAIT_A_MOMENT = new SystemMessageId(2031);
  336. -
  337. + WILL_BE_MOVED_INTERFACE = new SystemMessageId(2154);
  338. AUTO_FARM_DESACTIVATED = new SystemMessageId(2155);
  339. ACTIVATE_SUMMON_ACTACK = new SystemMessageId(2156);
  340. DESACTIVATE_SUMMON_ACTACK = new SystemMessageId(2157);
  341. diff --git java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  342. index 3da941e..a3d63c6 100644
  343. --- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  344. +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
  345. @@ -47,6 +47,7 @@
  346. import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  347. import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  348. import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage.SMPOS;
  349. +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
  350. import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  351. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  352. import net.sf.l2j.gameserver.scripting.QuestState;
  353. @@ -54,6 +55,8 @@
  354. import net.sf.l2j.gameserver.skills.L2Skill;
  355.  
  356. import Base.AutoFarm.AutofarmPlayerRoutine;
  357. +import Base.TeleportInterface.TeleLocation;
  358. +import Base.TeleportInterface.TeleportLocationData;
  359.  
  360. public final class RequestBypassToServer extends L2GameClientPacket
  361. {
  362. @@ -321,6 +324,61 @@
  363. {
  364. }
  365. }
  366. +
  367. +
  368. + if (_command.startsWith("goto ")) {
  369. + final StringTokenizer st = new StringTokenizer(_command, " ");
  370. + st.nextToken();
  371. +
  372. +
  373. + if (st.hasMoreTokens()) {
  374. + String targetLocation = st.nextToken();
  375. +
  376. + int teleportId = extractLastInteger(targetLocation);
  377. +
  378. +
  379. + if (!checkallowed(player)) {
  380. + return;
  381. + }
  382. +
  383. +
  384. + TeleLocation list = TeleportLocationData.getInstance().getTeleportLocation(teleportId);
  385. + if (list == null) {
  386. + return;
  387. + }
  388. +
  389. + if (!isNoble(player, teleportId)) {
  390. + player.sendMessage("Solo Los Nobles Pueden Ir a Esta Zone");
  391. + return;
  392. + }
  393. +
  394. + int price;
  395. +
  396. +
  397. +
  398. + if (shouldChargePrice(teleportId) || (player.getStatus().getLevel() > 40 )) {
  399. + price = list.getPrice();
  400. + } else {
  401. + price = 0;
  402. + }
  403. +
  404. +
  405. + if (player.destroyItemByItemId("Teleport", 57, price, player, true)) {
  406. + MagicSkillUse MSU = new MagicSkillUse(player, player, 2036, 1, 1, 0);
  407. + player.broadcastPacket(MSU);
  408. + player.teleToLocation(list);
  409. + player.sendPacket(new SystemMessage(SystemMessageId.WILL_BE_MOVED_INTERFACE));
  410. + }
  411. +
  412. + player.sendPacket(ActionFailed.STATIC_PACKET);
  413. + }
  414. + }
  415. +
  416. +
  417. +
  418. +
  419. +
  420. +
  421. // Navigate throught Manor windows
  422. else if (_command.startsWith("manor_menu_select?"))
  423. {
  424. @@ -777,5 +835,75 @@
  425. }
  426.  
  427.  
  428. + private int extractLastInteger(String input) {
  429. + String[] parts = input.split("\\.");
  430. + if (parts.length > 0) {
  431. + String lastPart = parts[parts.length - 1];
  432. + try {
  433. + return Integer.parseInt(lastPart);
  434. + } catch (NumberFormatException e) {
  435. +
  436. + }
  437. + }
  438. + return -1;
  439. + }
  440. +
  441. +
  442. +
  443. + // Función para verificar nobleza
  444. + private boolean isNoble(Player player, int teleportId) {
  445. + int[] nobleZones = {154754, 154761, 154755, 154756, 154757, 154758, 154759, 154760, 159761, 154762, 154768, 154763, 154764, 154765, 154767};
  446. +
  447. + for (int zone : nobleZones) {
  448. + if (teleportId == zone && !player.isNoble()) {
  449. + return false;
  450. + }
  451. + }
  452. + return true;
  453. + }
  454. +
  455. + // Add this new method
  456. + private boolean shouldChargePrice(int teleportId) {
  457. + int[] chargeAlwaysIds = {151782, 151791, 151785, 151787, 151786, 151783, 151788, 151784};
  458. +
  459. + for (int id : chargeAlwaysIds) {
  460. + if (teleportId == id) {
  461. + return true;
  462. + }
  463. + }
  464. + return false;
  465. + }
  466. +
  467. +
  468. + public static boolean checkallowed(Player activeChar)
  469. + {
  470. +
  471. + String msg = null;
  472. + if (activeChar.isSitting())
  473. + msg = "No Puedes Usar El Teleport Sentado";
  474. + else if (activeChar.isDead())
  475. + msg = "No Puedes Usar El Teleport Muerto";
  476. + else if (activeChar.getPvpFlag() > 0)
  477. + msg = "Estas En Modo Flag No Puedes Teleport";
  478. + else if (activeChar.getKarma() > 0)
  479. + msg = "Estas En Modo Pk No Puedes Teleport";
  480. + else if (activeChar.isInCombat())
  481. + msg = "No Puedes Usar El Teleport En Combate";
  482. + else if (activeChar.isInDuel())
  483. + msg = "No Puedes Usar El Teleport En Duelos";
  484. + else if (activeChar.isInOlympiadMode())
  485. + msg = "No Puedes Usar El Teleport En Olympiadas";
  486. + else if (activeChar.isInJail())
  487. + msg = "No Puedes Usar El Teleport En Jail";
  488. +
  489. + if (msg != null)
  490. + {
  491. + activeChar.sendMessage(msg);
  492. + }
  493. +
  494. + return msg == null;
  495. + }
  496. +
  497. +
  498.  
  499. }
  500. \ No newline at end of file
  501.  
Add Comment
Please, Sign In to add comment