Guide to Habbo Hotel emulators
A couple of rules for this thread - If you don't have anything to contribute that goes towards the development of Habbo Hotel emulators, then don't post.
- When
posting packets try give a decent description and if your explaining
what a packet does and showing packetlogs then please replace the chars
with a alpha-numeric value such as Chr(1) because it will end up showing
on the forum just a square most of the time.
- When
posting packets and/or logs of them try and include the client version
for example if it's V13, V20, V27 and so on, just so in future reference
when a member finds packets a V13 packet might be different from a V20
packet.
- When posting a decent sized list of packets or just code in general then please [CODE][/CODE] the list.
- Obey the normal Habbo Hotel section rules and also the forum rules
Useless posting will get you an infraction in this thread.
Thanks Habbo Hotel modding team.
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
Section below has been written by Nillus.
The habbo protocol consists of messages.
Client>server messages:
These messages have a 'header', which is just their ID encoded in
Base64, so '
[email protected]' (pet stats btw) isn't just some random thing, no, decode
it with a Habbo base64 encoder & you'll see that it's the message
128. Encode it & it will become '
[email protected]' again.
It's easier to 'recognize' the messages by their recognized header than by their ID. (atleast it is for me)
Server>client messages
Here we still have the encoded Base64 IDs, but now about the content of server>client messages;:
The content which is often a mixture of text and wire encoded ('VL64')
values, if there are more strings in a message than they are often
'broken' by a char2, a char13 etc.
Each message needs to have an end, so the client can, upon receiving it,
see 'hey', this is the full message, I can process it now.
In Habbo this is done by 'char1', it let's the client know that it's the
end of the packet and it doesn't have to wait for more data, it can
process the message. (That's why you could do the funniest things with
it when scripting, if you were able to inject char1 you could put a
message in your motto & end it with a char1, so the client will see
it as a real packet & process it)
When the server/client message is received a t the client/server, then
it Base64 decodes the first two chars of the message string, so they
have the message ID.
Client/server then processes the correct again for the given message and it's content.
For the Habbo server, it's unknown how it's done, since we haven't got
sourcecode, and so we can only guess. Java does not support switching on
string objects (which is rather innefficent since it is, next to
stupid, much slower than switching on numbers), so they had to come up
with something else.
I don't think Sulake's server works with a switch statement to select
the correct action. (like it has been on all retro servers until Joeh's
Thor. Thor works with 'reactor' classes hooked to the connection, each
'reactor' contains 'various' listeners for certain messages, the server
searches through all hooked 'reactors' and tries to invoke the correct
method, this is pretty efficient, saves alot of data pushing etc &
so it's done in Woodpecker too now)
As for the Habbo client, we kinda how how it processes messages, since
we can decompile it and see cast names and the handlers etc.
I posted this a while back;
Originally Posted by
:
This is from Matt of SOM, it's a list of all the handlers inside the classes of the Habbo client. (V26 I guess?)
This is what is triggered in the client by server messages.
To understand it:
The number before the handler is the message ID, but you guys are more
familar with headers, which is the message ID encoded in Base64, so for
the first three ones:
0 = "@@"
1 = "@A"
2 = "@B"
And a final test:
312: [["One Way Door Manager", #changeStatus]]
312 in Base64: 'Dx', which is the ofcourse the 'header' of the message of entering a onewaydoor.
See how it works?
Code:
0: [[#login_handler, #handleHello]]
1: [[#login_handler, #handleSecretKey]]
2: [[#login_handler, #handleRights]]
5: [[#login_handler, #handleUserObj]]
35: [[#login_handler, #handleUserBanned]]
50: [[#login_handler, #handlePing]]
52: [[#login_handler, #handleEPSnotify]]
139: [[#login_handler, #handleSystemBroadcast]]
141: [[#login_handler, #handleCheckSum]]
161: [[#login_handler, #handleModAlert]]
229: [[#login_handler, #handleAvailableBadges]]
257: [[#login_handler, #handleSessionParameters]]
277: [[#login_handler, #handleCryptoParameters]]
278: [[#login_handler, #handleEndCrypto]]
287: [[#login_handler, #handleHotelLogout]]
308: [[#login_handler, #handleSoundSetting]]
354: [[#login_handler, #handleLatencyTest]]
290: [[#openinghours_handler, #handleAvailabilityStatus]]
291: [[#openinghours_handler, #handleInfoHotelClosing]]
292: [[#openinghours_handler, #handleInfoHotelClosed]]
293: [[#openinghours_handler, #handleAvailabilityTime]]
294: [[#openinghours_handler, #handleLoginFailedHotelClosed]]
12: [[#friend_list_handler, #handleFriendListInit]]
13: [[#friend_list_handler, #handleFriendListUpdate]]
132: [[#friend_list_handler, #handleFriendRequest]]
260: [[#friend_list_handler, #handleError]]
314: [[#friend_list_handler, #handleFriendRequestList]]
315: [[#friend_list_handler, #handleFriendRequestResult]]
349: [[#friend_list_handler, #handleFollowFailed]]
363: [[#friend_list_handler, #handleMailNotification]]
364: [[#friend_list_handler, #handleMailCountNotification]]
134: [[#instant_messenger_handler, #handleIMMessage]]
135: [[#instant_messenger_handler, #handleIMInvitation]]
261: [[#instant_messenger_handler, #handleIMError]]
262: [[#instant_messenger_handler, #handleInvitationError]]
387: [[#ig_handler, #handle_directory_status]]
388: [[#ig_handler, #handle_ENTER_ARENA_FAILED]]
389: [[#ig_handler, #handle_GAME_REJOIN]]
390: [[#ig_handler, #handle_player_exited_game_arena]]
391: [[#ig_handler, #handle_level_hall_of_fame]]
392: [[#ig_handler, #handle_start_failed]]
393: [[#ig_handler, #handle_join_failed]]
394: [[#ig_handler, #handle_in_arena_queue]]
395: [[#ig_handler, #handle_stage_still_loading]]
396: [[#ig_handler, #handle_game_not_found]]
399: [[#ig_handler, #handle_game_chat]]
400: [[#ig_handler, #handle_enter_arena]]
401: [[#ig_handler, #handle_arena_entered]]
402: [[#ig_handler, #handle_load_stage]]
403: [[#ig_handler, #handle_stage_starting]]
404: [[#ig_handler, #handle_stage_running]]
405: [[#ig_handler, #handle_stage_ending]]
406: [[#ig_handler, #handle_game_ending]]
407: [[#ig_handler, #handle_game_created]]
408: [[#ig_handler, #handle_game_long_data]]
409: [[#ig_handler, #handle_create_game_info]]
410: [[#ig_handler, #handle_game_list]]
413: [[#ig_handler, #handle_user_joined_game]]
414: [[#ig_handler, #handle_user_left_game]]
415: [[#ig_handler, #handle_game_observation_started_short]]
416: [[#ig_handler, #handle_game_cancelled]]
417: [[#ig_handler, #handle_game_long_data]]
418: [[#ig_handler, #handle_game_started]]
355: [[#guide_handler, #handleInvitation]]
359: [[#guide_handler, #handleInvitationFollowFailed]]
360: [[#guide_handler, #handleInvitationCancelled]]
425: [[#guide_handler, #handleInitTutorServiceStatus]]
426: [[#guide_handler, #handleEnableTutorServiceStatus]]
163: [[#getServerDate, #handle_date]]
300: [[#soundmachine_handler, #handle_song_info]]
301: [[#soundmachine_handler, #handle_machine_sound_packages]]
302: [[#soundmachine_handler, #handle_user_sound_packages]]
332: [[#soundmachine_handler, #handle_invalid_song_name]]
322: [[#soundmachine_handler, #handle_song_list]]
323: [[#soundmachine_handler, #handle_play_list]]
324: [[#soundmachine_handler, #handle_song_missing_packages]]
325: [[#soundmachine_handler, #handle_play_list_invalid]]
326: [[#soundmachine_handler, #handle_song_list_full]]
331: [[#soundmachine_handler, #handle_new_song]]
333: [[#soundmachine_handler, #handle_user_song_disks]]
334: [[#soundmachine_handler, #handle_jukebox_disks]]
335: [[#soundmachine_handler, #handle_jukebox_song_added]]
336: [[#soundmachine_handler, #handle_song_locked]]
337: [[#soundmachine_handler, #handle_jukebox_playlist_full]]
338: [[#soundmachine_handler, #handle_invalid_song_length]]
339: [[#soundmachine_handler, #handle_song_saved]]
365: [[#roomdimmer_handler, #handleDimmerPresets]]]
148: [[#hobba_handler, #handle_cryforhelp]]
149: [[#hobba_handler, #handle_picked_cry]]
273: [[#hobba_handler, #handle_delete_cry]]
274: [[#hobba_handler, #handle_cry_reply]]
299: [[#error_report_handler, #handle_error_report]]
59: [[#roomkiosk_handler, #handle_flatcreated]]
33: [[#roomkiosk_handler, #handle_error]
[#room_handler, #handle_error]
[#navigator_handler, #handle_error]
[#login_handler, #handleErr]]
353: [[#roomkiosk_handler, #handle_webShortcut]]
319: [[#dialogs_handler, #handle_get_pending_response]]
320: [[#dialogs_handler, #handle_pending_CFHs_deleted]]
321: [[#dialogs_handler, #handle_cfh_sending_response]]
24: [["Chat Manager", #handle_chat]]
25: [["Chat Manager", #handle_chat]]
26: [["Chat Manager", #handle_chat]]
312: [["One Way Door Manager", #changeStatus]]
-1: [[#room_handler, #handle_disconnect]
[#login_handler, #handleDisconnect]]
18: [[#room_handler, #handle_clc]]
19: [[#room_handler, #handle_opc_ok]]
28: [[#room_handler, #handle_users]]
29: [[#room_handler, #handle_logout]]
30: [[#room_handler, #handle_OBJECTS]]
31: [[#room_handler, #handle_heightmap]]
32: [[#room_handler, #handle_activeobjects]]
34: [[#room_handler, #handle_status]]
41: [[#room_handler, #handle_flat_letin]]
45: [[#room_handler, #handle_items]]
42: [[#room_handler, #handle_room_rights]]
43: [[#room_handler, #handle_room_rights]]
46: [[#room_handler, #handle_flatproperty]]
47: [[#room_handler, #handle_room_rights]]
48: [[#room_handler, #handle_idata]]
62: [[#room_handler, #handle_doorflat]]
63: [[#room_handler, #handle_doordeleted]]
64: [[#room_handler, #handle_doordeleted]]
69: [[#room_handler, #handle_room_ready]]
70: [[#room_handler, #handle_youaremod]]
71: [[#room_handler, #handle_showprogram]]
76: [[#room_handler, #handle_no_user_for_gift]]
83: [[#room_handler, #handle_items]]
84: [[#room_handler, #handle_removeitem]
[#buffer_handler, #handle_removeitem]]
85: [[#room_handler, #handle_updateitem]
[#buffer_handler, #handle_updateitem]]
88: [[#room_handler, #handle_stuffdataupdate]
[#buffer_handler, #handle_stuffdataupdate]]
89: [[#room_handler, #handle_door_out]]
90: [[#room_handler, #handle_dice_value]]
91: [[#room_handler, #handle_doorbell_ringing]]
92: [[#room_handler, #handle_door_in]]
93: [[#room_handler, #handle_activeobject_add]]
94: [[#room_handler, #handle_activeobject_remove]
[#buffer_handler, #handle_activeobject_remove]]
95: [[#room_handler, #handle_activeobject_update]
[#buffer_handler, #handle_activeobject_update]]
98: [[#room_handler, #handle_stripinfo]]
99: [[#room_handler, #handle_removestripitem]]
101: [[#room_handler, #handle_stripupdated]]
102: [[#room_handler, #handle_youarenotallowed]]
103: [[#room_handler, #handle_othernotallowed]]
105: [[#room_handler, #handle_trade_completed]]
108: [[#room_handler, #handle_trade_items]]
109: [[#room_handler, #handle_trade_accept]]
110: [[#room_handler, #handle_trade_close]]
112: [[#room_handler, #handle_trade_completed]]
129: [[#room_handler, #handle_presentopen]]
131: [[#room_handler, #handle_flatnotallowedtoenter]]
140: [[#room_handler, #handle_stripinfo]]
208: [[#room_handler, #handle_roomad]]
210: [[#room_handler, #handle_petstat]]
219: [[#room_handler, #handle_heightmapupdate]]
228: [[#room_handler, #handle_userbadge]]
230: [[#room_handler, #handle_slideobjectbundle]]
258: [[#room_handler, #handle_interstitialdata]]
259: [[#room_handler, #handle_roomqueuedata]]
254: [[#room_handler, #handle_youarespectator]]
283: [[#room_handler, #handle_removespecs]]
266: [[#room_handler, #handle_figure_change]]
298: [[#room_handler, #handle_spectator_amount]]
309: [[#room_handler, #handle_group_badges]]
310: [[#room_handler, #handle_group_membership_update]]
311: [[#room_handler, #handle_group_details]]
345: [[#room_handler, #handle_room_rating]]
350: [[#room_handler, #handle_user_tag_list]]
361: [[#room_handler, #handle_user_typing_status]]
362: [[#room_handler, #handle_highlight_user]]
367: [[#room_handler, #handle_roomevent_permission]]
368: [[#room_handler, #handle_roomevent_types]]
369: [[#room_handler, #handle_roomevent_list]]
370: [[#room_handler, #handle_roomevent_info]]
419: [[#room_handler, #handle_ignore_user_result]]
420: [[#room_handler, #handle_ignore_list]]
3: [[#habbo_club_handler, #handle_ok]
[#login_handler, #handleLoginOK]
[#friend_list_handler, #handleOk]]
7: [[#habbo_club_handler, #handle_scr_sinfo]]
280: [[#habbo_club_handler, #handle_gift]]
4: [[#photo_handler, #handle_film]]
16: [[#navigator_handler, #handle_flat_results]]
54: [[#navigator_handler, #handle_flatinfo]]
55: [[#navigator_handler, #handle_flat_results]]
57: [[#navigator_handler, #handle_noflatsforuser]]
58: [[#navigator_handler, #handle_noflats]]
61: [[#navigator_handler, #handle_favouriteroomresults]]
130: [[#navigator_handler, #handle_flatpassword_ok]]
220: [[#navigator_handler, #handle_navnodeinfo]]
221: [[#navigator_handler, #handle_userflatcats]]
222: [[#navigator_handler, #handle_flatcat]]
223: [[#navigator_handler, #handle_spacenodeusers]]
224: [[#navigator_handler, #handle_cantconnect]]
225: [[#navigator_handler, #handle_success]]
226: [[#navigator_handler, #handle_failure]]
227: [[#navigator_handler, #handle_parentchain]]
286: [[#navigator_handler, #handle_roomforward]]
351: [[#navigator_handler, #handle_recommended_room_list]]
6: [[#catalogue_handler, #handle_purse]]
67: [[#catalogue_handler, #handle_purchase_ok]]
65: [[#catalogue_handler, #handle_purchase_error]]
68: [[#catalogue_handler, #handle_purchase_nobalance]]
126: [[#catalogue_handler, #handle_catalogindex]]
127: [[#catalogue_handler, #handle_catalogpage]]
296: [[#catalogue_handler, #handle_purchasenotallowed]]
295: [[#dynamicdownloader_handler, #handle_furni_revisions]]
297: [[#dynamicdownloader_handler, #handle_alias_list]]
303: [[#recycler_handler, #handle_recycler_configuration]]
304: [[#recycler_handler, #handle_recycler_status]]
305: [[#recycler_handler, #handle_approve_recycling_result]]
306: [[#recycler_handler, #handle_start_recycling_result]]
307: [[#recycler_handler, #handle_confirm_recycling_result]]
316: [[#poll_handler, #handle_poll_offer]]
317: [[#poll_handler, #handle_poll_contents]]
318: [[#poll_handler, #handle_poll_error]]
352: [[#new_user_help_handler, #handleHelpItems]]
356: [[#new_user_help_handler, #handleTutorsAvailable]]
357: [[#new_user_help_handler, #handleInvitingCompleted]]
358: [[#new_user_help_handler, #handleInvitationExists]]
421: [[#new_user_help_handler, #handleInvitationSent]]
423: [[#new_user_help_handler, #handleGuideFound]]
424: [[#new_user_help_handler, #handleInviterLeftRoom]]
166: [[#statsBrokerJs, #handle_update_stats]]
The last things are about Guides etc, as you can see.
Just use my Nillus Packet Scout app & it's Base64 encoder to convert the message ID's to their encoded equivalents.
- Nillus
That's inside the Habbo client, you see that each server>client
message (for example, 'BK', 139), is for '[[#login_handler,
#handleSystemBroadcast]]', which is exactly what it does.
Then we have '@c', 35, which becomes '[[#login_handler, #handleUserBanned]]', and so on.
Etc, you know how it works now I guess.
You just have to understand that;
- Habbo protocol consists out of messages
- Message 'header' isn't just random chosen, it's the ID of the message encoded in Base64
- Messages consist of: encoded ID + content separated by char2 etc/wire
encoded values + char1 to finalize the message & tell client message
is complete
- Nothing in the message is static except the encoded ID and the char1
at the end, you can't just raw packetlog anything & paste it in your
server
This is how the 'change console mission' works in Woodpecker;
PHP Code:
/// <summary>
/// "@d" - "MESSENGER_ASSIGNPERSMSG"
/// </summary>
public void Listener36()
{
string newMotto = Request.getParameter(0);
Session.User.messengerMotto = newMotto;
Session.User.updateAppearanceDetails();
Response.Initialize(147); // "BS"
Response.appendClosedValue(newMotto);
sendResponse();
}
See,
the current message is stored in 'Request', which is a string object
with various cool handy things, I can easily get the first Base64
parameter of it etc.
The new server>client message is called Response, and by using it's 'Initialize' method, I can assign it a ID.
Then I can add values to it, here I'm using 'appendClosedValue' to
append a value + char2, but it also has 'appendWired(NUMBER)' etc.
Finally I use 'sendResponse' to convert the current 'response' to a
string object, append char1 to close it & then send it to the
client.
Then I can do 'Response.Initialize' again to start a new response, etc.
It's just more structured than the old servers, thanks to Joeh.
Hope that helped you out a bit, as a mod you could sticky it since it's some basic knowledge about the Habbo protocol?
Most people don't know more than 'Send Index, 'BKHAHAHA THIS IS A MESSAGE' & Chr(1)', lmfao.
- Nillus
From another thread - thanks to Nillus once again.
VL64 is most used in server > client packets.
What's VL64? Well, it's an encoding for numbers, it makes numbers 'understandable' for the Habbo client.
Example;
I = 1
J = 2
K = 3
PA = 4
You can see an ascending of the numbers, see? [1=2-3]
And you also see something of the alphabet in it. [I-J-K]
-1 in VL64 is M.
Okay, that looks pretty easy.
How does a 'big' number in VL64 looks like?
We'll encode 8123732.
Result: "hUuoG"
Ah yeah! Self explaining!
Not really lol.
Well, if you see the code of the encoding (can be found in JASE etc, HabboEncoding class), it's pretty logical.
But why using such cryptic things just for numbers?
At packets, Habbo likes to use alot of numbers after each other without delimiters.
Like if you want to use 10, 39, 843, and 7 after each other in a packet,
you can do 10398437, but then it's a whole different number.
There's where VL64 comes in.
Let's encode the numbers 10, 39, 843 and 7...
10: RB
39: SI
843: [RC
7: SA
"Ehm, yeh, and now? Why?"
Well, VL64 has a 'magical' part that makes it that good as it is:
If you decode a whole VL64 string, so like RBSI[RCSA, it'll return as number ONLY the first encoded number in the string!
So,
only the 10 (the first encoded number of that string) will be the
result, while you've inputted a whole string with three other VL64
numbers!
Now it'll get tricky, but I'll show you how to decode a string like that to it's original numbers.
1) Decode
RBSI[RCSA, 10 will be the result
2) Encode 10 to VL64, so it'll become
RB.
3) RB is 2 characters, R-B
4) Now we 'cut' the first number (RB = 10) from the string
RBSI[RCSA, and we know the lenght of the first part. In a .NET language for example, we can do that by this way;
STRING OBJECT.Substring(start,length).
If length isn't supplied than it will trigger an overload (a 'brother'
of a void/function) that will simply 'run to the end of the string', so
taking everything after 'start'. That's what we want, since we only want
to cut off the first part and keep the other part.
So: STRING OBJECT.Substring(2)
It'll result in;
SI[RCSA
Okay, now I can say, just repeat till you are done! =D
Keep decoding the whole string to one number, store the number somewhere
to work with it or w/e, and encode the number to a VL64 string, get
it's length (STRING OBJECT.Length property in .NET), and keep the string
after that part by using string manipulators such as .Substring.
It appears that it's hard to explain lol, code says more than thousand words! ;P
PHP Code:
// encodeVL64, returns a string
// decodeVL64, returns an integer
string SomeInput = "PAJIKPASASF";
while(SomeInput != "") // Keep looping this loop till the string is empty (so, completed with decoding)
{
int currentNumber = decodeVL64(SomeInput);
// Do something with current number, write it in database or something, just where you need the number for
int currentNumberLength = encodeVL64(currentNumber).ToString().Length; // Encode the number to it's VL64 equivalent to see what it would be if you only encoded that number to VL64, and get it's length
someInput = someInput.Substring(currentNumberLength); // Only keep the part of SomeInput after the string
} // Proceed to next cycle of the loop (so, decode the next number)
That's
how you can use alot of numbers after each other, while the numbers
stay on their own && this is what Habbo wants to keep their
packets small.
I hope you have understood something of it.
Anyway, that's what the VL64 analyzer in Nillus Packet Scout does, and tbh, it helps me alot at finding packet structures.
I'll show how it can decode a BattleBall packet for you, which gives you alot more 'understanding' of how it works.
Full packet + header:
CtIQAJPCSAIJPCHJHJXKDX]BIIJQAPCRE
Okay, Ct is the header, but it looks like a load of crap.
Nope, it are just numbers!
Let's shove the part after the header ("Ct") in my app and hit the button...
Result:
Originally Posted by :
Result of this VL64 scout session was:
# I = 1
# QA = 5
# J = 2
# PC = 12
# SA = 7
# I = 1
# J = 2
# PC = 12
# H = 0
# J = 2
# H = 0
# J = 2
# XKD = 1068
# X]B = 628
# I = 1
# I = 1
# J = 2
# QA = 5
# PC = 12
# RE = 22
Processed input string summary: I-QA-J-PC-SA-I-J-PC-H-J-H-J-XKD-X]B-I-I-J-QA-PC-RE
Woo, numbers!
There you can do something with, can't you?
& That's where it comes handy while coding.
How it works?
It just runs that loop till the string is empty, and outputting the result after decoding done.
A good example of where it's used is BattleBall/SnowStorm and the
Recycler/Ecotron, alot of numbers after each other as tidy as possible.
SCREENSHOT:
Attachment is fixed version of NPS V2 and without the annoying lolbeeps
Open Source Projects
General overview about this open source post
If you have any open source projects to contribute then feel free to
send any of the mods a PM with the relevant information about the
project (see below), please use a reasonable host that is 'trusted' for
example if you come back in a month the link will still be there. If
your source is on the list and you don't want it to be then send any of
the staff of the Habbo Hotel section (green guys) or a senior moderator
(the red guys) a PM and we will remove it from the list until you want
it released (if ever).
Emulators that are open source Project Duck Code:
Project Name: Project Duck
Project Creator(s): Nillus
Programming language: C#.NET
Client: V9
Thread (if any): N/A
Download: http://www.megaupload.com/?d=2O9AG2QE
Woodpecker I (1)
Code:
Project Name: Woodpecker I (1)
Project Creator(s): Nillus
Programming language: C#.NET
Client: V9
Thread (if any): N/A
Download: http://www.megaupload.com/?d=HH9PIQZB
Woodpecker II (2)
Code:
Project Name: Woodpecker II (2)
Project Creator(s): Nillus
Programming language: C#.NET
Client: V9
Thread (if any): N/A
Download: http://www.megaupload.com/?d=5X8N7TCS
Holograph Emulator (original)
Code:
Project Name: Holograph Emulator
Project Creator(s): Nillus
Programming language: C#.NET
Client: Up to V22
Thread (if any): http://forum.ragezone.com/f331/dev-open-source-from-scratch-holograph-emulator-dev-342349/
Download: http://www.assembla.com/flows/flow/holograph *Utilises SVN
Holograph Emulator (Vista4Life version)
Code:
Project Name: Holograph Emulator
Project Creator(s): Nillus - Vista4Life & DEV team
Programming language: C#.NET
Client: V24/35/26 *need to recheck on this since there's 3 different versions in his post
Thread (if any): http://forum.ragezone.com/f331/dev-open-source-holograph-emulator-and-holoteam-dev-460819/
Download: http://svn2.assembla.com/svn/holoemu/ *Utilises SVN
Project Cold Coffee Code:
Project Name: Project Cold Coffee
Project Creator(s): Jeax
Programming language: C#.NET
Client: V15 - V17 *need to recheck this as I was taking a wild guess.
Thread (if any): http://forum.ragezone.com/f21/dev-jeaxs-server-project-cold-coffee-281067/?highlight=Cold+Coffee
Download: http://forum.ragezone.com/attachment.php?attachmentid=45372&d=1191428961 *Utilises SVN
Project Thor Code:
Project Name: Project Thor
Project Creator(s): Adus/Joeh
Programming language: C++
Client: V9.
Thread (if any): http://forum.ragezone.com/f353/rel-server-project-thor-v9-c-mssql-from-scratch-441113/
Download: http://code.bytenibble.co.uk/ *Utilises SVN
Miscellaneous sources that aid Habbo Hotel emulators N++ (packetlogger)
Code:
Project Name: N++
Project Creator(s): Nillus & NGangsta
Programming language: VB.NET
Genre: Packetlogger
Thread (if any): http://forum.ragezone.com/f353/rel-source-vb-net-packetlogger-n-rel-367855/
Download: http://www.megaupload.com/?d=SQ64G2HI
I started on a java version of VL64 Encoding :P
Just to see how well i can do, i think nillus can point most things out
PHP Code:
public static int[] clientsocketReq = {
58, 82, 70, 94, 56, 80, 68, 92, 50, 74, 62, 86, 52, 76, 64, 88, 54, 60,
66, 72, 78, 84, 90, 96, 0
};
public static int[] send = {
34, 46, 40, 52, 33, 45, 39, 51, 30, 42, 36, 48, 31, 43, 37, 49, 64, 70,
76, 82, 88, 94, 100, 106, 0
};
public static int[] receive = {
18, 26, 22, 30, 17, 25, 21, 29, 15, 23, 19, 27, 16, 24, 20, 28, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 5.5, 13, 0, 7.5, 9.5, 21, 11.5, 25, 13.5, 29, 30, 31, 16.5, 35, 37,
19.5, 41, 45, 43, 22.5, 48, 24.5, 30, 25.5, 53, 55.5, 28.5, 59, 30, 60,
30, 61, 31.5, 65, 66, 67, 68, 35.5, 70, 35.5, 35, 35, 35, 68, 36, 73, 74,
37.5, 76, 76, 78, 40, 83, 84, 42.5, 89, 90, 180, 92, 97, 100
};
public static int[] misc = {
0, 1, 3, 4, 5, 7, 9, 11, 13, 15, 17, 19, 20, 21, 23, 25, 27, 29, 31, 32,
33, 35, 37, 39, 40, 41, 43, 45, 47, 49, 50, 50, 50, 51, 53, 55, 56, 57,
58, 59, 60, 60, 60, 60, 60, 61, 62, 63, 64, 65, 66, 66, 68, 70, 73, 74,
75, 79, 80, 80, 82, 87, 90, 0, 2, 0, 0, 4, 0, 6, 0, 8, 0, 9, 0, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 15,
0, 13, 0, 0, 14, 25, 2, 19, 19, 0, 15, 0, 0, 0, 0, 16, 0, 0, 20, 20, 20,
0, 17, 0, 0, 18, 0, 0, 0, 19, 0, 0, 20, 0, 0, 0, 0, 0, 0
};
That's how a client would be handled via java client ( run.cmd ) ( client configs )
Come to think of it, you'll find those perfect socket connections for basically, well... any habbo version
PHP Code:
public void switchclient(64E, int i) {
switch(i) {
/*forall*/
case 0:
/*breaking*/
int[] off = {5, 13, 3, 4, 11, 12, 19, 20};
/*locating*/
Off(p, off);
break;
case 1:
int[] off2 = {6, 14, 3, 4, 11, 12, 19, 20};
Off(p, off2);
break;
case 2:
int[] off3 = {7, 15, 3, 4, 11, 12, 19, 20};
Off(p, off3);
break;
case 3:
int[] off4 = {0, 1, 2, 5, 13, 6, 14, 7, 15, 4, 11, 12, 19, 20};
Off(p, off4);
break;
case 4:
int[] off5 = {0, 1, 2, 5, 13, 6, 14, 7, 15, 3, 11, 12, 19, 20};
Off(p, off5);
break;
case 5:
int[] off6 = {0, 13, 3, 4, 11, 12, 19, 20};
Off(p, off6);
break;
case 6:
int[] off7 = {1, 14, 3, 4, 11, 12, 19, 20};
Off(p, off7);
break;
case 7:
int[] off8 = {2, 15, 3, 4, 11, 12, 19, 20};
Off(p, off8);
break;
case 8:
int[] off9 = {9};
Off(p, off9);
break;
case 9:
int[] off10 = {8};
Off(p, off10);
break;
case 11:
int[] off11 = {5, 13, 6, 14, 7, 15, 4, 3, 12, 19, 20};
Off(p, off11);
break;
case 12:
int[] off12 = {5, 13, 6, 14, 7, 15, 3, 11, 4, 19, 20};
Off(p, off12);
break;
case 13:
int[] off13 = {5, 0, 3, 4, 11, 12, 19, 20};
Off(p, off13);
break;
case 14:
int[] off14 = {6, 1, 3, 4, 11, 12, 19, 20};
Off(p, off14);
break;
case 15:
int[] off15 = {7, 2, 3, 4, 11, 12, 19, 20};
Off(p, off15);
break;
case 16:
int[] off16 = {17, 18, 21, 22, 23, 24};
Off(p, off16);
break;
case 17:
int[] off17 = {16, 18, 21, 22, 23, 24};
Off(p, off17);
break;
case 18:
int[] off18 = {17, 16, 21, 22, 23, 24};
Off(p, off18);
break;
case 19:
int[] off19 = {5, 13, 6, 14, 7, 15, 4, 11, 12, 3, 20};
Off(p, off19);
break;
case 20:
int[] off20 = {5, 13, 6, 14, 7, 15, 3, 11, 12, 19, 4};
Off(p, off20);
break;
case 21:
int[] off21 = {17, 18, 16, 22, 23, 24};
Off(p, off21);
break;
case 22:
int[] off22 = {17, 18, 21, 16, 23, 24};
Off(p, off22);
break;
case 23:
int[] off23 = {17, 18, 21, 22, 16, 24};
Off(p, off23);
break;
case 24:
int[] off24 = {17, 18, 21, 22, 16, 23};
Off(p, off24);
break;
case 25:
int[] off25 = {0, 1, 2, 5, 6, 7, 13, 14, 15, 26};
Off(p, off25);
break;
case 26:
int[] off26 = {0, 1, 2, 5, 6, 7, 13, 14, 15, 25};
Off(p, off26);
break;
}
}
handling
PHP Code:
public class encoding64 {
int offset = 6 * (length - x);
int offset = 21 * (length - x);
public void reset64(Player p) {
for(int i = 0; i < 21; i++) {
for (int x = 1; i< 6; i++)
{
byte val = (byte)(64 + (value >> offset & 0x3f));
stack += (char)val;
if(p.On[i]) {
p.eOn[i] = false;
p.client.setConfig(p, Config[i], 0);
}
}
p.i++ = 0;
p.1 = -1;
p.UpdateReqAll = true;
}
The final decoding for client
Tell me if i did something wrong i kinda rushed
Well, after searching for something else, I
stumbled upon a thread of Nillus, that was created from when Madison,
Jare, Mickey, Mustek etc. were moderators in this section, and in that
thread, I found something that caught my eye:
Originally Posted by :
STICKY: Packet explanation + list with description of them
Now, as there are more people getting involved in open-source
developments, this would be a fantastic idea, and Konrow also agrees.
Feel free to post your Habbo packets, but you must include a description
for them, i.e:
PHP Code:
@R - Sends the user to hotel view (clientside)
No
packet can be posted more than once, so be careful. ONLY post one
packet (e.g BK, and then hit submit) if you think it's of vital
importance, such as a Snowstorm packet and such, other than that, more
than one packet MUST be posted!
Code:
@M - Habbo Console Misson (on loading)
BK - Normal notice
@X - Say ( @XSBHammad is epic! )
@Z - Shout ( @ZSBHammad is epic! )
@Y - Whisper ( @YSBHammad is epic! )
C\ - Loads public rooms (e.g C\HKHPublic SpacesY|A[PHIPOHWelcome Lounges - Get a warm welcome!PJPTKSBISafety SpaSGRLKcafe_goldZP{Hhh_room_goldHIZAAIFansite CafeRARLKsunset_cafeXs{Hhh_room_sunsetcafeHIXVAIStar Lounge - The SugababesPUPYKstar_loungeYM|Hhh_room_starloungeHIQUIHorror DromePOPOKtheatredrome_halloween[R{Hhh_room_theater_halloweenHIQKIThe Insiders DenRHRLKtv_studio[Q{Hhh_room_tv_studio_insidersHIS_INHS Advice CentreSBRLKchillZV{Hhh_room_chill_cArmHIQQHOutside Spaces & Swimming PoolsPUY`AKSPHCafes Lounges & LobbiesQEXsAKP\HEntertainmentSER`KYtAHGamesQGPYKPQHClubs Pubs & Habbo ClubSMZHAKS[HRestaurantsPDR[KSwHHallwaysKPrK )
@v - Sends room info (Room ID, Room Owner, RoomName, Room Description) ( HHj\@KXn03xmodel_sn03x's roomn03x has entered the buildingIHIQFQF )
Dj - Spectators Bar ("Dj" + VL64(NUMBER1) + VL64(NUMBER2) = "Spectators" + NUMBER1 + "/" + NUMBER2
@c - Send Ban Alert ("@c" + REASON)
D} - Display Poll (Read below)
Code:
"D}" = Header
"ZCB" = vl64(pollID)
pollTitle
chr(2)
pollThanks
chr(2)
"KXNHII" = vl64(count(questions)) + vl64(QuestionID) + vl64(questionNo) + vl64(type)
question1
chr(2)
"KII" = vl64(count(answers)) + vl64(minAns) + vl64(maxAns)
question1Answer1
chr(2)
question1Answer2
chr(2)
question1Answer3
chr(2)
"YNHJI" = vl64(QuestionID) + vl64(questionNo) + vl64(type)
question2
chr(2)
"KII" = vl64(count(answers)) + vl64(minAns) + vl64(maxAns)
question2Answer1
chr(2)
question2Answer2
chr(2)
question2Answer3
chr(2)
"ZNHJI" = vl64(QuestionID) + vl64(questionNo) + vl64(type)
question3
chr(2)
"KII" = vl64(count(answers)) + vl64(minAns) + vl64(maxAns)
question3Answer1
chr(2)
question3Answer2
chr(2)
question3Answer3
chr(2)
Alphabeat 07:26 PM 02-11-08
Code:
AC = turn 180
A3 / As = leave room
A6 / A= / @z = error
A^ = wave
A[ = dance?
AP = hold drink
A? = transactions
A' = give rights?
G_STAT = drink to mouth?
@` = delete console message
AB = details disapper
DB = the habbo advertisement
@Y = whisper
@Z = shout
@X = talk
@c = ban
AA / BL = open hand
A~ = open catalogue
@P = own rooms
@S = return to hotel view?
Bi = update password and email
@} = add room to favourites
@m = wall items?
AX = turn tv off and on
AJ = Variable/Status of furni
@d = console mission
AO = position
AW = camera
@E = User Info. (on load)
@Q = Freinds List & Info?
[email protected] = Users Stance (on load of a room)
@v = User's Room Info. (model, Owner etc)
AE = (?) (e.g AEmodel_h [email protected]@o)
@_ = Heightmap Co-ordinates
@\ = User's Connection Info. (to Room) @^ = Furni Syntax List
@b = User's Placement on Heightmap
@a = Message
@A = Habbo Key
@B = User's Accessories (Bfuse_login.default etc)
@L = Freinds List & Info (on load)
@M = Habbo Console Misson (on load)
@G = If User is HC or Not (on load)
@w = Search For a Room
@{ = Edit room Name
C] = Public Room List
@X = Talk
@Z = Whisper
/carryd 1/ = Tea
/carryd 2/ = juice
/carryd 3/ = Carrot
/carryd 4/ = Ice-Cream
/carryd 5/ = Milk
/carryd 6/ = Blackcurrent
/carryd 7/ = Water
/carryd 8/ = Regular
/carryd 9/ = Decaff
/carryd 10/ = Latte
/carryd 11/ = Mocha
/carryd 12/ = Macchiato
/carryd 13/ = Espresso
/carryd 14/ = Filter
/carryd 15/ = Iced
/carryd 16/ = Cappuccino /carryd 17/ = Java
/carryd 18/ = Tap
/carryd 19/ = Habbo Cola
/carryd 20/ = Camera
/carryd 21/ = Hamburger
/carryd 22/ = Lime Habbo Soda
/carryd 23/ = Beetroot Habbo Soda
/carryd (>= 24)/ = BLANK</br>
Registering Packets
---------------------------------------------------------------------------------
@[email protected] ; You're Name Cipher,
@D ; Figure Cipher
@[email protected]@F ; Mission Cipher
@G ; Email Cipher
@H ; DOB Cipher
@[email protected]@[email protected] ; Password Cipher
---------------------------------------------------------------------------------
Log In Packets
---------------------------------------------------------------------------------
@a ; Incorrect Password Packet Sent If You get you're Password Wrong
@c ; Ban Packet Sent If you Try Logging On To Banned Account
@B ; Send's You're Fuse_ Rights When You Log In. Example:
@Bfuse_room_queue_defaultfuse_buy_creditsfuse_lo gindefaultfuse_trade
@E ; Sent When You Log In It Holds You're Characters Data
(example, Name, Figure, Sex, Mission, How Many Game Tickets you
have, Ect ect,)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Console Packets
---------------------------------------------------------------------------------
The Packets Below Are All to do with the Console, All Self Explanatory, I think.
BFIIi}e~ ; This Packet Is sent to the server when you receive A message, It Also
send the User's Figure (Who Sent you the Message), The Message Itself, And the Time
And Date The Message Was Sent.
@MH ; This Packet Is sent to the server When You open you're Console
[email protected] ; This Packet Is Sent to The Server When You Search Some One's Name
On the Console, Example : [email protected][^OOMyraxII hate you all, Yes you, And you
in the back, Oh and you over there, and him. MyraxIIn A
Guest Room11-07-2006 13:28:282951025504190092801511504
So Broke Down
[email protected](Hex 1)(Console ID)(Username)(Hex 1)(Console Mission)(Hex 1)(Location/Online/Offline)
(Hex 1)(Time The User Last Logged On)(His/Her Figure)(Hex 1)(Hex 1)
BS(Console Mission) ; Basically This packet Is sent when You change you're console mission
Again, Broke Down BS(consoleMission)(Hex 1)(Hex 1)
(Sent a Message Data Is Encypted, And I can't Be arsed Decypting As Yet. Sorry)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Navagator Packets
---------------------------------------------------------------------------------
c\ ; Public Room Packet (Navagator) Sent When You Click the Public Room Button On The
Navagator, It send's The Public Room's Ect ect.
(These Are Also Sent When You Log In.. But I thought It Would Fit Here)
Example :
C\HKHPublic Rooms[HAZh\IRKIWelcome LoungeQJRLKwelcome_lounge[M{Hhh_room_nlobby
IIS_INSPCC Zen GardenSBSHKchillZV{Hhh_room_chillIIPaHBattle BallSCX_UKSPHCafes
SHSMKQuHHabbo ClubRAPYKRPHLobbiesRAPYKP\HEntertainmentSGPwKPQ HDance Clubs & Pubs
PNXUAKS[HRestaurantsSAPTKQQHOutside SpacesQQ[gAKRGHCunning Fox Gamehall
RAPrKSFIHabbo KitchenKSHKhotel_kitchenXO{Hhh_room_kitchenIISw HHabbo HallwaysQAPrK
And I don't See A Need To Break that Down.. Its Self Explanotory.. I should Think :s
@w ; Search packet Sent When Searching A Room, (if A room Is Found) Example
@w1977459 lol - password x 0 25 null
Broke Down
@w(Room Id) (Name Of The Room You Searched)
- (Say's If the room Is Open/Closed/Passworded) (Hide's The Pass, If there Is One)
(How Many People In the room) (Out Of How Many Could Be In the Room) (Room Desc)
@z ; Sent If you search For a room, And No room Is found.
@P ; Own room Packet Example :
@P16541376 PIB Room Myrax open x 0 25 null
Im Not Going to break Down, As Its Basically Same As the Above
@} ; Favourite Room Packets, Load's You're Favourite Room's, When You Click Favourites
Example :
@}HHJHHHQBhau[OJedi TempleDiealotopenHRLCome here all who want to be a jedi all
info is lucastarts aproved info (no dark jedi or sith)
Basically Same As Above.. Don't Ask About room name, Or I Kill You. (Yes I do Like to Role Play)
@H ; Change Look Screen (update Habbo ID)
Sent When You Open 'Change My Habbo Look' Or What ever It say's
It Send's the clothes And the colours you're Habbo Can Pick
@MH ; Wrong Birthday Packet (I think)
I Think This Packet Is Sent When You Try to change you're Pass/Email, But get
the Birthday Wrong
---------------------------------------------------------------------------------
Room Packet's
---------------------------------------------------------------------------------
These Packets Are Sent When Entering A room/Making A room Ect Ect
@_ ; Send'S the Room's HeightMap, When You enter them Room.
AE ; Also When Entering the room, This packet send's The Room's Model Example
AEmodel_c
@v ; Send's Room's ID, Room Name, Room Owner, On Room Load Example
@vIJhpfqOMyraxmodel_cPIB RoomHHHQFQF
So Broke Down
@v(RoomID)(RoomOwner)(Hex 1)(Room Model)(Hex1)(Room Name)(Hex 1)(Hex 1)(Room FloorMap)(Hex 1)
@\i(UserID) ; Send's A User ID For you're Habbo On room Load Example
@\i:3
n:Myrax
f:2951025504190092801511504
l:4 7 0.0
c:Fuck Habbo >_>
s:m
So Broke Down
@\iId)(Hex 1)nHabboName)(Hex 1)f:You're HabboFigure)(Hex 1)lRoom Entry Point)(Hex 1)
cYou're Mission)(Hex 1)sSex Either F Or M)(hex 1)
@b(UserID) ; Move's You Habbo, With the ID Send from @\i
AS ; Sent When a Wall Item (Posters/Stikies ect) is put down Example
AS17385977 poster :w=3,3 l=53,44 l 13
Broken down
AS(ID) (Say's its a poster) (which Wall part Is On) (its location)
(If It left or right) (sprite) (Hex 1)
A] ; Sent If a floor Item Is placed on the floor, An Example of this is
A]36032589doorSAJIIJ0.0hSPWbFALSE
Broken down
A](ID)(Sprite)(location & How much space it takes up &rotation)(height)
(hex 1)(hex 1)(hex 1)(Unsure)(state Of the Object)(hex 1)(hex 1)
Oh, And After this packet is sent, An updated Heightmap Is sent. So that you can't
walk in the spot, Where the object has been placed
Speach Packets
---------------------------------------------------------------------------------
When Talking These Packets Are sent to the server, Along with you're Speach
ID, And you're Message.
@Y(SpeachID)(message) ; Whisper Packet (When Talking)
@X(SpeachID)(message) ; Speak Packet (When Talking)
@Z(SpeachID)(message) ; Shout Packet (When Talking)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Credit Packets
---------------------------------------------------------------------------------
@F ; Sent When Buying Credit's With A voucher
Example
@F35.0
Broke Down
@F(How Many Credits)(Hex 1)(Hex 1)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Habbo Club
---------------------------------------------------------------------------------
@Gclub_habbo ; Sent When You Buy Habbo Club. Along With you're new Fuse Rights, And Looks
Example :
@Bfuse_logindefaultfuse_use_club_outfitsfuse_us e_club_badgefuse_use_special_room_layouts
fuse_room_queue_clubfuse_room_queue_defaultfuse _buy_creditsfuse_use_club_dance
fuse_extended_buddylistfuse_priority_accessfuse _furni_chooserfuse_trade
[email protected][100,105,110,115,120,125,130,135,140,145,
150,155,160,165,170,175,176,177,178,180,185,190,19 5,200,205,206,207,210,215,
220,225,230,235,240,245,250,255,260,265,266,267,27 0,275,280,281,285,290,295,
300,305,500,505,510,515,520,525,530,535,540,545,55 0,555,565,570,575,580,585,
590,595,596,600,605,610,615,620,625,626,627,630,63 5,640,645,650,655,660,665,
667,669,670,675,680,685,690,695,696,700,705,710,71 5,720,725,730,735,740,800,
801,802,803,804,805,806,807,808,809,810,811,812,81 3,814,815,816,817,818,819,
820,821,822,823,824,825,826,827,828,829,830,831,83 2,833,834,835,836,837,838,
839,840,841,842,843,844,845,846,847,848,849,850,85 1,852,853,854,855,856,857,
858,859,860,861,862,863,864,865,866,867,868,869,87 0,871,872,873]@Gclub_habboSGJHJ
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Hand Packets
---------------------------------------------------------------------------------
(A] ; Packet For adding Furniture To you're Hand (example when you buy somthing)
(A]35122549throneQBQAIIH0.0HC[!JA
So, Again, Broke down
(A](furniture ID)(hex 1)(furniture Sprite)(Hex 1)(Location When The Furni Is Dropped)
(Height Off which the furni Is dropped)(Hex 1)(Hex 1)(Hex 1)(unsure)(Hex 1)(Hex 1)(unsure)(Hex 1)
BLSI ; This packet is sent when you open you're hand, Or click the >> Or << Icon's on you're hand
It sends to the server the data of the furniture in you're hand.. An Example Is
BLSI133158730I13315873poster44/SI
Broken down..
BLSI(Hex1 1)(Poster ID)(Hex 1)(Unsure)(Hex 1)(Unsure)(Hex 1)(Poster ID)(Hex 1)
(Say's If its a wall Item Or a floor Item)(Hex 1)(Sprite)(seperator (Ithink))(Hex 1)(Hex 1)
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Badge Packets
---------------------------------------------------------------------------------
There is only one packet I know for badges, And thats CdH, I'll show you how it works
When you switch you're badge on the
CdH Packet is sent, so you can see you're badge. For example If you put you're Bronze
HC Badge on the packet send would be
CdHHC1
Broken down
CdH(Badge Code)(hex 1)(Hex 1)
If you wanted to turn it off, The packet sent would be
CdH
As there is no badge to show. It turns off, Clever Eh?
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
Trading Packets
---------------------------------------------------------------------------------
Al ; This is the packet sent when you open a trade window, An example of this packet
in use is
AlMyrax false
Enemy, false
Broken Down, This is
Al(username) (Say's you Haven't accepted) (hex 1)(username Of the Chap you're trading)
(Say's He Hasn't Accepted) (hex 1)(hex 1)
Simple Stuff eh?
SI ; When Some one add's somthing to the trade window, Again the Al Packet is sent, And then
This packet is sent. An Example of this is
AlMyrax false
Enemy, false SI173859720I17385972poster32/
Broken Down. (Im not going to break down the Al Packet, As that is done above)
SI(Hex 1)(Poster ID)(Hex 1)(Unsure)(Hex 1)(Unsure)(Hex 1)(Poster ID)(Hex 1)
(Say's If its a wall Item Or a floor Item)(Hex 1)(Sprite)(seperator (Ithink))(Hex 1)(Hex 1)
Am ; This packet is sent when one of the p[eople who are trading accepts, An example of this
is
AmEnemy,/true
Broken down
Am(Username Of Person Who has accepted)(seperator)(say's He has accepted)(Hex 1)
Ao ; Tell's the server to add the trade items to you're Hand Example
AoBLSI173859720I17385972poster32/
1
Its self Explanatory And the BLSI Packet Is explained Higher Up
- from TFH3.com forums user myrax
- from http://xtro.uk.tt
CT - Gives you the Voucher Alert
AC - Yay! It's being delivered now Alert
AD - You don't have enough credits Alert
BC - No Answer alert from a doorbell request
CU - Some sort of purse error
CV - Under 11 years old message
CZ - Unacceptable email message
A& - Some trade error
A[ - Waiting doorbell message
A' - Another trade error
C_ - Whos in here Notice
Useful codes -
A` - Clothe Window in Lido
BT - Mod Tool
@i - Sends user to hotel view (serverside)
@R - Sends user to hotel view (clientside)
DS - Update e-mail window
C~� - Battle-Ball Screen
BE - Sends you a Habbo console message
@L - Deletes everyone from your list
Bg - Updates Look
AI - Buy Tickets Window
@o - Rights Anywhere (clientside)
DBO - Reloads Room
@CPO - Updates User Status
BK[text] - Normal Notice
DK[text] - Query Notice
AD[text] - Purchase Notice
BS[text] - Console Mission
B![text] - Moderator Says Notice
@amod_warn/[text] - Mod warn
CeI[badge code] - Client Badge
AGlamp setlamp 666� - Makes the Club Helsinki floor glow
BLSI-55112730S5511273camera - Client Camera
A\[Teleporter ID]/[Username]/door[number] - Nukes Teleporter
@`PR65md_limukaappiQAQAIIJ0.00,0,0H - Client Habbo Cola Machine
AS11801781 poster :w=3,7 l=-23,99 l 501 - Client Poster
@Bfuse_see_flat_ids - Displays Room ID's
@Bfuse_habbo_chooser - Habbo Chooser
@Bfuse_furni_chooser - Habbo Furni Chooser
@Bfuse_ignore_room_owner - Ignores Room Owner
@Bfuse_performance_panel - Habbo Performance
AGbus open - Opens Infobus Doors
AGbus close - Closes Infobus Doors
AGcurtains1 open - Opens Lido Curtains
AGcurtains1 close - Closes Lido Curtains
A{ Skips Lido Que
Bfhttp://www.habbohotel.co.uk/en.client.Park.0AEpark_b 15190 - Skips Infobus Que
Bfhttp://www.habbohotel.co.uk/en.client.bb_arena.7AEbb_arena_3 15202 - Skips Battle-Ball Que
- from http://xtro.uk.tt
@eH - Error?
@b0 7,7,0.0,3,3/flatctrl useradmin/wave/
@b0 7,7,0.0,3,6/flatctrl useradmin/wave/
@b0 2,9,0.0,4,4/sit 1.0/wave/
@b0 11,11,0.0,3,3/sit 1.0
@b0 7,7,0.0,3,3/flatctrl useradmin/
Fuse rights around V13 - V15 - credits to http://www.artmoney.nl.tp/
Code:
HC
fuse_use_special_room_layouts
fuse_buy_credits_fuse_login
fuse_priority_access
fuse_use_club_outfits _default
fuse_use_club_badge
fuse_trade
fuse_habbo _chooser
fuse_buy_credits
fuse_login
fuse_moderator_access
fuse_trade
fuse_habbo_chooser
MOD
fuse_housekeeping_alert
fuse_login
housekeeping_ban
fuse_use_club_outfits
fuse_moderator_access
fuse_mutehousekeeping_hobbahousekeeping_superban
fuse_remove_photoshousekeeping_hobba_hobbatools
fuse_use_special_room_layouts
fuse_chat_log
fuse_room_alerthousekeeping_megaban
fuse_any_room_controller
fuse_buy_credits
fuse_priority_accesshousekeeping_discussion
fuse_ignore_room_owner
fuse_enter_full_roomshousekeeping_extra
fuse_trade
fuse_search_users
fuse_pick_up_any_furni
fuse_banfuse_superbanhousekeeping_hobba_newbietool s
fuse_room_mutehousekeeping_kick
fuse_alertdefaultfuse_use_club_badge
fuse_receive_calls_for_help
fuse_room_kickfuse_administrator_access
fuse_furni_chooser
fuse_remove_stickieshousekeeping_hobba_supertools
fuse_enter_locked_roomshousekeeping_hobba_moderato rtools
fuse_habbo_chooser
Admin
fuse_housekeeping_campaign_user_data
fuse_george_loginhousekeeping_localization_game_co ntenthousekeeping_alerthousekeeping_campaign_manag ementhousekeeping_localization_mischousekeeping_ba nhousekeeping_localization_content
fuse_mutehousekeeping_hobba
fuse_remove_photoshousekeeping_statistics
fuse_any_room_controllerhousekeeping_localizationh ousekeeping_localization_content_editor_managerhou sekeeping_admin_rightshousekeeping_localization_co ntent_editor_admin
fuse_priority_accesshousekeeping_admin_logs
fuse_enter_full_roomshousekeeping_admin_system
fuse_bus_moderator_accesshousekeeping_status
fuse_superban
fuse_room_mute
fuse_catalog_editorhousekeeping_hobba_bustools
fuse_alertdefault
fuse_use_club_badge
fuse_receive_calls_for_helphousekeeping_localizati on_content_editor_use
fuse_room_kickhousekeeping_admin_clubhousekeeping_ campaign_mgmhousekeeping_localization_filters
fuse_remove_stickies
fuse_enter_locked_roomshousekeeping_hobba_moderato rtools
fuse_kickhousekeeping_admin_paymentshousekeeping_c ampaign_adshousekeeping_george
fuse_loginhousekeeping_admin_catalog
fuse_use_club_outfits
fuse_moderator_accesshousekeeping_superbanhousekee ping_hobba_hobbatools
fuse_use_special_room_layoutsfuse_chat_log
fuse_room_alerthousekeeping_megabanhousekeeping_ho bba_admintools
fuse_buy_creditshousekeeping_discussion
fuse_ignore_room_ownerhousekeeping_admin_user_data
fuse_tradefuse_search_usershousekeeping_campaign
fuse_pick_up_any_furni
fuse_banhousekeeping_hobba_newbietoolshousekeeping _kickhousekeeping_discussion_admin
fuse_administrator_accesshousekeeping_admin_credit shousekeeping_admin
fuse_furni_chooserhousekeeping_hobba_supertools
fuse_habbo_chooserhousekeeping_intra
B64 encoded - basically the same as the in the first post except these ones are encoded - credits to Matt of SOM
Code:
"PICK_CRYFORHELP": "@p"
"CALL_FOR_HELP": "AV"
"CHANGECALLCATEGORY": "CF"
"MESSAGETOCALLER": "CG"
"MODERATIONACTION": "CH"
"FOLLOW_CRYFORHELP": "EC"
"CREATEFLAT": "@]"
"GET_PENDING_CALLS_FOR_HELP": "Cm"
"DELETE_PENDING_CALLS_FOR_HELP": "Cn"
"CHAT": "@t"
"SHOUT": "@w"
"WHISPER": "@x"
"ENTER_ONEWAY_DOOR": "Ch"
#room_directory: "@B"
"GETDOORFLAT": "@\"
"QUIT": "@u"
"GOVIADOOR": "@v"
"TRYFLAT": "@y"
"GOTOFLAT": "@{"
"G_HMAP": "@|"
"G_USRS": "@}"
"G_OBJS": "@~"
"G_ITEMS": "@"
"G_STAT": "[email protected]"
"GETSTRIP": "AA"
"FLATPROPBYITEM": "AB"
"ADDSTRIPITEM": "AC"
"TRADE_UNACCEPT": "AD"
"TRADE_ACCEPT": "AE"
"TRADE_CLOSE": "AF"
"TRADE_OPEN": "AG"
"TRADE_ADDITEM": "AH"
"MOVESTUFF": "AI"
"SETSTUFFDATA": "AJ"
"MOVE": "AK"
"THROW_DICE": "AL"
"DICE_OFF": "AM"
"PRESENTOPEN": "AN"
"LOOKTO": "AO"
"CARRYDRINK": "AP"
"INTODOOR": "AQ"
"DOORGOIN": "AR"
"G_IDATA": "AS"
"SETITEMDATA": "AT"
"REMOVEITEM": "AU"
"CARRYITEM": "AW"
"STOP": "AX"
"USEITEM": "AY"
"PLACESTUFF": "AZ"
"DANCE": "A]"
"WAVE": "A^"
"KICKUSER": "A_"
"ASSIGNRIGHTS": "A`"
"REMOVERIGHTS": "Aa"
"LETUSERIN": "Ab"
"REMOVESTUFF": "Ac"
"GOAWAY": "As"
"GETROOMAD": "A~"
"GETPETSTAT": "[email protected]"
"SETBADGE": "B^"
"GETINTERST": "Bv"
"CONVERT_FURNI_TO_CREDITS": "Bw"
"ROOM_QUEUE_CHANGE": "CS"
"SETITEMSTATE": "CV"
"GET_SPECTATOR_AMOUNT": "CX"
"GET_GROUP_BADGES": "Cf"
"GET_GROUP_DETAILS": "Cg"
"SPIN_WHEEL_OF_FORTUNE": "Cw"
"RATEFLAT": "DE"
"GET_USER_TAGS": "DG"
"SET_RANDOM_STATE": "Dz"
"USER_START_TYPING": "D}"
"USER_CANCEL_TYPING": "D~"
"IGNOREUSER": "D"
"BANUSER": "[email protected]"
"GET_IGNORE_LIST": "EA"
"UNIGNORE_USER": "EB"
"CAN_CREATE_ROOMEVENT": "EY"
"CREATE_ROOMEVENT": "EZ"
"QUIT_ROOMEVENT": "E["
"EDIT_ROOMEVENT": "E\"
"GET_ROOMEVENT_TYPE_COUNT": "E]"
"GET_ROOMEVENTS_BY_TYPE": "E^"
"SCR_GET_USER_INFO": "@Z"
"SCR_BUY": "B~"
"SCR_GIFT_APPROVAL": "CR"
"SBUSYF": "@M"
"SUSERF": "@P"
"SRCHF": "@Q"
"GETFVRF": "@R"
"ADD_FAVORITE_ROOM": "@S"
"DEL_FAVORITE_ROOM": "@T"
"GETFLATINFO": "@U"
"DELETEFLAT": "@W"
"UPDATEFLAT": "@X"
"SETFLATINFO": "@Y"
"NAVIGATE": "BV"
"GETUSERFLATCATS": "BW"
"GETFLATCAT": "BX"
"SETFLATCAT": "BY"
"GETSPACENODEUSERS": "BZ"
"REMOVEALLRIGHTS": "B["
"GETPARENTCHAIN": "B\"
"GET_RECOMMENDED_ROOMS": "DH"
"GPRC": "Ad"
"GCIX": "Ae"
"GCAP": "Af"
"GET_FURNI_REVISIONS": "CU"
"GET_ALIAS_LIST": "CW"
"GET_FURNI_RECYCLER_CONFIGURATION": "C^"
"GET_FURNI_RECYCLER_STATUS": "C_"
"APPROVE_RECYCLED_FURNI": "C`"
"START_FURNI_RECYCLING": "Ca"
"CONFIRM_FURNI_RECYCLING": "Cb"
"POLL_START": "Cj"
"POLL_REJECT": "Ck"
"POLL_ANSWER": "Cl"
"MSG_REMOVE_ACCOUNT_HELP_TEXT": "Dy"
"MSG_GET_TUTORS_AVAILABLE": "Ec"
"MSG_INVITE_TUTORS": "Ed"
"MSG_CANCEL_TUTOR_INVITATIONS": "Eg"
"GETAVAILABLESETS": "@I"
"TRY_LOGIN": "@D"
"VERSIONCHECK": "@E"
"UNIQUEID": "@F"
"GET_INFO": "@G"
"GET_CREDITS": "@H"
"GET_PASSWORD": "@o"
"LANGCHECK": "@z"
"BTCKS": "Ai"
"GETAVAILABLEBADGES": "B]"
"GET_SESSION_PARAMETERS": "Bu"
"PONG": "CD"
"GENERATEKEY": "CJ"
"SSO": "CL"
"INIT_CRYPTO": "CN"
"SECRETKEY": "CO"
"GET_SOUND_SETTING": "Cd"
"SET_SOUND_SETTING": "Ce"
"TEST_LATENCY": "D{"
"REPORT_LATENCY": "D|"
"GET_AVAILABILITY_TIME": "CT"
"FRIENDLIST_INIT": "@L"
"FRIENDLIST_UPDATE": "@O"
"FRIENDLIST_REMOVEFRIEND": "@h"
"FRIENDLIST_ACCEPTFRIEND": "@e"
"FRIENDLIST_DECLINEFRIEND": "@f"
"FRIENDLIST_FRIENDREQUEST": "@g"
"FRIENDLIST_GETFRIENDREQUESTS": "Ci"
"FOLLOW_FRIEND": "DF"
"MESSENGER_SENDMSG": "@a"
"FRIEND_INVITE": "@b"
"IG_CHECK_DIRECTORY_STATUS": "D`"
"IG_ROOM_GAME_STATUS": "Da"
"IG_PLAY_AGAIN": "Db"
"GAME_CHAT": "Dj"
"IG_CREATE_GAME": "Dl"
"IG_GET_GAME_LIST": "Dm"
"IG_GET_CREATE_GAME_INFO": "Dn"
"IG_CHANGE_PARAMETERS": "Do"
"IG_LIST_POSSIBLE_INVITEES": "Dp"
"IG_INVITE_USER": "Dq"
"IG_KICK_USER": "Dr"
"IG_START_GAME": "Ds"
"IG_CANCEL_GAME": "Dt"
"IG_JOIN_GAME": "Du"
"IG_LEAVE_GAME": "Dv"
"IG_START_OBSERVING_GAME": "Dw"
"IG_STOP_OBSERVING_GAME": "Dx"
"IG_GET_LEVEL_HALL_OF_FAME": "Dc"
"IG_ACCEPT_INVITE_REQUEST": "Dd"
"IG_DECLINE_INVITE_REQUEST": "De"
"IG_LOAD_STAGE_READY": "Dg"
"MSG_PLAYER_INPUT": "Dh"
"IG_EXIT_GAME": "Dk"
"MSG_ACCEPT_TUTOR_INVITATION": "Ee"
"MSG_REJECT_TUTOR_INVITATION": "Ef"
"MSG_INIT_TUTORSERVICE": "Eh"
"MSG_WAIT_FOR_TUTOR_INVITATIONS": "Ej"
"MSG_CANCEL_WAIT_FOR_TUTOR_INVITATIONS": "Ek"
"GDATE": "@q"
"INSERT_SOUND_PACKAGE": "C["
"EJECT_SOUND_PACKAGE": "C\"
"GET_SONG_INFO": "C]"
"NEW_SONG": "Co"
"SAVE_SONG_NEW": "Cp"
"EDIT_SONG": "Cq"
"SAVE_SONG_EDIT": "Cr"
"BURN_SONG": "C~"
"SONG_EDIT_CLOSE": "Cv"
"UPDATE_PLAY_LIST": "Cs"
"GET_SONG_LIST": "Ct"
"GET_PLAY_LIST": "Cu"
"DELETE_SONG": "Cx"
"ADD_JUKEBOX_DISC": "C"
"REMOVE_JUKEBOX_DISC": "[email protected]"
"JUKEBOX_PLAYLIST_ADD": "DA"
"GET_JUKEBOX_DISCS": "DB"
"GET_USER_SONG_DISCS": "DC"
"RESET_JUKEBOX": "DD"
"MSG_ROOMDIMMER_GET_PRESETS": "EU"
"MSG_ROOMDIMMER_SET_PRESET": "EV"
"MSG_ROOMDIMMER_CHANGE_STATE": "EW"
"JUMPSTART": "Ag"
"SIGN": "Ah"
"JUMPPERF": "Aj"
"SPLASH_POSITION": "Ak"
"CLOSE_UIMAKOPPI": "Al"
"SWIMSUIT": "At"
Originally Posted by
Nillus:
The habbo protocol consists of messages.
Client>server messages:
These messages have a 'header', which is just their ID encoded in
Base64, so '[email protected]' (pet stats btw) isn't just some random thing, no, decode
it with a Habbo base64 encoder & you'll see that it's the message
128. Encode it & it will become '[email protected]' again.
It's easier to 'recognize' the messages by their recognized header than by their ID. (atleast it is for me)
Server>client messages
Here we still have the encoded Base64 IDs, but now about the content of server>client messages;:
The content which is often a mixture of text and wire encoded ('VL64')
values, if there are more strings in a message than they are often
'broken' by a char2, a char13 etc.
Each message needs to have an end, so the client can, upon receiving it,
see 'hey', this is the full message, I can process it now.
In Habbo this is done by 'char1', it let's the client know that it's the
end of the packet and it doesn't have to wait for more data, it can
process the message. (That's why you could do the funniest things with
it when scripting, if you were able to inject char1 you could put a
message in your motto & end it with a char1, so the client will see
it as a real packet & process it)
Just thought I would elaborate on Nillus' description of scripting,
considering its very small, Jeax taught me how scripting works /
scripting apps work, but it took me a while to understand it,
considering he explained it in the way he understood it so I figured it
out in a way I understood it, but anyways, lets take Nillus example and
change it a bit.
Ok, so say I go on habbo and I decide I want a drink. So I double click a
drink machine and eventually I get a drink for example AP12 &
Chr(1) is sent to the server. The server things ok 'AP' is a packet and
I'm supposed to grab the number after it and then wait for Chr(1) to
know the packet has ended.
So lets say I'm a script kiddy (a wanabe scripter) I'm pressing buttons
on one of those 'click here and here' scripting apps eg. HRT32 well
kids, heres how those programs work. You inject specific data such as a
BK followed by LOL aka will bring up a habbo alert that says LOL so this
is how it would work you would send to the server AP <ANYDRINKID>
& Chr(1) & BKLOL & Chr(1) you see how that worked, you sent
Chr(1) before you sent BKLOL because you wanted to end the drink packet
so the server thinks "oh that packet is finished" so then you start an
all new packet since the server thinks the packet is finished aka BKLOL
and then you finish your packet with Chr(1) and there you have it retro
scripting in a nut shell.
Now that you may / may not understand this (re-read if you don't) take
this into consideration. I always <a LOT of the time> ask kids who
think they can code or deserve my source code questions about scripting
because they have no clue how packets even work yet they wana make a
server + they don't even know the basics of coding in _any_ language
(ie. what a int is, what a sting is ect...) So my question is, how does
scripting via an AP Injection work, and what I mean is not by the Chr
Injections into the packet, why when I send it can I do things such as
pick up / delete furniture server side? Ask yourself that, and send me a
PM if you can figure out why, if you CAN figure out why then good
you're using your head and if you CAN'T you need to re-read what I said,
and if you really can't figure out then you need to read programming
books to increase your IQ level cause its a common sense thing, and if
you don't get it I HIGHLY advice agaisn't making a server if you can't
figure out such a simple thing. Anyways, I'm out, this is all from me
for now. I might write a little e-book on the development of a Habbo
Emulator.
Originally Posted by Moogly:
You
inject specific data such as a BK followed by LOL aka will bring up a
habbo alert that says LOL so this is how it would work you would send to
the server AP <ANYDRINKID> & Chr(1) & BKLOL & Chr(1)
you see how that worked, you sent Chr(1) before you sent BKLOL because
you wanted to end the drink packet so the server thinks "oh that packet
is finished" so then you start an all new packet since the server thinks
the packet is finished aka BKLOL and then you finish your packet with
Chr(1) and there you have it retro scripting in a nut shell.
Wrong baby. <3
First, AP = client>server and BK is server>client, they are not the same so you cannot compare them nigga.
Char1 is for server>client messages only, client>server messages
have Base64 length headers so the server knows when which message in the
packet ends:
AP12 = 4 characters, Base64(4) =
@D, total:
@DAP12
[email protected]@E (request move to tile 4,5), = 6 characters, Base64(6) =
@F, total:
@F[email protected]@E
Each packet, yes
packet, you guys need to stop thinking that a
packet is the same as a message, a packet is just a ... pack of
messages, separated in some way tot show the receiver where which
message ends, in client>server messages it's done by Base64 lengths,
in server>client it's done by char1.
That's why you can script anything if you are able to inject char1,
because then the receiving clients will see it as a new message and
process it, clever eh?
Anyway each client>server packet consists out of them messages with
the Base64 header, plus a leading '@', which is a Base64 boolean and
it's just there to separate packets from packets. (yeah and packets are
already split up in messages)
Hope that it helps you guys, ohh I'm just such a Mr.KnowItAll sometimes.
- Nillus
Visual Basic 6 : Habbo Programming
A real 'guide' per say to habbo emulator programming in Microsoft Visual Basic 6!
Summary :
To begin, everyone talks bullshit about, "Visual Basic 6 sucks" ect...
But you are all idiots, because Visual Basic is the reason we're all on
Windows, you see before Visual Basic everyone had to use C to program,
and if I'm not mistaken they were all mostly on Unix, but then Visual
Basic 6 came and everyone realized how easy it was to make a program in
VB6 it was the difference between a few days of coding vs. a few
minutes. But enough of my history lesson (stuff I read off wikipedia
tbh) anyways, the point I'm going to try and make is
that Habbo Emulators, everyone of them that has been coded in VB6
(Visual Basic 6) has been coded completely improperly, this is why they
lag, if coded much more properly they would drastically be improved in
speed and performance, not even Holo Visual Basic 6 is coded properly,
its a DECENT source don't get me wrong, but it still needs work, theres
always room for improvement, seeing as VB6 is the beginer friendly and
most used language around RZ (lets face it none of these kids are good
at C# or PHP except a select few, and they're not even as good as
Nillus, and TRUST me by coding standards Nillus is merely at an
Intermediate level considering he's still learning a _LOT_)
and like Nillus, who's helped me learn a lot, I hope I can help you
learn a lot, learning to program is not something that happens overnight
so stop being a sissy and saying you're too lazy otherwise you'll never
become a programmer. Alright lets begin shall we?
Why Visual Basic 6?
Because its easy, simple, and very powerful.
What the fuck do you mean its powerful all servers lag that are coded in VB6?
and holo C# is lag free? Point and case, like it was said at the
begining of the original Visual Basic 6 Holo and when Jeax started
opening our eyes to how crappy our servers were, he always said and so
did Nillus, that it doesn't matter what language you code the emulator
in, if you code it properly even in VB6 you could easily pull off 300
without lag, people don't seem to believe this because no server has
been coded purely decent. They have much to be improved.
So how do we improve them?
By actually learning the language you're trying to work on you can actually learn decent programming skills.
So where do we start?
This post, I will provide with many links to help get you started.
They're all basically at VB6.US a good website, I'm not advertising
another forum or anything just an excellent resource for programming, I
myself am learning a LOT from this website. I don't know the owner, or
owners, and I'm not payed to advertise them or anything, its just a site
I found in google, with many good tutorials.
Originally Posted by :
Thats where you learn the basics in the above quote, also I would like to add this great link :
http://www.vb6.us/tutorials/using-va...c-vb6-tutorial
You need to understand variables, I suggest you guys skip the Hello
World bit if you've already done it before ( I suspect everyone has...)
and go on to step 2, I didn't copy and paste everything just the
learners page because if you're too lazy to click for yourself, you wont
be getting anywhere as a programmer, and why would I past the tutorials
if the links are right here. Anyways, VB6 is a GREAT starter language,
Nillus, Parker, ect... they all started off in it. Nillus only chose C#
in the end because tbh its a very good language for people who have
enough programming experience, but if you can't even have the patience
to read something, you'll NEVER learn to code, thats the fact of
programming, you can't expect to drive a car on your first try unless
you've studied everything about driving a car. Anyways, if anyone needs
help with VB6 PM me.
Originally Posted by Moogly:
To
begin, everyone talks bullshit about, "Visual Basic 6 sucks" ect... But
you are all idiots, because Visual Basic is the reason we're all on
Windows
That's funny. I thought we were on Windows because it dominates the
market, because it is relatively simple to use and comes readily
available on most PCs purchased!
Originally Posted by Moogly:
... you see before Visual Basic everyone had to use C to program, and if I'm not mistaken they were all mostly on Unix
You
are mistaken! Windows is
NOT written in VB, but... you
guessed it? C! Software that has been written properly in C is not only
alot easier to port to just about any Operating System, on just about
any architecture than Visual BASIC 6 (it's not "Visual Basic", by the
way, as BASIC is an acronym) but is also extremely likely to run faster.
Originally Posted by Moogly:
... but then Visual Basic 6 came and everyone realized how easy it was
to make a program in VB6 it was the difference between a few days of
coding vs. a few minutes.
Ohh yeh, there's always this argument. Mustn't forget this argument. Try
coding some AI software in VB, tell me if it's easier than the
equivelant solution in LISP. Try writing for me a SOCKS proxy server in
VB (which would perform horribly, by the way), and tell me if this is
easier than in C or C++ (and also take into consideration the
performance gains that can be made in C/C++). Try writing something to
solve polynomials... there are languages that are specific to this,
also! Here's some code for you, it's in C and it's relevant to the
topic:
Hex.c
Code:
// A very efficient hexidecimal/binary conversion template
// Written by Seb (http://www.geekycode.net/)
#ifndef __HEX_C
#define __HEX_C
// binary char to hexidecimal string conversion. pass 1 full byte at a time.
char *colHexDigit[] = {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
"44", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
"E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
};
// hexidecimal string to binary char conversion. pass 1 full hex byte (2 nibbles) at a time.
// ~0 indicates invalid hex value. dont forget to call InitHex() before this is used!
unsigned short colHexValue[65536];
// generate a reverse table for the above...
// the table will have 0xFFFF where an invalid hex string has been provided.
void InitHex() {
int x;
int l, h;
unsigned short v;
for (x = 0; x < 65536; x++) {
h = (x & 0xFF);
if (h >= '0' && h <= '9') {
v = h - '0';
}
else if (h >= 'A' && h <= 'F') {
v = (h - 'A') + 0x0A;
}
else if (h >= 'a' && h <= 'f') {
v = (h - 'a') + 0x0a;
}
else {
colHexValue[x] = 0xFFFF;
continue;
}
l = (x & 0xFF00) / 0x0100;
if (l >= '0' && l <= '9') {
v = (v * 0x10) + (l - '0');
}
else if (l >= 'A' && l <= 'F') {
v = (v * 0x10) + (l - 'A') + 0x0A;
}
else if (l >= 'a' && l <= 'f') {
v = (v * 0x10) + (l - 'a') + 0x0a;
}
else if (l != '\0') {
colHexValue[x] = 0xFFFF;
continue;
}
colHexValue[x] = v;
}
}
void TestHex() {
char orig = 'A';
InitHex();
printf("%c in hex: %s\r\n", orig, colHexDigit[orig]);
printf("%s in dec: %c\r\n", colHexDigit[orig], colHexValue[* (unsigned short *) colHexDigit[orig]]);
if (colHexValue[* (unsigned short *) colHexDigit[orig]] != orig) {
printf("Hex module test FAILED!\r\n");
}
else {
printf("Hex module test passed.\r\n");
}
}
#endif
... There. Try porting that test function to your
precious VB6. Over 9000 internets for you if you can understand that
much. Don't forget everything else. How is it relevant? Well you should
know by now that converting bin to hex and hex to bin is part of the
cryptographic functionality of Habbo. This solution is FAR faster than
that found in Holo C#, to say the least.
Originally Posted by Moogly:
... the point I'm going to try and make is that Habbo Emulators,
everyone of them that has been coded in VB6 (Visual Basic 6) has been
coded completely improperly, this is why they lag, if coded much more
properly they would drastically be improved in speed and performance,
not even Holo Visual Basic 6 is coded properly, its a DECENT source
don't get me wrong, but
Let me just cut you off here. Are you saying that a server COULD be
coded properly in VB6? I have not seen one! VB6 is not suitable for
server development, as it takes the RAD development model. Though
servers CAN be developed using this approach, a systematic top-down
software development cycle is, certainly in my opinion, far more
suitable.
1. Lack of proper support for multiple threads.
2. Lack of correct typecasting.
3. Lack of OS support in all cases except for Windows.
4. Lack of grammatical and linguistical consistensy (with other languages, too, which leads me to my next paragraph ... )
... If you're going to learn VB6 as a beginner programmer, don't expect
to pick up any other language any time soon, except perhaps Delphi or
PHP! Visual BASIC 6 lacks a certain flexible logical and aesthetical
form that most other languages are quite happy to embrace. C++, C#, Perl
and Java, for example are all extremely flexible, generally consistent
languages that perhaps would be more suitable for a server than VB6. PHP
is an example of what went wrong between Perl and C+CGI. Due to the
developers' tastes influencing the final product, it became so tight and
straight-forward that it lost elegance as a result. For this reason I
rank VB6 and PHP below almost every other programming language I can
think of.
Originally Posted by Moogly:
... lets face it none of these kids are good at C# ...
I would rather employ someone who thinks they may not be such a good
coder in C#, who has never touched VB6, than someone who thinks they are
a terrific coder in VB6 and may try to migrate those styles across to
C#!
Originally Posted by Moogly:
... learning to program is not something that happens overnight so stop
being a sissy and saying you're too lazy otherwise you'll never become a
programmer.
Right, and wrong. To those who like the idea of controlling something
without any outside influences, this is correct... For example, I enjoy
coding because it is something I can do that I am completely responsible
for. If something goes wrong, it's not because someone put self raising
flour in the plain flour tin, or because somebody gave me the wrong
grinding disc for an angle grinder, but because I did something wrong.
When things go right, I get the satisfaction of being able to say "hey! I
made that. All by myself, and it will run on most Unix or Windows
machines with little more than a compiler or an interpreter! I'm glad
you enjoyed using my software.", something that VB6 coders can't say,
and if you don't know why, perhaps one day you'll realise just how
fascist VB6/PHP programming is.
Originally Posted by Moogly:
Why Visual Basic 6?
Because its easy, simple, and very powerful.
Not very powerful. I think I demonstrated that earlier. Perhaps the
easiest/simplest (they're synonyms, btw) part of it is the IDE, in which
case VB6 is no more difficult and certainly less powerful than say, C#
and/or C++ (with MFC). Having said that, I wouldn't use C# to develop a
server in either. The GC is too constrictive for my liking.
Originally Posted by Moogly:
What the fuck do you mean its powerful all servers lag that are coded in VB6?
and holo C# is lag free? Point and case, like it was said at the
begining of the original Visual Basic 6 Holo and when Jeax started
opening our eyes to how crappy our servers were, he always said and so
did Nillus, that it doesn't matter what language you code the emulator
in, if you code it properly even in VB6 you could easily pull off 300
without lag, people don't seem to believe this because no server has
been coded purely decent. They have much to be improved.
Use ws2_32.dll instead of winsock, and CreateThread to create multiple
threads or a wrapper of C's Select() function (asynchronous socket
calls), and loops instead of window proc messages (which are natively
used in VB) and if designed correctly, you will get a lag free server in
VB6 that is capable of pulling off over 300, depending on the amount of
memory you have and of course your CPU. Do
you know how to use the functions in ws2_32.dll, and could
you
develop the correct framework necessary in VB6 to code a multithreaded,
asynchronous server that uses single message queues correctly? In C
this is alot easier. Do you even know the difference between a string
and an integer (from a low-level perspective), or the difference between
a static and a dynamic array? As you can sense, I'm a bit skeptical as
many beginner programmers start off programming in VB, as I did once
upon a time, and start to think of themselves as "elite coders". Grow
up, read a few books, learn the concept of "agile programming" and then
perhaps get a job as a VB6 programmer, and I might listen to you.
Originally Posted by Moogly:
So how do we improve them?
By actually learning the language you're trying to work on you can actually learn decent programming skills.
Speaking for others is ironic. Care to provide a sample of your own code that we can scrutinize?
Originally Posted by Moogly:
So where do we start?
There are actually languages that will embrace your style as an
individual, and I would recommend having a brief look at each before
deciding, as in the end the language that is suitable for the project is
the one that you are most comfortable learning. Most languages have
concepts that can be used throughout other languages (even VB6, ugh). I
would recommend
Ruby
as a beginners language, as it incorporates so many different styles
simultaneously and as a result it is more likely that each individual
will find a style they are happy with. ECMAScript (Javascript) is such a
gorgeous, malleable little language that I have in the past, embedded
it into clients that I have written, simply as a scripting language!
Flash uses a form of ECMAScript for it's ActionScript. With standard
drafts, it is becoming quite consistent and even getting faster as it
matures. C# and VB .NET are both very closely related, and mix that same
concept of RAD that VB6 pushed so heavily with the flexibility that it
lacked quite well (hey, there are even native threads and asynchronous
sockets, portable to many OSes running Mono). I've never really had much
to do with Java or Perl, however I'm looking at them both with
increasing interest these days. Perhaps Java and Perl are not all that
suitable as beginners languages (particularly Perl). Tutorials can be
found floating all over the internet for more languages than you can
imagine, so whatever you do, don't just follow the last black sheep when
they say "VB6 is an excellent beginners programming language!".
It's over 10 years old now, by the way. I don't see any possibility of
such an old compiler competing in terms of speed or size with new
compilers that have the benefit of better optimizations.
Java habbo encoding class's
Originally Posted by
:
Class's taken from Jase / Woodpecker II and ported to Java please leave the @author comments intact if you distribute / use this
vl64/wire: PHP Code:
package com.encoding;
/*
* vl64 encoding for habbo servers in Java
*
* @author Who ever wrote the C# version, Lord Jordan Porting
*/
public class vl64Habbo {
public static String Encode(int i)
{
byte[] wf = new byte[6];
int pos = 0;
int startPos = pos;
int bytes = 1;
int negativeMask = i >= 0 ? 0 : 4;
i = Math.abs(i);
wf[pos++] = (byte)(64 + (i & 3));
for (i >>= 2; i != 0; i >>= 6)
{
bytes++;
wf[pos++] = (byte)(64 + (i & 0x3f));
}
wf[startPos] = (byte)(wf[startPos] | bytes << 3 | negativeMask);
String tmp = new String(wf); //encoder.GetString(wf);
return tmp.replace("\0", "");
}
public static int Decode(String data)
{
char[] chars;
chars = data.toCharArray();
return Decode(chars);
}
public static int Decode(char[] raw)
{
try {
int pos = 0;
int v = 0;
boolean negative = (raw[pos] & 4) == 4;
int totalBytes = raw[pos] >> 3 & 7;
v = raw[pos] & 3;
pos++;
int shiftAmount = 2;
for (int b = 1; b < totalBytes; b++)
{
v |= (raw[pos] & 0x3f) << shiftAmount;
shiftAmount = 2 + 6 * b;
pos++;
}
if (negative == true)
v *= -1;
return v;
}
catch (Exception e) {
return 0;
}
}
}
base64: PHP Code:
package com.encoding;
/*
* base64 encoding for habbo servers in Java
*
* @author Who ever wrote the C# version, Lord Jordan Porting
*/
public class base64Habbo {
public static String Encode(int i)
{
try
{
String s = "";
for (int x = 1; x <= 2; x++)
s += (char)((byte)(64 + (i >> 6 * (2 - x) & 0x3f)));
return s;
}
catch (Exception e)
{
System.out.println(e.toString());
return "";
}
}
public static int Decode(String s)
{
try
{
char[] val = s.toCharArray();
int intTot = 0;
int y = 0;
for (int x = (val.length - 1); x >= 0; x--)
{
int intTmp = (int)(byte)((val[x] - 64));
if (y > 0)
intTmp = intTmp * (int)(Math.pow(64, y));
intTot += intTmp;
y++;
}
return intTot;
}
catch (Exception e)
{
System.out.println(e.toString());
return 0;
}
}
}
Fox3090 07:39 PM 11-05-09
[QUOTE=Parker;4180473]
Open Source Projects
Emulators that are open source JASE - Jeax's Asynchronous Socket Emulator Code:
Project Name: JASE
Project Creator(s): Jeax
Programming language: C#.NET
Client: V21 - 22
Thread (if any): N/A (Was locked ages ago)
Download: http://rapidshare.com/files/231797961/JASE.rar
I thought I might as well post it since I get asked
for the source next-to all the time. Anyways I'm not sure if anything
was modified on it (other than what I probably did to it where I
commented out crap when I was a total n00b) credit to Jordan for
re-uploading it for me, I couldn't be bothered to get it off my External
Hard Drive. Enjoy to whomever wishes to use it.
Fox3090 01:15 PM 08-06-09
[mod]Thread was moved from the HH general
section to this thread due to the section will eventually get cleaned
and this thread will eventually go, so now this will always be here
(lets just hope that SOM stays up).[/mod]
Mike (Office.Boy @ Script-O-Matic.NET which is his blog) decided to look
more into the new beta client and discovered a few new things that may
or may not be helpful to you guys (depends on your talents). This was
all achieved without decompiling the original client files (apparently
you'd loose some important stuff via doing such a thing.)
Anyway:
Originally Posted by :
Getting
BETA access allowed me to explore the BETA client purely for reverse
engineering possibilities. The results proved more successful than I
thought.
Upon exploring the client (No - I didn't decompile it. Decompiling
doesn't give you some of the stuff I've found) I found some core XML
files. One of them being the incoming and outgoing message responses
(Retro programmers are going to love me for this). I'm pretty sure the
ID's to each message still denotes the decoded B64 value. It also lists
all classes related to each packet ID - something thats useful when
calling these classes from 3rd party applications become apparent. I
also found some manifest and layout XML files, which are just there to
show you how Habbo handles their interface/draws their interface. It
seems they've gone for a full XML solution this time. I also found a
configuration manifest - not entirely useful but every little helps.
Where the files are:
http://script-o-matic.net/habbo_beta/
So Hebbo, Jordan etc.. whoever the hell gives three shits about the new
habbo check this out, also somewhat helpful for people who know enough
about coding and want to take a stab at the new structure.
Blog Post:
http://script-o-matic.net/?p=148
For whoever wants to see it 'for themselves'.
Edit:
I mirrored the files:
http://www.hybridcore.net/habbo/
I will also re-upload into rapidshare etc.. later.
Here's guestrooms in the navigator. ("GC", 451)
Revision: 43
Code:
Header (b64)
QA
Char(2) ¨
Count of rooms (vl64)
foreach room
{
Room id (vl64)
Event or not (true = 1, false = 0) (vl64)
Room name
Char(2)
Owner name
Char(2)
Room state (locked = 1, password = 2, open = 0) (vl64)
Visitors now (vl64)
Visitors max (vl64)
Room description
Char(2)
H
Trading allowed(yes=1, no=0)
Room rating (vl64)
Category id (vl64)
Char(2)
Number of tags (vl64)
foreach tag
{
Tag
Char(2)
}
Icon (vl64)
}