bool CManageModule::_HandleConn_Notice(struct mg_connection *conn) { char starttime[MSG_VAR_LEN] = { 0 }; char interval[MSG_VAR_LEN] = { 0 }; char broadcasttimes[MSG_VAR_LEN] = { 0 }; char content[MSG_VAR_LEN] = { 0 }; mg_get_var(conn, MSG_VAR_STARTTIME, starttime, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_INTERVAL, interval, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_CASTTIMES, broadcasttimes, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_CONTENT, content, MSG_VAR_LEN); int64 tStartTime = atoll(starttime); int nInterVal = atoi(interval); int nCastTimes = atoi(broadcasttimes); if (tStartTime < 1 || nInterVal < 1 || nCastTimes < 1 || !content[0]) { Log.Error("Wrong notice. starttime: %lld, interval: %d, casttimes: %d, content: %s", tStartTime, nInterVal, nCastTimes, content); return false; } Message::GMManager msg; msg.set_starttime(tStartTime); msg.set_interval(nInterVal); msg.set_casttimes(nCastTimes); msg.set_content(content); PACKET_COMMAND pack; PROTOBUF_CMD_PACKAGE(pack, msg, B2G_MANAGE_NOTICE); SendGameMsg(&pack); Log.Notice("broadcast notice. starttime: %s, interval: %s, casttimes: %s, content: %s", starttime, interval, broadcasttimes, content); return true; }
bool CManageModule::_HandleConn_Forbid(struct mg_connection *conn) { char userid[MSG_VAR_LEN] = { 0 }; char forcetime[MSG_VAR_LEN] = { 0 }; char reason[MSG_VAR_LEN] = { 0 }; mg_get_var(conn, MSG_VAR_USER, userid, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_FTIME, forcetime, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_REASON, reason, MSG_VAR_LEN); int64 uid = atoll(userid); int64 tforce = atoll(forcetime) * GTIME_HOUR_SEC + GetTimeSec(); int treason = atol(reason); if (uid < 1 || tforce < 1) { Log.Error("[ManageModule] forbid user param wrong. user: %s, forcetime: %s", userid, forcetime); return false; } Message::GMManager msg; msg.set_userid(uid); msg.set_forcetime(tforce); msg.set_reason(treason); PACKET_COMMAND pack; PROTOBUF_CMD_PACKAGE(pack, msg, B2G_MANAGE_FORBID); SendGameMsg(&pack); Log.Notice("forbid user: %s forcetime: %s success.", userid, forcetime); return true; }
bool CManageModule::_HandleConn_Mail(struct mg_connection *conn) { char playerid[MSG_VAR_LEN] = { 0 }; char mailtitle[MSG_VAR_LEN] = { 0 }; char item[MSG_VAR_LEN] = { 0 }; char exp[MSG_VAR_LEN] = { 0 }; char silver[MSG_VAR_LEN] = { 0 }; char gold[MSG_VAR_LEN] = { 0 }; char credit[MSG_VAR_LEN] = { 0 }; char ap[MSG_VAR_LEN] = { 0 }; char merit[MSG_VAR_LEN] = { 0 }; char knight[MSG_VAR_LEN] = { 0 }; mg_get_var(conn, MSG_VAR_PLAYER, playerid, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILTITLE, mailtitle, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILITEM, item, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILEXP, exp, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILSILVER, silver, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILGOLD, gold, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILCREDIT, credit, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILAP, ap, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILMERIT, merit, MSG_VAR_LEN); mg_get_var(conn, MSG_VAR_MAILKNIGHT, knight, MSG_VAR_LEN); PersonID pid = atoll(playerid); int nType = atoi(mailtitle); int nItem = atoi(item); int nExp = atoi(exp); int nSilver = atoi(silver); int nGold = atoi(gold); int nCredit = atoi(credit); int nAp = atoi(ap); int nMerit = atoi(merit); int nKnight = atoi(knight); if (pid < 1 || nType < 1) { Log.Error("Wrong Mail. playerid: %lld, mailtype: %d, item: %d, gold: %d, silver: %d", pid, nType, nItem, nGold, nSilver); return false; } Message::GMManager msg; msg.set_playerid(pid); msg.set_mailtitle(nType); msg.set_item(nItem); msg.set_exp(nExp); msg.set_silver(nSilver); msg.set_gold(nGold); msg.set_credit(nCredit); msg.set_ap(nAp); msg.set_merit(nMerit); msg.set_knight(nKnight); PACKET_COMMAND pack; PROTOBUF_CMD_PACKAGE(pack, msg, B2G_MANAGE_MAIL); SendGameMsg(&pack); Log.Notice("send mail. player: %s, item: %s, gold: %s, silver: %s", playerid, item, gold, silver); return true; }
bool CEntityNetComponent::SendPlayerMsg(GameMsg_Base * pMsg ) { int bResult = false; if( m_pTag && pMsg ) { bResult = SendGameMsg( pMsg , m_pTag ); } return (bResult == 0) ? true : false; }
void CGameContext::SwapTeams() { if(!m_pController->IsTeamplay()) return; SendGameMsg(GAMEMSG_TEAM_SWAP, -1); for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) m_pController->DoTeamChange(m_apPlayers[i], m_apPlayers[i]->GetTeam()^1, false); } }
int ConstructBuilding::GameMsg(int msg, int par1, void * par2, uint npar2) { switch (msg) { case BMSG_Chief: if (npar2 == 1) return m_chief.Make(this,reinterpret_cast<const char*>(par2)); else { int n=0; for (uint i=0;i < npar2;i++) n+=m_chief.Make(this,reinterpret_cast<const char**>(par2)[i]); return n; } return 0; case BMSG_TrollIncoming: m_chief.Incoming((Troll*)par2); return 0; case BMSG_CreateImport: { // vytvoreni dodavky PAR_Favour * f = (PAR_Favour*)par2; hoe_assert(npar2 == 5); f->owner = this; // vyhledani zdroje ResourceExp * r = CRR::Get()->Find(f->sur, this); if (r == NULL) return 0; f->remote = r->GetOwner(); // zalockovat??? asi jo f->locked = SendGameMsg(f->remote, BMSG_LockSur, 0, f, npar2); } return 1; case BMSG_InsertSur: { PAR_Load * l = (PAR_Load *)par2; if (l->sur == EBS_Wood) m_wood.Add((uint*)&l->num, 1000); else if (l->sur == EBS_Stone) m_stone.Add((uint*)&l->num, 1000); else break; } return 0; } return BecherBuilding::GameMsg(msg, par1, par2, npar2); }
bool CManageModule::_HandleConn_UnForbid(struct mg_connection *conn) { char userid[MSG_VAR_LEN] = { 0 }; mg_get_var(conn, MSG_VAR_USER, userid, MSG_VAR_LEN); int64 uid = atoll(userid); if (uid < 1) { Log.Error("[ManageModule] unforbid user param wrong. user: %s", userid); return false; } Message::GMManager msg; msg.set_userid(uid); msg.set_forcetime(GetTimeSec() - GTIME_DAY_SEC); PACKET_COMMAND pack; PROTOBUF_CMD_PACKAGE(pack, msg, B2G_MANAGE_FORBID); SendGameMsg(&pack); Log.Notice("unforbid user: %s success.", userid); return true; }
void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) { void *pRawMsg = m_NetObjHandler.SecureUnpackMsg(MsgID, pUnpacker); CPlayer *pPlayer = m_apPlayers[ClientID]; if(!pRawMsg) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler.GetMsgName(MsgID), MsgID, m_NetObjHandler.FailedMsgOn()); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBuf); } return; } if(MsgID == NETMSGTYPE_CL_SAY) { CNetMsg_Cl_Say *pMsg = (CNetMsg_Cl_Say *)pRawMsg; int Team = pMsg->m_Team; if(Team) Team = pPlayer->GetTeam(); else Team = CGameContext::CHAT_ALL; if(g_Config.m_SvSpamprotection && pPlayer->m_LastChat && pPlayer->m_LastChat+Server()->TickSpeed() > Server()->Tick()) return; pPlayer->m_LastChat = Server()->Tick(); // check for invalid chars unsigned char *pMessage = (unsigned char *)pMsg->m_pMessage; while (*pMessage) { if(*pMessage < 32) *pMessage = ' '; pMessage++; } SendChat(ClientID, Team, pMsg->m_pMessage); } else if(MsgID == NETMSGTYPE_CL_CALLVOTE) { CNetMsg_Cl_CallVote *pMsg = (CNetMsg_Cl_CallVote *)pRawMsg; int64 Now = Server()->Tick(); if(pMsg->m_Force) { if(!Server()->IsAuthed(ClientID)) return; } else { if((g_Config.m_SvSpamprotection && ((pPlayer->m_LastVoteTry && pPlayer->m_LastVoteTry+Server()->TickSpeed()*3 > Now) || (pPlayer->m_LastVoteCall && pPlayer->m_LastVoteCall+Server()->TickSpeed()*VOTE_COOLDOWN > Now))) || pPlayer->GetTeam() == TEAM_SPECTATORS || m_VoteCloseTime) return; pPlayer->m_LastVoteTry = Now; } int Type = VOTE_UNKNOWN; char aDesc[VOTE_DESC_LENGTH] = {0}; char aCmd[VOTE_CMD_LENGTH] = {0}; const char *pReason = pMsg->m_Reason[0] ? pMsg->m_Reason : "No reason given"; if(str_comp_nocase(pMsg->m_Type, "option") == 0) { CVoteOptionServer *pOption = m_pVoteOptionFirst; while(pOption) { if(str_comp_nocase(pMsg->m_Value, pOption->m_aDescription) == 0) { str_format(aDesc, sizeof(aDesc), "%s", pOption->m_aDescription); str_format(aCmd, sizeof(aCmd), "%s", pOption->m_aCommand); if(pMsg->m_Force) { Server()->SetRconCID(ClientID); Console()->ExecuteLine(aCmd); Server()->SetRconCID(IServer::RCON_CID_SERV); ForceVote(VOTE_START_OP, aDesc, pReason); return; } Type = VOTE_START_OP; break; } pOption = pOption->m_pNext; } if(!pOption) return; } else if(str_comp_nocase(pMsg->m_Type, "kick") == 0) { if(!g_Config.m_SvVoteKick || m_pController->GetRealPlayerNum() < g_Config.m_SvVoteKickMin) return; int KickID = str_toint(pMsg->m_Value); if(KickID < 0 || KickID >= MAX_CLIENTS || !m_apPlayers[KickID] || KickID == ClientID || Server()->IsAuthed(KickID)) return; str_format(aDesc, sizeof(aDesc), "Kick '%s'", Server()->ClientName(KickID)); if (!g_Config.m_SvVoteKickBantime) str_format(aCmd, sizeof(aCmd), "kick %d Kicked by vote", KickID); else { char aAddrStr[NETADDR_MAXSTRSIZE] = {0}; Server()->GetClientAddr(KickID, aAddrStr, sizeof(aAddrStr)); str_format(aCmd, sizeof(aCmd), "ban %s %d Banned by vote", aAddrStr, g_Config.m_SvVoteKickBantime); } if(pMsg->m_Force) { Server()->SetRconCID(ClientID); Console()->ExecuteLine(aCmd); Server()->SetRconCID(IServer::RCON_CID_SERV); return; } Type = VOTE_START_KICK; m_VoteClientID = KickID; } else if(str_comp_nocase(pMsg->m_Type, "spectate") == 0) { if(!g_Config.m_SvVoteSpectate) return; int SpectateID = str_toint(pMsg->m_Value); if(SpectateID < 0 || SpectateID >= MAX_CLIENTS || !m_apPlayers[SpectateID] || m_apPlayers[SpectateID]->GetTeam() == TEAM_SPECTATORS || SpectateID == ClientID) return; str_format(aDesc, sizeof(aDesc), "move '%s' to spectators", Server()->ClientName(SpectateID)); str_format(aCmd, sizeof(aCmd), "set_team %d -1 %d", SpectateID, g_Config.m_SvVoteSpectateRejoindelay); if(pMsg->m_Force) { Server()->SetRconCID(ClientID); Console()->ExecuteLine(aCmd); Server()->SetRconCID(IServer::RCON_CID_SERV); ForceVote(VOTE_START_SPEC, aDesc, pReason); return; } Type = VOTE_START_SPEC; m_VoteClientID = SpectateID; } if(Type != VOTE_UNKNOWN) { m_VoteCreator = ClientID; StartVote(Type, aDesc, aCmd, pReason); pPlayer->m_Vote = 1; pPlayer->m_VotePos = m_VotePos = 1; pPlayer->m_LastVoteCall = Now; } } else if(MsgID == NETMSGTYPE_CL_VOTE) { if(!m_VoteCloseTime) return; if(pPlayer->m_Vote == 0) { CNetMsg_Cl_Vote *pMsg = (CNetMsg_Cl_Vote *)pRawMsg; if(!pMsg->m_Vote) return; pPlayer->m_Vote = pMsg->m_Vote; pPlayer->m_VotePos = ++m_VotePos; m_VoteUpdate = true; } } else if(MsgID == NETMSGTYPE_CL_SETTEAM && m_pController->IsTeamChangeAllowed()) { CNetMsg_Cl_SetTeam *pMsg = (CNetMsg_Cl_SetTeam *)pRawMsg; if(pPlayer->GetTeam() == pMsg->m_Team || (g_Config.m_SvSpamprotection && pPlayer->m_LastSetTeam && pPlayer->m_LastSetTeam+Server()->TickSpeed()*3 > Server()->Tick()) || (pMsg->m_Team != TEAM_SPECTATORS && m_LockTeams) || pPlayer->m_TeamChangeTick > Server()->Tick()) return; pPlayer->m_LastSetTeam = Server()->Tick(); // Switch team on given client and kill/respawn him if(m_pController->CanJoinTeam(pMsg->m_Team, ClientID) && m_pController->CanChangeTeam(pPlayer, pMsg->m_Team)) { if(pPlayer->GetTeam() == TEAM_SPECTATORS || pMsg->m_Team == TEAM_SPECTATORS) m_VoteUpdate = true; pPlayer->m_TeamChangeTick = Server()->Tick()+Server()->TickSpeed()*3; m_pController->DoTeamChange(pPlayer, pMsg->m_Team); } } else if (MsgID == NETMSGTYPE_CL_SETSPECTATORMODE && !m_World.m_Paused) { CNetMsg_Cl_SetSpectatorMode *pMsg = (CNetMsg_Cl_SetSpectatorMode *)pRawMsg; if(g_Config.m_SvSpamprotection && pPlayer->m_LastSetSpectatorMode && pPlayer->m_LastSetSpectatorMode+Server()->TickSpeed()*3 > Server()->Tick()) return; pPlayer->m_LastSetSpectatorMode = Server()->Tick(); if(!pPlayer->SetSpectatorID(pMsg->m_SpectatorID)) SendGameMsg(GAMEMSG_SPEC_INVALIDID, ClientID); } else if (MsgID == NETMSGTYPE_CL_STARTINFO) { if(pPlayer->m_IsReadyToEnter) return; CNetMsg_Cl_StartInfo *pMsg = (CNetMsg_Cl_StartInfo *)pRawMsg; pPlayer->m_LastChangeInfo = Server()->Tick(); // set start infos Server()->SetClientName(ClientID, pMsg->m_pName); Server()->SetClientClan(ClientID, pMsg->m_pClan); Server()->SetClientCountry(ClientID, pMsg->m_Country); for(int p = 0; p < 6; p++) { str_copy(pPlayer->m_TeeInfos.m_aaSkinPartNames[p], pMsg->m_apSkinPartNames[p], 24); pPlayer->m_TeeInfos.m_aUseCustomColors[p] = pMsg->m_aUseCustomColors[p]; pPlayer->m_TeeInfos.m_aSkinPartColors[p] = pMsg->m_aSkinPartColors[p]; } m_pController->OnPlayerInfoChange(pPlayer); // send vote options CNetMsg_Sv_VoteClearOptions ClearMsg; Server()->SendPackMsg(&ClearMsg, MSGFLAG_VITAL, ClientID); CVoteOptionServer *pCurrent = m_pVoteOptionFirst; while(pCurrent) { // count options for actual packet int NumOptions = 0; for(CVoteOptionServer *p = pCurrent; p && NumOptions < MAX_VOTE_OPTION_ADD; p = p->m_pNext, ++NumOptions); // pack and send vote list packet CMsgPacker Msg(NETMSGTYPE_SV_VOTEOPTIONLISTADD); Msg.AddInt(NumOptions); while(pCurrent && NumOptions--) { Msg.AddString(pCurrent->m_aDescription, VOTE_DESC_LENGTH); pCurrent = pCurrent->m_pNext; } Server()->SendMsg(&Msg, MSGFLAG_VITAL, ClientID); } // send tuning parameters to client SendTuningParams(ClientID); // client is ready to enter pPlayer->m_IsReadyToEnter = true; CNetMsg_Sv_ReadyToEnter m; Server()->SendPackMsg(&m, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID); } else if (MsgID == NETMSGTYPE_CL_EMOTICON && !m_World.m_Paused) { CNetMsg_Cl_Emoticon *pMsg = (CNetMsg_Cl_Emoticon *)pRawMsg; if(g_Config.m_SvSpamprotection && pPlayer->m_LastEmote && pPlayer->m_LastEmote+Server()->TickSpeed()*3 > Server()->Tick()) return; pPlayer->m_LastEmote = Server()->Tick(); SendEmoticon(ClientID, pMsg->m_Emoticon); } else if (MsgID == NETMSGTYPE_CL_KILL && !m_World.m_Paused) { if(pPlayer->m_LastKill && pPlayer->m_LastKill+Server()->TickSpeed()*3 > Server()->Tick()) return; pPlayer->m_LastKill = Server()->Tick(); pPlayer->KillCharacter(WEAPON_SELF); } else if (MsgID == NETMSGTYPE_CL_READYCHANGE) { if(pPlayer->m_LastReadyChange && pPlayer->m_LastReadyChange+Server()->TickSpeed()*1 > Server()->Tick()) return; pPlayer->m_LastReadyChange = Server()->Tick(); m_pController->OnPlayerReadyChange(pPlayer); } }