Jump to content

Search the Community

Showing results for tags 'howto'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • M2Tec
    • M2Tec - News
    • M2Tec - Rules
    • Feedback
  • Metin2
    • Binaries & Clients/Serverfiles
    • Discussions & Questions
    • Guides & Releases
    • 2D/3D Graphics
    • File requests
    • Private Servers
  • General
    • Programming / Scripts
    • Tools/Programs
    • Releases
  • Offtopic
    • Introductions
    • General Talk
    • Games Talk
    • Music/Videos/Art
    • M2tec Birthdays
  • Helfer's Themen
  • M2tec Files's Updates

Product Groups

  • Premium
  • Source
  • Advertisement
  • Donate

Categories

  • M2Tec Files
  • Kori Files
  • Starfoul - ServerFiles

Categories

  • Support
  • Sales
  • Administration
  • Other

Blogs

There are no results to display.

There are no results to display.


Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me

Found 53 results

  1. Hello, because i saw some people asking for that, there is: Replace the cmd_emotion.cpp With this file: Download: [Hidden Content] I couldn't find other way to do this, i just add the duration time in the file and i writed a code for hide & show with time event, everything working fine.
  2. Hello, today i release from my source, the fix for offline shop by great to work good with transmutation system. My source is kori source 1.4 but with fixed bugs. You dont have to replace the whole functions. You can compare with mine. If you install them correctly like i tell you, it should work. Its tested to my server, and it works 100%. Download link: [Hidden Content] I hope I helped, Yours sincerely, VoiD.
  3. Unser ziel ist es am Ende eine Compilebare ServerSource Maschine zu haben. in der Regel dauert dies so 1 Std dazu braucht Ihr: FreeBSD-9.3-RELEASE-i386-disc1.iso Virtual Box VM Ware Winscp Mindestens Zwei Hände und eine Menge Geduld. zunächst starten wir Virtual Box wir klicken auf Neu und erhalten dieses Fenster diese Maschine nennen wir wie man will in meinem Fall M2Compile nun vergeben wir dem noch ein Bisschen Ram. ich empfehle 4 GB Ram da verläuft das ganze am Reibungslosestem es geht alles ab 1 GB + empfehlenswert ist aber 4 GB nun erzeugen wir eine Virtuelle Festplatte dazu: Erzeugen -> VDI -> Dynamisch erzeugen wählt nun eure Speichergröße so 20 GB in meinem Fall dann wählen wir uns einen Pfad aus empfehlenswert wäre es dann 2 Thread einzustellen nun müssen wir die VDI einstellen unter Massenspeicher auf leer dort Sekundärer Master ausgewählt haben und die FreeBSD-9.3-RELEASE-i386-disc1.iso auswählen als nächstes noch die Netzwerk einstellungen nun sagen wir ihm er soll auf den selben Netzwerkcontroller zugreifen wie der Standartlich bei der Hardware vorhanden ist in meinem fall mein Ethernet Controller ungefähr so sehen dann eure einstellungen aus Nun starten wir die VM mithilfe des Grünen buttons namens Starten dieser bootet nun von alleine von der CD [ENTER] das wählen wir aus und drücken [ENTER] dann müsst ihr einen adminnamen eingeben in meinem fall dann mithilfe von Leertaste die * rausmachen nun bleiben mit mit der auswahl auf src und drücken [ENTER] dann bei Guided auf [ENTER] [Enter] bei Entire Disk einmal mit den pfeiltasten auf Delete und [Enter] dann geht ihr auf Create wir nennen das ganze freebsd-boot und geben ihm 512k und drücken dann auf Create mit [Enter] dann erstellen wir noch eine Festplatte die nennen wir freebsd-ufs und wir geben dem mal so 18 GB mountpoint / wir bestätigen das ganze mit [ENTER] nun erstellen wir noch eine partition wir nennen es swap so als zwischenspeicher falls wir mehrere Festplatten mounten wollen oder oder oder.... [ENTER] so nun gehen wir auf Finish [ENTER] Commit [ENTER] nach kurzem warten sind wir beim in meinem fall nehmen wir als Passwort 123 retypen dies nun tragen wir eine IP ein unter der wir den server erreichen können in meinem fall 192.168.178.13 ihr könnt die selbe nehmen da es eh lokal ist. dort müsst ihr bei 1&1 Nutzern Fritz.box eintragen oben als ipadresse eure ip normalerweise bei IVP4 DNS #1 192.168.178.1 danach Enter hier auf NO nun wählt ihr nochmal Europe aus hier nun durchentern ebenfalls enter da wir keine weiteren User brauchen nun kommen wir zu hier auf NO nun Rebooten wir das ganze aber unmounten gleich noch die CD da die maus gefangen ist STRG (Linke) mit einem Rechtsklick und die CD anklicken Auswurf erzwingen und am besten dann während der bildschirm der virtuellen maschine angezeigt wird. nun sollte er ohne CD einmal booten und wir befinden uns nach einigen sekunden nach dem einloggen mit root 123 nun mit clear machen wir alles weg was auf dem Bildschirm ist normalerweise müssten wir portsnap fetch extract ausführen aber wir sind hier im Jahre 2018 also nicht unbedingt nötig der rest geht von alleine pkg install python Y und [Enter] Ist dies nicht der fall und er kann nix Fetchen hier der Fix: bsdconfig ENTER runter mit pfeiltasten zu dort nun auf hier nun ENTER DHCP ist disabled geht auf DHCP und dann Enter danach sollte dies enable sein das wars. zurück zum python nach pkg install python Y Enter so nachdem wir alles bestätigt haben brauchen wir noch einige sachen. wir geben ein pkg install gmake und entern alles durch nun geben wir ein pkg install makedepend nun noch pkg install devil nun erstellen wir eine Winscp verbindung her nachdem wir diese winscp verbindung hergestellt haben: erstellen wir im ordner Root das verzeichnis metin2 und fügen dort eine beliebige src ein Bei mir im beispiel Fliegesrc also cd /root/metin2/BELIEBIGESOURCE/server/game/src gmake clean gmake -j4 das wars bei fragen einfach melden
  4. Patcher by Hanashi Originalthread: [Hidden Content] Mir war mal langweilig und hab dazu mal n Video gemacht #outdate aber egal ^^ #reupload [Hidden Content]
  5. "Mensch mein World editor gibt ständig irgendwelche Fehlermeldungen raus und ich weiß nicht warum, ich hab ihn genauso kopiert wie er da zum DL steht trotzdem geht er nicht" So muss der Ordner vom World editor normalerweise aussehen natürlich könnt ihr nicht einfach die entpackten epk / eix ordner dort einfach reinziehen ihr müsst als aller erstes darauf achten und das ist ganz wichtig das der WE im verzeichnis :D/ymir work/ ist habt ihr keine zweite Festplatte nutzt ihr beispielsweise einen USB stick oder eine 2. Partition falls euer stick jetzt urplötzlich E I H oder sonstwas hat per Datenträgerverwaltung lässt sich sowas umstellen dann einfach rechtsklick auf das Laufwerk und den Kennbuchstaben auf D stellen fertig. haben wir nun den World Editor in den Pfad gesteckt kümmern wir uns mal um die Inhalte die er braucht. er wird womöglich nach dem background_stone.gr2 fragen. (klick mich falls ihr ihn braucht) dann müssen wir nun die einzelnen ordner durchgehen von eurem clienten solltet ihr erstmal den miles ordner komplett kopieren einfach direkt ins verzeichnis D/ymir work nun brauchen wir die inhalte von folgenden verzeichnissen wichtig ist hierbei dass nicht einfach der komplette Ordner kopiert werden soll SONDERN anstatt einfach nur den Zone Ordner den Inhalt der Zone d.h. der pfad darf dann nicht: d/ymir work/Zone/ymir work/ Objekte sein sondern muss d/ymir work/Zone/ Objekte das gilt für alle verzeichnisse zone tree textureset terrainmaps (terrain) special (etc) sound (für ambiente) property pc (eig nur so eine rüstung aber bin zu faul sie rauszusuchen) environment (etc) effect (etc) achtet darauf dass ihr die selbe granny version wie aus eurem clienten verwendet. im normal fall ist das granny 2.4 oder 2.9 😉 bei fragen einfach melden
  6. Hello, I come to share my knowledge on what I discovered recently on the packets encryption. Some might tell me, but that was already shared by MartySama. In fact, this one is not complete, it has forgotten a very important factor which I will present to you subsequently. But suddenly, you have to wonder what happens if we disable the encryption packets the way he shared it? Well, we risk having an overload in the buffer, which may lead to crash games without error or bugs quite strange. There are different strange bug that I could see, the most common was the fact that we can no longer perform an action that requires an agreement with the game. Example, after 15 minutes of play with some player connected, some will no longer click on an item, or else can not talk etc ... There was a lot of debate about that, I took advice left and right and I drew a problematic. I - Why these bugs where not present before the packet encryption? Simply because the structure has been edited. Indeed, we can see that in the protocol.h of the Game, the function buffer_adjust_size was commented. Also, in the desc.cpp, they completely removed the condition in the function: void DESC::Packet But why? Simply because it is no longer useful, the new system does not require a size adjuster for the buffer (it seems to me) Or, they coded something else that automatically adjusts the size of the buffers but I have not watched yet. II - How to remove the encryption packet system properly? In Common, open service.h and comment this: #define _IMPROVED_PACKET_ENCRYPTION_ In Game now, open protocol.h and search: //buffer_adjust_size(pbuf, length); Edit by this: buffer_adjust_size(pbuf, length); Game, open desc.cpp, and the search the function: void DESC::Packet(const void * c_pvData, int iSize) By this: void DESC::Packet(const void * c_pvData, int iSize) { assert(iSize > 0); if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다. return; if (m_stRelayName.length() != 0) { // Relay 패킷은 암호화하지 않는다. TPacketGGRelay p; p.bHeader = HEADER_GG_RELAY; strlcpy(p.szName, m_stRelayName.c_str(), sizeof(p.szName)); p.lSize = iSize; if (!packet_encode(m_lpOutputBuffer, &p, sizeof(p))) { m_iPhase = PHASE_CLOSE; return; } m_stRelayName.clear(); if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { m_iPhase = PHASE_CLOSE; return; } } else { if (m_lpBufferedOutputBuffer) { buffer_write(m_lpBufferedOutputBuffer, c_pvData, iSize); c_pvData = buffer_read_peek(m_lpBufferedOutputBuffer); iSize = buffer_size(m_lpBufferedOutputBuffer); } // TRAFFIC_PROFILE if (g_bTrafficProfileOn) TrafficProfiler::instance().Report(TrafficProfiler::IODIR_OUTPUT, *(BYTE *) c_pvData, iSize); // END_OF_TRAFFIC_PROFILER #ifdef _IMPROVED_PACKET_ENCRYPTION_ void* buf = buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { if (cipher_.activated()) { cipher_.Encrypt(buf, iSize); } } else { m_iPhase = PHASE_CLOSE; } #else if (!m_bEncrypted) { if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { m_iPhase = PHASE_CLOSE; } } else { if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { buffer_adjust_size(m_lpOutputBuffer, iSize); if (buffer_has_space(m_lpOutputBuffer) < iSize + 8) { sys_err( "desc buffer mem_size overflow : ", " memsize(%u) ", " write_pos(%u)", " iSize(%d)", m_lpOutputBuffer->mem_size, m_lpOutputBuffer->write_point_pos, iSize); m_iPhase = PHASE_CLOSE; } } else { // 암호화에 필요한 충분한 버퍼 크기를 확보한다. /* buffer_adjust_size(m_lpOutputBuffer, iSize + 8); */ DWORD * pdwWritePoint = (DWORD *) buffer_write_peek(m_lpOutputBuffer); if (packet_encode(m_lpOutputBuffer, c_pvData, iSize)) { int iSize2 = TEA_Encrypt(pdwWritePoint, pdwWritePoint, GetEncryptionKey(), iSize); if (iSize2 > iSize) buffer_write_proceed(m_lpOutputBuffer, iSize2 - iSize); } } } #endif // _IMPROVED_PACKET_ENCRYPTION_ SAFE_BUFFER_DELETE(m_lpBufferedOutputBuffer); } //sys_log(0, "%d bytes written (first byte %d)", iSize, *(BYTE *) c_pvData); if (m_iPhase != PHASE_CLOSE) fdwatch_add_fd(m_lpFdw, m_sock, this, FDW_WRITE, true); } You can compile your game. Do not forget to compile a db also ! EterBase, open ServiceDefs.h and comment: #define _IMPROVED_PACKET_ENCRYPTION_ Userinterface, open Locale.cpp and edit: #define LSS_SECURITY_KEY "testtesttesttest" By this: #define LSS_SECURITY_KEY "1234abcd5678efgh" III - Why would I disable this system? - Connection time LARGEMENT decreased (unused cipher) - Loading time also decreased - Better fluidity (personal opinion) - Size of the game enormously decreased as well as that of the launcher Here is a small video: Hoping that it serves you well! Madara
  7. Hello m2tech, Today i will release the fix for invisibility effect bug and the AFFECT_EUNHYEONG = sealth ninja skill from 17.5 Official update. What has my hide system, it is imperative to apply this fix. Open instancebase.cpp and search for: BOOL CInstanceBase::IsInvisibility() { if (IsAffect(AFFECT_INVISIBILITY)) return true; return false; } Replace with: BOOL CInstanceBase::IsInvisibility() { if (IsAffect(AFFECT_INVISIBILITY) || IsAffect(AFFECT_EUNHYEONG)) return true; return false; } Search for: void CInstanceBase::Update() { Inside the function search for: if (IsMountingHorse()) { m_kHorse.m_pkActor->HORSE_MotionProcess(false); } } Add bellow: if (IsAffect(AFFECT_INVISIBILITY) || IsAffect(AFFECT_EUNHYEONG)) m_GraphicThingInstance.HideAllAttachingEffect(); Open InstanceBaseEffect.cpp and search for: void CInstanceBase::__SetAffect(UINT eAffect, bool isVisible) { Inside the function search: case AFFECT_INVISIBILITY: if (isVisible) { m_GraphicThingInstance.ClearAttachingEffect(); __EffectContainer_Destroy(); DetachTextTail(); } else { m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f); AttachTextTail(); RefreshTextTail(); } return; break; } Replace with: case AFFECT_INVISIBILITY: if (isVisible) { // m_GraphicThingInstance.ClearAttachingEffect(); // __EffectContainer_Destroy(); // DetachTextTail(); m_GraphicThingInstance.HideAllAttachingEffect(); } else { m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f); m_GraphicThingInstance.ShowAllAttachingEffect(); // AttachTextTail(); // RefreshTextTail(); } return; break; Thanks to legend for this sharing.
  8. So guys i've been messing around with Ore on items and i saw that despite an item has 3 bonus when you add an ore only two appear, but the character get all the bonuses. The fix for that is: Open root/uitooltip.py and then follow the instructions. Search for: affectList2=[0, max(1, affectValue2*10/100), max(2, affectValue2*20/100), max(3, affectValue2*40/100)] And add below: affectType3, affectValue3 = item.GetAffect(2) affectList3=[0, max(1, affectValue3*10/100), max(2, affectValue3*20/100), max(3, affectValue3*40/100)] Then Search for: affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos+1]-affectList2[mtrlPos]) And add below: affectString3 = self.__GetAffectString(affectType3, affectList2[mtrlPos+1]-affectList3[mtrlPos]) Find: self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, leftTime) Replace with: self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, affectString3, leftTime) Find: def __AppendMetinSlotInfo_AppendMetinSocketData(self, index, metinSlotData, custumAffectString="", custumAffectString2="", leftTime=0): Replace with: def __AppendMetinSlotInfo_AppendMetinSocketData(self, index, metinSlotData, custumAffectString="", custumAffectString2="", custumAffectString3="", leftTime=0): Last find: if custumAffectString2: And add below: if custumAffectString3: affectTextLine = ui.TextLine() affectTextLine.SetParent(self) affectTextLine.SetFontName(self.defFontName) affectTextLine.SetPackedFontColor(self.POSITIVE_COLOR) affectTextLine.SetPosition(50, self.toolTipHeight + 16 + 2 + 16 + 2) affectTextLine.SetOutline() affectTextLine.SetFeather() affectTextLine.Show() affectTextLine.SetText(custumAffectString3) self.childrenList.append(affectTextLine) self.toolTipHeight += 16 + 2 I know thats something that some might never noticed and that's super easy to fix, but some people might do not know.
  9. After I released some Metin2-compatible Speedtree trees in another forum a few years ago, some people have also posted trees from other games which I downloaded from several forums. But the issue with those trees is always the same, they either do not work or they look strange, with noticeable dark areas. Metin2 uses the oldest existing version of Speedtree, in fact it uses a demo version of Speedtree from 2003 that was used to advertise the software to developers after it was created. It's not even a full version. Therefore some features that older versions use, even in games contemporary to Metin2, are not available. Fortunately there is a newer editor that is almost fully compatible with the version of SpeedTree included with Metin2, and this is version 3: [Hidden Content] Version 4 is partially compatible but I wouldn't recommend using it. Version 5 and newer of SpeedTree use a completely different file format and are not compatible. Let's say we have a speedtree (spt) file, with its matching dds texture, and now we try loading it into SpeedTree CAD 3: Here we encounter our first problem; while many games are using dds textures, Speedtree CAD only supports TGA files. In order to know what our tree looks like, we should convert the dds files to tga (although Metin2 will use dds regardless of what's set in the SPT file,you can try opening a spt file with a hex or text editor as the paths are there almost in plain text). A good tool for this is Irfanview, which also provides a batch conversion feature allowing us to convert dozens of files across subfolders in a single click: [Hidden Content] In this case, as I had to deal with subfolders, I used advanced options and checked "create subfolders in destination folder", as well as "Include subfolders for Add All button). After doing this, I had a tga version of all the dds textures used in this game, so now I can see the trees and work with them. Once we want to release our tree we can just keep the dds file. In this partcular case with Ragnarok, after converting all the textures, I found out the spt file itself was using dds as format (Metin2 rewrites the extension in the file), which meant there was only one way to see the trees within SpeedTree CAD and so I downloaded some hexadecimal editor to change these extensions from dds to tga: As I load the resulting file into Speedtree CAD 3 it seems Irfanview did not convert the alpha channel found in the original dds file to the tga one: That should be fine as we will use DDS ingame, not this TGA. So I decide this palm tree actually looks nice and I load the original file into World Editor which unsurprisingly results in a crash. This file is probably a SpeedTree 4 file. SpeedTree 4 was very popular in the 2000's and many games use it, but the file format is not compatible with Metin2 and will cause it to crash. Fortunately there is a workaround so I load the original unmodified SPT file into SpeedTree CAD 3 and save it back without changing anything, which allows it to be read by Metin2. FInally my tree is loading, unfortunately the size is wrong and it looks more like a banana: But this has an easy solution. I go back to Speedtree CAD, Global tab, and change the size field from 41.7 to 1000, then click Compute, and then save. PRT files have a Size field in them but it just doesn't work so we have to do it this way. Now going to the subject of lighting, this palm doesn't look too bad, but some trees will just look terrible in metin because of the lighting. Case in point: Half the leaves are dark which doesn't look too good. This is because those games have actual lighting for their trees which Metin2 doesn't, so we have to do it manually. We proceed to the Lighting tab in Speedtree CAD: What we are going to do here, to make the tree more fitting, is change all "Lighting Style" fields to Static and then play with the Dimming (set it around 10-20%) and optionally the Leaf Lighting Adjustment and "simulate shadows". Our goal is to show some slightly darker areas but not as exaggerated as in the picture before: I'm not happy with the result yet. There's another field which sometimes affects the leave color and it's under the "Leaves" tab. I reduced "Color variance" from 60 to 30 in both textures (click in "Texture #" to switch between textures) Here is the final result: Parameters changed: LIGHTING Branch lighting: Dynamic > Static Leave lighting: Dynamic > Static Static lighting style: Basic Leaf lighting adjustment: 0.1 > 0.8 Dimming: 90% > 10% Frond lighting: Dynamic > Static LEAVES Color variance: 60 > 90 (for both textures) These changes, with small variations, should work for pretty much every tree to look like a proper "Metin2 tree". Don't forget that you need to click "Compute" to see the changes, and before you save the file.
  10. Hi everyone. I would like to share with you a reversed small stuff from the official game. Any problem? Just write a comment below, even a feedback is also good for us to make sure I did not miss anything from the guide. 
  11. on char.cpp search : case POINT_MALL_GOLDBONUS: and to make any bonus cap you just need to do this(for any bonus you want a cap) case POINT_RESIST_SHAMAN: if (GetPoint(type) + amount > 80) { ChatPacket(CHAT_TYPE_INFO, "The percentage was higher than 80 percent. The Game will adjust your bonus."); //no need to include this, spams. amount = 80 - GetPoint(type); } Whats a cap? Basicly its the max value that a player will be able to reach even though he might have 100% on total. I was trying to find out whats wrong and how could i do that , so here's what i found, which perfectly works by the way. In my opinion do not use the chatpacket cause its spamming, and if you get on the horse you're gonna see more than one "calls" on that point so... yes it spams.
  12. (uitooltip.py)search: def __AppendPotionInformation(self): Add below: [Hidden Content] Search: def AddItemData Add before: self.ShowToolTip() This: self.AppendAntiFlagInformation() Image in game:
  13. !! BIN NICHT MEHR AKTIV !!! VLT. FOLGEN IRGENDWANN WIEDER WEITERE SYSTEME ABER AKTUELL NICHT MEHR !! !! KEIN SUPPORT MEHR !! [Hatte ich im Alten Forum schon gemacht , führe ich hier Aktiv weiter] Vorab es sind nicht meine "Systeme" ich Poste diese hier nur Falls sie Jemand braucht Jedes" System " habe ich durchgetestet und Notfalls auch entbuggt. ---- Bei Fragen etc. bin ich Jederzeit in Skype erreichbar ---- [TABS MÜSSEN GEGEBENFALLS ANGEPASST WERDEN] 1. TextTail System [✔] [] 2. Uppsystem Erweiterung [✔] [] 3. Upgrade Python Version (2.7) [✔][] 4. Vermögensfenster [✔] [] 5. Start Level über Source [✔] [] 1. gmake: warning [✔] [] 1. Weißes Kaninchen-Siegel(OSTERN18)[✔] [] 2. Baby_Baashido_(Siegel)[✔] [] bis zu erweiterung der Zeilen anzahl kommt das in die Kommentare. Und das teste ich
  14. Server erstellen Hallo, in diesem HowTo erläutere ich euch, wie Ihr einen Server mithilfe des Localhost's erstellen könnt. In diesem Tutorial machen wir das Anhand der Kori Serverfiles Version 1.3. Was benötigen wir? Serverfiles 64BIT (1.3) Serverfiles 32BIT (1.3) Client (1.3) FTP Programm Datenbank-Programm VirtualBox Kopf Tutorial VDI einstellen!
  15. Hi everybody, I just share the results of my test after a few months. 1. Less unexplained disconnection related to the game. 2. No more errors related to the sequence in syserrs 3. Server Source & Clients Lightened As you can see, the removal of this system is entirely beneficial since it is an incomplete system causing disconnection in play for no reason. The system also generated this server-side error: On the other hand, if you have deactivated the encryption of the packets on your sources, it will require a lot of other important changes. If you want to do a series of tests you have the opportunity to act in 3 different ways: - #define SEQUENCE_SYSTEM_ENABLED - Comment the code - Delete the code Open input.cpp and search: if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u %u", m_pPacketInfo->IsSequence(bHeader), *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); Here, the syslog linked to the Header of the key pong uses the function IsSequence, we will modify it by: if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u", *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); Just down you have: if (m_pPacketInfo->IsSequence(bHeader)) { BYTE bSeq = lpDesc->GetSequence(); BYTE bSeqReceived = *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)); if (bSeq != bSeqReceived) { sys_err("SEQUENCE %x mismatch 0x%x != 0x%x header %u", get_pointer(lpDesc), bSeq, bSeqReceived, bHeader); LPCHARACTER ch = lpDesc->GetCharacter(); char buf[1024]; int offset, len; offset = snprintf(buf, sizeof(buf), "SEQUENCE_LOG [%s]-------------\n", ch ? ch->GetName() : "UNKNOWN"); if (offset < 0 || offset >= (int) sizeof(buf)) offset = sizeof(buf) - 1; for (size_t i = 0; i < lpDesc->m_seq_vector.size(); ++i) { len = snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", lpDesc->m_seq_vector[i].hdr, lpDesc->m_seq_vector[i].seq); if (len < 0 || len >= (int) sizeof(buf) - offset) offset += (sizeof(buf) - offset) - 1; else offset += len; } snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", bHeader, bSeq); sys_err("%s", buf); lpDesc->SetPhase(PHASE_CLOSE); return true; } else { lpDesc->push_seq(bHeader, bSeq); lpDesc->SetNextSequence(); //sys_err("SEQUENCE %x match %u next %u header %u", lpDesc, bSeq, lpDesc->GetSequence(), bHeader); } } Add the ifdef, comment or delete the entire code. Look for: CInputHandshake::CInputHandshake() { CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG; pkPacketInfo->SetSequence(HEADER_CG_PONG, false); m_pMainPacketInfo = m_pPacketInfo; BindPacketInfo(pkPacketInfo); } We will delete the sending of the sequence of the key pong here like this: CInputHandshake::CInputHandshake() { CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG; // pkPacketInfo->SetSequence(HEADER_CG_PONG, false); m_pMainPacketInfo = m_pPacketInfo; BindPacketInfo(pkPacketInfo); } That's it for the input.cpp, let's open the file desc.cpp: #include "sequence.h" Add a comment to the include. Search and comment the code: m_iCurrentSequence Search and comment the code: m_seq_vector.clear(); Add a comment here too Search again & comment the code: m_seq_vector.clear(); Search: BYTE DESC::GetSequence() { return gc_abSequence[m_iCurrentSequence]; } void DESC::SetNextSequence() { if (++m_iCurrentSequence == SEQUENCE_MAX_NUM) m_iCurrentSequence = 0; } Comment all. Look for: void DESC::push_seq(BYTE hdr, BYTE seq) { if (m_seq_vector.size()>=20) { m_seq_vector.erase(m_seq_vector.begin()); } seq_t info = { hdr, seq }; m_seq_vector.push_back(info); } Comment also the whole function. Let's open the desc.h for the statement. Look for: // sequence 버그 찾기용 데이타 struct seq_t { BYTE hdr; BYTE seq; }; typedef std::vector<seq_t> seq_vector_t; // sequence 버그 찾기용 데이타 Comment on everything. Look for: BYTE GetSequence(); void SetNextSequence(); Comment on the 2 functions. Look for: int m_iCurrentSequence; Comment on the function. Look for: public: seq_vector_t m_seq_vector; void push_seq (BYTE hdr, BYTE seq); Comment everything. Let's open the packet_info.cpp and look for: void CPacketInfo::Set(int header, int iSize, const char * c_pszName, bool bSeq) { if (m_pPacketMap.find(header) != m_pPacketMap.end()) return; TPacketElement * element = M2_NEW TPacketElement; element->iSize = iSize; element->stName.assign(c_pszName); element->iCalled = 0; element->dwLoad = 0; element->bSequencePacket = bSeq; if (element->bSequencePacket) element->iSize += sizeof(BYTE); m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element)); } Edit by: void CPacketInfo::Set(int header, int iSize, const char * c_pszName) { if (m_pPacketMap.find(header) != m_pPacketMap.end()) return; TPacketElement * element = M2_NEW TPacketElement; element->iSize = iSize; element->stName.assign(c_pszName); element->iCalled = 0; element->dwLoad = 0; /* element->bSequencePacket = bSeq; if (element->bSequencePacket) element->iSize += sizeof(BYTE); */ m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element)); } Search: bool CPacketInfo::IsSequence(int header) { TPacketElement * pkElement = GetElement(header); return pkElement ? pkElement->bSequencePacket : false; } void CPacketInfo::SetSequence(int header, bool bSeq) { TPacketElement * pkElem = GetElement(header); if (pkElem) { if (bSeq) { if (!pkElem->bSequencePacket) pkElem->iSize++; } else { if (pkElem->bSequencePacket) pkElem->iSize--; } pkElem->bSequencePacket = bSeq; } } Comment the whole function. Now, we will modify all the packages of the CPacketInfoCG :: CPacketInfoCG () function. Search: Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false); Edit by: Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload"); Do this for any header with a true or false. You should have something like this: Let's open the packet_info.h and look for: typedef struct SPacketElement { int iSize; std::string stName; int iCalled; DWORD dwLoad; bool bSequencePacket; } TPacketElement; Edit by: typedef struct SPacketElement { int iSize; std::string stName; int iCalled; DWORD dwLoad; //bool bSequencePacket; } TPacketElement; Search: void Set(int header, int size, const char * c_pszName, bool bSeq=false); Edit by: void Set(int header, int size, const char * c_pszName); Search and comment the code: bool IsSequence(int header); void SetSequence(int header, bool bSeq); To conclude the tutorial, open input udp.cpp and search for: Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest", false); Edit by: Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest"); Finally, remove the 2 sequence files from your source and do not forget to remove them from the makefile. 2) CLIENT PART I will not do any tutorial since this file is never modified so you can take mine (I made one for you as I have disabled the encryption of the packets on my side): Link: Click-here ! Source: Madara, please quote the source if you wish to share this tutorial elsewhere. Sorry for my english, i use google translate, if someone can edit my post for my mistakes
  16. Navicat Monitor applies agentless architecture to monitor your MySQL, MariaDB and Percona servers, and collect metrics at regular intervals. It collects process metrics such as CPU load, RAM usage, and a variety of other resources over SSH/SNMP. Navicat Monitor can be installed on any local computer or virtual machine and does not require any software installation on the servers being monitored. Navicat Monitor includes a rich set of real-time and historical graphs that allow you to drill down into server statistic details. It gives you a detailed view of each server load and performance regarding its availability, disk usage, network I/O, table locks and more, which allows you to easily track the deviations and traffic among servers, as well as examine possible solutions and adjust your server settings. Set UP:
  17. Hello M2tec User, My HowTo about MariaDB ( MariaDB vs mysql-server56 ) HowTo : MariaDB is drop-in replacement of MySQL. To install MariaDB, run: # pkg install mariadb103-server Next, copy MariaDB configuration file from directory ‘/usr/local/share/mysql/’ to ‘/usr/local/etc/’ as shown below. # cp /usr/local/share/mysql/my-medium.cnf /usr/local/etc/my.cnf Then, enable and start MariaDB service using commands: # sysrc mysql_enable=yes # service mysql-server start Setup MariaDB root user password As you probably know, MariaDB root user has empty, which is not recommended, at the time of installation. So to secure MariaDB root user, it is mandatory to setup a strong password for the root user. To do so, run: # mysql_secure_installation When prompt “Enter current password for root”, just press ENTER key and set the password twice. Then simply press Y to accept the default values. Thanks
  18. A collision or crash is an event in which two or more bodies exert forces on each other for a relatively short time. Although the most common colloquial use of the word "collision" refers to incidents in which two or more objects collide, the scientific use of the word "collision" implies nothing about the magnitude of the force. Some examples of physical interactions that scientists would consider collisions: An insect touches its antenna to the leaf of a plant. The antenna is said to collide with leaf. A cat walks delicately through the grass. Each contact that its paws make with the ground is a collision. Each brush of its fur against a blade of grass is a collision. [File: src/Client/Source/GameLib/ActorInstanceCollisionDetection.cpp] //1.) Search: #include "../eterLib/GrpMath.h" //2.) Add bellow: #include "../UserInterface/PythonBackground.h" #include "../UserInterface/Locale_inc.h" //3.) Search: BOOL CActorInstance::TestActorCollision(CActorInstance & rVictim) { //4.) Add bellow: #ifdef ENABLE_STOP_COLISSION_GLOBAL /********************************************************************* * date : 2016.02.16 * function : Stop Colission * developer : VegaS * skype : sacadatt.amazon * description : Checks if the victim is one of the examples below you can easily configure. If the victim was found success as vnum site / breed ve you could go through it no longer block. */ /************ * The first value is the minimum value and the second value is the maximum value of pet vnum (mob_proto) - change 34051 with your max vnum of pet */ int pListPet[2] = {34001, 34051}; /************ * You can add whatever you like vnum of npc or monster (mob_proto) */ int pListGlobal[] = {9001, 9002, 9003, 9004, 9005, 9006, 20011, 20091, 20092, 20093, 20094, 20095, 30000}; /************ * You can add what mapname you want for enable this stop collission global like pet / npc */ const char* strMapListGlobal[] = {"metin2_map_a1", "metin2_map_a3", "metin2_map_b1", "metin2_map_b3", "metin2_map_c1", "metin2_map_c3", "season2/metin2_map_skipia_dungeon_01", "season2/metin2_map_skipia_dungeon_02", "metin2_map_duel"}; /************ * Location name of the map where the event takes place ox */ const char* strMapEventOx = "season1/metin2_map_oxevent"; std::string stringName = CPythonBackground::Instance().GetWarpMapName(); for (int i = 0; i < _countof(strMapListGlobal); i++) { #ifdef ENABLE_STOP_COLLISION_PLAYER_OX if (strMapEventOx == stringName) // Check if u are place in map ox { if (0 <= rVictim.GetRace() && rVictim.GetRace() <= 7) // Check if the victim through which pass over a player (change 7 with 8 if u have wolfman) return FALSE; // Stop collission for player --> You can go through players now successfully without lock yourself } #endif if (strMapListGlobal[i] == stringName) // Check if you are in one of the maps listed in the global list { for (int i = 0; i < _countof(pListGlobal); i++) { if (rVictim.GetRace() == pListGlobal[i] || pListPet[0] <= rVictim.GetRace() && rVictim.GetRace() <= pListPet[1]) // Verify that the victim is npc vnum listed above, or if a pet. return FALSE; // Stop collission for global vnum like a pet or npc } } } #endif [File: src/Client/Source/UserInterface/Locale_inc.h] //1.) Search: #define ENABLE_COSTUME_SYSTEM //2.) Add bellow: #ifndef ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLLISION_PLAYER_OX #endif
  19. Es wurde nicht von mir geschrieben ich Release es nur auf diesem Forum. Open dungeon.h void JoinParty_Coords(LPPARTY pParty, long X, long Y); void Join_Coords(LPCHARACTER ch, long X, long Y); Open dungeon.cpp struct FWarpToDungeonCoords { FWarpToDungeonCoords(long lMapIndex, long X, long Y, LPDUNGEON d) : m_lMapIndex(lMapIndex), m_x(X), m_y(Y), m_pkDungeon(d) { } void operator () (LPCHARACTER ch) { ch->SaveExitLocation(); ch->WarpSet(m_x, m_y, m_lMapIndex); } long m_lMapIndex; long m_x; long m_y; LPDUNGEON m_pkDungeon; }; void CDungeon::Join_Coords(LPCHARACTER ch, long X, long Y) { if (SECTREE_MANAGER::instance().GetMap(m_lMapIndex) == NULL) { sys_err("CDungeon: SECTREE_MAP not found for #%ld", m_lMapIndex); return; } X*=100; Y*=100; FWarpToDungeonCoords(m_lMapIndex, X, Y, this) (ch); } void CDungeon::JoinParty_Coords(LPPARTY pParty, long X, long Y) { pParty->SetDungeon(this); m_map_pkParty.insert(std::make_pair(pParty,0)); if (SECTREE_MANAGER::instance().GetMap(m_lMapIndex) == NULL) { sys_err("CDungeon: SECTREE_MAP not found for #%ld", m_lMapIndex); return; } X*=100; Y*=100; FWarpToDungeonCoords f(m_lMapIndex, X, Y, this); pParty->ForEachOnlineMember(f); } Open questlua_dungeon.cpp int dungeon_join_coords(lua_State* L) { if (lua_gettop(L)<3 || !lua_isnumber(L,1) || !lua_isnumber(L, 2) || !lua_isnumber(L,3)) { sys_err("not enough argument"); return 0; } long lMapIndex = (long)lua_tonumber(L, 1); LPDUNGEON pDungeon = CDungeonManager::instance().Create(lMapIndex); if (!pDungeon) return 0; LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (ch->GetParty() && ch->GetParty()->GetLeaderPID() == ch->GetPlayerID()) pDungeon->JoinParty_Coords(ch->GetParty(), (long)lua_tonumber(L, 2), (long)lua_tonumber(L, 3)); else if (!ch->GetParty()) pDungeon->Join_Coords(ch, (long)lua_tonumber(L, 2), (long)lua_tonumber(L, 3)); return 0; } questlua_dungeon.cpp INTO RegisterDungeonFunctionTable() { "join_coords", dungeon_join_coords }, Beispiel für die Quest: d.join_coords(12, 21385, 16395)
  20. Guten Morgen, da ich aktuell das proplem hatte mit dem fehler : Clock skew detected. Your build may be incomplete dachte ich mir ich helfe euch auch mal :D hier der fixx ( voll simple ) zb: cd /pfad/zum/src/ && touch * damit ist der fehler behoben
  21. System ist getestet von dem Sender des Systems. [Hidden Content] Credit to @DarthNeno
  22. Bei diesem Beitrag handelt es sich um ein Backup aus dem alten Forum Weil im November mal jemand danach gefragt hat^^
  23. You do not need to explain it, you will do the build process with visual studio, you already have the direct dll out, inject it inode, some of your tricks are blocked. [Hidden Content]
×