bool DESC::Setup(LPFDWATCH _fdw, socket_t _fd, const struct sockaddr_in & c_rSockAddr, DWORD _handle, DWORD _handshake) { m_lpFdw = _fdw; m_sock = _fd; m_stHost = inet_ntoa(c_rSockAddr.sin_addr); m_wPort = c_rSockAddr.sin_port; m_dwHandle = _handle; //if (LC_IsEurope() == true || LC_IsNewCIBN()) // m_lpOutputBuffer = buffer_new(DEFAULT_PACKET_BUFFER_SIZE * 2); //else //NOTE: 이걸 나라별로 다르게 잡아야할 이유가 있나? m_lpOutputBuffer = buffer_new(DEFAULT_PACKET_BUFFER_SIZE * 2); m_iMinInputBufferLen = MAX_INPUT_LEN >> 1; m_lpInputBuffer = buffer_new(MAX_INPUT_LEN); m_SockAddr = c_rSockAddr; fdwatch_add_fd(m_lpFdw, m_sock, this, FDW_READ, false); // Ping Event desc_event_info* info = AllocEventInfo<desc_event_info>(); info->desc = this; assert(m_pkPingEvent == NULL); m_pkPingEvent = event_create(ping_event, info, ping_event_second_cycle); #ifndef _IMPROVED_PACKET_ENCRYPTION_ if (LC_IsEurope()) { thecore_memcpy(m_adwEncryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4); thecore_memcpy(m_adwDecryptionKey, "1234abcd5678efgh", sizeof(DWORD) * 4); } else { thecore_memcpy(m_adwEncryptionKey, "testtesttesttest", sizeof(DWORD) * 4); thecore_memcpy(m_adwDecryptionKey, "testtesttesttest", sizeof(DWORD) * 4); } #endif // _IMPROVED_PACKET_ENCRYPTION_ // Set Phase to handshake SetPhase(PHASE_HANDSHAKE); StartHandshake(_handshake); sys_log(0, "SYSTEM: new connection from [%s] fd: %d handshake %u output input_len %d, ptr %p", m_stHost.c_str(), m_sock, m_dwHandshake, buffer_size(m_lpInputBuffer), this); Log("SYSTEM: new connection from [%s] fd: %d handshake %u ptr %p", m_stHost.c_str(), m_sock, m_dwHandshake, this); return true; }
BYTE gm_new_get_level( const char * name, const char * host, const char* account) { if ( test_server ) return GM_IMPLEMENTOR; std::map<std::string, tGM >::iterator it = g_map_GM.find(name); if (g_map_GM.end() == it) return GM_PLAYER; // GERMAN_GM_NOT_CHECK_HOST // 독일 버전은 호스트 체크를 하지 않는다. if ( LC_IsEurope() && !LC_IsTaiwan() || LC_IsSingapore() ) { if (account) { if ( strcmp ( it->second.Info.m_szAccount, account ) != 0 ) { sys_log(0, "GM_NEW_GET_LEVEL : BAD ACCOUNT [ACCOUNT:%s/%s", it->second.Info.m_szAccount, account); return GM_PLAYER; } } sys_log(0, "GM_NEW_GET_LEVEL : FIND ACCOUNT"); return it->second.Info.m_Authority; } // END_OF_GERMAN_GM_NOT_CHECK_HOST else { if ( host ) { if ( it->second.pset_Host ) { if ( it->second.pset_Host->end() == it->second.pset_Host->find( host ) ) { sys_log(0, "GM_NEW_GET_LEVEL : BAD HOST IN HOST_LIST"); return GM_PLAYER; } } else { if ( strcmp ( it->second.Info.m_szContactIP, host ) != 0 ) { sys_log(0, "GM_NEW_GET_LEVEL : BAD HOST IN GMLIST"); return GM_PLAYER; } } } sys_log(0, "GM_NEW_GET_LEVEL : FIND HOST"); return it->second.Info.m_Authority; } return GM_PLAYER; }
void CItem::SetOwnership(LPCHARACTER ch, int iSec) { if (!ch) { if (m_pkOwnershipEvent) { event_cancel(&m_pkOwnershipEvent); m_dwOwnershipPID = 0; TPacketGCItemOwnership p; p.bHeader = HEADER_GC_ITEM_OWNERSHIP; p.dwVID = m_dwVID; p.szName[0] = '\0'; PacketAround(&p, sizeof(p)); } return; } if (m_pkOwnershipEvent) return; if (true == LC_IsEurope()) { if (iSec <= 10) iSec = 30; } m_dwOwnershipPID = ch->GetPlayerID(); item_event_info* info = AllocEventInfo<item_event_info>(); strlcpy(info->szOwnerName, ch->GetName(), sizeof(info->szOwnerName)); info->item = this; SetOwnershipEvent(event_create(ownership_event, info, PASSES_PER_SEC(iSec))); TPacketGCItemOwnership p; p.bHeader = HEADER_GC_ITEM_OWNERSHIP; p.dwVID = m_dwVID; strlcpy(p.szName, ch->GetName(), sizeof(p.szName)); PacketAround(&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 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); } } } }
/** * @version 05/06/08 Bang2ni - __get_guildid_byname 스크립트 함수 등록 */ bool CQuestManager::InitializeLua() { #if LUA_V == 503 L = lua_open(); luaopen_base(L); luaopen_table(L); luaopen_string(L); luaopen_math(L); //TEMP luaopen_io(L); luaopen_debug(L); #elif LUA_V == 523 L = luaL_newstate(); luaL_openlibs(L); //luaopen_debug(L); #else #error "lua version not found" #endif RegisterAffectFunctionTable(); RegisterBuildingFunctionTable(); RegisterDungeonFunctionTable(); RegisterGameFunctionTable(); RegisterGuildFunctionTable(); RegisterHorseFunctionTable(); #ifdef __PET_SYSTEM__ RegisterPetFunctionTable(); #endif RegisterITEMFunctionTable(); RegisterMarriageFunctionTable(); RegisterNPCFunctionTable(); RegisterPartyFunctionTable(); RegisterPCFunctionTable(); RegisterQuestFunctionTable(); RegisterTargetFunctionTable(); RegisterArenaFunctionTable(); RegisterForkedFunctionTable(); RegisterMonarchFunctionTable(); RegisterOXEventFunctionTable(); RegisterMgmtFunctionTable(); RegisterBattleArenaFunctionTable(); RegisterDanceEventFunctionTable(); RegisterDragonLairFunctionTable(); RegisterSpeedServerFunctionTable(); RegisterDragonSoulFunctionTable(); { luaL_reg member_functions[] = { { "chat", member_chat }, { "set_ready", member_set_ready }, { "clear_ready", member_clear_ready }, { NULL, NULL } }; AddLuaFunctionTable("member", member_functions); } { luaL_reg highscore_functions[] = { { "register", highscore_register }, { "show", highscore_show }, { NULL, NULL } }; AddLuaFunctionTable("highscore", highscore_functions); } { luaL_reg mob_functions[] = { { "spawn", mob_spawn }, { "spawn_group", mob_spawn_group }, { NULL, NULL } }; AddLuaFunctionTable("mob", mob_functions); } // // global namespace functions // RegisterGlobalFunctionTable(L); // LUA_INIT_ERROR_MESSAGE { char settingsFileName[256]; snprintf(settingsFileName, sizeof(settingsFileName), "%s/settings.lua", LocaleService_GetBasePath().c_str()); int settingsLoadingResult = lua_dofile(L, settingsFileName); sys_log(0, "LoadSettings(%s), returns %d", settingsFileName, settingsLoadingResult); if (settingsLoadingResult != 0) { sys_err("LOAD_SETTINS_FAILURE(%s)", settingsFileName); return false; } } { char questlibFileName[256]; snprintf(questlibFileName, sizeof(questlibFileName), "%s/questlib.lua", LocaleService_GetQuestPath().c_str()); int questlibLoadingResult = lua_dofile(L, questlibFileName); sys_log(0, "LoadQuestlib(%s), returns %d", questlibFileName, questlibLoadingResult); if (questlibLoadingResult != 0) { sys_err("LOAD_QUESTLIB_FAILURE(%s)", questlibFileName); return false; } } if (LC_IsEurope()) { char translateFileName[256]; snprintf(translateFileName, sizeof(translateFileName), "%s/translate.lua", LocaleService_GetBasePath().c_str()); int translateLoadingResult = lua_dofile(L, translateFileName); sys_log(0, "LoadTranslate(%s), returns %d", translateFileName, translateLoadingResult); if (translateLoadingResult != 0) { sys_err("LOAD_TRANSLATE_ERROR(%s)", translateFileName); return false; } } { char questLocaleFileName[256]; if (LC_IsEurope()) { snprintf(questLocaleFileName, sizeof(questLocaleFileName), "%s/locale.lua", g_stQuestDir.c_str()); } else { snprintf(questLocaleFileName, sizeof(questLocaleFileName), "%s/locale_%s.lua", g_stQuestDir.c_str(), g_stLocale.c_str()); } int questLocaleLoadingResult = lua_dofile(L, questLocaleFileName); sys_log(0, "LoadQuestLocale(%s), returns %d", questLocaleFileName, questLocaleLoadingResult); if (questLocaleLoadingResult != 0) { sys_err("LoadQuestLocale(%s) FAILURE", questLocaleFileName); return false; } } // END_OF_LUA_INIT_ERROR_MESSAGE for (itertype(g_setQuestObjectDir) it = g_setQuestObjectDir.begin(); it != g_setQuestObjectDir.end(); ++it) { const string& stQuestObjectDir = *it; char buf[PATH_MAX]; snprintf(buf, sizeof(buf), "%s/state/", stQuestObjectDir.c_str()); DIR * pdir = opendir(buf); int iQuestIdx = 0; if (pdir) { dirent * pde; while ((pde = readdir(pdir))) { if (pde->d_name[0] == '.') continue; snprintf(buf + 11, sizeof(buf) - 11, "%s", pde->d_name); RegisterQuest(pde->d_name, ++iQuestIdx); int ret = lua_dofile(L, (stQuestObjectDir + "/state/" + pde->d_name).c_str()); sys_log(0, "QUEST: loading %s, returns %d", (stQuestObjectDir + "/state/" + pde->d_name).c_str(), ret); BuildStateIndexToName(pde->d_name); } closedir(pdir); } } #if LUA_V == 503 lua_setgcthreshold(L, 0); #endif lua_newtable(L); lua_setglobal(L, "__codecache"); return true; }