Magic Lamp rework and adjustments.

This commit is contained in:
MobiusDevelopment 2022-04-26 22:30:15 +00:00
parent 105c026605
commit da3ac02e01
20 changed files with 456 additions and 400 deletions

View File

@ -6,9 +6,11 @@ MagicLampEnabled = False
MagicLampMaxGames = 300 MagicLampMaxGames = 300
MagicLampRewardCount = 1 MagicLampConsumeCount = 5
MagicLampGreaterRewardCount = 10 MagicLampGreaterConsumeCount = 10
MagicLampGreaterSayhaConsumeCount = 5
MagicLampMaxLevelExp = 10000000 MagicLampMaxLevelExp = 10000000

View File

@ -893,8 +893,9 @@ public class Config
// Magic Lamp // Magic Lamp
public static boolean ENABLE_MAGIC_LAMP; public static boolean ENABLE_MAGIC_LAMP;
public static int MAGIC_LAMP_MAX_GAME_COUNT; public static int MAGIC_LAMP_MAX_GAME_COUNT;
public static int MAGIC_LAMP_REWARD_COUNT; public static int MAGIC_LAMP_CONSUME_COUNT;
public static int MAGIC_LAMP_GREATER_REWARD_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 int MAGIC_LAMP_MAX_LEVEL_EXP;
public static double MAGIC_LAMP_CHARGE_RATE; public static double MAGIC_LAMP_CHARGE_RATE;
@ -1927,8 +1928,9 @@ public class Config
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); 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_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);

View File

@ -16,10 +16,24 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets.magiclamp; 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.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.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.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; 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; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
/** /**
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_count = packet.readD(); // nMagicLampGameCCount _count = packet.readD(); // MagicLampGameCCount
_mode = (byte) packet.readC(); // cGameMode _mode = (byte) packet.readC(); // GameMode
return true; return true;
} }
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
return; 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<LampType, MagicLampHolder> rewards = new HashMap<>();
for (int x = _count; x > 0; x--)
{
final List<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
} }

View File

@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
packet.writeD(_count); // cMagicLampGameCCount packet.writeD(_count); // MagicLampGameCCount
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
packet.writeD(_player.getLampCount()); // cMagicLampCount packet.writeD(_player.getLampCount()); // MagicLampCount
packet.writeC(_mode); // cGameMode packet.writeC(_mode); // GameMode
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps(); final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
packet.writeD(greater.size()); // costItemList packet.writeD(greater.size()); // costItemList
for (GreaterMagicLampHolder lamp : greater) for (GreaterMagicLampHolder lamp : greater)
{ {
packet.writeD(lamp.getItemId()); // nItemClassID packet.writeD(lamp.getItemId()); // ItemClassID
packet.writeQ(lamp.getCount()); // nItemAmountPerGame packet.writeQ(lamp.getCount()); // ItemAmountPerGame
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
} }
return true; return true;
} }

View File

@ -16,108 +16,36 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets.magiclamp; package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
import java.util.HashMap; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; 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.model.holders.MagicLampHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/** /**
* @author L2CCCP * @author Mobius
*/ */
public class ExMagicLampGameResult implements IClientOutgoingPacket public class ExMagicLampGameResult implements IClientOutgoingPacket
{ {
private final Map<LampType, MagicLampHolder> _reward = new HashMap<>(); private final Collection<MagicLampHolder> _rewards;
public ExMagicLampGameResult(Player player, int count, byte mode) public ExMagicLampGameResult(Collection<MagicLampHolder> rewards)
{ {
final LampMode type = LampMode.getByMode(mode); _rewards = rewards;
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<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
@Override @Override
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
packet.writeD(_reward.size()); // magicLampGameResult packet.writeD(_rewards.size());
for (MagicLampHolder lamp : _reward.values()) for (MagicLampHolder lamp : _rewards)
{ {
packet.writeC(lamp.getType().getGrade()); // cGradeNum packet.writeC(lamp.getType().getGrade());
packet.writeD(lamp.getCount()); // nRewardCount packet.writeD(lamp.getCount());
packet.writeQ(lamp.getExp()); // nEXP packet.writeQ(lamp.getExp());
packet.writeQ(lamp.getSp()); // nSP packet.writeQ(lamp.getSp());
} }
return true; return true;
} }

View File

@ -6,9 +6,11 @@ MagicLampEnabled = False
MagicLampMaxGames = 300 MagicLampMaxGames = 300
MagicLampRewardCount = 1 MagicLampConsumeCount = 5
MagicLampGreaterRewardCount = 10 MagicLampGreaterConsumeCount = 10
MagicLampGreaterSayhaConsumeCount = 5
MagicLampMaxLevelExp = 10000000 MagicLampMaxLevelExp = 10000000

View File

@ -893,8 +893,9 @@ public class Config
// Magic Lamp // Magic Lamp
public static boolean ENABLE_MAGIC_LAMP; public static boolean ENABLE_MAGIC_LAMP;
public static int MAGIC_LAMP_MAX_GAME_COUNT; public static int MAGIC_LAMP_MAX_GAME_COUNT;
public static int MAGIC_LAMP_REWARD_COUNT; public static int MAGIC_LAMP_CONSUME_COUNT;
public static int MAGIC_LAMP_GREATER_REWARD_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 int MAGIC_LAMP_MAX_LEVEL_EXP;
public static double MAGIC_LAMP_CHARGE_RATE; public static double MAGIC_LAMP_CHARGE_RATE;
@ -1931,8 +1932,9 @@ public class Config
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); 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_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);

