function ExtractSWF($filename) { $swfID = basename($filename, ".swf"); consoleLog("<b>Extract SWF: " . $swfID . ".swf</b>"); consoleLogBlank(); checkDIR(OUTPUT_DIRECTORY . $swfID); $raw = file_get_contents_with_console($filename); if ($raw === false) { return false; } if (substr($raw, 0, 3) == 'CWS') { $raw = 'F' . substr($raw, 1, 7) . gzuncompress(substr($raw, 8)); } list(, $file_length) = unpack('V', substr($raw, 4, 4)); $header_length = 8 + 1 + ceil(((ord($raw[8]) >> 3) * 4 - 3) / 8) + 4; $symbols = []; $pngs = []; $xmls = []; consoleLog("Analyzing SWF..."); for ($cursor = $header_length; $cursor < $file_length;) { consoleLogProgressBar($cursor, $file_length); list(, $tag_header) = unpack('v', substr($raw, $cursor, 2)); $cursor += 2; list($tag_code, $tag_length) = [$tag_header >> 6, $tag_header & 0x3f]; if ($tag_length == 0x3f) { list(, $tag_length) = unpack('V', substr($raw, $cursor, 4)); $cursor += 4; } switch ($tag_code) { case 36: if ($swfID != "Habbo") { $tag = SWFREAD_PNG(substr($raw, $cursor, $tag_length)); $pngs[$tag['symbol_id']] = $tag['im']; } break; case 76: $symbols = SWFREAD_SYM(substr($raw, $cursor, $tag_length)); break; case 87: $tag = SWFREAD_BIN(substr($raw, $cursor, $tag_length)); $xmls[$tag['symbol_id']] = $tag['data']; break; } $cursor += $tag_length; } consoleLogProgressBar($file_length, $file_length); consoleLogBlank(); consoleLogBlank(); consoleLog("Analyzing XML..."); $cnt = 0; $xmls_length = count($xmls); foreach ($xmls as $symbol_id => $xml) { $cnt++; consoleLogProgressBar($cnt, $xmls_length, "items"); $name = isset($symbols[$symbol_id]) ? $symbols[$symbol_id] : 'symbol_' . $symbol_id; $_xml = @simplexml_load_string($xml); if ($_xml !== false) { $_name = $_xml->getName(); if (($_name == "animationSet" || $_name == "geometry" || $_name == "partSets" || $_name == "actions") && $swfID == "Habbo") { switch ($_name) { case "animationSet": $name = "HabboAvatarAnimation"; ExtractAvatarAnimation($_xml); break; case "geometry": $name = "HabboAvatarGeometry"; ExtractAvatarGeometry($_xml); break; case "partSets": $name = "HabboAvatarPartSets"; ExtractAvatarPartSets($_xml); break; case "actions": $name = "HabboAvatarActions"; ExtractAvatarActions($_xml); break; case "figuredata": $name = "HabboAvatarFigure_" . $symbol_id; ExtractFigureData($_xml, $name . ".json"); } } elseif ($_name == "manifest" && $swfID != "Habbo") { ExtractCastOffset($_xml); } //file_put_contents(OUTPUT_DIRECTORY.$swfID.'/'.$name.'.xml', $xml); } else { //file_put_contents(OUTPUT_DIRECTORY.$swfID.'/'.$name.'.dat', $xml); } } consoleLogBlank(); consoleLogBlank(); consoleLog("Extracting image cast files..."); $cnt = 0; $pngs_length = count($pngs); foreach ($pngs as $symbol_id => $png) { $cnt++; consoleLogProgressBar($cnt, $pngs_length, "images"); $name = isset($symbols[$symbol_id]) ? $symbols[$symbol_id] : 'symbol_' . $symbol_id; ob_start(); imagepng($png); $image_data = ob_get_contents(); ob_end_clean(); file_put_contents(OUTPUT_DIRECTORY . $swfID . '/' . $name . '.png', $image_data); if (strpos($name, 'hh_human_item_h_') === 0) { pushItemSet($name); } //consoleLog('<img src="data:image/png;base64,'.base64_encode($image_data).'"> '); } consoleLogBlank(); consoleLogBlank(); }
function DownloadAll() { global $avatar_types; consoleLog("Starting Avatars"); foreach ($avatar_types as $index => $value) { consoleLogBlank(); $data = file_get_contents_with_console($value['path']); $name = $value['id']; $file_name = OUTPUT_DIRECTORY . $name . '.swf'; file_put_contents($file_name, $data); ExtractFlash($file_name); unlink($file_name); } }
function DownloadAll($file_name_swf) { consoleLogBlank(); $data = file_get_contents_with_console($file_name_swf); $file_name = OUTPUT_DIRECTORY . 'HabboRoomContent.swf'; file_put_contents($file_name, $data); ExtractFlash($file_name); unlink($file_name); }