Advertisement
Callmephil

Ultimate Duel Script

Jan 14th, 2014
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.79 KB | None | 0 0
  1. #include "scriptPCH.h"
  2. #include "MapManager.h"
  3. #include "Chat.h"
  4.  
  5. /* SQL (Only if you use Rating System) (Characters database)
  6. UPDATE `characters` create `duelW` int(10) unsigned NOT NULL DEFAULT '0';
  7. UPDATE `characters` create `duelL` int(10) unsigned NOT NULL DEFAULT '0';
  8. UPDATE `characters` create `duelR` int(10) unsigned NOT NULL DEFAULT '1000';
  9. */
  10.  
  11. /*
  12. Ultimate Duel Script (Reward/Rating/Phasing/Security/Zoned & Reset)
  13. Author : Philippe
  14. Release Date : 14/01/14
  15. Script Complete : 100 %
  16. Version : 3.3.5 & 4.3.4
  17. TrinityCore based.
  18. Tested on 4.3.4 Works Well
  19.  
  20. Note :
  21. Phasing system isn't done by me, Credits go to Deathmane1337 (Ac-Web).
  22. Reward Part is explain you need to read.
  23. For the Rating system please use SQL given. You can add a Top for you're website or create a rating npc.
  24. */
  25.  
  26.  
  27. enum Rewards
  28. {
  29. Currency_token = 241 // Enter you're reward Item ID (Wotlk/Cata) or Currency ID (Cata)
  30. };
  31.  
  32. enum Zone_ID
  33. {
  34. Zone_ID_1 = 1 // Change Zone ID
  35. };
  36.  
  37. enum Area_ID
  38. {
  39. Area_ID_1 = 1 // Change Area ID
  40. };
  41.  
  42. void RevivePlayer(Player* player)
  43.     {
  44.     player->SetHealth(player->GetMaxHealth());
  45.     if(player->getPowerType() == POWER_MANA)
  46.     player->SetPower(POWER_MANA, player->GetMaxPower(POWER_MANA));
  47.     if(player->getPowerType() == POWER_ENERGY)
  48.     player->SetPower(POWER_ENERGY, player->GetMaxPower(POWER_ENERGY));
  49.     }
  50.    
  51. class Reset_OnDuelEnd : public PlayerScript
  52. {
  53. public:
  54.     Reset_OnDuelEnd() : PlayerScript("Reset_OnDuelEnd") {}
  55.    
  56.     void OnDuelEnd(Player *player, Player * plTarget,  DuelCompleteType type)
  57.     {
  58.        
  59.             player->RemoveAllSpellCooldown();
  60.             plTarget->RemoveAllSpellCooldown();
  61.        
  62.             RevivePlayer(player);
  63.             RevivePlayer(plTarget);
  64.            
  65.             player->CombatStop();
  66.             plTarget->CombatStop();
  67.            
  68.            
  69.             player->InterruptSpell(CURRENT_AUTOREPEAT_SPELL); // break Auto Shot and autohit
  70.             plTarget->InterruptSpell(CURRENT_CHANNELED_SPELL);  // break channeled spells
  71.            
  72.             player->AttackStop();
  73.             plTarget->AttackStop();
  74.         }
  75.    
  76. };
  77.  
  78. class Reset_OnDuelStart : public PlayerScript
  79. {
  80. public:
  81.     Reset_OnDuelStart() : PlayerScript("OnDuelStart") {}
  82.  
  83.     void OnDuelStart(Player *player, Player *plTarget)
  84.     {
  85. // Duel Start Reset (Hp/Mana etc)      
  86.         RevivePlayer(player);
  87.         RevivePlayer(plTarget);
  88.         player->SetPower(POWER_RAGE, 0);
  89.         plTarget->SetPower(POWER_RAGE, 0);
  90.         player->SetPower(POWER_RUNIC_POWER, 0);
  91.         plTarget->SetPower(POWER_RUNIC_POWER, 0);
  92.  
  93.     }  
  94. };
  95.  
  96. class Duel_Token_Reward : public PlayerScript
  97. {
  98. public:
  99.     Duel_Token_Reward() : PlayerScript("Duel_Token_Reward") { }
  100.  
  101.     void OnDuelEnd(Player *winner, Player *looser, DuelCompleteType type)
  102.     {
  103.             if ((winner->GetZoneId() == Zone_ID_1 && looser->GetZoneId() == Zone_ID_1 || winner->GetAreaId() == Area_ID_1 &&  looser->GetAreaId() == Area_ID_1) && type == DUEL_WON)
  104.             {
  105.                 if (winner->getLevel() >= 1 && looser->getLevel() <= 79 && (type == DUEL_WON || type == DUEL_INTERRUPTED || type == DUEL_FLED))
  106.                 {
  107.                     return;
  108.                 }
  109.                 // Check Latency of both (Not Really needed)
  110.                 if (looser->GetSession()->GetLatency() > 350 && (type == DUEL_WON || type == DUEL_INTERRUPTED || type == DUEL_FLED))
  111.                 {
  112.                     ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF  !! ALERT !! One of you has a latency superior to 350");
  113.                     ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF  !! ALERT !! One of you has a latency superior to 350");
  114.                     return;
  115.                 }
  116.                 // Used if player didin't reach less than 10 life.
  117.                 if (looser->GetHealth() > 10)
  118.                 {
  119.                 ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF No one killed the other !");
  120.                 ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF No one killed the other !");
  121.                     return;
  122.                 }
  123.                 // Used For Test Versus GM
  124.                 if (looser->GetSession()->GetSecurity() >= 2 && (type == DUEL_WON || type == DUEL_INTERRUPTED || type == DUEL_FLED))
  125.                 {
  126.                     ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF You Can't Claim Reward When you're vs a GameMaster !");
  127.                     ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF You Can't Claim Reward When you're vs a GameMaster !" );
  128.                     return;
  129.                 }
  130.                 if (winner->GetSession()->GetSecurity() >= 2 && (type == DUEL_WON || type == DUEL_INTERRUPTED || type == DUEL_FLED))
  131.                 {
  132.                     ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF You Can't Claim Reward When you're vs a GameMaster !");
  133.                     ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[System]|cFF00FFFF You Can't Claim Reward When you're vs a GameMaster !");
  134.                     return;
  135.                 }
  136.                 // Used for Cata user if player dosen't have enough gear equipped based on (Stamina/life)
  137.                 // *Could be adapted for Wotlk Users.
  138.                 if (looser->GetStat(STAT_STAMINA) < 4000 && type == DUEL_WON)
  139.                 {
  140.                     ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[Cheating System]|cFF00FFFF The player you are fighting dosen't have enough gear equipped !");
  141.                     ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[Cheating System]|cFF00FFFF you don't have enough gear equipped  !");
  142.                     return;
  143.                 }
  144.                 // Used for Local Connections, same IP
  145.                     if (winner->GetSession()->GetRemoteAddress() == looser->GetSession()->GetRemoteAddress())
  146.                 {
  147.                     ChatHandler(winner->GetSession()).SendGlobalGMSysMessage("|cFFFFFC00[Cheating System]|cFF00FFFF A player is trying to cheat in duel Area !");
  148.                     ChatHandler(winner->GetSession()).PSendSysMessage("|cFFFFFC00[Cheating System]|cFF00FFFF you can't claim reward vs a same ip !");
  149.                     ChatHandler(looser->GetSession()).PSendSysMessage("|cFFFFFC00[Cheating System]|cFF00FFFF you can't claim reward vs a same ip !");
  150.                 }
  151.                 //If everything is passed then reward will be.
  152.                 else
  153.                 {
  154.                 //Remove The /*-*/ Where are Code line to make it works.
  155.                 /*--------------Cataclysm Users------------*/
  156.                
  157.                 /* CODE
  158.                     winner->ModifyCurrency(currency_token, 2 , true,true, false);
  159.                     looser->ModifyCurrency(currency_token, 1 , true,true, false);
  160.                 */
  161.                 /*----------------Wotlk Users---------------*/
  162.    
  163.                 /* CODE
  164.                     winner->AddItem(Currency_token, 2);
  165.                     looser->AddItem(Currency_token, 1);
  166.                 */
  167.                     winner->SaveToDB();
  168.                     looser->SaveToDB();
  169.                 /* 
  170.                 /*Duel Rating*/
  171.                 //Duel Ratio, Win/lose
  172.                 /* CODE
  173.                 CharacterDatabase.PExecute("UPDATE characters SET duelW = (duelW+1) WHERE guid = '%u'", winner->GetGUID());
  174.                 CharacterDatabase.PExecute("UPDATE characters SET duelL = (duelL+1) WHERE guid = '%u'", looser->GetGUID());
  175.                 //Duel Rating, Win/lose (Change Points Manually)
  176.                 CharacterDatabase.PExecute("UPDATE characters SET duelR = (duelR+14') WHERE guid = '%u'", winner->GetGUID());
  177.                 CharacterDatabase.PExecute("UPDATE characters SET duelR = (duelR-7') WHERE guid = '%u'", looser->GetGUID());
  178.                 //Duel Announcement, Win/lose (Change Points Manually.
  179.                 ChatHandler(winner).SendSysMessage("|cFFFFFC00[System]|cFF00FFFF Well done you won 14 Points !");
  180.                 ChatHandler(looser).SendSysMessage("|cFFFFFC00[System]|cFF00FFFF Ow you lose 7 Points !");
  181.                 */
  182.                
  183.                 }
  184.             }
  185.     }
  186. };
  187.  
  188. class PhasedDueling : public PlayerScript
  189. {
  190. public:
  191.         PhasedDueling() : PlayerScript("PhasedDueling") { }
  192.  
  193.         void OnDuelStart(Player* firstplayer, Player* secondplayer)
  194.         {
  195.                 uint32 PlayersInsidePhase = 0;
  196.                 uint32 PhaseToCheck = 1;
  197.                 Map* map = sMapMgr->FindMap(firstplayer->GetMapId(), firstplayer->GetInstanceId());
  198.  
  199.                 if (!map)
  200.                         return;
  201.                 Map::PlayerList const& players = map->GetPlayers();
  202.                 for (Map::PlayerList::const_iterator iter = players.begin(); iter != players.end(); ++iter)
  203.                 {
  204.                         Player* check = iter->GetSource();
  205.                         if (!check || !check->GetSession())
  206.                                 continue;
  207.  
  208.                         if (check->GetPhaseMask() == PhaseToCheck)
  209.                         {
  210.                                 ++PlayersInsidePhase;
  211.                                 ++PhaseToCheck;
  212.                                 PlayersInsidePhase = 0;
  213.                         }
  214.                 }
  215.  
  216.                 if (PlayersInsidePhase == 0)
  217.                 {
  218.                         firstplayer->SetPhaseMask(PhaseToCheck, true);
  219.                         secondplayer->SetPhaseMask(PhaseToCheck, true);
  220.                 }
  221.         }
  222.  
  223.         void OnDuelEnd(Player* firstplayer, Player* secondplayer)
  224.         {
  225.                 uint32 PlayersInsidePhase = 0;
  226.                 uint32 PhaseToCheck = 1;
  227.                 Map* map = sMapMgr->FindMap(firstplayer->GetMapId(), firstplayer->GetInstanceId());
  228.  
  229.                 if (!map)
  230.                         return;
  231.                 Map::PlayerList const& players = map->GetPlayers();
  232.                 for (Map::PlayerList::const_iterator iter = players.begin(); iter != players.end(); ++iter)
  233.                 {
  234.                         Player* check = iter->GetSource();
  235.                         if (!check || !check->GetSession())
  236.                                 continue;
  237.  
  238.                         if (check->GetPhaseMask() == PhaseToCheck)
  239.                         {
  240.                                 ++PlayersInsidePhase;
  241.                                 ++PhaseToCheck;
  242.                                 PlayersInsidePhase = 0;
  243.                         }
  244.                 }
  245.  
  246.                 if (PlayersInsidePhase == 0)
  247.                 {
  248.                         firstplayer->SetPhaseMask(PhaseToCheck, false);
  249.                         secondplayer->SetPhaseMask(PhaseToCheck, false);
  250.                 }
  251.         }
  252. };
  253.  
  254.  
  255. void AddSC_Reset()
  256. {
  257.     new Duel_Token_Reward();
  258.     new Reset_OnDuelEnd();
  259.     new Reset_OnDuelStart();
  260.     new PhasedDueling();
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement