Q00416_PathOfTheOrcShaman.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. /*
  2. * Copyright (C) 2004-2015 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack 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 DataPack 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 quests.Q00416_PathOfTheOrcShaman;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import com.l2jserver.gameserver.enums.QuestSound;
  23. import com.l2jserver.gameserver.model.actor.L2Npc;
  24. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  25. import com.l2jserver.gameserver.model.base.ClassId;
  26. import com.l2jserver.gameserver.model.holders.ItemChanceHolder;
  27. import com.l2jserver.gameserver.model.quest.Quest;
  28. import com.l2jserver.gameserver.model.quest.QuestState;
  29. import com.l2jserver.gameserver.network.NpcStringId;
  30. import com.l2jserver.gameserver.network.clientpackets.Say2;
  31. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  32. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  33. /**
  34. * Path of the Orc Shaman (416)
  35. * @author Adry_85
  36. */
  37. public final class Q00416_PathOfTheOrcShaman extends Quest
  38. {
  39. // NPCs
  40. private static final int UMOS = 30502;
  41. private static final int TATARU_ZU_HESTUI = 30585;
  42. private static final int HESTUI_TOTEM_SPIRIT = 30592;
  43. private static final int DUDA_MARA_TOTEM_SPIRIT = 30593;
  44. private static final int MOIRA = 31979;
  45. private static final int TOTEM_SPIRIT_OF_GANDI = 32057;
  46. private static final int DEAD_LEOPARDS_CARCASS = 32090;
  47. // Items
  48. private static final int FIRE_CHARM = 1616;
  49. private static final int KASHA_BEAR_PELT = 1617;
  50. private static final int KASHA_BLADE_SPIDER_HUSK = 1618;
  51. private static final int FIRST_FIERY_EGG = 1619;
  52. private static final int HESTUI_MASK = 1620;
  53. private static final int SECOND_FIERY_EGG = 1621;
  54. private static final int TOTEM_SPIRIT_CLAW = 1622;
  55. private static final int TATARUS_LETTER = 1623;
  56. private static final int FLAME_CHARM = 1624;
  57. private static final int GRIZZLY_BLOOD = 1625;
  58. private static final int BLOOD_CAULDRON = 1626;
  59. private static final int SPIRIT_NET = 1627;
  60. private static final int BOUND_DURKA_SPIRIT = 1628;
  61. private static final int DURKA_PARASITE = 1629;
  62. private static final int TOTEM_SPIRIT_BLOOD = 1630;
  63. private static final int MASK_OF_MEDIUM = 1631;
  64. // Quest Monsters
  65. private static final int DURKA_SPIRIT = 27056;
  66. private static final int BLACK_LEOPARD = 27319;
  67. // Misc
  68. private static final int MIN_LEVEL = 18;
  69. // Mobs
  70. private static final Map<Integer, ItemChanceHolder> MOBS = new HashMap<>();
  71. static
  72. {
  73. MOBS.put(20415, new ItemChanceHolder(FIRST_FIERY_EGG, 1.0, 1)); // scarlet_salamander
  74. MOBS.put(20478, new ItemChanceHolder(KASHA_BLADE_SPIDER_HUSK, 1.0, 1)); // kasha_blade_spider
  75. MOBS.put(20479, new ItemChanceHolder(KASHA_BEAR_PELT, 1.0, 1)); // kasha_bear
  76. MOBS.put(20335, new ItemChanceHolder(GRIZZLY_BLOOD, 1.0, 6)); // grizzly_bear
  77. MOBS.put(20038, new ItemChanceHolder(DURKA_PARASITE, 1.0, 9)); // poison_spider
  78. MOBS.put(20043, new ItemChanceHolder(DURKA_PARASITE, 1.0, 9)); // bind_poison_spider
  79. MOBS.put(27056, new ItemChanceHolder(DURKA_PARASITE, 1.0, 9)); // durka_spirit
  80. }
  81. public Q00416_PathOfTheOrcShaman()
  82. {
  83. super(416, Q00416_PathOfTheOrcShaman.class.getSimpleName(), "Path of the Orc Shaman");
  84. addStartNpc(TATARU_ZU_HESTUI);
  85. addTalkId(TATARU_ZU_HESTUI, UMOS, MOIRA, DEAD_LEOPARDS_CARCASS, DUDA_MARA_TOTEM_SPIRIT, HESTUI_TOTEM_SPIRIT, TOTEM_SPIRIT_OF_GANDI);
  86. addKillId(MOBS.keySet());
  87. addKillId(BLACK_LEOPARD);
  88. registerQuestItems(FIRE_CHARM, KASHA_BEAR_PELT, KASHA_BLADE_SPIDER_HUSK, FIRST_FIERY_EGG, HESTUI_MASK, SECOND_FIERY_EGG, TOTEM_SPIRIT_CLAW, TATARUS_LETTER, FLAME_CHARM, GRIZZLY_BLOOD, BLOOD_CAULDRON, SPIRIT_NET, BOUND_DURKA_SPIRIT, DURKA_PARASITE, TOTEM_SPIRIT_BLOOD);
  89. }
  90. @Override
  91. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  92. {
  93. final QuestState st = getQuestState(player, false);
  94. if (st == null)
  95. {
  96. return null;
  97. }
  98. String htmltext = null;
  99. switch (event)
  100. {
  101. case "START":
  102. {
  103. if (player.getClassId() != ClassId.orcMage)
  104. {
  105. if (player.getClassId() == ClassId.orcShaman)
  106. {
  107. htmltext = "30585-02.htm";
  108. }
  109. else
  110. {
  111. htmltext = "30585-03.htm";
  112. }
  113. }
  114. else if (player.getLevel() < MIN_LEVEL)
  115. {
  116. htmltext = "30585-04.htm";
  117. }
  118. else if (hasQuestItems(player, MASK_OF_MEDIUM))
  119. {
  120. htmltext = "30585-05.htm";
  121. }
  122. else
  123. {
  124. htmltext = "30585-06.htm";
  125. }
  126. break;
  127. }
  128. case "30585-07.htm":
  129. {
  130. st.startQuest();
  131. st.setMemoState(1);
  132. giveItems(player, FIRE_CHARM, 1);
  133. htmltext = event;
  134. break;
  135. }
  136. case "30585-12.html":
  137. {
  138. if (hasQuestItems(player, TOTEM_SPIRIT_CLAW))
  139. {
  140. htmltext = event;
  141. }
  142. break;
  143. }
  144. case "30585-13.html":
  145. {
  146. if (hasQuestItems(player, TOTEM_SPIRIT_CLAW))
  147. {
  148. takeItems(player, TOTEM_SPIRIT_CLAW, -1);
  149. giveItems(player, TATARUS_LETTER, 1);
  150. st.setCond(5, true);
  151. htmltext = event;
  152. }
  153. break;
  154. }
  155. case "30585-14.html":
  156. {
  157. if (hasQuestItems(player, TOTEM_SPIRIT_CLAW))
  158. {
  159. takeItems(player, TOTEM_SPIRIT_CLAW, -1);
  160. st.setCond(12, true);
  161. st.setMemoState(100);
  162. htmltext = event;
  163. }
  164. break;
  165. }
  166. case "30502-07.html":
  167. {
  168. if (hasQuestItems(player, TOTEM_SPIRIT_BLOOD))
  169. {
  170. takeItems(player, TOTEM_SPIRIT_BLOOD, -1);
  171. giveItems(player, MASK_OF_MEDIUM, 1);
  172. final int level = player.getLevel();
  173. if (level >= 20)
  174. {
  175. addExpAndSp(player, 320534, 22992);
  176. }
  177. else if (level >= 19)
  178. {
  179. addExpAndSp(player, 456128, 29690);
  180. }
  181. else
  182. {
  183. addExpAndSp(player, 591724, 36388);
  184. }
  185. giveAdena(player, 163800, true);
  186. st.exitQuest(false, true);
  187. player.sendPacket(new SocialAction(player.getObjectId(), 3));
  188. st.saveGlobalQuestVar("1ClassQuestFinished", "1");
  189. htmltext = event;
  190. }
  191. break;
  192. }
  193. case "32090-05.html":
  194. {
  195. if (st.isMemoState(106))
  196. {
  197. htmltext = event;
  198. }
  199. break;
  200. }
  201. case "32090-06.html":
  202. {
  203. if (st.isMemoState(106))
  204. {
  205. st.setMemoState(107);
  206. st.setCond(18, true);
  207. htmltext = event;
  208. }
  209. break;
  210. }
  211. case "30593-02.html":
  212. {
  213. if (hasQuestItems(player, BLOOD_CAULDRON))
  214. {
  215. htmltext = event;
  216. }
  217. break;
  218. }
  219. case "30593-03.html":
  220. {
  221. if (hasQuestItems(player, BLOOD_CAULDRON))
  222. {
  223. takeItems(player, BLOOD_CAULDRON, -1);
  224. giveItems(player, SPIRIT_NET, 1);
  225. st.setCond(9, true);
  226. htmltext = event;
  227. }
  228. break;
  229. }
  230. case "30592-02.html":
  231. {
  232. if (hasQuestItems(player, HESTUI_MASK, SECOND_FIERY_EGG))
  233. {
  234. htmltext = event;
  235. }
  236. break;
  237. }
  238. case "30592-03.html":
  239. {
  240. if (hasQuestItems(player, HESTUI_MASK, SECOND_FIERY_EGG))
  241. {
  242. takeItems(player, -1, HESTUI_MASK, SECOND_FIERY_EGG);
  243. giveItems(player, TOTEM_SPIRIT_CLAW, 1);
  244. st.setCond(4, true);
  245. htmltext = event;
  246. }
  247. break;
  248. }
  249. case "32057-02.html":
  250. {
  251. if (st.isMemoState(101))
  252. {
  253. st.setMemoState(102);
  254. st.setCond(14, true);
  255. htmltext = event;
  256. }
  257. break;
  258. }
  259. case "32057-05.html":
  260. {
  261. if (st.isMemoState(109))
  262. {
  263. st.setMemoState(110);
  264. st.setCond(21, true);
  265. htmltext = event;
  266. }
  267. break;
  268. }
  269. }
  270. return htmltext;
  271. }
  272. @Override
  273. public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
  274. {
  275. final QuestState st = getRandomPartyMemberState(player, -1, 3, npc);
  276. if (st == null)
  277. {
  278. return super.onKill(npc, player, isSummon);
  279. }
  280. if (npc.getId() == BLACK_LEOPARD)
  281. {
  282. switch (st.getMemoState())
  283. {
  284. case 102:
  285. {
  286. st.setMemoState(103);
  287. break;
  288. }
  289. case 103:
  290. {
  291. st.setMemoState(104);
  292. st.setCond(15, true);
  293. if (getRandom(100) < 66)
  294. {
  295. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.MY_DEAR_FRIEND_OF_S1_WHO_HAS_GONE_ON_AHEAD_OF_ME).addStringParameter(st.getPlayer().getName()));
  296. }
  297. break;
  298. }
  299. case 105:
  300. {
  301. st.setMemoState(106);
  302. st.setCond(17, true);
  303. if (getRandom(100) < 66)
  304. {
  305. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.LISTEN_TO_TEJAKAR_GANDI_YOUNG_OROKA_THE_SPIRIT_OF_THE_SLAIN_LEOPARD_IS_CALLING_YOU_S1).addStringParameter(st.getPlayer().getName()));
  306. }
  307. break;
  308. }
  309. case 107:
  310. {
  311. st.setMemoState(108);
  312. st.setCond(19, true);
  313. break;
  314. }
  315. }
  316. return super.onKill(npc, player, isSummon);
  317. }
  318. final ItemChanceHolder item = MOBS.get(npc.getId());
  319. if (item.getCount() == st.getCond())
  320. {
  321. if (st.isCond(1) && hasQuestItems(st.getPlayer(), FIRE_CHARM))
  322. {
  323. if (giveItemRandomly(st.getPlayer(), npc, item.getId(), 1, 1, item.getChance(), true) //
  324. && hasQuestItems(st.getPlayer(), FIRST_FIERY_EGG, KASHA_BLADE_SPIDER_HUSK, KASHA_BEAR_PELT))
  325. {
  326. st.setCond(2, true);
  327. }
  328. }
  329. else if (st.isCond(6) && hasQuestItems(st.getPlayer(), FLAME_CHARM))
  330. {
  331. if (giveItemRandomly(st.getPlayer(), npc, item.getId(), 1, 3, item.getChance(), true))
  332. {
  333. st.setCond(7);
  334. }
  335. }
  336. else if (st.isCond(9) && hasQuestItems(st.getPlayer(), SPIRIT_NET) //
  337. && !hasQuestItems(st.getPlayer(), BOUND_DURKA_SPIRIT) //
  338. && (getQuestItemsCount(st.getPlayer(), DURKA_PARASITE) <= 8))
  339. {
  340. if ((npc.getId() == 20038) || (npc.getId() == 20043))
  341. {
  342. final int random = getRandom(10);
  343. final long itemCount = getQuestItemsCount(st.getPlayer(), DURKA_PARASITE);
  344. if ((((itemCount == 5) && (random < 1))) //
  345. || ((itemCount == 6) && (random < 2)) //
  346. || ((itemCount == 7) && (random < 2)) //
  347. || (itemCount >= 8))
  348. {
  349. takeItems(player, DURKA_PARASITE, -1);
  350. addSpawn(DURKA_SPIRIT, npc.getX(), npc.getY(), npc.getZ(), 0, true, 0, false);
  351. playSound(st.getPlayer(), QuestSound.ITEMSOUND_QUEST_BEFORE_BATTLE);
  352. }
  353. else
  354. {
  355. giveItems(st.getPlayer(), DURKA_PARASITE, 1);
  356. playSound(st.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  357. }
  358. }
  359. else
  360. {
  361. giveItems(st.getPlayer(), BOUND_DURKA_SPIRIT, 1);
  362. takeItems(st.getPlayer(), -1, DURKA_PARASITE, SPIRIT_NET);
  363. }
  364. }
  365. }
  366. return super.onKill(npc, player, isSummon);
  367. }
  368. @Override
  369. public String onTalk(L2Npc npc, L2PcInstance player)
  370. {
  371. final QuestState st = getQuestState(player, true);
  372. String htmltext = getNoQuestMsg(player);
  373. if (st.isCreated())
  374. {
  375. if (npc.getId() == TATARU_ZU_HESTUI)
  376. {
  377. htmltext = "30585-01.htm";
  378. }
  379. }
  380. else if (st.isStarted())
  381. {
  382. switch (npc.getId())
  383. {
  384. case TATARU_ZU_HESTUI:
  385. {
  386. if (st.isMemoState(1))
  387. {
  388. if (hasQuestItems(player, FIRE_CHARM))
  389. {
  390. if (getQuestItemsCount(player, KASHA_BEAR_PELT, KASHA_BLADE_SPIDER_HUSK, FIRST_FIERY_EGG) < 3)
  391. {
  392. htmltext = "30585-08.html";
  393. }
  394. else
  395. {
  396. takeItems(player, -1, FIRE_CHARM, KASHA_BEAR_PELT, KASHA_BLADE_SPIDER_HUSK, FIRST_FIERY_EGG);
  397. giveItems(player, HESTUI_MASK, 1);
  398. giveItems(player, SECOND_FIERY_EGG, 1);
  399. st.setCond(3, true);
  400. htmltext = "30585-09.html";
  401. }
  402. }
  403. else if (hasQuestItems(player, HESTUI_MASK, SECOND_FIERY_EGG))
  404. {
  405. htmltext = "30585-10.html";
  406. }
  407. else if (hasQuestItems(player, TOTEM_SPIRIT_CLAW))
  408. {
  409. htmltext = "30585-11.html";
  410. }
  411. else if (hasQuestItems(player, TATARUS_LETTER))
  412. {
  413. htmltext = "30585-15.html";
  414. }
  415. else if (hasAtLeastOneQuestItem(player, GRIZZLY_BLOOD, FLAME_CHARM, BLOOD_CAULDRON, SPIRIT_NET, BOUND_DURKA_SPIRIT, TOTEM_SPIRIT_BLOOD))
  416. {
  417. htmltext = "30585-16.html";
  418. }
  419. }
  420. else if (st.isMemoState(100))
  421. {
  422. htmltext = "30585-14.html";
  423. }
  424. break;
  425. }
  426. case UMOS:
  427. {
  428. if (st.isMemoState(1))
  429. {
  430. if (hasQuestItems(player, TATARUS_LETTER))
  431. {
  432. giveItems(player, FLAME_CHARM, 1);
  433. takeItems(player, TATARUS_LETTER, -1);
  434. st.setCond(6, true);
  435. htmltext = "30502-01.html";
  436. }
  437. else if (hasQuestItems(player, FLAME_CHARM))
  438. {
  439. if (getQuestItemsCount(player, GRIZZLY_BLOOD) < 3)
  440. {
  441. htmltext = "30502-02.html";
  442. }
  443. else
  444. {
  445. takeItems(player, -1, FLAME_CHARM, GRIZZLY_BLOOD);
  446. giveItems(player, BLOOD_CAULDRON, 1);
  447. st.setCond(8, true);
  448. htmltext = "30502-03.html";
  449. }
  450. }
  451. else if (hasQuestItems(player, BLOOD_CAULDRON))
  452. {
  453. htmltext = "30502-04.html";
  454. }
  455. else if (hasAtLeastOneQuestItem(player, BOUND_DURKA_SPIRIT, SPIRIT_NET))
  456. {
  457. htmltext = "30502-05.html";
  458. }
  459. else if (hasQuestItems(player, TOTEM_SPIRIT_BLOOD))
  460. {
  461. htmltext = "30502-06.html";
  462. }
  463. }
  464. break;
  465. }
  466. case MOIRA:
  467. {
  468. final int memoState = st.getMemoState();
  469. if (memoState == 100)
  470. {
  471. st.setMemoState(101);
  472. st.setCond(13, true);
  473. htmltext = "31979-01.html";
  474. }
  475. else if ((memoState >= 101) && (memoState < 108))
  476. {
  477. htmltext = "31979-02.html";
  478. }
  479. else if (memoState == 110)
  480. {
  481. giveItems(player, MASK_OF_MEDIUM, 1);
  482. final int level = player.getLevel();
  483. if (level >= 20)
  484. {
  485. addExpAndSp(player, 160267, 11496);
  486. }
  487. else if (level >= 19)
  488. {
  489. addExpAndSp(player, 228064, 14845);
  490. }
  491. else
  492. {
  493. addExpAndSp(player, 295862, 18194);
  494. }
  495. giveAdena(player, 81900, true);
  496. st.exitQuest(false, true);
  497. player.sendPacket(new SocialAction(player.getObjectId(), 3));
  498. st.saveGlobalQuestVar("1ClassQuestFinished", "1");
  499. htmltext = "31979-03.html";
  500. }
  501. break;
  502. }
  503. case DEAD_LEOPARDS_CARCASS:
  504. {
  505. switch (st.getMemoState())
  506. {
  507. case 102:
  508. case 103:
  509. {
  510. htmltext = "32090-01.html";
  511. break;
  512. }
  513. case 104:
  514. {
  515. st.setMemoState(105);
  516. st.setCond(16, true);
  517. htmltext = "32090-03.html";
  518. break;
  519. }
  520. case 105:
  521. {
  522. htmltext = "32090-01.html";
  523. break;
  524. }
  525. case 106:
  526. {
  527. htmltext = "32090-04.html";
  528. break;
  529. }
  530. case 107:
  531. {
  532. htmltext = "32090-07.html";
  533. break;
  534. }
  535. case 108:
  536. {
  537. st.setMemoState(109);
  538. st.setCond(20, true);
  539. htmltext = "32090-08.html";
  540. break;
  541. }
  542. }
  543. break;
  544. }
  545. case DUDA_MARA_TOTEM_SPIRIT:
  546. {
  547. if (st.isMemoState(1))
  548. {
  549. if (hasQuestItems(player, BLOOD_CAULDRON))
  550. {
  551. htmltext = "30593-01.html";
  552. }
  553. else if (hasQuestItems(player, SPIRIT_NET) && !hasQuestItems(player, BOUND_DURKA_SPIRIT))
  554. {
  555. htmltext = "30593-04.html";
  556. }
  557. else if (!hasQuestItems(player, SPIRIT_NET) && hasQuestItems(player, BOUND_DURKA_SPIRIT))
  558. {
  559. takeItems(player, BOUND_DURKA_SPIRIT, -1);
  560. giveItems(player, TOTEM_SPIRIT_BLOOD, 1);
  561. st.setCond(11, true);
  562. htmltext = "30593-05.html";
  563. }
  564. else if (hasQuestItems(player, TOTEM_SPIRIT_BLOOD))
  565. {
  566. htmltext = "30593-06.html";
  567. }
  568. }
  569. break;
  570. }
  571. case HESTUI_TOTEM_SPIRIT:
  572. {
  573. if (st.isMemoState(1))
  574. {
  575. if (hasQuestItems(player, HESTUI_MASK, SECOND_FIERY_EGG))
  576. {
  577. htmltext = "30592-01.html";
  578. }
  579. else if (hasQuestItems(player, TOTEM_SPIRIT_CLAW))
  580. {
  581. htmltext = "30592-04.html";
  582. }
  583. else if (hasAtLeastOneQuestItem(player, GRIZZLY_BLOOD, FLAME_CHARM, BLOOD_CAULDRON, SPIRIT_NET, BOUND_DURKA_SPIRIT, TOTEM_SPIRIT_BLOOD, TATARUS_LETTER))
  584. {
  585. htmltext = "30592-05.html";
  586. }
  587. }
  588. break;
  589. }
  590. case TOTEM_SPIRIT_OF_GANDI:
  591. {
  592. switch (st.getMemoState())
  593. {
  594. case 101:
  595. {
  596. htmltext = "32057-01.html";
  597. break;
  598. }
  599. case 102:
  600. {
  601. htmltext = "32057-03.html";
  602. break;
  603. }
  604. case 109:
  605. {
  606. htmltext = "32057-04.html";
  607. break;
  608. }
  609. }
  610. break;
  611. }
  612. }
  613. }
  614. return htmltext;
  615. }
  616. }