From d976ea9556f137e5a49bf22efa0c3115ee8991ca Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 4 Jan 2022 23:52:50 +0000 Subject: [PATCH] Removed subclassLock from modifySubClass method. --- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 99 ++++++------- .../gameserver/model/actor/Player.java | 99 ++++++------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- .../gameserver/model/actor/Player.java | 130 ++++++++---------- 23 files changed, 1283 insertions(+), 1645 deletions(-) diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java index b15def488c..e7e72f3bf4 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9593,90 +9593,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java index 560e33629e..db30121d53 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9596,90 +9596,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java index e03e179f8b..e3cd7cc8af 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9598,90 +9598,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java index 531325b309..b91f88f3b4 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9589,90 +9589,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java index 5dad5c930a..b649305016 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9613,90 +9613,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java index d06d930445..ce41d76529 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9613,90 +9613,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java index d02de41943..d76cc98cee 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9619,90 +9619,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java index 01011c2039..8b11445a1c 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9634,90 +9634,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java index 554e0981f6..a163364dc0 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9736,90 +9736,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java index 6948b5ceef..e9cd53c0a7 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9762,90 +9762,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index 5870bf294e..aa8fbf3a58 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9812,90 +9812,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java index 406bc9c84b..c1568a21fa 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -10161,69 +10161,56 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId) { - if (_subclassLock) + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + + // This must be done in order to maintain data consistency. + getSubClasses().remove(classIndex); return false; } - _subclassLock = true; - try + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check { - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - - // This must be done in order to maintain data consistency. - getSubClasses().remove(classIndex); - return false; - } - - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check - { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); - } - - getSubClasses().remove(classIndex); - } - finally - { - _subclassLock = false; + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); } + getSubClasses().remove(classIndex); + return addSubClass(newClassId, classIndex); } diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java index c3b3cf0cfc..7d3e294b83 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -10044,69 +10044,56 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId) { - if (_subclassLock) + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + + // This must be done in order to maintain data consistency. + getSubClasses().remove(classIndex); return false; } - _subclassLock = true; - try + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check { - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - - // This must be done in order to maintain data consistency. - getSubClasses().remove(classIndex); - return false; - } - - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check - { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); - } - - getSubClasses().remove(classIndex); - } - finally - { - _subclassLock = false; + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); } + getSubClasses().remove(classIndex); + return addSubClass(newClassId, classIndex); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java index d4a2ac7faa..ed6d66b0d8 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9495,90 +9495,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java index f986fabccc..588f738e00 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9495,90 +9495,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java index 5500f4bbea..9431535ad6 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9481,90 +9481,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java index 67eb9c71ed..b3afc05ff1 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9508,90 +9508,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java index 5526b17664..715fedeec4 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9508,90 +9508,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java index ac3fa3088f..4b2ef059c1 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9462,90 +9462,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java index c544fa771b..5dd84c56ce 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9483,90 +9483,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java index bc8f2cd925..0753973463 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9627,90 +9627,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java index 4ed81f9519..10fcd47360 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9693,90 +9693,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java index 5b3302cdc2..773a6fd8b0 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -9693,90 +9693,74 @@ public class Player extends Playable */ public boolean modifySubClass(int classIndex, int newClassId, boolean isDualClass) { - if (_subclassLock) + // Notify to scripts before class is removed. + if (!getSubClasses().isEmpty()) // also null check + { + final int classId = getSubClasses().get(classIndex).getClassId(); + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + } + + final SubClassHolder subClass = getSubClasses().get(classIndex); + if (subClass == null) { return false; } - _subclassLock = true; - try + if (subClass.isDualClass()) { - // Notify to scripts before class is removed. - if (!getSubClasses().isEmpty()) // also null check + getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); + getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); + int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); + if (revelationSkill != 0) { - final int classId = getSubClasses().get(classIndex).getClassId(); - EventDispatcher.getInstance().notifyEventAsync(new OnPlayerProfessionCancel(this, classId), this); + removeSkill(revelationSkill); } - - final SubClassHolder subClass = getSubClasses().get(classIndex); - if (subClass == null) + revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); + if (revelationSkill != 0) { - return false; - } - - if (subClass.isDualClass()) - { - getVariables().remove(PlayerVariables.ABILITY_POINTS_DUAL_CLASS); - getVariables().remove(PlayerVariables.ABILITY_POINTS_USED_DUAL_CLASS); - int revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_1_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - revelationSkill = getVariables().getInt(PlayerVariables.REVELATION_SKILL_2_DUAL_CLASS, 0); - if (revelationSkill != 0) - { - removeSkill(revelationSkill); - } - } - - // Remove after stats are recalculated. - getSubClasses().remove(classIndex); - - try (Connection con = DatabaseFactory.getConnection(); - PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); - PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); - PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); - PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); - PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) - { - // Remove all henna info stored for this sub-class. - deleteHennas.setInt(1, getObjectId()); - deleteHennas.setInt(2, classIndex); - deleteHennas.execute(); - - // Remove all shortcuts info stored for this sub-class. - deleteShortcuts.setInt(1, getObjectId()); - deleteShortcuts.setInt(2, classIndex); - deleteShortcuts.execute(); - - // Remove all effects info stored for this sub-class. - deleteSkillReuse.setInt(1, getObjectId()); - deleteSkillReuse.setInt(2, classIndex); - deleteSkillReuse.execute(); - - // Remove all skill info stored for this sub-class. - deleteSkills.setInt(1, getObjectId()); - deleteSkills.setInt(2, classIndex); - deleteSkills.execute(); - - // Remove all basic info stored about this sub-class. - deleteSubclass.setInt(1, getObjectId()); - deleteSubclass.setInt(2, classIndex); - deleteSubclass.execute(); - } - catch (Exception e) - { - LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); - return false; + removeSkill(revelationSkill); } } - finally + + // Remove after stats are recalculated. + getSubClasses().remove(classIndex); + + try (Connection con = DatabaseFactory.getConnection(); + PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS); + PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS); + PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE); + PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS); + PreparedStatement deleteSubclass = con.prepareStatement(DELETE_CHAR_SUBCLASS)) { - _subclassLock = false; - getStat().recalculateStats(false); - updateAbnormalVisualEffects(); - sendSkillList(); + // Remove all henna info stored for this sub-class. + deleteHennas.setInt(1, getObjectId()); + deleteHennas.setInt(2, classIndex); + deleteHennas.execute(); + + // Remove all shortcuts info stored for this sub-class. + deleteShortcuts.setInt(1, getObjectId()); + deleteShortcuts.setInt(2, classIndex); + deleteShortcuts.execute(); + + // Remove all effects info stored for this sub-class. + deleteSkillReuse.setInt(1, getObjectId()); + deleteSkillReuse.setInt(2, classIndex); + deleteSkillReuse.execute(); + + // Remove all skill info stored for this sub-class. + deleteSkills.setInt(1, getObjectId()); + deleteSkills.setInt(2, classIndex); + deleteSkills.execute(); + + // Remove all basic info stored about this sub-class. + deleteSubclass.setInt(1, getObjectId()); + deleteSubclass.setInt(2, classIndex); + deleteSubclass.execute(); + } + catch (Exception e) + { + LOGGER.log(Level.WARNING, "Could not modify sub class for " + getName() + " to class index " + classIndex + ": " + e.getMessage(), e); + return false; } return addSubClass(newClassId, classIndex, isDualClass);