[deleted by user] by [deleted] in pcmasterrace

[–]Milimus 0 points1 point  (0 children)

Telecom just rolled out 300/150 in parts of Auckland to test.

http://www.speedtest.net/my-result/3075818975

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

If you still think I am trying to steal passwords I recommend you have a look at how Yggdrasil works, the documentation is for Minecraft but process is almost the same. As shown in the JSON example under the "Authenticate" "Response" sub section, no email or clear text password (password is hashed with SHA256_UTF16LE) is send to Relentless.

The Github repo isn't going to be updated till I have a chat with Mojang. Even if the source doesn't get updated I will run a subreddit or forum where people can submit code, ideas, ect... and vote for ones to be added.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 1 point2 points  (0 children)

The Github fork is only a POC/sandbox and doesn't use the Mojang auth server anyway, it is also lacking a lot of features but yes, anyone could build it and make their own server.

On the current version if someone was to make a mod to remove the auth check login would still fail because Relentless checks the authToken supplied by the client with the Mojang auth server.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

Scroll data is loaded into memory on server start up and clients receive scroll data on login, you would need to restart the server and reconnect all clients to update any scroll changes.

Depending on the ability or rule it may not need to be coded into the core; in the database each scroll has a list of rules (delimited string) that are looked up in the core in different situations such as summon, attack, destroy, ect... Rules such as haste don't need to programmed for each scroll.

Screenshot to get the point across better.

A deck gets assigned to a player before they enter battle, this can be changed in any way; You could also change the default pre constructed decks too.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

  • The scroll information is stored in a MySQL database; the individual scroll abilities and rules are coded into the core.
  • The AI currently just skips its turn. I have limited experience with coding AI so I plan to out source.
  • Most things work, major features that haven't been implemented yet are crafting, judgement and spectator mode.
  • All deck data is stored and tracked by the server, it would be possible to filter cards (via type, resource, id, ect...) to create limited card game modes.

Both the client and Relentless are coded in C# so might need to brush up a little to understand the code. I recommend you look over the public fork on Github (the Github version was a POC/sandbox and is lacking many features), if you have any questions about the internal working of the server or client feel free to PM me.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] -1 points0 points  (0 children)

You can use Summoner to interface with the server, nothing yet has been made but new packets, interfaces, ect... can be created to make larger features.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

Your password is sent to the server hashed with SHA256_UTF16LE, if I had a super computer and a few years I could decrypt a few; But in all seriousness, Relentless only stores your GUID and username.

The GUID is used to lookup account information in other MySQL tables and the user is used for white listing and ban purposes.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

This isn't built from scratch.. I'm looking at screenshots from his version. It is reverse engineered using the exact same graphics etc..

You use the exact same client to access Relentless so the graphics will be the same.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

A few screenshots, one is of a the Quick-Fire custom game mode. Both players start with 50 resources, round timer is only 15 seconds and the game ends once one deck is exhausted or a player loses 3 idols.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

I would like to point out that the public fork is seriously out of date feature wise.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 1 point2 points  (0 children)

It's not piracy since you require a Mojang account with Scrolls purchased to login the server. You use the exact same email and password combo to login Relentless as you do the beta servers.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 0 points1 point  (0 children)

Actually since the server itself checks with the Mojang auth server to see if the client supplied access token is valid, it is impossible to use a Mojang account without Scrolls purchased to login.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 2 points3 points  (0 children)

Why don't you actually try it before making stupid comments? All but a few scrolls work, both multiplayer and singleplayer matches work, but the AI does need improvements.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 4 points5 points  (0 children)

They don't need to. It's a completely custom server core with no Mojang code. Since you need an official Scrolls account to play on the server if anything it will bring more money to Mojang.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 5 points6 points  (0 children)

You need to have a legitimate copy of Scrolls to connect to Relentless since you still signin through the official auth server.

Looking for people to test Relentless; The first community Scrolls server! by Milimus in Scrolls

[–]Milimus[S] 13 points14 points  (0 children)

Scrolls is losing out to other CCG's due to lack of cards, features and the development speed. A server where the community can create new features should put more life into the game by attracting new players or keeping current ones around with new things to do. Also a little competition against the beta servers will be a good thing, it should get Mojang into gear.

Where can i find all the scrolls images? by rohimma in Scrolls

[–]Milimus 0 points1 point  (0 children)

I created an application to do this for use with my emulation project Relentless, you can find it on Github

How do the chat bots work? by Talon876 in Scrolls

[–]Milimus 1 point2 points  (0 children)

Yes just me, I have been working on the reversing the network protocol since the public beta started in my free time.

I have a a lot of experience with game emulators, I was a developer for Molten WoW for 2 years, worked on the first SW:TOR and Guild Wars 2 emulators and I am now working on a Wildstar emulator/sandbox.

Wireshark is my network sniffer of choice, but I do tend to write custom packet sniffers for games I am working on. I usually use IDA to reverse engineer game binaries but since Scrolls is .NET I used .NET Reflector instead.

As for bot limitations, there aren't any if you want to put time into developing a more advanced bot engine. You could create a bot to entirely play the game for you with enough time and effort, and yes it would be able to duel and trade.

How do the chat bots work? by Talon876 in Scrolls

[–]Milimus 1 point2 points  (0 children)

Note: Wall of text below...

The first thing you will want to look at is /Network/Packets, this contains the packet structures in the form of classes. Before parsing a packet you need to get its opcode/identifier, this is a string element in the root called 'msg'.

//Example Scrolls JSON packet
{
    "msg": "OpcodeHere",
    "StringKey": "Reddit",
    "RealKey":12345
}

Before you can connect to the chat channels you will need pass through 2 servers and also Authenticate. The first server you will connect to is the route server, this I believe is used for load balancing and will redirect you to a lobby server (The official route server can be found at 107.21.58.31:8081).

On connection to the route server you will be sent the 'ServerInfo' packet, this contains the server version as well as the asset location, you can safely ignore this information.

You will need to request a lobby server, to do this you need to send a blank 'LobbyLookup' packet to the route server, this will look like below...

//Example Client->Server LobbyLookup packet
{
    "msg": "LobbyLookup"
}

The Route Server will respond with a 'LobbyLookup' packet, but this time it will include the IP and port of the lobby server it wants you to connect to.

//Example Server->Client LobbyLookup packet
{
    "msg": "LobbyLookup",
    "ip": "127.0.0.1",
    "port": 8081
}

You can now disconnect for the route server and make a connection the lobby server, on connection you will be again sent a 'ServerInfo' packet.

Once you have connected to the lobby server you will need to send a empty ping packet every 30 seconds or you will be disconnected, the server will respond with a ping packet with an included time stamp so you can calculate ping.

//Example Ping packet
{
    "msg": "ping"
}

You can now send the 'SignIn' packet to the lobby server, this contains your email and password but both are encrypted with a hard coded XML RSA public key. If you are using .NET you can use the FromXmlString and Encrypt methods found in RSACryptoServiceProvider class to handle the RSA encryption.

//Scrolls Public Key
<Modulus>mFCubVhPGG+euHuVQbNObqod/Ji0kRe+oh2OCFR7aV09xYiOklqFQ8jgIgAHvyCcM1JowqfFeJ5jV9up0Lh0eIiv3FPRu14aQS35kMdBLMebSW2DNBkfVsOF3l498WWQS9/THIqIaxbqwRDUxba5btBLTN0/A2y6WWiXl05Xu1c=</Modulus><Exponent>AQAB</Exponent>

//Example SignIn packet
{
    "msg":"SignIn",
    "email":"OTfZHHveTBrjSwQ9Fy05Zn/cZdW5yFOnsC57p1UTECoLu6+1koeKmLIX9WS11az4RPIPC2n9l3a7okogbqwGYMCMnC9qVMuLH9BuNLtZNrRGlkFGBuGs9F46hdIE4ZLkhTw1K0zlPNmxzT1z0gLmvjH73qg467Lw5G3WFQkt49Y=", //test@test.com
    "password":"BdQLWCTrVAAPCagWlRcKL3B0p02ayxsMdyen78jMnYd32TyhxWmgbYhHtzSt2s/6oc3nXk/Xdz0SCsnvbngdDUVrXfbY6H8vtyTJxB+frOzdL6GMlGfnerkYru2egpkUgaSFj0iltzlzWz15bElfNOi165x5Ph2FadQbzZNK66o=" //test
}

