Главная | Форум | Статьи | Фaйлы| Картинки WoW | Профиль | Регистрация | Вход

[ Новые сообщения · Правила форума · Поиск · RSS ]

WoW-Info — информационный World of Warcraft портал

С++ скрипт Мандокир Повелитель Крови - Форум

  • Сторінка 1 з 1
  • 1
С++ скрипт Мандокир Повелитель Крови
HammeRДата: Середа, 01.12.2010, 12:37 | Сообщение # 1



HammeR
Рыцарь
Группа: Пользователи
Сообщений: 449

Замечания:

Оффлайн
Всем привет. Продолжаю работать над инстом Зул Гуруб.
Второй мой скрипт на босса: http://ru.wowhead.com/npc=11382
В данный момент скрипт не является 100% рабочим по сравнению с официальным сервером, нужно проработать еще несколько моментов.

Code
enum MandokirNPC  
{  
// ID босса Bloodlord Mandokir  
ZG_MANDOKIR = 11382,  
//ID раптора  
ZG_OHGAN = 14988,  
//ID духа  
CHAINED_SPIRIT = 15117  
};  

enum MandokirSpells  
{  
//все заклинания босса Bloodlord Mandokir  
MANDOKIR_CHARGE = 24315,  
MANDOKIR_CLEAVE = 20691,  
MANDOKIR_FEAR = 29321, //заклинание страха, в версиях игры до 3.0.1 босс использовал спелл, если в ближнем бою его били три и более игроков  
MANDOKIR_WHIRLWIND = 24236,  
MANDOKIR_MORTAL_STRIKE = 24573,  
MANDOKIR_ENRAGE = 23537,  
MANDOKIR_WATCH = 24314,  
MANDOKIR_SUMMON_PLAYER = 25104,  
MANDOKIR_LEVEL_UP = 24312,  
//спелл маунта у босса  
MANDOKIR_MOUNT = 23243, //этот спелл брался из предмета, который визульно призывает такого же раптора  
//Способность резать броню у раптора  
OHGAN_SUNDERARMOR = 24317,  
//Заклинание воскрешения у духов  
SPIRIT_REVIVE = 24341,  
};  

//Координаты спавна духов  
static Coords SpiritSpawns[] =  
{  
{},  
{-12150.9f, -1956.24f, 133.407f, 2.57835f},  
{-12157.1f, -1972.78f, 133.947f, 2.64903f},  
{-12172.3f, -1982.63f, 134.061f, 1.48664f},  
{-12194.0f, -1979.54f, 132.194f, 1.45916f},  
{-12211.3f, -1978.49f, 133.580f, 1.35705f},  
{-12228.4f, -1977.10f, 132.728f, 1.25495f},  
{-12250.0f, -1964.78f, 135.066f, 0.92901f},  
{-12264.0f, -1953.08f, 134.072f, 0.62663f},  
{-12289.0f, -1924.00f, 132.620f, 5.37829f},  
{-12267.3f, -1902.26f, 131.328f, 5.32724f},  
{-12255.3f, -1893.53f, 134.026f, 5.06413f},  
{-12229.9f, -1891.39f, 134.704f, 4.40047f},  
{-12215.9f, -1889.09f, 137.273f, 4.70285f},  
{-12200.5f, -1890.69f, 135.777f, 4.84422f},  
{-12186.0f, -1890.12f, 134.261f, 4.36513f},  
{-12246.3f, -1890.09f, 135.475f, 4.73427f},  
{-12170.7f, -1894.85f, 133.852f, 3.51690f},  
{-12279.0f, -1931.92f, 136.130f, 0.04151f},  
{-12266.1f, -1940.72f, 132.606f, 0.70910f}  
};  

//основной скрипт на босса  

