Honorable Member Owsap 8253 Posted August 30, 2021 Honorable Member Share Posted August 30, 2021 This is the hidden content, please Sign In or Sign Up Other Mirrors This is the hidden content, please Sign In or Sign Up ( GitHub ) This is the hidden content, please Sign In or Sign Up ( MEGA ) A Mini Version of the official chatting window renewal. All settings are saved in UserData/chatting/<character_name> using the cPickle module in C, a powerful algorithm for serializing and de-serializing a Python object structure, also used by Webzen. 285 3 6 4 3 3 2 3 4 1 3 99 16 172 https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
txtxtx 16 Posted August 30, 2021 Share Posted August 30, 2021 Thanks for the release 1 Link to comment Share on other sites More sharing options...
Shaggyxdd 3 Posted August 30, 2021 Share Posted August 30, 2021 chattingoption.dds Link to comment Share on other sites More sharing options...
Active Member Helia01 2150 Posted August 30, 2021 Active Member Share Posted August 30, 2021 awesome! Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted August 31, 2021 Author Honorable Member Share Posted August 31, 2021 On 8/30/2021 at 1:13 PM, Shaggyxdd said: chattingoption.dds Repository updated, check the updated links. 1 1 https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
Shaggyxdd 3 Posted August 31, 2021 Share Posted August 31, 2021 36 minutes ago, Owsap said: Repository updated, check the updated links. Function SetTextAddPos? Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted August 31, 2021 Author Honorable Member Share Posted August 31, 2021 15 minutes ago, Shaggyxdd said: Function SetTextAddPos? ''' 1. @ root/ui.py ''' # Search @ class Button def SetText(self, text, height = 4): # Add above def SetTextAddPos(self, text, x_add = 0, y_add = 0, height = 4): if not self.ButtonText: textLine = TextLine() textLine.SetParent(self) textLine.SetPosition(self.GetWidth() / 2 + x_add, self.GetHeight() / 2 + y_add) textLine.SetVerticalAlignCenter() textLine.SetHorizontalAlignCenter() textLine.Show() self.ButtonText = textLine self.ButtonText.SetText(text) Repository updated, check the updated links and if there is anything missing please let me know. 1 https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
Shaggyxdd 3 Posted August 31, 2021 Share Posted August 31, 2021 (edited) 1 hour ago, Owsap said: ''' 1. @ root/ui.py ''' # Search @ class Button def SetText(self, text, height = 4): # Add above def SetTextAddPos(self, text, x_add = 0, y_add = 0, height = 4): if not self.ButtonText: textLine = TextLine() textLine.SetParent(self) textLine.SetPosition(self.GetWidth() / 2 + x_add, self.GetHeight() / 2 + y_add) textLine.SetVerticalAlignCenter() textLine.SetHorizontalAlignCenter() textLine.Show() self.ButtonText = textLine self.ButtonText.SetText(text) Repository updated, check the updated links and if there is anything missing please let me know. copy_reg.py? 0831 22:22:32364 :: Traceback (most recent call last): 0831 22:22:32364 :: File "networkModule.py", line 233, in SetGamePhase 0831 22:22:32365 :: File "game.py", line 121, in __init__ 0831 22:22:32365 :: File "interfaceModule.py", line 379, in MakeInterface 0831 22:22:32365 :: File "interfaceModule.py", line 138, in __MakeChatWindow 0831 22:22:32365 :: File "uiChat.py", line 952, in __init__ 0831 22:22:32365 :: File "uiChat.py", line 173, in __init__ 0831 22:22:32365 :: File "uiChat.py", line 208, in __LoadWindow 0831 22:22:32366 :: File "uiChat.py", line 258, in __LoadChattingOptionFile 0831 22:22:32366 :: File "Lib\copy_reg.py", line 70, in _reduce_ex 0831 22:22:32367 :: TypeError 0831 22:22:32367 :: : 0831 22:22:32367 :: can't pickle file objects 0831 22:22:32367 :: Edited August 31, 2021 by Shaggyxdd 3 Link to comment Share on other sites More sharing options...
Thrall 183 Posted September 2, 2021 Share Posted September 2, 2021 Thank you for the release, really nice! Link to comment Share on other sites More sharing options...
livetime97 0 Posted September 5, 2021 Share Posted September 5, 2021 Thx For Release I Have a Problem Pls Help me 0905 18:30:12071 :: Traceback (most recent call last): 0905 18:30:12071 :: File "networkModule.py", line 247, in SetGamePhase 0905 18:30:12071 :: File "game.py", line 89, in __init__ 0905 18:30:12071 :: File "interfaceModule.py", line 317, in MakeInterface 0905 18:30:12072 :: File "interfaceModule.py", line 123, in __MakeChatWindow 0905 18:30:12072 :: File "uiChat.py", line 968, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 164, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 199, in __LoadWindow 0905 18:30:12072 :: File "uiChat.py", line 249, in __LoadChattingOptionFile 0905 18:30:12072 :: File "Lib\copy_reg.py", line 70, in _reduce_ex 0905 18:30:12073 :: TypeError 0905 18:30:12073 :: : 0905 18:30:12073 :: can't pickle file objects 0905 18:30:12073 :: Link to comment Share on other sites More sharing options...
Shaggyxdd 3 Posted September 5, 2021 Share Posted September 5, 2021 (edited) 37 minutes ago, livetime97 said: Thx For Release I Have a Problem Pls Help me 0905 18:30:12071 :: Traceback (most recent call last): 0905 18:30:12071 :: File "networkModule.py", line 247, in SetGamePhase 0905 18:30:12071 :: File "game.py", line 89, in __init__ 0905 18:30:12071 :: File "interfaceModule.py", line 317, in MakeInterface 0905 18:30:12072 :: File "interfaceModule.py", line 123, in __MakeChatWindow 0905 18:30:12072 :: File "uiChat.py", line 968, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 164, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 199, in __LoadWindow 0905 18:30:12072 :: File "uiChat.py", line 249, in __LoadChattingOptionFile 0905 18:30:12072 :: File "Lib\copy_reg.py", line 70, in _reduce_ex 0905 18:30:12073 :: TypeError 0905 18:30:12073 :: : 0905 18:30:12073 :: can't pickle file objects 0905 18:30:12073 :: uichat, replace: def __LoadChattingOptionFile(self): load = False try: fileName = self.__GetChattingFile() file = open(fileName) try: load = True self.tmpCheckBoxSettingDict = cPickle.load(file) except (ValueError, EOFError, cPickle.PicklingError, cPickle.UnpicklingError): pass except IOError: pass for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1): if not load: # Default, always enable and add to dict. value = True self.tmpCheckBoxSettingDict[key] = True else: value = self.tmpCheckBoxSettingDict[key] self.checkBoxSlotDict[key].SetCheck(value) if not load: self.__SaveDefault() Edited September 5, 2021 by Shaggyxdd 2 Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted September 6, 2021 Author Honorable Member Share Posted September 6, 2021 Reports Spoiler On 8/31/2021 at 8:17 PM, Shaggyxdd said: copy_reg.py? 0831 22:22:32364 :: Traceback (most recent call last): 0831 22:22:32364 :: File "networkModule.py", line 233, in SetGamePhase 0831 22:22:32365 :: File "game.py", line 121, in __init__ 0831 22:22:32365 :: File "interfaceModule.py", line 379, in MakeInterface 0831 22:22:32365 :: File "interfaceModule.py", line 138, in __MakeChatWindow 0831 22:22:32365 :: File "uiChat.py", line 952, in __init__ 0831 22:22:32365 :: File "uiChat.py", line 173, in __init__ 0831 22:22:32365 :: File "uiChat.py", line 208, in __LoadWindow 0831 22:22:32366 :: File "uiChat.py", line 258, in __LoadChattingOptionFile 0831 22:22:32366 :: File "Lib\copy_reg.py", line 70, in _reduce_ex 0831 22:22:32367 :: TypeError 0831 22:22:32367 :: : 0831 22:22:32367 :: can't pickle file objects 0831 22:22:32367 :: 23 hours ago, livetime97 said: Thx For Release I Have a Problem Pls Help me 0905 18:30:12071 :: Traceback (most recent call last): 0905 18:30:12071 :: File "networkModule.py", line 247, in SetGamePhase 0905 18:30:12071 :: File "game.py", line 89, in __init__ 0905 18:30:12071 :: File "interfaceModule.py", line 317, in MakeInterface 0905 18:30:12072 :: File "interfaceModule.py", line 123, in __MakeChatWindow 0905 18:30:12072 :: File "uiChat.py", line 968, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 164, in __init__ 0905 18:30:12072 :: File "uiChat.py", line 199, in __LoadWindow 0905 18:30:12072 :: File "uiChat.py", line 249, in __LoadChattingOptionFile 0905 18:30:12072 :: File "Lib\copy_reg.py", line 70, in _reduce_ex 0905 18:30:12073 :: TypeError 0905 18:30:12073 :: : 0905 18:30:12073 :: can't pickle file objects 0905 18:30:12073 :: 22 hours ago, Shaggyxdd said: uichat, replace: def __LoadChattingOptionFile(self): load = False try: fileName = self.__GetChattingFile() file = open(fileName) try: load = True self.tmpCheckBoxSettingDict = cPickle.load(file) except (ValueError, EOFError, cPickle.PicklingError, cPickle.UnpicklingError): pass except IOError: pass for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1): if not load: # Default, always enable and add to dict. value = True self.tmpCheckBoxSettingDict[key] = True else: value = self.tmpCheckBoxSettingDict[key] self.checkBoxSlotDict[key].SetCheck(value) if not load: self.__SaveDefault() Sorry for the delay regarding the reported issue with the pickle module. I have reviewed the tutorial and noticed a dump line intended for debugging while opening the chat setting window. Removing that line will solve the unpickling issue. There were also some faults in the tutorial that have been corrected and some files that have been added which were missing. The MEGA link and repository have been updated. 1 1 https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
Active Member Dex 525 Posted September 7, 2021 Active Member Share Posted September 7, 2021 Would you like to put also the function for creating new chats through the + sign like official to have different chatwindows for each ? Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted September 8, 2021 Author Honorable Member Share Posted September 8, 2021 (edited) 13 hours ago, Dex said: Would you like to put also the function for creating new chats through the + sign like official to have different chatwindows for each ? I only planned to release a Mini Version, that's why I didn't add that feature but who knows maybe sooner or later I can extend it or until then you can find it already done from someone else. Edited September 8, 2021 by Owsap https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
Maze 8 Posted September 8, 2021 Share Posted September 8, 2021 (edited) @Owsap thanks Edited September 8, 2021 by Maze system Link to comment Share on other sites More sharing options...
Fluff99s 0 Posted September 9, 2021 Share Posted September 9, 2021 (edited) After adding this system into my server, i get the following error in syserrȘ 0909 10:58:15148 :: GRANNY: r:/granny/rt/granny_file_info.cpp(145): File has run-time type tag of 0x8000000f, which doesn't match this version of Granny (0x80000010). Automatic conversion will be attempted. 0909 10:58:18436 :: Traceback (most recent call last): 0909 10:58:18436 :: File "networkModule.py", line 239, in SetGamePhase 0909 10:58:18437 :: File "game.py", line 109, in __init__ 0909 10:58:18437 :: File "interfaceModule.py", line 306, in MakeInterface 0909 10:58:18437 :: File "interfaceModule.py", line 100, in __MakeMessengerWindow 0909 10:58:18437 :: File "uiMessenger.py", line 397, in __init__ 0909 10:58:18438 :: File "uiMessenger.py", line 540, in __AddGroup 0909 10:58:18438 :: File "uiMessenger.py", line 318, in __init__ 0909 10:58:18438 :: AttributeError 0909 10:58:18438 :: : 0909 10:58:18438 :: 'module' object has no attribute 'MESSENGER_FRIEND' 0909 10:58:18438 :: What can I do about it? do you know where is the problem from? I have in locale_game the MESSENGER_FRIEND and the "TAB" is ok, in locale_info i don't have one. EDIT: here is the solve for this error : Enter in your uimessenger.py and replace locale. to localeInfo. and it should work fine. Edited September 9, 2021 by Fluff99s Link to comment Share on other sites More sharing options...
Fluff99s 0 Posted September 9, 2021 Share Posted September 9, 2021 (edited) On 9/9/2021 at 11:08 AM, Fluff99s said: After adding this system into my server, i get the following error in syserrȘ 0909 10:58:15148 :: GRANNY: r:/granny/rt/granny_file_info.cpp(145): File has run-time type tag of 0x8000000f, which doesn't match this version of Granny (0x80000010). Automatic conversion will be attempted. 0909 10:58:18436 :: Traceback (most recent call last): 0909 10:58:18436 :: File "networkModule.py", line 239, in SetGamePhase 0909 10:58:18437 :: File "game.py", line 109, in __init__ 0909 10:58:18437 :: File "interfaceModule.py", line 306, in MakeInterface 0909 10:58:18437 :: File "interfaceModule.py", line 100, in __MakeMessengerWindow 0909 10:58:18437 :: File "uiMessenger.py", line 397, in __init__ 0909 10:58:18438 :: File "uiMessenger.py", line 540, in __AddGroup 0909 10:58:18438 :: File "uiMessenger.py", line 318, in __init__ 0909 10:58:18438 :: AttributeError 0909 10:58:18438 :: : 0909 10:58:18438 :: 'module' object has no attribute 'MESSENGER_FRIEND' 0909 10:58:18438 :: What can I do about it? do you know where is the problem from? I have in locale_game the MESSENGER_FRIEND and the "TAB" is ok, in locale_info i don't have one. This error is happening with other lib files from my client downloaded from internet, with my originals lib files from client i have another error wich is it: 0909 12:16:08738 :: networkModule.py(line:200) SetSelectCharacterPhase system.py(line:130) __pack_import system.py(line:110) _process_result introSelect.py(line:27) <module> system.py(line:130) __pack_import system.py(line:110) _process_result interfaceModule.py(line:11) <module> system.py(line:130) __pack_import system.py(line:110) _process_result uiChat.py(line:17) <module> system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\pickle.py(line:33) <module> - import re system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\re.py(line:27) <module> - from sre import * system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\sre.py(line:97) <module> - import sre_compile system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\sre_compile.py(line:17) <module> - assert _sre.MAGIC == MAGIC, "SRE module mismatch" networkModule.SetSelectCharacterPhase - <type 'exceptions.AssertionError'>:SRE module mismatch 0909 12:16:08738 :: ============================================================================================================ 0909 12:16:08738 :: Abort!!!! L.E: to get pass this, search on google for ne lib python27 and change it in your client folder lib, as an experience, keep the originals for later. Edited September 10, 2021 by Fluff99s i find the solution Link to comment Share on other sites More sharing options...
rares2017 31 Posted September 10, 2021 Share Posted September 10, 2021 It doesn't say how much experience I get when I kill a monster. Link to comment Share on other sites More sharing options...
MrPicks 1 Posted September 10, 2021 Share Posted September 10, 2021 (edited) Thank your for release, it works good but there's one bug in python. Which bug? Background of Chat Window doesn't hide anymore https://metin2.download/picture/1nvjxFelzjKd39zs8vA1JrtqdxKp9I60/.gif sysrr Spoiler 0910 22:39:49128 :: File "uiChat.py", line 1257, in OnRender 0910 22:39:49128 :: File "uiChat.py", line 1196, in Refresh 0910 22:39:49128 :: File "uiChat.py", line 1223, in RefreshBoardViewState 0910 22:39:49129 :: AttributeError 0910 22:39:49129 :: : 0910 22:39:49129 :: 'int' object has no attribute 'GetGlobalPosition' 0910 22:39:49129 :: https://metin2.download/picture/VmLtFb2xO0cZ6AS4LP84o0iIs8PlIUfb/.png https://metin2.download/picture/228xtk9g6dtV58wfNF6uwzqv50OX5XsE/.png When it happens? 1. Open Chat and write something 2. let the chat window open and warp with warpring to XY 3. now the background of the new chat is buggy / doesn't hide Edited September 4, 2022 by Metin2 Dev Core X - External 2 Internal 1 Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted September 10, 2021 Author Honorable Member Share Posted September 10, 2021 (edited) @ Fluff99s Spoiler On 9/9/2021 at 8:08 AM, Fluff99s said: After adding this system into my server, i get the following error in syserrȘ 0909 10:58:15148 :: GRANNY: r:/granny/rt/granny_file_info.cpp(145): File has run-time type tag of 0x8000000f, which doesn't match this version of Granny (0x80000010). Automatic conversion will be attempted. 0909 10:58:18436 :: Traceback (most recent call last): 0909 10:58:18436 :: File "networkModule.py", line 239, in SetGamePhase 0909 10:58:18437 :: File "game.py", line 109, in __init__ 0909 10:58:18437 :: File "interfaceModule.py", line 306, in MakeInterface 0909 10:58:18437 :: File "interfaceModule.py", line 100, in __MakeMessengerWindow 0909 10:58:18437 :: File "uiMessenger.py", line 397, in __init__ 0909 10:58:18438 :: File "uiMessenger.py", line 540, in __AddGroup 0909 10:58:18438 :: File "uiMessenger.py", line 318, in __init__ 0909 10:58:18438 :: AttributeError 0909 10:58:18438 :: : 0909 10:58:18438 :: 'module' object has no attribute 'MESSENGER_FRIEND' 0909 10:58:18438 :: What can I do about it? do you know where is the problem from? I have in locale_game the MESSENGER_FRIEND and the "TAB" is ok, in locale_info i don't have one. EDIT: here is the solve for this error : Enter in your uimessenger.py and replace locale. to localeInfo. and it should work fine. Sorry, but this has nothing to do with the system or the modified files. Spoiler On 9/9/2021 at 9:17 AM, Fluff99s said: This error is happening with other lib files from my client downloaded from internet, with my originals lib files from client i have another error wich is it: 0909 12:16:08738 :: networkModule.py(line:200) SetSelectCharacterPhase system.py(line:130) __pack_import system.py(line:110) _process_result introSelect.py(line:27) <module> system.py(line:130) __pack_import system.py(line:110) _process_result interfaceModule.py(line:11) <module> system.py(line:130) __pack_import system.py(line:110) _process_result uiChat.py(line:17) <module> system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\pickle.py(line:33) <module> - import re system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\re.py(line:27) <module> - from sre import * system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\sre.py(line:97) <module> - import sre_compile system.py(line:137) __pack_import C:\Users\Marian\Desktop\Client\lib\sre_compile.py(line:17) <module> - assert _sre.MAGIC == MAGIC, "SRE module mismatch" networkModule.SetSelectCharacterPhase - <type 'exceptions.AssertionError'>:SRE module mismatch 0909 12:16:08738 :: ============================================================================================================ 0909 12:16:08738 :: Abort!!!! L.E: to get pass this, search on google for ne lib python27 and change it in your client folder lib, as an experience, keep the originals for later. I have added some This is the hidden content, please Sign In or Sign Up (check the repository) it could help you solve your problem. @rares2017 Spoiler 3 hours ago, rares2017 said: It doesn't say how much experience I get when I kill a monster. Search the exp string in your source and change CHAT_TYPE_INFO with CHAT_TYPE_EXP_INFO @ MrPicks Spoiler 1 hour ago, MrPicks said: Thank your for release, it works good but there's one bug in python. Which bug? Background of Chat Window doesn't hide anymore https://metin2.download/picture/1nvjxFelzjKd39zs8vA1JrtqdxKp9I60/.gif sysrr Hide contents 0910 22:39:49128 :: File "uiChat.py", line 1257, in OnRender 0910 22:39:49128 :: File "uiChat.py", line 1196, in Refresh 0910 22:39:49128 :: File "uiChat.py", line 1223, in RefreshBoardViewState 0910 22:39:49129 :: AttributeError 0910 22:39:49129 :: : 0910 22:39:49129 :: 'int' object has no attribute 'GetGlobalPosition' 0910 22:39:49129 :: https://metin2.download/picture/VmLtFb2xO0cZ6AS4LP84o0iIs8PlIUfb/.png https://metin2.download/picture/228xtk9g6dtV58wfNF6uwzqv50OX5XsE/.png When it happens? 1. Open Chat and write something 2. let the chat window open and warp with warpring to XY 3. now the background of the new chat is buggy / doesn't hide The GetGlobalPosition function has always been there even on older roots, possibly you added something wrong but show us your uiChat.py so we can take a look at it. Edited September 4, 2022 by Metin2 Dev Core X - External 2 Internal 32 1 2 8 2 14 https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
rares2017 31 Posted September 10, 2021 Share Posted September 10, 2021 I solved that,but hide option does not work for chat log. Link to comment Share on other sites More sharing options...
Honorable Member Owsap 8253 Posted September 10, 2021 Author Honorable Member Share Posted September 10, 2021 36 minutes ago, rares2017 said: I solved that,but hide option does not work for chat log. The chat log is a set of tabs separated by the type of chat, in my opinion it doesn't make sense to hide the text in the log window. How are you going to see a log if it's hidden? https://owsap.dev/ / https://osf.owsap.dev/ Link to comment Share on other sites More sharing options...
rares2017 31 Posted September 10, 2021 Share Posted September 10, 2021 3 minutes ago, Owsap said: The chat log is a set of tabs separated by the type of chat, in my opinion it doesn't make sense to hide the text in the log window. How are you going to see a log if it's hidden? Yes, but the text appears in all mode, not just in the info. Link to comment Share on other sites More sharing options...
Active Member Dex 525 Posted September 11, 2021 Active Member Share Posted September 11, 2021 (edited) @Owsap i can confirm the problem with the GetGlobalPosition() function Spoiler import ui import grp import chat import wndMgr import net import app import ime import localeInfo import colorInfo import constInfo import systemSetting import player if app.ENABLE_CHATTING_WINDOW_RENEWAL: import os import uiCommon import uiScriptLocale try: import cPickle as pickle except (ImportError, TypeError): import pickle as pickle ENABLE_CHAT_COMMAND = TRUE ENABLE_LAST_SENTENCE_STACK = TRUE ENABLE_INSULT_CHECK = TRUE if localeInfo.IsHONGKONG(): ENABLE_LAST_SENTENCE_STACK = TRUE if localeInfo.IsEUROPE(): ENABLE_CHAT_COMMAND = FALSE if localeInfo.IsCANADA(): ENABLE_LAST_SENTENCE_STACK = FALSE chatInputSetList = [] def InsertChatInputSetWindow(wnd): global chatInputSetList chatInputSetList.append(wnd) def RefreshChatMode(): global chatInputSetList map(lambda wnd:wnd.OnRefreshChatMode(), chatInputSetList) def DestroyChatInputSetWindow(): global chatInputSetList chatInputSetList = [] if app.ENABLE_CHATTING_WINDOW_RENEWAL: CHECK_BOX_X_POS = 145 OPTION_CHECKBOX_TALKING = 1 OPTION_CHECKBOX_PARTY = 2 OPTION_CHECKBOX_GUILD = 3 OPTION_CHECKBOX_SHOUT = 4 OPTION_CHECKBOX_INFO = 5 OPTION_CHECKBOX_NOTICE = 6 #OPTION_CHECKBOX_DICE = 7 OPTION_CHECKBOX_EXP_INFO = 7 OPTION_CHECKBOX_ITEM_INFO = 8 OPTION_CHECKBOX_MONEY_INFO = 9 OPTION_CHECKBOX_MODE = { chat.CHAT_TYPE_TALKING : OPTION_CHECKBOX_TALKING, chat.CHAT_TYPE_INFO : OPTION_CHECKBOX_INFO, chat.CHAT_TYPE_NOTICE : OPTION_CHECKBOX_NOTICE, chat.CHAT_TYPE_PARTY : OPTION_CHECKBOX_PARTY, chat.CHAT_TYPE_GUILD : OPTION_CHECKBOX_GUILD, chat.CHAT_TYPE_SHOUT : OPTION_CHECKBOX_SHOUT, #chat.CHAT_TYPE_DICE_INFO : OPTION_CHECKBOX_DICE, chat.CHAT_TYPE_EXP_INFO : OPTION_CHECKBOX_EXP_INFO, chat.CHAT_TYPE_ITEM_INFO : OPTION_CHECKBOX_ITEM_INFO, chat.CHAT_TYPE_MONEY_INFO : OPTION_CHECKBOX_MONEY_INFO, } ## ChatSettingWindow class ChatSettingWindow(ui.ScriptWindow): __author__ = "Owsap" __copyright__ = "Copyright 2021, Owsap Productions" class MouseReflector(ui.Window): def __init__(self, parent): ui.Window.__init__(self) self.SetParent(parent) self.AddFlag("not_pick") self.width = self.height = 0 self.isDown = False def __del__(self): ui.Window.__del__(self) def Down(self): self.isDown = True def Up(self): self.isDown = False def OnRender(self): if self.isDown: grp.SetColor(ui.WHITE_COLOR) else: grp.SetColor(ui.HALF_WHITE_COLOR) x, y = self.GetGlobalPosition() grp.RenderBar(x + 2, y + 2, self.GetWidth() - 4, self.GetHeight() - 4) class CheckBox(ui.ImageBox): def __init__(self, parent, x, y, event, filename = "d:/ymir work/ui/chat/chattingoption_check_box_off.sub"): ui.ImageBox.__init__(self) self.SetParent(parent) self.SetPosition(x, y) self.LoadImage(filename) self.mouseReflector = parent.MouseReflector(self) self.mouseReflector.SetSize(self.GetWidth(), self.GetHeight()) image = ui.MakeImageBox(self, "d:/ymir work/ui/public/check_image.sub", 0, 0) image.AddFlag("not_pick") image.SetWindowHorizontalAlignCenter() image.SetWindowVerticalAlignCenter() image.Hide() self.check = False self.enable = True self.image = image self.event = event self.Show() self.mouseReflector.UpdateRect() def __del__(self): ui.ImageBox.__del__(self) def GetCheck(self): return self.check def SetCheck(self, flag): if flag: self.check = True self.image.Show() else: self.check = False self.image.Hide() def Disable(self): self.enable = False def OnMouseOverIn(self): if not self.enable: return self.mouseReflector.Show() def OnMouseOverOut(self): if not self.enable: return self.mouseReflector.Hide() def OnMouseLeftButtonDown(self): if not self.enable: return self.mouseReflector.Down() def OnMouseLeftButtonUp(self): if not self.enable: return self.mouseReflector.Up() self.event() def __init__(self, parent): ui.ScriptWindow.__init__(self) self.isLoaded = False self.parent = parent self.questionDialog = None self.checkBoxSlotDict = {} self.tmpCheckBoxSettingDict = {} self.__LoadWindow() def __del__(self): ui.ScriptWindow.__del__(self) self.isLoaded = False self.parent = None self.questionDialog = None self.checkBoxSlotDict = {} self.tmpCheckBoxSettingDict = {} def __LoadWindow(self): if self.isLoaded: return self.isLoaded = 1 try: pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "UIScript/ChatSettingWindow.py") except: import exception exception.Abort("ChatSettingWindow.LoadWindow.LoadScript") try: self.__BindObject() except: import exception exception.Abort("ChatSettingWindow.LoadWindow.BindObject") try: self.__CreateObject() except: import exception exception.Abort("ChatSettingWindow.LoadWindow.CreateObject") try: self.__LoadChattingOptionFile() except: self.__SaveDefault() def __BindObject(self): self.GetChild("board").SetCloseEvent(ui.__mem_func__(self.Close)) self.resetBtn = self.GetChild("reset_button") self.resetBtn.SetEvent(ui.__mem_func__(self.__OnClickPopUpSetting), localeInfo.CHATTING_SETTING_CLEAR_QUESTION) self.saveBtn = self.GetChild("save_button") self.saveBtn.SetEvent(ui.__mem_func__(self.__OnClickSave)) self.cancelBtn = self.GetChild("cancle_button") self.cancelBtn.SetEvent(ui.__mem_func__(self.Close)) def __CreateObject(self): for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1): event = lambda index = key : ui.__mem_func__(self.SetCurrentChatOption)(index) # chatting_setting_talking_bg.y + (31 * y) yPos = 64 + (31 * 0) #if key >= OPTION_CHECKBOX_DICE: # yPos = 64 + (31 * 1) if key >= OPTION_CHECKBOX_EXP_INFO: yPos = 64 + (31 * 1) self.checkBoxSlotDict[key] = self.CheckBox(self, CHECK_BOX_X_POS, yPos + (18 * (key - 1)), event) def __OnClickSave(self): self.__SaveFile() if self.parent: self.parent.RefreshChatWindow() self.Close() def __GetChattingFile(self): # Create the UserData/chatting path if it doesn't exist. path = ["UserData", "chatting"] try: if not os.path.exists(os.getcwd() + os.sep + path[0] + os.sep + path[1]): os.makedirs(os.getcwd() + os.sep + "UserData" + os.sep + "chatting") except WindowsError as error: pass return "%s/%s/%s" % (path[0], path[1], player.GetName()) # -_-' def __LoadChattingOptionFile(self): load = False try: fileName = self.__GetChattingFile() file = open(fileName) try: load = True self.tmpCheckBoxSettingDict = pickle.load(file) except (ValueError, EOFError, pickle.PicklingError, pickle.UnpicklingError): pass except IOError: pass for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1): if not load: # Default, always enable and add to dict. value = True self.tmpCheckBoxSettingDict[key] = True else: value = self.tmpCheckBoxSettingDict[key] self.checkBoxSlotDict[key].SetCheck(value) if not load: self.__SaveDefault() def __SaveFile(self): if not self.tmpCheckBoxSettingDict: return try: fileName = self.__GetChattingFile() file = open(fileName, 'wb') pickle.dump(self.tmpCheckBoxSettingDict, file) except IOError: return def __SaveDefault(self): for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1): self.tmpCheckBoxSettingDict[key] = True try: fileName = self.__GetChattingFile() file = open(fileName, 'wb') pickle.dump(self.tmpCheckBoxSettingDict, file) except IOError: return def __OnClickPopUpSetting(self, text): questionDialog = uiCommon.QuestionDialog() questionDialog.SetText(text) questionDialog.SetAcceptEvent(ui.__mem_func__(self.__QuestionPopupAccept)) questionDialog.SetCancelEvent(ui.__mem_func__(self.__QuestionPopupCancle)) questionDialog.Open() self.questionDialog = questionDialog def __QuestionPopupAccept(self): if not self.questionDialog: return self.__SaveDefault() if self.parent: self.parent.RefreshChatWindow() self.__QuestionPopupCancle() self.Close() def __QuestionPopupCancle(self): self.questionDialog.Close() self.questionDialog = None def SetCurrentChatOption(self, index): value = False if not self.checkBoxSlotDict[index].GetCheck(): value = True self.checkBoxSlotDict[index].SetCheck(value) self.tmpCheckBoxSettingDict.update({index: value}) def GetChatModeSetting(self, mode): try: value = OPTION_CHECKBOX_MODE[mode] return self.tmpCheckBoxSettingDict[value] except KeyError: return True def OnPressEscapeKey(self): self.Close() return True def Open(self): if not self.isLoaded: self.__LoadWindow() try: self.__LoadChattingOptionFile() except: self.__SaveDefault() self.Show() def Close(self): if self.questionDialog: self.questionDialog.Close() self.Hide() ## ChatModeButton class ChatModeButton(ui.Window): OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0) OVER_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 0.3) BUTTON_STATE_UP = 0 BUTTON_STATE_OVER = 1 BUTTON_STATE_DOWN = 2 def __init__(self): ui.Window.__init__(self) self.state = None self.buttonText = None self.event = None self.SetWindowName("ChatModeButton") net.EnableChatInsultFilter(ENABLE_INSULT_CHECK) def __del__(self): ui.Window.__del__(self) def SAFE_SetEvent(self, event): self.event=ui.__mem_func__(event) def SetText(self, text): if None == self.buttonText: textLine = ui.TextLine() textLine.SetParent(self) textLine.SetWindowHorizontalAlignCenter() textLine.SetWindowVerticalAlignCenter() textLine.SetVerticalAlignCenter() textLine.SetHorizontalAlignCenter() textLine.SetPackedFontColor(self.OUTLINE_COLOR) textLine.Show() self.buttonText = textLine self.buttonText.SetText(text) def SetSize(self, width, height): self.width = width self.height = height ui.Window.SetSize(self, width, height) def OnMouseOverIn(self): self.state = self.BUTTON_STATE_OVER def OnMouseOverOut(self): self.state = self.BUTTON_STATE_UP def OnMouseLeftButtonDown(self): self.state = self.BUTTON_STATE_DOWN def OnMouseLeftButtonUp(self): self.state = self.BUTTON_STATE_UP if self.IsIn(): self.state = self.BUTTON_STATE_OVER if None != self.event: self.event() def OnRender(self): (x, y) = self.GetGlobalPosition() grp.SetColor(self.OUTLINE_COLOR) grp.RenderRoundBox(x, y, self.width, self.height) if self.state >= self.BUTTON_STATE_OVER: grp.RenderRoundBox(x+1, y, self.width-2, self.height) grp.RenderRoundBox(x, y+1, self.width, self.height-2) if self.BUTTON_STATE_DOWN == self.state: grp.SetColor(self.OVER_COLOR) grp.RenderBar(x+1, y+1, self.width-2, self.height-2) ## ChatLine class ChatLine(ui.EditLine): CHAT_MODE_NAME = { chat.CHAT_TYPE_TALKING : localeInfo.CHAT_NORMAL, chat.CHAT_TYPE_PARTY : localeInfo.CHAT_PARTY, chat.CHAT_TYPE_GUILD : localeInfo.CHAT_GUILD, chat.CHAT_TYPE_SHOUT : localeInfo.CHAT_SHOUT, } def __init__(self): ui.EditLine.__init__(self) self.SetWindowName("Chat Line") self.lastShoutTime = 0 self.eventEscape = lambda *arg: None self.eventReturn = lambda *arg: None self.eventTab = None self.chatMode = chat.CHAT_TYPE_TALKING self.bCodePage = TRUE self.overTextLine = ui.TextLine() self.overTextLine.SetParent(self) self.overTextLine.SetPosition(-1, 0) self.overTextLine.SetFontColor(1.0, 1.0, 0.0) self.overTextLine.SetOutline() self.overTextLine.Hide() self.lastSentenceStack = [] self.lastSentencePos = 0 def SetChatMode(self, mode): self.chatMode = mode def GetChatMode(self): return self.chatMode def ChangeChatMode(self): if chat.CHAT_TYPE_TALKING == self.GetChatMode(): self.SetChatMode(chat.CHAT_TYPE_PARTY) self.SetText("#") self.SetEndPosition() elif chat.CHAT_TYPE_PARTY == self.GetChatMode(): self.SetChatMode(chat.CHAT_TYPE_GUILD) self.SetText("%") self.SetEndPosition() elif chat.CHAT_TYPE_GUILD == self.GetChatMode(): self.SetChatMode(chat.CHAT_TYPE_SHOUT) self.SetText("!") self.SetEndPosition() elif chat.CHAT_TYPE_SHOUT == self.GetChatMode(): self.SetChatMode(chat.CHAT_TYPE_TALKING) self.SetText("") self.__CheckChatMark() if app.LINK_IN_CHAT: def GetLink(self, text): link = "" start = text.find("http://") if start == -1: start = text.find("https://") if start == -1: return "" return text[start:len(text)].split(" ")[0] def GetCurrentChatModeName(self): try: return self.CHAT_MODE_NAME[self.chatMode] except: import exception exception.Abort("ChatLine.GetCurrentChatModeName") def SAFE_SetEscapeEvent(self, event): self.eventReturn = ui.__mem_func__(event) def SAFE_SetReturnEvent(self, event): self.eventEscape = ui.__mem_func__(event) def SAFE_SetTabEvent(self, event): self.eventTab = ui.__mem_func__(event) def SetTabEvent(self, event): self.eventTab = event def OpenChat(self): self.SetFocus() self.__ResetChat() def __ClearChat(self): self.SetText("") self.lastSentencePos = 0 def __ResetChat(self): if chat.CHAT_TYPE_PARTY == self.GetChatMode(): self.SetText("#") self.SetEndPosition() elif chat.CHAT_TYPE_GUILD == self.GetChatMode(): self.SetText("%") self.SetEndPosition() elif chat.CHAT_TYPE_SHOUT == self.GetChatMode(): self.SetText("!") self.SetEndPosition() else: self.__ClearChat() self.__CheckChatMark() def __SendChatPacket(self, text, type): if net.IsChatInsultIn(text): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_INSULT_STRING) else: if app.LINK_IN_CHAT: link = self.GetLink(text) if link != "": import chr if not chr.IsGameMaster(): text = text.replace(link, "|cFF00C0FC|h|Hweb:" + link.replace("://", "XxX") + "|h" + link + "|h|r") else: text = text.replace(link, "|cFF00C0FC|h|Hsysweb:" + link.replace("://", "XxX") + "|h" + link + "|h|r") net.SendChatPacket(text, type) def __SendPartyChatPacket(self, text): if 1 == len(text): self.RunCloseEvent() return self.__SendChatPacket(text[1:], chat.CHAT_TYPE_PARTY) self.__ResetChat() def __SendGuildChatPacket(self, text): if 1 == len(text): self.RunCloseEvent() return self.__SendChatPacket(text[1:], chat.CHAT_TYPE_GUILD) self.__ResetChat() def __SendShoutChatPacket(self, text): if 1 == len(text): self.RunCloseEvent() return if app.GetTime() < self.lastShoutTime + 15: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_SHOUT_LIMIT) self.__ResetChat() return self.__SendChatPacket(text[1:], chat.CHAT_TYPE_SHOUT) self.__ResetChat() self.lastShoutTime = app.GetTime() def __SendTalkingChatPacket(self, text): self.__SendChatPacket(text, chat.CHAT_TYPE_TALKING) self.__ResetChat() def OnIMETab(self): #if None != self.eventTab: # self.eventTab() #return TRUE return FALSE def OnIMEUpdate(self): ui.EditLine.OnIMEUpdate(self) self.__CheckChatMark() def __CheckChatMark(self): self.overTextLine.Hide() text = self.GetText() if len(text) > 0: if '#' == text[0]: self.overTextLine.SetText("#") self.overTextLine.Show() elif '%' == text[0]: self.overTextLine.SetText("%") self.overTextLine.Show() elif '!' == text[0]: self.overTextLine.SetText("!") self.overTextLine.Show() def OnIMEKeyDown(self, key): # LAST_SENTENCE_STACK if app.VK_UP == key: self.__PrevLastSentenceStack() return TRUE if app.VK_DOWN == key: self.__NextLastSentenceStack() return TRUE # END_OF_LAST_SENTENCE_STACK ui.EditLine.OnIMEKeyDown(self, key) # LAST_SENTENCE_STACK def __PrevLastSentenceStack(self): global ENABLE_LAST_SENTENCE_STACK if not ENABLE_LAST_SENTENCE_STACK: return if self.lastSentenceStack and self.lastSentencePos < len(self.lastSentenceStack): self.lastSentencePos += 1 lastSentence = self.lastSentenceStack[-self.lastSentencePos] self.SetText(lastSentence) self.SetEndPosition() def __NextLastSentenceStack(self): global ENABLE_LAST_SENTENCE_STACK if not ENABLE_LAST_SENTENCE_STACK: return if self.lastSentenceStack and self.lastSentencePos > 1: self.lastSentencePos -= 1 lastSentence = self.lastSentenceStack[-self.lastSentencePos] self.SetText(lastSentence) self.SetEndPosition() def __PushLastSentenceStack(self, text): global ENABLE_LAST_SENTENCE_STACK if not ENABLE_LAST_SENTENCE_STACK: return if len(text) <= 0: return LAST_SENTENCE_STACK_SIZE = 32 if len(self.lastSentenceStack) > LAST_SENTENCE_STACK_SIZE: self.lastSentenceStack.pop(0) self.lastSentenceStack.append(text) # END_OF_LAST_SENTENCE_STACK def OnIMEReturn(self): text = self.GetText() textLen=len(text) # LAST_SENTENCE_STACK self.__PushLastSentenceStack(text) # END_OF_LAST_SENTENCE_STACK textSpaceCount=text.count(' ') if (textLen > 0) and (textLen != textSpaceCount): if '#' == text[0]: self.__SendPartyChatPacket(text) elif '%' == text[0]: self.__SendGuildChatPacket(text) elif '!' == text[0]: self.__SendShoutChatPacket(text) else: self.__SendTalkingChatPacket(text) else: self.__ClearChat() self.eventReturn() return TRUE def OnPressEscapeKey(self): self.__ClearChat() self.eventEscape() return TRUE def RunCloseEvent(self): self.eventEscape() def BindInterface(self, interface): self.interface = interface def OnMouseLeftButtonDown(self): hyperlink = ui.GetHyperlink() if hyperlink: if app.IsPressed(app.DIK_LALT): link = chat.GetLinkFromHyperlink(hyperlink) ime.PasteString(link) else: self.interface.MakeHyperlinkTooltip(hyperlink) else: ui.EditLine.OnMouseLeftButtonDown(self) class ChatInputSet(ui.Window): CHAT_OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0) def __init__(self): ui.Window.__init__(self) self.SetWindowName("ChatInputSet") InsertChatInputSetWindow(self) self.__Create() def __del__(self): ui.Window.__del__(self) def __Create(self): chatModeButton = ChatModeButton() chatModeButton.SetParent(self) chatModeButton.SetSize(40, 17) chatModeButton.SetText(localeInfo.CHAT_NORMAL) chatModeButton.SetPosition(7, 2) chatModeButton.SAFE_SetEvent(self.OnChangeChatMode) self.chatModeButton = chatModeButton chatLine = ChatLine() chatLine.SetParent(self) chatLine.SetMax(512) chatLine.SetUserMax(76) chatLine.SetText("") chatLine.SAFE_SetTabEvent(self.OnChangeChatMode) chatLine.x = 0 chatLine.y = 0 chatLine.width = 0 chatLine.height = 0 self.chatLine = chatLine btnSend = ui.Button() btnSend.SetParent(self) btnSend.SetUpVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_01.sub") btnSend.SetOverVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_02.sub") btnSend.SetDownVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_03.sub") btnSend.SetToolTipText(localeInfo.CHAT_SEND_CHAT) btnSend.SAFE_SetEvent(self.chatLine.OnIMEReturn) self.btnSend = btnSend def Destroy(self): self.chatModeButton = None self.chatLine = None self.btnSend = None def Open(self): self.chatLine.Show() self.chatLine.SetPosition(57, 5) self.chatLine.SetFocus() self.chatLine.OpenChat() self.chatModeButton.SetPosition(7, 2) self.chatModeButton.Show() self.btnSend.Show() self.Show() self.RefreshPosition() return TRUE def Close(self): self.chatLine.KillFocus() self.chatLine.Hide() self.chatModeButton.Hide() self.btnSend.Hide() self.Hide() return TRUE def SetEscapeEvent(self, event): self.chatLine.SetEscapeEvent(event) def SetReturnEvent(self, event): self.chatLine.SetReturnEvent(event) def OnChangeChatMode(self): RefreshChatMode() def OnRefreshChatMode(self): self.chatLine.ChangeChatMode() self.chatModeButton.SetText(self.chatLine.GetCurrentChatModeName()) def SetChatFocus(self): self.chatLine.SetFocus() def KillChatFocus(self): self.chatLine.KillFocus() def SetChatMax(self, max): self.chatLine.SetUserMax(max) def RefreshPosition(self): if localeInfo.IsARABIC(): self.chatLine.SetSize(self.GetWidth() - 93, 18) else: self.chatLine.SetSize(self.GetWidth() - 93, 13) self.btnSend.SetPosition(self.GetWidth() - 25, 2) (self.chatLine.x, self.chatLine.y, self.chatLine.width, self.chatLine.height) = self.chatLine.GetRect() def BindInterface(self, interface): self.chatLine.BindInterface(interface) def OnRender(self): (x, y, width, height) = self.chatLine.GetRect() ui.RenderRoundBox(x-4, y-3, width+7, height+4, self.CHAT_OUTLINE_COLOR) ## ChatWindow class ChatWindow(ui.Window): BOARD_START_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.0) BOARD_END_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.8) BOARD_MIDDLE_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.5) CHAT_OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0) EDIT_LINE_HEIGHT = 25 if app.ENABLE_CHATTING_WINDOW_RENEWAL: EDIT_LINE_HIDE_HEIGHT = 20 CHAT_WINDOW_WIDTH = 600 if app.ENABLE_CLEAR_CHAT: CHAT_WINDOW_WIDTH += 20 class ChatBackBoard(ui.Window): def __init__(self): ui.Window.__init__(self) def __del__(self): ui.Window.__del__(self) class ChatButton(ui.DragButton): def __init__(self): ui.DragButton.__init__(self) self.AddFlag("float") self.AddFlag("movable") self.AddFlag("restrict_x") self.topFlag = FALSE self.SetWindowName("ChatWindow:ChatButton") def __del__(self): ui.DragButton.__del__(self) def SetOwner(self, owner): self.owner = owner def OnMouseOverIn(self): app.SetCursor(app.VSIZE) def OnMouseOverOut(self): app.SetCursor(app.NORMAL) def OnTop(self): if TRUE == self.topFlag: return self.topFlag = TRUE self.owner.SetTop() self.topFlag = FALSE def __init__(self): ui.Window.__init__(self) self.AddFlag("float") self.SetWindowName("ChatWindow") self.__RegisterChatColorDict() self.boardState = chat.BOARD_STATE_VIEW self.chatID = chat.CreateChatSet(chat.CHAT_SET_CHAT_WINDOW) chat.SetBoardState(self.chatID, chat.BOARD_STATE_VIEW) self.xBar = 0 self.yBar = 0 self.widthBar = 0 self.heightBar = 0 self.curHeightBar = 0 self.visibleLineCount = 0 self.scrollBarPos = 1.0 self.scrollLock = FALSE chatInputSet = ChatInputSet() chatInputSet.SetParent(self) chatInputSet.SetEscapeEvent(ui.__mem_func__(self.CloseChat)) chatInputSet.SetReturnEvent(ui.__mem_func__(self.CloseChat)) chatInputSet.SetSize(550, 25) self.chatInputSet = chatInputSet if app.ENABLE_CLEAR_CHAT: self.btnClearChat = ui.Button() self.btnClearChat.SetParent(self) self.btnClearChat.SetUpVisual("d:/ymir work/ui/game/taskbar/clear1.png") self.btnClearChat.SetOverVisual("d:/ymir work/ui/game/taskbar/clear2.png") self.btnClearChat.SetDownVisual("d:/ymir work/ui/game/taskbar/clear3.png") self.btnClearChat.SetToolTipText("Clear Chat") self.btnClearChat.SetEvent(lambda : chat.ClearChat()) self.btnClearChat.Hide() btnSendWhisper = ui.Button() btnSendWhisper.SetParent(self) btnSendWhisper.SetUpVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_01.sub") btnSendWhisper.SetOverVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_02.sub") btnSendWhisper.SetDownVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_03.sub") btnSendWhisper.SetToolTipText(localeInfo.CHAT_SEND_MEMO) btnSendWhisper.Hide() self.btnSendWhisper = btnSendWhisper btnChatLog = ui.Button() btnChatLog.SetParent(self) btnChatLog.SetUpVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_01.sub") btnChatLog.SetOverVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_02.sub") btnChatLog.SetDownVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_03.sub") btnChatLog.SetToolTipText(localeInfo.CHAT_LOG) btnChatLog.Hide() self.btnChatLog = btnChatLog btnChatSizing = self.ChatButton() btnChatSizing.SetOwner(self) btnChatSizing.SetMoveEvent(ui.__mem_func__(self.Refresh)) btnChatSizing.Hide() self.btnChatSizing = btnChatSizing if app.ENABLE_CHATTING_WINDOW_RENEWAL: imgChatBarLeft = ui.ImageBox() imgChatBarLeft.SetParent(self.btnChatSizing) imgChatBarLeft.AddFlag("not_pick") imgChatBarLeft.LoadImage("d:/ymir work/ui/chat/chat_linebar_left.tga") imgChatBarLeft.Show() self.imgChatBarLeft = imgChatBarLeft imgChatBarRight = ui.ImageBox() imgChatBarRight.SetParent(self.btnChatSizing) imgChatBarRight.AddFlag("not_pick") imgChatBarRight.LoadImage("d:/ymir work/ui/chat/chat_linebar_right.tga") imgChatBarRight.Show() self.imgChatBarRight = imgChatBarRight imgChatBarMiddle = ui.ExpandedImageBox() imgChatBarMiddle.SetParent(self.btnChatSizing) imgChatBarMiddle.AddFlag("not_pick") imgChatBarMiddle.LoadImage("d:/ymir work/ui/chat/chatmenutab_line.tga") imgChatBarMiddle.Show() self.imgChatBarMiddle = imgChatBarMiddle btnChatTab = ui.Button() btnChatTab.SetParent(self.btnChatSizing) btnChatTab.SetUpVisual("d:/ymir work/ui/chat/chatmenutab_down.tga") btnChatTab.SetOverVisual("d:/ymir work/ui/chat/chatmenutab_down.tga") btnChatTab.SetDownVisual("d:/ymir work/ui/chat/chatmenutab_down.tga") btnChatTab.SetToolTipText(uiScriptLocale.CHATTING_SETTING_TALKING, 0, -23) btnChatTab.Show() btnChatTab.Down() self.btnChatTab = btnChatTab btnChatSettingOption = ui.Button() btnChatSettingOption.SetParent(self.btnChatSizing) btnChatSettingOption.SetUpVisual("d:/ymir work/ui/chat/btn_option01_default.tga") btnChatSettingOption.SetOverVisual("d:/ymir work/ui/chat/btn_option01_over.tga") btnChatSettingOption.SetDownVisual("d:/ymir work/ui/chat/btn_option01_down.tga") btnChatSettingOption.SetToolTipText(localeInfo.CHATTING_SETTING_SETTING, 0, -23) btnChatSettingOption.SetEvent(ui.__mem_func__(self.__SettingOptionWndOpen)) btnChatSettingOption.Show() self.btnChatSettingOption = btnChatSettingOption self.wndChatSettingOption = ChatSettingWindow(self) else: imgChatBarLeft = ui.ImageBox() imgChatBarLeft.SetParent(self.btnChatSizing) imgChatBarLeft.AddFlag("not_pick") imgChatBarLeft.LoadImage("d:/ymir work/ui/pattern/chat_bar_left.tga") imgChatBarLeft.Show() self.imgChatBarLeft = imgChatBarLeft imgChatBarRight = ui.ImageBox() imgChatBarRight.SetParent(self.btnChatSizing) imgChatBarRight.AddFlag("not_pick") imgChatBarRight.LoadImage("d:/ymir work/ui/pattern/chat_bar_right.tga") imgChatBarRight.Show() self.imgChatBarRight = imgChatBarRight imgChatBarMiddle = ui.ExpandedImageBox() imgChatBarMiddle.SetParent(self.btnChatSizing) imgChatBarMiddle.AddFlag("not_pick") imgChatBarMiddle.LoadImage("d:/ymir work/ui/pattern/chat_bar_middle.tga") imgChatBarMiddle.Show() self.imgChatBarMiddle = imgChatBarMiddle scrollBar = ui.ScrollBar() scrollBar.AddFlag("float") scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll)) self.scrollBar = scrollBar self.Refresh() if app.ENABLE_CHATTING_WINDOW_RENEWAL: self.RefreshChatWindow() self.chatInputSet.RefreshPosition() # RTL �� ��ġ�� ����� �������� ��ġ ������ �ʿ��ϴ� def __del__(self): ui.Window.__del__(self) def __RegisterChatColorDict(self): CHAT_COLOR_DICT = { chat.CHAT_TYPE_TALKING : colorInfo.CHAT_RGB_TALK, chat.CHAT_TYPE_INFO : colorInfo.CHAT_RGB_INFO, chat.CHAT_TYPE_NOTICE : colorInfo.CHAT_RGB_NOTICE, chat.CHAT_TYPE_PARTY : colorInfo.CHAT_RGB_PARTY, chat.CHAT_TYPE_GUILD : colorInfo.CHAT_RGB_GUILD, chat.CHAT_TYPE_COMMAND : colorInfo.CHAT_RGB_COMMAND, chat.CHAT_TYPE_SHOUT : colorInfo.CHAT_RGB_SHOUT, chat.CHAT_TYPE_WHISPER : colorInfo.CHAT_RGB_WHISPER, } if app.ENABLE_CHATTING_WINDOW_RENEWAL: CHAT_COLOR_DICT.update({ chat.CHAT_TYPE_EXP_INFO : colorInfo.CHAT_RGB_INFO, chat.CHAT_TYPE_ITEM_INFO : colorInfo.CHAT_RGB_INFO, chat.CHAT_TYPE_MONEY_INFO : colorInfo.CHAT_RGB_INFO, }) for colorItem in CHAT_COLOR_DICT.items(): type=colorItem[0] rgb=colorItem[1] chat.SetChatColor(type, rgb[0], rgb[1], rgb[2]) def Destroy(self): self.chatInputSet.Destroy() self.chatInputSet = None self.btnSendWhisper = 0 if app.ENABLE_CLEAR_CHAT: self.btnClearChat = 0 self.btnChatLog = 0 self.btnChatSizing = 0 if app.ENABLE_CHATTING_WINDOW_RENEWAL: if self.wndChatSettingOption: self.wndChatSettingOption.Close() self.wndChatSettingOption = None ################ ## Open & Close def OpenChat(self): self.SetSize(self.CHAT_WINDOW_WIDTH, 25) chat.SetBoardState(self.chatID, chat.BOARD_STATE_EDIT) self.boardState = chat.BOARD_STATE_EDIT (x, y, width, height) = self.GetRect() (btnX, btnY) = self.btnChatSizing.GetGlobalPosition() if localeInfo.IsARABIC(): chat.SetPosition(self.chatID, x + width - 10, y) else: chat.SetPosition(self.chatID, x + 10, y) chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT + 100) if self.IsShow(): self.btnChatSizing.Show() self.Refresh() if app.ENABLE_CHATTING_WINDOW_RENEWAL: self.RefreshChatWindow() self.btnSendWhisper.SetPosition(self.GetWidth() - 50, 2) self.btnSendWhisper.Show() if app.ENABLE_CLEAR_CHAT: self.btnClearChat.SetPosition(self.GetWidth() - 78, -5) self.btnClearChat.Show() self.btnChatLog.SetPosition(self.GetWidth() - 25, 2) self.btnChatLog.Show() self.chatInputSet.Open() self.chatInputSet.SetTop() self.SetTop() def CloseChat(self): chat.SetBoardState(self.chatID, chat.BOARD_STATE_VIEW) self.boardState = chat.BOARD_STATE_VIEW (x, y, width, height) = self.GetRect() if localeInfo.IsARABIC(): chat.SetPosition(self.chatID, x + width - 10, y + self.EDIT_LINE_HEIGHT) else: chat.SetPosition(self.chatID, x + 10, y + self.EDIT_LINE_HEIGHT) self.SetSize(self.CHAT_WINDOW_WIDTH, 0) self.chatInputSet.Close() self.btnSendWhisper.Hide() if app.ENABLE_CLEAR_CHAT: self.btnClearChat.Hide() self.btnChatLog.Hide() self.btnChatSizing.Hide() self.Refresh() if app.ENABLE_CHATTING_WINDOW_RENEWAL: self.RefreshChatWindow() def SetSendWhisperEvent(self, event): self.btnSendWhisper.SetEvent(event) def SetOpenChatLogEvent(self, event): self.btnChatLog.SetEvent(event) def IsEditMode(self): if chat.BOARD_STATE_EDIT == self.boardState: return TRUE return FALSE def __RefreshSizingBar(self): (x, y, width, height) = self.GetRect() gxChat, gyChat = self.btnChatSizing.GetGlobalPosition() self.btnChatSizing.SetPosition(x, gyChat) self.btnChatSizing.SetSize(width, 22) if app.ENABLE_CHATTING_WINDOW_RENEWAL: self.imgChatBarLeft.SetPosition(0, 17) self.imgChatBarRight.SetPosition(width - 57, 0) self.btnChatTab.SetTextAddPos(uiScriptLocale.CHATTING_SETTING_DEFAULT_TITLE, -2) self.btnChatTab.SetPosition(4, 0) self.btnChatSettingOption.SetPosition(width - 27, 3) self.imgChatBarMiddle.SetPosition(57.0, 0) self.imgChatBarMiddle.SetRenderingRect(0.0, 0.0, float(width - 57.0 * 2) / 57.0 - 1.0, 0.0) else: self.imgChatBarLeft.SetPosition(0, 0) self.imgChatBarRight.SetPosition(width - 64, 0) self.imgChatBarMiddle.SetPosition(64, 0) self.imgChatBarMiddle.SetRenderingRect(0.0, 0.0, float(width - 128) / 64.0 - 1.0, 0.0) def SetPosition(self, x, y): ui.Window.SetPosition(self, x, y) self.__RefreshSizingBar() def SetSize(self, width, height): ui.Window.SetSize(self, width, height) self.__RefreshSizingBar() def SetHeight(self, height): gxChat, gyChat = self.btnChatSizing.GetGlobalPosition() self.btnChatSizing.SetPosition(gxChat, wndMgr.GetScreenHeight() - height) ########### ## Refresh def Refresh(self): if self.boardState == chat.BOARD_STATE_EDIT: self.RefreshBoardEditState() elif self.boardState == chat.BOARD_STATE_VIEW: self.RefreshBoardViewState() def RefreshBoardEditState(self): (x, y, width, height) = self.GetRect() (btnX, btnY) = self.btnChatSizing.GetGlobalPosition() self.xBar = x self.yBar = btnY self.widthBar = width self.heightBar = y - btnY + self.EDIT_LINE_HEIGHT self.curHeightBar = self.heightBar if localeInfo.IsARABIC(): chat.SetPosition(self.chatID, x + width - 10, y) else: chat.SetPosition(self.chatID, x + 10, y) chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT) chat.ArrangeShowingChat(self.chatID) if btnY > y: self.btnChatSizing.SetPosition(btnX, y) self.heightBar = self.EDIT_LINE_HEIGHT def RefreshBoardViewState(self): (x, y, width, height) = self.GetRect() (btnX, btnY) = self.btnChatSizing.GetGlobalPosition() textAreaHeight = self.visibleLineCount * chat.GetLineStep(self.chatID) if localeInfo.IsARABIC(): chat.SetPosition(self.chatID, x + width - 10, y + self.EDIT_LINE_HEIGHT) else: chat.SetPosition(self.chatID, x + 10, y + self.EDIT_LINE_HEIGHT) chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT + 100) if self.boardState == chat.BOARD_STATE_EDIT: textAreaHeight += 45 elif self.visibleLineCount != 0: textAreaHeight += 10 + 10 self.xBar = x self.yBar = y + self.EDIT_LINE_HEIGHT - textAreaHeight self.widthBar = width self.heightBar = textAreaHeight self.scrollBar.Hide() ########## ## Render def OnUpdate(self): if self.boardState == chat.BOARD_STATE_EDIT: chat.Update(self.chatID) elif self.boardState == chat.BOARD_STATE_VIEW: if systemSetting.IsViewChat(): chat.Update(self.chatID) def OnRender(self): if chat.GetVisibleLineCount(self.chatID) != self.visibleLineCount: self.visibleLineCount = chat.GetVisibleLineCount(self.chatID) self.Refresh() if self.curHeightBar != self.heightBar: self.curHeightBar += (self.heightBar - self.curHeightBar) / 10 if self.boardState == chat.BOARD_STATE_EDIT: grp.SetColor(self.BOARD_MIDDLE_COLOR) if app.ENABLE_CHATTING_WINDOW_RENEWAL: grp.RenderBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar) + self.EDIT_LINE_HIDE_HEIGHT, self.widthBar, self.curHeightBar) else: grp.RenderBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar) + 10, self.widthBar, self.curHeightBar) chat.Render(self.chatID) elif self.boardState == chat.BOARD_STATE_VIEW: if systemSetting.IsViewChat(): grp.RenderGradationBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar), self.widthBar, self.curHeightBar, self.BOARD_START_COLOR, self.BOARD_END_COLOR) chat.Render(self.chatID) ########## ## Event def OnTop(self): self.btnChatSizing.SetTop() self.scrollBar.SetTop() def OnScroll(self): if not self.scrollLock: self.scrollBarPos = self.scrollBar.GetPos() lineCount = chat.GetLineCount(self.chatID) visibleLineCount = chat.GetVisibleLineCount(self.chatID) endLine = visibleLineCount + int(float(lineCount - visibleLineCount) * self.scrollBarPos) chat.SetEndPos(self.chatID, self.scrollBarPos) def OnChangeChatMode(self): self.chatInputSet.OnChangeChatMode() def SetChatFocus(self): self.chatInputSet.SetChatFocus() def BindInterface(self, interface): self.chatInputSet.BindInterface(interface) if app.ENABLE_CHATTING_WINDOW_RENEWAL: def __SettingOptionWndOpen(self): if self.wndChatSettingOption: if self.wndChatSettingOption.IsShow(): self.wndChatSettingOption.Close() else: self.wndChatSettingOption.Open() def RefreshChatWindow(self): if not self.wndChatSettingOption: return for mode in OPTION_CHECKBOX_MODE.iterkeys(): enable = self.wndChatSettingOption.GetChatModeSetting(mode) if enable: chat.EnableChatMode(self.chatID, mode) else: chat.DisableChatMode(self.chatID, mode) ## ChatLogWindow class ChatLogWindow(ui.Window): BLOCK_WIDTH = 32 CHAT_MODE_NAME = ( localeInfo.CHAT_NORMAL, localeInfo.CHAT_PARTY, localeInfo.CHAT_GUILD, localeInfo.CHAT_SHOUT, localeInfo.CHAT_INFORMATION, localeInfo.CHAT_NOTICE, ) CHAT_MODE_INDEX = ( chat.CHAT_TYPE_TALKING, chat.CHAT_TYPE_PARTY, chat.CHAT_TYPE_GUILD, chat.CHAT_TYPE_SHOUT, chat.CHAT_TYPE_INFO, chat.CHAT_TYPE_NOTICE, ) CHAT_LOG_WINDOW_MINIMUM_WIDTH = 450 CHAT_LOG_WINDOW_MINIMUM_HEIGHT = 120 class ResizeButton(ui.DragButton): def __init__(self): ui.DragButton.__init__(self) def __del__(self): ui.DragButton.__del__(self) def OnMouseOverIn(self): app.SetCursor(app.HVSIZE) def OnMouseOverOut(self): app.SetCursor(app.NORMAL) def __init__(self): self.allChatMode = TRUE self.chatInputSet = None ui.Window.__init__(self) self.AddFlag("float") self.AddFlag("movable") self.SetWindowName("ChatLogWindow") self.__CreateChatInputSet() self.__CreateWindow() self.__CreateButton() self.__CreateScrollBar() self.chatID = chat.CreateChatSet(chat.CHAT_SET_LOG_WINDOW) chat.SetBoardState(self.chatID, chat.BOARD_STATE_LOG) for i in self.CHAT_MODE_INDEX: chat.EnableChatMode(self.chatID, i) if app.ENABLE_CHATTING_WINDOW_RENEWAL: chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO) self.SetPosition(20, 20) self.SetSize(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH, self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT) self.btnSizing.SetPosition(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH-self.btnSizing.GetWidth(), self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT-self.btnSizing.GetHeight()+2) self.OnResize() def __CreateChatInputSet(self): chatInputSet = ChatInputSet() chatInputSet.SetParent(self) chatInputSet.SetEscapeEvent(ui.__mem_func__(self.Close)) chatInputSet.SetWindowVerticalAlignBottom() chatInputSet.Open() self.chatInputSet = chatInputSet def __CreateWindow(self): imgLeft = ui.ImageBox() imgLeft.AddFlag("not_pick") imgLeft.SetParent(self) imgCenter = ui.ExpandedImageBox() imgCenter.AddFlag("not_pick") imgCenter.SetParent(self) imgRight = ui.ImageBox() imgRight.AddFlag("not_pick") imgRight.SetParent(self) if localeInfo.IsARABIC(): imgLeft.LoadImage("locale/ae/ui/pattern/titlebar_left.tga") imgCenter.LoadImage("locale/ae/ui/pattern/titlebar_center.tga") imgRight.LoadImage("locale/ae/ui/pattern/titlebar_right.tga") else: imgLeft.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_left.tga") imgCenter.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_middle.tga") imgRight.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_right.tga") imgLeft.Show() imgCenter.Show() imgRight.Show() btnClose = ui.Button() btnClose.SetParent(self) btnClose.SetUpVisual("d:/ymir work/ui/public/close_button_01.sub") btnClose.SetOverVisual("d:/ymir work/ui/public/close_button_02.sub") btnClose.SetDownVisual("d:/ymir work/ui/public/close_button_03.sub") btnClose.SetToolTipText(localeInfo.UI_CLOSE, 0, -23) btnClose.SetEvent(ui.__mem_func__(self.Close)) btnClose.Show() btnSizing = self.ResizeButton() btnSizing.SetParent(self) btnSizing.SetMoveEvent(ui.__mem_func__(self.OnResize)) btnSizing.SetSize(16, 16) btnSizing.Show() titleName = ui.TextLine() titleName.SetParent(self) if localeInfo.IsARABIC(): titleName.SetPosition(self.GetWidth()-20, 6) else: titleName.SetPosition(20, 6) titleName.SetText(localeInfo.CHAT_LOG_TITLE) titleName.Show() self.imgLeft = imgLeft self.imgCenter = imgCenter self.imgRight = imgRight self.btnClose = btnClose self.btnSizing = btnSizing self.titleName = titleName def __CreateButton(self): if localeInfo.IsARABIC(): bx = 20 else: bx = 13 btnAll = ui.RadioButton() btnAll.SetParent(self) btnAll.SetPosition(bx, 24) btnAll.SetUpVisual("d:/ymir work/ui/public/xsmall_button_01.sub") btnAll.SetOverVisual("d:/ymir work/ui/public/xsmall_button_02.sub") btnAll.SetDownVisual("d:/ymir work/ui/public/xsmall_button_03.sub") btnAll.SetText(localeInfo.CHAT_ALL) btnAll.SetEvent(ui.__mem_func__(self.ToggleAllChatMode)) btnAll.Down() btnAll.Show() self.btnAll = btnAll x = bx + 48 i = 0 self.modeButtonList = [] for name in self.CHAT_MODE_NAME: btn = ui.ToggleButton() btn.SetParent(self) btn.SetPosition(x, 24) btn.SetUpVisual("d:/ymir work/ui/public/xsmall_button_01.sub") btn.SetOverVisual("d:/ymir work/ui/public/xsmall_button_02.sub") btn.SetDownVisual("d:/ymir work/ui/public/xsmall_button_03.sub") btn.SetText(name) btn.Show() mode = self.CHAT_MODE_INDEX[i] btn.SetToggleUpEvent(lambda arg=mode: self.ToggleChatMode(arg)) btn.SetToggleDownEvent(lambda arg=mode: self.ToggleChatMode(arg)) self.modeButtonList.append(btn) x += 48 i += 1 def __CreateScrollBar(self): scrollBar = ui.SmallThinScrollBar() scrollBar.SetParent(self) scrollBar.Show() scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll)) self.scrollBar = scrollBar self.scrollBarPos = 1.0 def __del__(self): ui.Window.__del__(self) def Destroy(self): self.imgLeft = None self.imgCenter = None self.imgRight = None self.btnClose = None self.btnSizing = None self.modeButtonList = [] self.scrollBar = None self.chatInputSet = None def ToggleAllChatMode(self): if self.allChatMode: return self.allChatMode = TRUE for i in self.CHAT_MODE_INDEX: chat.EnableChatMode(self.chatID, i) if app.ENABLE_CHATTING_WINDOW_RENEWAL: chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO) for btn in self.modeButtonList: btn.SetUp() def ToggleChatMode(self, mode): if self.allChatMode: self.allChatMode = FALSE for i in self.CHAT_MODE_INDEX: chat.DisableChatMode(self.chatID, i) if app.ENABLE_CHATTING_WINDOW_RENEWAL: if mode == chat.CHAT_TYPE_INFO: chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO) chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO) chat.EnableChatMode(self.chatID, mode) self.btnAll.SetUp() else: chat.ToggleChatMode(self.chatID, mode) def SetSize(self, width, height): self.imgCenter.SetRenderingRect(0.0, 0.0, float((width - self.BLOCK_WIDTH*2) - self.BLOCK_WIDTH) / self.BLOCK_WIDTH, 0.0) self.imgCenter.SetPosition(self.BLOCK_WIDTH, 0) self.imgRight.SetPosition(width - self.BLOCK_WIDTH, 0) if localeInfo.IsARABIC(): self.titleName.SetPosition(self.GetWidth()-20, 3) self.btnClose.SetPosition(3, 3) self.scrollBar.SetPosition(1, 45) else: self.btnClose.SetPosition(width - self.btnClose.GetWidth() - 5, 5) self.scrollBar.SetPosition(width - 15, 45) self.scrollBar.SetScrollBarSize(height - 45 - 12) self.scrollBar.SetPos(self.scrollBarPos) ui.Window.SetSize(self, width, height) def Open(self): self.OnResize() self.chatInputSet.SetChatFocus() self.Show() def Close(self): if self.chatInputSet: self.chatInputSet.KillChatFocus() self.Hide() def OnResize(self): x, y = self.btnSizing.GetLocalPosition() width = self.btnSizing.GetWidth() height = self.btnSizing.GetHeight() if x < self.CHAT_LOG_WINDOW_MINIMUM_WIDTH - width: self.btnSizing.SetPosition(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH - width, y) return if y < self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT - height: self.btnSizing.SetPosition(x, self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT - height) return self.scrollBar.LockScroll() self.SetSize(x + width, y + height) self.scrollBar.UnlockScroll() if localeInfo.IsARABIC(): self.chatInputSet.SetPosition(20, 25) else: self.chatInputSet.SetPosition(0, 25) self.chatInputSet.SetSize(self.GetWidth() - 20, 20) self.chatInputSet.RefreshPosition() self.chatInputSet.SetChatMax(self.GetWidth() / 8) def OnScroll(self): self.scrollBarPos = self.scrollBar.GetPos() lineCount = chat.GetLineCount(self.chatID) visibleLineCount = chat.GetVisibleLineCount(self.chatID) endLine = visibleLineCount + int(float(lineCount - visibleLineCount) * self.scrollBarPos) chat.SetEndPos(self.chatID, self.scrollBarPos) def OnRunMouseWheel(self, nLen): if nLen > 0: self.scrollBar.OnUp() else: self.scrollBar.OnDown() def OnRender(self): (x, y, width, height) = self.GetRect() if localeInfo.IsARABIC(): grp.SetColor(0x77000000) grp.RenderBar(x+2, y+45, 13, height-45) grp.SetColor(0x77000000) grp.RenderBar(x, y, width, height) grp.SetColor(0xff525552) grp.RenderBox(x, y, width-2, height) grp.SetColor(0xff000000) grp.RenderBox(x+1, y+1, width-2, height) grp.SetColor(0xff989898) grp.RenderLine(x+width-13, y+height-1, 11, -11) grp.RenderLine(x+width-9, y+height-1, 7, -7) grp.RenderLine(x+width-5, y+height-1, 3, -3) else: grp.SetColor(0x77000000) grp.RenderBar(x+width-15, y+45, 13, height-45) grp.SetColor(0x77000000) grp.RenderBar(x, y, width, height) grp.SetColor(0xff525552) grp.RenderBox(x, y, width-2, height) grp.SetColor(0xff000000) grp.RenderBox(x+1, y+1, width-2, height) grp.SetColor(0xff989898) grp.RenderLine(x+width-13, y+height-1, 11, -11) grp.RenderLine(x+width-9, y+height-1, 7, -7) grp.RenderLine(x+width-5, y+height-1, 3, -3) ##### chat.ArrangeShowingChat(self.chatID) if localeInfo.IsARABIC(): chat.SetPosition(self.chatID, x + width - 10, y + height - 25) else: chat.SetPosition(self.chatID, x + 10, y + height - 25) chat.SetHeight(self.chatID, height - 45 - 25) chat.Update(self.chatID) chat.Render(self.chatID) def OnPressEscapeKey(self): self.Close() return TRUE def BindInterface(self, interface): self.interface = interface def OnMouseLeftButtonDown(self): hyperlink = ui.GetHyperlink() if hyperlink: if app.IsPressed(app.DIK_LALT): link = chat.GetLinkFromHyperlink(hyperlink) ime.PasteString(link) else: self.interface.MakeHyperlinkTooltip(hyperlink) @rares2017That is normal, because you neither get a notification on exp on the regular chat. Edited September 11, 2021 by Dex Link to comment Share on other sites More sharing options...
Maze 8 Posted September 12, 2021 Share Posted September 12, 2021 0912 22:47:17399 :: File "uiChat.py", line 1198, in OnRender 0912 22:47:17399 :: File "uiChat.py", line 1143, in Refresh 0912 22:47:17399 :: File "uiChat.py", line 1167, in RefreshBoardViewState 0912 22:47:17399 :: AttributeError 0912 22:47:17399 :: : 0912 22:47:17399 :: 'int' object has no attribute 'GetGlobalPosition' 1 Link to comment Share on other sites More sharing options...
Recommended Posts