|
Языки программирования Изучаем С++, Sql, php, Lua, Python |
|
Опции темы | Поиск в этой теме | Опции просмотра |
28.04.2010, 17:07 | #41 |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Пара спеллов:
http://ru.wowhead.com/spell=38736 http://ru.wowhead.com/spell=57853 Проблема в следующем - при юзе итема, на котором они висят, они кастуются, но триггера спелла, висящего на них, не происходит. Не могу понять куда копать... Есть идеи? Ясно... Спелл имеет TARGET_SCRIPT. Значит эффект вешается на цель, указанную в базе и уже эта цель триггерит спелл. А нам надо триггерить спелл от кастера... |
29.04.2010, 09:31 | #42 |
Модератор
|
SpellAuras.cpp
Есть такая функция, которая вызывается при каждом тике триггерных аур Код:
void Aura::TriggerSpell() Код:
else { // Spell exist but require custom code switch(auraId) { Код:
case 38736: { if (Unit * caster = GetCaster()) caster->CastSpell(caster, trigger_spell_id, true, NULL, this, casterGUID); return; } |
29.04.2010, 12:03 | #43 |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Спасибо, как раз не мог найти этот обработчик
Но судя по данным ДБЦ спелла, создаётся впечатление, что надо в таблицу spell_script_target есть смысл добавить новый тип цели - self... Или же подобные спеллы просто добавлять в исключение в код - примут ли? |
29.04.2010, 12:32 | #44 |
Модератор
|
Это ответвление и было специально создано для таких случаев, перевод коммента
'триггер спелла есть, но требуется другой код' В триггерном эффекте стоит квест-комплит с таргет-селф, я думаю, что этот эффект точно должен применятся на кастера-игрока И если просмотреть все эти исключения, некоторые один в один повторяют основную обработку каста в самом конце как бы они уже не нужны, но стоят |
Пользователь сказал cпасибо: | KiriX (29.04.2010) |
29.04.2010, 13:40 | #45 | |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Цитата:
Вот только последнего (под звёздочкой) я не очень понял смысл... Таких спеллов несколько минимум, которые используют TARGET_SCRIPT, но по логике триггерного спелла должны кастоваться от кастера. Есть ли смысл добавлять тип цели спелла - кастер? |
|
03.05.2010, 09:39 | #46 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Пытаюсь сделать, чтобы моб в момент смерти кастовал АоЕ спелл, например http://ru.wowhead.com/spell=62598 (с помощью EAI или SD2, не важно). Анимация есть, но спелл промахивается в 100% случаев (кастуется как triggered). В чем дело? (:
Ревизия 9808. |
03.05.2010, 20:25 | #47 | |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Цитата:
|
|
03.05.2010, 23:57 | #48 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Да, в EventAI это EVENT_T_DEATH (6). Можете сами убедиться:
Код:
UPDATE creature_template SET AIName = 'EventAI', ScriptName = '' WHERE entry IN (32918); DELETE FROM creature_ai_scripts WHERE creature_id IN (32918); INSERT INTO creature_ai_scripts VALUES ('3291801','32918','0','0','100','7','5000','10000','10000','12000','11','62608','1','0','0','0','0','0','0','0','0','0','Detonating Lasher - Cast Flame Lash'), ('3291802','32918','6','0','100','2','0', '0', '0', '0', '11','62598','0','3','0','0','0','0','0','0','0','0','Detonating Lasher (Normal) - Cast Detonate on Death'), ('3291803','32918','6','0','100','4','0', '0', '0', '0', '11','62937','0','3','0','0','0','0','0','0','0','0','Detonating Lasher (Heroic) - Cast Detonate on Death'); |
04.05.2010, 07:53 | #49 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Ох уж это EventAI...
Попробуйте поставить мобу 1 хп INVINCIBILITY_LEVEL (кажется так), и на 1 хп кастануть этот спелл и умереть. |
04.05.2010, 23:02 | #50 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Сделал новый тип события EVENT_T_JUST_BEFORE_DEATH, который обрабатывается в DamageTaken при получении последнего удара.
|
12.05.2010, 09:30 | #51 |
Новичок
Регистрация: 24.03.2010
Сообщений: 25
Сказал(а) спасибо: 11
Поблагодарили 14 раз(а) в 7 сообщениях
Записей в дневнике: 6
|
Подскажите где проверяется разница рейтов арены. Дапустим у одной тимы 300 а у другой 800.Они не могут участвовать в месте, потому что разница большая.
|
12.05.2010, 10:33 | #52 |
Пользователь
Регистрация: 07.03.2010
Сообщений: 40
Сказал(а) спасибо: 29
Поблагодарили 13 раз(а) в 5 сообщениях
|
В конфиге есть такой параметр, по дефолту вроде 150, думаю с него и надо начинать поиск.
|
18.08.2010, 15:53 | #53 |
Гость
Сообщений: n/a
|
Помогите разобраться в коде. Mangos 0.12 кум 6928
Я тут посмотрел написал комментарии по правьте если ошибся. Я может и понимаю код, но что, для чего и зачем мне не понятно. Опишите пожалуйста функции которые в примере. Как я понимаю эта процедура почти стартовая при исполнение кода спеллов(еще старше та которая ее вызывает) Код:
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) { CHECK_PACKET_SIZE(recvPacket,4+1+2); uint32 spellId;//Объявление двух переменных. Со SpellId понятно uint8 cast_count;//Что храниться здесь??? И для ВНЕЗАПНОГО УДАРА и для ЛЕДЯННОЙ СТРЕЛЫ - 0. recvPacket >> spellId; recvPacket >> cast_count; sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i", spellId, cast_count, recvPacket.size()); //Логи SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId ); /* В SpellEntry содержется описание ячеек из spell.dbc клик по sSpellStore >>>> GO TO DEFINITION приводит к DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); судя по всему, описание какого-то DBC???? клик по LookupEntry >>>> GO TO DEFINITION приводит к T const* LookupEntry(uint32 id) const { return (id>=nCount)?NULL:indexTable[id]; } не могу понять конструкцию, вроде тут условие и возвращение какого-то id??? судя по *SpellInfo...ммм, название говорит само за себя. */ if(!spellInfo)//проверка на успешное создание spellInfo { sLog.outError("WORLD: unknown spell id %u", spellId); return; } // not have spell or spell passive and not casted by client(с английским проблемы) что-то вроде: не имеется спелл или спел пассивный и нет каста от клиента. вроде так. if ( !_player->HasSpell (spellId) || IsPassiveSpell(spellId) )//Проверка на читерство??? { //cheater? kick? ban? return; } // client provided targets SpellCastTargets targets;//Создание таргета if(!targets.read(&recvPacket,_player))//Проверка на существование таргета? return; // auto-selection buff level base at target level (in spellInfo) Это мне не дано перевсти: авто-выбор полезного эфекта базового уровня....бррр...... if(targets.getUnitTarget()) { SpellEntry const *actualSpellInfo = spellmgr.SelectAuraRankForPlayerLevel(spellInfo,targets.getUnitTarget()->getLevel()); /* GO TO DEFINITION(SelectAuraRankForPlayerLevel) - SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const;// --- это прототип функции?? //А где тело функции описывается...хм...spellmrg.cpp //go to definition привело меня в spellmrg.h, понятно. SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const //посмотрим чё тут=) { // ignore passive spells игнорирование пассивных спеллов if(IsPassiveSpell(spellInfo->Id)) return spellInfo; //Возвращаем изначальное спеллинфо bool needRankSelection = false;//объявляем буль for(int i=0;i<3;i++)//такс цикл { if( IsPositiveEffect(spellInfo->Id, i) && ( spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA || spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ) ) {//Если в spell.dbc хоть одна из ячеек effect равна SPELL_EFFECT_APPLY_AURA ||(или) SPELL_EFFECT_APPLY_AREA_AURA_PARTY //а вот IsPositiveEffect(spellInfo->Id, i) как Я ПОНЯЛ там внутри идет проверка из множества свитч кэйсов и другой бурды //на полезный или вредный эффект спелла(всмысле эффект у спела положительный(хилит, бафает) или отрицательный(урон...)) needRankSelection = true; //еслив хоть раз условие верно буль будет истин break;//и выходим из цикла } } // not required if(!needRankSelection)//т.к буль НЕ истин return spellInfo;//Возвращаем изначальное спеллинфо for(uint32 nextSpellId = spellInfo->Id; nextSpellId != 0; nextSpellId = GetPrevSpellInChain(nextSpellId)) { SpellEntry const *nextSpellInfo = sSpellStore.LookupEntry(nextSpellId);//опять шесть сот двадцать пять if(!nextSpellInfo)//а есть ли оно? break;//нет // if found appropriate level if(playerLevel + 10 >= nextSpellInfo->spellLevel)//больши или равен левел игрока уровня спелла?? return nextSpellInfo; //возвращаем nextSpellInfo // one rank less then } // not found return NULL;//ничего }//Вообщем, я не понял что эта функция делает=)моски надо купить */ // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message if(actualSpellInfo)//если не нулл spellInfo = actualSpellInfo; } Spell *spell = new Spell(_player, spellInfo, false);//конструктор,хм _player, spellInfo, false. false - это тригерность??? spell->m_cast_count = cast_count; // set count of casts пожалуйста скажите для чего cast_count spell->prepare(&targets);//Это следующее что я должен смотреть если хочу идти по следам спелла??? }//фуу вот и все Последний раз редактировалось pavelzubkov; 18.08.2010 в 18:16. |
18.08.2010, 16:40 | #54 |
Модератор
|
Код:
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) { CHECK_PACKET_SIZE(recvPacket,4+1+2); uint32 spellId; // ID спелла uint8 cast_count; // количество кастов, увеличивается с каждым новым кастом для конкретного спелла recvPacket >> spellId; recvPacket >> cast_count; sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i", spellId, cast_count, recvPacket.size()); //Логи SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId ); /* Обьект SpellEntry - получение информации по спеллу из DBC */ /* т.е мы можем обращатся к полям структуры, типа spellInfo->ID, spellInfo->SpellIconID, см. DBCStructure.h, struct SpellEntry */ if(!spellInfo)//проверка на успешное создание spellInfo { sLog.outError("WORLD: unknown spell id %u", spellId); return; } // not have spell or spell passive and not casted by client (нет данного спелла у игрока или спелл пассивный - а значит НИКАК не может быть скастован клиентом => читер if ( !_player->HasSpell (spellId) || IsPassiveSpell(spellId) )//Проверка на читерство??? { //cheater? kick? ban? return; } // client provided targets SpellCastTargets targets; //Создание таргета if(!targets.read(&recvPacket,_player)) // Чтение целей из пакета и занесение их в таргет обработку return; // auto-selection buff level base at target level (in spellInfo) (выбор уровня спелла согласно левелу чара) if(targets.getUnitTarget()) { SpellEntry const *actualSpellInfo = spellmgr.SelectAuraRankForPlayerLevel(spellInfo,targets.getUnitTarget()->getLevel()); /* GO TO DEFINITION(SelectAuraRankForPlayerLevel) - SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const; --- это прототип функции?? А где тело функции описывается...хм...spellmrg.cpp go to definition привело меня в spellmrg.h, понятно. SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const //посмотрим чё тут=) { // ignore passive spells игнорирование пассивных спеллов if(IsPassiveSpell(spellInfo->Id)) return spellInfo; //Возвращаем изначальное спеллинфо bool needRankSelection = false;//объявляем буль for(int i=0;i<3;i++)//такс цикл { if( IsPositiveEffect(spellInfo->Id, i) && ( spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA || spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ) ) {//Если в spell.dbc хоть одна из ячеек effect равна SPELL_EFFECT_APPLY_AURA ||(или) SPELL_EFFECT_APPLY_AREA_AURA_PARTY //а вот IsPositiveEffect(spellInfo->Id, i) как Я ПОНЯЛ там внутри идет проверка из множества свитч кэйсов и другой бурды //на полезный или вредный эффект спелла(всмысле эффект у спела положительный(хилит, бафает) или отрицательный(урон...)) needRankSelection = true; //еслив хоть раз условие верно буль будет истин break;//и выходим из цикла } } // not required if(!needRankSelection)//т.к буль НЕ истин return spellInfo;//Возвращаем изначальное спеллинфо for(uint32 nextSpellId = spellInfo->Id; nextSpellId != 0; nextSpellId = GetPrevSpellInChain(nextSpellId)) { SpellEntry const *nextSpellInfo = sSpellStore.LookupEntry(nextSpellId);//опять шесть сот двадцать пять if(!nextSpellInfo)//а есть ли оно? break;//нет // if found appropriate level if(playerLevel + 10 >= nextSpellInfo->spellLevel)//больши или равен левел игрока уровня спелла?? return nextSpellInfo; //возвращаем nextSpellInfo // one rank less then } // not found return NULL;//ничего }//Вообщем я ни понял что эта функция делает=)моски надо купить */ // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message if(actualSpellInfo)//если не нулл spellInfo = actualSpellInfo; } Spell *spell = new Spell(_player, spellInfo, false); // конструктор - создаем обьект Spell // Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered) spell->m_cast_count = cast_count; // устаналиваем количество кастов в глобальную переменнную для дальнейших расчетов spell->prepare(&targets);// Переход в фазу подготовки спелла }//фуу вот и все Я изменил комменты кое-где, почитай - возникнут вопросы - пиши Последний раз редактировалось MaS0n; 18.08.2010 в 16:52. |
Пользователь сказал cпасибо: |
18.08.2010, 18:14 | #55 | ||
Гость
Сообщений: n/a
|
так значит функция sSpellStore.LookupEntry(spellId) возвращает данные о спелле из dbc.
Цитата:
Цитата:
|
||
18.08.2010, 19:23 | #56 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
cast_count, вроде бы, в мангосе не используется, но я могу ошибаться.
|
18.08.2010, 20:02 | #57 |
Модератор
|
Используется.
Для чего - не знаю, мб для вычислений, например предотвращения зацикливания триггера в deadloop, обработки мульти-кастов и т.д Насчет уровня спелла - да |
19.08.2010, 10:20 | #58 |
Гость
Сообщений: n/a
|
По следу спелла=)
Я правильно понял? Критика моим комментариям приветствуется=)
Код:
void Spell::prepare(SpellCastTargets * targets, Aura* triggeredByAura)/*Подготовка спелла*/ { m_targets = *targets;/*Аргумент *targets нужен только для этого присваивания(еще не придумал как выразиться(*/ m_spellState = SPELL_STATE_PREPARING;/*Статистика спелла - подготовка*/ m_castPositionX = m_caster->GetPositionX(); m_castPositionY = m_caster->GetPositionY(); m_castPositionZ = m_caster->GetPositionZ(); m_castOrientation = m_caster->GetOrientation(); /*Получение координат и ориентации кастера*/ if(triggeredByAura)/**/ m_triggeredByAuraSpell = triggeredByAura->GetSpellProto(); // create and add update event for this spell Создание события для спелла? SpellEvent* Event = new SpellEvent(this);//Создаем ЭВЕНТ для нашего спелла m_caster->m_Events.AddEvent(Event, m_caster->m_Events.CalculateTime(1));/*Что за тайм считается? Время создания ЭВЕНТА? И для чего он создаеться?*/ /*Если не ошибаюсь ЭВЕНТ - событие. Создается событие для спелла?*/ //Prevent casting at cast another spell (ServerSide check) ??? /*Английский под учим, потом.*/ if(m_caster->IsNonMeleeSpellCasted(false, true) && m_cast_count)/*Милишный спелл и m_cast_count*/ { /*Я прав что тут условие вида: if (m_caster->IsNonMeleeSpellCasted(false, true) == true && m_cast_count == true) {...} но ведь m_cast_count не bool. Или он false если равен нулю и true если не равен нулю, ведь так?*/ SendCastResult(SPELL_FAILED_SPELL_IN_PROGRESS);//Отправка клиенту сведений о неудачном касте. finish(false);/*Finish(bool) - это процедура говорящая о конце подготовки еслив на false то подготовка окончилась не удачей?*/ return; } // Fill cost data /*Данные о затратах на спелл(мана, энергия, ярость)*/ m_powerCost = CalculatePowerCost();/*CalculatePowerCost() подсчитывает затраты*/ uint8 result = CanCast(true);/*В CanCast проверяется возможность каста??*/ if(result != 0 && !IsAutoRepeat()) /*Всегда повторяем каст...*/ //always cast autorepeat dummy for triggering { if(triggeredByAura)/*Опять проверка на аргумент, который мы не передавали из WorldSession::HandleCastSpellOpcode*/ {/*И если он есть что-то делаем...*/ SendChannelUpdate(0); triggeredByAura->SetAuraDuration(0); } SendCastResult(result);/*Посылка клиенту сведений о неудачи?????*/ finish(false); return; } // calculate cast time (calculated after first CanCast check to prevent charge counting for first CanCast fail) m_casttime = GetSpellCastTime(m_spellInfo, this);/*Достаем время каста спелла*/ // set timer base at cast time ReSetTimer();/*Какой-то таймер ресаем*/ /*void ReSetTimer() { m_timer = m_casttime > 0 ? m_casttime : 0; } эта констция значит*/ // : //void ReSetTimer() //{ // if (m_casttime > 0) // { // m_timer = m_casttime; // } // else {m_timer = 0;} //} // stealth must be removed at cast starting (at show channel bar) Незаметность должна быть отменена при старте спелла? // skip triggered spell (item equip spell casting and other not explicit character casts/item uses) Пропуск триггерного спелла? if ( !m_IsTriggeredSpell && isSpellBreakStealth(m_spellInfo) )/*функция isSpellBreakStealth(m_spellInfo) определяет выводит ли спелл из режима незаметности??*/ { m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);/*Выход из стелса*/ m_caster->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);/*Воскрешение????*/ } if(m_IsTriggeredSpell)/*Тригерный ли спелл, если да каст(тру)*/ cast(true);/*Кастуется то что вызывает тригер??*/ else {/*нет*/ m_caster->SetCurrentCastedSpell( this );/*Установление значений каста спелла. Там определяется крита, мисс, доджи, блок, пар...?*/ m_selfContainer = &(m_caster->m_currentSpells[GetCurrentContainer()]);/*?*/ SendSpellStart();/*Передача данных о старте спелла??*/ } } Последний раз редактировалось pavelzubkov; 19.08.2010 в 20:18. Причина: Что-то узнал до чего-то додумался, поправлю коменты. |
19.08.2010, 14:08 | #59 | |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Цитата:
Т.е. игрок жмет каст - клиент видит что сервер не сообщил об окончании предыдущего каста, но посылает пакет каста серверу с +1 номером в упомянутом поле. Сервер уже сам разбирается можно разрешить каст или нет. Помогает при лагах когда клиент раньше не давал кастовать из-за лагов хотя по времени формально каст должен был уже закончится предыдущий.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
Пользователь сказал cпасибо: |
19.08.2010, 18:54 | #60 |
Гость
Сообщений: n/a
|
Небольшой вопрос(на примере) по функциям в с++:
есть функция void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) из которой вызываеться другая функция void Spell:repare(SpellCastTargets * targets, Aura* triggeredByAura) и вот при вызове второй функции указываеться только один аргумент SpellCastTargets * targets, а второй нет. Как я понимаю на примере в предыдущих сообщениях функция вызовется, НО triggeredByAura(второй аргумент последней функции) будет не инициализирован. Я поторопился...нашел в spell.h прототип этой функции void prepare(SpellCastTargets * targets, Aura* triggeredByAura = NULL); zergtmn стараюсь читать Последний раз редактировалось pavelzubkov; 19.08.2010 в 19:22. Причина: Ответил сам. |
19.08.2010, 19:08 | #61 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Советую вам почитать книжки по С++.
|
18.01.2011, 18:48 | #62 |
Новичок
Регистрация: 07.03.2010
Сообщений: 11
Сказал(а) спасибо: 18
Поблагодарили 2 раз(а) в 1 сообщении
|
Снова нужна помощь
решил переделать определение уровня гма, мне удобней чтобы все аккаунты на которые я захожу со своего айпи бали гмские в accountmgr.cpp я прописываю std::string IP_str = GetRemoteAddress(); и меняю запрос на нужный мне при компиляции пишет неизвестный индификатор пробовал так player()->Getsesion()->GetRemoteAddress(); тоже неможет найти индефикатор Подскажите что поправить |
18.01.2011, 19:28 | #63 | |
Пользователь
|
Цитата:
|
|
19.01.2011, 17:19 | #65 |
Новичок
Регистрация: 07.03.2010
Сообщений: 11
Сказал(а) спасибо: 18
Поблагодарили 2 раз(а) в 1 сообщении
|
|
19.01.2011, 18:34 | #66 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Имхо AccMgr это менеджер для работы с базой акков и не более. Тебе нужно копать WorldSession или AuthSocket.
|
24.07.2011, 03:50 | #70 |
Новичок
Регистрация: 25.06.2010
Адрес: Lipetsk
Сообщений: 21
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
|
как можно задать шанс крита спелу?
Например если весит аура ток спел с вероятностью в x% должен нанести крит урон |
24.07.2011, 07:18 | #71 |
Ученый
Регистрация: 10.03.2010
Адрес: Бобруйск
Сообщений: 284
Сказал(а) спасибо: 213
Поблагодарили 98 раз(а) в 84 сообщениях
|
bool Unit::IsSpellCrit(...)
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
trinity (world) to mangos (mangos) | Timmy-kr | Корзина | 1 | 02.06.2010 04:51 |