class BloodlordMandokirAI : public MoonScriptBossAI  
{  
UnitArray duh;  

MOONSCRIPT_FACTORY_FUNCTION(BloodlordMandokirAI, MoonScriptBossAI);  
BloodlordMandokirAI(Creature* pCreature) : MoonScriptBossAI(pCreature)  
{  
AddSpell(MANDOKIR_CLEAVE, Target_Current, 75, 0, 7);  
AddSpell(MANDOKIR_WHIRLWIND, Target_Current, 90, 0, 18);  

//эмоции и озвучка  
AddEmote(Event_OnCombatStart, "I'll feed your souls to Hakkar himself!", Text_Yell, 8413);  

mount = AddSpell(MANDOKIR_MOUNT, Target_Self, 0, 0, 0);  

mortalstrike = AddSpell(MANDOKIR_MORTAL_STRIKE, Target_Current, 0, 0, 0);  

enrage = AddSpell(MANDOKIR_ENRAGE, Target_Self, 0, 0, 0);  

}  

void OnCombatStart(Unit* pTarget)  
{  
RemoveAura(23243);  
for (uint i=1;i<20;i++)  
{  
MoonScriptCreatureAI *spirit;  
spirit = SpawnCreature(CHAINED_SPIRIT, SpiritSpawns[i].mX, SpiritSpawns[i].mY, SpiritSpawns[i].mZ, SpiritSpawns[i].mO);  
if(spirit)  
duh.push_back(TO_UNIT(spirit));  
}  
MoonScriptCreatureAI *Ohgan = NULL;  

Ohgan = SpawnCreature(ZG_OHGAN, (_unit->GetPositionX()+RandomFloat(2)-2), (_unit->GetPositionY()+RandomFloat(2)-2),  
_unit->GetPositionZ(), _unit->GetOrientation(), true);  

MortalStrikeTimer = AddTimer(15000);  

ParentClass::OnCombatStart( pTarget );  
}  

void OnCombatStop(Unit* pTarget)  
{  
for(UnitArray::iterator itr = duh.begin(); itr!=duh.end(); ++itr)  
if ((*itr)!=NULL && (*itr)->isAlive() && (*itr)->GetEntry() == CHAINED_SPIRIT)  
(*itr)->Delete();  
duh.clear();  

Ohgan = (MoonScriptBossAI*)GetNearestCreature(ZG_OHGAN);  

if(Ohgan != NULL)  
Ohgan->Despawn(2000, 0);  

CastSpell(mount);  

ParentClass::OnCombatStop(pTarget);  
}  

void OnDied(Unit* pKiller)  
{  
ParentClass::OnDied(pKiller);  
}  

void OnTargetDied(Unit *pTarget)  
{  
float range;  
Unit *Spirit;  
for(UnitArray::iterator itr=duh.begin(); itr!=duh.end(); ++itr)  
{  
if((*itr)!=NULL && (*itr)->GetEntry() == CHAINED_SPIRIT && (*itr)->isAlive())  
if(range > (*itr)->CalcDistance(TO_OBJECT(pTarget)))  
{  
range = (*itr)->CalcDistance(TO_OBJECT(pTarget));  
Spirit = TO_UNIT(*itr);  
}  
}  

if(RandomUInt(100) < 10)  
if(pTarget!=NULL && pTarget->IsPlayer() && !pTarget->isAlive())  
Spirit->CastSpell(pTarget, SPIRIT_REVIVE, false);  
}  

void AIUpdate()  
{  
if(_unit->IsPlayer() && _unit->GetHealthPct() <= 50)  
{  
if(IsTimerFinished(MortalStrikeTimer))  
{  
CastSpell(mortalstrike);  
ResetTimer(MortalStrikeTimer, 15000);  
}  
}  

ParentClass::AIUpdate();  
}  

SpellDesc* mount;  
SpellDesc* mortalstrike;  
SpellDesc* enrage;  
int32 MortalStrikeTimer;  
MoonScriptBossAI* Ohgan;  
};  

// Скрипт на Раптора  
class OhganAI : public MoonScriptCreatureAI  
{  
MOONSCRIPT_FACTORY_FUNCTION(OhganAI, MoonScriptCreatureAI);  
OhganAI(Creature *pCreature) : MoonScriptCreatureAI(pCreature)  
{  
AddSpell(OHGAN_SUNDERARMOR, Target_Current, 100, 0, 12);  

}  

void OnDied(Unit* pKiller)  
{  

//Mandokir = NULL;  
Mandokir = (MoonScriptBossAI*)GetNearestCreature(ZG_MANDOKIR);  

if(Mandokir && Mandokir->IsAlive() )  
{  

for (unordered_set<Player *>::iterator itr = Mandokir->GetUnit()->GetInRangePlayerSetBegin(); itr != Mandokir->GetUnit()->GetInRangePlayerSetEnd(); ++itr)  
{  
Player *pPlayer = TO_PLAYER(*itr);  
pPlayer->GetSession()->SystemMessage("Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle!");  
}  
Mandokir->CastSpell(enrage);  
}  
ParentClass::OnDied(pKiller);  
}  
MoonScriptBossAI* Mandokir;  
SpellDesc* enrage;  
};  

void SetupZulGurub(ScriptMgr * mgr)  
{  

mgr->register_creature_script(ZG_MANDOKIR, &BloodlordMandokirAI::Create);  
mgr->register_creature_script(ZG_OHGAN, &OhganAI::Create);  
}

Скрипт готов к использованию и протестирован, ну и как в предыдущем скрипте напишу список того, что еще нужно реализовать.

- убрать предупреждение при компиляции:
Код:

Code

\src\scripts\src\instancescripts\zulgurub\raid_zulgurub.cpp(337) : warning C4700: использована неинициализированная локальная переменная "range"

