Sync with L2jServer HighFive Oct 22nd 2015.

This commit is contained in:
MobiusDev
2015-10-23 22:36:15 +00:00
parent ad889659fa
commit d49a007f9d
44 changed files with 1636 additions and 1117 deletions

View File

@ -25,19 +25,19 @@ import com.l2jserver.gameserver.data.xml.impl.AdminData;
*/
public class L2AccessLevel
{
/** The access level<br> */
/** The access level. */
private int _accessLevel = 0;
/** The access level name<br> */
/** The access level name. */
private String _name = null;
/** Child access levels */
L2AccessLevel _childsAccessLevel = null;
/** Child access levels */
/** Child access levels. */
private L2AccessLevel _childsAccessLevel = null;
/** Child access levels. */
private int _child = 0;
/** The name color for the access level<br> */
/** The name color for the access level. */
private int _nameColor = 0;
/** The title color for the access level<br> */
/** The title color for the access level. */
private int _titleColor = 0;
/** Flag to determine if the access level has gm access<br> */
/** Flag to determine if the access level has GM access. */
private boolean _isGm = false;
/** Flag for peace zone attack */
private boolean _allowPeaceAttack = false;
@ -89,9 +89,8 @@ public class L2AccessLevel
}
/**
* Returns the access level<br>
* <br>
* @return int: access level<br>
* Gets the access level.
* @return the access level
*/
public int getLevel()
{
@ -99,9 +98,8 @@ public class L2AccessLevel
}
/**
* Returns the access level name<br>
* <br>
* @return String: access level name<br>
* Gets the access level name.
* @return the access level name
*/
public String getName()
{
@ -109,9 +107,8 @@ public class L2AccessLevel
}
/**
* Returns the name color of the access level<br>
* <br>
* @return int: the name color for the access level<br>
* Gets the name color of the access level.
* @return the name color for the access level
*/
public int getNameColor()
{
@ -119,9 +116,8 @@ public class L2AccessLevel
}
/**
* Returns the title color color of the access level<br>
* <br>
* @return int: the title color for the access level<br>
* Gets the title color color of the access level.
* @return the title color for the access level
*/
public int getTitleColor()
{
@ -129,9 +125,8 @@ public class L2AccessLevel
}
/**
* Retuns if the access level has gm access or not<br>
* <br>
* @return boolean: true if access level have gm access, otherwise false<br>
* Verifies if the access level has GM access or not.
* @return {@code true} if access level have GM access, otherwise {@code false}
*/
public boolean isGm()
{
@ -139,9 +134,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level is allowed to attack in peace zone or not<br>
* <br>
* @return boolean: true if the access level is allowed to attack in peace zone, otherwise false<br>
* Verifies if the access level is allowed to attack in peace zone or not.
* @return {@code true} if the access level is allowed to attack in peace zone, otherwise {@code false}
*/
public boolean allowPeaceAttack()
{
@ -149,9 +143,8 @@ public class L2AccessLevel
}
/**
* Retruns if the access level is allowed to use fixed res or not<br>
* <br>
* @return true if the access level is allowed to use fixed res, otherwise false<br>
* Verifies if the access level is allowed to use fixed resurrection or not.
* @return {@ode true} if the access level is allowed to use fixed resurrection, otherwise {@code false}
*/
public boolean allowFixedRes()
{
@ -159,9 +152,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level is allowed to perform transactions or not<br>
* <br>
* @return boolean: true if access level is allowed to perform transactions, otherwise false<br>
* Verifies if the access level is allowed to perform transactions or not.
* @return {@ode true} if access level is allowed to perform transactions, otherwise {@code false}
*/
public boolean allowTransaction()
{
@ -169,9 +161,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level is allowed to use AltG commands or not<br>
* <br>
* @return boolean: true if access level is allowed to use AltG commands, otherwise false<br>
* Verifies if the access level is allowed to use AltG commands or not.
* @return {@ode true} if access level is allowed to use AltG commands, otherwise {@code false}
*/
public boolean allowAltG()
{
@ -179,9 +170,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level can give damage or not<br>
* <br>
* @return boolean: true if the access level can give damage, otherwise false<br>
* Verifies if the access level can give damage or not.
* @return {@ode true} if the access level can give damage, otherwise {@code false}
*/
public boolean canGiveDamage()
{
@ -189,9 +179,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level can take aggro or not<br>
* <br>
* @return boolean: true if the access level can take aggro, otherwise false<br>
* Verifies if the access level can take aggro or not.
* @return {@ode true} if the access level can take aggro, otherwise {@code false}
*/
public boolean canTakeAggro()
{
@ -199,9 +188,8 @@ public class L2AccessLevel
}
/**
* Returns if the access level can gain exp or not<br>
* <br>
* @return boolean: true if the access level can gain exp, otherwise false<br>
* Verifies if the access level can gain exp or not.
* @return {@ode true} if the access level can gain exp, otherwise {@code false}
*/
public boolean canGainExp()
{
@ -209,9 +197,9 @@ public class L2AccessLevel
}
/**
* Returns if the access level contains allowedAccess as child<br>
* @param accessLevel as AccessLevel<br>
* @return boolean: true if a child access level is equals to allowedAccess, otherwise false<br>
* Returns if the access level contains allowedAccess as child.
* @param accessLevel the parent access level
* @return {@ode true} if a child access level is equals to allowedAccess, otherwise {@code false}
*/
public boolean hasChildAccess(L2AccessLevel accessLevel)
{

View File

@ -1156,6 +1156,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
player.updatePvPStatus(target);
}
}
// Check if hit isn't missed
if (!hitted)
{
@ -1192,7 +1193,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
// Notify AI with EVT_READY_TO_ACT
ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), timeAtk + reuse);
// Old method - use in case of bow reuse issues occur.
// ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), timeAtk + reuse);
ThreadPoolManager.getInstance().scheduleAi(new NotifyAITask(this, CtrlEvent.EVT_READY_TO_ACT), timeAtk);
}
finally
{
@ -2636,6 +2639,8 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
{
if (_ai == null)
{
// Return the new AI within the synchronized block
// to avoid being nulled by other threads
return _ai = initAI();
}
}
@ -2655,7 +2660,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
public void setAI(L2CharacterAI newAI)
{
L2CharacterAI oldAI = _ai;
final L2CharacterAI oldAI = _ai;
if ((oldAI != null) && (oldAI != newAI) && (oldAI instanceof L2AttackableAI))
{
oldAI.stopAITask();
@ -5330,19 +5335,28 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
public int calculateReuseTime(L2Character target, L2Weapon weapon)
{
if ((weapon == null) || isTransformed())
if (isTransformed())
{
switch (getAttackType())
{
case BOW:
case CROSSBOW:
return (int) ((517500 * getStat().getWeaponReuseModifier(null)) / getStat().getPAtkSpd());
}
}
if ((weapon == null))
{
return 0;
}
int reuse = weapon.getReuseDelay();
// only bows should continue for now
if (reuse == 0)
{
return 0;
}
reuse *= getStat().getWeaponReuseModifier(target);
reuse *= getStat().getWeaponReuseModifier(null);
double atkSpd = getStat().getPAtkSpd();
switch (weapon.getItemType())
{
@ -6818,7 +6832,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return {@code true} if current player can revive and shows 'To Village' button upon death, {@code false} otherwise.
*/
public boolean canRevive()
@ -6827,7 +6841,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @param val
*/
public void setCanRevive(boolean val)
@ -6835,7 +6849,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2Attackable}
* Dummy method overridden in {@link L2Attackable}
* @return {@code true} if there is a loot to sweep, {@code false} otherwise.
*/
public boolean isSweepActive()
@ -6844,7 +6858,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return {@code true} if player is on event, {@code false} otherwise.
*/
public boolean isOnEvent()
@ -6853,7 +6867,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return the clan id of current character.
*/
public int getClanId()
@ -6862,7 +6876,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return the clan of current character.
*/
public L2Clan getClan()
@ -6871,7 +6885,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return {@code true} if player is in academy, {@code false} otherwise.
*/
public boolean isAcademyMember()
@ -6880,7 +6894,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return the pledge type of current character.
*/
public int getPledgeType()
@ -6889,7 +6903,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
}
/**
* Dummy method overriden in {@link L2PcInstance}
* Dummy method overridden in {@link L2PcInstance}
* @return the alliance id of current character.
*/
public int getAllyId()

View File

@ -191,23 +191,13 @@ public class L2Npc extends L2Character
return getTemplate().getSpiritShotChance();
}
public int getMinSkillChance()
{
return getTemplate().getMinSkillChance();
}
public int getMaxSkillChance()
{
return getTemplate().getMaxSkillChance();
}
/**
* Verifies if the NPC can cast a skill given the minimum and maximum skill chances.
* @return {@code true} if the NPC has chances of casting a skill
*/
public boolean hasSkillChance()
{
return Rnd.get(100) < Rnd.get(getMinSkillChance(), getMaxSkillChance());
return Rnd.get(100) < Rnd.get(getTemplate().getMinSkillChance(), getTemplate().getMaxSkillChance());
}
public boolean canMove()

View File

@ -78,9 +78,6 @@ public class L2MonsterInstance extends L2Attackable
return super.isAutoAttackable(attacker) && !isEventMob();
}
/**
* Return True if the L2MonsterInstance is Aggressive (aggroRange > 0).
*/
@Override
public boolean isAggressive()
{

View File

@ -7027,38 +7027,38 @@ public final class L2PcInstance extends L2Playable
{
// Retrieve the L2PcInstance from the characters table of the database
ps.setInt(1, objectId);
try (ResultSet rs = ps.executeQuery())
try (ResultSet rset = ps.executeQuery())
{
if (rs.next())
if (rset.next())
{
final int activeClassId = rs.getInt("classid");
final boolean female = rs.getInt("sex") != Sex.MALE.ordinal();
final int activeClassId = rset.getInt("classid");
final boolean female = rset.getInt("sex") != Sex.MALE.ordinal();
final L2PcTemplate template = PlayerTemplateData.getInstance().getTemplate(activeClassId);
PcAppearance app = new PcAppearance(rs.getByte("face"), rs.getByte("hairColor"), rs.getByte("hairStyle"), female);
PcAppearance app = new PcAppearance(rset.getByte("face"), rset.getByte("hairColor"), rset.getByte("hairStyle"), female);
player = new L2PcInstance(objectId, template, rs.getString("account_name"), app);
player.setName(rs.getString("char_name"));
restorePremiumSystemData(player, rs.getString("account_name"));
player._lastAccess = rs.getLong("lastAccess");
player = new L2PcInstance(objectId, template, rset.getString("account_name"), app);
player.setName(rset.getString("char_name"));
restorePremiumSystemData(player, rset.getString("account_name"));
player._lastAccess = rset.getLong("lastAccess");
player.getStat().setExp(rs.getLong("exp"));
player.setExpBeforeDeath(rs.getLong("expBeforeDeath"));
player.getStat().setLevel(rs.getByte("level"));
player.getStat().setSp(rs.getLong("sp"));
player.getStat().setExp(rset.getLong("exp"));
player.setExpBeforeDeath(rset.getLong("expBeforeDeath"));
player.getStat().setLevel(rset.getByte("level"));
player.getStat().setSp(rset.getLong("sp"));
player.setWantsPeace(rs.getInt("wantspeace"));
player.setWantsPeace(rset.getInt("wantspeace"));
player.setHeading(rs.getInt("heading"));
player.setHeading(rset.getInt("heading"));
player.setReputation(rs.getInt("reputation"));
player.setFame(rs.getInt("fame"));
player.setRaidPoints(rs.getInt("raidpoints"));
player.setPvpKills(rs.getInt("pvpkills"));
player.setPkKills(rs.getInt("pkkills"));
player.setOnlineTime(rs.getLong("onlinetime"));
player.setNoble(rs.getInt("nobless") == 1);
player.setReputation(rset.getInt("reputation"));
player.setFame(rset.getInt("fame"));
player.setRaidPoints(rset.getInt("raidpoints"));
player.setPvpKills(rset.getInt("pvpkills"));
player.setPkKills(rset.getInt("pkkills"));
player.setOnlineTime(rset.getLong("onlinetime"));
player.setNoble(rset.getInt("nobless") == 1);
final int factionId = rs.getInt("faction");
final int factionId = rset.getInt("faction");
if (factionId == 1)
{
player.setGood();
@ -7068,25 +7068,100 @@ public final class L2PcInstance extends L2Playable
player.setEvil();
}
player.setClanJoinExpiryTime(rs.getLong("clan_join_expiry_time"));
player.setClanJoinExpiryTime(rset.getLong("clan_join_expiry_time"));
if (player.getClanJoinExpiryTime() < System.currentTimeMillis())
{
player.setClanJoinExpiryTime(0);
}
player.setClanCreateExpiryTime(rs.getLong("clan_create_expiry_time"));
player.setClanCreateExpiryTime(rset.getLong("clan_create_expiry_time"));
if (player.getClanCreateExpiryTime() < System.currentTimeMillis())
{
player.setClanCreateExpiryTime(0);
}
int clanId = rs.getInt("clanid");
player.setPowerGrade(rs.getInt("power_grade"));
player.setPledgeType(rs.getInt("subpledge"));
player.setPowerGrade(rset.getInt("power_grade"));
player.setPledgeType(rset.getInt("subpledge"));
// player.setApprentice(rs.getInt("apprentice"));
player.setDeleteTimer(rset.getLong("deletetime"));
player.setTitle(rset.getString("title"));
player.setAccessLevel(rset.getInt("accesslevel"), false);
int titleColor = rset.getInt("title_color");
if (titleColor != PcAppearance.DEFAULT_TITLE_COLOR)
{
player.getAppearance().setTitleColor(titleColor);
}
player.setFistsWeaponItem(player.findFistsWeaponItem(activeClassId));
player.setUptime(System.currentTimeMillis());
currentHp = rset.getDouble("curHp");
currentCp = rset.getDouble("curCp");
currentMp = rset.getDouble("curMp");
player._classIndex = 0;
try
{
player.setBaseClass(rset.getInt("base_class"));
}
catch (Exception e)
{
// TODO: Should this be logged?
player.setBaseClass(activeClassId);
}
// Restore Subclass Data (cannot be done earlier in function)
if (restoreSubClassData(player))
{
if (activeClassId != player.getBaseClass())
{
for (SubClass subClass : player.getSubClasses().values())
{
if (subClass.getClassId() == activeClassId)
{
player._classIndex = subClass.getClassIndex();
}
}
}
}
if ((player.getClassIndex() == 0) && (activeClassId != player.getBaseClass()))
{
// Subclass in use but doesn't exist in DB -
// a possible restart-while-modifysubclass cheat has been attempted.
// Switching to use base class
player.setClassId(player.getBaseClass());
_log.warning("Player " + player.getName() + " reverted to base class. Possibly has tried a relogin exploit while subclassing.");
}
else
{
player._activeClass = activeClassId;
}
player.setApprentice(rset.getInt("apprentice"));
player.setSponsor(rset.getInt("sponsor"));
player.setLvlJoinedAcademy(rset.getInt("lvl_joined_academy"));
CursedWeaponsManager.getInstance().checkPlayer(player);
// Set the x,y,z position of the L2PcInstance and make it invisible
player.setXYZInvisible(rset.getInt("x"), rset.getInt("y"), rset.getInt("z"));
// Set Teleport Bookmark Slot
player.setBookMarkSlot(rset.getInt("BookmarkSlot"));
player._vitalityPoints = rset.getInt("vitality_points");
player.setPcBangPoints(rset.getInt("pccafe_points"));
// character creation Time
player.getCreateDate().setTimeInMillis(rset.getTimestamp("createDate").getTime());
// Language
player.setLang(rset.getString("language"));
// Set Hero status if it applies
player.setHero(Hero.getInstance().isHero(objectId));
int clanId = rset.getInt("clanid");
if (clanId > 0)
{
player.setClan(ClanTable.getInstance().getClan(clanId));
@ -7124,81 +7199,6 @@ public final class L2PcInstance extends L2Playable
player.getClanPrivileges().clear();
}
player.setDeleteTimer(rs.getLong("deletetime"));
player.setTitle(rs.getString("title"));
player.setAccessLevel(rs.getInt("accesslevel"), false);
int titleColor = rs.getInt("title_color");
if (titleColor != PcAppearance.DEFAULT_TITLE_COLOR)
{
player.getAppearance().setTitleColor(titleColor);
}
player.setFistsWeaponItem(player.findFistsWeaponItem(activeClassId));
player.setUptime(System.currentTimeMillis());
currentHp = rs.getDouble("curHp");
currentCp = rs.getDouble("curCp");
currentMp = rs.getDouble("curMp");
player._classIndex = 0;
try
{
player.setBaseClass(rs.getInt("base_class"));
}
catch (Exception e)
{
// TODO: Should this be logged?
player.setBaseClass(activeClassId);
}
// Restore Subclass Data (cannot be done earlier in function)
if (restoreSubClassData(player))
{
if (activeClassId != player.getBaseClass())
{
for (SubClass subClass : player.getSubClasses().values())
{
if (subClass.getClassId() == activeClassId)
{
player._classIndex = subClass.getClassIndex();
}
}
}
}
if ((player.getClassIndex() == 0) && (activeClassId != player.getBaseClass()))
{
// Subclass in use but doesn't exist in DB -
// a possible restart-while-modifysubclass cheat has been attempted.
// Switching to use base class
player.setClassId(player.getBaseClass());
_log.warning("Player " + player.getName() + " reverted to base class. Possibly has tried a relogin exploit while subclassing.");
}
else
{
player._activeClass = activeClassId;
}
player.setApprentice(rs.getInt("apprentice"));
player.setSponsor(rs.getInt("sponsor"));
player.setLvlJoinedAcademy(rs.getInt("lvl_joined_academy"));
CursedWeaponsManager.getInstance().checkPlayer(player);
// Set the x,y,z position of the L2PcInstance and make it invisible
player.setXYZInvisible(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"));
// Set Teleport Bookmark Slot
player.setBookMarkSlot(rs.getInt("BookmarkSlot"));
player._vitalityPoints = rs.getInt("vitality_points");
player.setPcBangPoints(rs.getInt("pccafe_points"));
// character creation Time
player.getCreateDate().setTimeInMillis(rs.getTimestamp("createDate").getTime());
// Language
player.setLang(rs.getString("language"));
// Retrieve the name and ID of the other characters assigned to this account.
try (PreparedStatement stmt = con.prepareStatement("SELECT charId, char_name FROM characters WHERE account_name=? AND charId<>?"))
{
@ -8939,17 +8939,12 @@ public final class L2PcInstance extends L2Playable
// Are the target and the player in the same duel?
if (isInDuel())
{
// Get L2PcInstance
if (target instanceof L2Playable)
final L2PcInstance cha = target.getActingPlayer();
if ((cha != null) && (cha.getDuelId() != getDuelId()))
{
// Get L2PcInstance
L2PcInstance cha = target.getActingPlayer();
if (cha.getDuelId() != getDuelId())
{
sendMessage("You cannot do this while duelling.");
sendPacket(ActionFailed.STATIC_PACKET);
return false;
}
sendMessage("You cannot do this while duelling.");
sendPacket(ActionFailed.STATIC_PACKET);
return false;
}
}
@ -9119,13 +9114,13 @@ public final class L2PcInstance extends L2Playable
case SELF:
break;
default:
if (!checkPvpSkill(target, skill) && !getAccessLevel().allowPeaceAttack() && target.isPlayable())
// Verify that player can attack a player or summon
if (target.isPlayable() && !getAccessLevel().allowPeaceAttack() && !checkPvpSkill(target, skill))
{
// Send a System Message to the L2PcInstance
// Send a System Message to the player
sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
// Send a Server->Client packet ActionFailed to the L2PcInstance
// Send a Server->Client packet ActionFailed to the player
sendPacket(ActionFailed.STATIC_PACKET);
return false;
}
@ -9192,7 +9187,7 @@ public final class L2PcInstance extends L2Playable
return false;
}
if (!(target instanceof L2Playable))
if (!target.isPlayable())
{
return true;
}
@ -9243,7 +9238,6 @@ public final class L2PcInstance extends L2Playable
return false;
}
}
}
final boolean isCtrlPressed = (getCurrentSkill() != null) && getCurrentSkill().isCtrlPressed();
@ -9289,18 +9283,19 @@ public final class L2PcInstance extends L2Playable
{
if (aClan.isAtWarWith(tClan.getId()) && tClan.isAtWarWith(aClan.getId()))
{
// Check if skill can do dmg
return true; // Always return true at war.
// Check if skill can do damage
if ((skill.isAOE() && (skill.getEffectRange() > 0)) && isCtrlPressed && (getTarget() == target))
{
return true;
}
return isCtrlPressed;
}
else if ((getClanId() == targetPlayer.getClanId()) || ((getAllyId() > 0) && (getAllyId() == targetPlayer.getAllyId())))
{
// Check if skill can do dmg
if ((skill.getEffectRange() > 0) && isCtrlPressed && (getTarget() == target))
// Check if skill can do damage
if ((skill.getEffectRange() > 0) && isCtrlPressed && (getTarget() == target) && skill.isDamage())
{
if (skill.isDamage())
{
return true;
}
return true;
}
return false;
}
@ -9317,15 +9312,12 @@ public final class L2PcInstance extends L2Playable
}
// On retail, it is impossible to debuff a "peaceful" player.
if ((targetPlayer.getPvpFlag() == 0) && (targetPlayer.getReputation() >= 0))
if ((targetPlayer.getPvpFlag() == 0) && (targetPlayer.getReputation() > 0))
{
// Check if skill can do dmg
if ((skill.getEffectRange() > 0) && isCtrlPressed && (getTarget() == target))
// Check if skill can do damage
if ((skill.getEffectRange() > 0) && isCtrlPressed && (getTarget() == target) && skill.isDamage())
{
if (skill.isDamage())
{
return true;
}
return true;
}
return false;
}

View File

@ -43,6 +43,7 @@ public enum L2EffectType
HEAL,
HP_DRAIN,
MAGICAL_ATTACK,
MAGICAL_ATTACK_MP,
MANAHEAL_BY_LEVEL,
MANAHEAL_PERCENT,
MUTE,

View File

@ -1504,7 +1504,7 @@ public class Quest extends AbstractScript implements IIdentifiable
{
showHtmlFile(player, res, npc);
}
else if (res.startsWith("<html>"))
else if (res.startsWith("<html"))
{
final NpcHtmlMessage npcReply = new NpcHtmlMessage(npc != null ? npc.getObjectId() : 0, res);
npcReply.replace("%playername%", player.getName());

View File

@ -91,6 +91,7 @@ public enum AbnormalType
CRITICAL_PROB_UP,
CURSE_LIFE_FLOW,
DAMAGE_AMPLIFY,
DANCE_DEFENCE_MOTION1,
DANCE_OF_ALIGNMENT,
DANCE_OF_AQUA_GUARD,
DANCE_OF_BERSERKER,
@ -122,6 +123,7 @@ public enum AbnormalType
DMG_SHIELD,
DOT_ATTR,
DOT_MP,
DRAGON_BUFF,
DRAGON_BREATH,
DUELIST_SPIRIT,
DWARF_ATTACK_BUFF,
@ -289,6 +291,7 @@ public enum AbnormalType
SOA_BUFF1,
SOA_BUFF2,
SOA_BUFF3,
SONG_BATTLE_WHISPER,
SONG_OF_CHAMPION,
SONG_OF_EARTH,
SONG_OF_ELEMENTAL,