View difference between Paste ID: FtVsrE2b and hEhuPPBf
SHOW: | | - or go back to the newest paste.
1
2
#include "ScriptPCH.h"
3
4-
	{
4+
5-
		uint64 GUID;
5+
6-
		uint32 Goal;
6+
    uint32 GUID;
7-
		int32 RemainingRankPoints;
7+
    uint32 Goal;
8-
		float timeLeft;
8+
    uint32 RemainingRankPoints;
9-
	};
9+
    float timeLeft;
10
};
11
12
class Bet_Npc : public CreatureScript, PlayerScript, WorldScript
13
{
14-
	Bet_Npc() : CreatureScript("Bet_Npc"), PlayerScript("Check"), WorldScript("Timer") {Timer = 0;}
14+
15-
	uint32 Timer;
15+
    Bet_Npc() : CreatureScript("Bet_Npc"), PlayerScript("Check"), WorldScript("Timer") {Timer = 0;}
16
    uint32 Timer;
17-
	void OnRankPointsReceive(Player* obtainer, int32 amount)
17+
18-
	{
18+
    void OnRankPointsReceive(Player* obtainer, int32 amount)
19-
		if(amount <= 0 || betTracker.empty())
19+
    {
20-
			return;
20+
        if(amount <= 0 || betTracker.empty())
21-
		for(std::vector<betInfo>::iterator itr = betTracker.begin(); itr != betTracker.end(); ++itr)
21+
            return;
22-
		{
22+
        for(std::vector<betInfo>::iterator itr = betTracker.begin(); itr != betTracker.end(); ++itr)
23-
			if(itr->GUID == obtainer->GetGUID())
23+
        {
24-
			{
24+
            if(itr->GUID == obtainer->GetGUID())
25-
				if(itr->RemainingRankPoints <= amount )
25+
            {
26-
				{
26+
                if(itr->RemainingRankPoints <= amount )
27-
					itr->RemainingRankPoints = 0;
27+
                {
28-
					ChatHandler(obtainer->GetSession()).SendSysMessage("[Goal System] : You have successfully reached your goal, please visit the Betting Npc to claim your reward");
28+
                    itr->RemainingRankPoints = 0;
29-
				}
29+
                    ChatHandler(obtainer->GetSession()).SendSysMessage("[Goal System] : You have successfully reached your goal, please visit the Betting Npc to claim your reward");
30-
				else
30+
                }
31-
				{
31+
                else
32-
					itr->RemainingRankPoints -= amount;
32+
                {
33-
					ChatHandler(obtainer->GetSession()).PSendSysMessage("[Goal System] : %u Rank Points remaining to complete your goal", itr->RemainingRankPoints);
33+
                    itr->RemainingRankPoints -= amount;
34-
				}
34+
                    ChatHandler(obtainer->GetSession()).PSendSysMessage("[Goal System] : %u Rank Points remaining to complete your goal", itr->RemainingRankPoints);
35-
				CharacterDatabase.PExecute("UPDATE `Character_Bets` SET `RemainingGoal` = %u WHERE `GUID` = %u", itr->RemainingRankPoints, obtainer->GetGUID());
35+
                }
36-
				return;
36+
                CharacterDatabase.PExecute("UPDATE `Character_Bets` SET `RemainingGoal` = %u WHERE `GUID` = %u", itr->RemainingRankPoints, obtainer->GetGUIDLow());
37-
			}
37+
            }
38-
		}
38+
        }
39-
	}
39+
    }
40
41-
	void OnStartup()
41+
    void OnStartup()
42-
	{
42+
    {
43-
		QueryResult result = CharacterDatabase.Query("SELECT * FROM `Character_Bets`");
43+
        QueryResult result = CharacterDatabase.Query("SELECT * FROM `Character_Bets`");
44-
		if(result)
44+
        if(!result)
45-
		{
45+
            return;
46-
			
46+
        do{
47-
			do{
47+
            Field* fields = result->Fetch();
48-
			Field* fields = result->Fetch();
48+
            betInfo info;
49-
			betInfo info;
49+
            info.GUID = fields[0].GetUInt64();
50-
			info.GUID = fields[0].GetUInt64();
50+
            info.Goal = fields[1].GetUInt32();
51-
			info.Goal = fields[1].GetUInt32();
51+
            info.RemainingRankPoints = fields[2].GetUInt32();
52-
			info.RemainingRankPoints = fields[2].GetUInt32();
52+
            info.timeLeft  = fields[3].GetUInt64();
53-
			info.timeLeft  = fields[3].GetUInt64();
53+
            betTracker.push_back(info);
54-
			betTracker.push_back(info);
54+
        } while(result->NextRow());
55-
			}while(result->NextRow());
55+
    }
56-
		}
56+
57
    void OnUpdate(uint32 diff)
58-
	}
58+
    {
59
        if(Timer >= 300000)
60-
	void OnUpdate(uint32 diff)
60+
        {
61-
	{
61+
            Timer = 0;
62-
		if(Timer >= 300000)
62+
            CharacterDatabase.PExecute("UPDATE `Character_Bets` SET `TimeLeft` = `TimeLeft` - 300 WHERE `Timeleft` > 300");
63-
		{
63+
        }
64-
			Timer = 0;
64+
        else
65-
			CharacterDatabase.PExecute("UPDATE `Character_Bets` SET `TimeLeft` = `TimeLeft` - 300 WHERE `Timeleft` > 300");
65+
            Timer += diff;
66-
		}
66+
        if(betTracker.empty())
67-
		else
67+
            return;
68-
		Timer += diff;
68+
        float DiffinSecs = diff / 1000;
69-
		if(betTracker.empty())
69+
        for(std::vector<betInfo>::iterator itr = betTracker.begin(); itr != betTracker.end(); )
70-
			return;
70+
        {
71-
		float DiffinSecs = diff / 1000;
71+
            if(itr->timeLeft < DiffinSecs && itr->RemainingRankPoints != 0)
72-
		for(std::vector<betInfo>::iterator itr = betTracker.begin(); itr != betTracker.end(); ++itr)
72+
                itr->timeLeft = 0;
73-
		{
73+
            if(itr->RemainingRankPoints != 0)
74-
			if(itr->timeLeft < DiffinSecs && itr->RemainingRankPoints != 0)
74+
                itr->timeLeft -= DiffinSecs;
75-
				itr->timeLeft = 0;
75+
            if(!itr->timeLeft)
76-
			if(itr->timeLeft == 0)
76+
            {
77-
			{
77+
                if(Player* player = sObjectAccessor->FindPlayer(itr->GUID))
78-
				if(Player* player = sObjectAccessor->FindPlayer(itr->GUID))
78+
                    player->GetSession()->SendNotification("[Goal System] : You have failed your goal");
79-
					player->GetSession()->SendNotification("[Goal System] : You have failed your goal");
79+
                betTracker.erase(itr++);
80-
				betTracker.erase(itr);
80+
                continue;
81-
				continue;
81+
            }
82-
			}
82+
            ++itr;
83-
			if(itr->RemainingRankPoints != 0)
83+
        }
84-
				itr->timeLeft -= DiffinSecs;
84+
    }
85-
		}
85+
86-
	}
86+
    bool OnGossipHello(Player* player, Creature* creature)
87
    {
88-
	bool OnGossipHello(Player* player, Creature* creature)
88+
        bool found = false;
89-
	{
89+
        bool Completed = false;
90-
		bool found = false;
90+
91-
		bool Completed = false;
91+
        uint32 seconds;
92
        uint32 Reward;
93-
		uint32 seconds;
93+
        std::vector<betInfo>::iterator Pos = betTracker.begin();
94-
		uint32 Reward;
94+
        for(; Pos != betTracker.end(); ++Pos)
95-
		std::vector<betInfo>::iterator Pos;
95+
        {
96-
		for(std::vector<betInfo>::iterator itr = betTracker.begin(); itr != betTracker.end(); ++itr)
96+
            if(Pos->GUID == player->GetGUIDLow())
97-
		{
97+
            {
98-
			if(itr->GUID == player->GetGUID())
98+
                found = true;
99-
			{
99+
                if(Pos->RemainingRankPoints == 0)
100-
				found = true;
100+
                    Completed = true;
101-
				if(itr->RemainingRankPoints == 0) Completed = true;
101+
                seconds = Pos->timeLeft;
102-
				seconds = itr->timeLeft;
102+
                Reward = Pos->Goal * 2;
103-
				Reward = itr->Goal * 2;
103+
                break;
104-
				Pos = itr;
104+
            }
105-
				break;
105+
        }
106-
			}
106+
        if(found && !Completed)
107-
		}
107+
        {
108-
		if(found && !Completed)
108+
            sLog->outError(LOG_FILTER_GENERAL, "seconds : %u", seconds);
109-
		{
109+
            sLog->outError(LOG_FILTER_GENERAL, "itr->timeleft : %f", Pos->timeLeft);
110-
			sLog->outError(LOG_FILTER_GENERAL, "seconds : %u", seconds);
110+
            sLog->outError(LOG_FILTER_GENERAL, "Reward : %u", Reward);
111-
			sLog->outError(LOG_FILTER_GENERAL, "itr->timeleft : %f", Pos->timeLeft);
111+
            sLog->outError(LOG_FILTER_GENERAL, "Position : %i", std::distance(betTracker.begin(), Pos));
112-
			sLog->outError(LOG_FILTER_GENERAL, "Reward : %u", Reward);
112+
            std::ostringstream ss;
113-
			sLog->outError(LOG_FILTER_GENERAL, "Position : %i", std::distance(betTracker.begin(), Pos));
113+
            ss << "Already set a goal, time left :";
114-
			std::ostringstream ss;
114+
            uint64 secs    = seconds % 60;
115-
			ss << "Already set a goal, time left :";
115+
            uint64 minutes = seconds % 3600 / 60;
116-
			uint64 secs    = seconds % 60;
116+
            uint64 hours   = seconds / 3600;
117-
			uint64 minutes = seconds % 3600 / 60;
117+
            if(hours)
118-
			uint64 hours   = seconds / 3600;
118+
                hours != 1 ? ss << hours << " Hours" : ss << hours << " Hour";
119-
			if(hours)
119+
            if(minutes)
120-
				hours != 1 ? ss << hours << " Hours" : ss << hours << " Hour";
120+
                minutes != 1 ? ss << minutes << " Minutes " : ss << minutes << " Minutes ";
121-
			if(minutes)
121+
            if(secs || (!hours && !minutes))
122-
				minutes != 1 ? ss << minutes << " Minutes " : ss << minutes << " Minutes ";
122+
                secs != 1 ? ss << secs << " Seconds " : ss << secs << " Second ";
123-
			if(secs || (!hours && !minutes))
123+
            player->ADD_GOSSIP_ITEM(0, ss.str().c_str(), GOSSIP_SENDER_MAIN, 0);
124-
				secs != 1 ? ss << secs << " Seconds " : ss << secs << " Second ";
124+
        }
125-
			player->ADD_GOSSIP_ITEM(0, ss.str().c_str(), GOSSIP_SENDER_MAIN, 0);
125+
        else if(found && Completed)
126-
		}
126+
        {
127-
		else if(found && Completed)
127+
            player->GetSession()->SendAreaTriggerMessage("You claimed your reward, %u Rank Points", Reward);
128-
		{
128+
            player->ModifyRankPoints(Reward);
129-
			player->GetSession()->SendAreaTriggerMessage("You claimed your reward, %u Rank Points", Reward);
129+
            betTracker.erase(Pos);
130-
			player->ModifyRankPoints(Reward);
130+
            player->PlayerTalkClass->SendCloseGossip();
131-
			betTracker.erase(Pos);
131+
            CharacterDatabase.PExecute("DELETE FROM `Character_Bets` WHERE `GUID` = %u", player->GetGUIDLow());
132-
			player->PlayerTalkClass->SendCloseGossip();
132+
        }
133-
			CharacterDatabase.PExecute("DELETE FROM `Character_Bets` WHERE `GUID` = %u", player->GetGUID());
133+
        else
134-
		}
134+
            player->ADD_GOSSIP_ITEM_EXTENDED(0, "Set a goal", GOSSIP_SENDER_MAIN, 1, "RankPoints to obtain in 24 hours : ", 0, true);
135-
		else
135+
136-
		player->ADD_GOSSIP_ITEM_EXTENDED(0, "Set a goal", GOSSIP_SENDER_MAIN, 1, "RankPoints to obtain in 24 hours : ", 0, true);
136+
        player->ADD_GOSSIP_ITEM(0, "Nevermind", GOSSIP_SENDER_MAIN, 2);
137
        player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
138-
		player->ADD_GOSSIP_ITEM(0, "Nevermind", GOSSIP_SENDER_MAIN, 2);
138+
        return true;
139-
		player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
139+
    }
140-
		return true;
140+
141-
	}
141+
    bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
142
    {
143-
	bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action)
143+
        if(action == 2)
144-
	{
144+
            player->PlayerTalkClass->SendCloseGossip();
145-
		if(action == 2)
145+
        return true;
146-
			player->PlayerTalkClass->SendCloseGossip();
146+
    }
147-
		return true;
147+
148-
	}
