Witaj
Gość

Wątek: [poradnik] Stuck sub (core mod)  (Przeczytany 3721 razy)

  • Wiadomości: 50

  • Pochwał: 5

    • kompania obrony wybrzeża ASG
[poradnik] Stuck sub (core mod)
« dnia: Grudzień 19, 2010, 11:46:25 am »
Może zacznę od wytłumaczenia jednej rzeczy.
Stuck sub to zmiana subklasy z połączeniem skilli z obu klas.
Multiskill to dodawanie skilli bez zmiany subklasy.

przydatne umiejętności :
-umiejętność kompilacji lub http://forum.lineage2.com.pl/index.php/topic,20151.0.html
-umiejętność dodawania configów lub http://forum.lineage2.com.pl/index.php/topic,29101.msg323661.html#msg323661
-podstawy javy

Tutaj postaram się opisać mniej więcej jak zrobić StuckSub. O dziwo trzeba zacząć od sprawdzenia w plikach .properties czy mamy tam opcje ustawienia aby u każdego mastera można było wybrać każdą możliwą subklassę. jeśli tak- to git jeśli nie... no cóż przyda się Eclipse/Marven.

w Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2VillageMasterInstance.java
szukamy linijki odpowiadającej za rasy :
final Race npcRace = getVillageMasterRace();
  final ClassType npcTeachType = getVillageMasterTeachType();
zamieniamy je na następujące :
        getVillageMasterRace();
        getVillageMasterTeachType();
powyższe zmiany pozwalają na branie u każdego mastera subklas ze wszystkich ras.
Lecimy dalej, pozbywamy się także tych linii
               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);
                }


W pliku /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
szukamy
private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE charId=? AND class_index=?";i dodajemy pod nim
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";w tym samym pliku trzeba wyszukać
// Retrieve all skills of this L2PcInstance from the database
  con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(RESTORE_SKILLS_FOR_CHAR);
teraz tak... PreparedStatement statement = con.prepareStatement(RESTORE_SKILLS_FOR_CHAR); zamieniamy na:PreparedStatement statement = con.prepareStatement(isAcumulative ? ACUMULATE_SKILLS_FOR_CHAR_SUB : RESTORE_SKILLS_FOR_CHAR);linijkę statement.setInt(2, getClassIndex()); kasujemy i dodajemy pod statement.setInt(1, getObjectId()); if'aif (!isAcumulative)
statement.setInt(2, getClassIndex());

przechodzimy teraz do : /Trunk/L2_GameServer/java/net/sf/l2j/gameserver/model/base/PlayerClass.java
tutaj teraz jest pole do popisów. trzeba przemyśleć czy będzie to stuck z rasy, mutanty czy tylko pozwolimy pewnym klasą na stuck'i.
 private static final Set<PlayerClass> neverSubclassed = EnumSet.of(Overlord, Warsmith); ten wiersz odpowiada za to NA które klasy nie będzie można brać suby. Jeśli chcesz możesz tam wpisać klasy lub poprostu usunąć(wtedy każda klasa może być na subie)
