also kann man wieder den boot benutzen von tytal?? ich peil nichts mehr?
tja wenn es so einfach wäre einen server zu schreiben hätt ichs schon lange gemacht, lc ist kein besonders kompliziertes spiel, ein server emu bzw. eine sandbox für den anfang müsste nicht besonders schwer sein aber trotzdem ist hier unwissenheit die größte hürde ^^Quote:
@dsfgd
Einen Emulator dafür zu Coden müsste doch normal nichtmal so schwer sein. Die Pakete werden soweit ich weiß unverschlüsselt gesendet. (Hatt glaube auch jemand mal geschrieben.)
|
|
das ganze ist ja nett, aber es ist wirklich nur ein Proxy,Quote:
Vlleicht kannst du damit irgendwas Anfangen. (Suche noch weitere Tutorials ^^)
Edit: Es ist kein Proxy Client wie es im Titel des Clients steht.
'struct LC_PAKET_HEADER{
' short SEND_RECV;
' int RANDOM_NUMBER;
' short unk1;
' short unk2;
' short SIZE; // Big Endian
' // then the encrypted Paket
' // char PAKET[LC_PAKET_HEADER.SIZE]
' // NOTE: LC_PAKET_HEADER.SIZE -> max size is 1024 - sizeof(LC_Paket_Header) // = 1012
' // NOTE2: the Paket Header is not encrypted.
'}LC_Paket_Header;
' Big Note: ALL DATA is BIG ENDIAN, not little Endian
' Every Opcode: 1 Byte = Type, 1 Byte = SubType
Public Const REQUEST_LOGIN As UShort = &H0300
'03 00
'00 02 D5 00
'66 61 6C 6F 00 = Name + 0x00
'31 32 33 34 00 = Password + 0x00
Public Const REQUEST_CHARACTER As Byte = &H04
'04 00 = CREATE_CHARACTER
'4D 61 67 65 54 65 73 74 65 72 00 = Name + 0x00
'03 = Job
'03 = HairStyle
'02 = FaceStyle
'04 01 = DELETE_CHARACTER
'00 00 00 01 = CharacterID
'04 02 = SELECT_CHARACTER
'00 00 00 01 = CharacterID
Public Const REQUEST_ACCEPT_CHAR As Byte = &H05
Public Const ERROR_OPCODES as UShort = &H0100
'01 0A = CREATE_CHARACTER_ERROR_NAME_IS_IN_USE
'01 1F = LOGIN_ERROR_INVALID_PASSWORD
'01 20 = LOGIN_ERROR_ACCOUNT_IS_ONLINE
'01 2B = LOGIN_ERROR_24_HOURS_BANNED
'01 D5 = ???
Public Const LOGIN_SUCCESS As UShort = &H2200
'22 00
'00 00 01 00
'00 00 01 00
'00 00 01 00
'00 00 01 00
'00 00 01 00
'00 00 01 00
'00 00 01 00 00 07 CF
'31 39 32 2E 31 36 38 2E 35 36 2E 31 30 31 00 = Server IP + 0x00
'00 00 10 0E
Public Const CREATE_CHARACTER_SUCCESSFULL As UShort = &H0200
Public Const ACCOUNT_VERIFIED As UShort = &H0201
'02 01
'00 00 00 00 = ??? (00 = OK?, 01 = Failure?)
Public Const REQUEST_LOAD_CHARS1 As UShort = &H0202
'02 02
'00 00 00 01 = Character ID
'46 61 6C 6F 00 = Character Name + 0x00
'02 = Job (00 = Titan, 01 = Ritter, 02 = Heiler, 03 = Mage, 04 = Schurke, 05 = Beschwörer, 06 = Nightshadow)
'01 = HairStyle
'01 = FaceStyle
'00 = Unknown Third Style Option?
'50 = Level
'00 00 00 00 00 00 02 E0 = EXP
'00 11 9B 24 9D 00 00 00 = Max EXP
'1C 78 83 8A = Stats
'0F 23 = HP
'0F 23 = Max HP
'0D AD = MP
'0D AD = Max MP
'00 00 00 1B = Equip Armor
'00 00 02 CE = Equip Weapon
'00 00 00 3E = Equip Pants
'FF FF FF FF = Equip Shield
'00 00 00 42 = Equip Gloves
'00 00 00 45 = Equip Boots
' Notes: HP/MP will be 4 Byte and Helm/Wings will be send in later clients
Public Const REQUEST_LOAD_CHARS2 As UShort = &H0203
Genau daran hab ich schon lange gedacht nur leider ist bis jetzt nicht ein Emu drausen für LastChaosQuote:
man kann ohne probleme
- neue Items (hauptsächlich waffen/rüssi, da die scripts für andere fehlen)
- neue NPC's + drops
- neue Maps
hinzufügen, aber es wird nie so funktionieren wie auf dem aktuellen clienten, der alte client ist für sowas nie ausgelegt gewesen, es würde jahre dauern alle funktionen in assembler nachzubauen... es wäre einfacher einen emu zu schreiben (for allem könnte man dann die bugs des echten servers beseitigen XD)
die maps bringen gar nichts, last chaos besitzt nur eine theoretische Z achse, diese Maps sind HeightMaps, d.h. sie sagen nur wo kollisionen sind und wo bestimmte Zonen (NonPVP) anfangen, neue Maps zum clienten hinzuzufügen ist schwieriger.
ps: man kann die heightmaps aus den aktuellen Mapsfiles extrahieren und so alle bekommen, ich werd dazu aber kein tut machen, da man sie noch "konvertieren" muss damit sie im format des servers sind.
ich hab mal da was für euch ^^, ich habs soweit so gut geschafft über den Login Bildschirm hinauszukommen XDQuote:
Genau daran hab ich schon lange gedacht nur leider ist bis jetzt nicht ein Emu drausen für LastChaos
Aion ist kein Gutes beispiel, eigentlich kann man LastChaos mit keinem einzigen anderen Spiel vergleichen, weil es so simpel gecoded ist sag ich mal,Quote:
Nur ich bin am anfang also ungeeignet ich hab zwar Zeit aber null Plan wie man sowas von Anfang baut files nachfügen das geht ja Aion z.B ist das schon sehr weit in Emus
daher weiß es nicht könnte man da nichts über Java und so machen ?
weil das der Server zu alt ist hab ich mir auch schon gedacht und man wirklich besser ein Neuen aufsätzt so in der Form des Aion weil bei Aion
ist im Prinzip ja ein ding, sag ich mal so einfach was mit sich selber läuft.
Wie gesagt bin am Anfang mit dieser Geschichte des Server betreiben falls falsch Aussagen bitte nicht auf die Goldwaage legen.
1. ConnectorQuote:
Help me?
[Only registered and activated users can see links. Click Here To Register...]
int __cdecl sub_1045ACB0(int a1, int a2)
{
unsigned int v2; // edx@1
int v3; // ecx@1
int v4; // esi@1
int v5; // ecx@1
int v6; // edx@1
int v7; // eax@1
int v8; // ecx@1
int v9; // edx@1
int v10; // eax@1
int v11; // ecx@1
int v12; // eax@1
int v13; // edx@1
int v14; // esi@1
unsigned int v15; // ecx@1
int v16; // ecx@1
int v17; // eax@1
unsigned int v18; // ecx@1
int v19; // edx@1
int v20; // ebx@2
int v21; // eax@2
int v22; // eax@2
int result; // eax@3
int v25; // eax@3
int v26; // ecx@3
int v27; // eax@3
int v28; // esi@3
unsigned int v29; // ecx@3
unsigned int v30; // edx@3
int v31; // edx@3
int v32; // eax@3
int v33; // ecx@3
int v34; // edx@3
int v35; // eax@3
int v36; // ecx@3
int v37; // edx@3
int v38; // ecx@3
int v39; // eax@3
int v40; // edx@3
int v41; // esi@3
signed int v42; // [sp+10h] [bp-4h]@1
v5 = *(_DWORD *)(a1 + 4) & 0xF0F0F0F ^ (*(_DWORD *)a1 >> 4) & 0xF0F0F0F;
v6 = v5 ^ *(_DWORD *)(a1 + 4);
v42 = 8;
v7 = 16 * v5 ^ *(_DWORD *)a1;
v8 = (unsigned __int16)v6 ^ ((unsigned int)v7 >> 16);
v9 = v8 ^ v6;
v10 = (v8 << 16) ^ v7;
v11 = v10 & 0x33333333 ^ ((unsigned int)v9 >> 2) & 0x33333333;
v12 = v11 ^ v10;
v13 = 4 * v11 ^ v9;
v14 = v12;
v15 = (unsigned int)v13 >> 8;
v16 = v14 & 0xFF00FF ^ v15 & 0xFF00FF;
v4 = a2;
v17 = v16 ^ v12;
v18 = 2 * ((v16 << 8) ^ v13) | (((v16 << 8) ^ (unsigned int)v13) >> 31);
v19 = (v17 ^ v18) & 0xAAAAAAAA;
v3 = v19 ^ v18;
v2 = 2 * (v19 ^ v17) | ((v19 ^ (unsigned int)v17) >> 31);
do
{
v20 = *(_DWORD *)v4;
v21 = *(_DWORD *)v4 ^ (((unsigned int)v3 >> 4) | (v3 << 28));
v4 += 16;
v2 ^= dword_105E1048[v21 & 0x3F] | dword_105E0E48[((v20 ^ (((unsigned int)v3 >> 4) | (v3 << 28))) >> 8) & 0x3F] | dword_105E0C48[((unsigned int)v21 >> 16) & 0x3F] | dword_105E0A48[((unsigned int)v21 >> 24) & 0x3F] | dword_105E1148[(v3 ^ *(_DWORD *)(v4 - 12)) & 0x3F] | dword_105E0F48[(((unsigned int)v3 ^ *(_DWORD *)(v4 - 12)) >> 8) & 0x3F] | dword_105E0D48[(((unsigned int)v3 ^ *(_DWORD *)(v4 - 12)) >> 16) & 0x3F] | dword_105E0B48[(((unsigned int)v3 ^ *(_DWORD *)(v4 - 12)) >> 24) & 0x3F];
v22 = *(_DWORD *)(v4 - 8) ^ ((v2 >> 4) | (v2 << 28));
v3 ^= dword_105E1048[v22 & 0x3F] | dword_105E0E48[((*(_DWORD *)(v4 - 8) ^ ((v2 >> 4) | (v2 << 28))) >> 8) & 0x3F] | dword_105E0C48[((unsigned int)v22 >> 16) & 0x3F] | dword_105E0A48[((*(_DWORD *)(v4 - 8) ^ ((v2 >> 4) | (v2 << 28))) >> 24) & 0x3F] | dword_105E1148[(v2 ^ *(_DWORD *)(v4 - 4)) & 0x3F] | dword_105E0F48[((v2 ^ *(_DWORD *)(v4 - 4)) >> 8) & 0x3F] | dword_105E0D48[((v2 ^ *(_DWORD *)(v4 - 4)) >> 16) & 0x3F] | dword_105E0B48[((v2 ^ *(_DWORD *)(v4 - 4)) >> 24) & 0x3F];
}
while ( v42-- != 1 );
v25 = ((unsigned int)v3 >> 1) | (v3 << 31);
v26 = (v2 ^ (((unsigned int)v3 >> 1) | (v3 << 31))) & 0xAAAAAAAA;
v27 = v26 ^ v25;
v28 = v27;
v29 = ((v26 ^ v2) >> 1) | ((v26 ^ v2) << 31);
v30 = v29 >> 8;
v31 = v28 & 0xFF00FF ^ v30 & 0xFF00FF;
v32 = v31 ^ v27;
v33 = (v31 << 8) ^ v29;
v34 = v32 & 0x33333333 ^ ((unsigned int)v33 >> 2) & 0x33333333;
v35 = v34 ^ v32;
v36 = 4 * v34 ^ v33;
v37 = (unsigned __int16)v36 ^ ((unsigned int)v35 >> 16);
v38 = v37 ^ v36;
v39 = (v37 << 16) ^ v35;
v40 = v38 & 0xF0F0F0F ^ ((unsigned int)v39 >> 4) & 0xF0F0F0F;
v41 = v39 ^ 16 * (v38 & 0xF0F0F0F ^ ((unsigned int)v39 >> 4) & 0xF0F0F0F);
result = a1;
*(_DWORD *)a1 = v41;
*(_DWORD *)(a1 + 4) = v38 ^ v40;
return result;
}