MR-3: Bunch of fixes

This commit is contained in:
Mind Rapist
2025-12-25 08:38:22 +02:00
parent c72c0c82f6
commit d810a6958c
7 changed files with 156 additions and 141 deletions

View File

@@ -2,28 +2,9 @@
This repository contains all client-side data, including locale files, configurations, and descriptive text used by the game client. This repository contains all client-side data, including locale files, configurations, and descriptive text used by the game client.
## Changelog 📋 ## 📋 Changelog
### 🐛 Bug Fixes
* **Skill 19:** Applied the correct `MOV_SPEED` value fix for Skill 19 across all locales.
* **Messenger - UI:** Fixed a critical UI issue where the name of a recently removed friend would sometimes appear on top of the next name in the list, or the "Empty" string, if it was selected during the removal process.
### ⬆️ Feature Improvements ### ⬆️ Feature Improvements
* **Messenger System:** * **Quickslot Definitions:** The maximum number of quickslot slots is now explicitly defined for python scripts to improve consistency.
* **Live Status Updates:** Live updates for adding/removing friend for both parties. * **Alchemy Deck Toggling:** Alchemy decks can now be toggled via hotkeys: CTRL+C for the first deck and CTRL+D for the second. Activating one deck will automatically disable the other (if active).
* **Auto-Deselect:** When a player removes a friend, or is removed by one, the entry is automatically deselected in the Messenger window. * **Taskbar Item Swapping:** Improved taskbar logic: dragging an item to a non-empty slot now swaps positions with the existing item if it already exists on the taskbar, rather than replacing it.
* **Early Initialization:** The Messenger window is now automatically initialized (without visually opening the window) upon starting the game phase, allowing it to receive real-time updates from the very beginning.
* **Request Handling:** Pressing the `Escape` key while the request dialog is open now denies the request normally.
* **Button State:** The Whisper and Delete buttons are automatically disabled when removing/getting removed by a friend with the Messenger window open.
* **Target board:** The "Friend" button dynamically updates upon adding/removing a friend for both parties, if target is focused.
* **Inventory Management:** Inventory calculations are now correctly designed to handle togglable item activation effects across any number of inventory pages by calculating `page total slots * total pages`.
* **Skill Cooldowns and States:** A massive update to ensure reliability across various scenarios:
* **Window/Taskbar Persistence:** Cooldowns and active slot effects are now correctly maintained and updated in the Character Window and Taskbar during actions such as: repositioning skills, leveling up, changing skill grades (including Perfect), mounting/unmounting, changing Character Window pages, switching Skill View tabs, closing/reopening the window, and relogging. Supports togglable, non-togglable, and togglable-with-cooldown skills.
* **Level Reset Clearing:** Skill cooldowns and active slot states are properly cleared when the skill level is reset to 0.
* **Support togglables:** Combo automatically deactivates if its level is changed to 0 (e.g., via `/setsk`).
* **Horse Skill Cooldowns:** Horse skill cooldowns are cleared if their level is changed to 0.
* **Horse Skill View Logic:** The Horse skills page now correctly appears when the riding skill (Skill 130) reaches **level 21+** (not 20+).
* **Taskbar Sync:** Horse skills are automatically removed from the Taskbar, and the Skill View switches pages automatically, if the riding skill level drops below 21 (e.g., via `/setsk`).
* **Skill group 0 support for Horse page:** The Horse skill page is now visible even if there are no skills assigned to that group, provided the riding skill level is high enough.
* **Support skill levels:** Support and Horse skill states are correctly maintained when the character's skill group is reset.
* **.gitignore file:** Ignoring all files and directories ending in `_BAK` or `.BAK` (case-insensitive)

View File

@@ -330,9 +330,9 @@ PARTY_BREAK_UP Delete Group
PARTY_DO_YOU_ACCEPT would like to join the Group. PARTY_DO_YOU_ACCEPT would like to join the Group.
PARTY_DO_YOU_JOIN has invited you to join his group. Accept? PARTY_DO_YOU_JOIN has invited you to join his group. Accept?
PARTY_EXP_DISTRIBUTION_MODE EXP Distribution PARTY_EXP_DISTRIBUTION_MODE EXP Distribution
PARTY_EXP_DISTRIBUTION_MODE_LEVEL Level dependant PARTY_EXP_DISTRIBUTION_MODE_LEVEL Level-dependent
PARTY_EXP_DISTRIBUTION_MODE_LEVEL_TOOLTIP Higher level group members receive more EXP. PARTY_EXP_DISTRIBUTION_MODE_LEVEL_TOOLTIP Higher level group members receive more EXP.
PARTY_EXP_DISTRIBUTION_MODE_PARITY even PARTY_EXP_DISTRIBUTION_MODE_PARITY Even
PARTY_EXP_DISTRIBUTION_MODE_PARITY_TOOLTIP All Group members receive the same EXP. PARTY_EXP_DISTRIBUTION_MODE_PARITY_TOOLTIP All Group members receive the same EXP.
PARTY_HEAL_ALL_MEMBER Restore everything. PARTY_HEAL_ALL_MEMBER Restore everything.
PARTY_INCREASE_AREA_150 Range of the group heightened of the factor 1.5 . SNA PARTY_INCREASE_AREA_150 Range of the group heightened of the factor 1.5 . SNA
@@ -529,7 +529,7 @@ STAT_TOOLTIP_INT Increases SP, magic attack and defence
STAT_TOOLTIP_STR Increases attack value and damage STAT_TOOLTIP_STR Increases attack value and damage
SYMBOLLIST_TITLE Register Guild flag SYMBOLLIST_TITLE Register Guild flag
SYSTEM_OPTION_CPU_TILING_1 CPU Tiling Mode can upgrade the speed of a weaker PC. SYSTEM_OPTION_CPU_TILING_1 CPU Tiling Mode can upgrade the speed of a weaker PC.
SYSTEM_OPTION_CPU_TILING_2 If there are problem with the graphics choose either ,Systemoption or ,CONFIG.exe SYSTEM_OPTION_CPU_TILING_2 If there are problem with the graphics choose either ,Systemoption or ,CONFIG.exe
SYSTEM_OPTION_CPU_TILING_3 and change to GPU Tiling Mode. SYSTEM_OPTION_CPU_TILING_3 and change to GPU Tiling Mode.
SYSTEM_OPTION_GPU_TILING_1 GPU Tiling Mode can run slow on a weaker PC. SYSTEM_OPTION_GPU_TILING_1 GPU Tiling Mode can run slow on a weaker PC.
SYSTEM_OPTION_GPU_TILING_2 If there are problems with the graphics choose either 'System Options' or 'CONFIG.exe' SYSTEM_OPTION_GPU_TILING_2 If there are problems with the graphics choose either 'System Options' or 'CONFIG.exe'

View File

@@ -54,6 +54,10 @@ LOGIN_COUNT_LIMIT_ENABLE = 0
PVPMODE_PROTECTED_LEVEL = 15 PVPMODE_PROTECTED_LEVEL = 15
TWO_HANDED_WEAPON_ATT_SPEED_DECREASE_VALUE = 10 TWO_HANDED_WEAPON_ATT_SPEED_DECREASE_VALUE = 10
# MR-3: Define max quickslot slots number for scripts
QUICKSLOT_MAX_NUM = 36
# MR-3: -- END OF -- Define max quickslot slots number for scripts
isItemQuestionDialog = 0 isItemQuestionDialog = 0
def GET_ITEM_QUESTION_DIALOG_STATUS(): def GET_ITEM_QUESTION_DIALOG_STATUS():
@@ -202,36 +206,36 @@ def GET_ACCESSORY_MATERIAL_VNUM(vnum, subType):
return ACCESSORY_MATERIAL_LIST[type] return ACCESSORY_MATERIAL_LIST[type]
################################################################## ##################################################################
## 새로 추가된 '벨트' 아이템 타입과, 벨트의 소켓에 꽂을 아이템 관련.. ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> '<27><>Ʈ' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>԰<EFBFBD>, <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
## 벨트의 소켓시스템은 악세서리와 동일하기 때문에, 위 악세서리 관련 하드코딩처럼 이런식으로 할 수밖에 없다.. ## <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD>Ͻý<CFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> <20>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>ó<EFBFBD><C3B3> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>..
def GET_BELT_MATERIAL_VNUM(vnum, subType = 0): def GET_BELT_MATERIAL_VNUM(vnum, subType = 0):
# 현재는 모든 벨트에는 하나의 아이템(#18900)만 삽입 가능 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(#18900)<29><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return 18900 return 18900
################################################################## ##################################################################
## 자동물약 (HP: #72723 ~ #72726, SP: #72727 ~ #72730) ## <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP: #72723 ~ #72726, SP: #72727 ~ #72730)
# 해당 vnum이 자동물약인가? # <EFBFBD>ش<EFBFBD> vnum<EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
def IS_AUTO_POTION(itemVnum): def IS_AUTO_POTION(itemVnum):
return IS_AUTO_POTION_HP(itemVnum) or IS_AUTO_POTION_SP(itemVnum) return IS_AUTO_POTION_HP(itemVnum) or IS_AUTO_POTION_SP(itemVnum)
# 해당 vnum HP 자동물약인가? # <EFBFBD>ش<EFBFBD> vnum<EFBFBD><EFBFBD> HP <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
def IS_AUTO_POTION_HP(itemVnum): def IS_AUTO_POTION_HP(itemVnum):
if 72723 <= itemVnum and 72726 >= itemVnum: if 72723 <= itemVnum and 72726 >= itemVnum:
return 1 return 1
elif itemVnum >= 76021 and itemVnum <= 76022: ## 새로 들어간 선물용 화룡의 축복 elif itemVnum >= 76021 and itemVnum <= 76022: ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> <20>
return 1 return 1
elif itemVnum == 79012: elif itemVnum == 79012:
return 1 return 1
return 0 return 0
# 해당 vnum SP 자동물약인가? # <EFBFBD>ش<EFBFBD> vnum<EFBFBD><EFBFBD> SP <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
def IS_AUTO_POTION_SP(itemVnum): def IS_AUTO_POTION_SP(itemVnum):
if 72727 <= itemVnum and 72730 >= itemVnum: if 72727 <= itemVnum and 72730 >= itemVnum:
return 1 return 1
elif itemVnum >= 76004 and itemVnum <= 76005: ## 새로 들어간 선물용 수룡의 축복 elif itemVnum >= 76004 and itemVnum <= 76005: ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
return 1 return 1
elif itemVnum == 79013: elif itemVnum == 79013:
return 1 return 1

View File

@@ -345,7 +345,12 @@ class GameWindow(ui.ScriptWindow):
onPressKeyDict[app.DIK_W] = lambda : self.MoveUp() onPressKeyDict[app.DIK_W] = lambda : self.MoveUp()
onPressKeyDict[app.DIK_S] = lambda : self.MoveDown() onPressKeyDict[app.DIK_S] = lambda : self.MoveDown()
onPressKeyDict[app.DIK_A] = lambda : self.MoveLeft() onPressKeyDict[app.DIK_A] = lambda : self.MoveLeft()
onPressKeyDict[app.DIK_D] = lambda : self.MoveRight() # MR-3: Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_D] = lambda : (
self.MoveRight() if not (app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL))
else (self.interface.wndDragonSoul and self.interface.wndDragonSoul.ActivateButtonClick(1))
)
# MR-3: -- END OF -- Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_TO_POSITIVE)
onPressKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_TO_NEGATIVE) onPressKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_TO_NEGATIVE)
@@ -363,7 +368,12 @@ class GameWindow(ui.ScriptWindow):
onPressKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_TO_POSITIVE)
onPressKeyDict[app.DIK_GRAVE] = lambda : self.PickUpItem() onPressKeyDict[app.DIK_GRAVE] = lambda : self.PickUpItem()
onPressKeyDict[app.DIK_Z] = lambda : self.PickUpItem() onPressKeyDict[app.DIK_Z] = lambda : self.PickUpItem()
onPressKeyDict[app.DIK_C] = lambda state = "STATUS": self.interface.ToggleCharacterWindow(state) # MR-3: Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_C] = lambda state = "STATUS": (
self.interface.ToggleCharacterWindow(state) if not (app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL))
else (self.interface.wndDragonSoul and self.interface.wndDragonSoul.ActivateButtonClick(0))
)
# MR-3: -- END OF -- Keyboard-enabled deck toggling
onPressKeyDict[app.DIK_V] = lambda state = "SKILL": self.interface.ToggleCharacterWindow(state) onPressKeyDict[app.DIK_V] = lambda state = "SKILL": self.interface.ToggleCharacterWindow(state)
#onPressKeyDict[app.DIK_B] = lambda state = "EMOTICON": self.interface.ToggleCharacterWindow(state) #onPressKeyDict[app.DIK_B] = lambda state = "EMOTICON": self.interface.ToggleCharacterWindow(state)
onPressKeyDict[app.DIK_N] = lambda state = "QUEST": self.interface.ToggleCharacterWindow(state) onPressKeyDict[app.DIK_N] = lambda state = "QUEST": self.interface.ToggleCharacterWindow(state)

View File

@@ -1255,7 +1255,6 @@ class CharacterWindow(ui.ScriptWindow):
if self.__CanUseHorseSkill(): if self.__CanUseHorseSkill():
self.activeSkillGroupName.Hide() self.activeSkillGroupName.Hide()
self.skillGroupButton1.SetText(nameList.get(group, "Noname")) self.skillGroupButton1.SetText(nameList.get(group, "Noname"))
self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE) self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE)
self.skillGroupButton1.Show() self.skillGroupButton1.Show()
self.skillGroupButton2.Hide() self.skillGroupButton2.Hide()

View File

@@ -20,11 +20,11 @@ import uiInventory
import sys import sys
ITEM_FLAG_APPLICABLE = 1 << 14 ITEM_FLAG_APPLICABLE = 1 << 14
# 용혼석 Vnum에 대한 comment # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> Vnum<75><6D> <20><><EFBFBD><EFBFBD> comment
# ITEM VNUM 10만 자리부터, FEDCBA라고 한다면 # ITEM VNUM<EFBFBD><EFBFBD> 10<EFBFBD><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>, FEDCBA<42><41><EFBFBD> <20>Ѵٸ<D1B4>
# FE : 용혼석 종류. D : 등급 # FE : <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. D : <EFBFBD><EFBFBD><EFBFBD>
# C : 단계 B : 강화 # C : <EFBFBD>ܰ<EFBFBD> B : <EFBFBD><EFBFBD>ȭ
# A : 여벌의 번호들... # A : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3>...
class DragonSoulWindow(ui.ScriptWindow): class DragonSoulWindow(ui.ScriptWindow):
KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2, KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2,
@@ -226,9 +226,9 @@ class DragonSoulWindow(ui.ScriptWindow):
for j in xrange(item.LIMIT_MAX_NUM): for j in xrange(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(j) (limitType, limitValue) = item.GetLimit(j)
# 밑에서 remain_time이 0이하인지 체크 하기 때문에 임의의 양수로 초기화 # <EFBFBD>ؿ<EFBFBD><EFBFBD><EFBFBD> remain_time<EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
remain_time = 999 remain_time = 999
# 일단 현재 타이머는 이 세개 뿐이다. # <EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯Ӵ<CCB8> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
if item.LIMIT_REAL_TIME == limitType: if item.LIMIT_REAL_TIME == limitType:
remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp() remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()
elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType: elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
@@ -275,7 +275,7 @@ class DragonSoulWindow(ui.ScriptWindow):
for j in xrange(item.LIMIT_MAX_NUM): for j in xrange(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(j) (limitType, limitValue) = item.GetLimit(j)
# 밑에서 remain_time이 음수인지 체크 하기 때문에 임의의 양수로 초기화 # <EFBFBD>ؿ<EFBFBD><EFBFBD><EFBFBD> remain_time<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
remain_time = 999 remain_time = 999
if item.LIMIT_REAL_TIME == limitType: if item.LIMIT_REAL_TIME == limitType:
remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0) remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
@@ -306,7 +306,7 @@ class DragonSoulWindow(ui.ScriptWindow):
if None != self.tooltipItem: if None != self.tooltipItem:
self.tooltipItem.SetTop() self.tooltipItem.SetTop()
# item slot 관련 함수 # item slot <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
def OverOutItem(self): def OverOutItem(self):
self.wndItem.SetUsableItem(False) self.wndItem.SetUsableItem(False)
if None != self.tooltipItem: if None != self.tooltipItem:
@@ -359,7 +359,7 @@ class DragonSoulWindow(ui.ScriptWindow):
mouseModule.mouseController.DeattachObject() mouseModule.mouseController.DeattachObject()
else: else:
## 상점에서 팔도록 추가 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD><C8B5><EFBFBD> <20>߰<EFBFBD>
## 20140220 ## 20140220
curCursorNum = app.GetCursor() curCursorNum = app.GetCursor()
@@ -377,8 +377,8 @@ class DragonSoulWindow(ui.ScriptWindow):
self.wndItem.SetUseMode(False) self.wndItem.SetUseMode(False)
snd.PlaySound("sound/ui/pick.wav") snd.PlaySound("sound/ui/pick.wav")
## 상점에 팔기 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȱ<EFBFBD>
## 2014.02.20 추가 ## 2014.02.20 <EFBFBD>߰<EFBFBD>
def __SellItem(self, itemSlotPos): def __SellItem(self, itemSlotPos):
if not player.IsDSEquipmentSlot(player.DRAGON_SOUL_INVENTORY, itemSlotPos): if not player.IsDSEquipmentSlot(player.DRAGON_SOUL_INVENTORY, itemSlotPos):
self.sellingSlotNumber = itemSlotPos self.sellingSlotNumber = itemSlotPos
@@ -412,21 +412,21 @@ class DragonSoulWindow(ui.ScriptWindow):
self.questionDialog.Open() self.questionDialog.Open()
self.questionDialog.count = itemCount self.questionDialog.count = itemCount
## 상점에 팔기 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȱ<EFBFBD>
def SellItem(self): def SellItem(self):
net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.DRAGON_SOUL_INVENTORY) net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.DRAGON_SOUL_INVENTORY)
snd.PlaySound("sound/ui/money.wav") snd.PlaySound("sound/ui/money.wav")
self.OnCloseQuestionDialog() self.OnCloseQuestionDialog()
## 상점에 팔기 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȱ<EFBFBD>
def OnCloseQuestionDialog(self): def OnCloseQuestionDialog(self):
if self.questionDialog: if self.questionDialog:
self.questionDialog.Close() self.questionDialog.Close()
self.questionDialog = None self.questionDialog = None
## 상점에 팔기 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȱ<EFBFBD>
def __OnClosePopupDialog(self): def __OnClosePopupDialog(self):
self.pop = None self.pop = None
@@ -478,7 +478,7 @@ class DragonSoulWindow(ui.ScriptWindow):
return return
slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex) slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex)
try: try:
# 용혼석 강화창이 열려있으면, 아이템 우클릭 시 자동으로 강화창으로 들어감. # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŭ<EFBFBD><C5AC> <20><> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> <20><>.
if self.wndDragonSoulRefine.IsShow(): if self.wndDragonSoulRefine.IsShow():
if uiPrivateShopBuilder.IsBuildingPrivateShop(): if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
@@ -500,7 +500,7 @@ class DragonSoulWindow(ui.ScriptWindow):
net.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount) net.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount)
# equip 슬롯 관련 함수들. # equip <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>.
def OverOutEquipItem(self): def OverOutEquipItem(self):
self.OverOutItem() self.OverOutItem()
@@ -529,7 +529,7 @@ class DragonSoulWindow(ui.ScriptWindow):
def SelectEquipItemSlot(self, itemSlotIndex): def SelectEquipItemSlot(self, itemSlotIndex):
## 마우스 버튼이 sell buy 체크 해서 return ## <EFBFBD><EFBFBD><EFBFBD><20><>ư<EFBFBD><C6B0> sell buy üũ <20>ؼ<EFBFBD> return
curCursorNum = app.GetCursor() curCursorNum = app.GetCursor()
if app.SELL == curCursorNum: if app.SELL == curCursorNum:
return return
@@ -545,7 +545,7 @@ class DragonSoulWindow(ui.ScriptWindow):
if mouseModule.mouseController.isAttached(): if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType() attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
# 자기 자신을 자기 자신에게 드래그하는 경우 # <EFBFBD>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><EFBFBD><E5B7A1><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>
if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos: if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:
return return
@@ -592,9 +592,9 @@ class DragonSoulWindow(ui.ScriptWindow):
self.__OpenQuestionDialog(True, srcItemPos, dstItemPos) self.__OpenQuestionDialog(True, srcItemPos, dstItemPos)
mouseModule.mouseController.DeattachObject() mouseModule.mouseController.DeattachObject()
# equip 슬롯 관련 함수들 끝. # equip <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><>.
# 경고창 관련 # <EFBFBD><EFBFBD><EFBFBD>â <20><><EFBFBD><EFBFBD>
def __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos): def __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos):
self.srcItemPos = srcItemPos self.srcItemPos = srcItemPos
self.dstItemPos = dstItemPos self.dstItemPos = dstItemPos
@@ -623,7 +623,7 @@ class DragonSoulWindow(ui.ScriptWindow):
self.dstItemPos = (0, 0) self.dstItemPos = (0, 0)
self.dlgQuestion.Close() self.dlgQuestion.Close()
# 경고창 관련 끝 # <EFBFBD><EFBFBD><EFBFBD>â <20><><EFBFBD><EFBFBD> <20><>
def SetDSKindIndex(self, kindIndex): def SetDSKindIndex(self, kindIndex):
if self.DSKindIndex != kindIndex: if self.DSKindIndex != kindIndex:
@@ -656,7 +656,7 @@ class DragonSoulWindow(ui.ScriptWindow):
self.RefreshEquipSlotWindow() self.RefreshEquipSlotWindow()
# 용혼석 활성화 관련 # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>
def ActivateDragonSoulByExtern(self, deck): def ActivateDragonSoulByExtern(self, deck):
self.isActivated = True self.isActivated = True
self.activateButton.Down() self.activateButton.Down()
@@ -669,16 +669,25 @@ class DragonSoulWindow(ui.ScriptWindow):
self.isActivated = False self.isActivated = False
self.activateButton.SetUp() self.activateButton.SetUp()
def ActivateButtonClick(self): # MR-3: Keyboard-enabled deck toggling
self.isActivated = self.isActivated ^ True def ActivateButtonClick(self, deckIndex = None):
if self.isActivated: # If deckIndex is not specified, use the current deckPageIndex
if deckIndex is None:
deckIndex = self.deckPageIndex
if not self.isActivated or self.deckPageIndex != deckIndex:
if self.__CanActivateDeck(): if self.__CanActivateDeck():
net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex)) net.SendChatPacket("/dragon_soul activate " + str(deckIndex))
self.isActivated = True
self.activateButton.Down()
else: else:
self.isActivated = False self.isActivated = False
self.activateButton.SetUp() self.activateButton.SetUp()
else: else:
net.SendChatPacket("/dragon_soul deactivate") net.SendChatPacket("/dragon_soul deactivate")
self.isActivated = False
self.activateButton.SetUp()
# MR-3: -- END OF -- Keyboard-enabled deck toggling
def __CanActivateDeck(self): def __CanActivateDeck(self):
canActiveNum = 0 canActiveNum = 0
@@ -692,24 +701,24 @@ class DragonSoulWindow(ui.ScriptWindow):
for i in xrange(item.LIMIT_MAX_NUM): for i in xrange(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(i) (limitType, limitValue) = item.GetLimit(i)
# LIMIT_TIMER_BASED_ON_WEAR는 소켓0에 남은 시간을 박는다. # LIMIT_TIMER_BASED_ON_WEAR<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>0<EFBFBD><30> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ڴ´<DAB4>.
# LIMIT_REAL_TIME은 시간 다 되면 아이템이 사라지므로 할 필요가 없다. # LIMIT_REAL_TIME<EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>.
# LIMIT_REAL_TIME_START_FIRST_USE는 서버에 제대로 정의되지 않아 일단 냅둔다. # LIMIT_REAL_TIME_START_FIRST_USE<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD> <20>ʾ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>д<EFBFBD>.
if item.LIMIT_TIMER_BASED_ON_WEAR == limitType: if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
isNoLimit = False isNoLimit = False
remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
if 0 != remain_time: if 0 != remain_time:
canActiveNum += 1 canActiveNum += 1
break break
# 타이머가 없다면 Activate할 수 있는 용혼석. # Ÿ<EFBFBD≯Ӱ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> Activate<74><65> <20><> <20>ִ<EFBFBD> <20><>ȥ<EFBFBD><C8A5>.
if isNoLimit: if isNoLimit:
canActiveNum += 1 canActiveNum += 1
return canActiveNum > 0 return canActiveNum > 0
# 활성화 관련 끝 # Ȱ<EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><>
# 슬롯 highlight 관련 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> highlight <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
def __HighlightSlot_ClearCurrentPage(self): def __HighlightSlot_ClearCurrentPage(self):
for i in xrange(self.wndItem.GetSlotCount()): for i in xrange(self.wndItem.GetSlotCount()):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i) slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
@@ -726,14 +735,14 @@ class DragonSoulWindow(ui.ScriptWindow):
def HighlightSlot(self, slot): def HighlightSlot(self, slot):
if not slot in self.listHighlightedSlot: if not slot in self.listHighlightedSlot:
self.listHighlightedSlot.append (slot) self.listHighlightedSlot.append (slot)
# 슬롯 highlight 관련 끝 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> highlight <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
def SetDragonSoulRefineWindow(self, wndDragonSoulRefine): def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):
if app.ENABLE_DRAGON_SOUL_SYSTEM: if app.ENABLE_DRAGON_SOUL_SYSTEM:
from _weakref import proxy from _weakref import proxy
self.wndDragonSoulRefine = proxy(wndDragonSoulRefine) self.wndDragonSoulRefine = proxy(wndDragonSoulRefine)
## 강화할 수 없는 경우 날리는 예외 ## <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#class DragonSoulRefineException(Exception): #class DragonSoulRefineException(Exception):
#pass #pass
@@ -870,7 +879,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
def SetItemToolTip(self, tooltipItem): def SetItemToolTip(self, tooltipItem):
self.tooltipItem = tooltipItem self.tooltipItem = tooltipItem
# 버튼 눌려 있는 상태를 제외한 모든 강화창 관련 변수들을 초기화. # <EFBFBD><EFBFBD>ư <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>ȭâ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ.
def __Initialize(self): def __Initialize(self):
self.currentRecipe = {} self.currentRecipe = {}
self.refineItemInfo = {} self.refineItemInfo = {}
@@ -888,7 +897,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
def __FlushRefineItemSlot(self): def __FlushRefineItemSlot(self):
## Item slot settings ## Item slot settings
# 원래 인벤의 아이템 카운트 회복 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ ȸ<><C8B8>
for invenType, invenPos, itemCount in self.refineItemInfo.values(): for invenType, invenPos, itemCount in self.refineItemInfo.values():
remainCount = player.GetItemCount(invenType, invenPos) remainCount = player.GetItemCount(invenType, invenPos)
player.SetItemCount(invenType, invenPos, remainCount + itemCount) player.SetItemCount(invenType, invenPos, remainCount + itemCount)
@@ -939,33 +948,33 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount)) raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))
#return False #return False
# strength 강화일 경우, 0번엔 강화석, 1번엔 용혼석을 놓도록 강제함. # strength <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD>, 0<><30><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD>, 1<><31><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if self.__IsDragonSoul(itemVnum): if self.__IsDragonSoul(itemVnum):
dstSlotIndex = 1 dstSlotIndex = 1
else: else:
dstSlotIndex = 0 dstSlotIndex = 0
# 빈 슬롯이어야함. # <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD>.
if dstSlotIndex in self.refineItemInfo: if dstSlotIndex in self.refineItemInfo:
return False return False
# 강화창에 올릴 수 있는 아이템인지 검사. # <EFBFBD><EFBFBD>ȭâ<EFBFBD><EFBFBD> <20>ø<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
if False == self.__CheckCanRefine(itemVnum): if False == self.__CheckCanRefine(itemVnum):
return False return False
# 끌어다 놓은 아이템 카운트만큼 원래 자리의 아이템 카운트 감소 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE>ŭ <20><><EFBFBD><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>
player.SetItemCount(invenType, invenPos, maxCount - itemCount) player.SetItemCount(invenType, invenPos, maxCount - itemCount)
self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount) self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)
self.Refresh() self.Refresh()
return True return True
# 강화 가능한 아이템인지 체크 # <EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
# 용혼석 강화는 강화 레시피를 정해놓고 시작하는 것이 아니라, # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>,
# 처음에 강화창에 올린 용혼석에 의해 강화 레시피가 결정된다. # ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20>ø<EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
# 그래서 __CanRefineGrade, __CanRefineStep, __CanRefineStrength 함수에서 # <EFBFBD>׷<EFBFBD><EFBFBD><EFBFBD> __CanRefineGrade, __CanRefineStep, __CanRefineStrength <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# 강화 레시피가 없다면(처음 올리는 아이템이라면), 강화 레시피를 설정해주는 역할도 한다. # <EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><><C3B3> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6>), <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD>ҵ<EFBFBD> <20>Ѵ<EFBFBD>.
def __CheckCanRefine(self, vnum): def __CheckCanRefine(self, vnum):
if self.REFINE_TYPE_GRADE == self.currentRefineType: if self.REFINE_TYPE_GRADE == self.currentRefineType:
return self.__CanRefineGrade(vnum) return self.__CanRefineGrade(vnum)
@@ -992,10 +1001,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade): if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):
self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL) self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL)
return False return False
# 강화 창에 처음 아이템을 올리는 경우, 강화 재료에 관한 정보가 없다. # <EFBFBD><EFBFBD>ȭ â<><C3A2> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD>, <20><>ȭ <20><><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
# 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라, # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>, <20><>ȭâ<C8AD><C3A2> ó<><C3B3> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳Ŀ<CCB3> <20><><EFBFBD><EFBFBD>,
# 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD>ϰ<EFBFBD>, <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
# 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>, ó<><C3B3> <20>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>.
else: else:
self.currentRecipe = self.__GetRefineGradeRecipe(vnum) self.currentRecipe = self.__GetRefineGradeRecipe(vnum)
@@ -1004,7 +1013,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"]))
return True return True
else: else:
# 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단. # <EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE) self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE)
return False return False
@@ -1021,10 +1030,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step): if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):
self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL) self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL)
return False return False
# 강화 창에 처음 아이템을 올리는 경우, 재료에 관한 정보가 없다. # <EFBFBD><EFBFBD>ȭ â<><C3A2> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD>, <20><><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
# 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라, # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>, <20><>ȭâ<C8AD><C3A2> ó<><C3B3> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳Ŀ<CCB3> <20><><EFBFBD><EFBFBD>,
# 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD>ϰ<EFBFBD>, <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
# 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>, ó<><C3B3> <20>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>.
else: else:
self.currentRecipe = self.__GetRefineStepRecipe(vnum) self.currentRecipe = self.__GetRefineStepRecipe(vnum)
@@ -1034,12 +1043,12 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
return True return True
else: else:
# 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단. # <EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE) self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE)
return False return False
def __CanRefineStrength (self, vnum): def __CanRefineStrength (self, vnum):
# 용혼석인 경우, 더 이상 strength 강화를 할 수 없는지 체크해야함. # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><> <20>̻<EFBFBD> strength <20><>ȭ<EFBFBD><C8AD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؾ<EFBFBD><D8BE><EFBFBD>.
if self.__IsDragonSoul(vnum): if self.__IsDragonSoul(vnum):
ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum) ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
@@ -1051,10 +1060,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
else: else:
return True return True
# strength 강화의 경우, refine_recipe가 용혼석의 종류가 아닌, 강화석의 종류에 따라 달라진다. # strength <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD>, refine_recipe<EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>, <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD>.
# 따라서 용혼석이 아니라면, # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6>,
# 이미 레시피가 있는 경우는, 강화석이 강화창에 있다는 것이므로, return False # <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20>ִٴ<D6B4> <20><><EFBFBD>̹Ƿ<CCB9>, return False
# 레시피가 없는 경우는, 강화석인지 확인하고, 레시피를 셋팅한다. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
else: else:
if self.currentRecipe: if self.currentRecipe:
self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL) self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
@@ -1066,7 +1075,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"]))
return True return True
else: else:
# 레시피를 셋팅할 수 없는 경우 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>
self.__PopUp(localeInfo.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE) self.__PopUp(localeInfo.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)
return False return False
@@ -1096,11 +1105,11 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
except: except:
return None return None
# strength 강화의 경우, refineInfo는 강화석에 따라 달라진다. # strength <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD>, refineInfo<EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD>.
def __GetRefineStrengthInfo (self, itemVnum): def __GetRefineStrengthInfo (self, itemVnum):
try: try:
# 이놈의 위치를 어찌하지.... # <EFBFBD>̳<EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....
# 강화석이 아니면 안됨. # <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20>ȵ<EFBFBD>.
item.SelectItem(itemVnum) item.SelectItem(itemVnum)
if not (item.ITEM_TYPE_MATERIAL == item.GetItemType() \ if not (item.ITEM_TYPE_MATERIAL == item.GetItemType() \
and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)): and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)):
@@ -1115,11 +1124,11 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
item.SelectItem(vnum) item.SelectItem(vnum)
return item.GetItemType() == item.ITEM_TYPE_DS return item.GetItemType() == item.ITEM_TYPE_DS
# 용혼석 Vnum에 대한 comment # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> Vnum<75><6D> <20><><EFBFBD><EFBFBD> comment
# ITEM VNUM 10만 자리부터, FEDCBA라고 한다면 # ITEM VNUM<EFBFBD><EFBFBD> 10<EFBFBD><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>, FEDCBA<42><41><EFBFBD> <20>Ѵٸ<D1B4>
# FE : 용혼석 종류. D : 등급 # FE : <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. D : <EFBFBD><EFBFBD><EFBFBD>
# C : 단계 B : 강화 # C : <EFBFBD>ܰ<EFBFBD> B : <EFBFBD><EFBFBD>ȭ
# A : 여벌의 번호들... # A : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3>...
def __GetDragonSoulTypeInfo(self, vnum): def __GetDragonSoulTypeInfo(self, vnum):
if not self.__IsDragonSoul(vnum): if not self.__IsDragonSoul(vnum):
return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO
@@ -1133,7 +1142,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
def __MakeDragonSoulVnum(self, ds_type, grade, step, strength): def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):
return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10 return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10
## 빈 슬롯 선택 Event ## <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Event
def __SelectRefineEmptySlot(self, selectedSlotPos): def __SelectRefineEmptySlot(self, selectedSlotPos):
try: try:
if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1: if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
@@ -1168,14 +1177,14 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
import dbg import dbg
dbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e) dbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)
# 클릭으로 슬롯에서 삭제. # Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD> <20><><EFBFBD><EFBFBD>.
def __SelectRefineItemSlot(self, selectedSlotPos): def __SelectRefineItemSlot(self, selectedSlotPos):
if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1: if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
return return
try: try:
if not selectedSlotPos in self.refineItemInfo: if not selectedSlotPos in self.refineItemInfo:
# 새로운 아이템을 강화창에 올리는 작업. # <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20>ø<EFBFBD><C3B8><EFBFBD> <20>۾<EFBFBD>.
if mouseModule.mouseController.isAttached(): if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType() attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
@@ -1203,25 +1212,25 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
attachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos] attachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]
selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos) selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)
# 강화창에서 삭제 및 원래 인벤의 아이템 카운트 회복 # <EFBFBD><EFBFBD>ȭâ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ ȸ<><C8B8>
invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos] invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]
remainCount = player.GetItemCount(invenType, invenPos) remainCount = player.GetItemCount(invenType, invenPos)
player.SetItemCount(invenType, invenPos, remainCount + itemCount) player.SetItemCount(invenType, invenPos, remainCount + itemCount)
del self.refineItemInfo[selectedSlotPos] del self.refineItemInfo[selectedSlotPos]
# 강화창이 비었다면, 초기화 # <EFBFBD><EFBFBD>ȭâ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ٸ<EFBFBD>, <20>ʱ<EFBFBD>ȭ
if not self.refineItemInfo: if not self.refineItemInfo:
self.__Initialize() self.__Initialize()
else: else:
item.SelectItem(selectedItemVnum) item.SelectItem(selectedItemVnum)
# 없앤 아이템이 강화석이었다면 강화 레피시 초기화 # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD>̾<EFBFBD><CCBE>ٸ<EFBFBD> <20><>ȭ <20><><EFBFBD>ǽ<EFBFBD> <20>ʱ<EFBFBD>ȭ
if (item.ITEM_TYPE_MATERIAL == item.GetItemType() \ if (item.ITEM_TYPE_MATERIAL == item.GetItemType() \
and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)): and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)):
self.currentRecipe = {} self.currentRecipe = {}
self.wndMoney.SetText(localeInfo.NumberToMoneyString(0)) self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))
# 용혼석이었다면, # <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD>ٸ<EFBFBD>,
# strength강화가 아닌 경우, 강화창에 다른 용혼석이 남아있으므로, 레시피를 초기화하면 안됨. # strength<EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD>, <20><>ȭâ<C8AD><C3A2> <20>ٸ<EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ϸ<EFBFBD> <20>ȵ<EFBFBD>.
# strength강화의 경우, 강화 레시피는 강화석에 종속된 것이므로 다른 처리할 필요가 없음. # strength<EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD>, <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20>ٸ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>.
else: else:
pass pass
@@ -1268,10 +1277,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
for slotPos in xrange(self.wndRefineSlot.GetSlotCount()): for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):
self.wndRefineSlot.ClearSlot(slotPos) self.wndRefineSlot.ClearSlot(slotPos)
if slotPos < self.refineSlotLockStartIndex: if slotPos < self.refineSlotLockStartIndex:
# self.refineItemInfo[slotPos]의 정보확인 # self.refineItemInfo[slotPos]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>
# (실제로 아이템이 존재하는지 확인) # (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> Ȯ<><C8AE>)
# 존재 -> 아이템 아이콘을 슬롯에 셋팅. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD>.
# 비존재 -> 아이템이 없으므로 강화창에서 삭제. # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if slotPos in self.refineItemInfo: if slotPos in self.refineItemInfo:
invenType, invenPos, itemCount = self.refineItemInfo[slotPos] invenType, invenPos, itemCount = self.refineItemInfo[slotPos]
itemVnum = player.GetItemIndex(invenType, invenPos) itemVnum = player.GetItemIndex(invenType, invenPos)
@@ -1282,12 +1291,12 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
else: else:
del self.refineItemInfo[slotPos] del self.refineItemInfo[slotPos]
# 빈 슬롯에 reference 아이콘을 alpha 0.5로 셋팅. # <EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> reference <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> alpha 0.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if not slotPos in self.refineItemInfo: if not slotPos in self.refineItemInfo:
try: try:
reference_vnum = 0 reference_vnum = 0
# strength 강화일 때는, # strength <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>,
# 0번 슬롯에 강화석을, 1번 슬롯에 용혼석을 놓는다. # 0<EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>, 1<><31> <20><><EFBFBD>Կ<EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos: if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:
reference_vnum = 100300 reference_vnum = 100300
@@ -1298,28 +1307,28 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
itemIcon = item.GetIconImage() itemIcon = item.GetIconImage()
(width, height) = item.GetItemSize() (width, height) = item.GetItemSize()
self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5)) self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))
# slot 우측 하단에 숫자 뜨면 안 예쁨... # slot <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴܿ<CFB4> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>...
self.wndRefineSlot.SetSlotCount(slotPos, 0) self.wndRefineSlot.SetSlotCount(slotPos, 0)
except: except:
pass pass
# refineSlotLockStartIndex 보다 작은 슬롯은 닫힌 이미지를 보여주면 안됨. # refineSlotLockStartIndex <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD> <20>ȵ<EFBFBD>.
self.wndRefineSlot.HideSlotBaseImage(slotPos) self.wndRefineSlot.HideSlotBaseImage(slotPos)
# slotPos >= self.refineSlotLockStartIndex: # slotPos >= self.refineSlotLockStartIndex:
else: else:
# 정상적인 경우라면 이 if문에 들어갈 일은 없겠지만, # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> if<69><66><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
# (애초에 인덱스가 refineSlotLockStartIndex 이상인 슬롯에는 아이템을 넣지 못하게 했기 때문) # (<EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> refineSlotLockStartIndex <EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20>߱<EFBFBD> <20><><EFBFBD><EFBFBD>)
# 혹시 모를 에러에 대비함. # Ȥ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.
if slotPos in self.refineItemInfo: if slotPos in self.refineItemInfo:
invenType, invenPos, itemCount = self.refineItemInfo[slotPos] invenType, invenPos, itemCount = self.refineItemInfo[slotPos]
remainCount = player.GetItemCount(invenType, invenPos) remainCount = player.GetItemCount(invenType, invenPos)
player.SetItemCount(invenType, invenPos, remainCount + itemCount) player.SetItemCount(invenType, invenPos, remainCount + itemCount)
del self.refineItemInfo[slotPos] del self.refineItemInfo[slotPos]
# refineSlotLockStartIndex 이상인 슬롯은 닫힌 이미지를 보여줘야함. # refineSlotLockStartIndex <EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
self.wndRefineSlot.ShowSlotBaseImage(slotPos) self.wndRefineSlot.ShowSlotBaseImage(slotPos)
# 강화창에 아무런 아이템이 없다면, 초기화해줌. # <EFBFBD><EFBFBD>ȭâ<EFBFBD><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>, <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>.
# 위에서 중간 중간에 "del self.refineItemInfo[slotPos]"를 했기 때문에, # <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> "del self.refineItemInfo[slotPos]"<EFBFBD><EFBFBD> <20>߱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
# 여기서 한번 체크해줘야함. # <EFBFBD><EFBFBD><EFBFBD><20>ѹ<EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if not self.refineItemInfo: if not self.refineItemInfo:
self.__Initialize() self.__Initialize()
@@ -1329,8 +1338,8 @@ class DragonSoulRefineWindow(ui.ScriptWindow):
dbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e) dbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)
def __GetEmptySlot(self, itemVnum = 0): def __GetEmptySlot(self, itemVnum = 0):
# STRENGTH 강화의 경우, 용혼석 슬롯과 강화석 슬롯이 구분되어있기 떄문에 # STRENGTH <EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD> <20><><EFBFBD>, <20><>ȥ<EFBFBD><C8A5> <20><><EFBFBD>԰<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>еǾ<D0B5><C7BE>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# vnum을 알아야 한다. # vnum<EFBFBD><EFBFBD> <20>˾ƾ<CBBE> <20>Ѵ<EFBFBD>.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if 0 == itemVnum: if 0 == itemVnum:
return -1 return -1

