-
Posts
252 -
Joined
-
Last visited
-
Days Won
2 -
Feedback
100%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by Draveniou1
-
-
2 hours ago, Helia01 said:
I haven't laughed like that in a long time
We are trying to find the key
The key cannot be found
you can find me the key and then come laugh
we have already tested on big server before publishing here
-
2
-
-
4 minutes ago, LethalStrikeR said:
#ifndef __INC_METIN2_COMMON_DEFINES_H__ #define __INC_METIN2_COMMON_DEFINES_H__ enum eCommonDefines { MAP_ALLOW_LIMIT = 64, // 32 default }; #define ENABLE_PLAYER_PER_ACCOUNT5 #define ENABLE_PORT_SECURITY #define __WJ_SHOW_MOB_INFO__ #define __SEND_TARGET_INFO__ #define __SPECIAL_STORAGE__ #define __7AND8TH_SKILLS__ #define __TITLE_SYSTEM__ #define __TIMER_ELIXIR__ #define __SASH_SYSTEM__ #define __MULTI_SHOP__ #define __CHANGE_SEX_WR__ #define __REFINE_SYSTEM__ #define __CHANGELOOK_SYSTEM__ #define __CHANGELOOK_EXTEND__ #define __EXTENDED_ITEM_NAME__ #define __EXPANDED_BOOK_NAME__ #define __WEAPON_COSTUME_SYSTEM__ #define __COSTUME_ATTR_SYSTEM__ #define __COSTUME_RING_SYSTEM__ #define __SEQUENCE_SYSTEM__ #define __SHOW_CHEST_DROP__ #define __ATTENDANCE_EVENT__ #define __ENABLE_BATTLE_FIELD__ #define __VIEW_TARGET_PLAYER_HP__ #define __VIEW_TARGET_DECIMAL_HP__ #ifndef ENABLE_ANNOUNCEMENT_REFINE_SUCCES #define ENABLE_ANNOUNCEMENT_REFINE_SUCCES #define ENABLE_ANNOUNCEMENT_REFINE_SUCCES_MIN_LEVEL 9 #endif #define ENABLE_NEW_QUICK_SLOT_SYSTEM #define WJ_ENABLE_PICKUP_ITEM_EFFECT #define WJ_ENABLE_TRADABLE_ICON #define ENABLE_CHANGE_CHANNEL #define ENABLE_ANTIEXP_RENEWAL #define ENABLE_SORT_INVENTORY #define ENABLE_CUBE_RENEWAL #define ENABLE_DICE_SYSTEM #define ENABLE_GLOBAL_CHAT #define ENABLE_FISH_EVENT #define ENABLE_NEWSTUFF #define ENABLE_PET_SLOT #define NEW_PET_SYSTEM #define NEW_PET_SUMMON #define ENABLE_MOUNT_COSTUME_SYSTEM #define ENABLE_SUPPORT_SYSTEM #define ENABLE_AGGREGATE_MONSTER_EFFECT #define ENABLE_FAST_SKILL_CHOOSE /* SYSTEME PENTRU ADMINISTRARE*/ #define __WHISPER_ADMIN__ #define __ADMIN_MANAGER__ /* OFFLINE SHOPS */ #define OFFLINE_SHOP // Offline shops system #define GIFT_SYSTEM // gift system enable #define FULL_YANG // Enable support for yang type long long #define SHOP_TIME_REFRESH 1*60 // time for cycle checking older shops #define SHOP_BLOCK_GAME99 //Blocking create shops on channel 99 //#define SHOP_DISTANCE // Show shops in pos distance like WoM2 #define SHOP_AUTO_CLOSE //Enable auto closing shop after sell last item //#define SHOP_ONLY_ALLOWED_INDEX //Enable limiting for other map index which is not defined in player.shop_limit //#define SHOP_HIDE_NAME // Enable hidding shop npc names like "Player's shop" #define SHOP_GM_PRIVILEGES GM_IMPLEMENTOR //Minimum GM privileges to using Shop GM Panel #define ENABLE_OFFLINE_SHOP_HIDE #define SHOP_SEARCH #define SHOP_SEARCH_PRICE_MIN //Price in gui is a minimum eq. price >= item_price if is commented price in gui is a maximum /* END OFFLINE SHOPS */ /* SYSTEME TEMNITE */ #define __VERSION_162__ #ifdef __VERSION_162__ #define HEALING_SKILL_VNUM 265 #endif #define __DUNGEON_FOR_GUILD__ #ifdef __DUNGEON_FOR_GUILD__ #define __MELEY_LAIR_DUNGEON__ #ifdef __MELEY_LAIR_DUNGEON__ #define __DESTROY_INFINITE_STATUES_GM__ #define __LASER_EFFECT_ON_75HP__ #define __LASER_EFFECT_ON_50HP__ #endif #endif /* END SYSTEME TEMNITE */ // #define ENABLE_GEM_SYSTEM // #define __SKILLS_LEVEL_OVER_P__ // #define WJ_GUILD_LEADER_SYSTEM #endif
It's already deactivated. I've enclosed all gems that don't have #if def in #if def. There were 95 gayas in one account, I'll try to delete it and deactivate it again.
You must delete from player.MYD navicat in player.player
player.player and check and account.account
-
1 minute ago, LethalStrikeR said:
Unfortunately it still gave the same error.
SYSERR: Jan 29 21:03:31 :: DirectQuery: AsyncSQL::DirectQuery : mysql_query error: Column count doesn't match value count at row 1 query: INSERT INTO player (id, account_id, name, level, st, ht, dx, iq, job, voice, dir, x, y, z, hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, part_sash, gold, battle_points, playtime, skill_level, fish_slots, quickslot) VALUES(0, 1, '12312323', 1, 6, 4, 3, 3, 0, 0, 0, 957317, 255360, 0, 760, 260, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 681656320, 0, '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 SYSERR: Jan 29 21:03:31 :: __QUERY_PLAYER_CREATE: QUERY_ERROR: UPDATE player_index SET pid4=0 WHERE id=1
Open notepad++ search for gaya and that it is not in #ifdef can removed
Also see the player.MYD if you have gaya and delete
for 100% solve @LethalStrikeR
Download gaya system and check up and removed
-
2 minutes ago, LethalStrikeR said:
ClientManagerPlayer.cpp: In member function 'void CClientManager::__QUERY_PLAYER_CREATE(CPeer*, DWORD, TPlayerCreatePacket*)': ClientManagerPlayer.cpp:1025:4: error: expected ')' before 'GetTablePostfix' GetTablePostfix(), ^ compiling ItemIDRangeManager.cpp compiling ClientManagerHorseName.cpp gmake: *** [Makefile:69: .obj/ClientManagerPlayer.o] Error 1 gmake: *** Waiting for unfinished jobs.... root@ogstudio:/usr/vlad/Files/db/src #
void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerCreatePacket* packet) { char queryStr[QUERY_MAX_LEN]; int queryLen; int player_id; // ? ??? X? ?? ??? ??? ? ? ??. time_by_id_map_t::iterator it = s_createTimeByAccountID.find(packet->account_id); if (it != s_createTimeByAccountID.end()) { time_t curtime = time(0); if (curtime - it->second < 30) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } } queryLen = snprintf(queryStr, sizeof(queryStr), "SELECT pid%u FROM player_index%s WHERE id=%d", packet->account_index + 1, GetTablePostfix(), packet->account_id); std::unique_ptr<SQLMsg> pMsg0(CDBManager::instance().DirectQuery(queryStr)); if (pMsg0->Get()->uiNumRows != 0) { if (!pMsg0->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg0->Get()->pSQLResult); DWORD dwPID = 0; str_to_number(dwPID, row[0]); if (row[0] && dwPID > 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } if (g_stLocale == "sjis") snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s' collate sjis_japanese_ci", GetTablePostfix(), packet->player_table.name); else snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s'", GetTablePostfix(), packet->player_table.name); std::unique_ptr<SQLMsg> pMsg1(CDBManager::instance().DirectQuery(queryStr)); if (pMsg1->Get()->uiNumRows) { if (!pMsg1->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult); if (*row[0] != '0') { sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, " "part_main, part_hair, part_sash, gold, " #ifdef __ENABLE_BATTLE_FIELD__ "battle_points, " #endif "playtime, skill_level, " #ifdef ENABLE_FISH_EVENT "fish_slots, " #endif "quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " // id, account_id, name, level, st, ht, dx, iq, "%d, %d, %d, %d, %d, %d, " // job, voice, dir, x, y, z, "%d, %d, %d, %d, %d, %d, %d, " // hp, mp, random_hp, random_sp, stat_point, stamina, part_base, "0, 0, 0, %lld, " // part_main, part_hair, part_sash, gold, #ifdef __ENABLE_BATTLE_FIELD__ "%d, " #endif "0, " "%d, " #ifdef ENABLE_FISH_EVENT "%d, " #endif "0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold #ifdef __ENABLE_BATTLE_FIELD__ ,packet->player_table.battlePoint #endif ); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); static char text[4096 + 1]; CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text); std::unique_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr)); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); if (pMsg2->Get()->uiAffectedRows <= 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows); return; } player_id = pMsg2->Get()->uiInsertID; snprintf(queryStr, sizeof(queryStr), "UPDATE player_index%s SET pid%d=%d WHERE id=%d", GetTablePostfix(), packet->account_index + 1, player_id, packet->account_id); std::unique_ptr<SQLMsg> pMsg3(CDBManager::instance().DirectQuery(queryStr)); if (pMsg3->Get()->uiAffectedRows <= 0) { sys_err("QUERY_ERROR: %s", queryStr); snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id); CDBManager::instance().DirectQuery(queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } TPacketDGCreateSuccess pack; memset(&pack, 0, sizeof(pack)); pack.bAccountCharacterIndex = packet->account_index; pack.player.dwID = player_id; strlcpy(pack.player.szName, packet->player_table.name, sizeof(pack.player.szName)); pack.player.byJob = packet->player_table.job; pack.player.byLevel = 1; pack.player.dwPlayMinutes = 0; pack.player.byST = packet->player_table.st; pack.player.byHT = packet->player_table.ht; pack.player.byDX = packet->player_table.dx; pack.player.byIQ = packet->player_table.iq; pack.player.wMainPart = packet->player_table.part_base; pack.player.x = packet->player_table.x; pack.player.y = packet->player_table.y; peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess)); peer->Encode(&pack, sizeof(TPacketDGCreateSuccess)); sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob); s_createTimeByAccountID[packet->account_id] = time(0); }
solver @LethalStrikeR
-
void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerCreatePacket* packet) { char queryStr[QUERY_MAX_LEN]; int queryLen; int player_id; // ? ??? X? ?? ??? ??? ? ? ??. time_by_id_map_t::iterator it = s_createTimeByAccountID.find(packet->account_id); if (it != s_createTimeByAccountID.end()) { time_t curtime = time(0); if (curtime - it->second < 30) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } } queryLen = snprintf(queryStr, sizeof(queryStr), "SELECT pid%u FROM player_index%s WHERE id=%d", packet->account_index + 1, GetTablePostfix(), packet->account_id); std::unique_ptr<SQLMsg> pMsg0(CDBManager::instance().DirectQuery(queryStr)); if (pMsg0->Get()->uiNumRows != 0) { if (!pMsg0->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg0->Get()->pSQLResult); DWORD dwPID = 0; str_to_number(dwPID, row[0]); if (row[0] && dwPID > 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } if (g_stLocale == "sjis") snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s' collate sjis_japanese_ci", GetTablePostfix(), packet->player_table.name); else snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s'", GetTablePostfix(), packet->player_table.name); std::unique_ptr<SQLMsg> pMsg1(CDBManager::instance().DirectQuery(queryStr)); if (pMsg1->Get()->uiNumRows) { if (!pMsg1->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult); if (*row[0] != '0') { sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, " "part_main, part_hair, part_sash, gold, " #ifdef __ENABLE_BATTLE_FIELD__ "battle_points, " #endif "playtime, skill_level, " #ifdef ENABLE_FISH_EVENT "fish_slots, " #endif "quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " // id, account_id, name, level, st, ht, dx, iq, "%d, %d, %d, %d, %d, %d, " // job, voice, dir, x, y, z, "%d, %d, %d, %d, %d, %d, %d, " // hp, mp, random_hp, random_sp, stat_point, stamina, part_base, "0, 0, 0, %lld, " // part_main, part_hair, part_sash, gold, #ifdef __ENABLE_BATTLE_FIELD__ "%d, " #endif "0, " "%d, " #ifdef ENABLE_FISH_EVENT "%d, " #endif "0, " GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold #ifdef __ENABLE_BATTLE_FIELD__ ,packet->player_table.battlePoint #endif ); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); static char text[4096 + 1]; CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text); std::unique_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr)); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); if (pMsg2->Get()->uiAffectedRows <= 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows); return; } player_id = pMsg2->Get()->uiInsertID; snprintf(queryStr, sizeof(queryStr), "UPDATE player_index%s SET pid%d=%d WHERE id=%d", GetTablePostfix(), packet->account_index + 1, player_id, packet->account_id); std::unique_ptr<SQLMsg> pMsg3(CDBManager::instance().DirectQuery(queryStr)); if (pMsg3->Get()->uiAffectedRows <= 0) { sys_err("QUERY_ERROR: %s", queryStr); snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id); CDBManager::instance().DirectQuery(queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } TPacketDGCreateSuccess pack; memset(&pack, 0, sizeof(pack)); pack.bAccountCharacterIndex = packet->account_index; pack.player.dwID = player_id; strlcpy(pack.player.szName, packet->player_table.name, sizeof(pack.player.szName)); pack.player.byJob = packet->player_table.job; pack.player.byLevel = 1; pack.player.dwPlayMinutes = 0; pack.player.byST = packet->player_table.st; pack.player.byHT = packet->player_table.ht; pack.player.byDX = packet->player_table.dx; pack.player.byIQ = packet->player_table.iq; pack.player.wMainPart = packet->player_table.part_base; pack.player.x = packet->player_table.x; pack.player.y = packet->player_table.y; peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess)); peer->Encode(&pack, sizeof(TPacketDGCreateSuccess)); sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob); s_createTimeByAccountID[packet->account_id] = time(0); }
All ready
-
6 minutes ago, LethalStrikeR said:
void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerCreatePacket* packet) { char queryStr[QUERY_MAX_LEN]; int queryLen; int player_id; // 한 계정에 X초 내로 캐릭터 생성을 할 수 없다. time_by_id_map_t::iterator it = s_createTimeByAccountID.find(packet->account_id); if (it != s_createTimeByAccountID.end()) { time_t curtime = time(0); if (curtime - it->second < 30) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } } queryLen = snprintf(queryStr, sizeof(queryStr), "SELECT pid%u FROM player_index%s WHERE id=%d", packet->account_index + 1, GetTablePostfix(), packet->account_id); std::unique_ptr<SQLMsg> pMsg0(CDBManager::instance().DirectQuery(queryStr)); if (pMsg0->Get()->uiNumRows != 0) { if (!pMsg0->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg0->Get()->pSQLResult); DWORD dwPID = 0; str_to_number(dwPID, row[0]); if (row[0] && dwPID > 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } if (g_stLocale == "sjis") snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s' collate sjis_japanese_ci", GetTablePostfix(), packet->player_table.name); else snprintf(queryStr, sizeof(queryStr), "SELECT COUNT(*) as count FROM player%s WHERE name='%s'", GetTablePostfix(), packet->player_table.name); std::unique_ptr<SQLMsg> pMsg1(CDBManager::instance().DirectQuery(queryStr)); if (pMsg1->Get()->uiNumRows) { if (!pMsg1->Get()->pSQLResult) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } MYSQL_ROW row = mysql_fetch_row(pMsg1->Get()->pSQLResult); if (*row[0] != '0') { sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); return; } } else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, " "part_main, part_hair, part_sash, gold, " #ifdef ENABLE_GEM_SYSTEM "gem, " #endif #ifdef __ENABLE_BATTLE_FIELD__ "battle_points, " #endif "playtime, skill_level, " #ifdef ENABLE_FISH_EVENT "fish_slots, " #endif #ifdef ENABLE_GEM_SYSTEM "gem_items, " #endif "quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " // id, account_id, name, level, st, ht, dx, iq, "%d, %d, %d, %d, %d, %d, " // job, voice, dir, x, y, z, "%d, %d, %d, %d, %d, %d, %d, " // hp, mp, random_hp, random_sp, stat_point, stamina, part_base, "0, 0, 0, %lld, " // part_main, part_hair, part_sash, gold, #ifdef ENABLE_GEM_SYSTEM "%d, " #endif #ifdef __ENABLE_BATTLE_FIELD__ "%d, " #endif "0, ", // playtime GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold #ifdef ENABLE_GEM_SYSTEM ,packet->player_table.gem #endif #ifdef __ENABLE_BATTLE_FIELD__ ,packet->player_table.battlePoint #endif ); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); static char text[4096 + 1]; CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); #ifdef ENABLE_GEM_SYSTEM CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text); CDBManager::instance().EscapeString(text, packet->player_table.fishSlots, sizeof(packet->player_table.fishSlots)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text); CDBManager::instance().EscapeString(text, packet->player_table.gemItems, sizeof(packet->player_table.gemItems)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text); #else CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot)); queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text); #endif std::unique_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr)); if (g_test_server) sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text); if (pMsg2->Get()->uiAffectedRows <= 0) { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0); sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows); return; } player_id = pMsg2->Get()->uiInsertID; snprintf(queryStr, sizeof(queryStr), "UPDATE player_index%s SET pid%d=%d WHERE id=%d", GetTablePostfix(), packet->account_index + 1, player_id, packet->account_id); std::unique_ptr<SQLMsg> pMsg3(CDBManager::instance().DirectQuery(queryStr)); if (pMsg3->Get()->uiAffectedRows <= 0) { sys_err("QUERY_ERROR: %s", queryStr); snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id); CDBManager::instance().DirectQuery(queryStr); peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } TPacketDGCreateSuccess pack; memset(&pack, 0, sizeof(pack)); pack.bAccountCharacterIndex = packet->account_index; pack.player.dwID = player_id; strlcpy(pack.player.szName, packet->player_table.name, sizeof(pack.player.szName)); pack.player.byJob = packet->player_table.job; pack.player.byLevel = 1; pack.player.dwPlayMinutes = 0; pack.player.byST = packet->player_table.st; pack.player.byHT = packet->player_table.ht; pack.player.byDX = packet->player_table.dx; pack.player.byIQ = packet->player_table.iq; pack.player.wMainPart = packet->player_table.part_base; pack.player.x = packet->player_table.x; pack.player.y = packet->player_table.y; peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess)); peer->Encode(&pack, sizeof(TPacketDGCreateSuccess)); sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob); s_createTimeByAccountID[packet->account_id] = time(0); }
It's already set like this
send me and old void CClientManager::__QUERY_PLAYER_CREATE(
-
ClientManangerPlayer.cpp
"INSERT INTO player " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, part_sash, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, 0, %d, 0, ", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold
Check
"VALUES(0, %u, '%s', %d, %d, %d, %d, %d, "
"%d, %d, %d, %d, %d, %d, %d, "
"%d, %d, %d, %d, %d, %d, %d, 0, 0, %d, 0, ",and remove %d, or , 0
See from buck up where gaya was
send me your
"INSERT INTO player " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, part_sash, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, 0, %d, 0, ", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold
send me your this
-
1
-
-
14 minutes ago, PetePeter said:
So you remove _improved_packet_encryption_ which include sequence system already just to make a new one from scratch ? What's the benefit of that instead of use packet encryption ?
Because there are many problems with normal locking there are several problems
11 minutes ago, Mali said:he is a troll, just look his old messages
They were tested before I post it where exactly did you see the troll? I see big differences in client locking
-
4
-
1
-
-
1 hour ago, Mafuyu said:
shouldnt it be enough if you have clientversion implemented, to use this in input_main:
case HEADER_CG_MOVE: Move(ch, c_pData); if (g_bCheckClientVersion) { if (0 != g_stClientVersion.compare(d->GetClientVersion())) // @fixme103 (version > date) { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("clientversion wrong!")); d->DelayedDisconnect(1); // @fixme103 (10); } } break;
? let them login with a different client, as soon as they tried to move ingame, they get kicked
No
Can the person find the game version
I don't recommend it -> g_bCheckClientVersion
Better is what I made so there are no bypass
0xf2, 0x42, 0x8a, 0xa1, 0x29, 0x7e, 0xfa, 0xd9, 0x19, 0xbc, 0xe5, 0x4c, 0x63, 0xf0, 0x94, 0x33, 0xf1, 0x37, 0x47, 0xf9, 0xc9, 0x43, 0x78, 0x2b, 0x9b, 0x2a, 0x48, 0x2, 0x35, 0x34, 0xa5, 0x56, 0xc1, 0x7b, 0x8, 0x9c, 0x38 ...........................
So far we have not been able to find the sequence key .... The key cannot be found
-----------------
-----------
-------
Version find key
https://metin2.download/picture/2Vgo40xLqUGXkEa1HTi9bx5kad4JixZW/.png
-
1
-
1
-
-
Hello friends.
When I had removed the sequence/pong some players had connection with different metin2client.exe
now players can't log in from different clients and problems occur
my problems are solved
thank you
we have done a test before the post is made
--------------------------------
From 512 you can make 2048 with few changes to the code
I suggest 512 and not 2048 he cannot break the key
Players cannot connect to a different client or find the key
--------------------------------
OPEN SERVER/CLIENT service.h/locale_inc.h ADD: #define BLOCK_LOGIN_FROM_ANOTHER_CLIENT #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT #define NEW_PROTECT_KEYS 480 + 32 #endif OPEN PACKET client/server SEARCH: command_login3 ADD: #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT char blockclient[NEW_PROTECT_KEYS]; #endif OPEN server INPUT_AUTH.cpp SEARCH: bool Login_IsInChannelService(const char* c_login) ADD AFTER: #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT extern const char block_client[NEW_PROTECT_KEYS]; const char block_client[NEW_PROTECT_KEYS] = { 0xf2, 0x42, 0x8a, 0xa1, 0x29, 0x7e, 0xfa, 0xd9, 0x19, 0xbc, 0xe5, 0x4c, 0x63, 0xf0, 0x94, 0x33, 0xf1, 0x37, 0x47, 0xf9, 0xc9, 0x43, 0x78, 0x2b, 0x9b, 0x2a, 0x48, 0x2, 0x35, 0x34, 0xa5, 0x56, 0xc1, 0x7b, 0x8, 0x9c, 0x38, 0x72, 0xc8, 0x99, 0x3f, 0x1c, 0xd7, 0x22, 0x66, 0xad, 0x40, 0x48, 0x76, 0xd1, 0x5e, 0xf, 0x77, 0x9, 0x1b, 0x52, 0xfb, 0x7e, 0xaf, 0x59, 0xdb, 0x59, 0x95, 0x5c, 0x18, 0x44, 0xd0, 0xde, 0x5e, 0xdb, 0x86, 0x7f, 0xb7, 0x1c, 0xf2, 0x3a, 0xd2, 0x67, 0x32, 0x75, 0x80, 0x1b, 0x8e, 0xd1, 0x9, 0xc9, 0xd6, 0x44, 0x2e, 0x5d, 0x47, 0x47, 0xf9, 0xd, 0xbf, 0xa9, 0xc3, 0x8e, 0xc2, 0x2b, 0x69, 0x10, 0x29, 0x57, 0xb7, 0xaa, 0xb, 0x4c, 0x29, 0x7, 0xb1, 0x5f, 0x99, 0xfd, 0x7b, 0x4, 0xc5, 0x44, 0xe6, 0xd4, 0xa7, 0x71, 0x12, 0x5a, 0x11, 0xc5, 0xa2, 0x3d, 0x11, 0x3e, 0x44, 0x2f, 0x3e, 0x98, 0x96, 0xab, 0x12, 0x14, 0xf0, 0x5c, 0xa6, 0xb, 0xa6, 0x0, 0x26, 0x1, 0x87, 0x67, 0xf3, 0x78, 0xc9, 0xd2, 0x9b, 0xd2, 0xd4, 0x17, 0x7d, 0xc3, 0xaa, 0x78, 0x8a, 0xf1, 0xf4, 0x80, 0xfd, 0x31, 0x6f, 0xb5, 0xa4, 0x61, 0x2d, 0x75, 0x30, 0xa5, 0x4d, 0x69, 0xfd, 0xfc, 0x3f, 0x68, 0x9b, 0x87, 0xb6, 0xa5, 0x7b, 0x7, 0x2, 0x4d, 0x65, 0xb1, 0x8d, 0xa1, 0x68, 0x6e, 0xd1, 0x64, 0x23, 0x3, 0x39, 0x76, 0x9f, 0xbb, 0x6b, 0x5f, 0xc4, 0x92, 0x60, 0x4a, 0x3, 0x7e, 0xe3, 0x8d, 0x19, 0xb2, 0x9d, 0x76, 0x2a, 0xf, 0x8f, 0x82, 0x1c, 0xba, 0x3a, 0xbc, 0x74, 0x97, 0xd1, 0x72, 0xa8, 0x5b, 0x6b, 0x58, 0x36, 0xb6, 0xa9, 0xe0, 0x8f, 0x3e, 0xf2, 0x65, 0x22, 0xd2, 0x31, 0x10, 0x1, 0xfd, 0xcf, 0x0, 0x4, 0xc2, 0xb6, 0x5, 0xfa, 0x58, 0xb6, 0xd4, 0xa1, 0xaf, 0xc0, 0xe8, 0xe3, 0xaa, 0xcb, 0x83, 0x3e, 0x2e, 0xa, 0x48, 0xc8, 0xcf, 0xf5, 0x1, 0x2c, 0x2e, 0x7e, 0x7b, 0x30, 0xb9, 0x67, 0xe9, 0xa, 0xeb, 0x1c, 0x92, 0x74, 0x72, 0xf3, 0x46, 0x4d, 0xe6, 0xb3, 0x74, 0x34, 0x19, 0x59, 0x4e, 0x45, 0x6f, 0xa6, 0xfd, 0x6d, 0xf5, 0x8, 0x3f, 0xaf, 0xf2, 0xa6, 0xed, 0xfc, 0x1c, 0x15, 0xb3, 0xdd, 0x4b, 0x95, 0x23, 0x58, 0x6c, 0xec, 0x1f, 0x20, 0xbc, 0x80, 0x22, 0x90, 0xbc, 0x8f, 0x68, 0x11, 0x90, 0x7c, 0x5b, 0xfb, 0x7f, 0x49, 0x7d, 0x15, 0xad, 0x6a, 0xe5, 0x5d, 0xa8, 0x52, 0x15, 0x33, 0xa0, 0x96, 0x55, 0x2d, 0x60, 0x8e, 0xa7, 0x11, 0x33, 0x31, 0x57, 0xb8, 0x23, 0x4d, 0x9d, 0xb2, 0xc2, 0xa, 0x4e, 0xa4, 0x25, 0xec, 0xba, 0xa8, 0xa6, 0xc, 0xa3, 0xbd, 0x44, 0x66, 0x9e, 0xec, 0x9c, 0xf2, 0xa1, 0x74, 0x36, 0xf3, 0x21, 0xd2, 0xe2, 0x53, 0xd3, 0x66, 0x4c, 0x85, 0x6a, 0xcf, 0x4d, 0xf4, 0x44, 0x91, 0x56, 0x31, 0x3, 0x6e, 0xb1, 0x4e, 0x4c, 0xa4, 0x84, 0x92, 0xa6, 0x35, 0x71, 0x69, 0xc4, 0x37, 0xf2, 0x87, 0x40, 0x84, 0x44, 0x1a, 0xc9, 0x84, 0xf0, 0x1a, 0x1a, 0xca, 0x2a, 0xbc, 0x77, 0x97, 0x3, 0x75, 0x6a, 0xd6, 0xd1, 0xde, 0x67, 0x1c, 0xbf, 0x9b, 0xc7, 0x1c, 0xf6, 0xcd, 0xfa, 0x20, 0x5d, 0xd9, 0xe2, 0xd2, 0x75, 0x21, 0xc7, 0xde, 0x5c, 0x50, 0x5c, 0x7, 0x17, 0xe6, 0x93, 0x4b, 0xc3, 0xd2, 0xa3, 0xd, 0x27, 0xb2, 0x71, 0x45, 0x2, 0xb9, 0x33, 0x56, 0xac, 0xba, 0x47, 0xc8, 0xa, 0x1a, 0x4e, 0xa4, 0x55, 0x3, 0x77, 0x7, 0x6a, 0x69, 0x90, 0x3c, 0x9a, 0xb1, 0x56, 0x3e, 0x35, 0xeb, 0xf9, 0x5d, 0x29, 0xc6, 0xb0, 0xb6, 0xa7, 0xdb, 0x91, 0xd0, 0x0, 0xb7, 0xf8, 0x0, 0x6a, 0x60, 0x19, }; #endif NEW SEARCH: if (DESC_MANAGER::instance().FindByLoginName(login)) { LoginFailure(d, "ALREADY"); return; } ADD AFTER: #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT char blockclient[NEW_PROTECT_KEYS]; strlcpy(blockclient, pinfo->blockclient, sizeof(blockclient)); std::string block = block_client; if (NULL != block.compare(blockclient)) { LoginFailure(d, "SHUTDOWN"); return; } #endif ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ LETS GO CLIENT: OPEN AccountConnector.cpp SEARCH: void CAccountConnector::SetHandler(PyObject* poHandler) { m_poHandler = poHandler; } ADD AFTER: //#ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT // NO #IFDEF NO #IFDEF NO #IFDEF // CHAR __PROTECTCLIENT__[NEW_PROTECT_KEYS] = { 0xf2, 0x42, 0x8a, 0xa1, 0x29, 0x7e, 0xfa, 0xd9, 0x19, 0xbc, 0xe5, 0x4c, 0x63, 0xf0, 0x94, 0x33, 0xf1, 0x37, 0x47, 0xf9, 0xc9, 0x43, 0x78, 0x2b, 0x9b, 0x2a, 0x48, 0x2, 0x35, 0x34, 0xa5, 0x56, 0xc1, 0x7b, 0x8, 0x9c, 0x38, 0x72, 0xc8, 0x99, 0x3f, 0x1c, 0xd7, 0x22, 0x66, 0xad, 0x40, 0x48, 0x76, 0xd1, 0x5e, 0xf, 0x77, 0x9, 0x1b, 0x52, 0xfb, 0x7e, 0xaf, 0x59, 0xdb, 0x59, 0x95, 0x5c, 0x18, 0x44, 0xd0, 0xde, 0x5e, 0xdb, 0x86, 0x7f, 0xb7, 0x1c, 0xf2, 0x3a, 0xd2, 0x67, 0x32, 0x75, 0x80, 0x1b, 0x8e, 0xd1, 0x9, 0xc9, 0xd6, 0x44, 0x2e, 0x5d, 0x47, 0x47, 0xf9, 0xd, 0xbf, 0xa9, 0xc3, 0x8e, 0xc2, 0x2b, 0x69, 0x10, 0x29, 0x57, 0xb7, 0xaa, 0xb, 0x4c, 0x29, 0x7, 0xb1, 0x5f, 0x99, 0xfd, 0x7b, 0x4, 0xc5, 0x44, 0xe6, 0xd4, 0xa7, 0x71, 0x12, 0x5a, 0x11, 0xc5, 0xa2, 0x3d, 0x11, 0x3e, 0x44, 0x2f, 0x3e, 0x98, 0x96, 0xab, 0x12, 0x14, 0xf0, 0x5c, 0xa6, 0xb, 0xa6, 0x0, 0x26, 0x1, 0x87, 0x67, 0xf3, 0x78, 0xc9, 0xd2, 0x9b, 0xd2, 0xd4, 0x17, 0x7d, 0xc3, 0xaa, 0x78, 0x8a, 0xf1, 0xf4, 0x80, 0xfd, 0x31, 0x6f, 0xb5, 0xa4, 0x61, 0x2d, 0x75, 0x30, 0xa5, 0x4d, 0x69, 0xfd, 0xfc, 0x3f, 0x68, 0x9b, 0x87, 0xb6, 0xa5, 0x7b, 0x7, 0x2, 0x4d, 0x65, 0xb1, 0x8d, 0xa1, 0x68, 0x6e, 0xd1, 0x64, 0x23, 0x3, 0x39, 0x76, 0x9f, 0xbb, 0x6b, 0x5f, 0xc4, 0x92, 0x60, 0x4a, 0x3, 0x7e, 0xe3, 0x8d, 0x19, 0xb2, 0x9d, 0x76, 0x2a, 0xf, 0x8f, 0x82, 0x1c, 0xba, 0x3a, 0xbc, 0x74, 0x97, 0xd1, 0x72, 0xa8, 0x5b, 0x6b, 0x58, 0x36, 0xb6, 0xa9, 0xe0, 0x8f, 0x3e, 0xf2, 0x65, 0x22, 0xd2, 0x31, 0x10, 0x1, 0xfd, 0xcf, 0x0, 0x4, 0xc2, 0xb6, 0x5, 0xfa, 0x58, 0xb6, 0xd4, 0xa1, 0xaf, 0xc0, 0xe8, 0xe3, 0xaa, 0xcb, 0x83, 0x3e, 0x2e, 0xa, 0x48, 0xc8, 0xcf, 0xf5, 0x1, 0x2c, 0x2e, 0x7e, 0x7b, 0x30, 0xb9, 0x67, 0xe9, 0xa, 0xeb, 0x1c, 0x92, 0x74, 0x72, 0xf3, 0x46, 0x4d, 0xe6, 0xb3, 0x74, 0x34, 0x19, 0x59, 0x4e, 0x45, 0x6f, 0xa6, 0xfd, 0x6d, 0xf5, 0x8, 0x3f, 0xaf, 0xf2, 0xa6, 0xed, 0xfc, 0x1c, 0x15, 0xb3, 0xdd, 0x4b, 0x95, 0x23, 0x58, 0x6c, 0xec, 0x1f, 0x20, 0xbc, 0x80, 0x22, 0x90, 0xbc, 0x8f, 0x68, 0x11, 0x90, 0x7c, 0x5b, 0xfb, 0x7f, 0x49, 0x7d, 0x15, 0xad, 0x6a, 0xe5, 0x5d, 0xa8, 0x52, 0x15, 0x33, 0xa0, 0x96, 0x55, 0x2d, 0x60, 0x8e, 0xa7, 0x11, 0x33, 0x31, 0x57, 0xb8, 0x23, 0x4d, 0x9d, 0xb2, 0xc2, 0xa, 0x4e, 0xa4, 0x25, 0xec, 0xba, 0xa8, 0xa6, 0xc, 0xa3, 0xbd, 0x44, 0x66, 0x9e, 0xec, 0x9c, 0xf2, 0xa1, 0x74, 0x36, 0xf3, 0x21, 0xd2, 0xe2, 0x53, 0xd3, 0x66, 0x4c, 0x85, 0x6a, 0xcf, 0x4d, 0xf4, 0x44, 0x91, 0x56, 0x31, 0x3, 0x6e, 0xb1, 0x4e, 0x4c, 0xa4, 0x84, 0x92, 0xa6, 0x35, 0x71, 0x69, 0xc4, 0x37, 0xf2, 0x87, 0x40, 0x84, 0x44, 0x1a, 0xc9, 0x84, 0xf0, 0x1a, 0x1a, 0xca, 0x2a, 0xbc, 0x77, 0x97, 0x3, 0x75, 0x6a, 0xd6, 0xd1, 0xde, 0x67, 0x1c, 0xbf, 0x9b, 0xc7, 0x1c, 0xf6, 0xcd, 0xfa, 0x20, 0x5d, 0xd9, 0xe2, 0xd2, 0x75, 0x21, 0xc7, 0xde, 0x5c, 0x50, 0x5c, 0x7, 0x17, 0xe6, 0x93, 0x4b, 0xc3, 0xd2, 0xa3, 0xd, 0x27, 0xb2, 0x71, 0x45, 0x2, 0xb9, 0x33, 0x56, 0xac, 0xba, 0x47, 0xc8, 0xa, 0x1a, 0x4e, 0xa4, 0x55, 0x3, 0x77, 0x7, 0x6a, 0x69, 0x90, 0x3c, 0x9a, 0xb1, 0x56, 0x3e, 0x35, 0xeb, 0xf9, 0x5d, 0x29, 0xc6, 0xb0, 0xb6, 0xa7, 0xdb, 0x91, 0xd0, 0x0, 0xb7, 0xf8, 0x0, 0x6a, 0x60, 0x19, }; //#endif SEARCH: strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM); ADD AFTER: #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT strncpy(LoginPacket.blockclient, __PROTECTCLIENT__, sizeof(LoginPacket.blockclient) - 32); #endif SEARCH: LoginPacket.pwd[PASS_MAX_NUM] = '\0'; ADD AFTER: #ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT LoginPacket.blockclient[NEW_PROTECT_KEYS] = '\0'; #endif
You can change the key from
1) OPEN: sequence-generator
2) SEARCH: seq_gen.py
3) OPEN seq_gen.py with notepad++
NOW CHANGE CODES FROM 2048 TO 32
for i in range(2048):
TO
for i in range(32):
4) NOW CREATE KEY
5 ADD KEY IN):
SERVER:
#ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT
extern const char block_client[NEW_PROTECT_KEYS];
const char block_client[NEW_PROTECT_KEYS] =AND
CLIENT:
//#ifdef BLOCK_LOGIN_FROM_ANOTHER_CLIENT // NO #IFDEF NO #IFDEF NO #IFDEF //
CHAR __PROTECTCLIENT__[NEW_PROTECT_KEYS] =-
19
-
1
-
1
-
1
-
-
I have a question works in a privateshop ?
-
4 hours ago, Jira said:
I think you meant to do like this, with your fix you cannot drop gold.
void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) { TPacketCGItemDrop2 * pinfo = (TPacketCGItemDrop2 *) data; if (!ch) return; if (pinfo->gold > 0) ch->DropGold(pinfo->gold); else { LPITEM pkItem = ch->GetItem(pinfo->Cell); if (!pkItem) return; if (pkItem->IsEquipped()) return; ch->DropItem(pinfo->Cell); } }
But it's better to check inside of CHARACTER::DropItem function. Btw don't use macros it's enough to put a comment like // FIXME: can't drop equipment
if (pkItem->IsEquipped())
return;why? I think this also checks the items in the inventory
if (pkItem->IsEquipped() == true) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("bug fixes items IsEquipped not drop.")); return; }
if (pkItem->IsEquipped() == true)
better that way for me
add as you want i have no problem
9 hours ago, TAUMP said:Fix and you use define? Wow.
we should know the location of the fix because in the future you may make different server files and fix them
-
Please check my post again, any errors have been fixed
thanks you
Updated the post
Fix error my post updated ---------- #ifdef FIX_DROP_ITEMSSS void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) { TPacketCGItemDrop2 * pinfo = (TPacketCGItemDrop2 *) data; LPITEM pkItem = ch->GetItem(pinfo->Cell); if (!pkItem || !ch) return; if (pkItem->IsEquipped() == true) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("bug fixes items IsEquipped not drop.")); return; } if (pinfo->gold > 0) ch->DropGold(pinfo->gold); else ch->DropItem(pinfo->Cell); } #else void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) { TPacketCGItemDrop2 * pinfo = (TPacketCGItemDrop2 *) data; if (!ch) return; if (pinfo->gold > 0) ch->DropGold(pinfo->gold); else ch->DropItem(pinfo->Cell); } #endif
-
You cannot drop items from equipped items.
Why?
Why there are bugs when throwing equipped items
-------------------------------BUG 1--------------------------------------
If you have sura/warrior aura and throw 1 item the aura is still there
if (iWearCell == WEAR_WEAPON) {
if (IsAffectFlag(AFF_GWIGUM)) {
RemoveAffect(SKILL_GWIGEOM);
}if (IsAffectFlag(AFF_GEOMGYEONG)) {
RemoveAffect(SKILL_GEOMKYUNG);
}
}Fix bypass for this code
You have aura ? drop items and this aura is work
-------------------------------END--------------------------------------
-------------------------------BUG 2--------------------------------------
If your serverfiles have a problem with HP/SP and drop object the HP stays
In some server files there are even more problems
-------------------------------END--------------------------------------
Tested and works perfectly, I have player block for exploiting quite a few bugs with items
To fix this solves every problem!!!!
thanks you
1) OPEN input_main.cpp search: void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) Change with: #ifdef FIX_DROP_ITEMSSS void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) { TPacketCGItemDrop2 * pinfo = (TPacketCGItemDrop2 *) data; LPITEM pkItem = ch->GetItem(pinfo->Cell); if (!pkItem || !ch) return; if (pkItem->IsEquipped() == true) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("bug fixes items IsEquipped not drop.")); return; } if (pinfo->gold > 0) ch->DropGold(pinfo->gold); else ch->DropItem(pinfo->Cell); } #else void CInputMain::ItemDrop2(LPCHARACTER ch, const char * data) { TPacketCGItemDrop2 * pinfo = (TPacketCGItemDrop2 *) data; if (!ch) return; if (pinfo->gold > 0) ch->DropGold(pinfo->gold); else ch->DropItem(pinfo->Cell); } #endif 2) OPEN service.h add #define FIX_DROP_ITEMSSS ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- OPEN CLIENT ROOT OPEN: game.py search: if player.SLOT_TYPE_INVENTORY == attachedType: dropItemIndex = player.GetItemIndex(attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() ## Question Text questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) ## Dialog itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=False: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1) change with: if player.SLOT_TYPE_INVENTORY == attachedType: if player.IsEquipmentSlot(attachedItemSlotPos): self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.EXCHANGE_FAILURE_EQUIP_DROPPP, 0, localeInfo.UI_OK) else: dropItemIndex = player.GetItemIndex(attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=False: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1) OPEN LOCALE CLIENT: locale_game.txt add EXCHANGE_FAILURE_EQUIP_DROPPP Hello friends i am sorry this bug is closed :( . OPEN LOCALE SERVER: locale_string.txt add "bug fixes items IsEquipped not drop." "bug fixes items IsEquipped not drop."
You can now take a test
Put on a weapon or armor and try to throw them down.
-
2
-
1
-
2
-
2
-
1
-
-
I changed the code
The Code is 100% fixed and works perfectly
Idea by @ martysama0134 thanks you friends, It helped me to make the code even better than before
ACMD(do_stat_minus) { char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); int vlaxc = 1; str_to_number(vlaxc, arg2); if (!*arg1 || vlaxc <= 0) return; if (ch->IsPolymorphed()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑 중에는 능력을 올릴 수 없습니다.")); return; } if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0) return; BYTE idx = 0; if (!strcmp(arg1, "st")) { if (ch->GetRealPoint(POINT_ST) <= JobInitialPoints[ch->GetJob()].st) { return; } idx = POINT_ST; } else if (!strcmp(arg1, "dx")) { if (ch->GetRealPoint(POINT_DX) <= JobInitialPoints[ch->GetJob()].dx) { return; } idx = POINT_DX; } else if (!strcmp(arg1, "ht")) { if (ch->GetRealPoint(POINT_HT) <= JobInitialPoints[ch->GetJob()].ht) { return; } idx = POINT_HT; } else if (!strcmp(arg1, "iq")) { if (ch->GetRealPoint(POINT_IQ) <= JobInitialPoints[ch->GetJob()].iq) { return; } idx = POINT_IQ; } else return; if (idx == 0) return; if (vlaxc > ch->GetPoint(POINT_STAT_RESET_COUNT)) vlaxc = ch->GetPoint(POINT_STAT_RESET_COUNT); if (ch->GetRealPoint(idx) - vlaxc > MAX_STAT) vlaxc = MAX_STAT + ch->GetRealPoint(idx); ch->SetRealPoint(idx, ch->GetRealPoint(idx) - vlaxc); ch->SetPoint(idx, ch->GetPoint(idx) - vlaxc); ch->ComputePoints(); ch->PointChange(idx, 0); if (idx == POINT_IQ) ch->PointChange(POINT_MAX_HP, 0); else if (idx == POINT_HT) ch->PointChange(POINT_MAX_SP, 0); ch->PointChange(POINT_STAT, + vlaxc); ch->PointChange(POINT_STAT_RESET_COUNT, - vlaxc); ch->ComputePoints(); }
-
1
-
-
First of all, it's not a bug you're missing effects on the client, If it was a bug you'd get kicked by the client
You have to pass the packs again in the right way and in the right positions
-
1) OPEN
db source in ClientMananger.cpp
game source in Config.cpp
OPEN: ClientMananger.cpp (DB) Search: if (!CConfig::instance().GetValue("BIND_IP", szBindIP, 128)) strlcpy(szBindIP, "0", sizeof(szBindIP)); change: if (!CConfig::instance().GetValue("BIND_IP", szBindIP, 128)) strlcpy(szBindIP, "127.0.0.1", sizeof(szBindIP)); OPEN: Config.cpp (GAME) Search: if (!strncmp(netip, "192.1", 7)) change: if (!strncmp(netip, "999.999", 7)) search: if (g_szPublicIP[0] != '0') change: if (g_szPublicIP[0] != '0') return true; else { if (g_szInternalIP[0] == '0') return false; else strlcpy(g_szPublicIP, g_szInternalIP, sizeof(g_szPublicIP)); return true; }
-
1 hour ago, ĐECKED said:
I don't get it, what do the values in this table represent?
I see that there's a value for each level, but other than that, I can't make sense of it.
If I wanted to make it so when killing a Wild Dog, for example, every player in the group receives the full 15 XP, what change do I have to make?
when kill begin local mapindexbest = pc.get_map_index() if party.is_party() with mapindexbest == 1 or mapindexbest == 21 or mapindexbest == 41 then --Add map local party_give_exp_all = {party.get_member_pids()} for i = 1, table.getn(party_give_exp_all) do if pc.select_pid(party_give_exp_all[i]) != 0 then local give_experian = number(1, 2) if give_experian == 1 and pc.get_level() >= 90 and pc.get_level() < 100 then pc.give_exp2(15) --Change exp or what else if give_experian == 1 and pc.get_level() >= 90 and pc.get_level() < 100 then pc.give_exp2(15) --Change exp or what end end end end end end
Try this so I made party exp on my own server
You can define the maps you want. If you want exp to the whole team on a different map just make a second quest and set a new map with different exp
when kill begin you change when 101.kill begin if you want them for specific mobs
-
21 minutes ago, martysama0134 said:
From the default code, only POINT_MAX_SP and POINT_MAX_SP are swapped. The rest is the same. Am I missing something?
Small refactory: (using a table I can shorten far more)
ACMD(do_stat_minus) { char arg1[256]; one_argument(argument, arg1, sizeof(arg1)); if (!*arg1) return; if (ch->IsPolymorphed()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µÐ°© Áß¿¡´Â ´É·ÂÀ» ¿Ã¸± ¼ö ¾ø½À´Ï´Ù.")); return; } if (ch->GetPoint(POINT_STAT_RESET_COUNT) <= 0) return; auto pointId = POINT_NONE; if (!strcmp(arg1, "st")) { pointId = POINT_ST; if (ch->GetRealPoint(pointId) <= JobInitialPoints[ch->GetJob()].st) return; } else if (!strcmp(arg1, "dx")) { pointId = POINT_DX; if (ch->GetRealPoint(pointId) <= JobInitialPoints[ch->GetJob()].dx) return; } else if (!strcmp(arg1, "ht")) { pointId = POINT_HT; if (ch->GetRealPoint(pointId) <= JobInitialPoints[ch->GetJob()].ht) return; } else if (!strcmp(arg1, "iq")) { pointId = POINT_IQ; if (ch->GetRealPoint(pointId) <= JobInitialPoints[ch->GetJob()].iq) return; } else return; if (pointId == POINT_NONE) return; ch->SetRealPoint(pointId, ch->GetRealPoint(pointId) - 1); ch->SetPoint(pointId, ch->GetPoint(pointId) - 1); ch->ComputePoints(); ch->PointChange(pointId, 0); if (pointId == POINT_IQ) // HT? ch->PointChange(POINT_MAX_HP, 0); else if (pointId == POINT_HT) // IQ? ch->PointChange(POINT_MAX_SP, 0); ch->PointChange(POINT_STAT, +1); ch->PointChange(POINT_STAT_RESET_COUNT, -1); ch->ComputePoints(); }
Let's try this too
I think you need "BYTE" because it returns NULL if I'm not mistaken
I'm not 100% sure but I think we need BYTE in this case
-
1
-
-
4 minutes ago, ĐECKED said:
I don't get it, what do the values in this table represent?
I see that there's a value for each level, but other than that, I can't make sense of it.
If I wanted to make it so when killing a Wild Dog, for example, every player in the group receives the full 15 XP, what change do I have to make?
10, 10, 10, 10, 15, 15, 20, 25, 30, 40,
50, 60, 80, 100, 120, 140, 160, 184, 210, 240,
270, 300, 330, 360, 390, 420, 450, 480, 510, 550,
600, 640, 700, 760, 820, 880, 940, 1000, 1100, 1180,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,Here you change the board in the team with your own choice how much exactly you will take your team
Change the numbers until you find the right exp for your whole team
-
your maps not have add property
reinstall the map
-
constants.h
extern const DWORD party_exp_distribute_table[PLAYER_EXP_TABLE_MAX + 1];
constnts.cpp
const DWORD party_exp_distribute_table[PLAYER_EXP_TABLE_MAX + 1] =
{
0,
10, 10, 10, 10, 15, 15, 20, 25, 30, 40,
50, 60, 80, 100, 120, 140, 160, 184, 210, 240,
270, 300, 330, 360, 390, 420, 450, 480, 510, 550,
600, 640, 700, 760, 820, 880, 940, 1000, 1100, 1180,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
1260, 1320, 1380, 1440, 1500, 1560, 1620, 1680, 1740, 1800,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000,
};change exp with your number
-
Happy new year
May the new year give strength to all and success to all developers
-
1
-
2
-
-
I tried it today on my server with 500/1k players online it works great guys
No problem found my friends
If you notice any problem tell me, although I think it 100% solves the problem of the items
-
1
-
[LOCKED CLIENT] After remove _improved_packet_encryption_ 100% TESTED On large servers
in Programming & Scripts
Posted
it has been tested before I publish it
What is the difference between sequence and this here?
Still some are trying to find the key try to find the key and come tell me if troll
I am waiting