Jump to content

Cunoo

Inactive Member
  • Posts

    326
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by Cunoo

  1. Tested works fine! Thanks!

    Here is better tutorial + small redesign code (TABs, space, only for eyes)

    Serverside:

    Spoiler
    // game/src/packet.h -> search this:
    
    typedef struct packet_damage_info
    {
    	BYTE	header;
    	DWORD	dwVID;
    	BYTE	flag;
    	int		damage;
    } TPacketGCDamageInfo;
    
    // replace with this:
    
    typedef struct packet_damage_info
    {
    	BYTE	header;
    	DWORD	dwVictimVID;
    	DWORD	dwAttackerVID;
    	BYTE	flag;
    	int		damage;
    } TPacketGCDamageInfo;
    
    // game/src/char_battle.cpp -> search this:
    
    void CHARACTER::SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageFlag)
    {
    	if (IsPC() == true || (pAttacker->IsPC() == true && pAttacker->GetTarget() == this))
    	{
    		TPacketGCDamageInfo damageInfo;
    		memset(&damageInfo, 0, sizeof(TPacketGCDamageInfo));
    
    		damageInfo.header = HEADER_GC_DAMAGE_INFO;
    		damageInfo.dwVID = (DWORD)GetVID();
    		damageInfo.flag = DamageFlag;
    		damageInfo.damage = Damage;
    
    		if (GetDesc() != NULL)
    		{
    			GetDesc()->Packet(&damageInfo, sizeof(TPacketGCDamageInfo));
    		}
    
    		if (pAttacker->GetDesc() != NULL)
    		{
    			pAttacker->GetDesc()->Packet(&damageInfo, sizeof(TPacketGCDamageInfo));
    		}
    	}
    }
    
    // replace with this:
    
    void CHARACTER::SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageFlag)
    {
    	if (IsPC() == true || (pAttacker->IsPC() == true && pAttacker->GetTarget() == this))
    	{
    		TPacketGCDamageInfo damageInfo;
    		memset(&damageInfo, 0, sizeof(TPacketGCDamageInfo));
    
    		damageInfo.header = HEADER_GC_DAMAGE_INFO;
    		damageInfo.dwVictimVID = (DWORD)GetVID();
    		damageInfo.dwAttackerVID = (DWORD)pAttacker->GetVID();
    		damageInfo.flag = DamageFlag;
    		damageInfo.damage = Damage;
    
    		if (GetDesc() != NULL)
    		{
    			GetDesc()->Packet(&damageInfo, sizeof(TPacketGCDamageInfo));
    		}
    
    		if (pAttacker->GetDesc() != NULL)
    		{
    			pAttacker->GetDesc()->Packet(&damageInfo, sizeof(TPacketGCDamageInfo));
    		}
    	}
    }

     

    Clientside:

    Spoiler
    // UserInterface/Packet.h -> search this:
    
    typedef struct packet_damage_info
    {
    	BYTE	header;
    	DWORD	dwVID;
    	BYTE	flag;
    	int		damage;
    } TPacketGCDamageInfo;
    
    // replace with this:
    
    typedef struct packet_damage_info
    {
    	BYTE	header;
    	DWORD	dwVictimVID;
    	DWORD	dwAttackerVID;
    	BYTE	flag;
    	int		damage;
    } TPacketGCDamageInfo;
    
    // UserInterface/InstanceBase.cpp -> search this:
    
    ProcessDamage();
    
    // add after this:
    
    ProcessRemoveOldDamage();
    
    // UserInterface/InstanceBase.h -> search this:
    
    		struct SEffectDamage
    		{
    			DWORD	damage;
    			BYTE	flag;
    			BOOL	bSelf;
    			BOOL	bTarget;
    		};
    
    		typedef std::list<SEffectDamage> CommandDamageQueue;
    		CommandDamageQueue m_DamageQueue;
    
    		void ProcessDamage();
    
    	public:
    		void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget);
    
    // replace with this:
    
    		struct SEffectDamage
    		{
    			DWORD	damage;
    			BYTE	flag;
    			BOOL	bSelf;
    			BOOL	bTarget;
    			DWORD	dwVictimVID;
    			DWORD	dwAttackerVID;
    		};
    
    		typedef std::list<SEffectDamage> CommandDamageQueue;
    		CommandDamageQueue m_DamageQueue;
    
    		void ProcessDamage();
    		void ProcessRemoveOldDamage();
    
    	public:
    		void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget, DWORD dwVictimVID, DWORD dwAttackerVID);
    
    
    // UserInterface/InstanceBaseEffect.cpp -> add this to include:
    
    #include "PythonPlayer.h" // this is default added so check it
    
    #include "PythonApplication.h"
    #include "PythonCharacterManager.h"
    
    // UserInterface/InstanceBaseEffect.cpp -> search this:
    
    void CInstanceBase::AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget)
    {
    	if(CPythonSystem::Instance().IsShowDamage())
    	{
    		SEffectDamage sDamage;
    		sDamage.bSelf = bSelf;
    		sDamage.bTarget = bTarget;
    		sDamage.damage = damage;
    		sDamage.flag = flag;
    		m_DamageQueue.push_back(sDamage);
    	}
    }
    
    // replace with this:
    void CInstanceBase::AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget, DWORD dwVictimVID, DWORD dwAttackerVID)
    {
    	if (CPythonSystem::Instance().IsShowDamage() && !CPythonApplication::Instance().IsMinimizedWnd())
    	{
    		SEffectDamage sDamage;
    		sDamage.bSelf = bSelf;
    		sDamage.bTarget = bTarget;
    		sDamage.damage = damage;
    		sDamage.flag = flag;
    		sDamage.dwVictimVID = dwVictimVID;
    		sDamage.dwAttackerVID = dwAttackerVID;
    		m_DamageQueue.push_back(sDamage);
    	}
    }
    
    // UserInterface/InstanceBaseEffect.cpp -> search this:
    
    void CInstanceBase::ProcessDamage()
    {
    	if(m_DamageQueue.empty())
    		return;
    
    	SEffectDamage sDamage = m_DamageQueue.front();
    
    	m_DamageQueue.pop_front();
    
    	DWORD damage = sDamage.damage;
    	BYTE flag = sDamage.flag;
    	BOOL bSelf = sDamage.bSelf;
    	BOOL bTarget = sDamage.bTarget;
    
    // replace with this:
    
    void CInstanceBase::ProcessDamage()
    {
    	if(m_DamageQueue.empty())
    		return;
    
    	SEffectDamage sDamage = m_DamageQueue.front();
    
    	m_DamageQueue.pop_front();
    
    	DWORD damage = sDamage.damage;
    	BYTE flag = sDamage.flag;
    	BOOL bSelf = sDamage.bSelf;
    	BOOL bTarget = sDamage.bTarget;
    	DWORD dwVictimVID = sDamage.dwVictimVID;
    	DWORD dwAttackerVID = sDamage.dwAttackerVID;
    
    	CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr();
    
    	if ((CPythonCharacterManager::instance().IsDeadVID(dwAttackerVID) || pMainInstance->IsDead()) && (flag != DAMAGE_POISON || flag != DAMAGE_BLEEDING || flag != DAMAGE_FIRE) && bSelf)
    		return;
    
    // UserInterface/InstanceBaseEffect.cpp -> search this function:
    
    void CInstanceBase::ProcessDamage()
    
    // add after this function this function:
    
    void CInstanceBase::ProcessRemoveOldDamage()
    {
    	std::list<SEffectDamage>::iterator it;
    
    	CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr();
    
    	for (it = m_DamageQueue.begin(); it != m_DamageQueue.end(); ++it)
    	{
    		if ((CPythonCharacterManager::instance().IsDeadVID(it->dwAttackerVID) || pMainInstance->IsDead()) && (it->flag != DAMAGE_POISON || it->flag != DAMAGE_BLEEDING || it->flag != DAMAGE_FIRE) && it->bSelf)
    		{
    			m_DamageQueue.erase(it);
    		}
    	}
    }
    
    // UserInterface/PythonNetworkStreamPhaseGame.cpp -> search this:
    
    bool CPythonNetworkStream::RecvDamageInfoPacket()
    {
    	TPacketGCDamageInfo DamageInfoPacket;
    
    	if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket))
    	{
    		Tracen("Recv Target Packet Error");
    		return false;
    	}
    	
    	CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVID);
    
    	bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr());
    	bool bTarget = (pInstTarget == m_pInstTarget);
    
    	if (pInstTarget)
    	{
    		if(DamageInfoPacket.damage >= 0)
    			pInstTarget->AddDamageEffect(DamageInfoPacket.damage,DamageInfoPacket.flag,bSelf,bTarget);
    		else
    			TraceError("Damage is equal or below 0.");
    	}
    
    	return true;
    }
    
    // replace with this:
    
    bool CPythonNetworkStream::RecvDamageInfoPacket()
    {
    	TPacketGCDamageInfo DamageInfoPacket;
    
    	if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket))
    	{
    		Tracen("Recv Target Packet Error");
    		return false;
    	}
    
    	CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVictimVID);
    
    	bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr());
    	bool bTarget = (pInstTarget == m_pInstTarget);
    
    	if (pInstTarget)
    	{
    		if(DamageInfoPacket.damage >= 0)
    			pInstTarget->AddDamageEffect(DamageInfoPacket.damage, DamageInfoPacket.flag, bSelf, bTarget, DamageInfoPacket.dwVictimVID, DamageInfoPacket.dwAttackerVID);
    		else
    			TraceError("Damage is equal or below 0.");
    	}
    
    	return true;
    }
    
    // UserInterface/PythonApplication.cpp -> search this function:
    
    bool CPythonApplication::Process()
    
    // add after this function this function:
    
    bool CPythonApplication::IsMinimizedWnd()
    {
    	return m_isMinimizedWnd;
    }
    
    // UserInterface/PythonApplication.h -> search this:
    
    bool Process()
    
    // add after this:
    
    bool IsMinimizedWnd();

    Edit: btw. one little think.. Check your client source for DAMAGE_FIRE + DAMAGE_BLEEDING flag.. You must change your code if you dont have it..

    • Metin2 Dev 1
    • Good 2
  2. 12 hours ago, Jawwad said:

    I've tried something. 

    🥺👉👈

    193139Sans-titre-6.png

    spacer.png

     

    Hidden Content

    • Give reaction to this post to see the hidden content.

     

     

    Hidden Content

    • Give reaction to this post to see the hidden content.

     

    Make it short, this is not fit..

  3. 24 minutes ago, PetePeter said:

    Can be about "_IMPROVED_PACKET_ENCRYPTION_" I had some similar problem with it (Like client instant kick instead of lagging when sorting a big inventory)

    I think can be something like this.. Because I never got black screen after fix, but if I can "get" black screen (10 hours+ in game) Im kicked.. I test it 3x and same problem just Im kicked before I can got black screen... Game is compiled clean from kraizy same as client, only for test.. I think there is something more bad.. Game is overflowed with something more.. Im not sure where is problem because I try debug and nothing happen.. I dont have too much deep knowledges for more.. But for me is this problem really strange because I use clean game for test... Today I test it on my game.. So I write feedback too late..

  4. 14 hours ago, Owsap said:

    @Cunoowhat do you mean with kick? Does the client crash or does the character get disconnected back the the login phase? If the client is crashing, have you tried to debug it?

    No, client works fine.. I'm kicked to login before black screen.. So I never got black screen but insta kick to login.. 

  5. 19 minutes ago, xGalardo said:

    I had the client on a tray for 12 hours, it works perfectly, no ejections, etc. I also installed Marty's fix, which really fixed the Flame Ghost monster "bug".

    I don't know if it matters, but i use Marty's source.

    Me too Marty fix works fine but this is only part.. I have strange bug with first part. I dont have problem with black screen but with kick if black screen cooming.. My cpu is 30%+ up if cooming black screen. I think this is not easy to safe with one line.. There is more things bad than granny controller. M

    • Lmao 1
  6. 2 hours ago, Distraught said:

    How can you be just so so so so so stupid? If your server kicks you out it's because you don't even know what you are doing. Not my fix is the problem, it's more like your knowledge... Actually marty just repeated half of what I wrote down before and you're saying what I wrote is not working while licking his ass clean at the same time. (don't get me wrong, it's not against marty, it's against you and other incompetent stupid-ass motherfuckers like you)

    Sorry for the language... But for nothing else...

     

    The effects you use on your maps are not managed by EffectManager. They are managed by the Area itself.

    I dont say anything on you or your fix *WTF.. You only dont understand.. I said I dont got black screen but kick.. So your fix works! But I think missing code or something because before I can got black screen, my char is kicked.. I think there is more than your fix.. And yes Im not pro, but Marty said he is not sure where is problem for sure and you safe it one of long time ago problem with one line??????!!! Respect if anyone say feedback.. Can be usefull for all.. Just with your code is no problem but game is not fit.. I dont have too much experiences with debug but I think there is overflow with some things.. 

     

    Edit: Second kick before black screen.. Game works fine without lags without black screen but kicking if come black screen... 

  7. 14 minutes ago, ReFresh said:

    I'm still not sure what Marty's effect fix exactly fixing, if it should fix the effects to stacking up when window is minimized for example for butterflies, it doesn't work and the effect is still stacking up.

    And I have it like this:

      Reveal hidden contents
    https://metin2.download/picture/GIJ1rKas4zgBxa131bZmQ1hn22NKVe5p/.png

     

    I think this works for all effects... Because you refresh all effects thats works for skills, effects just member things.. I dont have problem with this fix, works real time fine.. I have problem only with first fix.. And no my problem is black screen but kick after overflow.. I think missing some code.. Because if I "can" got blackscreen I got simply kick... Tested with clean mainline and still same problem with all tests.. 

  8. 24 minutes ago, narcisxb said:

    It works like a charm. Thank you! xD

    Quick question: how bad will refreshing every frame affect perfomance? does it matter considering modern cpus?

    Thats my question up.. But I think not too much.. I tested it and I dont see different.. 5% cpu up with cpu mode.. But I think modern pc use gpu in settings for rendering... You can use 2nd way in realtime..

  9. 16 minutes ago, narcisxb said:

    I literally don t have any of the code from his picture there. How is it possible?

    The only m_isMinimizedWnd reference I got there is this:

    if (m_isMinimizedWnd)
    		{
    			canRender = false;
    		}

     

    Search: 

    if (dwCurrentTime > s_uiNextFrameTime)

    This: 

    	if (dwCurrentTime > s_uiNextFrameTime)
    	{
    		int dt = dwCurrentTime - s_uiNextFrameTime;
    		int nAdjustTime = ((float)dt / (float)uiFrameTime) * uiFrameTime; 
    
    		if ( dt >= 500 )
    		{
    			s_uiNextFrameTime += nAdjustTime; 
    			printf("FrameSkip 보정 %d\n",nAdjustTime);
    			CTimer::Instance().Adjust(nAdjustTime);
    		}
    
    		s_bFrameSkip = true;
    		bCurrentLateUpdate = TRUE;
    	}
    
    	//s_bFrameSkip = false;
    
    	//if (dwCurrentTime > s_uiNextFrameTime)
    	//{
    	//	int dt = dwCurrentTime - s_uiNextFrameTime;
    
    	//	//너무 늦었을 경우 따라잡는다.
    	//	//그리고 m_dwCurUpdateTime는 delta인데 delta랑 absolute time이랑 비교하면 어쩌자는겨?
    	//	//if (dt >= 500 || m_dwCurUpdateTime > s_uiNextFrameTime)
    
    	//	//기존코드대로 하면 0.5초 이하 차이난 상태로 update가 지속되면 계속 rendering frame skip발생
    	//	if (dt >= 500 || m_dwCurUpdateTime > s_uiNextFrameTime)
    	//	{
    	//		s_uiNextFrameTime += dt / uiFrameTime * uiFrameTime; 
    	//		printf("FrameSkip 보정 %d\n", dt / uiFrameTime * uiFrameTime);
    	//		CTimer::Instance().Adjust((dt / uiFrameTime) * uiFrameTime);
    	//		s_bFrameSkip = true;
    	//	}
    	//}
    
    	if (m_isFrameSkipDisable)
    		s_bFrameSkip = false;
    
    #ifdef __VTUNE__
    	s_bFrameSkip = false;
    #endif
    	/*
    	static bool s_isPrevFrameSkip=false;
    	static DWORD s_dwFrameSkipCount=0;
    	static DWORD s_dwFrameSkipEndTime=0;
    
    	static DWORD ERROR_FRAME_SKIP_COUNT = 60*5;
    	static DWORD ERROR_FRAME_SKIP_TIME = ERROR_FRAME_SKIP_COUNT*18;
    
    	//static DWORD MAX_FRAME_SKIP=0;
    
    	if (IsActive())
    	{
    	DWORD dwFrameSkipCurTime=ELTimer_GetMSec();
    
    	if (s_bFrameSkip)
    	{
    	// 이전 프레임도 스킵이라면..
    	if (s_isPrevFrameSkip)
    	{
    	if (s_dwFrameSkipEndTime==0)
    	{
    	s_dwFrameSkipCount=0; // 프레임 체크는 로딩 대비
    	s_dwFrameSkipEndTime=dwFrameSkipCurTime+ERROR_FRAME_SKIP_TIME; // 시간 체크는 로딩후 프레임 스킵 체크
    
    	//printf("FrameSkipCheck Start\n");
    	}
    	++s_dwFrameSkipCount;
    
    	//if (MAX_FRAME_SKIP<s_dwFrameSkipCount)
    	//	MAX_FRAME_SKIP=s_dwFrameSkipCount;
    
    	//printf("u %d c %d/%d t %d\n", 
    	//	dwUpdateTime9-dwUpdateTime1,
    	//	s_dwFrameSkipCount, 
    	//	MAX_FRAME_SKIP,
    	//	s_dwFrameSkipEndTime);
    
    	//#ifndef _DEBUG
    	// 일정 시간동안 계속 프레임 스킵만 한다면...
    	if (s_dwFrameSkipCount>ERROR_FRAME_SKIP_COUNT && s_dwFrameSkipEndTime<dwFrameSkipCurTime)
    	{
    	s_isPrevFrameSkip=false;
    	s_dwFrameSkipEndTime=0;
    	s_dwFrameSkipCount=0;
    
    	//m_pyNetworkStream.AbsoluteExitGame();
    
    	/*
    	TraceError("무한 프레임 스킵으로 접속을 종료합니다");
    
    	{
    	FILE* fp=fopen("errorlog.txt", "w");
    	if (fp)
    	{
    	fprintf(fp, "FRAMESKIP\n");
    	fprintf(fp, "Total %d\n",		dwUpdateTime9-dwUpdateTime1);
    	fprintf(fp, "Timer %d\n",		dwUpdateTime2-dwUpdateTime1);
    	fprintf(fp, "Network %d\n",		dwUpdateTime3-dwUpdateTime2);
    	fprintf(fp, "Keyboard %d\n",	dwUpdateTime4-dwUpdateTime3);
    	fprintf(fp, "Controll %d\n",	dwUpdateTime5-dwUpdateTime4);
    	fprintf(fp, "Resource %d\n",	dwUpdateTime6-dwUpdateTime5);
    	fprintf(fp, "Camera %d\n",		dwUpdateTime7-dwUpdateTime6);
    	fprintf(fp, "Mouse %d\n",		dwUpdateTime8-dwUpdateTime7);
    	fprintf(fp, "UI %d\n",			dwUpdateTime9-dwUpdateTime8);
    	fclose(fp);
    
    	WinExec("errorlog.exe", SW_SHOW);
    	}
    	}
    	}
    	}
    
    	s_isPrevFrameSkip=true;
    	}
    	else
    	{
    	s_isPrevFrameSkip=false;
    	s_dwFrameSkipCount=0;
    	s_dwFrameSkipEndTime=0;
    	}
    	}
    	else
    	{
    	s_isPrevFrameSkip=false;
    	s_dwFrameSkipCount=0;
    	s_dwFrameSkipEndTime=0;
    	}
    	*/

    (Comments and  __VTUNE__ can be deleted)
    replace with this:

    	if (dwCurrentTime > s_uiNextFrameTime)
    	{
    		int dt = dwCurrentTime - s_uiNextFrameTime;
    		int nAdjustTime = ((float)dt / (float)uiFrameTime) * uiFrameTime;
    
    		if (dt >= 500)
    		{
    			s_uiNextFrameTime += nAdjustTime;
    			CTimer::Instance().Adjust(nAdjustTime);
    		}
    
    		if (!m_isFrameSkipDisable)
    			s_bFrameSkip = true;
    		bCurrentLateUpdate = TRUE;
    	}
    
    	if (m_isMinimizedWnd)
    		CEffectManager::Instance().Update();
    
    	if (m_isFrameSkipDisable && !m_isMinimizedWnd)
    		s_bFrameSkip = false;

    Edit for understanding.. You just add this:

    if (m_isMinimizedWnd)
    		CEffectManager::Instance().Update();

    under this:

    if (dwCurrentTime > s_uiNextFrameTime)
    	{
    		int dt = dwCurrentTime - s_uiNextFrameTime;
    		int nAdjustTime = ((float)dt / (float)uiFrameTime) * uiFrameTime; 
    
    		if ( dt >= 500 )
    		{
    			s_uiNextFrameTime += nAdjustTime; 
    			printf("FrameSkip 보정 %d\n",nAdjustTime);
    			CTimer::Instance().Adjust(nAdjustTime);
    		}
    
    		s_bFrameSkip = true;
    		bCurrentLateUpdate = TRUE;
    	}

    + this:

    if (m_isFrameSkipDisable)
    		s_bFrameSkip = false;

    change to this:

    if (m_isFrameSkipDisable && !m_isMinimizedWnd)
    		s_bFrameSkip = false;

    Thats all.. 2nd way refresh for every frame..

    • Metin2 Dev 1
    • Love 2
  10. 9 hours ago, darkfun3 said:

    hello i have tried to use the command pkg install cryptopp-7.0.0 but it gives an error that is not found and i also cant build from ports as it is not a supported version freebsd version 11.3. Even if i have the packages installed the libs are still missing even after i link them. I cannot find a way to get cryptopp7 as when i use  pkg install cryptopp the versio that gets installed is 8.5.

    edit: if someone has managed to start the server on a vps using freebsd 12 or 11.3 64bit can u write down the packages u installed or what you did to make the launch successful as the only error i get is the missing libs which even if the package is installed or a symlink is created it does not recognise it.

    Thanks in advance. Kind regards darkfun3

     

    Do not use pkg.. Download cryptopp from official page and compile.. Link is up posted by me.. WTF. New versions freebsd doesnt support old packages.. 

  11. On 9/15/2021 at 1:02 PM, martysama0134 said:

    The black screen was mostly caused by two major bugs:

    1. The granny controller freezing the process for n seconds until you get dc'd from the game
      1. You can test it by:
      2. Spawning tons of monsters
      3. Minimize the client for 30 - 40 minutes
      4. Maximizing the window again (it will freeze exactly at this point)
    2. The EffectManager not destroying the expired effects while the window was minimized, which caused all the executed effects to stack up and be run all at once after maximizing the window again
      1. You can test this bug very easily:
      2. Spawn tons Flame Ghosts and minimize the window
        1. /ma "Flame Ghost" 100
        2. /cannot_dead

    I wasn't sure how to solve the 1st one, but for the 2nd one you can fix it in one of these ways:

     

    151605UCH22zd.png

    1st Way) refresh only once every 256 frames = 4-6 seconds depending on the lag

     

    1516050B26Z93.png

    2nd Way) effect manager refresh for every frame

     

    151605kBI2BOi.png

    3rd Way) move the update from RenderGame to UpdateGame (it may not be called if skipFrame=true on ::Process)

    What is the best way? I'm testing 2nd.. So you can tell more about this fixes I think can be usefull for all.. Thanks anyway ?

    • Metin2 Dev 2
    • Good 1
  12. On 9/12/2021 at 7:34 PM, TMP4 said:

    Since I used Mali's src as base, the CryptoPP version is 7.0 so pkg install cryptopp-7.0.0 can do the trick.
    For 8.2 / 8.5 the game-db should be compiled with that too in order to make it work.

    My bad idk which version is installed.. Maybe you can try add some informations about source packages.. I think this can be usefull for many peoples.. Same for client 🙂 you can make something like info.txt

    Cryptopp:

    DevIL:

    MySQL:

    Granny:

    Python:

    And more...

    • Good 1
  13. On 9/8/2021 at 9:48 PM, snapkode said:

    spacer.png
    compiled on your vdi and uploaded in my dedicat server (64bit)

    download all the necessary lib ✅

    now when I start server from console auth online dB online game online 

    when I try to login into the client in console appear that error, Dó you know because ?

    @ TMP4

     

    Try manually install cryptopp 8.2.. Not 8.5..

    Here: click + recompile cryptopp lib..

    Edit: Recommend version is 7.0 so use same link but got oldest version.

    • Metin2 Dev 5
    • Good 5
    • Love 2
  14. 3 minutes ago, TMP4 said:

    Hi, thank you, 70024 blocked already and the other items like stone deattacher too.

    About the equipped items move to safebox, I already blocked belts because of the non-empty belt inventory. Blocking all items are not neceserry if they don't cause any bug. But if you know any other item type what should be blocked because of a potential bug, please let me know.

    This is true, but looks more clean blocked all eq... So I check too late my changelog for more bugs.. 

  15. On 9/7/2021 at 5:48 PM, TMP4 said:

    Downoad link: 

    Hidden Content

    • Give reaction to this post to see the hidden content.


    (If you want to read then set your notepad++ character encoding to greek->windows-1253, but do not do any conversion)

     

    I'll include this in the next update, but anyone feel free to download it until then.

    Edit:

    2021.09.07: - 6-7 bonus add/switch blocked on equipped items. (char_item.cpp case 71051 & 71052)
                - Fixed gameland's (gm_guild_build) server_attr.
                - Added the missing locale_string_GR.txt.
                - Removed unused dll files from the client.

    I think all items can be blocked.. So 70024 too.. Same for add items and you can block equipped items move to safebox..

    • Metin2 Dev 1
  16. 3 hours ago, 4peppe said:

    you just need to remove it from client, and disable drop of item and quest in the game!

    You can deactivate it, but so far delete it is no easy way. Because included is some new stuff manipulate with inventory, exchange and more things.. Last year I try it and is possible but you must outdated client code back to 2012 year.. And server so this is next story..

  17. 4 hours ago, TMP4 said:

     

    After he installs the No TXT mod 😁

    ------------------------

    By the way TXT is much easier, you don't have to do the maths in antiflags and so, you only need to put their name like ANTI_SELL | ANTI_GIVE instead of calculating the number values and summation. But it's on you.

    I dont think so.. Why? Simply because you have all columns in one editor.. Its good for editing.. Flags and antiflags you can use basic app for calculation.. But I remember 70% flags antiflags because 10+ years in metin.. I think edit in navicat is more simply and more easier + you can use something commands which really can help you with hard editing.. But so far biggest + for txt is real time reading proto..

    • Metin2 Dev 1
  18. On 8/11/2021 at 9:05 PM, TMP4 said:

    Never download a lib file from the internet. It can be unsafe and incompatible. Install the packages what contains them Instead.

    pkg install tiff

    By the way downloading lib files from the internet and uploading it to your FreeBSD system is just as dangerous as downloading .dll files to your Windows and copying it to C:\Windows\system32. Wouldn't you do the latter, would you? 😂 

    One little think.. You can download libs from official freebsd site.. But better is update your system... Copy libs from other version suck..

    • Metin2 Dev 1
  19. 9 hours ago, Ace said:
    And how will it change our lives?

    when we die, we'll find out what's going on up there. Instead of wasting these billions into such meaningless things, I would rather put my world in order. Whoever celebrates Elon has little brain cell, just like Elon.

    but back to your question: in the worst case we will be discovered and wiped out.

    I like Bezos song from tiktok :c #killme

    • Lmao 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.