From da3ac02e0179f6aa4cd41a62729dfef490a228b1 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 26 Apr 2022 22:30:15 +0000 Subject: [PATCH] Magic Lamp rework and adjustments. --- .../dist/game/config/MagicLamp.ini | 6 +- .../java/org/l2jmobius/Config.java | 10 +- .../magiclamp/ExMagicLampGameStart.java | 88 ++++++++++++++++- .../magiclamp/ExMagicLampGameInfoUI.java | 16 ++-- .../magiclamp/ExMagicLampGameResult.java | 94 +++---------------- .../dist/game/config/MagicLamp.ini | 6 +- .../java/org/l2jmobius/Config.java | 10 +- .../magiclamp/ExMagicLampGameStart.java | 88 ++++++++++++++++- .../magiclamp/ExMagicLampGameInfoUI.java | 16 ++-- .../magiclamp/ExMagicLampGameResult.java | 94 +++---------------- .../dist/game/config/MagicLamp.ini | 6 +- .../java/org/l2jmobius/Config.java | 10 +- .../magiclamp/ExMagicLampGameStart.java | 88 ++++++++++++++++- .../magiclamp/ExMagicLampGameInfoUI.java | 16 ++-- .../magiclamp/ExMagicLampGameResult.java | 94 +++---------------- .../dist/game/config/MagicLamp.ini | 6 +- .../java/org/l2jmobius/Config.java | 10 +- .../magiclamp/ExMagicLampGameStart.java | 88 ++++++++++++++++- .../magiclamp/ExMagicLampGameInfoUI.java | 16 ++-- .../magiclamp/ExMagicLampGameResult.java | 94 +++---------------- 20 files changed, 456 insertions(+), 400 deletions(-) diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/MagicLamp.ini b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/MagicLamp.ini index 44f690db22..321a0bae62 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/MagicLamp.ini +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/MagicLamp.ini @@ -6,9 +6,11 @@ MagicLampEnabled = False MagicLampMaxGames = 300 -MagicLampRewardCount = 1 +MagicLampConsumeCount = 5 -MagicLampGreaterRewardCount = 10 +MagicLampGreaterConsumeCount = 10 + +MagicLampGreaterSayhaConsumeCount = 5 MagicLampMaxLevelExp = 10000000 diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java index 446764a23e..143493036c 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java @@ -893,8 +893,9 @@ public class Config // Magic Lamp public static boolean ENABLE_MAGIC_LAMP; public static int MAGIC_LAMP_MAX_GAME_COUNT; - public static int MAGIC_LAMP_REWARD_COUNT; - public static int MAGIC_LAMP_GREATER_REWARD_COUNT; + public static int MAGIC_LAMP_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT; public static int MAGIC_LAMP_MAX_LEVEL_EXP; public static double MAGIC_LAMP_CHARGE_RATE; @@ -1927,8 +1928,9 @@ public class Config final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); - MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); - MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); + MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5); + MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10); + MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5); MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java index b6f02e7ec0..615c49d4b9 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java @@ -16,10 +16,24 @@ */ package org.l2jmobius.gameserver.network.clientpackets.magiclamp; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.gameserver.data.xml.MagicLampData; +import org.l2jmobius.gameserver.enums.LampMode; +import org.l2jmobius.gameserver.enums.LampType; import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; +import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult; /** @@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket @Override public boolean read(GameClient client, PacketReader packet) { - _count = packet.readD(); // nMagicLampGameCCount - _mode = (byte) packet.readC(); // cGameMode + _count = packet.readD(); // MagicLampGameCCount + _mode = (byte) packet.readC(); // GameMode return true; } @@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket return; } - client.sendPacket(new ExMagicLampGameResult(player, _count, _mode)); + final LampMode lampMode = LampMode.getByMode(_mode); + final int consume = calcConsume(lampMode, _count); + final int have = player.getLampCount(); + if (have >= consume) + { + final Map rewards = new HashMap<>(); + for (int x = _count; x > 0; x--) + { + final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == lampMode) && chance(lamp.getChance())).collect(Collectors.toList()); + final MagicLampDataHolder random = getRandom(available); + if (random != null) + { + rewards.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); + } + } + + // Consume. + player.setLampCount(have - consume); + if (lampMode == LampMode.GREATER) + { + player.destroyItemByItemId("Magic Lamp", 91641, Config.MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT * _count, player, true); + } + + // Reward. + rewards.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); + + // Update. + final int left = player.getLampCount(); + player.sendPacket(new ExMagicLampGameInfoUI(player, _mode, left > consume ? _count : left)); + player.sendPacket(new ExMagicLampExpInfoUI(player)); + player.sendPacket(new ExMagicLampGameResult(rewards.values())); + } + } + + private boolean chance(double chance) + { + return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); + } + + private E getRandom(List list) + { + if (list.isEmpty()) + { + return null; + } + if (list.size() == 1) + { + return list.get(0); + } + return list.get(Rnd.get(list.size())); + } + + private int calcConsume(LampMode mode, int count) + { + switch (mode) + { + case NORMAL: + { + return Config.MAGIC_LAMP_CONSUME_COUNT * count; + } + case GREATER: + { + return Config.MAGIC_LAMP_GREATER_CONSUME_COUNT * count; + } + default: + { + return 0; + } + } } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java index c7ff7789d9..962c294fb5 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java @@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); - packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount - packet.writeD(_count); // cMagicLampGameCCount - packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame - packet.writeD(_player.getLampCount()); // cMagicLampCount - packet.writeC(_mode); // cGameMode + packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount + packet.writeD(_count); // MagicLampGameCCount + packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame + packet.writeD(_player.getLampCount()); // MagicLampCount + packet.writeC(_mode); // GameMode final List greater = MagicLampData.getInstance().getGreaterLamps(); packet.writeD(greater.size()); // costItemList for (GreaterMagicLampHolder lamp : greater) { - packet.writeD(lamp.getItemId()); // nItemClassID - packet.writeQ(lamp.getCount()); // nItemAmountPerGame - packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount + packet.writeD(lamp.getItemId()); // ItemClassID + packet.writeQ(lamp.getCount()); // ItemAmountPerGame + packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount } return true; } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java index d44ded9d1a..7c9b802671 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java @@ -16,108 +16,36 @@ */ package org.l2jmobius.gameserver.network.serverpackets.magiclamp; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.Collection; -import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; -import org.l2jmobius.commons.util.Rnd; -import org.l2jmobius.gameserver.data.xml.MagicLampData; -import org.l2jmobius.gameserver.enums.LampMode; -import org.l2jmobius.gameserver.enums.LampType; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * @author L2CCCP + * @author Mobius */ public class ExMagicLampGameResult implements IClientOutgoingPacket { - private final Map _reward = new HashMap<>(); + private final Collection _rewards; - public ExMagicLampGameResult(Player player, int count, byte mode) + public ExMagicLampGameResult(Collection rewards) { - final LampMode type = LampMode.getByMode(mode); - final int consume = calcConsume(type, count); - final int have = player.getLampCount(); - if (have >= consume) - { - init(type, count); - player.setLampCount(have - consume); - _reward.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); - // update UI - final int left = player.getLampCount(); - player.sendPacket(new ExMagicLampGameInfoUI(player, mode, left > consume ? count : left)); // check left count for update UI - player.sendPacket(new ExMagicLampExpInfoUI(player)); - } - } - - private void init(LampMode mode, int count) - { - for (int x = count; x > 0; x--) - { - final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == mode) && chance(lamp.getChance())).collect(Collectors.toList()); - final MagicLampDataHolder random = getRandom(available); - if (random != null) - { - _reward.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); - } - } - } - - private boolean chance(double chance) - { - return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); - } - - private E getRandom(List list) - { - if (list.isEmpty()) - { - return null; - } - if (list.size() == 1) - { - return list.get(0); - } - return list.get(Rnd.get(list.size())); - } - - private int calcConsume(LampMode mode, int count) - { - switch (mode) - { - case NORMAL: - { - return Config.MAGIC_LAMP_REWARD_COUNT * count; - } - case GREATER: - { - return Config.MAGIC_LAMP_GREATER_REWARD_COUNT * count; - } - default: - { - return 0; - } - } + _rewards = rewards; } @Override public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); - packet.writeD(_reward.size()); // magicLampGameResult - for (MagicLampHolder lamp : _reward.values()) + packet.writeD(_rewards.size()); + for (MagicLampHolder lamp : _rewards) { - packet.writeC(lamp.getType().getGrade()); // cGradeNum - packet.writeD(lamp.getCount()); // nRewardCount - packet.writeQ(lamp.getExp()); // nEXP - packet.writeQ(lamp.getSp()); // nSP + packet.writeC(lamp.getType().getGrade()); + packet.writeD(lamp.getCount()); + packet.writeQ(lamp.getExp()); + packet.writeQ(lamp.getSp()); } return true; } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/MagicLamp.ini b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/MagicLamp.ini index 44f690db22..321a0bae62 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/MagicLamp.ini +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/MagicLamp.ini @@ -6,9 +6,11 @@ MagicLampEnabled = False MagicLampMaxGames = 300 -MagicLampRewardCount = 1 +MagicLampConsumeCount = 5 -MagicLampGreaterRewardCount = 10 +MagicLampGreaterConsumeCount = 10 + +MagicLampGreaterSayhaConsumeCount = 5 MagicLampMaxLevelExp = 10000000 diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java index 209f889089..3f512a9ebd 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java @@ -893,8 +893,9 @@ public class Config // Magic Lamp public static boolean ENABLE_MAGIC_LAMP; public static int MAGIC_LAMP_MAX_GAME_COUNT; - public static int MAGIC_LAMP_REWARD_COUNT; - public static int MAGIC_LAMP_GREATER_REWARD_COUNT; + public static int MAGIC_LAMP_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT; public static int MAGIC_LAMP_MAX_LEVEL_EXP; public static double MAGIC_LAMP_CHARGE_RATE; @@ -1931,8 +1932,9 @@ public class Config final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); - MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); - MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); + MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5); + MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10); + MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5); MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java index b6f02e7ec0..615c49d4b9 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java @@ -16,10 +16,24 @@ */ package org.l2jmobius.gameserver.network.clientpackets.magiclamp; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.gameserver.data.xml.MagicLampData; +import org.l2jmobius.gameserver.enums.LampMode; +import org.l2jmobius.gameserver.enums.LampType; import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; +import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult; /** @@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket @Override public boolean read(GameClient client, PacketReader packet) { - _count = packet.readD(); // nMagicLampGameCCount - _mode = (byte) packet.readC(); // cGameMode + _count = packet.readD(); // MagicLampGameCCount + _mode = (byte) packet.readC(); // GameMode return true; } @@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket return; } - client.sendPacket(new ExMagicLampGameResult(player, _count, _mode)); + final LampMode lampMode = LampMode.getByMode(_mode); + final int consume = calcConsume(lampMode, _count); + final int have = player.getLampCount(); + if (have >= consume) + { + final Map rewards = new HashMap<>(); + for (int x = _count; x > 0; x--) + { + final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == lampMode) && chance(lamp.getChance())).collect(Collectors.toList()); + final MagicLampDataHolder random = getRandom(available); + if (random != null) + { + rewards.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); + } + } + + // Consume. + player.setLampCount(have - consume); + if (lampMode == LampMode.GREATER) + { + player.destroyItemByItemId("Magic Lamp", 91641, Config.MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT * _count, player, true); + } + + // Reward. + rewards.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); + + // Update. + final int left = player.getLampCount(); + player.sendPacket(new ExMagicLampGameInfoUI(player, _mode, left > consume ? _count : left)); + player.sendPacket(new ExMagicLampExpInfoUI(player)); + player.sendPacket(new ExMagicLampGameResult(rewards.values())); + } + } + + private boolean chance(double chance) + { + return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); + } + + private E getRandom(List list) + { + if (list.isEmpty()) + { + return null; + } + if (list.size() == 1) + { + return list.get(0); + } + return list.get(Rnd.get(list.size())); + } + + private int calcConsume(LampMode mode, int count) + { + switch (mode) + { + case NORMAL: + { + return Config.MAGIC_LAMP_CONSUME_COUNT * count; + } + case GREATER: + { + return Config.MAGIC_LAMP_GREATER_CONSUME_COUNT * count; + } + default: + { + return 0; + } + } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java index c7ff7789d9..962c294fb5 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java @@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); - packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount - packet.writeD(_count); // cMagicLampGameCCount - packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame - packet.writeD(_player.getLampCount()); // cMagicLampCount - packet.writeC(_mode); // cGameMode + packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount + packet.writeD(_count); // MagicLampGameCCount + packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame + packet.writeD(_player.getLampCount()); // MagicLampCount + packet.writeC(_mode); // GameMode final List greater = MagicLampData.getInstance().getGreaterLamps(); packet.writeD(greater.size()); // costItemList for (GreaterMagicLampHolder lamp : greater) { - packet.writeD(lamp.getItemId()); // nItemClassID - packet.writeQ(lamp.getCount()); // nItemAmountPerGame - packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount + packet.writeD(lamp.getItemId()); // ItemClassID + packet.writeQ(lamp.getCount()); // ItemAmountPerGame + packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount } return true; } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java index d44ded9d1a..7c9b802671 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java @@ -16,108 +16,36 @@ */ package org.l2jmobius.gameserver.network.serverpackets.magiclamp; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.Collection; -import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; -import org.l2jmobius.commons.util.Rnd; -import org.l2jmobius.gameserver.data.xml.MagicLampData; -import org.l2jmobius.gameserver.enums.LampMode; -import org.l2jmobius.gameserver.enums.LampType; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * @author L2CCCP + * @author Mobius */ public class ExMagicLampGameResult implements IClientOutgoingPacket { - private final Map _reward = new HashMap<>(); + private final Collection _rewards; - public ExMagicLampGameResult(Player player, int count, byte mode) + public ExMagicLampGameResult(Collection rewards) { - final LampMode type = LampMode.getByMode(mode); - final int consume = calcConsume(type, count); - final int have = player.getLampCount(); - if (have >= consume) - { - init(type, count); - player.setLampCount(have - consume); - _reward.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); - // update UI - final int left = player.getLampCount(); - player.sendPacket(new ExMagicLampGameInfoUI(player, mode, left > consume ? count : left)); // check left count for update UI - player.sendPacket(new ExMagicLampExpInfoUI(player)); - } - } - - private void init(LampMode mode, int count) - { - for (int x = count; x > 0; x--) - { - final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == mode) && chance(lamp.getChance())).collect(Collectors.toList()); - final MagicLampDataHolder random = getRandom(available); - if (random != null) - { - _reward.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); - } - } - } - - private boolean chance(double chance) - { - return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); - } - - private E getRandom(List list) - { - if (list.isEmpty()) - { - return null; - } - if (list.size() == 1) - { - return list.get(0); - } - return list.get(Rnd.get(list.size())); - } - - private int calcConsume(LampMode mode, int count) - { - switch (mode) - { - case NORMAL: - { - return Config.MAGIC_LAMP_REWARD_COUNT * count; - } - case GREATER: - { - return Config.MAGIC_LAMP_GREATER_REWARD_COUNT * count; - } - default: - { - return 0; - } - } + _rewards = rewards; } @Override public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); - packet.writeD(_reward.size()); // magicLampGameResult - for (MagicLampHolder lamp : _reward.values()) + packet.writeD(_rewards.size()); + for (MagicLampHolder lamp : _rewards) { - packet.writeC(lamp.getType().getGrade()); // cGradeNum - packet.writeD(lamp.getCount()); // nRewardCount - packet.writeQ(lamp.getExp()); // nEXP - packet.writeQ(lamp.getSp()); // nSP + packet.writeC(lamp.getType().getGrade()); + packet.writeD(lamp.getCount()); + packet.writeQ(lamp.getExp()); + packet.writeQ(lamp.getSp()); } return true; } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/MagicLamp.ini b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/MagicLamp.ini index 44f690db22..321a0bae62 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/MagicLamp.ini +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/MagicLamp.ini @@ -6,9 +6,11 @@ MagicLampEnabled = False MagicLampMaxGames = 300 -MagicLampRewardCount = 1 +MagicLampConsumeCount = 5 -MagicLampGreaterRewardCount = 10 +MagicLampGreaterConsumeCount = 10 + +MagicLampGreaterSayhaConsumeCount = 5 MagicLampMaxLevelExp = 10000000 diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java index 209f889089..3f512a9ebd 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java @@ -893,8 +893,9 @@ public class Config // Magic Lamp public static boolean ENABLE_MAGIC_LAMP; public static int MAGIC_LAMP_MAX_GAME_COUNT; - public static int MAGIC_LAMP_REWARD_COUNT; - public static int MAGIC_LAMP_GREATER_REWARD_COUNT; + public static int MAGIC_LAMP_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT; public static int MAGIC_LAMP_MAX_LEVEL_EXP; public static double MAGIC_LAMP_CHARGE_RATE; @@ -1931,8 +1932,9 @@ public class Config final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); - MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); - MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); + MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5); + MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10); + MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5); MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java index b6f02e7ec0..615c49d4b9 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java @@ -16,10 +16,24 @@ */ package org.l2jmobius.gameserver.network.clientpackets.magiclamp; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.gameserver.data.xml.MagicLampData; +import org.l2jmobius.gameserver.enums.LampMode; +import org.l2jmobius.gameserver.enums.LampType; import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; +import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult; /** @@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket @Override public boolean read(GameClient client, PacketReader packet) { - _count = packet.readD(); // nMagicLampGameCCount - _mode = (byte) packet.readC(); // cGameMode + _count = packet.readD(); // MagicLampGameCCount + _mode = (byte) packet.readC(); // GameMode return true; } @@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket return; } - client.sendPacket(new ExMagicLampGameResult(player, _count, _mode)); + final LampMode lampMode = LampMode.getByMode(_mode); + final int consume = calcConsume(lampMode, _count); + final int have = player.getLampCount(); + if (have >= consume) + { + final Map rewards = new HashMap<>(); + for (int x = _count; x > 0; x--) + { + final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == lampMode) && chance(lamp.getChance())).collect(Collectors.toList()); + final MagicLampDataHolder random = getRandom(available); + if (random != null) + { + rewards.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); + } + } + + // Consume. + player.setLampCount(have - consume); + if (lampMode == LampMode.GREATER) + { + player.destroyItemByItemId("Magic Lamp", 91641, Config.MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT * _count, player, true); + } + + // Reward. + rewards.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); + + // Update. + final int left = player.getLampCount(); + player.sendPacket(new ExMagicLampGameInfoUI(player, _mode, left > consume ? _count : left)); + player.sendPacket(new ExMagicLampExpInfoUI(player)); + player.sendPacket(new ExMagicLampGameResult(rewards.values())); + } + } + + private boolean chance(double chance) + { + return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); + } + + private E getRandom(List list) + { + if (list.isEmpty()) + { + return null; + } + if (list.size() == 1) + { + return list.get(0); + } + return list.get(Rnd.get(list.size())); + } + + private int calcConsume(LampMode mode, int count) + { + switch (mode) + { + case NORMAL: + { + return Config.MAGIC_LAMP_CONSUME_COUNT * count; + } + case GREATER: + { + return Config.MAGIC_LAMP_GREATER_CONSUME_COUNT * count; + } + default: + { + return 0; + } + } } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java index c7ff7789d9..962c294fb5 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java @@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); - packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount - packet.writeD(_count); // cMagicLampGameCCount - packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame - packet.writeD(_player.getLampCount()); // cMagicLampCount - packet.writeC(_mode); // cGameMode + packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount + packet.writeD(_count); // MagicLampGameCCount + packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame + packet.writeD(_player.getLampCount()); // MagicLampCount + packet.writeC(_mode); // GameMode final List greater = MagicLampData.getInstance().getGreaterLamps(); packet.writeD(greater.size()); // costItemList for (GreaterMagicLampHolder lamp : greater) { - packet.writeD(lamp.getItemId()); // nItemClassID - packet.writeQ(lamp.getCount()); // nItemAmountPerGame - packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount + packet.writeD(lamp.getItemId()); // ItemClassID + packet.writeQ(lamp.getCount()); // ItemAmountPerGame + packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount } return true; } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java index d44ded9d1a..7c9b802671 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java @@ -16,108 +16,36 @@ */ package org.l2jmobius.gameserver.network.serverpackets.magiclamp; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.Collection; -import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; -import org.l2jmobius.commons.util.Rnd; -import org.l2jmobius.gameserver.data.xml.MagicLampData; -import org.l2jmobius.gameserver.enums.LampMode; -import org.l2jmobius.gameserver.enums.LampType; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * @author L2CCCP + * @author Mobius */ public class ExMagicLampGameResult implements IClientOutgoingPacket { - private final Map _reward = new HashMap<>(); + private final Collection _rewards; - public ExMagicLampGameResult(Player player, int count, byte mode) + public ExMagicLampGameResult(Collection rewards) { - final LampMode type = LampMode.getByMode(mode); - final int consume = calcConsume(type, count); - final int have = player.getLampCount(); - if (have >= consume) - { - init(type, count); - player.setLampCount(have - consume); - _reward.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); - // update UI - final int left = player.getLampCount(); - player.sendPacket(new ExMagicLampGameInfoUI(player, mode, left > consume ? count : left)); // check left count for update UI - player.sendPacket(new ExMagicLampExpInfoUI(player)); - } - } - - private void init(LampMode mode, int count) - { - for (int x = count; x > 0; x--) - { - final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == mode) && chance(lamp.getChance())).collect(Collectors.toList()); - final MagicLampDataHolder random = getRandom(available); - if (random != null) - { - _reward.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); - } - } - } - - private boolean chance(double chance) - { - return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); - } - - private E getRandom(List list) - { - if (list.isEmpty()) - { - return null; - } - if (list.size() == 1) - { - return list.get(0); - } - return list.get(Rnd.get(list.size())); - } - - private int calcConsume(LampMode mode, int count) - { - switch (mode) - { - case NORMAL: - { - return Config.MAGIC_LAMP_REWARD_COUNT * count; - } - case GREATER: - { - return Config.MAGIC_LAMP_GREATER_REWARD_COUNT * count; - } - default: - { - return 0; - } - } + _rewards = rewards; } @Override public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); - packet.writeD(_reward.size()); // magicLampGameResult - for (MagicLampHolder lamp : _reward.values()) + packet.writeD(_rewards.size()); + for (MagicLampHolder lamp : _rewards) { - packet.writeC(lamp.getType().getGrade()); // cGradeNum - packet.writeD(lamp.getCount()); // nRewardCount - packet.writeQ(lamp.getExp()); // nEXP - packet.writeQ(lamp.getSp()); // nSP + packet.writeC(lamp.getType().getGrade()); + packet.writeD(lamp.getCount()); + packet.writeQ(lamp.getExp()); + packet.writeQ(lamp.getSp()); } return true; } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/MagicLamp.ini b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/MagicLamp.ini index 44f690db22..321a0bae62 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/MagicLamp.ini +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/MagicLamp.ini @@ -6,9 +6,11 @@ MagicLampEnabled = False MagicLampMaxGames = 300 -MagicLampRewardCount = 1 +MagicLampConsumeCount = 5 -MagicLampGreaterRewardCount = 10 +MagicLampGreaterConsumeCount = 10 + +MagicLampGreaterSayhaConsumeCount = 5 MagicLampMaxLevelExp = 10000000 diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java index 7b3d9c13ed..652704404c 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java @@ -893,8 +893,9 @@ public class Config // Magic Lamp public static boolean ENABLE_MAGIC_LAMP; public static int MAGIC_LAMP_MAX_GAME_COUNT; - public static int MAGIC_LAMP_REWARD_COUNT; - public static int MAGIC_LAMP_GREATER_REWARD_COUNT; + public static int MAGIC_LAMP_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_CONSUME_COUNT; + public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT; public static int MAGIC_LAMP_MAX_LEVEL_EXP; public static double MAGIC_LAMP_CHARGE_RATE; @@ -1931,8 +1932,9 @@ public class Config final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); - MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); - MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); + MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5); + MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10); + MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5); MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java index b6f02e7ec0..615c49d4b9 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/magiclamp/ExMagicLampGameStart.java @@ -16,10 +16,24 @@ */ package org.l2jmobius.gameserver.network.clientpackets.magiclamp; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketReader; +import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.gameserver.data.xml.MagicLampData; +import org.l2jmobius.gameserver.enums.LampMode; +import org.l2jmobius.gameserver.enums.LampType; import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; +import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI; +import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult; /** @@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket @Override public boolean read(GameClient client, PacketReader packet) { - _count = packet.readD(); // nMagicLampGameCCount - _mode = (byte) packet.readC(); // cGameMode + _count = packet.readD(); // MagicLampGameCCount + _mode = (byte) packet.readC(); // GameMode return true; } @@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket return; } - client.sendPacket(new ExMagicLampGameResult(player, _count, _mode)); + final LampMode lampMode = LampMode.getByMode(_mode); + final int consume = calcConsume(lampMode, _count); + final int have = player.getLampCount(); + if (have >= consume) + { + final Map rewards = new HashMap<>(); + for (int x = _count; x > 0; x--) + { + final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == lampMode) && chance(lamp.getChance())).collect(Collectors.toList()); + final MagicLampDataHolder random = getRandom(available); + if (random != null) + { + rewards.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); + } + } + + // Consume. + player.setLampCount(have - consume); + if (lampMode == LampMode.GREATER) + { + player.destroyItemByItemId("Magic Lamp", 91641, Config.MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT * _count, player, true); + } + + // Reward. + rewards.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); + + // Update. + final int left = player.getLampCount(); + player.sendPacket(new ExMagicLampGameInfoUI(player, _mode, left > consume ? _count : left)); + player.sendPacket(new ExMagicLampExpInfoUI(player)); + player.sendPacket(new ExMagicLampGameResult(rewards.values())); + } + } + + private boolean chance(double chance) + { + return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); + } + + private E getRandom(List list) + { + if (list.isEmpty()) + { + return null; + } + if (list.size() == 1) + { + return list.get(0); + } + return list.get(Rnd.get(list.size())); + } + + private int calcConsume(LampMode mode, int count) + { + switch (mode) + { + case NORMAL: + { + return Config.MAGIC_LAMP_CONSUME_COUNT * count; + } + case GREATER: + { + return Config.MAGIC_LAMP_GREATER_CONSUME_COUNT * count; + } + default: + { + return 0; + } + } } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java index c7ff7789d9..962c294fb5 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameInfoUI.java @@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); - packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount - packet.writeD(_count); // cMagicLampGameCCount - packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame - packet.writeD(_player.getLampCount()); // cMagicLampCount - packet.writeC(_mode); // cGameMode + packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount + packet.writeD(_count); // MagicLampGameCCount + packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame + packet.writeD(_player.getLampCount()); // MagicLampCount + packet.writeC(_mode); // GameMode final List greater = MagicLampData.getInstance().getGreaterLamps(); packet.writeD(greater.size()); // costItemList for (GreaterMagicLampHolder lamp : greater) { - packet.writeD(lamp.getItemId()); // nItemClassID - packet.writeQ(lamp.getCount()); // nItemAmountPerGame - packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount + packet.writeD(lamp.getItemId()); // ItemClassID + packet.writeQ(lamp.getCount()); // ItemAmountPerGame + packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount } return true; } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java index d44ded9d1a..7c9b802671 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/magiclamp/ExMagicLampGameResult.java @@ -16,108 +16,36 @@ */ package org.l2jmobius.gameserver.network.serverpackets.magiclamp; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.Collection; -import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; -import org.l2jmobius.commons.util.Rnd; -import org.l2jmobius.gameserver.data.xml.MagicLampData; -import org.l2jmobius.gameserver.enums.LampMode; -import org.l2jmobius.gameserver.enums.LampType; -import org.l2jmobius.gameserver.model.actor.Player; -import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder; import org.l2jmobius.gameserver.model.holders.MagicLampHolder; import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; /** - * @author L2CCCP + * @author Mobius */ public class ExMagicLampGameResult implements IClientOutgoingPacket { - private final Map _reward = new HashMap<>(); + private final Collection _rewards; - public ExMagicLampGameResult(Player player, int count, byte mode) + public ExMagicLampGameResult(Collection rewards) { - final LampMode type = LampMode.getByMode(mode); - final int consume = calcConsume(type, count); - final int have = player.getLampCount(); - if (have >= consume) - { - init(type, count); - player.setLampCount(have - consume); - _reward.values().forEach(lamp -> player.addExpAndSp(lamp.getExp(), lamp.getSp())); - // update UI - final int left = player.getLampCount(); - player.sendPacket(new ExMagicLampGameInfoUI(player, mode, left > consume ? count : left)); // check left count for update UI - player.sendPacket(new ExMagicLampExpInfoUI(player)); - } - } - - private void init(LampMode mode, int count) - { - for (int x = count; x > 0; x--) - { - final List available = MagicLampData.getInstance().getLamps().stream().filter(lamp -> (lamp.getMode() == mode) && chance(lamp.getChance())).collect(Collectors.toList()); - final MagicLampDataHolder random = getRandom(available); - if (random != null) - { - _reward.computeIfAbsent(random.getType(), list -> new MagicLampHolder(random)).inc(); - } - } - } - - private boolean chance(double chance) - { - return (chance > 0) && ((chance >= 100) || (Rnd.get(100d) <= chance)); - } - - private E getRandom(List list) - { - if (list.isEmpty()) - { - return null; - } - if (list.size() == 1) - { - return list.get(0); - } - return list.get(Rnd.get(list.size())); - } - - private int calcConsume(LampMode mode, int count) - { - switch (mode) - { - case NORMAL: - { - return Config.MAGIC_LAMP_REWARD_COUNT * count; - } - case GREATER: - { - return Config.MAGIC_LAMP_GREATER_REWARD_COUNT * count; - } - default: - { - return 0; - } - } + _rewards = rewards; } @Override public boolean write(PacketWriter packet) { OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); - packet.writeD(_reward.size()); // magicLampGameResult - for (MagicLampHolder lamp : _reward.values()) + packet.writeD(_rewards.size()); + for (MagicLampHolder lamp : _rewards) { - packet.writeC(lamp.getType().getGrade()); // cGradeNum - packet.writeD(lamp.getCount()); // nRewardCount - packet.writeQ(lamp.getExp()); // nEXP - packet.writeQ(lamp.getSp()); // nSP + packet.writeC(lamp.getType().getGrade()); + packet.writeD(lamp.getCount()); + packet.writeQ(lamp.getExp()); + packet.writeQ(lamp.getSp()); } return true; }