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

@@ -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;
}