poniżej jest linijka private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight); jest bardzo przydatna, można sobie spokojnie wybrać kto na co może brać subę. na tym przykładzie jest akurat zakaz wybierania tanka na tanka. jest to przydatne w wypadku gdy chcemy żeby można było brać tylko support na subke. Do tego jest też pare linijek niżej ale nie będę tego opisywał bo wystarczy poczytać jak to wygląda.
szukamy takiej linijki subclasses.removeAll(neverSubclassed); i kasujemy.
Teraz zabawy ciąg dalszy. szukamy switch (_race)
  {
i poniżej widać :
case Elf:
subclasses.removeAll(getSet(DarkElf, Third));
break;
case DarkElf:
subclasses.removeAll(getSet(Elf, Third));
break;
jest to wybór jaka rasa może jaką brać rasę na subke. Jeżeli chcecie np zrobić frakcje(human-elf,orc-krasnal,kamael-d.elf) wystarczy skasować to i stworzyć wg przykładu case Human:
                                                            subclasses.removeAll(getSet(DarkElf, Third));
                                                            subclasses.removeAll(getSet(Orc, Third)); 
                                                            subclasses.removeAll(getSet(Dwarf, Third));
                                                            subclasses.removeAll(getSet(Kamael, Third));
break;
jeśli kamaele mają się stuckować to usunąć należy subclasses.removeAll(getSet(Kamael, Third));te linijki nie pamiętam za co odpowiadały if (player.getTotalSubClasses() < 2)
subclasses.removeAll(EnumSet.of(inspector));
ale z tego co widzę należało się ich pozbyć. (nie lubię kamaeli wiec wszystko co z nimi związane odstawiałem zawsze na bok.)

skoro mamy to za sobą można zrobić już configa.
w /Trunk/L2_GameServer/java/net/sf/l2j/Config.java dodajemy sobie :
// stacksubs
public static boolean ACUMULATIVE_SUBCLASS_SKILLS;
najlepiej pod :
public static String[] FORBIDDEN_NAMESpotem szukamy FORBIDDEN_NAMES = Character.getProperty("ForbiddenNames", "").split(","); i poniżej dodajemy:
// stucksubs
ACUMULATIVE_SUBCLASS_SKILLS = Boolean.parseBoolean(Character.getProperty("SubStucking", "False"));
teraz w /Trunk/L2_GameServer/java/config/character.properties
na samym dole dodać trzeba #stucksub
SubStucking = False

to by było na tyle. gratki, że dotarłeś aż tutaj :D w nagrodę proszę bardzo Diff dla najnowszego L2J Freya :D
Index: F:/workspace/serv/L2_GameServer/java/config/Character.properties
===================================================================
--- F:/workspace/serv/L2_GameServer/java/config/Character.properties (revision 4433)
+++ F:/workspace/serv/L2_GameServer/java/config/Character.properties (working copy)
@@ -688,3 +688,6 @@
 # Disallow characters to have a name which contains the words.
 # Split them with ",". Example: announcements,announce...
 ForbiddenNames = annou,ammou,amnou,anmou,anou,amou
+
+#stucksub
+SubStucking = False
\ No newline at end of file

Index: F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (revision 4433)
+++ F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -276,6 +276,7 @@
 {
  // 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,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=?";
  private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND charId=? AND class_index=?";
@@ -8064,12 +8065,18 @@
 
  try
  {
+
+ //
+ 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)
+ // addon
+ statement.setInt(2, getClassIndex());
  ResultSet rset = statement.executeQuery();
 
  // Go though the recordset of this SQL query
Index: F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/base/PlayerClass.java
===================================================================
--- F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/base/PlayerClass.java (revision 4433)
+++ F:/workspace/serv/L2_GameServer/java/com/l2jserver/gameserver/model/base/PlayerClass.java (working copy)
@@ -270,12 +477,17 @@
 
  switch (player.getRace())
  {
- case Elf:
- subclasses.removeAll(getSet(DarkElf, Third));
- break;
- case DarkElf:
- subclasses.removeAll(getSet(Elf, Third));
- break;
+ case Human:
+ break;
+ case DarkElf:
+ break;
+ case Elf:
+ break;
+ case Orc:
+ break;
+ case Dwarf:
+ break;
+
  }
 
  subclasses.removeAll(getSet(Kamael, Third));
@@ -300,8 +512,6 @@
  else
  subclasses.removeAll(EnumSet.of(maleSoulbreaker));
  }
- if (player.getTotalSubClasses() < 2)
- subclasses.removeAll(EnumSet.of(inspector));
  }
  }
  return subclasses;
Index: F:/workspace/serv/L2_GameServer/java/com/l2jserver/Config.java
===================================================================
--- F:/workspace/serv/L2_GameServer/java/com/l2jserver/Config.java (revision 4433)
+++ F:/workspace/serv/L2_GameServer/java/com/l2jserver/Config.java (working copy)
@@ -216,7 +216,9 @@
  public static boolean STORE_RECIPE_SHOPLIST;
  public static boolean STORE_UI_SETTINGS;
  public static String[] FORBIDDEN_NAMES;
-
+ // stacksubs
+ public static boolean ACUMULATIVE_SUBCLASS_SKILLS;
+
  //--------------------------------------------------
  // ClanHall Settings
  //--------------------------------------------------
@@ -1659,6 +1661,9 @@
  STORE_RECIPE_SHOPLIST = Boolean.parseBoolean(Character.getProperty("StoreRecipeShopList", "False"));
  STORE_UI_SETTINGS = Boolean.parseBoolean(Character.getProperty("StoreCharUiSettings", "False"));
  FORBIDDEN_NAMES = Character.getProperty("ForbiddenNames", "").split(",");
+ // stucksubs
+ ACUMULATIVE_SUBCLASS_SKILLS = Boolean.parseBoolean(Character.getProperty("SubStucking", "False"));
+
  }
  catch (Exception e)
  {

coded by Interpid dla Maxcheaters, opracowane przez Veandil dla Lineage2.com.pl

/Tirius: plusik.
« Ostatnia zmiana: Grudzień 19, 2010, 01:49:52 pm wysłana przez Tirius »
WWW.KOMPANIA-OW.XORG.PL
ASG to nie tylko zabawa- to sposób życia