Advertisement
Rochet2

Killstreak

Nov 13th, 2012
606
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "ScriptPCH.h"
  2. // Edited from Parranoia's script:
  3. // http://pastebin.com/mBUfpgaE
  4.  
  5. struct KillstreakData { uint32 killstreak, high_ks; };
  6. static UNORDERED_MAP<uint64, KillstreakData> m_killstreak;
  7.  
  8. void alertServer(Player * killer, Player * victim, uint32 killstreak, int code)
  9. {
  10.     char msg[256];
  11.     switch(code)
  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.     case 1: sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %u", killer->GetName(), killstreak); break;
  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.     }
  17.     sWorld->SendServerMessage(SERVER_MSG_STRING, msg, 0);
  18. }
  19.  
  20. class Killstreak : public PlayerScript
  21. {
  22. public:
  23.     Killstreak() : PlayerScript("Killstreak"){}
  24.  
  25.     void OnPVPKill(Player * killer, Player * victim)
  26.     {
  27.         uint64 kGUID = killer->GetGUID();
  28.         uint64 vGUID = victim->GetGUID();
  29.         if (kGUID == vGUID)
  30.             return;
  31.         if (killer->InArena() || victim->InArena())
  32.             return;                
  33.  
  34.         m_killstreak[kGUID].killstreak++;
  35.         uint32 kKillstreak = m_killstreak[kGUID].killstreak;
  36.         uint32 vKillstreak = m_killstreak[vGUID].killstreak;
  37.  
  38.         m_killstreak[kGUID].high_ks = kKillstreak > m_killstreak[kGUID].high_ks ? kKillstreak : m_killstreak[kGUID].high_ks;
  39.  
  40.         if (vKillstreak >= 25)
  41.             killer->ModifyArenaPoints(50);
  42.         if (vKillstreak >= 5)
  43.             alertServer(killer, victim, vKillstreak, 0);
  44.         m_killstreak[vGUID].killstreak = 0;
  45.  
  46.         if(kKillstreak > 0) // hate large switches
  47.         {
  48.             if(kKillstreak % 5 == 0)
  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.                     killer->AddItem(8529, 15);
  55.                 else if(kKillstreak % 10 == 0)
  56.                     killer->AddItem(20558, uint32(kKillstreak/10));
  57.             }
  58.         }
  59.     }
  60.  
  61.     void OnLogin(Player* player)
  62.     {
  63.         QueryResult ks = CharacterDatabase.PQuery("SELECT ks, high_ks FROM killstreak WHERE guid = %u", player->GetGUIDLow());
  64.         if (!ks)
  65.             return;
  66.         Field * killstreak = ks->Fetch();
  67.         KillstreakData temp = {killstreak[0].GetUInt32(), killstreak[1].GetUInt32()};
  68.         m_killstreak[player->GetGUID()] = temp;
  69.     }
  70.  
  71.     void OnLogout(Player* player)
  72.     {
  73.         uint64 pGUID = player->GetGUID();
  74.         if(m_killstreak.find(pGUID) != m_killstreak.end())
  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.     }
  77. };
  78.  
  79. void AddSC_Killstreak()
  80. {
  81.     new Killstreak();
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement