-
Posts
326 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by Cunoo
-
-
-
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..
- 1
- 2
-
-
15 minutes ago, TMP4 said:
It is disabled, not removed.
// #define ENABLE_LIMIT_TIME
It have the same end result (no check), but if anyone want to re-enable it, it is easier to just uncomment instead of reimplement the limit-time.
I dont know if anyone use this things.. So far better is complete delete it..
-
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..
-
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..
-
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
- 1
-
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...
-
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:
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..
-
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..
-
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..
- 1
- 2
-
1 hour ago, narcisxb said:
it s not there.
UserInterface/PythonApplication.cpp here is martysama fix for expired skills..
-
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..
-
So tested 12 hours...
1. After 12 hours I got kick.. Doesnt work.. @ Distraught
2. Works fine, thanks @ martysama0134Edit: So tested with network bridge without net.. Source clean kraizy mainline without any modification (build only for test) I don't got black screen but something is bad because game no freeze but kicking..
- 1
-
On 9/15/2021 at 1:02 PM, martysama0134 said:
The black screen was mostly caused by two major bugs:
-
The granny controller freezing the process for n seconds until you get dc'd from the game
- You can test it by:
- Spawning tons of monsters
- Minimize the client for 30 - 40 minutes
- Maximizing the window again (it will freeze exactly at this point)
-
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
- You can test this bug very easily:
-
Spawn tons Flame Ghosts and minimize the window
- /ma "Flame Ghost" 100
- /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:
1st Way) refresh only once every 256 frames = 4-6 seconds depending on the lag
2nd Way) effect manager refresh for every frame
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
- 2
- 1
-
The granny controller freezing the process for n seconds until you get dc'd from the game
-
1 minute ago, TMP4 said:
Yep did it 4 days ago, Libs.txt in Mega
There I tell people to install packages (all listed) what contains their missing libs.Good today I try download your project and help you if I something found
- 2
-
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...
- 1
-
On 9/8/2021 at 9:48 PM, snapkode said:
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.
- 5
- 5
- 2
-
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..
-
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..
- 1
-
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..
-
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..
- 1
-
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..
- 1
-
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
- 1
Open Source CRC Patcher
in Tools & Programs
Posted
Using this patcher 5 years and I never had problem same as my players.. Never problem with antivirus...