Proper support for Elixirs.
Contributed by manax182.
This commit is contained in:
parent
543c73482c
commit
3a6bd69465
@ -107,9 +107,6 @@ The Kamael: https://eu.4game.com/patchnotes/lineage2classic/154/
|
||||
-Auto potion system
|
||||
-Rank system
|
||||
|
||||
Essence: https://eu.4game.com/patchnotes/lineage2essence/188/
|
||||
-Just enter game support
|
||||
|
||||
Customs:
|
||||
-Newbie Helper NPC location info
|
||||
-Newbie Helper buff support until 40 level
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -7921,7 +7921,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))
|
||||
@ -8011,7 +8011,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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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";
|
||||
|
@ -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;
|
||||
@ -620,13 +619,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()))
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user