[manual] Новые Профы
1. Придумать професии
2. Обзавестись компилятором и де компилятором явки. Для декомпиля тора отлично подойдет DJ Java Decompiler 3.9.rar
3. Редактировать серверные файлы, а именно:
В качестве примера сборка La2base Java Developers Team Int 1.0.1
\\La2base Java Developers Team Int 1.0.1\libraries\la2base\net\sf\l2j\gameserver\model\base
- ClassId.class
- PlayerClass.class
4. Редактировать таблицы mySQL, а именно:
- char_templates
- skill_trees
- skill_spellbooks
- skill_learn
5. Редактируем клиент. Для этого служит файл sysstring-e.dat .
Только после придания чару соответственной новой профессии через базу, смотрим что пишет нам клиент. Декодируем sysstring-e.dat ищем такую строчку, меняем и запаковываем все обратно.
В базе и исходниках заполняем по примеру другихх классов.
Имейте в виду , что если вы хотите дать одну одну профу разным классам/рассам, то вам придется сдублировать строчки этой профы (например dеmonHunterELF и dеmonHunterDarkELF) в яве и в базе.
Что касается клиента вы должны или сделать мускульный запрос или сменить iD в базе + после запуска игры и коннекта открываем свойства перса и смотрим как называется профа. Потом делаем по предыдущей инструкции.
Значит так. Этот мануал был воскрешен с убитого ST-Team. Автора не помню - значит копирайт все за тем же мертвяком.
Через полчаса залью пояснение.
Значит так.
В: Что редактировать в ядре ?
О: Читай первое сообщение поста.
В: Что конкретно редактировать ?
О: Данная операция интуитивна проста. Но ждите ее в виде конкретного примера вечером. Я на парах (с мобилы).
В: Зачем редактировать мускул ? И почему именно так.
О: Мы редактируем мускул т.к. По другому нельзя. Далее.
- char_templates - вписываем id чара, название профы, и статы воизбежание дизбаланса, лучше скопировать с др. проф этой же рассы.
- skill_trees - дерево скиллов. От этой таблы зависит какие скиллы, и кстати ска3ать когда, увидит плеер.
- skill_learn - id npc у которых учить скиллы.
- skill_spellbooks - каким скиллам нужны книги
конкретно опять же вечером. Что непонятно пишите сюда, а потом в асю чтоб я быстро ответил. 407002362
Чтобъ получить максимум ценных сведений, пишите больше и интересней.
Ну пионеры. Все им расскажи, покажи дай попробывать. :)
Заходи в яндекс. Забивай в строку DJ Java Decompiler 3.9 + crack . Все до 5 метров. Это декомпилятор.
так . редактируем ядро лезем в net\sf\l2j\gameserver\model\base\
в папке много файлов из них нам с вами нужно всего два, это ClassId.class(.java) и PlayerClass.class(.java).
Рекомендую сразу сохранить их в формат *.java для пущего удобства.
В первом - ClassId.java :
// Положим что первая профа - Dark Wizard
// Вторая профа ниже
public static final ClassId darkMessiah;
// третья соответственно
public static final ClassId greatTeacher;
[code]
// Decompiled by DJ v3.9.9.91 Copyright 2005 Atanas Neshkov Date: 19.08.2008 23:30:38
// Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name: ClassId.java
package net.sf.l2j.gameserver.model.base;
// Referenced classes of package net.sf.l2j.gameserver.model.base:
// Race
public final class ClassId extends Enum
{
public static ClassId[] values()
{
return (ClassId[])$VALUES.clone();
}
public static ClassId valueOf(String name)
{
return (ClassId)Enum.valueOf(net/sf/l2j/gameserver/model/base/ClassId, name);
}
private ClassId(String s, int i, int pId, boolean pIsMage, Race pRace, ClassId pParent)
{
super(s, i);
_id = pId;
_isMage = pIsMage;
_race = pRace;
_parent = pParent;
}
public final int getId()
{
return _id;
}
public final boolean isMage()
{
return _isMage;
}
public final Race getRace()
{
return _race;
}
public final boolean childOf(ClassId cid)
{
if(_parent == null)
return false;
if(_parent == cid)
return true;
else
return _parent.childOf(cid);
}
public final boolean equalsOrChildOf(ClassId cid)
{
return this == cid || childOf(cid);
}
public final int level()
{
if(_parent == null)
return 0;
else
return 1 + _parent.level();
}
public final ClassId getParent()
{
return _parent;
}
............................................................................
public static final ClassId darkMage;
public static final ClassId darkWizard;
public static final ClassId darkMessiah;
// При желании можете перепечатать это:
public static final ClassId dummyEntry1;
public static final ClassId dummyEntry2;
public static final ClassId dummyEntry3;
// Хотя не стоит..
// Ниже идут 3 профы
public static final ClassId greatTeacher;
private final int _id;
private final boolean _isMage;
private final Race _race;
private final ClassId _parent;
private static final ClassId $VALUES[];
static
{
darkMage = new ClassId("darkMage", 38, 38, true, Race.darkelf, null);
darkWizard = new ClassId("darkWizard", 39, 39, true, Race.darkelf, darkMage);
darkMessiah = new ClassId("darkMessiah", 119, 119, true, Race.darkelf, darkMage);
// кого интересует верхняя строчка ? всех. Как редактировать ?
// страшную тайну раскрывает данная строчка :
// private ClassId(String s, int i, int pId, boolean pIsMage, Race pRace, ClassId pParent)
// т.е. . . . . . . . . профа, id / id? / маг - не маг / раса / класс
// ниже
$VALUES = (new ClassId[] {
// вбиваем свою профу ниже всего.
Далее имеем PlayerClass.java :
Сдесь все очень похоже. Только вместо public static final ClassId написано public static final PlayerClass.
DarkElvenMystic = new PlayerClass("DarkElvenMystic", 38, PlayerRace.DarkElf, ClassType.Mystic, ClassLevel.First);
DarkElvenWizard = new PlayerClass("DarkElvenWizard", 39, PlayerRace.DarkElf, ClassType.Mystic, ClassLevel.Second);
DarkMessiah = new PlayerClass("DarkMessiah", 119, PlayerRace.DarkElf, ClassType.Mystic, ClassLevel.Third);
GreatTeacher = new PlayerClass("GreatTeacher", 120, PlayerRace.DarkElf, ClassType.Mystic, ClassLevel.Fourth);
//и
$VALUES = (new PlayerClass[] {
// вбиваем ниже свои профы
neverSubclassed = EnumSet.of(Overlord, Warsmith);
\\ не когда не беретсся (сверху)
subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight);
subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker);
subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger);
subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner);
subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler);
subclassSetMap = new EnumMap(net/sf/l2j/gameserver/model/base/PlayerClass);
Set subclasses = getSet(null, ClassLevel.Third);
subclasses.removeAll(neverSubclassed);
mainSubclassSet = subclasses;
subclassSetMap.put(DarkAvenger, subclasseSet1);
subclassSetMap.put(Paladin, subclasseSet1);
subclassSetMap.put(TempleKnight, subclasseSet1);
subclassSetMap.put(ShillienKnight, subclasseSet1);
// аналогичные сабы - которые не беруться
subclassSetMap.put(TreasureHunter, subclasseSet2);
subclassSetMap.put(AbyssWalker, subclasseSet2);
subclassSetMap.put(Plainswalker, subclasseSet2);
subclassSetMap.put(Hawkeye, subclasseSet3);
subclassSetMap.put(SilverRanger, subclasseSet3);
subclassSetMap.put(PhantomRanger, subclasseSet3);
subclassSetMap.put(Warlock, subclasseSet4);
subclassSetMap.put(ElementalSummoner, subclasseSet4);
subclassSetMap.put(PhantomSummoner, subclasseSet4);
subclassSetMap.put(Sorceror, subclasseSet5);
subclassSetMap.put(Spellsinger, subclasseSet5);
subclassSetMap.put(Spellhowler, subclasseSet5);
вот и все. Что дальше непонятно - спрашивайте.
ПС, это моя последняя тема. Я временно перехожу на CS1.6 .
Незабудьте о квестах на полноценном серваке. Вам придется написать квесты 1й - 3й профы. И при этом переписать многие другие квесты, чтобы к ним имели доступ чары с новой профой.
Компилятор - идет пакетом библиотек. Кажется JDK ИЛИ SDK. X3. Я такие мелочи как абр. Не запоминаю.
Обратитесь к одному из админов. Думаю если он отпишется в теме - это нам всем польстит.
Что касается клиента то меня терзают смутные сомнения. Я редактил декомпилированный дат вин.хекс'ом

