Proper support for Elixirs.

Contributed by manax182.
This commit is contained in:
MobiusDevelopment 2021-05-24 23:52:13 +00:00
parent 8ed2401490
commit 543c73482c
8 changed files with 169 additions and 47 deletions

View File

@ -18,7 +18,9 @@ package handlers.itemhandlers;
import org.l2jmobius.gameserver.model.actor.Playable;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
public class Elixir extends ItemSkills
{
@ -30,6 +32,34 @@ public class Elixir extends ItemSkills
playable.sendPacket(SystemMessageId.YOUR_PET_CANNOT_CARRY_THIS_ITEM);
return false;
}
final int elixirsAvailable = playable.getActingPlayer().getVariables().getInt(PlayerVariables.ELIXIRS_AVAILABLE, 0);
final int elixirsUsed = playable.getActingPlayer().getVariables().getInt(PlayerVariables.ELIXIRS_USED, 0) + elixirsAvailable;
if ((playable.getLevel() >= 88) && (elixirsUsed >= 10))
{
playable.sendPacket(SystemMessageId.THE_ELIXIR_UNAVAILABLE);
return false;
}
else if ((playable.getLevel() < 88) && (playable.getLevel() >= 76) && (elixirsUsed >= 5))
{
playable.sendPacket(SystemMessageId.THE_ELIXIR_UNAVAILABLE);
return false;
}
else if (playable.getLevel() < 76)
{
playable.sendPacket(SystemMessageId.THE_ELIXIR_UNAVAILABLE);
return false;
}
if (!playable.getActingPlayer().destroyItem("Elixir", item.getObjectId(), 1, playable.getActingPlayer(), true))
{
playable.sendPacket(SystemMessageId.THE_ELIXIR_UNAVAILABLE);
return false;
}
playable.getActingPlayer().getVariables().set(PlayerVariables.ELIXIRS_AVAILABLE, elixirsAvailable + 1);
playable.sendPacket(new SystemMessage(SystemMessageId.THANKS_TO_THE_ELIXIR_CHARACTER_S_STAT_POINTS_S1).addInt(1));
playable.getActingPlayer().broadcastUserInfo();
return super.useItem(playable, item, forceUse);
}
}

View File

@ -7988,7 +7988,7 @@ public class PlayerInstance extends Playable
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this PlayerInstance
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.STAT_POINTS, UserInfoType.STAT_ABILITIES, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
final long remainingTime = getVariables().getLong("HennaDuration" + slot, 0) - Chronos.currentTimeMillis();
if ((henna.getDuration() < 0) || (remainingTime > 0))
@ -8078,7 +8078,7 @@ public class PlayerInstance extends Playable
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this PlayerInstance
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.STAT_ABILITIES, UserInfoType.STAT_POINTS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
// Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerHennaAdd(this, henna), this);

View File

