zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
    Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again。
    redhat 关机注销命令详解
    VirtualBox的四种网络连接方式
    修改RedHat的系统显示时间
    insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
    xen坑随笔 heartbeat dpkg垃圾数据库清除
    tomcat 监控脚本
    负载均衡随笔
    GIT命令介绍
  • 原文地址:https://www.cnblogs.com/needly/p/3752446.html
Copyright © 2011-2022 走看看