Habbo V1 CSTs w/ Bytecode

Page 1 of 2 12 LastLast
Results 1 to 15 of 27
  1. #1
    Ask me about Daoism FullmetalPride is offline
    Alpha MaleRank
    Nov 2010 Join Date
    2,180Posts

    note Habbo V1 CSTs w/ Bytecode


    RaGEZONE Recommends

    RaGEZONE Recommends

    Greetz

    So I was on Discord talking to some of y'all and apparently I've had like, a jewel laying around in my archives that I never bothered to pay attention towards.

    My Public Shockwave Library was created to store Shockwave-era contributions to the community I found deep within RaGEZONE /f353/

    It also contained some unprotected Habbo V1 CST's. But they're special.

    So what? recover-cct.exe will generate an unprotected cast file. You've only saved me like, 10 minutes.
    Like I said, these are special. The original bytecode has been left in-tact.

    AND AGAIN I SAY: SO WHAT? We can't do SHIT with bytecode.
    Up until a few weeks ago, this would be the appropriate, annoyed question to ask.

    But a GitHub project has been performing strong work to unpack the Lingo bytecode and guess the Lingo scripts. It does a really good job of this, and I've seen DIRs and CSTs be completely read in full from other games.

    How 2 get moar unprotected CSTs? V5? V18? R26?

    Not sure. A lot of these came from @Cecer's generous donations, so he may have a clue. But there are some reverse-engineering wizards among us, who secretly practice their magic on Shockwave files, whose names I shall not utter here (lurk moar )


    Anyways. Here you go.

    UNPROTECTED V1
    http://nodebay.com/archives/Habbo/DC...ECTED%20V1.zip
    Last edited by FullmetalPride; 07-08-17 at 09:30 PM.


  2. #2
    #GoFuckYourself Cankiee is online now
    True MemberRank
    May 2013 Join Date
    North KoreaLocation
    924Posts

    Re: Habbo V1 CSTs w/ Bytecode

    You Sir, have just blown my mind.

    Nice release!



  3. #3
    Hackerman Quackster is online now
    ModeratorRank
    Dec 2010 Join Date
    AustraliaLocation
    3,089Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Yeah, I had these in my collection for ages. I never released it because I thought it was just your typical recover-cct full of files. I didn't realise until today that these were special and contained bytecode, and that's when I told @FullmetalPride, of which I got the archive from.

    We could do so much more if we could recover the bytecode from CCT files. Unfortunately, the person who created these seems to be a bit of a mystery...

    You can get some pretty neat code out of it.

    Code:
    on handleMessageContent(content)
      if not stringp(content) or content.length <= 1 then
        return()
      end if
      firstline = content.line[1]
      if firstline contains "STATUS" then
        st = the ticks
        if voidp(gLastStatusOK) or the ticks - gLastStatusOK > 25 * 60 then
          sendFuseMsg("STATUSOK")
          gLastStatusOK = the ticks
        end if
        i = 2
        repeat while i <= the number of line in content
          the itemDelimiter = "/"
          ln = content.line[i]
          if ln.length > 2 then
            if not ln.char[1] = "*" then
              itemsCount = the number of item in ln
              user = doSpecialCharConversion(ln.word[1])
              locParam = ln.word[2]
              the itemDelimiter = ","
              currentMobilX = integer(locParam.item[1])
              currentMobilY = integer(locParam.item[2])
              currentMobilHeight = integer(locParam.item[3])
              dirHead = integer(locParam.item[4])
              dirBody = integer(locParam.item[5])
              moved = 0
              objectSpr = getObjectSprite(user)
              if objectSpr > 0 then
                sendSprite(objectSpr, #initiateForSync)
                if not voidp(currentMobilX) and not voidp(currentMobilY) then
                  sendSprite(objectSpr, #setLocAndDir, currentMobilX, currentMobilY, currentMobilHeight, dirHead, dirBody)
                end if
                j = 2
                repeat while j <= itemsCount
                  the itemDelimiter = "/"
                  parseItem = ln.item[j]
                  sendSprite(objectSpr, symbol("fuseAction_" & parseItem.word[1]), parseItem)
                  if gConnectionShouldBeKilled = 1 then
                    return()
                  end if
                  j = 1 + j
                end repeat
              else
                put("STATUS for nonexistent user!", user)
              end if
            else
              handleActiveObjects(ln)
            end if
          end if
          i = 1 + i
        end repeat
        if objectp(hiliter) then
          hiliteExitframe(hiliter)
        end if
      else
        if firstline contains "CHAT" then
          user = content.word[1]
          Message = content.word[2..the number of word in content.line[2]]
          createBalloon(user, Message, #normal)
        else
          if firstline contains "SHOUT" then
            user = content.word[1]
            Message = content.word[2..the number of word in content.line[2]]
            createBalloon(user, Message, #shout)
          else
            if firstline contains "WHISPER" then
              user = content.word[1]
              Message = content.word[2..the number of word in content.line[2]]
              createBalloon(user, Message, #whisper)
            else
              if firstline contains "LOGOUT" then
                userName = doSpecialCharConversion(content.word[1])
                put("LOGOUT", userName, getObjectSprite(userName))
                put("before", availablePuppetSpr.count)
                sendSprite(getObjectSprite(userName), #die)
                put("after", availablePuppetSpr.count)
              else
                if firstline contains "HELLO" then
                  put(firstline)
                  gKryptausOn = 0
                  sendFuseMsg("versionid" && field(0))
                  sendFuseMsg("CLIENTIP" && getNetAddressCookie(gConnectionInstance, 1))
                else
                  if firstline contains "ENCRYPTION_ON" then
                    gKryptausOn = #waiting
                  else
                    if firstline contains "ENCRYPTION_OFF" then
                      gKryptausOn = 0
                    else
                      if firstline contains "SECRET_KEY" then
                        decodedKey = secretDecode(content.line[2])
                        RC4 = new(script("RC4"))
                        RC4.setKey(decodedKey)
                        if gKryptausOn = #waiting then
                          gKryptausOn = 1
                          put("Encryption enabled...!")
                        else
                          gKryptausOn = 0
                          put("Encryption disabled...!")
                        end if
                        sendFuseMsg("KEYENCRYPTED" && decodedKey)
                        gConnectionsSecured = 1
                      else
                        if firstline contains "ERROR" then
                          put(content)
                          if content contains "not move there" then
                          else
                            if content contains "inproper" and content contains "WARNING" = 0 then
                              ShowAlert(content.getProp(#line, 2))
                            else
                              if content contains "user already" then
                                ShowAlert("NameAlreadyUse")
                                e = 1
                                repeat while e <= 99
                                  sprite(e).visible = 1
                                  e = 1 + e
                                end repeat
                                go(1)
                              else
                                if content contains "incorrect flat password" or content contains "password required" then
                                  flatPasswordIncorrect()
                                else
                                  if content contains "login in" then
                                    ShowAlert("WrongPassword")
                                    e = 1
                                    repeat while e <= 99
                                      sprite(e).visible = 1
                                      e = 1 + e
                                    end repeat
                                    go(1)
                                  else
                                    if content contains "Version not correct" then
                                      ShowAlert("Old client version, please reload." & "\r" & "Clear browser's cache if necessary.")
                                    else
                                      if content contains "the room owner" then
                                        ShowAlert(content.getProp(#line, 2))
                                      else
                                        put("Error message:" && content)
                                      end if
                                    end if
                                  end if
                                end if
                              end if
                            end if
                          end if
                        else
                          if firstline contains "USERS" then
                            content = doSpecialCharConversion(content)
                            the itemDelimiter = "\t"
                            i = 2
                            repeat while i <= the number of line in content
                              ln = content.item[1]
                              if the number of word in ln <> 0 then
                                user = ln.word[1]
                                figure = ln.word[2]
                                locX = integer(ln.word[3])
                                locY = integer(ln.word[4])
                                locHeight = integer(ln.word[5])
                                if ln.word[ln.count(#word)] starts "ch=" then
                                  Custom = doSpecialCharConversion(ln.word[6..ln.count(#word) - 1])
                                  swimsuit = ln.word[ln.count(#word)]
                                else
                                  Custom = doSpecialCharConversion(ln.word[6..the number of word in ln])
                                  swimsuit = ""
                                end if
                                if content.item[2] <> "" then
                                  score = content.word[1]
                                  ranking = content.word[2]
                                  Custom = Custom & "\r" & "\r" & "pisteet:" & score & " sijoitus:" & ranking & "."
                                end if
                                if not the movieName contains "pellehyppy" then
                                  createAvatar(user, figure, locX, locY, locHeight, Custom)
                                else
                                  if gpObjects.findPos(user) then
                                    sendSprite(gpObjects.getProp(user), #updateSwimSuit, figure, swimsuit)
                                  else
                                    createAvatar(user, figure, locX, locY, locHeight, Custom, swimsuit)
                                  end if
                                end if
                              end if
                              i = 1 + i
                            end repeat
                            the itemDelimiter = ","
                          else
                            if firstline contains "USEROBJECT" then
                              the itemDelimiter = "="
                              content = doSpecialCharConversion(content)
                              i = 2
                              repeat while i <= the number of line in content
                                ln = content.line[i]
                                sfield = ln.item[1]
                                sdata = ln.item[2]
                                put(sfield, sdata)
                                if sfield = "name" then
                                end if
                                if sprite(0).number > 0 and sfield.length > 0 then
                                  if sdata <> "null" then
                                  else
                                  end if
                                end if
                                i = 1 + i
                              end repeat
                              the itemDelimiter = ","
                              goToFrame("change1")
                            else
                              if firstline contains "SYSTEMBROADCAST" then
                                ShowAlert("MessageFromAdmin", content.line[2])
                              else
                                if firstline contains "SHOWPROGRAM" then
                                  commandLine = content.line[2]
                                  spr = getaProp(gpShowSprites, commandLine.word[1])
                                  if spr > 0 then
                                    sendSprite(spr, symbol("fuseShow_" & commandLine.word[2]), commandLine.word[3..the number of word in commandLine])
                                  end if
                                else
                                  if firstline contains "TRIGGER" then
                                    if content contains "openSplashKiosk" then
                                      openSplashKiosk()
                                    end if
                                  else
                                    if firstline contains "DOOR_IN" then
                                      tItemDelim = the itemDelimiter
                                      the itemDelimiter = "/"
                                      tDoorID = content.getPropRef(#line, 2).getProp(#item, 1)
                                      tUsername = content.getPropRef(#line, 2).getProp(#item, 2)
                                      tDoorType = content.getPropRef(#line, 2).getProp(#item, 3)
                                      the itemDelimiter = tItemDelim
                                      tDoorObj = sprite(gpObjects.getAt(tDoorType & tDoorID)).getProp(#scriptInstanceList, 1)
                                      tDoorObj.animate(void(), #in)
                                      if gMyName = tUsername then
                                        tDoorObj.prepareToKick(tUsername)
                                      end if
                                    else
                                      if firstline contains "DOOR_OUT" then
                                        tItemDelim = the itemDelimiter
                                        the itemDelimiter = "/"
                                        tDoorID = content.getPropRef(#line, 2).getProp(#item, 1)
                                        tUsername = content.getPropRef(#line, 2).getProp(#item, 2)
                                        tDoorType = content.getPropRef(#line, 2).getProp(#item, 3)
                                        the itemDelimiter = tItemDelim
                                        tDoorObj = sprite(gpObjects.getAt(tDoorType & tDoorID)).getProp(#scriptInstanceList, 1)
                                        tDoorObj.animate(void(), #out)
                                      else
                                        if firstline contains "HEIGHTMAP" then
                                          loadHeightMap(content.line[2..the number of line in content])
                                        else
                                          if firstline contains " OBJECTS" then
                                            content = doSpecialCharConversion(content)
                                            type = the last word in undefined
                                            AddStatistic(the movieName, type)
                                            if not the movieName contains "private" and type contains "model_" then
                                              goMovie("gf_private", type)
                                              init()
                                            end if
                                            sprMan_clearAll()
                                            gUserSprites = []
                                            gpObjects = []
                                            gWorldType = type
                                            goToFrame(type)
                                            checkOffsets()
                                            clickedUrl = 0
                                            sprite(99).visible = 1
                                            i = 2
                                            repeat while i <= the number of line in content
                                              ln = content.line[i]
                                              name = ln.word[1]
                                              objectClass = ln.word[2]
                                              if not objectClass contains "stair" and not objectClass contains "ignore" then
                                                locX = integer(ln.word[3])
                                                locY = integer(ln.word[4])
                                                locHeight = integer(ln.word[5])
                                                direction = void()
                                                dimensions = void()
                                                if the number of word in ln = 6 then
                                                  dir = integer(ln.word[6])
                                                  direction = [dir, dir, dir]
                                                else
                                                  width = integer(ln.word[6])
                                                  height = integer(ln.word[7])
                                                  locX = locX + width - 1
                                                  locY = locY + height - 1
                                                  dimensions = [width, height]
                                                end if
                                                createFuseObject(name, objectClass, "0,0,0", locX, locY, locHeight, direction, dimensions)
                                                if rollover(2) and the mouseDown and clickedUrl <> 1 then
                                                  clickedUrl = 1
                                                  sendSprite(2, #mouseDown)
                                                end if
                                              end if
                                              if i mod 10 = 0 then
                                                sendFuseMsg("STATUSOK")
                                              end if
                                              i = 1 + i
                                            end repeat
                                            if getmemnum(gWorldType & ".firstAction") > 0 then
                                              sendFuseMsg(field(0))
                                            end if
                                            updateStage()
                                            sendEPFuseMsg("GETADFORME general")
                                          else
                                            handleSpecialMessages(content)
                                          end if
                                        end if
                                      end if
                                    end if
                                  end if
                                end if
                              end if
                            end if
                          end if
                        end if
                      end if
                    end if
                  end if
                end if
              end if
            end if
          end if
        end if
      end if
      exit
    end
    Code:
    on handleSpecialMessages(Data)
      ln1 = Data.line[1]
      Data = doSpecialCharConversion(Data)
      if ln1 contains "OPEN_UIMAKOPPI" then
        openUimakoppi()
      else
        if ln1 contains "CLOSE_UIMAKOPPI" then
          closeUimaKoppi()
        else
          if ln1 contains "PH_TICKETS_BUY" then
            put(Data)
            member("JumpTICKETS").text = Data.getPropRef(#line, 2).getProp(#word, 1)
            if the movieName contains "pellehyppy" then
              openHyppylippu()
            end if
          else
            if ln1 contains "PH_TICKETS" then
              put(Data)
              member("JumpTICKETS").text = ln1.getProp(#word, 2)
            else
              if ln1 contains "PH_NOTICKETS" then
                if the movieName contains "pellehyppy" then
                  openHyppylippu()
                end if
              else
                if ln1 contains "JUMPDATA" then
                  goJumper = void()
                  gPellePlayer = void()
                  sprite(40).undefined = []
                  if the frameLabel contains "jumpingplace" then
                    gPellePlayer = new(script("PellePlayerParent"), Data.getProp(#line, 2), Data.getProp(#line, 3))
                    go("jumpplay")
                  else
                    if the frameLabel contains "pool_b" then
                      gPellePlayer = new(script("PellePlayerParent"), Data.getProp(#line, 2), Data.getProp(#line, 3))
                    end if
                  end if
                else
                  if ln1 contains "JUMPLIFTDOOR_OPEN" then
                    sendSprite(gElevatorDoorSprite, #open)
                  else
                    if ln1 contains "JUMPLIFTDOOR_CLOSE" then
                      sendSprite(gElevatorDoorSprite, #close)
                    else
                      if ln1 contains "JUMPINGPLACE_OK" then
                        go("jumpingplace")
                      else
                        if ln1 contains "FLAT_RESULTS" then
                          s1 = ""
                          s2 = ""
                          s3 = ""
                          s4 = ""
                          oldDelim = the itemDelimiter
                          if ln1 contains "BUSY" then
                            member("flat_results.description").text = AddTextToField("MostPopularRooms")
                          else
                            if ln1 contains "FAVORITE" then
                              member("flat_results.description").text = AddTextToField("FavoriteRooms")
                            else
                              member("flat_results.description").text = AddTextToField("SearchResults")
                            end if
                          end if
                          member("flat_results.doorstatus").text = ""
                          member("flat_results.names").text = ""
                          member("flat_results.load").text = ""
                          member("flats_go").text = ""
                          gFlats = []
                          the itemDelimiter = "/"
                          i = 2
                          repeat while i <= the number of line in Data
                            flat = Data.line[i]
                            if flat.length > 1 then
                              ownerName = flat.item[3]
                              if ownerName = "-" then
                                ownerName = ""
                              else
                                ownerName = "(" & ownerName & ")"
                              end if
                              doorMode = flat.item[4]
                              if doorMode = "open" then
                              else
                                if doorMode = "password" then
                                  if the platform contains "mac" then
                                  else
                                  end if
                                else
                                  if the platform contains "mac" then
                                  else
                                  end if
                                end if
                              end if
                              add(gFlats, [Data.line[i]])
                            end if
                            i = 1 + i
                          end repeat
                          the itemDelimiter = oldDelim
                          member("flat_results.load").text = s1
                          member("flat_results.names").text = s2
                          member("flat_results.doorstatus").text = s3
                          member("flats_go").text = s4
                        else
                          if ln1 contains "NOFLATS" then
                            put(Data)
                            if not the movieName contains "entry" then
                              return()
                            end if
                            member("flat_results.doorstatus").text = ""
                            member("flat_results.names").text = ""
                            member("flat_results.load").text = ""
                            member("flats_go").text = ""
                            gFlats = []
                          else
                            if ln1 contains "FLATINFO" then
                              p = keyValueToPropList(Data, "\r")
                              if voidp(gProps) then
                                gProps = []
                              end if
                              put(gProps)
                              setaProp(gProps, #doorMode, symbol(getaProp(p, "doormode")))
                              setaProp(gProps, #showOwnerName, getaProp(p, "showOwnerName") = "true")
                              setaProp(gProps, #superuser, getaProp(p, "allsuperuser") = "true")
                              sFrame = "roominfochange"
                              goContext(sFrame, gPopUpContext2)
                            else
                              if ln1 contains "YOUAREOWNER" then
                                gIAmOwner = 1
                              else
                                if ln1 contains "FLAT_LETIN" then
                                  if the movieName contains "entry" then
                                    member("flat_load.status").text = AddTextToField("DoorOpenLoading")
                                  end if
                                  if gChosenFlatDoorMode = "closed" then
                                    goContext("flat_locked_opens", gPopUpContext2)
                                  end if
                                  if gChosenFlatDoorMode = "x" then
                                    goContext("flat_password_ok", gPopUpContext2)
                                  end if
                                  updateStage()
                                  gIAmOwner = 0
                                  gFlatLetIn = 1
                                  member("loading_txt").text = AddTextToField("LoadingRoom")
                                  setBanner()
                                  hiliter = 0
                                  NowinUnit = "Private Room:" && member("goingto_roomname").text
                                  member(getmemnum("room.info")).text = AddTextToField("Room") && member("goingto_roomname").text & "\r" & AddTextToField("Owner") && gChosenFlatOwner
                                  startLoading()
                                  goContext("FLAT_LOADING", gPopUpContext2)
                                else
                                  if ln1 contains "DOORBELL_RINGING" then
                                    openRingbellAlert(Data.line[2])
                                  else
                                    if ln1 contains "FLATPROPERTY" then
                                      ln2 = Data.line[2]
                                      oldDelim = the itemDelimiter
                                      the itemDelimiter = "/"
                                      parType = ln2.item[1]
                                      parValue = ln2.item[2]
                                      the itemDelimiter = oldDelim
                                      put(parType, parValue)
                                      if parType = "wallpaper" then
                                        setWallPaper(integer(parValue))
                                      else
                                        if parType = "floor" then
                                          setFloor(integer(parValue))
                                        end if
                                      end if
                                    else
                                      if ln1 contains "STUFFTYPES" then
                                        s = ""
                                        oldDelim = the itemDelimiter
                                        the itemDelimiter = "/"
                                        gpStuffTypes = []
                                        i = 2
                                        repeat while i <= the number of line in Data
                                          ln = Data.line[i]
                                          addProp(gpStuffTypes, ln.item[2], [ln.item[1], ln.item[4], ln.item[5], 0])
                                          i = 1 + i
                                        end repeat
                                        the itemDelimiter = oldDelim
                                      else
                                        if ln1 contains "ACTIVE_OBJECTS" or ln1 contains "ACTIVEOBJECT_ADD" then
                                          i = 2
                                          repeat while i <= the number of line in Data
                                            ln = Data.line[i]
                                            if ln.length > 4 then
                                              createActiveObject(ln)
                                            end if
                                            i = 1 + i
                                          end repeat
                                        else
                                          if ln1 contains "STUFFDATAUPDATE" then
                                            tSaveDelim = the itemDelimiter
                                            the itemDelimiter = "/"
                                            tid = Data.getPropRef(#line, 2).getProp(#item, 1)
                                            ttype = Data.getPropRef(#line, 2).getProp(#item, 2)
                                            tProp = Data.getPropRef(#line, 2).getProp(#item, 3)
                                            tValue = Data.getPropRef(#line, 2).getProp(#item, 4)
                                            the itemDelimiter = tSaveDelim
                                            tObj = sprite(getaProp(gpObjects, ttype & tid)).getProp(#scriptInstanceList, 1)
                                            tObj.updateStuffdata(tProp, tValue)
                                          else
                                            if ln1 contains "ACTIVEOBJECT_UPDATE" then
                                              oldDelim = the itemDelimiter
                                              the itemDelimiter = ","
                                              objectName = Data.word[1].item[1]
                                              if offset("*", objectName) > 0 then
                                                objectName = objectName.char[1..offset("*", objectName) - 1] & objectName.char[offset("*", objectName) + 2..objectName.length]
                                              end if
                                              spr = getaProp(gpObjects, objectName)
                                              if spr > 0 then
                                                sendSprite(spr, #die)
                                              end if
                                              createActiveObject(Data.line[2], 1)
                                              the itemDelimiter = oldDelim
                                              gChosenStuffSprite = getObjectSprite(objectName)
                                            else
                                              if ln1 contains "ACTIVEOBJECT_REMOVE" then
                                                objectName = Data.line[2]
                                                if offset("*", objectName) > 0 then
                                                  objectName = objectName.char[1..offset("*", objectName) - 1] & objectName.char[offset("*", objectName) + 2..objectName.length]
                                                end if
                                                put("rem:", objectName)
                                                spr = getaProp(gpObjects, objectName)
                                                if spr > 0 then
                                                  sendSprite(spr, #die)
                                                end if
                                              else
                                                if ln1 contains "ITEMMSG" then
                                                  itemId = integer(ln1.word[2])
                                                  o = getaProp(gpInteractiveItems, itemId)
                                                  if objectp(o) then
                                                    processItemMessage(o, Data)
                                                  end if
                                                else
                                                  if ln1 contains "OPEN_GAMEBOARD" then
                                                    openGameBoard(Data.line[2..the number of line in Data])
                                                  else
                                                    if ln1 contains "CLOSE_GAMEBOARD" then
                                                      closeGameBoard(Data.line[2..the number of line in Data])
                                                    else
                                                      if ln1 contains "STRIPUPDATED" or ln1 contains "ADDSTRIPITEM" then
                                                        if not the movieName contains "private" then
                                                          exit
                                                        end if
                                                        sendFuseMsg("GETSTRIP new")
                                                        gChosenStripLevel = "new"
                                                      else
                                                        if ln1 contains "TRADE_ITEMS" then
                                                          if not objectp(gTraderWindow) then
                                                            gConfirmPopUp = new(script("PopUp Context Class"), 2000000000, 871, 887, point(0, 0))
                                                            displayFrame(gConfirmPopUp, "tradeItem_dialog")
                                                            sprite(882).initTrade()
                                                            sendFuseMsg("GETSTRIP new")
                                                          end if
                                                          if objectp(gTraderWindow) then
                                                            if gTraderWindow.pClosing then
                                                              sprite(882).initTrade()
                                                              sendFuseMsg("GETSTRIP new")
                                                            else
                                                              tradeItems(gTraderWindow, Data)
                                                            end if
                                                          end if
                                                        else
                                                          if ln1 contains "TRADE_ACCEPT" then
                                                            if objectp(gTraderWindow) then
                                                              tradeAccept(gTraderWindow, Data)
                                                            end if
                                                          else
                                                            if ln1 contains "TRADE_CLOSE" then
                                                              if objectp(gTraderWindow) then
                                                                tradeClose(gTraderWindow, Data)
                                                              end if
                                                            else
                                                              if ln1 contains "TRADE_COMPLETED" then
                                                                if objectp(gTraderWindow) then
                                                                  tradeCompleted(gTraderWindow, Data)
                                                                end if
                                                              else
                                                                if ln1 contains "CATALOGURL" then
                                                                  gWaitCatStart = the ticks
                                                                  loadCatalog(Data.line[2])
                                                                  gWaitCatalog = 1
                                                                else
                                                                  if ln1 contains "ITEMS" then
                                                                    handleAddItems(Data.line[2..the number of line in Data])
                                                                  else
                                                                    if ln1 contains "ADDITEM" then
                                                                      oldDelim = the itemDelimiter
                                                                      createItem(Data.line[2..the number of line in Data])
                                                                      the itemDelimiter = oldDelim
                                                                    else
                                                                      if ln1 contains "UPDATEITEM" then
                                                                        oldDelim = the itemDelimiter
                                                                        createItem(Data.line[2..the number of line in Data], 1)
                                                                        the itemDelimiter = oldDelim
                                                                      else
                                                                        if ln1 contains "STRIPINFO" then
                                                                          if goUserStrip = void() then
                                                                            goUserStrip = new(script("UserStrip Class"))
                                                                          end if
                                                                          handleStripData(goUserStrip, Data.line[2..the number of line in Data])
                                                                          if label(gWorldType & "_hand_open") > the frame then
                                                                            goToFrame(gWorldType & "_hand_open")
                                                                          else
                                                                            if label(gWorldType & "_hand_open") < the frame and label(gWorldType & "_hand_open_b") > the frame then
                                                                              goToFrame(gWorldType & "_hand_open_b")
                                                                            else
                                                                              prepareHandItems(goUserStrip)
                                                                            end if
                                                                          end if
                                                                        else
                                                                          if ln1 contains "FLATCREATED" then
                                                                            put("FLATCREATED")
                                                                            id = Data.word[1]
                                                                            gChosenFlatId = id
                                                                            gFloorHost = Data.word[2]
                                                                            gFloorPort = Data.word[3]
                                                                            if getmemnum("roomkiosk.roomname") > 0 then
                                                                              s = "roomkiosk.description" & field(0)
                                                                              s = "room_password" & field(0)
                                                                              s = s & "\r" & "allsuperuser=" & getaProp(gProps, #superuser)
                                                                              sendEPFuseMsg("SETFLATINFO /" & id & "/" & s)
                                                                              roomName = Data.line[3]
                                                                              if roomName.length < 2 then
                                                                                roomName = field(0)
                                                                              end if
                                                                              member("goingto_roomname").text = Data.line[3]
                                                                              NowinUnit = "Private Room:" && member("goingto_roomname").text
                                                                              member(getmemnum("room.info")).text = AddTextToField("Room") && member("goingto_roomname").text & "\r" & AddTextToField("Owner") && gMyName
                                                                              s = member("roomkiosk.confirmtext").text
                                                                              -- UNK_5A 21
                                                                              -- UNK_5A 21
                                                                              member("roomkiosk.confirmtext").text = s
                                                                              goContext("confirm")
                                                                            end if
                                                                          else
                                                                            if ln1 contains "ALLUNITS" then
                                                                              UnitsIDNum = 0
                                                                              the itemDelimiter = ","
                                                                              gUnits = []
                                                                              sort(gUnits)
                                                                              num = 1
                                                                              put(Data)
                                                                              i = 2
                                                                              repeat while i <= the number of line in Data
                                                                                unit = Data.line[i]
                                                                                if unit.length > 5 and not unit contains "Floor1" then
                                                                                  newUnit(unit, num)
                                                                                  num = num + 1
                                                                                else
                                                                                  if unit contains "Floor1" then
                                                                                    member("privaterooms.load").text = unit.item[2]
                                                                                  end if
                                                                                end if
                                                                                i = 1 + i
                                                                              end repeat
                                                                            else
                                                                              if ln1 contains "UNITUPDATED" then
                                                                                the itemDelimiter = ","
                                                                                unit = Data.line[2]
                                                                                name = unit.item[1]
                                                                                l = getaProp(gUnits, name)
                                                                                if name contains "Floor1" then
                                                                                  if the movieName contains "entry" then
                                                                                    member("privaterooms.load").text = unit.item[2]
                                                                                  end if
                                                                                else
                                                                                  if l = void() then
                                                                                    nothing()
                                                                                  else
                                                                                    num = l.getAt(5)
                                                                                    activeUsers = integer(unit.item[2])
                                                                                    maxUsers = integer(unit.item[3])
                                                                                    host = unit.item[4]
                                                                                    port = integer(unit.item[5])
                                                                                    description = unit.item[6]
                                                                                    UnitPropL = getaProp(gUnits, name)
                                                                                    UnitPropL.activeUsers = activeUsers
                                                                                    UnitPropL.maxUsers = maxUsers
                                                                                    UnitPropL.host = host
                                                                                    UnitPropL.port = port
                                                                                    UnitPropL.description = description
                                                                                    setProp(gUnits, name, UnitPropL)
                                                                                    if not name contains "Floor" then
                                                                                      setUnitActiveUsers(name)
                                                                                    else
                                                                                      member("privaterooms.load").text = unit.item[2]
                                                                                    end if
                                                                                  end if
                                                                                end if
                                                                              else
                                                                                if ln1 contains "UNITMEMBERS" then
                                                                                  s = Data.line[2..the number of line in Data]
                                                                                  s2 = ""
                                                                                  i = 1
                                                                                  repeat while i <= the number of line in s
                                                                                    i = 1 + i
                                                                                  end repeat
                                                                                  if getmemnum("publicroom_peoplelist") > 0 then
                                                                                  end if
                                                                                  if the movieName contains "cr_entry" then
                                                                                    -- UNK_5A 22
                                                                                  end if
                                                                                else
                                                                                  if ln1 contains "REMOVEITEM" then
                                                                                    itemId = integer(Data.line[2])
                                                                                    sendAllSprites(#itemDie, itemId)
                                                                                  else
                                                                                    if ln1 contains "FLATINFO" then
                                                                                      the itemDelimiter = "="
                                                                                      i = 2
                                                                                      repeat while i <= the number of line in Data
                                                                                        ln = Data.line[i]
                                                                                        sfield = ln.item[1]
                                                                                        sdata = ln.item[2]
                                                                                        if getmemnum("flatinfoshow." & sfield) > 0 then
                                                                                          member("flatinfoshow." & sfield).text = sdata
                                                                                        end if
                                                                                        put(sfield, sdata)
                                                                                        if sfield = "image" then
                                                                                          pictureUrl = sdata
                                                                                          put(pictureUrl)
                                                                                        end if
                                                                                        if sfield = "isOpen" then
                                                                                          if sdata = "true" then
                                                                                            member("flatinfoshow.open_info").text = "Door is open"
                                                                                            sprite(20).visible = 1
                                                                                          else
                                                                                            member("flatinfoshow.open_info").text = "Door is closed"
                                                                                            sprite(20).visible = 0
                                                                                          end if
                                                                                        end if
                                                                                        if sfield = "host" then
                                                                                          gFloorHost = sdata.char[offset("/", sdata) + 1..sdata.length]
                                                                                        end if
                                                                                        if sfield = "port" then
                                                                                          gFloorPort = sdata
                                                                                        end if
                                                                                        i = 1 + i
                                                                                      end repeat
                                                                                      the itemDelimiter = ","
                                                                                    else
                                                                                      if ln1 contains "ADVERTISEMENT" then
                                                                                        put("GOT AD", Data)
                                                                                        gAd = new(script("FUSE Advertisement Class"), Data.line[2..the number of line in Data])
                                                                                      else
                                                                                        if ln1 contains "OPLOGO" then
                                                                                          handleOpLogoMessage(Data)
                                                                                        else
                                                                                          if ln1 contains "SYSTEMBROADCAST" then
                                                                                            ShowAlert("MessageFromAdmin", Data.line[2])
                                                                                          else
                                                                                            if ln1 contains "PURCHASE_NOBALANCE" then
                                                                                              ShowAlert("nobalance", "You don't have enough credits!")
                                                                                            else
                                                                                              if ln1 contains "PURCHASE_OK" then
                                                                                                ShowAlert("BuyingOK")
                                                                                              else
                                                                                                if ln1 contains "PURCHASE_ERROR" then
                                                                                                  ShowAlert("purchasingerror", "Purchasing error")
                                                                                                else
                                                                                                  if ln1 contains "ORDERINFO_ERROR" then
                                                                                                    put(Data)
                                                                                                  else
                                                                                                    if ln1 contains "ORDERINFO" then
                                                                                                      gPurchaseCode = Data.line[2]
                                                                                                      price = integer(value(Data.line[3]))
                                                                                                      description = Data.line[5]
                                                                                                      gConfirmPopUp = new(script("PopUp Context Class"), 2000020000, 851, 870, point(0, 0))
                                                                                                      if price > gCredits then
                                                                                                        displayFrame(gConfirmPopUp, "purchase_confirm_nocredits")
                                                                                                      else
                                                                                                        displayFrame(gConfirmPopUp, "purchase_confirm")
                                                                                                      end if
                                                                                                    else
                                                                                                      if ln1 contains "WALLETBALANCE" then
                                                                                                        if the movieName contains "entry" and the frame < 100 or the movieName contains "cr_entry" then
                                                                                                          nothing()
                                                                                                        else
                                                                                                          puppetSound(1, "cash1")
                                                                                                        end if
                                                                                                        gCredits = integer(value(Data.line[2]))
                                                                                                        member("habbo_credits").text = integer(value(Data.line[2])) && AddTextToField("Credit(s)")
                                                                                                        member("credits_amount_e").text = "You have" && integer(value(Data.line[2])) && "Habbo Credits in your purse."
                                                                                                      else
                                                                                                        if ln1 contains "DOORFLAT" then
                                                                                                          gChosenTeleport.startTeleport(Data)
                                                                                                        else
                                                                                                          if ln1 contains "DOORNOTINSTALLED" then
                                                                                                            gChosenTeleport.error(Data)
                                                                                                          else
                                                                                                            if ln1 contains "DOORDELETED" then
                                                                                                              gChosenTeleport.error(Data)
                                                                                                            end if
                                                                                                          end if
                                                                                                        end if
                                                                                                      end if
                                                                                                    end if
                                                                                                  end if
                                                                                                end if
                                                                                              end if
                                                                                            end if
                                                                                          end if
                                                                                        end if
                                                                                      end if
                                                                                    end if
                                                                                  end if
                                                                                end if
                                                                              end if
                                                                            end if
                                                                          end if
                                                                        end if
                                                                      end if
                                                                    end if
                                                                  end if
                                                                end if
                                                              end if
                                                            end if
                                                          end if
                                                        end if
                                                      end if
                                                    end if
                                                  end if
                                                end if
                                              end if
                                            end if
                                          end if
                                        end if
                                      end if
                                    end if
                                  end if
                                end if
                              end if
                            end if
                          end if
                        end if
                      end if
                    end if
                  end if
                end if
              end if
            end if
          end if
        end if
      end if
      exit
    end
    Code:
    on createPoster(me)
      if leftOrRight contains "left" then
        s = "PLACEITEMFROMSTRIP" && pID && "leftwall " & y & "," & h & "," & myLocZ & "/" & pType
      else
        s = "PLACEITEMFROMSTRIP" && pID && "frontwall " & y & "," & h & "," & myLocZ & "/" & pType
      end if
      sendFuseMsg(s)
      s = "GETSTRIP" && "new"
      sendFuseMsg(s)
      exit
    end
    Code:
    on reserveRoom()
      if getaProp(gProps, #showOwnerName) = 0 then
        showName = 0
      else
        showName = 1
      end if
      put(field(0) & ":" && gProps)
      fuseP = "roomkiosk.roomname" & field(0) & "/" & getaProp(gProps, #roomModel) & "/" & string(getaProp(gProps, #doorMode)) & "/" & showName
      sendEPFuseMsg("CREATEFLAT /" & fuseP)
      exit
    end
    
    on updateFlatInfo()
      if getaProp(gProps, #showOwnerName) = 0 then
        showName = 0
      else
        showName = 1
      end if
      fuseP = "navigator.roomname" & field(0)
      fuseP = fuseP & "/" & string(getaProp(gProps, #doorMode))
      fuseP = fuseP & "/" & showName
      sendEPFuseMsg("UPDATEFLAT /" & fuseP)
      s = "navigator.description" & field(0)
      s = "roompassword" & field(0)
      s = s & "\r" & "allsuperuser=" & getaProp(gProps, #superuser)
      s = s & "\r" & "wordfilter_disable=" & getaProp(gProps, #wordfilter_disable)
      put(s)
      sendEPFuseMsg("SETFLATINFO /" & gChosenFlatId & "/" & s)
      exit
    end
    Latest cracked SWF releases: swfhub.com
    Also includes header dumps for easy header updating, and various other game files.

  4. #4
    Veteran Glaceon is offline
    SubscriberRank
    Oct 2012 Join Date
    The NetherlandsLocation
    2,205Posts

    Re: Habbo V1 CSTs w/ Bytecode

    I don't really get how we can convert such weird code to actual Lingo. I do find this interesting. Now my question is, is the method used to unpack this from the V``1 DCRs able to do the same with V7 for example? Also, can we edit the files currently and convert them back into .cct/.dcr?

    Good release nonetheless.
    https://aurora-dev.com/ - https://worldofmrjosh.com

    No matter how much you fall down, you can always reach your destination by standing up again.

  5. #5
    Hackerman Quackster is online now
    ModeratorRank
    Dec 2010 Join Date
    AustraliaLocation
    3,089Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by Glaceon View Post
    I don't really get how we can convert such weird code to actual Lingo. I do find this interesting. Now my question is, is the method used to unpack this from the V``1 DCRs able to do the same with V7 for example? Also, can we edit the files currently and convert them back into .cct/.dcr?

    Good release nonetheless.
    The person who converted the CCT to CST while still maintaining bytecode is a complete mystery. No one publically knows what this person did.

    It's very possible to decompile DCR's back into bytecode (by first turning it into a .dir which is easy) but not .cct to .cst without destroying the scripts.
    Latest cracked SWF releases: swfhub.com
    Also includes header dumps for easy header updating, and various other game files.

  6. #6
    Ask me about Daoism FullmetalPride is offline
    Alpha MaleRank
    Nov 2010 Join Date
    2,180Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by Quackster View Post
    The person who converted the CCT to CST while still maintaining bytecode is a complete mystery. No one publically knows what this person did.

    It's very possible to decompile DCR's back into bytecode (by first turning it into a .dir which is easy) but not .cct to .cst without destroying the scripts.
    Yeah and no offense to anyone.. but I answered these questions in the OP

    AND AGAIN I SAY: SO WHAT? We can't do SHIT with bytecode.
    Up until a few weeks ago, this would be the appropriate, annoyed question to ask.

    But a GitHub project (PM me for the name; the developers do not want to draw too much attention, and Sulake prowls this board like the animals their employees are) has been performing strong work to unpack the Lingo bytecode and guess the Lingo scripts. It does a really good job of this, and I've seen DIRs and CSTs be completely read in full from other games.

    How 2 get moar unprotected CSTs? V5? V18? R26?
    Not sure. A lot of these came from @Cecer's generous donations, so he may have a clue. But there are some reverse-engineering wizards among us, who secretly practice their magic on Shockwave files, whose names I shall not utter here (lurk moar )
    But no worries. Because that next question is important to answer, eventually, because the work can be replicated on further files and later versions.

  7. #7
    Death from above! The General is offline
    The OmegaRank
    Aug 2011 Join Date
    8,816Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Pretty safe to post the github ptoject if it isnt about Habbo or other Sulake IP.

    Plenty of emulator repos out there that have never been taken down.
    If you are using Arcturus, contact me
    Skype: wesley.jabbo
    Discord: TheGeneral#0063

  8. #8
    Hackerman Quackster is online now
    ModeratorRank
    Dec 2010 Join Date
    AustraliaLocation
    3,089Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by The General View Post
    Pretty safe to post the github ptoject if it isnt about Habbo or other Sulake IP.

    Plenty of emulator repos out there that have never been taken down.
    I'm going to do it because I agree with you.

    Here it is:
    https://github.com/Brian151/OpenShockwave

    Here's the tool that allows you turn Shockwave bytecode back into readable Lingo (found in the GitHub project):
    ProjectorRays

    We are so close to fully decompiling Shockwave files. People told me it was impossible, just like PS3 emulation, yet here we are today (see RPCS3).
    Latest cracked SWF releases: swfhub.com
    Also includes header dumps for easy header updating, and various other game files.

  9. #9
    Ask me about Daoism FullmetalPride is offline
    Alpha MaleRank
    Nov 2010 Join Date
    2,180Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Updating the post to add the link to the project. I know Sulake isn't directly affected by the project's existence, but if they have a compelling interest in proprietary secrecy, they may raise the alarm to Adobe.

    I'm not sure. But I'm cautious about disclosing the project's name. That said, maybe they can recruit a few contributors from this section.

  10. #10
    Death from above! The General is offline
    The OmegaRank
    Aug 2011 Join Date
    8,816Posts

    Re: Habbo V1 CSTs w/ Bytecode

    I'm not worried about sulake. More worried about Adobe taking down that repository.
    If you are using Arcturus, contact me
    Skype: wesley.jabbo
    Discord: TheGeneral#0063

  11. #11
    Veteran Glaceon is offline
    SubscriberRank
    Oct 2012 Join Date
    The NetherlandsLocation
    2,205Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by The General View Post
    I'm not worried about sulake. More worried about Adobe taking down that repository.
    It'd be stupid; shockwave is so old and outdated so it would be stupid if they'd still take it down.
    https://aurora-dev.com/ - https://worldofmrjosh.com

    No matter how much you fall down, you can always reach your destination by standing up again.

  12. #12
    Ask me about Daoism FullmetalPride is offline
    Alpha MaleRank
    Nov 2010 Join Date
    2,180Posts

    Re: Habbo V1 CSTs w/ Bytecode

    I'm neither concerned for the safety of the project from Sulake nor Adobe. If it were my project, I wouldn't be.

    But it's not my project, and the developers have expressed anxiety about C&D's for Shockwave games on certain Lego archives. And seeing as they're using a specific Lego game, Spybotics: The Nightfall Incident (great game, by the way) for most of their work, I felt it wouldn't be respectful to draw a swarm of unnecessary, more public attention to it. I thought, perhaps this would create some anxiety in the developers, who are knowingly and actively exploring a specific piece of intellectual property.

    A wise member of this forum, one whose superior judgement I regularly choose to defer to, has previously advised me that he and the other Shockwave reverse-engineers in this forum choose to be quiet about their work. That's why I haven't called out any specific reverse engineers, as helpful as their unique expertise might be.

    That said. I have updated the original post to reflect the community's general interest in knowing the identity of the project, and the ability to make use of it.

  13. #13
    Veteran Glaceon is offline
    SubscriberRank
    Oct 2012 Join Date
    The NetherlandsLocation
    2,205Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Doesn't seem to work with V5:

    PHP Code:
    C:\Users\Josh\Documents\Blah\blahos\tools>python cst_python.py "fuse_client.cct"

    RIFX_SIGNXFIR
    SIZE
    83319 (81kb)
    SIGNb'CDGF'
    File num1853772146


    --- READ POINTERS ---
    Traceback (most recent call last):
      
    File "cst_python.py"line 901in <module>
        
    main(sys.argv[1:])
      
    File "cst_python.py"line 881in main
        readCST
    (f)
      
    File "cst_python.py"line 242in readCST
        entryType 
    f.read(4).decode("utf-8")[::-1# 4
    UnicodeDecodeError'utf-8' codec can't decode byte 0xa6 in position 1: invalid
    start byte 
    Or I'm doing something wrong?
    https://aurora-dev.com/ - https://worldofmrjosh.com

    No matter how much you fall down, you can always reach your destination by standing up again.

  14. #14
    Death from above! The General is offline
    The OmegaRank
    Aug 2011 Join Date
    8,816Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by Glaceon View Post
    It'd be stupid; shockwave is so old and outdated so it would be stupid if they'd still take it down.
    Doesn't matter. Shockwave is still Adobes' IP. Regardless of it being outdated or not.

    Quote Originally Posted by FullmetalPride View Post
    A wise member of this forum, one whose superior judgement I regularly choose to defer to, has previously advised me that he and the other Shockwave reverse-engineers in this forum choose to be quiet about their work. That's why I haven't called out any specific reverse engineers, as helpful as their unique expertise might be.
    If they wanted to hide it they wouldn't have put it in a publicly available repository.
    If you are using Arcturus, contact me
    Skype: wesley.jabbo
    Discord: TheGeneral#0063

  15. #15
    Hackerman Quackster is online now
    ModeratorRank
    Dec 2010 Join Date
    AustraliaLocation
    3,089Posts

    Re: Habbo V1 CSTs w/ Bytecode

    Quote Originally Posted by Glaceon View Post
    Doesn't seem to work with V5:

    PHP Code:
    C:\Users\Josh\Documents\Blah\blahos\tools>python cst_python.py "fuse_client.cct"

    RIFX_SIGNXFIR
    SIZE
    83319 (81kb)
    SIGNb'CDGF'
    File num1853772146


    --- READ POINTERS ---
    Traceback (most recent call last):
      
    File "cst_python.py"line 901in <module>
        
    main(sys.argv[1:])
      
    File "cst_python.py"line 881in main
        readCST
    (f)
      
    File "cst_python.py"line 242in readCST
        entryType 
    f.read(4).decode("utf-8")[::-1# 4
    UnicodeDecodeError'utf-8' codec can't decode byte 0xa6 in position 1: invalid
    start byte 
    Or I'm doing something wrong?
    You're trying to read a .cct when the function calls for a CST file?
    Latest cracked SWF releases: swfhub.com
    Also includes header dumps for easy header updating, and various other game files.




Page 1 of 2 12 LastLast

Advertisement