Jump to content

Risan

Inactive Member
  • Posts

    87
  • Joined

  • Last visited

  • Days Won

    1
  • Feedback

    0%

Everything posted by Risan

  1. Test this: int item_unequip_selected(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!lua_isnumber(L, 1)) { sys_err("Argument error."); lua_pushboolean(L, false); return 1; } BYTE bCell = lua_tonumber(L, 1); //bcell == BYTE, iCell == INT, dCell == DWORD .... if (bCell < 0 || bCell >= WEAR_MAX_NUM) { sys_err("Invalid wear position %d. Index out of range(0..%d)", bCell, WEAR_MAX_NUM); lua_pushboolean(L, false); return 1; } LPITEM item = CQuestManager::instance().GetCurrentItem(); //current item in used LPITEM equipped = ch->GetWear(bCell); //current equipped item on target slot //check the pointers if (!ch || !item) { sys_err("No Item or Character Visible."); lua_pushboolean(L,false); return 1; } //remove the equipped item if (equipped->GetVnum() != NULL || item->IsEquipped()) { sys_log(0, "item_unequip_selected Player: %s Vnum: %d Cell: %d ::: TRUE ",ch->GetName(), item->GetVnum(), bCell); ch->UnequipItem(equipped); lua_pushboolean(L, true); return 1; } else { sys_log(0, "item_unequip_selected Player: %s Vnum: %d Cell: %d ::: False ",ch->GetName(), item->GetVnum(), bCell); lua_pushboolean(L, false); return 1; } }
  2. Error on VS 2008.. Boost Libs is added. But Error comming from cryptlib.lib
  3. added: boost_system-vc90-mt-1_57.lib, boost_thread-vc90-mt-1_57.lib,libboost_system-vc90-sgd-1_57.lib and libboost_thread-vc90-mt-sgd-1_57.lib to lib folder in boost ..
  4. hey, is a complex on insert neu Character? On Python and c++ ?
  5. Hello People, i created a small BanCenter for GameMasters.. It is not large, but is but simplifies some. The Serverside Code (on c++ or Lua) can you self create.. I havent now this.. # # GM Ban-Board by @Risan aka Zymos # Version 1.0 Alpha # Created: 03.10.2014 # LastUpdate: 03.10.2014 # import ui import chat import uiCommon CurrentlyBanTable = [ #Time { "NameK":"Userbeleidigung", "day":1, "hours":200, "mins":10, }, { "NameK":"Nachfrage von Fremdprogramme/Hacks/Bots", "day":1, "hours":200, "mins":10, }, { "NameK":"Obszöne Spiele/Shop/Gildennamen", "day":1, "hours":200, "mins":10, }, { "NameK":"Teambeleidigung", "day":1, "hours":200, "mins":10, }, { "NameK":"Bugausnutzung", "day":1, "hours":200, "mins":10, }, #perm 999 day == Permament ban { "NameK":"Cheaten/Haecken (PERM)", "day":999, "hours":0, "mins":0, }, { "NameK":"Clientmanipulierung (PERM)", "day":999, "hours":0, "mins":0, }, { "NameK":"Kauf/Verkauf von virtuellen Guetern (PERM)", "day":999, "hours":0, "mins":0, }, { "NameK":"Fremdwerbung (jeglicher art) (PERM)", "day":999, "hours":0, "mins":0, }, ] QuestionBeforeBan = True class GmBanBoard(ui.Window): def __init__(self): ui.Window.__init__(self) self.BuildWindow() def __del__(self): ui.Window.__del__(self) def BuildWindow(self): self.Board = ui.BoardWithTitleBar() self.Board.SetSize(310, 120) #x y self.Board.SetCenterPosition() self.Board.AddFlag('movable') self.Board.AddFlag('float') self.Board.SetTitleName('GameMaster - BanCenter') self.Board.SetCloseEvent(self.Close) self.comp = Component() #Ban Duration and Edits Desc self.DurationDesc = self.comp.TextLine(self.Board,"Laufzeit:", 10,60, self.comp.RGB(255, 255, 255)) self.DayEdit ,self.DayEdits = self.comp.EditLine(self.Board, '0',65, 60, 20, 15, 3) #parent, editlineText, x, y, width, heigh, max self.DayDesc = self.comp.TextLine(self.Board,"Tag(e)", 65+25,60, self.comp.RGB(255, 255, 255)) self.DayEdits.SetNumberMode() self.DayEdits.OnIMEUpdate = ui.__mem_func__(self.__OnUpdateValueEdit) self.HourEdit ,self.HourEdits = self.comp.EditLine(self.Board, '0',65+65, 60, 20, 15, 3) #parent, editlineText, x, y, width, heigh, max self.HourDesc = self.comp.TextLine(self.Board,"Stunden(n)", 65+25+65,60, self.comp.RGB(255, 255, 255)) self.HourEdits.SetNumberMode() self.HourEdits.OnIMEUpdate = ui.__mem_func__(self.__OnUpdateValueEdit) self.MinEdit ,self.MinEdits = self.comp.EditLine(self.Board, '0',65+65+85, 60, 20, 15, 3) #parent, editlineText, x, y, width, heigh, max self.MinDesc = self.comp.TextLine(self.Board,"Minute(n)", 65+25+65+85,60, self.comp.RGB(255, 255, 255)) self.MinEdits.SetNumberMode() self.MinEdits.OnIMEUpdate = ui.__mem_func__(self.__OnUpdateValueEdit) #SaktionUser self.SaktionDescName = self.comp.TextLine(self.Board,"UserName:", 10,90, self.comp.RGB(255, 255, 255)) self.SaktionNameEdit ,self.SaktionNameEdits = self.comp.EditLine(self.Board, '',65, 90, 100, 15, 18) #parent, editlineText, x, y, width, heigh, max #Buttons self.ClickOkButton = self.comp.Button(self.Board, 'Setzen', 'Setzt die Sanktion', 170, 90, self._ClickSetButton, 'd:/ymir work/ui/public/middle_button_01.sub', 'd:/ymir work/ui/public/middle_button_02.sub', 'd:/ymir work/ui/public/middle_button_03.sub') self.ClickAbortButton = self.comp.Button(self.Board, 'Abbruch', 'Schliessen', 235, 90, self.Close, 'd:/ymir work/ui/public/middle_button_01.sub', 'd:/ymir work/ui/public/middle_button_02.sub', 'd:/ymir work/ui/public/middle_button_03.sub') #Ban ComboBox #LOAD LAST!!! self._LoadComboBox() def _ClickSetButton(self): GetUserName = self.SaktionNameEdits .GetText() if len(GetUserName) == 0: self.PopupMessage("Du musst einen gueltigen Namen angeben!") return if self.DayEdits .GetText() == 0 and self.HourEdits .GetText() == 0 and self.MinEdits .GetText() == 0: self.PopupMessage("Ungueltige Zeitangaben!") return if self.CurrentBanType == 0: self.PopupMessage("Du musst einen Grund auswaehlen!") return if QuestionBeforeBan == True: questiontext = "Moechtest du wirklich '" + str( GetUserName ) +"' Bannen?" questionDialog = uiCommon.QuestionDialog2() questionDialog.SetText1(questiontext) questionDialog.SetText2( str(" Laufzeit: " + str( self.DayEdits .GetText() ) + " Tag(e) | " + str( self.HourEdits .GetText() ) + " Stunde(n) | " + str( self.MinEdits .GetText() ) + " Minute(n) ") ) questionDialog.SetAcceptEvent(ui.__mem_func__(self.questionDialog__Accept)) questionDialog.SetCancelEvent(ui.__mem_func__(self.questionDialog_Cleras)) questionDialog.SetWidth(280) questionDialog.Open() self.dlgQuestion = questionDialog else: self._Banned() def PopupMessage(self, msg): self.wndPopupDialog = uiCommon.PopupDialog() self.wndPopupDialog.SetText(msg) self.wndPopupDialog.Open() def questionDialog__Accept(self): self._Banned() self.questionDialog_Cleras() def questionDialog_Cleras(self): self.dlgQuestion = None def _Banned(self): GetUserName = self.SaktionNameEdits .GetText() BanType = self.CurrentBanType BanGrund = str( CurrentlyBanTable[BanType]["NameK"] ) Days = self.DayEdits .GetText() Hours = self.HourEdits .GetText() Mins = self.MinEdits .GetText() chat.AppendChat(1,"Fucking Banned Command is Answer") self.Close() def _LoadComboBox(self): self.BanTextDesc = self.comp.TextLine(self.Board,"Ban Grund:", 10,35, self.comp.RGB(255, 255, 255)) self.CurrentBanType = 0 self.ComboBoxBans = self.comp.ComboBox(self.Board, 'Waehle den BanGrund',65, 35, 225) #x y BreiteDerBox for x in xrange( len(CurrentlyBanTable) ): self.ComboBoxBans.InsertItem(x, str( CurrentlyBanTable[x]["NameK"] ) ) self.ComboBoxBans.SetEvent(self._OnClickComboBoxBans) def __OnUpdateValueEdit(self): SelfCheckEdit = False if SelfCheckEdit == True: ui.EditLine.OnIMEUpdate(self.DayEdits) ui.EditLine.OnIMEUpdate(self.HourEdits) ui.EditLine.OnIMEUpdate(self.MinEdits) def _OnClickComboBoxBans(self,index): self.CurrentBanType = index self.ComboBoxBans.SetCurrentItem( str( CurrentlyBanTable[ self.CurrentBanType ]["NameK"] ) ) self.DayEdits .SetText( str( CurrentlyBanTable[ self.CurrentBanType ]["day"] ) ) self.HourEdits .SetText( str( CurrentlyBanTable[ self.CurrentBanType ]["hours"] ) ) self.MinEdits .SetText( str( CurrentlyBanTable[ self.CurrentBanType ]["mins"] ) ) def _SetName(self,arg1): self.SaktionNameEdits .SetText( str( arg1 ) ) #Standart def Close(self): self.Board.Hide() self.questionDialog_Cleras() #BugFix! def Show(self): self.Board.Show() def Destroy(self): self.Board = None self.comp = None def Openwindow(self): if self.Board.IsShow(): self.Board.Hide() else: self.Board.Show() #Zusatz class Component: def ComboBox(self, parent, text, x, y, width): combo = ui.ComboBox() if parent != None: combo.SetParent(parent) combo.SetPosition(x, y) combo.SetSize(width, 15) combo.SetCurrentItem(text) combo.Show() return combo def TextLine(self, parent, textlineText, x, y, color): textline = ui.TextLine() if parent != None: textline.SetParent(parent) textline.SetPosition(x, y) if color != None: textline.SetFontColor(color[0], color[1], color[2]) textline.SetText(textlineText) textline.Show() return textline def EditLine(self, parent, editlineText, x, y, width, heigh, max): SlotBar = ui.SlotBar() if parent != None: SlotBar.SetParent(parent) SlotBar.SetSize(width, heigh) SlotBar.SetPosition(x, y) SlotBar.Show() Value = ui.EditLine() Value.SetParent(SlotBar) Value.SetSize(width, heigh) Value.SetPosition(1, 1) Value.SetMax(max) Value.SetLimitWidth(width) Value.SetMultiLine() Value.SetText(editlineText) #Value.SetHorizontalAlignRight() Value.Show() return SlotBar, Value def RGB(self, r, g, : return (r*255, g*255, b*255) def Button(self, parent, buttonName, tooltipText, x, y, func, UpVisual, OverVisual, DownVisual): button = ui.Button() if parent != None: button.SetParent(parent) button.SetPosition(x, y) button.SetUpVisual(UpVisual) button.SetOverVisual(OverVisual) button.SetDownVisual(DownVisual) button.SetText(buttonName) button.SetToolTipText(tooltipText) button.Show() button.SetEvent(func) return button GmBanBoard().Show() Best Regards, Risan Screenshort:
  6. when login with pc.get_map_index() == 113 begin pc.setqf("inv", 1) pc.make_invisible(60*60*24) -- on inv end when login and pc.getqf("inv") == 1 begin pc.setqf("inv", 0) pc.make_invisible(1) --- of inv end or create new questfunction.. unmakeinvisible ...
  7. Omg.. Can like this: from: if (!lua_isnumber(L, 1)) { sys_err("pc_makemeinvisible ERRROR : wrong argument (time)"); return 0; } int iDuration = lua_tonumber(L, 1); to replace: if (!lua_isnumber(L, 1)) { // sys_err("pc_makemeinvisible ERRROR : wrong argument (time)"); //return 0; int iDuration = 216000; //60*60*60 } else { int iDuration = lua_tonumber(L, 1); }
  8. Thats is better: int pc_makemeinvisible(lua_State* L) //syntax: pc_makemeinvisible(seconds) { if (!lua_isnumber(L, 1)) { sys_err("pc_makemeinvisible ERRROR : wrong argument (time)"); return 0; } int iDuration = lua_tonumber(L, 1); if (iDuration < 0) { sys_err("pc_makemeinvisible ERRROR : time is negative %u",iDuration); return 0; } LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) { sys_err("pc_makemeinvisible FATALL ERROR : No Character Answer!"); return 0; } if (ch->IsAffectFlag(AFF_INVISIBILITY)) { ch->RemoveAffect(AFF_INVISIBILITY); } ch->AddAffect(AFF_INVISIBILITY, POINT_NONE, 0, AFF_INVISIBILITY, iDuration, 0, true); sys_log(0, "QUEST pc_makemeinvisible -> PlayerName: %s Duration: %u", ch->GetName(), iDuration); return 0; }
  9. Nothing, python is compiled to C... C is in rootlib.. and Rootlib is in the Binary..
  10. use new client.. Ymir have this implemented. Nutze den neuen Client, Ymir hat dies bereits implentiert.
  11. is QuestFlag enable, the Player cannot annything Drop, Trade,Sell items..! is Nice for GameMasters..
  12. M2 Download Center Download Here ( Internal ) Germany: Hallo leute, ich hab heute Gm-Items erstellt und diese sollte man nicht handeln (Lösbar per Antiflag), Nun wollte ich aber das der ganze Charakter nicht handeln kann, Idee per Game dies zu regeln. Nach kurzen überlegen kamm dies hierbei raus: Ordner: game/src/ char.cpp (Zeile: 584) -> void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, WORD bItemCount) void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, WORD bItemCount) { if (GetPart(PART_MAIN) > 2) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°©¿ÊÀ» ¹þ¾î¾ß °³ÀÎ »óÁ¡À» ¿­ ¼ö ÀÖ½À´Ï´Ù.")); return; } if (GetMyShop()) // ÀÌ¹Ì ¼¥ÀÌ ¿­·Á ÀÖÀ¸¸é ´Ý´Â´Ù. { CloseMyShop(); return; } if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return; } char_battle.cpp (Zeile: 985) -> void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller) void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller) { // °³ÀλóÁ¡À» ¿¬ »óÅ¿¡¼­´Â ¾ÆÀÌÅÛÀ» µå·ÓÇÏÁö ¾Ê´Â´Ù. if (GetMyShop()) return; if (false == LC_IsYMIR()) { if (GetLevel() < 50) return; } if (CBattleArena::instance().IsBattleArenaMap(GetMapIndex()) == true) { return; } struct TItemDropPenalty * table = &aItemDropPenalty_kor[0]; if (GetLevel() < 10) return; if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { //ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return; } char_item.cpp (Zeile: 5437) -> bool CHARACTER::DropItem(TItemPos Cell, WORD bCount) bool CHARACTER::DropItem(TItemPos Cell, WORD bCount) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°­È­Ã¢À» ¿¬ »óÅ¿¡¼­´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return false; } exchange.cpp (Zeile: 139) -> bool CExchange::AddItem(TItemPos item_pos, WORD display_pos) bool CExchange::AddItem(TItemPos item_pos, WORD display_pos) { assert(m_pOwner != NULL && GetCompany()); if (!item_pos.IsValidItemPosition()) return false; // Àåºñ´Â ±³È¯ÇÒ ¼ö ¾øÀ½ if (item_pos.IsEquipPosition()) return false; LPITEM item; if (!(item = m_pOwner->GetItem(item_pos))) return false; if ( int(m_pOwner->GetQuestFlag("BlockItem.Enable")) == 1 ) { m_pOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return false; } Quest: --[[ -- BlockItems -- lvl 1+ -- Copyright ©Zymos/Risan -- Version 1.0 -- Create: 14.09.2014 ]] quest BlockItem begin state start begin when 9010.chat."BlockItems Manager" begin local f = "BlockItem" say("Status: ".. pc.getf(f,"Enable") .."") if select("Disable","Enable") == 1 then pc.setf(f,"Enable",0) chat("BlockItems is now Disabled") else pc.setf(f,"Enable",1) chat("BlockItems is now Enabled") end end end end Info: Wenn aktiviert kann der Charakter nichts mehr Fallen lassen, handeln oder verkaufen im Shop. Mfg Risan English: Hello, People, I have created GM_items today but this items should not be tradable. (With Antiflag) Now, however, I did not want the whole character can act. So i wrote this: char.cpp (Line: 584) -> void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, WORD bItemCount) void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, WORD bItemCount) { if (GetPart(PART_MAIN) > 2) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°©¿ÊÀ» ¹þ¾î¾ß °³ÀÎ »óÁ¡À» ¿­ ¼ö ÀÖ½À´Ï´Ù.")); return; } if (GetMyShop()) // ÀÌ¹Ì ¼¥ÀÌ ¿­·Á ÀÖÀ¸¸é ´Ý´Â´Ù. { CloseMyShop(); return; } if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return; } char_battle.cpp (Line: 985) -> void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller) void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller) { // °³ÀλóÁ¡À» ¿¬ »óÅ¿¡¼­´Â ¾ÆÀÌÅÛÀ» µå·ÓÇÏÁö ¾Ê´Â´Ù. if (GetMyShop()) return; if (false == LC_IsYMIR()) { if (GetLevel() < 50) return; } if (CBattleArena::instance().IsBattleArenaMap(GetMapIndex()) == true) { return; } struct TItemDropPenalty * table = &aItemDropPenalty_kor[0]; if (GetLevel() < 10) return; if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { //ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return; } char_item.cpp (Line: 5437) -> bool CHARACTER::DropItem(TItemPos Cell, WORD bCount) bool CHARACTER::DropItem(TItemPos Cell, WORD bCount) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°­È­Ã¢À» ¿¬ »óÅ¿¡¼­´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if ( int(GetQuestFlag("BlockItem.Enable")) == 1 ) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return false; } exchange.cpp (Line: 139) -> bool CExchange::AddItem(TItemPos item_pos, WORD display_pos) bool CExchange::AddItem(TItemPos item_pos, WORD display_pos) { assert(m_pOwner != NULL && GetCompany()); if (!item_pos.IsValidItemPosition()) return false; // Àåºñ´Â ±³È¯ÇÒ ¼ö ¾øÀ½ if (item_pos.IsEquipPosition()) return false; LPITEM item; if (!(item = m_pOwner->GetItem(item_pos))) return false; if ( int(m_pOwner->GetQuestFlag("BlockItem.Enable")) == 1 ) { m_pOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("DENIED! You cannot Drop this Item. You Char is blocked!")); return false; } Quest: --[[ -- BlockItems -- lvl 1+ -- Copyright ©Zymos/Risan -- Version 1.0 -- Create: 14.09.2014 ]] quest BlockItem begin state start begin when 9010.chat."BlockItems Manager" begin local f = "BlockItem" say("Status: ".. pc.getf(f,"Enable") .."") if select("Disable","Enable") == 1 then pc.setf(f,"Enable",0) chat("BlockItems is now Disabled") else pc.setf(f,"Enable",1) chat("BlockItems is now Enabled") end end end end Info: If enable the chrakater can`t drop or trade Items! Best Regards, Risan heave a idea on create Spoiler?
  13. hello, not realy.. check you source.. on all DestroyItemEvent what ever.... EDIT: Search; StartDestroyEvent and look EDIT2: Go Source, Open item.cpp void CItem::StartDestroyEvent(int iSec) { if (m_pkDestroyEvent) return; item_event_info* info = AllocEventInfo<item_event_info>(); info->item = this; SetDestroyEvent(event_create(item_destroy_event, info, PASSES_PER_SEC(300))); } is better..
  14. she have my version.cpp.. and is works on my files.. #include <stdio.h> #include <stdlib.h> void WriteVersion() { #ifndef __WIN32__ FILE* fp(fopen("game_VERSION.txt", "w")); if (NULL != fp) { fprintf(fp, "game perforce revision: %sn", __SVN_VERSION__); fprintf(fp, "%s@%s:%sn", __USER__, __HOSTNAME__, __PWD__); fclose(fp); } else { fprintf(stderr, "cannot open VERSION.txtn"); exit(0); } #endif }
  15. nothing error.. all Warning, you can ignor this.. ^.^
  16. Use grp ... Example: import grp self.TraceToolTip.AppendTextLine("Startgebot:" + str(NewStartGebot),grp.GenerateColor( (255.00 / 255) , (200.00 / 255), (72.00 / 255), 1.0)) Is Gold Text ^^
  17. XXXXX .AppendSpace(5) self.skill2.AppendSpace(5)
  18. This Code is not works, is correctly but why is not works.. I have no idea
  19. Risan

    Fix Bug Stone

    What exactly is the bug here?
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.