MRMJ-1: Messenger & Skills fixes
This commit is contained in:
62
.gitignore
vendored
62
.gitignore
vendored
@@ -8,3 +8,65 @@ ErrorLog.txt
|
||||
/*.exe
|
||||
!/config.exe
|
||||
!/Metin2.exe
|
||||
|
||||
# =======================================================
|
||||
# FULLY CASE-INSENSITIVE BACKUP EXCLUSIONS
|
||||
# Matches all files and folders ending in:
|
||||
# _BK, _BAK, .BK, .BAK (and all case permutations)
|
||||
# =======================================================
|
||||
|
||||
# -------------------------------------------------------
|
||||
# 1. EXCLUSIONS ENDING IN .BK / _BK
|
||||
# -------------------------------------------------------
|
||||
|
||||
# Files/Folders ending in _BK (e.g., File_Bk, Folder_bK)
|
||||
*_BK
|
||||
*_Bk
|
||||
*_bK
|
||||
*_bk
|
||||
|
||||
# Files ending in .BK (e.g., File.BK, File.bK)
|
||||
*.BK
|
||||
*.Bk
|
||||
*.bK
|
||||
*.bk
|
||||
|
||||
# Files ending in "double extension" .X.BK (e.g., File.txt.Bk)
|
||||
*.*.BK
|
||||
*.*.Bk
|
||||
*.*.bK
|
||||
*.*.bk
|
||||
|
||||
# -------------------------------------------------------
|
||||
# 2. EXCLUSIONS ENDING IN .BAK / _BAK
|
||||
# -------------------------------------------------------
|
||||
|
||||
# Files/Folders ending in _BAK (e.g., File_BAK, Folder_bak)
|
||||
*_BAK
|
||||
*_BAk
|
||||
*_BaK
|
||||
*_Bak
|
||||
*_bAK
|
||||
*_bAk
|
||||
*_baK
|
||||
*_bak
|
||||
|
||||
# Files ending in .BAK (e.g., File.BAK, File.bak)
|
||||
*.BAK
|
||||
*.BAk
|
||||
*.BaK
|
||||
*.Bak
|
||||
*.bAK
|
||||
*.bAk
|
||||
*.baK
|
||||
*.bak
|
||||
|
||||
# Files ending in "double extension" .X.BAK (e.g., File.txt.Bak)
|
||||
*.*.BAK
|
||||
*.*.BAk
|
||||
*.*.BaK
|
||||
*.*.Bak
|
||||
*.*.bAK
|
||||
*.*.bAk
|
||||
*.*.baK
|
||||
*.*.bak
|
||||
|
||||
34
README.md
34
README.md
@@ -2,16 +2,28 @@
|
||||
|
||||
This repository contains all client-side data, including locale files, configurations, and descriptive text used by the game client.
|
||||
|
||||
## ✨ Critical Fix: Skill 19 Speed Sync
|
||||
## Changelog 📋
|
||||
|
||||
Sync with the fix in the server's `skill_proto` to resolve an issue where characters became unable to move after being affected by Strong Body (due to an incorrect `MOV_SPEED` value).
|
||||
### 🐛 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.
|
||||
|
||||
This client repository contains the necessary sync fix:
|
||||
|
||||
* **Fixed `MOV_SPEED` value for Skill 19** in `locale/en/skilldesc.txt` and `locale/en/skilltable.txt`.
|
||||
|
||||
### ⚠️ IMPORTANT: Locale Synchronization
|
||||
|
||||
The fix listed above has **only been applied to the `locale/en` (English) files.**
|
||||
|
||||
**If you use any other locale (e.g., German, French, etc.), you must manually update the `MOV_SPEED` value for Skill 19 in your respective `skilldesc.txt` and `skilltable.txt` files to match the change.**
|
||||
### ⬆️ Feature Improvements
|
||||
* **Messenger System:**
|
||||
* **Live Status Updates:** Live updates for adding/removing friend for both parties.
|
||||
* **Auto-Deselect:** When a player removes a friend, or is removed by one, the entry is automatically deselected in the Messenger window.
|
||||
* **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)
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Průraz Tlaková vlna Útok Tsunami Napadáš nepřítele frontálně. Čelní prorážecí útok ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Hodnota útoku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Prudká rána Prudká tygří rána Prudká dračí rána Napadáš nepřítele frontálně Prorážecí útok Útok na vícero cílů ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Hodnota útoku %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Dupnutí Dupnutí lva Dupnutí nosorožce Poval několik nepřátel Prorážecí útok Šance na bezvědomí ATTACK_SKILL|STANDING_SKILL daejin 18 4 Hodnota útoku %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Šance na bezvědomí: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Silné tělo Tělo ze železa Tělo z oceli Tvoje obrana se dočasně zlepší a nebudeš padat k zemi. Obrana se zlepší Snižuje rychlost pohybu Neskácet se STANDING_SKILL cheongeun 19 4 Obrana: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rychlost pohybů: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Silné tělo Tělo ze železa Tělo z oceli Tvoje obrana se dočasně zlepší a nebudeš padat k zemi. Obrana se zlepší Snižuje rychlost pohybu Neskácet se STANDING_SKILL cheongeun 19 4 Obrana: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rychlost pohybů: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Smršť meče Šavlový tanec Cyklón Rozvíři meč, aby napadl více nepřátel Prorážecí útok Útok na vícero cílů ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Hodnota útoku: %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Rána mečem Bodnutí mečem Vrh mečem Napadáš nepřítele frontálně. Útok na dálku Útok na vícero cílů Bezvědomí převrhne cíl ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Hodnota útoku %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Šance na bezvědomí: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Bojové zuření Vztek Zběsilost Soustředíš se pouze na útočení. Rychlost útoku se zvyšuje Zvyšuje rychlost pohybu Zvyšuje náchylnost k poškození STANDING_SKILL jeongwi 3 4 Rychlost útoku +%.0f%% 50 * SkillPoint Rychlost pohybu +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Durchschlag Druckwelle Tsunami-Angriff Du greifst die Feinde frontal an. Frontaler Durchschlag-Angriff ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angriffswert %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Heftiges Schlagen Heftiger Tigerschlag Heftiger Drachenschlag Du greifst die Feinde frontal an. Durchschlag-Angriff Angriff auf mehrere Ziele ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angriffswert %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Stampfer Löwenstampfer Rhinozerosstampfer Wirf mehrere Feinde um. Durchschlag-Angriff Ohnmachtschance ATTACK_SKILL|STANDING_SKILL daejin 18 4 Angriffswert %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ohnmachtschance %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Starker Körper Körper aus Eisen Körper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fällst nicht zu Boden. Verteidigung wird verbessert Verringert die Bewegungsgeschwindigkeit Kein Umfallen STANDING_SKILL cheongeun 19 4 Verteidigung: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bewegungsgeschwindigkeit: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Starker Körper Körper aus Eisen Körper aus Stahl Deine Verteidigung wird eine Zeit lang besser und du fällst nicht zu Boden. Verteidigung wird verbessert Verringert die Bewegungsgeschwindigkeit Kein Umfallen STANDING_SKILL cheongeun 19 4 Verteidigung: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bewegungsgeschwindigkeit: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Schwertwirbel Schwerttanz Zyklon Wirbel das Schwert herum, um mehrere Feinde anzugreifen. Durchschlag-Angriff Angriff auf mehrere Ziele ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angriffswert %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Schwertschlag Schwertstoß Schwertwurf Du greifst die Feinde frontal an. Fern-Angriff Angriff auf mehrere Ziele Ohnmacht Schlägt das Ziel zu Boden ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Angriffswert %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ohnmachtschance %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Kampfrausch Wut Raserei Du konzentrierst dich ausschließlich auf das Angreifen. Angriffsgeschwindigkeit wird erhöht Erhöht die Bewegungsgeschwindigkeit Erhöht die Schadensanfälligkeit STANDING_SKILL jeongwi 3 4 Angriffsgeschwindigkeit +%.0f%% 50 * SkillPoint Bewegungsgeschwindigkeit +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Gennemgående slag Trykbølge Tsunami-angreb Du angriber fjenden frontalt. Frontalt angreb ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Angrebsværdi %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Voldsomme stød Voldsomme tigerstød Voldsomme dragestød Du angriber fjenden frontalt Gennembruds angreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Angrebsværdi %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Trampning Løvens trampning Rhinoceros trampning Stød mod flere fjender Gennembruds-angreb Sandsynlighed for besvimelse ATTACK_SKILL|STANDING_SKILL daejin 18 4 Angrebsstyrke %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Sandsynlighed for besvimelses %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Stærk krop Krop af jern Krop af stål Dit forsvar forøges, og du kan ikke væltes. Forsvar forøges Bevægelseshastigheden sænkes Ingen væltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevægelseshastighed: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Stærk krop Krop af jern Krop af stål Dit forsvar forøges, og du kan ikke væltes. Forsvar forøges Bevægelseshastigheden sænkes Ingen væltning STANDING_SKILL cheongeun 19 4 Forsvar: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Bevægelseshastighed: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Sværd-hvirvel Sværd-dans Zyklon Hvirvler omkring med sværdet Gennemslagssangreb Angreb på flere fjender ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Angrebsværdi %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Sværdstødet Forbedret sværdstød Sværdkast Du angriber fjenden frontalt. Distance-angreb Angreb på flere fjender Besvimelse Vælter målet ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Angrebsstyrke %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Sandsynlighed for besvimelse: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Berserk Vrede Raseri Du koncentrerer dig udelukkende om angrebet Angrebshastigheden forøges Bevægelseshastigheden forøges Forøger modtaget skade STANDING_SKILL jeongwi 3 4 Angrebshastighed +%.0f%% 50 * SkillPoint Bevægelseshastighed +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Pulso Espiritual Onda de Choque Ataque Tsunami Ataca directamente a los enemigos. Ataque frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Fuerza de ataque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Golpe Golpe de Tigre Golpe de Dragón Ataca directamente a los enemigos Ataque fuerte Ataque a múltiples objetivos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Fuerza de ataque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Tocón Tocón de Leon Tocón de Rinoceronte Derriba a varios enemigos. Ataque fuerte Probabilidad de desmayo ATTACK_SKILL|STANDING_SKILL daejin 18 4 Fuerza de ataque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilidad de desmayo %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Cuerpo fuerte Cuerpo de hierro Cuerpo de acero Aumenta tu defensa por un período de tiempo y no caes al suelo. Incrementa defensa Disminuye velocidad de movimiento No caes STANDING_SKILL cheongeun 19 4 Defensa : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocidad de movimiento : -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Cuerpo fuerte Cuerpo de hierro Cuerpo de acero Aumenta tu defensa por un período de tiempo y no caes al suelo. Incrementa defensa Disminuye velocidad de movimiento No caes STANDING_SKILL cheongeun 19 4 Defensa : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocidad de movimiento : -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Giro de espada Danza de la espada Ciclón Gira la espada para atacar a varios enemigos Ataque frontal Ataque de múltiples objetivos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Fuerza de ataque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Golpe de espada Rayo de espada Lanzamiento de espada Atacas de frente al enemigo. Ataque de largo alcance Ataque a múltiples objetivos Efecto de desmayo Derriba al objetivo al suelo ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Fuerza de ataque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilidad de desmayo %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Berserk Furia Frenesí Solo concentración en el ataque Incrementa velocidad de ataque Incrementa velocidad de movimiento Incrementa daño recibido STANDING_SKILL jeongwi 3 4 Velocidad de Ataque +%.0f%% 50 * SkillPoint Velocidad de Movimiento +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Attaque de l'Esprit Onde de choc Attaque Tsunami Attaque directement les ennemis. Attaque frontale violente ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Puissance de l'attaque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Attaque de la paume Paume du Tigre Paume du Dragon Attaque directement les ennemis. Attaque directe violente Attaque plusieurs cibles ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Puissance de l'attaque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Charge Charge du lion Charge du rhino Renverse plusieurs ennemis. Attaque directe violente Chance de provoquer un évanouissement ATTACK_SKILL|STANDING_SKILL daejin 18 4 Puissance de l'attaque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Chance d'évanouissament : %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Corps puissant Corps de fer Corps d'acier Augmente temporairement votre défense et empêche que vous soyez renversé Augmente la Défense Diminue la vitesse de déplacement Empêche que vous soyez renversé STANDING_SKILL cheongeun 19 4 Défense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de déplacement : -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Corps puissant Corps de fer Corps d'acier Augmente temporairement votre défense et empêche que vous soyez renversé Augmente la Défense Diminue la vitesse de déplacement Empêche que vous soyez renversé STANDING_SKILL cheongeun 19 4 Défense : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Vitesse de déplacement : -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Moulinet à l'épée Danse de l'épée Cyclone Effectue des moulinets de l'épée pour attaquer plusieurs ennemis. Attaque frontale violente Attaque plusieurs cibles ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Puissance de l'attaque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Coup d'épée Coup d'épée foudroyant Jet d'épée Attaque frontalement les ennemis. Attaque à distance Attaque plusieurs cibles Attaque assomante Fait chuter vos ennemis ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Valeur d'attaque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Chance d'assomer : %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Berserk Furie Frénésie Uniquement concentré sur l'attaque. Augmente la vitesse d'attaque Augmente la vitesse de déplacement Augmente les dommages reçus STANDING_SKILL jeongwi 3 4 Vitesse d'attaque +%.0f%% 50 * SkillPoint Vitesse de déplacement +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Πνευματική Επίθεση (W) Κρουστικό Κύμα Επίθεση Tsunami Κατά μέτωπο επίθεση Μετωπική Μαζική Επίθεση ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Δύναμη Επίθεσης %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Δυνατό χτύπημα Δυνατό χτύπημα της Τίγρης Δυνατό χτύπημα του Δράκου Κατά μέτωπο επίθεση Πνευματική Επίθεση Επίθεση σε Πολλαπλούς Στόχους ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Δύναμη Επίθεσης %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Ποδοπάτημα Ποδοπάτημα του Λέοντα Ποδοπάτημα του Ρινόκερου Ρίξε πολλούς εχθρούς. Ευθεία Μαζική Επίθεση Πιθανότητα λιποθυμίας ATTACK_SKILL|STANDING_SKILL daejin 18 4 Δύναμη Επίθεσης %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Πιθανότητες Λιποθυμίας: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Δυνατό Σώμα Σιδηρούν Σώμα Ατσάλινο Σώμα Αυξάνει την άμυνα και δεν πέφτεις Αυξάνει την άμυνα Μειώνει την ταχύτητα κίνησης Δεν πέφτεις ποτέ STANDING_SKILL cheongeun 19 4 ’μυνα : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Ταχύτητα Κίνησης : -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Δυνατό Σώμα Σιδηρούν Σώμα Ατσάλινο Σώμα Αυξάνει την άμυνα και δεν πέφτεις Αυξάνει την άμυνα Μειώνει την ταχύτητα κίνησης Δεν πέφτεις ποτέ STANDING_SKILL cheongeun 19 4 ’μυνα : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Ταχύτητα Κίνησης : -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Στριφογύρισμα σπαθιού Χορός Σπαθιών Κυκλώνας Στριφογύρισμα του σπαθιού για επίθεση σε πολλούς αντιπάλους. Μετωπική Μαζική Επίθεση Επίθεση σε Πολλαπλούς Στόχους ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Δύναμη Επίθεσης %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Χτύπημα Σπαθιού Βίδωμα Σπαθιού Εκτίναξη Σπαθιού Κατά μέτωπο επίθεση. Μακρινή Επίθεση Επίθεση σε Πολλαπλούς Στόχους Λιποθυμία Ρίχνει τον στόχο. ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Δύναμη Επίθεσης %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Πιθανότητες Λιποθυμίας: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Έξαλλος Οργισμένος Μανιακός Επικέντρωση στην Επίθεση Αυξάνει την Ταχύτητα της Επίθεσης Αυξάνει την ταχύτητα Κίνησης Αυξάνει την ζημιά που δέχεσε STANDING_SKILL jeongwi 3 4 Ταχύτητα Επίθεσης +%.0f%% 50 * SkillPoint Ταχύτητα Κίνησης +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó erő %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Kard ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Penetrazione Ondata di pressione Attacco Tsunami Attacchi i nemici frontalmente. Attacco trafiggente frontale ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Valore di attacco %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Colpire duramente Potente colpo di tigre Potente colpo del drago Attacchi i nemici frontalmente. Attacco trafiggente Attacco a più bersagli ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Valore di attacco %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Pestone Pestone di leone Pestone di rinoceronte Fai cadere più nemici. Attacco trafiggente Possibilità di svenimento ATTACK_SKILL|STANDING_SKILL daejin 18 4 Valore di attacco %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilità di svenimento: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Corpo forte Corpo di ferro Corpo di acciaio La tua difesa migliora temporaneamente e non cadi a terra. La difesa viene migliorata Diminuisce la velocità di movimento Non si cade STANDING_SKILL cheongeun 19 4 Difesa +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocità di movimento -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Corpo forte Corpo di ferro Corpo di acciaio La tua difesa migliora temporaneamente e non cadi a terra. La difesa viene migliorata Diminuisce la velocità di movimento Non si cade STANDING_SKILL cheongeun 19 4 Difesa +%.0f 7+(40 + 0.2*str + 0.4*con)*k Velocità di movimento -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Vortice della spada Danza della spada Ciclone Fai girare vorticosamente la spada per attaccare più nemici. Attacco trafiggente Attacco a più bersagli ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Valore di attacco %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Colpo di spada Stoccata di spada Lancio della spada Attacchi i nemici frontalmente. Attacco da lontano Attacco a più bersagli Svenimento Fa cadere il bersaglio ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Valore di attacco %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilità di svenimento: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Estasi da combattimento Rabbia Frenesia Ti concentri esclusivamente sull'attaccare Aumenta la velocità d'attacco Aumenta la velocità di movimento Aumenta la vulnerabilità al danno STANDING_SKILL jeongwi 3 4 Velocità di attacco +%.0f%% 50 * SkillPoint Velocità di movimento +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Áthatolás Nyomás hullám Cunami támadás Szemből támadsz az ellenségre. Frontális átütő támadás ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Támadó erő %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Heves csapás Heves tigris csapás Heves sárkány csapás Frontálisan támadsz az ellenségre Átütő támadás Támadás több cél ellen ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Támadó erő %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Dübörgés Oroszlán dübörgés Orrszarvú dübörgés Teríts le több ellenséget. Átütő támadás Ájulás esély ATTACK_SKILL|STANDING_SKILL daejin 18 4 Támadó érték %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Ájulás esély: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Erős test Test jégből Test acélból A védekezésed egy időre javul és nem veszítesz. A védekezés javul Csökken a mozgási sebesség Nincs összeomlás STANDING_SKILL cheongeun 19 4 Védekezés : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Mozgási sebesség: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Forgó kard Kard tánc Ciklon Forgasd körbe a kardot, hogy több ellenséget támad meg. Átütő támadás Több cél támadása ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Támadó érték %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Kard ütés Kard szúrás Kard dobás Szemből támadsz az ellenségre. Távoli támadás Több cél támadása Ájulás Pusztítsd el a célt ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Támadó érték %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Ájulás esély: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Harci mámor Düh Vágtázás Kizárólag a támadásra koncentrálj. Támadó sebesség növekedik Növeli a mozgási sebességet Növeli az elszenvedett veszteségeket STANDING_SKILL jeongwi 3 4 Támadó sebesség +%.0f%% 50 * SkillPoint Mozgási sebesség +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Duchowe Uderzenie Fala Uderzeniowa Atak Tsunami Atakuje centralnie wrogów Frontalny atak rozpryskowy ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Siła Ataku %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Walnięcie Tygrysie walnięcie Smocze Powalenie Atakuje centralnie wrogów Prosty rozpryskowy atak Atak skierowany w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Siła Ataku %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Tąpnięcie Tąpnięcia Lwa Tąpnięcie Nosorożca Zwal z nóg kilku wrogów. Frontalny atak rozpryskowy Szansa na Omdlenie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Siła Ataku %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Szansa na Omdlenie %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Silne Ciało Żelazne Ciało Stalowe Ciało Zwiększa Obronę i pomaga wygrać Zwiększa Obronę Zmniejsza Szybkość Ruchu Nigdy nie upadasz STANDING_SKILL cheongeun 19 4 Obrona: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Szybkość Ruchu: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Silne Ciało Żelazne Ciało Stalowe Ciało Zwiększa Obronę i pomaga wygrać Zwiększa Obronę Zmniejsza Szybkość Ruchu Nigdy nie upadasz STANDING_SKILL cheongeun 19 4 Obrona: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Szybkość Ruchu: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Wir Miecza Taniec Miecza Cyklon Wiruj mieczem aby atakować wielu przeciwników Frontalny atak rozpryskowy Atak w kilka celów ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Siła Ataku %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Uderzenie Miecza Pchnięcie Miecza Rzut Miecza atakujesz wrogów bezpośrednio Atak z dystansu Atak skierowany na kilka celów Omdlenie Powala cel na ziemię ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Siła Ataku %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Szansa na Omdlenie %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Berserk Furia Szał Koncentracja tylko na ataku Zwiększa Szybkość Ataku Zwiększa Szybkość Ruchu Zwiększa otrzymywane obrażenia STANDING_SKILL jeongwi 3 4 Szybkość Ataku +%.0f%% 50 * SkillPoint Szybkość Ruchu +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Força do Golpe Onda de Choque Ataque Tsunami Ataca inimigos directamente. Ataque Residual Frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Poder de Ataque %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Ataque Destrutivo Garra do Tigre Garra do Dragão Ataca inimigos directamente. Ataque Residual Directo Ataque a Múltiplos Alvos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Poder de Ataque %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Terramoto Terramoto Leão Terramoto Rinoceronte Derruba vários inimigos. Ataque Residual Directo Probabilidade de Efeito Atordoante ATTACK_SKILL|STANDING_SKILL daejin 18 4 Poder de Ataque %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Probabilidade de Atordoamento %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Corpo Forte Corpo de Ferro Corpo de Aço Aumenta a Defesa e não cais ao chão. Aumenta a Defesa Reduz a Rapidez de Movimento Não cais ao chão STANDING_SKILL cheongeun 19 4 Defesa: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rapidez de Movimento: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Corpo Forte Corpo de Ferro Corpo de Aço Aumenta a Defesa e não cais ao chão. Aumenta a Defesa Reduz a Rapidez de Movimento Não cais ao chão STANDING_SKILL cheongeun 19 4 Defesa: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Rapidez de Movimento: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Espada Rotativa Espada Dançante Ciclone Gira a espada para atacares vários inimigos. Ataque Residual Frontal Ataque a Múltiplos Alvos ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Poder de Ataque %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Ataque de Espada Raio de Espada Tempestade de Espada Ataca inimigos directamente. Ataque de Longo Alcance Ataque a Múltiplos Alvos Probabilidade de Atordar Atira o alvo ao chão ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Poder de Ataque %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Probabilidade de Atordoar %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Raiva Fúria Cólera Concentras-te apenas no ataque. Aumenta a Rapidez de Ataque Aumenta a Rapidez de Movimento Aumenta o Dano Recebido STANDING_SKILL jeongwi 3 4 Rapidez de Ataque +%.0f%% 50 * SkillPoint Rapidez de Movimento +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Atacul Spiritului Unda de Soc Atac Tsunami Ataci duşmanii frontal. Atac de pătrundere frontal ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Atac %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Zdrobire Zdrobirea Tigrului Zdrobirea Dragonului Ataci dusmanii frontal. Atac de patrundere Atac asupra mai multor ţinte ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Atac %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Zdruncinare Zdruncinarea Leului Zdruncinarea Rinocerului Rasturnarea mai multor oponenti. Atac Direct Frontal Sansa de Confuzie ATTACK_SKILL|STANDING_SKILL daejin 18 4 Putere Atac %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Sansa Confuzie %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Corp Rezistent Corp de Fier Corp de Otel Apărarea ta se îmbunătăţeşte pentru un timp iar tu nu cazi la pământ. Îmbunătăţirea apărării Scade viteza de mişcare Nu cazi la pământ STANDING_SKILL cheongeun 19 4 Apărare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Viteză de mişcare: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Corp Rezistent Corp de Fier Corp de Otel Apărarea ta se îmbunătăţeşte pentru un timp iar tu nu cazi la pământ. Îmbunătăţirea apărării Scade viteza de mişcare Nu cazi la pământ STANDING_SKILL cheongeun 19 4 Apărare : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Viteză de mişcare: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Vartejul Sabiei Dansul Sabiei Ciclon Învârte sabia pentru a ataca mai mulţi duşmani. Atac pătrunzător Atac asupra mai multor ţinte ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Atac %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Atacul Sabiei Fulgerul Sabiei Traznetul Sabiei Ataca inamicii direct. Atac de Raza Lunga Atac pe tinte multiple Efect de Confuzie Arunca oponentul la pamant ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Putere Atac %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Sansa Confuzie %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Iures Furie Turbare Te concentrezi doar asupra atacului. Viteza de atac creşte Creşte viteza de mişcare Creşte expunerea la pagube STANDING_SKILL jeongwi 3 4 Viteza de atac +%.0f%% 50 * SkillPoint Viteza de mişcare +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Призрачный удар Силовая волна Цунами Прямая атака врагов. Зональная атака ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Сила атаки:%.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*STR + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*STR + CON)*SkillPoint
|
||||
17 WARRIOR Сильный удар Сильный удар тигра Сильный удар дракона Прямая атака врагов. Прямая зональная атака Атака нескольких целей ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Сила атаки: %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*STR + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*STR + 3*CON)*SkillPoint
|
||||
18 WARRIOR Удар ногой Львиный удар Удар носорога Сбивает с ног нескольких противников. Прямая зональная атака Шанс на головокружение ATTACK_SKILL|STANDING_SKILL daejin 18 4 Сила атаки %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Шанс на головокружение %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Сильное тело Железное тело Стальное тело Увеличение защиты Увеличение защиты Уменьшение скорости Вас невозможно сбить с ног STANDING_SKILL cheongeun 19 4 Защита: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Скорость передвижения: -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Сильное тело Железное тело Стальное тело Увеличение защиты Увеличение защиты Уменьшение скорости Вас невозможно сбить с ног STANDING_SKILL cheongeun 19 4 Защита: +%.0f 7+(40 + 0.2*str + 0.4*con)*k Скорость передвижения: -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Вращающийся меч Танцующий меч Циклон Атака нескольких врагов. Прямая зональная атака Атака нескольких целей ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Сила атаки: %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Взмах мечом Удар мечом Мастерский удар мечом Фронтальная атака. Дальняя атака Атака нескольких целей Головокружение Сбивает противника с ног ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Сила атаки %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Шанс на головокружение %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Берсерк Ярость Безумие Концентрация на атаке. Увеличение скорости атаки Увеличение скорости передвижения Увеличение получаемых повреждений STANDING_SKILL jeongwi 3 4 Скорость атаки: +%.0f%% 50 * SkillPoint Скорость передвижения: +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
16 WARRIOR Ruh Vuruşu Şok Dalgası Tsunami-saldırısı Düşmana doğrudan saldırı. Önden Sıçrama Saldırısı ATTACK_SKILL|CAN_CHANGE_DIRECTION|NEED_TARGET|WEAPON_LIMITATION SWORD|TWO_HANDED gigongcham 16 4 Saldırı Gücü %.0f-%.0f 2.3*MinATK + (MinATK*4 + 4*GÜÇ + CON)*SkillPoint 2.3*MaxATK + (MaxATK*4 + 4*GÜÇ + CON)*SkillPoint
|
||||
17 WARRIOR Şiddetli Vuruş Kaplan vuruşu Ejderha Vuruşu Düşmana doğrudan saldırı. Güçlü Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED gyeoksan 17 4 Saldırı Gücü %.0f-%.0f 2.3*MinATK + (3*MinATK + 4*GÜÇ + 3*CON)*SkillPoint 2.3*MaxATK + (3*MaxATK + 4*GÜÇ + 3*CON)*SkillPoint
|
||||
18 WARRIOR Güçlü Vuruş Aslan Vuruşu Rhino Vuruşu Birden çok düşmanı uzaklaştıran vuruş. Güçlü Sıçrama Saldırısı Bayılma olasılığı ATTACK_SKILL|STANDING_SKILL daejin 18 4 Saldırı Gücü %.0f-%.0f 2*MinATK + (2*MinATK + 2*DEX + 2*CON + 4*STR)*SkillPoint 2*MaxATK + (2*MaxATK + 2*DEX + 2*CON + 4*STR)*SkillPoint Bayılma şansı: %.0f%% (100 + 1000*SkillPoint/6)/10
|
||||
19 WARRIOR Güçlü Beden Demir Beden Çelik Beden Savunmayı arttırır ve kazanırsınız. Savunmayı arttırır Hareket Hızını Düşürür Asla düşmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hızı : -%.0f 1 + 9*SkillPoint
|
||||
19 WARRIOR Güçlü Beden Demir Beden Çelik Beden Savunmayı arttırır ve kazanırsınız. Savunmayı arttırır Hareket Hızını Düşürür Asla düşmez. STANDING_SKILL cheongeun 19 4 Savunma : +%.0f 7+(40 + 0.2*str + 0.4*con)*k Hareket Hızı : -%.0f -(0.375*SkillPoint)
|
||||
2 WARRIOR Kılıç Çevirme Kılıç Dansı Siklon Kılıcı çevirerek birden çok düşmana saldırma. Önden Sıçrama Saldırısı Çoklu Hedefe Saldırı ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED palbang 2 4 Saldırı gücü %.0f-%.0f 3*MinATK + (0.8*MinATK + STR*6 + DEX*2 + CON) * SkillPoint 3*MaxATK + (0.8*MaxATK + STR*6 + DEX*2 + CON) * SkillPoint
|
||||
20 WARRIOR Kılıç Darbesi Kılıç Yıldırımı Kılıç Fırlatmak Düşmana Doğrudan Saldırı. Uzun Menzilli Saldırı Çoklu Hedefe Saldırı Bayılma Hedefi indirir ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION SWORD|TWO_HANDED geompung 20 4 Saldırı Gücü %.0f-%.0f 2*minatk + (minatk + dex*3 + str*5 + con)*k 2*maxatk + (maxatk + dex*3 + str*5 + con)*k Bayılma şansı: %.0f%% (100+k*1000/6)/10
|
||||
3 WARRIOR Öfke Korkunç Öfke Çılgınlık Sadece Saldırıya konsantre olmak. Saldırı Hızını Arttırır Hareket Hızını Arttırır Alınan zararı artırır STANDING_SKILL jeongwi 3 4 Saldırı Hızı +%.0f%% 50 * SkillPoint Hareket Hızı +%.0f%% 20 * SkillPoint
|
||||
|
||||
@@ -1016,6 +1016,10 @@ class GameWindow(ui.ScriptWindow):
|
||||
messengerAddFriendQuestion.SetText2(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2)
|
||||
messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend))
|
||||
messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend))
|
||||
|
||||
if app.FIX_MESSENGER_ACTION_SYNC:
|
||||
messengerAddFriendQuestion.OnPressEscapeKey = ui.__mem_func__(self.OnDenyAddFriend) # ESC → deny
|
||||
|
||||
messengerAddFriendQuestion.Open()
|
||||
messengerAddFriendQuestion.name = name
|
||||
self.messengerAddFriendQuestion = messengerAddFriendQuestion
|
||||
@@ -2180,4 +2184,7 @@ class GameWindow(ui.ScriptWindow):
|
||||
|
||||
# END_OF_WEDDING
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def SkillClearCoolTime(self, slotIndex):
|
||||
self.interface.SkillClearCoolTime(slotIndex)
|
||||
|
||||
|
||||
@@ -305,10 +305,15 @@ class Interface(object):
|
||||
self.whisperDialogDict = {}
|
||||
self.privateShopAdvertisementBoardDict = {}
|
||||
|
||||
if app.FIX_MESSENGER_ACTION_SYNC:
|
||||
self.wndMessenger.InitializeHandler()
|
||||
|
||||
self.wndInventory.SetItemToolTip(self.tooltipItem)
|
||||
|
||||
if app.ENABLE_DRAGON_SOUL_SYSTEM:
|
||||
self.wndDragonSoul.SetItemToolTip(self.tooltipItem)
|
||||
self.wndDragonSoulRefine.SetItemToolTip(self.tooltipItem)
|
||||
|
||||
self.wndSafebox.SetItemToolTip(self.tooltipItem)
|
||||
self.wndCube.SetItemToolTip(self.tooltipItem)
|
||||
self.wndCubeResult.SetItemToolTip(self.tooltipItem)
|
||||
@@ -535,6 +540,11 @@ class Interface(object):
|
||||
def OnChangeCurrentSkill(self, skillSlotNumber):
|
||||
self.wndTaskBar.OnChangeCurrentSkill(skillSlotNumber)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def SkillClearCoolTime(self, slotIndex):
|
||||
self.wndCharacter.SkillClearCoolTime(slotIndex)
|
||||
self.wndTaskBar.SkillClearCoolTime(slotIndex)
|
||||
|
||||
def SelectMouseButtonEvent(self, dir, event):
|
||||
self.wndTaskBar.SelectMouseButtonEvent(dir, event)
|
||||
|
||||
@@ -564,7 +574,7 @@ class Interface(object):
|
||||
if app.ENABLE_DRAGON_SOUL_SYSTEM:
|
||||
self.wndDragonSoul.RefreshItemSlot()
|
||||
|
||||
def RefreshCharacter(self): ## Character 페이지의 얼굴, Inventory 페이지의 전신 그림 등의 Refresh
|
||||
def RefreshCharacter(self): ## Character <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, Inventory <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD> Refresh
|
||||
self.wndCharacter.RefreshCharacter()
|
||||
self.wndTaskBar.RefreshQuickSlot()
|
||||
|
||||
@@ -696,7 +706,7 @@ class Interface(object):
|
||||
def RemovePartyMember(self, pid):
|
||||
self.wndParty.RemovePartyMember(pid)
|
||||
|
||||
##!! 20061026.levites.퀘스트_위치_보정
|
||||
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
self.__ArrangeQuestButton()
|
||||
|
||||
def LinkPartyMember(self, pid, vid):
|
||||
@@ -711,7 +721,7 @@ class Interface(object):
|
||||
def ExitParty(self):
|
||||
self.wndParty.ExitParty()
|
||||
|
||||
##!! 20061026.levites.퀘스트_위치_보정
|
||||
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
self.__ArrangeQuestButton()
|
||||
|
||||
def PartyHealReady(self):
|
||||
@@ -874,7 +884,7 @@ class Interface(object):
|
||||
if True == self.wndChat.IsEditMode():
|
||||
self.wndChat.CloseChat()
|
||||
else:
|
||||
# 웹페이지가 열렸을때는 채팅 입력이 안됨
|
||||
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ȵ<EFBFBD>
|
||||
if self.wndWeb and self.wndWeb.IsShow():
|
||||
pass
|
||||
else:
|
||||
@@ -975,7 +985,7 @@ class Interface(object):
|
||||
else:
|
||||
self.wndExpandedTaskBar.Close()
|
||||
|
||||
# 용혼석
|
||||
# <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
|
||||
def DragonSoulActivate(self, deck):
|
||||
if app.ENABLE_DRAGON_SOUL_SYSTEM:
|
||||
self.wndDragonSoul.ActivateDragonSoulByExtern(deck)
|
||||
@@ -1046,7 +1056,7 @@ class Interface(object):
|
||||
if True == self.wndDragonSoulRefine.IsShow():
|
||||
self.wndDragonSoulRefine.Close()
|
||||
|
||||
# 용혼석 끝
|
||||
# <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><>
|
||||
|
||||
def ToggleGuildWindow(self):
|
||||
if not self.wndGuild.IsShow():
|
||||
@@ -1096,7 +1106,7 @@ class Interface(object):
|
||||
def OpenWebWindow(self, url):
|
||||
self.wndWeb.Open(url)
|
||||
|
||||
# 웹페이지를 열면 채팅을 닫는다
|
||||
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ݴ´<DDB4>
|
||||
self.wndChat.CloseChat()
|
||||
|
||||
# show GIFT
|
||||
@@ -1124,9 +1134,9 @@ class Interface(object):
|
||||
def SucceedCubeWork(self, itemVnum, count):
|
||||
self.wndCube.Clear()
|
||||
|
||||
print "큐브 제작 성공! [%d:%d]" % (itemVnum, count)
|
||||
print "ť<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>! [%d:%d]" % (itemVnum, count)
|
||||
|
||||
if 0: # 결과 메시지 출력은 생략 한다
|
||||
if 0: # <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>
|
||||
self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition())
|
||||
self.wndCubeResult.SetCubeResultItem(itemVnum, count)
|
||||
self.wndCubeResult.Open()
|
||||
@@ -1289,7 +1299,7 @@ class Interface(object):
|
||||
btn = uiWhisper.WhisperButton()
|
||||
|
||||
# QUEST_LETTER_IMAGE
|
||||
##!! 20061026.levites.퀘스트_이미지_교체
|
||||
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><EFBFBD>ü
|
||||
import item
|
||||
if "item"==iconType:
|
||||
item.SelectItem(int(iconName))
|
||||
@@ -1336,7 +1346,7 @@ class Interface(object):
|
||||
screenWidth = wndMgr.GetScreenWidth()
|
||||
screenHeight = wndMgr.GetScreenHeight()
|
||||
|
||||
##!! 20061026.levites.퀘스트_위치_보정
|
||||
##!! 20061026.levites.<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ_<EFBFBD><EFBFBD>ġ_<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if self.wndParty.IsShow():
|
||||
xPos = 100 + 30
|
||||
else:
|
||||
@@ -1390,8 +1400,8 @@ class Interface(object):
|
||||
def __InitWhisper(self):
|
||||
chat.InitWhisper(self)
|
||||
|
||||
## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수
|
||||
## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다.
|
||||
## ä<EFBFBD><EFBFBD>â<EFBFBD><EFBFBD> "<22><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
|
||||
def OpenWhisperDialogWithoutTarget(self):
|
||||
if not self.dlgWhisperWithoutTarget:
|
||||
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
|
||||
@@ -1408,7 +1418,7 @@ class Interface(object):
|
||||
self.dlgWhisperWithoutTarget.SetTop()
|
||||
self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog)
|
||||
|
||||
## 이름 없는 대화창에서 이름을 결정했을때 WhisperDialogDict에 창을 넣어주는 함수
|
||||
## <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WhisperDialogDict<EFBFBD><EFBFBD> â<><C3A2> <20>־<EFBFBD><D6BE>ִ<EFBFBD> <20>Լ<EFBFBD>
|
||||
def RegisterTemporaryWhisperDialog(self, name):
|
||||
if not self.dlgWhisperWithoutTarget:
|
||||
return
|
||||
@@ -1427,7 +1437,7 @@ class Interface(object):
|
||||
self.dlgWhisperWithoutTarget = None
|
||||
self.__CheckGameMaster(name)
|
||||
|
||||
## 캐릭터 메뉴의 1:1 대화 하기를 눌렀을때 이름을 가지고 바로 창을 여는 함수
|
||||
## ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEB4><EFBFBD> 1:1 <20><>ȭ <20>ϱ⸦ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
def OpenWhisperDialog(self, name):
|
||||
if not self.whisperDialogDict.has_key(name):
|
||||
dlg = self.__MakeWhisperDialog(name)
|
||||
@@ -1440,7 +1450,7 @@ class Interface(object):
|
||||
if 0 != btn:
|
||||
self.__DestroyWhisperButton(btn)
|
||||
|
||||
## 다른 캐릭터로부터 메세지를 받았을때 일단 버튼만 띄워 두는 함수
|
||||
## <EFBFBD>ٸ<EFBFBD> ij<><C4B3><EFBFBD>ͷκ<CDB7><CEBA><EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBE><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD> <20>δ<EFBFBD> <20>Լ<EFBFBD>
|
||||
def RecvWhisper(self, name):
|
||||
if not self.whisperDialogDict.has_key(name):
|
||||
btn = self.__FindWhisperButton(name)
|
||||
@@ -1459,7 +1469,7 @@ class Interface(object):
|
||||
def MakeWhisperButton(self, name):
|
||||
self.__MakeWhisperButton(name)
|
||||
|
||||
## 버튼을 눌렀을때 창을 여는 함수
|
||||
## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
def ShowWhisperDialog(self, btn):
|
||||
try:
|
||||
self.__MakeWhisperDialog(btn.name)
|
||||
@@ -1471,11 +1481,11 @@ class Interface(object):
|
||||
import dbg
|
||||
dbg.TraceError("interface.ShowWhisperDialog - Failed to find key")
|
||||
|
||||
## 버튼 초기화
|
||||
## <EFBFBD><EFBFBD>ư <20>ʱ<EFBFBD>ȭ
|
||||
self.__DestroyWhisperButton(btn)
|
||||
|
||||
## WhisperDialog 창에서 최소화 명령을 수행했을때 호출되는 함수
|
||||
## 창을 최소화 합니다.
|
||||
## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
|
||||
## â<EFBFBD><EFBFBD> <20>ּ<EFBFBD>ȭ <20>մϴ<D5B4>.
|
||||
def MinimizeWhisperDialog(self, name):
|
||||
|
||||
if 0 != name:
|
||||
@@ -1483,8 +1493,8 @@ class Interface(object):
|
||||
|
||||
self.CloseWhisperDialog(name)
|
||||
|
||||
## WhisperDialog 창에서 닫기 명령을 수행했을때 호출되는 함수
|
||||
## 창을 지웁니다.
|
||||
## WhisperDialog â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ǵ<EFBFBD> <20>Լ<EFBFBD>
|
||||
## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
def CloseWhisperDialog(self, name):
|
||||
|
||||
if 0 == name:
|
||||
@@ -1503,7 +1513,7 @@ class Interface(object):
|
||||
import dbg
|
||||
dbg.TraceError("interface.CloseWhisperDialog - Failed to find key")
|
||||
|
||||
## 버튼의 개수가 바뀌었을때 버튼을 재정렬 하는 함수
|
||||
## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>Լ<EFBFBD>
|
||||
def __ArrangeWhisperButton(self):
|
||||
|
||||
screenWidth = wndMgr.GetScreenWidth()
|
||||
@@ -1520,9 +1530,9 @@ class Interface(object):
|
||||
button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63))
|
||||
count += 1
|
||||
|
||||
## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수
|
||||
## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며
|
||||
## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다.
|
||||
## <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Whisper <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Լ<EFBFBD>
|
||||
## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><>ųʸ<C5B3><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
## <EFBFBD>̷<EFBFBD> <20><><EFBFBD><EFBFBD> ToolTip<69><70><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><>ư<EFBFBD>鿡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
def __FindWhisperButton(self, name):
|
||||
for button in self.whisperButtonList:
|
||||
if button.name == name:
|
||||
@@ -1530,7 +1540,7 @@ class Interface(object):
|
||||
|
||||
return 0
|
||||
|
||||
## 창을 만듭니다.
|
||||
## â<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
def __MakeWhisperDialog(self, name):
|
||||
dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog)
|
||||
dlgWhisper.BindInterface(self)
|
||||
@@ -1542,7 +1552,7 @@ class Interface(object):
|
||||
|
||||
return dlgWhisper
|
||||
|
||||
## 버튼을 만듭니다.
|
||||
## <EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
def __MakeWhisperButton(self, name):
|
||||
whisperButton = uiWhisper.WhisperButton()
|
||||
whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub")
|
||||
|
||||
@@ -105,30 +105,47 @@ def DefineSkillIndexDict():
|
||||
},
|
||||
}
|
||||
|
||||
def RegisterSkill(race, group, empire=0):
|
||||
|
||||
def RegisterSkill(race, group, empire = 0):
|
||||
DefineSkillIndexDict()
|
||||
|
||||
job = chr.RaceToJob(race)
|
||||
|
||||
## Character Skill
|
||||
if SKILL_INDEX_DICT.has_key(job):
|
||||
# Ensure group 0 exists (horse-only) when cooldown fix is on
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN and SKILL_INDEX_DICT.has_key(job):
|
||||
if not SKILL_INDEX_DICT[job].has_key(0):
|
||||
# Assassin has 140 as well; others only 137-139
|
||||
SKILL_INDEX_DICT[job][0] = (0, 0, 0, 0, 0, 0, 0, 0,
|
||||
137, 0, 138, 0, 139, 0) + ((140,) if job == JOB_ASSASSIN else ())
|
||||
|
||||
if SKILL_INDEX_DICT[job].has_key(group):
|
||||
|
||||
activeSkillList = SKILL_INDEX_DICT[job][group]
|
||||
|
||||
for i in xrange(len(activeSkillList)):
|
||||
skillIndex = activeSkillList[i]
|
||||
|
||||
## 7번 8번 스킬은 여기서 설정하면 안됨
|
||||
if i != 6 and i != 7:
|
||||
player.SetSkill(i+1, skillIndex)
|
||||
|
||||
supportSkillList = SKILL_INDEX_DICT[job]["SUPPORT"]
|
||||
## Support Skills (Always register regardless of skill group)
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
if SKILL_INDEX_DICT.has_key(job):
|
||||
supportSkillList = SKILL_INDEX_DICT[job].get("SUPPORT", ())
|
||||
|
||||
for i in xrange(len(supportSkillList)):
|
||||
player.SetSkill(i+100+1, supportSkillList[i])
|
||||
player.SetSkill(i + 100 + 1, supportSkillList[i])
|
||||
|
||||
## Character Skill
|
||||
if SKILL_INDEX_DICT.has_key(job):
|
||||
if SKILL_INDEX_DICT[job].has_key(group):
|
||||
activeSkillList = SKILL_INDEX_DICT[job][group]
|
||||
|
||||
if not app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
for i, idx in enumerate(activeSkillList):
|
||||
if i not in (6, 7): # keep skipping unused slots
|
||||
player.SetSkill(i + 1, idx)
|
||||
else:
|
||||
for i in xrange(len(activeSkillList)):
|
||||
skillIndex = activeSkillList[i]
|
||||
|
||||
## 7<><37> 8<><38> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>⼭ <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȵ<EFBFBD>
|
||||
if i != 6 and i != 7:
|
||||
player.SetSkill(i + 1, skillIndex)
|
||||
|
||||
supportSkillList = SKILL_INDEX_DICT[job]["SUPPORT"]
|
||||
|
||||
for i in xrange(len(supportSkillList)):
|
||||
player.SetSkill(i + 100 + 1, supportSkillList[i])
|
||||
|
||||
## Language Skill
|
||||
if 0 != empire:
|
||||
@@ -211,20 +228,20 @@ def __InitData():
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SPEEDUP_GREEN, "", "d:/ymir work/effect/etc/recuperation/drugup_green.mse")
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DXUP_PURPLE, "", "d:/ymir work/effect/etc/recuperation/drugup_purple.mse")
|
||||
|
||||
#자동물약 HP, SP
|
||||
#<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HP, SP
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_HPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_red.mse")
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_SPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_blue.mse")
|
||||
|
||||
#라마단 초승달의 반지(71135) 착용순간 발동 이펙트
|
||||
#<EFBFBD><EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD>(71135) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_RAMADAN_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item1.mse")
|
||||
|
||||
#할로윈 사탕 착용순간 발동 이펙트
|
||||
#<EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HALLOWEEN_CANDY_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item2.mse")
|
||||
|
||||
#행복의 반지 착용순간 발동 이펙트
|
||||
#<EFBFBD>ູ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HAPPINESS_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item3.mse")
|
||||
|
||||
#사랑의 팬던트 착용순간 발동 이펙트
|
||||
#<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LOVE_PENDANT_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item4.mse")
|
||||
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PENETRATE, "Bip01", "d:/ymir work/effect/hit/gwantong.mse")
|
||||
@@ -251,8 +268,8 @@ def __InitData():
|
||||
#chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SUCCESS, "", "season1/effect/success.mse")
|
||||
#chrmgr.RegisterCacheEffect(chrmgr.EFFECT_FAIL, "", "season1/effect/fail.mse")
|
||||
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") #레벨업 14일때 ( 독일전용 )
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#레벨업 15일때 ( 독일전용 )
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") #<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 15<31>϶<EFBFBD> ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
|
||||
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE1, "", "d:/ymir work/effect/hit/percent_damage1.mse")
|
||||
chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE2, "", "d:/ymir work/effect/hit/percent_damage2.mse")
|
||||
@@ -361,28 +378,28 @@ def __LoadGameEffect():
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+0, "Bip01", localeInfo.FN_GM_MARK)
|
||||
# END_OF_LOCALE
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## 중독
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## <EFBFBD>ߵ<EFBFBD>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+4, "", "d:/ymir work/effect/affect/slow.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+5, "Bip01 Head", "d:/ymir work/effect/etc/stun/stun_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+6, "", "d:/ymir work/effect/etc/ready/ready.mse")
|
||||
#chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+8, "", "d:/ymir work/guild/effect/10_construction.mse")
|
||||
#chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+9, "", "d:/ymir work/guild/effect/20_construction.mse")
|
||||
#chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+10, "", "d:/ymir work/guild/effect/20_upgrade.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## 천근추 (밑에도 있따-_-)
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## 자객 - 경공
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>ؿ<EFBFBD><D8BF><EFBFBD> <20>ֵ<EFBFBD>-_-)
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## <EFBFBD>ڰ<EFBFBD> - <20><><EFBFBD>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+19, "Bip01 R Finger2", "d:/ymir work/pc/sura/effect/gwigeom_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## 수라 - 공포
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## 수라 - 주마갑
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## 무당 - 호신
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## 무당 - 보호
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## 무당 - 쾌속
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20>ָ<EFBFBD><D6B8><EFBFBD>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - ȣ<><C8A3>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>ȣ
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD>
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+25, "", "d:/ymir work/pc/sura/effect/heuksin_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+26, "", "d:/ymir work/pc/sura/effect/muyeong_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+28, "Bip01", "d:/ymir work/effect/hit/blow_flame/flame_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+29, "Bip01 R Hand", "d:/ymir work/pc/shaman/effect/6gicheon_hand.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+30, "Bip01 L Hand", "d:/ymir work/pc/shaman/effect/jeungryeok_hand.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+32, "Bip01 Head", "d:/ymir work/pc/sura/effect/pabeop_loop.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## 천근추 (Fallen)
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Fallen)
|
||||
## 34 Polymoph
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+35, "", "d:/ymir work/effect/etc/guild_war_flag/flag_red.mse")
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+36, "", "d:/ymir work/effect/etc/guild_war_flag/flag_blue.mse")
|
||||
@@ -416,53 +433,53 @@ def __LoadGameEffect():
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_REFINED+20, "Bip01", "D:/ymir work/pc/common/effect/armor/armor-4-2-2.mse")
|
||||
|
||||
## FlyData
|
||||
effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## 노란색 (EXP)
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## 빨간색 (HP) 작은거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## 빨간색 (HP) 큰거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## 파란색 꼬리만 있는거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## 파란색 작은거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## 파란색 큰거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## 폭죽 1
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## 폭죽 2
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## 폭죽 3
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## 폭죽 4
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## 폭죽 5
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## 폭죽 6
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## 폭죽 X-Mas
|
||||
effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## 폭뢰격
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## 빨간색 매우 작은거
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## 무영진
|
||||
effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (EXP)
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP) ū<EFBFBD><EFBFBD>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## <EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD> ū<><C5AB>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 6
|
||||
effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> X-Mas
|
||||
effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
#########################################################################################
|
||||
## Emoticon
|
||||
EmoticonStr = "d:/ymir work/effect/etc/emoticon/"
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+0, "", EmoticonStr+"sweat.mse")
|
||||
net.RegisterEmoticonString("(황당)")
|
||||
net.RegisterEmoticonString("(Ȳ<EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+1, "", EmoticonStr+"money.mse")
|
||||
net.RegisterEmoticonString("(돈)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+2, "", EmoticonStr+"happy.mse")
|
||||
net.RegisterEmoticonString("(기쁨)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+3, "", EmoticonStr+"love_s.mse")
|
||||
net.RegisterEmoticonString("(좋아)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+4, "", EmoticonStr+"love_l.mse")
|
||||
net.RegisterEmoticonString("(사랑)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+5, "", EmoticonStr+"angry.mse")
|
||||
net.RegisterEmoticonString("(분노)")
|
||||
net.RegisterEmoticonString("(<EFBFBD>г<EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+6, "", EmoticonStr+"aha.mse")
|
||||
net.RegisterEmoticonString("(아하)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+7, "", EmoticonStr+"gloom.mse")
|
||||
net.RegisterEmoticonString("(우울)")
|
||||
net.RegisterEmoticonString("(<EFBFBD><EFBFBD><EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+8, "", EmoticonStr+"sorry.mse")
|
||||
net.RegisterEmoticonString("(죄송)")
|
||||
net.RegisterEmoticonString("(<EFBFBD>˼<EFBFBD>)")
|
||||
|
||||
chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+9, "", EmoticonStr+"!_mix_back.mse")
|
||||
net.RegisterEmoticonString("(!)")
|
||||
@@ -1128,7 +1145,7 @@ def __LoadGameShamanEx(race, path):
|
||||
#chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+10, "budong.msa")
|
||||
|
||||
START_INDEX = 0
|
||||
#skill.SKILL_EFFECT_COUNT 까지//
|
||||
#skill.SKILL_EFFECT_COUNT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
||||
for i in (1, 2, 3):
|
||||
END_STRING = ""
|
||||
if i != 0: END_STRING = "_%d" % (i+1)
|
||||
@@ -1335,7 +1352,7 @@ def LoadGuildBuildingList(filename):
|
||||
elif itemID == uiGuild.MATERIAL_PLYWOOD_ID:
|
||||
materialList[uiGuild.MATERIAL_PLYWOOD_INDEX] = count
|
||||
|
||||
## GuildSymbol 은 일반 NPC 들과 함께 등록한다.
|
||||
## GuildSymbol <EFBFBD><EFBFBD> <20>Ϲ<EFBFBD> NPC <20><><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
import chrmgr
|
||||
chrmgr.RegisterRaceSrcName(name, folderName)
|
||||
chrmgr.RegisterRaceName(vnum, name)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
SERVER_NAME = "Metin2"
|
||||
SERVER_NAME_TEST = "Test"
|
||||
SERVER_IP = "10.246.140.76"
|
||||
SERVER_IP = "10.122.201.77"
|
||||
SERVER_IP_TEST = "127.0.0.1"
|
||||
CH1_NAME = "CH1"
|
||||
CH2_NAME = "CH2"
|
||||
|
||||
@@ -1385,6 +1385,19 @@ class SlotWindow(Window):
|
||||
def SetSlotCoolTime(self, slotIndex, coolTime, elapsedTime = 0.0):
|
||||
wndMgr.SetSlotCoolTime(self.hWnd, slotIndex, coolTime, elapsedTime)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def StoreSlotCoolTime(self, key, slotIndex, coolTime, elapsedTime = 0.0):
|
||||
wndMgr.StoreSlotCoolTime(self.hWnd, key, slotIndex, coolTime, elapsedTime)
|
||||
|
||||
def RestoreSlotCoolTime(self, key):
|
||||
wndMgr.RestoreSlotCoolTime(self.hWnd, key)
|
||||
|
||||
def TransferSlotCoolTime(self, slotIndex1, slotIndex2):
|
||||
wndMgr.TransferSlotCoolTime(self.hWnd, slotIndex1, slotIndex2)
|
||||
|
||||
def ClearSlotCoolTime(self, slotIndex):
|
||||
wndMgr.ClearSlotCoolTime(self.hWnd, slotIndex)
|
||||
|
||||
def DisableSlot(self, slotIndex):
|
||||
wndMgr.DisableSlot(self.hWnd, slotIndex)
|
||||
|
||||
|
||||
@@ -50,7 +50,11 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
SUPPORT_PAGE_SLOT_COUNT = 12
|
||||
|
||||
PAGE_SLOT_COUNT = 12
|
||||
PAGE_HORSE = 2
|
||||
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
PAGE_HORSE = 3
|
||||
else:
|
||||
PAGE_HORSE = 2
|
||||
|
||||
SKILL_GROUP_NAME_DICT = {
|
||||
playerSettingModule.JOB_WARRIOR : { 1 : localeInfo.SKILL_GROUP_WARRIOR_1, 2 : localeInfo.SKILL_GROUP_WARRIOR_2, },
|
||||
@@ -131,6 +135,10 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.supportSkillPointValue = None
|
||||
self.skillGroupButton1 = None
|
||||
self.skillGroupButton2 = None
|
||||
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
self.skillGroupButton3 = None
|
||||
|
||||
self.activeSkillGroupName = None
|
||||
|
||||
self.guildNameSlot = None
|
||||
@@ -178,6 +186,10 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.supportSkillPointValue = self.GetChild("Support_Skill_Point_Value")
|
||||
self.skillGroupButton1 = self.GetChild("Skill_Group_Button_1")
|
||||
self.skillGroupButton2 = self.GetChild("Skill_Group_Button_2")
|
||||
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
self.skillGroupButton3 = self.GetChild("Skill_Group_Button_3")
|
||||
|
||||
self.activeSkillGroupName = self.GetChild("Active_Skill_Group_Name")
|
||||
|
||||
self.tabDict = {
|
||||
@@ -237,11 +249,12 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.skillGroupButton = (
|
||||
self.GetChild("Skill_Group_Button_1"),
|
||||
self.GetChild("Skill_Group_Button_2"),
|
||||
)
|
||||
) + ((self.GetChild("Skill_Group_Button_3"),) if app.FIX_HORSE_SKILLS_TAB else ())
|
||||
|
||||
|
||||
global SHOW_ONLY_ACTIVE_SKILL
|
||||
global HIDE_SUPPORT_SKILL_POINT
|
||||
|
||||
if SHOW_ONLY_ACTIVE_SKILL or HIDE_SUPPORT_SKILL_POINT:
|
||||
self.GetChild("Support_Skill_Point_Label").Hide()
|
||||
|
||||
@@ -253,6 +266,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.questScrollBar = self.GetChild("Quest_ScrollBar")
|
||||
self.questScrollBar.SetScrollEvent(ui.__mem_func__(self.OnQuestScroll))
|
||||
self.questSlot = self.GetChild("Quest_Slot")
|
||||
|
||||
for i in xrange(quest.QUEST_MAX_NUM):
|
||||
self.questSlot.HideSlotBaseImage(i)
|
||||
self.questSlot.SetCoverButton(i,\
|
||||
@@ -264,6 +278,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.questNameList = []
|
||||
self.questLastTimeList = []
|
||||
self.questLastCountList = []
|
||||
|
||||
for i in xrange(quest.QUEST_MAX_NUM):
|
||||
self.questNameList.append(self.GetChild("Quest_Name_0" + str(i)))
|
||||
self.questLastTimeList.append(self.GetChild("Quest_LastTime_0" + str(i)))
|
||||
@@ -284,7 +299,6 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
"d:/ymir work/ui/game/windows/btn_plus_down.sub")
|
||||
|
||||
def __SetEmotionSlot(self):
|
||||
|
||||
self.emotionToolTip = uiToolTip.ToolTip()
|
||||
|
||||
for slot in (self.soloEmotionSlot, self.dualEmotionSlot):
|
||||
@@ -302,6 +316,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
emotionIdx = slotIdx
|
||||
|
||||
slot = self.soloEmotionSlot
|
||||
|
||||
if slotIdx > 50:
|
||||
slot = self.dualEmotionSlot
|
||||
|
||||
@@ -314,16 +329,19 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
if app.IsPressed(app.DIK_LCONTROL):
|
||||
player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_EMOTION, slotIndex)
|
||||
|
||||
return
|
||||
|
||||
mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_EMOTION, slotIndex, slotIndex)
|
||||
|
||||
def __ClickEmotionSlot(self, slotIndex):
|
||||
print "click emotion"
|
||||
|
||||
if not slotIndex in emotion.EMOTION_DICT:
|
||||
return
|
||||
|
||||
print "check acting"
|
||||
|
||||
if player.IsActingEmotion():
|
||||
return
|
||||
|
||||
@@ -336,6 +354,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
if 0 == vid or vid == player.GetMainCharacterIndex() or chr.IsNPC(vid) or chr.IsEnemy(vid):
|
||||
import chat
|
||||
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EMOTION_CHOOSE_ONE)
|
||||
|
||||
return
|
||||
|
||||
command += " " + chr.GetNameByVID(vid)
|
||||
@@ -521,7 +540,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
except:
|
||||
#import exception
|
||||
#exception.Abort("CharacterWindow.RefreshStatus.BindObject")
|
||||
## 게임이 튕겨 버림
|
||||
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8> <20><><EFBFBD><EFBFBD>
|
||||
pass
|
||||
|
||||
self.__RefreshStatusPlusButtonList()
|
||||
@@ -595,25 +614,21 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
statusPlusButton.Hide()
|
||||
|
||||
def SelectSkill(self, skillSlotIndex):
|
||||
|
||||
mouseController = mouseModule.mouseController
|
||||
|
||||
if False == mouseController.isAttached():
|
||||
|
||||
srcSlotIndex = self.__RealSkillSlotToSourceSlot(skillSlotIndex)
|
||||
selectedSkillIndex = player.GetSkillIndex(srcSlotIndex)
|
||||
|
||||
if skill.CanUseSkill(selectedSkillIndex):
|
||||
|
||||
if app.IsPressed(app.DIK_LCONTROL):
|
||||
|
||||
player.RequestAddToEmptyLocalQuickSlot(player.SLOT_TYPE_SKILL, srcSlotIndex)
|
||||
|
||||
return
|
||||
|
||||
mouseController.AttachObject(self, player.SLOT_TYPE_SKILL, srcSlotIndex, selectedSkillIndex)
|
||||
|
||||
else:
|
||||
|
||||
mouseController.DeattachObject()
|
||||
|
||||
def SelectEmptySlot(self, SlotIndex):
|
||||
@@ -621,7 +636,6 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
## ToolTip
|
||||
def OverInItem(self, slotNumber):
|
||||
|
||||
if mouseModule.mouseController.isAttached():
|
||||
return
|
||||
|
||||
@@ -728,6 +742,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
def __GetStatMinusPoint(self):
|
||||
POINT_STAT_RESET_COUNT = 112
|
||||
|
||||
return player.GetStatus(POINT_STAT_RESET_COUNT)
|
||||
|
||||
def __OverInStatMinusButton(self, stat):
|
||||
@@ -761,6 +776,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
def OnPressEscapeKey(self):
|
||||
self.Close()
|
||||
|
||||
return True
|
||||
|
||||
def OnUpdate(self):
|
||||
@@ -771,20 +787,20 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
global SHOW_LIMIT_SUPPORT_SKILL_LIST
|
||||
|
||||
skillPage = self.skillPageDict[name]
|
||||
|
||||
startSlotIndex = skillPage.GetStartIndex()
|
||||
|
||||
if "ACTIVE" == name:
|
||||
if self.PAGE_HORSE == self.curSelectedSkillGroup:
|
||||
startSlotIndex += slotCount
|
||||
|
||||
getSkillType=skill.GetSkillType
|
||||
getSkillIndex=player.GetSkillIndex
|
||||
getSkillGrade=player.GetSkillGrade
|
||||
getSkillLevel=player.GetSkillLevel
|
||||
getSkillLevelUpPoint=skill.GetSkillLevelUpPoint
|
||||
getSkillMaxLevel=skill.GetSkillMaxLevel
|
||||
for i in xrange(slotCount+1):
|
||||
getSkillType = skill.GetSkillType
|
||||
getSkillIndex = player.GetSkillIndex
|
||||
getSkillGrade = player.GetSkillGrade
|
||||
getSkillLevel = player.GetSkillLevel
|
||||
getSkillLevelUpPoint = skill.GetSkillLevelUpPoint
|
||||
getSkillMaxLevel = skill.GetSkillMaxLevel
|
||||
|
||||
for i in xrange(slotCount + 1):
|
||||
slotIndex = i + startSlotIndex
|
||||
skillIndex = getSkillIndex(slotIndex)
|
||||
|
||||
@@ -798,7 +814,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
skillLevel = getSkillLevel(slotIndex)
|
||||
skillType = getSkillType(skillIndex)
|
||||
|
||||
## 승마 스킬 예외 처리
|
||||
## <EFBFBD>¸<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
if player.SKILL_INDEX_RIDING == skillIndex:
|
||||
if 1 == skillGrade:
|
||||
skillLevel += 19
|
||||
@@ -807,48 +823,124 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
elif 3 == skillGrade:
|
||||
skillLevel = 40
|
||||
|
||||
skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel-1, 0), skillLevel)
|
||||
skillPage.SetSkillSlotNew(slotIndex, skillIndex, max(skillLevel - 1, 0), skillLevel)
|
||||
skillPage.SetSlotCount(slotIndex, skillLevel)
|
||||
|
||||
## ACTIVE
|
||||
elif skill.SKILL_TYPE_ACTIVE == skillType:
|
||||
for j in xrange(skill.SKILL_GRADE_COUNT):
|
||||
realSlotIndex = self.__GetRealSkillSlot(j, slotIndex)
|
||||
|
||||
skillPage.SetSkillSlotNew(realSlotIndex, skillIndex, j, skillLevel)
|
||||
skillPage.SetCoverButton(realSlotIndex)
|
||||
|
||||
if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT-1):
|
||||
if (skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT - 1):
|
||||
skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
|
||||
elif (not self.__CanUseSkillNow()) or (skillGrade != j):
|
||||
skillPage.SetSlotCount(realSlotIndex, 0)
|
||||
skillPage.DisableCoverButton(realSlotIndex)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
if not player.IsSkillActive(slotIndex):
|
||||
skillPage.DeactivateSlot(realSlotIndex)
|
||||
|
||||
if player.IsSkillCoolTime(slotIndex) and skillGrade != j:
|
||||
skillPage.TransferSlotCoolTime(realSlotIndex, self.__GetRealSkillSlot(skillGrade, i))
|
||||
else:
|
||||
self.SkillClearCoolTime(realSlotIndex)
|
||||
else:
|
||||
skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
|
||||
|
||||
## 그외
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
# Check if this is the active slot
|
||||
# Grade 3 appears in slot 2, so check both conditions
|
||||
isActiveSlot = (skillGrade == j) or ((skillGrade == skill.SKILL_GRADE_COUNT) and j == (skill.SKILL_GRADE_COUNT - 1))
|
||||
|
||||
if player.IsSkillActive(slotIndex) and isActiveSlot:
|
||||
skillPage.ActivateSlot(realSlotIndex)
|
||||
else:
|
||||
skillPage.DeactivateSlot(realSlotIndex)
|
||||
else:
|
||||
if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
|
||||
realSlotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
|
||||
|
||||
skillPage.SetSkillSlot(realSlotIndex, skillIndex, skillLevel)
|
||||
skillPage.SetSlotCountNew(realSlotIndex, skillGrade, skillLevel)
|
||||
|
||||
if skill.CanUseSkill(skillIndex):
|
||||
skillPage.SetCoverButton(realSlotIndex)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
# Clear storage for horse skills at level 0 BEFORE restore runs
|
||||
if skillType == skill.SKILL_TYPE_HORSE and skillLevel == 0:
|
||||
player.ResetHorseSkillCoolTime(skillIndex, realSlotIndex)
|
||||
skillPage.SetSlotCoolTime(realSlotIndex, 0)
|
||||
|
||||
if player.IsSkillActive(slotIndex):
|
||||
skillPage.ActivateSlot(realSlotIndex)
|
||||
else:
|
||||
skillPage.DeactivateSlot(realSlotIndex)
|
||||
else:
|
||||
if not player.IsSkillActive(slotIndex):
|
||||
skillPage.DeactivateSlot(realSlotIndex)
|
||||
|
||||
skillPage.RefreshSlot()
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
self.__RestoreSlotCoolTime(skillPage)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def __RestoreSlotCoolTime(self, skillPage):
|
||||
restoreType = skill.SKILL_TYPE_NONE
|
||||
|
||||
if self.PAGE_HORSE == self.curSelectedSkillGroup:
|
||||
restoreType = skill.SKILL_TYPE_HORSE
|
||||
else:
|
||||
restoreType = skill.SKILL_TYPE_ACTIVE
|
||||
|
||||
skillPage.RestoreSlotCoolTime(restoreType)
|
||||
|
||||
def __ClearHorseSkillQuickSlots(self):
|
||||
HORSE_SKILL_SET = (137, 138, 139, 140)
|
||||
|
||||
quick_slot_per_page = 8 # two quick_slot windows * 4 slots
|
||||
quick_page_count = 4 # matches QUICKPAGE_NUMBER_FILENAME
|
||||
current_page = player.GetQuickPage()
|
||||
|
||||
for page in xrange(quick_page_count):
|
||||
player.SetQuickPage(page)
|
||||
|
||||
for local_slot in xrange(quick_slot_per_page):
|
||||
slotType, position = player.GetLocalQuickSlot(local_slot)
|
||||
|
||||
if slotType != player.SLOT_TYPE_SKILL:
|
||||
continue
|
||||
|
||||
skillIndex = player.GetSkillIndex(position)
|
||||
|
||||
if skillIndex in HORSE_SKILL_SET:
|
||||
player.RequestDeleteGlobalQuickSlot(page * quick_slot_per_page + local_slot)
|
||||
|
||||
player.SetQuickPage(current_page)
|
||||
|
||||
def RefreshSkill(self):
|
||||
|
||||
if self.isLoaded==0:
|
||||
if self.isLoaded == 0:
|
||||
return
|
||||
|
||||
if self.__IsChangedHorseRidingSkillLevel():
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
if not self.__CanUseHorseSkill():
|
||||
if self.curSelectedSkillGroup == self.PAGE_HORSE:
|
||||
self.__SelectSkillGroup(0) # fall back to first active tab
|
||||
|
||||
self.__ClearHorseSkillQuickSlots() # remove horse skills from taskbar
|
||||
|
||||
self.RefreshCharacter()
|
||||
|
||||
return
|
||||
|
||||
|
||||
global SHOW_ONLY_ACTIVE_SKILL
|
||||
|
||||
if SHOW_ONLY_ACTIVE_SKILL:
|
||||
self.__RefreshSkillPage("ACTIVE", self.ACTIVE_PAGE_SLOT_COUNT)
|
||||
else:
|
||||
@@ -858,12 +950,11 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
self.RefreshSkillPlusButtonList()
|
||||
|
||||
def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint):
|
||||
|
||||
## 스킬이 있으면
|
||||
## <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if 0 == skillIndex:
|
||||
return False
|
||||
|
||||
## 레벨업 조건을 만족한다면
|
||||
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4>
|
||||
if not skill.CanLevelUpSkill(skillIndex, skillLevel):
|
||||
return False
|
||||
|
||||
@@ -871,6 +962,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
def __RefreshSkillPlusButton(self, name):
|
||||
global HIDE_SUPPORT_SKILL_POINT
|
||||
|
||||
if HIDE_SUPPORT_SKILL_POINT and "SUPPORT" == name:
|
||||
return
|
||||
|
||||
@@ -878,11 +970,13 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
slotWindow.HideAllSlotButton()
|
||||
|
||||
slotStatType = self.skillPageStatDict[name]
|
||||
|
||||
if 0 == slotStatType:
|
||||
return
|
||||
|
||||
statPoint = player.GetStatus(slotStatType)
|
||||
startSlotIndex = slotWindow.GetStartIndex()
|
||||
|
||||
if "HORSE" == name:
|
||||
startSlotIndex += self.ACTIVE_PAGE_SLOT_COUNT
|
||||
|
||||
@@ -904,7 +998,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
slotWindow.ShowSlotButton(self.__GetETCSkillRealSlotIndex(slotIndex))
|
||||
|
||||
else:
|
||||
if "SUPPORT" == name:
|
||||
if "SUPPORT" == name:
|
||||
if not SHOW_LIMIT_SUPPORT_SKILL_LIST or skillIndex in SHOW_LIMIT_SUPPORT_SKILL_LIST:
|
||||
if self.CanShowPlusButton(skillIndex, skillLevel, statPoint):
|
||||
slotWindow.ShowSlotButton(slotIndex)
|
||||
@@ -914,7 +1008,6 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
|
||||
def RefreshSkillPlusButtonList(self):
|
||||
|
||||
if self.isLoaded==0:
|
||||
return
|
||||
|
||||
@@ -933,6 +1026,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
except:
|
||||
import exception
|
||||
|
||||
exception.Abort("CharacterWindow.RefreshSkillPlusButtonList.BindObject")
|
||||
|
||||
def RefreshSkillPlusPointLabel(self):
|
||||
@@ -979,10 +1073,9 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
mouseModule.mouseController.DeattachObject()
|
||||
|
||||
## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다.
|
||||
## 매우 불합리. 구조 자체를 개선해야 할듯.
|
||||
## FIXME : <EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
|
||||
## <EFBFBD>ſ<EFBFBD> <20><><EFBFBD>ո<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ҵ<EFBFBD>.
|
||||
def OnUseSkill(self, slotIndex, coolTime):
|
||||
|
||||
skillIndex = player.GetSkillIndex(slotIndex)
|
||||
skillType = skill.GetSkillType(skillIndex)
|
||||
|
||||
@@ -996,32 +1089,81 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
for slotWindow in self.skillPageDict.values():
|
||||
if slotWindow.HasSlot(slotIndex):
|
||||
slotWindow.SetSlotCoolTime(slotIndex, coolTime)
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
slotWindow.StoreSlotCoolTime(skillType, slotIndex, coolTime)
|
||||
self.__RestoreSlotCoolTime(slotWindow)
|
||||
else:
|
||||
slotWindow.SetSlotCoolTime(slotIndex, coolTime)
|
||||
|
||||
return
|
||||
|
||||
def OnActivateSkill(self, slotIndex):
|
||||
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
skillIndex = player.GetSkillIndex(slotIndex)
|
||||
skillType = skill.GetSkillType(skillIndex)
|
||||
|
||||
## ACTIVE
|
||||
if skill.SKILL_TYPE_ACTIVE == skillType:
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
## ETC
|
||||
else:
|
||||
slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
|
||||
else:
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
|
||||
for slotWindow in self.skillPageDict.values():
|
||||
if slotWindow.HasSlot(slotIndex):
|
||||
slotWindow.ActivateSlot(slotIndex)
|
||||
|
||||
return
|
||||
|
||||
def OnDeactivateSkill(self, slotIndex):
|
||||
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
skillIndex = player.GetSkillIndex(slotIndex)
|
||||
skillType = skill.GetSkillType(skillIndex)
|
||||
|
||||
## ACTIVE
|
||||
if skill.SKILL_TYPE_ACTIVE == skillType:
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
## ETC
|
||||
else:
|
||||
slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
|
||||
else:
|
||||
skillGrade = player.GetSkillGrade(slotIndex)
|
||||
slotIndex = self.__GetRealSkillSlot(skillGrade, slotIndex)
|
||||
|
||||
for slotWindow in self.skillPageDict.values():
|
||||
if slotWindow.HasSlot(slotIndex):
|
||||
slotWindow.DeactivateSlot(slotIndex)
|
||||
|
||||
return
|
||||
|
||||
def __ShowJobToolTip(self):
|
||||
self.toolTipJob.ShowToolTip()
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def SkillClearCoolTime(self, slotIndex):
|
||||
skillIndex = player.GetSkillIndex(slotIndex)
|
||||
|
||||
if skillIndex < 1:
|
||||
return
|
||||
|
||||
skillType = skill.GetSkillType(skillIndex)
|
||||
|
||||
## ACTIVE
|
||||
# Map to the correct visual slot based on skill type
|
||||
if skill.SKILL_TYPE_ACTIVE == skillType:
|
||||
slotIndex = self.__GetRealSkillSlot(player.GetSkillGrade(slotIndex), slotIndex)
|
||||
else:
|
||||
slotIndex = self.__GetETCSkillRealSlotIndex(slotIndex)
|
||||
|
||||
for slotWindow in self.skillPageDict.values():
|
||||
if slotWindow.HasSlot(slotIndex):
|
||||
slotWindow.SetSlotCoolTime(slotIndex, 0)
|
||||
|
||||
def __HideJobToolTip(self):
|
||||
self.toolTipJob.HideToolTip()
|
||||
|
||||
@@ -1037,6 +1179,7 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
jobInfoData=localeInfo.JOBINFO_DATA_LIST[mainJob][subJob]
|
||||
except IndexError:
|
||||
print "uiCharacter.CharacterWindow.__SetJobText(mainJob=%d, subJob=%d)" % (mainJob, subJob)
|
||||
|
||||
return
|
||||
|
||||
self.toolTipJob.AutoAppendTextLine(jobInfoTitle)
|
||||
@@ -1105,18 +1248,20 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
## GroupName
|
||||
self.__SetSkillGroupName(race, group)
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
self.__SetSkillSlotData(race, group, empire)
|
||||
|
||||
## Skill
|
||||
if 0 == group:
|
||||
self.__SelectSkillGroup(0)
|
||||
|
||||
else:
|
||||
self.__SetSkillSlotData(race, group, empire)
|
||||
if not app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
self.__SetSkillSlotData(race, group, empire)
|
||||
|
||||
if self.__CanUseHorseSkill():
|
||||
self.__SelectSkillGroup(0)
|
||||
|
||||
def __SetSkillGroupName(self, race, group):
|
||||
|
||||
job = chr.RaceToJob(race)
|
||||
|
||||
if not self.SKILL_GROUP_NAME_DICT.has_key(job):
|
||||
@@ -1127,27 +1272,43 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
if 0 == group:
|
||||
self.skillGroupButton1.SetText(nameList[1])
|
||||
self.skillGroupButton2.SetText(nameList[2])
|
||||
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
if self.__CanUseHorseSkill():
|
||||
self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE)
|
||||
self.skillGroupButton3.Show()
|
||||
self.skillGroupButton3.SetPosition(95, 2)
|
||||
else:
|
||||
self.skillGroupButton3.Hide()
|
||||
|
||||
self.skillGroupButton1.Show()
|
||||
self.skillGroupButton2.Show()
|
||||
self.activeSkillGroupName.Hide()
|
||||
|
||||
else:
|
||||
|
||||
if self.__CanUseHorseSkill():
|
||||
self.activeSkillGroupName.Hide()
|
||||
self.skillGroupButton1.SetText(nameList.get(group, "Noname"))
|
||||
self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE)
|
||||
self.skillGroupButton1.Show()
|
||||
self.skillGroupButton2.Show()
|
||||
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
self.skillGroupButton3.SetText(localeInfo.SKILL_GROUP_HORSE)
|
||||
self.skillGroupButton1.Show()
|
||||
self.skillGroupButton2.Hide()
|
||||
self.skillGroupButton3.Show()
|
||||
self.skillGroupButton3.SetPosition(50, 2)
|
||||
else:
|
||||
self.skillGroupButton2.SetText(localeInfo.SKILL_GROUP_HORSE)
|
||||
self.skillGroupButton1.Show()
|
||||
self.skillGroupButton2.Show()
|
||||
else:
|
||||
self.activeSkillGroupName.SetText(nameList.get(group, "Noname"))
|
||||
self.activeSkillGroupName.Show()
|
||||
self.skillGroupButton1.Hide()
|
||||
self.skillGroupButton2.Hide()
|
||||
|
||||
def __SetSkillSlotData(self, race, group, empire=0):
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
self.skillGroupButton3.Hide()
|
||||
|
||||
def __SetSkillSlotData(self, race, group, empire=0):
|
||||
## SkillIndex
|
||||
playerSettingModule.RegisterSkill(race, group, empire)
|
||||
|
||||
@@ -1157,19 +1318,42 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
## Refresh
|
||||
self.RefreshSkill()
|
||||
|
||||
def __SelectSkillGroup(self, index):
|
||||
for btn in self.skillGroupButton:
|
||||
btn.SetUp()
|
||||
self.skillGroupButton[index].Down()
|
||||
if app.FIX_HORSE_SKILLS_TAB:
|
||||
def __SelectSkillGroup(self, pageIndex, (PAGE_SKILL_1, PAGE_SKILL_2, PAGE_SKILL_HORSE) = range(3)):
|
||||
for pageButton in self.skillGroupButton:
|
||||
pageButton.SetUp()
|
||||
|
||||
if self.__CanUseHorseSkill():
|
||||
if 0 == index:
|
||||
index = net.GetMainActorSkillGroup()-1
|
||||
elif 1 == index:
|
||||
index = self.PAGE_HORSE
|
||||
self.skillGroupButton[pageIndex].Down()
|
||||
|
||||
self.curSelectedSkillGroup = index
|
||||
self.__SetSkillSlotData(net.GetMainActorRace(), index+1, net.GetMainActorEmpire())
|
||||
if pageIndex in (PAGE_SKILL_1, PAGE_SKILL_2):
|
||||
skillGroupIndex = net.GetMainActorSkillGroup()
|
||||
|
||||
if bool(skillGroupIndex):
|
||||
(tmpCurSkillGroup, tmpSkillGroup) = (skillGroupIndex - 1, skillGroupIndex)
|
||||
else:
|
||||
(tmpCurSkillGroup, tmpSkillGroup) = (pageIndex, pageIndex + 1)
|
||||
|
||||
self.curSelectedSkillGroup = tmpCurSkillGroup
|
||||
self.__SetSkillSlotData(net.GetMainActorRace(), tmpSkillGroup, net.GetMainActorEmpire())
|
||||
elif pageIndex == PAGE_SKILL_HORSE and self.__CanUseHorseSkill():
|
||||
self.curSelectedSkillGroup = self.PAGE_HORSE
|
||||
|
||||
self.RefreshSkill()
|
||||
else:
|
||||
def __SelectSkillGroup(self, index):
|
||||
for btn in self.skillGroupButton:
|
||||
btn.SetUp()
|
||||
|
||||
self.skillGroupButton[index].Down()
|
||||
|
||||
if self.__CanUseHorseSkill():
|
||||
if 0 == index:
|
||||
index = net.GetMainActorSkillGroup() - 1
|
||||
elif 1 == index:
|
||||
index = self.PAGE_HORSE
|
||||
|
||||
self.curSelectedSkillGroup = index
|
||||
self.__SetSkillSlotData(net.GetMainActorRace(), index + 1, net.GetMainActorEmpire())
|
||||
|
||||
def __CanUseSkillNow(self):
|
||||
if 0 == net.GetMainActorSkillGroup():
|
||||
@@ -1178,7 +1362,6 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
return True
|
||||
|
||||
def __CanUseHorseSkill(self):
|
||||
|
||||
slotIndex = player.GetSkillSlotIndex(player.SKILL_INDEX_RIDING)
|
||||
|
||||
if not slotIndex:
|
||||
@@ -1186,12 +1369,33 @@ class CharacterWindow(ui.ScriptWindow):
|
||||
|
||||
grade = player.GetSkillGrade(slotIndex)
|
||||
level = player.GetSkillLevel(slotIndex)
|
||||
|
||||
if level < 0:
|
||||
level *= -1
|
||||
if grade >= 1 and level >= 1:
|
||||
return True
|
||||
|
||||
return False
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
# Map to UI-displayed riding level (matches __RefreshSkillPage logic)
|
||||
# grade 1: base 1..20 shown as 20..39 (offset +19)
|
||||
# grade 2: base 1..10 shown as 30..39 (offset +29)
|
||||
# grade 3: shown as 40
|
||||
effective = 0
|
||||
|
||||
if grade >= 3:
|
||||
effective = 40
|
||||
elif grade == 2:
|
||||
effective = level + 29
|
||||
elif grade == 1:
|
||||
effective = level + 19
|
||||
else:
|
||||
effective = level
|
||||
|
||||
# Require displayed riding level >= 21 to enable the horse page
|
||||
return effective >= 21
|
||||
else:
|
||||
if grade >= 1 and level >= 1:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def __IsChangedHorseRidingSkillLevel(self):
|
||||
ret = False
|
||||
|
||||
@@ -13,7 +13,7 @@ import uiRefine
|
||||
import uiAttachMetin
|
||||
import uiPickMoney
|
||||
import uiCommon
|
||||
import uiPrivateShopBuilder # 개인상점 열동안 ItemMove 방지
|
||||
import uiPrivateShopBuilder # <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ItemMove <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
import localeInfo
|
||||
import constInfo
|
||||
import ime
|
||||
@@ -41,7 +41,7 @@ class CostumeWindow(ui.ScriptWindow):
|
||||
ui.ScriptWindow.__init__(self)
|
||||
|
||||
self.isLoaded = 0
|
||||
self.wndInventory = wndInventory;
|
||||
self.wndInventory = wndInventory
|
||||
|
||||
self.__LoadWindow()
|
||||
|
||||
@@ -113,7 +113,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
|
||||
ui.ScriptWindow.__init__(self)
|
||||
|
||||
self.isLoaded = 0
|
||||
self.wndInventory = wndInventory;
|
||||
self.wndInventory = wndInventory
|
||||
|
||||
self.wndBeltInventoryLayer = None
|
||||
self.wndBeltInventorySlot = None
|
||||
@@ -156,7 +156,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
|
||||
if localeInfo.IsARABIC() == 0:
|
||||
self.AdjustPositionAndSize()
|
||||
|
||||
## 현재 인벤토리 위치를 기준으로 BASE 위치를 계산, 리턴.. 숫자 하드코딩하기 정말 싫지만 방법이 없다..
|
||||
## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA>丮 <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BASE <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
def GetBasePosition(self):
|
||||
x, y = self.wndInventory.GetGlobalPosition()
|
||||
return x - 148, y + 241
|
||||
@@ -169,7 +169,7 @@ class BeltInventoryWindow(ui.ScriptWindow):
|
||||
self.SetSize(self.ORIGINAL_WIDTH, self.GetHeight())
|
||||
|
||||
else:
|
||||
self.SetPosition(bx + 138, by);
|
||||
self.SetPosition(bx + 138, by)
|
||||
self.SetSize(10, self.GetHeight())
|
||||
|
||||
def __LoadWindow(self):
|
||||
@@ -251,13 +251,13 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
|
||||
sellingSlotNumber = -1
|
||||
isLoaded = 0
|
||||
isOpenedCostumeWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 코스츔이 열려있었는지 여부-_-; 네이밍 ㅈㅅ
|
||||
isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ
|
||||
isOpenedCostumeWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD>丮 <20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
isOpenedBeltWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD>丮 <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
def __init__(self):
|
||||
ui.ScriptWindow.__init__(self)
|
||||
|
||||
self.isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ
|
||||
self.isOpenedBeltWindowWhenClosingInventory = 0 # <EFBFBD>κ<EFBFBD><EFBFBD>丮 <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; <20><><EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
self.__LoadWindow()
|
||||
|
||||
@@ -269,11 +269,11 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
|
||||
ui.ScriptWindow.Show(self)
|
||||
|
||||
# 인벤토리를 닫을 때 코스츔이 열려있었다면 인벤토리를 열 때 코스츔도 같이 열도록 함.
|
||||
# <EFBFBD>κ<EFBFBD><EFBFBD>丮<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ٸ<EFBFBD> <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
|
||||
if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume:
|
||||
self.wndCostume.Show()
|
||||
|
||||
# 인벤토리를 닫을 때 벨트 인벤토리가 열려있었다면 같이 열도록 함.
|
||||
# <EFBFBD>κ<EFBFBD><EFBFBD>丮<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
|
||||
if self.wndBelt:
|
||||
self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory)
|
||||
|
||||
@@ -439,11 +439,11 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
self.tooltipItem.HideToolTip()
|
||||
|
||||
if self.wndCostume:
|
||||
self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # 인벤토리 창이 닫힐 때 코스츔이 열려 있었는가?
|
||||
self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # <EFBFBD>κ<EFBFBD><EFBFBD>丮 â<><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>°<EFBFBD>?
|
||||
self.wndCostume.Close()
|
||||
|
||||
if self.wndBelt:
|
||||
self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # 인벤토리 창이 닫힐 때 벨트 인벤토리도 열려 있었는가?
|
||||
self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # <EFBFBD>κ<EFBFBD><EFBFBD>丮 â<><C3A2> <20><><EFBFBD><EFBFBD> <20><> <20><>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE>°<EFBFBD>?
|
||||
print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory
|
||||
self.wndBelt.Close()
|
||||
|
||||
@@ -508,7 +508,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE)
|
||||
self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney))
|
||||
self.dlgPickMoney.Open(curMoney)
|
||||
self.dlgPickMoney.SetMax(7) # 인벤토리 990000 제한 버그 수정
|
||||
self.dlgPickMoney.SetMax(7) # <EFBFBD>κ<EFBFBD><EFBFBD>丮 990000 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
def OnPickMoney(self, money):
|
||||
mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money)
|
||||
@@ -533,7 +533,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
|
||||
|
||||
itemCount = getItemCount(slotNumber)
|
||||
# itemCount == 0이면 소켓을 비운다.
|
||||
# itemCount == 0<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if 0 == itemCount:
|
||||
self.wndItem.ClearSlot(i)
|
||||
continue
|
||||
@@ -543,19 +543,19 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
itemVnum = getItemVNum(slotNumber)
|
||||
setItemVNum(i, itemVnum, itemCount)
|
||||
|
||||
## 자동물약 (HP: #72723 ~ #72726, SP: #72727 ~ #72730) 특수처리 - 아이템인데도 슬롯에 활성화/비활성화 표시를 위한 작업임 - [hyo]
|
||||
## <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (HP: #72723 ~ #72726, SP: #72727 ~ #72730) Ư<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD> - <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(itemVnum):
|
||||
# metinSocket - [0] : 활성화 여부, [1] : 사용한 양, [2] : 최대 용량
|
||||
# metinSocket - [0] : Ȱ<EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>, [1] : <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, [2] : <EFBFBD>ִ<EFBFBD> <20>뷮
|
||||
metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)]
|
||||
|
||||
if slotNumber >= player.INVENTORY_PAGE_SIZE:
|
||||
slotNumber -= player.INVENTORY_PAGE_SIZE
|
||||
if slotNumber >= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex:
|
||||
slotNumber -= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex
|
||||
|
||||
isActivated = 0 != metinSocket[0]
|
||||
|
||||
if isActivated:
|
||||
self.wndItem.ActivateSlot(slotNumber)
|
||||
potionType = 0;
|
||||
potionType = 0
|
||||
if constInfo.IS_AUTO_POTION_HP(itemVnum):
|
||||
potionType = player.AUTO_POTION_TYPE_HP
|
||||
elif constInfo.IS_AUTO_POTION_SP(itemVnum):
|
||||
@@ -614,7 +614,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
def SellItem(self):
|
||||
if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber):
|
||||
if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber):
|
||||
## 용혼석도 팔리게 하는 기능 추가하면서 인자 type 추가
|
||||
## <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȸ<EFBFBD><C8B8><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD> <20>߰<EFBFBD><DFB0>ϸ鼭 <20><><EFBFBD><EFBFBD> type <EFBFBD>߰<EFBFBD>
|
||||
net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY)
|
||||
snd.PlaySound("sound/ui/money.wav")
|
||||
self.OnCloseQuestionDialog()
|
||||
@@ -764,10 +764,10 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
else:
|
||||
#snd.PlaySound("sound/ui/drop.wav")
|
||||
|
||||
## 이동시킨 곳이 장착 슬롯일 경우 아이템을 사용해서 장착 시킨다 - [levites]
|
||||
## <EFBFBD>̵<EFBFBD><EFBFBD><EFBFBD>Ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2> - [levites]
|
||||
if player.IsEquipmentSlot(dstItemSlotPos):
|
||||
|
||||
## 들고 있는 아이템이 장비일때만
|
||||
## <EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
|
||||
if item.IsEquipmentVID(srcItemVID):
|
||||
self.__UseItem(srcItemSlotPos)
|
||||
|
||||
@@ -786,7 +786,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
self.sellingSlotitemCount = itemCount
|
||||
|
||||
item.SelectItem(itemIndex)
|
||||
## 안티 플레그 검사 빠져서 추가
|
||||
## <EFBFBD><EFBFBD>Ƽ <20>÷<EFBFBD><C3B7><EFBFBD> <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
## 20140220
|
||||
if item.IsAntiFlag(item.ANTIFLAG_SELL):
|
||||
popup = uiCommon.PopupDialog()
|
||||
@@ -932,7 +932,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
|
||||
|
||||
def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos):
|
||||
"다른 아이템에 사용할 수 있는 아이템인가?"
|
||||
"<EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?"
|
||||
|
||||
if item.IsRefineScroll(srcItemVNum):
|
||||
return True
|
||||
@@ -951,7 +951,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
return False
|
||||
|
||||
def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
|
||||
"대상 아이템에 사용할 수 있는가?"
|
||||
"<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ°<D6B4>?"
|
||||
|
||||
if srcSlotPos == dstSlotPos:
|
||||
return False
|
||||
@@ -992,7 +992,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
return True
|
||||
elif "USE_PUT_INTO_ACCESSORY_SOCKET" == useType:
|
||||
if self.__CanPutAccessorySocket(dstSlotPos, srcItemVNum):
|
||||
return TRUE;
|
||||
return TRUE
|
||||
elif "USE_PUT_INTO_BELT_SOCKET" == useType:
|
||||
dstItemVNum = player.GetItemIndex(dstSlotPos)
|
||||
print "USE_PUT_INTO_BELT_SOCKET", srcItemVNum, dstItemVNum
|
||||
@@ -1158,7 +1158,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
self.OnCloseQuestionDialog()
|
||||
|
||||
def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos):
|
||||
# 개인상점 열고 있는 동안 아이템 사용 방지
|
||||
# <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if uiPrivateShopBuilder.IsBuildingPrivateShop():
|
||||
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
|
||||
return
|
||||
@@ -1166,7 +1166,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos)
|
||||
|
||||
def __SendUseItemPacket(self, slotPos):
|
||||
# 개인상점 열고 있는 동안 아이템 사용 방지
|
||||
# <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if uiPrivateShopBuilder.IsBuildingPrivateShop():
|
||||
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
|
||||
return
|
||||
@@ -1174,7 +1174,7 @@ class InventoryWindow(ui.ScriptWindow):
|
||||
net.SendItemUsePacket(slotPos)
|
||||
|
||||
def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount):
|
||||
# 개인상점 열고 있는 동안 아이템 사용 방지
|
||||
# <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if uiPrivateShopBuilder.IsBuildingPrivateShop():
|
||||
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
|
||||
return
|
||||
|
||||
@@ -42,6 +42,7 @@ class MessengerItem(ui.Window):
|
||||
|
||||
def SetName(self, name):
|
||||
self.name = name
|
||||
|
||||
if name:
|
||||
self.text.SetText(name)
|
||||
self.SetSize(20 + 6*len(name) + 4, 16)
|
||||
@@ -377,6 +378,16 @@ class MessengerWindow(ui.ScriptWindow):
|
||||
self.__AddGroup()
|
||||
messenger.RefreshGuildMember()
|
||||
|
||||
if app.FIX_MESSENGER_ACTION_SYNC:
|
||||
# NEW: Separate initialization from visibility
|
||||
def InitializeHandler(self):
|
||||
"""Load UI and register packet handlers without showing window"""
|
||||
if self.isLoaded == 0:
|
||||
self.__LoadWindow()
|
||||
self.OnRefreshList()
|
||||
self.OnResizeDialog()
|
||||
self.isLoaded = 1
|
||||
|
||||
def Show(self):
|
||||
if self.isLoaded==0:
|
||||
self.isLoaded=1
|
||||
@@ -390,7 +401,7 @@ class MessengerWindow(ui.ScriptWindow):
|
||||
def __LoadWindow(self):
|
||||
|
||||
pyScrLoader = ui.PythonScriptLoader()
|
||||
pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py")
|
||||
pyScrLoader.LoadScriptFile(self, "UIScript/MessengerWindow.py")
|
||||
|
||||
try:
|
||||
self.board = self.GetChild("board")
|
||||
@@ -669,6 +680,12 @@ class MessengerWindow(ui.ScriptWindow):
|
||||
self.selectedItem.OnRemove()
|
||||
self.selectedItem.UnSelect()
|
||||
self.selectedItem = None
|
||||
|
||||
if app.FIX_MESSENGER_ACTION_SYNC:
|
||||
self.whisperButton.Disable()
|
||||
self.mobileButton.Disable()
|
||||
self.removeButton.Disable()
|
||||
|
||||
self.OnRefreshList()
|
||||
|
||||
self.OnCloseQuestionDialog()
|
||||
@@ -770,7 +787,27 @@ class MessengerWindow(ui.ScriptWindow):
|
||||
|
||||
def OnRemoveList(self, groupIndex, key):
|
||||
group = self.groupList[groupIndex]
|
||||
group.RemoveMember(group.FindMember(key))
|
||||
|
||||
if app.FIX_MESSENGER_ACTION_SYNC:
|
||||
member = group.FindMember(key)
|
||||
|
||||
if not member:
|
||||
return
|
||||
|
||||
if self.selectedItem is member or member.IsSameKey(key):
|
||||
member.UnSelect()
|
||||
self.selectedItem = None
|
||||
|
||||
# Optional: also disable buttons to mirror local delete flow
|
||||
self.whisperButton.Disable()
|
||||
self.mobileButton.Disable()
|
||||
self.removeButton.Disable()
|
||||
|
||||
member.Hide()
|
||||
group.RemoveMember(member)
|
||||
else:
|
||||
group.RemoveMember(group.FindMember(key))
|
||||
|
||||
self.OnRefreshList()
|
||||
|
||||
def OnRemoveAllList(self, groupIndex):
|
||||
|
||||
@@ -672,6 +672,23 @@ class TaskBar(ui.ScriptWindow):
|
||||
for button in self.selectSkillButtonList:
|
||||
button.RefreshSkill()
|
||||
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
def SkillClearCoolTime(self, usedSlotIndex):
|
||||
QUICK_SLOT_SLOT_COUNT = 4
|
||||
slotIndex = 0
|
||||
|
||||
for slotWindow in self.quickslot:
|
||||
for i in xrange(QUICK_SLOT_SLOT_COUNT):
|
||||
(Type, Position) = player.GetLocalQuickSlot(slotIndex)
|
||||
|
||||
if Type == player.SLOT_TYPE_SKILL:
|
||||
if usedSlotIndex == Position:
|
||||
slotWindow.SetSlotCoolTime(slotIndex, 0)
|
||||
|
||||
return
|
||||
|
||||
slotIndex += 1
|
||||
|
||||
def SetHP(self, curPoint, recoveryPoint, maxPoint):
|
||||
curPoint = min(curPoint, maxPoint)
|
||||
if maxPoint > 0:
|
||||
@@ -776,17 +793,19 @@ class TaskBar(ui.ScriptWindow):
|
||||
slot.DeactivateSlot(slotNumber)
|
||||
|
||||
slot.SetItemSlot(slotNumber, itemIndex, itemCount)
|
||||
|
||||
elif player.SLOT_TYPE_SKILL == Type:
|
||||
|
||||
skillIndex = player.GetSkillIndex(Position)
|
||||
|
||||
if 0 == skillIndex:
|
||||
slot.ClearSlot(slotNumber)
|
||||
|
||||
continue
|
||||
|
||||
skillType = skill.GetSkillType(skillIndex)
|
||||
|
||||
if skill.SKILL_TYPE_GUILD == skillType:
|
||||
import guild
|
||||
|
||||
skillGrade = 0
|
||||
skillLevel = guild.GetSkillLevel(Position)
|
||||
|
||||
@@ -799,13 +818,26 @@ class TaskBar(ui.ScriptWindow):
|
||||
slot.SetCoverButton(slotNumber)
|
||||
|
||||
## NOTE : CoolTime 체크
|
||||
if player.IsSkillCoolTime(Position):
|
||||
(coolTime, elapsedTime) = player.GetSkillCoolTime(Position)
|
||||
slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime)
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
if player.IsSkillCoolTime(Position) and skillLevel > 0:
|
||||
(coolTime, elapsedTime) = player.GetSkillCoolTime(Position)
|
||||
|
||||
slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime)
|
||||
else:
|
||||
if skillType != skill.SKILL_TYPE_GUILD and skillLevel <= 0:
|
||||
slot.SetSlotCoolTime(slotNumber, 0, 0)
|
||||
else:
|
||||
if player.IsSkillCoolTime(Position):
|
||||
(coolTime, elapsedTime) = player.GetSkillCoolTime(Position)
|
||||
|
||||
slot.SetSlotCoolTime(slotNumber, coolTime, elapsedTime)
|
||||
|
||||
## NOTE : Activate 되어 있다면 아이콘도 업데이트
|
||||
if player.IsSkillActive(Position):
|
||||
slot.ActivateSlot(slotNumber)
|
||||
else:
|
||||
if app.FIX_REFRESH_SKILL_COOLDOWN:
|
||||
slot.DeactivateSlot(slotNumber)
|
||||
|
||||
elif player.SLOT_TYPE_EMOTION == Type:
|
||||
|
||||
|
||||
@@ -556,6 +556,22 @@ window = {
|
||||
"down_image" : "d:/ymir work/ui/game/windows/skill_tab_button_03.sub",
|
||||
},
|
||||
|
||||
##horse skill page
|
||||
{
|
||||
"name" : "Skill_Group_Button_3",
|
||||
"type" : "radio_button",
|
||||
|
||||
"x" : 95,
|
||||
"y" : 2,
|
||||
|
||||
"text" : "Group3",
|
||||
"text_color" : 0xFFFFE3AD,
|
||||
|
||||
"default_image" : "d:/ymir work/ui/game/windows/skill_tab_button_01.sub",
|
||||
"over_image" : "d:/ymir work/ui/game/windows/skill_tab_button_02.sub",
|
||||
"down_image" : "d:/ymir work/ui/game/windows/skill_tab_button_03.sub",
|
||||
},
|
||||
|
||||
{
|
||||
"name" : "Active_Skill_Group_Name",
|
||||
"type" : "text",
|
||||
|
||||
Reference in New Issue
Block a user