Jump to content

DerUranov97

Member
  • Posts

    18
  • Joined

  • Last visited

  • Feedback

    0%

About DerUranov97

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

DerUranov97's Achievements

Enthusiast

Enthusiast (6/16)

  • Conversation Starter
  • One Year In
  • Collaborator Rare
  • First Post
  • One Month Later

Recent Badges

40

Reputation

  1. I mean, why not, I don't know if it'll really take off, but I wish you the best of luck. Metin has always been a grind game. Story, complexity, or super deep PvP were never its strong points. It's all about simple PvM, smacking mobs for hours, and grinding. If you can keep that gameplay loop fun and alive, I'm sure there'll be people who'll stick around and play it.
  2. Hello everyone, I'd like to release the source code of Ducky to the community. I don't have much time to continue working on it because I'm focused on other projects. I'd be happy if the Metin2 community came together and continued its development. Feel free to contribute on GitHub, submit improvements, fix issues, or suggest new features. You're also welcome to use parts of the source code in your own projects, as long as it's not for commercial or resale purposes. This was my very first tool for Metin2, so some parts of the code are a bit messy. At the time, AI coding assistants weren't nearly as capable as they are today, so I had to figure out and fix a lot of things on my own. I'd be happy to see your improvements and contributions. Please note that I will not provide support or technical assistance for this project. Requirements Visual Studio 2022 or newer (Visual Studio 2026 recommended) CMake I hope this project can still be useful to others. Enjoy! Bone support, mse, aniamtion, record, rendermaker etc etc, maybe u saw it on other forums.
      • 23
      • Flame
      • Metin2 Dev
      • Love
      • Love
      • Good
  3. Good work, really. But it should be clear to everyone that this is only a basic version, there are bugs in it, and of course, a lot of it is only possible thanks to AI. Don't add too many updates, take it slow, test for stability, throw in a BOT and auth test stresser, because right now it doesn't look good.
  4. Almost everyone is still using DX9. So, completely correct. Only a few are using real DX11/12, no wrapper. Good work, nice to see what's possible, but what about performance?
  5. My recommendation: don't do it. iGPUs will have problems with it. Yes, there are powerful iGPUs like the ones in the Steam Deck, etc., but there are also very weak, very common notebook iGPUs like Intel's UHD770. And you won't be doing Linux users any favors Of course, you can build in a fallback, but if you're willing to make that many changes, find someone to port the game to DX11 for you. It's complicated but significantly safer. DX11 alone allows you at least 2-3% more CPU usage. Multithreading is possible, but that requires even more code changes. Example: DX11-Alpha - no MT 1000 Bots +700NPC + Half Full Terrain x8MSAA x16AF
  6. The fix for the bow, in case it crashes for you. my .md Still in current src. ## Problem Beim Bogenangriff kann der Client crashen, wenn das Ziel während/kurz nach dem Schuss gelöscht wird (z.B. `HEADER_GC_DEAD` / `HEADER_GC_CHARACTER_DEL`) und danach ein Anim-Event (`OnSetFlyTarget`) noch auf einen ungültigen Target-Pointer zugreift. --- ## Dateien - `PythonPlayerEventHandler.h` - `PythonPlayerEventHandler.cpp` --- ## Schritt 1: Header patchen Öffne: - `PythonPlayerEventHandler.h` Ersetze in `CPythonPlayerEventHandler` die Klasse `CNormalBowAttack_FlyEventHandler_AutoClear` (inkl. Member) durch: ```cpp class CNormalBowAttack_FlyEventHandler_AutoClear : public IFlyEventHandler { public: CNormalBowAttack_FlyEventHandler_AutoClear() : m_pParent(nullptr), m_pInstMain(nullptr), m_dwTargetVID(0) {} virtual ~CNormalBowAttack_FlyEventHandler_AutoClear() {} void Set(CPythonPlayerEventHandler * pParent, CInstanceBase * pInstMain, CInstanceBase * pInstTarget); void SetTarget(CInstanceBase* pInstTarget); virtual void OnSetFlyTarget(); virtual void OnShoot(DWORD dwSkillIndex); virtual void OnNoTarget() { /*Tracenf("Shoot : target?");*/ } virtual void OnExplodingOutOfRange() { /*...*/ } virtual void OnExplodingAtBackground() { /*...*/ } virtual void OnExplodingAtAnotherTarget(DWORD dwSkillIndex, DWORD dwVID); virtual void OnExplodingAtTarget(DWORD dwSkillIndex); protected: CPythonPlayerEventHandler * m_pParent; CInstanceBase * m_pInstMain; DWORD m_dwTargetVID; TPixelPosition m_kPPosTarget; } m_NormalBowAttack_FlyEventHandler_AutoClear; Crash cause. The handler stores a raw CInstanceBase* m_pInstTarget for bow targets. When the target is deleted, the pointer becomes dangling. Later animation or OnSetFlyTarget events dereference freed memory and crash. Fix effect. The fix removes the raw pointer and tracks m_dwTargetVID and TPixelPosition m_kPPosTarget, initialized to zero. The target is revalidated or resolved by VID and position before use, preventing use-after-free and stopping crashes when the target disappears mid-flight.
  7. Has anyone tested the bow recently? Sequence: Bow attack 2-3 attacks, then movement = log out. If this is still happening for you, I'll be happy to post the fix as a thank you for your work. I'm already using a heavily modified version.
  8. I haven't tested this, but I can't imagine that anyone will still be using a 32-bit system in 2025. I believe the mainstream market has been using x64 since 2003. win10 was the last 32bit system. win11 only 64bit. Systems running on Linux 32-bit won't be able to start/play anything anyway.
  9. This should work for everyone. If I have forgotten something and it does not work, please contact me. It is the simple version with isHeight & Normal. Gyazo: Shadow Bridge # Shadow System for isHeight Objects ## Overview isHeight objects (bridges, platforms) receive shadows but do not cast shadows. ## Changes ### 1. ThingInstance.h **File:** `/src/EterGrnLib/ThingInstance.h` Add after `bool HaveBlendThing();`: ```cpp bool HaveBlendThing(); bool IsHeightObject(); ``` --- ### 2. ThingInstance.cpp **File:** `/src/EterGrnLib/ThingInstance.cpp` Add after HaveBlendThing() method: ```cpp bool CGraphicThingInstance::HaveBlendThing() { for (int i = 0; i < m_LODControllerVector.size(); i++) { if (m_LODControllerVector[i]->HaveBlendThing()) return true; } return false; } bool CGraphicThingInstance::IsHeightObject() { return (m_pHeightAttributeInstance && m_pHeightAttributeInstance->IsHeightData()); } ``` --- ### 3. Area.cpp **File:** src/GameLib/Area.cpp` In Refresh() method: ```cpp if (pObjectInstance->isShadowFlag) { bool isHeightOnly = (pObjectInstance->pAttributeInstance && pObjectInstance->pAttributeInstance->IsHeightData()); if (!isHeightOnly) { m_ShadowThingCloneInstaceVector.push_back(pObjectInstance->pThingInstance); } } ``` --- ### 4. MapOutdoorRender.cpp **File:** GameLib/MapOutdoorRender.cpp` Struct definition: ```cpp struct CMapOutdoor_FOpaqueThingInstanceRenderWithShadow { LPDIRECT3DTEXTURE9 m_lpShadowTexture; CMapOutdoor_FOpaqueThingInstanceRenderWithShadow(LPDIRECT3DTEXTURE9 lpShadowTex) : m_lpShadowTexture(lpShadowTex) {} inline void operator () (CGraphicThingInstance * pkThingInst) { if (pkThingInst->IsHeightObject()) { STATEMANAGER.SetTexture(1, m_lpShadowTexture); STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); STATEMANAGER.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT); STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); pkThingInst->RenderWithShadowTexture(); } else { STATEMANAGER.SetTexture(1, NULL); STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); pkThingInst->Render(); } } }; ``` Function call: ```cpp std::for_each(s_kVct_pkOpaqueThingInstSort.begin(), s_kVct_pkOpaqueThingInstSort.end(), CMapOutdoor_FOpaqueThingInstanceRenderWithShadow(m_lpCharacterShadowMapTexture)); ``` --- ### 5. AttributeInstance (if IsHeightData() is missing) **File:** `client source 26.11/src/GameLib/AttributeInstance.cpp` ```cpp bool CAttributeInstance::IsHeightData() const { if (!m_pAttributeData) return false; return m_pAttributeData->IsHeightData(); } ``` --- ## Behavior **Shadow Receiving:** - isHeight objects: Receive shadows - Normal buildings: Do not receive shadows **Shadow Casting:** - isHeight objects: Do not cast shadows - Normal buildings: Cast shadows ---
  10. It's a bit tricky. That was an older video. Dynamic Shadow/Sun only knows the difference between isHeight and normal. With changes and writing in what the bridge is called, it works quite well. In my case, it's isBridge.
  11. I've already tried that with the wrapper. Yes, Vulkan is great, but unfortunately it causes problems with Metin, iGPU, dGPU/Optimus. Especially with Nvidia, it causes critical problems such as flickering with MSAA ON and OFF. With DX9EX, you're in a very good position. What you can try is dgvoodoo. I don't know if it runs better than dx9ex, because that already runs very stably. A lot is possible with dx9ex. With optimization and switching to FreeType2, you're in a better position. For example: DX9EX Freetype2 <-- Gyazo
  12. If you want shadows for bridges, etc., you must install a second shadow for the isPC and make adjustments in Area.cpp. Works for iGPUS + dGPUS. on 0:30 bridge: The trees don't cast any shadows because of the billboard, so I'll have to think about that some more. Thanks for the release.
  13. It is also said that it is not a build for everyone. It takes a lot of work, yes, but a project should be built from the ground up. You should know what you have changed and added; git is your friend. I am currently running the source with 1000 player bots, and it has been running really well for 5 days without any memory leaks.
  14. It’s a solid foundation for a clean project. I’ve been working with it for a few days now, and thanks to 64-bit and DX9Ex, completely new shader possibilities are opening up.
×
×
  • 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.