Magic Lamp rework and adjustments.
This commit is contained in:
parent
105c026605
commit
da3ac02e01
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
|||||||
|
|
||||||
MagicLampMaxGames = 300
|
MagicLampMaxGames = 300
|
||||||
|
|
||||||
MagicLampRewardCount = 1
|
MagicLampConsumeCount = 5
|
||||||
|
|
||||||
MagicLampGreaterRewardCount = 10
|
MagicLampGreaterConsumeCount = 10
|
||||||
|
|
||||||
|
MagicLampGreaterSayhaConsumeCount = 5
|
||||||
|
|
||||||
MagicLampMaxLevelExp = 10000000
|
MagicLampMaxLevelExp = 10000000
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
|||||||
|
|
||||||
MagicLampMaxGames = 300
|
MagicLampMaxGames = 300
|
||||||
|
|
||||||
MagicLampRewardCount = 1
|
MagicLampConsumeCount = 5
|
||||||
|
|
||||||
MagicLampGreaterRewardCount = 10
|
MagicLampGreaterConsumeCount = 10
|
||||||
|
|
||||||
|
MagicLampGreaterSayhaConsumeCount = 5
|
||||||
|
|
||||||
MagicLampMaxLevelExp = 10000000
|
MagicLampMaxLevelExp = 10000000
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
|||||||
|
|
||||||
MagicLampMaxGames = 300
|
MagicLampMaxGames = 300
|
||||||
|
|
||||||
MagicLampRewardCount = 1
|
MagicLampConsumeCount = 5
|
||||||
|
|
||||||
MagicLampGreaterRewardCount = 10
|
MagicLampGreaterConsumeCount = 10
|
||||||
|
|
||||||
|
MagicLampGreaterSayhaConsumeCount = 5
|
||||||
|
|
||||||
MagicLampMaxLevelExp = 10000000
|
MagicLampMaxLevelExp = 10000000
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
|||||||
|
|
||||||
MagicLampMaxGames = 300
|
MagicLampMaxGames = 300
|
||||||
|
|
||||||
MagicLampRewardCount = 1
|
MagicLampConsumeCount = 5
|
||||||
|
|
||||||
MagicLampGreaterRewardCount = 10
|
MagicLampGreaterConsumeCount = 10
|
||||||
|
|
||||||
|
MagicLampGreaterSayhaConsumeCount = 5
|
||||||
|
|
||||||
MagicLampMaxLevelExp = 10000000
|
MagicLampMaxLevelExp = 10000000
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user