Jump to content

blaxis

Active+ Member
  • Posts

    222
  • Joined

  • Last visited

  • Feedback

    0%

Posts posted by blaxis

  1. Hi all. From the source code, I attach a different object to an NPC or another object as ATTACH_DATA, but the connected object appears in the default position.
    For example; Let's say I tie a sword to an NPC's waist. However, the sword is displayed stationary and sideways. In this case, is there any way I can rotate this sword clockwise? (This was just an example, all I want to do is rotate these connected objects clockwise..)

     

    I would be glad if you could help me, good work.

  2. On 2/5/2024 at 10:31 PM, HFWhite said:

    something's not right... https://metin2.download/video/6oJ3H4kV1CxE491DeFc0e880h1o0gQvo/.mp4

    Edit: @ Mitachi helped me solve it and as of right now I think he's already updating the repo xd. Thanks man! for now, everything works perfectly.. I will test further anyway and If I find something I will reply here.

    Gif:  https://metin2.download/video/bWjqWo5Jus1rBb84T5U7PYyWTK11jh7P/.mp4

     

    also! dont forget to uninstall the quest

    I'm having the same problem right now. What is the solution to this?
    I removed the quests.

  3. Can someone show me an example usage?
    How should we adapt it to other windows?
    For example, the task list.(in character window -> quest)

    On 12/28/2022 at 2:19 PM, filipw1 said:

    scrollowanie_masne_fest.gif

    To get smooth scrolling like this in music, guild symbol selection (and maybe some custom systems you already have idk), just replace ListBoxEx class.

      Reveal hidden contents

    https://pastebin.com/MwRS82jG

     

    class ListBoxEx(Window):
        class Item(Window):
            def __init__(self):
                Window.__init__(self)
     
            def __del__(self):
                Window.__del__(self)
     
            def SetParent(self, parent):
                Window.SetParent(self, parent)
                self.parent = proxy(parent)
     
            def OnMouseLeftButtonDown(self):
                self.parent.SelectItem(self)
     
            def OnRender(self):
                if self.parent.GetSelectedItem() == self:
                    self.OnSelectedRender()
     
            def OnSelectedRender(self):
                x, y = self.GetGlobalPosition()
                grp.SetColor(grp.GenerateColor(0.0, 0.0, 0.7, 0.7))
                grp.RenderBar(x, y, self.GetWidth(), self.GetHeight())
     
        def __init__(self):
            Window.__init__(self)
     
            self.viewItemCount = 10
            self.basePos = 0
            self.itemHeight = 16
            self.itemStep = 20
            self.selItem = 0
            self.itemList = []
            self.onSelectItemEvent = lambda *arg: None
     
            if localeInfo.IsARABIC():
                self.itemWidth = 130
            else:
                self.itemWidth = 100
     
            self.scrollBar = None
            self.__UpdateSize()
     
        def __del__(self):
            Window.__del__(self)
     
        def __UpdateSize(self):
            height = self.itemStep * self.__GetViewItemCount()
     
            self.SetSize(self.itemWidth, height)
     
        def IsEmpty(self):
            if len(self.itemList) == 0:
                return 1
            return 0
     
        def SetItemStep(self, itemStep):
            self.itemStep = itemStep
            self.__UpdateSize()
     
        def SetItemSize(self, itemWidth, itemHeight):
            self.itemWidth = itemWidth
            self.itemHeight = itemHeight
            self.__UpdateSize()
     
        def SetViewItemCount(self, viewItemCount):
            self.viewItemCount = viewItemCount
     
        def SetSelectEvent(self, event):
            self.onSelectItemEvent = event
     
        def SetBasePos(self, basePos):
            if app.__BL_CLIP_MASK__:
                self.basePos = basePos
     
                curbp = self.basePos
     
                itemheight = self.itemStep * len(self.itemList)
                myheight = self.GetHeight()
     
                if itemheight < myheight:
                    curbp = 0
     
                fromPos = curbp
                curPos = 0
                toPos = curbp + self.GetHeight()
                for item in self.itemList:
                    if curPos + self.itemStep < fromPos or curPos > toPos:
                        item.Hide()
                    else:
                        item.Show()
     
                    item.SetPosition(0, curPos - fromPos)
                    curPos += self.itemStep
            else:
                for oldItem in self.itemList[self.basePos:self.basePos + self.viewItemCount]:
                    oldItem.Hide()
     
                self.basePos = basePos
     
                pos = basePos
                for newItem in self.itemList[self.basePos:self.basePos + self.viewItemCount]:
                    (x, y) = self.GetItemViewCoord(pos, newItem.GetWidth())
                    newItem.SetPosition(x, y)
                    newItem.Show()
                    pos += 1
     
        def GetItemIndex(self, argItem):
            return self.itemList.index(argItem)
     
        def GetSelectedItem(self):
            return self.selItem
     
        def SelectIndex(self, index):
     
            if index >= len(self.itemList) or index < 0:
                self.selItem = None
                return
     
            try:
                self.selItem = self.itemList[index]
            except:
                pass
     
        def SelectItem(self, selItem):
            self.selItem = selItem
            self.onSelectItemEvent(selItem)
     
        def RemoveAllItems(self):
            for item in self.itemList:
                item.Hide()
     
            self.selItem = None
            self.itemList = []
     
            if self.scrollBar:
                self.scrollBar.SetPos(0)
     
        def RemoveItem(self, delItem):
            if delItem == self.selItem:
                self.selItem = None
     
            self.itemList.remove(delItem)
     
        def AppendItem(self, newItem):
            newItem.SetParent(self)
            newItem.SetSize(self.itemWidth, self.itemHeight)
     
            if app.__BL_CLIP_MASK__:
                newItem.SetClippingMaskWindow(self)
     
            pos = len(self.itemList)
            if self.__IsInViewRange(pos):
                (x, y) = self.GetItemViewCoord(pos, newItem.GetWidth())
                newItem.SetPosition(x, y)
                newItem.Show()
            else:
                newItem.Hide()
     
            self.itemList.append(newItem)
     
        def SetScrollBar(self, scrollBar):
            scrollBar.SetScrollEvent(__mem_func__(self.__OnScroll))
            self.scrollBar = scrollBar
     
        def __OnScroll(self):
            if app.__BL_CLIP_MASK__:
                self.SetBasePos(int(self.scrollBar.GetPos() * (self.__GetItemCount() - 1) * self.itemStep))
            else:
                self.SetBasePos(int(self.scrollBar.GetPos() * self.__GetScrollLen()))
     
        def __GetScrollLen(self):
            scrollLen = self.__GetItemCount() - self.__GetViewItemCount()
            if scrollLen < 0:
                return 0
     
            return scrollLen
     
        def __GetViewItemCount(self):
            return self.viewItemCount
     
        def __GetItemCount(self):
            return len(self.itemList)
     
        def GetItemViewCoord(self, pos, itemWidth):
            if localeInfo.IsARABIC():
                return (self.GetWidth() - itemWidth - 10, (pos - self.basePos) * self.itemStep)
            else:
                return (0, (pos - self.basePos) * self.itemStep)
     
        def __IsInViewRange(self, pos):
            if pos < self.basePos:
                return 0
            if pos >= self.basePos + self.viewItemCount:
                return 0
            return 1

     

    Not working. As you show, the sliding process does not occur, there is visual distortion.

  4. 12 minutes ago, CONTROL said:

    Thx,

    You might consider using a separate thread and sleep() if you're worried about performance or just check the root (if your index is from the source) nothing else really matter,

    but the thing here is that you can just cython your root and avoid all this non sense + improve the performance ,

    And if you wanted an extra protection on the root you can also use dynamic python moudles,

    Both of these things are already shared in here..

    Yes, they can be used too. However, the point I am talking about here covers all pack files, not just root. The root file does not continue the game after any editing and it gives an error and closes. But this is not the case for other pack files, the game continues even if intervention is made. Here I just presented a small idea to prevent this. Anyone can customize it as they wish and use it as a small add-on. Or he may not use it.

  5. Hello, I have been hearing about the existence of such an event from time to time. I thought of creating such a solution. I haven't had any problems so far in my tests.

    To briefly talk about the incident; Some pack files can be opened and edited while the game is open. This may pose a problem in some exceptional cases.
    Most of the time, changes made due to cache may not be reflected in the game unless the client is reset, but I still thought it wouldn't hurt to prevent this situation.
    In addition; Nowadays, foxfs etc. methods are used, so you can also consider this as additional security for your game.

    The codes are completely open to development and customization, you can progress them in any direction you want.
    I should point out that this method will work more efficiently with autopatcher. So, you also have a job to do here, the codes I share here are the first stage of this system. The necessary adjustments you will make to the autopatcher depending on these codes will be the second stage.

    To give an example from the working logic; As soon as the pack file named x is edited, the game will close completely, and when it is opened again, autopatcher (if there is a file integrity feature, etc.) will download the original instead of this edited pack file and allow you to log in from the original file.
    Likewise, if there is any intervention in the pack files again, these operations will be repeated automatically. (This is the idea I suggested, anyone can use it however they want.)

    Now let's get to the point..


    Here's a short video showing it before editing:

    After video:

     

    This is the hidden content, please

    For those who are curious; The codes run only once when the client is opened and only keep track of the pack files as long as the game (client) is open. In other words, it does not work repeatedly in situations such as teleportation or casting a character.

    • Metin2 Dev 52
    • Eyes 1
    • Smile Tear 1
    • Good 4
    • Love 11
  6. 47 minutes ago, peaceofficial said:

    This is not good because of external, recommended to use create device etc after that it should look like this:

    https://metin2.download/video/63s63mMciGVNS63mJHG0tyYa84Bd45HW/.mp4

    I am the person who prepared the mentioned .dll files. Yes, it is not a very healthy method, but it is still an alternative for those who want to use it.
    The codes within the DLL are dynamic, meaning it implements as much MSAA as the GPU supports. If it doesn't support it, it won't apply. Device creation etc. It is applied depending on the transactions. It has no other duty.

    • Love 2
  7. On 1/18/2024 at 9:01 PM, Filachilla said:

    Only MSAA as I know, but this look very horrible in game.. (font problems, etc..) Primary is better just implement dx9..

    Edit: Btw. these things are possible to fix, but for what? No sense do it..

    If you do this with a wrapper yes you will run into these problems. Because the wrapper is applied to many elements, including ETC. However, when done from source code, none of these problems occur. Because the wrapper doesn't know which Render does what task and applies the effect anyway. It is automatically applied to all rendering operations such as textail rendering, interface rendering, character rendering.

  8. Hello. As you know, the LibJPEG library in Metin2 is only useful for taking screenshots. Other than that, it doesn't have any duties.

    Those who have Directx9 and want to take better quality screenshots with this method can follow this guide carefully.
    Those who use Directx8 can update the code I will give according to Directx8 and try it, I did not have the chance to try it.

    Make sure you are determined before following the steps here. Because as a result of these operations, you will no longer have the libjpeg library, and the screenshot files will reach larger sizes than the jpg file, depending on the quality. (between 3-8MB)

    The explanation will be a bit complicated, but if you follow each process in order, you will not have any problems. If you still have a problem, you can report it below.
     

    First, let's get rid of libjpeg:

    -> Enter the Client src/extern/lib folder and delete the .lib files whose file name starts with libjpeg...
    -> Enter the Client src/EterLib folder and delete the JpegFile.cpp & JpegFile.h files. Open the EterLib project in Visual Studio in the same way, select these two files and remove them.

    -> Open the client src/EterPythonLib/PythonGraphic.cpp file and remove the following include line and functions:

    #include "../eterLib/JpegFile.h"
    ---------------------------------
    
    void GenScreenShotTag(const char* src, DWORD crc32, char* leaf, size_t leafLen){
        const char* p = src;
        const char* n = p;
        while (n = strchr(p, '\\'))
            p = n + 1;
    
        _snprintf(leaf, leafLen, "YMIR_METIN2:%s:0x%.8x", p, crc32);
    }
    
    bool CPythonGraphic::SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight)
    {
        return jpeg_save(pbyBuffer, uWidth, uHeight, 100, pszFileName) != 0;
    }

    -> Where you delete these, you will see this function:

    bool CPythonGraphic::SaveScreenShot(const char* c_pszFileName)
    {

    -> Replace this function completely like this:

    bool CPythonGraphic::SaveScreenShot()
    {
        LPDIRECT3DSURFACE9 lpSurface = nullptr;
        D3DSURFACE_DESC stSurfaceDesc = {};
    
        uint32_t uWidth = stSurfaceDesc.Width;
        uint32_t uHeight = stSurfaceDesc.Height;
    
        ms_lpd3dDevice->CreateOffscreenPlainSurface(uWidth, uHeight, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &lpSurface, NULL);
    
        if (SUCCEEDED(ms_lpd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpSurface)))
        {
            if (!CreateDirectory("screenshot", NULL) && ERROR_ALREADY_EXISTS != GetLastError()) //yoksa oluştur
                return false;
    
    
            SYSTEMTIME st;
            GetSystemTime(&st);
            char szFileName[MAX_PATH];
            sprintf_s(szFileName, "screenshot/screenshot_%04d%02d%02d_%02d%02d%02d.bmp", // eşsiz
                st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
    
            D3DXSaveSurfaceToFile(szFileName, D3DXIFF_BMP, lpSurface, NULL, NULL);
        }
        else
            TraceError("CPythonGraphic::SaveScreenShot() - ScreenShot Basarisiz!");
    
        // yok et
        if (lpSurface)
        {
            lpSurface->Release();
            lpSurface = nullptr;
        }
    
        return true;
    }

    -> Then remove the following from the PythonGraphic.h file:

    bool SaveJPEG(const char* pszFileName, LPBYTE pbyBuffer, UINT uWidth, UINT uHeight);

    -> In the same file there will be:

    bool SaveScreenShot(const char* szFileName);

    -> Update this to:

    bool SaveScreenShot();

    -> Open PythonGraphicModule.cpp and delete this

    PyObject* grpSaveScreenShot(PyObject* poSelf, PyObject* poArgs)
    {
        struct tm* tmNow;
        time_t ct;
    
        ct = time(0);
        tmNow = localtime(&ct);
    
        char szPath[MAX_PATH + 256];
        SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, TRUE);
        //GetTempPath();
        strcat(szPath, "\\METIN2\\");
    
        if (-1 == _access(szPath, 0))
            if (!CreateDirectory(szPath, NULL))
            {
                TraceError("Failed to create directory [%s]\n", szPath);
                return Py_BuildValue("(is)", FALSE, "");
            }
    
        sprintf(szPath + strlen(szPath), "%02d%02d_%02d%02d%02d.jpg",
            tmNow->tm_mon + 1,
            tmNow->tm_mday,
            tmNow->tm_hour,
            tmNow->tm_min,
            tmNow->tm_sec);
    
        BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath);
        return Py_BuildValue("(is)", bResult, szPath);
    }

    -> and delete this:

    { "SaveScreenShot",                grpSaveScreenShot,                METH_VARARGS },

    -> Find the following function in the same file

    PyObject* grpSaveScreenShotToPath(PyObject* poSelf, PyObject* poArgs)
    {

    -> Replace this function completely with the code I gave below.

    PyObject* grpSaveScreenShotToPath(PyObject* poSelf, PyObject* poArgs)
    {
        CPythonGraphic::Instance().SaveScreenShot();
        return Py_BuildNone();
    }

     

     

    -> We are done with the client src. Now open root/game.py and find this function:

    def SaveScreen(self):
            print "save screen"
    
            # SCREENSHOT_CWDSAVE
            if SCREENSHOT_CWDSAVE:
                if not os.path.exists(os.getcwd()+os.sep+"screenshot"):
                    os.mkdir(os.getcwd()+os.sep+"screenshot")
    
                (succeeded, name) = grp.SaveScreenShotToPath(os.getcwd()+os.sep+"screenshot"+os.sep)
            elif SCREENSHOT_DIR:
                (succeeded, name) = grp.SaveScreenShot(SCREENSHOT_DIR)
            else:
                (succeeded, name) = grp.SaveScreenShot()
            # END_OF_SCREENSHOT_CWDSAVE
    
            if succeeded:
                pass
                """
                chat.AppendChat(chat.CHAT_TYPE_INFO, name + localeInfo.SCREENSHOT_SAVE1)
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE2)
                """
            else:
                chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE_FAILURE)

    -> ..and update it like this:

    	def SaveScreen(self):
    		grp.SaveScreenShotToPath()

    .png

     

    You can also search and delete the variables in the original Python code above from root.

    I'm sorry for my bad english.

    • Metin2 Dev 4
    • Good 2
    • Love 2
    • Love 2
  9. On 2/7/2023 at 2:23 AM, martysama0134 said:

    I found the bug on the v1.8.0:

    They save the direction in the .tga:

    sjA0DEa.png

    When MarkImage.cpp loads the .tga it does ilOriginFunc(IL_ORIGIN_UPPER_LEFT); and it gets flipped.

    By commenting these lines directly in the IL src, it gets resolved.

    This is the hidden content, please

    Hello. Can you tell me how to solve this problem? I applied the changes you gave via visual studio and compiled it(32bit). When I tested the resulting dll file, the guild icons in the game became completely invisible. I also uploaded your lib files to the server, but it's still the same. When I select the guild icon, no .tga or anything like that is created on the server side and it does not appear in the game.

     

    I'm using bsd 13.0 - 32bit

  10. 25 minutes ago, SCOOB said:

    Another woraround:

    Download dgVoodo2, put the files frfom folder MS -> x86 in your client, open then dgVoodooCpl.exe and select 8x on aliasing.(DirectX menu)

    I managed to fix the anti aliasing, but i have an annoying bug. The spaces from spacebar have a weird dot. That's the only bug.

     

    spacer.png

    https://metin2.download/video/5ziLcW02Euopy91b49lPtNL7J1Hx52B4/.mp4

    I have used and tried many wrappers like dgvodo. ReShade, GShade,dgVodo etc. None of them satisfied me. I am more in favor of solving this issue by the source. Additionally, dgvodoo increases memory usage excessively. A single client consumes between 550-650mb. Using such large memory just to enable MSAA is pointless.

    I've been trying for weeks and this is where I'm at now(Metin2 client source codes only )

    spacer.png

     

  11. 5 minutes ago, SCOOB said:

    I found an ANTIALIASING FIX for Directx9

     

    //Search for in EtherLib/GrpDevice.cpp:

    ms_dwD3DBehavior = pkD3DModeInfo->m_dwD3DBehavior;

    //and it is added immediately on top:

        for (uint8_t i = 0; i <= D3DMULTISAMPLE_8_SAMPLES; i++)
        {
            const auto multisamplelevel = static_cast<D3DMULTISAMPLE_TYPE>(i);
            const auto result = ms_lpd3d->CheckDeviceMultiSampleType(ms_iD3DAdapterInfo, D3DDEVTYPE_HAL, ms_d3dPresentParameter.BackBufferFormat, Windowed, multisamplelevel, nullptr); // !!! REMOVE nullptr FOR DX8 !!!
    
            if (SUCCEEDED(result))
            {
    #ifdef _DEBUG
                TraceError("multisamplelevel == %u", multisamplelevel);
    #endif
                ms_d3dPresentParameter.MultiSampleType = multisamplelevel;
            }
        }


    // Search for in EtherLib/GrpScreen.cpp:

    void CScreen::RenderBar3d(float sx, float sy, float sz, float ex, float ey, float ez)

    //and the function is completely replaced;

    void CScreen::RenderBar3d(float sx, float sy, float sz, float ex, float ey, float ez)
    {
        assert(ms_lpd3dDevice != NULL);
    
        SPDTVertexRaw vertices[4] =
        {
            // HARD FIX BEGIN
            { sx - 0.5f, sy - 0.5f, sz, ms_diffuseColor, 0.0f, 0.0f },
            { sx - 0.5f, ey - 0.5f, ez, ms_diffuseColor, 0.0f, 0.0f },
            { ex - 0.5f, sy - 0.5f, sz, ms_diffuseColor, 0.0f, 0.0f },
            { ex - 0.5f, ey - 0.5f, ez, ms_diffuseColor, 0.0f, 0.0f },
            // HARD FIX END
        };
    
        if (SetPDTStream(vertices, 4))
        {
            STATEMANAGER.SetTexture(0, NULL);
            STATEMANAGER.SetTexture(1, NULL);
            STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);
            STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
        }
    }

     

    I know this.

    This is not a fix and it is dangerous to use it this way. Unfortunately, DirectX codes are not as simple as you think.

  12. Hello. K I'm having a little problem with inventory. As you can see from the picture, when I drag the bonus replacement item to a weapon or armor in the first slot of the inventory, it does not detect the bottom slot. It only detects the upper slot.

    And this situation happens only once. If I drag it to the upper slot first, then the lower slot is also detected.
    The same goes for stones.

    Actually, the thing is this; This problem occurs if the item in the K inventory and the item in the normal inventory are in the first slot on both sides.

     

    spacer.png

  13. Hello, when I drag an item from the inventory to the market and try to sell it, it only shows me the name "Moon Essence" and shows it as 0 yang.

    It does this on all items.

    However, when I click the "Sell" button in the Market and select items from the inventory, it displays properly.

    There is no problem in the source codes, when I look at the ch1 logs, the SELL operation looks completely normal. There is such a display problem only in the game.

    I would really appreciate if you could help, thank you.

    uiShop.py(But there is no problem here):

    	def SellAttachedItem(self):
    
    		if shop.IsPrivateShop():
    			mouseModule.mouseController.DeattachObject()
    			return
    
    		attachedSlotType = mouseModule.mouseController.GetAttachedType()
    		attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
    		attachedCount = mouseModule.mouseController.GetAttachedItemCount()
    		if localeInfo.IsBRAZIL() == 0:
    			attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
    		if app.ENABLE_SPECIAL_STORAGE:
    			if player.SLOT_TYPE_INVENTORY == attachedSlotType or player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType or player.SLOT_TYPE_UPGRADE_INVENTORY == attachedSlotType or	player.SLOT_TYPE_BOOK_INVENTORY == attachedSlotType or player.SLOT_TYPE_STONE_INVENTORY == attachedSlotType or player.SLOT_TYPE_FLOWER_INVENTORY == attachedSlotType or player.SLOT_TYPE_ATTR_INVENTORY == attachedSlotType or player.SLOT_TYPE_CHEST_INVENTORY == attachedSlotType:
    
    				item.SelectItem(attachedItemIndex)
    
    				if item.IsAntiFlag(item.ANTIFLAG_SELL):
    					popup = uiCommon.PopupDialog()
    					popup.SetText(localeInfo.SHOP_CANNOT_SELL_ITEM)
    					popup.SetAcceptEvent(self.__OnClosePopupDialog)
    					popup.Open()
    					self.popup = popup
    					return
    
    				itemtype = player.SlotTypeToInvenType(attachedSlotType)
    
    				if player.IsValuableItem(itemtype, attachedSlotPos):
    
    					itemPrice = item.GetISellItemPrice()
    
    					if item.Is1GoldItem():
    						itemPrice = attachedCount / itemPrice / 5
    					else:
    						itemPrice = itemPrice * max(1, attachedCount) / 5
    
    					itemName = item.GetItemName()
    
    					questionDialog = uiCommon.QuestionDialog()
    					questionDialog.SetText(localeInfo.DO_YOU_SELL_ITEM(itemName, attachedCount, itemPrice))
    
    					questionDialog.SetAcceptEvent(lambda arg1=attachedSlotPos, arg2=attachedCount, arg3 = itemtype: self.OnSellItem(arg1, arg2, arg3))
    					questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
    					questionDialog.Open()
    					self.questionDialog = questionDialog
    
    				else:
    					self.OnSellItem(attachedSlotPos, attachedCount, itemtype)
    			else:
    				snd.PlaySound("sound/ui/loginfail.wav")
    		else:
    			if player.SLOT_TYPE_INVENTORY == attachedSlotType or player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:
    
    				if localeInfo.IsBRAZIL():
    					itemIndex = player.GetItemIndex(attachedSlotPos)
    					item.SelectItem(itemIndex)
    				else:
    					item.SelectItem(attachedItemIndex)
    				
    				if item.IsAntiFlag(item.ANTIFLAG_SELL):
    					popup = uiCommon.PopupDialog()
    					popup.SetText(localeInfo.SHOP_CANNOT_SELL_ITEM)
    					popup.SetAcceptEvent(self.__OnClosePopupDialog)
    					popup.Open()
    					self.popup = popup
    					return
    					
    				itemtype = player.INVENTORY
    
    				if localeInfo.IsBRAZIL() == 0:
    					if player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:
    						itemtype = player.DRAGON_SOUL_INVENTORY
    				
    				if player.IsValuableItem(itemtype, attachedSlotPos):
    
    					itemPrice = item.GetISellItemPrice()
    
    					if item.Is1GoldItem():
    						itemPrice = attachedCount / itemPrice / 5
    					else:
    						itemPrice = itemPrice * max(1, attachedCount) / 5
    
    					itemName = item.GetItemName()
    
    					questionDialog = uiCommon.QuestionDialog()
    					questionDialog.SetText(localeInfo.DO_YOU_SELL_ITEM(itemName, attachedCount, itemPrice))
    
    					questionDialog.SetAcceptEvent(lambda arg1=attachedSlotPos, arg2=attachedCount, arg3 = itemtype: self.OnSellItem(arg1, arg2, arg3))
    					questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
    					questionDialog.Open()
    					self.questionDialog = questionDialog
    			
    					constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1)
    
    				else:
    					self.OnSellItem(attachedSlotPos, attachedCount, itemtype)
    
    			else:
    				snd.PlaySound("sound/ui/loginfail.wav")
    
    		mouseModule.mouseController.DeattachObject()

     

  14. 7 hours ago, Filachilla said:

    Your problem is not reshade but dx implementation..

    @m2Ciaran yea, here are some my results

    without:

      Hide contents

    .png

    with:

      Hide contents

    .png

     

    There is no problem with Directx. I fixed all the problems and it works fine. Also, I don't understand why no one wants to help with how to apply effects like MSAA. I don't think there is such information worth hiding.

    • Good 2
  15. 23 minutes ago, m2Ciaran said:

    Looks like I got similar results. Kinda nice, also look good on weapons for example

    before

    spacer.png

    after

    spacer.png


     

      Hide contents

    spacer.png

    spacer.png

     

     

     

    How can I do this?

     

    9 hours ago, Tatsumaru said:

    Try this:
    Open StateManager.cpp and find this:

    void CStateManager::SetDevice(LPDIRECT3DDEVICE8 lpDevice)
    {
        StateManager_Assert(lpDevice);
        lpDevice->AddRef();
    
        if (m_lpD3DDev)
        {
            m_lpD3DDev->Release();
            m_lpD3DDev = NULL;
        }
    
        m_lpD3DDev = lpDevice;
    
        D3DCAPS8 d3dCaps;
        m_lpD3DDev->GetDeviceCaps(&d3dCaps);
    
        if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
            m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
        else
            m_dwBestMagFilter = D3DTEXF_LINEAR;
        
        if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
            m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
        else
            m_dwBestMinFilter = D3DTEXF_LINEAR;
    
        DWORD dwMax = d3dCaps.MaxAnisotropy;
        dwMax = dwMax < 4 ? dwMax : 4;
    
        for (int i = 0; i < 8; ++i)
            m_lpD3DDev->SetTextureStageState(i, D3DTSS_MAXANISOTROPY, dwMax);
    
        SetDefaultState();
    }


    And change to this:

    void CStateManager::SetDevice(LPDIRECT3DDEVICE8 lpDevice)
    {
        StateManager_Assert(lpDevice);
        lpDevice->AddRef();
    
        if (m_lpD3DDev)
        {
            m_lpD3DDev->Release();
            m_lpD3DDev = NULL;
        }
    
        m_lpD3DDev = lpDevice;
    
        SetDefaultState();
    }


    Find this:

    void CStateManager::SetDefaultState()
    {

    And change to this:

    void CStateManager::SetDefaultState()
    {
        D3DCAPS8 d3dCaps;
        m_lpD3DDev->GetDeviceCaps(&d3dCaps);
    
        if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
            m_dwBestMagFilter = D3DTEXF_ANISOTROPIC;
        else
            m_dwBestMagFilter = D3DTEXF_LINEAR;
        
        if (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
            m_dwBestMinFilter = D3DTEXF_ANISOTROPIC;
        else
            m_dwBestMinFilter = D3DTEXF_LINEAR;
    
        DWORD dwMax = d3dCaps.MaxAnisotropy;
        dwMax = dwMax < 4 ? dwMax : 4;
    
        for (int i = 0; i < 8; ++i)
            m_lpD3DDev->SetTextureStageState(i, D3DTSS_MAXANISOTROPY, dwMax);

    Source of knowledge: 

     

    Thank you. But I guess these don't apply MSAA. And unfortunately it didn't fix the ReShade issue

  16.  

    spacer.png

     

    The symbol of the riding skill(130) does not appear. Anyone have any ideas about this?

     

    	def __RefreshSkillPage(self, name, slotCount):
    			global SHOW_LIMIT_SUPPORT_SKILL_LIST
    			#global BLOCK_SUPPORT_SKILL_LIST
    
    			skillPage=self.skillPageDict[name]
    
    			startSlotIndex=skillPage.GetStartIndex()
    
    			if "ACTIVE"==name:
    				if self.PAGE_HORSE==self.curSelectedSkillGroup:
    					startSlotIndex+=slotCount
    
    			getSkillType=skill.GetSkillType
    
    			getSkillIndex=player.GetSkillIndex
    			getSkillGrade=player.GetSkillGrade
    			getSkillLevel=player.GetSkillLevel
    
    			getSkillLevelUpPoint=skill.GetSkillLevelUpPoint
    			getSkillMaxLevel=skill.GetSkillMaxLevel
    
    			for i in xrange(slotCount+1):
    
    				slotIndex=i + startSlotIndex
    				skillIndex=getSkillIndex(slotIndex)
    
    				for j in xrange(self.SKILL_GRADE_SLOT_COUNT):
    					skillPage.ClearSlot(self.__GetRealSkillSlot(j, i))
    
    				if 0==skillIndex:
    					continue
    
    				# if skillIndex in BLOCK_SUPPORT_SKILL_LIST:
    					# continue
    
    				skillGrade=getSkillGrade(slotIndex)
    				skillLevel=getSkillLevel(slotIndex)
    				skillType=getSkillType(skillIndex)
    
    				if player.SKILL_INDEX_RIDING==skillIndex:
    					if 1==skillGrade:
    						skillLevel+=19
    					elif 2==skillGrade:
    						skillLevel+=29
    					elif 3==skillGrade:
    						skillLevel+=39
    					elif 4==skillGrade:
    						skillLevel=50
    
    					skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel)
    					skillPage.SetSlotCount(slotIndex, skillLevel)
    				elif skill.SKILL_TYPE_ACTIVE==skillType:
    					for j in xrange(self.SKILL_GRADE_SLOT_COUNT):
    						realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
    
    						if (skillGrade >= self.SKILL_GRADE_SLOT_COUNT) and j == (self.SKILL_GRADE_SLOT_COUNT-1):
    							skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, skillGrade, skillLevel)
    							skillPage.SetCoverButton(realSlotIndex)
    							skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
    						else:
    							skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
    							skillPage.SetCoverButton(realSlotIndex)
    							if (not self.__CanUseSkillNow()) or (skillGrade != j):
    								skillPage.SetSlotCount(realSlotIndex, 0)
    								skillPage.DisableCoverButton(realSlotIndex)
    							else:
    								skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
    
    						if player.IsSkillActive(slotIndex):
    							skillPage.ActivateSlot(self.__GetRealSkillSlot(skillGrade, slotIndex))
    				else:
    					if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
    						realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
    
    						skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
    						skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
    
    						if skill.CanUseSkill(skillIndex):
    							skillPage.SetCoverButton(realSlotIndex)
    
    				skillPage.RefreshSlot()

     

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