View File

@ -16,10 +16,24 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets.magiclamp; 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.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.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.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; 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; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
/** /**
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_count = packet.readD(); // nMagicLampGameCCount _count = packet.readD(); // MagicLampGameCCount
_mode = (byte) packet.readC(); // cGameMode _mode = (byte) packet.readC(); // GameMode
return true; return true;
} }
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
return; 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<LampType, MagicLampHolder> rewards = new HashMap<>();
for (int x = _count; x > 0; x--)
{
final List<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
} }

View File

@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
packet.writeD(_count); // cMagicLampGameCCount packet.writeD(_count); // MagicLampGameCCount
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
packet.writeD(_player.getLampCount()); // cMagicLampCount packet.writeD(_player.getLampCount()); // MagicLampCount
packet.writeC(_mode); // cGameMode packet.writeC(_mode); // GameMode
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps(); final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
packet.writeD(greater.size()); // costItemList packet.writeD(greater.size()); // costItemList
for (GreaterMagicLampHolder lamp : greater) for (GreaterMagicLampHolder lamp : greater)
{ {
packet.writeD(lamp.getItemId()); // nItemClassID packet.writeD(lamp.getItemId()); // ItemClassID
packet.writeQ(lamp.getCount()); // nItemAmountPerGame packet.writeQ(lamp.getCount()); // ItemAmountPerGame
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
} }
return true; return true;
} }

View File

@ -16,108 +16,36 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets.magiclamp; package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
import java.util.HashMap; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; 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.model.holders.MagicLampHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/** /**
* @author L2CCCP * @author Mobius
*/ */
public class ExMagicLampGameResult implements IClientOutgoingPacket public class ExMagicLampGameResult implements IClientOutgoingPacket
{ {
private final Map<LampType, MagicLampHolder> _reward = new HashMap<>(); private final Collection<MagicLampHolder> _rewards;
public ExMagicLampGameResult(Player player, int count, byte mode) public ExMagicLampGameResult(Collection<MagicLampHolder> rewards)
{ {
final LampMode type = LampMode.getByMode(mode); _rewards = rewards;
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<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
@Override @Override
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
packet.writeD(_reward.size()); // magicLampGameResult packet.writeD(_rewards.size());
for (MagicLampHolder lamp : _reward.values()) for (MagicLampHolder lamp : _rewards)
{ {
packet.writeC(lamp.getType().getGrade()); // cGradeNum packet.writeC(lamp.getType().getGrade());
packet.writeD(lamp.getCount()); // nRewardCount packet.writeD(lamp.getCount());
packet.writeQ(lamp.getExp()); // nEXP packet.writeQ(lamp.getExp());
packet.writeQ(lamp.getSp()); // nSP packet.writeQ(lamp.getSp());
} }
return true; return true;
} }

View File

@ -6,9 +6,11 @@ MagicLampEnabled = False
MagicLampMaxGames = 300 MagicLampMaxGames = 300
MagicLampRewardCount = 1 MagicLampConsumeCount = 5
MagicLampGreaterRewardCount = 10 MagicLampGreaterConsumeCount = 10
MagicLampGreaterSayhaConsumeCount = 5
MagicLampMaxLevelExp = 10000000 MagicLampMaxLevelExp = 10000000

View File

@ -893,8 +893,9 @@ public class Config
// Magic Lamp // Magic Lamp
public static boolean ENABLE_MAGIC_LAMP; public static boolean ENABLE_MAGIC_LAMP;
public static int MAGIC_LAMP_MAX_GAME_COUNT; public static int MAGIC_LAMP_MAX_GAME_COUNT;
public static int MAGIC_LAMP_REWARD_COUNT; public static int MAGIC_LAMP_CONSUME_COUNT;
public static int MAGIC_LAMP_GREATER_REWARD_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 int MAGIC_LAMP_MAX_LEVEL_EXP;
public static double MAGIC_LAMP_CHARGE_RATE; public static double MAGIC_LAMP_CHARGE_RATE;
@ -1931,8 +1932,9 @@ public class Config
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); 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_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);

