Code:
//===============
// Guild Wars
// by Mager1794
// Transcendent Scripting
//===============
#include "StdAfx.h"
#include "Setup.h"
class SCRIPT_DECL GuildWar : public GossipScript
{
public:
void GossipHello(Object * pObject, Player* Plr, bool AutoSend);
void GossipSelectOption(Object * pObject, Player* Plr, uint32 Id, uint32 IntId, const char * Code);
void GossipEnd(Object * pObject, Player* Plr);
void Destroy()
{
delete this;
}
};
bool ChecksPassed(Player * pPlayer, uint32 guilda, uint32 guildb, bool war)
{
if(!pPlayer)
{
return false;
}
else if(pPlayer->GetGuild()->GetGuildLeader() == pPlayer->GetGUID())
{
pPlayer->BroadcastMessage("You must be the guild leader in order to use this function");
return false;
}
else if(!guilda)
{
pPlayer->BroadcastMessage("You are not in a guild");
return false;
}
else if(!guildb)
{
pPlayer->BroadcastMessage("You did not specify a guild");
return false;
}
else if(guilda == guildb)
{
pPlayer->BroadcastMessage("You cannot declare war on your own guild");
return false;
}
else
{
const char * guildA = objmgr.GetGuild(guilda)->GetGuildName();
const char * guildB = objmgr.GetGuild(guildb)->GetGuildName();
char * message;
if(war)
{
sprintf(message, "[Guild Wars] %s has declared war on %s", guildA,guildB);
}
else
{
sprintf(message, "[Guild Wars] %s has declared peace with %s", guildA,guildB);
}
sWorld.SendWorldWideScreenText(message);
return true;
}
};
void GuildWar::GossipHello(Object * pObject, Player* Plr, bool AutoSend)
{
GossipMenu *Menu;
objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 2593, Plr);
Menu->AddItem(1, "Propose A Guild War", 1, 1);
Menu->AddItem(1, "Propose A Guild Peace", 1, 2);
Menu->AddItem(1, "Exit Menu", 1, 3);
if(AutoSend)
Menu->SendTo(Plr);
}
void GuildWar::GossipSelectOption(Object* pObject, Player* Plr, uint32 Id, uint32 IntId, const char * Code)
{
switch(IntId)
{
case 0:
{
GossipHello(pObject, Plr, true);
}break;
case 1:
{
if(!Code)
{
Plr->BroadcastMessage("You must enter a guild a name");
}
uint32 enemy = objmgr.GetGuildByGuildName(Code)->GetGuildId();
uint32 friendly = Plr->GetGuildId();
if(ChecksPassed(Plr, friendly, enemy, true))
{
WorldDatabase.Query("INSERT INTO `guild_wars` VALUES('%s','%s');",friendly,enemy);
WorldDatabase.Query("INSERT INTO `guild_wars` VALUES('%s','%s');",enemy,friendly);
}
}break;
case 2:
{
if(!Code)
{
Plr->BroadcastMessage("You must enter a guild a name");
}
uint32 enemy = objmgr.GetGuildByGuildName(Code)->GetGuildId();
uint32 friendly = Plr->GetGuildId();
if(ChecksPassed(Plr, friendly, enemy, false))
{
WorldDatabase.Query("DELETE FROM `guild_wars` WHERE `aguild ='%s' AND `bguild`='%s');",friendly,enemy);
WorldDatabase.Query("DELETE FROM `guild_wars` WHERE `aguild ='%s' AND `bguild`='%s';",enemy,friendly);
}
}break;
case 3:
{
GossipEnd(pObject, Plr);
}break;
}
};
void GuildWar::GossipEnd(Object * pObject, Player* Plr)
{
GossipScript::GossipEnd(pObject, Plr);
}
bool IsGuildAtWar(uint32 aguild, uint32 vguild)
{
if(aguild = vguild)
return false;
QueryResult * res = WorldDatabase.Query("SELECT * FROM `guild_wars` WHERE `aguild` ='%s' AND `bguild` ='%s';", aguild, vguild);
if(res == NULL)
return false;
Field * guilds = res->Fetch();
if(guilds == NULL)
return false;
else
return true;
}
void AddGold(uint32 gold, Player * Plr)
{
uint32 gamm = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
uint32 goldammount = gamm + gold;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE, gamm);
}
void TakeGold(uint32 gold, Player * Plr)
{
int32 gamm = Plr->GetUInt32Value(PLAYER_FIELD_COINAGE);
int32 goldammount;
goldammount = gamm - gold;
Plr->SetUInt32Value(PLAYER_FIELD_COINAGE, goldammount);
}
void GuildWarScript(Player* attacker, Player* victim)
{
uint32 aguild = attacker->GetGuildId();
uint32 vguild = victim->GetGuildId();
if(IsGuildAtWar(aguild, vguild))
{
AddGold(10000, attacker);
TakeGold(5000, victim);
}
}
void SetupGuildWars(ScriptMgr * mgr)
{
GossipScript * gs = (GossipScript*) new GuildWar();
mgr->register_item_gossip_script(61000, gs);
mgr->register_hook(SERVER_HOOK_EVENT_ON_KILL_PLAYER, (void*)GuildWarScript);
}
SQL