#ifdef __WAR_SYSTEM__
void IOGuild::checkWars()
{
Database* db = Database::getInstance();
DBResult* result;
DBQuery query;
query << "SELECT `id`, `guild_id`, `enemy_id` FROM `guild_wars` WHERE `status` IN (1,4) AND `end` > 0 AND `end` < " << time(NULL);
if(!(result = db->storeQuery(query.str())))
return;
War_t tmp;
do
{
tmp.war = result->getDataInt("id");
tmp.ids[WAR_GUILD] = result->getDataInt("guild_id");
tmp.ids[WAR_ENEMY] = result->getDataInt("enemy_id");
finishWar(tmp, false);
}
while(result->next());
result->free();
}
bool IOGuild::updateWar(War_t& war)
{
Database* db = Database::getInstance();
DBResult* result;
DBQuery query;
query << "SELECT `g`.`name` AS `guild_name`, `e`.`name` AS `enemy_name`, `w`.* FROM `guild_wars` w INNER JOIN `guilds` g ON `w`.`guild_id` = `g`.`id` INNER JOIN `guilds` e ON `w`.`enemy_id` = `e`.`id` WHERE `w`.`id` = " << war.war;
if(!(result = db->storeQuery(query.str())))
return false;
war.ids[WAR_GUILD] = result->getDataInt("guild_id");
war.ids[WAR_ENEMY] = result->getDataInt("enemy_id");
war.names[WAR_GUILD] = result->getDataString("guild_name");
war.names[WAR_ENEMY] = result->getDataString("enemy_name");
war.frags[WAR_GUILD] = result->getDataInt("guild_kills");
war.frags[WAR_ENEMY] = result->getDataInt("enemy_kills");
war.frags[war.type]++;
war.limit = result->getDataInt("frags");
war.payment = result->getDataInt("payment");
result->free();
if(war.frags[WAR_GUILD] >= war.limit || war.frags[WAR_ENEMY] >= war.limit)
{
Scheduler::getInstance().addEvent(createSchedulerTask(3000,
boost::bind(&IOGuild::finishWar, this, war, true)));
return true;
}
query.str("");
query << "UPDATE `guild_wars` SET `guild_kills` = " << war.frags[WAR_GUILD] << ", `enemy_kills` = " << war.frags[WAR_ENEMY] << " WHERE `id` = " << war.war;
return db->query(query.str());
}
void IOGuild::finishWar(War_t war, bool finished)
{
Database* db = Database::getInstance();
DBQuery query;
if(finished)
{
query << "UPDATE `guilds` SET `balance` = `balance` + " << (war.payment * 2) << " WHERE `id` = " << war.ids[war.type];
if(!db->query(query.str()))
return;
query.str("");
}
query << "UPDATE `guild_wars` SET ";
if(finished)
query << "`guild_kills` = " << war.frags[WAR_GUILD] << ", `enemy_kills` = " << war.frags[WAR_ENEMY] << ",";
query << "`end` = " << time(NULL) << ", `status` = 5 WHERE `id` = " << war.war;
if(!db->query(query.str()))
return;
for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it)
{
if(it->second->isRemoved())
continue;
bool update = false;
if(it->second->getGuildId() == war.ids[WAR_GUILD])
{
it->second->removeEnemy(war.ids[WAR_ENEMY]);
update = true;
}
else if(it->second->getGuildId() == war.ids[WAR_ENEMY])
{
it->second->removeEnemy(war.ids[WAR_GUILD]);
update = true;
}
if(update)
g_game.updateCreatureEmblem(it->second);
}
if(finished)
{
std::stringstream s;
s << war.names[war.type] << " has just won the war against " << war.names[war.type == WAR_GUILD] << ".";
g_game.broadcastMessage(s.str().c_str(), MSG_EVENT_ADVANCE);
}
}
void IOGuild::frag(Player* player, uint64_t deathId, const DeathList& list, bool score)
{
War_t war;
std::stringstream s;
for(DeathList::const_iterator it = list.begin(); it != list.end(); )
{
if(score)
{
if(it->isLast())
war = it->getWar();
}
else if(!war.war)
war = it->getWar();
Creature* creature = it->getKillerCreature();
if(it != list.begin())
{
++it;
if(it == list.end())
s << " and ";
else
s << ", ";
}
else
++it;
s << creature->getName();
}
std::string killers = s.str();
s.str("");
ChatChannel* channel = NULL;
if((channel = g_chat.getChannel(player, CHANNEL_GUILD)))
{
s << "Guild member " << player->getName() << " was killed by " << killers << ".";
if(score)
s << " The new score is " << war.frags[war.type == WAR_GUILD] << ":"
<< war.frags[war.type] << " frags (limit " << war.limit << ").";
channel->talk("", SPEAK_CHANNEL_W, s.str());
}
s.str("");
if((channel = g_chat.getChannel(list[0].getKillerCreature()->getPlayer(), CHANNEL_GUILD)))
{
s << "Opponent " << player->getName() << " was killed by " << killers << ".";
if(score)
s << " The new score is " << war.frags[war.type] << ":"
<< war.frags[war.type == WAR_GUILD] << " frags (limit " << war.limit << ").";
channel->talk("", SPEAK_CHANNEL_W, s.str());
}
Database* db = Database::getInstance();
DBQuery query;
query << "INSERT INTO `guild_kills` (`guild_id`, `war_id`, `death_id`) VALUES ("
<< war.ids[war.type] << ", " << war.war << ", " << deathId << ");";
db->query(query.str());
}
#endif