View File

@ -16,10 +16,24 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets.magiclamp; 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.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.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.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; 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; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
/** /**
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_count = packet.readD(); // nMagicLampGameCCount _count = packet.readD(); // MagicLampGameCCount
_mode = (byte) packet.readC(); // cGameMode _mode = (byte) packet.readC(); // GameMode
return true; return true;
} }
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
return; 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<LampType, MagicLampHolder> rewards = new HashMap<>();
for (int x = _count; x > 0; x--)
{
final List<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
} }

View File

@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
packet.writeD(_count); // cMagicLampGameCCount packet.writeD(_count); // MagicLampGameCCount
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
packet.writeD(_player.getLampCount()); // cMagicLampCount packet.writeD(_player.getLampCount()); // MagicLampCount
packet.writeC(_mode); // cGameMode packet.writeC(_mode); // GameMode
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps(); final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
packet.writeD(greater.size()); // costItemList packet.writeD(greater.size()); // costItemList
for (GreaterMagicLampHolder lamp : greater) for (GreaterMagicLampHolder lamp : greater)
{ {
packet.writeD(lamp.getItemId()); // nItemClassID packet.writeD(lamp.getItemId()); // ItemClassID
packet.writeQ(lamp.getCount()); // nItemAmountPerGame packet.writeQ(lamp.getCount()); // ItemAmountPerGame
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
} }
return true; return true;
} }

View File

@ -16,108 +16,36 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets.magiclamp; package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
import java.util.HashMap; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; 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.model.holders.MagicLampHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/** /**
* @author L2CCCP * @author Mobius
*/ */
public class ExMagicLampGameResult implements IClientOutgoingPacket public class ExMagicLampGameResult implements IClientOutgoingPacket
{ {
private final Map<LampType, MagicLampHolder> _reward = new HashMap<>(); private final Collection<MagicLampHolder> _rewards;
public ExMagicLampGameResult(Player player, int count, byte mode) public ExMagicLampGameResult(Collection<MagicLampHolder> rewards)
{ {
final LampMode type = LampMode.getByMode(mode); _rewards = rewards;
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<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
@Override @Override
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
packet.writeD(_reward.size()); // magicLampGameResult packet.writeD(_rewards.size());
for (MagicLampHolder lamp : _reward.values()) for (MagicLampHolder lamp : _rewards)
{ {
packet.writeC(lamp.getType().getGrade()); // cGradeNum packet.writeC(lamp.getType().getGrade());
packet.writeD(lamp.getCount()); // nRewardCount packet.writeD(lamp.getCount());
packet.writeQ(lamp.getExp()); // nEXP packet.writeQ(lamp.getExp());
packet.writeQ(lamp.getSp()); // nSP packet.writeQ(lamp.getSp());
} }
return true; return true;
} }

View File

@ -6,9 +6,11 @@ MagicLampEnabled = False
MagicLampMaxGames = 300 MagicLampMaxGames = 300
MagicLampRewardCount = 1 MagicLampConsumeCount = 5
MagicLampGreaterRewardCount = 10 MagicLampGreaterConsumeCount = 10
MagicLampGreaterSayhaConsumeCount = 5
MagicLampMaxLevelExp = 10000000 MagicLampMaxLevelExp = 10000000

View File

@ -893,8 +893,9 @@ public class Config
// Magic Lamp // Magic Lamp
public static boolean ENABLE_MAGIC_LAMP; public static boolean ENABLE_MAGIC_LAMP;
public static int MAGIC_LAMP_MAX_GAME_COUNT; public static int MAGIC_LAMP_MAX_GAME_COUNT;
public static int MAGIC_LAMP_REWARD_COUNT; public static int MAGIC_LAMP_CONSUME_COUNT;
public static int MAGIC_LAMP_GREATER_REWARD_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 int MAGIC_LAMP_MAX_LEVEL_EXP;
public static double MAGIC_LAMP_CHARGE_RATE; public static double MAGIC_LAMP_CHARGE_RATE;
@ -1931,8 +1932,9 @@ public class Config
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE); final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false); ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300); MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1); MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10); 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_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1); MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);

