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); }
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); }
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; }
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); } } } }