Magic Lamp rework and adjustments.
This commit is contained in:
parent
105c026605
commit
da3ac02e01
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
||||
|
||||
MagicLampMaxGames = 300
|
||||
|
||||
MagicLampRewardCount = 1
|
||||
MagicLampConsumeCount = 5
|
||||
|
||||
MagicLampGreaterRewardCount = 10
|
||||
MagicLampGreaterConsumeCount = 10
|
||||
|
||||
MagicLampGreaterSayhaConsumeCount = 5
|
||||
|
||||
MagicLampMaxLevelExp = 10000000
|
||||
|
||||
|
@ -893,8 +893,9 @@ public class Config
|
||||
// Magic Lamp
|
||||
public static boolean ENABLE_MAGIC_LAMP;
|
||||
public static int MAGIC_LAMP_MAX_GAME_COUNT;
|
||||
public static int MAGIC_LAMP_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_MAX_LEVEL_EXP;
|
||||
public static double MAGIC_LAMP_CHARGE_RATE;
|
||||
|
||||
@ -1927,8 +1928,9 @@ public class Config
|
||||
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
|
||||
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
|
||||
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
|
||||
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1);
|
||||
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10);
|
||||
MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
|
||||
MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10);
|
||||
MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5);
|
||||
MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
|
||||
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);
|
||||
|
||||
|
@ -16,10 +16,24 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
|
||||
|
||||
/**
|
||||
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_count = packet.readD(); // nMagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // cGameMode
|
||||
_count = packet.readD(); // MagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // GameMode
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new ExMagicLampGameResult(player, _count, _mode));
|
||||
final LampMode lampMode = LampMode.getByMode(_mode);
|
||||
final int consume = calcConsume(lampMode, _count);
|
||||
final int have = player.getLampCount();
|
||||
if (have >= consume)
|
||||
{
|
||||
final Map<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)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
|
||||
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount
|
||||
packet.writeD(_count); // cMagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // cMagicLampCount
|
||||
packet.writeC(_mode); // cGameMode
|
||||
packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
|
||||
packet.writeD(_count); // MagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // MagicLampCount
|
||||
packet.writeC(_mode); // GameMode
|
||||
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
|
||||
packet.writeD(greater.size()); // costItemList
|
||||
for (GreaterMagicLampHolder lamp : greater)
|
||||
{
|
||||
packet.writeD(lamp.getItemId()); // nItemClassID
|
||||
packet.writeQ(lamp.getCount()); // nItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount
|
||||
packet.writeD(lamp.getItemId()); // ItemClassID
|
||||
packet.writeQ(lamp.getCount()); // ItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -16,108 +16,36 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
|
||||
/**
|
||||
* @author L2CCCP
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExMagicLampGameResult implements IClientOutgoingPacket
|
||||
{
|
||||
private final Map<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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
_rewards = rewards;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
|
||||
packet.writeD(_reward.size()); // magicLampGameResult
|
||||
for (MagicLampHolder lamp : _reward.values())
|
||||
packet.writeD(_rewards.size());
|
||||
for (MagicLampHolder lamp : _rewards)
|
||||
{
|
||||
packet.writeC(lamp.getType().getGrade()); // cGradeNum
|
||||
packet.writeD(lamp.getCount()); // nRewardCount
|
||||
packet.writeQ(lamp.getExp()); // nEXP
|
||||
packet.writeQ(lamp.getSp()); // nSP
|
||||
packet.writeC(lamp.getType().getGrade());
|
||||
packet.writeD(lamp.getCount());
|
||||
packet.writeQ(lamp.getExp());
|
||||
packet.writeQ(lamp.getSp());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
||||
|
||||
MagicLampMaxGames = 300
|
||||
|
||||
MagicLampRewardCount = 1
|
||||
MagicLampConsumeCount = 5
|
||||
|
||||
MagicLampGreaterRewardCount = 10
|
||||
MagicLampGreaterConsumeCount = 10
|
||||
|
||||
MagicLampGreaterSayhaConsumeCount = 5
|
||||
|
||||
MagicLampMaxLevelExp = 10000000
|
||||
|
||||
|
@ -893,8 +893,9 @@ public class Config
|
||||
// Magic Lamp
|
||||
public static boolean ENABLE_MAGIC_LAMP;
|
||||
public static int MAGIC_LAMP_MAX_GAME_COUNT;
|
||||
public static int MAGIC_LAMP_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_MAX_LEVEL_EXP;
|
||||
public static double MAGIC_LAMP_CHARGE_RATE;
|
||||
|
||||
@ -1931,8 +1932,9 @@ public class Config
|
||||
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
|
||||
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
|
||||
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
|
||||
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1);
|
||||
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10);
|
||||
MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
|
||||
MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10);
|
||||
MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5);
|
||||
MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
|
||||
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);
|
||||
|
||||
|
@ -16,10 +16,24 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
|
||||
|
||||
/**
|
||||
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_count = packet.readD(); // nMagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // cGameMode
|
||||
_count = packet.readD(); // MagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // GameMode
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new ExMagicLampGameResult(player, _count, _mode));
|
||||
final LampMode lampMode = LampMode.getByMode(_mode);
|
||||
final int consume = calcConsume(lampMode, _count);
|
||||
final int have = player.getLampCount();
|
||||
if (have >= consume)
|
||||
{
|
||||
final Map<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)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
|
||||
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount
|
||||
packet.writeD(_count); // cMagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // cMagicLampCount
|
||||
packet.writeC(_mode); // cGameMode
|
||||
packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
|
||||
packet.writeD(_count); // MagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // MagicLampCount
|
||||
packet.writeC(_mode); // GameMode
|
||||
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
|
||||
packet.writeD(greater.size()); // costItemList
|
||||
for (GreaterMagicLampHolder lamp : greater)
|
||||
{
|
||||
packet.writeD(lamp.getItemId()); // nItemClassID
|
||||
packet.writeQ(lamp.getCount()); // nItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount
|
||||
packet.writeD(lamp.getItemId()); // ItemClassID
|
||||
packet.writeQ(lamp.getCount()); // ItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -16,108 +16,36 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
|
||||
/**
|
||||
* @author L2CCCP
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExMagicLampGameResult implements IClientOutgoingPacket
|
||||
{
|
||||
private final Map<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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
_rewards = rewards;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
|
||||
packet.writeD(_reward.size()); // magicLampGameResult
|
||||
for (MagicLampHolder lamp : _reward.values())
|
||||
packet.writeD(_rewards.size());
|
||||
for (MagicLampHolder lamp : _rewards)
|
||||
{
|
||||
packet.writeC(lamp.getType().getGrade()); // cGradeNum
|
||||
packet.writeD(lamp.getCount()); // nRewardCount
|
||||
packet.writeQ(lamp.getExp()); // nEXP
|
||||
packet.writeQ(lamp.getSp()); // nSP
|
||||
packet.writeC(lamp.getType().getGrade());
|
||||
packet.writeD(lamp.getCount());
|
||||
packet.writeQ(lamp.getExp());
|
||||
packet.writeQ(lamp.getSp());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
||||
|
||||
MagicLampMaxGames = 300
|
||||
|
||||
MagicLampRewardCount = 1
|
||||
MagicLampConsumeCount = 5
|
||||
|
||||
MagicLampGreaterRewardCount = 10
|
||||
MagicLampGreaterConsumeCount = 10
|
||||
|
||||
MagicLampGreaterSayhaConsumeCount = 5
|
||||
|
||||
MagicLampMaxLevelExp = 10000000
|
||||
|
||||
|
@ -893,8 +893,9 @@ public class Config
|
||||
// Magic Lamp
|
||||
public static boolean ENABLE_MAGIC_LAMP;
|
||||
public static int MAGIC_LAMP_MAX_GAME_COUNT;
|
||||
public static int MAGIC_LAMP_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_MAX_LEVEL_EXP;
|
||||
public static double MAGIC_LAMP_CHARGE_RATE;
|
||||
|
||||
@ -1931,8 +1932,9 @@ public class Config
|
||||
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
|
||||
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
|
||||
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
|
||||
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1);
|
||||
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10);
|
||||
MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
|
||||
MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10);
|
||||
MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5);
|
||||
MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
|
||||
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);
|
||||
|
||||
|
@ -16,10 +16,24 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
|
||||
|
||||
/**
|
||||
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_count = packet.readD(); // nMagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // cGameMode
|
||||
_count = packet.readD(); // MagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // GameMode
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new ExMagicLampGameResult(player, _count, _mode));
|
||||
final LampMode lampMode = LampMode.getByMode(_mode);
|
||||
final int consume = calcConsume(lampMode, _count);
|
||||
final int have = player.getLampCount();
|
||||
if (have >= consume)
|
||||
{
|
||||
final Map<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)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
|
||||
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount
|
||||
packet.writeD(_count); // cMagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // cMagicLampCount
|
||||
packet.writeC(_mode); // cGameMode
|
||||
packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
|
||||
packet.writeD(_count); // MagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // MagicLampCount
|
||||
packet.writeC(_mode); // GameMode
|
||||
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
|
||||
packet.writeD(greater.size()); // costItemList
|
||||
for (GreaterMagicLampHolder lamp : greater)
|
||||
{
|
||||
packet.writeD(lamp.getItemId()); // nItemClassID
|
||||
packet.writeQ(lamp.getCount()); // nItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount
|
||||
packet.writeD(lamp.getItemId()); // ItemClassID
|
||||
packet.writeQ(lamp.getCount()); // ItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -16,108 +16,36 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
|
||||
/**
|
||||
* @author L2CCCP
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExMagicLampGameResult implements IClientOutgoingPacket
|
||||
{
|
||||
private final Map<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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
_rewards = rewards;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
|
||||
packet.writeD(_reward.size()); // magicLampGameResult
|
||||
for (MagicLampHolder lamp : _reward.values())
|
||||
packet.writeD(_rewards.size());
|
||||
for (MagicLampHolder lamp : _rewards)
|
||||
{
|
||||
packet.writeC(lamp.getType().getGrade()); // cGradeNum
|
||||
packet.writeD(lamp.getCount()); // nRewardCount
|
||||
packet.writeQ(lamp.getExp()); // nEXP
|
||||
packet.writeQ(lamp.getSp()); // nSP
|
||||
packet.writeC(lamp.getType().getGrade());
|
||||
packet.writeD(lamp.getCount());
|
||||
packet.writeQ(lamp.getExp());
|
||||
packet.writeQ(lamp.getSp());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -6,9 +6,11 @@ MagicLampEnabled = False
|
||||
|
||||
MagicLampMaxGames = 300
|
||||
|
||||
MagicLampRewardCount = 1
|
||||
MagicLampConsumeCount = 5
|
||||
|
||||
MagicLampGreaterRewardCount = 10
|
||||
MagicLampGreaterConsumeCount = 10
|
||||
|
||||
MagicLampGreaterSayhaConsumeCount = 5
|
||||
|
||||
MagicLampMaxLevelExp = 10000000
|
||||
|
||||
|
@ -893,8 +893,9 @@ public class Config
|
||||
// Magic Lamp
|
||||
public static boolean ENABLE_MAGIC_LAMP;
|
||||
public static int MAGIC_LAMP_MAX_GAME_COUNT;
|
||||
public static int MAGIC_LAMP_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_REWARD_COUNT;
|
||||
public static int MAGIC_LAMP_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT;
|
||||
public static int MAGIC_LAMP_MAX_LEVEL_EXP;
|
||||
public static double MAGIC_LAMP_CHARGE_RATE;
|
||||
|
||||
@ -1931,8 +1932,9 @@ public class Config
|
||||
final PropertiesParser magicLampconfig = new PropertiesParser(MAGIC_LAMP_FILE);
|
||||
ENABLE_MAGIC_LAMP = magicLampconfig.getBoolean("MagicLampEnabled", false);
|
||||
MAGIC_LAMP_MAX_GAME_COUNT = magicLampconfig.getInt("MagicLampMaxGames", 300);
|
||||
MAGIC_LAMP_REWARD_COUNT = magicLampconfig.getInt("MagicLampRewardCount", 1);
|
||||
MAGIC_LAMP_GREATER_REWARD_COUNT = magicLampconfig.getInt("MagicLampGreaterRewardCount", 10);
|
||||
MAGIC_LAMP_CONSUME_COUNT = magicLampconfig.getInt("MagicLampConsumeCount", 5);
|
||||
MAGIC_LAMP_GREATER_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterConsumeCount", 10);
|
||||
MAGIC_LAMP_GREATER_SAYHA_CONSUME_COUNT = magicLampconfig.getInt("MagicLampGreaterSayhaConsumeCount", 5);
|
||||
MAGIC_LAMP_MAX_LEVEL_EXP = magicLampconfig.getInt("MagicLampMaxLevelExp", 10000000);
|
||||
MAGIC_LAMP_CHARGE_RATE = magicLampconfig.getDouble("MagicLampChargeRate", 0.1);
|
||||
|
||||
|
@ -16,10 +16,24 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampExpInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameInfoUI;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.magiclamp.ExMagicLampGameResult;
|
||||
|
||||
/**
|
||||
@ -33,8 +47,8 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_count = packet.readD(); // nMagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // cGameMode
|
||||
_count = packet.readD(); // MagicLampGameCCount
|
||||
_mode = (byte) packet.readC(); // GameMode
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -47,6 +61,74 @@ public class ExMagicLampGameStart implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
client.sendPacket(new ExMagicLampGameResult(player, _count, _mode));
|
||||
final LampMode lampMode = LampMode.getByMode(_mode);
|
||||
final int consume = calcConsume(lampMode, _count);
|
||||
final int have = player.getLampCount();
|
||||
if (have >= consume)
|
||||
{
|
||||
final Map<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)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_INFO.writeId(packet);
|
||||
packet.writeD(_player.getMaxLampCount()); // nMagicLampGameMaxCCount
|
||||
packet.writeD(_count); // cMagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_REWARD_COUNT : Config.MAGIC_LAMP_GREATER_REWARD_COUNT); // cMagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // cMagicLampCount
|
||||
packet.writeC(_mode); // cGameMode
|
||||
packet.writeD(_player.getMaxLampCount()); // MagicLampGameMaxCCount
|
||||
packet.writeD(_count); // MagicLampGameCCount
|
||||
packet.writeD(_mode == 0 ? Config.MAGIC_LAMP_CONSUME_COUNT : Config.MAGIC_LAMP_GREATER_CONSUME_COUNT); // MagicLampCountPerGame
|
||||
packet.writeD(_player.getLampCount()); // MagicLampCount
|
||||
packet.writeC(_mode); // GameMode
|
||||
final List<GreaterMagicLampHolder> greater = MagicLampData.getInstance().getGreaterLamps();
|
||||
packet.writeD(greater.size()); // costItemList
|
||||
for (GreaterMagicLampHolder lamp : greater)
|
||||
{
|
||||
packet.writeD(lamp.getItemId()); // nItemClassID
|
||||
packet.writeQ(lamp.getCount()); // nItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // nItemAmount
|
||||
packet.writeD(lamp.getItemId()); // ItemClassID
|
||||
packet.writeQ(lamp.getCount()); // ItemAmountPerGame
|
||||
packet.writeQ(_player.getInventory().getInventoryItemCount(lamp.getItemId(), -1)); // ItemAmount
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -16,108 +16,36 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.serverpackets.magiclamp;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.data.xml.MagicLampData;
|
||||
import org.l2jmobius.gameserver.enums.LampMode;
|
||||
import org.l2jmobius.gameserver.enums.LampType;
|
||||
import org.l2jmobius.gameserver.model.actor.Player;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MagicLampHolder;
|
||||
import org.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
|
||||
/**
|
||||
* @author L2CCCP
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExMagicLampGameResult implements IClientOutgoingPacket
|
||||
{
|
||||
private final Map<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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
_rewards = rewards;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.EX_MAGICLAMP_GAME_RESULT.writeId(packet);
|
||||
packet.writeD(_reward.size()); // magicLampGameResult
|
||||
for (MagicLampHolder lamp : _reward.values())
|
||||
packet.writeD(_rewards.size());
|
||||
for (MagicLampHolder lamp : _rewards)
|
||||
{
|
||||
packet.writeC(lamp.getType().getGrade()); // cGradeNum
|
||||
packet.writeD(lamp.getCount()); // nRewardCount
|
||||
packet.writeQ(lamp.getExp()); // nEXP
|
||||
packet.writeQ(lamp.getSp()); // nSP
|
||||
packet.writeC(lamp.getType().getGrade());
|
||||
packet.writeD(lamp.getCount());
|
||||
packet.writeQ(lamp.getExp());
|
||||
packet.writeQ(lamp.getSp());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user