148+
    bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
149
    {
150-
	bool OnGossipSelectCode(Player* player, Creature* creature, uint32 sender, uint32 action, const char* code)
150+
        if(action == 1)
151-
	{
151+
        {
152-
		if(action == 1)
152+
            if(uint32 rankPoints = (uint32)atoi(code))
153-
		{
153+
            {
154
                if(player->GetRankPoints() < rankPoints)
155-
			if(uint32 rankPoints = atoi(code))
155+
                {
156-
			{
156+
                    player->GetSession()->SendNotification("Set goal is higher than current RankPoints, current Rankpoints : %u", player->GetRankPoints());
157-
				if(player->GetRankPoints() < rankPoints)
157+
                    return false;
158-
				{
158+
                }
159-
					player->GetSession()->SendNotification("Set goal is higher than current RankPoints, current Rankpoints : %u", player->GetRankPoints());
159+
                // should be fine, add the guy, set the timer, and remove the set goal RP
160-
					return false;
160+
                betInfo temp;
161-
				}
161+
                temp.GUID = player->GetGUIDLow();
162-
				// should be fine, add the guy, set the timer, and remove the set goal RP
162+
                temp.Goal = rankPoints;
163-
				betInfo temp;
163+
                temp.RemainingRankPoints = rankPoints;
164-
				temp.GUID = player->GetGUID();
164+
                temp.timeLeft = HOUR*24;
165-
				temp.Goal = rankPoints;
165+
                betTracker.push_back(temp);
166-
				temp.RemainingRankPoints = rankPoints;
166+
                player->ModifyRankPoints(-1*rankPoints);
167-
				temp.timeLeft = HOUR*24;
167+
                CharacterDatabase.PExecute("INSERT INTO `Character_Bets` VALUES(%u, %u, %u, %f)", temp.GUID, temp.Goal, temp.RemainingRankPoints, temp.timeLeft);
168-
				betTracker.push_back(temp);
168+
            }
169-
				player->ModifyRankPoints(-rankPoints);
169+
        }
170-
				CharacterDatabase.PExecute("INSERT INTO `Character_Bets` VALUES(%u, %u, %u, %f)", temp.GUID, temp.Goal, temp.RemainingRankPoints, temp.timeLeft);
170+
        return true;
171-
			}
171+
    }
172-
		}
172+
173-
		return true;
173+
    std::vector<betInfo> betTracker;
174-
	}
174+
175
176-
	std::vector<betInfo> betTracker;
176+
177
{
178
    new Bet_Npc();
179
}