[TrinityCore][C++] PaySafeCard Receiver

11/29/2013 19:34 Blackwhile#1
...
11/29/2013 21:01 °"Crazy"°#2
Damit das Pastebin nicht verschwindet, hier habt Ihrs:

Code:
	

    #include "ScriptPCH.h"
     
    #define COOLDOWN_DELAY  2*MINUTE
    #define CODE_LENGTH     16
     
    static std::list<std::string> cardKeys;
    static UNORDERED_MAP<uint32, time_t> cooldowns;
     
    static bool CheckKey(std::string str, Player* player = NULL)
    {
        if (str.empty() || str.length() != CODE_LENGTH || str.find_first_not_of("1234567890") != std::string::npos)
        {
            if (player)
                player->GetSession()->SendNotification("Invalid key inserted!");
            return false;
        }
        for (std::list<std::string>::const_iterator it = cardKeys.begin(); it != cardKeys.end(); ++it)
        {
            if ((*it) != str)
                continue;
            if (player)
                player->GetSession()->SendNotification("Key already used!");
            return false;
        }
        return true;
    }
     
    class paysafecardkey_receiver : public CreatureScript
    {
    public:
        paysafecardkey_receiver() : CreatureScript("paysafecardkey_receiver")
        {
        }
     
        bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
        {
            player->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_CHAT, "Insert paysafecard key", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1, "Format: 1234567812345678", 0, true);
            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Nevermind..", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
            player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID());
            return true;
        }
     
        bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) OVERRIDE
        {
            player->PlayerTalkClass->ClearMenus();
            player->CLOSE_GOSSIP_MENU();
            return true;
        }
     
        bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, char const* code) OVERRIDE
        {
            player->PlayerTalkClass->ClearMenus();
            if (sender == GOSSIP_SENDER_MAIN && action == GOSSIP_ACTION_INFO_DEF+1)
                Process(player, code);
            OnGossipHello(player, creature);
            return true;
        }
     
        void Process(Player* player, char const* code)
        {
            uint32 accId = player->GetSession()->GetAccountId();
            if (cooldowns.find(accId) != cooldowns.end())
            {
                double diff = difftime(cooldowns[accId], time(NULL));
                if (diff > 0)
                {
                    if (diff >= MINUTE)
                        player->GetSession()->SendNotification("You need to wait %u more minutes", uint32(ceil((diff-MINUTE/2)/MINUTE)));
                    else
                        player->GetSession()->SendNotification("You need to wait %u more seconds", uint32(ceil(diff)));
                    return;
                }
                cooldowns.erase(accId);
            }
            if (!CheckKey(code, player))
                return;
     
            // success
            cooldowns[accId] = time(NULL) + COOLDOWN_DELAY;
            cardKeys.push_front(code); // push back or front?
            LoginDatabase.PExecute("INSERT INTO paysafecardkeys (accId, paysafecardkey) VALUES (%u, \"%s\")", accId, code); // Note! Not instant!
            player->GetSession()->SendAreaTriggerMessage("Key succesfully used");  
        }
    };
     
    class paysafecardkey_loader : public WorldScript
    {
    public:
        paysafecardkey_loader() : WorldScript("paysafecardkey_loader")
        {
        }
     
        void OnStartup() OVERRIDE
        {
            QueryResult result = LoginDatabase.Query("SELECT DISTINCT paysafecardkey FROM paysafecardkeys");
            if (!result)
                return;
            do
            {
                std::string paysafecardkey = (*result)[0].GetString();
                if (!CheckKey(paysafecardkey))
                    continue;
                cardKeys.push_back(paysafecardkey);
            } while (result->NextRow());
        }
    };
     
    void AddSC_example_gossip_codebox()
    {
        new paysafecardkey_loader;
        new paysafecardkey_receiver;
    }
11/29/2013 21:21 Blackwhile#3
Ich add es noch zusätzlich zum Thread ;-)

Habe es hinzugefügt. Danke für die Erinnerung.
12/02/2013 14:50 Kaev <3#4
Die Idee ist wirklich super, bin selber noch nicht darauf gekommen.
Mir fallen direkt jede Menge weitere Dinge ein, die man so umsetzen könnte.
12/04/2013 17:35 Blackwhile#5
Wenn du weitere Ideen hast kannst du dich jederzeit bei mir melden.
Die Idee mit den PaySafeCards ist nichts besonderes. Kam mir nur spontan in den Sinn ^^
12/05/2013 08:41 Kaev <3#6
Programmieren kann ich das schon selber, nur die Idee hat gefehlt. :P
Mir kam z.B. ein kleines Wahlsystem in den Sinn, bei dem man einen Charnamen angeben muss. Das würde sich aber eher auf RP oder Customzeugs beziehen.