Die sind schon seit dem Tag nicht mehr vertraulich, an dem sie auf diesen Server hochgeladen wurden. Das sind einfach Konzepte, die er anderen zugänglich gemacht hat.
Cheers,
Steve Winfield
Die sind schon seit dem Tag nicht mehr vertraulich, an dem sie auf diesen Server hochgeladen wurden. Das sind einfach Konzepte, die er anderen zugänglich gemacht hat.
Cheers,
Steve Winfield
Eine Idee für programmierbare Karten bei Smartkeeping:
Es wird noch aktiv an IDK gearbeitet, jedoch haben wir derzeit nicht besonders viel Zeit dafür, Updates auf Foren zu posten.
Cheers,
Steve Winfield
Ich persönlich bin für die EU, jedoch sollte man sie verändern. Die ESM-Haftungen, Massenzuwanderung und
solche Sachen müssen ein Ende haben und jedes Land sollte wieder selber bestimmen dürfen. Natürlich
sollte man sich gegenseitig unterstützen aber nur wenn es dem eigenen Land auch gut geht. Und ich bin
STRIKT gegen einen Beitritt der Türkei in die EU.
https://www.wahl-o-mat.de/ - Einfach mal ausprobieren.
Cheers,
Steve Winfield
KFC? Hast du überhaupt freunde Klaus? Bestimmt bist du Fett..
Zuerst sagst du etwas gegen mich und dann gegen den Namen Klaus? Heute sind wir aber extrem mutig und legen uns gleich mit ner Vielzahl an Personen an. Mein Körpergewicht ist normal, dachte dennoch jetzt kommt mal etwas kreatives das mit Intelligenz und Kreativität zutun hat.. Aber da die Latte hier anscheinend schon zu niedrig ist und du wahrscheinlich nichts für deine unterbemittelte Bildung kannst, werde ich das einfach mal auf mich beruhen lassen.
Cheers,
Steve Winfield
Steve wird ganz Neidisch, wenn er hört, das andere auch ein Java Emulator machen wollen. Er ist halt ein Fettes Kind, welches kein RL besitzt und sein leben mit einem Java Emulator verbringt.Kopf in Müll.
Nö, ich bin jemand der denkt, dass jemand der einen Java Emulator schreiben möchte, es nicht nötig haben muss, dafür einen Thread auf RetroTown zu erstellen. Und leider ist Habbo auch nicht so spannend, dass ich damit stundenlange meine Zeit verbringen muss.. Es gibt nämlich auch noch so etwas wie Arbeit, Schule und KFC (Das kam jetzt von mir?)
Cheers,
Steve Winfield
Hatte sowas auch mal vor ein paar Monaten geschrieben.
<?php
/**
* @author Steve Winfield
* @date 12/18/2013
**/
// Takes more than just a few seconds
set_time_limit(0);
// Defines destination directory for
// ripped badges
define ('DEST_LIBRARY', 'album158');
define ('SRC_LIBRARY', 'c_images/album1584');
define ('SERVER_TYPE', 1);
if (!file_exists (DEST_LIBRARY)) {
mkdir (DEST_LIBRARY, 777);
}
class ImageServer {
const PUBLIC_SERVER = 'habboo-a.akamaihd.net';
const PRIVATE_SERVER = 'images-webtool.varoke.net';
}
/**
* Describes a promo badge and provides the method
* 'save' which saves the badge to the destination directory
**/
class PromoBadge {
// getters
public function getCode() {
return $this->code;
}
public function getTitle() {
return $this->title;
}
public function getDescription() {
return $this->description;
}
// setters
public function setTitle ($title) {
$this->title = $title;
}
public function setDescription ($desc) {
$this->description = $desc;
}
/**
* @constructor (String, String, String)
* @description Sets attributes like the code and title of a badge.
* @void
**/
public function __construct ($code, $title, $description) {
$this->code = $code;
$this->title = $title;
$this->description = $description;
}
/**
* @method
* @descriptions Saves badge if it exists to the destination directory
* @bool sucessfully saved
**/
public function save() {
if (strlen($image = @file_get_contents(sprintf('http://%s/%s/%s.gif', (SERVER_TYPE == 2 ? ImageServer::PRIVATE_SERVER : ImageServer::PUBLIC_SERVER), SRC_LIBRARY, $this->code))) < 1) {
return false;
}
file_put_contents(sprintf('%s/%s.gif', DEST_LIBRARY, $this->code), $image);
return true;
}
// fields
private $code;
private $title;
private $description;
}
/**
* Reads out the variables of Habbo client files
* identified by their keys
**/
class HabboVariablesReader implements Iterator, ArrayAccess {
/**
* @method implemented ArrayAccess
* @description returns true if key is setted
* @void
**/
public function offsetExists($key) {
return isset($this->keys[$key]);
}
/**
* @method implemented ArrayAccess
* @description gets the value of an array identified by key
* @object
**/
public function offsetGet($key) {
if (isset($this->variables[$key])) {
return $this->variables[$key];
}
return null;
}
public function offsetSet($key, $value){}
public function offsetUnset($key){}
/**
* @method implemented Iterator
* @description resets the iterator position
* @void
**/
public function rewind() {
$this->position = 0;
}
/**
* @method implemented Iterator
* @description gets the current obj identified
* by $this->key()
* @object
**/
public function current() {
return $this->variables[$this->key()];
}
/**
* @method implemented Iterator
* @descriptio gets the current key identified
* by $this->position
**/
public function key() {
return $this->keys[$this->position];
}
/**
* @method implemented Iterator
* @description increments the iterator position
* @void
**/
public function next() {
++$this->position;
}
/**
* @method implemented Iterator
* @description returns true if key is setted
* @bool ""
**/
public function valid() {
return isset($this->keys[$this->position]);
}
/**
* @method
* @description passes through each variable
* of String $str
* @object
**/
public function parse($str) {
$lines = preg_split('/\r\n|\r|\n/', $str);
foreach ($lines as $line) {
$this->variables[strstr($line, '=', true)] = substr(strstr($line, '='), 1);
}
$this->keys = array_keys($this->variables);
return $this;
}
// fields
private $position = 0;
private $variables = array();
private $keys = array();
}
$promoBadges = array();
$flashTexts = (new HabboVariablesReader())->parse(file_get_contents('http://www.habbo.de/gamedata/external_flash_texts'));
// add badges to $promoBadges
foreach ($flashTexts as $key => $value) {
if (($part = substr($key, 0, 11)) == 'badge_name_' || (($desc = true) && $part == 'badge_desc_')) {
if (isset($promoBadges[($badgeCode = substr($key, 11))])) {
if ($desc) {
$promoBadges[$badgeCode]->setDescription($value);
} else {
$promoBadges[$badgeCode]->setTitle($value);
}
$desc = false;
} else {
$promoBadges[$badgeCode] = new PromoBadge($badgeCode, ($desc ? '' : $value), ($desc ? $value : ''));
}
}
}
echo ('Found ' . count($promoBadges) . ' badges! Starting download..');
$counter = 0;
// saving badges
foreach ($promoBadges as $promoBadge) {
if ($promoBadge->save())
$counter++;
}
echo (PHP_EOL . $counter . ' Badges downloaded.');
Alles anzeigen
Cheers,
Steve Winfield
Es ist eine Ankündigung, dass absofort der Manu kein Moderator auf RetroTown mehr ist. Es ist also völlig legitim, dass Leider darüber ein Thread verfasst.
Warte mal, also dürfte ich jetzt ankündigen, dass ich kein Benutzer mehr auf RetroTown bin? Interessante Gesetzeslücke. Viel Spaß so und ja halt..
Cheers,
Steve Winfield
Vermeidet Zentrierungen, Unterüberschriften und Farben. Förmliche Briefform und Absätze genügen vollkommen und wirken nicht so aggressiv. Würde ich eine Bewerbung sehen, die so ähnlich wie der Thread-Text aufgebaut ist, wäre mir schon die Lust vergangen und ich hätte sie gelöscht.
Cheers,
Steve Winfield
Kennt ihr das, wenn man sich nicht sicher ist, ob jemand trollt oder nicht? Das ist so ein Moment. Man fängt nicht dumm an, man fängt nur unerfahren an. Aber wenn man es nicht schafft, sich einfachste Informationen selber zu besorgen oder logisch nachzudenken, ist man dumm. Aber mach dir nichts draus, die meisten hier sind genauso intelligent wie du.. Amen.
Ich hoffe, wir haben euch nicht zu viel versprochen.
Die Schriftfarben auf der linken Seite stellen dar, wie viele Taler, Pixel, etc. der Nutzer in Relation zur restlichen Community hat. "Aktivitäten aufzeichnen" ist für die Mainpage. Dort werden dann, solange die die Option aktiviert ist, alle bzw. bestimmte Aktivitäten des Users aufgelistet.
Cheers,
Steve Winfield
Wünsche euch weiterhin viel Glück und Erfolg!
Die ersten einblicke sind wirklich toll! Dachte eher, Rhino ist eher der Konzeptumsetzer anstatt 'Programmierer'Gruß,
Für ein Projekt werden nicht nur Programmierer benötigt.
Cheers,
Steve Winfeld
Natürlich sind auch unter anderem Push-Benachrichtigungen für Chrome, Safari und Firefox verfügbar. Android und iOS Support für Smartkeeping besteht, damit es auch möglich ist mobil auf Probleme schnell zu reagieren.
Cheers,
Steve Winfield
Ich bin gespannt.
Frage zur Kooperation mit RetroTimes: Welches Ziel verbirgt sich hinter der Kooperation bzw. warum kooperieren diese beiden Projekte und welchen Nutzen können sich die Projekte daraus ziehen ?
RetroTimes schafft es professionell, neue Funktionen und Besonderheiten des IDK Projekts in Artikeln zusammenzufassen und übersichtlich zu archivieren. Außerdem sind wir so in der Lage Updates einer großen Anzahl an Nutzern ohne großen Aufwand weiterzugeben. RetroTimes erhält unter anderem auch manche Informationen die in IDK Threads nicht geteilt werden, also ensteht so ggf. ein Interesse der Nutzer für IDK Artikel auf RetroTimes. Eine Unterseite für IDK folgt dort Morgen.
Man sah bis jetzt eigentlich nur Sachen vom Emulator und immer wurde Steve gelobt.
Hier sind mal Arbeitsergebnisse von Rhinodanny die ich sehr toll finde!
Lob an dich!
Wir machen und planen eigentlich alles zusammen, er macht genauso viel für den Emulator, wie ich für Smartkeeping mache.
Falls es jemanden interessiert, hier ein Beispiel für ein Plugin im JavaScript PluginSystem:
var plugin = {
'name' : 'Developer Plugin',
'description' : 'Contains commands for developers.'
};
var coordsCommand = function(player, arguments) {
player.getSession().sendNotification(NotifyType.STAFF_ALERT,
"X: " + player.getPosition().getX() + "\nY: " + player.getPosition().getY() + "\nALT: " + player.getPosition().getAltitude());
return true;
};
var effectCommand = function(player, arguments) {
player.applyEffect(arguments.readInteger());
return true;
};
var chatCommand = function(player, arguments) {
var players = player.getRoom().getRoomPlayers().values().toArray();
var targetName = arguments.readWord();
if (targetName == null || targetName.isEmpty()) {
player.getSession().sendNotification(NotifyType.STAFF_ALERT, "Du hast einen ungültigen Nutzernamen eingegeben. Wähle einen Habbo aus, der sich in deinem aktuellem Raum befindet.");
return true;
}
if (targetName.equals(player.getPlayerInformation().getPlayerName())) {
player.getSession().sendNotification(NotifyType.STAFF_ALERT, "Falls du mit deinem Benutzer schreiben möchtest, benötigst du keinen \":chat\"-Präfix.");
return true;
}
var message = arguments.readMessage();
if (message == null || message.isEmpty() || message.length > 100) {
player.getSession().sendNotification(NotifyType.STAFF_ALERT, "Die zu versendene Nachricht darf nicht kürzer als eins oder länger als hundert Zeichen sein.");
return true;
}
for (var i = 0; i < players.length; i++) {
if (players[i].getSession() == null || !targetName.equals(players[i].getPlayerInformation().getPlayerName()))
continue;
player.getRoom().getRoomTask().offerChatMessageAdd(
new ChatMessage(players[i], arguments.readMessage(),
arguments.isShouted() ? ChatType.SHOUT : ChatType.SAY));
return true;
}
player.getSession().sendNotification(NotifyType.STAFF_ALERT, "Der eingegebene Benutzername existiert in diesem Raum nicht, deshalb konnte die Nachricht nicht versandt werden.");
return true;
};
function initializePlugin() {
IDK.addChatCommand('coords', 'command_coords', 'coordsCommand');
IDK.addChatCommand('effect', 'command_effect', 'effectCommand');
IDK.addChatCommand('chat', 'command_chat', 'chatCommand');
}
Alles anzeigen
:coords -> Zeigt die Koordinaten des Users
:effect [id] -> Ändert den Effekt
:chat [player] [message] -> Lässt einen Nutzer etwas chatten
Cheers,
Steve Winfield
Sehr schöner Thread. Leider wissen die meisten schon, was für was steht.
Ich denke nicht, dass viele wussten wie z.B. der Emulator die Nutzer identifiziert oder, dass es auch möglich ist, die User auf mehrere Server zu verteilen.
Cheers,
Steve Winfield
Eine bessere Frage währe ja, wie sind Retro Hotels überhaubt erstanden ?
Ich habe gehört ein Mitarbeiter von Sulake hat aus Spaß mal die Dateien hochgeladen ?
Man braucht keine internen Dateien um öffentliche Spiele nachbilden zu können, außerdem bringt dir das Wissen darüber, wie Retro Hotels überhaupt entstanden sind, auch nicht viel. Scripter haben irgendwann mal angefangen zu kapieren, wie das Packet System ganz funktioniert und wie z.B. im Habbo Zahlen in VL64 und Base64 verschlüsselt/entschlüsselt wurden.
Cheers,
Steve Winfield
Hey Leute,
da ich des Öfteren mitbekomme, dass viele von euch diverse Begriffe wie Client, Server, Emulator und CMS falsch verwenden, habe ich mich entschlossen darüber zu schreiben, wie ein Habbo Retro eigentlich aufgebaut ist. Wenn irgendwas unklar ist, könnt ihr das gerne in diesem Thread posten.
1. Das CMS
Das CMS (Content Management System) ist das, was ihr seht, wenn ihr euch z.B. einloggt, registriert oder die täglichen News anseht. Es ist dafür zuständig, neue Nutzer zu der Datenbank hinzuzufügen und diese dann ggf. einzuloggen. Beim Aufrufen der Client Seite (2. Punkt) generiert es einen Code (SSO-Ticket = Single Sign-on Ticket), der dem User in der Datenbank zugeteilt wird. Dieser wird benötigt, damit der Emulator (3. Punkt) weiß, welcher User in das Hotel einchecken möchte. Dieser Code kann so aussehen, wie es der Entwickler möchte, solange er einzigartig bleibt.
2. Der Client
Der Client ist meist über die URL (/client) erreichbar und ist einer der wichtigsten Bestandsteile eines Habbo CMS, da sich dieser mit dem Emulator (3. Punkt) verbindet. In ihm ist immer eine Flash Datei eingebunden, die meist den Namen Habbo.swf trägt. Dieser Datei werden dann Parameter wie z.B. das SSO-Ticket (1. Punkt) übertragen. Die meisten Hotels nutzen für das Generieren dieser Einbinde-HTML-Codes vorgefertigte Javascript Funktionen (Das muss euch jetzt aber nicht besonders interessieren).. Der Client ist für alles zuständig, was euer Auge sehen kann, er zeigt die Bilder, die Texte und bewegt z.B. die Habbo Figuren. Wenn du die Seite aufrufst, werden zuerst Dateien wie z.B. "external_variables.txt" und "external_flash_texts.txt" geladen. Diese Dateien beinhalten konstante Informationen für den Client, für die der Emulator (3. Punkt) nicht benötigt wird. Während die Informationen in der Datei "external_variables.txt" eher für Einstellungen stehen, sind in "external_flash_texts.txt" nur Texte gespeichert, die später im Client benötigt werden (Dort sind oft Platzhalter wie z.B. %name% die mit Informationen ausgetauscht werden, welche vom Emulator kommen). Nachdem diese und weitere Dateien geladen wurden, verbindet sich der Client über eine IP-Adresse und einen Port mit dem Habbo Server (Emulator) und sendet dann anfangs das vom CMS generierte SSO-Ticket an den Server. Wenn alles klappt, kriegt der Client dann die Userdaten vom Emulator und kann dann Platzhalter wie %name% mit dem echten Usernamen ersetzen.
3. Der Server (Emulator)
Der Habbo Server, bei Habbo Retros auch Emulator genannnt, ist das was alle Nutzer im Hotel miteinander vernetzt. Er steht in keinem direkten Zusammenhang mit dem CMS und kann auch auf einem externen Server (andere IP als CMS Host) ausgeführt werden, jedoch muss die gleiche Datenbank verwendet werden. Er fängt an wenn alle Datenbankinformationen, die z.B. für den Katalog benötigt werden, geladen wurden auf Client Verbindungen zu warten. Diese können ihn dank der IP-Adresse und des Ports (Port muss einzigartig sein), der im Emulator in einer Konfiguration angegeben wurde, identifizieren und sich so mit ihm verbinden. Da auch mehrere Nutzer ins Hotel möchten, hört er nicht auf Verbindungen zu horchen, wenn sich ein Client verbunden hat. Da er mehrere Verbindungen gleichzeitig hält, kann er somit auch z.B. eine Chat Nachricht von Client 1 zu Client 2 schicken und andersrum.. Das läuft grob gesagt so ab, dass der Client eine Chat Nachricht an den Server schickt und dieser dann die Nachricht an alle anderen weiterschickt.. Dann verarbeiten die anderen Clients die Nachricht, die sie vom Server bekommen haben.
4. Die offiziellen Hotels
In den offiziellen Habbo Hotels funktioniert es fast genauso wie bei jedem Habbo Retro Hotel. Mit dem Unterschied, dass sie den Emulator auf mehrere Server verteilen. Vielleicht habt ihr euch schonmal den Quelltext des Clients eines offiziellen Hotels angesehen und bemerkt, dass dort 2 Ports eingetragen wurden.. Das sind ganz einfach 2 "verschiedene" Server. Der Client wählt dann zufällig aus, mit welchem er sich verbinden soll. Diese verschiedenen Server die Habbo nutzt sind die sogenannten Client Server. Neben diesen gibt es dann noch den Hauptserver, der die Client Server miteinander verbindet. Es funktioniert hier ähnlich wie bei den meisten Retro Emulatoren, nur dass hier die Verbindungen verteilt werden. Das wird gemacht, damit der eine Server nicht so belastet ist und es somit weniger Laggs im Hotel gibt / mehr User im Hotel gleichzeitig online sein können.. Diese Client Server können beliebig erweitert werden.
Cheers,
Steve Winfield