Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
bool CEntityNetComponent::SendPlayerMsg(GameMsg_Base * pMsg )
{
	int bResult = false;
	if( m_pTag && pMsg )
	{
		bResult = SendGameMsg( pMsg , m_pTag );
	}

	return (bResult == 0) ? true : false;
}
Ejemplo n.º 5
0
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);
	}
}
Ejemplo n.º 6
0
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);
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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);
	}
}