示例#1
0
void Exec_MSG_ReqTradeList(int conn, char *pMsg)
{
	MSG_STANDARDPARM *m = (MSG_STANDARDPARM*)pMsg;

	int autoID = m->Parm;

	if (pMob[conn].MOB.CurrentScore.Hp == 0 || pUser[conn].Mode != USER_PLAY)
	{
		SendHpMode(conn);
		AddCrackError(conn, 10, 87);
		return;
	}

	if (autoID <= 0 || autoID >= MAX_USER)
		return;

	if (pUser[autoID].TradeMode == 0)
		return;

	if (pMob[conn].TargetX >= pMob[autoID].TargetX - VIEWGRIDX && pMob[conn].TargetX <= pMob[autoID].TargetX + VIEWGRIDX
		&& pMob[conn].TargetY >= pMob[autoID].TargetY - VIEWGRIDY && pMob[conn].TargetY <= pMob[autoID].TargetY + VIEWGRIDY)
		SendAutoTrade(conn, autoID);

	else
		Log("err,too far from autotrade - _MSG_ReqTradeList", pUser[conn].AccountName, pUser[conn].IP);
}
示例#2
0
void Exec_MSG_SendAutoTrade(int conn, char *pMsg)
{
	MSG_SendAutoTrade *m = (MSG_SendAutoTrade*)pMsg;

	if (pMob[conn].MOB.CurrentScore.Hp <= 0 || pUser[conn].Mode != USER_PLAY)
	{
		SendHpMode(conn);
		AddCrackError(conn, 10, 88);
		RemoveTrade(conn);
		return;
	}

	if (pUser[conn].Trade.OpponentID)
	{
		RemoveTrade(pUser[conn].Trade.OpponentID);
		RemoveTrade(conn);
		return;
	}

	if (pUser[conn].TradeMode)
	{
		SendClientMessage(conn, g_pMessageStringTable[_NN_CantWhenAutoTrade]);
		return;
	}

	if (NewbieEventServer == 0)
	{
		SendClientMessage(conn, g_pMessageStringTable[_NN_NEWBIEEVENTSERVER]);
		return;
	}

	int targetx = pMob[conn].TargetX;
	int targety = pMob[conn].TargetY;

	int Village = BASE_GetVillage(targetx, targety);

	if (targetx >= 2123 && targetx <= 2148 && targety >= 2139 && targety <= 2157)
	{
		RemoveTrade(conn);
		SendClientMessage(conn, g_pMessageStringTable[_NN_OnlyVillage]);
		return;
	}

	if (Village < 0 || Village >= 5)
	{
		RemoveTrade(conn);
		SendClientMessage(conn, g_pMessageStringTable[_NN_OnlyVillage]);
		return;
	}

	if (conn <= 0 || conn >= MAX_USER)
		return;

	for (int i = 0; i < MAX_AUTOTRADE; i++)
	{
		if (m->Coin[i] < 0 || (m->Coin[i] > 1999999999) || !m->Item[i].sIndex && m->Coin[i])
			return;

		if (m->Item[i].sIndex)
		{
			if (!m->Coin[i] || m->Item[i].sIndex == 508 || m->Item[i].sIndex == 3993 || m->Item[i].sIndex == 747 || m->Item[i].sIndex == 509 || m->Item[i].sIndex == 522
				|| m->Item[i].sIndex >= 526 && m->Item[i].sIndex <= 531 || m->Item[i].sIndex == 446 || m->CarryPos[i] < 0 || m->CarryPos[i] >= MAX_CARGO)
				return;

			if (BASE_GetItemAbility(&m->Item[i], EF_NOTRADE) != 0)
			{
				SendClientMessage(conn, g_pMessageStringTable[_NN_Cant_MoveItem]);									   
				return;
			}

			if (memcmp(&pUser[conn].Cargo[m->CarryPos[i]], &m->Item[i], sizeof(STRUCT_ITEM)))
			{
				RemoveTrade(conn);
				return;
			}
		}
	}

	m->Tax = g_pGuildZone[Village].CityTax;

	m->Title[MAX_AUTOTRADETITLE-1] = 0;
	m->Title[MAX_AUTOTRADETITLE-2] = 0;

	strncpy(pUser[conn].AutoTrade.Title, m->Title, MAX_AUTOTRADETITLE);
							   
	pUser[conn].TradeMode = 1;
							   
	memcpy(&pUser[conn].AutoTrade, m, sizeof(MSG_SendAutoTrade));
							   
	m->Size = sizeof(MSG_SendAutoTrade);

	MSG_CreateMobTrade sm_cmt;
	memset(&sm_cmt, 0, sizeof(MSG_CreateMobTrade));

	SendAutoTrade(conn, conn);
	GetCreateMobTrade(conn, &sm_cmt);

	sm_cmt.Score.Con = 0;

	GridMulticast(targetx, targety, (MSG_STANDARD*)&sm_cmt, 0);
}