@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.stats.BaseStat;
import org.l2jmobius.gameserver.model.stats.IStatFunction;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
/**
* @author UnAfraid
@ -47,7 +48,43 @@ public class BaseStatFinalizer implements IStatFunction
// Henna calculation
baseValue += player.getHennaValue(BaseStat.valueOf(stat));
// Bonus stats
switch (stat)
{
case STAT_STR:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_STR, 0);
break;
}
case STAT_CON:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_CON, 0);
break;
}
case STAT_DEX:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_DEX, 0);
break;
}
case STAT_INT:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_INT, 0);
break;
}
case STAT_MEN:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_MEN, 0);
break;
}
case STAT_WIT:
{
baseValue += player.getVariables().getInt(PlayerVariables.STAT_WIT, 0);
break;
}
}
}
return validateValue(creature, Stat.defaultValue(creature, stat, baseValue), 1, BaseStat.MAX_STAT_VALUE - 1);
}
}

View File

@ -71,6 +71,8 @@ public class PlayerVariables extends AbstractVariables
public static final String MAGIC_LAMP_COUNT = "MAGIC_LAMP_COUNT";
public static final String DEATH_POINT_COUNT = "DEATH_POINT_COUNT";
public static final String FAVORITE_TELEPORTS = "FAVORITE_TELEPORTS";
public static final String ELIXIRS_AVAILABLE = "ELIXIRS_AVAILABLE";
public static final String ELIXIRS_USED = "ELIXIRS_USED";
public static final String STAT_POINTS = "STAT_POINTS";
public static final String STAT_STR = "STAT_STR";
public static final String STAT_DEX = "STAT_DEX";

View File

@ -62,7 +62,6 @@ import org.l2jmobius.gameserver.model.siege.Fort;
import org.l2jmobius.gameserver.model.siege.FortSiege;
import org.l2jmobius.gameserver.model.siege.Siege;
import org.l2jmobius.gameserver.model.skills.AbnormalVisualEffect;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.variables.AccountVariables;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.model.zone.ZoneId;
@ -627,13 +626,6 @@ public class EnterWorld implements IClientIncomingPacket
player.sendMessage("Experience gain is disabled.");
}
player.getStat().mergeAdd(Stat.STAT_STR, player.getVariables().getInt(PlayerVariables.STAT_STR, 0));
player.getStat().mergeAdd(Stat.STAT_DEX, player.getVariables().getInt(PlayerVariables.STAT_DEX, 0));
player.getStat().mergeAdd(Stat.STAT_CON, player.getVariables().getInt(PlayerVariables.STAT_CON, 0));
player.getStat().mergeAdd(Stat.STAT_INT, player.getVariables().getInt(PlayerVariables.STAT_INT, 0));
player.getStat().mergeAdd(Stat.STAT_WIT, player.getVariables().getInt(PlayerVariables.STAT_WIT, 0));
player.getStat().mergeAdd(Stat.STAT_MEN, player.getVariables().getInt(PlayerVariables.STAT_MEN, 0));
player.broadcastUserInfo();
if (BeautyShopData.getInstance().hasBeautyData(player.getRace(), player.getAppearance().getSexType()))

View File

@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.network.clientpackets.stats;
import static org.l2jmobius.gameserver.model.itemcontainer.Inventory.LCOIN_ID;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.limitshop.ExBloodyCoinCount;
/**
* @author Mobius
@ -44,16 +46,67 @@ public class ExResetStatusBonus implements IClientIncomingPacket
return;
}
// 200 L-Coin requirement?
if (player.reduceAdena("ExResetStatusBonus", 100000, player, true))
final int points = player.getVariables().getInt(PlayerVariables.STAT_POINTS, 0);
int adenaCost = 5000000;
int lcoinCost = 600;
switch (points)
{
player.getStat().mergeAdd(Stat.STAT_STR, -player.getVariables().getInt(PlayerVariables.STAT_STR, 0));
player.getStat().mergeAdd(Stat.STAT_DEX, -player.getVariables().getInt(PlayerVariables.STAT_DEX, 0));
player.getStat().mergeAdd(Stat.STAT_CON, -player.getVariables().getInt(PlayerVariables.STAT_CON, 0));
player.getStat().mergeAdd(Stat.STAT_INT, -player.getVariables().getInt(PlayerVariables.STAT_INT, 0));
player.getStat().mergeAdd(Stat.STAT_WIT, -player.getVariables().getInt(PlayerVariables.STAT_WIT, 0));
player.getStat().mergeAdd(Stat.STAT_MEN, -player.getVariables().getInt(PlayerVariables.STAT_MEN, 0));
case 1:
case 2:
case 3:
case 4:
case 5:
{
adenaCost = 200000;
lcoinCost = 200;
break;
}
case 6:
case 7:
case 8:
case 9:
case 10:
{
adenaCost = 500000;
lcoinCost = 300;
break;
}
case 11:
case 12:
case 13:
case 14:
case 15:
{
adenaCost = 1000000;
lcoinCost = 400;
break;
}
case 16:
case 17:
case 18:
case 19:
case 20:
{
adenaCost = 2000000;
lcoinCost = 500;
break;
}
case 21:
case 22:
case 23:
case 24:
case 25:
{
adenaCost = 5000000;
lcoinCost = 600;
break;
}
}
if (player.reduceAdena("ExResetStatusBonus", adenaCost, player, true) && (player.getInventory().getInventoryItemCount(LCOIN_ID, -1) >= lcoinCost))
{
player.getInventory().destroyItemByItemId("ExResetStatusBonus", LCOIN_ID, lcoinCost, player, true);
player.sendPacket(new ExBloodyCoinCount(player));
player.getVariables().remove(PlayerVariables.STAT_POINTS);
player.getVariables().remove(PlayerVariables.STAT_STR);
player.getVariables().remove(PlayerVariables.STAT_DEX);
@ -61,6 +114,8 @@ public class ExResetStatusBonus implements IClientIncomingPacket
player.getVariables().remove(PlayerVariables.STAT_INT);
player.getVariables().remove(PlayerVariables.STAT_WIT);
player.getVariables().remove(PlayerVariables.STAT_MEN);
player.getVariables().set(PlayerVariables.ELIXIRS_AVAILABLE, player.getVariables().getInt(PlayerVariables.ELIXIRS_USED, 0) + player.getVariables().getInt(PlayerVariables.ELIXIRS_AVAILABLE, 0));
player.getVariables().remove(PlayerVariables.ELIXIRS_USED);
player.sendPacket(new UserInfo(player));
player.getStat().recalculateStats(true);

View File

@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.clientpackets.stats;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
@ -39,8 +38,8 @@ public class ExSetStatusBonus implements IClientIncomingPacket
@Override
public boolean read(GameClient client, PacketReader packet)
{
packet.readH(); // ?
packet.readH(); // ?
packet.readH(); // unk
packet.readH(); // totalBonus
_str = packet.readH();
_dex = packet.readH();
_con = packet.readH();
@ -64,45 +63,52 @@ public class ExSetStatusBonus implements IClientIncomingPacket
}
final int usedPoints = player.getVariables().getInt(PlayerVariables.STAT_POINTS, 0);
final int elixirsAvailable = player.getVariables().getInt(PlayerVariables.ELIXIRS_AVAILABLE, 0);
final int elixirsUsed = player.getVariables().getInt(PlayerVariables.ELIXIRS_USED, 0);
final int currentPoints = _str + _dex + _con + _int + _wit + _men;
if ((player.getLevel() - 75 - usedPoints - currentPoints) < 0)
if ((((player.getLevel() - 75) + elixirsAvailable) - usedPoints - currentPoints) < 0)
{
return;
}
player.getVariables().set(PlayerVariables.STAT_POINTS, usedPoints + currentPoints);
if (((player.getLevel() - 75) - usedPoints - currentPoints) < 0)
{
final int neededElixirs = -((player.getLevel() - 75) - usedPoints - currentPoints);
final int neededPoints = currentPoints - neededElixirs;
player.getVariables().set(PlayerVariables.ELIXIRS_AVAILABLE, Math.min(0, elixirsAvailable - neededElixirs));
player.getVariables().set(PlayerVariables.ELIXIRS_USED, elixirsUsed + neededElixirs);
player.getVariables().set(PlayerVariables.STAT_POINTS, usedPoints + neededPoints);
}
else
{
player.getVariables().set(PlayerVariables.STAT_POINTS, usedPoints + currentPoints);
}
if (_str > 0)
{
player.getVariables().set(PlayerVariables.STAT_STR, player.getVariables().getInt(PlayerVariables.STAT_STR, 0) + _str);
player.getStat().mergeAdd(Stat.STAT_STR, _str);
}
if (_dex > 0)
{
player.getVariables().set(PlayerVariables.STAT_DEX, player.getVariables().getInt(PlayerVariables.STAT_DEX, 0) + _dex);
player.getStat().mergeAdd(Stat.STAT_DEX, _dex);
}
if (_con > 0)
{
player.getVariables().set(PlayerVariables.STAT_CON, player.getVariables().getInt(PlayerVariables.STAT_CON, 0) + _con);
player.getStat().mergeAdd(Stat.STAT_CON, _con);
}
if (_int > 0)
{
player.getVariables().set(PlayerVariables.STAT_INT, player.getVariables().getInt(PlayerVariables.STAT_INT, 0) + _int);
player.getStat().mergeAdd(Stat.STAT_INT, _int);
}
if (_wit > 0)
{
player.getVariables().set(PlayerVariables.STAT_WIT, player.getVariables().getInt(PlayerVariables.STAT_WIT, 0) + _wit);
player.getStat().mergeAdd(Stat.STAT_WIT, _wit);
}
if (_men > 0)
{
player.getVariables().set(PlayerVariables.STAT_MEN, player.getVariables().getInt(PlayerVariables.STAT_MEN, 0) + _men);
player.getStat().mergeAdd(Stat.STAT_MEN, _men);
}
player.sendPacket(new UserInfo(player));
player.getStat().recalculateStats(true);
}
}

View File

@ -427,32 +427,32 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
if (containsMask(UserInfoType.STAT_POINTS)) // 235
{
packet.writeH(16);
packet.writeH(_player.getLevel() < 76 ? 0 : _player.getLevel() - 75 - _player.getVariables().getInt(PlayerVariables.STAT_POINTS, 0)); // Usable points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_STR, 0)); // STR points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_DEX, 0)); // DEX points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_CON, 0)); // CON points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_INT, 0)); // INT points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_WIT, 0)); // WIT points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_MEN, 0)); // MEN points
packet.writeH(_player.getLevel() < 76 ? 0 : (_player.getLevel() - 75) + _player.getVariables().getInt(PlayerVariables.ELIXIRS_AVAILABLE, 0) + _player.getVariables().getInt(PlayerVariables.ELIXIRS_USED, 0)); // Usable points
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_STR, 0));
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_DEX, 0));
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_CON, 0));
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_INT, 0));
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_WIT, 0));
packet.writeH(_player.getVariables().getInt(PlayerVariables.STAT_MEN, 0));
}
if (containsMask(UserInfoType.STAT_ABILITIES)) // 235
{
packet.writeH(18);
packet.writeH(_player.getStat().getSTR() - _player.getVariables().getInt(PlayerVariables.STAT_STR, 0)); // additional STR
packet.writeH(_player.getStat().getDEX() - _player.getVariables().getInt(PlayerVariables.STAT_DEX, 0)); // additional DEX
packet.writeH(_player.getStat().getCON() - _player.getVariables().getInt(PlayerVariables.STAT_CON, 0)); // additional CON
packet.writeH(_player.getStat().getINT() - _player.getVariables().getInt(PlayerVariables.STAT_INT, 0)); // additional INT
packet.writeH(_player.getStat().getWIT() - _player.getVariables().getInt(PlayerVariables.STAT_WIT, 0)); // additional WIT
packet.writeH(_player.getStat().getMEN() - _player.getVariables().getInt(PlayerVariables.STAT_MEN, 0)); // additional MEN
packet.writeH(_player.getSTR() - _player.getTemplate().getBaseSTR() - _player.getVariables().getInt(PlayerVariables.STAT_STR, 0)); // additional STR
packet.writeH(_player.getDEX() - _player.getTemplate().getBaseDEX() - _player.getVariables().getInt(PlayerVariables.STAT_DEX, 0)); // additional DEX
packet.writeH(_player.getCON() - _player.getTemplate().getBaseCON() - _player.getVariables().getInt(PlayerVariables.STAT_CON, 0)); // additional CON
packet.writeH(_player.getINT() - _player.getTemplate().getBaseINT() - _player.getVariables().getInt(PlayerVariables.STAT_INT, 0)); // additional INT
packet.writeH(_player.getWIT() - _player.getTemplate().getBaseWIT() - _player.getVariables().getInt(PlayerVariables.STAT_WIT, 0)); // additional WIT
packet.writeH(_player.getMEN() - _player.getTemplate().getBaseMEN() - _player.getVariables().getInt(PlayerVariables.STAT_MEN, 0)); // additional MEN
packet.writeH(0x00);
packet.writeH(0x00);
}
if (containsMask(UserInfoType.ELIXIR_USED)) // 286
{
packet.writeH(0x00); // count
packet.writeD(0x00);
packet.writeD(_player.getVariables().getInt(PlayerVariables.ELIXIRS_USED, 0)); // count
packet.writeH(0);
}
// Send exp bonus change.