View File

@ -16,10 +16,24 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets.magiclamp; 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.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.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.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; 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; import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
/** /**
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_count = packet.readD(); // nMagicLampGameCCount _count = packet.readD(); // MagicLampGameCCount
_mode = (byte) packet.readC(); // cGameMode _mode = (byte) packet.readC(); // GameMode
return true; return true;
} }
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
return; 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<LampType, MagicLampHolder> rewards = new HashMap<>();
for (int x = _count; x > 0; x--)
{
final List<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
} }

View File

@ -46,18 +46,18 @@ public class ExMagicLampGameInfoUI implements IClientOutgoingPacket
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
packet.writeD(_count); // cMagicLampGameCCount packet.writeD(_count); // MagicLampGameCCount
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
packet.writeD(_player.getLampCount()); // cMagicLampCount packet.writeD(_player.getLampCount()); // MagicLampCount
packet.writeC(_mode); // cGameMode packet.writeC(_mode); // GameMode
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps(); final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
packet.writeD(greater.size()); // costItemList packet.writeD(greater.size()); // costItemList
for (GreaterMagicLampHolder lamp : greater) for (GreaterMagicLampHolder lamp : greater)
{ {
packet.writeD(lamp.getItemId()); // nItemClassID packet.writeD(lamp.getItemId()); // ItemClassID
packet.writeQ(lamp.getCount()); // nItemAmountPerGame packet.writeQ(lamp.getCount()); // ItemAmountPerGame
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
} }
return true; return true;
} }

View File

@ -16,108 +16,36 @@
*/ */
package org.l2jmobius.gameserver.network.serverpackets.magiclamp; package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
import java.util.HashMap; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; 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.model.holders.MagicLampHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/** /**
* @author L2CCCP * @author Mobius
*/ */
public class ExMagicLampGameResult implements IClientOutgoingPacket public class ExMagicLampGameResult implements IClientOutgoingPacket
{ {
private final Map<LampType, MagicLampHolder> _reward = new HashMap<>(); private final Collection<MagicLampHolder> _rewards;
public ExMagicLampGameResult(Player player, int count, byte mode) public ExMagicLampGameResult(Collection<MagicLampHolder> rewards)
{ {
final LampMode type = LampMode.getByMode(mode); _rewards = rewards;
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<MagicLampDataHolder> 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> E getRandom(List<E> 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;
}
}
} }
@Override @Override
public boolean write(PacketWriter packet) public boolean write(PacketWriter packet)
{ {
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet); OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
packet.writeD(_reward.size()); // magicLampGameResult packet.writeD(_rewards.size());
for (MagicLampHolder lamp : _reward.values()) for (MagicLampHolder lamp : _rewards)
{ {
packet.writeC(lamp.getType().getGrade()); // cGradeNum packet.writeC(lamp.getType().getGrade());
packet.writeD(lamp.getCount()); // nRewardCount packet.writeD(lamp.getCount());
packet.writeQ(lamp.getExp()); // nEXP packet.writeQ(lamp.getExp());
packet.writeQ(lamp.getSp()); // nSP packet.writeQ(lamp.getSp());
} }
return true; return true;
} }