/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifndef __CHANNEL_H
#define __CHANNEL_H
using namespace std;
class Channel
{
Mutex m_Lock;
struct PlayerInfo
{
Player *player;
bool owner, moderator, muted;
};
typedef map PlayerList;
PlayerList players;
list banned;
string name;
bool announce, constant, moderate;
Player * owner;
string password;
uint32 team;
private:
/*Packets! Woohoo!*/
inline WorldPacket *MakeNotifyPacket(WorldPacket *data, uint8 code)
{
data->Initialize(SMSG_CHANNEL_NOTIFY);
*data << code << name.c_str();
return data;
}
inline void MakeJoined(WorldPacket *data, Player *joined) { *MakeNotifyPacket(data,0x00) << joined->GetGUID(); }
inline void MakeLeft(WorldPacket *data, Player *left) { *MakeNotifyPacket(data,0x01) << left->GetGUID(); }
inline void MakeYouJoined(WorldPacket *data, Player *p ) { *MakeNotifyPacket(data,0x02) << p->GetGUID(); }
inline void MakeYouLeft(WorldPacket *data) { MakeNotifyPacket(data,0x03); }
inline void MakeWrongPass(WorldPacket *data) { MakeNotifyPacket(data,0x04); }
inline void MakeNotOn(WorldPacket *data) { MakeNotifyPacket(data,0x05); }
inline void MakeNotModerator(WorldPacket *data) { MakeNotifyPacket(data,0x06); }
inline void MakeSetPassword(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x07) << who->GetGUID(); }
inline void MakeChangeOwner(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x08) << who->GetGUID(); }
inline void MakeNotOn(WorldPacket *data, const char *who) { *MakeNotifyPacket(data,0x09) << who; }
inline void MakeNotOwner(WorldPacket *data) { MakeNotifyPacket(data,0x0A); }
inline void MakeWhoOwner(WorldPacket *data) { *MakeNotifyPacket(data,0x0B) << ((constant || owner == NULL) ? "Nobody" : owner->GetName()); }
inline void MakeModeChange(WorldPacket *data, Player *who, char moderator, char voice) // 0 - no change, 1 - lost, 2 - got
{
MakeNotifyPacket(data,0x0C);
*data << who->GetGUID();
uint8 byte1 = 0x00, byte2 = 0x00;
if(moderator == 1) byte1 |= 0x02;
if(voice == 1) byte1 |= 0x04;
if(moderator == 2) byte2 |= 0x02;
if(voice == 2) byte2 |= 0x04;
*data << byte1 << byte2;
}
inline void MakeEnabledAnnounce(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x0D) << who->GetGUID(); }
inline void MakeDisabledAnnounce(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x0E) << who->GetGUID(); }
inline void MakeAnnounce(WorldPacket *data, Player *who, bool set) { set ? MakeEnabledAnnounce(data,who) : MakeDisabledAnnounce(data,who); }
inline void MakeModerated(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x0F) << who->GetGUID(); }
inline void MakeUnmoderated(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x10) << who->GetGUID(); }
inline void MakeModerate(WorldPacket *data, Player *who, bool set) { set ? MakeModerated(data,who) : MakeUnmoderated(data,who); }
inline void MakeYouCantSpeak(WorldPacket *data) { MakeNotifyPacket(data,0x11); }
inline void MakeKicked(WorldPacket *data, Player *good, Player *bad) { *MakeNotifyPacket(data,0x12) << bad->GetGUID() << good->GetGUID(); }
inline void MakeYouAreBanned(WorldPacket *data) { MakeNotifyPacket(data,0x13); }
inline void MakeBanned(WorldPacket *data, Player *good, Player *bad) { *MakeNotifyPacket(data,0x14) << bad->GetGUID() << good->GetGUID(); }
inline void MakeUnbanned(WorldPacket *data, Player *good, Player *bad) { *MakeNotifyPacket(data,0x15) << bad->GetGUID() << good->GetGUID(); }
// 16 unk
inline void MakeAlreadyOn(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x17) << who->GetGUID(); }
inline void MakeInvited(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x18) << who->GetGUID(); }
inline void MakeWrongAlliance(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x19) << who->GetGUID(); }
//....
inline void MakeYouInvited(WorldPacket *data, Player *who) { *MakeNotifyPacket(data,0x1D) << who->GetName(); }
void SendToAll(WorldPacket *data)
{
m_Lock.Acquire();
PlayerList::iterator i;
for(i = players.begin(); i!=players.end(); i++)
{
i->first->GetSession()->SendPacket(data);
}
m_Lock.Release();
}
void SendToAllButOne(WorldPacket *data, Player *who)
{
m_Lock.Acquire();
PlayerList::iterator i;
for(i = players.begin(); i!=players.end(); i++)
{
if(i->first != who)
i->first->GetSession()->SendPacket(data);
}
m_Lock.Release();
}
inline void SendToOne(WorldPacket *data, Player *who)
{
who->GetSession()->SendPacket(data);
}
inline bool IsOn(Player *who)
{
return players.count(who) > 0;
}
bool IsBanned(const uint64 guid)
{
m_Lock.Acquire();
bool ret = false;
list::iterator i;
for(i = banned.begin(); i!=banned.end(); i++)
{
if(*i == guid)
ret = true;
}
m_Lock.Release();
return ret;
}
inline bool IsFirst()
{
m_Lock.Acquire();
bool res = !(players.size() > 1);
m_Lock.Release();
return res;
}
void SetOwner(Player *p)
{
if(m_DefaultChannel)return;
owner = p;
if(owner != NULL)
{
WorldPacket data(10);
MakeChangeOwner(&data,p);
SendToAll(&data);
}
}
void SetModerator(Player *p, bool set)
{
if(players[p].moderator != set)
{
players[p].moderator = set;
WorldPacket data(10);
MakeModeChange(&data,p,set ? 2 : 1,0);
SendToAll(&data);
}
}
void SetMute(Player *p, bool set)
{
if(players[p].muted != set)
{
players[p].muted = set;
set = !set;
WorldPacket data(10);
MakeModeChange(&data,p,0,set ? 2 : 1);
SendToAll(&data);
}
}
public:
Channel(const char* newname,Player*p)
{
name = newname;
m_DefaultChannel = IsDefaultChannel();
if(m_DefaultChannel)
owner=NULL;
else owner = p;
password="";
announce =false;
moderate =false;
constant =false;
}
/*
void SetName(string newname,uint32 team)
{
name = newname;
}*/
string GetName() { return name; }
bool IsConstant() { return m_DefaultChannel; }
bool IsAnnounce() { return announce; }
string GetPassword() { return password; }
void SetPassword(string npassword) { password = npassword; }
void SetAnnounce(bool nannounce) { announce = nannounce; }
uint32 GetNumPlayers() { return players.size(); }
bool Join(Player *p, const char *pass);
void Leave(Player *p, bool send = true);
void KickOrBan(Player *good, const char *badname, bool ban);
void Kick(Player *good, const char *badname) { KickOrBan(good,badname,false); }
void Ban(Player *good, const char *badname) { KickOrBan(good,badname,true); }
void UnBan(Player *good, const char *badname);
void Password(Player *p, const char *pass);
void SetMode(Player *p, const char *p2n, bool mod, bool set);
void SetOwner(Player *p, const char *newname);
void GetOwner(Player *p);
void SetModerator(Player *p, const char *newname) { SetMode(p,newname,true,true); }
void UnsetModerator(Player *p, const char *newname) { SetMode(p,newname,true,false); }
void SetMute(Player *p, const char *newname) { SetMode(p,newname,false,true); }
void UnsetMute(Player *p, const char *newname) { SetMode(p,newname,false,false); }
void List(Player *p);
void Announce(Player *p);
void Moderate(Player *p);
void Say(Player *p, const char *what, Player *t = NULL);
void SayFromIRC(const char *msg);
void Invite(Player *p, const char *newp);
bool IsDefaultChannel();
bool m_DefaultChannel;
};
#endif