SHOW:
|
|
- or go back to the newest paste.
| 1 | - | --[[ |
| 1 | + | #include "ScriptPCH.h" |
| 2 | - | Script made by Blyitgen @ AC-Web.org |
| 2 | + | |
| 3 | /* | |
| 4 | - | ]] |
| 4 | + | Script made by Blyitgen |
| 5 | Script converted to TC C++ by Rochet2 | |
| 6 | - | -- Variables |
| 6 | + | @ AC-Web.org |
| 7 | - | local NPC = 78000 -- NPC entry for gossip |
| 7 | + | |
| 8 | */ | |
| 9 | - | local m1,x1,y1,z1 = 1.1, 1.2, 1.3, 1.4 -- Location for Player 1 |
| 9 | + | |
| 10 | - | local m2,x2,y2,z2 = 1.1, 1.2, 1.3, 1.4 -- Location for Player 2 |
| 10 | + | namespace |
| 11 | {
| |
| 12 | - | local am,ax,ay,az = 1.1, 1.2, 1.3, 1.4 -- Location after arena for alliance |
| 12 | + | #define REWARD 125 // Reward (in honor) for the winner |
| 13 | - | local hm,hx,hy,hz = 1.1, 1.2, 1.3, 1.4 -- Location after arena for horde |
| 13 | + | |
| 14 | // WorldLocation(map, x, y, z, o) | |
| 15 | - | local reward = 125 -- Reward (in honor) for the winner |
| 15 | + | // Start locations |
| 16 | static const WorldLocation startLoc1 = WorldLocation(1, 1.2f, 1.3f, 1.4f, 1.5f); | |
| 17 | - | local started = false -- Status of the arena (false = not started, true = started) |
| 17 | + | static const WorldLocation startLoc2 = WorldLocation(1, 1.2f, 1.3f, 1.4f, 1.5f); |
| 18 | // Location after arena | |
| 19 | - | local p1 = {}
|
| 19 | + | static const WorldLocation allyAA = WorldLocation(1, 1.2f, 1.3f, 1.4f, 1.5f); |
| 20 | - | local p2 = {}
|
| 20 | + | static const WorldLocation hordeAA = WorldLocation(1, 1.2f, 1.3f, 1.4f, 1.5f); |
| 21 | ||
| 22 | - | local t1,t2 = false, false |
| 22 | + | // Dont edit below |
| 23 | ||
| 24 | - | -- Custom Functions |
| 24 | + | static std::list<uint64> que; |
| 25 | uint64 p1 = 0; | |
| 26 | - | local function endArena() |
| 26 | + | uint64 p2 = 0; |
| 27 | - | local p1t = p1[t1]:getTeam() |
| 27 | + | |
| 28 | - | local p2t = p2[t2]:getTeam() |
| 28 | + | static Player* getPlayer() |
| 29 | - | |
| 29 | + | {
|
| 30 | - | if(p1t == 1) then |
| 30 | + | if (que.empty()) |
| 31 | - | p1[t1]:Teleport(hm,hx,hy,hz) |
| 31 | + | return NULL; |
| 32 | - | else |
| 32 | + | Player* player = sObjectAccessor->FindPlayer(que.front()); |
| 33 | - | p1[t1]:Teleport(am,ax,ay,az) |
| 33 | + | que.pop_front(); |
| 34 | - | end |
| 34 | + | return player; |
| 35 | - | |
| 35 | + | } |
| 36 | - | if(p2t == 1) then |
| 36 | + | |
| 37 | - | p2[t2]:Teleport(hm,hx,hy,hz) |
| 37 | + | static void sendPlayers() |
| 38 | - | else |
| 38 | + | {
|
| 39 | - | p2[t2]:Teleport(am,ax,ay,az) |
| 39 | + | if(!p1 || !p2) |
| 40 | - | end |
| 40 | + | return; |
| 41 | - | |
| 41 | + | if (que.size() < 2) |
| 42 | - | table.remove(p1,t1) |
| 42 | + | return; |
| 43 | - | table.remove(p2,t2) |
| 43 | + | |
| 44 | - | started = false |
| 44 | + | Player* player1 = NULL; |
| 45 | - | end |
| 45 | + | Player* player2 = NULL; |
| 46 | while (!p1 && que.size >= 2) | |
| 47 | - | local function checkArena() |
| 47 | + | player1 = getPlayer(); |
| 48 | - | if(started) then |
| 48 | + | while (!p2 && que.size >= 2) |
| 49 | - | if(t1 and t2) then |
| 49 | + | player2 = getPlayer(); |
| 50 | - | if(p1[t1]:isDead()) then |
| 50 | + | |
| 51 | - | p2[t2]:SendBroadcastMessage("Congratulations! You won "..reward.." honor!")
|
| 51 | + | if(!player1 || !player2) |
| 52 | - | p1[t1]:SendBroadcastMessage("You can do better than that.")
|
| 52 | + | return; |
| 53 | - | p2[t2]:giveHonor(reward) |
| 53 | + | |
| 54 | - | p1[t1]:ResurrectPlayer() |
| 54 | + | p1 = player1->GetGUID(); |
| 55 | - | endArena() |
| 55 | + | p2 = player2->GetGUID(); |
| 56 | - | elseif(p2[t2]:isDead()) then |
| 56 | + | player1->TeleportTo(startLoc1); |
| 57 | - | p1[t1]:SendBroadcastMessage("Congratulations! You won "..reward.." honor!")
|
| 57 | + | player2->TeleportTo(startLoc2); |
| 58 | - | p2[t2]:SendBroadcastMessage("You can do better than that.")
|
| 58 | + | } |
| 59 | - | p1[t1]:giveHonor(reward) |
| 59 | + | } |
| 60 | - | p2[t2]:ResurrectPlayer() |
| 60 | + | |
| 61 | - | endArena() |
| 61 | + | class FightMaster : public CreatureScript |
| 62 | - | end |
| 62 | + | {
|
| 63 | - | end |
| 63 | + | public: |
| 64 | - | end |
| 64 | + | FightMaster() : CreatureScript("FightMaster")
|
| 65 | - | end |
| 65 | + | {
|
| 66 | } | |
| 67 | - | local function getRandom(array) |
| 67 | + | |
| 68 | - | local size = #array |
| 68 | + | bool OnGossipHello(Player* player, Creature* creature) |
| 69 | - | if(size == 0) then |
| 69 | + | {
|
| 70 | - | return false |
| 70 | + | player->ADD_GOSSIP_ITEM(GOSSIP_ICON_BATTLE, "Add me to the queue", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); |
| 71 | - | elseif(size > 1) then |
| 71 | + | player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TALK, "Nevermind..", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); |
| 72 | - | return math.random(1,size) |
| 72 | + | player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); |
| 73 | - | elseif(size == 1) then |
| 73 | + | return true; |
| 74 | - | return 1 |
| 74 | + | } |
| 75 | - | end |
| 75 | + | |
| 76 | - | end |
| 76 | + | bool OnGossipSelect(Player* player, Creature* creature, uint32 sender, uint32 action) |
| 77 | {
| |
| 78 | - | local function sendPlayers() |
| 78 | + | if (sender == GOSSIP_SENDER_MAIN && action == GOSSIP_ACTION_INFO_DEF+1) |
| 79 | - | if(started == false) then |
| 79 | + | {
|
| 80 | - | t1 = getRandom(p1) |
| 80 | + | que.push_back(player->GetGUID()); |
| 81 | - | t2 = getRandom(p2) |
| 81 | + | ChatHandler(player->GetSession()).SendSysMessage("You are now added to the queue! Good luck!");
|
| 82 | - | |
| 82 | + | } |
| 83 | - | if(t1 and t2) then |
| 83 | + | player->CLOSE_GOSSIP_MENU(); |
| 84 | - | p1[t1]:Teleport(m1,x1,y1,z1,0) |
| 84 | + | } |
| 85 | - | p2[t2]:Teleport(m2,x2,y2,z2,0) |
| 85 | + | }; |
| 86 | - | |
| 86 | + | |
| 87 | - | started = true |
| 87 | + | class FightChecker : public WorldScript |
| 88 | - | end |
| 88 | + | {
|
| 89 | - | end |
| 89 | + | public: |
| 90 | - | end |
| 90 | + | static const char* rew_msg; |
| 91 | ||
| 92 | - | local function addPlayer(player,unit) |
| 92 | + | FightChecker() : WorldScript("FightChecker")
|
| 93 | - | local p1s = #p1 |
| 93 | + | {
|
| 94 | - | local p2s = #p2 |
| 94 | + | std::ostringstream oss; |
| 95 | - | if (p1s > p2s) then |
| 95 | + | oss << "Congratulations! You won " << REWARD << " honor!"; |
| 96 | - | table.insert(p2, player) |
| 96 | + | rew_msg = oss.str().c_str(); |
| 97 | - | elseif(p1s < p2s or p1s = p2s) then |
| 97 | + | } |
| 98 | - | table.insert(p1, player) |
| 98 | + | |
| 99 | - | end |
| 99 | + | static void checkArena() |
| 100 | - | player:SendBroadcastMessage("You are now added to the queue! Good luck!")
|
| 100 | + | {
|
| 101 | - | end |
| 101 | + | if(!p1 || !p2) |
| 102 | return; | |
| 103 | - | local function Hello(Unit, Event, player) |
| 103 | + | Player* player1 = sObjectAccessor->FindPlayer(p1); |
| 104 | - | Unit:GossipCreateMenu(100, player, 0) |
| 104 | + | Player* player2 = sObjectAccessor->FindPlayer(p2); |
| 105 | - | |
| 105 | + | if (player1 && player1->isDead()) |
| 106 | - | Unit:GossipMenuAddItem(6, "Add me to the queue!", 1) |
| 106 | + | {
|
| 107 | - | Unit:GossipMenuAddItem(7, "Nevermind", 2) |
| 107 | + | ChatHandler(player2->GetSession()).SendSysMessage(rew_msg); |
| 108 | - | |
| 108 | + | ChatHandler(player1->GetSession()).SendSysMessage("You can do better than that.");
|
| 109 | - | Unit:GossipSendMenu(player) |
| 109 | + | player2->ModifyHonorPoints(REWARD); |
| 110 | - | end |
| 110 | + | player1->ResurrectPlayer(100); |
| 111 | } | |
| 112 | - | local function Select(Unit, Event, player, id, intid, code, pMisc) |
| 112 | + | else if (player2 && player2->isDead()) |
| 113 | - | if(intid == 1) then |
| 113 | + | {
|
| 114 | - | addPlayer(player) |
| 114 | + | ChatHandler(player1->GetSession()).SendSysMessage(rew_msg); |
| 115 | - | end |
| 115 | + | ChatHandler(player2->GetSession()).SendSysMessage("You can do better than that.");
|
| 116 | - | player:GossipComplete() |
| 116 | + | player1->ModifyHonorPoints(REWARD); |
| 117 | - | end |
| 117 | + | player2->ResurrectPlayer(100); |
| 118 | } | |
| 119 | - | -- Registers |
| 119 | + | else |
| 120 | - | RegisterTimedEvent("sendPlayers", 30000, 0)
|
| 120 | + | return; |
| 121 | - | RegisterTimedEvent("checkArena", 5000, 0)
|
| 121 | + | if (player1) |
| 122 | - | RegisterUnitGossipEvent(NPC, 1, Hello) |
| 122 | + | player1->TeleportTo(player1->GetTeam() == HORDE ? hordeAA : allyAA); |
| 123 | - | RegisterUnitGossipEvent(NPC, 2, Select) |
| 123 | + | if (player2) |
| 124 | player2->TeleportTo(player2->GetTeam() == HORDE ? hordeAA : allyAA); | |
| 125 | p1 = 0; | |
| 126 | p2 = 0; | |
| 127 | } | |
| 128 | ||
| 129 | struct FightEvent : BasicEvent | |
| 130 | {
| |
| 131 | typedef void (*callback)(void); | |
| 132 | FightEvent(callback func) : BasicEvent() | |
| 133 | {
| |
| 134 | _func = func; | |
| 135 | } | |
| 136 | bool Execute(uint64, uint32) | |
| 137 | {
| |
| 138 | if(_func) | |
| 139 | _func(); | |
| 140 | return true; | |
| 141 | } | |
| 142 | callback _func; | |
| 143 | }; | |
| 144 | ||
| 145 | void OnUpdate(uint32 diff) | |
| 146 | {
| |
| 147 | processor.Update(diff); | |
| 148 | } | |
| 149 | ||
| 150 | void OnStartup() | |
| 151 | {
| |
| 152 | processor.AddEvent(new FightEvent(sendPlayers), processor.CalculateTime(30000)); | |
| 153 | processor.AddEvent(new FightEvent(checkArena), processor.CalculateTime(5000)); | |
| 154 | } | |
| 155 | ||
| 156 | EventProcessor processor; | |
| 157 | }; | |
| 158 | ||
| 159 | void AddSC_FightScript() | |
| 160 | {
| |
| 161 | new FightChecker(); | |
| 162 | new FightMaster(); | |
| 163 | } | |
| 164 | ||
| 165 | #undef REWARD |