Index: /Trunk/L2_GameServer/java/config/intrepid.properties
===================================================================
--- /Trunk/L2_GameServer/java/config/intrepid.properties (revision 30)
+++ /Trunk/L2_GameServer/java/config/intrepid.properties (revision 49)
@@ -30,2 +30,5 @@
#---------------------------------------------
AllowedNPCTypes = L2Boss,L2Chest,L2FestivalMonster,L2Minion,L2Monster,L2Pet,L2RaidBoss,L2SiegeGuard,L2SiegeNpc,L2ControlTower,L2GrandBoss,L2Artefact,L2FortManager,L2FortSiegeNpc,L2FortSiegeGuard,L2FortCommander,L2FortBallista
+
+# Sub stuck
+SubStucking = False
Index: /Trunk/L2_GameServer/java/net/sf/l2j/Config.java
===================================================================
--- /Trunk/L2_GameServer/java/net/sf/l2j/Config.java (revision 30)
+++ /Trunk/L2_GameServer/java/net/sf/l2j/Config.java (revision 49)
@@ -652,4 +652,6 @@
/** List of NPC types that won't allow casting */
public static FastList<String> LIST_ALLOWED_NPC_TYPES = new FastList<String>();
+ /** stuck sub **/
+ public static boolean ACUMULATIVE_SUBCLASS_SKILLS;
/** ************************************************** **/
@@ -1552,4 +1554,5 @@
LIST_ALLOWED_NPC_TYPES.add(npc_type);
}
+ ACUMULATIVE_SUBCLASS_SKILLS = Boolean.parseBoolean(intrepidSettings.getProperty("SubStucking", "False"));
}
catch (Exception e)
Index: /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java
===================================================================
--- /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (revision 8)
+++ /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java (revision 49)
@@ -816,6 +816,6 @@
- final Race npcRace = getVillageMasterRace();
- final ClassType npcTeachType = getVillageMasterTeachType();
+ getVillageMasterRace();
+ getVillageMasterTeachType();
PlayerClass currClass = PlayerClass.values()[charClassId];
@@ -862,22 +862,4 @@
availSubs.remove(availSub);
}
-
- if (npcRace == Race.Human || npcRace == Race.Elf)
- {
- // If the master is human or light elf, ensure that fighter-type
- // masters only teach fighter classes, and priest-type masters
- // only teach priest classes etc.
- if (!availSub.isOfType(npcTeachType)) availSubs.remove(availSub);
-
- // Remove any non-human or light elf classes.
- else if (!availSub.isOfRace(Race.Human)
- && !availSub.isOfRace(Race.Elf)) availSubs.remove(availSub);
- }
- else
- {
- // If the master is not human and not light elf,
- // then remove any classes not of the same race as the master.
- if (!availSub.isOfRace(npcRace)) availSubs.remove(availSub);
- }
}
}
Index: /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 48)
+++ /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 49)
@@ -231,4 +231,5 @@
// Character Skill SQL String Definitions:
private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE charId=? AND class_index=?";
+ private static final String ACUMULATE_SKILLS_FOR_CHAR_SUB = "SELECT skill_id,skill_level FROM character_skills WHERE charId=? ORDER BY skill_id , skill_level ASC";
private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (charId,skill_id,skill_level,skill_name,class_index) VALUES (?,?,?,?,?)";
private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND charId=? AND class_index=?";
@@ -7557,10 +7558,14 @@
try
{
+ // L2 Emu Addon
+ boolean isAcumulative = Config.ACUMULATIVE_SUBCLASS_SKILLS;
+
// Retrieve all skills of this L2PcInstance from the database
con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement = con.prepareStatement(RESTORE_SKILLS_FOR_CHAR);
-
+ PreparedStatement statement = con.prepareStatement(isAcumulative ? ACUMULATE_SKILLS_FOR_CHAR_SUB : RESTORE_SKILLS_FOR_CHAR);
statement.setInt(1, getObjectId());
- statement.setInt(2, getClassIndex());
+ if (!isAcumulative)
+ // L2 Emu Addon
+ statement.setInt(2, getClassIndex());
ResultSet rset = statement.executeQuery();
Index: /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/base/PlayerClass.java
===================================================================
--- /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/base/PlayerClass.java (revision 6)
+++ /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/base/PlayerClass.java (revision 49)
@@ -209,5 +209,4 @@
private static final Set<PlayerClass> mainSubclassSet;
- private static final Set<PlayerClass> neverSubclassed = EnumSet.of(Overlord, Warsmith);
private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight);
@@ -222,5 +221,4 @@
{
Set<PlayerClass> subclasses = getSet(null, Third);
- subclasses.removeAll(neverSubclassed);
mainSubclassSet = subclasses;
@@ -269,9 +267,38 @@
switch (_race)
{
+ case Human:
+ subclasses.removeAll(getSet(DarkElf, Third));
+ subclasses.removeAll(getSet(Elf, Third));
+ subclasses.removeAll(getSet(Orc, Third));
+ subclasses.removeAll(getSet(Dwarf, Third));
+ subclasses.removeAll(getSet(Kamael, Third));
+ break;
+ case DarkElf:
+ subclasses.removeAll(getSet(Human, Third));
+ subclasses.removeAll(getSet(Elf, Third));
+ subclasses.removeAll(getSet(Orc, Third));
+ subclasses.removeAll(getSet(Dwarf, Third));
+ subclasses.removeAll(getSet(Kamael, Third));
+ break;
case Elf:
+ subclasses.removeAll(getSet(Human, Third));
subclasses.removeAll(getSet(DarkElf, Third));
- break;
- case DarkElf:
+ subclasses.removeAll(getSet(Orc, Third));
+ subclasses.removeAll(getSet(Dwarf, Third));
+ subclasses.removeAll(getSet(Kamael, Third));
+ break;
+ case Orc:
+ subclasses.removeAll(getSet(Human, Third));
+ subclasses.removeAll(getSet(DarkElf, Third));
subclasses.removeAll(getSet(Elf, Third));
+ subclasses.removeAll(getSet(Dwarf, Third));
+ subclasses.removeAll(getSet(Kamael, Third));
+ break;
+ case Dwarf:
+ subclasses.removeAll(getSet(Human, Third));
+ subclasses.removeAll(getSet(DarkElf, Third));
+ subclasses.removeAll(getSet(Orc, Third));
+ subclasses.removeAll(getSet(Elf, Third));
+ subclasses.removeAll(getSet(Kamael, Third));
break;
}
@@ -294,6 +321,4 @@
else
subclasses.removeAll(EnumSet.of(femaleSoulbreaker));
- if (player.getTotalSubClasses() < 2)
- subclasses.removeAll(EnumSet.of(inspector));
}
}
Index: /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 49)
+++ /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 50)
@@ -7575,12 +7575,20 @@
int id = rset.getInt("skill_id");
int level = rset.getInt("skill_level");
+ int chclass = rset.getInt("class_index");
if (id > 9000 && id < 9007)
continue; // fake skills for base stats
-
+ if(chclass != getClassIndex())
+
+ {
+ // Remove armor mastery from other classes
+ if(id == 118 || id == 163 || id == 236 || id == 249 || id == 252 || id == 253 || id == 258 || id == 259) continue;
+ }
+
// Create a L2Skill object for each record
L2Skill skill = SkillTable.getInstance().getInfo(id, level);
-
- // Add the L2Skill object to the L2Character _skills and its Func objects to the calculator set of the L2Character
+
+ // Add the L2Skill object to the L2Character _skills and its
+ // Func objects to the calculator set of the L2Character
super.addSkill(skill);
if (Config.CHECK_SKILLS && Config.CHECK_SKILLS_ACCESS_LEVEL_LIST.contains(getAccessLevel().getLevel()))
@@ -7594,5 +7602,5 @@
removeSkill(skill);
}
- }
+ }
rset.close();