LPPARTY CPartyManager::CreateParty(LPCHARACTER pLeader) { if (pLeader->GetParty()) return pLeader->GetParty(); LPPARTY pParty = M2_NEW CParty; if (pLeader->IsPC()) { //TPacketGGParty p; //p.header = HEADER_GG_PARTY; //p.subheader = PARTY_SUBHEADER_GG_CREATE; //p.pid = pLeader->GetPlayerID(); //P2P_MANAGER::instance().Send(&p, sizeof(p)); TPacketPartyCreate p; p.dwLeaderPID = pLeader->GetPlayerID(); db_clientdesc->DBPacket(HEADER_GD_PARTY_CREATE, 0, &p, sizeof(TPacketPartyCreate)); sys_log(0, "PARTY: Create %s pid %u", pLeader->GetName(), pLeader->GetPlayerID()); pParty->SetPCParty(true); pParty->Join(pLeader->GetPlayerID()); m_set_pkPCParty.insert(pParty); } else { pParty->SetPCParty(false); pParty->Join(pLeader->GetVID()); } pParty->Link(pLeader); return (pParty); }
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()); } }
int marriage_join_wedding(lua_State* L) { if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) { sys_err("invalid player id for wedding map"); return 0; } DWORD pid1 = (DWORD) lua_tonumber(L, 1); DWORD pid2 = (DWORD) lua_tonumber(L, 2); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(pid1); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } if (pMarriage->GetOther(pid1) != pid2) { sys_err("not married %u %u", pid1, pid2); return 0; } //PREVENT_HACK if ( ch->IsHack() ) return 0; //END_PREVENT_HACK pMarriage->WarpToWeddingMap(ch->GetPlayerID()); return 0; }
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"); } }
int marriage_wedding_music(lua_State* L) { if (!lua_isboolean(L, 1)) { sys_err("invalid argument 1 : must be boolean"); return 0; } if (!lua_isstring(L, 2)) { sys_err("invalid argument 2 : must be string"); return 0; } LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } if (pMarriage->pWeddingInfo) { marriage::WeddingMap* pWedding = marriage::WeddingManager::instance().Find(pMarriage->pWeddingInfo->dwMapIndex); pWedding->SetMusic( lua_toboolean(L, 1), lua_tostring(L, 2) ); } return 0; }
void CParty::Link(LPCHARACTER pkChr) { TMemberMap::iterator it; if (pkChr->IsPC()) it = m_memberMap.find(pkChr->GetPlayerID()); else it = m_memberMap.find(pkChr->GetVID()); if (it == m_memberMap.end()) { sys_err("%s is not member of this party", pkChr->GetName()); return; } // 플레이어 파티일 경우 업데이트 이벤트 생성 if (m_bPCParty && !m_eventUpdate) { party_update_event_info* info = AllocEventInfo<party_update_event_info>(); info->pid = m_dwLeaderPID; m_eventUpdate = event_create(party_update_event, info, PASSES_PER_SEC(3)); } if (it->second.bRole == PARTY_ROLE_LEADER) m_pkChrLeader = pkChr; sys_log(2, "PARTY[%d] %s linked to party", GetLeaderPID(), pkChr->GetName()); it->second.pCharacter = pkChr; pkChr->SetParty(this); if (pkChr->IsPC()) { if (it->second.strName.empty()) { it->second.strName = pkChr->GetName(); } SendPartyJoinOneToAll(pkChr->GetPlayerID()); SendPartyJoinAllToOne(pkChr); SendPartyLinkOneToAll(pkChr); SendPartyLinkAllToOne(pkChr); SendPartyInfoAllToOne(pkChr); SendPartyInfoOneToAll(pkChr); SendParameter(pkChr); //sys_log(0, "PARTY-DUNGEON connect %p %p", this, GetDungeon()); if (GetDungeon() && GetDungeon()->GetMapIndex() == pkChr->GetMapIndex()) { pkChr->SetDungeon(GetDungeon()); } RequestSetMemberLevel(pkChr->GetPlayerID(), pkChr->GetLevel()); } }
int marriage_set_to_marriage(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } pMarriage->SetMarried(); return 0; }
int marriage_remove(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } marriage::CManager::instance().RequestRemove(ch->GetPlayerID(), pMarriage->GetOther(ch->GetPlayerID())); return 0; }
int marriage_end_wedding(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } if (pMarriage->pWeddingInfo) { // 결혼식 끝내기 요청 pMarriage->RequestEndWedding(); } return 0; }
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; }
int marriage_find_married_vid(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); DWORD vid = 0; if (pMarriage) { LPCHARACTER you = CHARACTER_MANAGER::instance().FindByPID(pMarriage->GetOther(ch->GetPlayerID())); if (you) vid = you->GetVID(); } lua_pushnumber(L, vid); return 1; }
bool CItem::IsOwnership(LPCHARACTER ch) { if (!m_pkOwnershipEvent) return true; return m_dwOwnershipPID == ch->GetPlayerID() ? true : false; }
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 IS_SPEED_HACK(LPCHARACTER ch, LPCHARACTER victim, DWORD current_time) { if (ch->m_kAttackLog.dwVID == victim->GetVID()) { if (current_time - ch->m_kAttackLog.dwTime < GET_ATTACK_SPEED(ch)) { INCREASE_SPEED_HACK_COUNT(ch); if (test_server) { sys_log(0, "%s attack hack! time (delta, limit)=(%u, %u) hack_count %d", ch->GetName(), current_time - ch->m_kAttackLog.dwTime, GET_ATTACK_SPEED(ch), ch->m_speed_hack_count); ch->ChatPacket(CHAT_TYPE_INFO, "%s attack hack! time (delta, limit)=(%u, %u) hack_count %d", ch->GetName(), current_time - ch->m_kAttackLog.dwTime, GET_ATTACK_SPEED(ch), ch->m_speed_hack_count); } SET_ATTACK_TIME(ch, victim, current_time); SET_ATTACKED_TIME(ch, victim, current_time); return true; } } SET_ATTACK_TIME(ch, victim, current_time); if (victim->m_AttackedLog.dwPID == ch->GetPlayerID()) { if (current_time - victim->m_AttackedLog.dwAttackedTime < GET_ATTACK_SPEED(ch)) { INCREASE_SPEED_HACK_COUNT(ch); if (test_server) { sys_log(0, "%s Attack Speed HACK! time (delta, limit)=(%u, %u), hack_count = %d", ch->GetName(), current_time - victim->m_AttackedLog.dwAttackedTime, GET_ATTACK_SPEED(ch), ch->m_speed_hack_count); ch->ChatPacket(CHAT_TYPE_INFO, "Attack Speed Hack(%s), (delta, limit)=(%u, %u)", ch->GetName(), current_time - victim->m_AttackedLog.dwAttackedTime, GET_ATTACK_SPEED(ch)); } SET_ATTACKED_TIME(ch, victim, current_time); return true; } } SET_ATTACKED_TIME(ch, victim, current_time); return false; }
bool COXEventManager::EnterAudience(LPCHARACTER pkChar) { DWORD pid = pkChar->GetPlayerID(); m_map_char.insert(std::make_pair(pid, pid)); return true; }
void CPVPManager::ConnectEx(LPCHARACTER pkChr, bool bDisconnect) { CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID()); if (it == m_map_pkPVPSetByID.end()) return; DWORD dwVID = bDisconnect ? 0 : pkChr->GetVID(); TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { CPVP * pkPVP = *it2++; pkPVP->SetVID(pkChr->GetPlayerID(), dwVID); } }
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 }
int marriage_warp_to_my_marriage_map(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } //PREVENT_HACK if ( ch->IsHack() ) return 0; //END_PREVENT_HACK pMarriage->WarpToWeddingMap(ch->GetPlayerID()); return 0; }
void FSetQuestFlag::operator() (LPCHARACTER ch) { if (!ch->IsPC()) return; PC * pPC = CQuestManager::instance().GetPCForce(ch->GetPlayerID()); if (pPC) pPC->SetFlag(flagname, value); }
// 리턴값: 0 = PK, 1 = PVP // PVP를 리턴하면 경험치나 아이템을 떨구고 PK면 떨구지 않는다. bool CPVPManager::Dead(LPCHARACTER pkChr, DWORD dwKillerPID) { CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID()); if (it == m_map_pkPVPSetByID.end()) return false; bool found = false; sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID()); TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { CPVP * pkPVP = *it2++; DWORD dwCompanionPID; if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID()) dwCompanionPID = pkPVP->m_players[1].dwPID; else dwCompanionPID = pkPVP->m_players[0].dwPID; if (dwCompanionPID == dwKillerPID) { if (pkPVP->IsFight()) { pkPVP->SetLastFightTime(); pkPVP->Win(dwKillerPID); found = true; break; } else if (get_dword_time() - pkPVP->GetLastFightTime() <= 15000) { found = true; break; } } } return found; }
void PC::DoQuestStateChange() { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); std::vector<TQuestStateChangeInfo> vecQuestStateChange; m_QuestStateChange.swap(vecQuestStateChange); for (DWORD i=0; i<vecQuestStateChange.size(); ++i) { const TQuestStateChangeInfo& rInfo = vecQuestStateChange[i]; if (rInfo.quest_idx == 0) continue; DWORD dwQuestIdx = rInfo.quest_idx; QuestInfoIterator it = quest_find(dwQuestIdx); const string stQuestName = CQuestManager::instance().GetQuestNameByIndex(dwQuestIdx); if (it == quest_end()) { QuestState qs; qs.st = 0; m_QuestInfo.insert(make_pair(dwQuestIdx, qs)); SetFlag(stQuestName + ".__status", 0); it = quest_find(dwQuestIdx); } sys_log(0, "QUEST change reserved Quest State Change quest %u from %d to %d (%d %d)", dwQuestIdx, rInfo.prev_state, rInfo.next_state, it->second.st, rInfo.prev_state ); assert(it->second.st == rInfo.prev_state); CQuestManager::instance().LeaveState(ch->GetPlayerID(), dwQuestIdx, rInfo.prev_state); it->second.st = rInfo.next_state; SetFlag(stQuestName + ".__status", rInfo.next_state); CQuestManager::instance().EnterState(ch->GetPlayerID(), dwQuestIdx, rInfo.next_state); if (GetFlag(stQuestName + ".__status")==rInfo.next_state) CQuestManager::instance().Letter(ch->GetPlayerID(), dwQuestIdx, rInfo.next_state); } }
int marriage_engage_to(lua_State* L) { DWORD vid = (DWORD) lua_tonumber(L, 1); LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); LPCHARACTER ch_you = CHARACTER_MANAGER::instance().Find(vid); if (ch_you) { marriage::CManager::instance().RequestAdd(ch->GetPlayerID(), ch_you->GetPlayerID(), ch->GetName(), ch_you->GetName()); } return 0; }
void SET_ATTACKED_TIME(LPCHARACTER ch, LPCHARACTER victim, DWORD current_time) { if (NULL == ch || NULL == victim) return; if (!ch->IsPC()) return; victim->m_AttackedLog.dwPID = ch->GetPlayerID(); victim->m_AttackedLog.dwAttackedTime= current_time; }
bool CPartyManager::SetParty(LPCHARACTER ch) // PC만 사용해야 한다!! { TPartyMap::iterator it = m_map_pkParty.find(ch->GetPlayerID()); if (it == m_map_pkParty.end()) return false; LPPARTY pParty = it->second; pParty->Link(ch); return true; }
int party_is_leader(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID()) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); return 1; }
int marriage_wedding_is_playing_music(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (!pMarriage) { sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName()); return 0; } if (pMarriage->pWeddingInfo) { marriage::WeddingMap* pWedding = marriage::WeddingManager::instance().Find(pMarriage->pWeddingInfo->dwMapIndex); if (pWedding) lua_pushboolean(L, pWedding->IsPlayingMusic()); else lua_pushboolean(L, false); } lua_pushboolean(L, false); return 1; }
void CPVPManager::GiveUp(LPCHARACTER pkChr, DWORD dwKillerPID) // This method is calling from no where yet. { CPVPSetMap::iterator it = m_map_pkPVPSetByID.find(pkChr->GetPlayerID()); if (it == m_map_pkPVPSetByID.end()) return; sys_log(1, "PVPManager::Dead %d", pkChr->GetPlayerID()); TR1_NS::unordered_set<CPVP*>::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { CPVP * pkPVP = *it2++; DWORD dwCompanionPID; if (pkPVP->m_players[0].dwPID == pkChr->GetPlayerID()) dwCompanionPID = pkPVP->m_players[1].dwPID; else dwCompanionPID = pkPVP->m_players[0].dwPID; if (dwCompanionPID != dwKillerPID) continue; pkPVP->SetVID(pkChr->GetPlayerID(), 0); m_map_pkPVPSetByID.erase(dwCompanionPID); it->second.erase(pkPVP); if (it->second.empty()) m_map_pkPVPSetByID.erase(it); m_map_pkPVP.erase(pkPVP->m_dwCRC); pkPVP->Packet(true); M2_DELETE(pkPVP); break; } }
bool COXEventManager::EnterAttender(LPCHARACTER pkChar) { DWORD pid = pkChar->GetPlayerID(); if (CheckIpAddress(pkChar)) { m_map_char.insert(std::make_pair(pid, pid)); m_map_attender.insert(std::make_pair(pid, pid)); return true; } return false; }
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()); }
int marriage_in_my_wedding(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); marriage::TMarriage* pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID()); if (pMarriage->pWeddingInfo) { lua_pushboolean(L, (DWORD)ch->GetMapIndex() == pMarriage->pWeddingInfo->dwMapIndex); } else { lua_pushboolean(L, 0); } return 1; }