void Adventure::SetStatus(AdventureStatus new_status) { if(new_status == AS_WaitingForPrimaryEndTime) { status = new_status; safe_delete(current_timer); current_timer = new Timer(adventure_template->duration * 1000); database.SetInstanceDuration(instance_id, adventure_template->duration + 60); ServerPacket *pack = new ServerPacket(ServerOP_InstanceUpdateTime, sizeof(ServerInstanceUpdateTime_Struct)); ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*)pack->pBuffer; ut->instance_id = instance_id; ut->new_duration = adventure_template->duration + 60; pack->Deflate(); zoneserver_list.SendPacket(0, instance_id, pack); safe_delete(pack); } else if(new_status == AS_WaitingForSecondaryEndTime) { status = new_status; safe_delete(current_timer); current_timer = new Timer(1800000); database.SetInstanceDuration(instance_id, 1860); ServerPacket *pack = new ServerPacket(ServerOP_InstanceUpdateTime, sizeof(ServerInstanceUpdateTime_Struct)); ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*)pack->pBuffer; ut->instance_id = instance_id; ut->new_duration = 1860; pack->Deflate(); zoneserver_list.SendPacket(0, instance_id, pack); safe_delete(pack); } else if(new_status == AS_Finished) { status = new_status; safe_delete(current_timer); current_timer = new Timer(1800000); database.SetInstanceDuration(instance_id, 1800); ServerPacket *pack = new ServerPacket(ServerOP_InstanceUpdateTime, sizeof(ServerInstanceUpdateTime_Struct)); ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*)pack->pBuffer; ut->instance_id = instance_id; ut->new_duration = 1860; pack->Deflate(); zoneserver_list.SendPacket(0, instance_id, pack); safe_delete(pack); } else { return; } list<string>::iterator iter = players.begin(); while(iter != players.end()) { adventure_manager.GetAdventureData((*iter).c_str()); iter++; } }
void ZoneServer::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message) { if (!message) return; ServerPacket* pack = new ServerPacket; pack->opcode = ServerOP_EmoteMessage; pack->size = sizeof(ServerEmoteMessage_Struct)+strlen(message)+1; pack->pBuffer = new uchar[pack->size]; memset(pack->pBuffer, 0, pack->size); ServerEmoteMessage_Struct* sem = (ServerEmoteMessage_Struct*) pack->pBuffer; if (to != 0) { strcpy((char *) sem->to, to); } else { sem->to[0] = 0; } sem->guilddbid = to_guilddbid; sem->minstatus = to_minstatus; sem->type = type; strcpy(&sem->message[0], message); pack->Deflate(); SendPacket(pack); delete pack; }
void ZSList::SendEmoteMessageRaw(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message) { if (!message) return; ServerPacket* pack = new ServerPacket; pack->opcode = ServerOP_EmoteMessage; pack->size = sizeof(ServerEmoteMessage_Struct)+strlen(message)+1; pack->pBuffer = new uchar[pack->size]; memset(pack->pBuffer, 0, pack->size); ServerEmoteMessage_Struct* sem = (ServerEmoteMessage_Struct*) pack->pBuffer; if (to) { if (to[0] == '*') { Console* con = console_list.FindByAccountName(&to[1]); if (con) con->SendEmoteMessageRaw(to, to_guilddbid, to_minstatus, type, message); delete pack; return; } strcpy((char *) sem->to, to); } else { sem->to[0] = 0; } sem->guilddbid = to_guilddbid; sem->minstatus = to_minstatus; sem->type = type; strcpy(&sem->message[0], message); char tempto[64]={0}; if(to) strn0cpy(tempto,to,64); pack->Deflate(); if (tempto[0] == 0) { SendPacket(pack); if (to_guilddbid == 0) console_list.SendEmoteMessageRaw(type, message); } else { ZoneServer* zs = FindByName(to); if (zs != 0) zs->SendPacket(pack); else SendPacket(pack); } delete pack; }
void ClientListEntry::ProcessTellQueue() { if (!Server()) return; ServerPacket *pack; auto it = tell_queue.begin(); while (it != tell_queue.end()) { pack = new ServerPacket(ServerOP_ChannelMessage, sizeof(ServerChannelMessage_Struct) + strlen((*it)->message) + 1); memcpy(pack->pBuffer, *it, pack->size); pack->Deflate(); Server()->SendPacket(pack); safe_delete(pack); it = tell_queue.erase(it); } return; }
void ZSList::SendChannelMessageRaw(const char* from, const char* to, uint8 chan_num, uint8 language, const char* message) { if (!message) return; ServerPacket* pack = new ServerPacket; pack->opcode = ServerOP_ChannelMessage; pack->size = sizeof(ServerChannelMessage_Struct)+strlen(message)+1; pack->pBuffer = new uchar[pack->size]; memset(pack->pBuffer, 0, pack->size); ServerChannelMessage_Struct* scm = (ServerChannelMessage_Struct*) pack->pBuffer; if (from == 0) { strcpy(scm->from, "WServer"); scm->noreply = true; } else if (from[0] == 0) { strcpy(scm->from, "WServer"); scm->noreply = true; } else strcpy(scm->from, from); if (to != 0) { strcpy((char *) scm->to, to); strcpy((char *) scm->deliverto, to); } else { scm->to[0] = 0; scm->deliverto[0] = 0; } scm->language = language; scm->chan_num = chan_num; strcpy(&scm->message[0], message); if (scm->chan_num == 5 || scm->chan_num == 6 || scm->chan_num == 11) { console_list.SendChannelMessage(scm); } pack->Deflate(); SendPacket(pack); delete pack; }
void ClientList::SendLFGMatches(ServerLFGMatchesRequest_Struct *smrs) { // Send back matches when someone searches player's Looking For A Group. LinkedListIterator<ClientListEntry*> Iterator(clientlist); ClientListEntry* CLE = 0; int Matches = 0; Iterator.Reset(); // We run the ClientList twice. The first time is to determine how big the outgoing packet needs to be. while(Iterator.MoreElements()) { CLE = Iterator.GetData(); if(CLE->LFG()) { unsigned int BitMask = 1 << CLE->class_(); // First we check that the player meets the level and class criteria of the person // doing the search. if((CLE->level() >= smrs->FromLevel) && (CLE->level() <= smrs->ToLevel) && (BitMask & smrs->Classes)) // Then we check if if the player doing the search meets the level criteria specified // by the player who is LFG. // // GetLFGMatchFilter returns the setting of the 'Only players who match my posted filters // can query me' checkbox. // // FromLevel and ToLevel are the settings of the 'Want group levels:' boxes. if(!CLE->GetLFGMatchFilter() || ((smrs->QuerierLevel >= CLE->GetLFGFromLevel()) && (smrs->QuerierLevel <= CLE->GetLFGToLevel()))) Matches++; } Iterator.Advance(); } ServerPacket* Pack = new ServerPacket(ServerOP_LFGMatches, (sizeof(ServerLFGMatchesResponse_Struct) * Matches) + 4); char *Buf = (char *)Pack->pBuffer; // FromID is the Entity ID of the player doing the search. VARSTRUCT_ENCODE_TYPE(int32, Buf, smrs->FromID); ServerLFGMatchesResponse_Struct* Buffer = (ServerLFGMatchesResponse_Struct*)Buf; Iterator.Reset(); if(Matches) { while(Iterator.MoreElements() && (Matches > 0)) { CLE = Iterator.GetData(); if(CLE->LFG()) { unsigned int BitMask = 1 << CLE->class_(); if((CLE->level() >= smrs->FromLevel) && (CLE->level() <= smrs->ToLevel) && (BitMask & smrs->Classes)) { Matches--; strcpy(Buffer->Name, CLE->name()); Buffer->Class_ = CLE->class_(); Buffer->Level = CLE->level(); Buffer->Zone = CLE->zone(); // If the LFG player is anon, level and class are still displayed, but // zone shows as UNAVAILABLE. Buffer->Anon = (CLE->Anon() != 0); // The client can filter on Guildname Buffer->GuildID = CLE->GuildID(); strcpy(Buffer->Comments, CLE->GetLFGComments()); Buffer++; } } Iterator.Advance(); } Pack->Deflate(); } SendPacket(smrs->FromName,Pack); safe_delete(Pack); }
void Adventure::Finished(AdventureWinStatus ws) { list<string>::iterator iter = players.begin(); while(iter != players.end()) { ClientListEntry *current = client_list.FindCharacter((*iter).c_str()); if(current) { if(current->Online() == CLE_Status_InZone) { //We can send our packets only. ServerPacket *pack = new ServerPacket(ServerOP_AdventureFinish, sizeof(ServerAdventureFinish_Struct)); ServerAdventureFinish_Struct *af = (ServerAdventureFinish_Struct*)pack->pBuffer; strcpy(af->player, (*iter).c_str()); af->theme = GetTemplate()->theme; if(ws == AWS_Win) { af->win = true; af->points = GetTemplate()->win_points; } else if(ws == AWS_SecondPlace) { af->win = true; af->points = GetTemplate()->lose_points; } else { af->win = false; af->points = 0; } pack->Deflate(); zoneserver_list.SendPacket(current->zone(), current->instance(), pack); database.UpdateAdventureStatsEntry(database.GetCharacterID((*iter).c_str()), GetTemplate()->theme, (ws != AWS_Lose) ? true : false); delete pack; } else { AdventureFinishEvent afe; afe.name = (*iter); if(ws == AWS_Win) { afe.theme = GetTemplate()->theme; afe.points = GetTemplate()->win_points; afe.win = true; } else if(ws == AWS_SecondPlace) { afe.theme = GetTemplate()->theme; afe.points = GetTemplate()->lose_points; afe.win = true; } else { afe.win = false; afe.points = 0; } adventure_manager.AddFinishedEvent(afe); database.UpdateAdventureStatsEntry(database.GetCharacterID((*iter).c_str()), GetTemplate()->theme, (ws != AWS_Lose) ? true : false); } } else { AdventureFinishEvent afe; afe.name = (*iter); if(ws == AWS_Win) { afe.theme = GetTemplate()->theme; afe.points = GetTemplate()->win_points; afe.win = true; } else if(ws == AWS_SecondPlace) { afe.theme = GetTemplate()->theme; afe.points = GetTemplate()->lose_points; afe.win = true; } else { afe.win = false; afe.points = 0; } adventure_manager.AddFinishedEvent(afe); database.UpdateAdventureStatsEntry(database.GetCharacterID((*iter).c_str()), GetTemplate()->theme, (ws != AWS_Lose) ? true : false); } iter++; } adventure_manager.GetAdventureData(this); }