Рейты На Квесты
Кто в АИ разбирается и можешь помочь понять что нужно менять в АИ, чтобы улучшить шанс выпадания квест-итема, ниже приведен декомпилированный код моба Varka Footman:
* Change Log
* ------------------
* 01.07.2008
* Script Decompiled by SauDecompiler, Alamat Edition v2.0
*
*
***************************************************************************/
class 1 ketra_orc_footman : warrior_ag_casting_3skill_approach_stone
{
handler:
EventHandler MY_DYING(always_list,code_info,i4,i9,last_attacker,lparty,member,random1_list,target)
{
always_list = gg::AllocCodeInfoList();
random1_list = gg::AllocCodeInfoList();
target = last_attacker;
if( 1 )
{
always_list::SetInfo(0,target);
}
if( gg::IsNull(lparty) == 0 )
{
for(i9 = 0; i9 < lparty.member_count; i9 = ( i9 + 1 ))
{
target = myself::GetMemberOfParty(lparty,i9);
if( 1 )
{
always_list::SetInfo(0,target);
}
}
}
target = last_attacker;
if( myself::HaveMemo(target,611) == 1 && ( ( ( ( ( ( ( ( ( myself::OwnItemCount(target,7221) + myself::OwnItemCount(target,7222) ) + myself::OwnItemCount(target,7223) ) + myself::OwnItemCount(target,7224) ) + myself::OwnItemCount(target,7225) ) == 0 && myself::OwnItemCount(target,7226) < 100 ) || ( myself::OwnItemCount(target,7221) >= 1 && myself::OwnItemCount(target,7226) < 200 ) ) || ( myself::OwnItemCount(target,7222) >= 1 && myself::OwnItemCount(target,7226) < 300 ) ) || ( myself::OwnItemCount(target,7223) >= 1 && myself::OwnItemCount(target,7226) < 300 ) ) || ( myself::OwnItemCount(target,7224) >= 1 && myself::OwnItemCount(target,7226) < 400 ) ) )
{
random1_list::SetInfo(1,target);
}
if( gg::IsNull(lparty) == 0 )
{
for(i9 = 0; i9 < lparty.member_count; i9 = ( i9 + 1 ))
{
target = myself::GetMemberOfParty(lparty,i9);
if( myself::HaveMemo(target,611) == 1 && ( ( ( ( ( ( ( ( ( myself::OwnItemCount(target,7221) + myself::OwnItemCount(target,7222) ) + myself::OwnItemCount(target,7223) ) + myself::OwnItemCount(target,7224) ) + myself::OwnItemCount(target,7225) ) == 0 && myself::OwnItemCount(target,7226) < 100 ) || ( myself::OwnItemCount(target,7221) >= 1 && myself::OwnItemCount(target,7226) < 200 ) ) || ( myself::OwnItemCount(target,7222) >= 1 && myself::OwnItemCount(target,7226) < 300 ) ) || ( myself::OwnItemCount(target,7223) >= 1 && myself::OwnItemCount(target,7226) < 300 ) ) || ( myself::OwnItemCount(target,7224) >= 1 && myself::OwnItemCount(target,7226) < 400 ) ) )
{
random1_list::SetInfo(1,target);
}
}
}
target = last_attacker;
if( myself::HaveMemo(target,612) == 1 && myself::GetMemoState(target,612) == ( ( 1 * 10 ) + 1 ) )
{
random1_list::SetInfo(2,target);
}
if( gg::IsNull(lparty) == 0 )
{
for(i9 = 0; i9 < lparty.member_count; i9 = ( i9 + 1 ))
{
target = myself::GetMemberOfParty(lparty,i9);
if( myself::HaveMemo(target,612) == 1 && myself::GetMemoState(target,612) == ( ( 1 * 10 ) + 1 ) )
{
random1_list::SetInfo(2,target);
}
}
}
while( gg::IsNull(code_info = always_list::Next()) == 0 )
{
if( code_info.code == 0 )
{
myself::SetCurrentQuestID(605);
myself::SetCurrentQuestID(605);
if( myself::OwnItemCount(target,7215) >= 1 )
{
myself::DeleteItem1(target,7215,myself::OwnItemCount(target,7215));
myself::GiveItem1(target,7214,1);
}
else
{
if( myself::OwnItemCount(target,7214) >= 1 )
{
myself::DeleteItem1(target,7214,myself::OwnItemCount(target,7214));
myself::GiveItem1(target,7213,1);
}
else
{
if( myself::OwnItemCount(target,7213) >= 1 )
{
myself::DeleteItem1(target,7213,myself::OwnItemCount(target,7213));
myself::GiveItem1(target,7212,1);
}
else
{
if( myself::OwnItemCount(target,7212) >= 1 )
{
myself::DeleteItem1(target,7212,myself::OwnItemCount(target,7212));
myself::GiveItem1(target,7211,1);
}
else
{
if( myself::OwnItemCount(target,7211) >= 1 )
{
myself::DeleteItem1(target,7211,myself::OwnItemCount(target,7211));
}
}
}
}
}
if( myself::HaveMemo(target,605) )
{
myself::RemoveMemo(target,605);
myself::AddLog(2,target,605);
myself::DeleteItem1(target,7216,myself::OwnItemCount(target,7216));
myself::DeleteItem1(target,7217,myself::OwnItemCount(target,7217));
myself::DeleteItem1(target,7218,myself::OwnItemCount(target,7218));
}
if( myself::HaveMemo(target,606) )
{
myself::RemoveMemo(target,606);
myself::AddLog(2,target,606);
myself::DeleteItem1(target,7233,myself::OwnItemCount(target,7233));
}
if( myself::HaveMemo(target,607) )
{
myself::RemoveMemo(target,607);
myself::AddLog(2,target,607);
myself::DeleteItem1(target,7235,myself::OwnItemCount(target,7235));
}
if( myself::HaveMemo(target,608) )
{
myself::RemoveMemo(target,608);
myself::AddLog(2,target,608);
myself::DeleteItem1(target,7236,myself::OwnItemCount(target,7236));
}
if( myself::HaveMemo(target,609) )
{
myself::RemoveMemo(target,609);
myself::AddLog(2,target,609);
myself::DeleteItem1(target,7237,myself::OwnItemCount(target,7237));
}
if( myself::HaveMemo(target,610) )
{
myself::RemoveMemo(target,610);
myself::AddLog(2,target,610);
myself::DeleteItem1(target,7239,myself::OwnItemCount(target,7239));
}
}
}
code_info = random1_list::RandomSelectOne();
if( gg::IsNull(code_info) == 0 )
{
switch(code_info.code)
{
case 1:
{
myself::SetCurrentQuestID(611);
target = code_info::RandomSelectOne();
if( gg::IsNull(target) == 0 && myself::DistFromMe(target) <= 1500 )
{
i4 = gg::Rand(1000);
if( i4 < 500 )
{
myself::GiveItem1(target,7226,1);
myself::SoundEffect(target,"ItemSound.quest_itemget");
}
}
break;
}
case 2:
{
myself::SetCurrentQuestID(612);
target = code_info::RandomSelectOne();
if( gg::IsNull(target) == 0 && myself::DistFromMe(target) <= 1500 )
{
if( 1 == 1 )
{
i4 = gg::Rand(1000);
if( i4 < 500 && 500 != 0 )
{
if( 1 != 0 && 1 == 1 )
{
myself::GiveItem1(target,7234,1);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
myself::SoundEffect(target,"ItemSound.quest_itemget");
}
else
{
if( i4 < ( 500 + 0 ) && 0 != 0 )
{
if( 0 != 0 && 1 == 1 )
{
myself::GiveItem1(target,7234,0);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
myself::SoundEffect(target,"ItemSound.quest_itemget");
}
else
{
if( i4 < ( ( 500 + 0 ) + 0 ) && 0 != 0 )
{
if( 0 != 0 && 1 == 1 )
{
myself::GiveItem1(target,7234,0);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself::GiveItem1(target,0,0);
}
myself::SoundEffect(target,"ItemSound.quest_itemget");
}
}
}
}
}
break;
}
}
}
super;
}
EventHandler ATTACKED(attacker,damage)
{
myself::SetCurrentQuestID(615);
if( myself::HaveMemo(attacker,615) && myself::GetMemoState(attacker,615) == 2 )
{
myself::SetMemoState(attacker,615,3);
myself::CreateOnePrivateEx(1031685,"asefas_eye",0,0,myself::FloatToInt(myself.sm.x),myself::FloatToInt(myself.sm.y),myself::FloatToInt(myself.sm.z),0,0,0,0);
if( myself::Skill_GetConsumeMP(1164033) < myself.sm.mp && myself::Skill_GetConsumeHP(1164033) < myself.sm.hp && myself::Skill_InReuseDelay(1164033) == 0 )
{
myself::AddUseSkillDesire(attacker,1164033,0,1,10000000);
}
}
super;
}
}
humark: А на что его нужно изменить? И какие примерно соотношения?
i4 = gg::Rand(1000);
присвоить переменной i4 случайное число в интервале 0 - 999
if( i4 < 500 )
ну и дальше, если i4 меньше 500, выполнить действия...
дальше объяснять?
Т.е.
1000 - общее количество возможного получения предмета, чем меньше - тем больше шанс..
если выпадает шанс менее 500 - то получаю опр. вещь, или выполняется действие правильно, если нет - то нет...
humark: Т.е.
1000 - общее количество возможного получения предмета, чем меньше - тем больше шанс..
если выпадает шанс менее 500 - то получаю опр. вещь, или выполняется действие правильно, если нет - то нет...
у тебя в процедуре ясно прописано ведь.
если i4 меньше 500 дать итем - q_ketra_badge_grunt (id 7226).
в аи лучше не лезть, если слабо знаешь программирование.
компиллятор саурона, как впрочем и остальные, имеет много багов.
без знания ассемблера врядли пролучишь нормальный результат.
что касается этого моба, то шанс там стоит нормальный, даже для больших рейтов.
менять его не стоит.
рендом всегда стремится к увеличению,
{
i4 = gg::Rand(1000); - рендом из массива значений равного 1000
if( i4 < 500 ) - если рендом меньше 500
{
myself::GiveItem1(target,7226,1); - даём итем. id:7226 колличеством 1
myself::SoundEffect(target,"ItemSound.quest_itemget"); - выдаём звуковой эффект получения квестового итема
}
}
всё очень просто если начать разбираться в коде и понимать его.
Тут всё понятно) А вот в компилированном коде, как изменить количество выпадаемых предметов? Вот тут например 1 падает, как в АИ и где изменить на 3 скажем?
пс. У кого есть норм компилятор, мой пишет Error parsing file skill,item,manual =(, качал с ПП
humark: Тут всё понятно) А вот в компилированном коде, как изменить количество выпадаемых предметов? Вот тут например 1 падает, как в АИ и где изменить на 3 скажем?
пс. У кого есть норм компилятор, мой пишет Error parsing file skill,item,manual =(, качал с ПП
либо кодировка файлов skill_pch.txt, item_pch.txt, manual_pch.txt не та, должна быть ANSI, либо этих файлов у тебя нет вообще.
я так понял, декомпилировал в nasc ты сам?
возьми исходный код в ассемблере и по комментариям сравни с nasc.
найти функции GiveItem1 и Rand труда не составит.
с параметрами тоже разберешься...
Вот опять проблема)
Есть код:
myself->SetCurrentQuestID(606);
target = code_info->RandomSelectOne();
if( target->() == 0 && myself->DistFromMe(target) <= 1500 )
{
if( 1 == 1 )
{
i4 = gg->Rand(1000);
if( i4 < 500 && 500 != 0 )
{
if( 1 != 0 && 1 == 1 )
{
myself->GiveItem1(target,7233,1);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
myself->SoundEffect(target,"ItemSound.quest_itemget");
}
else if( i4 < ( 500 + 0 ) && 0 != 0 )
{
if( 0 != 0 && 1 == 1 )
{
myself->GiveItem1(target,7233,0);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
myself->SoundEffect(target,"ItemSound.quest_itemget");
}
else if( i4 < ( ( 500 + 0 ) + 0 ) && 0 != 0 )
{
if( 0 != 0 && 1 == 1 )
{
myself->GiveItem1(target,7233,0);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
if( 0 != 0 && 0 == 1 )
{
myself->GiveItem1(target,0,0);
}
myself->SoundEffect(target,"ItemSound.quest_itemget");
}
}
}
break;
В нем падает итем 7233, как сделать шанс равный 100%?, т.е. чтобы падало с каждого моба, что и на что поменять нужно? Заранее спс..
