Jump to content

Rakancito

Contributor
  • Posts

    71
  • Joined

  • Last visited

  • Days Won

    9
  • Feedback

    100%

Posts posted by Rakancito

  1. I apologize to the guys above if I took the comments too personally, I was a little tired from the amount of messages I received that day, it wasn't good and I understand that I may have had a logic error in the code. I honestly hadn't looked at it before months and as I mentioned I was a little tired. But I suppose that more than one person will find what I shared useful to complete their Yohara.

    Regarding the contribution, if anyone gives me information about the floors of the tower I can finish it without any problem, correct the errors that were mentioned to me in the forum and share it. I have no problem with the tower being complete.

    .png

     

    On 2/24/2024 at 5:02 PM, PACI said:

    No one here is criticizing the completion level of the content you released. They are simply pointing out incorrect logic in your code. Why are you getting defensive about it?

    I was not in the mood.

    I'm going to steal your way of replying.

    On 2/24/2024 at 5:23 PM, Syreldar said:

    [...]

    I am going to respond to you because you told me things that made me cry...

    Do you know the difference between doing what @ martysama0134 or @ Amun did and what they did? They came with everything,

    And about humility, maybe I don't have it, but it's horrible that I came with the best intentions to share and they only attacked when I myself indicated that it wasn't finished and that they could finish it without any problem. Just take the important parts and delete the bad parts, it's not that hard.

    And about the coroutines, I don't think it's right that you're trying to tell me that I don't know such basic programming concepts, I can ask about encapsulation, polymorphism or overloading and I'm sure that with at least one you will search what I'm talking about.

    • I said repeatedly that C++ will always be faster than Lua and that each of the languages has its advantages and disadvantages.
    • I even commented that Lua has simpler syntax and is easier to learn than C++.
    • I also mentioned that it is not bad to program in Lua or C++ with good programming practices, that is fine, it is up to personal taste "in this case". It depends on the cost you want to suffer between each development and the lyfe cycle.
    • I repeat, in Lua you can still cause serious memory errors if you don't follow good programming practices. I have no problems doing things in Lua, I still program in Lua and do things in Lua.
    • I repeat: In both Lua and C++ you can cause problems, in reality this focuses on good programming practices.

    I have already received corrections before and I receive them with kindness as long as they are corrections and not attacks because they want everything for free and in many cases they do not have basic programming concepts.

    No developer is exempt from making code errors, "many around here should understand", it is a human quality and that is why concepts such as Software development lifecycle (SDLC) have been introduced. I have them, you have them, we all have them and the larger the code, the greater the number of errors. For this reason, there are techniques to reduce the number of code errors.

    It just happened, just as this time I had a logic error that I honestly didn't review, I have had many other contributions in this forum that I suppose many have used. So don't talk to me about humility when I'm only trying to collaborate and the only thing I receive is two or three people with problems and they don't provide arguments with a code correction that I don't mind receiving.

    NOTE: I don't believe I'm superior to people, but it is always better to say that something can be optimized and provide feedback than to come and attack with new accounts and have others take things personally.

     

    On 2/24/2024 at 8:22 PM, Amun said:

    [...]

    I was not in the mood.

      

    9 hours ago, martysama0134 said:

    [...]

    Thank you ❤️ .  I'm going to review the issue of repeated code and the rest that you told me, you're right.

     

    • Love 2
  2. 5 hours ago, msnas said:

    That's definitely going to crash the server.
    @ Rakancito, can you explain how you thought process of this code?

    OK maybe you need more primary studies for understand... 🙂

    REMEMBER: THIS IS CONTRIBUTION AND I SAID...

    Quote

    This is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers, In this files we have 2k or 3k LOC, maybe more, I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer and providing the information about the floors or modifying all floors like your concept for Metin2, you'll be a nice dungeon. I already did the hardest part.

    Maybe you need understand more about: "This is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers" and the other part about " I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer". I commented that I didn't give them the whole dungeon because I'm tired and I had incomplete information I was without information about the dungeon.

    Obiously I give you the more important part about interface... and you can complete this system with anydeveloper, you just need check all floors with the logic by the code. Just remove the problem lol.

    The difference between those who want everything for free and those who take advantage of opportunities to do work is this. I just decided to share something and indicated that I am tired and I have no information about the floors, maybe if someone gives me information about the floors I will complete it or you can fill it out.

    • Facepalm 2
    • muscle 2
  3. 53 minutes ago, WeedHex said:

    Checking the pointer from the beginning, but controlling it again before destroy and then using again. The guy meant this with the arrows.

    I agree about the use of LUA for dungeons. It's much faster and already prepared for use, without risk of memory, at the end it's linking c++, you got less lines and more order/safety.

     

    Obv it's good for pratice c++ doing as you did. 

    Thanks for the share, will be very useful for my Yohara 🙏🙏

    WTF??? YOU ARE WRONG!!

    • All languages has advantages and disadvantages.
    • C++ is faster than Lua.
    • Lua is easier than C++.
    • C++ has more good communication with the machine than Lua.
    • C++ has debug tools.
    • Lua is nice and good, but if you have bugs, you will need go to C++ if you want resolve the problem.
    • Memory problems are programming errors, not programming language errors, and are due to poor programming practice or lack of code review.
    • The order of the code does not equal the difficulty of understanding code (C++ is harder than Lua).
    • You can cause important errors in Lua and memory problems just like in C++

    And I can continue with disadvantages or advantages.

    If you have more Lua developers it's because Lua is more easier than C++, Lua has one syntax more easy. But if you have good practices and concepts of programming, you will have a good code and secure code.

    In my personal think, C++ has advantages because it's more fast and has one more communication with the machine than Lua, but the project will be more expensive and complicated.It is simply to the client's liking. But C++ will always be better than Lua in many ways. Only Lua is easier to learn and anyone can be a Lua developer.

    Lua has nice helps for inexpert developers and good practices for codes with small size however C++ has advantages with big codes.

    • If you have a big new bug in Lua you go to C++.
    • C++ has great tools with debug for codes. If you use a good testing techniques you will have a super-tool.

    In summary: Lua and C++ are good, but C++ is harder to learn. For this reason, although C++ is better for big code, because it's more faster and more advantages, it is avoided due to the cost it represents. Not everyone is a C++ developer.

     

    • Metin2 Dev 1
    • kekw 1
    • muscle 1
  4. 4 hours ago, envy said:

    In my opinion, dungeons should remain on quest, the way the official thought of them. Instead of selecting the rewards with a directquery and sending a packet just for the rewards, you could've done a dictionary on clientside.
    Also, what is this?

    spacer.png

    I like to avoid tragedies even if I have avoided them before. If you don't like C++ code, use Lua, but... since when is a high-level language better than a low-level?

    2 hours ago, CantSt0p said:

    Yoy @ Rakancito reupload last image. You are showing us your server IP 🤷🏻‍♂️ 

    I'm not using the server, I don't have problems.

  5. This is the hidden content, please

    Alternative download links → 

    This is the hidden content, please

     

    Hi,

    This is all interface about SungmaHee Tower Like official servers and the first floor like Official Servers, In this files we have 2k or 3k LOC, maybe more, I'm tired and I don't have information about all floor's tower, but if you want complete this system, you can contact with some-developer and providing the information about the floors or modifying all floors like your concept for Metin2, you'll be a nice dungeon. I already did the hardest part.

    You can extract all visual part with the official patchs from this forum.

    This dungeon is Full C++, Python and SQL.

     

    .png

     

    .png

     

    .png

     

    PLEASE: Not more messages for my person if you don't want to pay money, I only sell systems "not personal systems" you need understand about my time, my help, code or resolve some problem, needs time.

    If you want something (not offlineshop, this world has different options with this system) you can contact me but, you will need understand that I will charge you.

    I'm a nice person (I think), but this world needs money 😢 and if I  invest time in one project, I will cancel other projects and is overmoney.

    • Metin2 Dev 82
    • Good 13
    • muscle 1
    • Love 31
  6. 5 hours ago, metrix2020 said:

    Hey, i tryed to install razador dungeon but i got a problem with the quest, i miss some functions, can someone help me?

      Reveal hidden contents

    SYSERR: Jan  4 18:30:46 :: RunState: LUA_ERROR: [string "flame_dungeon"]:19: attempt to call field `check_event' (a nil value)
    SYSERR: Jan  4 18:30:46 :: WriteRunningStateToSyserr: LUA_ERROR: quest flame_dungeon.start click
     


     

    Check if you have in quest_functions and if you not, just add.

    game.check_event

    game.check_event


    Maybe you will not have the C++ function  and you can try commenting the part of code, the quest is very easy, you can develop other quest only for the enter to Dungeon.

     

  7. Hi guys.

    This is my goodbye, I had 10 years working for Metin2 but in the last days I finished my all contracts with Metin2. New year, new projects.
    I hope you continue to improve your codes.

    I give special thanks for my unic friend on Metin2 "Capone" because he was the one who showed me that true friendship exists.
    I know that Metin2 has nice people "Community Developers" and Big Developers: VegaS and Mali, you don't know about me, but I observed your works and is very cool.

    I wish you a beautiful new Year and good luck in your future projects.
    I leave with my last contribution "GIFT" for the community.
     

    Basic Dungeons:

    [C++] Nemere and Flame Dungeon like Official servers:

    Spoiler

    This has a little modifications with the monsters kill "for tests", but you can modify so easy.
    I translated 95% code for C++.

    This is the hidden content, please
     or 
    This is the hidden content, please

    Dungeons with Conqueror of Yohara stats:

    [C++] White Dragon
     

    Spoiler

    This is my version for White Dragon Dungeon.

    This is the hidden content, please
     or 
    This is the hidden content, please

    [C++] Queen Nethis
     

    Spoiler

    This is the Dungeon Queen Nethis Like Official Servers, this works 100%.

    This is the hidden content, please
     or 
    This is the hidden content, please

     

    NOTE: If I forgot visuals parts, you can extract from the official client.

    Maybe I will have connections in the forum but just of curiosity. I love you guys, I hope you are very well with my gifts.
    Good bye.


     

    • Metin2 Dev 234
    • kekw 1
    • Facepalm 1
    • Cry 1
    • Think 1
    • Confused 1
    • Lmao 3
    • Good 56
    • Love 14
    • Love 143
  8. 3 hours ago, VegasForPresident said:

    Still core crash bro.. 😞 why i cant use the other one? Everything work good there 😞 

    @ Mali It works after i change BYTE to INT .. 

     

     

            for (int i = 0; i < MAX_APPLY_NUM; ++i)
            {
                const TItemAttrTable& r = g_map_itemAttr[i];

                if (r.bMaxLevelBySet[iAttributeSet] && !__HasAttr(i))
                {
                    avail.push_back(i);
                    total += r.dwProb;
                }
            }

     

    Mali i can prove it to u if u dont believe give me your discord addy 😄  its because of byte / int


    I'm tired.

    I was in Match League of Legends (I had Games over 😢 ) This is the problem:
     

    Your solution it's good because the problem in the function is, we have a mapping, not a direct search::

    Quote

    avail.push_back(i);

    The array Data Struct it's declared like DWORD, and we are searching in BYTE, in general we should not have problems but we have Crazy Compilers.

    I didn't make the mistake before because I forgot.

    OK, if we come back for this, we need check the Word Size Data Types (The most important), Is nice if we use Short Data Types for a some values, but we need check if our Struct's have same declared data types.

    DWORD = 4 bytes, int = 4 bytes

    BYTE = 2 bytes

    If we search with 2 bytes, we will have errors in the future, if we search with a other Data type with more bytes, we will have errors, but if we will check with = sizes we have nice functions.

    The logic is simple: We don't put a bigger box in a smaller box. (Computer architecture)

    The fix it's in your for changed for int or DWORD, 😄  (Just if you have problems), Maybe in new compiler versions that was corrected or not.

     

    Now how do I remove notifications from this topic?, I have SPAM.

    I love you ❤️ Muack, nice system.

    • Confused 1
  9. 1 hour ago, VegasForPresident said:

    @ Mali  terminate called after throwing an instance of 'std::bad_alloc'
      what():  std::bad_alloc

     

    Core crash after taking item on item2 (not even the select attr window is opened) 

    😞 anyone else ? why 😞 

    std::bad_alloc It's because you have a serious memory allocation problem, maybe you will need say if it happened on the first try or after many try's, but I think that you but i think you need to check all your code or check if you have any missing code snippets.

    I haven't had problems, although I arranged some fragments in my own way.

    https://metin2.download/picture/klRi93Xd3QFXt1eF0Rj4yJWfQyACU96t/.jpg

     

    • Metin2 Dev 1
  10. Nice, good job, I don't know if it was intentional or it's like Official Servers, but I think he forgot the way Metin2 interprets Attribute levels.

    Right now you only call the level but not the attribute stored in your Data Struct.
    For correct call for level Attributes you will need add a some part for your code:

    Search in from item_attribute.cpp:

    Quote

    void CItem::GetSelectAttr(TPlayerItemAttribute(&arr)[ITEM_ATTRIBUTE_MAX_NUM])
    {
    [...]
            arr[__GetAttributeCount()] = { static_cast<BYTE>(attr_idx), static_cast<short>(bLevel) };
    };


    and replace for:

    Quote

            long lVal = r.lValues[MIN(4, bLevel - 1)];

            arr[__GetAttributeCount()] = { static_cast<BYTE>(attr_idx), lVal };
        };


    And after will working perfectly

     

    I love you, muack ❤️

    • Good 1
  11. Ok If you are using the shared system you can with my introselect.py because have all Yohara System, I hope it helps for you, just search for:

     

    Quote

    if app.ENABLE_CONQUEROR_LEVEL:

     

    Quote


    import grp
    import os
    import dbg

    import math
    import wndMgr
    import snd

    import systemSetting
    import localeInfo


    import ui
    import uiScriptlocale
    import networkModule
    import musicInfo
    import playerSettingModule
    import localeworldard
    import event


    ####################################
    # 빠른 실행을 위한 모듈 로딩 분담
    ####################################
    import uiCommon                    
    import uiMapNameShower             
    import uiAffectShower             
    import uiCharacter                 
    import uiTarget                    
    import consoleModule               
    import interfaceModule             
    import uiTaskBar                   
    import uiInventory
    import uiScriptLocale

    ###################################
    import net
    import app
    import chr
    import chrmgr
    import player

    if app.ENABLE_CONQUEROR_LEVEL:
        import uiToolTip
    LEAVE_BUTTON_FOR_POTAL = FALSE
    NOT_NEED_DELETE_CODE = FALSE
    ENABLE_ENGNUM_DELETE_CODE = FALSE

    if localeInfo.IsJAPAN():
        NOT_NEED_DELETE_CODE = TRUE
    elif localeInfo.IsHONGKONG():
        ENABLE_ENGNUM_DELETE_CODE = TRUE
    elif localeInfo.IsNEWCIBN() or localeInfo.IsCIBN10():
        ENABLE_ENGNUM_DELETE_CODE = TRUE
    elif localeInfo.IsEUROPE():
        ENABLE_ENGNUM_DELETE_CODE = TRUE

    ###################################
    class DescWorldIndex(ui.DescWorld.DescWorldIndex):
        def __init__(self, fileName):
            ui.DescWorld.DescWorldIndex.__init__(self)
            self.text=fileName
            self.textLine=self.__CreateTextLine(fileName[:33])  

        def __del__(self):
            ui.DescWorld.DescWorldIndex.__del__(self)

        def GetText(self):
            return self.text

        def __CreateTextLine(self, fileName):
            textLine=ui.TextLine()
            textLine.SetParent(self)
            textLine.SetPosition(0, 0)
            textLine.SetText(fileName)
            textLine.Show()
            return textLine

    class SelectCharacterWindow(ui.Window):

        # SLOT4
        #SLOT_COUNT = 3
        SLOT_COUNT = 4
        CHARACTER_TYPE_COUNT = 4

        EMPIRE_NAME = {
            net.EMPIRE_A : localeInfo.EMPIRE_A,
            net.EMPIRE_B : localeInfo.EMPIRE_B,
            net.EMPIRE_C : localeInfo.EMPIRE_C
        }

        class CharacterRenderer(ui.Window):
            def OnRender(self):
                grp.ClearDepthBuffer()

                grp.SetGameRenderState()
                grp.PushState()
                grp.SetOmniLight()

                screenWidth = wndMgr.GetScreenWidth()
                screenHeight = wndMgr.GetScreenHeight()
                newScreenWidth = float(screenWidth - 270)
                newScreenHeight = float(screenHeight)

                grp.SetViewport(270.0/screenWidth, 0.0, newScreenWidth/screenWidth, newScreenHeight/screenHeight)

                app.SetCenterPosition(-60.0, -160.0, -45.0)
                app.SetCamera(1550.0, 15.0, 180.0, 95.0)
                grp.SetPerspective(11.0, newScreenWidth/newScreenHeight, 1000.0, 3000.0)

                (x, y) = app.GetCursorPosition()
                grp.SetCursorPosition(x, y)

                chr.Deform()
                chr.Render()

                grp.RestoreViewport()
                grp.PopState()
                grp.SetInterfaceRenderState()

        def __init__(self, stream):
            ui.Window.__init__(self)
            net.SetPhaseWindow(net.PHASE_WINDOW_SELECT, self)

            self.stream=stream
            self.slot = self.stream.GetCharacterSlot()

            self.openLoadingFlag = FALSE
            self.startIndex = -1
            self.startReservingTime = 0
            self.EmpireImage = {}
            self.curGauge = [0.0, 0.0, 0.0, 0.0]
            self.destGauge = [0.0, 0.0, 0.0, 0.0]
            self.descIndex = 0
            self.fileListBox = 0

            self.dlgBoard = 0
            self.changeNameFlag = FALSE
            self.nameInputBoard = None
            self.sendedChangeNamePacket = FALSE

            self.startIndex = -1
            self.isLoad = 0

            if app.ENABLE_CONQUEROR_LEVEL:
                self.toolTipConquerorInfoButton = None
                
        def __del__(self):
            ui.Window.__del__(self)
            net.SetPhaseWindow(net.PHASE_WINDOW_SELECT, 0)

        def Open(self):
            if not self.__LoadBoardDialog(uiScriptlocale.LOCALE_UISCRIPT_PATH  + "selectcharacterwindow.py"):
                dbg.TraceError("SelectCharacterWindow.Open - __LoadScript Error")
                return

            if not self.__LoadQuestionDialog("uiscript/questiondialog.py"):
                return

            playerSettingModule.LoadGameData("INIT")

            self.InitCharacterBoard()

            self.btnStart.Enable()
            self.btnCreate.Disable()
            self.btnCreate.Show()
            self.btnDelete.Enable()
            self.btnExit.Enable()

            self.dlgBoard.Show()
            self.SetWindowName("SelectCharacterWindow")
            self.Show()


            if self.slot>=0:
                self.SelectSlot(self.slot)

            if musicInfo.selectMusic != "":
                snd.SetMusicVolume(systemSetting.GetMusicVolume())
                snd.FadeInMusic("BGM/"+musicInfo.selectMusic)

            app.SetCenterPosition(0.0, 0.0, 0.0)
            app.SetCamera(1550.0, 15.0, 180.0, 95.0)

            self.isLoad=1
            self.Refresh()

            if self.stream.isAutoSelect:
                chrSlot=self.stream.GetCharacterSlot()
                self.SelectSlot(chrSlot)
                self.StartGame()

            self.HideAllFlag()
            self.SetEmpire(net.GetEmpireID())
            self.BackGround()
            self.SelectSlotWorl(0)

            if app.ENABLE_CONQUEROR_LEVEL:
                self.btnSungmaPrev.Enable()
                self.btnSungmaNext.Enable()

            app.ShowCursor()

        def Close(self):
            if musicInfo.selectMusic != "":
                snd.FadeOutMusic("BGM/"+musicInfo.selectMusic)

            self.stream.popupWindow.Close()

            if self.dlgBoard:
                self.dlgBoard.ClearDictionary()

            self.dlgBoard = None
            self.btnStart = None
            self.btnCreate = None
            self.btnDelete = None
            self.btnExit = None
            self.backGroundShinsoo = None
            self.backGroundJinnos = None
            self.backGroundChunjo = None
            self.backGroundNone = None
            self.empireName = None
            self.EmpireImage = {}

            self.dlgQuestion.ClearDictionary()
            self.dlgQuestion = None
            self.dlgQuestionText = None
            self.dlgQuestionAcceptButton = None
            self.dlgQuestionCancelButton = None
            self.privateInputBoard = None
            self.nameInputBoard = None

            if app.ENABLE_CONQUEROR_LEVEL:
                self.toolTipConquerorInfoButton = None
                self.btnSungmaPrev = None
                self.btnSungmaNext = None
                
            chr.DeleteInstance(0)
            chr.DeleteInstance(1)
            chr.DeleteInstance(2)
            chr.DeleteInstance(3)

            self.Hide()
            self.KillFocus()

            app.HideCursor()
            event.Destroy()

        def SetEmpire(self, id):
            if self.__AreAllSlotEmpty():
                self.empireName.Hide()
                self.EmpireImage[id].Hide()
                self.backGroundNone.Show()
            else:
                self.empireName.SetText(self.EMPIRE_NAME.get(id, ""))
                if self.EmpireImage.has_key(id):
                    self.EmpireImage[id].Show()
            
        def HideAllFlag(self):
            for flag in self.EmpireImage.values():
                flag.Hide()

        def BackGround(self):
            empire = net.GetEmpireID()
            if self.__AreAllSlotEmpty():
                self.backGroundShinsoo.Hide()
                self.backGroundJinnos.Hide()
                self.backGroundChunjo.Hide()
                self.backGroundNone.Show()
            else:
                if empire == 1:
                    self.backGroundShinsoo.Show()
                    self.backGroundJinnos.Hide()
                    self.backGroundChunjo.Hide()
                    self.backGroundNone.Hide()
                    self.empireName.SetPackedFontColor(0xffBD0514)
                if empire == 2:
                    self.backGroundShinsoo.Hide()
                    self.backGroundJinnos.Hide()
                    self.backGroundChunjo.Show()
                    self.backGroundNone.Hide()
                    self.empireName.SetPackedFontColor(0xffBDA805)
                if empire == 3:
                    self.backGroundShinsoo.Hide()
                    self.backGroundJinnos.Show()
                    self.backGroundChunjo.Hide()
                    self.backGroundNone.Hide()
                    self.empireName.SetPackedFontColor(0xff1705BD)

        def Refresh(self):
            if not self.isLoad:
                return

            indexArray = (3, 2, 1, 0)
            for index in indexArray:
                id=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_ID)
                race=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_RACE)
                form=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_FORM)
                name=net.GetAccountCharacterSlotDataString(index, net.ACCOUNT_CHARACTER_SLOT_NAME)
                level=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_LEVEL)
                hair=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_HAIR)
                acce=net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_ACCE)

                if app.ENABLE_CONQUEROR_LEVEL:
                    conquerorlevel = net.GetAccountCharacterSlotDataInteger(index, net.ACCOUNT_CHARACTER_SLOT_CONQUEROR_LEVEL)
                if id:
                    self.MakeCharacter(index, id, name, race, form, hair, acce)
                    self.SelectSlot(index)

            self.SelectSlot(self.slot)
                    
        def GetCharacterSlotID(self, slotIndex):
            return net.GetAccountCharacterSlotDataInteger(slotIndex, net.ACCOUNT_CHARACTER_SLOT_ID)

        def __LoadQuestionDialog(self, fileName):
            self.dlgQuestion = ui.ScriptWindow()

            try:
                pyScrLoader = ui.PythonScriptLoader()
                pyScrLoader.LoadScriptFile(self.dlgQuestion, fileName)
            except:
                import exception
                exception.Abort("SelectCharacterWindow.LoadQuestionDialog.LoadScript")

            try:
                GetObject=self.dlgQuestion.GetChild
                self.dlgQuestionText=GetObject("message")
                self.dlgQuestionAcceptButton=GetObject("accept")
                self.dlgQuestionCancelButton=GetObject("cancel")
            except:
                import exception
                exception.Abort("SelectCharacterWindow.LoadQuestionDialog.BindObject")

            self.dlgQuestionText.SetText(localeInfo.SELECT_DO_YOU_DELETE_REALLY)
            self.dlgQuestionAcceptButton.SetEvent(ui.__mem_func__(self.RequestDeleteCharacter))
            self.dlgQuestionCancelButton.SetEvent(ui.__mem_func__(self.dlgQuestion.Hide))
            return 1

        def __LoadBoardDialog(self, fileName):
            self.dlgBoard = ui.ScriptWindow()

            try:
                pyScrLoader = ui.PythonScriptLoader()
                pyScrLoader.LoadScriptFile(self.dlgBoard, fileName)
            except:
                import exception
                exception.Abort("SelectCharacterWindow.LoadBoardDialog.LoadScript")

            try:
                GetObject=self.dlgBoard.GetChild

                #Buttons Go
                self.btnStart        = GetObject("start_button")
                self.btnExit        = GetObject("exit_button")
                self.btnCreate        = GetObject("create_button")
                self.btnDelete        = GetObject("delete_button")
                #Buttons End

                ## Name Job Go
                self.name_warrior= GetObject("name_warrior")
                self.name_assassin= GetObject("name_assassin")
                self.name_sura= GetObject("name_sura")
                self.name_shaman= GetObject("name_shaman")
                self.name_wolfman =GetObject("name_wolfman")
                ## Name Job End

                self.empireName = GetObject("EmpireName")
                self.EmpireImage[net.EMPIRE_A] = GetObject("EmpireFlag_A")
                self.EmpireImage[net.EMPIRE_B] = GetObject("EmpireFlag_B")
                self.EmpireImage[net.EMPIRE_C] = GetObject("EmpireFlag_C")

                self.textBoard = GetObject("text_board")


                self.CharacterHTH    = GetObject("hth_value")
                self.CharacterINT    = GetObject("int_value")
                self.CharacterSTR    = GetObject("str_value")
                self.CharacterDEX    = GetObject("dex_value")
                    
                self.CharacterName_0 = GetObject("CharacterName_0")
                self.CharacterName_1 = GetObject("CharacterName_1")
                self.CharacterName_2 = GetObject("CharacterName_2")
                self.CharacterName_3 = GetObject("CharacterName_3")


                self.CharacterLevel_0 = GetObject("CharacterLevel_0")
                self.CharacterLevel_1 = GetObject("CharacterLevel_1")
                self.CharacterLevel_2 = GetObject("CharacterLevel_2")
                self.CharacterLevel_3 = GetObject("CharacterLevel_3")


                self.CharacterTime_01 = GetObject("CharacterTime_01")
                self.CharacterTime_02 = GetObject("CharacterTime_02")
                self.CharacterTime_03 = GetObject("CharacterTime_03")
                self.CharacterTime_04 = GetObject("CharacterTime_04")


                self.CharacterGuild_01    = GetObject("CharacterGuild_01")
                self.CharacterGuild_02    = GetObject("CharacterGuild_02")
                self.CharacterGuild_03    = GetObject("CharacterGuild_03")
                self.CharacterGuild_04    = GetObject("CharacterGuild_04")
                self.text_board = GetObject("text_board")

                
                self.GaugeList = []
                self.GaugeList.append(GetObject("hth_gauge"))
                self.GaugeList.append(GetObject("int_gauge"))
                self.GaugeList.append(GetObject("str_gauge"))
                self.GaugeList.append(GetObject("dex_gauge"))

                if app.ENABLE_CONQUEROR_LEVEL:
                    self.toolTipConquerorInfoButton = uiToolTip.ToolTip()
                    
                    self.btnSungmaPrev = GetObject("origin_stat_button")
                    self.btnSungmaNext = GetObject("sungma_stat_button")
                    
                    self.HTH_IMG = GetObject("hth_img")
                    self.INT_IMG = GetObject("int_img")
                    self.STR_IMG = GetObject("str_img")
                    self.DEX_IMG = GetObject("dex_img")
                    
                    
                    self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHTHToolTip)
                    self.HTH_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHTHToolTip)
                    
                    self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINTToolTip)
                    self.INT_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINTToolTip)
                    
                    self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTRToolTip)
                    self.STR_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTRToolTip)
                    
                    self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowDEXToolTip)
                    self.DEX_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideDEXToolTip)


                    self.SUNGMA_ST_IMG = GetObject("sungma_str_img")
                    self.SUNGMA_HP_IMG = GetObject("sungma_hp_img")
                    self.SUNGMA_MOVE_IMG = GetObject("sungma_move_img")
                    self.SUNGMA_INMUNE_IMG = GetObject("sungma_immune_img")

                    self.SUNGMA_ST_IMG.Hide()
                    self.SUNGMA_HP_IMG.Hide()
                    self.SUNGMA_MOVE_IMG.Hide()
                    self.SUNGMA_INMUNE_IMG.Hide()
                    
                    self.SUNGMA_ST_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowSTToolTip)
                    self.SUNGMA_ST_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideSTToolTip)
                    
                    self.SUNGMA_HP_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowHPToolTip)
                    self.SUNGMA_HP_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideHPToolTip)
                    
                    self.SUNGMA_MOVE_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowMOVEToolTip)
                    self.SUNGMA_MOVE_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideMOVEToolTip)
                    
                    self.SUNGMA_INMUNE_IMG.SAFE_SetStringEvent("MOUSE_OVER_IN", self.__ShowINMUNEToolTip)
                    self.SUNGMA_INMUNE_IMG.SAFE_SetStringEvent("MOUSE_OVER_OUT", self.__HideINMUNEToolTip)
                    
                    
                self.CharacterFace_0 = GetObject("CharacterFace_0")
                self.CharacterFace_0.Hide()
                self.CharacterFace_1 = GetObject("CharacterFace_1")
                self.CharacterFace_1.Hide()
                self.CharacterFace_2 = GetObject("CharacterFace_2")
                self.CharacterFace_2.Hide()
                self.CharacterFace_3 = GetObject("CharacterFace_3")
                self.CharacterFace_3.Hide()

                self.CharacterSlot = []
                self.CharacterSlot.append(GetObject("CharacterSlot_0"))
                self.CharacterSlot.append(GetObject("CharacterSlot_1"))
                self.CharacterSlot.append(GetObject("CharacterSlot_2"))
                self.CharacterSlot.append(GetObject("CharacterSlot_3"))

                self.DiscFace = GetObject("DiscFace")
                self.DiscFace.Hide()
                self.raceName_Text = GetObject("raceName_Text")

                self.Board_Date_1 = GetObject("board_date_01")
                self.Board_Date_1.Hide()
                self.Board_Date_2 = GetObject("board_date_02")
                self.Board_Date_2.Hide()
                self.Board_Date_3 = GetObject("board_date_03")
                self.Board_Date_3.Hide()
                self.Board_Date_4 = GetObject("board_date_04")
                self.Board_Date_4.Hide()


                self.backGroundShinsoo = GetObject("backGroundShinsoo")
                self.backGroundJinnos = GetObject("backGroundJinnos")
                self.backGroundChunjo = GetObject("backGroundChunjo")
                self.backGroundNone = GetObject("backGroundNone")

                self.ButtonUp = ui.ButtonWorldArdUp()
                self.ButtonUp.SetParent(self.textBoard)
                self.ButtonUp.SetPosition(122,250)
                self.ButtonUp.SetButtonDownSize(160)
                self.ButtonUp.SetScrollStep(1.4)
                self.ButtonUp.Show()

                self.ButtonDown = ui.ButtonWorldArdDown()
                self.ButtonDown.SetParent(self.textBoard)
                self.ButtonDown.SetPosition(122 + 20 + 10,250)
                self.ButtonDown.SetButtonDownSize(160)
                self.ButtonDown.SetScrollStep(1.4)
                self.ButtonDown.Show()


                self.fileListBox = ui.DescWorld()
                self.fileListBox.SetParent(self.textBoard)
                self.fileListBox.SetPosition(20, 20)
                self.fileListBox.SetViewLines(11)
                self.fileListBox.ButtonWorldArdDown(self.ButtonDown)
                self.fileListBox.ButtonWorldArdUp(self.ButtonUp)
                self.fileListBox.Show()

                        
            except:
                import exception
                exception.Abort("SelectCharacterWindow.LoadBoardDialog.BindObject")

            self.btnStart.SetEvent(ui.__mem_func__(self.StartGame))
            self.btnCreate.SetEvent(ui.__mem_func__(self.CreateCharacter))
            self.btnExit.SetEvent(ui.__mem_func__(self.ExitSelect))
            self.CharacterSlot[0].SAFE_SetEvent(self.__CharacterSlot_01)
            self.CharacterSlot[1].SAFE_SetEvent(self.__CharacterSlot_11)
            self.CharacterSlot[2].SAFE_SetEvent(self.__CharacterSlot_21)
            self.CharacterSlot[3].SAFE_SetEvent(self.__CharacterSlot_31)

            if app.ENABLE_CONQUEROR_LEVEL:
                self.btnSungmaPrev.SetEvent(ui.__mem_func__(self.SungmaPrev))
                self.btnSungmaNext.SetEvent(ui.__mem_func__(self.SungmaNext))
                    
            if NOT_NEED_DELETE_CODE:
                self.btnDelete.SetEvent(ui.__mem_func__(self.PopupDeleteQuestion))
            else:
                self.btnDelete.SetEvent(ui.__mem_func__(self.InputPrivateCode))

            self.chrRenderer = self.CharacterRenderer()
            self.chrRenderer.SetParent(self.backGroundShinsoo)
            self.chrRenderer.Show()

            self.chrRenderer1 = self.CharacterRenderer()
            self.chrRenderer1.SetParent(self.backGroundJinnos)
            self.chrRenderer1.Show()

            self.chrRenderer2 = self.CharacterRenderer()
            self.chrRenderer2.SetParent(self.backGroundChunjo)
            self.chrRenderer2.Show()

            self.chrRenderer3 = self.CharacterRenderer()
            self.chrRenderer3.SetParent(self.backGroundNone)
            self.chrRenderer3.Show()

            return 1

        if app.ENABLE_CONQUEROR_LEVEL:
        
            def SungmaPrev(self):
                self.SUNGMA_ST_IMG.Hide()
                self.SUNGMA_HP_IMG.Hide()
                self.SUNGMA_MOVE_IMG.Hide()
                self.SUNGMA_INMUNE_IMG.Hide()
                
                valueHTH=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HTH)
                valueINT=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_INT)
                valueSTR=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_STR)
                valueDEX=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_DEX)
                    
                self.CharacterHTH.SetText(str(valueHTH))
                self.CharacterINT.SetText(str(valueINT))
                self.CharacterSTR.SetText(str(valueSTR))
                self.CharacterDEX.SetText(str(valueDEX))

                self.destGauge = [0.0, 0.0, 0.0, 0.0]
                statesSummary = float(valueHTH + valueINT + valueSTR + valueDEX)
                if statesSummary > 0.0:
                    self.destGauge =    [
                                            float(valueHTH) / statesSummary,
                                            float(valueINT) / statesSummary,
                                            float(valueSTR) / statesSummary,
                                            float(valueDEX) / statesSummary
                                        ]
                                        
                for i in xrange(4):
                    self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
                    if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
                        self.curGauge[i] = self.destGauge[i]
                    self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)

                
            def SungmaNext(self):
                self.SUNGMA_ST_IMG.Show()
                self.SUNGMA_HP_IMG.Show()
                self.SUNGMA_MOVE_IMG.Show()
                self.SUNGMA_INMUNE_IMG.Show()
                
                valueConquerorST=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_ST)
                valueConquerorHP=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_HP)
                valueConquerorMOVE=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_MOVE)
                valueConquerorINMUNE=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_SUNGMA_INMUNE)    
                    
                self.CharacterHTH.SetText(str(valueConquerorST))
                self.CharacterINT.SetText(str(valueConquerorHP))
                self.CharacterSTR.SetText(str(valueConquerorMOVE))
                self.CharacterDEX.SetText(str(valueConquerorINMUNE))
                
                self.destGauge = [0.0, 0.0, 0.0, 0.0]
                statesSummary = float(valueConquerorST + valueConquerorHP + valueConquerorMOVE + valueConquerorINMUNE)
                if statesSummary > 0.0:
                    self.destGauge =    [
                                            float(valueConquerorST) / statesSummary,
                                            float(valueConquerorHP) / statesSummary,
                                            float(valueConquerorMOVE) / statesSummary,
                                            float(valueConquerorINMUNE) / statesSummary
                                        ]
                for i in xrange(4):
                    self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
                    if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
                        self.curGauge[i] = self.destGauge[i]
                    self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)
                
            def __ShowHTHToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_CON)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideHTHToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()

            def __ShowINTToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_INT)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideINTToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()

            def __ShowSTRToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_STR)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideSTRToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()
                
            def __ShowDEXToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_IMG_DEX)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideDEXToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()

            #Sungma
            def __ShowSTToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_STR)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideSTToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()

            def __ShowHPToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_HP)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideHPToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()

            def __ShowMOVEToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_MOVE)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideMOVEToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()
                
            def __ShowINMUNEToolTip(self):
                self.toolTipConquerorInfoButton.ClearToolTip()
                self.toolTipConquerorInfoButton.AutoAppendTextLine(localeInfo.STAT_TOOLTIP_SUNGMA_INMUNE)
                self.toolTipConquerorInfoButton.AlignHorizonalCenter()
                
                self.toolTipConquerorInfoButton.ShowToolTip()

            def __HideINMUNEToolTip(self):
                self.toolTipConquerorInfoButton.HideToolTip()
                
        def MakeCharacter(self, index, id, name, race, form, hair, acce):
            if 0 == id:
                return

            chr.CreateInstance(index)
            chr.SelectInstance(index)
            chr.SetVirtualID(index)
            chr.SetNameString(name)
            chr.SetRace(race)
            chr.SetArmor(form)
            chr.SetHair(hair)
            if acce == 100:
                chr.SetAcce(acce, 99)
            else:
                chr.SetAcce(acce, 0)
            chr.Refresh()
            chr.SetMotionMode(chr.MOTION_MODE_GENERAL)
            chr.SetLoopMotion(chr.MOTION_INTRO_WAIT)

            chr.SetRotation(0.0)

        def __ClickRadioButton(self, buttonList, buttonIndex):
            try:
                selButton=buttonList[buttonIndex]
            except IndexError:
                return

            for eachButton in buttonList:
                eachButton.SetUp()

            selButton.Down()

        def SelectSlotWorl(self, index):
            self.SelectSlot(index)
            self.__ClickRadioButton(self.CharacterSlot, index)

        def __CharacterSlot_01(self):
            self.SelectSlotWorl(0)
            

        def __CharacterSlot_11(self):
            self.SelectSlotWorl(1)
        

        def __CharacterSlot_21(self):
            self.SelectSlotWorl(2)
        

        def __CharacterSlot_31(self):
            self.SelectSlotWorl(3)
        

        ## Manage Character
        def StartGame(self):

            if self.sendedChangeNamePacket:
                return

            if self.changeNameFlag:
                self.OpenChangeNameDialog()
                return

            if -1 != self.startIndex:
                return

            if musicInfo.selectMusic != "":
                snd.FadeLimitOutMusic("BGM/"+musicInfo.selectMusic, systemSetting.GetMusicVolume()*0.05)

            self.btnStart.SetUp()
            self.btnCreate.SetUp()
            self.btnDelete.SetUp()
            self.btnExit.SetUp()

            self.btnStart.Disable()
            self.btnCreate.Disable()
            self.btnDelete.Disable()
            self.btnExit.Disable()
            self.dlgQuestion.Hide()

            self.stream.SetCharacterSlot(self.slot)
            
            if app.ENABLE_CONQUEROR_LEVEL:
                self.btnSungmaNext.SetUp()
                self.btnSungmaPrev.SetUp()
                self.btnSungmaNext.Disable()
                self.btnSungmaPrev.Disable()
                
            self.startIndex = self.slot
            self.startReservingTime = app.GetTime()

            for i in xrange(self.SLOT_COUNT):

                if FALSE == chr.HasInstance(i):
                    continue

                chr.SelectInstance(i)

                if i == self.slot:
                    self.slot=self.slot
                    chr.PushOnceMotion(chr.MOTION_INTRO_SELECTED, 0.1)
                    continue

                chr.PushOnceMotion(chr.MOTION_INTRO_NOT_SELECTED, 0.1)

        def OpenChangeNameDialog(self):
            import uiCommon
            nameInputBoard = uiCommon.InputDialogWithDescription()
            nameInputBoard.SetTitle(localeInfo.SELECT_CHANGE_NAME_TITLE)
            nameInputBoard.SetAcceptEvent(ui.__mem_func__(self.AcceptInputName))
            nameInputBoard.SetCancelEvent(ui.__mem_func__(self.CancelInputName))
            nameInputBoard.SetMaxLength(chr.PLAYER_NAME_MAX_LEN)
            nameInputBoard.SetBoardWidth(200)
            nameInputBoard.SetDescription(localeInfo.SELECT_INPUT_CHANGING_NAME)
            nameInputBoard.Open()
            nameInputBoard.slot = self.slot
            self.nameInputBoard = nameInputBoard

        def OnChangeName(self, id, name):
            self.SelectSlot(id)
            self.sendedChangeNamePacket = FALSE
            self.PopupMessage(localeInfo.SELECT_CHANGED_NAME)

        def AcceptInputName(self):
            changeName = self.nameInputBoard.GetText()
            if not changeName:
                return

            self.sendedChangeNamePacket = TRUE
            net.SendChangeNamePacket(self.nameInputBoard.slot, changeName)
            return self.CancelInputName()

        def CancelInputName(self):
            self.nameInputBoard.Close()
            self.nameInputBoard = None
            return TRUE

        def OnCreateFailure(self, type):
            self.sendedChangeNamePacket = FALSE
            if 0 == type:
                self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_STRANGE_NAME)
            elif 1 == type:
                self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_ALREADY_EXIST_NAME)
            elif 100 == type:
                self.PopupMessage(localeInfo.SELECT_CHANGE_FAILURE_STRANGE_INDEX)

        def CreateCharacter(self):
            id = self.GetCharacterSlotID(self.slot)

            if 0==id:
                self.stream.SetCharacterSlot(self.slot)

                EMPIRE_MODE = 1

                if EMPIRE_MODE:
                    if self.__AreAllSlotEmpty():
                        self.stream.SetReselectEmpirePhase()
                    else:
                        self.stream.SetCreateCharacterPhase()

                else:
                    self.stream.SetCreateCharacterPhase()

        def __AreAllSlotEmpty(self):
            for iSlot in xrange(self.SLOT_COUNT):
                if 0!=net.GetAccountCharacterSlotDataInteger(iSlot, net.ACCOUNT_CHARACTER_SLOT_ID):
                    return 0
            return 1

        def PopupDeleteQuestion(self):
            id = self.GetCharacterSlotID(self.slot)
            if 0 == id:
                return

            self.dlgQuestion.Show()
            self.dlgQuestion.SetTop()

        def RequestDeleteCharacter(self):
            self.dlgQuestion.Hide()

            id = self.GetCharacterSlotID(self.slot)
            if 0 == id:
                self.PopupMessage(localeInfo.SELECT_EMPTY_SLOT)
                return

            net.SendDestroyCharacterPacket(self.slot, "1234567")
            self.PopupMessage(localeInfo.SELECT_DELEING)

        def InputPrivateCode(self):
            
            import uiCommon
            privateInputBoard = uiCommon.InputDialogWithDescription()
            privateInputBoard.SetTitle(localeInfo.INPUT_PRIVATE_CODE_DIALOG_TITLE)
            privateInputBoard.SetAcceptEvent(ui.__mem_func__(self.AcceptInputPrivateCode))
            privateInputBoard.SetCancelEvent(ui.__mem_func__(self.CancelInputPrivateCode))

            if ENABLE_ENGNUM_DELETE_CODE:
                pass
            else:
                privateInputBoard.SetNumberMode()

            privateInputBoard.SetSecretMode()
            privateInputBoard.SetMaxLength(7)
                
            privateInputBoard.SetBoardWidth(250)
            privateInputBoard.SetDescription(localeInfo.INPUT_PRIVATE_CODE_DIALOG_DESCRIPTION)
            privateInputBoard.Open()
            self.privateInputBoard = privateInputBoard

        def AcceptInputPrivateCode(self):
            privateCode = self.privateInputBoard.GetText()
            if not privateCode:
                return

            id = self.GetCharacterSlotID(self.slot)
            if 0 == id:
                self.PopupMessage(localeInfo.SELECT_EMPTY_SLOT)
                return

            net.SendDestroyCharacterPacket(self.slot, privateCode)
            self.PopupMessage(localeInfo.SELECT_DELEING)

            self.CancelInputPrivateCode()
            return TRUE

        def CancelInputPrivateCode(self):
            self.privateInputBoard = None
            return TRUE

        def OnDeleteSuccess(self, slot):
            self.PopupMessage(localeInfo.SELECT_DELETED)
            self.DeleteCharacter(slot)

        def OnDeleteFailure(self):
            self.PopupMessage(localeInfo.SELECT_CAN_NOT_DELETE)

        def DeleteCharacter(self, index):
            chr.DeleteInstance(index)
            self.SelectSlot(self.slot)

        def ExitSelect(self):
            self.dlgQuestion.Hide()
        
            if LEAVE_BUTTON_FOR_POTAL:
                if app.loggined:
                    self.stream.SetPhaseWindow(0)
                else:
                    self.stream.setloginphase()
            else:
                self.stream.SetLoginPhase()

            self.Hide()

        def GetSlotIndex(self):
            return self.slot

        def DecreaseSlotIndex(self):
            slotIndex = (self.GetSlotIndex() - 1 + self.SLOT_COUNT) % self.SLOT_COUNT
            self.SelectSlot(slotIndex)

        def IncreaseSlotIndex(self):
            slotIndex = (self.GetSlotIndex() + 1) % self.SLOT_COUNT
            self.SelectSlot(slotIndex)

        def SelectSlot(self, index):

            if index < 0:
                return
            if index >= self.SLOT_COUNT:
                return

            chr.DeleteInstance(0)
            chr.DeleteInstance(1)
            chr.DeleteInstance(2)
            chr.DeleteInstance(3)

            self.slot = index

            chr.SelectInstance(self.slot)

            self.btnCreate.Show()
            self.btnStart.Show()
            self.btnDelete.Show()


            self.destGauge = [0.0, 0.0, 0.0, 0.0]

                    

            id=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ID)
            if 0 != id:

                self.btnStart.Enable()
                self.btnDelete.Enable()
                self.btnCreate.Disable()
                self.btnCreate.Hide()

                level=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_LEVEL)
                if app.ENABLE_CONQUEROR_LEVEL:
                    conquerorlevel=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_CONQUEROR_LEVEL)
                race=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
                race_text=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
                race_img=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
                name=net.GetAccountCharacterSlotDataString(self.slot, net.ACCOUNT_CHARACTER_SLOT_NAME)
                race_descrip=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_RACE)
                form=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_FORM)
                hair=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HAIR)
                acce=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ACCE)
                self.changeNameFlag=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_CHANGE_NAME_FLAG)
                valueHTH=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_HTH)
                valueINT=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_INT)
                valueSTR=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_STR)
                valueDEX=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_DEX)
                playTime=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_PLAYTIME)
                guildName=net.GetAccountCharacterSlotDataString(self.slot, net.ACCOUNT_CHARACTER_SLOT_GUILD_NAME)
                
                if id:
                    self.MakeCharacter(self.slot, id, name, race, form, hair, acce)

                if race_text == 0 or race_text == 4:
                    race_text = localeworldard.Warrior
                elif race_text == 1 or race_text == 5:
                    race_text = localeworldard.Assasin
                elif race_text == 2 or race_text == 6:
                    race_text = localeworldard.Sura
                elif race_text == 3 or race_text == 7:
                    race_text = localeworldard.Shaman
                elif race_text == 8:
                    race_text = localeworldard.WolfMan

                if race_img == 0 or race_img == 4:
                    self.name_warrior.Show()
                    self.name_assassin.Hide()
                    self.name_sura.Hide()
                    self.name_shaman.Hide()
                    self.name_wolfman.Hide()
                elif race_img == 1 or race_img == 5:
                    self.name_assassin.Show()
                    self.name_warrior.Hide()
                    self.name_sura.Hide()
                    self.name_shaman.Hide()
                    self.name_wolfman.Hide()
                elif race_img == 2 or race_img == 6:
                    self.name_sura.Show()
                    self.name_assassin.Hide()
                    self.name_warrior.Hide()
                    self.name_shaman.Hide()
                    self.name_wolfman.Hide()
                elif race_img == 3 or race_img == 7:
                    self.name_shaman.Show()
                    self.name_assassin.Hide()
                    self.name_sura.Hide()
                    self.name_warrior.Hide()
                    self.name_wolfman.Hide()
                elif race_img == 8:
                    self.name_shaman.Hide()
                    self.name_assassin.Hide()
                    self.name_sura.Hide()
                    self.name_warrior.Hide()
                    self.name_wolfman.Show()

                if race_descrip == 0 or race_descrip == 4:
                    f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_WARRIOR"],'r')        
                elif race_descrip == 1 or race_descrip == 5:
                    f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_ASSASSIN"],'r')
                elif race_descrip == 2 or race_descrip == 6:
                    f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_SURA"],'r')                
                elif race_descrip == 3 or race_descrip == 7:
                    f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_SHAMAN"],'r')
                elif race_descrip == 8:
                    f = pack_open(localeworldard.DESCRIPTION_FILE_NAME["RACE_WOLFMAN"],'r')

                self.fileListBox.RemoveAllItems()
                race_descrip
                lines = f.readlines()
                for i in lines:
                    self.fileListBox.AppendItem(DescWorldIndex(i.replace("[World]", "")))
                    
                self.raceName_Text.SetText(str(race_text))

                self.CharacterHTH.SetText(str(valueHTH))
                self.CharacterINT.SetText(str(valueINT))
                self.CharacterSTR.SetText(str(valueSTR))
                self.CharacterDEX.SetText(str(valueDEX))


                if self.slot == 0:
                    self.CharacterFace_0.LoadImage(localeworldard.CharacterFace[race])
                    self.DiscFace.LoadImage(localeworldard.DiscFace[race])
                    self.CharacterName_0.SetText(name)
                    if app.ENABLE_CONQUEROR_LEVEL:
                        if conquerorlevel:
                            self.CharacterLevel_0.SetText("Lv."+str(conquerorlevel))
                            self.CharacterLevel_0.SetPackedFontColor(0xFFBFD9FF)
                        else:
                            self.CharacterLevel_0.SetText("Lv."+str(level))
                    else:
                        self.CharacterLevel_0.SetText("Lv."+str(level))
                    self.CharacterTime_01.SetText(str(playTime))
                    self.CharacterGuild_01.SetText(guildName)
                    self.DiscFace.Show()
                    self.CharacterFace_0.Show()
                    self.Board_Date_1.Show()
                    self.Board_Date_2.Hide()
                    self.Board_Date_3.Hide()
                    self.Board_Date_4.Hide()    
                    if guildName:
                        self.CharacterGuild_01.SetText(guildName)
                    else:
                        self.CharacterGuild_01.SetText(localeworldard.NotGuild)
                    second = int(playTime * 60) ##Minutos a Segundos
                    horas = int(second / 3600)
                    minutos = int((second - (horas * 3600)) / 60)

                    if horas == 0:
                        self.CharacterTime_01.SetText(str(minutos)+localeworldard.Minutos)
                    if horas > 0:
                        self.CharacterTime_01.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)            
            
                elif self.slot == 1:
                    import time
                    self.CharacterFace_1.LoadImage(localeworldard.CharacterFace[race])
                    self.DiscFace.LoadImage(localeworldard.DiscFace[race])
                    self.CharacterName_1.SetText(name)
                    if app.ENABLE_CONQUEROR_LEVEL:
                        if conquerorlevel:
                            self.CharacterLevel_1.SetText("Lv."+str(conquerorlevel))
                            self.CharacterLevel_1.SetPackedFontColor(0xFFBFD9FF)
                        else:
                            self.CharacterLevel_1.SetText("Lv."+str(level))
                    else:
                        self.CharacterLevel_1.SetText("Lv."+str(level))
                    self.CharacterGuild_02.SetText(guildName)
                    self.DiscFace.Show()
                    self.Board_Date_1.Hide()
                    self.Board_Date_2.Show()
                    self.Board_Date_3.Hide()
                    self.Board_Date_4.Hide()
                    self.CharacterFace_1.Show()
                    if guildName:
                        self.CharacterGuild_02.SetText(guildName)
                    else:
                        self.CharacterGuild_02.SetText(localeworldard.NotGuild)

                    second = int(playTime * 60) ##Minutos a Segundos
                    horas = int(second / 3600)
                    minutos = int((second - (horas * 3600)) / 60)

                    if horas == 0:
                        self.CharacterTime_02.SetText(str(minutos)+localeworldard.Minutos)
                    if horas > 0:
                        self.CharacterTime_02.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
                    
                elif self.slot == 2:
                    self.CharacterFace_2.LoadImage(localeworldard.CharacterFace[race])
                    self.DiscFace.LoadImage(localeworldard.DiscFace[race])
                    self.CharacterName_2.SetText(name)
                    if app.ENABLE_CONQUEROR_LEVEL:
                        if conquerorlevel:
                            self.CharacterLevel_2.SetText("Lv."+str(conquerorlevel))
                            self.CharacterLevel_2.SetPackedFontColor(0xFFBFD9FF)
                        else:
                            self.CharacterLevel_2.SetText("Lv."+str(level))
                    else:
                        self.CharacterLevel_2.SetText("Lv."+str(level))
                    self.Board_Date_1.Hide()
                    self.Board_Date_2.Hide()
                    self.Board_Date_3.Show()
                    self.Board_Date_4.Hide()
                    self.DiscFace.Show()
                    self.CharacterFace_2.Show()
                    if guildName:
                        self.CharacterGuild_03.SetText(guildName)
                    else:
                        self.CharacterGuild_03.SetText(localeworldard.NotGuild)
                    second = int(playTime * 60) ##Minutos a Segundos
                    horas = int(second / 3600)
                    minutos = int((second - (horas * 3600)) / 60)

                    if horas == 0:
                        self.CharacterTime_03.SetText(str(minutos)+localeworldard.Minutos)
                    if horas > 0:
                        self.CharacterTime_03.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
                        
                elif self.slot == 3:
                    self.CharacterFace_3.LoadImage(localeworldard.CharacterFace[race])
                    self.DiscFace.LoadImage(localeworldard.DiscFace[race])
                    self.CharacterName_3.SetText(name)
                    if app.ENABLE_CONQUEROR_LEVEL:
                        if conquerorlevel:
                            self.CharacterLevel_3.SetText("Lv."+str(conquerorlevel))
                            self.CharacterLevel_3.SetPackedFontColor(0xFFBFD9FF)
                        else:
                            self.CharacterLevel_3.SetText("Lv."+str(level))
                    else:
                        self.CharacterLevel_3.SetText("Lv."+str(level))
                    self.DiscFace.Show()
                    self.Board_Date_1.Hide()
                    self.Board_Date_2.Hide()
                    self.Board_Date_3.Hide()
                    self.Board_Date_4.Show()
                    self.CharacterFace_3.Show()
                    if guildName:
                        self.CharacterGuild_04.SetText(guildName)
                    else:
                        self.CharacterGuild_04.SetText(localeworldard.NotGuild)
                    second = int(playTime * 60) ##Minutos a Segundos
                    horas = int(second / 3600)
                    minutos = int((second - (horas * 3600)) / 60)

                    if horas == 0:
                        self.CharacterTime_04.SetText(str(minutos)+localeworldard.Minutos)
                    if horas > 0:
                        self.CharacterTime_04.SetText(str(horas)+localeworldard.Horas+str(minutos)+localeworldard.Minutos)
                    

                statesSummary = float(valueHTH + valueINT + valueSTR + valueDEX)
                if statesSummary > 0.0:
                    self.destGauge =    [
                                            float(valueHTH) / statesSummary,
                                            float(valueINT) / statesSummary,
                                            float(valueSTR) / statesSummary,
                                            float(valueDEX) / statesSummary
                                        ]
            else:
                self.InitCharacterBoard()

        def InitCharacterBoard(self):
            self.btnStart.Disable()
            self.btnStart.Hide()
            self.btnDelete.Disable()
            self.btnDelete.Hide()
            self.btnCreate.Show()
            self.btnCreate.Enable()
            self.CharacterHTH.SetText("")
            self.CharacterINT.SetText("")
            self.CharacterSTR.SetText("")
            self.CharacterDEX.SetText("")
            self.raceName_Text.SetText("")
            self.name_shaman.Hide()
            self.name_assassin.Hide()
            self.name_sura.Hide()
            self.name_warrior.Hide()
            self.name_wolfman.Hide()        
            self.DiscFace.Hide()
            self.Board_Date_1.Hide()
            self.Board_Date_2.Hide()
            self.Board_Date_3.Hide()
            self.Board_Date_4.Hide()
            self.fileListBox.RemoveAllItems()

            id = self.GetCharacterSlotID(0)
            id1 = self.GetCharacterSlotID(1)
            id2 = self.GetCharacterSlotID(2)
            id3 = self.GetCharacterSlotID(3)
            if 0==id:
                self.CharacterName_0.SetText("")
                self.CharacterLevel_0.SetText("")
                self.CharacterFace_0.Hide()
            if 0==id1:
                self.CharacterName_1.SetText("")
                self.CharacterLevel_1.SetText("")
                self.CharacterFace_1.Hide()
            if 0==id2:
                self.CharacterName_2.SetText("")
                self.CharacterLevel_2.SetText("")
                self.CharacterFace_2.Hide()
            if 0==id3:
                self.CharacterName_3.SetText("")
                self.CharacterLevel_3.SetText("")
                self.CharacterFace_3.Hide()
            if self.__AreAllSlotEmpty():
                self.empireName.SetText("")
                self.EmpireImage[1].Hide()
                self.EmpireImage[2].Hide()
                self.EmpireImage[3].Hide()
        ## Event
        def OnKeyDown(self, key):

            if 1 == key:
                self.ExitSelect()
            if 2 == key:
                self.SelectSlot(0)
            if 3 == key:
                self.SelectSlot(1)
            if 4 == key:
                self.SelectSlot(2)

            if 28 == key:

                id = net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_ID)
                if 0 == id:
                    self.CreateCharacter()

                else:
                    self.StartGame()

            if 203 == key:
                self.slot = (self.GetSlotIndex() - 1 + self.SLOT_COUNT) % self.SLOT_COUNT
                self.SelectSlot(self.slot)
            if 205 == key:
                self.slot = (self.GetSlotIndex() + 1) % self.SLOT_COUNT
                self.SelectSlot(self.slot)

            return TRUE

        def OnUpdate(self):
            chr.Update()

            for i in xrange(4):
                self.curGauge[i] += (self.destGauge[i] - self.curGauge[i]) / 10.0
                if abs(self.curGauge[i] - self.destGauge[i]) < 0.005:
                    self.curGauge[i] = self.destGauge[i]
                self.GaugeList[i].SetPercentage(self.curGauge[i], 1.0)

            for i in xrange(self.SLOT_COUNT):

                if FALSE == chr.HasInstance(i):
                    continue

                chr.SelectInstance(i)

            #######################################################
            if -1 != self.startIndex:

                ## Temporary
                ## BackGroundLoading이 지원 될때까지 임시로..
                if app.GetTime() - self.startReservingTime > 3.0:
                    if FALSE == self.openLoadingFlag:
                        chrSlot=self.stream.GetCharacterSlot()
                        net.DirectEnter(chrSlot)
                        self.openLoadingFlag = TRUE

                        playTime=net.GetAccountCharacterSlotDataInteger(self.slot, net.ACCOUNT_CHARACTER_SLOT_PLAYTIME)

                        
                        player.SetPlayTime(playTime)
                        import chat
                        chat.Clear() ## 들어갈때 Chat 을 초기화. 임시 Pos.
                ## Temporary
            #######################################################

        def EmptyFunc(self):
            pass

        def PopupMessage(self, msg, func=0):
            if not func:
                func=self.EmptyFunc

            self.stream.popupWindow.Close()
            self.stream.popupWindow.Open(msg, func, localeInfo.UI_OK)

        def OnPressExitKey(self):
            self.ExitSelect()
            return TRUE

     

    • Love 1
  12. M2 Download Center

    This is the hidden content, please
    ( Internal )

    This is the hidden content, please
    ( GitHub )

    Offline Shop - Premium Private Shop System
     

    Hi, due to lack of time, I hadn't shared, but ¡Hey!, I'm here and one more contribution.

     

    The Official Servers have an Offline for few months ago, so I took on the task of making a similar one, It's not like Official Servers in a some parts of code I think, it does occupy designs and other things but in some issues it's different, but I used the rules that they use in terms of encoding.

     

    I hope you like it, I tried that the Offline didn't occupy so many SQL sequences to minimize the load of SQL injections for the server and uses the same methods of the store and stores, don't create new files so that you can observe it.


    I take this topic to indicate that I don't sell my things because some persons always end up filtering them and it makes me very lazy to think that, I'm selling and providing kind support to good people so that a bad one arrives and simply ends all that, I don't usually give support because I don't received anything... in Yohara's level system some people sent me a message to indicate that there was an error and it was always an error that they installed it wrong, look correctly at the guide and once for real believe that I omitted something in the guide, you can contact me and tell me to fix it, but if it's an installation error and I must install the system for you, I will charge you, I like to help, but I give you a guide so that it is only corrected what I omitted.

     

    If you need me to connect it to your code or to add extra functions, I will still charge you, it's not much, it will simply be at your discretion and it will be a voluntary donation for me and my time, you will value how much you give me, it can be 1 EUR, 2 EUR, 3 EUR, 5 EUR I don't know (So I hope you make an effort, I already gave you the most complicated part, is to copy and paste code already done, including other parts for example like Safebox in Safebox part?), Some people were nice and some were not, so I decided to stop placing the rest of Yohara's patches for a few time.

     

    I hope you like this, install, test and contact me if you detect an error, I already looked for and corrected everything I observed.

    About memory leak - Doesn't have, I think 🤣.
    Use WJ_ENABLE_TRADABLE_ICON (public system).
    The default code in Python is Safebox to avoid code differences.
    Among other things.
    I use TRANSMUTATION like TRANSMUTATION, change it to Changelook, as I indicated in some parts of the guide where to change.

     

    # Visual Parts

    You can download the patches from the Official Servers in:

     

    Gyazo:

     

    https://metin2.download/picture/7729hcsItciSDcVWd5I9XHHyfljE6o0C/.gif
    https://metin2.download/picture/x3I3FDA60ktnOMRrwvHLB17IqsdIifoq/.gif

    https://metin2.download/picture/gw70KzDVtRQ1zzc1utLpBtZNLIn18LZF/.gif
    https://metin2.download/picture/8I25DBBiabuxw2cf4W8AZSC5mM0jIM70/.gif

     

    spacer.png

    spacer.png

     

     

    GitHub:

    This is the hidden content, please

     

     

    • Metin2 Dev 290
    • kekw 3
    • Eyes 6
    • Dislove 5
    • Not Good 5
    • Sad 2
    • Smile Tear 1
    • Think 7
    • Confused 5
    • Scream 4
    • Lmao 2
    • Good 130
    • muscle 1
    • Love 24
    • Love 247
  13. M2 Download Center

    This is the hidden content, please
    ( Internal )

    This is the hidden content, please
    ( GitHub )

    This is the Level System and Point's for Yohara

     

    1. The maps are empty, in essence it's the system, (without mobs).

    2. If you want to add the monsters on the maps you can contact me and, I add the monsters and put your credits, the truth was I was lazy :'(.

    3. I  can upload updates if you need it.

    4. In essence if you are level 1 or higher, you become "Conqueror", otherwise you are a normal player, your job is simply to add that after Hydra, though, I'll add it later.

    5. At the moment it calls the normal experience table, since I have not reviewed the officer's experience tables, but if you indicate the tables, I can modify the code and add that part.

     

    Images:
     

    In GitHub REAMDE.

    Link:

    This is the hidden content, please

    You will need a some visual parts, you can with:

    This is the hidden content, please


    I will continue making updates with information by Official Servers :).
    The system is working properly.

    • Metin2 Dev 380
    • kekw 2
    • Eyes 8
    • Dislove 8
    • Angry 4
    • Not Good 1
    • Sad 3
    • Smile Tear 4
    • Think 3
    • Confused 6
    • Scream 4
    • Lmao 1
    • Good 105
    • muscle 1
    • Love 28
    • Love 225
  14. 1 minute ago, Mafuyu said:

    whats about this, i dont have lycan, which one i have to use? can i simple use the define from you? 

    
    //Replace with
    
    #ifdef ENABLE_CONQUEROR_LEVEL
    	const DWORD SKILL_NUM = 184;
    #else
    #ifdef ENABLE_WOLFMAN_CHARACTER
    	const DWORD SKILL_NUM = 176;
    #else
    	const DWORD SKILL_NUM = 158;
    #endif
    #endif

    or do i have to change something ?

     

    Just paste the code,  it doesn't matter if you have WOLFMAN or not.

    • Love 1
  15. 12 minutes ago, Mafuyu said:

    make it without the useless lycan part please, you have many mismatches bc of the lycan shit in it... some lines doesnt make sense.

     

    
    
    #ifdef ENABLE_CONQUEROR_LEVEL
    #ifdef ENABLE_WOLFMAN_CHARACTER
    		if (GetSkillMasterType(dwSkillVnum) != SKILL_MASTER && (dwSkillVnum >= SKILL_FINISH && dwSkillVnum <= SKILL_ILIPUNGU))
    #else
    		if (GetSkillMasterType(dwSkillVnum) != SKILL_MASTER && (dwSkillVnum >= SKILL_FINISH && dwSkillVnum <= SKILL_CHEONUN))
    #endif
    
    
    #ifdef ENABLE_CONQUEROR_LEVEL
    #ifdef ENABLE_WOLFMAN_CHARACTER
    			if (GetSkillMasterType(pkSk->dwVnum) != SKILL_MASTER && (pkSk->dwVnum<= SKILL_FINISH | pkSk->dwVnum>= SKILL_ILIPUNGU))
    #else
    			if (GetSkillMasterType(pkSk->dwVnum) != SKILL_MASTER && (pkSk->dwVnum<= SKILL_FINISH | pkSk->dwVnum>= SKILL_ILIPUNGU))
    #endif

     

     

    why is above SKILL_ILIPUNGU and another skill, next code part is the same line??

     

     

     

     

    1. If you don't like it, remove it and that's it, I only saved the work for those who have defined WOLFMAN or not. If you don't have WOLFMAN, it doesn't mean that the rest don't either, I do have WOLFMAN. I repeat, if you don't like the lines I don't care, remove it and that's it. I just gave you something that someone else would have sold you dearly :)

    2. My bad i have already corrected that fragment, thank you, shoul de SKILL_CHEONUN. Thanks 🤣

    • Love 2
  16. 8 minutes ago, Kuroko said:

    Good evening, I have this problem with the 9th skill, so I don't know if the problem comes from me or if this problem is already present and for the Lycan the skill is not available.

     

    https://metin2.download/picture/2iLLqgb7UxKE3O1XvFgQuu9oCyjJIoNj/.gif

     

    In skill_proto.sql remove DISABLE_BY_POINT_UP for all skills, What happens is that I placed it as in Official Servers and in Official Servers it is uploaded with their respective books, not with points.

    :)

    • Metin2 Dev 1
    • Confused 1
    • Good 1
    • Love 2
  17. M2 Download Center

    This is the hidden content, please
    ( Internal )

    This is the hidden content, please
    ( GitHub )

    I have added some necessary visual stuff, although some are just visual.

     

    I don't provide basic support for implementation, If you notice that something is missing you can let me know and I will add it.
    • Metin2 Dev 135
    • Eyes 2
    • Dislove 3
    • Think 2
    • Confused 1
    • Scream 2
    • Good 26
    • Love 7
    • Love 75
  18. It's very simple, I suppose some must already have FIX but most do not.

    When you give Guild War Under Map if an Observer from your guild enters War and the enemy kills it, the counter will count it causing you to lose the war if they are many observers., although it can only kill you once, it continues to be an advantage.

     

    Search in battle.cpp

    bool battle_is_attackable(LPCHARACTER ch, LPCHARACTER victim)
    {
    	if (victim->IsDead())
    		return false;

    after this add:
     

    	if (victim->IsObserverMode())
    		return false;

     

    Now its fixed.

    • Metin2 Dev 1
    • Love 4
  19. I can't figure out what this fixes, you keep putting pseudo-random numbers on your fix ?.

    If it's a function to reset new "nice", but I think what you want is to eliminate the fact that some characters are reset and change the values with some in 10k and others in 13k even if they are of the same race.

     

    The problem is that since you create the character for the first time Metin2 will always place one stronger than another regardless of whether they are of the same race, that is to say that a character will always be lucky among 5 others to be the winner with more attributes "Forcing forced reset to stabilize." .

     

    You have two options more eaasy:
     
    1. Remove all RANDOM functions or MINMAX and set your conditions, but you are going to change all the ones that contain the array or data structure and this is very boring.
    2. Go to constants.cpp and replace the "Global Data Structure":
    TJobInitialPoints JobInitialPoints[JOB_MAX_NUM] =
    /*
       {
       int st, ht, dx, iq;
       int max_hp, max_sp;
       int hp_per_ht, sp_per_iq;
       int hp_per_lv_begin, hp_per_lv_end;
       int sp_per_lv_begin, sp_per_lv_end;
       int max_stamina;
       int stamina_per_con;
       int stamina_per_lv_begin, stamina_per_lv_end;
       }
     */
    {
    	// str con dex int 초기HP 초기SP  CON/HP INT/SP  HP랜덤/lv   MP랜덤/lv  초기stam  stam/con stam/lv
    	{   6,  4,  3,  3,  600,   200,     40,    20,    36, 44,     18, 22,     800,      5,      1, 3  }, // JOB_WARRIOR  16
    	{   4,  3,  6,  3,  650,   200,     40,    20,    36, 44,     18, 22,     800,      5,      1, 3  }, // JOB_ASSASSIN 16
    	{   5,  3,  3,  5,  650,   200,     40,    20,    36, 44,     18, 22,     800,      5,      1, 3  }, // JOB_SURA	 16
    	{   3,  4,  3,  6,  700,   200,     40,    20,    36, 44,     18, 22,     800,      5,      1, 3  },  // JOB_SHAMANa  16
    #ifdef ENABLE_WOLFMAN_CHARACTER
    	{   2,  6,  6,  2,  600,   200,     40,    20,    36, 44,     18, 22,     800,      5,      1, 3  }, // JOB_WOLFMAN  16  // TODO: 4개능력치 초기값 외에 다른 스탯 필요 (기획자한테 요청)
    #endif
    };

    for:

    TJobInitialPoints JobInitialPoints[JOB_MAX_NUM] =
    /*
       {
       int st, ht, dx, iq;
       int max_hp, max_sp;
       int hp_per_ht, sp_per_iq;
       int hp_per_lv_begin, hp_per_lv_end;
       int sp_per_lv_begin, sp_per_lv_end;
       int max_stamina;
       int stamina_per_con;
       int stamina_per_lv_begin, stamina_per_lv_end;
       }
     */
    {
    	// str con dex int 초기HP 초기SP  CON/HP INT/SP  HP랜덤/lv   MP랜덤/lv  초기stam  stam/con stam/lv
    	{   6,  4,  3,  3,  600,   200,     40,    20,    44, 44,     22, 22,     800,      5,      3, 3  }, // JOB_WARRIOR  16
    	{   4,  3,  6,  3,  650,   200,     40,    20,    44, 44,     22, 22,     800,      5,      3, 3  }, // JOB_ASSASSIN 16
    	{   5,  3,  3,  5,  650,   200,     40,    20,    44, 44,     22, 22,     800,      5,      3, 3  }, // JOB_SURA	 16
    	{   3,  4,  3,  6,  700,   200,     40,    20,    44, 44,     22, 22,     800,      5,      3, 3  },  // JOB_SHAMANa  16
    #ifdef ENABLE_WOLFMAN_CHARACTER
    	{   2,  6,  6,  2,  600,   200,     40,    20,    44, 44,     22, 22,     800,      5,      3, 3  }, // JOB_WOLFMAN  16  // TODO: 4개능력치 초기값 외에 다른 스탯 필요 (기획자한테 요청)
    #endif
    };

    That's it.

    • Love 3
  20. 53 minutes ago, Narvikz said:

    Yea ok. I will not be discussing this with you, but my fault for dropping it in without any context anyway. ReactOS reached Windows Server 2003 compatibility, then the project was halted due to loss of interest. Anyone who can understand it sees the point has been proven and that kernel integrity checks were not really needed for ReactOS, nor would it make sense enforce its own root authority chain of trust nor Microsoft's in their own research OS.

     

     

    I really hope you're not Frankie. I never seen martysama thread but I remember how annoying that guy was over skype asking for information like he actually needed that money to be partying or something. I am not surprised by the turn of events.

     

     

      

     

    bad joke

    bad

     

     

    That is a correct answer, you should also contemplate that the loss of interest was due to a series of demands, as I told you, Windows files were leaked, which ReactOS occupied, it's different to Reverse Engineering,  there are many projects with compatibility for Windows programs such as the Samba project.

     

    Don't worry, I don't like Frankie's useless one, years ago just because he thought he was a developer, he kicked me out of a series of groups.

     

    But as I see that many think that I am the trash person, my GeoIP :)

    https://metin2.download/picture/yeg3hcO7e2OGKR817deBykl3q6Di5Mt2/.png
     
    I think that before I start to defame, first inquire, don't compare me with that garbage that just copies and paste code.
     

     

     

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