- добавить еще несколько текстов с озвучкой
- если игроки увивают раптора, то босс использует заклинание Enrage и в логе чата:
Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle!
Брал из примера по Ониксии, но код данный не работает.

Quote
Mandokir = (MoonScriptBossAI*)GetNearestCreature(ZG_MANDOKIR);

if(Mandokir && Mandokir->IsAlive() )
{

for (unordered_set<Player *>::iterator itr = Mandokir->GetUnit()->GetInRangePlayerSetBegin(); itr != Mandokir->GetUnit()->GetInRangePlayerSetEnd(); ++itr)
{
Player *pPlayer = TO_PLAYER(*itr);
pPlayer->GetSession()->SystemMessage("Bloodlord Mandokir goes into a rage after seeing his raptor fall in battle!");
}
Mandokir->CastSpell(enrage);
}

- при остановки урона/при смерти босса все духи дожны пропадать.
есть строчка (TO_CREATURE(*itr))->Despawn(); но не пойму куда её засунуть.
- при смерти одного из игроков вовремя боя с боссом сервер выбирает одного духа, который с вероятностью 10% воскресит игрока. К сожалению протестировать не смог, так как ни в одной базе они нормально не работают. В Sadb они при спавне еще и нападают.
- раптор, которого призывает босс отлично реализован (в разы лучше, чем на других эмуляторах), но нужно еще доработать, чтобы он как только появлялся сразу искал вражескую цель, чтобы напасть так как если с далека стрельнуть по боссу, то раптор не нападет.
- если у игрока, корого атакует босс ХП меньше или равно 50% босс должен использовать спелл Mortal Strike (по данным из 1.12.1 это было так), но с wotlk скорее всего просто кастует. Сегондня может схожу на официальном сервере и проверю.
Как ни как код есть:
Код:

Code
//если здоровье противника и этот противник игрок, меньше или равно 50%  
if(_unit->IsPlayer() && _unit->GetHealthPct() <= 50)  
{  
if(IsTimerFinished(MortalStrikeTimer))  
{  
CastSpell(mortalstrike);  
ResetTimer(MortalStrikeTimer, 15000);  
}  
}

Но почему то не работает, скорее всего косяк в условии.

- босса на раптора должен садить скрипт, а не база.
- как только босс вернется на стартовую точку он должен кастануть спелл маунта
(Но в отличии от Мангоса поддержки такого эвента нету и придется писать отдельным условием)
И опять же чтобы работали эти две последних фишки, нужно сделать clean_up в базе.

P.S нужно еще вейпоит прописать, чтобы босс спускался с зигурата, из-за того что нет реализации Mmaps нужна еще одна гора кода. На официальном сервере он не всегда сидит на вершине своего зиггурата, а иногда спускается.
Как последний пунк:
- реализовать вейпоинты через базу или через скрипт, из-за отсутствия данных не могу дать точный ответ.



 
  • Сторінка 1 з 1
  • 1
Пошук:

Новые сообщения в темах
Сдам в аренду сервер и хостинг · (Хост Предложения)
Автор: redlaine
Последнее сообщение в 23:53
хаха :D · (Приколы)
Автор: [N1ke]Medved
Последнее сообщение в 18:40
Autobattle - новый боевой бот ... · (Боты для WoW)
Автор: terrikon
Последнее сообщение в 18:39
PvE руководство для Чернокнижн... · (Чернокнижник)
Автор: Darkensand
Последнее сообщение в 18:38
Пустой свиток (Часть 11) · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:37
Друиды в Катаклизме: Официальн... · (Друид)
Автор: Darkensand
Последнее сообщение в 18:37
[Баг 3.3.5] Фарм ледяных бадже... · (Читы для WoW)
Автор: Darkensand
Последнее сообщение в 18:35
FarmBot (Бот для фарма руды и ... · (Боты для WoW)
Автор: homma
Последнее сообщение в 18:34
Почему мы сражаемся: ролевая и... · (Воин)
Автор: Darkensand
Последнее сообщение в 18:34
Книги по Wold of Warcraft · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:33
Маг огня в Cataclysm · (Маг)
Автор: Darkensand
Последнее сообщение в 18:33
Как начать играть в World of W... · (Полезно знать)
Автор: Belkmondesh
Последнее сообщение в 18:32
Характеризация профессий · (Профессии)
Автор: Darkensand
Последнее сообщение в 18:31
Что значит для арканов бета те... · (Маг)
Автор: Darkensand
Последнее сообщение в 18:31

Контакты Контакты Copyright WoW-Info — World of Warcraft портал © 2026 | Условия и правила использования ресурса | Реклама / Услуги
WoW-Info портал.World of Warcraft портал — готовые сервера, сайты, картинки, аддоны, патчи, читы, баги, mangos, ArcEmu, TrinityCore, Warcraft 3, новости, Cataclysm...
Яндекс.Метрика Хостинг від uCoz