В процессе работы столкнулся с необходимостью со стороны сервера убирать возможность закрывать диалоговое окно нпс "стандартной" кнопкой, поделюсь с другими, может кому пригодится, итак начнем нам потребуются исходники interface.u, компилятор interface.u (есть в шаре), xdat editor (есть в шаре) идем в исходники interface.u, открываем NPCDialogWnd.uc добавляем следующий код: Код: //вверху var ButtonHandle exitButton; var int hideexitbutton; function OnLoad() //в эту функцию добавить код в соответствии с условием { if(CREATE_ON_DEMAND==0) { exitButton = ButtonHandle( GetHandle( "NPCDialogWnd.exitbutton" ) ); } else { exitButton = GetButtonHandle( "NPCDialogWnd.exitbutton" ); } } function OnEvent(int Event_ID, String param)//в эту функцию добавить код в соответствии с условием { switch(Event_ID) { case EV_QuestIDWndLoadHtmlFromString: exitButton.HideWindow(); break; } } function HandleLoadHtmlFromString(string param)//вставляем полностью вместо старой функции { local string htmlString; local int i; ParseInt(param, "hideexitbutton", i); hideexitbutton = i; ParseString(param, "HTMLString", htmlString); m_hHtmlViewer.LoadHtmlFromString(htmlString); } function OnClickButton( string Name )//вставляем полностью вместо старой функции { if( Name == "exitbutton" ) // 혈원 정보. 파티 초대 { PressCloseButton(); m_hNPCDialogWnd.HideWindow(); exitButton.HideWindow(); } } function HideNPCDialogWnd()//вставляем полностью вместо старой функции { m_hNpcDialogWnd.HideWindow(); exitButton.HideWindow(); m_bReShowNPCDialogWnd = false; } function ShowNPCDialogWnd()//вставляем полностью вместо старой функции { local PrivateShopWnd kPrivateShop; ExecuteEvent(EV_QuestHtmlWndHide); kPrivateShop = PrivateShopWnd(GetScript("PrivateShopWnd")); if (IsShowWindow("PrivateShopWnd")) { kPrivateShop.RequestQuit(); HideWindow("PrivateShopWnd"); } m_hNPCDialogWnd.ShowWindow(); m_hNPCDialogWnd.SetFocus(); if(hideexitbutton > 0) {//если параметр больше нуля - скрыть кнопку exitButton.HideWindow(); } else {//иначе - показать exitButton.ShowWindow(); } m_bReShowNPCDialogWnd = true; } собираем interface.u открываем interface.xdat скрипт под highfive: Код: xdat.windows["NPCDialogWnd"].children.add(new Button()) xdat.windows["NPCDialogWnd"].children["null"].name = "exitbutton" xdat.windows["NPCDialogWnd"].children["exitbutton"].parentName = "NPCDialogWnd" xdat.windows["NPCDialogWnd"].children["exitbutton"].normalTex = "l2ui_ch3.FRAMECTRL.FrameCloseBtn" xdat.windows["NPCDialogWnd"].children["exitbutton"].pushedTex = "l2ui_ch3.FRAMECTRL.FrameCloseOnBtn" xdat.windows["NPCDialogWnd"].children["exitbutton"].buttonNameText = "undefined" xdat.windows["NPCDialogWnd"].children["exitbutton"].size_absolute_width = 16 xdat.windows["NPCDialogWnd"].children["exitbutton"].size_absolute_height = 16 xdat.windows["NPCDialogWnd"].children["exitbutton"].anchored = true xdat.windows["NPCDialogWnd"].children["exitbutton"].size = true xdat.windows["NPCDialogWnd"].children["exitbutton"].alwaysOnTop = true xdat.windows["NPCDialogWnd"].children["exitbutton"].relativePoint = Alignment.TOP_RIGHT xdat.windows["NPCDialogWnd"].children["exitbutton"].anchorPoint = Alignment.TOP_RIGHT xdat.windows["NPCDialogWnd"].children["exitbutton"].usePosition = true xdat.windows["NPCDialogWnd"].children["exitbutton"].anchor_x = -6.0 xdat.windows["NPCDialogWnd"].children["exitbutton"].anchor_y = 7.0 xdat.windows["NPCDialogWnd"].exitbutton = false сохраняем, на этом клиент часть готова, чтобы убрать кнопку закрыть в штмл(серверсайд) добавить: Код: <html noscrollbar hideexitbutton=1> //например так, я добавляю параметр в тег <html> открываем нужное нам окно и радуемся P.S. аналогичным образом можно задавать размеры диалогового окна, ну и как вариант в хрониках Gracia и т.п. установить background Спасибо за внимание
апдейт, добавил изменение размера окна Код: //вверху var ButtonHandle exitButton; var int hideexitbutton; const oldwidth = 314; const oldheigth = 408; function OnLoad() //в эту функцию добавить код в соответствии с условием { if(CREATE_ON_DEMAND==0) { exitButton = ButtonHandle( GetHandle( "NPCDialogWnd.exitbutton" ) ); } else { exitButton = GetButtonHandle( "NPCDialogWnd.exitbutton" ); } } function OnEvent(int Event_ID, String param)//в эту функцию добавить код в соответствии с условием { switch(Event_ID) { case EV_QuestIDWndLoadHtmlFromString: exitButton.HideWindow(); break; } } function HandleLoadHtmlFromString(string param)//вставляем полностью вместо старой функции { local string htmlString; local int i; ParseInt(param, "hideexitbutton", i); ParseInt(param, "whdwidth", width); ParseInt(param, "wndheight", heigth); hideexitbutton = i; if(width > 0 && heigth > 0) { m_hNPCDialogWnd.setWindowSize(width, heigth); } else { m_hNPCDialogWnd.setWindowSize(oldwidth, oldheigth); } ParseString(param, "HTMLString", htmlString); m_hHtmlViewer.LoadHtmlFromString(htmlString); } function OnClickButton( string Name )//вставляем полностью вместо старой функции { if( Name == "exitbutton" ) // 혈원 정보. 파티 초대 { PressCloseButton(); m_hNPCDialogWnd.HideWindow(); exitButton.HideWindow(); } } function HideNPCDialogWnd()//вставляем полностью вместо старой функции { m_hNpcDialogWnd.HideWindow(); exitButton.HideWindow(); m_bReShowNPCDialogWnd = false; } function ShowNPCDialogWnd()//вставляем полностью вместо старой функции { local PrivateShopWnd kPrivateShop; ExecuteEvent(EV_QuestHtmlWndHide); kPrivateShop = PrivateShopWnd(GetScript("PrivateShopWnd")); if (IsShowWindow("PrivateShopWnd")) { kPrivateShop.RequestQuit(); HideWindow("PrivateShopWnd"); } m_hNPCDialogWnd.ShowWindow(); m_hNPCDialogWnd.SetFocus(); if(hideexitbutton > 0) {//если параметр больше нуля - скрыть кнопку exitButton.HideWindow(); } else {//иначе - показать exitButton.ShowWindow(); } m_bReShowNPCDialogWnd = true; } серверсайд: Код: <html noscrollbar hideexitbutton=1 wndwidth=500 wndheight=500>