Advertisement
Guest User

Q501_ProofOfClanAlliance

a guest
Feb 21st, 2019
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package quests.Q501_ProofOfClanAlliance;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.List;
  8.  
  9. import net.sf.l2j.commons.random.Rnd;
  10.  
  11. import net.sf.l2j.L2DatabaseFactory;
  12. import net.sf.l2j.gameserver.datatables.SkillTable;
  13. import net.sf.l2j.gameserver.model.L2Clan;
  14. import net.sf.l2j.gameserver.model.L2Effect;
  15. import net.sf.l2j.gameserver.model.L2World;
  16. import net.sf.l2j.gameserver.model.actor.L2Character;
  17. import net.sf.l2j.gameserver.model.actor.L2Npc;
  18. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  19. import net.sf.l2j.gameserver.model.quest.Quest;
  20. import net.sf.l2j.gameserver.model.quest.QuestState;
  21. import net.sf.l2j.gameserver.model.quest.QuestTimer;
  22.  
  23. public class Q501_ProofOfClanAlliance extends Quest
  24. {
  25.     private static final String qn = "Q501_ProofOfClanAlliance";
  26.     // Quest Npcs
  27.     private static final int SIR_KRISTOF_RODEMAI = 30756;
  28.     private static final int STATUE_OF_OFFERING = 30757;
  29.     private static final int WITCH_ATHREA = 30758;
  30.     private static final int WITCH_KALIS = 30759;
  31.    
  32.     // Quest Items
  33.     private static final short HERB_OF_HARIT = 3832;
  34.     private static final short HERB_OF_VANOR = 3833;
  35.     private static final short HERB_OF_OEL_MAHUM = 3834;
  36.     private static final short BLOOD_OF_EVA = 3835;
  37.     private static final short SYMBOL_OF_LOYALTY = 3837;
  38.     private static final short PROOF_OF_ALLIANCE = 3874;
  39.     private static final short VOUCHER_OF_FAITH = 3873;
  40.     private static final short ANTIDOTE_RECIPE = 3872;
  41.     private static final short POTION_OF_RECOVERY = 3889;
  42.    
  43.     // Quest mobs, drop, rates and prices
  44.     private static final int[] CHESTS =
  45.     {
  46.         27173,
  47.         27174,
  48.         27175,
  49.         27176,
  50.         27177
  51.     };
  52.     private static final int[][] MOBS =
  53.     {
  54.         {
  55.             20685,
  56.             HERB_OF_VANOR
  57.         },
  58.         {
  59.             20644,
  60.             HERB_OF_HARIT
  61.         },
  62.         {
  63.             20576,
  64.             HERB_OF_OEL_MAHUM
  65.         }
  66.     };
  67.    
  68.     private static final short RATE = 35;
  69.     // stackable items paid to retry chest game: (default 10k adena)
  70.     private static final short RETRY_PRICE = 10000;
  71.    
  72.     public Q501_ProofOfClanAlliance()
  73.     {
  74.         super(501, qn, "Proof Of Clan Alliance");
  75.        
  76.         addStartNpc(SIR_KRISTOF_RODEMAI, STATUE_OF_OFFERING, WITCH_ATHREA);
  77.         addTalkId(WITCH_KALIS);
  78.         setItemsIds(SYMBOL_OF_LOYALTY, ANTIDOTE_RECIPE);
  79.         for (int[] i : MOBS)
  80.         {
  81.             addKillId(i[0]);
  82.             setItemsIds(i[1]);
  83.         }
  84.         for (int i : CHESTS)
  85.         {
  86.             addKillId(i);
  87.         }
  88.     }
  89.    
  90.     public QuestState getLeader(QuestState st)
  91.     {
  92.         L2Clan clan = st.getPlayer().getClan();
  93.         QuestState leader = null;
  94.         if ((clan != null) && (clan.getLeader() != null) && (clan.getLeader().getPlayerInstance() != null))
  95.         {
  96.             leader = clan.getLeader().getPlayerInstance().getQuestState(getName());
  97.         }
  98.         return leader;
  99.     }
  100.    
  101.     public void removeQuestFromMembers(QuestState st, boolean leader)
  102.     {
  103.         removeQuestFromOfflineMembers(st);
  104.         removeQuestFromOnlineMembers(st, leader);
  105.     }
  106.    
  107.     public void removeQuestFromOfflineMembers(QuestState st)
  108.     {
  109.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  110.         {
  111.             st.exitQuest(true);
  112.             return;
  113.         }
  114.        
  115.         try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  116.         {
  117.             PreparedStatement offline = con.prepareStatement("DELETE FROM character_quests WHERE name = ? AND charId IN (SELECT obj_Id FROM characters WHERE clanId = ? AND online = 0)");
  118.             offline.setString(1, getName());
  119.             offline.setInt(2, st.getPlayer().getClan().getClanId());
  120.             offline.executeUpdate();
  121.             offline.close();
  122.         }
  123.         catch (Exception e)
  124.         {
  125.         }
  126.     }
  127.    
  128.     public void removeQuestFromOnlineMembers(QuestState st, boolean leader)
  129.     {
  130.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  131.         {
  132.             st.exitQuest(true);
  133.             return;
  134.         }
  135.        
  136.         QuestState l;
  137.         L2PcInstance pleader = null;
  138.        
  139.         if (leader)
  140.         {
  141.             l = getLeader(st);
  142.             if (l != null)
  143.             {
  144.                 pleader = l.getPlayer();
  145.             }
  146.         }
  147.        
  148.         if (pleader != null)
  149.         {
  150.             for (L2Effect eff : st.getPlayer().getAllEffects())
  151.             {
  152.                 if (eff.getSkill().getId() == 4082)
  153.                 {
  154.                     st.getPlayer().stopImmobileUntilAttacked(eff);
  155.                 }
  156.             }
  157.         }
  158.         for (L2PcInstance pl : st.getPlayer().getClan().getOnlineMembers())
  159.         {
  160.             if ((pl != null) && (pl.getQuestState(getName()) != null))
  161.             {
  162.                 pl.getQuestState(getName()).exitQuest(true);
  163.             }
  164.         }
  165.     }
  166.    
  167.     @Override
  168.     public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  169.     {
  170.         QuestState st = player.getQuestState(getName());
  171.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  172.         {
  173.             st.exitQuest(true);
  174.             return getNoQuestMsg();
  175.         }
  176.        
  177.         QuestState leader = getLeader(st);
  178.         if (leader == null)
  179.         {
  180.             removeQuestFromMembers(st, true);
  181.             return "Quest Failed";
  182.         }
  183.        
  184.         String htmltext = event;
  185.        
  186.         if (st.getPlayer().isClanLeader())
  187.         {
  188.             if (event.equalsIgnoreCase("30756-03.htm"))
  189.             {
  190.                 st.set("cond", "1");
  191.                 st.setState(STATE_STARTED);
  192.                 st.playSound(QuestState.SOUND_ACCEPT);
  193.             }
  194.             else if (event.equalsIgnoreCase("30759-03.htm"))
  195.             {
  196.                 st.set("cond", "2");
  197.                 st.set("dead_list", " ");
  198.             }
  199.             else if (event.equalsIgnoreCase("30759-07.htm"))
  200.             {
  201.                 st.takeItems(SYMBOL_OF_LOYALTY, -1);
  202.                 st.giveItems(ANTIDOTE_RECIPE, 1);
  203.                 notifyDeath(npc, player, leader.getPlayer());
  204.                 st.set("cond", "3");
  205.                 st.set("chest_count", "0");
  206.                 st.set("chest_game", "0");
  207.                 st.set("chest_try", "0");
  208.                 startQuestTimer("poison_timer", 3600000, null, st.getPlayer(), false);
  209.                 st.getPlayer().useMagic(SkillTable.getInstance().getInfo(4082, 1), false, false);
  210.                 st.getPlayer().startImmobileUntilAttacked();
  211.                 htmltext = "30759-07.htm";
  212.             }
  213.         }
  214.        
  215.         if (event.equalsIgnoreCase("poison_timer"))
  216.         {
  217.             removeQuestFromMembers(st, true);
  218.             htmltext = "30759-09.htm";
  219.         }
  220.         else if (event.equalsIgnoreCase("chest_timer"))
  221.         {
  222.             htmltext = "";
  223.             if (leader.getInt("chest_game") < 2)
  224.             {
  225.                 stop_chest_game(st);
  226.             }
  227.         }
  228.         else if (event.equalsIgnoreCase("30757-04.htm"))
  229.         {
  230.             List<String> deadlist = new ArrayList<>();
  231.             deadlist.addAll(Arrays.asList(leader.get("dead_list").split(" ")));
  232.             deadlist.add(st.getPlayer().getName());
  233.             String deadstr = "";
  234.             for (String s : deadlist)
  235.             {
  236.                 deadstr += s + " ";
  237.             }
  238.             leader.set("dead_list", deadstr);
  239.             notifyDeath(npc, leader.getPlayer(), player);
  240.             if (Rnd.chance(50))
  241.             {
  242.                 st.getPlayer().reduceCurrentHp(st.getPlayer().getCurrentHp() * 8, st.getPlayer(), true, true, null);
  243.             }
  244.             st.giveItems(SYMBOL_OF_LOYALTY, 1);
  245.             st.playSound(QuestState.SOUND_ACCEPT);
  246.         }
  247.         else if (event.equalsIgnoreCase("30757-05.htm"))
  248.         {
  249.             st.exitQuest(true);
  250.         }
  251.         else if (event.equalsIgnoreCase("30758-03.htm"))
  252.         {
  253.             start_chest_game(st);
  254.         }
  255.         else if (event.equalsIgnoreCase("30758-07.htm"))
  256.         {
  257.             if (st.getQuestItemsCount(57) < RETRY_PRICE)
  258.             {
  259.                 htmltext = "30758-06.htm";
  260.             }
  261.             else
  262.             {
  263.                 st.takeItems(57, RETRY_PRICE);
  264.             }
  265.         }
  266.        
  267.         return htmltext;
  268.     }
  269.    
  270.     @Override
  271.     public String onTalk(L2Npc npc, L2PcInstance player)
  272.     {
  273.         QuestState st = player.getQuestState(qn);
  274.         String htmltext = getNoQuestMsg();
  275.        
  276.         int cond = st.getInt("cond");
  277.        
  278.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  279.         {
  280.             st.exitQuest(true);
  281.             return htmltext;
  282.         }
  283.        
  284.         QuestState leader = getLeader(st);
  285.         if (leader == null)
  286.         {
  287.             removeQuestFromMembers(st, true);
  288.             return "Quest Failed";
  289.         }
  290.        
  291.         int npcId = npc.getNpcId();
  292.         if (npcId == SIR_KRISTOF_RODEMAI)
  293.         {
  294.             if (!st.getPlayer().isClanLeader())
  295.             {
  296.                 st.exitQuest(true);
  297.                 return "30756-10.htm";
  298.             }
  299.             else if (st.getPlayer().getClan().getLevel() <= 2)
  300.             {
  301.                 st.exitQuest(true);
  302.                 return "30756-08.htm";
  303.             }
  304.             else if (st.getPlayer().getClan().getLevel() >= 4)
  305.             {
  306.                 st.exitQuest(true);
  307.                 return "30756-09.htm";
  308.             }
  309.             else if (st.getQuestItemsCount(VOUCHER_OF_FAITH) > 0)
  310.             {
  311.                 st.playSound(QuestState.SOUND_FANFARE);
  312.                 st.takeItems(VOUCHER_OF_FAITH, -1);
  313.                 st.giveItems(PROOF_OF_ALLIANCE, 1);
  314.                 st.getPlayer().addExpAndSp(0, 120000);
  315.                 htmltext = "30756-07.htm";
  316.                 st.exitQuest(true);
  317.             }
  318.             else if ((cond == 1) || (cond == 2))
  319.             {
  320.                 return "30756-06.htm";
  321.             }
  322.             else if (st.getQuestItemsCount(PROOF_OF_ALLIANCE) == 0)
  323.             {
  324.                 st.set("cond", "0");
  325.                 return "30756-01.htm";
  326.             }
  327.             else
  328.             {
  329.                 st.exitQuest(true);
  330.                 return htmltext;
  331.             }
  332.         }
  333.         else if (npcId == WITCH_KALIS)
  334.         {
  335.             if (st.getPlayer().isClanLeader())
  336.             {
  337.                 if (cond == 1)
  338.                 {
  339.                     return "30759-01.htm";
  340.                 }
  341.                 else if (cond == 2)
  342.                 {
  343.                     htmltext = "30759-05.htm";
  344.                     if (st.getQuestItemsCount(SYMBOL_OF_LOYALTY) == 3)
  345.                     {
  346.                         int deads = 0;
  347.                         try
  348.                         {
  349.                             deads = st.get("dead_list").split(" ").length;
  350.                         }
  351.                         finally
  352.                         {
  353.                             if (deads == 3)
  354.                             {
  355.                                 htmltext = "30759-06.htm";
  356.                             }
  357.                         }
  358.                     }
  359.                 }
  360.                 else if (cond == 3)
  361.                 {
  362.                     if ((st.getQuestItemsCount(HERB_OF_HARIT) > 0) && (st.getQuestItemsCount(HERB_OF_VANOR) > 0) && (st.getQuestItemsCount(HERB_OF_OEL_MAHUM) > 0) && (st.getQuestItemsCount(BLOOD_OF_EVA) > 0) && (st.getQuestItemsCount(ANTIDOTE_RECIPE) > 0))
  363.                     {
  364.                         st.takeItems(ANTIDOTE_RECIPE, 1);
  365.                         st.takeItems(HERB_OF_HARIT, 1);
  366.                         st.takeItems(HERB_OF_VANOR, 1);
  367.                         st.takeItems(HERB_OF_OEL_MAHUM, 1);
  368.                         st.takeItems(BLOOD_OF_EVA, 1);
  369.                         st.giveItems(POTION_OF_RECOVERY, 1);
  370.                         st.giveItems(VOUCHER_OF_FAITH, 1);
  371.                         QuestTimer timer = getQuestTimer("poison_timer", null, st.getPlayer());
  372.                         if (timer != null)
  373.                         {
  374.                             timer.cancel();
  375.                         }
  376.                         removeQuestFromMembers(st, false);
  377.                         for (L2Effect eff : st.getPlayer().getAllEffects())
  378.                         {
  379.                             if (eff.getSkill().getId() == 4082)
  380.                             {
  381.                                 st.getPlayer().stopImmobileUntilAttacked(eff);
  382.                             }
  383.                         }
  384.                         st.set("cond", "4");
  385.                         st.playSound(QuestState.SOUND_FINISH);
  386.                         return "30759-08.htm";
  387.                     }
  388.                     else if (st.getQuestItemsCount(VOUCHER_OF_FAITH) == 0)
  389.                     {
  390.                         return "30759-10.htm";
  391.                     }
  392.                 }
  393.             }
  394.             else if (leader.getInt("cond") == 3)
  395.             {
  396.                 return "30759-11.htm";
  397.             }
  398.         }
  399.         else if (npcId == STATUE_OF_OFFERING)
  400.         {
  401.             if (st.getPlayer().isClanLeader())
  402.             {
  403.                 return "30757-03.htm";
  404.             }
  405.             else if (st.getPlayer().getLevel() <= 39)
  406.             {
  407.                 st.exitQuest(true);
  408.                 return "30757-02.htm";
  409.             }
  410.             else
  411.             {
  412.                 String[] dlist;
  413.                 int deads;
  414.                 try
  415.                 {
  416.                     dlist = leader.get("dead_list").split(" ");
  417.                     deads = dlist.length;
  418.                 }
  419.                 catch (Exception e)
  420.                 {
  421.                     removeQuestFromMembers(st, true);
  422.                     return "Who are you?";
  423.                 }
  424.                 if (deads < 3)
  425.                 {
  426.                     for (String str : dlist)
  427.                     {
  428.                         if (st.getPlayer().getName().equalsIgnoreCase(str))
  429.                         {
  430.                             return "you cannot die again!";
  431.                         }
  432.                     }
  433.                     return "30757-01.htm";
  434.                 }
  435.             }
  436.         }
  437.         else if (npcId == WITCH_ATHREA)
  438.         {
  439.             if (st.getPlayer().isClanLeader())
  440.             {
  441.                 return "30757-03.htm";
  442.             }
  443.            
  444.             String[] dlist;
  445.             try
  446.             {
  447.                 dlist = leader.get("dead_list").split(" ");
  448.             }
  449.             catch (Exception e)
  450.             {
  451.                 st.exitQuest(true);
  452.                 return "Who are you?";
  453.             }
  454.             Boolean flag = false;
  455.             if (dlist != null)
  456.             {
  457.                 for (String str : dlist)
  458.                 {
  459.                     if (st.getPlayer().getName().equalsIgnoreCase(str))
  460.                     {
  461.                         flag = true;
  462.                     }
  463.                 }
  464.             }
  465.             if (!flag)
  466.             {
  467.                 st.exitQuest(true);
  468.                 return "Who are you?";
  469.             }
  470.            
  471.             int game_state = leader.getInt("chest_game");
  472.             if (game_state == 0)
  473.             {
  474.                 if (leader.getInt("chest_try") == 0)
  475.                 {
  476.                     return "30758-01.htm";
  477.                 }
  478.                 return "30758-05.htm";
  479.             }
  480.             else if (game_state == 1)
  481.             {
  482.                 return "30758-09.htm";
  483.             }
  484.             else if (game_state == 2)
  485.             {
  486.                 st.playSound(QuestState.SOUND_FINISH);
  487.                 st.giveItems(BLOOD_OF_EVA, 1);
  488.                 QuestTimer timer = getQuestTimer("chest_timer", null, st.getPlayer());
  489.                 if (timer != null)
  490.                 {
  491.                     timer.cancel();
  492.                 }
  493.                 stop_chest_game(st);
  494.                 leader.set("chest_game", "3");
  495.                 return "30758-08.htm";
  496.             }
  497.         }
  498.         return htmltext;
  499.     }
  500.    
  501.     @Override
  502.     public String onKill(L2Npc npc, L2PcInstance player, boolean isSunnon)
  503.     {
  504.         QuestState st = checkPlayerState(player, npc, STATE_STARTED);
  505.         if (st == null)
  506.         {
  507.             return null;
  508.         }
  509.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  510.         {
  511.             st.exitQuest(true);
  512.             return getNoQuestMsg();
  513.         }
  514.        
  515.         QuestState leader = getLeader(st);
  516.         if (leader == null)
  517.         {
  518.             removeQuestFromMembers(st, true);
  519.             return "Quest Failed";
  520.         }
  521.        
  522.         // first part, general checking
  523.         int npcId = npc.getNpcId();
  524.        
  525.         QuestTimer timer = getQuestTimer("poison_timer", null, st.getPlayer());
  526.         if (timer == null)
  527.         {
  528.             stop_chest_game(st);
  529.             return "Quest Failed";
  530.         }
  531.        
  532.         // second part, herbs gathering
  533.         for (int[] m : MOBS)
  534.         {
  535.             if ((npcId == m[0]) && (st.getInt(String.valueOf(m[1])) == 0))
  536.             {
  537.                 if (Rnd.chance(RATE))
  538.                 {
  539.                     st.giveItems(m[1], 1);
  540.                     leader.set(String.valueOf(m[1]), "1");
  541.                     st.playSound(QuestState.SOUND_MIDDLE);
  542.                     return null;
  543.                 }
  544.             }
  545.         }
  546.        
  547.         // third part, chest game
  548.         for (int i : CHESTS)
  549.         {
  550.             if (npcId == i)
  551.             {
  552.                 timer = getQuestTimer("chest_timer", null, st.getPlayer());
  553.                 if (timer == null)
  554.                 {
  555.                     stop_chest_game(st);
  556.                     return "Time is up!";
  557.                 }
  558.                 if (Rnd.chance(25))
  559.                 {
  560.                     npc.broadcastNpcSay("###### BINGO! ######");
  561.                     int count = leader.getInt("chest_count");
  562.                     if (count < 4)
  563.                     {
  564.                         count += 1;
  565.                         leader.set("chest_count", String.valueOf(count));
  566.                     }
  567.                     if (count >= 4)
  568.                     {
  569.                         stop_chest_game(st);
  570.                         leader.set("chest_game", "2");
  571.                         timer.cancel();
  572.                         st.playSound(QuestState.SOUND_MIDDLE);
  573.                     }
  574.                     else
  575.                     {
  576.                         st.playSound(QuestState.SOUND_ITEMGET);
  577.                     }
  578.                 }
  579.                 return null;
  580.             }
  581.         }
  582.         return null;
  583.     }
  584.    
  585.     public void start_chest_game(QuestState st)
  586.     {
  587.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  588.         {
  589.             st.exitQuest(true);
  590.             return;
  591.         }
  592.         QuestState leader = getLeader(st);
  593.         if (leader == null)
  594.         {
  595.             removeQuestFromMembers(st, true);
  596.             return;
  597.         }
  598.         leader.set("chest_game", "1");
  599.         leader.set("chest_count", "0");
  600.         int attempts = leader.getInt("chest_try");
  601.         leader.set("chest_try", String.valueOf(attempts + 1));
  602.        
  603.         for (L2Npc npc : L2World.getInstance().getAllByNpcId(CHESTS, false))
  604.         {
  605.             npc.deleteMe();
  606.         }
  607.        
  608.         for (int n = 1; n <= 5; n++)
  609.         {
  610.             for (int i : CHESTS)
  611.             {
  612.                 addSpawn(i, 102100, 103450, -3400, 0, true, 60000, false);
  613.             }
  614.         }
  615.         startQuestTimer("chest_timer", 60000, null, st.getPlayer(), false);
  616.     }
  617.    
  618.     public void stop_chest_game(QuestState st)
  619.     {
  620.         QuestState leader = getLeader(st);
  621.         if (leader == null)
  622.         {
  623.             removeQuestFromMembers(st, true);
  624.             return;
  625.         }
  626.        
  627.         for (L2Npc npc : L2World.getInstance().getAllByNpcId(CHESTS, false))
  628.         {
  629.             npc.deleteMe();
  630.         }
  631.         leader.set("chest_game", "0");
  632.     }
  633.    
  634.     public String onDeath(L2Character  npc, L2Character  pc, L2PcInstance player)
  635.     {
  636.         QuestState st = checkPlayerState(player, (L2Npc) npc, STATE_STARTED);
  637.         if ((st.getPlayer() == null) || (st.getPlayer().getClan() == null))
  638.         {
  639.             st.exitQuest(true);
  640.             return null;
  641.         }
  642.        
  643.         QuestState leader = getLeader(st);
  644.         if (leader == null)
  645.         {
  646.             removeQuestFromMembers(st, true);
  647.             return null;
  648.         }
  649.        
  650.         if (st.getPlayer() == pc)
  651.         {
  652.             QuestTimer timer1 = getQuestTimer("poison_timer", null, st.getPlayer());
  653.             QuestTimer timer2 = getQuestTimer("chest_timer", null, st.getPlayer());
  654.             if (timer1 != null)
  655.             {
  656.                 timer1.cancel();
  657.             }
  658.             if (timer2 != null)
  659.             {
  660.                 timer2.cancel();
  661.             }
  662.             removeQuestFromMembers(st, true);
  663.         }
  664.         return null;
  665.     }
  666.    
  667.     public static void main(String[] args)
  668.     {
  669.         new Q501_ProofOfClanAlliance();
  670.     }
  671. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement