Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Новичкам

Важная информация

Новичкам Информация для всех новичков, новичкам рекомендуется задавать свои вопросы здесь

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.07.2010, 14:34   #1
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию rand() chance

Доброго времени суток RMDC. Необходима ваша помощь в написания небольшого скрипта для кастомного НПЦ. Суть проста - лотерея.

Ситуация:
Игрок выбирает к примеру выбирает пункт "играть" и ему с рендомным шансом выдается приз либо ничего. С вызовом рендома разобрался, необходимо задать шанс(проценты) для каждой награды. Допустим case 0: = 20% case 1: = 30% case 2: = 10% и для всех остальных случаев case 3:

Часть кода:


Код:
#define LOOSER_1         "Увы, фортуна подвела вас, возможно повезет в следующий раз"
......
......
......
......
case 999:
            switch (rand()% 4)
                {
                    case 0:
                    {
                      if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(38233, 10))
                               pPlayer->SendNewItem(pItem, 10, true, false);

                    }
                    break;
                    case 1:
                    {
                      if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(46779, 10))
                               pPlayer->SendNewItem(pItem, 10, true, false);

                    }
                    break;
                    case 2:
                    {
                      if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(35223, 10))
                               pPlayer->SendNewItem(pItem, 10, true, false);

                    }
                    break;
                    case 3:
                    {
                      pCreature->MonsterWhisper(LOOSER_1, pPlayer->GetGUID());

                    }
                    break;
                }
Я знаю что это не форум по скриптам(scriptdev2 смотрел, похожих тем не нашел), но может поможете. Если есть иной вариант решения данной проблемы(даже с полным переписыванием данной части кода) просьба также написать.

Последний раз редактировалось selector; 03.07.2010 в 14:49.
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 15:08   #2
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Если у вас, допустим, 4 case-а, с шансами 10%, 20%, 30% и 40%, то наиболее простой способ будет выглядеть так:
Код:
switch(rand()%10)
{
    case 0: // 10%
        break;
    case 1:
    case 2: // 20%
        break;
    case 3:
    case 4:
    case 5: // 30%
        break;
    case 6:
    case 7:
    case 8:
    case 9: // 40%
        break;
}
LordJZ вне форума   Ответить с цитированием
Старый 03.07.2010, 15:21   #3
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Потихоньку начинаю понимать. В вашем примере берется шанс в 100% и делится на 10. Хорошо основу понял, тогда допустим вторая ситуация. Необходимо что были к примеру 6 значений у 1 и 2 шанс по 5%, 3 и 4 = 15%, 5 =30%, если ничего не выпало то 6 значение.



P.S. может показаться что туплю, но я привык обучаться на примерах и потом методом проб и ошибок приходить к правильному решению своих задач.

Последний раз редактировалось selector; 03.07.2010 в 15:27.
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 15:36   #4
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

mangos\src\shared\Util.h

куча рандомов, шансов и т.п. Выбирайте любой.
SeT вне форума   Ответить с цитированием
Старый 03.07.2010, 15:44   #5
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Таким же способом:
Код:
switch(rand()%20)
{
    case 1:        	// 5%
        break;
    case 2:        	// 5%
        break;
    case 3:
    case 4:
    case 5:        	// 15%
        break;
    case 6:
    case 7:
    case 8:        	// 15%
        break;
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:    	// 30%
        break;
    default:    	// 30%
        break;
}
Но проще, менее громоздко и более изящно получить шанс:
Код:
int result = rand()%100;
И потом его проверить. Например, можете посмотреть реализацию ф-ии FillLoot в мангосе.
LordJZ вне форума   Ответить с цитированием
Старый 03.07.2010, 17:03   #6
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

спасибо огромное, с примерами разобрался и создал необходимое. Но возник еще 1 вопрос. Как сюда подключить дроби? тоесть допустим чтоб шанс был 0.5%. Если не трудно пример с дробями и целыми числами(0.5%, 3%, 15%..).

По совету SeT'a изучил Util.h Увидел данное
Код:
/* Return a random double from 0.0 to 99.9999999999999. Floats support only 7 valid decimal digits.
 * A double supports up to 15 valid decimal digits and is used internaly (RAND32_MAX has 10 digits).
 * With an FPU, there is usually no difference in performance between float and double. */
MANGOS_DLL_SPEC double rand_chance(void);
и мягко говоря вошел в ступор...
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 18:01   #7
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

Цитата:
Сообщение от selector Посмотреть сообщение
спасибо огромное, с примерами разобрался и создал необходимое.
Просьба похвастаться сделанным. В комплекте с остальными кастомными НПС будет очень и очень неплохая перспектива для индивидуализации сервера.
А там деньги за каждую попытку сыграть берутся? А что в награду дается?
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
Старый 03.07.2010, 19:15   #8
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

За голосования через mvs(mangos vote system) выдаются спец итемы(я их обозвал Токенами) за них у специализированых НПЦ можно разнообразные бонусы получать(маунты, спутники, телепорты в локации, снятие дезертира). Вобщем все по мелочам. Токены заменить на голду - элементарно)

