Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Leaderboard


Popular Content

Showing content with the highest reputation since 05/27/2020 in all areas

  1. 32 points
    1. Otwórz plik UserInterface/PythonNetworkStreamModule.cpp i znajdź w nim: #include "StdAfx.h" #include "PythonNetworkStream.h" //#include "PythonNetworkDatagram.h" #include "AccountConnector.h" #include "PythonGuild.h" #include "Test.h" #include "AbstractPlayer.h" static std::string gs_stServerInfo; extern BOOL gs_bEmpireLanuageEnable; std::list<std::string> g_kList_strCommand; Pod dodaj: static const char* ServerIPVName[2][2] = { {"10.10.143.100", "Metin2"}, // IP I NAZWA SERWERA {"192.168.43.7", "Metin2 Beta"} }; static unsigned int ServerPORT[] = {{13001},{13011},{13021},{13031},{13041},{13051},{11000},{13001}}; // PORTY PyObject* netGetServer_IPNAME(PyObject* poSelf, PyObject* poArgs) { return Py_BuildValue("ssss", ServerIPVName[0][0], ServerIPVName[0][1], ServerIPVName[1][0], ServerIPVName[1][1] ); } PyObject* netGetServer_PORT(PyObject* poSelf, PyObject* poArgs) { return Py_BuildValue("iiiiiiii", ServerPORT[0],ServerPORT[1],ServerPORT[2],ServerPORT[3],ServerPORT[4],ServerPORT[5],ServerPORT[6],ServerPORT[7]); } Znajdź: { "SendOnClickPacket", netOnClickPacket, METH_VARARGS }, { "SendMail", netSendMail, METH_VARARGS }, Pod dodaj: { "GetServer_IPNAME", netGetServer_IPNAME, METH_VARARGS }, { "GetServer_PORT", netGetServer_PORT, METH_VARARGS }, 2. Przykładowe serverinfo.py: import os import app import localeInfo import debugInfo import net (sv1_ip, sv1_name, sv2_ip, sv2_name) = net.GetServer_IPNAME() (ch1_port, ch2_port, ch3_port, ch4_port, ch5_port, ch6_port, auth_port, mark_port) = net.GetServer_PORT() CH_1_NAME = "CH1" CH_2_NAME = "CH2" CH_3_NAME = "CH3" CH_4_NAME = "CH4" CH_5_NAME = "CH5" CH_6_NAME = "CH6" STATE_NONE = localeInfo.SERVER_OFF STATE_DICT = { 0 : "|cFFFF0000|h...", 1 : "|cff00ff00|hNORM", 2 : "|cffFF6800|hBUSY", 3 : "|cffFF8300|hFULL" } SERVER01_CHANNEL_DICT = { 1:{"key":11,"name":CH_1_NAME,"ip":sv1_ip,"tcp_port":ch1_port,"udp_port":ch1_port,"state":STATE_NONE,}, 2:{"key":12,"name":CH_2_NAME,"ip":sv1_ip,"tcp_port":ch2_port,"udp_port":ch2_port,"state":STATE_NONE,}, 3:{"key":13,"name":CH_3_NAME,"ip":sv1_ip,"tcp_port":ch3_port,"udp_port":ch3_port,"state":STATE_NONE,}, 4:{"key":14,"name":CH_4_NAME,"ip":sv1_ip,"tcp_port":ch4_port,"udp_port":ch4_port,"state":STATE_NONE,}, 5:{"key":15,"name":CH_5_NAME,"ip":sv1_ip,"tcp_port":ch5_port,"udp_port":ch5_port,"state":STATE_NONE,}, 6:{"key":16,"name":CH_6_NAME,"ip":sv1_ip,"tcp_port":ch6_port,"udp_port":ch6_port,"state":STATE_NONE,}, } SERVER02_CHANNEL_DICT = { 1:{"key":11,"name":CH_1_NAME,"ip":sv2_ip,"tcp_port":ch1_port,"udp_port":ch1_port,"state":STATE_NONE,}, 2:{"key":12,"name":CH_2_NAME,"ip":sv2_ip,"tcp_port":ch2_port,"udp_port":ch2_port,"state":STATE_NONE,}, 3:{"key":13,"name":CH_3_NAME,"ip":sv2_ip,"tcp_port":ch3_port,"udp_port":ch3_port,"state":STATE_NONE,}, 4:{"key":14,"name":CH_4_NAME,"ip":sv2_ip,"tcp_port":ch4_port,"udp_port":ch4_port,"state":STATE_NONE,}, 5:{"key":15,"name":CH_5_NAME,"ip":sv2_ip,"tcp_port":ch5_port,"udp_port":ch5_port,"state":STATE_NONE,}, 6:{"key":16,"name":CH_6_NAME,"ip":sv2_ip,"tcp_port":ch6_port,"udp_port":ch6_port,"state":STATE_NONE,}, } REGION_NAME_DICT = { 0 : "", } REGION_AUTH_SERVER_DICT = { 0 : { 1 : { "ip":sv1_ip, "port":auth_port, }, 2 : { "ip":sv2_ip, "port":auth_port, }, } } REGION_DICT = { 0 : { 1 : { "name" :sv1_name, "channel" : SERVER01_CHANNEL_DICT, }, 2 : { "name" :sv2_name, "channel" : SERVER02_CHANNEL_DICT, }, }, } MARKADDR_DICT = { 10 : { "ip" : sv1_ip, "tcp_port" : mark_port, "mark" : "mark_0.tga", "symbol_path" : "10", }, 20 : { "ip" : sv2_ip, "tcp_port" : mark_port, "mark" : "mark_0.tga", "symbol_path" : "20", }, }
  2. 23 points
    Dzięki tej modyfikacji możemy najpierw zaznaczyć przedmioty na sprzedaż, policzyć ich łączną wartość i sprzedać je jednym kliknięciem. Extended-Sell.zip Hasło: metin2zone.pl
  3. 21 points
    Dość prosty dodatek, który cieszy oko i zapobiega podszywaniu się. 01. Otwórz interfaceModule.py w root i znajdź w nim: whisperButton = uiWhisper.WhisperButton() whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetOverVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetDownVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") Zamień na: whisperButton = uiWhisper.WhisperButton() import chr if self.listGMName.has_key(name): whisperButton.SetUpVisual("d:/ymir work/ui/gm_whisper.tga") whisperButton.SetOverVisual("d:/ymir work/ui/gm_whisper.tga") whisperButton.SetDownVisual("d:/ymir work/ui/gm_whisper.tga") else: whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetOverVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetDownVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") 02. Wrzuć do /ymir work/ui/: gm_whisper.tga
  4. 21 points
    1. Otwórz plik game/war_map.cpp i znajdź w nim funkcje: void CWarMap::STeamData::RemoveMember(LPCHARACTER ch) Zamień ją na: void CWarMap::STeamData::RemoveMember(LPCHARACTER ch) { set_pidJoiner.erase(ch->GetPlayerID());//RemoveMember fix --iMemberCount; }
  5. 15 points
    Siema łapcie tu parę super skrzydełek jak komuś się podoba mam tego dużo wieć pw coś wymyślimy. 1. 2. 3. Dowload/Skan: [Hidden Content] [Hidden Content]
  6. 15 points
    [Hidden Content] System do zarządzania statusem serwera. Posiadam również wersję premium z możliwością restartowania pojedyńczego kanału i kolorami oraz możliwość przeglądania syserr i syslog. Potrzebujesz questów, www lub innej usługi? Napisz do mnie Discord Alerin#5559
  7. 14 points
    Siema łapcie tu fajny secik jak komuś się podoba mam tego dużo wieć pw coś wymyślimy. Model woj M: Fryzura: Kostium: Całość: Modelka szamanka K: Fryzura: Kostium: Całość: Nakładki Przykład dwu ręka: \ Dowload/Skan: [Hidden Content] [Hidden Content] #Bonus Skrzydła do setu już dodałem chyba na forum dzisiaj :3
  8. 14 points
    Cześć, Sprawa troszkę się skomplikowała i teraz próbujecie odsprzedawać nawet to, co umieściłem tutaj kilka miesięcy temu w temacie. Dostaję masę próśb o reupload, także trzymajcie. Jeśli ładnie poprosicie wrzucę wam gotową vmkę i dedykowane polskie locale, ale chciałbym żebyście włożyli w to wszystko troszkę swojej pracy. W paczce z plikami dorzuciłem gratisowo koreańskie (ymir) questy. Generalny opis plików [Hidden Content] Client Client_Podstawowy.rar Packer Decripter_of_Client.rar Pliki serwerowe file_server.tar Source Source_Rozszerzone.tar.gz Tabelki Table_of_Navicat.rar MySQL2Proto Tools.rar
  9. 13 points
    Siemanko. Nasi brudni przyjaciele wrzucili ostatnio poradnik. Trochę go przerobiłem bo tamten tylko na C++ 11 śmigał. Działa oczywiście ze sklepami offline i każdymi innymi. Kod jest w porządku, nie trzeba nic poprawiać. System oblicza średnią wartość rynkową przedmiotu na podstawie wystawionych itemów we wszystkich sklepach. Przyjdźmy do sedna sprawy, system prezentuje się następująco: POBIERZ PACZKĘ SKAN PACZKI Hasło do paczki: m2zone.pl Pozdrawiam, Shaggy
  10. 12 points
    Nie wiem czy było to na tym forum czy nie ale wrzucę ;d [Hidden Content] Skan. [Hidden Content]
  11. 12 points
    Otwieramy uiinventory.py Znajdź to: Zamień na to: Dodaj na końcu pliku: def OnUpdate(self): self.ActualizarBonus() Znajdź to: wndItem = self.GetChild("ItemSlot") wndEquip = self.GetChild("EquipmentSlot") Dodaj pod: self.ButonMinimize = self.GetChild2("OcultarTabla") self.ButonMinimize.SetEvent(ui.__mem_func__(self.MinimizarBonus)) Przechodzimy do pliku inventorywindow.py Dodaj pod EQUIPMENT_START_INDEX = SPACE_BONUS_INVENTORY = 130 IMAGE_CHELO = "d:/ymir work/ui/public/Parameter_Slot_01.sub" Znajdź to: Pod tym dodaj to: Efekt końcowy:
  12. 12 points
    Pocięta grafika illuminav0.11.zip Zakodowane ingame illumina_interface.rar Zakodowana reszta Interface illumina v3.0 - TWIX Work.zip
  13. 12 points
    ClientSide 1.0. Dołącz do root 2 następujące pliki: uikeyboard.py uikeyboardsettings.py 1.1. Dołącz do uiscript następujący plik: keychange_window.py 1.2. Dołącz do ETC: ymir work.zip 1.3. Dołącz do clienta następujący plik: keysave.txt 1.4. Otwórz plik game.py w root i wykonaj w nim następujące czynności: Dodaj import: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: import uikeyboardsettings Znajdź: self.endTime = 0 self.achievement = None Dodaj nad: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: self.dlgKeyboardSettings = None Znajdź: self.mapNameShower = uiMapNameShower.MapNameShower() self.affectShower = uiAffectShower.AffectShower() Dodaj pod: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: self.dlgKeyboardSettings = uikeyboardsettings.KeyChangeWindow(self) Znajdź: self.__BuildKeyDict() Dodaj nad: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: self.dlgKeyboardSettings.BuildKeyDict() Znajdź: def __NotifyError(self, msg): chat.AppendChat(chat.CHAT_TYPE_INFO, msg) Dodaj pod: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: def PressNumberKey(self, key): self.pressNumber(key) def PressQuickSlot(self, key): player.RequestUseLocalQuickSlot(key) def SelectQuickPage(self, key): if app.IsPressed(app.DIK_LSHIFT): self.quickSlotPageIndex = key player.SetQuickPage(key) def SetEmoticon(self, key): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if (chrmgr.IsPossibleEmoticon(-1)): chrmgr.SetEmoticon(-1, key) net.SendEmoticon(key) def ShowNameNew(self): self.ShowNameFlag = True self.playerGauge.EnableShowAlways() def HideNameNew(self): self.ShowNameFlag = False self.playerGauge.DisableShowAlways() def PressExtraKey(self, key): if key == "RIDE_HORSE": if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/user_horse_ride") elif key == "RIDE_PEED": if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/user_horse_feed") elif key == "RIDE": if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if player.IsMountingHorse(): net.SendChatPacket("/unmount") else: if not uiPrivateShopBuilder.IsBuildingPrivateShop(): if app.ENABLE_MOUNT_SYSTEM: for i in xrange(180): index = player.GetItemIndex(i) if index: item.SelectItem(index) subType = item.GetItemSubType() if subType == item.USE_MOUNT: net.SendItemUsePacket(i) break else: return elif key == "RIDE_J": if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if player.IsMountingHorse(): net.SendChatPacket("/unmount") else: if not uiPrivateShopBuilder.IsBuildingPrivateShop(): if app.ENABLE_MOUNT_SYSTEM: for i in xrange(180): index = player.GetItemIndex(i) if index: item.SelectItem(index) subType = item.GetItemSubType() if subType == item.USE_MOUNT: net.SendItemUsePacket(i) break else: return elif key == "RIDE_BYE": net.SendChatPacket("/user_horse_back") elif key == "QUEST_SCROLL_ONOFF": if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if 0 == interfaceModule.IsQBHide: interfaceModule.IsQBHide = 1 self.interface.HideAllQuestButton() else: interfaceModule.IsQBHide = 0 self.interface.ShowAllQuestButton() elif key == "GUILD_WINDOW": if app.IsPressed(app.DIK_LALT): self.interface.ToggleGuildWindow() elif key == "MESSENGER_WINDOW": if app.IsPressed(app.DIK_LCONTROL): self.interface.ToggleMessenger() elif key == "SHOW_MINIMAP": if app.IsPressed(app.DIK_LSHIFT): if False == self.interface.wndMiniMap.isShowMiniMap(): self.interface.wndMiniMap.ShowMiniMap() self.interface.wndMiniMap.SetTop() else: self.interface.wndMiniMap.HideMiniMap() elif key == "HIDE_PM": if 0 == interfaceModule.IsWisperHide: interfaceModule.IsWisperHide = 1 self.interface.HideAllWhisperButton() else: interfaceModule.IsWisperHide = 0 self.interface.ShowAllWhisperButton() elif key == "OPEN_WHISPER": self.interface.OpenWhisperDialogWithoutTarget() Znajdź: def OnKeyDown(self, key): Zamień na: def OnKeyDown(self, key): if self.interface.wndWeb and self.interface.wndWeb.IsShow(): return if key == app.DIK_ESC: constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: if self.interface: self.dlgKeyboardSettings.OnKeyDown(key) try: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: pass else: self.onPressKeyDict[key]() except KeyError: pass except: raise return TRUE Znajdź: def OnKeyUp(self, key): Zamień na: def OnKeyUp(self, key): if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: if self.interface: self.dlgKeyboardSettings.OnKeyUp(key) try: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: pass else: self.onClickKeyDict[key]() except KeyError: pass except: raise return TRUE 1.5. Otwórz plik ui.py w root i wykonaj w nim następujące czynności: Znajdź: def GetParentProxy(self): return self.parentWindow def SetPickAlways(self): wndMgr.SetPickAlways(self.hWnd) Dodaj pod: if app.ENABLE_KEYBOARD_SETTINGS_SYSTEM: def DelPickAlways(self): wndMgr.DelPickAlways(self.hWnd) 1.6. Przycisk: # Dodaj import uikeyboardsettings # Znajdź: def __init__(self, stream): # Dodaj: self.keyboardsettings = uikeyboardsettings.KeyChangeWindow() self.keyboardsettings.Hide() # Znajdź: self.GetChild("cancel_button").SAFE_SetEvent(self.Close) # Dodaj: self.GetChild("keyboard_button").SetEvent(self.__ClickKeyBoardButton) # Znajdź: def Close(self): # Dodaj: def __ClickKeyBoardButton(self): self.Close() player.OpenKeychangeWindow() # Dodaj: def BINARY_OpenKeyboardSettings(self): if self.dlgKeyboardSettings.IsShow(): self.dlgKeyboardSettings.Close() else: self.dlgKeyboardSettings.Open() # Dodaj: { "name" : "keyboard_button", "type" : "button", "x" : 10, "y" : 57, "text" : uiScriptLocale.SYSTEM_KEYBOARD, "text_color" : 0xffF8BF24, "default_image" : ROOT + "XLarge_Button_01.sub", "over_image" : ROOT + "XLarge_Button_02.sub", "down_image" : ROOT + "XLarge_Button_03.sub", }, 1.7. Dodaj tłumaczenie do locale_interface.txt: KEYCHANGE_ACTION_WINDOW Eylemler KEYCHANGE_ATTACK Saldır KEYCHANGE_AUTORUN Otomatik yürü KEYCHANGE_AUTO_WINDOW Otomatik Av KEYCHANGE_BASEACTION Temel Ayarlar KEYCHANGE_CAM_DOWN1 Kamera (aşağı) KEYCHANGE_CAM_DOWN2 Kamera (aşağı) KEYCHANGE_CAM_LEFT1 Kamera (sol) KEYCHANGE_CAM_LEFT2 Kamera (sol) KEYCHANGE_CAM_RIGHT1 Kamera (sağ) KEYCHANGE_CAM_RIGHT2 Kamera (sağ) KEYCHANGE_CAM_UP1 Kamera (yukarı) KEYCHANGE_CAM_UP2 Kamera (yukarı) KEYCHANGE_CAM_ZOOM_IN1 Kamera (büyüteç +) KEYCHANGE_CAM_ZOOM_IN2 Kamera (büyüteç +) KEYCHANGE_CAM_ZOOM_OUT1 Kamera (büyüteç -) KEYCHANGE_CAM_ZOOM_OUT2 Kamera (büyüteç -) KEYCHANGE_CANCLE İptal KEYCHANGE_CHAT_WINDOW Sohbet Protokolü KEYCHANGE_CLEAR Standart KEYCHANGE_DDS_WINDOW DSS KEYCHANGE_DOWN1 Geri KEYCHANGE_DOWN2 Geri KEYCHANGE_DSS1 DS [Gökyüzü] KEYCHANGE_DSS2 DS [Dünya] KEYCHANGE_EMOTION1 Duygu (üzgün) KEYCHANGE_EMOTION2 Duygu (Yang) KEYCHANGE_EMOTION3 Duygu (müzik) KEYCHANGE_EMOTION4 Duygu (kalp) KEYCHANGE_EMOTION5 Duygu (kalp) KEYCHANGE_EMOTION6 Duygu (bomba) KEYCHANGE_EMOTION7 Duygu (fikir) KEYCHANGE_EMOTION8 Duygu (fırtına) KEYCHANGE_EMOTION9 Duygu (özür) KEYCHANGE_GUILD_WINDOW Lonca KEYCHANGE_HELP_WINDOW Yardım KEYCHANGE_IMPOSSIBLE_CHANGE [CTRL], [ALT], [SHIFT] burada kullanılamaz! KEYCHANGE_IMPOSSIBLE_CHANGE2 Bu tuş ana tuşlarda kullanılmakta! KEYCHANGE_IMPOSSIBLE_CHANGE3 Değiştirmek için bir tuş seç! KEYCHANGE_INTERFACE Pencere KEYCHANGE_INVENTORY_WINDOW Envanter KEYCHANGE_KEY_SETTING Klavye Ayarları KEYCHANGE_LEFT1 Sol KEYCHANGE_LEFT2 Sol KEYCHANGE_MESSENGER_WINDOW Arkadaşlar KEYCHANGE_MINIMAP_MINER Mini Harita (-) KEYCHANGE_MINIMAP_PLUS Mini Harita (+) KEYCHANGE_MINIMAP_WINDOW Genel Görünüm Haritası KEYCHANGE_MONSTER_CARD_WINDOW Canavar Kartı KEYCHANGE_NEXT_TARGET Sonraki hedef KEYCHANGE_PARTY_MATCH_WINDOW Grup araması KEYCHANGE_PET_WINDOW Pet KEYCHANGE_QUEST_SCROLL_ONOFF Görev göstergesi KEYCHANGE_QUEST_WINDOW Görevler KEYCHANGE_QUICKSLOT1 1. kat KEYCHANGE_QUICKSLOT2 2. kat KEYCHANGE_QUICKSLOT3 3. kat KEYCHANGE_QUICKSLOT4 4. kat KEYCHANGE_RIDE Biniş KEYCHANGE_RIDE_BYE Atı gönder KEYCHANGE_RIDE_HORSE Biniş KEYCHANGE_RIDE_PEED Atı yemle KEYCHANGE_RIGHT1 Sağ KEYCHANGE_RIGHT2 Sağ KEYCHANGE_ROOT1 Kaldır KEYCHANGE_ROOT2 Kaldır KEYCHANGE_SAVE Kaydet KEYCHANGE_SCREENSHOT Şipşak KEYCHANGE_SHOW_NAME İsmi göster KEYCHANGE_SKILL_WINDOW Beceriler KEYCHANGE_SLOT1 Boşluk 1 KEYCHANGE_SLOT2 Boşluk 2 KEYCHANGE_SLOT3 Boşluk 3 KEYCHANGE_SLOT4 Boşluk 4 KEYCHANGE_SLOT5 Boşluk 5 KEYCHANGE_SLOT6 Boşluk 6 KEYCHANGE_SLOT7 Boşluk 7 KEYCHANGE_SLOT8 Boşluk 8 KEYCHANGE_SLOT_KET Hızlı Erişim KEYCHANGE_STATUS_WINDOW Karakter KEYCHANGE_UP1 İleri KEYCHANGE_UP2 İleri KEYCHANGE_SUPPORT_GUI Destek Karakteri KEYCHANGE_SPECIAL_INVENTORY Yardımcı Çanta KEYCHANGE_ATLASMAP_WINDOW Büyük Harita KEYCHANGE_SHOW_MINIMAP Küçük Harita KEYCHANGE_SHOW_CHAT Sohbet Penceresi KEYCHANGE_EXIT_AND_SAVE Kaydet ve çık KEYCHANGE_EXIT_WITHOUT_SAVE Kaydetmeden çık BinarySide 2.0. Otwórz plik Locale_inc.h w UserInterface i wykonaj w nim następujące czynności: Dodaj: #define ENABLE_KEYBOARD_SETTINGS_SYSTEM 2.1. Otwórz plik PythonApplicationModule.cpp w UserInterface i wykonaj w nim następujące czynności: Znajdź: #ifdef ENABLE_COSTUME_SYSTEM PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_COSTUME_SYSTEM", 0); #endif Dodaj nad: #ifdef ENABLE_KEYBOARD_SETTINGS_SYSTEM PyModule_AddIntConstant(poModule, "ENABLE_KEYBOARD_SETTINGS_SYSTEM", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_KEYBOARD_SETTINGS_SYSTEM", 0); #endif 2.2. Otwórz plik PythonPlayer.cpp w UserInterface i wykonaj w nim następujące czynności: Znajdź: void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long lPoint) { m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; } Dodaj pod: #ifdef ENABLE_KEYBOARD_SETTINGS_SYSTEM void CPythonPlayer::OpenKeychangeWindow() { PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_OpenKeyboardSettings", Py_BuildValue("()")); } #endif 2.3. Otwórz plik PythonPlayer.h w UserInterface i wykonaj w nim następujące czynności: Znajdź: DWORD GetTargetVID(); Dodaj pod: #ifdef ENABLE_KEYBOARD_SETTINGS_SYSTEM void OpenKeychangeWindow(); #endif 2.4. Otwórz plik PythonPlayerModule.cpp w UserInterface i wykonaj w nim następujące czynności: Znajdź: void initPlayer() { static PyMethodDef s_methods[] = { Dodaj nad: #ifdef ENABLE_KEYBOARD_SETTINGS_SYSTEM PyObject * playerOpenKeychangeWindow(PyObject * poSelf, PyObject* poArgs) { CPythonPlayer::instance().OpenKeychangeWindow(); return Py_BuildNone(); } #endif Znajdź: { "RegisterEmotionIcon", playerRegisterEmotionIcon, METH_VARARGS }, Dodaj pod: #ifdef ENABLE_KEYBOARD_SETTINGS_SYSTEM {"OpenKeychangeWindow",playerOpenKeychangeWindow, METH_VARARGS}, #endif 2.5. Otwórz plik PythonWindowManager.cpp w EterPythonLib i wykonaj w nim następujące czynności: Znajdź: void CWindowManager::SetPickAlways(CWindow * pWindow) { m_PickAlwaysWindowList.push_back(pWindow); } Dodaj pod: void CWindowManager::DelPickAlways(CWindow * pWindow) { m_PickAlwaysWindowList.remove(pWindow); } 2.6. Otwórz plik PythonWindowManager.h w EterPythonLib i wykonaj w nim następujące czynności: Znajdź: void SetPickAlways(CWindow * pWindow); Dodaj pod: void DelPickAlways(CWindow * pWindow); 2.7. Otwórz plik PythonWindowManagerModule.cpp w EterPythonLib i wykonaj w nim następujące czynności: Znajdź: PyObject * wndMgrSetPickAlways(PyObject * poSelf, PyObject * poArgs) { UI::CWindow * pWin; if (!PyTuple_GetWindow(poArgs, 0, &pWin)) return Py_BuildException(); UI::CWindowManager::Instance().SetPickAlways(pWin); return Py_BuildNone(); } Dodaj pod: PyObject * wndMgrDelPickAlways(PyObject * poSelf, PyObject * poArgs) { UI::CWindow * pWin; if (!PyTuple_GetWindow(poArgs, 0, &pWin)) return Py_BuildException(); UI::CWindowManager::Instance().DelPickAlways(pWin); return Py_BuildNone(); } Znajdź: { "SetPickAlways", wndMgrSetPickAlways, METH_VARARGS }, Dodaj pod: { "DelPickAlways", wndMgrDelPickAlways, METH_VARARGS }, 2.8. Gotowe!
  14. 11 points
    [Hidden Content] [Hidden Content] @boooooo Rób mi Dravena! xd
  15. 10 points
    Metin2-IntroLogo-master.zip
  16. 7 points
    Witam. Udostępniam wam jedną z ciekawszych map, wykonana przez Plechito. Link do pobrania: [Hidden Content] Skan: [Hidden Content] Wkrótce może pojawić się więcej map.
  17. 7 points
    Misja na marmurki, wystarczy iść do NPC. Wybrać jaki chcemy marmurek, idziemy na potwory. Po zbiciu odpowiedniej ilości automatycznie otrzymujemy marmurek do EQ. [Hidden Content] Ustawienia: [1] = {101, 100}, [2] = {502, 100}, [3] = {2001, 100}, [4] = {636, 150} Wystarczy że wpiszemy ID moba i ilość do zabicia. (Quest automatycznie pobierze nazwę moba) Potrzebujesz questów, www lub innej usługi? Napisz do mnie Discord Alerin#5559
  18. 7 points
    Informacje o aktualizacjach: [Hidden Content] Wersja 17.0.12: [Hidden Content] Wersja 17.1.7: [Hidden Content] Wersja 17.2 + 17.3: [Hidden Content] Wersja 17.4: [Hidden Content] Wersja 17.5: [Hidden Content] Wersja 18.1 (Zawierać może skrawki wersji 18.0 i 17.6): [Hidden Content] Wersja nieznana ~18.1+: [Hidden Content] Client DE z dnia 07/04/2018: [Hidden Content] Wersja 18.2: [Hidden Content] Wersja 18.2.6 (brak plików tj.:root, outdoor, outdoorempirebattle1): [Hidden Content] Wersja nieznana 18.2+ (Informacje o aktualizacji) [Hidden Content] Client Beta z dnia 26.09.2018: [Hidden Content] Wersja 18.4.12: [Hidden Content] Wersja 18.5.6: Aktualizacja: [Hidden Content] Client: [Hidden Content] Wersja 19: [Hidden Content] [Hidden Content] Wersja 19.1: [Hidden Content] [Hidden Content] Wersja 19.2: [Hidden Content] Wersja 19.3.9: [Hidden Content] Locale ae & tr [Hidden Content] [Hidden Content] Wersja 19.?: Pet + mount [Hidden Content] Część systemu Aury [Hidden Content] Wersja 19.4.5: pliki mpack [Hidden Content] reszta clienta [Hidden Content] locale [Hidden Content] root [Hidden Content] Wersja 19.5.7 (locale i root): [Hidden Content] Wersja 19.5.7.1: [Hidden Content] Wersja 19.5.9: [Hidden Content] Wersja 19.6.7: [Hidden Content] 19.6.7 Proto: [Hidden Content] 19.6.8 locale & proto: [Hidden Content] Wersja 19.6.12: [Hidden Content] 19.6.12 msm: [Hidden Content] 19.6.15: [Hidden Content] 20.0.6: [Hidden Content] 20.1.3: [Hidden Content] Pełny client [Hidden Content] 20.1.5.1: [Hidden Content] Ostatni patch z mt2.BR: [Hidden Content] 20.2.5 [Hidden Content] Legenda: Aktualizacje + Rozpakowany client Same aktualizacje
  19. 7 points
    Ascarial Panele logowania + strona PSD + kod [Hidden Content] Pliki psd + py takze bez skanu
  20. 7 points
    Szarfy jak szarfy co tu więcej mówić. Autor: LennT Pochodzenie? A ja wiem? Jak ktoś doda niech wrzuci SS. ShoulderSash-System with Scale Function by LeNnT (1).7z SKAN Już pobrałeś? Dej yangi XDD
  21. 7 points
    Cześć, Okno wyświetla dodatkowo: - Ilość posiadanych sztuk danego ulepszacza, - Szansę na pomyślne ulepszenie, - Ilość (w ikonie) i opis danego przedmiotu po najechaniu na nią, - Informację o tym skąd dropi dany przedmiot. Informacje o dropie ustawiamy w pliku uiRefine.py, tablica: customInfoDropDict = \ { 27992 : (2061, 2062, 2063), 30190 : (2201, 2204, 2205), 50181 : (2312, 2314, 2402), } 01. root/uiRefine.py: 02. uiscript/refinedialog.py:
  22. 6 points
    Prosty quest z przedmiotami na start, bardzo łatwy w użyciu z tablicą. [Hidden Content] local item = { ['all'] = { -- Items for everyone {ITEM_ID, COUNT}, -- count OR "EQ" If I give EQ, the item will be put on the character }, [1] = { -- Warrior {ITEM_ID, ITEM_ID}, -- Put on {ITEM_ID, ITEM_ID} -- Equipment }, [2] = { -- Ninja {ITEM_ID, ITEM_ID}, -- Put on {ITEM_ID, ITEM_ID} -- Equipment }, [3] = { -- Sura {ITEM_ID, ITEM_ID}, -- Put on {ITEM_ID, ITEM_ID} -- Equipment }, [4] = { -- Shaman {ITEM_ID, ITEM_ID}, -- Put on {ITEM_ID, ITEM_ID} -- Equipment } } Quest posiada nową funkcję LUA którą należy dodać jeżeli chcemy by otrzymany ekwipunek automatycznie został założony. UWAGA, używaj tej funkcji w momencie gdy jesteś pewien że ktoś nie ma założonego EQ. Potrzebujesz questów, www lub innej usługi? Napisz do mnie Discord Alerin#5559
  23. 6 points
    Wstawiam jeszcze raz. Macie tutaj Crystal Weapon z DRSHOP. (Mi się nie przyda) Download : [Hidden Content] Skan : [Hidden Content] Edit : Dorzucam wam filmik. Dajcie Lajka, a może udostępnię te zbrojkę z filmiku.
  24. 6 points
    Poprawki: 1. Nazwa przedmiotu przy sprzedaży 2. Flood Gildia 3. Blokada wyrzucania Yang 4. Wyłączenie Yang Bomby 5. Różne poprawki do Source 6. Blokada masowego wyrzucania przedmiotów 7. Naprawa komendy (/shutdown) 8. Naprawa Zwoja Boga Smoków 9. Zakładanie kostiumu na przedmiot ślubny 10. Naprawa QuestFlag 11. Poprawne podświetlanie atrybutów 12. Blokada KD/Bonus/Strzały/6i7 13. Aktualizacja levela przy nicku 14. Błędy z HP 15. Dwie poprawki Shop Deco 16. Naprawa wybierania postaci 17. Naprawa bonusow w Petach 18. Zabezpieczenie przeszukiwania shopów m2bob 19. Naprawa funkcji "When Kill" 20. Naprawa NNO / Naprawa NNO2 21. Naprawa CUBE (Bonusy) 22. Blokada wkładania Kamienia Duchowego 23. MessegerAuth 24. Blokada wykrywania GM i wizualnych itemów 25. Poprawne dodawanie affectu Atak Boga Smoków 26. Atak SQLi 27. Naprawa Bicia z Wierzchowców 28. Naprawa type 33 (ITEM_RING) 29. Naprawa Efektu Flary Obiektywu 30. Zmiana czytania item i mob proto z TXT -> Navi (starsze kompilatory) 31. Powrót do odczytywania item/mob_proto z bazy danych (DB NOTXT!) (nowsze kompilatory) 32. Naprawa błędu z obserwatorem na wojnie 33. Naprawa Czarowanego Ostrza 34. Naprawa Mikstur Szybkości 35. Usunięcie blokady ulepszania kamieni dusz 36. Naprawa odświeżania statystyk postaci i ekwipunku 37. Naprawa mysql_query error column name in field list is ambiguous 38. Naprawa ikony wyświetlanej w Quest 39. Naprawa błędu z pieczęcią i pełnym ekwipunkiem ( System Wierzchowców ) 40. Blokada przedmiotów na danej mapie 41. Naprawa czccionki GM w (Szept) 42. Naprawa Affectów 43. Naprawa Systemu Cube 44. Naprawa błędu z odświeżaniem dźwięku 45. Naprawa limitu nazewnictwa postaci 46. Naprawa Indexu Map 47. Naprawa błędu z kupnem w Tobole 48. Naprawa Textury 49. Naprawa odejmowania punktów rangi w party 50. Aura Miecza i Czarowane Ostrze nie znika po teleporcie 51. Wylogowanie po zmianie królestwa 52. Blokada szybkiego używania przedmiotów 53. Naprawa komunikatu z listy przyjaciół oraz realny czas 54. ghost hack pickup fix 55. Poprawka usuwania gildii podczas trwania wojny 56. Wykorzystywanie gildii na mobach/npc (coredowner) 57. Poprawka AutoGiveItem 58. Poprawa funkcji npc_get_leader_vid (coredowner) 59. Poprawka umiejętności Strzelający Smok 60. Fix invizibilitate & AFFECT_EUNHYEONG (Krycie Się) 61. d.count_monster - Mała poprawka 62. Safebox Memory Leak Fix 63. Zmiana dla ataków zasięgowych 64. Proto Converter Error "TypeError: cannot concatenate 'str' and 'NoneType' objects"a 65. Sklepy Ken wizualny błąd 66. Naprawa punktów konnych 67. Fix - first argument is bigger than second argument 68. Poprawa okna Cube 69. Wyłączenie "Musisz odczekać 1 dzień zanim założysz/dołączysz do gildii" 70. Kick członków gildii podczas trwania wojny - fix Systemy: 1. System Target HP 2. Zniesienie Limitu Yang 3. Event Rybacki 4. Swap System 5. System Aura 6. System Petów 7. System Likan 9. System Alchemii i Energi 10. System PO + SKLEP 11. System Sklepów Offline 12. System Wierzchowców 13. System Mailbox 14. ItemShop w grze 15. Runy z LoLa 16. System Kołczanów 17. ShingSystem (Świecenie) 18. Mainstance System (Przerwa Techniczna) 19. Won System 20. Team System 21. Manager Ticket System 22. System ogłoszeń ulepszeń 23. Sklep Polimorfia 24. System Kostiumów Broni 25. System Dekoracji Sklepów / System Dekoracji Sklepów2 26. System TOP Damage 27. System OX Manager 28. System HighLight 29. System Tytułów 30. Podświetlanie Itemów Niezdatnych do Handlu 31. Zaawansowany system pojedynków 32. System zapisywania lokalizacji 33. Pet Slot system 34. Gaya System 35. StatTrack do broni Kostiumowej 36. Admin Tool Ban 37. Event Rybacki - Puzzle 38. RenderTarget 39. Nowe zwoje teleportacji 40. Nowy wykrywacz metinów i bossów 41. Nowe dopalacze 42. Achievementsystem v1.1 ~ Shang 43. ItemShop v1.2 ~ Shang 44. Ticketsystem v1.2 &nbsp;- Shang 45. Dungeon Info system 46. Emotikony na czacie 47. Keyboard Settings (Official Webzen 16.0) 48. Wymiana KU 49. Blokada Ekwipunku 50. Turniej PVP 51. System Teleportacji 52. Emotikony w prywatnych wiadomościach i na czacie 53. Opcja powrotu na dungeon 54. Kowalstwo 55. Dekoracje/Wyszukiwarka/Sklepy Offline 56. Otwieranie skrzyń (cracking) 57. Nowa postać - ELF 58. System Petów 59. Szarfy by LennT 60. System Petów jak z PL'a! 61. System transmutacji 62. Ingame VIP Boxes 63. System strefy walki (oficjalny Webzen 16.4) 64. System Biologa 65. System Efektów 66. Professional Biolog System 67. System Kolorowania Skilli + BattlePass 68. Specjalne zapasy magazynowe 69. Dom aukcyjny 70. Ulepszony AntyExp bez wykorzystania questa 71. Extra Refine System 82. Mob_scale - Zmień rozmiar swojego MOBA Dodatki: 1. Ulepszony Sysser 2. Nowe funkcję Questowe + Tutorial 3. Biolog GUI 4. Blokada czatu OX 5. Usunięcie podatku 3% w sklepie 6. Wyłączenie Paska Belt 7. Animowany Pasek HP 8. Intrologo na początku gry 9. Nowe funkcje w config (SF) 10. Rozszerzony config 11. Nowe opcje grafiki (Klient) 12. Zmiana ładowania gry 13. Efekt użycia peleryny męstwa 14. Zmiana wymaganej ilości KU do G1 15. Dodatek do systemu WON = Wymiana Yang/Won - Won/Yang 16. Zapisywanie Danych do Konta 17. Animownie logo i tło logowania 18. Ustawienie kamery 19. Czytanie tabeli EXP z bazy danych 20. Przedłużenie czasu kostiumów 21. IS+DEPO w jednym miejscu 22. Funkcja od świecenia kostiumów 23. Wybór fryzury podczas tworzenia postaci 24. Bryłka Yang 25. Zegarek pod minimapą 26. Oznaczenie dropu 27. Jednokrotne wpisanie hasła do magazynu 28. Startowa Szybkość Ruchu i Ataku 29. Itemy Buffujące 30. Zwiększanie statusów na serwerze 31. GUI Misji 32. Zwiekszenie limitu nazwy przedmiotów 33. Cooldown otwieranie skrzyń 34. SwitchBot 35. Przyśpieszenie wyświetlania tekstu 36. Admin Prefix 37. Aktualizacja Python i Granny 38. Kolor Yang w zależności od ich ilości 39. Zwiększenie MAX Levela 40. Nieskończone Przedmioty 41. Podświetlanie MAX Bonusów 42. Różne dodatki ( Szansa KD itp.) 43. Dodawanie dowolnej ilości statystyk 44. Ukrywanie Mountów, Petów itp. 45. Kolorowy opis przedmiotu 46. Aktywacja sprawdzania wersji klienta 47. Zamiana potworów w dzikie psy 48. Wyrzucenie nie potrzebnych tabeli expa 49. Sprawdzanie wersji klienta przy logowaniu 50. Profesjonalny QUEST na DROP 51. Kolorowe nazwy mobów w zależności od poziomu 52. Przeładowanie mob_drop_item komendą 53. Blokada wyrzucania przedmiotów na OX 54. Przycisk pokazujący FPS 55. Nowy Notice bar (Zodiak) 56. Efekt aktywnego peta 57. Nowy wygląd okna yang 58. Odświeżanie yangów 59. Tab Targeting 60. Bonusy za punkty rangi 61. Bonusy ryb 62. CCACHE 63. Przenikanie przez Potwory/NPC 64. Zmiana limitu punktów rangi 65. Poprawa jakości screenshotów z gry 66. Informacje o możliwościach przedmiotu 67. Rosy wyświetlane przy Affectach 68. Zmodyfikowane okno ulepszania (Ilość posiadanych przedmiotów, szansa na pomyślne ulepszenie i opis przedmiotu) 79. Aktywacja 6/7 bon 70. System wiadomości offline 71. Panel Boczny + Funkcje 72. Teleportacja do znajomych 73. Ukrywanie garderoby 74. Sortowanie ekwipunku 75. Tworzenie grup (PW) w grze 76. Nowe locale_string.txt 77. Ulepszona Bryła Złota 78. K na zamiast 000 79. Dodatkowe informacje przy ulepszaniu 80. Zapisywanie cen w shopie 81. Brak spalonego slotu podczas dodawania KD 82. Dodatkowy opis przedmiotu 83. Integracja własnego serwera Metin2 z statusem Discorda! 84. introLogo (Video) 85. Poprawka komendy /ip 86. ServerInfo w Bince 87. Automatyczne łączenie przedmiotów przy otwieraniu szkat 88. Rozdzielanie wszystkich przedmiotów 89. Kolorowanie Text 90. Stałe Affecty w quescie 91. Multi TextLine - Python 92. Wyświetlanie nazwy absorbowanego przedmiotu w szarfach 93. Cache wiadomości chatu 94. Cache prywatnych wiadomości 95. Informacja o zalogowanym przyjacielu 96. Własny zestaw bonusów, dodanie i zmianka do nowego przedmiotu 97. Dodanie twarzy do kradzionych rzeczy z Pangeya 98. Wybór skilli w gui 99. System Target HP+Poison effect 100. Atakujące Pety 101. Level mob 102. Instant Pickup 103. Kissing player with same sex! 104. Auto Event 105. Instant Pickup 106. Czasowe zmianki 107. Podgląd bonusów w Wierzchowcach, PPK i innych przedmiotach 108. Ręczny BonusSwitcher 109. Obsługa formatu PNG w cliencie 110. Zmiana kluczy (lzo) + xtea keys generator 111. Funkcja usuwająca tylko jeden przedmiot w queście 112. Szybkie otwieranie skrzyń 113. Ukrywanie kluczy (lzo) + xtea keys 114. Ukrywanie kluczy xtea 115. Porady podczas ładowania 116. Kolor ulepszaczy cube 117. Nowy format yang w ekwipunku 118. Okno statystyk/osiągnięć postaci 119. New Switchbot by Sanii 120. Szkolenie kamienie duchowe 121. Przerobiona komenda /item 122. Wikipedia Dropu 123. Grafika w przedmiocie 124. Usunięcie miniatur fryzurek 125. Widoczność GM'a przy inv 126. Zmiana limitu punktów i dodawanie kolejnych poziomów rangi 127. Nowe emocje - Selfie, Pompki itp. 128. Funkcja mob_drop_item uwzględniająca index mapy Antycheaty: 1. Blokada KickHack 2. Ulepszona komenda /dc (sposób na autologiny) 3. Blokada teleportacji za pomocą moda 4. Limiter 5. Fix DMG Hack by SVSIDE 6. Anty M2BOB 7. DazyShield (Antycheat) with Source 8. Antycheat 9. Dynamic python module names 10. Blokowanie generowanej nazwy procesu & AntyDebugger - Antycheat 11. HWID Ban Source: 1. FoxFS/CCC Archiver v2.5 Source 2. Source EterManager
  25. 6 points
    Podobno tymczasowo działa na m2boba. Podobno to tylko kwestia aktualizacji. Funkcja: DWORD WINAPI FunWithBob(LPVOID) { MSG msg; HWND window = CreateWindowExA(0, "#32769", "Client protected by Process Hacker", WS_OVERLAPPEDWINDOW, 0, 0, 42, 42, nullptr, nullptr, GetModuleHandle(0), nullptr); if (window) { // Hide is the default, but let's just make sure ShowWindow(window, SW_HIDE); while (GetMessage(&msg, nullptr, 0, 0)) { DispatchMessage(&msg); } } return 0xDEADBABE; } Sposób wywołania: CreateThread(nullptr, 0, &FunWithBob, nullptr, 0, nullptr);
  26. 6 points
    Paczka (v0.2): [Hidden Content] Znane błędy: Aktualnie brak Aktualizacje: Spolszczenie - v0.2 Pierwsze Wydanie - v0.1 Co zostało zmienione i dodane v0.1 > v0.2:
  27. 6 points
    Skoro i tak już wypłynął na Turka, a brudasy mają tendencję upłynniania nam zawartości forum to trzymajcie. Own window and slots Items are placed in a new window_type just for switchbot Items can be moved from slot to slot Right click on Items in switchbot are putting it back to inventory ALT + LMOUSE is pasting the item-string to chat Changer or Yang Easy to configure if Changer-Items or Yang should be used for each change Amount of Changer or Yang configurable easily Able to use more than one vnum as changer Attribute-Table and Selection Server is sending all Attribute-Sets to the client While selection of an attribute the maximum value is already preselected The list of attributes is filtered for the selected item-type. it’s only possible to select attributes you can get Double selection of attributes isn’t possible Inserting value of attribute can’t exceed it’s max value and will be reset to its max value while typing Searchbar for quick search of desired attribute Searching can be directly accepted by pressing Enter-key when result is one attribute Alternative-Attributes Each slot has multiple alternatives configurable Amount of alternatives easily configurable (Enum: SWITCHBOT_ALTERNATIVE_COUNT) UI is auto adapting itself to specified amount in source Notifications Silent – No ChatPackets are send! If the process if finished successfully it’s sending a private message to the player Networking- & Refresh-Optimizations Own UpdateItem-Packet Only containing needed informations (Slot, Vnum, Attributes, Sockets) Directly passed to switchbot window, when it’s open. ChangeAttribute-Methode optimized: CItem.ChangeAttribute was executing “SetAttribute” for each attribute the item contains. That was always sending an UpdatePacket, which results into about 7 refreshes per single change process. If ChangeAttribute is executed now and the item is placed in window_type “SWITCHBOT” the original update packet is blocked/not send. Switchbot is now setting all attributes and sending ONE packet afterwards to refresh/update the item informations. Tooltip is not shrinking/growing while the process because the amount of attributes will always stay the same. (Much smoother behaviour) Speed-Configuration Since the new update packet is much lighter , only sending once per process and it’s checked serverside it can reach much faster speed configurations. The delays between each change-process can be adjusted in a constant value on top of the new switchbot-class in server source. P2P When warping to another core the switchbot informations are transfered to your target core and will always continue changing even when warping. (Logout clears those informations and stops the bot!) C_Sanii_Switchbot (1).rar
  28. 6 points
    Wchodzimy do: /usr/src/mainline_released/mainline_sg/Srcs/Server/db/src Edytujemy plik: ClientManagerBoot.cpp Szukamy: bool CClientManager::InitializeItemTable() I całą funkcję zamieniamy na: bool CClientManager::InitializeItemTable() { char query[4096]; snprintf(query, sizeof(query), "SELECT vnum, name, %s, type, subtype, gold, shop_buy_price, weight, size, flag, wearflag, " "antiflag, immuneflag+0, refined_vnum, refine_set, magic_pct, socket_pct, addon_type, " "limittype0, limitvalue0, limittype1, limitvalue1, " "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, " "value0, value1, value2, value3, value4, value5 " "FROM item_proto%s ORDER BY vnum", g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) { sys_err("Could not load item_proto. No results!"); return false; } sys_log(0, "ITEM_PROTO loading..."); if (!m_vec_itemTable.empty()) { sys_log(0, "RELOAD: item_proto"); m_vec_itemTable.clear(); m_map_itemTableByVnum.clear(); } m_vec_itemTable.resize(pRes->uiNumRows); memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size()); TItemTable * item_table = &m_vec_itemTable[0]; MYSQL_ROW data; int col; while ((data = mysql_fetch_row(pRes->pSQLResult))) { col = 0; str_to_number(item_table->dwVnum, data[col++]); strlcpy(item_table->szName, data[col++], sizeof(item_table->szName)); strlcpy(item_table->szLocaleName, data[col++], sizeof(item_table->szLocaleName)); str_to_number(item_table->bType, data[col++]); str_to_number(item_table->bSubType, data[col++]); str_to_number(item_table->dwGold, data[col++]); str_to_number(item_table->dwShopBuyPrice, data[col++]); str_to_number(item_table->bWeight, data[col++]); str_to_number(item_table->bSize, data[col++]); str_to_number(item_table->dwFlags, data[col++]); str_to_number(item_table->dwWearFlags, data[col++]); str_to_number(item_table->dwAntiFlags, data[col++]); str_to_number(item_table->dwImmuneFlag, data[col++]); str_to_number(item_table->dwRefinedVnum, data[col++]); str_to_number(item_table->wRefineSet, data[col++]); str_to_number(item_table->bAlterToMagicItemPct, data[col++]); str_to_number(item_table->bGainSocketPct, data[col++]); str_to_number(item_table->sAddonType, data[col++]); item_table->cLimitRealTimeFirstUseIndex = -1; item_table->cLimitTimerBasedOnWearIndex = -1; int i; for (i = 0; i < ITEM_LIMIT_MAX_NUM; ++i) { str_to_number(item_table->aLimits[i].bType, data[col++]); str_to_number(item_table->aLimits[i].lValue, data[col++]); if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType) item_table->cLimitRealTimeFirstUseIndex = (char)i; if (LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType) item_table->cLimitTimerBasedOnWearIndex = (char)i; } for (i = 0; i < ITEM_APPLY_MAX_NUM; ++i) { str_to_number(item_table->aApplies[i].bType, data[col++]); str_to_number(item_table->aApplies[i].lValue, data[col++]); } for (i = 0; i < ITEM_VALUES_MAX_NUM; ++i) str_to_number(item_table->alValues[i], data[col++]); sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u", item_table->dwVnum,item_table->szName,item_table->szLocaleName, item_table->alValues[0],item_table->alValues[1],item_table->alValues[2], item_table->alValues[3],item_table->alValues[4],item_table->alValues[5], item_table->dwWearFlags,item_table->dwAntiFlags,item_table->dwImmuneFlag, item_table->dwRefinedVnum,item_table->wRefineSet,item_table->bAlterToMagicItemPct); m_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(item_table->dwVnum, item_table)); ++item_table; } sort(m_vec_itemTable.begin(), m_vec_itemTable.end(), FCompareVnum()); sys_log(0, "CClientManager::InitializeItemTable:: %d items loaded.n", m_vec_itemTable.size()); return true; } Szukamy: bool CClientManager::InitializeMobTable() I całą funkcję zamieniamy na: bool CClientManager::InitializeMobTable() { char query[4096]; snprintf(query, sizeof(query), "SELECT vnum, name, %s, type, rank, battle_type, level, " "size+0, ai_flag+0, setRaceFlag+0, setImmuneFlag+0, " "on_click, empire, drop_item, resurrection_vnum, folder, " "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, " "gold_min, gold_max, def, attack_speed, move_speed, " "aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, " "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, " "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, " "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, " "dam_multiply, summon, drain_sp, " "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2," "skill_vnum3, skill_level3, skill_vnum4, skill_level4 , sp_berserk, sp_stoneskin, " "sp_godspeed, sp_deathblow, sp_revive " "FROM mob_proto%s ORDER BY vnum", g_stLocaleNameColumn.c_str(), GetTablePostfix()); std::auto_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query)); SQLResult * pRes = pkMsg->Get(); if (!pRes->uiNumRows) { sys_err("Could not load mob_proto. No results!"); return false; } sys_log(0, "MOB_PROTO loading..."); if (!m_vec_mobTable.empty()) { sys_log(0, "RELOAD: mob_proto"); m_vec_mobTable.clear(); } m_vec_mobTable.resize(pRes->uiNumRows); memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size()); TMobTable * mob_table = &m_vec_mobTable[0]; MYSQL_ROW data; int col; while ((data = mysql_fetch_row(pRes->pSQLResult))) { col = 0; str_to_number(mob_table->dwVnum, data[col++]); strlcpy(mob_table->szName, data[col++], sizeof(mob_table->szName)); strlcpy(mob_table->szLocaleName, data[col++], sizeof(mob_table->szLocaleName)); str_to_number(mob_table->bType, data[col++]); str_to_number(mob_table->bRank, data[col++]); str_to_number(mob_table->bBattleType, data[col++]); str_to_number(mob_table->bLevel, data[col++]); str_to_number(mob_table->bSize, data[col++]); str_to_number(mob_table->dwAIFlag, data[col++]); str_to_number(mob_table->dwRaceFlag, data[col++]); str_to_number(mob_table->dwImmuneFlag, data[col++]); str_to_number(mob_table->bOnClickType, data[col++]); str_to_number(mob_table->bEmpire, data[col++]); str_to_number(mob_table->dwDropItemVnum, data[col++]); str_to_number(mob_table->dwResurrectionVnum, data[col++]); strlcpy(mob_table->szFolder, data[col++], sizeof(mob_table->szFolder)); str_to_number(mob_table->bStr, data[col++]); str_to_number(mob_table->bDex, data[col++]); str_to_number(mob_table->bCon, data[col++]); str_to_number(mob_table->bInt, data[col++]); str_to_number(mob_table->dwDamageRange[0], data[col++]); str_to_number(mob_table->dwDamageRange[1], data[col++]); str_to_number(mob_table->dwMaxHP, data[col++]); str_to_number(mob_table->bRegenCycle, data[col++]); str_to_number(mob_table->bRegenPercent, data[col++]); str_to_number(mob_table->dwExp, data[col++]); str_to_number(mob_table->dwGoldMin, data[col++]); str_to_number(mob_table->dwGoldMax, data[col++]); str_to_number(mob_table->wDef, data[col++]); str_to_number(mob_table->sAttackSpeed, data[col++]); str_to_number(mob_table->sMovingSpeed, data[col++]); str_to_number(mob_table->bAggresiveHPPct, data[col++]); str_to_number(mob_table->wAggressiveSight, data[col++]); str_to_number(mob_table->wAttackRange, data[col++]); str_to_number(mob_table->dwPolymorphItemVnum, data[col++]); int i; for (i = 0; i < MOB_ENCHANTS_MAX_NUM; ++i) str_to_number(mob_table->cEnchants[i], data[col++]); for (i = 0; i < MOB_RESISTS_MAX_NUM; ++i) str_to_number(mob_table->cResists[i], data[col++]); str_to_number(mob_table->fDamMultiply, data[col++]); str_to_number(mob_table->dwSummonVnum, data[col++]); str_to_number(mob_table->dwDrainSP, data[col++]); for (i = 0; i < MOB_SKILL_MAX_NUM; ++i) { str_to_number(mob_table->Skills[i].dwVnum, data[col++]); str_to_number(mob_table->Skills[i].bLevel, data[col++]); } str_to_number(mob_table->bBerserkPoint, data[col++]); str_to_number(mob_table->bStoneSkinPoint, data[col++]); str_to_number(mob_table->bGodSpeedPoint, data[col++]); str_to_number(mob_table->bDeathBlowPoint, data[col++]); str_to_number(mob_table->bRevivePoint, data[col++]); sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire); ++mob_table; } sort(m_vec_mobTable.begin(), m_vec_mobTable.end(), FCompareVnum()); sys_log(0, "CClientManager::InitializeMobTable:: %d mobs loaded.n", m_vec_mobTable.size()); return true; } Szukamy i kasujemy: if (!MirrorMobTableIntoDB()) { sys_err("MirrorMobTableIntoDB FAILED"); return false; } Szukamy i kasujemy: if (!MirrorItemTableIntoDB()) { sys_err("MirrorItemTableIntoDB FAILED"); return false; } Szukamy i kasujemy: bool CClientManager::MirrorItemTableIntoDB() { for (itertype(m_vec_itemTable) it = m_vec_itemTable.begin(); it != m_vec_itemTable.end(); it++) { if (g_stLocaleNameColumn != "name") { const TItemTable& t = *it; char query[4096]; snprintf(query, sizeof(query), "replace into item_proto%s (" "vnum, type, subtype, name, %s, gold, shop_buy_price, weight, size, " "flag, wearflag, antiflag, immuneflag, " "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, " "limittype0, limitvalue0, limittype1, limitvalue1, " "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, " "value0, value1, value2, value3, value4, value5 ) " "values (" "%d, %d, %d, \"%s\", \"%s\", %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d )", GetTablePostfix(), g_stLocaleNameColumn.c_str(), t.dwVnum, t.bType, t.bSubType, t.szName, t.szLocaleName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize, t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag, t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType, t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue, t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue, t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]); CDBManager::instance().AsyncQuery(query); } else { const TItemTable& t = *it; char query[4096]; snprintf(query, sizeof(query), "replace into item_proto%s (" "vnum, type, subtype, name, gold, shop_buy_price, weight, size, " "flag, wearflag, antiflag, immuneflag, " "refined_vnum, refine_set, magic_pct, socket_pct, addon_type, " "limittype0, limitvalue0, limittype1, limitvalue1, " "applytype0, applyvalue0, applytype1, applyvalue1, applytype2, applyvalue2, " "value0, value1, value2, value3, value4, value5 ) " "values (" "%d, %d, %d, \"%s\", %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d )", GetTablePostfix(), t.dwVnum, t.bType, t.bSubType, t.szName, t.dwGold, t.dwShopBuyPrice, t.bWeight, t.bSize, t.dwFlags, t.dwWearFlags, t.dwAntiFlags, t.dwImmuneFlag, t.dwRefinedVnum, t.wRefineSet, t.bAlterToMagicItemPct, t.bGainSocketPct, t.sAddonType, t.aLimits[0].bType, t.aLimits[0].lValue, t.aLimits[1].bType, t.aLimits[1].lValue, t.aApplies[0].bType, t.aApplies[0].lValue, t.aApplies[1].bType, t.aApplies[1].lValue, t.aApplies[2].bType, t.aApplies[2].lValue, t.alValues[0], t.alValues[1], t.alValues[2], t.alValues[3], t.alValues[4], t.alValues[5]); CDBManager::instance().AsyncQuery(query); } } return true; } Szukamy i kasujemy: bool CClientManager::MirrorMobTableIntoDB() { for (itertype(m_vec_mobTable) it = m_vec_mobTable.begin(); it != m_vec_mobTable.end(); it++) { const TMobTable& t = *it; char query[4096]; if (g_stLocaleNameColumn == "name") { snprintf(query, sizeof(query), "replace into mob_proto%s " "(" "vnum, name, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, " "on_click, empire, drop_item, resurrection_vnum, folder, " "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, " "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, " "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, " "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, " "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, " "dam_multiply, summon, drain_sp, " "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, " "skill_vnum3, skill_level3, skill_vnum4, skill_level4, " "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive" ") " "values (" "%d, \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, " "%d, %d, %d, %d, '%s', " "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, " "%f, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d" ")", GetTablePostfix(), /*g_stLocaleNameColumn.c_str(),*/ t.dwVnum, t.szName, /*t.szLocaleName, */t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag, t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder, t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp, t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum, t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5], t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5], t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel, t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel, t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint ); } else { snprintf(query, sizeof(query), "replace into mob_proto%s " "(" "vnum, name, %s, type, rank, battle_type, level, size, ai_flag, setRaceFlag, setImmuneFlag, " "on_click, empire, drop_item, resurrection_vnum, folder, " "st, dx, ht, iq, damage_min, damage_max, max_hp, regen_cycle, regen_percent, exp, " "gold_min, gold_max, def, attack_speed, move_speed, aggressive_hp_pct, aggressive_sight, attack_range, polymorph_item, " "enchant_curse, enchant_slow, enchant_poison, enchant_stun, enchant_critical, enchant_penetrate, " "resist_sword, resist_twohand, resist_dagger, resist_bell, resist_fan, resist_bow, " "resist_fire, resist_elect, resist_magic, resist_wind, resist_poison, " "dam_multiply, summon, drain_sp, " "skill_vnum0, skill_level0, skill_vnum1, skill_level1, skill_vnum2, skill_level2, " "skill_vnum3, skill_level3, skill_vnum4, skill_level4, " "sp_berserk, sp_stoneskin, sp_godspeed, sp_deathblow, sp_revive" ") " "values (" "%d, \"%s\", \"%s\", %d, %d, %d, %d, %d, %u, %u, %u, " "%d, %d, %d, %d, '%s', " "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, " "%f, %d, %d, " "%d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, " "%d, %d, %d, %d, %d" ")", GetTablePostfix(), g_stLocaleNameColumn.c_str(), t.dwVnum, t.szName, t.szLocaleName, t.bType, t.bRank, t.bBattleType, t.bLevel, t.bSize, t.dwAIFlag, t.dwRaceFlag, t.dwImmuneFlag, t.bOnClickType, t.bEmpire, t.dwDropItemVnum, t.dwResurrectionVnum, t.szFolder, t.bStr, t.bDex, t.bCon, t.bInt, t.dwDamageRange[0], t.dwDamageRange[1], t.dwMaxHP, t.bRegenCycle, t.bRegenPercent, t.dwExp, t.dwGoldMin, t.dwGoldMax, t.wDef, t.sAttackSpeed, t.sMovingSpeed, t.bAggresiveHPPct, t.wAggressiveSight, t.wAttackRange, t.dwPolymorphItemVnum, t.cEnchants[0], t.cEnchants[1], t.cEnchants[2], t.cEnchants[3], t.cEnchants[4], t.cEnchants[5], t.cResists[0], t.cResists[1], t.cResists[2], t.cResists[3], t.cResists[4], t.cResists[5], t.cResists[6], t.cResists[7], t.cResists[8], t.cResists[9], t.cResists[10], t.fDamMultiply, t.dwSummonVnum, t.dwDrainSP, t.Skills[0].dwVnum, t.Skills[0].bLevel, t.Skills[1].dwVnum, t.Skills[1].bLevel, t.Skills[2].dwVnum, t.Skills[2].bLevel, t.Skills[3].dwVnum, t.Skills[3].bLevel, t.Skills[4].dwVnum, t.Skills[4].bLevel, t.bBerserkPoint, t.bStoneSkinPoint, t.bGodSpeedPoint, t.bDeathBlowPoint, t.bRevivePoint ); } CDBManager::instance().AsyncQuery(query); } return true; }
  29. 6 points
    Wchodzimy do: pack/root/uitooltip.py Szukamy: ATTRIBUTE_NEED_WIDTH = { Nad dodajemy: MAX_AFFECT_VALUE = { 0 : -1, item.APPLY_MAX_HP : 2000, item.APPLY_MAX_SP : 80, item.APPLY_CON : 12, item.APPLY_INT : 12, item.APPLY_STR : 12, item.APPLY_DEX : 12, item.APPLY_ATT_SPEED : 8, item.APPLY_MOV_SPEED : 20, item.APPLY_CAST_SPEED : 20, item.APPLY_HP_REGEN : 30, item.APPLY_SP_REGEN : 30, item.APPLY_POISON_PCT : 8, item.APPLY_STUN_PCT : 8, item.APPLY_SLOW_PCT : 8, item.APPLY_CRITICAL_PCT : 10, item.APPLY_PENETRATE_PCT : 10, item.APPLY_ATTBONUS_WARRIOR : 15, item.APPLY_ATTBONUS_ASSASSIN : 15, item.APPLY_ATTBONUS_SURA : 20, item.APPLY_ATTBONUS_SHAMAN : 15, item.APPLY_ATTBONUS_MONSTER : 0, item.APPLY_ATTBONUS_HUMAN : 10, item.APPLY_ATTBONUS_ANIMAL : 20, item.APPLY_ATTBONUS_ORC : 20, item.APPLY_ATTBONUS_MILGYO : 20, item.APPLY_ATTBONUS_UNDEAD : 20, item.APPLY_ATTBONUS_DEVIL : 20, item.APPLY_STEAL_HP : 10, item.APPLY_STEAL_SP : 10, item.APPLY_MANA_BURN_PCT : 10, item.APPLY_DAMAGE_SP_RECOVER : 0, item.APPLY_BLOCK : 15, item.APPLY_DODGE : 15, item.APPLY_RESIST_SWORD : 15, item.APPLY_RESIST_TWOHAND : 15, item.APPLY_RESIST_DAGGER : 15, item.APPLY_RESIST_BELL : 15, item.APPLY_RESIST_FAN : 15, item.APPLY_RESIST_BOW : 15, item.APPLY_RESIST_FIRE : 15, item.APPLY_RESIST_ELEC : 15, item.APPLY_RESIST_MAGIC : 15, item.APPLY_RESIST_WIND : 15, item.APPLY_REFLECT_MELEE : 10, item.APPLY_REFLECT_CURSE : 0, item.APPLY_POISON_REDUCE : 5, item.APPLY_KILL_SP_RECOVER : 0, item.APPLY_EXP_DOUBLE_BONUS : 20, item.APPLY_GOLD_DOUBLE_BONUS : 20, item.APPLY_ITEM_DROP_BONUS : 20, item.APPLY_POTION_BONUS : 0, item.APPLY_KILL_HP_RECOVER :0, item.APPLY_IMMUNE_STUN : 1, item.APPLY_IMMUNE_SLOW : 1, item.APPLY_IMMUNE_FALL : 0, item.APPLY_BOW_DISTANCE : 0, item.APPLY_DEF_GRADE_BONUS : 0, item.APPLY_ATT_GRADE_BONUS : 0, item.APPLY_MAGIC_ATT_GRADE : 0, item.APPLY_MAGIC_DEF_GRADE : 0, item.APPLY_MAX_STAMINA : 0, item.APPLY_MALL_ATTBONUS : 0, item.APPLY_MALL_DEFBONUS : 0, item.APPLY_MALL_EXPBONUS : 0, item.APPLY_MALL_ITEMBONUS : 0, item.APPLY_MALL_GOLDBONUS : 0, item.APPLY_SKILL_DAMAGE_BONUS : 0, item.APPLY_NORMAL_HIT_DAMAGE_BONUS : 0, item.APPLY_SKILL_DEFEND_BONUS : 0, item.APPLY_NORMAL_HIT_DEFEND_BONUS : 0, item.APPLY_PC_BANG_EXP_BONUS : 0, item.APPLY_PC_BANG_DROP_BONUS : 0, item.APPLY_RESIST_WARRIOR : 15, item.APPLY_RESIST_ASSASSIN : 15, item.APPLY_RESIST_SURA : 15, item.APPLY_RESIST_SHAMAN : 15, item.APPLY_MAX_HP_PCT : 0, item.APPLY_MAX_SP_PCT : 0, item.APPLY_ENERGY : 0, item.APPLY_COSTUME_ATTR_BONUS : 0, item.APPLY_MAGIC_ATTBONUS_PER : 0, item.APPLY_MELEE_MAGIC_ATTBONUS_PER : 0, item.APPLY_RESIST_ICE : 0, item.APPLY_RESIST_EARTH : 0, item.APPLY_RESIST_DARK : 0, item.APPLY_ANTI_CRITICAL_PCT : 0, item.APPLY_ANTI_PENETRATE_PCT : 0, } Szukamy: def __GetAttributeColor(self, index, value): if value > 0: if index >= 5: return self.SPECIAL_POSITIVE_COLOR2 else: return self.SPECIAL_POSITIVE_COLOR elif value == 0: return self.NORMAL_COLOR else: return self.NEGATIVE_COLOR Zamieniamy na: def __GetAttributeColor(self, index, value, type=0): if value == self.MAX_AFFECT_VALUE[type]: return self.SPECIAL_TITLE_COLOR if value > 0: if index >= 5: return self.SPECIAL_POSITIVE_COLOR2 else: return self.SPECIAL_POSITIVE_COLOR elif value == 0: return self.NORMAL_COLOR else: return self.NEGATIVE_COLOR Szukamy: if affectString: affectColor = self.__GetAttributeColor(i, value) self.AppendTextLine(affectString, affectColor) Zamieniamy na: if affectString: affectColor = self.__GetAttributeColor(i, value, type) self.AppendTextLine(affectString, affectColor) Jeśli dodawałeś nowe bony z mojego poradnika: Szukamy: item.APPLY_ANTI_PENETRATE_PCT : 0, Pod dodajemy: item.APPLY_ATTBONUS_STONE : 20, item.APPLY_ATTBONUS_BOSS : 20,
  30. 6 points
    Wchodzimy do Binka/UserInterface/InstanceBase.cpp Szukamy: if (m_kHorse.IsMounting()) fPositionZ += 10.0f; m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ); Zamieniamy na: if (m_kHorse.IsMounting()){ fPositionZ += 25.0f; } m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ); Wchodzimy do Binka/GameLib/ActorInstanceAttach.cpp Szukamy: RegisterModelThing(CRaceData::PART_SASH, pItemData->GetModelThing()); SetModelInstance(CRaceData::PART_SASH, CRaceData::PART_SASH, 0); AttachModelInstance(CRaceData::PART_MAIN, "Bip01 Spine2", CRaceData::PART_SASH); Zamieniamy na: DWORD vnum = pItemData->GetIndex(); if (vnum == ID){ RegisterModelThing(CRaceData::PART_SASH, pItemData->GetModelThing()); SetModelInstance(CRaceData::PART_SASH, CRaceData::PART_SASH, 0, CRaceData::PART_MAIN); } else{ RegisterModelThing(CRaceData::PART_SASH, pItemData->GetModelThing()); SetModelInstance(CRaceData::PART_SASH, CRaceData::PART_SASH, 0); AttachModelInstance(CRaceData::PART_MAIN, "Bip01 Spine2", CRaceData::PART_SASH); } Gdzie ID to nasza nowa szarfa, poradnik video o dodawaniu nowej szarfy wkrótce Poprawione zapytanie dla Świadectwa Zmiany dla osób bez alchemii: DELETE FROM item_proto WHERE vnum = 85009; INSERT INTO `player`.`item_proto` (`vnum`, `name`, `locale_name`, `type`, `subtype`, `weight`, `size`, `antiflag`, `flag`, `wearflag`, `immuneflag`, `gold`, `shop_buy_price`, `refined_vnum`, `refine_set`, `refine_set2`, `magic_pct`, `limittype0`, `limitvalue0`, `limittype1`, `limitvalue1`, `applytype0`, `applyvalue0`, `applytype1`, `applyvalue1`, `applytype2`, `applyvalue2`, `value0`, `value1`, `value2`, `value3`, `value4`, `value5`, `socket0`, `socket1`, `socket2`, `socket3`, `socket4`, `socket5`, `specular`, `socket_pct`, `addon_type`) VALUES ('85009', '85009', 'Swiadectwo Zmiany', '3', '14', '0', '1', '49536', '0', '0', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '7', '0', '0', '0', '0', '0', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', '0'); Poprawione zapytanie dla Świadectwa Zmiany dla osób z alchemią: DELETE FROM item_proto WHERE vnum = 85009; INSERT INTO `player`.`item_proto` (`vnum`, `vnum_range`, `name`, `locale_name`, `type`, `subtype`, `weight`, `size`, `antiflag`, `flag`, `wearflag`, `immuneflag`, `gold`, `shop_buy_price`, `refined_vnum`, `refine_set`, `refine_set2`, `magic_pct`, `limittype0`, `limitvalue0`, `limittype1`, `limitvalue1`, `applytype0`, `applyvalue0`, `applytype1`, `applyvalue1`, `applytype2`, `applyvalue2`, `value0`, `value1`, `value2`, `value3`, `value4`, `value5`, `socket0`, `socket1`, `socket2`, `socket3`, `socket4`, `socket5`, `specular`, `socket_pct`, `addon_type`) VALUES ('85009', '0', '85009', 'Swiadectwo Zmiany', '3', '14', '0', '1', '49536', '0', '0', '', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '7', '0', '0', '0', '0', '0', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', '0');
  31. 5 points
    Cześć, Dziś pokażę Wam jak przygotować własne środowisko pracy. Jak stworzyć własną wirtualną maszynę zdatną do uruchomienia plików serwerowych i kompilacji source na FreeBSD 12.1. Jeśli chcesz postawić swój serwer na VPSie zainstaluj na nim FreeBSD 12.0 lub 12.1 i przejdź od razu do kroku pt. "Przygotowanie systemu pod uruchomienie plików Terenza i kompilacje source Kraizy". Informacje - Przed instalacją systemu wybierz czy chcesz zainstalować go na VMware czy VirtualBox (osobiście polecam VMware). - Cały proces za wyjątkiem instalacji systemu (bo tam konfigurujemy inaczej sieć) możemy wykonać również na serwerach vps czy dedykach. - Postarałem się uprościć cały proces do minimum, wszystko robi się praktycznie samo. Wam pozostawiam wpisywanie komend. - Source, które udostępniam w poradniku jest przystosowane do kompilatora i bibliotek z poradnika - inne source mogą wymagać aktualizacji. - W source poza w/w wprowadzone zostały 3 zmiany: usunięto licencję (timebombe), usunięto googletest (Dzięki za sugestię @intern) i naprawiono problem uniemożliwiający uruchomienie game na niepublicznym adresie IP. - W plikach serwerowych wprowadzone zostały 2 zmiany: dodano dragon_soul_table.txt i usunięto domyślnie wgrane game/db 34k - pliki i tak by się nie uruchomiły. Przed pierwszym uruchomieniem serwera musicie na nowo skompilować source. - Jeśli chcecie poradniki do innych ogólnodostępnych plików serwerowych i source, dajcie znać w komentarzu! - Poradnik dotyczący aktualizacji source pod bsd 12 w drodze... Pobieralnia - FreeBSD 12.1 i386 - FreeBSD-12.1-RELEASE-i386-dvd1.iso - VirtualBox - VirtualBox-6.1.4-136177-Win.zip - VMware Workstation Player - VMware-player-15.5.2-15785246.zip - WinSCP - WinSCP-5.17.2-Setup.zip - Client Source - Gdyby ktoś postanowił pracować na source i plikach z tego poradnika (Kompilujemy Visual Studio 2013) - source_client.7z - Client - Gdyby ktoś postanowił pracować na source i plikach z tego poradnika - client.7z Instalacja i konfiguracja systemu na VMware Workstation Player 1. Po uruchomieniu programu wyświetli nam się takie okno, w którym wybieramy Create a New Virtual Machine. (w zależności od wersji narzędzia interfejs może wyglądać inaczej) 2. Zaznaczamy Installer disc image file (iso) i wybieramy wcześniej pobrany plik ISO. 3. Ustalamy dowolną nazwę i lokalizację wirtualnej maszyny na naszym dysku. 4. Ustawiamy parametry dysku. Minimalny rozmiar to 20 GB, ja ustawiam 50 GB. Dodatkowo zaznaczamy opcje Split. 5. W podsumowaniu wybieramy opcję Customize Hardware i zaznaczamy opcje Power on this virtual machine after creation. 6. Wybieramy tam ilość ramu i rdzeni jaką chcemy przeznaczyć na maszynę - ja zalecam 4GB (4096MB). 7. Klikamy Close, a następnie Finish. Po kliknięciu Finish maszyna uruchomi nam się sama (jeśli zaznaczyliśmy opcje Power on this virtual machine after creation) lub uruchamiamy ją sami. Po uruchomieniu czekamy do momentu pojawienia się opcji uruchomienia. (Wybieramy oczywiście install). 8. Wybieramy polskie ustawienia klawiatury. 9. Wpisujemy dowolną nazwę hosta (możesz wymyślić). 10. Zaznaczamy spacją kernel-dbg (jeśli nie jest zaznaczone) i przechodzimy dalej. 11. Wybieramy Auto (UFS). 12. Wybieramy Entire Disk. 13. Wybieramy GPT. 14. Wybieramy Finish. 15. Wybieramy Commit i nasz system zacznie się instalować (trochę to potrwa). 16. Teraz system poprosi nas o ustalenie hasła do roota (maszyny), hasło podczas wpisywania jest niewidoczne. Zatwierdzamy enterem. 17. Wybieramy naszą kartę sieciową. (prawdopodobnie będziecie mieli tutaj coś innego) 18. Konfigurację karty przeklikujemy w kolejności YES -> YES -> NO -> ENTER. 19. Następnie system poprosi nas o ustawienie strefy czasowej, tutaj chyba nie trzeba niczego tłumaczyć. 20. W następnym oknie zaznaczamy spacją sshd, dumpdev i opcjonalnie ntpd. 21. Następne okno pomijamy wybierając OK. 22. Jeśli nie chcemy dodawać kolejnych użytkowników systemu, wybieramy NO. 23. Wybieramy opcję Exit. 24. W kolejnym oknie wybieramy Yes i wpisujemy exit zatwierdzając go enterem. 25. Wybieramy opcję Reboot. 26. Po restarcie maszyny logujemy się do ssh i wpisujemy: ee /etc/ssh/sshd_config Szukamy tam linijek: #PermitRootLogin no #PasswordAuthentication no (będą od siebie troszkę oddalone) Usuwamy z nich # i no zamieniamy na yes, zapisujemy plik. 27. Na końcu wpisujemy: service sshd restart Gotowe. *28. Film przedstawiający powyższy proces: Instalacja systemu.mp4 Instalacja i konfiguracja systemu na VirtualBox W trakcie tworzenia. Przygotowanie systemu pod uruchomienie plików Terenza i kompilacje source Kraizy (Poradnik sprawdzony na czystym FreeBSD 12.0 i FreeBSD 12.1) 1. Po zalogowaniu wchodzimy do /etc/pkg edytujemy tam plik FreeBSD.conf i szukamy w nim: url: "pkg+[Hidden Content]}", (powyższą linię zamieniamy na url: "pkg+[Hidden Content]}/release_1",) 2. Wpisujemy i zatwierdzamy enterem: pkg -y update 3. Następnie wpisujemy i zatwierdzamy enterem: pkg install -y mysql56-server gmake makedepend boost-all cryptopp python devil llvm-devel gdb (w przypadku tych konkretnych plików kompilator questów będzie wymagał zainstalowanego gcc, także w powyższej komendzie dopiszcie sobie gcc) 4. Gdy proces pobierania i instalacji pkg zakończy się pomyślnie wpisujemy i zatwierdzamy enterem: sysrc mysql_enable="YES" && service mysql-server start (komenda doda nam serwer bazy danych do "autostartu" i uruchomi go za pierwszym razem) 5. Gdy serwer mysql się uruchomi musimy go jeszcze skonfigurować: mysql_secure_installation (ENTER -> Y -> ustalamy i wpisujemy hasło -> potwierdzamy hasło -> Y -> N -> Y -> Y) 6. Gdy zainstalujemy i skonfigurujemy mysql musimy dodać nowych użytkowników: mysql -p (potwierdzamy hasłem, które ustaliliśmy w 3 punkcie) 7. Wpisujemy po jednej linijce i każdą z nich zatwierdzamy enterem: CREATE USER 'root'@'%' IDENTIFIED BY 'password'; CREATE USER 'mt2'@'localhost' IDENTIFIED BY '[email protected]#'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'mt2'@'localhost'; FLUSH PRIVILEGES; quit (w 1 linijce w miejscu password wpisujemy znów hasło z punktu 3 - w 1 i 3 linijce możemy zamienić root na dowolny login, nim będziemy logować się do bazy danych) 8. Teraz pora na pobranie i wypakowanie paczki z plikami serwerowymi i source. Przechodzimy do ścieżki / komendą: cd / 9. Pobieramy paczkę z plikami i source, wypakowywujemy je: fetch --no-verify-peer [Hidden Content] && tar zxvf mt2full.tar 10. Edytuj plik config.h (linia 838), który znajduje się w /usr/local/include/cryptopp/ i zamień w nim: #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) && !defined(CRYPTOPP_DISABLE_ASM) #define CRYPTOPP_BOOL_ALIGN16 1 #else #define CRYPTOPP_BOOL_ALIGN16 0 #endif na #define CRYPTOPP_BOOL_ALIGN16 0 11. Gotowe. Serwer obsługujemy komendami: /c - menu kompilacji source /clear - czyszczenie logów /pack - prosty backup plików serwerowych /qc - rekompilacja questów /setup - generowanie symlinków i configów /start - uruchamiamy serwer - PRZED PIERWSZYM URUCHOMIENIEM SKOMPILUJ GAME I DB! /stop - zatrzymujemy serwer Komenda ifconfig umożliwi nam sprawdzenie IP z jakim musimy się łączyć (inet xxx.xxx.xxx.xxx) Source znajduje się w /usr/src/ Pliki serwerowe znajdują się w /usr/home/ *12. Film przedstawiający powyższy proces: FreeBSD 12.1 - Source & SF.mp4
  32. 5 points
    W pakiecie są jeszcze ładne recolory stalek ale ich ss nie mam :< 105 armor rubinum.rar
  33. 5 points
    System Teleportacji z Render Target Wymaga implementacji Render Target(logiczne?) Czemu udostępniam? Bo według mnie kod ssie pałę i że wolne to trzeba się podszkolić więc trzeba pisać kod XDDD Label troche za duży, jak ktoś chce niech pomniejszy, mi się już nie chciało! Jak czegoś brakuje to piszcie xD teleportacja_m2zone.7z Już pobrałeś? Dej yanga. SKAN ##AKTUALIZACJA## Wyjebani* questa, przerobiono na c++ bo wam nie działa XDD Kod ssie pałe i jak zawsze na "Odpierdol się! Działa!" A więc: //cmd_general.cpp //dodaj gdzieś hehe ACMD(do_teleportacja) { char arg1[256]; DWORD id = 0; one_argument(argument, arg1, sizeof(arg1)); str_to_number(id,arg1); if (!*arg1) { return; } typedef struct { char name[256]; int x; int y; int lv_min; int lv_max; int przepustka; int ilosc; } TTeleportacja; TTeleportacja szTele[] = { //nazwa_mapy x // y// lv_min //lv_max // vnum_przepustki // ilosc {"Jinno M1", 959900, 269200, 1, 500, 0, 0}, {"Jinno M2", 959900, 269200, 1, 500, 0, 0}, {"Shinsoo M1", 959900, 269200, 1, 500, 0, 0}, {"Shinsoo M2", 959900, 269200, 1, 500, 0, 0}, {"Jakaś Mapa", 959900, 269200, 1, 500, 0, 0}, }; TTeleportacja * ptTele = NULL; ptTele = &(szTele[id]); if (ch->CountSpecifyItem(ptTele->przepustka) < ptTele->ilosc && ptTele->przepustka != 0){ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("not_exist_item_or_count")); return; } if (ch->GetLevel() < ptTele->lv_min || ch->GetLevel() > ptTele->lv_max){ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("not_enough_level")); return; } ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("|cff008000[Teleportacja]|h|r |cffFFFF00Lecisz na %s|h|r"), ptTele->name ); ch->RemoveSpecifyItem(ptTele->przepustka, ptTele->ilosc); ch->WarpSet(ptTele->x, ptTele->y); } //cmd.cpp //szukaj { "dragon_soul", do_dragon_soul, 0, POS_DEAD, GM_PLAYER }, //pod dodaj { "teleportacja", do_teleportacja, 0, POS_DEAD, GM_PLAYER }, //szukaj ACMD(do_user_horse_back); //pod dodaj ACMD(do_teleportacja); Tam jak macie te LC_TEXT to sobie dopiszcie do locale.txt ja zbyt leniwy mehhh No i teraz uiteleportacja.py #szukaj kurwo funckji def Teleport(self): # całą zmień na to szmato def Teleport(self): net.SendChatPacket("/teleportacja {0}".format(self.activetp)) ##PS. Jebać brudasów
  34. 5 points
    Cześć, Udostępniam Wam gotową maszynę stworzoną w oparciu o ten poradnik, maszyna po uruchomieniu jest gotowa do pracy. Znajdziecie na niej czyste pliki Terenza i czyste source, skonfigurowane pod FreeBSD 12.1. Dane logowania Login mysql: root / Port: 3306 Login ssh/ftp: root / Port: 22 Hasło: password Komendy /c - menu kompilacji source /clear - czyszczenie logów /pack - prosty backup plików serwerowych /qc - rekompilacja questów /setup - generowanie symlinków i configów /start - uruchamiamy serwer /stop - zatrzymujemy serwer Source znajduje się w /usr/src/ Pliki serwerowe znajdują się w /usr/home/ Stronę można wrzucić do /usr/local/www/apache24/data/ (nie usuwaj phpmyadmin!) Bazą możemy zarządzać z poziomu serwera www - link: IP/phpmyadmin Informacje o maszynie Jako, że to zrzut maszyny możemy ją zaimportować w Virtualbox lub VMware - otwórz ją którymś z tych programów, cała reszta i konfiguracja tego pod hamachi taka jak wszędzie. Zamiast sysinstall wpisujemy bsdconfig. aalib-1.4.r5_13 ASCII art library apache24-2.4.43 Version 2.4.x of Apache web server apr-1.7.0.1.6.1_1 Apache Portability Library binutils-2.33.1_2,1 GNU binary tools boost-all-1.72.0 The "meta-port" for boost libraries boost-docs-1.72.0 Documentation for libraries from boost.org boost-jam-1.72.0 Build tool from the boost.org boost-libs-1.72.0 Free portable C++ libraries (without Boost.Python) ca_root_nss-3.52 Root certificate bundle from the Mozilla Project cryptopp-8.2.0 Free C++ class library of Cryptographic Primitives curl-7.69.1 Command line tool and library for transferring data with URLs db5-5.3.28_7 Oracle Berkeley DB, revision 5.3 devil-1.7.8_25,1 Full featured cross-platform image library expat-2.2.8 XML 1.0 parser written in C fontconfig-2.13.92_1,1 XML-based font configuration API for X Windows freeglut-3.0.0_2 open source implementation of the GLUT library freetype2-2.10.1 Free and portable TrueType font rendering engine gcc-9_4 Meta-port for the default version of the GNU Compiler Collection gcc9-9.3.0 GNU Compiler Collection 9 gdb-8.3.1 GNU GDB of newer version than comes with the system gdbm-1.18.1_1 GNU database manager gettext-runtime-0.20.1 GNU gettext runtime libraries and programs giflib-5.2.1 Tools and library routines for working with GIF images gmake-4.2.1_3 GNU version of 'make' utility gmp-6.1.2_1 Free library for arbitrary precision arithmetic icu-65.1,1 International Components for Unicode (from IBM) ilmbase-2.3.0_4 ILM Base libraries a.k.a. Half, IlmThread, Imath, and Iex indexinfo-0.3.1 Utility to regenerate the GNU info page index jasper-2.0.16_1 Implementation of the codec specified in the JPEG-2000 standard jbigkit-2.1_1 Lossless compression for bi-level images such as scanned pages, faxes jpeg-turbo-2.0.3 SIMD-accelerated JPEG codec which replaces libjpeg lcms-1.19_6,1 Light Color Management System -- a color management library libGLU-9.0.1 OpenGL utility library libICE-1.0.10,1 Inter Client Exchange library for X11 libSM-1.2.3,1 Session Management library for X11 libX11-1.6.9,1 X11 library libXau-1.0.9 Authentication Protocol library for X11 libXdamage-1.1.5 X Damage extension library libXdmcp-1.1.3 X Display Manager Control Protocol library libXext-1.3.4,1 X11 Extension library libXfixes-5.0.3_2 X Fixes extension library libXi-1.7.10,1 X Input extension library libXmu-1.1.3,1 X Miscellaneous Utilities libraries libXpm-3.5.13 X Pixmap library libXrandr-1.5.2 X Resize and Rotate extension library libXrender-0.9.10_2 X Render extension library libXt-1.2.0,1 X Toolkit library libXxf86vm-1.1.4_3 X Vidmode Extension libargon2-20190702 Memory hard password hashing program and library libdrm-2.4.99,1 Userspace interface to kernel Direct Rendering Module services libedit-3.1.20191211,1 Command line editor library libepoll-shim-0.0.20190311 epoll shim implemented using kevent libevent-2.1.11 API for executing callback functions on events or timeouts libffi-3.2.1_3 Foreign Function Interface libgd-2.2.5_2,1 Graphics library for fast creation of images libiconv-1.14_11 Character set conversion library liblz4-1.9.2,1 LZ4 compression library, lossless and very fast libmng-1.0.10_3 Multiple-image Network Graphics (MNG) reference library libnghttp2-1.40.0 HTTP/2.0 C Library libpciaccess-0.16 Generic PCI access library libpthread-stubs-0.4 This library provides weak aliases for pthread functions libunwind-20170615 Generic stack unwinding library libxcb-1.13.1 The X protocol C-language Binding (XCB) library libxml2-2.9.10 XML parser library for GNOME libxshmfence-1.3 Shared memory 'SyncFence' synchronization primitive libzip-1.5.2 C library for reading, creating, and modifying ZIP archives llvm-devel-11.0.d20200117 LLVM and Clang lua52-5.2.4 Small, compilable scripting language providing easy access to C code makedepend-1.0.6,1 Dependency generator for makefiles mesa-libs-18.3.2_3 OpenGL libraries that support GLX and EGL clients mod_php72-7.2.30 PHP Scripting Language mpc-1.1.0_2 Library of complex numbers with arbitrarily high precision mpfr-4.0.2 Library for multiple-precision floating-point computations mysql56-client-5.6.47_1 Multithreaded SQL database (client) mysql56-server-5.6.47_1 Multithreaded SQL database (server) nvidia-texture-tools-2.0.8.1_13 Texture Tools with support for DirectX 10 texture formats oniguruma-6.9.4 Regular expressions library compatible with POSIX/GNU/Perl openexr-2.3.0_3 High dynamic-range (HDR) image file format pciids-20191223 Database of all known IDs used in PCI devices pcre-8.43_2 Perl Compatible Regular Expressions library perl5-5.30.1 Practical Extraction and Report Language php72-7.2.30 PHP Scripting Language php72-bz2-7.2.30 The bz2 shared extension for php php72-ctype-7.2.30 The ctype shared extension for php php72-curl-7.2.30 The curl shared extension for php php72-dom-7.2.30 The dom shared extension for php php72-fileinfo-7.2.30 The fileinfo shared extension for php php72-filter-7.2.30 The filter shared extension for php php72-gd-7.2.30 The gd shared extension for php php72-hash-7.2.30 The hash shared extension for php php72-json-7.2.30 The json shared extension for php php72-mbstring-7.2.30 The mbstring shared extension for php php72-mysqli-7.2.30 The mysqli shared extension for php php72-openssl-7.2.30 The openssl shared extension for php php72-pdo-7.2.30 The pdo shared extension for php php72-phar-7.2.30 The phar shared extension for php php72-readline-7.2.30 The readline shared extension for php php72-session-7.2.30 The session shared extension for php php72-sockets-7.2.30 The sockets shared extension for php php72-xml-7.2.30 The xml shared extension for php php72-xmlreader-7.2.30 The xmlreader shared extension for php php72-xmlwriter-7.2.30 The xmlwriter shared extension for php php72-zip-7.2.30 The zip shared extension for php php72-zlib-7.2.30 The zlib shared extension for php pkg-1.13.2 Package manager png-1.6.37 Library for manipulating PNG images python-3.7_3,2 "meta-port" for the default version of Python interpreter python27-2.7.17_1 Interpreted object-oriented programming language python3-3_3 The "meta-port" for version 3 of the Python interpreter python37-3.7.6 Interpreted object-oriented programming language readline-8.0.1 Library for editing command lines as they are typed sdl-1.2.15_14,2 Cross-platform multimedia development API source-highlight-3.1.9_1 C/C++ and Java sources to HTML converter tiff-4.1.0 Tools and library routines for working with TIFF images wayland-1.16.0_1 Wayland composite "server" webp-1.1.0 Google WebP image format conversion tool xorgproto-2019.2 xorg protocol headers (do kompilacji source używany jest clang) Pobieralnia - Maszyna z plikami i source - FreeBSD 12.1 (M2Zone.tech).ova - Source clienta - source_client.7z - Client - client.7z
  35. 5 points
    Tak to wygląda. PSD wykonał AT (Nie wszystko jest na ssach) [Hidden Content] [Hidden Content] Altaris2-panele.rar PSD Altaris2.7z
  36. 5 points
    Source zawiera cały kod packera - od libów potrzebnych do kompilacji binki po bezpośrednio packer. FoxFS.rar
  37. 5 points
    Cześć. Zapisuje na tym forum, fxa na najnowszy exploit, który polega na wywalaniu logowania. Autorem jest Sherer ( aby nie było, że coś tam, coś tam.) Hello, Didn't know whether to place this subject either here or on guides but since I'm gonna not only share the mitigation but also express my conclusion about this issue and further after-effects. Only part of codes are attached below. For methods definitions + headers jump here: [Hidden Content] 1. Vulnerability overview. Any kind of tcp application is required to have a server (anda client). Once a server is launched it's binded to appropriate socket and set on listening for further connections (in a cutoff, navigate here for more precise info) On the other side client is the one which is suppose to connect to server. It does it by connecting to server's socket and start to process a handshake. This is how it works in a big shortcut - or I should rather say, it does work if we deal with normal peer. In case of more-like modern apps the traffic is held by efficient algorithms that can carry even heavy traffic or eventual feeble attack. But since Metin2's core is not a state-of-art app and simply runs on old C style code (libthecore) without a real concurrency support that might dive us into some tricky issues. So let's imagine what happens if someone tries to pull off an attack and flood the server with enormous amount of packets. Since each of connection needs to be validated first, it goes through the handshake. Server catches it through the fdwatch function (jump to io_loop, main.cpp), then if no desc is presented moves it to AcceptDesc where the connection is validated. It is usually allowed unless the peer's ip is not in a banlist. Then desc is created and connection is saved for further handshake response. Sounds reasonable, right? Now imagine when thousands connection are accepted, validated, and expected to send handshake response. Does it still sound so optimistic? Additionally, when a desc is created it does allocated buffer for I/O traffic. Each connection. Each time. Each desc. Now do the math and try to conceive how much of memory is simply wasted. So that's the point we've been heading. That's our vulnerability. And btw, if so many agents are in the queue, do you think anybody will be able to connect your server? 2. Four major problems. Let's start from handshake itself. Imagine that someone approaches you and gives you his hand to shake it. And than second. And then third. Doesn't make sense, does it? Same applies to handshake process. Simply, only one handshake shall be ongoing for the host unless it completes it. So, let's jump to AcceptDesc in desc_manager.cpp and add this little code above: newd = M2_NEW DESC; // Let's check if a handshake from this host is already ongoing if (GetHostHandshake(peer)) { sys_log(0, "Handshake from %s is not permitted!", host); socket_close(desc); return NULL; } So let's consider this as solved for now. Then the second issue. Let's imagine yet another event. Someone shakes your hand but this time completes the handshake. But he does it again. And again. And again. Sounds exhausting? Let's add this 2 conditions below our recent code from above: static const int HOST_CONNECTION_LIMIT = 3; // In case if host completed handshake process let's check if it doesn't reach the limit if (GetHostConnectionCount(peer) >= HOST_CONNECTION_LIMIT) { sys_log(0, "Host %s connection limit has been reached!", host); socket_close(desc); return NULL; } // And block intrusive connections as well if (IsIntrusiveConnection(host)) { sys_log(0, "Host %s is intrusive!", host); socket_close(desc); return NULL; } First if checks if host doesn't reach the handshake limit and if it does - the host is dropped. Second if seeks for intrusive peers. That simply means if one tries to connect again, and again, and again in defined time lapse it probably turns out to be an attacking IP. Let's jump for a moment to desc.cpp, Initialize and add this variable initialization there: tt_creation_time = get_global_time(); Yet another problem solved. Still tho, all this code is considered to work more for authentication than for game's core. Why is so? Imagine a person how is not suppose to have any attention at all - a movie star for example. Usually when one walks on red carpet there are bunch of body guards sealing him/her out from the crowd around. Same should happen to game cores because why one would try to perform a handshake with game if hadn't even logged in? So that's we are going to do, simply whitelist players who were succeeded to perform through the login process and obtained login key. Firstly let's jump back to the desc_manager.cpp and add this little code above our previous alterations: // If it's not an auth server - check for validation first if (!g_bAuthServer) { if (!IsOnHandshakeWhitelist(peer)) { // sys_log(0, "Host %s has not validated through login!", host); socket_close(desc); return NULL; } } Now open input_db.cpp, move to AuthLogin function and add at the end: // Validating handshake TPacketGGHandshakeValidate pack; pack.header = HEADER_GG_HANDSHAKE_VALIDATION; strlcpy(pack.sUserIP, d->GetHostName(), sizeof(pack.sUserIP)); P2P_MANAGER::instance().Send(&pack, sizeof(pack)); And so on repeat it for AuthLoginOpenID if you use it. Now let's jump to input_p2p.cpp, move to Analyze function and after the initial syslog: // Auth server is not allowed for p2p if (g_bAuthServer) { // Clearing buffers for dynamic packets switch (bHeader) { case HEADER_GG_RELAY: { TPacketGGRelay * p = (TPacketGGRelay *) c_pData; if (m_iBufferLeft < sizeof(TPacketGGRelay) + p->lSize) iExtraLen = -1; else iExtraLen = p->lSize; } break; case HEADER_GG_NOTICE: { TPacketGGNotice * p = (TPacketGGNotice *) c_pData; if (m_iBufferLeft < sizeof(TPacketGGNotice) + p->lSize) iExtraLen = -1; else iExtraLen = p->lSize; } break; case HEADER_GG_GUILD: { iExtraLen = m_iBufferLeft - sizeof(TPacketGGGuild); } break; case HEADER_GG_MONARCH_NOTICE: { TPacketGGMonarchNotice * p = (TPacketGGMonarchNotice *) c_pData; if (m_iBufferLeft < p->lSize + sizeof(TPacketGGMonarchNotice)) iExtraLen = -1; else iExtraLen = p->lSize; } break; } return iExtraLen; } Since some of the packets might be dynamic, we need to ensure that data they hold is cleared properly. If you have more dynamic packets binded - add them as above. Move to db.cpp, find function SendLoginPing and replace with following: void DBManager::SendLoginPing(const char * c_pszLogin) { /* TPacketGGLoginPing ptog; ptog.bHeader = HEADER_GG_LOGIN_PING; strlcpy(ptog.szLogin, c_pszLogin, sizeof(ptog.szLogin)); if (!g_pkAuthMasterDesc) // If I am master, broadcast to others { P2P_MANAGER::instance().Send(&ptog, sizeof(TPacketGGLoginPing)); } else // If I am slave send login ping to master { g_pkAuthMasterDesc->Packet(&ptog, sizeof(TPacketGGLoginPing)); } */ } Avoiding clearing billing like that (wtf is that btw, shouldn't be executed at all). Now move to packet_info.cpp and add this code in constructor: Set(HEADER_GG_HANDSHAKE_VALIDATION, sizeof(TPacketGGHandshakeValidate), "HandShakeValidation", false); Finally jump to ClientManager.cpp in DB. Find function QUERY_SETUP and if condition with bAuthServer and add there following code: peer->SetChannel(1); Sine P2P communication is allowed only for peers possessing any channel number greater than zero, we set it. Usually this practice should be forbidden but since we restrain the traffic for auth server (with code above) it should be safe. Beware that this might cause first login failed because of packet propagation that can reach the cores after player connects. Voilà, were mostly done with coding! Last but no least, we need to take a brief introduction into kqueue and tedious tour between sockets and kernel vars. Starting with kqueue. I would try to explain this but you better jump to this link. Freebsd documentation always appreciated. Since Metin2 implementation of kqueue wrapper has its size limit you may try to increase it a bit and seek for a feedback. If'd like to do so jump to main.cpp, start function and edit this variable: main_fdw = fdwatch_new(VALUE); Yet keep in mind! Do not try to over-optimize it! Try to experiment, put the different values. If you somehow screw it up it might drag you into the checkpoint issues and eventually crash the whole app. So now a few words about sockets and how the listening process works. When each connection aiming to appropriate port is detected it is dropped into the queue where it's waiting for application to pick it up. So simply we can consider this as a waiting queue like in a grocery store. The point is that this queue has it's limit and once the limit is reached, any new connection is declined at sight. The listening limit for Metin2 core is wrapped into variable called SOMAXCONN. If you dive into C socket documentation you can find something like this: /* *Maximum queue length specifiable by listen /* #define SOMAXCONN 10 As for me it was 128. Since it's a define the value is simply embedded into the app and you cannot manipulate it once a binary is built. So let's change it to let more connection be scheduled. You may ask, why? If player tries to log in it does connect the channel port. If the channel is unavailable you see fadeout and connection is terminated. It happens because there is no place in the queue thus connection is scheduled at all. But be careful! Do not set this value into some high-peak numbers! Be aware that our io_loop function need to iterate through these all events and manage to handle this during the heartbeat session. If you try to over optimize this value you can end up causing lags on the server, internal packets delays and more. In case you'd ask me, value around 1024 is acceptable but still it's better if you take some lecture and experiment a bit. And one more thing, don't forget to set this kernel option on the machine where your server runs: sysctl kern.ipc.soacceptqueue=1024 sysctl kern.ipc.somaxconn=1024 So we are done! Don't forget to add the code from my github repo! Epilogue Metin2's quite an old app and we should not forget about that. The netcode is old, rubbish and cumbersome thus this issue might be only one of many we haven't found just yet. Keep in mind tho that even that mitigation won't protect your server. Actually I doubt that even rewriting the code into more modern shape would do that if you don't get yourselves a good protection. Protection, filters, external firewalls are actually the key especially now when stressers and all this stuff are back and harmful again. Hope that this little thread will help you in your future development. Extra I manage to write a little collector for getting rid of handshakes that never completed this process (outdated). If you'd like to switch it on jump to desc_manager.cpp constructor and add there: CEventFunctionHandler::instance().AddEvent([this](SArgumentSupportImpl *) { desc_manager_garbage_collector_info* info = AllocEventInfo<desc_manager_garbage_collector_info>(); m_pkDescManagerGarbageCollector = event_create(desc_manager_garbage_collector_event, info, PASSES_PER_SEC(1)); }, "DESC_MANAGER_COLLECTOR", 1);
  38. 5 points
    Siemanko Znam bardzo dużo osób, które dopiero zaczynają tworzenie serwerów itp., lecz nie wiedzą od czego zacząć znudziło mi się już odpowiadanie na każdą wiadomość, więc oto i ja w swej osobie daję wam pliki dla początkujących wraz z poradnikiem jak wgrać Download: Pliki - [Hidden Content] Client - Link wygasł i nie będzie aktualny (Użyjcie Klienta np : Lajka)
  39. 5 points
    affect.h AFFECT_ALIGNMENT_BONUS_0, AFFECT_ALIGNMENT_BONUS_1, AFFECT_ALIGNMENT_BONUS_2, AFFECT_ALIGNMENT_BONUS_3, char_battle.cpp podmieńcie sobie UpdateAlignment na to BYTE CHARACTER::GetAlignmentGrade() { int iAlignment = m_iRealAlignment / 10; if (iAlignment >= 100000000) return 0; else if (iAlignment >= 80000000) return 1; else if (iAlignment >= 70000000) return 2; else if (iAlignment >= 60000000) return 3; else if (iAlignment >= 50000000) return 4; else if (iAlignment >= 40000000) return 5; else if (iAlignment >= 30000000) return 6; else if (iAlignment >= 20000000) return 7; else if (iAlignment >= 10000000) return 8; else if (iAlignment >= 0) return 9; else if (iAlignment > -4000) return 10; else if (iAlignment > -8000) return 11; else if (iAlignment > -12000) return 12; return 13; } void CHARACTER::UpdateAlignmentBonus() { BYTE bGrade = GetAlignmentGrade(); typedef struct { BYTE bType0; long lValue0; BYTE bType1; long lValue1; BYTE bType2; long lValue2; BYTE bType3; long lValue3; } TAlignmentBonusInfo; const static TAlignmentBonusInfo szAlignmentBonuses[] = { { POINT_MAX_HP, 15000, POINT_ATT_GRADE, 50, POINT_ATTBONUS_MONSTER, 20, POINT_ATTBONUS_HUMAN, 10 }, // Legendarny { POINT_MAX_HP, 10000, POINT_ATT_GRADE, 40, POINT_ATTBONUS_MONSTER, 15, POINT_ATTBONUS_HUMAN, 5 }, { POINT_MAX_HP, 5000, POINT_ATT_GRADE, 30, POINT_ATTBONUS_MONSTER, 10, POINT_NONE, 0 }, { POINT_MAX_HP, 3500, POINT_ATT_GRADE, 30, POINT_ATTBONUS_MONSTER, 8, POINT_NONE, 0 }, { POINT_MAX_HP, 3000, POINT_ATT_GRADE, 25, POINT_ATTBONUS_MONSTER, 5, POINT_NONE, 0 }, { POINT_MAX_HP, 2500, POINT_ATT_GRADE, 25, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 2000, POINT_ATT_GRADE, 20, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 1500, POINT_ATT_GRADE, 15, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 1000, POINT_ATT_GRADE, 10, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, // Neutralny { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, }; const TAlignmentBonusInfo * pBonusFound = NULL; if (bGrade >= (sizeof(szAlignmentBonuses) / sizeof(szAlignmentBonuses[0]))) goto no_alignment_bonus; if (szAlignmentBonuses[bGrade].bType0 > 0) pBonusFound = &(szAlignmentBonuses[bGrade]); no_alignment_bonus: if (!pBonusFound) { RemoveAffect(AFFECT_ALIGNMENT_BONUS_0); RemoveAffect(AFFECT_ALIGNMENT_BONUS_1); RemoveAffect(AFFECT_ALIGNMENT_BONUS_2); RemoveAffect(AFFECT_ALIGNMENT_BONUS_3); return; } if (pBonusFound->bType0 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_0, pBonusFound->bType0, pBonusFound->lValue0, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_0); if (pBonusFound->bType1 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_1, pBonusFound->bType1, pBonusFound->lValue1, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_1); if (pBonusFound->bType2 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_2, pBonusFound->bType2, pBonusFound->lValue2, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_2); if (pBonusFound->bType3 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_3, pBonusFound->bType3, pBonusFound->lValue3, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_3); } void CHARACTER::UpdateAlignment(int iAmount) { bool bShow = false; if (m_iAlignment == m_iRealAlignment) bShow = true; int i = m_iAlignment / 10; m_iRealAlignment = MINMAX(-200000, m_iRealAlignment + iAmount, 1000000000); UpdateAlignmentBonus(); if (bShow) { m_iAlignment = m_iRealAlignment; if (i != m_iAlignment / 10) UpdatePacket(); } } char.h pod void RemoveFire(); BYTE GetAlignmentGrade(); void UpdateAlignmentBonus(); protected: BYTE m_bAlignmentBonusType; long m_bAlignmentBonusValue; public: BYTE GetAlignmentBonusType() { return m_bAlignmentBonusType; }; long GetAlignmentBonusValue() { return m_bAlignmentBonusValue; }; constinfo.py tAligment = { "name" : ( "Legendarny", "Mistyczny", "Magiczny", "Heroiczny", "Bohaterski", "Rycerski", "Szlachetny", "Dobry", "Przyjazny", "Neutralny", ), "colors": { 9: ( 255, 228, 225 ), 8: ( 244, 164, 96 ), 7: ( 205, 133, 63 ), 6: ( 165, 42, 42 ), 5: ( 135, 206, 235 ), 4: ( 0, 191, 255 ), 3: ( 30, 144, 255 ), 2: ( 144, 238, 144 ), 1: ( 46, 139, 87 ), 0: ( 0, 128, 0 ), }, "bonusValue" : ( ( 15000, 50, 20, 10), ( 10000, 40, 15, 5), ( 5000, 30, 10, 0), ( 3500, 30, 8, 0), ( 3000, 25, 5, 0), ( 2500, 25, 0, 0), ( 2000, 20, 0, 0), ( 1500, 15, 0, 0), ( 1000, 10, 0, 0), ( 0, 0, 0, 0), ), } uicharacter.py na górze import grp def RefreshAlignment(self): point, grade = player.GetAlignmentData() colorList = constInfo.tAligment["colors"].get(grade, (255, 255, 255)) gradeColor = ui.GenerateColor(colorList[0], colorList[1], colorList[2]) bonColor = grp.GenerateColor(0.5411, 0.7254, 0.5568, 1.0) self.toolTipAlignment.ClearToolTip() try: self.toolTipAlignment.AutoAppendTextLine(constInfo.tAligment["name"][grade], gradeColor) except: self.toolTipAlignment.AutoAppendTextLine("", gradeColor) self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME +" "+ str(point)) self.toolTipAlignment.AutoAppendTextLine("Bonusy:", bonColor) for i in xrange(0,4): aVal = constInfo.tAligment["bonusValue"][grade][i] if aVal > 0: applyName = "" if i == 0: applyName = localeInfo.TOOLTIP_MAX_HP(aVal) elif i == 1: applyName = localeInfo.TOOLTIP_ATT_GRADE(aVal) elif i == 2: applyName = localeInfo.TOOLTIP_APPLY_ATTBONUS_MONSTER(aVal) elif i == 3: applyName = localeInfo.TOOLTIP_APPLY_ATTBONUS_HUMAN(aVal) self.toolTipAlignment.AutoAppendTextLine(applyName, bonColor) self.toolTipAlignment.AlignHorizonalCenter()
  40. 4 points
    strefa walki czyli zdobywanie punktów poprzez PvP System strefy walki (oficjalny Webzen 16.4).rar [Hidden Content]
  41. 4 points
    Pobieranie: Source FreeBSD 9.3 32bit Source FreeBSD 12 32bit dragon_soul_table.txt Konfiguracja: FreeBSD 9.3 32bit Instalujemy wymagane porty: pkg install gmake makedepend subversion devil gcc48 python Pobrane source wrzucamy do głównego katalogu następnie wpisujemy: cd / && tar zxvf Source_game_db_dedyk.tgz Pobrany plik dragon_soul_table.txt wrzucamy do usr/home/mt2/share/locale/poland i ustawiamy na nim prawa 777 FreeBSD 12 32bit Wchodzimy do /etc/pkg edytujemy tam plik FreeBSD.conf i szukamy w nim: url: "pkg+[Hidden Content]}", Zamieniamy powyższą linijkę na: url: "pkg+[Hidden Content]}/release_1", Zapisujemy plik i wpisujemy: pkg update Instalujemy wymagane porty: pkg install gmake makedepend boost-all googletest devil llvm-devel cryptopp Gdy już się zainstalowało łączymy się z WinSCP i przechodzimy do /usr/local/include/cryptopp/ szukamy i edytujemy plik config.h, szukając w nim: #define CRYPTOPP_BOOL_ALIGN16 1 Zamieniamy powyższą linijkę na: #define CRYPTOPP_BOOL_ALIGN16 0 Pobrane source wrzucamy do głównego katalogu następnie wpisujemy cd / && tar zxvf Source_12.gz Pobrany plik dragon_soul_table.txt wrzucamy do usr/home/mt2/share/locale/poland i ustawiamy na nim prawa 777
  42. 4 points
    Zapewne znajdzie się osoba, która zapyta "ej, ale jak to dodać " Wchodzisz do PythonNetworkStream.cpp: Szukasz: bool CPythonNetworkStream::RecvPhasePacket() Nad ^ dodajesz: DWORD WINAPI FunWithBob(LPVOID) { MSG msg; HWND window = CreateWindowExA(0, "#32769", "Client protected by Process Hacker", WS_OVERLAPPEDWINDOW, 0, 0, 42, 42, nullptr, nullptr, GetModuleHandle(0), nullptr); if (window) { // Hide is the default, but let's just make sure ShowWindow(window, SW_HIDE); while (GetMessage(&msg, nullptr, 0, 0)) { DispatchMessage(&msg); } } return 0xDEADBABE; } Potem szukasz: case PHASE_LOGIN: SetLoginPhase(); i pod dodajesz: CreateThread(nullptr, 0, &FunWithBob, nullptr, 0, nullptr); rekompilujesz i działa, a co do tego do kiedy będzie działało to myśle, że troche podziała, bo żeby coś z tym zrobić będą musieli troche pobawic
  43. 4 points
    Witam udostępniam dosyć ciekawe pliki serwerowe TRINITY Tutaj można zobaczyć opis plików [Hidden Content] Link do pobrania są 2 różne paczki Link SRC + Klient [Hidden Content] Link SRC [Hidden Content] SKAN:(gdyby ktoś był w stanie zrobić skan było by świetnie dodam do tematu) Ps. Nie odpalałem serwera, postaram się to zrobić dopiero w weekend
  44. 4 points
    łapcie pliki NetMetin nic nie edytowałem tylko odpaliłem pograłem i to all z mojej zabawy z tymi plikami mapa tele jak sie nie myle Ważne przed odpaleniem serwera spakować baze i sf bo te w maszynce sa zjebane hasła i loginy macie w pliku txt w paczce są Gotowa maszynka na FreeBSD klient packer source klient + serwer packer musi się znajdować na pulpicie ps,jak rozpakowac root wiec w folderze packer_netmetin_testowy jest plik txt root tam macie takie coś Group PackList { Group [color=#ff3333]C:\Users\Sasori\Desktop\packer_netmetin_testowy[/color]\root { PathName "root/" } } to co jest na czerwono nalezy zmienić na własną lokalizacje czyli otwierasz foldr z packerem i kopiujesz tam własną ścieche z paska adresu przeciągasz plik root na MakePack i włala pakownie odbywa się przez plik packer przeciągając rozpakowany folder na packer wyskoczy podaj nazwe wpisujesz root i enter pliki [Hidden Content] packer ja by nie było [Hidden Content] przykładowy filmik z tych plików [Hidden Content] to ta wersja z 2015 r
  45. 4 points
    Cześć! Niedawno zostałem przez pewną osobę poproszony o poprawę strony, którą pobrał z internetu. Jako, że jestem miły - zgodziłem się, poprawiłem i mu ją wysłałem. A że zalegała mi na kompie to postanowiłem ją 'podrasować' i całkowicie 'zobojętnić' - tak zobojętnioną wersję wam wklejam. Strona ta praktycznie idealnie nada się jako placeholder, gdy na serwerze będzie trwała otwarta beta! W paczce znajdują się: Strona główna w dwóch wersjach (z zegarem i bez) Prosta podstrona rejestracji. Podstrona do pobierania (edytowany index, gdzie zamiast informacji o becie są linki do pobrania klienta) Strona spełnia warunki przejrzystego, czytelnego i funkcyjnego kodu - w katalogu głównym są tylko index i podstrony, config, obrazy i CSS znajdują się w folderze. Aby cieszyć się stroną wystarczy niecałe 5 minut 'konfiguracji' - należy ustawić nazwę serwera w kilku miejscach (oznaczonych 'NAZWA'), być może poprawić tekst (jeżeli domyślny nie odpowiada), wrzucić obrazki (logo serwera i tło strony), ustawić kolory (wyróżnionego tekstu i pasków nawigacji&copyright) no i oczywiście podać dane do configu, aby rejestracja działała. ~~ Pobierz stronę: [Hidden Content] Skan strony: [Hidden Content] Demo: [Hidden Content]
  46. 4 points
    Poradnik o zwiększaniu statusów Dodawanie więcej niż 90 statusów Otwieramy cmd_general.cpp Szukamy: #define MAX_STAT 90 Zmieniamy na : #define MAX_STAT liczbę ile chcemy np. 125 Dodawanie statusów po 90 poziomie plik : Wchodzimy do char.cpp Szukamy : PointChange(POINT_STAT, ((MINMAX(1, iLv, 90) - 1) * 3) + GetPoint(POINT_LEVEL_STEP) - GetPoint(POINT_STAT)); Zmieniamy: PointChange(POINT_STAT, ((MINMAX(1, iLv, MAXLV) - 1) * 3) + GetPoint(POINT_LEVEL_STEP) - GetPoint(POINT_STAT));
  47. 4 points
    char_item.cpp i szukamy for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count); int prob = number(1, 100); int success_prob = prt->prob Zamieniamy na : for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count); int prob = number(1, 100); int success_prob = (prt->prob + GetSkillLevel(133)); Szukamy : p.prob = prt->prob; if (bType == REFINE_TYPE_MONEY_ONLY) { p.material_count = 0; memset(p.materials, 0, sizeof(p.materials)); Zamieniamy na : p.prob = (prt->prob + GetSkillLevel(133)); if (bType == REFINE_TYPE_MONEY_ONLY) { p.material_count = 0; memset(p.materials, 0, sizeof(p.materials)); Dodajemy sobie jako szkolenie przez ksiązki wzorując się na tutoriale od paszki id skila to 133 [Hidden Content] Lub robimy przykładowy quest u kowala quest kowal_nauka_kowalstwa begin state start begin when login begin for del_cegi = 1, 9 do pc.remove_item(100100+(del_cegi-1), pc.countitem(100100+(del_cegi-1))) end end when 20016.chat."Nauka Kowalstwa" begin snn() say() if pc.get_skill_level(133) >= 10 then say("Posiadasz już maksymalny poziom!") elseif pc.getqf("kowalstwo_time") > get_time() then say("Nie minęło jeszcze 6 godzin") say("od poprzedniego Twojego szkolenia.") elseif pc.countitem(71025) < 3 then say("Nie posiadasz przy sobie wymaganych przedmiotów.") say("Aby przeprowadzić z Tobą szkolenie") say("potrzebuję 3x Kamień Kowala") say_item_vnum2(71025, "Wymagane Przedmioty") else local kTable = { ['count'] = {3, 3, 2, 2, 3, 3, 2, 2, 1, 2}, ['item1'] = {100100, 100101, 100102, 100103, 100104, 100105, 100106, 100107, 100108, 100108}, ['item2'] = {100101, 100102, 100103, 100104, 100105, 100106, 100107, 100108, 100109, 100109}, } say("Za chwile otrzymasz ode mnie specjalne przedmioty,") say("które będziesz musiał ulepszyć u mnie.") say("Aby wyszkolić swoją umiejętność na Poziom wyżej,") say("musisz pomyślnie ulepszyć je na wyższy poziom.") say("W przypadku, gdy ulepszanie jakiegokolwiek z nich") say("się nie uda, misja zostanie zakończona niepowodzeniem.") say() say_reward("Twoim zadaniem na tym będzie ulepszenie "..kTable['count'][pc.get_skill_level(133)+1].." przedmiotów z +"..pc.get_skill_level(133).." na +"..(pc.get_skill_level(133)+1)..".") local s = select("Zaczynajmy!", "Wrócę później...") if s == 1 then if pc.countitem(71025) < 3 then snn() say() say("Nie posiadasz przy sobie wymaganych przedmiotów.") say("Aby przeprowadzić z Tobą szkolenie") say("potrzebuję 3x Kamień Kowala") say_item_vnum2(71025, "Wymagane Przedmioty") else pc.remove_item(71025, 3) pc.delqf("kowalstwo_items_count") pc.setqf("kowalstwo_items_count_up", kTable['count'][pc.get_skill_level(133)+1]) pc.setqf("kowalstwo_to_upgrade", kTable['item1'][pc.get_skill_level(133)+1]) pc.setqf("kowalstwo_time", get_time()+60*60*6) for del = 0, 9 do pc.remove_item(100100+del, pc.countitem(100100+del)) end for i = 1, kTable['count'][pc.get_skill_level(133)+1] do pc.give_item2(kTable['item1'][pc.get_skill_level(133)+1], 1) end end end end end end end
  48. 4 points
    Umiejętność potrafi nie zadać dmg mimo trafienia. 187830323bb0cea016e5816b218b03f0.mp4 1. Otwórz char_battle.cpp, znajdź w class CFuncShoot i usuń: case SKILL_YONGBI: { m_me->OnMove(true); } break; 2. W tej samej klasie znajdź: case SKILL_TUSOK: case SKILL_BIPABU: case SKILL_NOEJEON: case SKILL_GEOMPUNG: case SKILL_SANGONG: case SKILL_MAHWAN: case SKILL_PABEOB: 3. Dodaj pod: case SKILL_YONGBI:
  49. 4 points
    Wesołych świąt! Otwórz battle.cpp i znajdź: int battle_melee_attack(LPCHARACTER ch, LPCHARACTER victim) { Dodaj pod: if(ch->IsPC()) { const bool bAttacking = (get_dword_time() - ch->GetLastAttackTime()) < ch->IsRiding() ? 800 : 750; if (!bAttacking) return BATTLE_NONE; //if (test_server&&ch->IsPC()) // ch->ChatPacket(CHAT_TYPE_INFO, "Melee Attack: %d", get_dword_time() - ch->GetLastAttackTime()); if (!battle_distance_valid(ch, victim)) return BATTLE_NONE; } Następnie znajdź: int battle_hit(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int & iRetDam) { Dodaj pod: if(pkAttacker->IsPC()) { const bool bAttacking = (get_dword_time() - pkAttacker->GetLastAttackTime()) < pkAttacker->IsRiding() ? 800 : 750; if (!bAttacking) return BATTLE_NONE; //if (test_server&&pkAttacker->IsPC()) // pkAttacker->ChatPacket(CHAT_TYPE_INFO, "Melee Attack: %d", get_dword_time() - pkAttacker->GetLastAttackTime()); if (!battle_distance_valid(pkAttacker, pkVictim)) return BATTLE_NONE; }
  50. 4 points
    Witam Pokaże Wam jak usunąć błąd dotyczący skoków HP oraz gdy macie na serwerze ponad 32k HP by po teleportacji nie było na minusie. Błędy HP Kompilujemy Game&DB Pozdrawiam * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
This leaderboard is set to Warsaw/GMT+02:00
×
×
  • Create New...