void LogManager::DetailLoginLog(bool isLogin, LPCHARACTER ch) { if (NULL == ch->GetDesc()) return; if (true == isLogin) { Query("INSERT INTO loginlog2(type, is_gm, login_time, channel, account_id, pid, ip, client_version) " "VALUES('INVALID', %s, NOW(), %d, %u, %u, inet_aton('%s'), '%s')", ch->IsGM() == true ? "'Y'" : "'N'", g_bChannel, ch->GetDesc()->GetAccountTable().id, ch->GetPlayerID(), ch->GetDesc()->GetHostName(), ch->GetDesc()->GetClientVersion()); } else { Query("SET @i = (SELECT MAX(id) FROM loginlog2 WHERE account_id=%u AND pid=%u)", ch->GetDesc()->GetAccountTable().id, ch->GetPlayerID()); Query("UPDATE loginlog2 SET type='VALID', logout_time=NOW(), playtime=TIMEDIFF(logout_time,login_time) WHERE id=@i"); } }
void CParty::SendPartyInfoAllToOne(LPCHARACTER ch) { TMemberMap::iterator it; TPacketGCPartyUpdate p; for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { if (!it->second.pCharacter) { DWORD pid = it->first; memset(&p, 0, sizeof(p)); p.header = HEADER_GC_PARTY_UPDATE; p.pid = pid; p.percent_hp = 255; p.role = it->second.bRole; ch->GetDesc()->Packet(&p, sizeof(p)); continue; } it->second.pCharacter->BuildUpdatePartyPacket(p); sys_log(2, "PARTY send info %s[%d] to %s[%d]", it->second.pCharacter->GetName(), (DWORD)it->second.pCharacter->GetVID(), ch->GetName(), (DWORD)ch->GetVID()); ch->GetDesc()->Packet(&p, sizeof(p)); } }
void LogManager::HackLog(const char * c_pszHackName, LPCHARACTER ch) { if (ch->GetDesc()) { HackLog(c_pszHackName, ch->GetDesc()->GetAccountTable().login, ch->GetName(), ch->GetDesc()->GetHostName()); } }
void operator()(LPCHARACTER ch) { sys_log(0, "CINEMASEND_TRY %s", ch->GetName()); if (ch->GetDesc()) { sys_log(0, "CINEMASEND %s", ch->GetName()); ch->GetDesc()->BufferedPacket(&pack, sizeof(struct packet_script)); ch->GetDesc()->Packet(data.c_str(),data.size()); } }
void FSendPacket::operator() (LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER ch = (LPCHARACTER) ent; if (ch->GetDesc()) { ch->GetDesc()->Packet(buf.read_peek(), buf.size()); } } }
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 LogManager::CharLog(LPCHARACTER ch, DWORD dw, const char * c_pszText, const char * c_pszHint) { if (ch) CharLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(), dw, c_pszText, c_pszHint, ch->GetDesc() ? ch->GetDesc()->GetHostName() : ""); else CharLog(0, 0, 0, dw, c_pszText, c_pszHint, ""); }
bool CItem::AddToCharacter(LPCHARACTER ch, TItemPos Cell) { assert(GetSectree() == NULL); assert(m_pOwner == NULL); WORD pos = Cell.cell; BYTE window_type = Cell.window_type; if (INVENTORY == window_type) { if (m_wCell >= INVENTORY_MAX_NUM && BELT_INVENTORY_SLOT_START > m_wCell) { sys_err("CItem::AddToCharacter: cell overflow: %s to %s cell %d", m_pProto->szName, ch->GetName(), m_wCell); return false; } } else if (DRAGON_SOUL_INVENTORY == window_type) { if (m_wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM) { sys_err("CItem::AddToCharacter: cell overflow: %s to %s cell %d", m_pProto->szName, ch->GetName(), m_wCell); return false; } } if (ch->GetDesc()) m_dwLastOwnerPID = ch->GetPlayerID(); event_cancel(&m_pkDestroyEvent); ch->SetItem(TItemPos(window_type, pos), this); m_pOwner = ch; Save(); return true; }
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) { if (pkChr->IsDead() || pkVictim->IsDead()) return; CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP * pkPVP; if ((pkPVP = Find(kPVP.m_dwCRC))) { // 복수할 수 있으면 바로 싸움! if (pkPVP->Agree(pkChr->GetPlayerID())) { pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkChr->GetName()); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkVictim->GetName()); } return; } pkPVP = M2_NEW CPVP(kPVP); pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID()); pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID()); m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP)); m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP); m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP); pkPVP->Packet(); char msg[CHAT_MAX_LEN + 1]; snprintf(msg, sizeof(msg), LC_TEXT("%s님이 대결신청을 했습니다. 승낙하려면 대결동의를 하세요."), pkChr->GetName()); pkVictim->ChatPacket(CHAT_TYPE_INFO, msg); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에게 대결신청을 했습니다."), pkVictim->GetName()); // NOTIFY_PVP_MESSAGE LPDESC pkVictimDesc = pkVictim->GetDesc(); if (pkVictimDesc) { TPacketGCWhisper pack; int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1); pack.bHeader = HEADER_GC_WHISPER; pack.wSize = sizeof(TPacketGCWhisper) + len; pack.bType = WHISPER_TYPE_SYSTEM; strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom)); TEMP_BUFFER buf; buf.write(&pack, sizeof(TPacketGCWhisper)); buf.write(msg, len); pkVictimDesc->Packet(buf.read_peek(), buf.size()); } // END_OF_NOTIFY_PVP_MESSAGE }
void CParty::SendPartyJoinAllToOne(LPCHARACTER ch) { if (!ch->GetDesc()) return; TPacketGCPartyAdd p; p.header = HEADER_GC_PARTY_ADD; p.name[CHARACTER_NAME_MAX_LEN] = '\0'; for (TMemberMap::iterator it = m_memberMap.begin();it!= m_memberMap.end(); ++it) { p.pid = it->first; strlcpy(p.name, it->second.strName.c_str(), sizeof(p.name)); ch->GetDesc()->Packet(&p, sizeof(p)); } }
void LogManager::HackShieldLog(unsigned long ErrorCode, LPCHARACTER ch) { struct in_addr st_addr; #ifndef __WIN32__ if (0 == inet_aton(ch->GetDesc()->GetHostName(), &st_addr)) #else unsigned long in_address; in_address = inet_addr(ch->GetDesc()->GetHostName()); st_addr.s_addr = in_address; if (INADDR_NONE == in_address) #endif { Query( "INSERT INTO hackshield_log(time, account_id, login, pid, name, reason, ip) " "VALUES(NOW(), %u, '%s', %u, '%s', %u, 0)", ch->GetDesc()->GetAccountTable().id, ch->GetDesc()->GetAccountTable().login, ch->GetPlayerID(), ch->GetName(), ErrorCode); } else { Query( "INSERT INTO hackshield_log(time, account_id, login, pid, name, reason, ip) " "VALUES(NOW(), %u, '%s', %u, '%s', %u, inet_aton('%s'))", ch->GetDesc()->GetAccountTable().id, ch->GetDesc()->GetAccountTable().login, ch->GetPlayerID(), ch->GetName(), ErrorCode, ch->GetDesc()->GetHostName()); } }
bool COXEventManager::CheckIpAddress(LPCHARACTER ch) { for (itertype(m_map_attender) it = m_map_attender.begin(); it != m_map_attender.end(); ++it) { LPCHARACTER tch = CHARACTER_MANAGER::Instance().FindByPID(it->second); if (!tch || !tch->GetDesc()) continue; if (!strcmp(ch->GetDesc()->GetHostName(), tch->GetDesc()->GetHostName()) && ch->GetMapIndex() == tch->GetMapIndex()) { LogManager::Instance().HackLog("MULTI_IP_OX", ch); ch->GoHome(); return false; } } return true; }
void CInputProcessor::Version(LPCHARACTER ch, const char* c_pData) { if (!ch) return; TPacketCGClientVersion * p = (TPacketCGClientVersion *) c_pData; sys_log(0, "VERSION: %s %s %s", ch->GetName(), p->timestamp, p->filename); ch->GetDesc()->SetClientVersion(p->timestamp); }
void CWarMap::IncMember(LPCHARACTER ch) { if (!ch->IsPC()) return; sys_log(0, "WarMap::IncMember"); DWORD gid = 0; if (ch->GetGuild()) gid = ch->GetGuild()->GetID(); bool isWarMember = ch->GetQuestFlag("war.is_war_member") > 0 ? true : false; if (isWarMember && gid != m_TeamData[0].dwID && gid != m_TeamData[1].dwID) { ch->SetQuestFlag("war.is_war_member", 0); isWarMember = false; } if (isWarMember) { if (gid == m_TeamData[0].dwID) { m_TeamData[0].AppendMember(ch); } else if (gid == m_TeamData[1].dwID) { m_TeamData[1].AppendMember(ch); } event_cancel(&m_pkTimeoutEvent); sys_log(0, "WarMap +m %u(cur:%d, acc:%d) vs %u(cur:%d, acc:%d)", m_TeamData[0].dwID, m_TeamData[0].GetCurJointerCount(), m_TeamData[0].GetAccumulatedJoinerCount(), m_TeamData[1].dwID, m_TeamData[1].GetCurJointerCount(), m_TeamData[1].GetAccumulatedJoinerCount()); } else { ++m_iObserverCount; sys_log(0, "WarMap +o %d", m_iObserverCount); ch->SetObserverMode(true); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("관전 모드로 길드전에 참가하셨습니다.")); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("자신을 선택하시면 밖으로 나갈 수 있는 <관람 종료> 버튼이 나옵니다.")); } UpdateUserCount(); m_set_pkChr.insert(ch); LPDESC d = ch->GetDesc(); SendWarPacket(d); SendScorePacket(0, d); SendScorePacket(1, d); }
void SECTREE::Destroy() { if (!m_set_entity.empty()) { sys_err("Sectree: entity set not empty!!"); ENTITY_SET::iterator it = m_set_entity.begin(); for ( ; it != m_set_entity.end(); ++it) { LPENTITY ent = *it; if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER ch = (LPCHARACTER) ent; sys_err("Sectree: destroying character: %s is_pc %d", ch->GetName(), ch->IsPC() ? 1 : 0); if (ch->GetDesc()) DESC_MANAGER::instance().DestroyDesc(ch->GetDesc()); else M2_DESTROY_CHARACTER(ch); } else if (ent->IsType(ENTITY_ITEM)) { LPITEM item = (LPITEM) ent; sys_err("Sectree: destroying Item: %s", item->GetName()); M2_DESTROY_ITEM(item); } else sys_err("Sectree: unknown type: %d", ent->GetType()); } } m_set_entity.clear(); if (!isClone && m_pkAttribute) { M2_DELETE(m_pkAttribute); m_pkAttribute = NULL; } }
void CParty::SendPartyLinkAllToOne(LPCHARACTER ch) { if (!ch->GetDesc()) return; TMemberMap::iterator it; TPacketGCPartyLink p; p.header = HEADER_GC_PARTY_LINK; for (it = m_memberMap.begin();it!= m_memberMap.end(); ++it) { if (it->second.pCharacter) { p.vid = it->second.pCharacter->GetVID(); p.pid = it->second.pCharacter->GetPlayerID(); ch->GetDesc()->Packet(&p, sizeof(p)); } } }
void LogManager::LevelLog(LPCHARACTER pChar, unsigned int level, unsigned int playhour) { if (true == LC_IsEurope()) { DWORD aid = 0; if (NULL != pChar->GetDesc()) { aid = pChar->GetDesc()->GetAccountTable().id; } Query("REPLACE INTO levellog%s (name, level, time, account_id, pid, playtime) VALUES('%s', %u, NOW(), %u, %u, %d)", get_table_postfix(), pChar->GetName(), level, aid, pChar->GetPlayerID(), playhour); } else { Query("REPLACE INTO levellog%s (name, level, time, playtime) VALUES('%s', %u, NOW(), %d)", get_table_postfix(), pChar->GetName(), level, playhour); } }
void CParty::SendParameter(LPCHARACTER ch) { TPacketGCPartyParameter p; p.bHeader = HEADER_GC_PARTY_PARAMETER; p.bDistributeMode = m_iExpDistributionMode; LPDESC d = ch->GetDesc(); if (d) { d->Packet(&p, sizeof(TPacketGCPartyParameter)); } }
// 아이템 구입 void CShopManager::Buy(LPCHARACTER ch, BYTE pos) { if (!ch->GetShop()) return; if (!ch->GetShopOwner()) return; if (DISTANCE_APPROX(ch->GetX() - ch->GetShopOwner()->GetX(), ch->GetY() - ch->GetShopOwner()->GetY()) > 2000) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("상점과의 거리가 너무 멀어 물건을 살 수 없습니다.")); return; } CShop* pkShop = ch->GetShop(); if (!pkShop->IsPCShop()) { //if (pkShop->GetVnum() == 0) // return; //const CMob* pkMob = CMobManager::instance().Get(pkShop->GetNPCVnum()); //if (!pkMob) // return; //if (pkMob->m_table.bType != CHAR_TYPE_NPC) //{ // return; //} } else { } //PREVENT_ITEM_COPY ch->SetMyShopTime(); //END_PREVENT_ITEM_COPY int ret = pkShop->Buy(ch, pos); if (SHOP_SUBHEADER_GC_OK != ret) // 문제가 있었으면 보낸다. { TPacketGCShop pack; pack.header = HEADER_GC_SHOP; pack.subheader = ret; pack.size = sizeof(TPacketGCShop); ch->GetDesc()->Packet(&pack, sizeof(pack)); } }
CWarMap::~CWarMap() { event_cancel(&m_pkBeginEvent); event_cancel(&m_pkEndEvent); event_cancel(&m_pkTimeoutEvent); event_cancel(&m_pkResetFlagEvent); sys_log(0, "WarMap::~WarMap : map index %d", GetMapIndex()); itertype(m_set_pkChr) it = m_set_pkChr.begin(); while (it != m_set_pkChr.end()) { LPCHARACTER ch = *(it++); if (ch->GetDesc()) { sys_log(0, "WarMap::~WarMap : disconnecting %s", ch->GetName()); DESC_MANAGER::instance().DestroyDesc(ch->GetDesc()); } } m_set_pkChr.clear(); }
void DSManager::SendRefineResultPacket(LPCHARACTER ch, BYTE bSubHeader, const TItemPos& pos) { TPacketGCDragonSoulRefine pack; pack.bSubType = bSubHeader; if (pos.IsValidItemPosition()) { pack.Pos = pos; } LPDESC d = ch->GetDesc(); if (NULL == d) { return ; } else { d->Packet(&pack, sizeof(pack)); } }
void CTargetManager::DeleteTarget(DWORD dwPID, DWORD dwQuestIndex, const char * c_pszTargetName) { itertype(m_map_kListEvent) it = m_map_kListEvent.find(dwPID); if (it == m_map_kListEvent.end()) return; std::list<LPEVENT>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { LPEVENT pkEvent = *it2; TargetInfo * info = dynamic_cast<TargetInfo*>(pkEvent->info); if ( info == NULL ) { sys_err( "CTargetManager::DeleteTarget> <Factor> Null pointer" ); ++it2; continue; } if (dwQuestIndex == info->dwQuestIndex) { if (!c_pszTargetName || !strcmp(info->szTargetName, c_pszTargetName)) { if (info->bSendToClient) { // <Factor> Removed pkChr //SendTargetDeletePacket(info->pkChr->GetDesc(), info->iID); LPCHARACTER pkChr = CHARACTER_MANAGER::instance().FindByPID(info->dwPID); if (pkChr != NULL) { SendTargetDeletePacket(pkChr->GetDesc(), info->iID); } } event_cancel(&pkEvent); it2 = it->second.erase(it2); continue; } } it2++; } }
void CParty::SendPartyInfoOneToAll(LPCHARACTER ch) { if (!ch->GetDesc()) return; TMemberMap::iterator it; // Data Building TPacketGCPartyUpdate p; ch->BuildUpdatePartyPacket(p); for (it = m_memberMap.begin();it!= m_memberMap.end(); ++it) { if ((it->second.pCharacter) && (it->second.pCharacter->GetDesc())) { sys_log(2, "PARTY send info %s[%d] to %s[%d]", ch->GetName(), (DWORD)ch->GetVID(), it->second.pCharacter->GetName(), (DWORD)it->second.pCharacter->GetVID()); it->second.pCharacter->GetDesc()->Packet(&p, sizeof(p)); } } }
bool COXEventManager::GiveItemToAttender(DWORD dwItemVnum, BYTE count) { itertype(m_map_attender) iter = m_map_attender.begin(); for (; iter != m_map_attender.end(); ++iter) { LPCHARACTER pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second); if (pkChar) { pkChar->AutoGiveItem(dwItemVnum, count); LogManager::instance().ItemLog(pkChar->GetPlayerID(), 0, count, dwItemVnum, "OXEVENT_REWARD", "", pkChar->GetDesc()->GetHostName(), dwItemVnum); } } return true; }
void CParty::Update() { sys_log(1, "PARTY::Update"); LPCHARACTER l = GetLeaderCharacter(); if (!l) return; TMemberMap::iterator it; int iNearMember = 0; bool bResendAll = false; for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; it->second.bNear = false; if (!ch) continue; if (l->GetDungeon()) it->second.bNear = l->GetDungeon() == ch->GetDungeon(); else it->second.bNear = (DISTANCE_APPROX(l->GetX()-ch->GetX(), l->GetY()-ch->GetY()) < PARTY_DEFAULT_RANGE); if (it->second.bNear) { ++iNearMember; //sys_log(0,"NEAR %s", ch->GetName()); } } if (iNearMember <= 1 && !l->GetDungeon()) { for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) it->second.bNear = false; iNearMember = 0; } if (iNearMember != m_iCountNearPartyMember) { m_iCountNearPartyMember = iNearMember; bResendAll = true; } m_iLeadership = l->GetLeadershipSkillLevel(); int iNewExpBonus = ComputePartyBonusExpPercent(); m_iAttBonus = ComputePartyBonusAttackGrade(); m_iDefBonus = ComputePartyBonusDefenseGrade(); if (m_iExpBonus != iNewExpBonus) { bResendAll = true; m_iExpBonus = iNewExpBonus; } bool bLongTimeExpBonusChanged = false; // ЖДЖј °бјє ИД ГжєРЗС ЅГ°ЈАМ БціЄёй °жЗиДЎ єёіКЅєё¦ №ЮґВґЩ. if (!m_iLongTimeExpBonus && (get_dword_time() - m_dwPartyStartTime > PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS * 60 * 1000 / (g_iUseLocale?1:2))) { bLongTimeExpBonusChanged = true; m_iLongTimeExpBonus = 5; bResendAll = true; } for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; if (!ch) continue; if (bLongTimeExpBonusChanged && ch->GetDesc()) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ЖДЖјАЗ Зщµї·ВАМ іфѕЖБ® Бц±ЭєОЕН ГЯ°Ў °жЗиДЎ єёіКЅєё¦ №ЮЅАґПґЩ.")); bool bNear = it->second.bNear; ComputeRolePoint(ch, it->second.bRole, bNear); if (bNear) { if (!bResendAll) SendPartyInfoOneToAll(ch); } } // PARTY_ROLE_LIMIT_LEVEL_BUG_FIX m_anMaxRole[PARTY_ROLE_ATTACKER] = m_iLeadership >= 10 ? 1 : 0; m_anMaxRole[PARTY_ROLE_HASTE] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_TANKER] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_BUFFER] = m_iLeadership >= 25 ? 1 : 0; m_anMaxRole[PARTY_ROLE_SKILL_MASTER] = m_iLeadership >= 35 ? 1 : 0; m_anMaxRole[PARTY_ROLE_DEFENDER] = m_iLeadership >= 40 ? 1 : 0; m_anMaxRole[PARTY_ROLE_ATTACKER] += m_iLeadership >= 40 ? 1 : 0; // END_OF_PARTY_ROLE_LIMIT_LEVEL_BUG_FIX // Party Heal Update if (!m_bPartyHealReady) { if (!m_bCanUsePartyHeal && m_iLeadership >= 18) m_dwPartyHealTime = get_dword_time(); m_bCanUsePartyHeal = m_iLeadership >= 18; // ЕлјЦ·В 18 АМ»уАє ИъА» »зїлЗТ јц АЦАЅ. // ЕлјЦ·В 40АМ»уАє ЖДЖј Иъ ДрЕёАУАМ АыґЩ. DWORD PartyHealCoolTime = (m_iLeadership >= 40) ? PARTY_HEAL_COOLTIME_SHORT * 60 * 1000 : PARTY_HEAL_COOLTIME_LONG * 60 * 1000; if (m_bCanUsePartyHeal) { if (get_dword_time() > m_dwPartyHealTime + PartyHealCoolTime) { m_bPartyHealReady = true; // send heal ready if (0) // XXX DELETEME Е¬¶уАМѕрЖ® їП·бµЙ¶§±оБц if (GetLeaderCharacter()) GetLeaderCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "PartyHealReady"); } } } if (bResendAll) { for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) if (it->second.pCharacter) SendPartyInfoOneToAll(it->second.pCharacter); } }
void interpret_command(LPCHARACTER ch, const char * argument, size_t len) { if (NULL == ch) { sys_err ("NULL CHRACTER"); return ; } char cmd[128 + 1]; // buffer overflow 문제가 생기지 않도록 일부러 길이를 짧게 잡음 char new_line[256 + 1]; const char * line; int icmd; if (len == 0 || !*argument) return; double_dollar(argument, len, new_line, sizeof(new_line)); size_t cmdlen; line = first_cmd(new_line, cmd, sizeof(cmd), &cmdlen); for (icmd = 1; *cmd_info[icmd].command != '\n'; ++icmd) { if (cmd_info[icmd].command_pointer == do_cmd) { if (!strcmp(cmd_info[icmd].command, cmd)) // do_cmd는 모든 명령어를 쳐야 할 수 있다. break; } else if (!strncmp(cmd_info[icmd].command, cmd, cmdlen)) break; } if (ch->GetPosition() < cmd_info[icmd].minimum_position) { switch (ch->GetPosition()) { case POS_MOUNTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("탄 상태에서는 할 수 없습니다.")); break; case POS_DEAD: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("쓰러진 상태에서는 할 수 없습니다.")); break; case POS_SLEEPING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("꿈속에서 어떻게요?")); break; case POS_RESTING: case POS_SITTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("먼저 일어 나세요.")); break; /* case POS_FIGHTING: ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("목숨을 걸고 전투 중 입니다. 집중 하세요.")); break; */ default: sys_err("unknown position %d", ch->GetPosition()); break; } return; } if (*cmd_info[icmd].command == '\n') { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다")); return; } if (cmd_info[icmd].gm_level && cmd_info[icmd].gm_level > ch->GetGMLevel()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("그런 명령어는 없습니다")); return; } if (strncmp("phase", cmd_info[icmd].command, 5) != 0) // 히든 명령어 처리 sys_log(0, "COMMAND: %s: %s", ch->GetName(), cmd_info[icmd].command); ((*cmd_info[icmd].command_pointer) (ch, line, icmd, cmd_info[icmd].subcmd)); if (ch->GetGMLevel() >= GM_LOW_WIZARD) { if (cmd_info[icmd].gm_level >= GM_LOW_WIZARD) { if (LC_IsEurope() == true || /*LC_IsNewCIBN() == true || */LC_IsCanada() == true) { char buf[1024]; snprintf( buf, sizeof(buf), "%s", argument ); LogManager::instance().GMCommandLog(ch->GetPlayerID(), ch->GetName(), ch->GetDesc()->GetHostName(), g_bChannel, buf); } } } }
bool CShopEx::AddGuest(LPCHARACTER ch,DWORD owner_vid, bool bOtherEmpire) { if (!ch) return false; if (ch->GetExchange()) return false; if (ch->GetShop()) return false; ch->SetShop(this); m_map_guest.insert(GuestMapType::value_type(ch, bOtherEmpire)); TPacketGCShop pack; pack.header = HEADER_GC_SHOP; pack.subheader = SHOP_SUBHEADER_GC_START_EX; TPacketGCShopStartEx pack2; memset(&pack2, 0, sizeof(pack2)); pack2.owner_vid = owner_vid; pack2.shop_tab_count = m_vec_shopTabs.size(); char temp[8096]; // ГЦґл 1728 * 3 char* buf = &temp[0]; size_t size = 0; for (ShopTableExVector::const_iterator it = m_vec_shopTabs.begin(); it != m_vec_shopTabs.end(); it++) { const TShopTableEx& shop_tab = *it; TPacketGCShopStartEx::TSubPacketShopTab pack_tab; pack_tab.coin_type = shop_tab.coinType; memcpy(pack_tab.name, shop_tab.name.c_str(), SHOP_TAB_NAME_MAX); for (BYTE i = 0; i < SHOP_HOST_ITEM_MAX_NUM; i++) { pack_tab.items[i].vnum = shop_tab.items[i].vnum; pack_tab.items[i].count = shop_tab.items[i].count; switch(shop_tab.coinType) { case SHOP_COIN_TYPE_GOLD: if (bOtherEmpire) // no empire price penalty for pc shop pack_tab.items[i].price = shop_tab.items[i].price * 3; else pack_tab.items[i].price = shop_tab.items[i].price; break; case SHOP_COIN_TYPE_SECONDARY_COIN: pack_tab.items[i].price = shop_tab.items[i].price; break; } memset(pack_tab.items[i].aAttr, 0, sizeof(pack_tab.items[i].aAttr)); memset(pack_tab.items[i].alSockets, 0, sizeof(pack_tab.items[i].alSockets)); } memcpy(buf, &pack_tab, sizeof(pack_tab)); buf += sizeof(pack_tab); size += sizeof(pack_tab); } pack.size = sizeof(pack) + sizeof(pack2) + size; ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop)); ch->GetDesc()->BufferedPacket(&pack2, sizeof(TPacketGCShopStartEx)); ch->GetDesc()->Packet(temp, size); return true; }
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 CPVPManager::SendList(LPDESC d) { map<DWORD, CPVP *>::iterator it = m_map_pkPVP.begin(); DWORD dwVID = d->GetCharacter()->GetVID(); TPacketGCPVP pack; pack.bHeader = HEADER_GC_PVP; while (it != m_map_pkPVP.end()) { CPVP * pkPVP = (it++)->second; if (!pkPVP->m_players[0].dwVID || !pkPVP->m_players[1].dwVID) continue; // VID가 둘다 있을 경우에만 보낸다. if (pkPVP->IsFight()) { pack.bMode = PVP_MODE_FIGHT; pack.dwVIDSrc = pkPVP->m_players[0].dwVID; pack.dwVIDDst = pkPVP->m_players[1].dwVID; } else { pack.bMode = pkPVP->m_bRevenge ? PVP_MODE_REVENGE : PVP_MODE_AGREE; if (pkPVP->m_players[0].bAgree) { pack.dwVIDSrc = pkPVP->m_players[0].dwVID; pack.dwVIDDst = pkPVP->m_players[1].dwVID; } else { pack.dwVIDSrc = pkPVP->m_players[1].dwVID; pack.dwVIDDst = pkPVP->m_players[0].dwVID; } } d->Packet(&pack, sizeof(pack)); sys_log(1, "PVPManager::SendList %d %d", pack.dwVIDSrc, pack.dwVIDDst); if (pkPVP->m_players[0].dwVID == dwVID) { LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[1].dwVID); if (ch && ch->GetDesc()) { LPDESC d = ch->GetDesc(); d->Packet(&pack, sizeof(pack)); } } else if (pkPVP->m_players[1].dwVID == dwVID) { LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[0].dwVID); if (ch && ch->GetDesc()) { LPDESC d = ch->GetDesc(); d->Packet(&pack, sizeof(pack)); } } } }
void CParty::Update() { sys_log(1, "PARTY::Update"); LPCHARACTER l = GetLeaderCharacter(); if (!l) return; TMemberMap::iterator it; int iNearMember = 0; bool bResendAll = false; for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; it->second.bNear = false; if (!ch) continue; if (l->GetDungeon()) it->second.bNear = l->GetDungeon() == ch->GetDungeon(); else it->second.bNear = (DISTANCE_APPROX(l->GetX()-ch->GetX(), l->GetY()-ch->GetY()) < PARTY_DEFAULT_RANGE); if (it->second.bNear) { ++iNearMember; //sys_log(0,"NEAR %s", ch->GetName()); } } if (iNearMember <= 1 && !l->GetDungeon()) { for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) it->second.bNear = false; iNearMember = 0; } if (iNearMember != m_iCountNearPartyMember) { m_iCountNearPartyMember = iNearMember; bResendAll = true; } m_iLeadership = l->GetLeadershipSkillLevel(); int iNewExpBonus = ComputePartyBonusExpPercent(); m_iAttBonus = ComputePartyBonusAttackGrade(); m_iDefBonus = ComputePartyBonusDefenseGrade(); if (m_iExpBonus != iNewExpBonus) { bResendAll = true; m_iExpBonus = iNewExpBonus; } bool bLongTimeExpBonusChanged = false; // 파티 결성 후 충분한 시간이 지나면 경험치 보너스를 받는다. if (!m_iLongTimeExpBonus && (get_dword_time() - m_dwPartyStartTime > PARTY_ENOUGH_MINUTE_FOR_EXP_BONUS * 60 * 1000 / (g_iUseLocale?1:2))) { bLongTimeExpBonusChanged = true; m_iLongTimeExpBonus = 5; bResendAll = true; } for (it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { LPCHARACTER ch = it->second.pCharacter; if (!ch) continue; if (bLongTimeExpBonusChanged && ch->GetDesc()) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("파티의 협동력이 높아져 지금부터 추가 경험치 보너스를 받습니다.")); bool bNear = it->second.bNear; ComputeRolePoint(ch, it->second.bRole, bNear); if (bNear) { if (!bResendAll) SendPartyInfoOneToAll(ch); } } // PARTY_ROLE_LIMIT_LEVEL_BUG_FIX m_anMaxRole[PARTY_ROLE_ATTACKER] = m_iLeadership >= 10 ? 1 : 0; m_anMaxRole[PARTY_ROLE_HASTE] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_TANKER] = m_iLeadership >= 20 ? 1 : 0; m_anMaxRole[PARTY_ROLE_BUFFER] = m_iLeadership >= 25 ? 1 : 0; m_anMaxRole[PARTY_ROLE_SKILL_MASTER] = m_iLeadership >= 35 ? 1 : 0; m_anMaxRole[PARTY_ROLE_DEFENDER] = m_iLeadership >= 40 ? 1 : 0; m_anMaxRole[PARTY_ROLE_ATTACKER] += m_iLeadership >= 40 ? 1 : 0; // END_OF_PARTY_ROLE_LIMIT_LEVEL_BUG_FIX // Party Heal Update if (!m_bPartyHealReady) { if (!m_bCanUsePartyHeal && m_iLeadership >= 18) m_dwPartyHealTime = get_dword_time(); m_bCanUsePartyHeal = m_iLeadership >= 18; // 통솔력 18 이상은 힐을 사용할 수 있음. // 통솔력 40이상은 파티 힐 쿨타임이 적다. DWORD PartyHealCoolTime = (m_iLeadership >= 40) ? PARTY_HEAL_COOLTIME_SHORT * 60 * 1000 : PARTY_HEAL_COOLTIME_LONG * 60 * 1000; if (m_bCanUsePartyHeal) { if (get_dword_time() > m_dwPartyHealTime + PartyHealCoolTime) { m_bPartyHealReady = true; // send heal ready if (0) // XXX DELETEME 클라이언트 완료될때까지 if (GetLeaderCharacter()) GetLeaderCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "PartyHealReady"); } } } if (bResendAll) { for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) if (it->second.pCharacter) SendPartyInfoOneToAll(it->second.pCharacter); } }