Revert "Merge branch 'master' into master"

This reverts commit 16561db1d6, reversing
changes made to c2710ada6b.
This commit is contained in:
Zeruth
2019-07-02 21:09:07 -04:00
parent 16561db1d6
commit 1754ade711
8 changed files with 287 additions and 174 deletions

View File

@@ -2,24 +2,31 @@
# RuneLitePlus-PS rev180 [![Build Status](https://travis-ci.org/zeruth/runeliteplus-ps.svg?branch=master)](https://travis-ci.org/zeruth/runeliteplus-ps) [![Discord](https://img.shields.io/discord/373382904769675265.svg)](https://discord.gg/HN5gf3m)
# RuneLitePlus
[![forthebadge](https://forthebadge.com/images/badges/built-by-developers.svg)](https://forthebadge.com)
[RuneLitePlus-PS](https://runelitepl.us) is a fork of [RuneLite](https://github.com/runelite/runelite) that provides more functionality and less restrictions while staying open source. This is a specific version meant for rs-mod which can be found here:
https://www.rune-server.ee/runescape-development/rs2-server/downloads/684206-180-rs-mod-release.html
[![Build Status](https://travis-ci.org/runelite-extended/runelite.svg?branch=master)](https://travis-ci.org/runelite-extended/runelite) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![HitCount](http://hits.dwyl.io/runelite-extended/runelite.svg)](http://hits.dwyl.io/runelite-extended/runelite) [![saythanks](https://img.shields.io/badge/say-thanks-32cd32.svg)](https://www.patreon.com/RuneLitePlus)
## Usage
By default, this connects to our sandbox server, which is for client testing.
[RuneLitePlus](https://runelitepl.us) is a extended version of [RuneLite](https://github.com/runelite/runelite) that provides more functionality and less restrictions while staying more open-source.
To setup your rsa keys, navigate to runelite-mixins and go to RSBufferMixin and set modulus and exponent
To setup your codebase, navigate to runelite-client/rs and go to RSAppletStub and set codebase = new URL("http://IP_OR_URL_HERE/");
After that it's ran much like RuneLite or RuneLitePlus, install then run RuneLite.main()
To release the built jar publicly, you'd have to host your injected client remotely and make some small modifications to rs.ClientLoader
## Discord
![[Discord]](https://discordapp.com/api/guilds/373382904769675265/widget.png?style=banner2)
## Project Layout
- [cache](cache/src/main/java/net/runelite/cache) - Libraries used for reading/writing cache files, as well as the data in it
- [http-api](http-api/src/main/java/net/runelite/http/api) - API for runelite and runeliteplus
- [http-service](http-service/src/main/java/net/runelite/http/service) - Service for https://api.runelitepl.us
- [runelite-api](runelite-api/src/main/java/net/runelite/api) - RuneLite API, interfaces for accessing the client
- [runelite-mixins](runelite-mixins/src/main/java/net/runelite) - Mixins which are injected into the vanilla client's classes
- [runescape-api](runescape-api/src/main/java/net/runelite) - Mappings correspond to these interfaces, runelite-api is a subset of this
- [runelite-client](runelite-client/src/main/java/net/runelite/client) - Game client with plugins
## License
RuneLitePlus-PS is licensed under the BSD 2-clause license. See the license header in the respective file to be sure.
RuneLitePlus is licensed under the BSD 2-clause license. See the license header in the respective file to be sure.
## Contribute and Develop

View File

@@ -49,7 +49,55 @@ public class XteaClient
public void submit(XteaRequest xteaRequest)
{
// Don't submit xteas from private server
String json = RuneLiteAPI.GSON.toJson(xteaRequest);
HttpUrl url = RuneLiteAPI.getPlusApiBase().newBuilder()
.addPathSegment("xtea")
.build();
logger.debug("Built URI: {}", url);
Request request = new Request.Builder()
.post(RequestBody.create(JSON, json))
.url(url)
.build();
try
{
try (Response response = RuneLiteAPI.RLP_CLIENT.newCall(request).execute())
{
logger.debug("xtea response " + response.code());
}
}
catch (IOException e)
{
e.printStackTrace();
}
RuneLiteAPI.RLP_CLIENT.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
logger.warn("unable to submit xtea keys", e);
}
@Override
public void onResponse(Call call, Response response)
{
try
{
if (!response.isSuccessful())
{
logger.debug("unsuccessful xtea response");
}
}
finally
{
response.close();
}
}
});
}
public List<XteaKey> get() throws IOException

View File

@@ -1,24 +0,0 @@
Created at Thu Jun 20 05:35:31 CDT 2019
codebase=http://oldschool6b.runescape.com/
mainclass=client.class
param=1=1
param=2=https://payments.jagex.com/operator/v1/
param=3=true
param=4=761
param=5=1
param=6=0
param=7=0
param=8=true
param=9=ElZAIrq5NpKN6D3mDdihco3oPeYN2KFy2DCquj7JMmECPmLrDP3Bnw
param=10=5
param=11=https://auth.jagex.com/
param=12=306
param=13=.runescape.com
param=14=0
param=15=0
param=16=false
param=17=http://www.runescape.com/g=oldscape/slr.ws?order=LPWM
param=18=
param=19=196515767263-1oo20deqm6edn7ujlihl6rpadk9drhva.apps.googleusercontent.com

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, Null (zeruth)
* Copyright (c) 2018, Tomas Slusny <slusnucky@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -22,32 +22,22 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.mixins;
package net.runelite.client.plugins.defaultworld;
import java.math.BigInteger;
import net.runelite.api.mixins.Copy;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.rs.api.RSBuffer;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
@Mixin(RSBuffer.class)
public abstract class RSBufferMixin implements RSBuffer
@ConfigGroup("defaultworld")
public interface DefaultWorldConfig extends Config
{
@Inject
private static BigInteger modulus = new BigInteger("10001", 16);
@Inject
private static BigInteger exponent = new BigInteger("bb5d826b249905895f4e463422dd339f8375ed5b212ac8890a97e4ab7dba0c5fe8188f44c00f8106e5721f615a8bcee2da7316ff1572cad5fbfd33f30985f0ae855cfd498483ecc0c3a01c8630f90cff1f54e75a44d58482c371e203e6eb7ba879fd65949aeef827a5e550429bd857d712f64351bc1162e1615ca6622a3bc9b8e31a96000fb0a01a12a51ca3e89918c06759d1db65c33dc6a074abec02f94466886d1a52e7d084aa88338aab1f25d58f9e03ed0a308c6c4eed139c1c1c818cd2370d8cd28ec34bce18360d1756e202eb733f998200242d71ce19548f23b03c1eac4d6e9892616ade1c66d2ce3ab69744e27d7099f3574bcd3d3e95e7a52180d9", 16);
@Copy("encryptRsa")
public void rs$encryptRsa(BigInteger var1, BigInteger var2)
@ConfigItem(
keyName = "defaultWorld",
name = "Default world",
description = "World to use as default one"
)
default int getWorld()
{
return 0;
}
@Replace("encryptRsa")
public void rl$encryptRsa(BigInteger var1, BigInteger var2)
{
rs$encryptRsa(modulus, exponent);
}
}
}

View File

@@ -0,0 +1,158 @@
/*
* Copyright (c) 2018, Tomas Slusny <slusnucky@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.plugins.defaultworld;
import com.google.inject.Provides;
import java.io.IOException;
import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.api.events.GameStateChanged;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.SessionOpen;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.WorldUtil;
import net.runelite.http.api.worlds.World;
import net.runelite.http.api.worlds.WorldClient;
import net.runelite.http.api.worlds.WorldResult;
@PluginDescriptor(
name = "Default World",
description = "Enable a default world to be selected when launching the client",
tags = {"home"}
)
@Slf4j
public class DefaultWorldPlugin extends Plugin
{
@Inject
private Client client;
@Inject
private DefaultWorldConfig config;
private final WorldClient worldClient = new WorldClient();
private int worldCache;
private boolean worldChangeRequired;
@Override
protected void startUp() throws Exception
{
worldChangeRequired = true;
applyWorld();
}
@Override
protected void shutDown() throws Exception
{
worldChangeRequired = true;
changeWorld(worldCache);
}
@Provides
DefaultWorldConfig getConfig(ConfigManager configManager)
{
return configManager.getConfig(DefaultWorldConfig.class);
}
@Subscribe
public void onSessionOpen(SessionOpen event)
{
worldChangeRequired = true;
applyWorld();
}
@Subscribe
public void onGameStateChanged(GameStateChanged event)
{
applyWorld();
}
private void changeWorld(int newWorld)
{
if (!worldChangeRequired || client.getGameState() != GameState.LOGIN_SCREEN)
{
return;
}
worldChangeRequired = false;
int correctedWorld = newWorld < 300 ? newWorld + 300 : newWorld;
// Old School RuneScape worlds start on 301 so don't even bother trying to find lower id ones
// and also do not try to set world if we are already on it
if (correctedWorld <= 300 || client.getWorld() == correctedWorld)
{
return;
}
try
{
final WorldResult worldResult = worldClient.lookupWorlds();
if (worldResult == null)
{
return;
}
final World world = worldResult.findWorld(correctedWorld);
if (world != null)
{
final net.runelite.api.World rsWorld = client.createWorld();
rsWorld.setActivity(world.getActivity());
rsWorld.setAddress(world.getAddress());
rsWorld.setId(world.getId());
rsWorld.setPlayerCount(world.getPlayers());
rsWorld.setLocation(world.getLocation());
rsWorld.setTypes(WorldUtil.toWorldTypes(world.getTypes()));
client.changeWorld(rsWorld);
log.debug("Applied new world {}", correctedWorld);
}
else
{
log.warn("World {} not found.", correctedWorld);
}
}
catch (IOException e)
{
log.warn("Error looking up world {}. Error: {}", correctedWorld, e);
}
}
private void applyWorld()
{
if (worldCache == 0)
{
worldCache = client.getWorld();
log.debug("Stored old world {}", worldCache);
}
final int newWorld = config.getWorld();
changeWorld(newWorld);
}
}

View File

@@ -60,8 +60,13 @@ public class ClientLoader
switch (updateCheckMode)
{
case AUTO:
default:
return loadRLPlus(config);
case VANILLA:
return loadVanilla(config);
case NONE:
return null;
}
}
catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException e)
@@ -102,7 +107,7 @@ public class ClientLoader
private static Applet loadFromClass(final RSConfig config, final Class<?> clientClass) throws IllegalAccessException, InstantiationException
{
final Applet rs = (Applet) clientClass.newInstance();
rs.setStub(new RSAppletStub());
rs.setStub(new RSAppletStub(config));
return rs;
}
}

View File

@@ -1,133 +1,70 @@
/*
* Copyright (c) 2016-2017, Adam <Adam@sigterm.info>
* Copyright (c) 2018, Tomas Slusny <slusnucky@gmail.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.client.rs;
import java.applet.AppletContext;
import java.applet.AppletStub;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import lombok.RequiredArgsConstructor;
public class RSAppletStub implements AppletStub
@RequiredArgsConstructor
class RSAppletStub implements AppletStub
{
public static final Logger logger = Logger.getLogger(RSAppletStub.class.getSimpleName());
private static final HashMap<String, String> params = new HashMap<String, String>();
private static final HashMap<String, String> cfg = new HashMap<String, String>();
private static URL codebase;
static
{
cfg.put("privacyurl", "http://www.jagex.com/g=oldscape/privacy/privacy.ws");
cfg.put("window_preferredheight", "600");
cfg.put("msg", "new_version_link=http://oldschool.runescape.com/");
cfg.put("applet_minwidth", "765");
cfg.put("adverturl", "http://www.runescape.com/g=oldscape/bare_advert.ws");
cfg.put("cachedir", "oldschool");
cfg.put("window_preferredwidth", "800");
cfg.put("applet_maxheight", "2160");
cfg.put("win_sub_version", "1");
cfg.put("browsercontrol_win_x86_jar", "browsercontrol_0_-1928975093.jar");
cfg.put("other_sub_version", "2");
cfg.put("initial_jar", "gamepack_4840368.jar");
cfg.put("advert_height", "96");
cfg.put("title", "Old School RuneScape");
cfg.put("storebase", "0");
cfg.put("initial_class", "client.class");
cfg.put("applet_maxwidth", "5760");
cfg.put("download", "1230228");
cfg.put("termsurl", "http://www.jagex.com/g=oldscape/terms/terms.ws");
cfg.put("codebase", "http://oldschool1.runescape.com/");
cfg.put("mac_sub_version", "2");
cfg.put("browsercontrol_win_amd64_jar", "browsercontrol_1_1674545273.jar");
cfg.put("applet_minheight", "503");
cfg.put("viewerversion", "124");
}
public RSAppletStub()
{
try
{
parseParams(new FileInputStream(new File("./params.txt")));
String worldListKey = null;
for (Map.Entry<String, String> paramEntry : params.entrySet())
{
String key = paramEntry.getKey();
String value = paramEntry.getValue();
if (value.contains("slr.ws"))
{
worldListKey = key;
break;
}
}
codebase = new URL("http://runeliteplus-ps.ddns.net"); //host
params.put(worldListKey, "http://" + codebase.getHost());
}
catch (IOException e)
{
e.printStackTrace();
}
}
private static void parseParams(InputStream stream) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = br.readLine()) != null)
{
int idx = line.indexOf('=');
if (idx != -1)
{
String key = line.substring(0, idx);
String val = line.substring(idx + 1);
if (key.equals("param"))
{
idx = val.indexOf('=');
key = val.substring(0, idx);
val = val.substring(idx + 1);
params.put(key, val);
}
else
{
cfg.put(key, val);
}
}
}
}
public static void log(String format, Object... params)
{
System.out.printf(format + "\n", params);
}
private final RSConfig config;
@Override
public boolean isActive()
{
return false;
return true;
}
@Override
public URL getDocumentBase()
{
return codebase;
return getCodeBase();
}
@Override
public URL getCodeBase()
{
return codebase;
try
{
return new URL(config.getCodeBase());
}
catch (MalformedURLException ex)
{
return null;
}
}
@Override
public String getParameter(String name)
{
return params.get(name);
return config.getAppletProperties().get(name);
}
@Override
@@ -140,4 +77,4 @@ public class RSAppletStub implements AppletStub
public void appletResize(int width, int height)
{
}
}
}

View File

@@ -31,7 +31,6 @@ import net.runelite.api.mixins.FieldHook;
import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.MethodHook;
import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSGameShell;
@@ -98,11 +97,4 @@ public abstract class RSGameShellMixin implements RSGameShell
setResizeCanvasNextFrame(true);
}
}
@Replace("checkHost")
protected final boolean checkHost()
{
//Always allow host.
return true;
}
}