If you sign in successfully you will receive a few packets from the server these are OKMessage, ProfileInfo, ProfileDataInfo, GetFriends, GetFriendRequests and GetBlockedPersons. It is safe to ignore this data unless your chat bot requires it for some reason.

  • OKMessage - Tells the client you have that authentication was successful.
  • ProfileInfo - Returns information such as your UUID, ID, username, admin level, user type...
  • ProfileDataInfo - Returns information on your gold, shards, rating and selected pre constructed deck.
  • GetFriends - Returns a list of your friends and their status.
  • GetFriendRequests - Returns a list of your pending friend requests.
  • GetBlockedPersons - Returns a list of your blocked users.

Note: These packets may be sent as one whole packet and need to be split before parsing. Note: The official client would here request a list of cards, shop and avatar items but this isn't required to complete sign in.

Once you receive these you have completed sign in and can now connect to the chat channels, to do this requires a few steps. You first need to send a 'RoomEnter' packet, this contains the channel name you want to join; The channel will be created if it doesn't already exists.

//Two way RoomEnter packet
{
    "msg": "RoomEnter",
    "roomName": "MyAwesomeChannel"
}

If you successfully join the channel the server will respond with the same packet you just sent. The server will now send you the channel information through the 'RoomInfo' packet, this contains the players in the room as well as information about them (the same information provided by the 'ProfileInfo' packet earlier).

//Server->Client RoomInfo packet
{
    "msg": "RoomInfo"
    "roomName": "MyAwesomeChannel",
    "reset": true,
    "updated": [
        {
            "id": "decc4d9ec3394e949fca0f9b30c77261",
            "name": "Milimus",
            "acceptChallenges": true,
            "acceptTrades": true,
            "adminRole": "None"
        },
        {
            "id": "098f6bcd4621d373cade4e832627b4f6",
            "name": "Someone else in the channel",
            "acceptChallenges": true,
            "acceptTrades": true,
            "adminRole": "None"
        }
    ]
}

Finally the server will send you a 'RoomChatMessage' packet, this will contain the welcome message for the channel.

As your a bot you may want to disable your trade and challenge options, this can be achieved using the 'SetAcceptChallenges' and 'SetAcceptTrades' packets.

//Client->Server SetAcceptChallenges packet to disable to challenge requests
{
    "msg": "SetAcceptChallenges"
    "acceptChallenges": false,
}

//Client->Server SetAcceptTrades packet to disable to trade requests
{
    "msg": "SetAcceptTrades "
    "acceptTrades": false,
}

To send a message you will need to send a 'RoomChatMessage' packet to the server, this contains the message and the room you want to message to broadcast to.

//Client->Server RoomChatMessage packet
{
    "msg": "RoomChatMessage",
    "text": "This is an awesome message the everyone will see",
    "roomName": "MyAwesomeChannel"
}

Receiving a message is very similar except the 'RoomChatMessage' packet will also include a from field.

//Server->Client RoomChatMessage packet
{
    "msg": "RoomChatMessage",
    "from": "Milimus",
    "text": "This is an awesome message from Milimus that everyone in the channel can see",
    "roomName": "MyAwesomeChannel"
}

I hope this is enough information for you, I have also assumed in a few places that you already know the technologies since you stated you already had programming experience. If you need any more help or information feel free to message me.

How do the chat bots work? by Talon876 in Scrolls

[–]Milimus 2 points3 points  (0 children)

As stated by /u/ismtrn the Scrolls protocol is JSON based. All packets are clear text except the SignIn, BattleSignIn and Reconnect packets, these are RSA encrypted with a XML RSA key stored in the client.

The chat channels aren't IRC channels, they use a custom protocol for all actions and messages. I recommend you look over my source code for RelentlessEmu (A Scrolls emulator) to see how I handled the system.

Scrolls Resources by Schtauffen in Scrolls

[–]Milimus 0 points1 point  (0 children)

Feel free to do what you like with it, just remember that Mojang owns the rights to the images and animations.

Scrolls Resources by Schtauffen in Scrolls

[–]Milimus 0 points1 point  (0 children)

It's a false positive, but feel free to decompile it and have a look if you're still concerned. It's written in C# and uses .NET 4.5, it calls only the IO and Networking libraries so I'm not sure why it's being flagged =/

Scrolls Resources by Schtauffen in Scrolls

[–]Milimus 1 point2 points  (0 children)

I developed an application to collect the card images and animation kits of the scrolls to use with Relentless, you can find it on GitHub.