С утреца решил добавить лотерею и застрял на вопросе выставления шанса. Лотерей хочу 3 видов сложности создать. Игрок платит определенное количество токенов НПЦ и у него есть шанс получить разные бонусы, либо ничего(в зависимости от вида лотереи разные награды и шанс разный)
Мини - 1токен, награды вида "Кормушки для петов", 2-3 питомца с 5% шанса каждым, остальное -фейл
Нормал - 2токена, уже посерьезней: шанс получить маунтов Мишки с зульамана, Ракеты, "Слез Нубов"(1-2%), спутники вида Зерлинг, Космический десант(старкраф-мурлок), путь Илидана, Путь кенария
Екстра - 3токена, Почти все что можно найти тут http://ru.wowhead.com/items?filter=c...s=8;crv=0;gb=0


Неплохое резвлечение для игроков + стимул)


Код выложу как только "почищу" его. А то все пишется для себя и немного грязновато выходит.

Последний раз редактировалось selector; 03.07.2010 в 19:17.
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 19:40   #9
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

на счет процентов еще не разобрался..просто сделал хитрее. В case еще вставил по одному rand(). Пол часа тестирую, все ок
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 19:43   #10
Hantet
Ученый
 
Аватар для Hantet
 
Регистрация: 07.03.2010
Адрес: Санкт-Петербург
Сообщений: 163
Сказал(а) спасибо: 124
Поблагодарили 111 раз(а) в 52 сообщениях
Hantet Скоро придёт к известностиHantet Скоро придёт к известности
Отправить сообщение для Hantet с помощью ICQ
По умолчанию

mvs (осторожно, jp!)

upd: да я не про плюсики... Местные поймут
__________________
Галя: Вот почему когда я пуск делаю и по ярлыку две то запускается, а если вот мне к примеру надо не из пуска её то ничего и в красном показывает, а надо ведь чтобы квадратик жёлтенький открывал и там 3 кнопки должно быть?
admin: О Боже!
admin: Кто-нибудь, пришлите ко мне уборщицу, пусть мой мозг со стен и потолка отмоет

Последний раз редактировалось Hantet; 03.07.2010 в 19:53.
Hantet вне форума   Ответить с цитированием
Старый 03.07.2010, 19:48   #11
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
Злость

знаю. "гребут" все что видят ради плюсиков , но проект то не ихний и пользуюсь уже давно.

Ктомуже я использую данное: http://www.assembla.com/wiki/show/mangos_vote_system

Последний раз редактировалось selector; 03.07.2010 в 19:53.
selector вне форума   Ответить с цитированием
Старый 03.07.2010, 20:40   #12
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

Паблик - убивать без предупреждения.
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
Старый 04.07.2010, 01:51   #13
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

Паблик - нее) молчу Просто рассказал откуда идея взялась. Скрипт написан, осталось только подчистить его. Собственно наверно последний вопрос. Как можно упростить например данный участок кода:

Код:
        case 220: // Heh, let's try
        {
            if (pPlayer->HasItemCount(25850, 1)  )
            {
                pPlayer->DestroyItemCount(25850, 1, true);
                int result = rand()%75;
                switch(result)
                {

.................
.................
.................
.................
                    case 27: // Crabs :)
                    {
                        pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID());
                        pPlayer->CLOSE_GOSSIP_MENU();
                        if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1))
                            pPlayer->SendNewItem(pItem, 1, true, false);
                    }
                    break;
                    case 28: // Crabs :)
                    {
                        pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID());
                        pPlayer->CLOSE_GOSSIP_MENU();
                        if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1))
                            pPlayer->SendNewItem(pItem, 1, true, false);
                    }
                    break;
                    case 29: // Crabs :) 
                    {
                        pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID());
                        pPlayer->CLOSE_GOSSIP_MENU();
                        if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1))
                            pPlayer->SendNewItem(pItem, 1, true, false);
                    }
                    break;
.................
.................
.................
Вопрос вот в чем. Есть ли возможность объединить case. Нечто вида:
Код:
                    case 27-29: // Crabs :) 
                    {
                        pCreature->MonsterWhisper(WINNER_10, pPlayer->GetGUID());
                        pPlayer->CLOSE_GOSSIP_MENU();
                        if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(2683, 1))
                            pPlayer->SendNewItem(pItem, 1, true, false);
                    }
                    break;
selector вне форума   Ответить с цитированием
Старый 04.07.2010, 01:59   #14
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Я же писал выше пример...
Код:
case 27:
case 28:
case 29:
LordJZ вне форума   Ответить с цитированием
Старый 04.07.2010, 01:59   #15
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

Ну, как я понимаю, выше, в пятом посте уже приведен пример подобного?

Можно написать
Код:
    case 6:        	// 5%
        break;
    case 7:        	// 5%
        break;
    case 8:        	// 5%
        break;
А можно
Код:
    case 6:
    case 7:
    case 8:        	// 15%
        break;
Сразу уточню, что это не решение, а предположение. Я в ентом програмировании ноль полный.
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
Старый 04.07.2010, 02:10   #16
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

все дошло) Ночь спать охота, туплю немного..но надо дописать уже и выложить на критику). Спасибо за помощь
selector вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10608] Update melee miss chance calculations...finally. newsbot CMaNGOS Commits 0 14.10.2010 16:51
[10511] Fixed SPELL_AURA_MOD_COMBAT_RESULT_CHANCE dodge chance apply to auto-attacks result. newsbot CMaNGOS Commits 0 20.09.2010 13:21
[9963] Implement per-tick chance for shard for spell 1120 and ranks. newsbot CMaNGOS Commits 0 23.05.2010 16:40


Текущее время: 18:18. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot