- 0
-
Recently Browsing 0 members
- No registered users viewing this page.
-
Activity
-
3
Back to the Dungeon System 7, 8, 9th Floor Problem
Well, I told you to change the coordinates of a map, so both root/atlasinfo.txt (client) and mapname/Settings.txt (server) need to be edited. -
3
Back to the Dungeon System 7, 8, 9th Floor Problem
Thank you very much for your attention. So which file do I need to edit exactly? Can you help? -
3
Back to the Dungeon System 7, 8, 9th Floor Problem
This is not a quest issue. There's a conflict of coordinates between DevilTower and Valley of Seungryong. This bug also exists in official servers, but it's irrelevant cause they don't have a Rejoin system within the DevilTower dungeon, thus never accessing that set of coordinates globally. The conflict for the DevilTower becomes relevant at 7th, 8th and 9th floor cause they're placed in the utmost right section of the map, which, as you can see from the screenshot below, is partly inside the Valley's map sector. The server simply doesn't know where to place you., because that global set of coordinates belongs to two different maps. To fix the issue, you gotta move either the DevilTower or the Valley in different coordinates in the plane, be careful to choose a free and valid set of coordinates.- 1
-
-
0
Some mobs dont drop items
Hi, i have metinland on my server, and some metin stones drop me items and some metinstones just dont drop anything.. Its set same as others which are working.. Can anyone help? thamk yu -
3
Back to the Dungeon System 7, 8, 9th Floor Problem
Hello everyone !! I added a return to dungeon system to my server, I can't enter the devil's tower. The system works fine until the 6th floor. At the 7th floor and after, the system does not work and gives a view as below. SYSERR: Aug 13 23:49:44 :: heart_idle: losing 47 seconds. (lag occured) SYSERR: Aug 13 23:51:22 :: GetUniqueHpPerc: Unknown Key : fake2 SYSERR: Aug 13 23:51:22 :: PurgeUnique: Unknown Key or Dead: fake2 SYSERR: Aug 13 23:51:51 :: GetUniqueHpPerc: Unknown Key : fake6 SYSERR: Aug 13 23:51:51 :: PurgeUnique: Unknown Key or Dead: fake6 SYSERR: Aug 13 23:52:01 :: GetUniqueHpPerc: Unknown Key : fake1 SYSERR: Aug 13 23:52:01 :: PurgeUnique: Unknown Key or Dead: fake1 SYSERR: Aug 13 23:52:01 :: GetUniqueHpPerc: Unknown Key : fake4 SYSERR: Aug 13 23:52:01 :: PurgeUnique: Unknown Key or Dead: fake4 SYSERR: Aug 13 23:52:10 :: GetUniqueHpPerc: Unknown Key : fake3 SYSERR: Aug 13 23:52:10 :: PurgeUnique: Unknown Key or Dead: fake3 SYSERR: Aug 13 23:52:20 :: IsUniqueDead: Unknown Key or Dead : real SYSERR: Aug 13 23:54:45 :: WarpSet: Invalid map inedx 660000, must be child of 64 Can you help me how can I solve this issue? deviltower_zone.lua quest deviltower_zone begin state start begin when login begin if pc.get_map_index() == 66 then if pc.get_x() < 2048+88 or pc.get_y() < 6656+577 or pc.get_x() > 2048+236 or pc.get_y() > 6656+737 then pc.warp(590500, 110500) end pc.set_warp_location(65, 5905, 1105) elseif pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then pc.set_dungeonindex(d.get_map_index()) pc.setqf("dungeonorgindex",66) pc.setqf("dungeon_ch",pc.get_channel_id()) pc.set_warp_location(65, 5905, 1105) deviltower_zone.register_player(pc.get_vid()) end end when 20348.chat."Kaldığın Yerden Devam Et" with d.find(pc.get_dungeonindex()) begin if pc.getqf("dungeonorgindex") != 66 then say("Son girdiğin zindan burası değil!") return end if pc.getqf("dungeon_ch") != pc.get_channel_id() then say("Zindana girdiğin ch burası değil!") return end local n = pc.get_dungeonindex() local oldumu = d.getf_from_map_index("azrail_dead", n) local level = d.getf_from_map_index("level", n) if level < 4 then say("4. Kata ulaşamadığınız için devam edemezsin.") return end if oldumu == 1 then say_npc() say("Azraili zaten yok etmişsin.") return end if n == 0 then setskin(NOWINDOW) return end if level == 4 then say_npc() say("Görünüşe göre 4. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end if level == 5 then say_npc() say("Görünüşe göre 5. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end if level == 6 then say_npc() say("Görünüşe göre 6. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end if level == 7 then say_npc() say("Görünüşe göre 7. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end if level == 8 then say_npc() say("Görünüşe göre 8. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end if level == 9 then say_npc() say("Görünüşe göre 9. katta kuleden ayrıldın, sana yardımcı olmak istiyorum.") say_sari("Kuleye devam etmek istiyor musun?") if select(locale.yes,locale.no) == 1 then pc.warp(special.devil_tower[level-1][1]*100, special.devil_tower[level-1][2]*100,n) end end end when logout begin if pc.count_item(30300) >= 1 then pc.remove_item(30300, pc.count_item(30300)) end if pc.count_item(30302) >= 1 then pc.remove_item(30302, pc.count_item(30302)) end if pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then deviltower_zone.unregister_player(pc.get_vid()) pc.setf("deviltower","dungeon_time",get_global_time() + 10*60*1) end end when 20348.chat."Şeytan Kulesi " begin if pc.get_level() < 40 then say_title("Şeytan Kulesi Bekçisi:") say("Seviyen giriş için yeterli değil.") return else say_title("Şeytan Kulesi Bekçisi:") say("Şeytan kulesine girmek istiyor musun?") say("2. Kattan devam etmek isterseniz 25M yang gerekmektedir.") say_reward("Oyundan istemediğiniz halde çıkarsanız") say_reward("Kaldığınız yerden devam edebilirsiniz!") local s = select("Gir.", "2.Kat'a Giriş Yap.", "İstemiyorum.") if s == 1 then pc.warp(216500,727000) elseif s == 2 then if pc.get_money() < 25000000 then say("Hay Aksi!") say("Envanterine 25M yang olmadan seni içeri alamam.") say("25M yang yaptığında tekrar uğra.") else pc.change_money(-25000000) d.new_jump(66, special.devil_tower[1][1] * 100, special.devil_tower[1][2] * 100) d.regen_file("data/dungeon/deviltower2_regen.txt") d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt") end elseif s == 3 then return end end end function GrupKontrol() local pids = {party.get_member_pids()} for i = 1, table.getn(pids), 1 do q.begin_other_pc_block(pids[i]) if party.is_party() then if party.is_leader() then timer("devil_stone1_2", 2) end end q.end_other_pc_block() end end when 8015.kill with pc.get_map_index() == 66 begin if party.is_party() then deviltower_zone.GrupKontrol() else timer("devil_stone1_1", 2) end end when devil_stone1_1.timer begin d.new_jump_all(66,special.devil_tower[1][1],special.devil_tower[1][2]) d.regen_file("data/dungeon/deviltower2_regen.txt") d.setf("party_leader_pid",pc.get_player_id()) d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt") end when devil_stone1_2.timer begin d.new_jump_all(66,special.devil_tower[1][1],special.devil_tower[1][2]) d.regen_file("data/dungeon/deviltower2_regen.txt") d.setf("party_leader_pid",party.get_leader_pid()) party.setf("deviltower_mapindex",d.get_map_index()) d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt") end when kill with npc.get_race() == 1091 begin d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[3][1], special.devil_tower[3][2], "data/dungeon/deviltower4_regen.txt") d.check_eliminated() end function get_4floor_stone_pos() local positions = { {368, 629}, {419, 630}, {428, 653}, {422, 679}, {395, 689}, {369, 679}, {361, 658}, } for i = 1, 6 do local j = number(i, 7) if i != j then local t = positions[i]; positions[i] = positions[j]; positions[j] = t; end end return positions end when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 8016 begin d.setf("level", 4) local positions = deviltower_zone.get_4floor_stone_pos() for i = 1, 6 do d.set_unique("fake" .. i , d.spawn_mob(8017, positions[i][1], positions[i][2])) end local vid = d.spawn_mob(8017, positions[7][1], positions[7][2]) d.set_unique("real", vid) server_loop_timer('devil_stone4_update', 10, pc.get_map_index()) server_timer('devil_stone4_fail1', 5*60, pc.get_map_index()) d.notice("4. Kat Seçenek Kapısındasın."); d.notice("Gözlerini ve kulaklarını aldatacak bir çok sahte"); d.notice("Metin Taşı mevcut. 15 dakika içerisinde"); d.notice("gerçek Metin Taşı'nı bul ve yok et!"); d.notice("Kapıdan geçmenin tek yolu budur."); end when devil_stone4_fail1.server_timer begin if d.select(get_server_timer_arg()) then d.notice("10 dakika kaldı ") server_timer('devil_stone4_fail2', 5*60, get_server_timer_arg()) end end when devil_stone4_fail2.server_timer begin if d.select(get_server_timer_arg()) then d.notice("5 dakika kaldı ") server_timer('devil_stone4_fail', 5*60, get_server_timer_arg()) end end when devil_stone4_fail.server_timer begin if d.select(get_server_timer_arg()) and d.getf("level") == 4 then d.notice("Zaman doldu! ") d.exit_all() end end when devil_stone4_update.server_timer begin if d.select(get_server_timer_arg()) then if not d.is_unique_dead("real") then for i = 1, 6 do if d.getf("fakedead" .. i) == 0 then if d.unique_get_hp_perc("fake" .. i) < 50 then d.purge_unique("fake" .. i) d.setf("fakedead" .. i, 1) d.notice("Sahte Metin taşları yok oldu..."); end end end else server_timer("devil_stone4_end", 5, get_server_timer_arg()) d.notice("Mükemmel bir duyma yeteneğine ve iyi bir"); d.notice("içgüdüye sahip olduğunu kanıtlayarak"); d.notice("gerçek Metin Taşı'nı yok ettin!"); d.notice("Şimdi 5.kata gireceksin.") d.purge() end else server_timer('devil_stone4_stop_timer', 1, get_server_timer_arg()) end end when devil_stone4_stop_timer.server_timer begin clear_server_timer('devil_stone4_update', get_server_timer_arg()) end when devil_stone4_end.server_timer begin if d.select(get_server_timer_arg()) then clear_server_timer('devil_stone4_update', get_server_timer_arg()) clear_server_timer('devil_stone4_fail1', get_server_timer_arg()) clear_server_timer('devil_stone4_fail2', get_server_timer_arg()) clear_server_timer('devil_stone4_fail', get_server_timer_arg()) d.setf("level", 5) d.setf("stone_count", 5) d.jump_all(special.devil_tower[4][1], special.devil_tower[4][2]) d.notice("5.Kattaki Mühürlü Kapı'dasın. Bir sonraki kata ") d.notice("çıkmak için beş Eski Mühür'ü açman gerek. Bu alan ") d.notice("sana saldırmak için bekleyen canavarlarla dolu.") d.notice("Bazılarının üzerinde anahtar var. Yeteri kadar ") d.notice("Kilit Açma Taşı elde eder ve tüm mühürleri ") d.notice("açarsan 6. kata çıkabilirsin. Ama bil ki sadece ") d.notice("20 dakikan var!") server_timer('devil_stone5_fail1', 5*60, get_server_timer_arg()) clear_server_timer('devil_stone4_update', get_server_timer_arg()) d.set_regen_file("data/dungeon/deviltower5_regen.txt") d.spawn_mob(20073, 421, 452) d.spawn_mob(20073, 380, 460) d.spawn_mob(20073, 428, 414) d.spawn_mob(20073, 398, 392) d.spawn_mob(20073, 359, 426) d.spawn_mob(8023, 428, 427) d.spawn_mob(8023, 370, 401) d.spawn_mob(8023, 418, 404) d.spawn_mob(8023, 395, 463) d.spawn_mob(8023, 370, 451) end end when 8023.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin game.drop_item(50084, 1) end when devil_stone5_fail1.server_timer begin if d.select(get_server_timer_arg()) then d.notice("15 dakika kaldı ") server_timer('devil_stone5_fail2', 5*60, get_server_timer_arg()) end end when devil_stone5_fail2.server_timer begin if d.select(get_server_timer_arg()) then d.notice("10 dakika kaldı ") server_timer('devil_stone5_fail3', 5*60, get_server_timer_arg()) end end when devil_stone5_fail3.server_timer begin if d.select(get_server_timer_arg()) then d.notice("5 dakika kaldı ") server_timer('devil_stone5_fail', 5*60, get_server_timer_arg()) end end when devil_stone5_fail.server_timer begin if d.select(get_server_timer_arg()) and d.getf("level") == 5 then d.notice("Zaman doldu!") d.exit_all() end end when kill with pc.in_dungeon() and d.getf("level") == 5 and npc.get_race() == 1062 begin local KILL_COUNT_FOR_DROP_KEY = 7 local n =d.getf("count") + 1 d.setf("count", n) if n == KILL_COUNT_FOR_DROP_KEY then game.drop_item(50084, 1) d.setf("count", 0) end end when kill with npc.get_race() == 8013 and d.getf("level") == 5 begin game.drop_item(50084, 1) end when devil_stone5.take with item.vnum == 50084 begin npc.purge() pc.remove_item(50084,1) d.setf("stone_count", d.getf("stone_count") - 1) if d.getf("stone_count") <= 0 then d.clear_regen() d.kill_all() d.notice("Mührü açtın. 6. Kata çıkıyorsunuz!") clear_server_timer('devil_stone5_fail1', get_server_timer_arg()) clear_server_timer('devil_stone5_fail2', get_server_timer_arg()) clear_server_timer('devil_stone5_fail3', get_server_timer_arg()) clear_server_timer('devil_stone5_fail', get_server_timer_arg()) d.setf("level", 6) d.jump_all(special.devil_tower[5][1], special.devil_tower[5][2]) d.regen_file("data/dungeon/deviltower6_regen.txt") d.notice("Şeytan Krala ulaşmak için tüm ") d.notice("şeytanları öldür!") else d.notice("Mührü açtın! "..d.getf("stone_count").." kaldı.") end end when kill with npc.get_race() == 1092 begin d.kill_all() d.check_eliminated() local reward_alchemist = {20074, 20075, 20076} d.spawn_mob(reward_alchemist[number(1,3)], 425, 216); d.setqf("can_refine", 1) end when 20074.chat."Üst katlar" or 20075.chat."Üst katlar" or 20076.chat."Üst katlar" with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin if d.getf("check1") == 1 then say("") say("Cok kisa bir sure once buradaydin?") return end if not npc.lock() then say("") say("Şu anda başka biriyle konuşuyorum!") say("Biraz bekle ya da sonra tekrar gel!") return end say_title(mob_name(npc.get_race())) say("Kulenin 7. katına girmek mi istiyorsun?") say("Bu katla mücadele etmek muhteşem beceriler ve") say("büyük bir yazgı gerektirir.") say("Sadece 75. seviyeye ulaştıysan") say("seni oraya ışınlayabilirim.") wait() if pc.level >=75 then say_title(mob_name(npc.get_race())) say("Üst kata çıkmak için") say("yeterli deneyime ve güce sahipsin.") say("Girebilirsin!") say("") local gec = select("Git!","Vazgeç ","Kuleyi terket!") if gec == 1 then --local plusone = d.getf("check1") +1 d.setf("check1", 1) timer("devil_jump_7",6) npc.unlock() npc.purge() return elseif gec == 2 then npc.unlock() return elseif gec == 3 then npc.unlock() pc.warp(590500, 110500) end else say_title(mob_name(npc.get_race())) say("Üzgünüm sadece") say("75. seviyeye ulaşanları bir") say("üst kata alabilirim.") say("") npc.unlock() wait() pc.warp(590500, 110500) return end end when devil_jump_7.timer begin d.clear_regen() d.spawn_mob(8018, 639, 658) d.spawn_mob(8018, 611, 637) d.spawn_mob(8018, 596, 674) d.spawn_mob(8018, 629, 670) d.setf("level", 7) d.jump_all(2048+590, 6656+638) end when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 8018 begin local cont = d.getf("7_stone_kill") + 1 d.setf("7_stone_kill", cont) if cont >= 4 then d.setf("7_stone_kill", 0) d.set_regen_file("data/dungeon/deviltower7_regen.txt") end end when 8019.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin local qf = d.getf("7_stone2_kill")+1 if qf <= 150 then d.setf("7_stone2_kill", qf) game.drop_item(30300, 1) d.notice("Katil metnini "..(150-qf.." kere daha kesebilirsiniz;")) d.notice("Eğer daha fazla keserseniz, kattan dışarı atılacaksınız!") else d.exit_all() end end when 30300.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin pc.remove_item("30300", 1) local pct = number(1,8) if pct == 1 then game.drop_item(30302, 1) d.clear_regen() else game.drop_item(30301, 1) end end when 30302.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin if d.getf( "level" ) != 7 then pc.remove_item( "30302", 1) return end if d.getf( "harita" ) != 0 then pc.remove_item( "30302", 1) return end say("Bu haritayla bir sonraki kata çıkabilirim!") pc.remove_item("30302", 1) d.setf("harita",1) timer("devil_jump_8", 6) d.clear_regen() end when devil_jump_8.timer begin d.setf("level", 8) local plusone = d.getf("check") +1 d.setf("check", plusone) d.jump_all(2048+590, 6656+403) d.set_regen_file("data/dungeon/deviltower8_regen.txt") d.spawn_mob(20366, 640, 460) local _count = pc.count_item(30302) pc.remove_item(30302,_count) if d.getf("check") != 1 then d.notice("Bug kullanimi tespit edildi, disari gönderiliyorsun!") d.clear_regen() d.exit_all() end end when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 1040 begin if d.getf("level") < 9 then local pct1 = number(1, 10) if pct1 == 1 then local pct2 = number(1, 4) if pct2 == 1 then -- ÁøÂ¥ ¿¼è µå·Ó game.drop_item(30304, 1) else -- °¡Â¥ ¿¼è µå·Ó game.drop_item(30303, 1) end else return end end end when 20366.take with item.vnum == 30304 begin if d.getf("anahtar") == 1 then return end npc.purge() pc.remove_item(30304,1) d.setf("anahtar",1) timer("devil_jump_9", 8) end --------------------------------------------- -- 9Ãş ÁøÀÔºÎÅÍ ¿Ï·á±îÁö --------------------------------------------- when devil_jump_9.timer begin d.setf("level", 9) d.jump_all(2048+590, 6656+155) d.regen_file("data/dungeon/deviltower9_regen.txt") end when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 1093 begin d.kill_all() pc.setf("deviltower_zone","9_done",1) notice_all("|cff00ff00"..pc.get_name().." grubu, Lusifer'ı öldürdü!") d.setf("azrail_dead", 1) timer("devil_end_jump", 30) d.kill_all() d.clear_regen() end when devil_end_jump.timer begin d.clear_regen() d.exit_all() end function register_player(vid) local player_count = d.getf("player_count") player_count = player_count + 1 d.setf("player_count", tonumber(player_count)) d.setf(string.format("player%d", player_count), tonumber(vid)) end function unregister_player(vid) local player_count = d.getf("player_count") local found = false for i = 1, player_count, 1 do if found == true then d.setf(string.format("player%d", tonumber(i)), d.getf(string.format("player%d", i+1))) end p = d.getf("player"..tostring(i)) if p == vid then i = i -1 found = true end end if found == true then d.setf("player_count", tonumber(player_count - 1)) end end function get_players() local players = {} local player_count = d.getf("player_count") for i = 1, player_count, 1 do players[i] = d.getf("player"..tostring(i)) end return players end function give_dc_access(pindex) local self_checked = false local self = pc.select(d.getf("player"..tostring(pindex))) --pc.setqf("dcenter", 1) pc.setf("deviltower_zone", "dcenter", 1) pc.select(self) end end end Thank you to everyone who replied.- 1
-
-
691
[Group] Daily Music - Share your favorite!
Some hungarian Gen Z music I never thought I would listen but I love it- 1
-
-
-
5
-
1
-
Question
.Zero. 1
Hi Everyone
i've added the new sash system to my client
witch have the official item_scale
but i have one little problem
when i compile the binary
i got this one error
this is my PythonSlotWindow.cpp
#include "StdAfx.h"
#include "../eterBase/CRC32.h"
#include "../eterBase/Filename.h"
#include "PythonWindow.h"
#include "PythonSlotWindow.h"
//#define __RENDER_SLOT_AREA__
using namespace UI;
class UI::CSlotWindow::CSlotButton : public CButton
{
public:
enum ESlotButtonType
{
SLOT_BUTTON_TYPE_PLUS,
SLOT_BUTTON_TYPE_COVER,
};
public:
CSlotButton(ESlotButtonType dwType, DWORD dwSlotNumber, CSlotWindow * pParent) : CButton(NULL)
{
m_dwSlotButtonType = dwType;
m_dwSlotNumber = dwSlotNumber;
m_pParent = pParent;
}
virtual ~CSlotButton()
{
}
BOOL OnMouseLeftButtonDown()
{
if (!IsEnable())
return TRUE;
if (UI::CWindowManager::Instance().IsAttaching())
return TRUE;
m_isPressed = TRUE;
Down();
return TRUE;
}
BOOL OnMouseLeftButtonUp()
{
if (!IsEnable())
return TRUE;
if (!IsPressed())
return TRUE;
if (IsIn())
SetCurrentVisual(&m_overVisual);
else
SetCurrentVisual(&m_upVisual);
m_pParent->OnPressedSlotButton(m_dwSlotButtonType, m_dwSlotNumber);
return TRUE;
}
void OnMouseOverIn()
{
if (IsEnable())
{
SetCurrentVisual(&m_overVisual);
}
m_pParent->OnOverInItem(m_dwSlotNumber);
}
void OnMouseOverOut()
{
if (IsEnable())
{
SetUp();
SetCurrentVisual(&m_upVisual);
}
m_pParent->OnOverOutItem();
}
protected:
ESlotButtonType m_dwSlotButtonType;
DWORD m_dwSlotNumber;
CSlotWindow * m_pParent;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
class UI::CSlotWindow::CCoverButton : public CSlotButton
{
public:
CCoverButton(ESlotButtonType dwType, DWORD dwSlotNumber, CSlotWindow * pParent) : CSlotButton(dwType, dwSlotNumber, pParent)
{
m_bLeftButtonEnable = TRUE;
m_bRightButtonEnable = TRUE;
}
virtual ~CCoverButton()
{
}
void SetLeftButtonEnable(BOOL bEnable)
{
m_bLeftButtonEnable = bEnable;
}
void SetRightButtonEnable(BOOL bEnable)
{
m_bRightButtonEnable = bEnable;
}
void OnRender()
{
}
void RenderButton()
{
CButton::OnRender();
}
BOOL OnMouseLeftButtonDown()
{
if (!IsEnable())
return TRUE;
if (m_bLeftButtonEnable)
{
CButton::OnMouseLeftButtonDown();
}
else
{
m_pParent->OnMouseLeftButtonDown();
}
return TRUE;
}
BOOL OnMouseLeftButtonUp()
{
if (!IsEnable())
return TRUE;
if (m_bLeftButtonEnable)
{
CButton::OnMouseLeftButtonUp();
m_pParent->OnMouseLeftButtonDown();
}
else
{
m_pParent->OnMouseLeftButtonUp();
}
return TRUE;
}
BOOL OnMouseRightButtonDown()
{
if (!IsEnable())
return TRUE;
if (m_bRightButtonEnable)
CButton::OnMouseLeftButtonDown();
return TRUE;
}
BOOL OnMouseRightButtonUp()
{
if (!IsEnable())
return TRUE;
m_pParent->OnMouseRightButtonDown();
if (m_bRightButtonEnable)
CButton::OnMouseLeftButtonUp();
return TRUE;
}
protected:
BOOL m_bLeftButtonEnable;
BOOL m_bRightButtonEnable;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
class UI::CSlotWindow::CCoolTimeFinishEffect : public CAniImageBox
{
public:
CCoolTimeFinishEffect(CSlotWindow * pParent, DWORD dwSlotIndex) : CAniImageBox(NULL)
{
m_pParent = pParent;
m_dwSlotIndex = dwSlotIndex;
}
virtual ~CCoolTimeFinishEffect()
{
}
void OnEndFrame()
{
((CSlotWindow *)m_pParent)->ReserveDestroyCoolTimeFinishEffect(m_dwSlotIndex);
}
protected:
DWORD m_dwSlotIndex;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// Set & Append
void CSlotWindow::SetSlotType(DWORD dwType)
{
m_dwSlotType = dwType;
}
void CSlotWindow::SetSlotStyle(DWORD dwStyle)
{
m_dwSlotStyle = dwStyle;
}
void CSlotWindow::AppendSlot(DWORD dwIndex, int ixPosition, int iyPosition, int ixCellSize, int iyCellSize)
{
TSlot Slot;
Slot.pInstance = NULL;
Slot.pNumberLine = NULL;
Slot.pCoverButton = NULL;
Slot.pSlotButton = NULL;
Slot.pSignImage = NULL;
Slot.pFinishCoolTimeEffect = NULL;
#ifdef ENABLE_SASH_SYSTEM
for (int i = 0; i < 3; ++i)
{
Slot.pActiveSlotEffect = NULL;
}
#endif
ClearSlot(&Slot);
Slot.dwSlotNumber = dwIndex;
Slot.dwCenterSlotNumber = dwIndex;
Slot.ixPosition = ixPosition;
Slot.iyPosition = iyPosition;
Slot.ixCellSize = ixCellSize;
Slot.iyCellSize = iyCellSize;
m_SlotList.push_back(Slot);
}
void CSlotWindow::SetCoverButton(DWORD dwIndex, const char * c_szUpImageName, const char * c_szOverImageName, const char * c_szDownImageName, const char * c_szDisableImageName, BOOL bLeftButtonEnable, BOOL bRightButtonEnable)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
CCoverButton *& rpCoverButton = pSlot->pCoverButton;
if (!rpCoverButton)
{
rpCoverButton = new CCoverButton(CSlotButton::SLOT_BUTTON_TYPE_COVER, pSlot->dwSlotNumber, this);
CWindowManager::Instance().SetParent(rpCoverButton, this);
}
rpCoverButton->SetLeftButtonEnable(bLeftButtonEnable);
rpCoverButton->SetRightButtonEnable(bRightButtonEnable);
rpCoverButton->SetUpVisual(c_szUpImageName);
rpCoverButton->SetOverVisual(c_szOverImageName);
rpCoverButton->SetDownVisual(c_szDownImageName);
rpCoverButton->SetDisableVisual(c_szDisableImageName);
rpCoverButton->Enable();
rpCoverButton->Show();
// NOTE : Cover 버튼이 Plus 버튼을 가려버려서 임시 코드를..
if (pSlot->pSlotButton)
{
SetTop(pSlot->pSlotButton);
}
}
void CSlotWindow::EnableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (!pSlot->pCoverButton)
return;
pSlot->pCoverButton->Enable();
}
void CSlotWindow::DisableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (!pSlot->pCoverButton)
return;
pSlot->pCoverButton->Disable();
}
void CSlotWindow::SetAlwaysRenderCoverButton(DWORD dwIndex, bool bAlwaysRender)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (bAlwaysRender)
SET_BIT(pSlot->dwState, SLOT_STATE_ALWAYS_RENDER_COVER);
else
REMOVE_BIT(pSlot->dwState, SLOT_STATE_ALWAYS_RENDER_COVER);
}
void CSlotWindow::ShowSlotBaseImage(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bRenderBaseSlotImage = true;
}
void CSlotWindow::HideSlotBaseImage(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bRenderBaseSlotImage = false;
}
BOOL CSlotWindow::IsDisableCoverButton(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return FALSE;
if (!pSlot->pCoverButton)
return FALSE;
return pSlot->pCoverButton->IsDisable();
}
void CSlotWindow::SetSlotBaseImage(const char * c_szFileName, float fr, float fg, float fb, float fa)
{
__CreateBaseImage(c_szFileName, fr, fg, fb, fa);
}
void CSlotWindow::SetSlotBaseImageScale(const char * c_szFileName, float fr, float fg, float fb, float fa, float sx, float sy)
{
__CreateBaseImageScale(c_szFileName, fr, fg, fb, fa, sx, sy);
}
void CSlotWindow::AppendSlotButton(const char * c_szUpImageName, const char * c_szOverImageName, const char * c_szDownImageName)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CSlotButton *& rpSlotButton = rSlot.pSlotButton;
if (!rpSlotButton)
{
rpSlotButton = new CSlotButton(CSlotButton::SLOT_BUTTON_TYPE_PLUS, rSlot.dwSlotNumber, this);
rpSlotButton->AddFlag(FLAG_FLOAT);
CWindowManager::Instance().SetParent(rpSlotButton, this);
}
rpSlotButton->SetUpVisual(c_szUpImageName);
rpSlotButton->SetOverVisual(c_szOverImageName);
rpSlotButton->SetDownVisual(c_szDownImageName);
rpSlotButton->SetPosition(rSlot.ixPosition + 1, rSlot.iyPosition + 19);
rpSlotButton->Hide();
}
}
void CSlotWindow::AppendRequirementSignImage(const char * c_szImageName)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CImageBox *& rpSignImage = rSlot.pSignImage;
if (!rpSignImage)
{
rpSignImage = new CImageBox(NULL);
CWindowManager::Instance().SetParent(rpSignImage, this);
}
rpSignImage->LoadImage(c_szImageName);
rpSignImage->Hide();
}
}
BOOL CSlotWindow::HasSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return FALSE;
return TRUE;
}
void CSlotWindow::SetSlot(DWORD dwIndex, DWORD dwVirtualNumber, BYTE byWidth, BYTE byHeight, CGraphicImage * pImage, D3DXCOLOR& diffuseColor)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (pSlot->isItem)
if (pSlot->dwItemIndex == dwVirtualNumber)
{
pSlot->dwState = 0;
pSlot->isItem = TRUE;
if (pImage && pSlot->pInstance)
{
pSlot->pInstance->SetImagePointer(pImage);
}
return;
}
ClearSlot(pSlot);
pSlot->dwState = 0;
pSlot->isItem = TRUE;
pSlot->dwItemIndex = dwVirtualNumber;
if (pImage)
{
assert(NULL == pSlot->pInstance);
pSlot->pInstance = CGraphicImageInstance::New();
pSlot->pInstance->SetDiffuseColor(diffuseColor.r, diffuseColor.g, diffuseColor.b, diffuseColor.a);
pSlot->pInstance->SetImagePointer(pImage);
}
pSlot->byxPlacedItemSize = byWidth;
pSlot->byyPlacedItemSize = byHeight;
if (pSlot->pCoverButton)
{
pSlot->pCoverButton->Show();
}
}
void CSlotWindow::SetSlotScale(DWORD dwIndex, DWORD dwVirtualNumber, BYTE byWidth, BYTE byHeight, CGraphicImage * pImage, float sx, float sy, D3DXCOLOR& diffuseColor)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (pSlot->isItem)
if (pSlot->dwItemIndex == dwVirtualNumber)
{
pSlot->dwState = 0;
pSlot->isItem = TRUE;
if (pImage && pSlot->pInstance)
{
pSlot->pInstance->SetImagePointer(pImage);
}
return;
}
ClearSlot(pSlot);
pSlot->dwState = 0;
pSlot->isItem = TRUE;
pSlot->dwItemIndex = dwVirtualNumber;
if (pImage)
{
assert(NULL == pSlot->pInstance);
pSlot->pInstance = CGraphicImageInstance::New();
pSlot->pInstance->SetDiffuseColor(diffuseColor.r, diffuseColor.g, diffuseColor.b, diffuseColor.a);
pSlot->pInstance->SetImagePointer(pImage);
pSlot->pInstance->SetScale(sx, sy);
}
pSlot->byxPlacedItemSize = byWidth;
pSlot->byyPlacedItemSize = byHeight;
if (pSlot->pCoverButton)
{
pSlot->pCoverButton->Show();
}
}
void CSlotWindow::SetSlotCount(DWORD dwIndex, DWORD dwCount)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (dwCount <= 0)
{
if (pSlot->pNumberLine)
{
delete pSlot->pNumberLine;
pSlot->pNumberLine = NULL;
}
}
else
{
char szCount[16+1];
_snprintf(szCount, sizeof(szCount), "%d", dwCount);
if (!pSlot->pNumberLine)
{
CNumberLine * pNumberLine = new UI::CNumberLine(this);
pNumberLine->SetHorizontalAlign(CNumberLine::HORIZONTAL_ALIGN_RIGHT);
pNumberLine->Show();
pSlot->pNumberLine = pNumberLine;
}
pSlot->pNumberLine->SetNumber(szCount);
}
}
void CSlotWindow::SetSlotCountNew(DWORD dwIndex, DWORD dwGrade, DWORD dwCount)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
if (dwCount <= 0)
{
if (pSlot->pNumberLine)
{
delete pSlot->pNumberLine;
pSlot->pNumberLine = NULL;
}
}
else
{
char szCount[16+1];
switch (dwGrade)
{
case 0:
_snprintf(szCount, sizeof(szCount), "%d", dwCount);
break;
case 1:
_snprintf(szCount, sizeof(szCount), "m%d", dwCount);
break;
case 2:
_snprintf(szCount, sizeof(szCount), "g%d", dwCount);
break;
case 3:
#ifdef ENABLE_SKILLS_LEVEL_OVER_P
_snprintf(szCount, sizeof(szCount), "p%d", dwCount);
#else
_snprintf(szCount, sizeof(szCount), "p");
#endif
break;
#ifdef ENABLE_SKILLS_LEVEL_OVER_P
case 4:
_snprintf(szCount, sizeof(szCount), "s");
break;
#endif
}
if (!pSlot->pNumberLine)
{
CNumberLine * pNumberLine = new UI::CNumberLine(this);
pNumberLine->SetHorizontalAlign(CNumberLine::HORIZONTAL_ALIGN_RIGHT);
pNumberLine->Show();
pSlot->pNumberLine = pNumberLine;
}
pSlot->pNumberLine->SetNumber(szCount);
}
}
void CSlotWindow::SetSlotCoolTime(DWORD dwIndex, float fCoolTime, float fElapsedTime)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->fCoolTime = fCoolTime;
pSlot->fStartCoolTime = CTimer::Instance().GetCurrentSecond() - fElapsedTime;
}
void CSlotWindow::ActivateSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bActive = TRUE;
if (!m_pSlotActiveEffect)
{
__CreateSlotEnableEffect();
}
}
void CSlotWindow::DeactivateSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->bActive = FALSE;
}
void CSlotWindow::ClearSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
ClearSlot(pSlot);
}
void CSlotWindow::ClearSlot(TSlot * pSlot)
{
pSlot->bActive = FALSE;
pSlot->byxPlacedItemSize = 1;
pSlot->byyPlacedItemSize = 1;
pSlot->isItem = FALSE;
pSlot->dwState = 0;
pSlot->fCoolTime = 0.0f;
pSlot->fStartCoolTime = 0.0f;
pSlot->dwCenterSlotNumber = 0xffffffff;
pSlot->dwItemIndex = 0;
pSlot->bRenderBaseSlotImage = true;
if (pSlot->pInstance)
{
CGraphicImageInstance::Delete(pSlot->pInstance);
pSlot->pInstance = NULL;
}
if (pSlot->pCoverButton)
{
pSlot->pCoverButton->Hide();
}
if (pSlot->pSlotButton)
{
pSlot->pSlotButton->Hide();
}
if (pSlot->pSignImage)
{
pSlot->pSignImage->Hide();
}
if (pSlot->pFinishCoolTimeEffect)
{
pSlot->pFinishCoolTimeEffect->Hide();
}
#ifdef ENABLE_SASH_SYSTEM
for (int i = 0; i < 3; ++i)
{
if (pSlot->pActiveSlotEffect)
pSlot->pActiveSlotEffect->Hide();
}
#endif
}
void CSlotWindow::ClearAllSlot()
{
Destroy();
}
void CSlotWindow::RefreshSlot()
{
OnRefreshSlot();
// NOTE : Refresh 될때 ToolTip 도 갱신 합니다 - [levites]
if (IsRendering())
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
{
OnOverOutItem();
OnOverInItem(pSlot->dwSlotNumber);
}
}
}
void CSlotWindow::OnRefreshSlot()
{
}
DWORD CSlotWindow::GetSlotCount()
{
return m_SlotList.size();
}
void CSlotWindow::LockSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState |= SLOT_STATE_LOCK;
}
void CSlotWindow::UnlockSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState ^= SLOT_STATE_LOCK;
}
void CSlotWindow::SetCantUseSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState |= SLOT_STATE_CANT_USE;
}
void CSlotWindow::SetUseSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
pSlot->dwState ^= SLOT_STATE_CANT_USE;
}
void CSlotWindow::EnableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
REMOVE_BIT(pSlot->dwState, SLOT_STATE_DISABLE);
//pSlot->dwState |= SLOT_STATE_DISABLE;
}
void CSlotWindow::DisableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
SET_BIT(pSlot->dwState, SLOT_STATE_DISABLE);
//pSlot->dwState ^= SLOT_STATE_DISABLE;
}
// Select
void CSlotWindow::SetUnusableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
SET_BIT(pSlot->dwState, SLOT_STATE_UNUSABLE);
//pSlot->dwState |= SLOT_STATE_UNUSABLE;
}
void CSlotWindow::SetUsableSlot(DWORD dwIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot))
return;
REMOVE_BIT(pSlot->dwState, SLOT_STATE_UNUSABLE);
//pSlot->dwState ^= SLOT_STATE_UNUSABLE;
}
void CSlotWindow::SelectSlot(DWORD dwSelectingIndex)
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end();)
{
if (dwSelectingIndex == *itor)
{
itor = m_dwSelectedSlotIndexList.erase(itor);
return;
}
else
{
++itor;
}
}
TSlot * pSlot;
if (GetSlotPointer(dwSelectingIndex, &pSlot))
{
if (!pSlot->isItem)
return;
m_dwSelectedSlotIndexList.push_back(dwSelectingIndex);
}
}
BOOL CSlotWindow::isSelectedSlot(DWORD dwIndex)
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
if (dwIndex == *itor)
return TRUE;
}
return FALSE;
}
void CSlotWindow::ClearSelected()
{
m_dwSelectedSlotIndexList.clear();
}
DWORD CSlotWindow::GetSelectedSlotCount()
{
return m_dwSelectedSlotIndexList.size();
}
DWORD CSlotWindow::GetSelectedSlotNumber(DWORD dwIndex)
{
if (dwIndex >= m_dwSelectedSlotIndexList.size())
return DWORD(-1);
DWORD dwCount = 0;
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
if (dwIndex == dwCount)
break;
++dwCount;
}
return *itor;
}
void CSlotWindow::ShowSlotButton(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (pSlot->pSlotButton)
{
pSlot->pSlotButton->Show();
}
}
void CSlotWindow::HideAllSlotButton()
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (rSlot.pSlotButton)
{
rSlot.pSlotButton->Hide();
}
}
}
void CSlotWindow::ShowRequirementSign(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (!pSlot->pSignImage)
return;
pSlot->pSignImage->Show();
}
void CSlotWindow::HideRequirementSign(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return;
if (!pSlot->pSignImage)
return;
pSlot->pSignImage->Hide();
}
// Event
BOOL CSlotWindow::OnMouseLeftButtonDown()
{
TSlot * pSlot;
if (!GetPickedSlotPointer(&pSlot))
{
UI::CWindowManager::Instance().DeattachIcon();
return TRUE;
}
if (pSlot->isItem && !(pSlot->dwState & SLOT_STATE_LOCK))
{
OnSelectItemSlot(pSlot->dwSlotNumber);
}
else
{
OnSelectEmptySlot(pSlot->dwSlotNumber);
}
return TRUE;
}
BOOL CSlotWindow::OnMouseLeftButtonUp()
{
if (UI::CWindowManager::Instance().IsAttaching())
if (UI::CWindowManager::Instance().IsDragging())
if (IsIn())
{
UI::CWindow * pWin = UI::CWindowManager::Instance().GetPointWindow();
if (pWin)
if (pWin->IsType(UI::CSlotWindow::Type()))
{
UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin;
TSlot * pSlot;
if (!pSlotWin->GetPickedSlotPointer(&pSlot))
{
UI::CWindowManager::Instance().DeattachIcon();
return TRUE;
}
if (pSlot->isItem)
pSlotWin->OnSelectItemSlot(pSlot->dwSlotNumber);
else
pSlotWin->OnSelectEmptySlot(pSlot->dwSlotNumber);
return TRUE;
}
return FALSE;
}
return FALSE;
}
BOOL CSlotWindow::OnMouseRightButtonDown()
{
TSlot * pSlot;
if (!GetPickedSlotPointer(&pSlot))
return TRUE;
if (pSlot->isItem)
{
OnUnselectItemSlot(pSlot->dwSlotNumber);
}
else
{
OnUnselectEmptySlot(pSlot->dwSlotNumber);
}
return TRUE;
}
BOOL CSlotWindow::OnMouseLeftButtonDoubleClick()
{
OnUseSlot();
return TRUE;
}
void CSlotWindow::OnMouseOverOut()
{
OnOverOutItem();
}
void CSlotWindow::OnMouseOver()
{
// FIXME : 윈도우를 드래깅 하는 도중에 SetTop이 되어버리면 Capture가 풀어져 버린다. 그것의 방지 코드.
// 좀 더 근본적인 해결책을 찾아야 할 듯 - [levites]
// if (UI::CWindowManager::Instance().IsCapture())
// if (!UI::CWindowManager::Instance().IsAttaching())
// return;
CWindow * pPointWindow = UI::CWindowManager::Instance().GetPointWindow();
if (this == pPointWindow)
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
{
if (OnOverInItem(pSlot->dwSlotNumber))
return;
}
}
OnOverOutItem();
}
void CSlotWindow::OnSelectEmptySlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnSelectEmptySlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnSelectItemSlot(int iSlotNumber)
{
// OnOverOutItem();
PyCallClassMemberFunc(m_poHandler, "OnSelectItemSlot", Py_BuildValue("(i)", iSlotNumber));
if (UI::CWindowManager::Instance().IsAttaching())
OnOverOutItem();
}
void CSlotWindow::OnUnselectEmptySlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnUnselectEmptySlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnUnselectItemSlot(int iSlotNumber)
{
PyCallClassMemberFunc(m_poHandler, "OnUnselectItemSlot", Py_BuildValue("(i)", iSlotNumber));
}
void CSlotWindow::OnUseSlot()
{
TSlot * pSlot;
if (GetPickedSlotPointer(&pSlot))
if (pSlot->isItem)
{
PyCallClassMemberFunc(m_poHandler, "OnUseSlot", Py_BuildValue("(i)", pSlot->dwSlotNumber));
}
}
BOOL CSlotWindow::OnOverInItem(DWORD dwSlotNumber)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotNumber, &pSlot))
return FALSE;
if (!pSlot->isItem)
return FALSE;
if (pSlot->dwSlotNumber == m_dwToolTipSlotNumber)
return TRUE;
m_dwToolTipSlotNumber = dwSlotNumber;
PyCallClassMemberFunc(m_poHandler, "OnOverInItem", Py_BuildValue("(i)", dwSlotNumber));
return TRUE;
}
void CSlotWindow::OnOverOutItem()
{
if (SLOT_NUMBER_NONE == m_dwToolTipSlotNumber)
return;
m_dwToolTipSlotNumber = SLOT_NUMBER_NONE;
PyCallClassMemberFunc(m_poHandler, "OnOverOutItem", Py_BuildValue("()"));
}
void CSlotWindow::OnPressedSlotButton(DWORD dwType, DWORD dwSlotNumber, BOOL isLeft)
{
if (CSlotButton::SLOT_BUTTON_TYPE_PLUS == dwType)
{
PyCallClassMemberFunc(m_poHandler, "OnPressedSlotButton", Py_BuildValue("(i)", dwSlotNumber));
}
else if (CSlotButton::SLOT_BUTTON_TYPE_COVER == dwType)
{
if (isLeft)
{
OnMouseLeftButtonDown();
}
}
}
void CSlotWindow::OnUpdate()
{
for (std::deque<DWORD>::iterator itor = m_ReserveDestroyEffectDeque.begin(); itor != m_ReserveDestroyEffectDeque.end(); ++itor)
{
DWORD dwSlotIndex = *itor;
TSlot * pSlot;
if (!GetSlotPointer(dwSlotIndex, &pSlot))
continue;
__DestroyFinishCoolTimeEffect(pSlot);
#ifdef ENABLE_SASH_SYSTEM
for (int i = 0; i < 3; ++i)
{
if (pSlot->pActiveSlotEffect)
{
delete pSlot->pActiveSlotEffect;
pSlot->pActiveSlotEffect = NULL;
}
}
#endif
}
m_ReserveDestroyEffectDeque.clear();
if (m_pSlotActiveEffect)
m_pSlotActiveEffect->Update();
}
void CSlotWindow::OnRender()
{
RenderSlotBaseImage();
switch (m_dwSlotStyle)
{
case SLOT_STYLE_PICK_UP:
OnRenderPickingSlot();
break;
case SLOT_STYLE_SELECT:
OnRenderSelectedSlot();
break;
}
std::for_each(m_pChildList.begin(), m_pChildList.end(), std::void_mem_fun(&CWindow::OnRender));
TSlotListIterator itor;
//
// 모든 슬롯 상자 그리기
//////////////////////////////////////////////////////////////////////////
#ifdef __RENDER_SLOT_AREA__
CPythonGraphic::Instance().SetDiffuseColor(0.5f, 0.5f, 0.5f);
for (itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
CPythonGraphic::Instance().RenderBox2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(m_rect.left, m_rect.top, m_rect.right, m_rect.bottom);
#endif
//////////////////////////////////////////////////////////////////////////
for (itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (rSlot.pSlotButton)
{
rSlot.pSlotButton->SetPosition(rSlot.ixPosition + 1, rSlot.iyPosition + 19);
}
if (rSlot.pSignImage)
{
rSlot.pSignImage->SetPosition(rSlot.ixPosition - 7, rSlot.iyPosition + 10);
}
if (rSlot.pInstance)
{
rSlot.pInstance->SetPosition(m_rect.left + rSlot.ixPosition, m_rect.top + rSlot.iyPosition);
rSlot.pInstance->Render();
}
if (!rSlot.isItem)
{
if (IS_SET(rSlot.dwState, SLOT_STATE_ALWAYS_RENDER_COVER))
{
rSlot.pCoverButton->Show();
rSlot.pCoverButton->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pCoverButton->RenderButton();
}
continue;
}
if (IS_SET(rSlot.dwState, SLOT_STATE_DISABLE))
{
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
if (rSlot.fCoolTime != 0.0f)
{
float fcurTime = CTimer::Instance().GetCurrentSecond();
float fPercentage = (fcurTime - rSlot.fStartCoolTime) / rSlot.fCoolTime;
CPythonGraphic::Instance().RenderCoolTimeBox(m_rect.left + rSlot.ixPosition + 16.0f, m_rect.top + rSlot.iyPosition + 16.0f, 16.0f, fPercentage);
if (fcurTime - rSlot.fStartCoolTime >= rSlot.fCoolTime)
{
// 쿨타임이 끝난지 1초 이내라면..
if ((fcurTime - rSlot.fStartCoolTime) - rSlot.fCoolTime < 1.0f)
__CreateFinishCoolTimeEffect(&rSlot);
rSlot.fCoolTime = 0.0f;
rSlot.fStartCoolTime = 0.0f;
}
}
if (rSlot.pCoverButton)
{
rSlot.pCoverButton->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pCoverButton->RenderButton();
}
if (rSlot.pNumberLine)
{
int ix = rSlot.byxPlacedItemSize*ITEM_WIDTH + rSlot.ixPosition - 4;
int iy = rSlot.iyPosition + rSlot.byyPlacedItemSize*ITEM_HEIGHT - 12 + 2;
rSlot.pNumberLine->SetPosition(ix, iy);
rSlot.pNumberLine->Update();
rSlot.pNumberLine->Render();
}
if (rSlot.pFinishCoolTimeEffect)
{
rSlot.pFinishCoolTimeEffect->SetPosition(rSlot.ixPosition, rSlot.iyPosition);
rSlot.pFinishCoolTimeEffect->Update();
rSlot.pFinishCoolTimeEffect->Render();
}
#ifdef ENABLE_SASH_SYSTEM
{
int iX = m_rect.left + rSlot.ixPosition, iY = m_rect.top + rSlot.iyPosition, iItemYSize = rSlot.byyPlacedItemSize;
for (int i = 0; i < 3; ++i)
{
if ((rSlot.pActiveSlotEffect) && (iItemYSize == i + 1))
{
rSlot.pActiveSlotEffect->Show();
rSlot.pActiveSlotEffect->SetPosition(iX, iY);
rSlot.pActiveSlotEffect->Update();
rSlot.pActiveSlotEffect->Render();
}
}
}
#endif
if (IS_SET(rSlot.dwState, SLOT_STATE_UNUSABLE))
{
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.byxPlacedItemSize * ITEM_WIDTH,
m_rect.top + rSlot.iyPosition + rSlot.byyPlacedItemSize * ITEM_HEIGHT);
}
if (rSlot.bActive)
if (m_pSlotActiveEffect)
{
int ix = m_rect.left + rSlot.ixPosition;
int iy = m_rect.top + rSlot.iyPosition;
m_pSlotActiveEffect->SetPosition(ix, iy);
m_pSlotActiveEffect->Render();
}
}
RenderLockedSlot();
}
void CSlotWindow::RenderSlotBaseImage()
{
if (!m_pBaseImageInstance)
return;
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (!rSlot.bRenderBaseSlotImage)
continue;
m_pBaseImageInstance->SetPosition(m_rect.left + rSlot.ixPosition, m_rect.top + rSlot.iyPosition);
m_pBaseImageInstance->Render();
}
}
void CSlotWindow::OnRenderPickingSlot()
{
if (!UI::CWindowManager::Instance().IsAttaching())
return;
TSlot * pSlot;
if (!GetSelectedSlotPointer(&pSlot))
return;
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + pSlot->ixPosition,
m_rect.top + pSlot->iyPosition,
m_rect.left + pSlot->ixPosition + pSlot->ixCellSize,
m_rect.top + pSlot->iyPosition + pSlot->iyCellSize);
}
void CSlotWindow::OnRenderSelectedSlot()
{
std::list<DWORD>::iterator itor = m_dwSelectedSlotIndexList.begin();
for (; itor != m_dwSelectedSlotIndexList.end(); ++itor)
{
TSlot * pSlot;
if (!GetSlotPointer(*itor, &pSlot))
continue;
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f);
CPythonGraphic::Instance().RenderBar2d(m_rect.left + pSlot->ixPosition,
m_rect.top + pSlot->iyPosition,
m_rect.left + pSlot->ixPosition + pSlot->ixCellSize,
m_rect.top + pSlot->iyPosition + pSlot->iyCellSize);
}
}
void CSlotWindow::RenderLockedSlot()
{
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.5f);
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (!rSlot.isItem)
continue;
if (rSlot.dwState & SLOT_STATE_LOCK)
{
CPythonGraphic::Instance().RenderBar2d(m_rect.left + rSlot.ixPosition,
m_rect.top + rSlot.iyPosition,
m_rect.left + rSlot.ixPosition + rSlot.ixCellSize,
m_rect.top + rSlot.iyPosition + rSlot.iyCellSize);
}
}
}
// Check Slot
BOOL CSlotWindow::GetSlotPointer(DWORD dwIndex, TSlot ** ppSlot)
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (dwIndex == rSlot.dwSlotNumber)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
BOOL CSlotWindow::GetSelectedSlotPointer(TSlot ** ppSlot)
{
long lx, ly;
GetMouseLocalPosition(lx, ly);
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
if (lx >= rSlot.ixPosition)
if (ly >= rSlot.iyPosition)
if (lx <= rSlot.ixPosition + rSlot.ixCellSize)
if (ly <= rSlot.iyPosition + rSlot.iyCellSize)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
BOOL CSlotWindow::GetPickedSlotPointer(TSlot ** ppSlot)
{
long lx, ly;
CWindowManager::Instance().GetMousePosition(lx, ly);
int ixLocal = lx - m_rect.left;
int iyLocal = ly - m_rect.top;
// NOTE : 왼쪽 맨위 상단 한곳이 기준 이라는 점을 이용해 왼쪽 위에서부터 오른쪽 아래로
// 차례로 검색해 감으로써 덮혀 있는 Slot은 자동 무시 된다는 특성을 이용한다. - [levites]
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
int ixCellSize = rSlot.ixCellSize;
int iyCellSize = rSlot.iyCellSize;
// NOTE : Item이 Hide 되어있을 경우를 위한..
if (rSlot.isItem)
{
ixCellSize = max(rSlot.ixCellSize, int(rSlot.byxPlacedItemSize * ITEM_WIDTH));
iyCellSize = max(rSlot.iyCellSize, int(rSlot.byyPlacedItemSize * ITEM_HEIGHT));
}
if (ixLocal >= rSlot.ixPosition)
if (iyLocal >= rSlot.iyPosition)
if (ixLocal <= rSlot.ixPosition + ixCellSize)
if (iyLocal <= rSlot.iyPosition + iyCellSize)
{
*ppSlot = &rSlot;
return TRUE;
}
}
return FALSE;
}
void CSlotWindow::SetUseMode(BOOL bFlag)
{
m_isUseMode = bFlag;
}
void CSlotWindow::SetUsableItem(BOOL bFlag)
{
m_isUsableItem = bFlag;
}
void CSlotWindow::ReserveDestroyCoolTimeFinishEffect(DWORD dwSlotIndex)
{
m_ReserveDestroyEffectDeque.push_back(dwSlotIndex);
}
#ifdef ENABLE_SASH_SYSTEM
void CSlotWindow::ActivateEffect(DWORD dwSlotIndex, float r, float g, float b, float a)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotIndex, &pSlot))
return;
for (int i = 0; i < 3; ++i)
{
if (pSlot->pActiveSlotEffect)
{
delete pSlot->pActiveSlotEffect;
pSlot->pActiveSlotEffect = NULL;
}
CAniImageBox * pEff = new CAniImageBox(NULL);
for (int j = 0; j <= 12; ++j)
{
char cBuf[72];
sprintf_s(cBuf, "d:/ymir work/ui/public/slotactiveeffect/slot%d/%02d.sub", (i + 1), j);
pEff->AppendImage(cBuf, r, g, b, a);
}
pEff->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
pSlot->pActiveSlotEffect = pEff;
}
}
void CSlotWindow::DeactivateEffect(DWORD dwSlotIndex)
{
TSlot * pSlot;
if (!GetSlotPointer(dwSlotIndex, &pSlot))
return;
for (int i = 0; i < 3; ++i)
{
if (pSlot->pActiveSlotEffect)
{
delete pSlot->pActiveSlotEffect;
pSlot->pActiveSlotEffect = NULL;
}
}
}
#endif
DWORD CSlotWindow::Type()
{
static int s_Type = GetCRC32("CSlotWindow", strlen("CSlotWindow"));
return s_Type;
}
BOOL CSlotWindow::OnIsType(DWORD dwType)
{
if (CSlotWindow::Type() == dwType)
return TRUE;
return CWindow::OnIsType(dwType);
}
void CSlotWindow::__CreateToggleSlotImage()
{
__DestroyToggleSlotImage();
m_pToggleSlotImage = new CImageBox(NULL);
m_pToggleSlotImage->LoadImage("d:/ymir work/ui/public/slot_toggle.sub");
m_pToggleSlotImage->Show();
}
void CSlotWindow::__CreateSlotEnableEffect()
{
__DestroySlotEnableEffect();
m_pSlotActiveEffect = new CAniImageBox(NULL);
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/00.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/01.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/02.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/03.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/04.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/05.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/06.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/07.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/08.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/09.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/10.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/11.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/12.sub");
m_pSlotActiveEffect->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
m_pSlotActiveEffect->Show();
}
void CSlotWindow::__CreateFinishCoolTimeEffect(TSlot * pSlot)
{
__DestroyFinishCoolTimeEffect(pSlot);
CAniImageBox * pFinishCoolTimeEffect = new CCoolTimeFinishEffect(this, pSlot->dwSlotNumber);
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/00.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/01.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/02.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/03.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/04.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/05.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/06.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/07.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/08.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/09.sub");
pFinishCoolTimeEffect->AppendImage("d:/ymir work/ui/public/slotfinishcooltimeeffect/10.sub");
pFinishCoolTimeEffect->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
pFinishCoolTimeEffect->ResetFrame();
pFinishCoolTimeEffect->SetDelay(2);
pFinishCoolTimeEffect->Show();
pSlot->pFinishCoolTimeEffect = pFinishCoolTimeEffect;
}
void CSlotWindow::__CreateBaseImage(const char * c_szFileName, float fr, float fg, float fb, float fa)
{
__DestroyBaseImage();
CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
m_pBaseImageInstance = CGraphicImageInstance::New();
m_pBaseImageInstance->SetImagePointer(pImage);
m_pBaseImageInstance->SetDiffuseColor(fr, fg, fb, fa);
}
void CSlotWindow::__CreateBaseImageScale(const char * c_szFileName, float fr, float fg, float fb, float fa, float sx, float sy)
{
__DestroyBaseImage();
CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(c_szFileName);
m_pBaseImageInstance = CGraphicImageInstance::New();
m_pBaseImageInstance->SetImagePointer(pImage);
m_pBaseImageInstance->SetDiffuseColor(fr, fg, fb, fa);
m_pBaseImageInstance->SetScale(sx, sy);
}
void CSlotWindow::__DestroyToggleSlotImage()
{
if (m_pToggleSlotImage)
{
delete m_pToggleSlotImage;
m_pToggleSlotImage = NULL;
}
}
void CSlotWindow::__DestroySlotEnableEffect()
{
if (m_pSlotActiveEffect)
{
delete m_pSlotActiveEffect;
m_pSlotActiveEffect = NULL;
}
}
void CSlotWindow::__DestroyFinishCoolTimeEffect(TSlot * pSlot)
{
if (pSlot->pFinishCoolTimeEffect)
{
delete pSlot->pFinishCoolTimeEffect;
pSlot->pFinishCoolTimeEffect = NULL;
}
}
void CSlotWindow::__DestroyBaseImage()
{
if (m_pBaseImageInstance)
{
CGraphicImageInstance::Delete(m_pBaseImageInstance);
m_pBaseImageInstance = NULL;
}
}
void CSlotWindow::__Initialize()
{
m_dwSlotType = 0;
m_dwSlotStyle = SLOT_STYLE_PICK_UP;
m_dwToolTipSlotNumber = SLOT_NUMBER_NONE;
m_isUseMode = FALSE;
m_isUsableItem = FALSE;
m_pToggleSlotImage = NULL;
m_pSlotActiveEffect = NULL;
m_pBaseImageInstance = NULL;
}
void CSlotWindow::Destroy()
{
for (TSlotListIterator itor = m_SlotList.begin(); itor != m_SlotList.end(); ++itor)
{
TSlot & rSlot = *itor;
ClearSlot(&rSlot);
if (rSlot.pNumberLine)
{
delete rSlot.pNumberLine;
rSlot.pNumberLine = NULL;
}
if (rSlot.pCoverButton)
{
CWindowManager::Instance().DestroyWindow(rSlot.pCoverButton);
}
if (rSlot.pSlotButton)
{
CWindowManager::Instance().DestroyWindow(rSlot.pSlotButton);
}
if (rSlot.pSignImage)
{
CWindowManager::Instance().DestroyWindow(rSlot.pSignImage);
}
if (rSlot.pFinishCoolTimeEffect)
{
CWindowManager::Instance().DestroyWindow(rSlot.pFinishCoolTimeEffect);
}
#ifdef ENABLE_SASH_SYSTEM
for (int i = 0; i < 3; ++i)
{
if (rSlot.pActiveSlotEffect)
CWindowManager::Instance().DestroyWindow(rSlot.pActiveSlotEffect);
}
#endif
}
m_SlotList.clear();
__DestroyToggleSlotImage();
__DestroySlotEnableEffect();
__DestroyBaseImage();
__Initialize();
}
CSlotWindow::CSlotWindow(PyObject * ppyObject) : CWindow(ppyObject)
{
__Initialize();
}
CSlotWindow::~CSlotWindow()
{
Destroy();
}
Link to comment
Share on other sites
Top Posters For This Question
2
Popular Days
Mar 14
2
Top Posters For This Question
.Zero. 2 posts
Popular Days
Mar 14 2017
2 posts
1 answer to this question
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now