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:\nOdds 35:1 (1-36, 0, and 00)\n 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:\nOdds 35:1 (1-36, 0, and 00)\n 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:\nOdds 35:1 (1-36, 0, and 00)\n 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:\nOdds 35:1 (1-36, 0, and 00)\n 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:\nOdds 1:1 (green is 1:17, as it is 0 and 00)\n 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:\n Black: 2, 28, 26, 11, 20, 17, 22, 15, 24, 13, 10, 29, 8, 31, 6, 33, 4, 35\n Red: 9, 30, 7, 32, 5, 34, 3, 36, 1, 27, 25, 12, 19, 18, 21, 16, 23, 14\n 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(); }