|
|
Модератор форума: INFERNOS |
Форум Корзина форума Патчи / Моды / Фиксы для SkyFire Мой НПС такого еще нигде не видал |
Мой НПС такого еще нигде не видал |
Вообщем суть такова НПС под видом Паладина стоит там где поставите)
Игрок подходит и кидает ему дуэль)) кастует как паладин) Убил 2 часа) на скриптовку так как в программировании не особо силен ) При 10% жизней у моба или у игрока дуэль отменяется выигрывает тот у кого осталось больше 10% При несчастном случае то есть ударил в конце очень сильно моб умер ) поставил функцию авто респавна Немного поработал над комбо в кастах , он сначала кидает стан , потом экзорцизм, и сразу открывается хилка мгновенка он ее и юзает ) Берите может кому пригодится, а может кто то допишет или улучшит) я думаю сделать под все классы по такому мобу) SQL Code REPLACE INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction_A`, `faction_H`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `mindmg`, `maxdmg`, `dmgschool`, `attackpower`, `dmg_multiplier`, `baseattacktime`, `rangeattacktime`, `unit_class`, `unit_flags`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `minrangedmg`, `maxrangedmg`, `rangedattackpower`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `Health_mod`, `Mana_mod`, `Armor_mod`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `equipment_id`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `WDBVerified`) VALUES (900111, 0, 0, 0, 0, 0, 30199, 0, 0, 0, 'Paladin', 'FreeDom', 'pvp', 0, 85, 85, 0, 35, 35, 1, 1, 1, 1, 1, 2500.4, 2790.2, 0, 4600, 1, 2000, 0, 1, 0, 0, 0, 0, 0, 2, 0, 720, 1050.6, 320, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 1, 1, 68000, 20000, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 363, 0, 0, 'test_npc_mikolas', 12340); test_npc_mikolas.cpp Code /*###### ## test_npc_mikolas ######*/ #include "ScriptPCH.h" #define SAY_ENTER1 -1560013 #define SAY_ENTER2 -1560014 #define SAY_ENTER3 -1560015 #define SAY_AGGRO1 -1560016 #define SAY_AGGRO2 -1560017 #define SAY_SLAY1 -1560018 #define SAY_SLAY2 -1560019 #define SAY_BREATH1 -1560020 #define SAY_BREATH2 -1560021 #define SAY_DEATH -1560022 #define SPELL_SAND_BREATH 853 #define SPELL_HILKA 635 #define SPELL_MAGIC_DISRUPTION_AURA 31801 #define SPELL_WING_BUFFET 879 /// айди спелов дуэлей не трогайте!! #define SPELL_DUEL 52996 /// #define SPELL_DUELS 52996 /// #define SPELL_DUEL_VICTORY 52994 /// #define SPELL_DUEL_FLAG 52991 /// ///----------------------------------- #define SPELL_IMUN 26573 #define SPELL_HVATKA 24275 #define SPELL_UDARCHUMI 31884 #define SPELL_PANSIR 20271 #define SPELL_STOIKA 7294 #define GOSSIP_HAH "Ti to4no hotish PVP?" #define GOSSIP_SAH "Nu davai posmotrim)." class test_npc_mikolas: public CreatureScript { public: test_npc_mikolas() : CreatureScript("test_npc_mikolas") { } CreatureAI* GetAI(Creature* pCreature) const { return new test_npc_mikolasAI(pCreature); } // второе меню госипа bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction) { pPlayer->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF + 1: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SAH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); pPlayer->SEND_GOSSIP_MENU(624, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: pPlayer->CLOSE_GOSSIP_MENU(); pPlayer->CastSpell(pPlayer, SPELL_DUEL_FLAG, true); pCreature->setFaction(21); if (pPlayer) CAST_AI(test_npc_mikolas::test_npc_mikolasAI, pCreature->AI())->AttackStart(pPlayer); break; } return true; } // Первое меню госипа bool OnGossipHello(Player* pPlayer, Creature* pCreature) { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HAH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); pPlayer->SEND_GOSSIP_MENU(623, pCreature->GetGUID()); return true; } struct test_npc_mikolasAI: public ScriptedAI { test_npc_mikolasAI(Creature *c) : ScriptedAI(c) { m_bIsDuelInProgress = false; } bool lose; uint64 m_uiDuelerGUID; uint32 m_uiDuelTimer; bool m_bIsDuelInProgress; uint32 SandBreath_Timer; uint32 hilka_Timer; uint32 WingBuffet_Timer; uint32 Mda_Timer; uint32 IMUN_Timer; uint32 HVATKA_Timer; uint32 UDARCHUMI_Timer; uint32 PANSIR_Timer; uint32 STOIKA_Timer; // таймеры void Reset() { me->setFaction(35); SandBreath_Timer = 1000 + rand() % 5000; hilka_Timer = 25000 + rand() % 5000; WingBuffet_Timer = 15000; Mda_Timer = 25000; IMUN_Timer= 50000; HVATKA_Timer= 22000; UDARCHUMI_Timer= 13000; PANSIR_Timer= 7000; STOIKA_Timer= 3000; } /// при входе в комбат варнякаем чет и кастум) void EnterCombat(Unit*) { DoScriptText(RAND(SAY_AGGRO1, SAY_AGGRO2), me); DoCast(me->getVictim(), SPELL_STOIKA); } void SpellHit(Unit* pCaster, const SpellEntry* pSpell) { if (!m_bIsDuelInProgress && pSpell->Id == SPELL_DUEL) { m_uiDuelerGUID = pCaster->GetGUID(); m_bIsDuelInProgress = true; } } void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) { if (m_bIsDuelInProgress && pDoneBy->IsControlledByPlayer()) { // во время дуэли моб зеленый для других игроков if (pDoneBy->GetGUID() != m_uiDuelerGUID && pDoneBy->GetOwnerGUID() != m_uiDuelerGUID) uiDamage = 0; else if (uiDamage >= me->GetHealth()) { uiDamage = 0; if (!lose) { pDoneBy->RemoveGameObject(SPELL_DUEL_FLAG, true); pDoneBy->AttackStop(); me->CastSpell(pDoneBy, SPELL_DUEL_VICTORY, true); lose = true; me->CastSpell(me, 7267, true); me->RestoreFaction(); } } } } // при смерти говорим SAY_DEATH void JustDied(Unit * /*who*/) { DoScriptText(SAY_DEATH, me); me->Respawn(); } void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; ///если у игрока жизней меньше 10 % останавливаем дуэль и плачем) else if (me->getVictim()->GetTypeId() == TYPEID_PLAYER && me->getVictim()->HealthBelowPct(10)) { me->getVictim()->CastSpell(me->getVictim(), 7267, true); // beg me->getVictim()->RemoveGameObject(SPELL_DUEL_FLAG, true); me->CastSpell(me, 7267, true); me->AttackStop(); DoResetThreat(); EnterEvadeMode(); return; } ///если у моба жизней меньше 10 % останавливаем дуэль и плачем) if (me->HealthBelowPct(10)) { me->AttackStop(); DoResetThreat(); EnterEvadeMode(); return; } //Sand Breath if (SandBreath_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); DoCast(me->getVictim(), SPELL_SAND_BREATH); DoScriptText(RAND(SAY_BREATH1, SAY_BREATH2), me); SandBreath_Timer = 10000 + rand() % 10000; } else SandBreath_Timer -= diff; if (hilka_Timer <= diff) { me->CastSpell(me, SPELL_HILKA, true); hilka_Timer = 25000 + rand() % 5000; } else hilka_Timer -= diff; if (WingBuffet_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_WING_BUFFET); WingBuffet_Timer = 25000 + rand() % 10000; } else WingBuffet_Timer -= diff; if (Mda_Timer <= diff) { DoCast(me, SPELL_MAGIC_DISRUPTION_AURA); Mda_Timer = 15000; } else Mda_Timer -= diff; //______________________ if (HVATKA_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_HVATKA); HVATKA_Timer = 25000 + rand() % 10000; } else HVATKA_Timer -= diff; if (IMUN_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_IMUN); IMUN_Timer = 25000 + rand() % 10000; } else IMUN_Timer -= diff; if (UDARCHUMI_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_UDARCHUMI); UDARCHUMI_Timer = 25000 + rand() % 10000; } else UDARCHUMI_Timer -= diff; if (PANSIR_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_PANSIR); PANSIR_Timer = 25000 + rand() % 10000; } else PANSIR_Timer -= diff; DoMeleeAttackIfReady(); } }; }; void AddSC_test_npc_mikolas() { new test_npc_mikolas(); } Не забудьте добавить его в скриптлоадер ) |
Вот нем как рыба) только охкает ))
Code /*###### ## test_npc_mikolas ######*/ #include "ScriptPCH.h" ////#define SAY_ENTER1 -1560013 ////#define SAY_ENTER2 -1560014 ////#define SAY_ENTER3 -1560015 ////#define SAY_AGGRO1 -1560016 ////#define SAY_AGGRO2 -1560017 ////#define SAY_SLAY1 -1560018 ////#define SAY_SLAY2 -1560019 ////#define SAY_BREATH1 -1560020 ////#define SAY_BREATH2 -1560021 ////#define SAY_DEATH -1560022 #define SPELL_SAND_BREATH 853 #define SPELL_HILKA 635 #define SPELL_MAGIC_DISRUPTION_AURA 31801 #define SPELL_WING_BUFFET 879 /// айди спелов дуэлей не трогайте!! #define SPELL_DUEL 52996 /// #define SPELL_DUELS 52996 /// #define SPELL_DUEL_VICTORY 52994 /// #define SPELL_DUEL_FLAG 52991 /// ///----------------------------------- #define SPELL_IMUN 26573 #define SPELL_HVATKA 24275 #define SPELL_UDARCHUMI 31884 #define SPELL_PANSIR 20271 #define SPELL_STOIKA 7294 #define GOSSIP_HAH "Ti to4no hotish PVP?" #define GOSSIP_SAH "Nu davai posmotrim)." class test_npc_mikolas: public CreatureScript { public: test_npc_mikolas() : CreatureScript("test_npc_mikolas") { } CreatureAI* GetAI(Creature* pCreature) const { return new test_npc_mikolasAI(pCreature); } // второе меню госипа bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction) { pPlayer->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF + 1: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SAH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); pPlayer->SEND_GOSSIP_MENU(624, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: pPlayer->CLOSE_GOSSIP_MENU(); pPlayer->CastSpell(pPlayer, SPELL_DUEL_FLAG, true); pCreature->setFaction(21); if (pPlayer) CAST_AI(test_npc_mikolas::test_npc_mikolasAI, pCreature->AI())->AttackStart(pPlayer); break; } return true; } // Первое меню госипа bool OnGossipHello(Player* pPlayer, Creature* pCreature) { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HAH, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); pPlayer->SEND_GOSSIP_MENU(623, pCreature->GetGUID()); return true; } struct test_npc_mikolasAI: public ScriptedAI { test_npc_mikolasAI(Creature *c) : ScriptedAI(c) { m_bIsDuelInProgress = false; } bool lose; uint64 m_uiDuelerGUID; uint32 m_uiDuelTimer; bool m_bIsDuelInProgress; uint32 SandBreath_Timer; uint32 hilka_Timer; uint32 WingBuffet_Timer; uint32 Mda_Timer; uint32 IMUN_Timer; uint32 HVATKA_Timer; uint32 UDARCHUMI_Timer; uint32 PANSIR_Timer; uint32 STOIKA_Timer; // таймеры void Reset() { me->setFaction(35); SandBreath_Timer = 1000 + rand() % 5000; hilka_Timer = 25000 + rand() % 5000; WingBuffet_Timer = 15000; Mda_Timer = 25000; IMUN_Timer= 50000; HVATKA_Timer= 22000; UDARCHUMI_Timer= 13000; PANSIR_Timer= 7000; STOIKA_Timer= 3000; } /// при входе в комбат варнякаем чет и кастум) void EnterCombat(Unit*) { DoScriptText(RAND(SAY_AGGRO1, SAY_AGGRO2), me); DoCast(me->getVictim(), SPELL_STOIKA); } void SpellHit(Unit* pCaster, const SpellEntry* pSpell) { if (!m_bIsDuelInProgress && pSpell->Id == SPELL_DUEL) { m_uiDuelerGUID = pCaster->GetGUID(); m_bIsDuelInProgress = true; } } void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) { if (m_bIsDuelInProgress && pDoneBy->IsControlledByPlayer()) { // во время дуэли моб зеленый для других игроков if (pDoneBy->GetGUID() != m_uiDuelerGUID && pDoneBy->GetOwnerGUID() != m_uiDuelerGUID) uiDamage = 0; else if (uiDamage >= me->GetHealth()) { uiDamage = 0; if (!lose) { pDoneBy->RemoveGameObject(SPELL_DUEL_FLAG, true); pDoneBy->AttackStop(); me->CastSpell(pDoneBy, SPELL_DUEL_VICTORY, true); lose = true; me->CastSpell(me, 7267, true); me->RestoreFaction(); } } } } // при смерти говорим SAY_DEATH void JustDied(Unit * /*who*/) { DoScriptText(SAY_DEATH, me); me->Respawn(); } void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; ///если у игрока жизней меньше 10 % останавливаем дуэль и плачем) else if (me->getVictim()->GetTypeId() == TYPEID_PLAYER && me->getVictim()->HealthBelowPct(10)) { me->getVictim()->CastSpell(me->getVictim(), 7267, true); // beg me->getVictim()->RemoveGameObject(SPELL_DUEL_FLAG, true); me->CastSpell(me, 7267, true); me->AttackStop(); DoResetThreat(); EnterEvadeMode(); return; } ///если у моба жизней меньше 10 % останавливаем дуэль и плачем) if (me->HealthBelowPct(10)) { me->AttackStop(); DoResetThreat(); EnterEvadeMode(); return; } //Sand Breath if (SandBreath_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); DoCast(me->getVictim(), SPELL_SAND_BREATH); DoScriptText(RAND(SAY_BREATH1, SAY_BREATH2), me); SandBreath_Timer = 10000 + rand() % 10000; } else SandBreath_Timer -= diff; if (hilka_Timer <= diff) { me->CastSpell(me, SPELL_HILKA, true); hilka_Timer = 25000 + rand() % 5000; } else hilka_Timer -= diff; if (WingBuffet_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_WING_BUFFET); WingBuffet_Timer = 25000 + rand() % 10000; } else WingBuffet_Timer -= diff; if (Mda_Timer <= diff) { DoCast(me, SPELL_MAGIC_DISRUPTION_AURA); Mda_Timer = 15000; } else Mda_Timer -= diff; //______________________ if (HVATKA_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_HVATKA); HVATKA_Timer = 25000 + rand() % 10000; } else HVATKA_Timer -= diff; if (IMUN_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_IMUN); IMUN_Timer = 25000 + rand() % 10000; } else IMUN_Timer -= diff; if (UDARCHUMI_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_UDARCHUMI); UDARCHUMI_Timer = 25000 + rand() % 10000; } else UDARCHUMI_Timer -= diff; if (PANSIR_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_PANSIR); PANSIR_Timer = 25000 + rand() % 10000; } else PANSIR_Timer -= diff; DoMeleeAttackIfReady(); } }; }; void AddSC_test_npc_mikolas() { new test_npc_mikolas(); }
Сообщение # 4 написано 30.07.2012 в 11:33
|
Делал такое год назад через SmartAI на ныне закрытом сервере Global 3.3.5. Игрокам нравились бои с ними.
Цитата поставлены нпц - дуэлянты в Штормград/Оргриммар, как только вы одержите победу над ним вы получите немного золота и с не большим шансом получите эмблему триумфа Вконтакте - Добавлены новые нпц - Дуэлянты. Сделал классы прист(с выбором шп или дц), дк, паладин, маг под разные уровни. Но ты через ядро можешь сделать гораздо лучше. Так что продолжай. |
Ранее выкладывалось для 3.3.5...
С 0 писал или все таки переделал?
Сообщение # 7 написано 14.01.2013 в 11:23
|
| |||
| |||