Запуск:
- Декомпилирует ai.obj в AST, затем в NASC. При желании AST можно конвертировать в любой другой ЯП (Java, ...). См. core/codegen.php для написания генератора в другой ЯП.
- Также работает с ai.obj от AdvExt. Для добавления своих типов и функций см. в папку data. Большинство адресов функций и переменных получено дизассемблированием L2NPC.exe.
- Полученный NASC успешно компилируется обратно.
- Закинуть ai.obj в папку с декомпилятором.
- Запустить run.bat....
Серьезно? Пояснишь? А то аж обидно стало за 7500 рубликов (этот еще не тестил)Я бы сказал что даже лучше чем адвексов декомпилятор.
К примеру самое простое, это адвексыСерьезно? Пояснишь? А то аж обидно стало за 7500 рубликов (этот еще не тестил)
class newbie_guide : citizen
{
parameter:
string fnHi = "";
string fnHighLevel = "";
string fnRaceMisMatch = "";
string fnGuideF05 = "";
string fnGuideF10 = "";
string fnGuideF15 = "";
string fnGuideF20 = "";
string fnGuideM07 = "";
string fnGuideM14 = "";
string fnGuideM20 = "";
string ShopName = "";
string fnCoupon1Ok = "newbie_guide002.htm";
string fnCoupon1Not1 = "newbie_guide003.htm";
string fnCoupon1Not2 = "newbie_guide004.htm";
string fnCoupon1Not3 = "newbie_guide005.htm";
string fnCoupon2Ok = "newbie_guide011.htm";
string fnCoupon2Not1 = "newbie_guide012.htm";
string fnCoupon2Not2 = "newbie_guide013.htm";
string fnCoupon2Not3 = "newbie_guide014.htm";
int num_coupon1 = 5;
int num_coupon2 = 1;
string fnNoSummonCreature = "blessing_list002b.htm";
property:
TelPosList Position = {{"Talking Island Village"; -84169; 244693; -3729; 100000; 0 }};
handler:
EventHandler TALKED(talker)
{
myself.ShowPage(talker,fnHi);
}
EventHandler CREATED()
{
myself.RegisterTeleporterType(1,0);
super;
}
EventHandler MENU_SELECTED(talker,ask,reply,i0,c0)
{
if( ask == -7 && reply == 1 )
{
if( myself.sm.race == 5 )
{
if( talker.race != myself.sm.race )
{
myself.ShowPage(talker,"guide_krenisk003.htm");
}
else if( talker.level > 20 || myself.IsInCategory(62,talker.occupation) != 1 )
{
myself.ShowPage(talker,"guide_krenisk002.htm");
}
else if( talker.occupation == 123 )
{
if( talker.level <= 5 )
{
myself.ShowPage(talker,"guide_krenisk_kmf05.htm");
}
else if( talker.level <= 10 )
{
myself.ShowPage(talker,"guide_krenisk_kmf10.htm");
}
else if( talker.level <= 15 )
{
myself.ShowPage(talker,"guide_krenisk_kmf15.htm");
}
else
{
myself.ShowPage(talker,"guide_krenisk_kmf20.htm");
}
}
else if( talker.occupation == 124 )
{
if( talker.level <= 5 )
{
myself.ShowPage(talker,"guide_krenisk_kff05.htm");
}
else if( talker.level <= 10 )
{
myself.ShowPage(talker,"guide_krenisk_kff10.htm");
}
else if( talker.level <= 15 )
{
myself.ShowPage(talker,"guide_krenisk_kff15.htm");
}
else
{
myself.ShowPage(talker,"guide_krenisk_kff20.htm");
}
}
}
else if( talker.race != myself.sm.race )
{
myself.ShowPage(talker,fnRaceMisMatch);
}
else if( talker.level > 20 || myself.IsInCategory(6,talker.occupation) == 0 )
{
myself.ShowPage(talker,fnHighLevel);
}
else if( myself.IsInCategory(0,talker.occupation) )
{
if( talker.level <= 5 )
{
myself.ShowPage(talker,fnGuideF05);
}
else if( talker.level <= 10 )
{
myself.ShowPage(talker,fnGuideF10);
}
else if( talker.level <= 15 )
{
myself.ShowPage(talker,fnGuideF15);
}
else
{
myself.ShowPage(talker,fnGuideF20);
}
}
else if( talker.level <= 7 )
{
myself.ShowPage(talker,fnGuideM07);
}
else if( talker.level <= 14 )
{
myself.ShowPage(talker,fnGuideM14);
}
else
{
myself.ShowPage(talker,fnGuideM20);
}
}
else if( ask == -7 && reply == 2 )
{
if( talker.level <= 62 )
{
if( talker.level < 6 )
{
myself.ShowPage(talker,"guide_for_newbie002.htm");
}
else
{
myself.CastBuffForQuestReward(talker,283246593);
myself.CastBuffForQuestReward(talker,283312129);
myself.CastBuffForQuestReward(talker,369426433);
if( myself.IsInCategory(66,talker.occupation) )
{
myself.CastBuffForQuestReward(talker,283377665);
myself.CastBuffForQuestReward(talker,283443201);
myself.CastBuffForQuestReward(talker,283508737);
if( talker.level >= 6 && talker.level <= 39 )
{
myself.CastBuffForQuestReward(talker,283574273);
}
if( talker.level >= 40 && talker.level <= 62 )
{
myself.CastBuffForQuestReward(talker,369098753);
}
if( talker.level >= 16 && talker.level <= 34 )
{
myself.CastBuffForQuestReward(talker,284295169);
}
}
else if( myself.IsInCategory(67,talker.occupation) )
{
myself.CastBuffForQuestReward(talker,283639809);
myself.CastBuffForQuestReward(talker,283705345);
myself.CastBuffForQuestReward(talker,283770881);
myself.CastBuffForQuestReward(talker,283836417);
if( talker.level >= 16 && talker.level <= 34 )
{
myself.CastBuffForQuestReward(talker,284295169);
}
}
}
}
else
{
myself.ShowPage(talker,"guide_for_newbie003.htm");
}
}
else if( ask == -7 && reply == 3 )
{
if( talker.level <= 39 && ( myself.IsInCategory(6,talker.occupation) || myself.IsInCategory(7,talker.occupation) ) )
{
myself.CastBuffForQuestReward(talker,339607553);
}
else
{
myself.ShowPage(talker,"pk_protect002.htm");
}
}
else if( ask == -7 && reply == 4 )
{
c0 = myself.GetSummon(talker);
if( myself.IsNullCreature(c0) == 0 && myself.IsInCategory(12,c0.class_id) && myself.IsInCategory(35,c0.class_id) == 0 )
{
if( talker.level < 6 || talker.level > 62 )
{
myself.ShowPage(talker,"guide_for_newbie003.htm");
}
else
{
myself.CastBuffForQuestReward(c0,283246593);
myself.CastBuffForQuestReward(c0,283312129);
myself.CastBuffForQuestReward(c0,369426433);
myself.CastBuffForQuestReward(c0,283377665);
myself.CastBuffForQuestReward(c0,283443201);
myself.CastBuffForQuestReward(c0,283508737);
myself.CastBuffForQuestReward(c0,283639809);
myself.CastBuffForQuestReward(c0,283705345);
myself.CastBuffForQuestReward(c0,283770881);
myself.CastBuffForQuestReward(c0,283836417);
if( talker.level >= 6 && talker.level <= 39 )
{
myself.CastBuffForQuestReward(c0,283574273);
}
if( talker.level >= 40 && talker.level <= 62 )
{
myself.CastBuffForQuestReward(c0,369098753);
}
}
}
else
{
myself.ShowPage(talker,fnNoSummonCreature);
}
}
if( ask == -1000 )
{
select(reply)
{
case 1:
if( talker.level > 5 )
{
if( talker.level < 20 && myself.IsInCategory(6,talker.occupation) )
{
if( myself.GetOneTimeQuestFlag(talker,207) == 0 )
{
if( myself.GetInventoryInfo(talker,0) >= ( myself.GetInventoryInfo(talker,1) * 0.800000 ) || myself.GetInventoryInfo(talker,2) >= ( myself.GetInventoryInfo(talker,3) * 0.800000 ) )
{
myself.ShowSystemMessage(talker,1118);
return;
}
myself.GiveItem1(talker,@q_adventure_coupon1,num_coupon1);
myself.SetOneTimeQuestFlag(talker,207,@letters_of_love1);
myself.ShowPage(talker,fnCoupon1Ok);
i0 = gg.GetNRMemoState(talker,@guide_mission);
myself.SetNRMemoState(talker,@guide_mission,( i0 + 100 ));
gg.ShowOnScreenMsgStr(talker,2,0,0,0,1,0,5000,0,gg.MakeFString(4153,"","","","",""));
}
else
{
myself.ShowPage(talker,fnCoupon1Not2);
}
}
else
{
myself.ShowPage(talker,fnCoupon1Not1);
}
}
else
{
myself.ShowPage(talker,fnCoupon1Not1);
}
break;
case 2:
if( myself.IsInCategory(7,talker.occupation) )
{
if( talker.level < 40 )
{
if( myself.GetOneTimeQuestFlag(talker,208) == 0 )
{
if( myself.GetInventoryInfo(talker,0) >= ( myself.GetInventoryInfo(talker,1) * 0.800000 ) || myself.GetInventoryInfo(talker,2) >= ( myself.GetInventoryInfo(talker,3) * 0.800000 ) )
{
myself.ShowSystemMessage(talker,1118);
return;
}
myself.GiveItem1(talker,@q_adventure_coupon2,num_coupon2);
myself.SetOneTimeQuestFlag(talker,208,@letters_of_love1);
myself.ShowPage(talker,fnCoupon2Ok);
}
else
{
myself.ShowPage(talker,fnCoupon2Not2);
}
}
else
{
myself.ShowPage(talker,fnCoupon2Not1);
}
}
else
{
myself.ShowPage(talker,fnCoupon2Not1);
}
break;
}
}
if( ask == -303 )
{
select(reply)
{
case 528:
case 530:
if( talker.level > 5 )
{
if( talker.level < 20 && myself.IsInCategory(6,talker.occupation) )
{
if( reply != 532 || reply != 549 )
{
myself.ShowMultisell(reply,talker);
}
}
else if( reply >= 557 && reply <= 562 )
{
if( myself.sm.class_id == 1032103 )
{
myself.ShowMultisell(reply,talker);
}
}
else if( reply == 567 )
{
if( myself.sm.class_id == 1032091 )
{
myself.ShowMultisell(reply,talker);
}
}
else
{
myself.ShowPage(talker,fnCoupon1Not3);
}
}
else
{
myself.ShowPage(talker,fnCoupon1Not3);
}
break;
case 529:
case 531:
if( myself.IsInCategory(7,talker.occupation) )
{
if( talker.level < 40 )
{
if( reply != 532 || reply != 549 )
{
myself.ShowMultisell(reply,talker);
}
}
else if( reply >= 557 && reply <= 562 )
{
if( myself.sm.class_id == 1032103 )
{
myself.ShowMultisell(reply,talker);
}
}
else if( reply == 567 )
{
if( myself.sm.class_id == 1032091 )
{
myself.ShowMultisell(reply,talker);
}
}
else
{
myself.ShowPage(talker,fnCoupon2Not3);
}
}
else
{
myself.ShowPage(talker,fnCoupon2Not3);
}
break;
}
}
}
EventHandler TELEPORT_REQUESTED(talker)
{
if( talker.level >= 20 )
{
myself.ShowPage(talker,"guide_teleport_over001.htm");
}
else
{
myself.Teleport(talker,Position,ShopName,"","","",57,"");
}
}
}
class newbie_guide : citizen {
parameter:
string fnHi = "";
string fnHighLevel = "";
string fnRaceMisMatch = "";
string fnGuideF05 = "";
string fnGuideF10 = "";
string fnGuideF15 = "";
string fnGuideF20 = "";
string fnGuideM07 = "";
string fnGuideM14 = "";
string fnGuideM20 = "";
string ShopName = "";
string fnCoupon1Ok = "newbie_guide002.htm";
string fnCoupon1Not1 = "newbie_guide003.htm";
string fnCoupon1Not2 = "newbie_guide004.htm";
string fnCoupon1Not3 = "newbie_guide005.htm";
string fnCoupon2Ok = "newbie_guide011.htm";
string fnCoupon2Not1 = "newbie_guide012.htm";
string fnCoupon2Not2 = "newbie_guide013.htm";
string fnCoupon2Not3 = "newbie_guide014.htm";
int num_coupon1 = 5;
int num_coupon2 = 1;
string fnNoSummonCreature = "blessing_list002b.htm";
property:
TelPosList Position = {
{"Talking Island Village"; -84169; 244693; -3729; 100000; 0}
};
handler:
EventHandler TALKED(talker) {
ShowPage(talker, fnHi);
}
EventHandler CREATED() {
RegisterTeleporterType(1, 0);
super;
}
EventHandler MENU_SELECTED(talker, ask, reply, i0, c0) {
if (ask == -7 && reply == 1) {
if (myself.sm.race == @race_kamael) {
if (talker.race != myself.sm.race) {
ShowPage(talker, "guide_krenisk003.htm");
} else if (talker.level > 20 || IsInCategory(@kamael_first_class_group, talker.occupation) != 1) {
ShowPage(talker, "guide_krenisk002.htm");
} else if (talker.occupation == @kamael_m_soldier) {
if (talker.level <= 5) {
ShowPage(talker, "guide_krenisk_kmf05.htm");
} else if (talker.level <= 10) {
ShowPage(talker, "guide_krenisk_kmf10.htm");
} else if (talker.level <= 15) {
ShowPage(talker, "guide_krenisk_kmf15.htm");
} else {
ShowPage(talker, "guide_krenisk_kmf20.htm");
}
} else if (talker.occupation == @kamael_f_soldier) {
if (talker.level <= 5) {
ShowPage(talker, "guide_krenisk_kff05.htm");
} else if (talker.level <= 10) {
ShowPage(talker, "guide_krenisk_kff10.htm");
} else if (talker.level <= 15) {
ShowPage(talker, "guide_krenisk_kff15.htm");
} else {
ShowPage(talker, "guide_krenisk_kff20.htm");
}
}
} else if (talker.race != myself.sm.race) {
ShowPage(talker, fnRaceMisMatch);
} else if (talker.level > 20 || IsInCategory(@first_class_group, talker.occupation) == 0) {
ShowPage(talker, fnHighLevel);
} else if (IsInCategory(@fighter_group, talker.occupation)) {
if (talker.level <= 5) {
ShowPage(talker, fnGuideF05);
} else if (talker.level <= 10) {
ShowPage(talker, fnGuideF10);
} else if (talker.level <= 15) {
ShowPage(talker, fnGuideF15);
} else {
ShowPage(talker, fnGuideF20);
}
} else if (talker.level <= 7) {
ShowPage(talker, fnGuideM07);
} else if (talker.level <= 14) {
ShowPage(talker, fnGuideM14);
} else {
ShowPage(talker, fnGuideM20);
}
} else if (ask == -7 && reply == 2) {
if (talker.level <= 62) {
if (talker.level < 6) {
ShowPage(talker, "guide_for_newbie002.htm");
} else {
CastBuffForQuestReward(talker, 283246593);
CastBuffForQuestReward(talker, 283312129);
CastBuffForQuestReward(talker, 369426433);
if (IsInCategory(@beginner_fighter, talker.occupation)) {
CastBuffForQuestReward(talker, 283377665);
CastBuffForQuestReward(talker, 283443201);
CastBuffForQuestReward(talker, 283508737);
if (talker.level >= 6 && talker.level <= 39) {
CastBuffForQuestReward(talker, 283574273);
}
if (talker.level >= 40 && talker.level <= 62) {
CastBuffForQuestReward(talker, 369098753);
}
if (talker.level >= 16 && talker.level <= 34) {
CastBuffForQuestReward(talker, 284295169);
}
} else if (IsInCategory(@beginner_mage, talker.occupation)) {
CastBuffForQuestReward(talker, 283639809);
CastBuffForQuestReward(talker, 283705345);
CastBuffForQuestReward(talker, 283770881);
CastBuffForQuestReward(talker, 283836417);
if (talker.level >= 16 && talker.level <= 34) {
CastBuffForQuestReward(talker, 284295169);
}
}
}
} else {
ShowPage(talker, "guide_for_newbie003.htm");
}
} else if (ask == -7 && reply == 3) {
if (talker.level <= 39 && (IsInCategory(@first_class_group, talker.occupation) || IsInCategory(@second_class_group, talker.occupation))) {
CastBuffForQuestReward(talker, 339607553);
} else {
ShowPage(talker, "pk_protect002.htm");
}
} else if (ask == -7 && reply == 4) {
c0 = GetSummon(talker);
if (IsNullCreature(c0) == 0 && IsInCategory(@summon_npc_group, c0.class_id) && IsInCategory(@pet_group, c0.class_id) == 0) {
if (talker.level < 6 || talker.level > 62) {
ShowPage(talker, "guide_for_newbie003.htm");
} else {
CastBuffForQuestReward(c0, 283246593);
CastBuffForQuestReward(c0, 283312129);
CastBuffForQuestReward(c0, 369426433);
CastBuffForQuestReward(c0, 283377665);
CastBuffForQuestReward(c0, 283443201);
CastBuffForQuestReward(c0, 283508737);
CastBuffForQuestReward(c0, 283639809);
CastBuffForQuestReward(c0, 283705345);
CastBuffForQuestReward(c0, 283770881);
CastBuffForQuestReward(c0, 283836417);
if (talker.level >= 6 && talker.level <= 39) {
CastBuffForQuestReward(c0, 283574273);
}
if (talker.level >= 40 && talker.level <= 62) {
CastBuffForQuestReward(c0, 369098753);
}
}
} else {
ShowPage(talker, fnNoSummonCreature);
}
}
if (ask == -1000) {
select (reply) {
case 1:
if (talker.level > 5) {
if (talker.level < 20 && IsInCategory(@first_class_group, talker.occupation)) {
if (GetOneTimeQuestFlag(talker, 207) == 0) {
if (GetInventoryInfo(talker, 0) >= GetInventoryInfo(talker, 1) * 0.800000 || GetInventoryInfo(talker, 2) >= GetInventoryInfo(talker, 3) * 0.800000) {
ShowSystemMessage(talker, 1118);
return;
}
GiveItem1(talker, @q_adventure_coupon1, num_coupon1);
SetOneTimeQuestFlag(talker, 207, 1);
ShowPage(talker, fnCoupon1Ok);
i0 = GetNRMemoState(talker, 41);
SetNRMemoState(talker, 41, i0 + 100);
ShowOnScreenMsgStr(talker, 2, 0, 0, 0, 1, 0, 5000, 0, MakeFString(4153, "", "", "", "", ""));
} else {
ShowPage(talker, fnCoupon1Not2);
}
} else {
ShowPage(talker, fnCoupon1Not1);
}
} else {
ShowPage(talker, fnCoupon1Not1);
}
break;
case 2:
if (IsInCategory(@second_class_group, talker.occupation)) {
if (talker.level < 40) {
if (GetOneTimeQuestFlag(talker, 208) == 0) {
if (GetInventoryInfo(talker, 0) >= GetInventoryInfo(talker, 1) * 0.800000 || GetInventoryInfo(talker, 2) >= GetInventoryInfo(talker, 3) * 0.800000) {
ShowSystemMessage(talker, 1118);
return;
}
GiveItem1(talker, @q_adventure_coupon2, num_coupon2);
SetOneTimeQuestFlag(talker, 208, 1);
ShowPage(talker, fnCoupon2Ok);
} else {
ShowPage(talker, fnCoupon2Not2);
}
} else {
ShowPage(talker, fnCoupon2Not1);
}
} else {
ShowPage(talker, fnCoupon2Not1);
}
break;
}
}
if (ask == -303) {
select (reply) {
case 528:
case 530:
if (talker.level > 5) {
if (talker.level < 20 && IsInCategory(@first_class_group, talker.occupation)) {
if (reply != 532 || reply != 549) {
ShowMultisell(reply, talker);
}
} else if (reply >= 557 && reply <= 562) {
if (myself.sm.class_id == @telling_the_cat) {
ShowMultisell(reply, talker);
}
} else if (reply == 567) {
if (myself.sm.class_id == @event_cat_soccer) {
ShowMultisell(reply, talker);
}
} else {
ShowPage(talker, fnCoupon1Not3);
}
} else {
ShowPage(talker, fnCoupon1Not3);
}
break;
case 529:
case 531:
if (IsInCategory(@second_class_group, talker.occupation)) {
if (talker.level < 40) {
if (reply != 532 || reply != 549) {
ShowMultisell(reply, talker);
}
} else if (reply >= 557 && reply <= 562) {
if (myself.sm.class_id == @telling_the_cat) {
ShowMultisell(reply, talker);
}
} else if (reply == 567) {
if (myself.sm.class_id == @event_cat_soccer) {
ShowMultisell(reply, talker);
}
} else {
ShowPage(talker, fnCoupon2Not3);
}
} else {
ShowPage(talker, fnCoupon2Not3);
}
break;
}
}
}
EventHandler TELEPORT_REQUESTED(talker) {
if (talker.level >= 20) {
ShowPage(talker, "guide_teleport_over001.htm");
} else {
Teleport(talker, Position, ShopName, "", "", "", 57, "");
}
}
Чтобы заменить число на название баффа в functions.json строки 2370 и 2378 следует заменить с "int" на "SKILL".CastBuffForQuestReward(talker, 283377665);
skill id * 65536 + skill level что бы узнать id баффа)Чтобы заменить число на название баффа в functions.json строки 2370 и 2378 следует заменить с "int" на "SKILL".
Актуальную версию планирую выложить на гитхаб.
Будем признательны. Не забудь ссылку кинуть)Чтобы заменить число на название баффа в functions.json строки 2370 и 2378 следует заменить с "int" на "SKILL".
Актуальную версию планирую выложить на гитхаб.
а зачем?skill id * 65536 + skill level что бы узнать id баффа)
Ага.skill id * 65536 + skill level что бы узнать id баффа)
Судя по всему это просто сауроновский декомпилятор за 7500 продают (судя по коду, который скинул ade0t).А то аж обидно стало за 7500 рубликов.
главное, что у них компилятор естьАга.
Судя по всему это просто сауроновский декомпилятор за 7500 продают (судя по коду, который скинул ade0t).
Он есть в шаре, даже несколько его версий на разных ЯП.
Причем просто подняли поддержку с с4 до гф, и не удосужились походу даже запарится и восстановить нормально код.Ага.
Судя по всему это просто сауроновский декомпилятор за 7500 продают (судя по коду, который скинул ade0t).
Он есть в шаре, даже несколько его версий на разных ЯП.
У эмки нормальный компилятор.главное, что у них компилятор есть
Вряд ли он лучше компилятора эмки, ибо он по сути от NCSoft.главное, что у них компилятор есть
Вряд ли он лучше компилятора эмки, ибо он по сути от NCSoft.
можешь поподробнее о нем? о_О
Обратись к емке у нее очень хороший декомпил есть если поделится конечно)Как радостно читать тред о ПТСе)))
Мне декомпил понравился очень, читабелен в отличии от адексовского.
Да может у адвексов сейчас и лучше компилятор я хз но не думаю.
Я уже обращался, это тот же сауроновский, правда с довольно хорошими фиксами и реальными сигнатурами функций и переменных. Правда там солянка, не все напрямую из L2NPC.exe дизассемблировано.Обратись к емке у нее очень хороший декомпил есть если поделится конечно)
Для замен по одному с головой)Я уже обращался, это тот же сауроновский, правда с довольно хорошими фиксами и реальными сигнатурами функций и переменных. Правда там солянка, не все напрямую из L2NPC.exe дизассемблировано.
А эмка не будет против?ЛовитеВы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками Вход или Регистрация.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?