TransformData.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. * Copyright (C) 2004-2013 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.gameserver.datatables;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import java.util.logging.Level;
  23. import org.w3c.dom.NamedNodeMap;
  24. import org.w3c.dom.Node;
  25. import com.l2jserver.gameserver.engines.DocumentParser;
  26. import com.l2jserver.gameserver.model.StatsSet;
  27. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  28. import com.l2jserver.gameserver.model.actor.transform.Transform;
  29. import com.l2jserver.gameserver.model.actor.transform.TransformLevelData;
  30. import com.l2jserver.gameserver.model.actor.transform.TransformTemplate;
  31. import com.l2jserver.gameserver.model.holders.AdditionalItemHolder;
  32. import com.l2jserver.gameserver.model.holders.AdditionalSkillHolder;
  33. import com.l2jserver.gameserver.model.holders.SkillHolder;
  34. import com.l2jserver.gameserver.network.serverpackets.ExBasicActionList;
  35. /**
  36. * @author UnAfraid
  37. */
  38. public final class TransformData extends DocumentParser
  39. {
  40. private final Map<Integer, Transform> _transformData = new HashMap<>();
  41. protected TransformData()
  42. {
  43. load();
  44. }
  45. @Override
  46. public synchronized void load()
  47. {
  48. _transformData.clear();
  49. parseDatapackDirectory("data/stats/transformations", false);
  50. _log.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _transformData.size() + " transform templates.");
  51. }
  52. @Override
  53. protected void parseDocument()
  54. {
  55. NamedNodeMap attrs;
  56. Node att;
  57. StatsSet set;
  58. for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling())
  59. {
  60. if ("list".equalsIgnoreCase(n.getNodeName()))
  61. {
  62. for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
  63. {
  64. if ("transform".equalsIgnoreCase(d.getNodeName()))
  65. {
  66. attrs = d.getAttributes();
  67. set = new StatsSet();
  68. for (int i = 0; i < attrs.getLength(); i++)
  69. {
  70. att = attrs.item(i);
  71. set.set(att.getNodeName(), att.getNodeValue());
  72. }
  73. final Transform transform = new Transform(set);
  74. for (Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling())
  75. {
  76. boolean isMale = "Male".equalsIgnoreCase(cd.getNodeName());
  77. if ("Male".equalsIgnoreCase(cd.getNodeName()) || "Female".equalsIgnoreCase(cd.getNodeName()))
  78. {
  79. TransformTemplate templateData = null;
  80. for (Node z = cd.getFirstChild(); z != null; z = z.getNextSibling())
  81. {
  82. switch (z.getNodeName())
  83. {
  84. case "common":
  85. {
  86. for (Node s = z.getFirstChild(); s != null; s = s.getNextSibling())
  87. {
  88. switch (s.getNodeName())
  89. {
  90. case "base":
  91. case "stats":
  92. case "defense":
  93. case "magicDefense":
  94. case "collision":
  95. case "moving":
  96. {
  97. attrs = s.getAttributes();
  98. for (int i = 0; i < attrs.getLength(); i++)
  99. {
  100. att = attrs.item(i);
  101. set.set(att.getNodeName(), att.getNodeValue());
  102. }
  103. break;
  104. }
  105. }
  106. }
  107. templateData = new TransformTemplate(set);
  108. transform.setTemplate(isMale, templateData);
  109. break;
  110. }
  111. case "skills":
  112. {
  113. if (templateData == null)
  114. {
  115. templateData = new TransformTemplate(set);
  116. transform.setTemplate(isMale, templateData);
  117. }
  118. for (Node s = z.getFirstChild(); s != null; s = s.getNextSibling())
  119. {
  120. if ("skill".equals(s.getNodeName()))
  121. {
  122. attrs = s.getAttributes();
  123. int skillId = parseInteger(attrs, "id");
  124. int skillLevel = parseInteger(attrs, "level");
  125. templateData.addSkill(new SkillHolder(skillId, skillLevel));
  126. }
  127. }
  128. break;
  129. }
  130. case "actions":
  131. {
  132. if (templateData == null)
  133. {
  134. templateData = new TransformTemplate(set);
  135. transform.setTemplate(isMale, templateData);
  136. }
  137. set.set("actions", z.getTextContent());
  138. final int[] actions = set.getIntArray("actions", " ");
  139. templateData.setBasicActionList(new ExBasicActionList(actions));
  140. break;
  141. }
  142. case "additionalSkills":
  143. {
  144. if (templateData == null)
  145. {
  146. templateData = new TransformTemplate(set);
  147. transform.setTemplate(isMale, templateData);
  148. }
  149. for (Node s = z.getFirstChild(); s != null; s = s.getNextSibling())
  150. {
  151. if ("skill".equals(s.getNodeName()))
  152. {
  153. attrs = s.getAttributes();
  154. int skillId = parseInteger(attrs, "id");
  155. int skillLevel = parseInteger(attrs, "level");
  156. int minLevel = parseInteger(attrs, "minLevel");
  157. templateData.addAdditionalSkill(new AdditionalSkillHolder(skillId, skillLevel, minLevel));
  158. }
  159. }
  160. break;
  161. }
  162. case "items":
  163. {
  164. if (templateData == null)
  165. {
  166. templateData = new TransformTemplate(set);
  167. transform.setTemplate(isMale, templateData);
  168. }
  169. for (Node s = z.getFirstChild(); s != null; s = s.getNextSibling())
  170. {
  171. if ("item".equals(s.getNodeName()))
  172. {
  173. attrs = s.getAttributes();
  174. int itemId = parseInteger(attrs, "id");
  175. boolean allowed = parseBoolean(attrs, "allowed");
  176. templateData.addAdditionalItem(new AdditionalItemHolder(itemId, allowed));
  177. }
  178. }
  179. break;
  180. }
  181. case "levels":
  182. {
  183. if (templateData == null)
  184. {
  185. templateData = new TransformTemplate(set);
  186. transform.setTemplate(isMale, templateData);
  187. }
  188. final StatsSet levelsSet = new StatsSet();
  189. for (Node s = z.getFirstChild(); s != null; s = s.getNextSibling())
  190. {
  191. if ("level".equals(s.getNodeName()))
  192. {
  193. attrs = s.getAttributes();
  194. for (int i = 0; i < attrs.getLength(); i++)
  195. {
  196. att = attrs.item(i);
  197. levelsSet.set(att.getNodeName(), att.getNodeValue());
  198. }
  199. }
  200. }
  201. templateData.addLevelData(new TransformLevelData(levelsSet));
  202. break;
  203. }
  204. }
  205. }
  206. }
  207. }
  208. _transformData.put(transform.getId(), transform);
  209. }
  210. }
  211. }
  212. }
  213. }
  214. public Transform getTransform(int id)
  215. {
  216. return _transformData.get(id);
  217. }
  218. public boolean transformPlayer(int id, L2PcInstance player)
  219. {
  220. final Transform transform = getTransform(id);
  221. if (transform != null)
  222. {
  223. player.transform(transform);
  224. }
  225. return transform != null;
  226. }
  227. public static TransformData getInstance()
  228. {
  229. return SingletonHolder._instance;
  230. }
  231. private static class SingletonHolder
  232. {
  233. protected static final TransformData _instance = new TransformData();
  234. }
  235. }