Ejemplo n.º 1
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);
}
Ejemplo n.º 2
0
void OitavaHT(int ClientID, int OtherID)
{
    st_Mob *player = (st_Mob*) GetMobFromIndex(ClientID);
    st_Mob *mob = (st_Mob*) GetMobFromIndex(OtherID);

    p36C p;
    memset(&p, 0, sizeof p36C);
 
    p.Header.ClientId = 30000;
    p.Header.Size = sizeof p36C;
    p.Header.PacketId = 0x36C;
 
	p.m_AffectedPosition.X = mob->TargetX;
    p.m_AffectedPosition.Y = mob->TargetY;
    p.m_AttackerPosition.X = player->TargetX;
    p.m_AttackerPosition.Y = player->TargetY;
 
    p.m_ClientId = ClientID;
 
    p.m_CurrentExp = player->Exp;
 
    p.m_FlagLocal = 1;
    p.m_Motion = -1;
    p.m_SkillId = 79;
 
    for(int i = 0;i < 8;i++)
    {
        INT32 parry = GetParryRate(mob, mob->Parry);
        INT32 randInterator = rand() % 1000;
 
        if(randInterator <= (parry / 2))
        {
            p.m_Target[i].Index = OtherID;
            p.m_Target[i].Damage = -1;
 
            continue;
        }
                       
        int RemoveDamage = BASE_GetDamage(player->Status.Attack, (OtherID <= MAX_PLAYER) ? (mob->Status.Defense << 1) : mob->Status.Defense, 0) / 2;
        int Damage = RemoveDamage;
 
		if(OtherID < 750)
        {
            RemoveDamage = Damage * 4 / 9;
 
            Damage = RemoveDamage;
        }

		Damage = HKD_ChangeDamage(OtherID, ClientID, RemoveDamage);
 
        if(mob->Status.curHP - Damage <= 0)
        {
            p.m_Target[i].Damage = Damage;
            p.m_Target[i].Index = OtherID;
 
            mob->Status.curHP = 0;

			Users[OtherID].Potion.CountHp = 0;

            break;
        }
        else
		{
            mob->Status.curHP -= Damage;

			Users[OtherID].Potion.CountHp -= Damage;
		}
 
        p.m_Target[i].Damage = Damage;
        p.m_Target[i].Index = OtherID;
    }
 
    p.m_CurrentMp = player->Status.curMP;
 
    GridMulticast(ClientID, player->TargetX, player->TargetY, &p);
 
    p.m_FlagLocal = 0;
 
    Sendpack((BYTE*)&p, ClientID, sizeof p36C);
       
    if(!mob->Status.curHP)
        MobKilled(OtherID, ClientID, 0, 0);
  
    SendScore(OtherID);
}
Ejemplo n.º 3
0
void Exec_MSG_UpdateItem(int conn, char *pMsg)
{
	MSG_UpdateItem *m = (MSG_UpdateItem*)pMsg;

	if (pMob[conn].MOB.CurrentScore.Hp == 0 || pUser[conn].Mode != USER_PLAY)
	{
		SendHpMode(conn);
		AddCrackError(conn, 1, 16);
		return;
	}
	if(m->State < 0 || m->State > 5)
	{
		AddCrackError(conn, 50, 50);
		return;
	}

	if(m->ItemID < 10000 || m->ItemID >= 10000 + MAX_ITEM)
	{
		AddCrackError(conn, 50, 50);
		return;
	}

	int gateid = m->ItemID - 10000;
	int gatestate = m->State;

	if(gateid < 0 || gateid >= MAX_ITEM)
	{
		AddCrackError(conn, 50, 50);
		return;
	}

	if (CCastleZakum::OpenCastleGate(conn, gateid, m) == TRUE)
		return;
		
	int state = pItem[gateid].State;
	int gatestate2 = m->State;

	int gatekey = BASE_GetItemAbility(&pItem[gateid].ITEM, EF_KEYID);

	if (state != 3 && gatestate2 != 3)
		goto NoNeedKey;

	if (gatekey == 0)
		goto NoNeedKey;

	int key = 0;
	int Quest = -1;
	
	int i = 0;
	for (i = 0; i < MAX_CARRY; i++)
	{
		key = BASE_GetItemAbility(&pMob[conn].MOB.Carry[i], EF_KEYID);

		if (key != gatekey)
			continue;

		Quest = BASE_GetItemAbility(&pMob[conn].MOB.Carry[i], EF_QUEST);

		break;
	}

	if (gatekey != key)
	{
		if (pItem[gateid].ITEM.sIndex != 773)
			SendClientMessage(conn, g_pMessageStringTable[_NN_No_Key]);

		return;
	}
	
	memset(&pMob[conn].MOB.Carry[i], 0, sizeof(STRUCT_ITEM));
	SendItem(conn, ITEM_PLACE_CARRY, i, &pMob[conn].MOB.Carry[i]);
NoNeedKey:

	if (CEncampment::OpenTreasureBox(conn, gateid) == TRUE)
		return;

	int heigth = 0;

	int isUpdate = UpdateItem(gateid, STATE_OPEN, &heigth);

	if (isUpdate)
		GridMulticast(pItem[gateid].PosX, pItem[gateid].PosY, (MSG_STANDARD*)m, 0);

	sprintf(temp, "etc,opengate gateid:%d X:%d Y:%d", gateid, pItem[gateid].PosX, pItem[gateid].PosY);
	Log(temp, pUser[conn].AccountName, pUser[conn].IP);
	return;
}
Ejemplo n.º 4
0
void GridMulticast(int tx, int ty, MSG_STANDARD *msg, int skip)
{
	int SizeY = VIEWGRIDY;
	int SizeX = VIEWGRIDX;
	int StartX = tx - HALFGRIDX;
	int StartY = ty - HALFGRIDY;

	if (StartX + SizeX >= MAX_GRIDX)
		SizeX = SizeX - (StartX + SizeX - MAX_GRIDX);

	if (SizeY + StartY >= MAX_GRIDY)
		SizeY = SizeY - (StartY + SizeY - MAX_GRIDY);

	if (StartX < 0)
	{
		StartX = 0;

		SizeX = SizeX + StartX;
	}

	if (StartY < 0)
	{
		StartY = 0;

		SizeY = SizeY + StartY;
	}

	int sx1 = StartX;
	int sy1 = StartY;
	int sx2 = StartX + SizeX;
	int sy2 = StartY + SizeY;

	for (int y = sy1; y < sy2; y++)
	{
		for (int x = sx1; x < sx2; x++)
		{
			int tmob = pMobGrid[y][x];

			if (tmob <= 0 || tmob == skip)
				continue;

			if (pMob[tmob].Mode == MOB_EMPTY)
			{
				int Unk = 0;

				continue;
			}

			if (msg != NULL && tmob < MAX_USER)
			{
				if (msg->Type == _MSG_CreateMob)
				{
					int xx = ((MSG_CreateMob*)msg)->PosX;
					int yy = ((MSG_CreateMob*)msg)->PosY;

					if(xx >= 896 && yy >= 1405 && xx <= 1150 && yy <= 1538)
					{
						STRUCT_ITEM hcitem;

						memset(&hcitem, 0, sizeof(STRUCT_ITEM));

						hcitem.sIndex = 3505;

						((MSG_CreateMob*)msg)->Equip[1] = BASE_VisualItemCode(&hcitem, 1);

						((MSG_CreateMob*)msg)->AnctCode[1] = BASE_VisualAnctCode(&hcitem);


						hcitem.sIndex = 3999;

						((MSG_CreateMob*)msg)->Equip[15] = BASE_VisualItemCode(&hcitem, 15);

						((MSG_CreateMob*)msg)->AnctCode[15] = BASE_VisualAnctCode(&hcitem);
					}

				}

				if (msg->Type == _MSG_CNFMobKill)
				{
					((MSG_CNFMobKill*)msg)->Exp = pMob[tmob].MOB.Exp;
					((MSG_CNFMobKill*)msg)->Hold = pMob[tmob].extra.Hold;

					int Segment = pMob[tmob].CheckGetLevel();

					if (Segment >= 1 && Segment <= 4)
					{
						if (Segment == 4)
						{
							SetCircletSubGod(tmob);
							SendClientMessage(tmob, g_pMessageStringTable[_NN_Level_Up]);

							if(pMob[tmob].extra.ClassMaster == MORTAL)
								DoItemLevel(tmob);
						}
						if (Segment == 3)
							SendClientMessage(tmob, g_pMessageStringTable[_NN_3_Quarters_Bonus]);

						if (Segment == 2)
							SendClientMessage(tmob, g_pMessageStringTable[_NN_2_Quarters_Bonus]);

						if (Segment == 1)
							SendClientMessage(tmob, g_pMessageStringTable[_NN_1_Quarters_Bonus]);

						SendScore(tmob);
						SendEmotion(tmob, 14, 3);

						if (Segment == 4)
						{
							SendEtc(tmob);

							int PKPoint = GetPKPoint(tmob) + 5;
							SetPKPoint(tmob, PKPoint);

							MSG_CreateMob sm_lupc;
							memset(&sm_lupc, 0, sizeof(MSG_CreateMob));
							GetCreateMob(tmob, &sm_lupc);

							GridMulticast(pMob[tmob].TargetX, pMob[tmob].TargetY, (MSG_STANDARD*)&sm_lupc, 0);

							sprintf(temp, "lvl %s level up to %d", pMob[tmob].MOB.MobName, pMob[tmob].MOB.BaseScore.Level);
							Log(temp, pUser[tmob].AccountName, pUser[tmob].IP);
						}
					}
				}

				pUser[tmob].cSock.AddMessage((char*)msg, msg->Size);
			}
		}
	}
}