SHOW:
|
|
- or go back to the newest paste.
| 1 | #include "ScriptPCH.h" | |
| 2 | - | |
| 2 | + | // Edited from Parranoia's script: |
| 3 | - | struct KillstreakData |
| 3 | + | // http://pastebin.com/mBUfpgaE |
| 4 | ||
| 5 | - | int32 killstreak; |
| 5 | + | struct KillstreakData { uint32 killstreak, high_ks; };
|
| 6 | - | int32 high_ks; |
| 6 | + | static UNORDERED_MAP<uint64, KillstreakData> m_killstreak; |
| 7 | ||
| 8 | void alertServer(Player * killer, Player * victim, uint32 killstreak, int code) | |
| 9 | - | typedef std::map<uint64 guid, KillstreakData> KillstreakMap; |
| 9 | + | |
| 10 | - | static KillstreakMap m_killstreak; |
| 10 | + | char msg[256]; |
| 11 | switch(code) | |
| 12 | - | int32 GetKillstreak(Player * player, bool high) |
| 12 | + | |
| 13 | case 0: sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s's |cff00ffffkillstreak of %u has been ended by |cffffffff%s", victim->GetName(), killstreak, killer->GetName()); break; | |
| 14 | - | QueryResult ks = CharacterDatabase.PQuery("SELECT ks, high_ks FROM killstreak WHERE guid = '%u'", player->GetGUIDLow());
|
| 14 | + | case 1: sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %u", killer->GetName(), killstreak); break; |
| 15 | - | if (!ks) |
| 15 | + | case 2: sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %u. A bounty worth 50 arena points has been placed for their head.", killer->GetName(), killstreak); break; |
| 16 | - | return -1; |
| 16 | + | |
| 17 | - | Field * killstreak = ks->Fetch(); |
| 17 | + | |
| 18 | - | |
| 18 | + | |
| 19 | - | return high ? killstreak[1].GetUInt32() : killstreak[0].GetUInt32(); |
| 19 | + | |
| 20 | class Killstreak : public PlayerScript | |
| 21 | - | |
| 21 | + | |
| 22 | - | void alertServer(Player * killer, Player * victim, int32 killstreak, int code) |
| 22 | + | public: |
| 23 | Killstreak() : PlayerScript("Killstreak"){}
| |
| 24 | - | char msg[200]; |
| 24 | + | |
| 25 | - | |
| 25 | + | |
| 26 | {
| |
| 27 | uint64 kGUID = killer->GetGUID(); | |
| 28 | - | case 0: |
| 28 | + | uint64 vGUID = victim->GetGUID(); |
| 29 | - | sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s's |cff00ffffkillstreak of %d has been ended by |cffffffff%s", victim->GetName(), killstreak, killer->GetName()); |
| 29 | + | if (kGUID == vGUID) |
| 30 | - | break; |
| 30 | + | |
| 31 | - | case 1: |
| 31 | + | |
| 32 | - | sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %d", killer->GetName(), killstreak); |
| 32 | + | |
| 33 | - | break; |
| 33 | + | |
| 34 | - | case 2: |
| 34 | + | m_killstreak[kGUID].killstreak++; |
| 35 | - | sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %d. A bounty worth 50 arena points has been placed for their head.", killer->GetName(), killstreak); |
| 35 | + | uint32 kKillstreak = m_killstreak[kGUID].killstreak; |
| 36 | - | break; |
| 36 | + | uint32 vKillstreak = m_killstreak[vGUID].killstreak; |
| 37 | ||
| 38 | - | |
| 38 | + | m_killstreak[kGUID].high_ks = kKillstreak > m_killstreak[kGUID].high_ks ? kKillstreak : m_killstreak[kGUID].high_ks; |
| 39 | ||
| 40 | if (vKillstreak >= 25) | |
| 41 | - | |
| 41 | + | killer->ModifyArenaPoints(50); |
| 42 | if (vKillstreak >= 5) | |
| 43 | alertServer(killer, victim, vKillstreak, 0); | |
| 44 | - | public: |
| 44 | + | m_killstreak[vGUID].killstreak = 0; |
| 45 | - | Killstreak() : PlayerScript("Killstreak"){}
|
| 45 | + | |
| 46 | if(kKillstreak > 0) // hate large switches | |
| 47 | {
| |
| 48 | if(kKillstreak % 5 == 0) | |
| 49 | - | if (killer->GetGUIDLow() == victim->GetGUIDLow()) |
| 49 | + | {
|
| 50 | alertServer(killer, victim, kKillstreak, kKillstreak <= 20 ? 1 : 2); | |
| 51 | if(kKillstreak == 5) | |
| 52 | killer->AddItem(6657, 5); | |
| 53 | else if(kKillstreak == 15) | |
| 54 | - | int32 kKillstreak = m_killstreak[killer->GetGUID()].killstreak; |
| 54 | + | killer->AddItem(8529, 15); |
| 55 | - | int32 vKillstreak = m_killstreak[victim->GetGUID()].killstreak; |
| 55 | + | else if(kKillstreak % 10 == 0) |
| 56 | killer->AddItem(20558, uint32(kKillstreak/10)); | |
| 57 | } | |
| 58 | - | killer->SetArenaPoints(killer->GetArenaPoints() + 50); |
| 58 | + | |
| 59 | } | |
| 60 | - | if (kKillstreak == -1) |
| 60 | + | |
| 61 | - | m_killstreak[killer->GetGUID()].killstreak = 1; |
| 61 | + | void OnLogin(Player* player) |
| 62 | - | else |
| 62 | + | |
| 63 | - | m_killstreak[killer->GetGUID()].killstreak = kKillstreak++; |
| 63 | + | QueryResult ks = CharacterDatabase.PQuery("SELECT ks, high_ks FROM killstreak WHERE guid = %u", player->GetGUIDLow());
|
| 64 | - | |
| 64 | + | if (!ks) |
| 65 | - | m_killstreak[killer->GetGUID()].high_ks = kKillstreak > m_killstreak[killer->GetGUID()].high_ks ? kKillstreak : m_killstreak[killer->GetGUID()].high_ks; |
| 65 | + | |
| 66 | Field * killstreak = ks->Fetch(); | |
| 67 | - | // Only send a server message if their streak is 5 or more |
| 67 | + | KillstreakData temp = {killstreak[0].GetUInt32(), killstreak[1].GetUInt32()};
|
| 68 | - | if (vKillstreak >= 5) |
| 68 | + | m_killstreak[player->GetGUID()] = temp; |
| 69 | - | alertServer(killer, victim, vKillstreak, 0); |
| 69 | + | |
| 70 | - | m_killstreak[victim->GetGUID()].killstreak = 0; |
| 70 | + | |
| 71 | void OnLogout(Player* player) | |
| 72 | - | switch(kKillstreak) |
| 72 | + | |
| 73 | uint64 pGUID = player->GetGUID(); | |
| 74 | - | case 5: |
| 74 | + | if(m_killstreak.find(pGUID) != m_killstreak.end()) |
| 75 | - | alertServer(killer, victim, kKillstreak, 1); |
| 75 | + | CharacterDatabase.PExecute("REPLACE INTO killstreak (guid, ks, high_ks) VALUES (%u, %u, %u)", m_killstreak[pGUID].killstreak, m_killstreak[pGUID].high_ks, player->GetGUIDLow());
|
| 76 | - | killer->AddItem(6657, 5); |
| 76 | + | |
| 77 | - | break; |
| 77 | + | |
| 78 | - | case 10: |
| 78 | + | |
| 79 | - | alertServer(killer, victim, kKillstreak, 1); |
| 79 | + | |
| 80 | - | killer->AddItem(20558, 1); |
| 80 | + | |
| 81 | - | break; |
| 81 | + | |
| 82 | - | case 15: |
| 82 | + |