FrankVvv

Untitled

Sep 29th, 2022
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 87.94 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P L2jSanne_GameServer
  3. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Condition.java
  4. ===================================================================
  5. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Condition.java (revision 0)
  6. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Condition.java (working copy)
  7. @@ -0,0 +1,48 @@
  8. + /*
  9. + * This program is free software: you can redistribute it and/or modify it under
  10. + * the terms of the GNU General Public License as published by the Free Software
  11. + * Foundation, either version 3 of the License, or (at your option) any later
  12. + * version.
  13. + *
  14. + * This program is distributed in the hope that it will be useful, but WITHOUT
  15. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17. + * details.
  18. + *
  19. + * You should have received a copy of the GNU General Public License along with
  20. + * this program. If not, see <http://www.gnu.org/licenses/>.
  21. + */
  22. + package net. sf.l2j.achievementEngine;
  23. +
  24. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  25. +
  26. + /**
  27. + * @author Matim,Wallister
  28. + * @version v1
  29. + */
  30. + public abstract class Condition
  31. + {
  32. + private Object _value;
  33. + private String _name;
  34. +
  35. + public Condition(Object value)
  36. + {
  37. + _value = value;
  38. + }
  39. +
  40. + public abstract boolean meetConditionRequirements(L2PcInstance paramL2PcInstance);
  41. +
  42. + public Object getValue() {
  43. + return _value;
  44. + }
  45. +
  46. + public void setName(String s)
  47. + {
  48. + _name = s;
  49. + }
  50. +
  51. + public String getName()
  52. + {
  53. + return _name;
  54. + }
  55. + }
  56.  
  57. \ No newline at end of file
  58. Index: config/achievements.xml
  59. ===================================================================
  60. --- config/achievements.xml (revision 0)
  61. +++ config/achievements.xml (working copy)
  62. @@ -0,0 +1,27 @@
  63. + <list>
  64. + <achievement id="1" name="Champion" description="Player level 80" reward="9142,5" minLevel="80"/>
  65. + <achievement id="2" name="Hero" description="player hero status" reward="9142,10" mustBeHero="true"/>
  66. + <achievement id="3" name="Noble" description="Player noblesse status" reward="9142,10" mustBeNoble="true"/>
  67. + <achievement id="4" name="Weapon" description="Enchant a weapon min + 20" reward="9142,15" minWeaponEnchant="16" />
  68. + <achievement id="5" name="Pvp's" description="Need 1,000 PvPs" reward="9142,15" minPvPCount="1000"/>
  69. + <achievement id="6" name="Leader" description="Be a clan leader" reward="9142,10" mustBeClanLeader="true"/>
  70. + <achievement id="7" name="Pk's" description="Need 1,000 Pks" reward="9142,15" minPkCount="1000"/>
  71. + <achievement id="8" name="Craft" description="Event Medal" reward="9142,15" itemAmmount="6392,200"/>
  72. + <achievement id="9" name="Comander" description="Be clan leader of a clan level 8" reward="9142,10" minClanLevel="8" mustBeClanLeader="true"/>
  73. + <achievement id="10" name="You Life" description="Max HP,CP,MP" reward="9142,10" maxHP="1000" maxMP="1000" maxCP="1000"/>
  74. + <achievement id="11" name="Karma Player" description="Min Karma" reward="9142,5" minKarmaCount="100"/>
  75. + <achievement id="12" name="Adena Player" description="Min adena cout" reward="9142,5" minAdenaCount="100"/>
  76. + <achievement id="13" name="Player In Clan" description="Min player clan" reward="9142,5" minClanMembersCount="1"/>
  77. + <achievement id="14" name="Achievements" description="Complete all personal achievements" reward="9142,40" CompleteAchievements="18"/>
  78. + <achievement id="15" name="Reputation Clan" description="Reputation in his clan" reward="9142,5" crpAmmount="100"/>
  79. + <achievement id="16" name="Leader Of Clan" description="Ter Castle" reward="9142,5" lordOfCastle="true"/>
  80. + <achievement id="17" name="Mage Class" description="Mage Class" reward="9142,5" mustBeMageClass="true"/>
  81. + <achievement id="18" name="Slayer" description="Kill Boss and be level 80" reward="9142,5" raidToKill="77771" minLevel="80" />
  82. + <achievement id="19" name="Skills" description="Have a +10 skill" reward="9142,15" minSkillEnchant="10"/>
  83. + <achievement id="20" name="SubClasses" description="Have 1 subclasses" reward="9142,5" minSubclassCount="1"/>
  84. + <achievement id="21" name="Gamer" description="Be online for 1 days" reward="9142,10" minOnlineTime="1"/>
  85. + <achievement id="22" name="Cursed" description="Cursed Weapon" reward="9142,10" Cursedweapon="true"/>
  86. + <achievement id="23" name="Armor" description="Complete the enchantment of armor" reward="9142,10" minHeadEnchant="16" minChestEnchant="16" minFeetEnchant="16" minLegsEnchant="16" minGlovestEnchant="16"/>
  87. + <achievement id="24" name="Married" description="Getting married in the game" reward="9142,10" mustBeMarried="true"/>
  88. + <achievement id="25" name="Vip" description="Become a VIP player" reward="9142,10" mustBeVip="true"/>
  89. + </list>
  90. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/OnlineTime.java
  91. ===================================================================
  92. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/OnlineTime.java (revision 0)
  93. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/OnlineTime.java (working copy)
  94. @@ -0,0 +1,24 @@
  95. + package net.sf.l2j.achievementEngine;
  96. +
  97. + import net.sf.l2j.achievementEngine.Condition;
  98. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  99. +
  100. + public class OnlineTime extends Condition
  101. + {
  102. + public OnlineTime(Object value)
  103. + {
  104. + super(value);
  105. + setName("Online Time");
  106. + }
  107. +
  108. + @Override
  109. + public boolean meetConditionRequirements(L2PcInstance player)
  110. + {
  111. + if (getValue() == null) {
  112. + return false;
  113. + }
  114. + int val = Integer.parseInt(getValue().toString());
  115. +
  116. + return player.getOnlineTime() >= val;
  117. + }
  118. +}
  119.  
  120. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine.EnchantAmor/Feet.java
  121. ===================================================================
  122. --- aCis_gameserver/java/net.sf.l2j.achievementEngine.EnchantAmor/Feet.java (revision 0)
  123. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine.EnchantAmor/Feet.java (working copy)
  124. @@ -0,0 +1,41 @@
  125. + package net.sf.l2j.achievementEngine.EnchantAmor;
  126. +
  127. + import net.sf.l2j.achievementEngine.Condition;
  128. + import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  129. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  130. + import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  131. +
  132. + /**
  133. + * @author Matim,Wallister
  134. + * @version v1
  135. + */
  136. + public class Feet extends Condition
  137. + {
  138. + public Feet(Object value)
  139. + {
  140. + super(value);
  141. + setName("Boots");
  142. + }
  143. +
  144. + @Override
  145. + public boolean meetConditionRequirements(L2PcInstance player)
  146. + {
  147. + if (getValue() == null)
  148. + {
  149. + return false;
  150. + }
  151. +
  152. + int val = Integer.parseInt(getValue().toString());
  153. +
  154. + ItemInstance armor = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET);
  155. +
  156. + if (armor != null)
  157. + {
  158. + if (armor.getEnchantLevel() >= val)
  159. + {
  160. + return true;
  161. + }
  162. + }
  163. + return false;
  164. + }
  165. + }
  166.  
  167. \ No newline at end of file
  168. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Mageclass.java
  169. ===================================================================
  170. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Mageclass.java (revision 0)
  171. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Mageclass.java (working copy)
  172. @@@@@@@@@@@@@@@
  173. + package net.sf.l2j.achievementEngine;
  174. +
  175. + import net.sf.l2j.achievementEngine.Condition;
  176. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  177. +
  178. +public class Mageclass extends Condition
  179. +{
  180. + public Mageclass(Object value)
  181. + {
  182. + super(value);
  183. + setName("Mage Class");
  184. + }
  185. +
  186. + @Override
  187. +public boolean meetConditionRequirements(L2PcInstance player)
  188. + {
  189. + if (getValue() == null) {
  190. + return false;
  191. + }
  192. +
  193. + return player.isMageClass();
  194. + }
  195. +}
  196.  
  197. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Pk.java
  198. ===================================================================
  199. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Pk.java (revision 0)
  200. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Pk.java (working copy)
  201. @@@@@@@@@@@@@@@@
  202. +package net.sf.l2j.achievementEngine;
  203. +
  204. +import net.sf.l2j.achievementEngine.Condition;
  205. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  206. +
  207. +public class Pk extends Condition
  208. +{
  209. + public Pk(Object value)
  210. + {
  211. + super(value);
  212. + setName("PK Count");
  213. + }
  214. +
  215. + @Override
  216. +public boolean meetConditionRequirements(L2PcInstance player)
  217. + {
  218. + if (getValue() == null) {
  219. + return false;
  220. + }
  221. + int val = Integer.parseInt(getValue().toString());
  222. +
  223. + return player.getPkKills() >= val;
  224. + }
  225. +}
  226.  
  227. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Noble.java
  228. ===================================================================
  229. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Noble.java (revision 0)
  230. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Noble.java (working copy)
  231. @@@@@@@@@@@@@@
  232. + package net.sf.l2j.achievementEngine;
  233. +
  234. +import net.sf.l2j.achievementEngine.Condition;
  235. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  236. +
  237. +public class Noble extends Condition
  238. +{
  239. + public Noble(Object value)
  240. + {
  241. + super(value);
  242. + setName("Noble");
  243. + }
  244. +
  245. + @Override
  246. +public boolean meetConditionRequirements(L2PcInstance player)
  247. + {
  248. + if (getValue() == null) {
  249. + return false;
  250. + }
  251. +
  252. + return player.isNoble();
  253. + }
  254. +}
  255.  
  256. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/AchievementsManager.java
  257. ===================================================================
  258. --- aCis_gameserver/java/net.sf.l2j.achievementEngine.java (revision 0)
  259. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine.java (working copy)
  260. @@@@@@@@@@@@@@@@@
  261. + package net.sf.l2j.achievementEngine;
  262. +
  263. + import java.io.File;
  264. +
  265. + import java.sql.Connection;
  266. + import java.sql.SQLException;
  267. + import java.sql.Statement;
  268. + import java.util.Map;
  269. + import java.util.logging.Logger;
  270. +
  271. + import javax.xml.parsers.DocumentBuilderFactory;
  272. +
  273. + import java.util.ArrayList;
  274. +import java.util.HashMap;
  275. +
  276. + import org.w3c.dom.Document;
  277. + import org.w3c.dom.NamedNodeMap;
  278. + import org.w3c.dom.Node;
  279. +
  280. +
  281. +
  282. + import net.sf.l2j.Config;
  283. + import net.sf.l2j.L2DatabaseFactory;
  284. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  285. + import net.sf.l2j.achievementEngine.Achievement;
  286. + import net.sf.l2j.achievementEngine.Condition;
  287. + import net.sf.l2j.achievementEngine.Adena;
  288. + import net.sf.l2j.achievementEngine.ItemsCount;
  289. + import net.sf.l2j.achievementEngine.Level;
  290. + import net.sf.l2j.achievementEngine.WeaponEnchant;
  291. + import net.sf.l2j.achievementEngine.EnchantAmor.Chest;
  292. + import net.sf.l2j.achievementEngine.EnchantAmor.Feet;
  293. + import net.sf.l2j.achievementEngine.EnchantAmor.Gloves;
  294. + import net.sf.l2j.achievementEngine.EnchantAmor.Head;
  295. + import net.sf.l2j.achievementEngine.EnchantAmor.Legs;
  296. +
  297. + /**
  298. + * @author Matim,Wallister
  299. + * @version v1
  300. + */
  301. + public class AchievementsManager
  302. + {
  303. + private Map<Integer, Achievement> _achievementList = new HashMap<Integer, Achievement>();
  304. +
  305. +
  306. + private static Logger _log = Logger.getLogger(AchievementsManager.class.getName());
  307. +
  308. + public AchievementsManager()
  309. + {
  310. + loadAchievements();
  311. + }
  312. +
  313. + private void loadAchievements()
  314. + {
  315. + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  316. + factory.setValidating(false);
  317. + factory.setIgnoringComments(true);
  318. +
  319. + File file = new File("config/achievements.xml");
  320. + if (!file.exists())
  321. + {
  322. + _log.warning("[AchievementsEngine] Error: achievements xml file does not exist, check directory!");
  323. + }
  324. + try
  325. + {
  326. + Document doc = factory.newDocumentBuilder().parse(file);
  327. +
  328. + for (Node list = doc.getFirstChild(); list != null; list = list.getNextSibling())
  329. + {
  330. + if("list".equalsIgnoreCase(list.getNodeName()))
  331. + {
  332. + for (Node achievement = list.getFirstChild(); achievement != null; achievement = achievement.getNextSibling())
  333. + {
  334. + if("achievement".equalsIgnoreCase(achievement.getNodeName()))
  335. + {
  336. + int id = checkInt(achievement, "id");
  337. +
  338. + String name = String.valueOf(achievement.getAttributes().getNamedItem("name").getNodeValue());
  339. + String description = String.valueOf(achievement.getAttributes().getNamedItem("description").getNodeValue());
  340. + String reward = String.valueOf(achievement.getAttributes().getNamedItem("reward").getNodeValue());
  341. + boolean repeat = checkBoolean(achievement, "repeatable");
  342. +
  343. + ArrayList<Condition> conditions = conditionList(achievement.getAttributes());
  344. +
  345. + _achievementList.put(id, new Achievement(id, name, description, reward, repeat, conditions));
  346. + alterTable(id);
  347. + }
  348. + }
  349. + }
  350. + }
  351. + _log.info("--------------------------------------------------------------------");
  352. + _log.info(" ");
  353. + _log.info("[AchievementsEngine] Successfully loaded: " + getAchievementList().size() + " achievements from xml!");
  354. + _log.info(" AchievementsEngine ");
  355. + _log.info(" by Wallister ");
  356. + _log.info(" ");
  357. + _log.info("--------------------------------------------------------------------");
  358. + }
  359. + catch (Exception e)
  360. + {
  361. + _log.warning("[AchievementsEngine] Error: " + e);
  362. + e.printStackTrace();
  363. + }
  364. + }
  365. +
  366. + public void rewardForAchievement(int achievementID, L2PcInstance player)
  367. + {
  368. + Achievement achievement = _achievementList.get(achievementID);
  369. +
  370. + for (int id: achievement.getRewardList().keySet())
  371. + player.addItem(achievement.getName(), id, achievement.getRewardList().get(id), player, true);
  372. + }
  373. +
  374. + private boolean checkBoolean(Node d, String nodename)
  375. + {
  376. + boolean b = false;
  377. +
  378. + try
  379. + {
  380. + b = Boolean.valueOf(d.getAttributes().getNamedItem(nodename).getNodeValue());
  381. + }
  382. + catch (Exception e)
  383. + {
  384. +
  385. + }
  386. + return b;
  387. + }
  388. +
  389. + private int checkInt(Node d, String nodename)
  390. + {
  391. + int i = 0;
  392. +
  393. + try
  394. + {
  395. + i = Integer.valueOf(d.getAttributes().getNamedItem(nodename).getNodeValue());
  396. + }
  397. + catch (Exception e)
  398. + {
  399. +
  400. + }
  401. + return i;
  402. + }
  403. +
  404. + /**
  405. + * Alter table, catch exception if already exist.
  406. + * @param fieldID
  407. + */
  408. + private void alterTable(int fieldID)
  409. + {
  410. + Connection con = null;
  411. + try
  412. + {
  413. + con = L2DatabaseFactory.getInstance().getConnection();
  414. + Statement statement = con.createStatement();
  415. + statement.executeUpdate("ALTER TABLE achievements ADD a" + fieldID + " INT DEFAULT 0");
  416. + statement.close();
  417. + }
  418. + catch (SQLException e)
  419. + {
  420. +
  421. + }
  422. + }
  423. +
  424. + public ArrayList<Condition> conditionList(NamedNodeMap attributesList)
  425. + {
  426. + ArrayList<Condition> conditions = new ArrayList<Condition>();
  427. +
  428. + for (int j = 0; j < attributesList.getLength(); j++)
  429. + {
  430. + addToConditionList(attributesList.item(j).getNodeName(), attributesList.item(j).getNodeValue(), conditions);
  431. + }
  432. +
  433. + return conditions;
  434. + }
  435. +
  436. + public Map<Integer, Achievement> getAchievementList()
  437. + {
  438. + return _achievementList;
  439. + }
  440. +
  441. + public static AchievementsManager getInstance()
  442. + {
  443. + return SingletonHolder._instance;
  444. + }
  445. +
  446. + private static class SingletonHolder
  447. + {
  448. + protected static final AchievementsManager _instance = new AchievementsManager();
  449. + }
  450. +
  451. + private void addToConditionList(String nodeName, Object value, ArrayList<Condition> conditions)
  452. + {
  453. + if (nodeName.equals("minLevel"))
  454. + conditions.add(new Level(value));
  455. +
  456. + else if (nodeName.equals("minPvPCount"))
  457. + conditions.add(new Pvp(value));
  458. +
  459. + else if (nodeName.equals("minPkCount"))
  460. + conditions.add(new Pk(value));
  461. +
  462. + else if (nodeName.equals("minClanLevel"))
  463. + conditions.add(new ClanLevel(value));
  464. +
  465. + else if (nodeName.equals("mustBeHero"))
  466. + conditions.add(new Hero(value));
  467. +
  468. + else if (nodeName.equals("mustBeNoble"))
  469. + conditions.add(new Noble(value));
  470. +
  471. + else if (nodeName.equals("mustBeClanLeader"))
  472. + conditions.add(new ClanLeader(value));
  473. +
  474. + else if (nodeName.equals("minWeaponEnchant"))
  475. + conditions.add(new WeaponEnchant(value));
  476. +
  477. + else if (nodeName.equals("minKarmaCount"))
  478. + conditions.add(new Karma(value));
  479. +
  480. + else if (nodeName.equals("minAdenaCount"))
  481. + conditions.add(new Adena(value));
  482. +
  483. + else if (nodeName.equals("minClanMembersCount"))
  484. + conditions.add(new MinCMcount(value));
  485. +
  486. + else if (nodeName.equals("maxHP"))
  487. + conditions.add(new Maxhp(value));
  488. +
  489. + else if (nodeName.equals("maxMP"))
  490. + conditions.add(new Maxmp(value));
  491. +
  492. + else if (nodeName.equals("maxCP"))
  493. + conditions.add(new Maxcp(value));
  494. +
  495. + else if (nodeName.equals("mustBeMarried"))
  496. + conditions.add(new Marry(value));
  497. +
  498. + else if (nodeName.equals("itemAmmount"))
  499. + conditions.add(new ItemsCount(value));
  500. +
  501. + else if (nodeName.equals("crpAmmount"))
  502. + conditions.add(new Crp(value));
  503. +
  504. + else if (nodeName.equals("lordOfCastle"))
  505. + conditions.add(new Castle(value));
  506. +
  507. + else if (nodeName.equals("mustBeMageClass"))
  508. + conditions.add(new Mageclass(value));
  509. +
  510. + else if (nodeName.equals("mustBeVip"))
  511. + conditions.add(new Noble(value));
  512. +
  513. + else if (nodeName.equals("raidToKill"))
  514. + conditions.add(new RaidKill(value));
  515. +
  516. + else if (nodeName.equals("CompleteAchievements"))
  517. + conditions.add(new CompleteAchievements(value));
  518. +
  519. + else if (nodeName.equals("minSubclassCount"))
  520. + conditions.add(new Sub(value));
  521. +
  522. + else if (nodeName.equals("minSkillEnchant"))
  523. + conditions.add(new SkillEnchant(value));
  524. +
  525. + else if (nodeName.equals("minOnlineTime"))
  526. + conditions.add(new OnlineTime(value));
  527. +
  528. + else if (nodeName.equals("Cursedweapon"))
  529. + conditions.add(new CursedWeapon(value));
  530. +
  531. + else if (nodeName.equals("minHeadEnchant"))
  532. + conditions.add(new Head(value));
  533. +
  534. + else if (nodeName.equals("minChestEnchant"))
  535. + conditions.add(new Chest(value));
  536. +
  537. + else if (nodeName.equals("minFeetEnchant"))
  538. + conditions.add(new Feet(value));
  539. +
  540. + else if (nodeName.equals("minLegsEnchant"))
  541. + conditions.add(new Legs(value));
  542. +
  543. + else if (nodeName.equals("minGlovestEnchant"))
  544. + conditions.add(new Gloves(value));
  545. +
  546. +
  547. + }
  548. + }
  549. +
  550. + /**
  551. + * @authorDesenvolvedor desse mod Matim && Wallister L2JSanne
  552. + * @version v1
  553. + *
  554. + */
  555.  
  556. \ No newline at end of file
  557. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Castle.java
  558. ===================================================================
  559. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Castle.java (revision 0)
  560. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Castle.java (working copy)
  561. @@@@@@@@@@@@@@@@
  562. + package net.sf.l2j.achievementEngine;
  563. +
  564. + import net.sf.l2j.achievementEngine.Condition;
  565. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  566. +
  567. +
  568. +public class Castle extends Condition
  569. +{
  570. + public Castle(Object value)
  571. + {
  572. + super(value);
  573. + setName("Have Castle");
  574. + }
  575. +
  576. + @Override
  577. + public boolean meetConditionRequirements(L2PcInstance player)
  578. + {
  579. + if (getValue() == null) {
  580. + return false;
  581. + }
  582. + if (player.getClan() != null)
  583. + {
  584. + if ((player.isCastleLord(5)) || (player.isCastleLord(3)) || (player.isCastleLord(7)))
  585. + return true;
  586. + }
  587. + return false;
  588. + }
  589. +}
  590.  
  591. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Sub.java
  592. ===================================================================
  593. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Sub.java (revision 0)
  594. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Sub.java (working copy)
  595. @@@@@@@@@@@@@@@
  596. + package net.sf.l2j.achievementEngine;
  597. +
  598. +import java.util.Map;
  599. +
  600. +import net.sf.l2j.achievementEngine.Condition;
  601. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  602. +
  603. +@SuppressWarnings("unused")
  604. +public class Sub extends Condition
  605. +{
  606. + public Sub(Object value)
  607. + {
  608. + super(value);
  609. + setName("Subclass Count");
  610. + }
  611. +
  612. + @Override
  613. +public boolean meetConditionRequirements(L2PcInstance player)
  614. + {
  615. + if (getValue() == null) {
  616. + return false;
  617. + }
  618. + int val = Integer.parseInt(getValue().toString());
  619. +
  620. + return player.getSubClasses().size() >= val;
  621. + }
  622. +}
  623.  
  624. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLeader.java
  625. ===================================================================
  626. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLeader.java (revision 0)
  627. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLeader.java (working copy)
  628. @@@@@@@@@@@@@@@@@@
  629. + package net.sf.l2j.achievementEngine;
  630. +
  631. +import net.sf.l2j.achievementEngine.Condition;
  632. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  633. +
  634. +
  635. + public class ClanLeader extends Condition
  636. + {
  637. + public ClanLeader(Object value)
  638. + {
  639. + super(value);
  640. + setName("Be Clan Leader");
  641. + }
  642. +
  643. + @Override
  644. + public boolean meetConditionRequirements(L2PcInstance player)
  645. + {
  646. + if (getValue() == null) {
  647. + return false;
  648. + }
  649. +
  650. + return (player.getClan() != null) &&
  651. + (player.isClanLeader());
  652. + }
  653. + }
  654.  
  655. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Adena.java
  656. ===================================================================
  657. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Adena.java (revision 0)
  658. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Adena.java (working copy)
  659. @@@@@@@@@@@@@@@@
  660. + package net.sf.l2j.achievementEngine;
  661. +
  662. + import net.sf.l2j.achievementEngine.Condition;
  663. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  664. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  665. +
  666. + @SuppressWarnings("unused")
  667. + public class Adena extends Condition
  668. + {
  669. + public Adena(Object value)
  670. + {
  671. + super(value);
  672. + setName("Adena");
  673. + }
  674. +
  675. + @Override
  676. + public boolean meetConditionRequirements(L2PcInstance player)
  677. + {
  678. + if (getValue() == null)
  679. + {
  680. + return false;
  681. + }
  682. + long val = Integer.parseInt(getValue().toString());
  683. +
  684. + if (player.getInventory().getAdena() >= val)
  685. + return true;
  686. + return false;
  687. + }
  688. + }
  689.  
  690. \ No newline at end of file
  691. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Crp.java
  692. ===================================================================
  693. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Crp.java (revision 0)
  694. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Crp.java (working copy)
  695. @@@@@@@@@@@@@@@@
  696. + package net.sf.l2j.achievementEngine;
  697. +
  698. +import net.sf.l2j.achievementEngine.Condition;
  699. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  700. +
  701. +public class Crp extends Condition
  702. +{
  703. + public Crp(Object value)
  704. + {
  705. + super(value);
  706. + setName("Clan Reputation");
  707. + }
  708. +
  709. + @Override
  710. +public boolean meetConditionRequirements(L2PcInstance player)
  711. + {
  712. + if (getValue() == null) {
  713. + return false;
  714. + }
  715. + if (player.getClan() != null)
  716. + {
  717. + int val = Integer.parseInt(getValue().toString());
  718. +
  719. + if (player.getClan().getReputationScore() >= val)
  720. + return true;
  721. + }
  722. + return false;
  723. + }
  724. +}
  725.  
  726. \ No newline at end of file
  727. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Level.java
  728. ===================================================================
  729. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Level.java (revision 0)
  730. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Level.java (working copy)
  731. @@@@@@@@@@@@@@@@
  732. + /*
  733. + * This program is free software: you can redistribute it and/or modify it under
  734. + * the terms of the GNU General Public License as published by the Free Software
  735. + * Foundation, either version 3 of the License, or (at your option) any later
  736. + * version.
  737. + *
  738. + * This program is distributed in the hope that it will be useful, but WITHOUT
  739. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  740. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  741. + * details.
  742. + *
  743. + * You should have received a copy of the GNU General Public License along with
  744. + * this program. If not, see <http://www.gnu.org/licenses/>.
  745. + */
  746. + package net.sf.l2j.achievementEngine;
  747. +
  748. + import net.sf.l2j.achievementEngine.Condition;
  749. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  750. +
  751. + public class Level extends Condition
  752. + {
  753. + public Level(Object value)
  754. + {
  755. + super(value);
  756. + setName("Level");
  757. + }
  758. +
  759. + @Override
  760. + public boolean meetConditionRequirements(L2PcInstance player)
  761. + {
  762. + if (getValue() == null) {
  763. + return false;
  764. + }
  765. +
  766. + int val = Integer.parseInt(getValue().toString());
  767. +
  768. + return player.getLevel() >= val;
  769. + }
  770. + }
  771.  
  772. \ No newline at end of file
  773. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/RaidKill.java
  774. ===================================================================
  775. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/RaidKill.java (revision 0)
  776. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/RaidKill.java (working copy)
  777. @@@@@@@@@@@@@@
  778. + package net.sf.l2j.achievementEngine;
  779. +
  780. +import java.util.Iterator;
  781. +import java.util.Map;
  782. +
  783. +import net.sf.l2j.achievementEngine.Condition;
  784. +import net.sf.l2j.gameserver.instancemanager.RaidBossPointsManager;
  785. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  786. +
  787. +public class RaidKill extends Condition
  788. +{
  789. + public RaidKill(Object value)
  790. + {
  791. + super(value);
  792. + setName("Raid Kill");
  793. + }
  794. +
  795. + @SuppressWarnings({
  796. + "rawtypes",
  797. + "static-access", "cast"
  798. + })
  799. + @Override
  800. + public boolean meetConditionRequirements(L2PcInstance player)
  801. + {
  802. + if (getValue() == null) {
  803. + return false;
  804. + }
  805. + int val = Integer.parseInt(getValue().toString());
  806. + Map list = RaidBossPointsManager.getInstance().getList(player);
  807. + Iterator i$;
  808. + if (list != null)
  809. + {
  810. + for (i$ = list.keySet().iterator(); i$.hasNext(); ) { int bid = ((Integer)i$.next()).intValue();
  811. +
  812. + if (bid == val)
  813. + {
  814. + if (((Integer)RaidBossPointsManager.getInstance().getList(player).get(Integer.valueOf(bid))).intValue() > 0)
  815. + return true;
  816. + }
  817. + }
  818. + }
  819. + return false;
  820. + }
  821. +}
  822.  
  823. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/CompleteAchievements.java
  824. ===================================================================
  825. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/CompleteAchievements.java (revision 0)
  826. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/CompleteAchievements.java (working copy)
  827. @@@@@@@@@@@@@
  828. + package net.sf.l2j.achievementEngine;
  829. +
  830. +import java.util.List;
  831. +
  832. +import net.sf.l2j.achievementEngine.Condition;
  833. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  834. +
  835. +@SuppressWarnings("unused")
  836. +public class CompleteAchievements extends Condition
  837. +{
  838. + public CompleteAchievements(Object value)
  839. + {
  840. + super(value);
  841. + setName("Complete Achievements");
  842. + }
  843. +
  844. + @Override
  845. +public boolean meetConditionRequirements(L2PcInstance player)
  846. + {
  847. + if (getValue() == null) {
  848. + return false;
  849. + }
  850. + int val = Integer.parseInt(getValue().toString());
  851. +
  852. + return player.getCompletedAchievements().size() >= val;
  853. + }
  854. +}
  855.  
  856. Index: aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2achievementsInstance.java
  857. ===================================================================
  858. --- aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2achievementsInstance.java (revision 0)
  859. +++ aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2achievementsInstance.java (working copy)
  860. @@@@@@@@@@@@@@@@@@@@@2
  861. + package net.sf.l2j.gameserver.model.actor.instance;
  862. +
  863. + import java.util.StringTokenizer;
  864. +
  865. +
  866. +
  867. + import net.sf.l2j.util.StringUtil;
  868. +
  869. +import net.sf.l2j.achievementEngine.Achievement;
  870. +import net.sf.l2j.achievementEngine.AchievementsManager;
  871. +import net.sf.l2j.achievementEngine.Condition;
  872. +import net.sf.l2j.gameserver.model.L2World;
  873. +import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
  874. +import net.sf.l2j.gameserver.model.Announcement;
  875. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  876. +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  877. +import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;;
  878. +
  879. + /**
  880. + * @author Matim
  881. + * @version 1.0
  882. + */
  883. + @SuppressWarnings("unused")
  884. + public class L2achievementsInstance extends L2NpcInstance
  885. + {
  886. + public L2achievementsInstance(int objectId, NpcTemplate template)
  887. + {
  888. + super(objectId, template);
  889. + }
  890. +
  891. + @Override
  892. + public void onBypassFeedback(L2PcInstance player, String command)
  893. + {
  894. + if (player == null || player.getCurrentFolkNPC() == null || player.getCurrentFolkNPC().getObjectId() != this.getObjectId())
  895. + {
  896. + return;
  897. + }
  898. + if (command.startsWith("showMyAchievements"))
  899. + {
  900. + player.getAchievemntData();
  901. + showMyAchievements(player);
  902. + }
  903. + else if (command.startsWith("achievementInfo"))
  904. + {
  905. + StringTokenizer st = new StringTokenizer(command, " ");
  906. + st.nextToken();
  907. + int id = Integer.parseInt(st.nextToken());
  908. +
  909. + showAchievementInfo(id, player);
  910. + }
  911. + else if (command.startsWith("topList"))
  912. + {
  913. + showTopListWindow(player);
  914. + }
  915. + else if (command.startsWith("showMainWindow"))
  916. + {
  917. + showChatWindow(player, 0);
  918. + }
  919. + else if (command.startsWith("getReward"))
  920. + {
  921. + StringTokenizer st = new StringTokenizer(command, " ");
  922. + st.nextToken();
  923. + int id = Integer.parseInt(st.nextToken());
  924. + AchievementsManager.getInstance().rewardForAchievement(id, player);
  925. + player.saveAchievementData(id);
  926. + showMyAchievements(player);
  927. +
  928. + }
  929. + else if (command.startsWith ("showMyStats"))
  930. + {
  931. + showMyStatsWindow(player);
  932. + }
  933. + else if (command.startsWith("showHelpWindow"))
  934. + {
  935. + showHelpWindow(player);
  936. + }
  937. + }
  938. +
  939. + @Override
  940. + public void showChatWindow(L2PcInstance player, int val)
  941. + {
  942. + StringBuilder tb = new StringBuilder();
  943. + tb.append("<html><title>Achievements Manager</title><body><center><br>");
  944. + tb.append("<img src=\"l2font-e.replay_logo-e\" width=250 height=80><br1><center><img src=\"L2UI.SquareGray\" width=300 height=1></center><table bgcolor=000000 width=319><tr><td><center><font color=\"LEVEL\">Hello <font color=\"LEVEL\">" + player.getName() + "</font></center></td></font></tr></table><center><img src=\"L2UI.SquareGray\" width=300 height=1></center>");
  945. + tb.append("<br><font color=\"LEVEL\">Are you looking for challenge?</font>");
  946. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  947. + tb.append("<button value=\"My Achievements\" action=\"bypass -h npc_%objectId%_showMyAchievements\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\">");
  948. + tb.append("<button value=\"Statistics\" action=\"bypass -h npc_%objectId%_showMyStats\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\">");
  949. + tb.append("<button value=\"Help\" action=\"bypass -h npc_%objectId%_showHelpWindow\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\">");
  950. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  951. + tb.append("<center><br><img src=l2ui.bbs_lineage2 height=16 width=80></center>");
  952. +
  953. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  954. + msg.setHtml(tb.toString());
  955. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  956. +
  957. + player.sendPacket(msg);
  958. + }
  959. +
  960. + private void showMyAchievements(L2PcInstance player)
  961. + {
  962. + StringBuilder tb = new StringBuilder();
  963. + tb.append("<html><title>Achievements Manager</title><body><br>");
  964. +
  965. + tb.append("<center><font color=\"LEVEL\">My achievements</font>:</center><br>");
  966. +
  967. + if (AchievementsManager.getInstance().getAchievementList().isEmpty())
  968. + {
  969. + tb.append("There are no Achievements created yet!");
  970. + }
  971. + else
  972. + {
  973. + int i = 0;
  974. +
  975. + tb.append("<table width=270 border=0 bgcolor=\"33FF33\">");
  976. + tb.append("<tr><td width=270 align=\"left\">Name:</td><td width=60 align=\"right\">Info:</td><td width=200 align=\"center\">Status:</td></tr></table>");
  977. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  978. +
  979. + for (Achievement a: AchievementsManager.getInstance().getAchievementList().values())
  980. + {
  981. + tb.append(getTableColor(i));
  982. + tb.append("<tr><td width=270 align=\"left\">" + a.getName() + "</td><td width=50 align=\"right\"><a action=\"bypass -h npc_%objectId%_achievementInfo "
  983. + + a.getID() + "\">info</a></td><td width=200 align=\"center\">" + getStatusString(a.getID(), player) + "</td></tr></table>");
  984. + i++;
  985. + }
  986. +
  987. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  988. + tb.append("<center><button value=\"Back\" action=\"bypass -h npc_%objectId%_showMainWindow\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\"><center>");
  989. + }
  990. +
  991. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  992. + msg.setHtml(tb.toString());
  993. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  994. +
  995. + player.sendPacket(msg);
  996. + }
  997. +
  998. + private void showAchievementInfo(int achievementID, L2PcInstance player)
  999. + {
  1000. + Achievement a = AchievementsManager.getInstance().getAchievementList().get(achievementID);
  1001. +
  1002. + StringBuilder tb = new StringBuilder();
  1003. + tb.append("<html><title>Achievements Manager</title><body><br>");
  1004. +
  1005. + tb.append("<table width=270 border=0 bgcolor=\"33FF33\">");
  1006. + tb.append("<tr><td width=270 align=\"center\">" + a.getName() + "</td></tr></table><br>");
  1007. + tb.append("<center>Status: " + getStatusString(achievementID, player));
  1008. +
  1009. + if (a.meetAchievementRequirements(player) && !player.getCompletedAchievements().contains(achievementID))
  1010. + {
  1011. + tb.append("<button value=\"Receive Reward!\" action=\"bypass -h npc_%objectId%_getReward " + a.getID() + "\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\">");
  1012. + }
  1013. +
  1014. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1015. +
  1016. + tb.append("<table width=270 border=0 bgcolor=\"33FF33\">");
  1017. + tb.append("<tr><td width=270 align=\"center\">Description</td></tr></table><br>");
  1018. + tb.append(a.getDescription());
  1019. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1020. +
  1021. + tb.append("<table width=270 border=0 bgcolor=\"33FF33\">");
  1022. + tb.append("<tr><td width=270 align=\"left\">Condition:</td><td width=100 align=\"right\">Value:</td><td width=200 align=\"center\">Status:</td></tr></table>");
  1023. + tb.append(getConditionsStatus(achievementID, player));
  1024. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1025. + tb.append("<center><button value=\"Back\" action=\"bypass -h npc_%objectId%_showMyAchievements\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\"><center>");
  1026. +
  1027. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  1028. + msg.setHtml(tb.toString());
  1029. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  1030. +
  1031. + player.sendPacket(msg);
  1032. + }
  1033. +
  1034. + private void showMyStatsWindow(L2PcInstance player)
  1035. + {
  1036. + StringBuilder tb = new StringBuilder();
  1037. + tb.append("<html><title>Achievements Manager</title><body><center><br>");
  1038. + tb.append("Check your <font color=\"LEVEL\">Achievements </font>statistics:");
  1039. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  1040. +
  1041. + player.getAchievemntData();
  1042. + int completedCount = player.getCompletedAchievements().size();
  1043. +
  1044. + tb.append("You have completed: " + completedCount + "/<font color=\"LEVEL\">" + AchievementsManager.getInstance().getAchievementList().size() + "</font>");
  1045. +
  1046. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1047. + tb.append("<center><button value=\"Back\" action=\"bypass -h npc_%objectId%_showMainWindow\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\"><center>");
  1048. +
  1049. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  1050. + msg.setHtml(tb.toString());
  1051. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  1052. +
  1053. + player.sendPacket(msg);
  1054. + }
  1055. +
  1056. + private void showTopListWindow(L2PcInstance player )
  1057. + {
  1058. + StringBuilder tb = new StringBuilder();
  1059. + tb.append("<html><title>Achievements Manager</title><body><center><br>");
  1060. + tb.append("Check your <font color=\"LEVEL\">Achievements </font>Top List:");
  1061. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  1062. +
  1063. + tb.append("List Player " + player.getCompletedAchievements() + " ");
  1064. +
  1065. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1066. + tb.append("<center><button value=\"Back\" action=\"bypass -h npc_%objectId%_showMainWindow\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\"><center>");
  1067. +
  1068. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  1069. + msg.setHtml(tb.toString());
  1070. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  1071. +
  1072. + player.sendPacket(msg);
  1073. + }
  1074. +
  1075. + private void showHelpWindow(L2PcInstance player)
  1076. + {
  1077. + StringBuilder tb = new StringBuilder();
  1078. + tb.append("<html><title>Achievements Manager</title><body><center><br>");
  1079. + tb.append("Achievements <font color=\"LEVEL\">Help </font>page:");
  1080. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1\"><br>");
  1081. +
  1082. + tb.append("<center>You can check status of your achievements, receive reward if every condition of achievement is meet, if not you can check which condition is still not meet, by using info button");
  1083. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1084. + tb.append("<font color=\"FF0000\">Not Completed</font> - you did not meet the achivement requirements.<br>");
  1085. + tb.append("<font color=\"LEVEL\">Get Reward</font> - you may receive reward, click info.<br>");
  1086. + tb.append("<font color=\"5EA82E\">Completed</font> - achievement completed, reward received.<br></center>");
  1087. +
  1088. + tb.append("Achievements Engine by <font color=\"LEVEL\">L2JSanne</font>");
  1089. + tb.append("<br><img src=\"l2ui.squaregray\" width=\"270\" height=\"1s\"><br>");
  1090. + tb.append("<center><button value=\"Back\" action=\"bypass -h npc_%objectId%_showMainWindow\" width=134 height=21 back=\"L2UI_ch3.BigButton3_over\" fore=\"L2UI_ch3.BigButton3\"><center>");
  1091. +
  1092. + NpcHtmlMessage msg = new NpcHtmlMessage(this.getObjectId());
  1093. + msg.setHtml(tb.toString());
  1094. + msg.replace("%objectId%", String.valueOf(this.getObjectId()));
  1095. +
  1096. + player.sendPacket(msg);
  1097. + }
  1098. +
  1099. + private String getStatusString(int achievementID, L2PcInstance player)
  1100. + {
  1101. + if (player.getCompletedAchievements().contains(achievementID))
  1102. + {
  1103. + return "<font color=\"5EA82E\">Completed</font>";
  1104. + }
  1105. + if (AchievementsManager.getInstance().getAchievementList().get(achievementID).meetAchievementRequirements(player))
  1106. + {
  1107. + return "<font color=\"LEVEL\">Get Reward</font>";
  1108. + }
  1109. + return "<font color=\"FF0000\">Not Completed</font>";
  1110. + }
  1111. +
  1112. + private String getTableColor(int i)
  1113. + {
  1114. + if (i % 2 == 0)
  1115. + return "<table width=270 border=0 bgcolor=\"444444\">";
  1116. + return "<table width=270 border=0>";
  1117. + }
  1118. +
  1119. + private String getConditionsStatus(int achievementID, L2PcInstance player)
  1120. + {
  1121. + int i = 0;
  1122. + String s = "</center>";
  1123. + Achievement a = AchievementsManager.getInstance().getAchievementList().get(achievementID);
  1124. + String completed = "<font color=\"5EA82E\">Completed</font></td></tr></table>";
  1125. + String notcompleted = "<font color=\"FF0000\">Not Completed</font></td></tr></table>";
  1126. +
  1127. + for (Condition c: a.getConditions())
  1128. + {
  1129. + s+= getTableColor(i);
  1130. + s+= "<tr><td width=270 align=\"left\">" + c.getName() + "</td><td width=50 align=\"right\">" + c.getValue() + "</td><td width=200 align=\"center\">";
  1131. + i++;
  1132. +
  1133. + if (c.meetConditionRequirements(player))
  1134. + s+= completed;
  1135. + else
  1136. + s+= notcompleted;
  1137. + }
  1138. + return s;
  1139. + }
  1140. + }
  1141.  
  1142. \ No newline at end of file
  1143. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/SkillEnchant.java
  1144. ===================================================================
  1145. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/SkillEnchant.java (revision 0)
  1146. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/SkillEnchant.java (working copy)
  1147. @@@@@@@@@@@@@@@@@
  1148. + package net.sf.l2j.achievementEngine;
  1149. +
  1150. +import net.sf.l2j.achievementEngine.Condition;
  1151. +import net.sf.l2j.gameserver.model.L2Skill;
  1152. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1153. +
  1154. +public class SkillEnchant extends Condition
  1155. +{
  1156. + public SkillEnchant(Object value)
  1157. + {
  1158. + super(value);
  1159. + setName("Skill Enchant");
  1160. + }
  1161. +
  1162. + @Override
  1163. +public boolean meetConditionRequirements(L2PcInstance player)
  1164. + {
  1165. + if (getValue() == null) {
  1166. + return false;
  1167. + }
  1168. + int val = Integer.parseInt(getValue().toString());
  1169. +
  1170. + for (L2Skill s : player.getAllSkills())
  1171. + {
  1172. + String lvl = String.valueOf(s.getLevel());
  1173. + if (lvl.length() <= 2)
  1174. + continue;
  1175. + int sklvl = Integer.parseInt(lvl.substring(1));
  1176. + if (sklvl >= val) {
  1177. + return true;
  1178. + }
  1179. + }
  1180. +
  1181. + return false;
  1182. + }
  1183. +}
  1184.  
  1185. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Gloves.java
  1186. ===================================================================
  1187. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Gloves.java (revision 0)
  1188. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Gloves.java (working copy)
  1189. @@@@@@@@@@@@@@@@
  1190. + package net.sf.l2j.achievementEngine.EnchantAmor;
  1191. +
  1192. + import net.sf.l2j.achievementEngine.Condition;
  1193. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  1194. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1195. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;;
  1196. +
  1197. + /**
  1198. + * @author Matim,Wallister
  1199. + * @version v1
  1200. + */
  1201. + public class Gloves extends Condition
  1202. + {
  1203. + public Gloves(Object value)
  1204. + {
  1205. + super(value);
  1206. + setName("Gloves");
  1207. + }
  1208. +
  1209. + @Override
  1210. + public boolean meetConditionRequirements(L2PcInstance player)
  1211. + {
  1212. + if (getValue() == null)
  1213. + {
  1214. + return false;
  1215. + }
  1216. +
  1217. + int val = Integer.parseInt(getValue().toString());
  1218. +
  1219. + ItemInstance armor = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES);
  1220. +
  1221. + if (armor != null)
  1222. + {
  1223. + if (armor.getEnchantLevel() >= val)
  1224. + {
  1225. + return true;
  1226. + }
  1227. + }
  1228. + return false;
  1229. + }
  1230. + }
  1231.  
  1232. \ No newline at end of file
  1233. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxmp.java
  1234. ===================================================================
  1235. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxmp.java (revision 0)
  1236. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxmp.java (working copy)
  1237. @@@@@@@@@@@@@@@@
  1238. +package net.sf.l2j.achievementEngine;
  1239. +
  1240. +import net.sf.l2j.achievementEngine.Condition;
  1241. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1242. +
  1243. +public class Maxmp extends Condition
  1244. +{
  1245. + public Maxmp(Object value)
  1246. + {
  1247. + super(value);
  1248. + setName("Max MP");
  1249. + }
  1250. +
  1251. + @Override
  1252. +public boolean meetConditionRequirements(L2PcInstance player)
  1253. + {
  1254. + if (getValue() == null) {
  1255. + return false;
  1256. + }
  1257. + int val = Integer.parseInt(getValue().toString());
  1258. +
  1259. + return player.getMaxMp() >= val;
  1260. + }
  1261. +}
  1262.  
  1263. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Vip.java
  1264. ===================================================================
  1265. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Vip.java (revision 0)
  1266. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Vip.java (working copy)
  1267. @@@@@@@@@@@@@@@
  1268. + package net.sf.l2j.achievementEngine;
  1269. +
  1270. +import net.sf.l2j.achievementEngine.Condition;
  1271. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1272. +
  1273. +public class Vip extends Condition
  1274. +{
  1275. + public Vip(Object value)
  1276. + {
  1277. + super(value);
  1278. + setName("Vip");
  1279. + }
  1280. +
  1281. + @Override
  1282. +public boolean meetConditionRequirements(L2PcInstance player)
  1283. + {
  1284. + if (getValue() == null) {
  1285. + return false;
  1286. + }
  1287. +
  1288. + return player.isVip();
  1289. + }
  1290. +}
  1291.  
  1292. Index: head-src/com/l2jsanne/AchievementEngine/Maxhp.java
  1293. ===================================================================
  1294. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxhp.java (revision 0)
  1295. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxhp.java (working copy)
  1296. @@@@@@@@@@@@@@
  1297. +package net.sf.l2j.achievementEngine;
  1298. +
  1299. +import net.sf.l2j.achievementEngine.Condition;
  1300. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1301. +
  1302. +public class Maxhp extends Condition
  1303. +{
  1304. + public Maxhp(Object value)
  1305. + {
  1306. + super(value);
  1307. + setName("Max HP");
  1308. + }
  1309. +
  1310. + @Override
  1311. +public boolean meetConditionRequirements(L2PcInstance player)
  1312. + {
  1313. + if (getValue() == null) {
  1314. + return false;
  1315. + }
  1316. + int val = Integer.parseInt(getValue().toString());
  1317. +
  1318. + return player.getMaxHp() >= val;
  1319. + }
  1320. +}
  1321.  
  1322. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/MinCMcount.java
  1323. ===================================================================
  1324. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/MinCMcount.java (revision 0)
  1325. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/MinCMcount.java (working copy)
  1326. @@@@@@@@@@@@@
  1327. + package net.sf.l2j.achievementEngine;
  1328. +
  1329. +import net.sf.l2j.achievementEngine.Condition;
  1330. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1331. +
  1332. + public class MinCMcount extends Condition
  1333. + {
  1334. + public MinCMcount(Object value)
  1335. + {
  1336. + super(value);
  1337. + setName("Clan Members Count");
  1338. + }
  1339. +
  1340. + @Override
  1341. + public boolean meetConditionRequirements(L2PcInstance player)
  1342. + {
  1343. + if (getValue() == null) {
  1344. + return false;
  1345. + }
  1346. + if (player.getClan() != null)
  1347. + {
  1348. + int val = Integer.parseInt(getValue().toString());
  1349. +
  1350. + if (player.getClan().getMembersCount() >= val)
  1351. + return true;
  1352. + }
  1353. + return false;
  1354. + }
  1355. + }
  1356.  
  1357. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Legs.java
  1358. ===================================================================
  1359. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Legs.java (revision 0)
  1360. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Legs.java (working copy)
  1361. @@@@@@@@@@@@
  1362. + package net.sf.l2j.achievementEngine.EnchantAmor;
  1363. +
  1364. + import net.sf.l2j.achievementEngine.Condition;
  1365. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  1366. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1367. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  1368. +
  1369. + /**
  1370. + * @author Matim,Wallister
  1371. + * @version v1
  1372. + */
  1373. + public class Legs extends Condition
  1374. + {
  1375. + public Legs(Object value)
  1376. + {
  1377. + super(value);
  1378. + setName("Legs");
  1379. + }
  1380. +
  1381. + @Override
  1382. + public boolean meetConditionRequirements(L2PcInstance player)
  1383. + {
  1384. + if (getValue() == null)
  1385. + {
  1386. + return false;
  1387. + }
  1388. +
  1389. + int val = Integer.parseInt(getValue().toString());
  1390. +
  1391. + ItemInstance armor = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS);
  1392. +
  1393. + if (armor != null)
  1394. + {
  1395. + if (armor.getEnchantLevel() >= val)
  1396. + {
  1397. + return true;
  1398. + }
  1399. + }
  1400. + return false;
  1401. + }
  1402. + }
  1403.  
  1404. \ No newline at end of file
  1405. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/CursedWeapon.java
  1406. ===================================================================
  1407. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/CursedWeapon.java (revision 0)
  1408. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/CursedWeapon.java (working copy)
  1409. @@@@@@@@@@@@@@
  1410. + package net.sf.l2j.achievementEngine;
  1411. +
  1412. +import net.sf.l2j.achievementEngine.Condition;
  1413. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1414. +
  1415. +public class CursedWeapon extends Condition
  1416. +{
  1417. + public CursedWeapon(Object value)
  1418. + {
  1419. + super(value);
  1420. + setName("Cursed Weapon");
  1421. + }
  1422. +
  1423. + @Override
  1424. +public boolean meetConditionRequirements(L2PcInstance player)
  1425. + {
  1426. + if (getValue() == null) {
  1427. + return false;
  1428. + }
  1429. +
  1430. + return player.isCursedWeaponEquipped();
  1431. + }
  1432. +}
  1433.  
  1434. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLevel.java
  1435. ===================================================================
  1436. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLevel.java (revision 0)
  1437. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/ClanLevel.java (working copy)
  1438. @@@@@@@@@@@@@@
  1439. + package net.sf.l2j.achievementEngine;
  1440. +
  1441. +import net.sf.l2j.achievementEngine.Condition;
  1442. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1443. +
  1444. +public class ClanLevel extends Condition
  1445. +{
  1446. + public ClanLevel(Object value)
  1447. + {
  1448. + super(value);
  1449. + setName("Clan Level");
  1450. + }
  1451. +
  1452. + @Override
  1453. + public boolean meetConditionRequirements(L2PcInstance player)
  1454. + {
  1455. + if (getValue() == null) {
  1456. + return false;
  1457. + }
  1458. + if (player.getClan() != null)
  1459. + {
  1460. + int val = Integer.parseInt(getValue().toString());
  1461. +
  1462. + if (player.getClan().getLevel() >= val)
  1463. + return true;
  1464. + }
  1465. + return false;
  1466. + }
  1467. +}
  1468.  
  1469. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/WeaponEnchant.java
  1470. ===================================================================
  1471. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/WeaponEnchant.java (revision 0)
  1472. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/WeaponEnchant.java (working copy)
  1473. @@@@@@@@@@@@@@@@
  1474. + package net.sf.l2j.achievementEngine;
  1475. +
  1476. + import net.sf.l2j.achievementEngine.Condition;
  1477. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  1478. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1479. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  1480. +
  1481. + /**
  1482. + * @author Matim,Wallister
  1483. + * @version v1
  1484. + */
  1485. + public class WeaponEnchant extends Condition
  1486. + {
  1487. + public WeaponEnchant(Object value)
  1488. + {
  1489. + super(value);
  1490. + setName("Weapon Enchant");
  1491. + }
  1492. +
  1493. + @Override
  1494. + public boolean meetConditionRequirements(L2PcInstance player)
  1495. + {
  1496. + if (getValue() == null)
  1497. + {
  1498. + return false;
  1499. + }
  1500. +
  1501. + int val = Integer.parseInt(getValue().toString());
  1502. +
  1503. + ItemInstance weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
  1504. +
  1505. + if (weapon != null)
  1506. + {
  1507. + if (weapon.getEnchantLevel() >= val)
  1508. + {
  1509. + return true;
  1510. + }
  1511. + }
  1512. + return false;
  1513. + }
  1514. + }
  1515.  
  1516. \ No newline at end of file
  1517. Index: aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2PcInstance.java
  1518. ===================================================================
  1519. --- aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2PcInstance.java (revision 42)
  1520. +++ aCis_gameserver/java/net.sf.l2j.gameserver.model.actor.instance/L2PcInstance.java (working copy)
  1521. @@@@@@@@@@@@@
  1522. import java.sql.Connection;
  1523. import java.sql.PreparedStatement;
  1524. import java.sql.ResultSet;
  1525. import java.sql.SQLException;
  1526. + import java.sql.Statement;
  1527. import java.util.ArrayList;
  1528.  
  1529.  
  1530. import net.sf.l2j.Config;
  1531. + import net.sf.l2j.achievementEngine.AchievementsManager;
  1532. import net.sf.l2j.L2DatabaseFactory;
  1533. @@@@@@@@@@@@@@@@
  1534.  
  1535. private final SummonRequest _summonRequest = new SummonRequest();
  1536. +private List<Integer> _completedAchievements = new ArrayList<>();
  1537. +
  1538. + public boolean readyAchievementsList()
  1539. + {
  1540. + if (_completedAchievements.isEmpty())
  1541. + return false;
  1542. + return true;
  1543. + }
  1544. +
  1545. + public void saveAchievemntData()
  1546. + {
  1547. +
  1548. + }
  1549. +
  1550. + public void getAchievemntData()
  1551. + {
  1552. + Connection con = null;
  1553. + try
  1554. + {
  1555. + PreparedStatement statement;
  1556. + PreparedStatement insertStatement;
  1557. + ResultSet rs;
  1558. + con = L2DatabaseFactory.getInstance().getConnection();
  1559. +
  1560. + statement = con.prepareStatement("SELECT * from achievements WHERE owner_id=" + getObjectId());
  1561. +
  1562. + rs = statement.executeQuery();
  1563. +
  1564. + String values = "owner_id";
  1565. + String in = Integer.toString(getObjectId());
  1566. + String questionMarks = in;
  1567. + int ilosc = AchievementsManager.getInstance().getAchievementList().size();
  1568. +
  1569. + if (rs.next())
  1570. + {
  1571. + _completedAchievements.clear();
  1572. + for (int i=1; i <=ilosc; i++)
  1573. + {
  1574. + int a = rs.getInt("a" + i);
  1575. +
  1576. + if (!_completedAchievements.contains(i))
  1577. + if (a == 1)
  1578. + _completedAchievements.add(i);
  1579. + }
  1580. + }
  1581. + else
  1582. + {
  1583. + //Player hasnt entry in database, means we have to create it.
  1584. +
  1585. + for (int i=1; i <=ilosc; i++)
  1586. + {
  1587. + values += ", a" + i;
  1588. + questionMarks += ", 0";
  1589. + }
  1590. +
  1591. + String s = "INSERT INTO achievements(" + values + ") VALUES (" + questionMarks + ")";
  1592. + insertStatement = con.prepareStatement(s);
  1593. +
  1594. + insertStatement.execute();
  1595. + insertStatement.close();
  1596. + }
  1597. + }
  1598. + catch (Exception e)
  1599. + {
  1600. + _log.warning("[ACHIEVEMENTS ENGINE GETDATA]" + e);
  1601. + }
  1602. + }
  1603. +
  1604. + public void saveAchievementData(int achievementID)
  1605. + {
  1606. + Connection con = null;
  1607. + try
  1608. + {
  1609. + con = L2DatabaseFactory.getInstance().getConnection();
  1610. + Statement statement = con.createStatement();
  1611. + statement.executeUpdate("UPDATE achievements SET a" + achievementID + "=1 WHERE owner_id=" + getObjectId());
  1612. + statement.close();
  1613. +
  1614. + if (!_completedAchievements.contains(achievementID))
  1615. + _completedAchievements.add(achievementID);
  1616. + }
  1617. + catch (SQLException e)
  1618. + {
  1619. + _log.warning("[ACHIEVEMENTS SAVE GETDATA]" + e);
  1620. + }
  1621. +
  1622. + }
  1623. +
  1624. + public List<Integer> getCompletedAchievements()
  1625. + {
  1626. + return _completedAchievements;
  1627. + }
  1628.  
  1629. private final GatesRequest _gatesRequest = new GatesRequest();
  1630. @@@@@@@@@@@@@@@@@@@@@@
  1631.  
  1632.  
  1633. @@@@@@@@@@@@@@@@@@@@
  1634. /**
  1635. * Adds item to Inventory and send InventoryUpdate packet to the L2PcInstance.
  1636. * @param process String Identifier of process triggering this action
  1637. * @param itemId int Item Identifier of the item to be added
  1638. * @param count int Quantity of items to be added
  1639. * @param reference L2Object Object referencing current action like NPC selling item or previous item in transformation
  1640. * @param sendMessage boolean Specifies whether to send message to Client about this action
  1641. * @return The created ItemInstance.
  1642. */
  1643.  
  1644. - public ItemInstance addItem(String process, int itemId, int count, L2Object reference, boolean sendMessage)
  1645. - {
  1646. - if (count > 0)
  1647. - {
  1648. - // Retrieve the template of the item.
  1649. - final Item item = ItemTable.getInstance().getTemplate(itemId);
  1650. - if (item == null)
  1651. - {
  1652. - _log.log(Level.SEVERE, "Item id " + itemId + "doesn't exist, so it can't be added.");
  1653. - return null;
  1654. - }
  1655. -
  1656. - // Sends message to client if requested.
  1657. - if (sendMessage && ((!isCastingNow() && item.getItemType() == EtcItemType.HERB) || item.getItemType() != EtcItemType.HERB))
  1658. - {
  1659. - if (count > 1)
  1660. - {
  1661. - if (process.equalsIgnoreCase("Sweep") || process.equalsIgnoreCase("Quest"))
  1662. - sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(itemId).addItemNumber(count));
  1663. - else
  1664. - sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S2_S1).addItemName(itemId).addItemNumber(count));
  1665. - }
  1666. - else
  1667. - {
  1668. - if (process.equalsIgnoreCase("Sweep") || process.equalsIgnoreCase("Quest"))
  1669. - sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1).addItemName(itemId));
  1670. - else
  1671. - sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S1).addItemName(itemId));
  1672. - }
  1673. - }
  1674. -
  1675. - // If the item is herb type, dont add it to inventory.
  1676. - if (item.getItemType() == EtcItemType.HERB)
  1677. - {
  1678. - final ItemInstance herb = new ItemInstance(0, itemId);
  1679. -
  1680. - final IItemHandler handler = ItemHandler.getInstance().getItemHandler(herb.getEtcItem());
  1681. - if (handler != null)
  1682. - handler.useItem(this, herb, false);
  1683. - }
  1684. - else
  1685. - {
  1686. - // Add the item to inventory
  1687. - final ItemInstance createdItem = _inventory.addItem(process, itemId, count, this, reference);
  1688. -
  1689. - // If over capacity, drop the item
  1690. - if (!_inventory.validateCapacity(0, item.isQuestItem()) && createdItem.isDropable() && (!createdItem.isStackable() || createdItem.getLastChange() != ItemInstance.MODIFIED))
  1691. - dropItem("InvDrop", createdItem, null, true);
  1692. - // Cursed Weapon
  1693. - else if (CursedWeaponsManager.getInstance().isCursed(createdItem.getItemId()))
  1694. - CursedWeaponsManager.getInstance().activate(this, createdItem);
  1695. - // If you pickup arrows and a bow is equipped, try to equip them if no arrows is currently equipped.
  1696. - else if (item.getItemType() == EtcItemType.ARROW && getAttackType() == WeaponType.BOW && getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND) == null)
  1697. - checkAndEquipArrows();
  1698. -
  1699. - return createdItem;
  1700. - }
  1701. - }
  1702. - return null;
  1703. - }
  1704.  
  1705. + public ItemInstance addItem(String process, int itemId, long countL, L2Object reference, boolean sendMessage)
  1706. + {
  1707. + int count = 0;
  1708. + count = (int)countL;
  1709. + if(count!=countL)
  1710. + {
  1711. + count = 1;
  1712. + }
  1713. +
  1714. + if(count > 0)
  1715. + {
  1716. + // Retrieve the template of the item.
  1717. + final Item item = ItemTable.getInstance().getTemplate(itemId);
  1718. + if (item == null)
  1719. + {
  1720. + _log.log(Level.SEVERE, "Item id " + itemId + "doesn't exist, so it can't be added.");
  1721. + return null;
  1722. + }
  1723. +
  1724. + // Sends message to client if requested.
  1725. + if (sendMessage && ((!isCastingNow() && item.getItemType() == EtcItemType.HERB) || item.getItemType() != EtcItemType.HERB))
  1726. + {
  1727. + if(count > 1)
  1728. + {
  1729. + if (process.equalsIgnoreCase("Sweep") || process.equalsIgnoreCase("Quest"))
  1730. + sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(itemId).addItemNumber(count));
  1731. + else
  1732. + sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S2_S1).addItemName(itemId).addItemNumber(count));
  1733. + }
  1734. + else
  1735. + {
  1736. + if (process.equalsIgnoreCase("Sweep") || process.equalsIgnoreCase("Quest"))
  1737. + sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1).addItemName(itemId));
  1738. + else
  1739. + sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_PICKED_UP_S1).addItemName(itemId));
  1740. + }
  1741. + }
  1742. +
  1743. + // If the item is herb type, dont add it to inventory.
  1744. + if (item.getItemType() == EtcItemType.HERB)
  1745. + {
  1746. + final ItemInstance herb = new ItemInstance(0, itemId);
  1747. +
  1748. + final IItemHandler handler = ItemHandler.getInstance().getItemHandler(herb.getEtcItem());
  1749. + if (handler != null)
  1750. + handler.useItem(this, herb, false);
  1751. + }
  1752. + else
  1753. + {
  1754. + // Add the item to inventory
  1755. + final ItemInstance createdItem = _inventory.addItem(process, itemId, count, this, reference);
  1756. +
  1757. + // If over capacity, drop the item
  1758. + if (!_inventory.validateCapacity(0, item.isQuestItem()) && createdItem.isDropable() && (!createdItem.isStackable() || createdItem.getLastChange() != ItemInstance.MODIFIED))
  1759. + dropItem("InvDrop", createdItem, null, true);
  1760. + // Cursed Weapon
  1761. + else if (CursedWeaponsManager.getInstance().isCursed(createdItem.getItemId()))
  1762. + CursedWeaponsManager.getInstance().activate(this, createdItem);
  1763. + // If you pickup arrows and a bow is equipped, try to equip them if no arrows is currently equipped.
  1764. + else if (item.getItemType() == EtcItemType.ARROW && getAttackType() == WeaponType.BOW && getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND) == null)
  1765. + checkAndEquipArrows();
  1766. +
  1767. + return createdItem;
  1768. + }
  1769. + }
  1770. + return null;
  1771. + }
  1772.  
  1773. /**
  1774. * Destroy item from inventory and send InventoryUpdate packet to the L2PcInstance.
  1775. * @param process String Identifier of process triggering this action
  1776. * @param item ItemInstance to be destroyed
  1777. * @param reference L2Object Object referencing current action like NPC selling item or previous item in transformation
  1778. * @param sendMessage boolean Specifies whether to send message to Client about this action
  1779. * @return boolean informing if the action was successfull
  1780. */
  1781. public boolean destroyItem(String process, ItemInstance item, L2Object reference, boolean sendMessage)
  1782.  
  1783. @@@@@@@@@@@@@@@@@@@@@@
  1784.  
  1785. public void setCurrentPetSkill(L2Skill skill, boolean ctrlPressed, boolean shiftPressed)
  1786. {
  1787. _currentPetSkill.setSkill(skill);
  1788. _currentPetSkill.setCtrlPressed(ctrlPressed);
  1789. _currentPetSkill.setShiftPressed(shiftPressed);
  1790. }
  1791.  
  1792. +
  1793. + public long getOnlineTime()
  1794. + {
  1795. + return _onlineTime;
  1796. + }
  1797. +
  1798.  
  1799. /**
  1800. * @return the current queued skill in use.
  1801. */
  1802. public SkillUseHolder getQueuedSkill()
  1803.  
  1804. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Hero.java
  1805. ===================================================================
  1806. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Hero.java (revision 0)
  1807. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Hero.java (working copy)
  1808. @@@@@@@@@@@@@@@@@@
  1809. + package net.sf.l2j.achievementEngine;
  1810. +
  1811. +import net.sf.l2j.achievementEngine.Condition;
  1812. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1813. +
  1814. +public class Hero extends Condition
  1815. +{
  1816. + public Hero(Object value)
  1817. + {
  1818. + super(value);
  1819. + setName("Hero");
  1820. + }
  1821. +
  1822. + @Override
  1823. +public boolean meetConditionRequirements(L2PcInstance player)
  1824. + {
  1825. + if (getValue() == null) {
  1826. + return false;
  1827. + }
  1828. +
  1829. + return player.isHero();
  1830. + }
  1831. +}
  1832.  
  1833. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxcp.java
  1834. ===================================================================
  1835. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxcp.java (revision 0)
  1836. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Maxcp.java (working copy)
  1837. @@@@@@@@@@@@@@
  1838. + package net.sf.l2j.achievementEngine;
  1839. +
  1840. +import net.sf.l2j.achievementEngine.Condition;
  1841. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1842. +
  1843. +public class Maxcp extends Condition
  1844. +{
  1845. + public Maxcp(Object value)
  1846. + {
  1847. + super(value);
  1848. + setName("Max CP");
  1849. + }
  1850. +
  1851. + @Override
  1852. +public boolean meetConditionRequirements(L2PcInstance player)
  1853. + {
  1854. + if (getValue() == null) {
  1855. + return false;
  1856. + }
  1857. + int val = Integer.parseInt(getValue().toString());
  1858. +
  1859. + return player.getMaxCp() >= val;
  1860. + }
  1861. +}
  1862.  
  1863. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Chest.java
  1864. ===================================================================
  1865. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Chest.java (revision 0)
  1866. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Chest.java (working copy)
  1867. @@@@@@@@@@@@@@
  1868. + package net.sf.l2j.achievementEngine.EnchantAmor;
  1869. +
  1870. + import net.sf.l2j.achievementEngine.Condition;
  1871. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  1872. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1873. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  1874. +
  1875. + /**
  1876. + * @author Matim,Wallister
  1877. + * @version v1
  1878. + */
  1879. + public class Chest extends Condition
  1880. + {
  1881. + public Chest(Object value)
  1882. + {
  1883. + super(value);
  1884. + setName("Chests");
  1885. + }
  1886. +
  1887. + @Override
  1888. + public boolean meetConditionRequirements(L2PcInstance player)
  1889. + {
  1890. + if (getValue() == null)
  1891. + {
  1892. + return false;
  1893. + }
  1894. +
  1895. + int val = Integer.parseInt(getValue().toString());
  1896. +
  1897. + ItemInstance armor = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);
  1898. +
  1899. + if (armor != null)
  1900. + {
  1901. + if (armor.getEnchantLevel() >= val)
  1902. + {
  1903. + return true;
  1904. + }
  1905. + }
  1906. + return false;
  1907. + }
  1908. + }
  1909.  
  1910. \ No newline at end of file
  1911. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Pvp.java
  1912. ===================================================================
  1913. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Pvp.java (revision 0)
  1914. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Pvp.java (working copy)
  1915. @@@@@@@@@@@@@@
  1916. + package net.sf.l2j.achievementEngine;
  1917. +
  1918. +import net.sf.l2j.achievementEngine.Condition;
  1919. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1920. +
  1921. +public class Pvp extends Condition
  1922. +{
  1923. + public Pvp(Object value)
  1924. + {
  1925. + super(value);
  1926. + setName("PvP Count");
  1927. + }
  1928. +
  1929. + @Override
  1930. +public boolean meetConditionRequirements(L2PcInstance player)
  1931. + {
  1932. + if (getValue() == null) {
  1933. + return false;
  1934. + }
  1935. + int val = Integer.parseInt(getValue().toString());
  1936. +
  1937. + return player.getPvpKills() >= val;
  1938. + }
  1939. +}
  1940.  
  1941. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Karma.java
  1942. ===================================================================
  1943. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Karma.java (revision 0)
  1944. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Karma.java (working copy)
  1945. @@@@@@@@@@@@
  1946. + package net.sf.l2j.achievementEngine;
  1947. +
  1948. +import net.sf.l2j.achievementEngine.Condition;
  1949. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1950. +
  1951. +public class Karma extends Condition
  1952. +{
  1953. + public Karma(Object value)
  1954. + {
  1955. + super(value);
  1956. + setName("Karma Count");
  1957. + }
  1958. +
  1959. + @Override
  1960. +public boolean meetConditionRequirements(L2PcInstance player)
  1961. + {
  1962. + if (getValue() == null) {
  1963. + return false;
  1964. + }
  1965. + int val = Integer.parseInt(getValue().toString());
  1966. +
  1967. + return player.getKarma() >= val;
  1968. + }
  1969. +}
  1970.  
  1971. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/ItemsCount.java
  1972. ===================================================================
  1973. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/ItemsCount.java (revision 0)
  1974. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/ItemsCount.java (working copy)
  1975. @@@@@@@@@@@@@@@@
  1976. + /*
  1977. + * This program is free software: you can redistribute it and/or modify it under
  1978. + * the terms of the GNU General Public License as published by the Free Software
  1979. + * Foundation, either version 3 of the License, or (at your option) any later
  1980. + * version.
  1981. + *
  1982. + * This program is distributed in the hope that it will be useful, but WITHOUT
  1983. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  1984. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  1985. + * details.
  1986. + *
  1987. + * You should have received a copy of the GNU General Public License along with
  1988. + * this program. If not, see <http://www.gnu.org/licenses/>.
  1989. + */
  1990. + package net.sf.l2j.achievementEngine;
  1991. +
  1992. + import java.util.StringTokenizer;
  1993. +
  1994. +
  1995. +
  1996. +import net.sf.l2j.achievementEngine.Condition;
  1997. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  1998. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  1999. +
  2000. + @SuppressWarnings("unused")
  2001. + public class ItemsCount extends Condition
  2002. + {
  2003. + public ItemsCount(Object value)
  2004. + {
  2005. + super(value);
  2006. + setName("Items Count");
  2007. + }
  2008. +
  2009. + @Override
  2010. + public boolean meetConditionRequirements(L2PcInstance player)
  2011. + {
  2012. + if (getValue() == null) {
  2013. + return false;
  2014. + }
  2015. +
  2016. + String s = getValue().toString();
  2017. + StringTokenizer st = new StringTokenizer(s, ",");
  2018. + int id = 0;
  2019. + int ammount = 0;
  2020. + try
  2021. + {
  2022. + id = Integer.parseInt(st.nextToken());
  2023. + ammount = Integer.parseInt(st.nextToken());
  2024. + if (player.getInventory().getInventoryItemCount(id, 0) >= ammount)
  2025. + return true;
  2026. + }
  2027. + catch (NumberFormatException nfe)
  2028. + {
  2029. + nfe.printStackTrace();
  2030. + }
  2031. +
  2032. + return false;
  2033. + }
  2034. + }
  2035.  
  2036. \ No newline at end of file
  2037. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Achievement.java
  2038. ===================================================================
  2039. --- aCis_gameserver/java/net.sf.l2j.achievementEngine.java (revision 0)
  2040. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Achievement.java (working copy)
  2041. @@@@@@@@@@@@@
  2042. + package net.sf.l2j.achievementEngine;
  2043. +
  2044. + import java.util.logging.Logger;
  2045. +
  2046. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  2047. +
  2048. + import java.util.ArrayList;
  2049. + import java.util.HashMap;
  2050. +
  2051. + /**
  2052. + * @author Matim,Wallister
  2053. + * @version v1
  2054. + */
  2055. + public class Achievement
  2056. + {
  2057. + private int _id;
  2058. + private String _name;
  2059. + private String _reward;
  2060. + private String _description = "No Description!";
  2061. + private boolean _repeatable;
  2062. +
  2063. + private HashMap<Integer, Long> _rewardList;
  2064. + private ArrayList<Condition> _conditions;
  2065. +
  2066. + private static Logger _log = Logger.getLogger(Achievement.class.getName());
  2067. +
  2068. + public Achievement(int id, String name, String description, String reward, boolean repeatable, ArrayList<Condition> conditions)
  2069. + {
  2070. + _rewardList = new HashMap<Integer, Long>();
  2071. + _id = id;
  2072. + _name = name;
  2073. + _description = description;
  2074. + _reward = reward;
  2075. + _conditions = conditions;
  2076. + _repeatable = repeatable;
  2077. +
  2078. + createRewardList();
  2079. + }
  2080. +
  2081. + private void createRewardList()
  2082. + {
  2083. + for (String s : _reward.split(";"))
  2084. + {
  2085. + if (s == null || s.isEmpty())
  2086. + continue;
  2087. +
  2088. + String[] split = s.split(",");
  2089. + Integer item = 0;
  2090. + Long count = new Long(0);
  2091. + try
  2092. + {
  2093. + item = Integer.valueOf(split[0]);
  2094. + count = Long.valueOf(split[1]);
  2095. + }
  2096. + catch(NumberFormatException nfe)
  2097. + {
  2098. + _log.warning("[AchievementsEngine] Error: Wrong reward " + nfe);
  2099. + }
  2100. + _rewardList.put(item, count);
  2101. + }
  2102. + }
  2103. +
  2104. + public boolean meetAchievementRequirements(L2PcInstance player)
  2105. + {
  2106. + for (Condition c: getConditions())
  2107. + {
  2108. + if (!c.meetConditionRequirements(player))
  2109. + {
  2110. + return false;
  2111. + }
  2112. + }
  2113. + return true;
  2114. + }
  2115. +
  2116. + public int getID()
  2117. + {
  2118. + return _id;
  2119. + }
  2120. +
  2121. + public String getName()
  2122. + {
  2123. + return _name;
  2124. + }
  2125. +
  2126. + public String getDescription()
  2127. + {
  2128. + return _description;
  2129. + }
  2130. +
  2131. + public String getReward()
  2132. + {
  2133. + return _reward;
  2134. + }
  2135. +
  2136. + public boolean isRepeatable()
  2137. + {
  2138. + return _repeatable;
  2139. + }
  2140. +
  2141. + public HashMap<Integer, Long> getRewardList()
  2142. + {
  2143. + return _rewardList;
  2144. + }
  2145. +
  2146. + public ArrayList<Condition> getConditions()
  2147. + {
  2148. + return _conditions;
  2149. + }
  2150. + }
  2151.  
  2152. \ No newline at end of file
  2153. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Head.java
  2154. ===================================================================
  2155. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Head.java (revision 0)
  2156. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/EnchantAmor/Head.java (working copy)
  2157. @@@@@@@@@@@@
  2158. + package net.sf.l2j.achievementEngine.EnchantAmor;
  2159. +
  2160. +import net.sf.l2j.achievementEngine.Condition;
  2161. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  2162. +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  2163. +import net.sf.l2j.gameserver.model.itemcontainer.Inventory;
  2164. +
  2165. + /**
  2166. + * @author Matim,Wallister
  2167. + * @version v1
  2168. + */
  2169. + public class Head extends Condition
  2170. + {
  2171. + public Head(Object value)
  2172. + {
  2173. + super(value);
  2174. + setName("Helmets");
  2175. + }
  2176. +
  2177. + @Override
  2178. + public boolean meetConditionRequirements(L2PcInstance player)
  2179. + {
  2180. + if (getValue() == null)
  2181. + {
  2182. + return false;
  2183. + }
  2184. +
  2185. + int val = Integer.parseInt(getValue().toString());
  2186. +
  2187. + ItemInstance armor = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HEAD);
  2188. +
  2189. + if (armor != null)
  2190. + {
  2191. + if (armor.getEnchantLevel() >= val)
  2192. + {
  2193. + return true;
  2194. + }
  2195. + }
  2196. + return false;
  2197. + }
  2198. + }
  2199.  
  2200. \ No newline at end of file
  2201. Index: aCis_gameserver/java/net.sf.l2j.gameserver.instancemanager/RaidBossPointsManager.java
  2202. ===================================================================
  2203. --- aCis_gameserver/java/net.sf.l2j.gameserver.instancemanager/RaidBossPointsManager.java (revision 42)
  2204. +++ aCis_gameserver/java/net.sf.l2j.gameserver.instancemanager/RaidBossPointsManager.java (working copy)
  2205. @@ -44,222 +44,231 @@
  2206.  
  2207. private static class SingletonHolder
  2208. {
  2209. protected static final RaidBossPointsManager _instance = new RaidBossPointsManager();
  2210. }
  2211.  
  2212. + /**
  2213. + * @return
  2214. + */
  2215. + public static RaidBossPointsManager getInstance1()
  2216. + {
  2217. + // TODO Auto-generated method stub
  2218. + return null;
  2219. + }
  2220. + }
  2221.  
  2222. \ No newline at end of file
  2223. Index: aCis_gameserver/java/net.sf.l2j.achievementEngine/Marry.java
  2224. ===================================================================
  2225. --- aCis_gameserver/java/net.sf.l2j.achievementEngine/Marry.java (revision 0)
  2226. +++ aCis_gameserver/java/net.sf.l2j.achievementEngine/Marry.java (working copy)
  2227. @@@@@@@@@@@@
  2228. + package net.sf.l2j.achievementEngine;
  2229. +
  2230. + import net.sf.l2j.achievementEngine.Condition;
  2231. + import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  2232. +
  2233. + public class Marry extends Condition
  2234. + {
  2235. + public Marry(Object value)
  2236. + {
  2237. + super(value);
  2238. + setName("Married");
  2239. + }
  2240. +
  2241. + @Override
  2242. + public boolean meetConditionRequirements(L2PcInstance player)
  2243. + {
  2244. + if (getValue() == null) {
  2245. + return false;
  2246. + }
  2247. +
  2248. + return player.isMarried();
  2249. + }
  2250. +}
  2251.  
  2252. #P L2jAcis SQL NAVICAT
  2253. Index: sql/achievements.sql
  2254. ===================================================================
  2255. --- sql/achievements.sql (revision 0)
  2256. +++ sql/achievements.sql (working copy)
  2257. @@@@@@@@@@
  2258. +SET FOREIGN_KEY_CHECKS=0;
  2259. +-- ----------------------------
  2260. +-- Table structure for achievements
  2261. +-- ----------------------------
  2262. +CREATE TABLE `achievements` (
  2263. + `owner_id` int(11) NOT NULL default '0',
  2264. + `a1` int(11) default '0',
  2265. + `a2` int(11) default '0',
  2266. + `a3` int(11) default '0',
  2267. + `a4` int(11) default '0',
  2268. + `a5` int(11) default '0',
  2269. + `a6` int(11) default '0',
  2270. + `a7` int(11) default '0',
  2271. + `a8` int(11) default '0',
  2272. + `a9` int(11) default '0',
  2273. + `a10` int(11) default '0',
  2274. + `a11` int(11) default '0',
  2275. + `a12` int(11) default '0',
  2276. + `a13` int(11) default '0',
  2277. + `a14` int(11) default '0',
  2278. + `a15` int(11) default '0',
  2279. + `a16` int(11) default '0',
  2280. + `a17` int(11) default '0',
  2281. + `a18` int(11) default '0',
  2282. + `a19` int(11) default '0',
  2283. + `a20` int(11) default '0',
  2284. + `a21` int(11) default '0',
  2285. + `a22` int(11) default '0',
  2286. + `a23` int(11) default '0',
  2287. + `a24` int(11) default '0',
  2288. + `a25` int(11) default '0',
  2289. + PRIMARY KEY (`owner_id`)
  2290. +) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2291. Index: sql/custom_npc.sql
  2292. ===================================================================
  2293. --- gameserver\data\xml\npcs (revision 42)
  2294. +++ gameserver\data\xml\npcs (working copy)
  2295. @@@@@@@@@@@@@@@@
  2296. + <npc id="50999" idTemplate="31228" name="Manager" title="Achievements">
  2297. + <set name="level" val="70"/>
  2298. + <set name="radius" val="8"/>
  2299. + <set name="height" val="23"/>
  2300. + <set name="rHand" val="0"/>
  2301. + <set name="lHand" val="0"/>
  2302. + <set name="type" val="L2achievements"/>
  2303. + <set name="exp" val="0"/>
  2304. + <set name="sp" val="0"/>
  2305. + <set name="hp" val="2444.46819"/>
  2306. + <set name="mp" val="1345.8"/>
  2307. + <set name="hpRegen" val="7.5"/>
  2308. + <set name="mpRegen" val="2.7"/>
  2309. + <set name="pAtk" val="688.86373"/>
  2310. + <set name="pDef" val="295.91597"/>
  2311. + <set name="mAtk" val="470.40463"/>
  2312. + <set name="mDef" val="216.53847"/>
  2313. + <set name="crit" val="4"/>
  2314. + <set name="atkSpd" val="253"/>
  2315. + <set name="str" val="40"/>
  2316. + <set name="int" val="21"/>
  2317. + <set name="dex" val="30"/>
  2318. + <set name="wit" val="20"/>
  2319. + <set name="con" val="43"/>
  2320. + <set name="men" val="20"/>
  2321. + <set name="corpseTime" val="7"/>
  2322. + <set name="walkSpd" val="50"/>
  2323. + <set name="runSpd" val="120"/>
  2324. + <set name="dropHerbGroup" val="0"/>
  2325. + <set name="attackRange" val="40"/>
  2326. + <ai type="default" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/>
  2327. + <skills>
  2328. + <skill id="4045" level="1"/>
  2329. + <skill id="4416" level="14"/>
  2330. + </skills>
  2331. + </npc>
Add Comment
Please, Sign In to add comment