Advertisement
Parranoia

Killstreak

Sep 13th, 2012
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.59 KB | None | 0 0
  1. #include "ScriptPCH.h"
  2.  
  3. struct KillstreakData
  4. {
  5.     int32 killstreak;
  6.     int32 high_ks;
  7. };
  8.  
  9. typedef std::map<uint64 guid, KillstreakData> KillstreakMap;
  10. static KillstreakMap m_killstreak;
  11.  
  12. int32 GetKillstreak(Player * player, bool high)
  13. {
  14.     QueryResult ks = CharacterDatabase.PQuery("SELECT ks, high_ks FROM killstreak WHERE guid = '%u'", player->GetGUIDLow());
  15.     if (!ks)
  16.         return -1;
  17.     Field * killstreak = ks->Fetch();
  18.  
  19.     return high ? killstreak[1].GetUInt32() : killstreak[0].GetUInt32();
  20. }
  21.  
  22. void alertServer(Player * killer, Player * victim, int32 killstreak, int code)
  23. {
  24.     char msg[200];
  25.  
  26.     switch(code)
  27.     {
  28.         case 0:
  29.             sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s's |cff00ffffkillstreak of %d has been ended by |cffffffff%s", victim->GetName(), killstreak, killer->GetName());
  30.             break;
  31.         case 1:
  32.             sprintf(msg, "|cffff0000[Killstreak] |cffffffff%s|cff00ffff has a killstreak of %d", killer->GetName(), killstreak);
  33.             break;
  34.        case 2:
  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);
  36.             break;
  37.     }
  38.  
  39.     sWorld->SendServerMessage(SERVER_MSG_STRING, msg, 0);
  40. }
  41.  
  42. class Killstreak : public PlayerScript
  43. {
  44.     public:
  45.         Killstreak() : PlayerScript("Killstreak"){}
  46.  
  47.     void OnPVPKill(Player * killer, Player * victim)
  48.     {
  49.         if (killer->GetGUIDLow() == victim->GetGUIDLow())
  50.             return;
  51.         if (killer->InArena() || victim->InArena())
  52.             return;                
  53.  
  54.         int32 kKillstreak = m_killstreak[killer->GetGUID()].killstreak;
  55.         int32 vKillstreak = m_killstreak[victim->GetGUID()].killstreak;
  56.  
  57.         if (vKillstreak >= 25)
  58.             killer->SetArenaPoints(killer->GetArenaPoints() + 50);
  59.  
  60.         if (kKillstreak == -1)
  61.             m_killstreak[killer->GetGUID()].killstreak = 1;
  62.           else
  63.                m_killstreak[killer->GetGUID()].killstreak = kKillstreak++;
  64.        
  65.         m_killstreak[killer->GetGUID()].high_ks = kKillstreak > m_killstreak[killer->GetGUID()].high_ks ? kKillstreak : m_killstreak[killer->GetGUID()].high_ks;
  66.  
  67.           // Only send a server message if their streak is 5 or more
  68.           if (vKillstreak >= 5)
  69.                alertServer(killer, victim, vKillstreak, 0);
  70.           m_killstreak[victim->GetGUID()].killstreak = 0;
  71.  
  72.         switch(kKillstreak)
  73.         {
  74.             case 5:
  75.                 alertServer(killer, victim, kKillstreak, 1);
  76.                 killer->AddItem(6657, 5);
  77.                 break;
  78.             case 10:
  79.                 alertServer(killer, victim, kKillstreak, 1);
  80.                 killer->AddItem(20558, 1);
  81.                 break;
  82.             case 15:
  83.                 alertServer(killer, victim, kKillstreak, 1);
  84.                 killer->AddItem(8529, 15);
  85.                 break;
  86.             case 20:
  87.                      alertServer(killer, victim, kKillstreak, 1);
  88.                  killer->AddItem(20558, 2);
  89.                 break;
  90.             case 25:
  91.                 alertServer(killer, victim, kKillstreak, 2);
  92.                 break;
  93.             case 30:
  94.                 alertServer(killer, victim, kKillstreak, 2);
  95.                 killer->AddItem(20558, 3);
  96.                 break;
  97.             case 35:
  98.                 alertServer(killer, victim, kKillstreak, 2);
  99.                 break;
  100.             case 40:
  101.                 alertServer(killer, victim, kKillstreak, 2);
  102.                 killer->AddItem(20558, 4);
  103.                 break;
  104.             case 45:
  105.                 alertServer(killer, victim, kKillstreak, 2);
  106.                 break;
  107.             case 50:
  108.                 alertServer(killer, victim, kKillstreak, 2);
  109.                 killer->AddItem(20558, 5);
  110.                 break;
  111.             case 55:
  112.                 alertServer(killer, victim, kKillstreak, 2);
  113.                 break;
  114.             case 60:
  115.                 alertServer(killer, victim, kKillstreak, 2);
  116.                 killer->AddItem(20558, 6);
  117.                 break;
  118.             case 65:
  119.                 alertServer(killer, victim, kKillstreak, 2);
  120.                 break;
  121.             case 70:
  122.                 alertServer(killer, victim, kKillstreak, 2);
  123.                 killer->AddItem(20558, 7);
  124.                 break;
  125.             case 75:
  126.                 alertServer(killer, victim, kKillstreak, 2);
  127.                 break;
  128.             case 80:
  129.                 alertServer(killer, victim, kKillstreak, 2);
  130.                 killer->AddItem(20558, 8);
  131.                 break;
  132.             case 85:
  133.                 alertServer(killer, victim, kKillstreak, 2);
  134.                 break;
  135.             case 90:
  136.                 alertServer(killer, victim, kKillstreak, 2);
  137.                 killer->AddItem(20558, 9);
  138.                 break;
  139.             case 95:
  140.                 alertServer(killer, victim, kKillstreak, 2);
  141.                 break;
  142.             case 100:
  143.                 alertServer(killer, victim, kKillstreak, 2);
  144.                 killer->AddItem(20558, 10);
  145.                 break;
  146.         }
  147.     }
  148.  
  149.     void OnLogin(Player* player)
  150.     {
  151.         KillstreakData ksd;
  152.         ksd.killstreak = GetKillstreak(player, false);
  153.         ksd.high_ks = GetKillstreak(player, true);
  154.         m_killstreak[player->GetGUID()] = ksd;
  155.     }
  156.  
  157.     void OnLogout(Player* player)
  158.     {
  159.         if (m_killstreak.find(player->GetGUID()) != m_killstreak.end())
  160.             CharacterDatabase.PExecute("REPLACE INTO killstreak (guid, ks, high_ks) VALUES (%u, %u, %u)", player->GetGUIDLow(), m_killstreak[player->GetGUID()].killstreak, m_killstreak[player->GetGUID()].high_ks);
  161.     }
  162. };
  163.  
  164. void AddSC_Killstreak()
  165. {
  166.     new Killstreak();
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement