void LogManager::ItemLog(LPCHARACTER ch, LPITEM item, const char * c_pszText, const char * c_pszHint) { if (NULL == ch || NULL == item) { sys_err("character or item nil (ch %p item %p text %s)", get_pointer(ch), get_pointer(item), c_pszText); return; } ItemLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(), item->GetID(), NULL == c_pszText ? "" : c_pszText, c_pszHint, ch->GetDesc() ? ch->GetDesc()->GetHostName() : "", item->GetOriginalVnum()); }
void Exec_MSG_CombineItemAlquimia(int conn, char *pMsg) { MSG_CombineItem *m = (MSG_CombineItem*)pMsg; for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; int invPos = m->InvenPos[i]; if (invPos < 0 || invPos >= pMob[conn].MaxCarry) { RemoveTrade(conn); return; } if (memcmp(&pMob[conn].MOB.Carry[invPos], &m->Item[i], sizeof(STRUCT_ITEM))) { ItemLog("err,msg_CombineAlquimia - item remove or changed.", pUser[conn].AccountName, pUser[conn].IP); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } } int combine = GetMatchCombineAlquimia(m->Item); if (combine == -1 || pMob[conn].MOB.Class != 3) { SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; memset(&pMob[conn].MOB.Carry[m->InvenPos[i]], 0, sizeof(STRUCT_ITEM)); SendItem(conn, ITEM_PLACE_CARRY, m->InvenPos[i], &pMob[conn].MOB.Carry[m->InvenPos[i]]); } ItemLog("*** Item combine ht_skill_alquimia. ***", pUser[conn].AccountName, pUser[conn].IP); for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex) { char itemlog[2048]; BASE_GetItemCode(&m->Item[i], itemlog); strcat(temp, itemlog); } } ItemLog(temp, pUser[conn].AccountName, pUser[conn].IP); ItemLog("*** ------------------- ***", pUser[conn].AccountName, pUser[conn].IP); int _rand = rand() % 115; if (_rand >= 100) _rand -= 15; int chance = (pMob[conn].MOB.CurrentScore.Special[2] + 1) / 6; if (_rand <= chance || LOCALSERVER) { pMob[conn].MOB.Carry[m->InvenPos[0]].sIndex = 3200 + combine; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[0].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[0].cValue = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[1].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[1].cValue = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[2].cEffect = 0; pMob[conn].MOB.Carry[m->InvenPos[0]].stEffect[2].cValue = 0; SendItem(conn, ITEM_PLACE_CARRY, m->InvenPos[0], &pMob[conn].MOB.Carry[m->InvenPos[0]]); SendClientMessage(conn, g_pMessageStringTable[_NN_Processing_Complete]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 1); sprintf(temp, "%s ", pUser[conn].AccountName); ItemLog(temp, "*** Combine ht_skill_alquimia sucess ***", pUser[conn].IP); return; } else { SendClientMessage(conn, g_pMessageStringTable[_NN_CombineFailed]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 2); Log("*** Combine ht_skill_alquimia fail ***", pUser[conn].AccountName, pUser[conn].IP); return; } }
void LogManager::ItemLog(LPCHARACTER ch, int itemID, int itemVnum, const char * c_pszText, const char * c_pszHint) { ItemLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(), itemID, c_pszText, c_pszHint, ch->GetDesc() ? ch->GetDesc()->GetHostName() : "", itemVnum); }
void Exec_MSG_CombineItemExtracao(int conn, char *pMsg) { MSG_STANDARDPARM2 *m = (MSG_STANDARDPARM2*)pMsg; int ItemSlot = m->Parm2; if (ItemSlot < 0 || ItemSlot >= pMob[conn].MaxCarry) return; int item = pMob[conn].MOB.Carry[ItemSlot].sIndex; if(item <= 0 || item >= MAX_ITEMLIST) return; int itemlevel = BASE_GetItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_ITEMLEVEL); if(itemlevel >= 5) return; if(BASE_GetItemSanc(&pMob[conn].MOB.Carry[ItemSlot]) < 9) return; if((g_pItemList[item].nPos != 2 && g_pItemList[item].nPos != 4 && g_pItemList[item].nPos != 8 && g_pItemList[item].nPos != 16 && g_pItemList[item].nPos != 32) || BASE_GetItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_MOBTYPE) != 0) return; int i = 0; for (i = 0; i < pMob[conn].MaxCarry; i++) { if (pMob[conn].MOB.Carry[i].sIndex != 1774) continue; BASE_ClearItem(&pMob[conn].MOB.Carry[i]); SendItem(conn, ITEM_PLACE_CARRY, i, &pMob[conn].MOB.Carry[i]); break; } if (i == pMob[conn].MaxCarry) return; int _rnd = rand()%115; if(_rnd > 100) _rnd -= 15; int rate = (pMob[conn].MOB.CurrentScore.Special[2] + 1) / 6; if(_rnd < rate) { pMob[conn].MOB.Carry[ItemSlot].stEffect[0].cEffect = EF_ITEMLEVEL; pMob[conn].MOB.Carry[ItemSlot].stEffect[0].cValue = itemlevel; if(pMob[conn].MOB.Carry[ItemSlot].stEffect[1].cEffect == EF_DAMAGE) pMob[conn].MOB.Carry[ItemSlot].stEffect[1].cValue += BASE_GetStaticItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_DAMAGE); if(pMob[conn].MOB.Carry[ItemSlot].stEffect[2].cEffect == EF_DAMAGE) pMob[conn].MOB.Carry[ItemSlot].stEffect[2].cValue += BASE_GetStaticItemAbility(&pMob[conn].MOB.Carry[ItemSlot], EF_DAMAGE); pMob[conn].MOB.Carry[ItemSlot].sIndex = 3021; if(g_pItemList[item].nPos == 4) pMob[conn].MOB.Carry[ItemSlot].sIndex++; else if(g_pItemList[item].nPos == 8) pMob[conn].MOB.Carry[ItemSlot].sIndex += 2; else if(g_pItemList[item].nPos == 16) pMob[conn].MOB.Carry[ItemSlot].sIndex += 3; else if(g_pItemList[item].nPos == 32) pMob[conn].MOB.Carry[ItemSlot].sIndex += 4; SendItem(conn, ITEM_PLACE_CARRY, ItemSlot, &pMob[conn].MOB.Carry[ItemSlot]); char tt[256]; sprintf(temp, "%s ", pUser[conn].AccountName); BASE_GetItemCode(&pMob[conn].MOB.Carry[ItemSlot], tt); strcat(temp, tt); ItemLog(temp, "*** Combine ht_skill_extração sucess ***", pUser[conn].IP); } else { BASE_ClearItem(&pMob[conn].MOB.Carry[ItemSlot]); SendItem(conn, ITEM_PLACE_CARRY, ItemSlot, &pMob[conn].MOB.Carry[ItemSlot]); ItemLog("*** Combine ht_skill_extração fail ***", pMob[conn].MOB.MobName, pUser[conn].IP); } }
void Exec_MSG_DropItem(int conn, char *pMsg) { MSG_DropItem *m = (MSG_DropItem*)pMsg; if (pMob[conn].MOB.CurrentScore.Hp <= 0 || pUser[conn].Mode != USER_PLAY) { AddCrackError(conn, 1, 14); SendHpMode(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 (m->GridX >= MAX_GRIDX || m->GridY >= MAX_GRIDY) { sprintf(temp, "err,wrong drop pos %d %d", m->GridX, m->GridY); Log(temp, pUser[conn].AccountName, pUser[conn].IP); return; } if (isDropItem == 0) return; int gridx = m->GridX; int gridy = m->GridY; int titem = GetEmptyItemGrid(&gridx, &gridy); m->GridX = gridx; m->GridY = gridy; if (titem == 0) { SendClientMessage(conn, g_pMessageStringTable[_NN_Cant_Drop_Here]); return; } if (m->SourType == ITEM_PLACE_EQUIP) { Log("err,dropitem - sourtype", pUser[conn].AccountName, pUser[conn].IP); return; } if (m->SourType) { if (m->SourType == ITEM_PLACE_CARRY) { if (m->SourPos < 0 || m->SourPos >= pMob[conn].MaxCarry) { Log("err,dropitem - carry equip", pUser[conn].AccountName, pUser[conn].IP); return; } } else { if (m->SourType != ITEM_PLACE_CARGO) { Log("err,dropitem - sourtype", pUser[conn].AccountName, pUser[conn].IP); return; } if (m->SourPos < 0 || m->SourPos >= MAX_CARGO) { Log("err,dropitem - sourpos cargo", pUser[conn].AccountName, pUser[conn].IP); return; } } } STRUCT_ITEM *SrcItem = GetItemPointer(&pMob[conn].MOB, pUser[conn].Cargo, m->SourType, m->SourPos); STRUCT_ITEM *BackupItem = GetItemPointer(&pMob[conn].MOB, pUser[conn].Cargo, m->SourType, m->SourPos); if (SrcItem == NULL || BackupItem == NULL) return; if (SrcItem->sIndex <= 0 || SrcItem->sIndex >= MAX_ITEMLIST) return; if (SrcItem->sIndex != 508 && SrcItem->sIndex != 509 && SrcItem->sIndex != 522 && (SrcItem->sIndex < 526 || SrcItem->sIndex > 537) && SrcItem->sIndex != 446 && SrcItem->sIndex != 747 && SrcItem->sIndex != 3993 && SrcItem->sIndex != 3994) { int drop = CreateItem(m->GridX, m->GridY, SrcItem, m->Rotate, 1); if (drop <= 0 || drop >= MAX_ITEM) { SendClientMessage(conn, "Can't create object(item)"); return; } char tmplog[2048]; BASE_GetItemCode(SrcItem, tmplog); sprintf(temp, "dropitem, %s", tmplog); ItemLog(temp, pUser[conn].AccountName, pUser[conn].IP); memset(SrcItem, 0, sizeof(STRUCT_ITEM)); MSG_CNFDropItem sm_ditem; memset(&sm_ditem, 0, sizeof(MSG_CNFDropItem)); sm_ditem.Type = _MSG_CNFDropItem; sm_ditem.Size = sizeof(MSG_CNFDropItem); sm_ditem.SourType = m->SourType; sm_ditem.SourPos = m->SourPos; sm_ditem.Rotate = m->Rotate; sm_ditem.GridX = m->GridX; sm_ditem.GridY = m->GridY; pUser[conn].cSock.SendOneMessage((char*)&sm_ditem, sizeof(MSG_CNFDropItem)); } else { SendClientMessage(conn, g_pMessageStringTable[_NN_Guild_Medal_Cant_Be_Droped]); return; } }
void CGateCore::OnClientRead(int iClientH) { char * cp, * pData, cTemp[22],cTxt[256] ; uint32_t * dwpMsgID, dwMsgSize, dwTime, * dwp ; uint16_t * wp; int i , iRet; bool bFindGameServer= false ; dwTime = timeGetTime(); pData = m_pClientList[iClientH]->m_pXSock->pGetRcvDataPointer(&dwMsgSize); dwpMsgID = (uint32_t *)(pData + DEF_INDEX4_MSGID); switch (*dwpMsgID) { case MSGID_PARTYOPERATION: PartyOperation(iClientH, pData); break; case MSGID_SERVERSTOCKMSG: // 받은 메시지를 모든 게임 서버들에게 재 전송 SendMsgToAllGameServers(iClientH, pData, dwMsgSize, false); break; case MSGID_REQUEST_GAMESERVER_SHUTDOWN: cp = (char *)(pData + DEF_INDEX2_MSGTYPE); wp = (uint16_t *)cp; if (*wp != 0x5A8E) { // 확인코드 불일치. 삭제. delete m_pClientList[iClientH]; m_pClientList[iClientH] = NULL; return; } cp += 2 ; if (memcmp(cp, "1dkld$#@01", 10 ) != 0) return ; cp += 10 ; strcpy(cTemp,cp) ; for (i = 1; i < DEF_MAXCLIENTS; i++) if ((m_pClientList[i] != NULL) && ( strcmp(m_pClientList[i]->m_cName,cTemp) == 0) && ( m_pClientList[i]->m_bIsGameServer == true)) { std::memset(cTxt, '\0', sizeof(cTxt)); dwp = (uint32_t *)(cTxt + DEF_INDEX4_MSGID); *dwp = MSGID_GAMESERVERSHUTDOWNED; wp = (uint16_t *)(cTxt + DEF_INDEX2_MSGTYPE); *wp = DEF_MSGTYPE_CONFIRM; iRet = m_pClientList[i]->m_pXSock->iSendMsg(cTxt, 6); switch (iRet) { case DEF_XSOCKEVENT_MSGSIZETOOLARGE: case DEF_XSOCKEVENT_QUENEFULL: case DEF_XSOCKEVENT_SOCKETERROR: case DEF_XSOCKEVENT_CRITICALERROR: case DEF_XSOCKEVENT_SOCKETCLOSED: // 메시지를 보낼때 에러가 발생했다면 제거한다. memcpy(cTemp,m_pClientList[i]->m_cName,20) ; delete m_pClientList[i]; m_pClientList[i] = NULL; sprintf(G_cTxt,"*** CRITICAL ERROR! Game Server(%s) connection lost!!! ***", cTemp); PutLogList(G_cTxt); // 서버 다운을 알린다. SendMsgToMonitor(MSGID_GAMESERVERDOWN, DEF_MSGTYPE_CONFIRM, cTemp); } bFindGameServer = true ; } if( bFindGameServer == false) { sprintf(cTxt,"(!) AUTO SHUTDOWN PROCESS (%s) SERVER CAN'T FIND !",cTemp) ; PutLogList(cTxt) ; } break; case MSGID_REQUEST_ALLGAMESERVER_SHUTDOWN: cp = (char *)(pData + DEF_INDEX2_MSGTYPE); wp = (uint16_t *)cp; if (*wp != 0x5A8E) { // 확인코드 불일치. 삭제. delete m_pClientList[iClientH]; m_pClientList[iClientH] = NULL; return; } cp += 2 ; if (memcmp(cp, "1dkld$#@01", 10 ) != 0) return ; PutLogList(" "); PutLogList("(!) AUTO SHUTDOWN PROCESS STARTED!"); for (i = 1; i < DEF_MAXCLIENTS; i++) if ((m_pClientList[i] != NULL) && (m_pClientList[i]->m_bIsGameServer == true)) m_pClientList[i]->m_bIsShutDown = true ; break ; case MSGID_REQUEST_ALL_SERVER_REBOOT: case MSGID_REQUEST_EXEC_1DOTBAT: case MSGID_REQUEST_EXEC_2DOTBAT: cp = (char *)(pData + DEF_INDEX2_MSGTYPE); wp = (uint16_t *)cp; if (*wp != 0x5A8E) { // 확인코드 불일치. 삭제. delete m_pClientList[iClientH]; m_pClientList[iClientH] = NULL; return; } // 받은 메시지를 그대로 모든 모니터에게 전송. SendMsgToMonitor(pData, dwMsgSize); break; case MSGID_GATEWAY_CURRENTCONN: SendMsgToMonitor(pData, dwMsgSize); break; case MSGID_MONITORALIVE: cp = (char *)(pData + DEF_INDEX2_MSGTYPE); wp = (uint16_t *)cp; if (m_cMonitorStatus[*wp] != 1) m_cMonitorStatus[*wp] = 1; else m_cMonitorStatus[*wp] = 2; #if 0 // TODO: Is this code needed? InvalidateRect(m_hWnd, NULL, true); #endif // 받은 메시지를 그대로 모든 모니터에게 전송. char cTemp[20] ; std::memset(cTemp, '\0',sizeof(cTemp)) ; sprintf(cTemp,"Total User %d",iTotalWorldServerClients) ; SendMsgToMonitor(*dwpMsgID, *wp, cTemp); break; case MSGID_ITEMLOG: // 아이템 관련 로그 ItemLog(pData); break; case MSGID_REQUEST_REGISTERGAMESERVER: // 게임서버로부터 등록 요청 RegisterGameServerHandler(iClientH, pData); break; case MSGID_GAMESERVERALIVE: // 게임서버가 살아 있음을 알리는 메시지 m_pClientList[iClientH]->m_dwAliveTime = dwTime; cp = (char *)(pData + DEF_INDEX2_MSGTYPE + 2); wp = (uint16_t *)cp; m_pClientList[iClientH]->m_iTotalClients = (int)*wp; if (m_pClientList[iClientH]->m_sIsActivated >= 0) m_pClientList[iClientH]->m_sIsActivated = 1; SendMsgToMonitor(MSGID_GAMESERVERALIVE, DEF_MSGTYPE_CONFIRM, m_pClientList[iClientH]->m_cName,m_pClientList[iClientH]->m_iTotalClients); break; } }
void Exec_MSG_CombineItemAilyn(int conn, char *pMsg) { MSG_CombineItem *m = (MSG_CombineItem*)pMsg; for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; int invPos = m->InvenPos[i]; if (invPos < 0 || invPos >= pMob[conn].MaxCarry) { RemoveTrade(conn); return; } if (memcmp(&pMob[conn].MOB.Carry[invPos], &m->Item[i], sizeof(STRUCT_ITEM))) { ItemLog("err,msg_CombineAilyn - item remove or changed.", pUser[conn].AccountName, pUser[conn].IP); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } } if (pMob[conn].MOB.Coin < 50000000) { sprintf(temp, g_pMessageStringTable[_DN_D_Cost], 50000000); SendClientMessage(conn, temp); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } int combine = GetMatchCombineAilyn(m->Item); if (combine == 0) { SendClientMessage(conn, g_pMessageStringTable[_NN_Wrong_Combination]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 0); return; } for (int i = 2; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex == 0) continue; memset(&pMob[conn].MOB.Carry[m->InvenPos[i]], 0, sizeof(STRUCT_ITEM)); SendItem(conn, ITEM_PLACE_CARRY, m->InvenPos[i], &pMob[conn].MOB.Carry[m->InvenPos[i]]); } pMob[conn].MOB.Coin -= 50000000; SendEtc(conn); ItemLog("*** Item combine ailyn. ***", pUser[conn].AccountName, pUser[conn].IP); for (int i = 0; i < MAX_COMBINE; i++) { if (m->Item[i].sIndex) { char itemlog[2048]; BASE_GetItemCode(&m->Item[i], itemlog); strcat(temp, itemlog); } } ItemLog(temp, pUser[conn].AccountName, pUser[conn].IP); ItemLog("*** ------------------- ***", pUser[conn].AccountName, pUser[conn].IP); int _rand = rand() % 115; if (_rand >= 100) _rand -= 15; int ipos1 = 0; int ipos2 = 0; if (_rand <= combine || LOCALSERVER) { if (rand() % 1 == 0) { ipos1 = m->InvenPos[0]; ipos2 = m->InvenPos[1]; } else { ipos1 = m->InvenPos[1]; ipos2 = m->InvenPos[0]; } pMob[conn].MOB.Carry[ipos1].stEffect[0].cEffect = pMob[conn].MOB.Carry[ipos2].stEffect[0].cEffect; pMob[conn].MOB.Carry[ipos1].stEffect[0].cValue = pMob[conn].MOB.Carry[ipos2].stEffect[0].cValue; pMob[conn].MOB.Carry[ipos1].stEffect[1].cEffect = pMob[conn].MOB.Carry[ipos2].stEffect[1].cEffect; pMob[conn].MOB.Carry[ipos1].stEffect[1].cValue = pMob[conn].MOB.Carry[ipos2].stEffect[1].cValue; pMob[conn].MOB.Carry[ipos1].stEffect[2].cEffect = pMob[conn].MOB.Carry[ipos2].stEffect[2].cEffect; pMob[conn].MOB.Carry[ipos1].stEffect[2].cValue = pMob[conn].MOB.Carry[ipos2].stEffect[2].cValue; BASE_SetItemSanc(&pMob[conn].MOB.Carry[ipos1], 10, m->Item[3].sIndex - 2441); memset(&pMob[conn].MOB.Carry[ipos2], 0, sizeof(STRUCT_ITEM)); SendItem(conn, ITEM_PLACE_CARRY, ipos2, &pMob[conn].MOB.Carry[ipos2]); pMob[conn].MOB.Coin -= 50000000; SendEtc(conn); SendClientMessage(conn, g_pMessageStringTable[_NN_Processing_Complete]); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 1); char tt[512]; sprintf(temp, "%s ", pUser[conn].AccountName); BASE_GetItemCode(&pMob[conn].MOB.Carry[ipos1], tt); strcat(temp, tt); ItemLog(temp, "*** Combine ailyn sucess ***", pUser[conn].IP); SendItem(conn, ITEM_PLACE_CARRY, ipos1, &pMob[conn].MOB.Carry[ipos1]); return; } else { sprintf(temp, "%s", g_pMessageStringTable[_NN_CombineFailed]); SendClientMessage(conn, temp); SendClientSignalParm(conn, ESCENE_FIELD, _MSG_CombineComplete, 2); ItemLog("*** Combine ailyn fail ***", pUser[conn].AccountName, pUser[conn].IP); return; } }