Jump to content

Draveniou1

Active Member
  • Posts

    252
  • Joined

  • Last visited

  • Days Won

    2
  • Feedback

    100%

Posts posted by Draveniou1

  1. 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

  2. 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

  3. 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

  4. 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

     

     

  5. 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(

  6. 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

     

     

    @LethalStrikeR

    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

    • Metin2 Dev 1
  7. 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

    • Lmao 4
    • Good 1
  8. 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

     

    • Lmao 1
    • Good 1
  9. 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 

    This is the hidden content, please

    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] =

     

     

     

     

    • Metin2 Dev 19
    • Eyes 1
    • Facepalm 1
    • Lmao 1
  10. 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

  11. 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

     

  12. 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.

     

    • Metin2 Dev 2
    • Smile Tear 1
    • Think 2
    • Lmao 2
    • Good 1
  13. 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();
    }

     

    • Think 1
  14. 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;
    	}
          
          
          
          

     

  15. 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

  16. 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

    • Facepalm 1
  17. 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

     

  18. 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

     

     

  19. 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

    • Metin2 Dev 1
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.