Angel Cat:
-Traveler, are you interested in collecting letters?
-Collect letters to create LINEAGE II, TOGETHER, or NCSOFT, and bring them to me! I'll give you a gift!
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/33873-2.htm b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/33873-2.htm
deleted file mode 100644
index 6a8416f140..0000000000
--- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/33873-2.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-Angel Cat:
-So, here's the gist:
-If you hunt monsters in the Lineage II world, you have a chance of obtaining letter-engraved items.
-If you collect those letters and bring them to me, I'll give you a gift depending on the combination.
-There are a total of 14 letters, and they are:
-A, C, E, F, G, I, L, N, O, S, T, II, R, and H.
-
Combine the letters and numbers to create LINEAGE II, TOGETHER, or NCSOFT.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/LetterCollector.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
index 8643b5e35b..89451e9425 100644
--- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
+++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
@@ -16,230 +16,42 @@
*/
package events.LetterCollector;
-import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
-import org.l2jmobius.gameserver.model.holders.ItemHolder;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
+import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.quest.LongTimeEvent;
+import org.l2jmobius.gameserver.network.serverpackets.ExLetterCollectorUI;
/**
- * Event: Letter Collector
- * @URL http://www.lineage2.com/en/news/events/letter-collector-event-05112016.php
- * @author Mobius, Gigi
+ * @author Mobius
*/
public class LetterCollector extends LongTimeEvent
{
- // NPC
- private static final int ANGEL_CAT = 33873;
- // Items
- private static final int A = 3875;
- private static final int C = 3876;
- private static final int E = 3877;
- private static final int F = 3878;
- private static final int G = 3879;
- private static final int H = 3880;
- private static final int I = 3881;
- private static final int L = 3882;
- private static final int N = 3883;
- private static final int O = 3884;
- private static final int R = 3885;
- private static final int S = 3886;
- private static final int T = 3887;
- private static final int II = 3888;
- // Rewards
- private static final ItemHolder[] REWARDS_TAUTI =
- {
- new ItemHolder(34998, 1), // Tauti's One-handed Axe
- new ItemHolder(35001, 1), // Tauti's Dual Axe
- };
- private static final ItemHolder[] REWARDS_SPECTER =
- {
- new ItemHolder(18035, 1), // Blessed Specter Shaper
- new ItemHolder(18036, 1), // Blessed Specter Cutter
- new ItemHolder(18037, 1), // Blessed Specter Slasher
- new ItemHolder(18038, 1), // Blessed Specter Avenger
- new ItemHolder(18039, 1), // Blessed Specter Fighter
- new ItemHolder(18040, 1), // Blessed Specter Stormer
- new ItemHolder(18041, 1), // Blessed Specter Thrower
- new ItemHolder(18042, 1), // Blessed Specter Shooter
- new ItemHolder(18043, 1), // Blessed Specter Buster
- new ItemHolder(18044, 1), // Blessed Specter Caster
- new ItemHolder(18045, 1), // Blessed Specter Retributer
- new ItemHolder(18046, 1), // Blessed Specter Dualsword
- new ItemHolder(18047, 1), // Blessed Specter Dual Dagger
- new ItemHolder(18048, 1), // Blessed Specter Dual Blunt Weapon
- };
- private static final ItemHolder[] REWARDS_SERAPH =
- {
- new ItemHolder(18049, 1), // Blessed Seraph Helmet
- new ItemHolder(18050, 1), // Blessed Seraph Breastplate
- new ItemHolder(18051, 1), // Blessed Seraph Gaiters
- new ItemHolder(18052, 1), // Blessed Seraph Gauntlets
- new ItemHolder(18053, 1), // Blessed Seraph Boots
- new ItemHolder(18054, 1), // Blessed Seraph Shield
- new ItemHolder(18055, 1), // Blessed Seraph Leather Helmet
- new ItemHolder(18056, 1), // Blessed Seraph Leather Armor
- new ItemHolder(18057, 1), // Blessed Seraph Leather Leggings
- new ItemHolder(18058, 1), // Blessed Seraph Leather Gloves
- new ItemHolder(18059, 1), // Blessed Seraph Leather Boots
- new ItemHolder(18060, 1), // Blessed Seraph Circlet
- new ItemHolder(18061, 1), // Blessed Seraph Tunic
- new ItemHolder(18062, 1), // Blessed Seraph Stockings
- new ItemHolder(18063, 1), // Blessed Seraph Gloves
- new ItemHolder(18064, 1), // Blessed Seraph Shoes
- new ItemHolder(18065, 1), // Blessed Seraph Sigil
- };
- private static final ItemHolder[] REWARDS_OTHER =
- {
- new ItemHolder(17371, 20), // Crystal (R-grade)
- new ItemHolder(17754, 2000), // Soulshot (R-grade)
- new ItemHolder(19440, 1), // Gemstone (R-grade)
- new ItemHolder(19442, 500), // Blessed Spiritshot (R-grade)
- new ItemHolder(34945, 1), // Lv. 3 Giant Dye Pack
- new ItemHolder(34946, 1), // Lv. 3 Legendary Dye Pack
- new ItemHolder(34947, 1), // Lv. 3 Ancient Dye Pack
- new ItemHolder(34950, 1), // Lv. 4 Giant Dye Pack
- new ItemHolder(34951, 1), // Lv. 4 Legendary Dye Pack
- new ItemHolder(34952, 1), // Lv. 4 Ancient Dye Pack
- new ItemHolder(34953, 1), // Lv. 5 Giant Dye Pack
- new ItemHolder(34954, 1), // Lv. 5 Legendary Dye Pack
- new ItemHolder(34955, 1), // Lv. 5 Ancient Dye Pack
- new ItemHolder(35567, 1), // Dark Eternal Enhancement Stone
- new ItemHolder(37009, 3), // Blueberry Cake (MP)
- new ItemHolder(37802, 1), // Dark Eternal Enhancement Stone Fragment
- new ItemHolder(38101, 1), // Leona's Scroll: 1,000,000 SP
- new ItemHolder(38102, 1), // Leona's Scroll: 5,000,000 SP
- new ItemHolder(38103, 1), // Leona's Scroll: 10,000,000 SP
- new ItemHolder(39560, 1), // Low-grade Wind Dye Pack
- new ItemHolder(39561, 1), // Mid-grade Wind Dye Pack
- new ItemHolder(39562, 1), // High-grade Wind Dye Pack
- new ItemHolder(39633, 1), // Fortune Pocket - Stage 5
- };
-
private LetterCollector()
{
- addStartNpc(ANGEL_CAT);
- addFirstTalkId(ANGEL_CAT);
- addTalkId(ANGEL_CAT);
}
- @Override
- public String onAdvEvent(String event, Npc npc, PlayerInstance player)
+ @RegisterEvent(EventType.ON_PLAYER_LOGIN)
+ @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
+ public void onPlayerLogin(OnPlayerLogin event)
{
- String htmltext = null;
- switch (event)
+ if (!isEventPeriod())
{
- case "33873-1.htm":
- case "33873-2.htm":
- {
- htmltext = event;
- break;
- }
- case "lineage":
- {
- if ((getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, A) >= 1) && //
- (getQuestItemsCount(player, G) >= 1) && //
- (getQuestItemsCount(player, II) >= 1))
- {
- takeItems(player, L, 1);
- takeItems(player, I, 1);
- takeItems(player, N, 1);
- takeItems(player, E, 2);
- takeItems(player, A, 1);
- takeItems(player, G, 1);
- takeItems(player, II, 1);
- giveItems(player, getReward());
- htmltext = "33873-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "together":
- {
- if ((getQuestItemsCount(player, T) >= 2) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, G) >= 1) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, H) >= 1) && //
- (getQuestItemsCount(player, R) >= 1))
- {
- takeItems(player, T, 2);
- takeItems(player, O, 1);
- takeItems(player, G, 1);
- takeItems(player, E, 2);
- takeItems(player, H, 1);
- takeItems(player, R, 1);
- giveItems(player, getReward());
- htmltext = "33873-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "ncsoft":
- {
- if ((getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, C) >= 1) && //
- (getQuestItemsCount(player, S) >= 1) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, F) >= 1) && //
- (getQuestItemsCount(player, T) >= 1))
- {
- takeItems(player, N, 1);
- takeItems(player, C, 1);
- takeItems(player, S, 1);
- takeItems(player, O, 1);
- takeItems(player, F, 1);
- takeItems(player, T, 1);
- giveItems(player, getReward());
- htmltext = "33873-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
+ return;
}
- return htmltext;
- }
-
- private ItemHolder getReward()
- {
- if (getRandom(100) < 1)
+
+ final PlayerInstance player = event.getPlayer();
+ if (player != null)
{
- return getRandomEntry(REWARDS_TAUTI);
+ player.sendPacket(ExLetterCollectorUI.STATIC_PACKET);
}
- else if (getRandom(100) < 3)
- {
- return getRandomEntry(REWARDS_SPECTER);
- }
- else if (getRandom(100) < 3)
- {
- return getRandomEntry(REWARDS_SERAPH);
- }
- else
- {
- return getRandomEntry(REWARDS_OTHER);
- }
- }
-
- @Override
- public String onFirstTalk(Npc npc, PlayerInstance player)
- {
- return npc.getId() + "-1.htm";
}
public static void main(String[] args)
{
new LetterCollector();
}
-}
\ No newline at end of file
+}
diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/config.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/config.xml
index 32fac599ef..44bb3fbde5 100644
--- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/config.xml
+++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/config.xml
@@ -1,27 +1,22 @@
-
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/noItem.htm b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/noItem.htm
deleted file mode 100644
index 1a427c87f4..0000000000
--- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/events/LetterCollector/noItem.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Angel Cat:
-I'm sorry, but you'll need more letters to play.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index b81eb77cc2..c97a47adcc 100644
--- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -552,7 +552,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_PVP_BOOK_LIST(0x18D, ExPvpBookList::new, ConnectionState.IN_GAME),
EX_PVPBOOK_KILLER_LOCATION(0x18E, null, ConnectionState.IN_GAME),
EX_PVPBOOK_TELEPORT_TO_KILLER(0x18F, null, ConnectionState.IN_GAME),
- EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, null, ConnectionState.IN_GAME),
+ EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, ExLetterCollectorTakeReward::new, ConnectionState.IN_GAME),
EX_SET_STATUS_BONUS(0x191, null, ConnectionState.IN_GAME),
EX_RESET_STATUS_BONUS(0x192, null, ConnectionState.IN_GAME),
EX_OLYMPIAD_MY_RANKING_INFO(0x193, RequestOlympiadMyRankingInfo::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
new file mode 100644
index 0000000000..d8ad4a9751
--- /dev/null
+++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
@@ -0,0 +1,248 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
+import org.l2jmobius.gameserver.network.GameClient;
+
+/**
+ * @author Index, Mobius
+ */
+public class ExLetterCollectorTakeReward implements IClientIncomingPacket
+{
+ // Items
+ private static final int A = 3875;
+ private static final int E = 3877;
+ private static final int G = 3879;
+ private static final int I = 3881;
+ private static final int L = 3882;
+ private static final int N = 3883;
+ private static final int O = 3884;
+ private static final int T = 3886;
+ private static final int H = 3880;
+ private static final int II = 3888;
+ private static final int W = 22894;
+ private static final int D = 29545;
+ private static final int P = 29825;
+
+ // Rewards
+ private static final ItemChanceHolder[] LINEAGE_II_REWARDS =
+ {
+ new ItemChanceHolder(80333, 5, 1), // Dragon Necklace
+ new ItemChanceHolder(80334, 5, 1), // Dragon Earring
+ new ItemChanceHolder(80335, 5, 1), // Dragon Ring
+ new ItemChanceHolder(48296, 5, 1), // +10 Eternal Light Armor Capsule
+ new ItemChanceHolder(48297, 5, 1), // +10 Eternal Robe Capsule
+ new ItemChanceHolder(48295, 5, 1), // +10 Eternal Heavy Armor Capsule
+ new ItemChanceHolder(39573, 5, 1), // Sealed Talisman - Insanity
+ new ItemChanceHolder(37716, 5, 1), // Seven Signs' Energy
+ new ItemChanceHolder(80416, 5, 1), // Fortune Box of 10 Billion Adena
+ new ItemChanceHolder(36414, 5, 1), // Dragon Claw
+ new ItemChanceHolder(47705, 15, 1), // Blue Cat's Eye Lv. 3 Jewelry Box
+ new ItemChanceHolder(47627, 15, 1), // Sapphire Lv. 3 Jewelry Box
+ new ItemChanceHolder(47626, 15, 1), // Ruby Lv. 3 Jewelry Box
+ new ItemChanceHolder(47703, 15, 1), // Red Cat's Eye Lv. 3 Jewelry Box
+ new ItemChanceHolder(47629, 15, 1), // Opal Lv. 3 Jewelry Box
+ new ItemChanceHolder(28360, 15, 1), // Cat's Eye Lv. 3 Jewelry Box
+ new ItemChanceHolder(28362, 15, 1), // Amethyst Lv. 3 Jewelry Box
+ new ItemChanceHolder(47631, 15, 1), // Diamond Lv. 3 Jewelry Box
+ new ItemChanceHolder(47634, 15, 1), // Pearl Lv. 3 Jewelry Box
+ new ItemChanceHolder(47635, 15, 1), // Vital Stone Lv. 3 Jewelry Box
+ new ItemChanceHolder(47630, 15, 1), // Obsidian Lv. 3 Jewelry Box
+ new ItemChanceHolder(47633, 15, 1), // Aquamarine Lv. 3 Jewelry Box
+ new ItemChanceHolder(80423, 30, 1), // Balance Artifact Box
+ new ItemChanceHolder(80420, 30, 1), // Attack Artifact Box
+ new ItemChanceHolder(80421, 30, 1), // Protection Artifact Box
+ new ItemChanceHolder(80422, 30, 1), // Support Artifact Box
+ new ItemChanceHolder(39374, 30, 1), // Scroll: 5.000.000 SP
+ new ItemChanceHolder(46274, 30, 1), // Wind Vitality Tonic
+ new ItemChanceHolder(35563, 30, 1), // Giant's Energy
+ new ItemChanceHolder(38761, 30, 1), // Energy of Destruction 3-unit Pack
+ new ItemChanceHolder(36513, 30, 1), // Elcyum Powder
+ new ItemChanceHolder(27673, 30, 1), // Freya's Scroll of Storm
+ };
+ private static final ItemChanceHolder[] DEATH_REWARDS =
+ {
+ new ItemChanceHolder(47821, 5, 1), // Sayha's Talisman Lv. 10
+ new ItemChanceHolder(47820, 5, 1), // Sayha's Talisman Lv. 9
+ new ItemChanceHolder(37717, 5, 1), // Talisman - Seven Signs
+ new ItemChanceHolder(39572, 5, 1), // Talisman - Insanity
+ new ItemChanceHolder(48032, 5, 1), // Sayha's Talisman Lv. 8
+ new ItemChanceHolder(80416, 5, 1), // Fortune Box of 10 Billion Adena
+ new ItemChanceHolder(28448, 5, 1), // Sayha's Talisman Lv. 7
+ new ItemChanceHolder(37715, 5, 1), // Talisman - Anakim
+ new ItemChanceHolder(35649, 15, 1), // Sealed Talisman - Longing
+ new ItemChanceHolder(29152, 15, 1), // High-grade Zodiac Agathion Pack
+ new ItemChanceHolder(29151, 15, 1), // Mid-grade Zodiac Agathion Pack
+ new ItemChanceHolder(28373, 15, 1), // Tanzenite Lv. 3 Jewelry Box
+ new ItemChanceHolder(47632, 15, 1), // Emerald Lv. 3 Jewelry Box
+ new ItemChanceHolder(47636, 15, 1), // Garnet Lv. 3 Jewelry Box
+ new ItemChanceHolder(80423, 30, 1), // Balance Artifact Box
+ new ItemChanceHolder(80420, 30, 1), // Attack Artifact Box
+ new ItemChanceHolder(80421, 30, 1), // Protection Artifact Box
+ new ItemChanceHolder(80422, 30, 1), // Support Artifact Box
+ new ItemChanceHolder(39374, 30, 1), // Scroll: 5.000.000 SP
+ new ItemChanceHolder(46274, 30, 1), // Wind Vitality Tonic
+ new ItemChanceHolder(35563, 30, 1), // Giant's Energy
+ new ItemChanceHolder(38761, 30, 1), // Energy of Destruction 3-unit Pack
+ new ItemChanceHolder(36513, 30, 1), // Elcyum Powder
+ new ItemChanceHolder(27673, 30, 1), // Freya's Scroll of Storm
+ };
+ private static final ItemChanceHolder[] KNIGHT_REWARDS =
+ {
+ new ItemChanceHolder(80416, 5, 1), // Fortune Box of 10 Billion Adena
+ new ItemChanceHolder(28448, 5, 1), // Sayha's Talisman Lv. 7
+ new ItemChanceHolder(26291, 5, 1), // Kaliel's Energy - Longing
+ new ItemChanceHolder(36731, 5, 1), // Life Stone: Giant's Power
+ new ItemChanceHolder(37714, 5, 1), // Talisman - Lilith
+ new ItemChanceHolder(29150, 15, 1), // Low-grade Zodiac Agathion Pack
+ new ItemChanceHolder(80423, 30, 1), // Balance Artifact Box
+ new ItemChanceHolder(80420, 30, 1), // Attack Artifact Box
+ new ItemChanceHolder(80421, 30, 1), // Protection Artifact Box
+ new ItemChanceHolder(80422, 30, 1), // Support Artifact Box
+ new ItemChanceHolder(36515, 15, 1), // Elcyum
+ new ItemChanceHolder(48215, 30, 1), // Circlet Spirit Stone
+ new ItemChanceHolder(28540, 30, 1), // Magnificent Brooch Spirit Stone
+ new ItemChanceHolder(36514, 30, 1), // Elcyum Crystal
+ new ItemChanceHolder(39374, 30, 1), // Scroll: 5.000.000 SP
+ new ItemChanceHolder(46274, 30, 1), // Wind Vitality Tonic
+ new ItemChanceHolder(35563, 30, 1), // Giant's Energy
+ new ItemChanceHolder(38761, 30, 1), // Energy of Destruction 3-unit Pack
+ new ItemChanceHolder(27673, 30, 1), // Freya's Scroll of Storm
+ };
+
+ private int _wordId;
+
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ _wordId = packet.readD();
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final PlayerInventory inventory = player.getInventory();
+ if (inventory == null)
+ {
+ return;
+ }
+
+ switch (_wordId)
+ {
+ case 0:
+ {
+ if ((inventory.getInventoryItemCount(L, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 2) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(II, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", L, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", II, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(LINEAGE_II_REWARDS), player, true);
+ break;
+ }
+ case 1:
+ {
+ if ((inventory.getInventoryItemCount(N, -1) < 2) || //
+ (inventory.getInventoryItemCount(E, -1) < 3) || //
+ (inventory.getInventoryItemCount(W, -1) < 1) || //
+ (inventory.getInventoryItemCount(L, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(D, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", W, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", L, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", D, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(DEATH_REWARDS), player, true);
+ break;
+ }
+ case 2:
+ {
+ if ((inventory.getInventoryItemCount(T, -1) < 3) || //
+ (inventory.getInventoryItemCount(O, -1) < 2) || //
+ (inventory.getInventoryItemCount(H, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(P, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", O, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", O, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", P, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(KNIGHT_REWARDS), player, true);
+ break;
+ }
+ }
+ }
+
+ private ItemChanceHolder getRandomReward(ItemChanceHolder[] rewards)
+ {
+ ItemChanceHolder reward = null;
+ while (reward == null)
+ {
+ final ItemChanceHolder random = rewards[Rnd.get(rewards.length)];
+ if ((Rnd.get(100) < random.getChance()) && (ItemTable.getInstance().getTemplate(random.getId()) != null))
+ {
+ reward = random;
+ }
+ }
+ return reward;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
new file mode 100644
index 0000000000..d03169fc4f
--- /dev/null
+++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+
+/**
+ * @author Index
+ */
+public class ExLetterCollectorUI implements IClientOutgoingPacket
+{
+ public static final ExLetterCollectorUI STATIC_PACKET = new ExLetterCollectorUI();
+
+ private static final int LETTER_COLLECTOR_MIN_LEVEL = 95;
+
+ private ExLetterCollectorUI()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_LETTER_COLLECTOR_UI_LAUNCHER.writeId(packet);
+ packet.writeC(0x01); // enabled (0x00 - no, 0x01 -yes)
+ packet.writeD(LETTER_COLLECTOR_MIN_LEVEL); // Minimum Level
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-1.htm b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-1.htm
deleted file mode 100644
index eb301506d6..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-1.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-Letter Collector Rosalia:
-I'm glad to see you, adventurer!
-Do you want to claim reward for collecting the words LINEAGE II, MEMORIES, or CHRONICLE?
-You can make these words from the letters you get while hunting the monsters in Lineage II world.
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-2.htm b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-2.htm
deleted file mode 100644
index 0969500e70..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/9000-2.htm
+++ /dev/null
@@ -1,17 +0,0 @@
-Letter Collector Rosalia:
-I can exchange two of your letters for one of random letters. In case with the rare S, H and the number II, you'll will need only one item for exchange. Press the button below when're you ready!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/LetterCollector.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
index 069cc2cef6..89451e9425 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
@@ -16,346 +16,42 @@
*/
package events.LetterCollector;
-import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
+import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.quest.LongTimeEvent;
+import org.l2jmobius.gameserver.network.serverpackets.ExLetterCollectorUI;
/**
- * Event: Letter Collector
- * @URL https://eu.4gameforum.com/threads/648400/
- * @author Mobius, Gigi, Adapted for Classic by QuangNguyen
+ * @author Mobius
*/
public class LetterCollector extends LongTimeEvent
{
- // NPC
- private static final int ROSALIA = 9000;
- // Items
- private static final int A = 3875;
- private static final int C = 3876;
- private static final int E = 3877;
- private static final int G = 3879;
- private static final int I = 3881;
- private static final int L = 3882;
- private static final int N = 3883;
- private static final int R = 3885;
- private static final int M = 34956;
- private static final int O = 3884;
- private static final int S = 3886;
- private static final int H = 3880;
- private static final int II = 3888;
- // Exchange Letters
- private static final int[] LETTERS =
- {
- A,
- C,
- E,
- G,
- I,
- L,
- N,
- R,
- M,
- O,
- S,
- H,
- II
- };
- // Reward
- private static final int LINEAGEII = 29581;
- private static final int MEMMORIES = 29583;
- private static final int CHRONICLE = 29582;
-
private LetterCollector()
{
- addStartNpc(ROSALIA);
- addFirstTalkId(ROSALIA);
- addTalkId(ROSALIA);
}
- @Override
- public String onAdvEvent(String event, Npc npc, PlayerInstance player)
+ @RegisterEvent(EventType.ON_PLAYER_LOGIN)
+ @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
+ public void onPlayerLogin(OnPlayerLogin event)
{
- String htmltext = null;
- switch (event)
+ if (!isEventPeriod())
{
- case "9000-1.htm":
- case "9000-2.htm":
- {
- htmltext = event;
- break;
- }
- case "lineage":
- {
- if ((getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, A) >= 1) && //
- (getQuestItemsCount(player, G) >= 1) && //
- (getQuestItemsCount(player, II) >= 1))
- {
- takeItems(player, L, 1);
- takeItems(player, I, 1);
- takeItems(player, N, 1);
- takeItems(player, E, 2);
- takeItems(player, A, 1);
- takeItems(player, G, 1);
- takeItems(player, II, 1);
- giveItems(player, LINEAGEII, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "memories":
- {
- if ((getQuestItemsCount(player, M) >= 2) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, S) >= 1))
- {
- takeItems(player, M, 2);
- takeItems(player, E, 2);
- takeItems(player, O, 1);
- takeItems(player, R, 1);
- takeItems(player, I, 1);
- takeItems(player, S, 1);
- giveItems(player, MEMMORIES, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "chronicle":
- {
- if ((getQuestItemsCount(player, C) >= 2) && //
- (getQuestItemsCount(player, H) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, E) >= 1))
- {
- takeItems(player, C, 2);
- takeItems(player, H, 1);
- takeItems(player, R, 1);
- takeItems(player, O, 1);
- takeItems(player, N, 1);
- takeItems(player, I, 1);
- takeItems(player, L, 1);
- takeItems(player, E, 1);
- giveItems(player, CHRONICLE, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "exchangeA":
- {
- if (getQuestItemsCount(player, A) >= 2)
- {
- takeItems(player, A, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeC":
- {
- if (getQuestItemsCount(player, C) >= 2)
- {
- takeItems(player, C, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeE":
- {
- if (getQuestItemsCount(player, E) >= 2)
- {
- takeItems(player, E, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeG":
- {
- if (getQuestItemsCount(player, G) >= 2)
- {
- takeItems(player, G, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeI":
- {
- if (getQuestItemsCount(player, I) >= 2)
- {
- takeItems(player, I, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeL":
- {
- if (getQuestItemsCount(player, L) >= 2)
- {
- takeItems(player, L, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeM":
- {
- if (getQuestItemsCount(player, M) >= 2)
- {
- takeItems(player, M, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeN":
- {
- if (getQuestItemsCount(player, N) >= 2)
- {
- takeItems(player, N, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeO":
- {
- if (getQuestItemsCount(player, O) >= 2)
- {
- takeItems(player, O, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeR":
- {
- if (getQuestItemsCount(player, R) >= 2)
- {
- takeItems(player, R, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeH":
- {
- if (getQuestItemsCount(player, H) >= 1)
- {
- takeItems(player, H, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeS":
- {
- if (getQuestItemsCount(player, S) >= 1)
- {
- takeItems(player, S, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeII":
- {
- if (getQuestItemsCount(player, II) >= 1)
- {
- takeItems(player, II, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
+ return;
+ }
+
+ final PlayerInstance player = event.getPlayer();
+ if (player != null)
+ {
+ player.sendPacket(ExLetterCollectorUI.STATIC_PACKET);
}
- return htmltext;
- }
-
- @Override
- public String onFirstTalk(Npc npc, PlayerInstance player)
- {
- return npc.getId() + "-1.htm";
}
public static void main(String[] args)
{
new LetterCollector();
}
-}
\ No newline at end of file
+}
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/config.xml b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/config.xml
index 41a0a04956..9c4ce3483e 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/config.xml
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/config.xml
@@ -1,37 +1,26 @@
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItem.htm b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItem.htm
deleted file mode 100644
index 65916fd0cf..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItem.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you'll need more letters to play.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
deleted file mode 100644
index f18782aa1e..0000000000
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you do not have enough letters to exchange!.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index 138a2c652e..2afb87384d 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -544,7 +544,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_PVP_BOOK_LIST(0x18D, ExPvpBookList::new, ConnectionState.IN_GAME),
EX_PVPBOOK_KILLER_LOCATION(0x18E, null, ConnectionState.IN_GAME),
EX_PVPBOOK_TELEPORT_TO_KILLER(0x18F, null, ConnectionState.IN_GAME),
- EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, null, ConnectionState.IN_GAME),
+ EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, ExLetterCollectorTakeReward::new, ConnectionState.IN_GAME),
EX_SET_STATUS_BONUS(0x191, ExSetStatusBonus::new, ConnectionState.IN_GAME),
EX_RESET_STATUS_BONUS(0x192, ExResetStatusBonus::new, ConnectionState.IN_GAME),
EX_OLYMPIAD_MY_RANKING_INFO(0x193, RequestOlympiadMyRankingInfo::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
new file mode 100644
index 0000000000..0a8bdcc991
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
@@ -0,0 +1,257 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
+import org.l2jmobius.gameserver.network.GameClient;
+
+/**
+ * @author Index, Mobius
+ */
+public class ExLetterCollectorTakeReward implements IClientIncomingPacket
+{
+ // Items
+ private static final int A = 3875;
+ private static final int E = 3877;
+ private static final int G = 3879;
+ private static final int I = 3881;
+ private static final int L = 3882;
+ private static final int N = 3883;
+ private static final int R = 3885;
+ private static final int M = 34956;
+ private static final int S = 3886;
+ private static final int T = 3886;
+ private static final int H = 3880;
+ private static final int II = 3888;
+ private static final int D = 92021;
+ private static final int K = 93412;
+ private static final int U = 93413;
+
+ // Rewards
+ private static final ItemChanceHolder[] LINEAGE_II_REWARDS =
+ {
+ new ItemChanceHolder(49683, 5, 1), // Talisman of Baium
+ new ItemChanceHolder(91119, 5, 1), // Ignis' Necklace
+ new ItemChanceHolder(91117, 5, 1), // Nebula's Necklace
+ new ItemChanceHolder(91121, 5, 1), // Procella's Necklace
+ new ItemChanceHolder(91123, 5, 1), // Petram's Necklace
+ new ItemChanceHolder(91952, 5, 1), // Ring of Insolance
+ new ItemChanceHolder(91953, 5, 1), // Dragon Valley's Earring
+ new ItemChanceHolder(91035, 15, 1), // Water Spirit Ore
+ new ItemChanceHolder(91036, 15, 1), // Fire Spirit Ore
+ new ItemChanceHolder(91037, 15, 1), // Wind Spirit Ore
+ new ItemChanceHolder(91038, 15, 1), // Earth Spirit Ore
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] DEATH_REWARDS =
+ {
+ new ItemChanceHolder(91012, 5, 1), // Top-grade A-grade Weapon Pack
+ new ItemChanceHolder(93459, 5, 1), // A-grade Armor Pack - Majestic Equipment
+ new ItemChanceHolder(93460, 5, 1), // A-grade Armor Pack - Equipment of Nightmare
+ new ItemChanceHolder(93461, 5, 1), // A-grade Armor Pack - Tallum Equipment
+ new ItemChanceHolder(93462, 5, 1), // A-grade Armor Pack - Dark Crystal Equipment
+ new ItemChanceHolder(90015, 15, 1), // Top-grade Life Stone - Weapon
+ new ItemChanceHolder(93100, 15, 1), // Mid-grade Life Stone Shield / Sigil
+ new ItemChanceHolder(91938, 15, 1), // Primeval Isle's Time Stone
+ new ItemChanceHolder(93699, 15, 1), // Charging Stone of Random Crafting - 1 charge
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] KNIGHT_REWARDS =
+ {
+ new ItemChanceHolder(93103, 5, 1), // Spellbook: Divine Beam
+ new ItemChanceHolder(92401, 5, 1), // Spellbook: White Guardian
+ new ItemChanceHolder(91945, 5, 1), // Book of Shadows
+ new ItemChanceHolder(91944, 5, 1), // Book of Light
+ new ItemChanceHolder(91943, 15, 1), // Crystal of Shadows
+ new ItemChanceHolder(91942, 15, 1), // Crystal of Light
+ new ItemChanceHolder(8619, 15, 1), // Buff Expansion Book Lv. 2
+ new ItemChanceHolder(8620, 15, 1), // Buff Expansion Book Lv. 3
+ new ItemChanceHolder(90045, 15, 1), // Magical Tablet
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] SUMMER_REWARDS =
+ {
+ new ItemChanceHolder(93976, 5, 1), // Blessed Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(93977, 5, 1), // Blessed Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(729, 5, 1), // Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(730, 5, 1), // Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(947, 15, 1), // Scroll: Enchant B-grade Weapon
+ new ItemChanceHolder(948, 15, 1), // Scroll: Enchant B-grade Armor
+ new ItemChanceHolder(91967, 15, 1), // Scroll: Enchant Dragon Valley's Earring
+ new ItemChanceHolder(91966, 15, 1), // Scroll: Enchant Ring of Insolance
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(91780, 30, 1), // Battle Scroll
+ new ItemChanceHolder(93486, 30, 1), // Combat Scroll
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(1538, 30, 1), // Improved Scroll of Escape
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+
+ private int _wordId;
+
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ _wordId = packet.readD();
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final PlayerInventory inventory = player.getInventory();
+ if (inventory == null)
+ {
+ return;
+ }
+
+ switch (_wordId)
+ {
+ case 0:
+ {
+ if ((inventory.getInventoryItemCount(L, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 2) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(II, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", L, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", II, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(LINEAGE_II_REWARDS), player, true);
+ break;
+ }
+ case 1:
+ {
+ if ((inventory.getInventoryItemCount(D, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", D, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(DEATH_REWARDS), player, true);
+ break;
+ }
+ case 2:
+ {
+ if ((inventory.getInventoryItemCount(K, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", K, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(KNIGHT_REWARDS), player, true);
+ break;
+ }
+ case 3:
+ {
+ if ((inventory.getInventoryItemCount(S, -1) < 1) || //
+ (inventory.getInventoryItemCount(U, -1) < 1) || //
+ (inventory.getInventoryItemCount(M, -1) < 2) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(R, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", S, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", U, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", R, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(SUMMER_REWARDS), player, true);
+ break;
+ }
+ }
+ }
+
+ private ItemChanceHolder getRandomReward(ItemChanceHolder[] rewards)
+ {
+ ItemChanceHolder reward = null;
+ while (reward == null)
+ {
+ final ItemChanceHolder random = rewards[Rnd.get(rewards.length)];
+ if ((Rnd.get(100) < random.getChance()) && (ItemTable.getInstance().getTemplate(random.getId()) != null))
+ {
+ reward = random;
+ }
+ }
+ return reward;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
new file mode 100644
index 0000000000..1f6701e6dc
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+
+/**
+ * @author Index
+ */
+public class ExLetterCollectorUI implements IClientOutgoingPacket
+{
+ public static final ExLetterCollectorUI STATIC_PACKET = new ExLetterCollectorUI();
+
+ private static final int LETTER_COLLECTOR_MIN_LEVEL = 5;
+
+ private ExLetterCollectorUI()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_LETTER_COLLECTOR_UI_LAUNCHER.writeId(packet);
+ packet.writeC(0x01); // enabled (0x00 - no, 0x01 -yes)
+ packet.writeD(LETTER_COLLECTOR_MIN_LEVEL); // Minimum Level
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-1.htm b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-1.htm
deleted file mode 100644
index eb301506d6..0000000000
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-1.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-Letter Collector Rosalia:
-I'm glad to see you, adventurer!
-Do you want to claim reward for collecting the words LINEAGE II, MEMORIES, or CHRONICLE?
-You can make these words from the letters you get while hunting the monsters in Lineage II world.
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-2.htm b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-2.htm
deleted file mode 100644
index 0969500e70..0000000000
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/9000-2.htm
+++ /dev/null
@@ -1,17 +0,0 @@
-Letter Collector Rosalia:
-I can exchange two of your letters for one of random letters. In case with the rare S, H and the number II, you'll will need only one item for exchange. Press the button below when're you ready!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/LetterCollector.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
index 069cc2cef6..89451e9425 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
@@ -16,346 +16,42 @@
*/
package events.LetterCollector;
-import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
+import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.quest.LongTimeEvent;
+import org.l2jmobius.gameserver.network.serverpackets.ExLetterCollectorUI;
/**
- * Event: Letter Collector
- * @URL https://eu.4gameforum.com/threads/648400/
- * @author Mobius, Gigi, Adapted for Classic by QuangNguyen
+ * @author Mobius
*/
public class LetterCollector extends LongTimeEvent
{
- // NPC
- private static final int ROSALIA = 9000;
- // Items
- private static final int A = 3875;
- private static final int C = 3876;
- private static final int E = 3877;
- private static final int G = 3879;
- private static final int I = 3881;
- private static final int L = 3882;
- private static final int N = 3883;
- private static final int R = 3885;
- private static final int M = 34956;
- private static final int O = 3884;
- private static final int S = 3886;
- private static final int H = 3880;
- private static final int II = 3888;
- // Exchange Letters
- private static final int[] LETTERS =
- {
- A,
- C,
- E,
- G,
- I,
- L,
- N,
- R,
- M,
- O,
- S,
- H,
- II
- };
- // Reward
- private static final int LINEAGEII = 29581;
- private static final int MEMMORIES = 29583;
- private static final int CHRONICLE = 29582;
-
private LetterCollector()
{
- addStartNpc(ROSALIA);
- addFirstTalkId(ROSALIA);
- addTalkId(ROSALIA);
}
- @Override
- public String onAdvEvent(String event, Npc npc, PlayerInstance player)
+ @RegisterEvent(EventType.ON_PLAYER_LOGIN)
+ @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
+ public void onPlayerLogin(OnPlayerLogin event)
{
- String htmltext = null;
- switch (event)
+ if (!isEventPeriod())
{
- case "9000-1.htm":
- case "9000-2.htm":
- {
- htmltext = event;
- break;
- }
- case "lineage":
- {
- if ((getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, A) >= 1) && //
- (getQuestItemsCount(player, G) >= 1) && //
- (getQuestItemsCount(player, II) >= 1))
- {
- takeItems(player, L, 1);
- takeItems(player, I, 1);
- takeItems(player, N, 1);
- takeItems(player, E, 2);
- takeItems(player, A, 1);
- takeItems(player, G, 1);
- takeItems(player, II, 1);
- giveItems(player, LINEAGEII, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "memories":
- {
- if ((getQuestItemsCount(player, M) >= 2) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, S) >= 1))
- {
- takeItems(player, M, 2);
- takeItems(player, E, 2);
- takeItems(player, O, 1);
- takeItems(player, R, 1);
- takeItems(player, I, 1);
- takeItems(player, S, 1);
- giveItems(player, MEMMORIES, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "chronicle":
- {
- if ((getQuestItemsCount(player, C) >= 2) && //
- (getQuestItemsCount(player, H) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, E) >= 1))
- {
- takeItems(player, C, 2);
- takeItems(player, H, 1);
- takeItems(player, R, 1);
- takeItems(player, O, 1);
- takeItems(player, N, 1);
- takeItems(player, I, 1);
- takeItems(player, L, 1);
- takeItems(player, E, 1);
- giveItems(player, CHRONICLE, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "exchangeA":
- {
- if (getQuestItemsCount(player, A) >= 2)
- {
- takeItems(player, A, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeC":
- {
- if (getQuestItemsCount(player, C) >= 2)
- {
- takeItems(player, C, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeE":
- {
- if (getQuestItemsCount(player, E) >= 2)
- {
- takeItems(player, E, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeG":
- {
- if (getQuestItemsCount(player, G) >= 2)
- {
- takeItems(player, G, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeI":
- {
- if (getQuestItemsCount(player, I) >= 2)
- {
- takeItems(player, I, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeL":
- {
- if (getQuestItemsCount(player, L) >= 2)
- {
- takeItems(player, L, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeM":
- {
- if (getQuestItemsCount(player, M) >= 2)
- {
- takeItems(player, M, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeN":
- {
- if (getQuestItemsCount(player, N) >= 2)
- {
- takeItems(player, N, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeO":
- {
- if (getQuestItemsCount(player, O) >= 2)
- {
- takeItems(player, O, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeR":
- {
- if (getQuestItemsCount(player, R) >= 2)
- {
- takeItems(player, R, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeH":
- {
- if (getQuestItemsCount(player, H) >= 1)
- {
- takeItems(player, H, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeS":
- {
- if (getQuestItemsCount(player, S) >= 1)
- {
- takeItems(player, S, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeII":
- {
- if (getQuestItemsCount(player, II) >= 1)
- {
- takeItems(player, II, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
+ return;
+ }
+
+ final PlayerInstance player = event.getPlayer();
+ if (player != null)
+ {
+ player.sendPacket(ExLetterCollectorUI.STATIC_PACKET);
}
- return htmltext;
- }
-
- @Override
- public String onFirstTalk(Npc npc, PlayerInstance player)
- {
- return npc.getId() + "-1.htm";
}
public static void main(String[] args)
{
new LetterCollector();
}
-}
\ No newline at end of file
+}
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/config.xml b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/config.xml
index 41a0a04956..9c4ce3483e 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/config.xml
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/config.xml
@@ -1,37 +1,26 @@
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItem.htm b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItem.htm
deleted file mode 100644
index 65916fd0cf..0000000000
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItem.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you'll need more letters to play.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
deleted file mode 100644
index f18782aa1e..0000000000
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you do not have enough letters to exchange!.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index d771a02bf5..49d1bb563f 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -567,7 +567,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_PVP_BOOK_LIST(0x18D, ExPvpBookList::new, ConnectionState.IN_GAME),
EX_PVPBOOK_KILLER_LOCATION(0x18E, null, ConnectionState.IN_GAME),
EX_PVPBOOK_TELEPORT_TO_KILLER(0x18F, null, ConnectionState.IN_GAME),
- EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, null, ConnectionState.IN_GAME),
+ EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, ExLetterCollectorTakeReward::new, ConnectionState.IN_GAME),
EX_SET_STATUS_BONUS(0x191, ExSetStatusBonus::new, ConnectionState.IN_GAME),
EX_RESET_STATUS_BONUS(0x192, ExResetStatusBonus::new, ConnectionState.IN_GAME),
EX_OLYMPIAD_MY_RANKING_INFO(0x193, RequestOlympiadMyRankingInfo::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
new file mode 100644
index 0000000000..0a8bdcc991
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
@@ -0,0 +1,257 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
+import org.l2jmobius.gameserver.network.GameClient;
+
+/**
+ * @author Index, Mobius
+ */
+public class ExLetterCollectorTakeReward implements IClientIncomingPacket
+{
+ // Items
+ private static final int A = 3875;
+ private static final int E = 3877;
+ private static final int G = 3879;
+ private static final int I = 3881;
+ private static final int L = 3882;
+ private static final int N = 3883;
+ private static final int R = 3885;
+ private static final int M = 34956;
+ private static final int S = 3886;
+ private static final int T = 3886;
+ private static final int H = 3880;
+ private static final int II = 3888;
+ private static final int D = 92021;
+ private static final int K = 93412;
+ private static final int U = 93413;
+
+ // Rewards
+ private static final ItemChanceHolder[] LINEAGE_II_REWARDS =
+ {
+ new ItemChanceHolder(49683, 5, 1), // Talisman of Baium
+ new ItemChanceHolder(91119, 5, 1), // Ignis' Necklace
+ new ItemChanceHolder(91117, 5, 1), // Nebula's Necklace
+ new ItemChanceHolder(91121, 5, 1), // Procella's Necklace
+ new ItemChanceHolder(91123, 5, 1), // Petram's Necklace
+ new ItemChanceHolder(91952, 5, 1), // Ring of Insolance
+ new ItemChanceHolder(91953, 5, 1), // Dragon Valley's Earring
+ new ItemChanceHolder(91035, 15, 1), // Water Spirit Ore
+ new ItemChanceHolder(91036, 15, 1), // Fire Spirit Ore
+ new ItemChanceHolder(91037, 15, 1), // Wind Spirit Ore
+ new ItemChanceHolder(91038, 15, 1), // Earth Spirit Ore
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] DEATH_REWARDS =
+ {
+ new ItemChanceHolder(91012, 5, 1), // Top-grade A-grade Weapon Pack
+ new ItemChanceHolder(93459, 5, 1), // A-grade Armor Pack - Majestic Equipment
+ new ItemChanceHolder(93460, 5, 1), // A-grade Armor Pack - Equipment of Nightmare
+ new ItemChanceHolder(93461, 5, 1), // A-grade Armor Pack - Tallum Equipment
+ new ItemChanceHolder(93462, 5, 1), // A-grade Armor Pack - Dark Crystal Equipment
+ new ItemChanceHolder(90015, 15, 1), // Top-grade Life Stone - Weapon
+ new ItemChanceHolder(93100, 15, 1), // Mid-grade Life Stone Shield / Sigil
+ new ItemChanceHolder(91938, 15, 1), // Primeval Isle's Time Stone
+ new ItemChanceHolder(93699, 15, 1), // Charging Stone of Random Crafting - 1 charge
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] KNIGHT_REWARDS =
+ {
+ new ItemChanceHolder(93103, 5, 1), // Spellbook: Divine Beam
+ new ItemChanceHolder(92401, 5, 1), // Spellbook: White Guardian
+ new ItemChanceHolder(91945, 5, 1), // Book of Shadows
+ new ItemChanceHolder(91944, 5, 1), // Book of Light
+ new ItemChanceHolder(91943, 15, 1), // Crystal of Shadows
+ new ItemChanceHolder(91942, 15, 1), // Crystal of Light
+ new ItemChanceHolder(8619, 15, 1), // Buff Expansion Book Lv. 2
+ new ItemChanceHolder(8620, 15, 1), // Buff Expansion Book Lv. 3
+ new ItemChanceHolder(90045, 15, 1), // Magical Tablet
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] SUMMER_REWARDS =
+ {
+ new ItemChanceHolder(93976, 5, 1), // Blessed Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(93977, 5, 1), // Blessed Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(729, 5, 1), // Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(730, 5, 1), // Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(947, 15, 1), // Scroll: Enchant B-grade Weapon
+ new ItemChanceHolder(948, 15, 1), // Scroll: Enchant B-grade Armor
+ new ItemChanceHolder(91967, 15, 1), // Scroll: Enchant Dragon Valley's Earring
+ new ItemChanceHolder(91966, 15, 1), // Scroll: Enchant Ring of Insolance
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(91780, 30, 1), // Battle Scroll
+ new ItemChanceHolder(93486, 30, 1), // Combat Scroll
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(1538, 30, 1), // Improved Scroll of Escape
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+
+ private int _wordId;
+
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ _wordId = packet.readD();
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final PlayerInventory inventory = player.getInventory();
+ if (inventory == null)
+ {
+ return;
+ }
+
+ switch (_wordId)
+ {
+ case 0:
+ {
+ if ((inventory.getInventoryItemCount(L, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 2) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(II, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", L, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", II, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(LINEAGE_II_REWARDS), player, true);
+ break;
+ }
+ case 1:
+ {
+ if ((inventory.getInventoryItemCount(D, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", D, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(DEATH_REWARDS), player, true);
+ break;
+ }
+ case 2:
+ {
+ if ((inventory.getInventoryItemCount(K, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", K, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(KNIGHT_REWARDS), player, true);
+ break;
+ }
+ case 3:
+ {
+ if ((inventory.getInventoryItemCount(S, -1) < 1) || //
+ (inventory.getInventoryItemCount(U, -1) < 1) || //
+ (inventory.getInventoryItemCount(M, -1) < 2) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(R, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", S, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", U, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", R, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(SUMMER_REWARDS), player, true);
+ break;
+ }
+ }
+ }
+
+ private ItemChanceHolder getRandomReward(ItemChanceHolder[] rewards)
+ {
+ ItemChanceHolder reward = null;
+ while (reward == null)
+ {
+ final ItemChanceHolder random = rewards[Rnd.get(rewards.length)];
+ if ((Rnd.get(100) < random.getChance()) && (ItemTable.getInstance().getTemplate(random.getId()) != null))
+ {
+ reward = random;
+ }
+ }
+ return reward;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
new file mode 100644
index 0000000000..1f6701e6dc
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+
+/**
+ * @author Index
+ */
+public class ExLetterCollectorUI implements IClientOutgoingPacket
+{
+ public static final ExLetterCollectorUI STATIC_PACKET = new ExLetterCollectorUI();
+
+ private static final int LETTER_COLLECTOR_MIN_LEVEL = 5;
+
+ private ExLetterCollectorUI()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_LETTER_COLLECTOR_UI_LAUNCHER.writeId(packet);
+ packet.writeC(0x01); // enabled (0x00 - no, 0x01 -yes)
+ packet.writeD(LETTER_COLLECTOR_MIN_LEVEL); // Minimum Level
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-1.htm b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-1.htm
deleted file mode 100644
index eb301506d6..0000000000
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-1.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-Letter Collector Rosalia:
-I'm glad to see you, adventurer!
-Do you want to claim reward for collecting the words LINEAGE II, MEMORIES, or CHRONICLE?
-You can make these words from the letters you get while hunting the monsters in Lineage II world.
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-2.htm b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-2.htm
deleted file mode 100644
index 0969500e70..0000000000
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/9000-2.htm
+++ /dev/null
@@ -1,17 +0,0 @@
-Letter Collector Rosalia:
-I can exchange two of your letters for one of random letters. In case with the rare S, H and the number II, you'll will need only one item for exchange. Press the button below when're you ready!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/LetterCollector.java b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
index 069cc2cef6..89451e9425 100644
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
+++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/LetterCollector.java
@@ -16,346 +16,42 @@
*/
package events.LetterCollector;
-import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
+import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
+import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.quest.LongTimeEvent;
+import org.l2jmobius.gameserver.network.serverpackets.ExLetterCollectorUI;
/**
- * Event: Letter Collector
- * @URL https://eu.4gameforum.com/threads/648400/
- * @author Mobius, Gigi, Adapted for Classic by QuangNguyen
+ * @author Mobius
*/
public class LetterCollector extends LongTimeEvent
{
- // NPC
- private static final int ROSALIA = 9000;
- // Items
- private static final int A = 3875;
- private static final int C = 3876;
- private static final int E = 3877;
- private static final int G = 3879;
- private static final int I = 3881;
- private static final int L = 3882;
- private static final int N = 3883;
- private static final int R = 3885;
- private static final int M = 34956;
- private static final int O = 3884;
- private static final int S = 3886;
- private static final int H = 3880;
- private static final int II = 3888;
- // Exchange Letters
- private static final int[] LETTERS =
- {
- A,
- C,
- E,
- G,
- I,
- L,
- N,
- R,
- M,
- O,
- S,
- H,
- II
- };
- // Reward
- private static final int LINEAGEII = 29581;
- private static final int MEMMORIES = 29583;
- private static final int CHRONICLE = 29582;
-
private LetterCollector()
{
- addStartNpc(ROSALIA);
- addFirstTalkId(ROSALIA);
- addTalkId(ROSALIA);
}
- @Override
- public String onAdvEvent(String event, Npc npc, PlayerInstance player)
+ @RegisterEvent(EventType.ON_PLAYER_LOGIN)
+ @RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
+ public void onPlayerLogin(OnPlayerLogin event)
{
- String htmltext = null;
- switch (event)
+ if (!isEventPeriod())
{
- case "9000-1.htm":
- case "9000-2.htm":
- {
- htmltext = event;
- break;
- }
- case "lineage":
- {
- if ((getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, A) >= 1) && //
- (getQuestItemsCount(player, G) >= 1) && //
- (getQuestItemsCount(player, II) >= 1))
- {
- takeItems(player, L, 1);
- takeItems(player, I, 1);
- takeItems(player, N, 1);
- takeItems(player, E, 2);
- takeItems(player, A, 1);
- takeItems(player, G, 1);
- takeItems(player, II, 1);
- giveItems(player, LINEAGEII, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "memories":
- {
- if ((getQuestItemsCount(player, M) >= 2) && //
- (getQuestItemsCount(player, E) >= 2) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, S) >= 1))
- {
- takeItems(player, M, 2);
- takeItems(player, E, 2);
- takeItems(player, O, 1);
- takeItems(player, R, 1);
- takeItems(player, I, 1);
- takeItems(player, S, 1);
- giveItems(player, MEMMORIES, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "chronicle":
- {
- if ((getQuestItemsCount(player, C) >= 2) && //
- (getQuestItemsCount(player, H) >= 1) && //
- (getQuestItemsCount(player, R) >= 1) && //
- (getQuestItemsCount(player, O) >= 1) && //
- (getQuestItemsCount(player, N) >= 1) && //
- (getQuestItemsCount(player, I) >= 1) && //
- (getQuestItemsCount(player, L) >= 1) && //
- (getQuestItemsCount(player, E) >= 1))
- {
- takeItems(player, C, 2);
- takeItems(player, H, 1);
- takeItems(player, R, 1);
- takeItems(player, O, 1);
- takeItems(player, N, 1);
- takeItems(player, I, 1);
- takeItems(player, L, 1);
- takeItems(player, E, 1);
- giveItems(player, CHRONICLE, 1);
- htmltext = "9000-1.htm";
- }
- else
- {
- htmltext = "noItem.htm";
- }
- break;
- }
- case "exchangeA":
- {
- if (getQuestItemsCount(player, A) >= 2)
- {
- takeItems(player, A, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeC":
- {
- if (getQuestItemsCount(player, C) >= 2)
- {
- takeItems(player, C, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeE":
- {
- if (getQuestItemsCount(player, E) >= 2)
- {
- takeItems(player, E, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeG":
- {
- if (getQuestItemsCount(player, G) >= 2)
- {
- takeItems(player, G, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeI":
- {
- if (getQuestItemsCount(player, I) >= 2)
- {
- takeItems(player, I, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeL":
- {
- if (getQuestItemsCount(player, L) >= 2)
- {
- takeItems(player, L, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeM":
- {
- if (getQuestItemsCount(player, M) >= 2)
- {
- takeItems(player, M, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeN":
- {
- if (getQuestItemsCount(player, N) >= 2)
- {
- takeItems(player, N, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeO":
- {
- if (getQuestItemsCount(player, O) >= 2)
- {
- takeItems(player, O, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeR":
- {
- if (getQuestItemsCount(player, R) >= 2)
- {
- takeItems(player, R, 2);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeH":
- {
- if (getQuestItemsCount(player, H) >= 1)
- {
- takeItems(player, H, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeS":
- {
- if (getQuestItemsCount(player, S) >= 1)
- {
- takeItems(player, S, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
- case "exchangeII":
- {
- if (getQuestItemsCount(player, II) >= 1)
- {
- takeItems(player, II, 1);
- giveItems(player, getRandomEntry(LETTERS), 1);
- htmltext = "9000-2.htm";
- }
- else
- {
- htmltext = "noItemExchange.htm";
- }
- break;
- }
+ return;
+ }
+
+ final PlayerInstance player = event.getPlayer();
+ if (player != null)
+ {
+ player.sendPacket(ExLetterCollectorUI.STATIC_PACKET);
}
- return htmltext;
- }
-
- @Override
- public String onFirstTalk(Npc npc, PlayerInstance player)
- {
- return npc.getId() + "-1.htm";
}
public static void main(String[] args)
{
new LetterCollector();
}
-}
\ No newline at end of file
+}
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/config.xml b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/config.xml
index 41a0a04956..9c4ce3483e 100644
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/config.xml
+++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/config.xml
@@ -1,37 +1,26 @@
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItem.htm b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItem.htm
deleted file mode 100644
index 65916fd0cf..0000000000
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItem.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you'll need more letters to play.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
deleted file mode 100644
index f18782aa1e..0000000000
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/scripts/events/LetterCollector/noItemExchange.htm
+++ /dev/null
@@ -1,4 +0,0 @@
-Letter Collector Rosalia:
-I'm sorry, but you do not have enough letters to exchange!.
-
-
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index c35149a883..d4759225e3 100644
--- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -567,7 +567,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_PVP_BOOK_LIST(0x18D, ExPvpBookList::new, ConnectionState.IN_GAME),
EX_PVPBOOK_KILLER_LOCATION(0x18E, null, ConnectionState.IN_GAME),
EX_PVPBOOK_TELEPORT_TO_KILLER(0x18F, null, ConnectionState.IN_GAME),
- EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, null, ConnectionState.IN_GAME),
+ EX_LETTER_COLLECTOR_TAKE_REWARD(0x190, ExLetterCollectorTakeReward::new, ConnectionState.IN_GAME),
EX_SET_STATUS_BONUS(0x191, ExSetStatusBonus::new, ConnectionState.IN_GAME),
EX_RESET_STATUS_BONUS(0x192, ExResetStatusBonus::new, ConnectionState.IN_GAME),
EX_OLYMPIAD_MY_RANKING_INFO(0x193, RequestOlympiadMyRankingInfo::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
new file mode 100644
index 0000000000..0a8bdcc991
--- /dev/null
+++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/ExLetterCollectorTakeReward.java
@@ -0,0 +1,257 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.data.ItemTable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
+import org.l2jmobius.gameserver.network.GameClient;
+
+/**
+ * @author Index, Mobius
+ */
+public class ExLetterCollectorTakeReward implements IClientIncomingPacket
+{
+ // Items
+ private static final int A = 3875;
+ private static final int E = 3877;
+ private static final int G = 3879;
+ private static final int I = 3881;
+ private static final int L = 3882;
+ private static final int N = 3883;
+ private static final int R = 3885;
+ private static final int M = 34956;
+ private static final int S = 3886;
+ private static final int T = 3886;
+ private static final int H = 3880;
+ private static final int II = 3888;
+ private static final int D = 92021;
+ private static final int K = 93412;
+ private static final int U = 93413;
+
+ // Rewards
+ private static final ItemChanceHolder[] LINEAGE_II_REWARDS =
+ {
+ new ItemChanceHolder(49683, 5, 1), // Talisman of Baium
+ new ItemChanceHolder(91119, 5, 1), // Ignis' Necklace
+ new ItemChanceHolder(91117, 5, 1), // Nebula's Necklace
+ new ItemChanceHolder(91121, 5, 1), // Procella's Necklace
+ new ItemChanceHolder(91123, 5, 1), // Petram's Necklace
+ new ItemChanceHolder(91952, 5, 1), // Ring of Insolance
+ new ItemChanceHolder(91953, 5, 1), // Dragon Valley's Earring
+ new ItemChanceHolder(91035, 15, 1), // Water Spirit Ore
+ new ItemChanceHolder(91036, 15, 1), // Fire Spirit Ore
+ new ItemChanceHolder(91037, 15, 1), // Wind Spirit Ore
+ new ItemChanceHolder(91038, 15, 1), // Earth Spirit Ore
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] DEATH_REWARDS =
+ {
+ new ItemChanceHolder(91012, 5, 1), // Top-grade A-grade Weapon Pack
+ new ItemChanceHolder(93459, 5, 1), // A-grade Armor Pack - Majestic Equipment
+ new ItemChanceHolder(93460, 5, 1), // A-grade Armor Pack - Equipment of Nightmare
+ new ItemChanceHolder(93461, 5, 1), // A-grade Armor Pack - Tallum Equipment
+ new ItemChanceHolder(93462, 5, 1), // A-grade Armor Pack - Dark Crystal Equipment
+ new ItemChanceHolder(90015, 15, 1), // Top-grade Life Stone - Weapon
+ new ItemChanceHolder(93100, 15, 1), // Mid-grade Life Stone Shield / Sigil
+ new ItemChanceHolder(91938, 15, 1), // Primeval Isle's Time Stone
+ new ItemChanceHolder(93699, 15, 1), // Charging Stone of Random Crafting - 1 charge
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] KNIGHT_REWARDS =
+ {
+ new ItemChanceHolder(93103, 5, 1), // Spellbook: Divine Beam
+ new ItemChanceHolder(92401, 5, 1), // Spellbook: White Guardian
+ new ItemChanceHolder(91945, 5, 1), // Book of Shadows
+ new ItemChanceHolder(91944, 5, 1), // Book of Light
+ new ItemChanceHolder(91943, 15, 1), // Crystal of Shadows
+ new ItemChanceHolder(91942, 15, 1), // Crystal of Light
+ new ItemChanceHolder(8619, 15, 1), // Buff Expansion Book Lv. 2
+ new ItemChanceHolder(8620, 15, 1), // Buff Expansion Book Lv. 3
+ new ItemChanceHolder(90045, 15, 1), // Magical Tablet
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+ private static final ItemChanceHolder[] SUMMER_REWARDS =
+ {
+ new ItemChanceHolder(93976, 5, 1), // Blessed Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(93977, 5, 1), // Blessed Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(729, 5, 1), // Scroll: Enchant A-grade Weapon
+ new ItemChanceHolder(730, 5, 1), // Scroll: Enchant A-grade Armor
+ new ItemChanceHolder(947, 15, 1), // Scroll: Enchant B-grade Weapon
+ new ItemChanceHolder(948, 15, 1), // Scroll: Enchant B-grade Armor
+ new ItemChanceHolder(91967, 15, 1), // Scroll: Enchant Dragon Valley's Earring
+ new ItemChanceHolder(91966, 15, 1), // Scroll: Enchant Ring of Insolance
+ new ItemChanceHolder(91641, 30, 1), // Sayha's Blessing
+ new ItemChanceHolder(91780, 30, 1), // Battle Scroll
+ new ItemChanceHolder(93486, 30, 1), // Combat Scroll
+ new ItemChanceHolder(49674, 30, 1), // XP Growth Scroll
+ new ItemChanceHolder(90907, 30, 5), // Soulshot Ticket
+ new ItemChanceHolder(1538, 30, 1), // Improved Scroll of Escape
+ new ItemChanceHolder(91757, 30, 1), // Magic Lamp Charging Potion
+ new ItemChanceHolder(91974, 30, 10), // HP Recovery Potion
+ new ItemChanceHolder(3031, 30, 10), // Spirit Ore
+ };
+
+ private int _wordId;
+
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ _wordId = packet.readD();
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final PlayerInventory inventory = player.getInventory();
+ if (inventory == null)
+ {
+ return;
+ }
+
+ switch (_wordId)
+ {
+ case 0:
+ {
+ if ((inventory.getInventoryItemCount(L, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 2) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(II, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", L, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", II, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(LINEAGE_II_REWARDS), player, true);
+ break;
+ }
+ case 1:
+ {
+ if ((inventory.getInventoryItemCount(D, -1) < 1) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(A, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", D, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", A, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(DEATH_REWARDS), player, true);
+ break;
+ }
+ case 2:
+ {
+ if ((inventory.getInventoryItemCount(K, -1) < 1) || //
+ (inventory.getInventoryItemCount(N, -1) < 1) || //
+ (inventory.getInventoryItemCount(I, -1) < 1) || //
+ (inventory.getInventoryItemCount(G, -1) < 1) || //
+ (inventory.getInventoryItemCount(H, -1) < 1) || //
+ (inventory.getInventoryItemCount(T, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", K, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", N, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", I, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", G, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", H, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", T, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(KNIGHT_REWARDS), player, true);
+ break;
+ }
+ case 3:
+ {
+ if ((inventory.getInventoryItemCount(S, -1) < 1) || //
+ (inventory.getInventoryItemCount(U, -1) < 1) || //
+ (inventory.getInventoryItemCount(M, -1) < 2) || //
+ (inventory.getInventoryItemCount(E, -1) < 1) || //
+ (inventory.getInventoryItemCount(R, -1) < 1))
+ {
+ return;
+ }
+
+ player.destroyItemByItemId("LetterCollector", S, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", U, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", M, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", E, 1, player, true);
+ player.destroyItemByItemId("LetterCollector", R, 1, player, true);
+
+ player.addItem("LetterCollector", getRandomReward(SUMMER_REWARDS), player, true);
+ break;
+ }
+ }
+ }
+
+ private ItemChanceHolder getRandomReward(ItemChanceHolder[] rewards)
+ {
+ ItemChanceHolder reward = null;
+ while (reward == null)
+ {
+ final ItemChanceHolder random = rewards[Rnd.get(rewards.length)];
+ if ((Rnd.get(100) < random.getChance()) && (ItemTable.getInstance().getTemplate(random.getId()) != null))
+ {
+ reward = random;
+ }
+ }
+ return reward;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
new file mode 100644
index 0000000000..1f6701e6dc
--- /dev/null
+++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExLetterCollectorUI.java
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+
+/**
+ * @author Index
+ */
+public class ExLetterCollectorUI implements IClientOutgoingPacket
+{
+ public static final ExLetterCollectorUI STATIC_PACKET = new ExLetterCollectorUI();
+
+ private static final int LETTER_COLLECTOR_MIN_LEVEL = 5;
+
+ private ExLetterCollectorUI()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_LETTER_COLLECTOR_UI_LAUNCHER.writeId(packet);
+ packet.writeC(0x01); // enabled (0x00 - no, 0x01 -yes)
+ packet.writeD(LETTER_COLLECTOR_MIN_LEVEL); // Minimum Level
+ return true;
+ }
+}
\ No newline at end of file