View File

@@ -762,11 +762,10 @@ class TaskBar(ui.ScriptWindow):
pass pass
startNumber = 0 startNumber = 0
for slot in self.quickslot: for slot in self.quickslot:
for i in xrange(4): for i in xrange(4):
slotNumber = i + startNumber
slotNumber = i+startNumber
(Type, Position) = player.GetLocalQuickSlot(slotNumber) (Type, Position) = player.GetLocalQuickSlot(slotNumber)
@@ -775,12 +774,14 @@ class TaskBar(ui.ScriptWindow):
continue continue
if player.SLOT_TYPE_INVENTORY == Type: if player.SLOT_TYPE_INVENTORY == Type:
itemIndex = player.GetItemIndex(Position) itemIndex = player.GetItemIndex(Position)
itemCount = player.GetItemCount(Position) itemCount = player.GetItemCount(Position)
if itemCount <= 1: if itemCount <= 1:
itemCount = 0 itemCount = 0
slot.SetItemSlot(slotNumber, itemIndex, itemCount)
## <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> (#72723, #72724) Ư<><C6AF>ó<EFBFBD><C3B3> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> Ȱ<><C8B0>ȭ/<2F><>Ȱ<EFBFBD><C8B0>ȭ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> - [hyo] ## <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> (#72723, #72724) Ư<><C6AF>ó<EFBFBD><C3B3> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> Ȱ<><C8B0>ȭ/<2F><>Ȱ<EFBFBD><C8B0>ȭ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> - [hyo]
if constInfo.IS_AUTO_POTION(itemIndex): if constInfo.IS_AUTO_POTION(itemIndex):
# metinSocket - [0] : Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>, [1] : <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, [2] : <20>ִ<EFBFBD> <20> # metinSocket - [0] : Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>, [1] : <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, [2] : <20>ִ<EFBFBD> <20>
@@ -790,8 +791,6 @@ class TaskBar(ui.ScriptWindow):
slot.ActivateSlot(slotNumber) slot.ActivateSlot(slotNumber)
else: else:
slot.DeactivateSlot(slotNumber) slot.DeactivateSlot(slotNumber)
slot.SetItemSlot(slotNumber, itemIndex, itemCount)
elif player.SLOT_TYPE_SKILL == Type: elif player.SLOT_TYPE_SKILL == Type:
skillIndex = player.GetSkillIndex(Position) skillIndex = player.GetSkillIndex(Position)
@@ -855,6 +854,19 @@ class TaskBar(ui.ScriptWindow):
AttachedSlotNumber = mouseModule.mouseController.GetAttachedSlotNumber() AttachedSlotNumber = mouseModule.mouseController.GetAttachedSlotNumber()
AttachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex() AttachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
# MR-3: Swap slots if dragging an item from another window already exists in quickslots and tries to replace another one
if AttachedSlotType != player.SLOT_TYPE_QUICK_SLOT:
# Search for the same item/skill/emotion in quickslots
for slotIdx in range(constInfo.QUICKSLOT_MAX_NUM): # Use your actual max quickslot count
(Type, Position) = player.GetLocalQuickSlot(slotIdx)
if Type == AttachedSlotType and Position == AttachedSlotNumber:
# Found, swap instead of replace
player.RequestMoveGlobalQuickSlotToLocalQuickSlot(slotIdx, localSlotIndex)
mouseModule.mouseController.DeattachObject()
self.RefreshQuickSlot()
return
# MR-3: -- END OF -- Swap slots if dragging an item from another window already exists in quickslots and tries to replace another one
if player.SLOT_TYPE_QUICK_SLOT == AttachedSlotType: if player.SLOT_TYPE_QUICK_SLOT == AttachedSlotType:
player.RequestMoveGlobalQuickSlotToLocalQuickSlot(AttachedSlotNumber, localSlotIndex) player.RequestMoveGlobalQuickSlotToLocalQuickSlot(AttachedSlotNumber, localSlotIndex)