|
13.10.2011, 15:46 | #1 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
ВойдЗона
Как создать войд(АОЕ) зону...
пс расскажите полный цикл создания.. Например зона которая имеет определённые координаты и определённый ид типа огонь например.. |
14.10.2011, 07:37 | #3 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
Предположим boss_lord_marrowgarAI вызывает doSummon(NPC_COLD_FLAME, X, Y, Z);
То каким должен быть класс mob_coldflameAI чтобы он создал огонь и держал его некоторое время.. а потом уничтожался.. и при этом у него была аура этой самой войдзоны... |
14.10.2011, 09:51 | #4 | |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Цитата:
Однако лучший пример войдзон - это именно войдзоны из моего же кода RS, тоже полуторагодичной давности (спеллы 74562 и 74792 со всей обвеской). coldflame - довольно специфический моб, он кроме стандартных фич войдзоны еще много чего должен уметь. |
|
14.10.2011, 14:33 | #5 | |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
Цитата:
По теме: Все очень просто. Берем создает скрипт на невидимого нпц и в Reset() прописываем ему каст ауры, с определенным радиусом действия и дамагом. Код:
struct MANGOS_DLL_DECL npc_void_stalkerAI : public ScriptedAI { npc_void_stalkerAI(Creature* pCreature) : ScriptedAI(pCreature) { Reset(); } void Reset() { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetRespawnDelay(DAY); DoCastSpellIfCan(m_creature, SPELL_VOID_AURA); } void AttackStart(Unit* pVictim) {} void EnterEvadeMode() {} void UpdateAI(const uint32 uiDiff) {} }; |
|
Пользователь сказал cпасибо: | ExDragon (14.10.2011) |
14.10.2011, 15:37 | #6 |
Пользователь
Регистрация: 23.03.2010
Сообщений: 51
Сказал(а) спасибо: 14
Поблагодарили 32 раз(а) в 15 сообщениях
|
MaxXx2021, то, что вы описали, тоже можно сделать через EventAI.
|
14.10.2011, 16:03 | #7 |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
|
14.10.2011, 16:34 | #8 |
Пользователь
Регистрация: 23.03.2010
Сообщений: 51
Сказал(а) спасибо: 14
Поблагодарили 32 раз(а) в 15 сообщениях
|
Зря. Их практически не надо поддерживать. А еще они более-менее верифицируемы. Хотя мы не можем гарантировать, что они работают так, как задумывал автор, мы можем быть уверены в том, что в процессе выполнения скрипта не возникнет нештатной ситуации.
|
14.10.2011, 18:50 | #9 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Кстати да. Одна из наиболее серьезных причин, по которой я бросил писать скрипты, именно в этом - написание скриптов в SD2 уже атавизм. Все можно (и нужно) делать через EventAI. Спеллы правда придется не хакать скриптом, а чинить в яде, но это правильный путь... Последняя мешавшая полному перегону скриптов в EventAI проблема - отсутствие поддержки энкаунтеров в чистом ядре - недавно решена Laise (пусть и не полностью, но для такого - вполне достаточно).
|
14.10.2011, 19:35 | #10 | |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
Цитата:
|
|
15.10.2011, 08:16 | #11 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
Код:
void ColdFlamePath(Unit* pTarget) { int Ply; float StartX, StartY, EndX, EndY, AllZ, vStart, vEnd, uX, uY; // Координаты босса StartX = m_creature->GetPositionX(); StartY = m_creature->GetPositionY(); // Координаты цели EndX = pTarget->GetPositionX(); EndY = pTarget->GetPositionY(); // Общая поаерхность AllZ = m_creature->GetPositionZ(); // Вектор vStart = StartX - EndX; vEnd = StartY - EndY; // Число витков Ply = sqrt(pow(vStart, 2) + pow(vEnd, 2)) / 8; for (int i = 0; i < Ply; i++) { uX = StartX - vStart / Ply * i; uY = StartY - vEnd / Ply * i; doSummon(NPC_COLD_FLAME, uX, uY, AllZ); } } Последний раз редактировалось ExDragon; 15.10.2011 в 08:19. |
15.10.2011, 11:32 | #12 | |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
Цитата:
|
|
15.10.2011, 11:51 | #13 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
и получится что огонёк бежит к игроку.. а мне нужна полоса огня..
|
15.10.2011, 11:54 | #14 |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
Там персистент аура . Аура оставляющая динамический обьект и дамаг с огнем вокруг него. У огня лорда марровгара нет визульной формы он просто бежит и оставляет каждые 0.2с на своем месте динамический обьект.
Код:
void Reset() { m_creature->CastSpell(m_creature, SPELL_COLD_FLAME_AURA, false); m_creature->GetMotionMaster()->MovePoint(0, X, Y, Z); } Код:
SPELL_COLD_FLAME_AURA = 69145, Последний раз редактировалось MaxXx2021; 15.10.2011 в 12:02. |
15.10.2011, 12:10 | #15 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
А где спеллы в ядре?..
|
15.10.2011, 12:24 | #16 |
Ученый
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
|
да, http://github.com/bwsrv/mangos/commits/master можете тут поискать эти спеллы, я их уже правил.
|
15.10.2011, 12:31 | #17 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 58
Сказал(а) спасибо: 17
Поблагодарили 0 раз(а) в 0 сообщениях
|
|