• T端单机魔兽世界私服中的轮盘游戏(NPC脚本)


    大概就是这个图的意思了~~~通过NPC来实现。。应该是非常有趣的一种设置了!增加单机中的趣味
    然后我们来看看代码

    #include "ScriptPCH.h"
     
    class gamble_npc : public CreatureScript
    {
    public:
        gamble_npc() : CreatureScript("gamble_npc") { }
     
      std::string colorstring(uint16 type)
      {
            switch(type)
            {
            default:
                return false;
            case 2:
                return "black";
            case 3:
                return "red";
            case 4:
                return "green";
     
            }
        }
     
        int GenerateNumberMessage(uint32 numbervalue)
        {
            uint32 black[18] = {2, 28, 26, 11, 20, 17, 22, 15, 24, 13, 10, 29, 8, 31, 6, 33, 4, 35};
            uint32 red[18] = {9, 30, 7, 32, 5, 34, 3, 36, 1, 27, 25, 12, 19, 18, 21, 16, 23, 14};
            uint32 green[2] = {0, 00};
            
            for(uint16 i = 0; i < 18; i++)
            {
                if (numbervalue == black[i])
                return 2;
                else
                    
                if (numbervalue == red[i])
                return 3;
                else
                if (numbervalue == 37 || 0)
                return 4;    
            }
        }
        
     
        bool OnGossipHello(Player * player, Creature * creature)
        {
     
            player->ADD_GOSSIP_ITEM(3, "I want to play Roulette!", GOSSIP_SENDER_MAIN, 1337);
            player->ADD_GOSSIP_ITEM(3, "How does this Game work?", GOSSIP_SENDER_MAIN, 999);
            player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
            return true;
        }
     
        bool OnGossipSelect(Player * player, Creature * creature, uint32 sender, uint32 uiAction) 
        {
            player->PlayerTalkClass->ClearMenus();
            
            if (uiAction == 1337)
            {
            player->ADD_GOSSIP_ITEM(3, "I want to bet on a number.", GOSSIP_SENDER_MAIN,997);
            player->ADD_GOSSIP_ITEM(3, "I want to bet on a color.", GOSSIP_SENDER_MAIN, 996);
            player->ADD_GOSSIP_ITEM(3, "I want to bet on a number set.", GOSSIP_SENDER_MAIN, 995);
            player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
            }
            
            
            if(uiAction == 997)
            {
            player->ADD_GOSSIP_ITEM(3, "Stats for this table:
    Odds 35:1 (1-36, 0, and 00)
     Payout: x35", GOSSIP_SENDER_MAIN, 997);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 0.", GOSSIP_SENDER_MAIN, 0, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 1.", GOSSIP_SENDER_MAIN, 1, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 2.", GOSSIP_SENDER_MAIN, 2, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 3.", GOSSIP_SENDER_MAIN, 3, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 4.", GOSSIP_SENDER_MAIN, 4, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 5.", GOSSIP_SENDER_MAIN, 5, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 6.", GOSSIP_SENDER_MAIN, 6, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 7.", GOSSIP_SENDER_MAIN, 7, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 8.", GOSSIP_SENDER_MAIN, 8, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 9.", GOSSIP_SENDER_MAIN, 9, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM(3, "Next", GOSSIP_SENDER_MAIN, 1338);
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 1337);
            }
            
                    if(uiAction == 1338)
            {
            player->ADD_GOSSIP_ITEM(3, "Stats for this table:
    Odds 35:1 (1-36, 0, and 00)
     Payout: x35", GOSSIP_SENDER_MAIN, 997);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 10.", GOSSIP_SENDER_MAIN, 10, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 11.", GOSSIP_SENDER_MAIN, 11, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 12.", GOSSIP_SENDER_MAIN, 12, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 13.", GOSSIP_SENDER_MAIN, 13, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 14.", GOSSIP_SENDER_MAIN, 14, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 15.", GOSSIP_SENDER_MAIN, 15, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 16.", GOSSIP_SENDER_MAIN, 16, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 17.", GOSSIP_SENDER_MAIN, 17, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 18.", GOSSIP_SENDER_MAIN, 18, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM(3, "Next", GOSSIP_SENDER_MAIN, 1339);
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 997);
            }
            
                    if(uiAction == 1339)
            {
            player->ADD_GOSSIP_ITEM(3, "Stats for this table:
    Odds 35:1 (1-36, 0, and 00)
     Payout: x35", GOSSIP_SENDER_MAIN, 997);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 19.", GOSSIP_SENDER_MAIN, 19, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 20.", GOSSIP_SENDER_MAIN, 20, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 21.", GOSSIP_SENDER_MAIN, 21, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 22.", GOSSIP_SENDER_MAIN, 22, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 23.", GOSSIP_SENDER_MAIN, 23, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 24.", GOSSIP_SENDER_MAIN, 24, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 25.", GOSSIP_SENDER_MAIN, 25, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 26.", GOSSIP_SENDER_MAIN, 26, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 27.", GOSSIP_SENDER_MAIN, 27, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM(3, "Next", GOSSIP_SENDER_MAIN, 1340);
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 1338);
            }
            
                    if(uiAction == 1340)
            {
            player->ADD_GOSSIP_ITEM(3, "Stats for this table:
    Odds 35:1 (1-36, 0, and 00)
     Payout: x35", GOSSIP_SENDER_MAIN, 997);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 28.", GOSSIP_SENDER_MAIN, 28, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 29.", GOSSIP_SENDER_MAIN, 29, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 30.", GOSSIP_SENDER_MAIN, 30, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 31.", GOSSIP_SENDER_MAIN, 31, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 32.", GOSSIP_SENDER_MAIN, 32, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 33.", GOSSIP_SENDER_MAIN, 33, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 34.", GOSSIP_SENDER_MAIN, 34, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 35.", GOSSIP_SENDER_MAIN, 35, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 36.", GOSSIP_SENDER_MAIN, 36, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 00.", GOSSIP_SENDER_MAIN, 37, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 1339);
            }
            
     
            if(uiAction == 996)
            {
            player->ADD_GOSSIP_ITEM(3, "Stats for this table:
    Odds 1:1 (green is 1:17, as it is 0 and 00)
     Payout: x1 (x17) ", GOSSIP_SENDER_MAIN, 996);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet red.", GOSSIP_SENDER_MAIN, 800, "How much gold do you want to bet?", 0, true));
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet black.", GOSSIP_SENDER_MAIN, 810, "How much gold do you want to bet?", 0, true));
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet green. (The leprechauns jackpot!)", GOSSIP_SENDER_MAIN, 818, "How much gold do you want to bet?", 0, true));        
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 1337);
            }
     
            if(uiAction == 995)
            {
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 1-12. 2:1, Payout: 3x", GOSSIP_SENDER_MAIN, 700, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 13-24. 2:1, Payout: 3x", GOSSIP_SENDER_MAIN, 701, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 25-36. 2:1, Payout: 3x", GOSSIP_SENDER_MAIN, 702, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 1-5. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 703, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 6-10. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 704, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 11-15. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 705, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 16-20. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 706, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 21-25. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 707, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 26-30. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 708, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM_EXTENDED(3, "I want to bet on 31-35. 7:1 Payout: 7x", GOSSIP_SENDER_MAIN, 709, "How much gold do you want to bet?", 0, true);
            player->ADD_GOSSIP_ITEM(3, "Back", GOSSIP_SENDER_MAIN, 1337);
            }
     
            
            
            if(uiAction == 999)
            {
                player->ADD_GOSSIP_ITEM(7, "A ball is thrown onto the roulette table wheel, when the ball stops on a colored number, you either win or lose your bet. You may bet on specific numbers, even numbers, odd numbers, colors or ranges of 1-18 and 19-36. Your winnings will be  The colored numbers are the following:
     Black: 2, 28, 26, 11, 20, 17, 22, 15, 24, 13, 10, 29, 8, 31, 6, 33, 4, 35
     Red: 9, 30, 7, 32, 5, 34, 3, 36, 1, 27, 25, 12, 19, 18, 21, 16, 23, 14
     Green: 0, 00", GOSSIP_SENDER_MAIN, 666);
                player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
            }
            else if(uiAction == 666)
            {   
                OnGossipHello(player, creature);
            }
            return true;
        }
     
        bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 uiAction, const char* code) // happens when an extended gossip item is selected and the code is set to true for the gossip item.
        {
            player->PlayerTalkClass->ClearMenus();
     
            uint32 betnumber = 0;
            uint32 gold = uint32(atol(code)) * 1000; 
            std::ostringstream message;
            
     
            if(uiAction >= 0 && uiAction <= 37)
            {
            Gamblemode(player, creature, gold, 35, uiAction, uiAction, 0);
            }
            else
            {
            switch(uiAction)
            {
            case 700:
                Gamblemode(player, creature, gold, 3, 1, 12, 0);
            break;
            case 701:
                Gamblemode(player, creature, gold, 3, 13, 24, 0);
            break;
            case 702:
                Gamblemode(player, creature, gold, 3, 25, 36, 0);
            break;
            case 703:
                Gamblemode(player, creature, gold, 7, 1, 5, 0);
            break;
            case 704:
                Gamblemode(player, creature, gold, 7, 6, 10, 0);
            break;
            case 705:
                Gamblemode(player, creature, gold, 7, 11, 15, 0);
            break;
            case 706:
                Gamblemode(player, creature, gold, 7, 16, 20, 0);
            break;
            case 707:
                Gamblemode(player, creature, gold, 7, 21, 25, 0);
            break;
            case 708:
                Gamblemode(player, creature, gold, 7, 26, 30, 0);
            break;
     
            case 709:
                Gamblemode(player, creature, gold, 7, 31, 35, 0);
            break;
            
            case 800:
                Gamblemode(player, creature, gold, 2, 0, 37, 3);
                break;
     
            case 810:
                Gamblemode(player, creature, gold, 2, 0, 37, 2);
                break;
     
            case 818:
                Gamblemode(player, creature, gold, 17, 0, 37, 4);
                break;
            }
            }
            OnGossipHello(player, creature);
            return true;
        }
        
    bool Gamblemode(Player* player, Creature * creature, uint32 moneybet, uint32 multiplier, uint32 minimum, uint32 maximum, bool color)
        {
            std::ostringstream message;
            uint32 winningnumber = 0;
            winningnumber = urand(0,37);
            uint32 winnings = moneybet * multiplier;
            
            if (winningnumber == 37)
            winningnumber == 00;
     
        if(color)
        {
            if(player->GetMoney() < moneybet)
            {
                player->GetSession()->SendNotification("You don't have enough gold!");
            }
            else
            { 
                if(GenerateNumberMessage(winningnumber) == color)
                {   
                
                    player->ModifyMoney(player->GetMoney() + winnings);
                    player->PlayDirectSound(3337);
                    player->CastSpell(player, 47292);
                    player->CastSpell(player, 44940);
                    message << "AAAAAND the ball lands on" << colorstring(color) << winningnumber << "Congratulations" << player->GetName() << " You've won" << winnings << "gold!";
                    player->MonsterWhisper(message.str().c_str(), player->GetGUID());
                    return true;
                    
                }
                else
                {
                    player->ModifyMoney(player->GetMoney() - moneybet);
                    message << "AAAAAND the ball lands on" << colorstring(color) << winningnumber << ". So sorry, " << player->GetName() << ", but you've lost. Better luck next time!";
                    player->MonsterWhisper(message.str().c_str(), player->GetGUID());
                    return false;
                }
            }
        }
        else
        {
            if(player->GetMoney() < moneybet)
            {
                player->GetSession()->SendNotification("You don't have enough gold!");
            }
            else
            { 
                if(winningnumber >= minimum && winningnumber <= maximum)
                {   
                
                    player->ModifyMoney(player->GetMoney() + winnings);
                    player->PlayDirectSound(3337);
                    player->CastSpell(player, 47292);
                    player->CastSpell(player, 44940);
                    message << "AAAAAND the ball lands on" << GenerateNumberMessage(winningnumber) << winningnumber << "Congratulations" << player->GetName() << " You've won" << winnings << "gold!";
                    player->MonsterWhisper(message.str().c_str(), player->GetGUID());
                    return true;
                    
                }
                else
                {
                    player->ModifyMoney(player->GetMoney() - moneybet);
                    message << "AAAAAND the ball lands on" << GenerateNumberMessage(winningnumber) << winningnumber << ". So sorry, " << player->GetName() << ", but you've lost. Better luck next time!";
                    player->MonsterWhisper(message.str().c_str(), player->GetGUID());
                    return false;
                }
            }
        }
        }
     
    struct gambler_passivesAI : public ScriptedAI
    {
                       gambler_passivesAI(Creature * c) : ScriptedAI(c){ }
     
                       uint32 uiAdATimer;
                       uint32 uiAdBTimer;
                       uint32 uiAdCTimer;
     
                       void Reset()
                       {
                               uiAdATimer = 1000;
                               uiAdBTimer = 23000;
                               uiAdCTimer = 11000;
                       }
     
     
                       void UpdateAI(const uint32 diff)
                       {
     
                               if(uiAdATimer <= diff)
                               {
                                      me->MonsterSay("Come one, come all! Step right up to Crow's Casino! place your bets, place your bets!", LANG_UNIVERSAL, NULL);
                                      me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
                                      me->CastSpell(me, 44940);
                                      uiAdATimer = 61000;
                               }
                               else
                                       uiAdATimer -= diff;
     
                               if(uiAdBTimer <= diff)
                               {
                                       me->MonsterSay("Come on guys! Place your bets, Don't be a chicken, Go hard or go home!", LANG_UNIVERSAL, NULL);
                                       me->HandleEmoteCommand(EMOTE_ONESHOT_CHICKEN);
                                       uiAdBTimer = 61000;
                               }
                               else
                                       uiAdBTimer -= diff;
     
                               if(uiAdCTimer <= diff)
                               {
                                       me->MonsterSay("OH C'MON! YOU'RE MAKIN' ME CRY, Come and gamble! Step right up and win big today!", LANG_UNIVERSAL, NULL);
                                       me->HandleEmoteCommand(EMOTE_ONESHOT_CRY);
                                       uiAdCTimer = 61000;
                               }
                               else
                                       uiAdCTimer -= diff;
                       }
    };
     
                CreatureAI * GetAI(Creature * pCreature) const
               {
                       return new gambler_passivesAI(pCreature);
               }
    };
     
    void AddSC_gamble_npc()
    {
        new gamble_npc();
    }
  • 相关阅读:
    用asp自编源码制作动态的音乐播放页面
    VBS 连接数据库 样例
    VBS访问SQL数据库
    人人都应该知道的计算机网络协议(1)
    VBS 访问数据库 别人写的一份公共函数
    WPF DateTimePicker 和 TimeSpanPicker 控件发布
    实现Evernote的OAuth授权
    EvernoteTodo发布
    EvernoteAdage 发布
    关于 极限(Extreme)
  • 原文地址:https://www.cnblogs.com/needly/p/3752446.html
Copyright © 2020-2023  润新知