mirror of
https://gitlab.com/2009scape/09launcher.git
synced 2025-12-09 16:45:54 -07:00
Fixed up the launcher project structure and naming
This commit is contained in:
commit
07180ce371
36 changed files with 1849 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
.gradle/
|
||||
build
|
||||
BIN
AppImage/2009scape.AppImage
Executable file
BIN
AppImage/2009scape.AppImage
Executable file
Binary file not shown.
BIN
AppImage/2009scape.jar
Normal file
BIN
AppImage/2009scape.jar
Normal file
Binary file not shown.
25
AppImage/LICENSE
Normal file
25
AppImage/LICENSE
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2016, Adam <Adam@sigterm.info>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* 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 HOLDER 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.
|
||||
8
AppImage/appimage/2009scape.desktop
Normal file
8
AppImage/appimage/2009scape.desktop
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[Desktop Entry]
|
||||
Name=2009scape
|
||||
Comment=2009scape - Your Adventure Awaits!
|
||||
Exec=@finalName@
|
||||
Icon=2009scape
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Game;
|
||||
BIN
AppImage/appimage/2009scape.png
Normal file
BIN
AppImage/appimage/2009scape.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.5 KiB |
73
AppImage/build-linux.sh
Executable file
73
AppImage/build-linux.sh
Executable file
|
|
@ -0,0 +1,73 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
PACKR_VERSION="runelite-1.0"
|
||||
|
||||
rm -f 2009scape.AppImage
|
||||
|
||||
# Check if there's a client jar file - If there's no file the AppImage will not work but will still be built.
|
||||
if ! [ -e 2009scape.jar ]
|
||||
then
|
||||
echo "2009scape.jar not found, exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [ -f OpenJDK8U-jre_x64_linux_hotspot_8u275b01.tar.gz ] ; then
|
||||
curl -Lo OpenJDK8U-jre_x64_linux_hotspot_8u275b01.tar.gz \
|
||||
https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u275-b01/OpenJDK8U-jre_x64_linux_hotspot_8u275b01.tar.gz
|
||||
fi
|
||||
|
||||
rm -f packr.jar
|
||||
curl -o packr.jar https://libgdx.badlogicgames.com/ci/packr/packr.jar
|
||||
|
||||
# packr requires a "jdk" and pulls the jre from it - so we have to place it inside
|
||||
# the jdk folder at jre/
|
||||
if ! [ -d linux-jdk ] ; then
|
||||
tar zxf OpenJDK8U-jre_x64_linux_hotspot_8u275b01.tar.gz
|
||||
mkdir linux-jdk
|
||||
mv jdk8u275-b01-jre linux-jdk/jre
|
||||
fi
|
||||
|
||||
if ! [ -f packr_${PACKR_VERSION}.jar ] ; then
|
||||
curl -Lo packr_${PACKR_VERSION}.jar \
|
||||
https://github.com/runelite/packr/releases/download/${PACKR_VERSION}/packr.jar
|
||||
fi
|
||||
|
||||
echo "18b7cbaab4c3f9ea556f621ca42fbd0dc745a4d11e2a08f496e2c3196580cd53 packr_${PACKR_VERSION}.jar" | sha256sum -c
|
||||
|
||||
java -jar packr_${PACKR_VERSION}.jar \
|
||||
--platform \
|
||||
linux64 \
|
||||
--jdk \
|
||||
linux-jdk \
|
||||
--executable \
|
||||
2009scape \
|
||||
--classpath \
|
||||
2009scape.jar \
|
||||
--mainclass \
|
||||
fox.Launcher \
|
||||
--output \
|
||||
native-linux/2009scape.AppDir/ \
|
||||
--resources \
|
||||
appimage/2009scape.desktop \
|
||||
appimage/2009scape.png
|
||||
|
||||
cp appimage/2009scape.png native-linux/2009scape.AppDir
|
||||
|
||||
# Symlink AppRun -> 2009scape
|
||||
pushd native-linux/2009scape.AppDir/
|
||||
ln -s 2009scape AppRun
|
||||
popd
|
||||
|
||||
curl -Lo appimagetool-x86_64.AppImage https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage
|
||||
chmod 755 appimagetool-x86_64.AppImage
|
||||
|
||||
./appimagetool-x86_64.AppImage \
|
||||
native-linux/2009scape.AppDir/ \
|
||||
native-linux/2009scape.AppImage
|
||||
|
||||
echo "Cleaning up.."
|
||||
|
||||
mv native-linux/2009scape.AppImage .
|
||||
rm -rf packr packr.jar packr_runelite-1.0.jar native-linux linux-jdk OpenJDK8U-jre_x64_linux_hotspot_8u275b01.tar.gz appimagetool-x86_64.AppImage
|
||||
82
AppImage/build-osx.sh
Executable file
82
AppImage/build-osx.sh
Executable file
|
|
@ -0,0 +1,82 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo "NOTE: THIS DOES NOT WORK. IT HAS NEVER BEEN MODIFIED SINCE COPIED FROM https://github.com/open-osrs/launcher/blob/master/build-osx.sh"
|
||||
|
||||
set -e
|
||||
|
||||
JDK_VER="11.0.4"
|
||||
JDK_BUILD="11"
|
||||
PACKR_VERSION="runelite-1.0"
|
||||
|
||||
SIGNING_IDENTITY="Developer ID Application"
|
||||
ALTOOL_USER="user@icloud.com"
|
||||
ALTOOL_PASS="@keychain:altool-password"
|
||||
|
||||
if ! [ -f OpenJDK11U-jre_x64_mac_hotspot_${JDK_VER}_${JDK_BUILD}.tar.gz ] ; then
|
||||
curl -Lo OpenJDK11U-jre_x64_mac_hotspot_${JDK_VER}_${JDK_BUILD}.tar.gz \
|
||||
https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-${JDK_VER}%2B${JDK_BUILD}/OpenJDK11U-jre_x64_mac_hotspot_${JDK_VER}_${JDK_BUILD}.tar.gz
|
||||
fi
|
||||
|
||||
rm -f packr.jar
|
||||
curl -o packr.jar https://libgdx.badlogicgames.com/ci/packr/packr.jar
|
||||
|
||||
echo "1647fded28d25e562811f7bce2092eb9c21d30608843b04250c023b40604ff26 OpenJDK11U-jre_x64_mac_hotspot_${JDK_VER}_${JDK_BUILD}.tar.gz" | shasum -c
|
||||
|
||||
# packr requires a "jdk" and pulls the jre from it - so we have to place it inside
|
||||
# the jdk folder at jre/
|
||||
if ! [ -d osx-jdk ] ; then
|
||||
tar zxf OpenJDK11U-jre_x64_mac_hotspot_${JDK_VER}_${JDK_BUILD}.tar.gz
|
||||
mkdir osx-jdk
|
||||
mv jdk-11.0.4+11-jre osx-jdk/jre
|
||||
|
||||
# Move JRE out of Contents/Home/
|
||||
pushd osx-jdk/jre
|
||||
cp -r Contents/Home/* .
|
||||
popd
|
||||
fi
|
||||
|
||||
if ! [ -f packr_${PACKR_VERSION}.jar ] ; then
|
||||
curl -Lo packr_${PACKR_VERSION}.jar \
|
||||
https://github.com/runelite/packr/releases/download/${PACKR_VERSION}/packr.jar
|
||||
fi
|
||||
|
||||
echo "18b7cbaab4c3f9ea556f621ca42fbd0dc745a4d11e2a08f496e2c3196580cd53 packr_${PACKR_VERSION}.jar" | shasum -c
|
||||
|
||||
java -jar packr_${PACKR_VERSION}.jar \
|
||||
--platform \
|
||||
mac \
|
||||
--icon \
|
||||
packr/openosrs.icns \
|
||||
--jdk \
|
||||
osx-jdk \
|
||||
--executable \
|
||||
OpenOSRS \
|
||||
--classpath \
|
||||
build/libs/OpenOSRS-shaded.jar \
|
||||
--mainclass \
|
||||
net.runelite.launcher.Launcher \
|
||||
--vmargs \
|
||||
Drunelite.launcher.nojvm=true \
|
||||
Xmx512m \
|
||||
Xss2m \
|
||||
XX:CompileThreshold=1500 \
|
||||
Djna.nosys=true \
|
||||
--output \
|
||||
native-osx/OpenOSRS.app
|
||||
|
||||
cp build/filtered-resources/Info.plist native-osx/OpenOSRS.app/Contents
|
||||
|
||||
echo Setting world execute permissions on OpenOSRS
|
||||
pushd native-osx/OpenOSRS.app
|
||||
chmod g+x,o+x Contents/MacOS/OpenOSRS
|
||||
popd
|
||||
|
||||
codesign -f -s "${SIGNING_IDENTITY}" --entitlements osx/signing.entitlements --options runtime native-osx/RuneLite.app || true
|
||||
|
||||
# create-dmg exits with an error code due to no code signing, but is still okay
|
||||
# note we use Adam-/create-dmg as upstream does not support UDBZ
|
||||
create-dmg --format UDBZ native-osx/OpenOSRS.app.app native-osx/ || true
|
||||
|
||||
mv native-osx/OpenOSRS\ *.dmg native-osx/OpenOSRS.dmg
|
||||
|
||||
xcrun altool --notarize-app --username "${ALTOOL_USER}" --password "${ALTOOL_PASS}" --primary-bundle-id openosrs --file native-osx/OpenOSRS.dmg || true
|
||||
15
README.md
Normal file
15
README.md
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# 2009scape Launcher
|
||||
|
||||
The official launcher for 2009scape/2009scape-compatible sources
|
||||
|
||||
# Running
|
||||
|
||||
1. Start the 2009scape Management Server & Server on localhost (found [here](https://github.com/2009scape/2009scape))
|
||||
2. Run `src/com/rs09/Launcher.java`
|
||||
|
||||
Note: To be able to download client and cache through the launcher you need to have a web server running and you need to have the cache + client jar in the web root of the web server.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* No audio (Linux)
|
||||
* Install Pipewire (and Pipewire-alsa) as a replacement to Pulseaudio. This is a deep Java issue that will hopefully disappear with Pulseaudio's phasing out over the 2021/2022
|
||||
38
build.gradle
Normal file
38
build.gradle
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
plugins {
|
||||
id "java"
|
||||
id "application"
|
||||
}
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
mainClassName = 'rs09.Launcher'
|
||||
|
||||
|
||||
repositories {
|
||||
flatDir {
|
||||
dirs 'libs'
|
||||
}
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
}
|
||||
|
||||
|
||||
jar {
|
||||
archiveBaseName = '2009scapeLauncher'
|
||||
archiveVersion = '1.0.0'
|
||||
manifest {
|
||||
attributes 'Main-Class': 'rs09.Launcher',
|
||||
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
|
||||
}
|
||||
from('src') {
|
||||
include 'data/**'
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs = ['src/main/java']
|
||||
}
|
||||
|
||||
3
src/META-INF/MANIFEST.MF
Normal file
3
src/META-INF/MANIFEST.MF
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
Manifest-Version: 1.0
|
||||
Main-Class: rs09.Launcher
|
||||
|
||||
30
src/main/java/rs09/Launcher.java
Normal file
30
src/main/java/rs09/Launcher.java
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
package rs09;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import rs09.audio.Audio;
|
||||
import rs09.components.AppFrame;
|
||||
//import fox.threads.ServerTime;
|
||||
|
||||
public class Launcher {
|
||||
|
||||
public static Audio audio = new Audio("/data/audio/welcomehome.mid");
|
||||
public static AppFrame app;
|
||||
|
||||
public static void main(String[] main) {
|
||||
UIManager.put("Button.select", new Color(1.0f,1.0f, 1.0f, 0.05f));
|
||||
System.setProperty("awt.useSystemAAFontSettings","on");
|
||||
System.setProperty("swing.aatext", "true");
|
||||
|
||||
app = new AppFrame();
|
||||
app.setVisible(true);
|
||||
app.setLocationRelativeTo(null);
|
||||
if (Settings.enableMusicPlayer)
|
||||
audio.playAudio();
|
||||
//new Thread(new ServerTime()).start();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
43
src/main/java/rs09/Settings.java
Normal file
43
src/main/java/rs09/Settings.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package rs09;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.io.File;
|
||||
|
||||
public class Settings {
|
||||
|
||||
public static final String SERVER_NAME = "2009scape";
|
||||
public static final String DOWNLOAD_URL = "http://play.2009scape.org/2009scape.jar";
|
||||
public static final String CACHE_URL = "http://play.2009scape.org/";
|
||||
|
||||
public static final String SAVE_NAME = "2009scape.jar";
|
||||
public static final String SAVE_DIR = System.getProperty("user.home") + File.separator;
|
||||
public static final String CACHE_DIR = System.getProperty("user.home") + File.separator + ".runite_rs" + File.separator + "runescape" + File.separator;
|
||||
|
||||
public static final String SERVER_IP = "play.2009scape.org";
|
||||
public static final int SERVER_PORT = 43595;
|
||||
|
||||
public static final boolean enableMusicPlayer = false;
|
||||
|
||||
// Frame Settings
|
||||
public static final Dimension frameSize = new Dimension(600, 350);
|
||||
public static final Color borderColor = new Color(0, 0, 0);
|
||||
public static final Color backgroundColor = new Color(158,134,94);
|
||||
public static final Color primaryColor = new Color(255,204,54);
|
||||
public static final Color iconShadow = new Color(0, 0, 0);
|
||||
public static final Color buttonDefaultColor = new Color(
|
||||
97,76,35
|
||||
);
|
||||
|
||||
// link settings
|
||||
//public static final String youtube = "";
|
||||
//public static final String twitter = "";
|
||||
//public static final String facebook = "";
|
||||
|
||||
public static final String community = "https://discord.gg/UVtqkDhxVD";
|
||||
public static final String leaders = "https://2009scape.org/services/m%3dhiscore/hiscores.html";
|
||||
//public static final String store = "";
|
||||
//public static final String vote = "";
|
||||
public static final String bugs = "https://2009scape.org/services/m=bugtracker_v4/index.html?j";
|
||||
|
||||
}
|
||||
42
src/main/java/rs09/audio/Audio.java
Normal file
42
src/main/java/rs09/audio/Audio.java
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package rs09.audio;
|
||||
|
||||
import javax.sound.midi.*;
|
||||
|
||||
public class Audio {
|
||||
|
||||
private static Sequencer player;
|
||||
private String midiFile;
|
||||
|
||||
public Audio(String file) {
|
||||
this.midiFile = file;
|
||||
try {
|
||||
player = MidiSystem.getSequencer();
|
||||
player.open();
|
||||
} catch (MidiUnavailableException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void playAudio() {
|
||||
if (player == null || !player.isOpen() || player.isRunning())
|
||||
return;
|
||||
try {
|
||||
player.setSequence(getClass().getResourceAsStream(midiFile));
|
||||
player.setLoopCount(3);
|
||||
player.start();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void stopAudio() {
|
||||
if (player == null)
|
||||
return;
|
||||
player.stop();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Audio audio = new Audio("/data/audio/welcomehome.mid");
|
||||
audio.playAudio();
|
||||
}
|
||||
}
|
||||
293
src/main/java/rs09/components/AppFrame.java
Normal file
293
src/main/java/rs09/components/AppFrame.java
Normal file
|
|
@ -0,0 +1,293 @@
|
|||
package rs09.components;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Point;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseMotionAdapter;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JProgressBar;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.plaf.basic.BasicProgressBarUI;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.listeners.ButtonListener;
|
||||
import rs09.utils.Utils;
|
||||
|
||||
public class AppFrame extends JFrame {
|
||||
private static final long serialVersionUID = -3130053101521666537L;
|
||||
private static Point initialClick;
|
||||
|
||||
public static int appWidth, appHeight;
|
||||
|
||||
public AppFrame() {
|
||||
setPreferredSize(Settings.frameSize);
|
||||
|
||||
appWidth = (int) getPreferredSize().getWidth();
|
||||
appHeight = (int) getPreferredSize().getHeight();
|
||||
|
||||
setUndecorated(true);
|
||||
setResizable(false);
|
||||
setTitle(Settings.SERVER_NAME);
|
||||
setLayout(null);
|
||||
getRootPane().setBorder(new LineBorder(Color.BLACK));
|
||||
getContentPane().setBackground(Settings.backgroundColor);
|
||||
|
||||
//addMenuBar();
|
||||
addNewsBox();
|
||||
addWorldSelect();
|
||||
addLinks();
|
||||
addHeader();
|
||||
addPlayButton();
|
||||
addProgressBar();
|
||||
|
||||
setIconImage(Utils.getImage("favicon_large.png").getImage());
|
||||
addMouseListener();
|
||||
pack();
|
||||
}
|
||||
|
||||
public static JProgressBar pbar;
|
||||
|
||||
private void addProgressBar() {
|
||||
pbar = new JProgressBar();
|
||||
|
||||
pbar.setUI(new BasicProgressBarUI() {
|
||||
protected Color getSelectionBackground() {
|
||||
return Settings.primaryColor;
|
||||
}
|
||||
protected Color getSelectionForeground() {
|
||||
return Settings.primaryColor;
|
||||
}
|
||||
});
|
||||
|
||||
pbar.setBounds(0, appHeight - 35, appWidth, 35);
|
||||
pbar.setBackground(Settings.backgroundColor.darker());
|
||||
pbar.setBorderPainted(false);
|
||||
pbar.setStringPainted(true);
|
||||
pbar.setString("Click Launch to play "+Settings.SERVER_NAME+"!");
|
||||
pbar.setBorder(new EmptyBorder(0, 0, 0, 0));
|
||||
pbar.setForeground(new Color(25, 25, 25));
|
||||
Utils.setFont(pbar, "OpenSans-Regular.ttf", 13);
|
||||
add(pbar);
|
||||
}
|
||||
|
||||
|
||||
public static Control playButton = new Control("Play");
|
||||
private void addPlayButton() {
|
||||
|
||||
playButton.setActionCommand("play1");
|
||||
playButton.setBackground(Settings.primaryColor);
|
||||
playButton.addActionListener(new ButtonListener());
|
||||
//(appWidth / 2) - (167 / 2)
|
||||
playButton.setBounds(151, appHeight - 88, 100, 35);
|
||||
Utils.setFont(playButton, "OpenSans-Regular.ttf", 16);
|
||||
add(playButton);
|
||||
}
|
||||
|
||||
public static Control playButton2 = new Control("Play");
|
||||
private void addPlayButton2() {
|
||||
playButton2.setActionCommand("play2");
|
||||
playButton2.setBackground(Settings.primaryColor);
|
||||
playButton2.addActionListener(new ButtonListener());
|
||||
//(appWidth / 2) - (167 / 2)
|
||||
playButton2.setBounds(appWidth - 254, appHeight - 88, 100, 35);
|
||||
Utils.setFont(playButton2, "OpenSans-Regular.ttf", 16);
|
||||
playButton2.setEnabled(true);
|
||||
add(playButton2);
|
||||
}
|
||||
|
||||
private void addWorldSelect() {
|
||||
JLabel world1box = new JLabel("");
|
||||
JLabel world1text = new JLabel("World 1 - Authentic");
|
||||
world1text.setBounds(20, appHeight - 80, 145,20);
|
||||
world1text.setForeground(Color.WHITE);
|
||||
Utils.setFont(world1text,"OpenSans-Regular.ttf",12);
|
||||
world1box.setBounds(5, appHeight - 90,250,40);
|
||||
world1box.setOpaque(true);
|
||||
world1box.setBackground(new Color(0.0f,0.0f,0.0f,0.2f));
|
||||
add(world1box);
|
||||
add(world1text);
|
||||
|
||||
IconLabel globeIcon = new IconLabel("\uf0ac",50);
|
||||
globeIcon.setBounds(275,appHeight - 98,64,64);
|
||||
add(globeIcon);
|
||||
|
||||
JLabel world2box = new JLabel("");
|
||||
JLabel world2Text = new JLabel("World 2 - Custom/QoL");
|
||||
world2Text.setBounds(appWidth - 145,appHeight - 80,145,20);
|
||||
world2Text.setForeground(Color.WHITE);
|
||||
Utils.setFont(world2Text,"OpenSans-Regular.ttf",12);
|
||||
world2box.setBounds(appWidth - 258,appHeight - 90, 250, 40);
|
||||
world2box.setOpaque(true);
|
||||
world2box.setBackground(new Color(0.0f,0.0f,0.0f,0.2f));
|
||||
add(world2box);
|
||||
add(world2Text);
|
||||
addPlayButton2();
|
||||
}
|
||||
|
||||
public static JLabel tooltip;
|
||||
public static IconLabel serverTime;
|
||||
public static IconLabel playerCount;
|
||||
|
||||
private void addLinks() {
|
||||
tooltip = new JLabel("");
|
||||
tooltip.setBounds(135, appHeight - 140, 335, 35);
|
||||
tooltip.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
Utils.setFont(tooltip, "OpenSans-Light.ttf", 30);
|
||||
tooltip.setForeground(Color.white);
|
||||
add(tooltip);
|
||||
|
||||
IconLabel forum = new IconLabel("\uf086", "Community", 50);
|
||||
forum.setBounds(275, 150, 64, 64);//forum.setBounds(135, 170, 64, 64);
|
||||
add(forum);
|
||||
|
||||
IconLabel hs = new IconLabel("\uf080", "Leaderboards", 50);
|
||||
hs.setBounds(205, 150, 64, 64);
|
||||
add(hs);
|
||||
|
||||
/*IconLabel shop = new IconLabel("\uf07a", "Shopping Center", 50);
|
||||
shop.setBounds(275, 170, 64, 64);
|
||||
add(shop);*/
|
||||
|
||||
/*IconLabel vote = new IconLabel("\uf046", "Vote for Us", 50);
|
||||
vote.setBounds(345, 172, 64, 64);
|
||||
add(vote);*/
|
||||
|
||||
IconLabel web = new IconLabel("\uf188", "Report an Issue", 50);
|
||||
web.setBounds(345, 152, 64, 64);//web.setBounds(415, 172, 64, 64);
|
||||
add(web);
|
||||
|
||||
if (Settings.enableMusicPlayer) {
|
||||
IconLabel music = new IconLabel("\uf205", "Music", "FontAwesome.ttf", 16);
|
||||
music.setBounds(appWidth - 32, appHeight - 60, 24, 18);
|
||||
add(music);
|
||||
|
||||
IconLabel musicLabel = new IconLabel("Music", 12);
|
||||
musicLabel.setBounds(appWidth - 75, appHeight - 60, 36, 18);
|
||||
add(musicLabel);
|
||||
}
|
||||
|
||||
// //serverTime = new IconLabel("Server Time: 1:50 PM", 12);
|
||||
// serverTime.setBounds(15, appHeight - 60, 175, 18);
|
||||
// add(serverTime);
|
||||
|
||||
/*playerCount = new IconLabel("There are 10 player(s) Online!", 12);
|
||||
playerCount.setForeground(Color.white);
|
||||
playerCount.setBounds(65, 105, 200, 18);
|
||||
add(playerCount);*/
|
||||
|
||||
/*JButton player = new JButton("Stop Music");
|
||||
player.setBounds(520, 378, 75, 16);
|
||||
add(player);*/
|
||||
}
|
||||
|
||||
String serverStatus = "...";
|
||||
|
||||
|
||||
private void addNewsBox() {
|
||||
|
||||
|
||||
// IconLabel facebook = new IconLabel("\uf082", "Facebook", 32);
|
||||
// facebook.setBounds(appWidth - 35, 30, 36, 36);
|
||||
|
||||
// if (Settings.facebook.length() > 1) {
|
||||
// add(facebook);
|
||||
// }
|
||||
//
|
||||
// IconLabel twitter = new IconLabel("\uf099", "Twitter", 32);
|
||||
// twitter.setBounds(appWidth - 35, 65, 36, 36);
|
||||
//
|
||||
// if (Settings.twitter.length() > 1) {
|
||||
// add(twitter);
|
||||
// }
|
||||
//
|
||||
// IconLabel youtube = new IconLabel("\uf167", "Youtube", 32);
|
||||
// youtube.setBounds(appWidth - 35, 100, 36, 36);
|
||||
//
|
||||
// if (Settings.youtube.length() > 1) {
|
||||
// add(youtube);
|
||||
// }
|
||||
|
||||
final int red = Settings.primaryColor.getRed();
|
||||
final int green = Settings.primaryColor.getGreen();
|
||||
final int blue = Settings.primaryColor.getBlue();
|
||||
|
||||
JLabel status1 = new JLabel("Welcome to "+Settings.SERVER_NAME+"!");
|
||||
status1.setForeground(Settings.primaryColor);
|
||||
status1.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
status1.setBounds(0, 75, appWidth, 95);
|
||||
Utils.setFont(status1, "OpenSans-Light.ttf", 40);
|
||||
//add(status1);
|
||||
|
||||
/*final JLabel status2 = new JLabel("<html>We are currently "+serverStatus+"!</html>");
|
||||
|
||||
new Thread() {
|
||||
public void run() {
|
||||
serverStatus = Utils.hostAvailabilityCheck() ?
|
||||
"<font color='rgb("+red+", "+green+", "+blue+")'>Online</font>" :
|
||||
"<font color=red>Offline</font>";
|
||||
status2.setText("<html>We are currently "+serverStatus+"!</html>");
|
||||
}
|
||||
}.start();
|
||||
|
||||
status2.setForeground(Color.WHITE);
|
||||
status2.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
status2.setBounds(0, 25, appWidth, 25);
|
||||
Utils.setFont(status2, "OpenSans-Light.ttf", 14);
|
||||
add(status2);*/
|
||||
}
|
||||
|
||||
private void addMenuBar() {
|
||||
MenuBar bar = new MenuBar(this);
|
||||
bar.setBounds(0, 0, appWidth, 25);
|
||||
add(bar);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private void addHeader() {
|
||||
JLabel logo = new JLabel(Utils.getImage("logo.png"));
|
||||
logo.setBounds(125, 55, 350, 60);
|
||||
add(logo);
|
||||
|
||||
// JLabel head = new JLabel(" ");
|
||||
// head.setOpaque(true);
|
||||
// head.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.2f));
|
||||
// head.setBounds(-1, 25, appWidth, 114);
|
||||
// add(head);
|
||||
}
|
||||
|
||||
private void addMouseListener() {
|
||||
addMouseListener(new MouseAdapter() {
|
||||
public void mousePressed(MouseEvent e) {
|
||||
initialClick = e.getPoint();
|
||||
getComponentAt(initialClick);
|
||||
}
|
||||
});
|
||||
|
||||
addMouseMotionListener(new MouseMotionAdapter() {
|
||||
@Override
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
|
||||
int iX = initialClick.x;
|
||||
int iY = initialClick.y;
|
||||
|
||||
if (iX >= 0 && iX <= getPreferredSize().getWidth() && iY >= 0 && iY <= 25) {
|
||||
int thisX = getLocation().x;
|
||||
int thisY = getLocation().y;
|
||||
|
||||
int xMoved = (thisX + e.getX()) - (thisX + initialClick.x);
|
||||
int yMoved = (thisY + e.getY()) - (thisY + initialClick.y);
|
||||
|
||||
int X = thisX + xMoved;
|
||||
int Y = thisY + yMoved;
|
||||
setLocation(X, Y);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
58
src/main/java/rs09/components/Control.java
Normal file
58
src/main/java/rs09/components/Control.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package rs09.components;
|
||||
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JButton;
|
||||
|
||||
import rs09.Settings;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class Control extends JButton implements MouseListener {
|
||||
|
||||
public Control(Icon image) {
|
||||
super(image);
|
||||
|
||||
setBorderPainted(false);
|
||||
setFocusable(false);
|
||||
addMouseListener(this);
|
||||
}
|
||||
|
||||
public Control(String name) {
|
||||
super(name);
|
||||
setForeground(Settings.buttonDefaultColor);
|
||||
setBorderPainted(false);
|
||||
setFocusable(false);
|
||||
addMouseListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent me) {
|
||||
setBackground(this.getBackground().darker());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent me) {
|
||||
setBackground(this.getBackground().brighter());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
}
|
||||
20
src/main/java/rs09/components/Header.java
Normal file
20
src/main/java/rs09/components/Header.java
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
package rs09.components;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import rs09.utils.Utils;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class Header extends JLabel {
|
||||
|
||||
public Header(String text) {
|
||||
super(text);
|
||||
setForeground(Color.WHITE);
|
||||
setHorizontalAlignment(SwingConstants.CENTER);
|
||||
Utils.setFont(this, "OpenSans-Light.ttf", 32);
|
||||
}
|
||||
|
||||
}
|
||||
180
src/main/java/rs09/components/IconLabel.java
Normal file
180
src/main/java/rs09/components/IconLabel.java
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
package rs09.components;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
import java.awt.font.LineMetrics;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
|
||||
import rs09.Launcher;
|
||||
import rs09.Settings;
|
||||
import rs09.utils.Utils;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class IconLabel extends JLabel implements MouseListener {
|
||||
|
||||
private int tracking;
|
||||
private String action;
|
||||
|
||||
public IconLabel(String text, int fontSize) {
|
||||
super(text);
|
||||
this.tracking = 1;
|
||||
setForeground(Settings.primaryColor);
|
||||
this.setRightShadow(1, 1, Settings.iconShadow);
|
||||
Utils.setFont(this, "FontAwesome.ttf", fontSize);
|
||||
}
|
||||
|
||||
public IconLabel(String text, String action, int fontSize) {
|
||||
super(text);
|
||||
this.tracking = 1;
|
||||
this.action = action;
|
||||
setForeground(Settings.primaryColor);
|
||||
addMouseListener(this);
|
||||
this.setRightShadow(1, 1, Settings.iconShadow);
|
||||
Utils.setFont(this, "FontAwesome.ttf", fontSize);
|
||||
}
|
||||
|
||||
public IconLabel(String text, String action, String font, int fontSize) {
|
||||
super(text);
|
||||
this.tracking = 1;
|
||||
this.action = action;
|
||||
setForeground(Settings.primaryColor);
|
||||
addMouseListener(this);
|
||||
this.setRightShadow(1, 1, Settings.iconShadow);
|
||||
Utils.setFont(this, font, fontSize);
|
||||
}
|
||||
|
||||
private int left_x, left_y, right_x, right_y;
|
||||
private Color left_color, right_color;
|
||||
public void setLeftShadow(int x, int y, Color color) {
|
||||
left_x = x;
|
||||
left_y = y;
|
||||
left_color = color;
|
||||
}
|
||||
|
||||
public void setRightShadow(int x, int y, Color color) {
|
||||
right_x = x;
|
||||
right_y = y;
|
||||
right_color = color;
|
||||
}
|
||||
|
||||
public Dimension getPreferredSize() {
|
||||
String text = getText();
|
||||
FontMetrics fm = this.getFontMetrics(getFont());
|
||||
|
||||
int w = fm.stringWidth(text);
|
||||
w += (text.length()-1)*tracking;
|
||||
w += left_x + right_x;
|
||||
|
||||
int h = fm.getHeight();
|
||||
h += left_y + right_y;
|
||||
|
||||
return new Dimension(w,h);
|
||||
}
|
||||
|
||||
public void paintComponent(Graphics g) {
|
||||
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
|
||||
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
||||
|
||||
char[] chars = getText().toCharArray();
|
||||
|
||||
FontMetrics fm = this.getFontMetrics(getFont());
|
||||
int h = fm.getAscent();
|
||||
@SuppressWarnings("unused")
|
||||
LineMetrics lm = fm.getLineMetrics(getText(),g);
|
||||
g.setFont(getFont());
|
||||
|
||||
int x = 0;
|
||||
|
||||
for(int i=0; i<chars.length; i++) {
|
||||
char ch = chars[i];
|
||||
int w = fm.charWidth(ch) + tracking;
|
||||
|
||||
g.setColor(left_color);
|
||||
g.drawString(""+chars[i],x-left_x,h-left_y);
|
||||
|
||||
g.setColor(right_color);
|
||||
g.drawString(""+chars[i],x+right_x,h+right_y);
|
||||
|
||||
g.setColor(getForeground());
|
||||
g.drawString(""+chars[i],x,h);
|
||||
|
||||
x+=w;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent me) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent me) {
|
||||
if (this.action != "Music" && this.action != "Play Music")
|
||||
AppFrame.tooltip.setText(this.action);
|
||||
setForeground(this.getForeground().darker());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent me) {
|
||||
AppFrame.tooltip.setText("");
|
||||
setForeground(this.getForeground().brighter());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent me) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent me) {
|
||||
switch(this.action) {
|
||||
case "Community":
|
||||
Utils.openWebpage(Settings.community);
|
||||
break;
|
||||
case "Leaderboards":
|
||||
Utils.openWebpage(Settings.leaders);
|
||||
break;
|
||||
// case "Shopping Center":
|
||||
// Utils.openWebpage(Settings.store);
|
||||
// break;
|
||||
// case "Vote for Us":
|
||||
// Utils.openWebpage(Settings.vote);
|
||||
// break;
|
||||
case "Report an Issue":
|
||||
Utils.openWebpage(Settings.bugs);
|
||||
break;
|
||||
// case "Youtube":
|
||||
// Utils.openWebpage(Settings.youtube);
|
||||
// break;
|
||||
// case "Twitter":
|
||||
// Utils.openWebpage(Settings.twitter);
|
||||
// break;
|
||||
// case "Facebook":
|
||||
// Utils.openWebpage(Settings.facebook);
|
||||
// break;
|
||||
case "Music":
|
||||
Launcher.audio.stopAudio();
|
||||
this.setText("\uf204");
|
||||
this.action = "Play Music";
|
||||
break;
|
||||
case "Play Music":
|
||||
this.setText("\uf205");
|
||||
this.action = "Music";
|
||||
Launcher.audio.playAudio();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public String getAction() {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
46
src/main/java/rs09/components/MenuBar.java
Normal file
46
src/main/java/rs09/components/MenuBar.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package rs09.components;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingConstants;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.listeners.ButtonListener;
|
||||
import rs09.utils.Utils;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class MenuBar extends JPanel {
|
||||
|
||||
public MenuBar(AppFrame frame) {
|
||||
setLayout(null);
|
||||
|
||||
setBounds(0, 0, AppFrame.appWidth, 25);
|
||||
setBackground(new Color(60, 60, 60));
|
||||
|
||||
Control exit = new Control("X");
|
||||
exit.setBackground(Settings.primaryColor);
|
||||
exit.addActionListener(new ButtonListener());
|
||||
exit.setBounds(AppFrame.appWidth - 50, 0, 50, 25);
|
||||
add(exit);
|
||||
|
||||
Control mini = new Control("_");
|
||||
mini.setBackground(Settings.backgroundColor);
|
||||
mini.addActionListener(new ButtonListener());
|
||||
mini.setBounds(AppFrame.appWidth - 100, 0, 50, 25);
|
||||
add(mini);
|
||||
|
||||
JLabel title = new JLabel(""+Settings.SERVER_NAME+" Client Launcher");
|
||||
title.setForeground(Color.WHITE);
|
||||
title.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
Utils.setFont(title, "OpenSans-Regular.ttf", 14);
|
||||
title.setBounds(0, 0, AppFrame.appWidth, 25);
|
||||
|
||||
JLabel icon = new JLabel(Utils.getImage("favicon.png"));
|
||||
icon.setBounds(3, -2, 34, 34);//24,28
|
||||
add(icon);
|
||||
add(title);
|
||||
}
|
||||
|
||||
}
|
||||
90
src/main/java/rs09/listeners/ButtonListener.java
Normal file
90
src/main/java/rs09/listeners/ButtonListener.java
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
package rs09.listeners;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
|
||||
import rs09.Launcher;
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
import rs09.net.CacheGrab;
|
||||
import rs09.net.Download;
|
||||
import rs09.net.Update;
|
||||
import rs09.utils.Utils;
|
||||
|
||||
public class ButtonListener implements ActionListener {
|
||||
|
||||
public static Download download;
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
switch(e.getActionCommand()) {
|
||||
|
||||
case "_":
|
||||
Launcher.app.setState(JFrame.ICONIFIED);
|
||||
break;
|
||||
|
||||
case "X":
|
||||
System.exit(0);
|
||||
break;
|
||||
case "play1":
|
||||
case "play2":
|
||||
Thread t = new Thread() {
|
||||
public void run() {
|
||||
|
||||
AppFrame.playButton2.setEnabled(false);
|
||||
AppFrame.playButton.setEnabled(false);
|
||||
AppFrame.pbar.setString("Checking for Client Updates...");
|
||||
|
||||
byte status = Update.updateExists(0,null);
|
||||
byte idx255status = Update.updateExists(1,"main_file_cache.idx255");
|
||||
if (status == 0 && idx255status == 0) {
|
||||
AppFrame.pbar.setString("Now Launching "+Settings.SERVER_NAME+"!");
|
||||
Utils.launchClient(e.getActionCommand().equals("play1") ? 0 : 1);
|
||||
return;
|
||||
} else {
|
||||
System.out.println("JAR STATUS: " + status);
|
||||
System.out.println("CACHE STATUS: " + idx255status);
|
||||
}
|
||||
if( idx255status == 1 || idx255status == 3 || idx255status == 2){
|
||||
System.out.println("CACHE OUT OF DATE! Downloading new cache...");
|
||||
new CacheGrab(Settings.CACHE_URL).download();
|
||||
}
|
||||
if (status == 1 || status == 3) {
|
||||
System.out.println("JAR OUT OF DATE! Downloading new jar...");
|
||||
download = new Download(Settings.DOWNLOAD_URL);
|
||||
download.download();
|
||||
return;
|
||||
} else {
|
||||
if (download.getStatus() == Download.COMPLETE)
|
||||
return;
|
||||
|
||||
if (download.getStatus() == Download.DOWNLOADING) {
|
||||
download.pause();
|
||||
} else if (download.getStatus() == Download.PAUSED) {
|
||||
download.resume();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println(e.getActionCommand());
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
public static boolean checkRun(){
|
||||
byte status = Update.updateExists(0,null);
|
||||
byte idx255status = Update.updateExists(1,"main_file_cache.idx255");
|
||||
if (status == 0 && idx255status == 0) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
222
src/main/java/rs09/net/CacheGrab.java
Normal file
222
src/main/java/rs09/net/CacheGrab.java
Normal file
|
|
@ -0,0 +1,222 @@
|
|||
package rs09.net;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
import rs09.listeners.ButtonListener;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Observable;
|
||||
|
||||
public class CacheGrab extends Observable implements Runnable{
|
||||
private static final int MAX_BUFFER_SIZE = 1024;
|
||||
public static final String STATUSES[] = { "Downloading", "Paused", "Complete", "Cancelled", "Error" };
|
||||
private String DIR = Settings.CACHE_DIR;
|
||||
private String fileName;
|
||||
public boolean allComplete;
|
||||
|
||||
public static final int DOWNLOADING = 0;
|
||||
public static final int PAUSED = 1;
|
||||
public static final int COMPLETE = 2;
|
||||
public static final int CANCELLED = 3;
|
||||
public static final int ERROR = 4;
|
||||
|
||||
private URL url;
|
||||
private int size;
|
||||
private int downloaded;
|
||||
private int status;
|
||||
|
||||
public CacheGrab(String url){
|
||||
try {
|
||||
this.url = new URL(url);
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public float getProgress() {
|
||||
return ((float) downloaded / size) * 100;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void pause() {
|
||||
status = PAUSED;
|
||||
}
|
||||
|
||||
public void resume() {
|
||||
status = DOWNLOADING;
|
||||
download();
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
status = CANCELLED;
|
||||
}
|
||||
|
||||
private void error() {
|
||||
status = ERROR;
|
||||
}
|
||||
|
||||
public void download() {
|
||||
Thread thread = new Thread(this);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private String getFileName(URL url) {
|
||||
String fileName = url.getFile();
|
||||
return fileName.substring(fileName.lastIndexOf('/') + 1);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
byte dat0status = Update.updateExists(1, "main_file_cache.dat0");
|
||||
byte dat2status = Update.updateExists(1, "main_file_cache.dat2");
|
||||
if (dat0status == 1 || dat0status == 3) {
|
||||
try {
|
||||
this.url = new URL(Settings.CACHE_URL + "main_file_cache.dat0");
|
||||
this.fileName = "main_file_cache.dat0";
|
||||
this.DIR = Settings.CACHE_DIR;
|
||||
this.size = -1;
|
||||
doDownload();
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (dat2status == 1 || dat2status == 3) {
|
||||
try {
|
||||
this.url = new URL(Settings.CACHE_URL + "main_file_cache.dat2");
|
||||
this.fileName = "main_file_cache.dat2";
|
||||
this.DIR = Settings.CACHE_DIR;
|
||||
this.size = -1;
|
||||
doDownload();
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} }
|
||||
for (int i = 0; i <= 28; i++) {
|
||||
byte datstatus = Update.updateExists(1,"main_file_cache.idx" + i);
|
||||
if(datstatus == 1 || datstatus == 3) {
|
||||
try {
|
||||
this.url = new URL(Settings.CACHE_URL + "main_file_cache.idx" + i);
|
||||
this.fileName = "main_file_cache.idx" + i;
|
||||
this.DIR = Settings.CACHE_DIR;
|
||||
this.size = -1;
|
||||
doDownload();
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
this.url = new URL(Settings.CACHE_URL + "main_file_cache.idx255");
|
||||
this.fileName = "main_file_cache.idx255";
|
||||
this.DIR = Settings.CACHE_DIR;
|
||||
this.size = -1;
|
||||
doDownload();
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
System.out.println("Finishing up!");
|
||||
status = COMPLETE;
|
||||
allComplete = true;
|
||||
if(ButtonListener.checkRun()){
|
||||
System.out.println("Done with cache :D");
|
||||
AppFrame.playButton.setEnabled(true);
|
||||
AppFrame.pbar.setValue(0);
|
||||
AppFrame.pbar.setString("Click Launch to play "+Settings.SERVER_NAME+"!");
|
||||
stateChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public void doDownload(){
|
||||
AppFrame.playButton.setEnabled(false);
|
||||
RandomAccessFile file = null;
|
||||
InputStream stream = null;
|
||||
status = DOWNLOADING;
|
||||
downloaded = 0;
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
|
||||
connection.connect();
|
||||
|
||||
if (connection.getResponseCode() / 100 != 2) {
|
||||
error();
|
||||
}
|
||||
|
||||
int contentLength = connection.getContentLength();
|
||||
|
||||
if (contentLength < 1) {
|
||||
error();
|
||||
}
|
||||
|
||||
if (size == -1) {
|
||||
size = contentLength;
|
||||
}
|
||||
|
||||
if(!new File(Settings.CACHE_DIR).exists()){
|
||||
System.out.println(".runite-rs does not exist, creating it...");
|
||||
new File(Settings.CACHE_DIR).mkdirs();
|
||||
}
|
||||
file = new RandomAccessFile(DIR + fileName, "rw");
|
||||
file.seek(downloaded);
|
||||
|
||||
stream = connection.getInputStream();
|
||||
|
||||
int lastNum = 0;
|
||||
|
||||
while (status == DOWNLOADING) {
|
||||
|
||||
byte buffer[];
|
||||
|
||||
if (size - downloaded > MAX_BUFFER_SIZE) {
|
||||
buffer = new byte[MAX_BUFFER_SIZE];
|
||||
} else {
|
||||
buffer = new byte[size - downloaded];
|
||||
}
|
||||
|
||||
int read = stream.read(buffer);
|
||||
|
||||
if (read == -1)
|
||||
break;
|
||||
|
||||
int progress = (int) getProgress();
|
||||
|
||||
if (progress > lastNum) {
|
||||
AppFrame.pbar.setValue(progress);
|
||||
lastNum = progress;
|
||||
AppFrame.pbar.setString("Downloading Update: "+progress+"%");
|
||||
}
|
||||
|
||||
file.write(buffer, 0, read);
|
||||
downloaded += read;
|
||||
if(contentLength == downloaded){
|
||||
status = COMPLETE;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
error();
|
||||
} finally {
|
||||
if (file != null)
|
||||
try { file.close(); } catch (Exception e) { }
|
||||
if (stream != null)
|
||||
try { stream.close(); } catch (Exception e) { }
|
||||
}
|
||||
}
|
||||
private void stateChanged() {
|
||||
setChanged();
|
||||
notifyObservers();
|
||||
}
|
||||
}
|
||||
105
src/main/java/rs09/net/Checksum.java
Normal file
105
src/main/java/rs09/net/Checksum.java
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
package rs09.net;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
|
||||
public class Checksum {
|
||||
|
||||
public static String getLocalChecksum() {
|
||||
File local = new File(Settings.SAVE_DIR + Settings.SAVE_NAME);
|
||||
try (FileInputStream fis = new FileInputStream(local)) {
|
||||
return Checksum.calculateMd5(fis);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
AppFrame.pbar.setString(e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getLocalChecksum(String file) {
|
||||
File local = new File(file);
|
||||
try (FileInputStream fis = new FileInputStream(local)) {
|
||||
return Checksum.calculateMd5(fis);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
AppFrame.pbar.setString(e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getRemoteChecksum() {
|
||||
try (InputStream stream = new URL(Settings.DOWNLOAD_URL).openStream()) {
|
||||
return Checksum.calculateMd5(stream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
AppFrame.pbar.setString(e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getRemoteChecksum(String url) {
|
||||
try (InputStream stream = new URL(url).openStream()) {
|
||||
return Checksum.calculateMd5(stream);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
AppFrame.pbar.setString(e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String calculateMd5(final InputStream instream) {
|
||||
return calculateDigest(instream, "MD5");
|
||||
}
|
||||
|
||||
private static String calculateDigest(final InputStream instream, final String algorithm) {
|
||||
final byte[] buffer = new byte[4096];
|
||||
final MessageDigest messageDigest = getMessageDigest(algorithm);
|
||||
messageDigest.reset();
|
||||
int bytesRead;
|
||||
try {
|
||||
while ((bytesRead = instream.read(buffer)) != -1) {
|
||||
messageDigest.update(buffer, 0, bytesRead);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.err.println("Error making a '" + algorithm + "' digest on the inputstream");
|
||||
}
|
||||
return toHex(messageDigest.digest());
|
||||
}
|
||||
|
||||
public static String toHex(final byte[] ba) {
|
||||
int baLen = ba.length;
|
||||
char[] hexchars = new char[baLen * 2];
|
||||
int cIdx = 0;
|
||||
for (int i = 0; i < baLen; ++i) {
|
||||
hexchars[cIdx++] = hexdigit[(ba[i] >> 4) & 0x0F];
|
||||
hexchars[cIdx++] = hexdigit[ba[i] & 0x0F];
|
||||
}
|
||||
return new String(hexchars);
|
||||
}
|
||||
|
||||
public static MessageDigest getMessageDigest(final String algorithm) {
|
||||
MessageDigest messageDigest = null;
|
||||
try {
|
||||
messageDigest = MessageDigest.getInstance(algorithm);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
System.err.println("The '" + algorithm + "' algorithm is not available");
|
||||
}
|
||||
return messageDigest;
|
||||
}
|
||||
|
||||
private static final char[] hexdigit = {
|
||||
'0', '1', '2', '3', '4', '5',
|
||||
'6', '7', '8', '9', 'a', 'b',
|
||||
'c', 'd', 'e', 'f'
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
182
src/main/java/rs09/net/Download.java
Normal file
182
src/main/java/rs09/net/Download.java
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
package rs09.net;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Observable;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
import rs09.listeners.ButtonListener;
|
||||
|
||||
public class Download extends Observable implements Runnable {
|
||||
|
||||
private static final int MAX_BUFFER_SIZE = 1024;
|
||||
public static final String STATUSES[] = { "Downloading", "Paused", "Complete", "Cancelled", "Error" };
|
||||
|
||||
public static final int DOWNLOADING = 0;
|
||||
public static final int PAUSED = 1;
|
||||
public static final int COMPLETE = 2;
|
||||
public static final int CANCELLED = 3;
|
||||
public static final int ERROR = 4;
|
||||
|
||||
private URL url;
|
||||
private int size;
|
||||
private int downloaded;
|
||||
private int status;
|
||||
|
||||
public Download(String url) {
|
||||
try {
|
||||
this.url = new URL(url);
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
size = -1;
|
||||
downloaded = 0;
|
||||
status = DOWNLOADING;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public float getProgress() {
|
||||
return ((float) downloaded / size) * 100;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void pause() {
|
||||
status = PAUSED;
|
||||
stateChanged();
|
||||
}
|
||||
|
||||
public void resume() {
|
||||
status = DOWNLOADING;
|
||||
stateChanged();
|
||||
download();
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
status = CANCELLED;
|
||||
stateChanged();
|
||||
}
|
||||
|
||||
private void error() {
|
||||
status = ERROR;
|
||||
stateChanged();
|
||||
}
|
||||
|
||||
public void download() {
|
||||
Thread thread = new Thread(this);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private String getFileName(URL url) {
|
||||
String fileName = url.getFile();
|
||||
return fileName.substring(fileName.lastIndexOf('/') + 1);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
AppFrame.playButton.setEnabled(false);
|
||||
RandomAccessFile file = null;
|
||||
InputStream stream = null;
|
||||
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
|
||||
connection.connect();
|
||||
|
||||
if (connection.getResponseCode() / 100 != 2) {
|
||||
error();
|
||||
}
|
||||
|
||||
int contentLength = connection.getContentLength();
|
||||
|
||||
if (contentLength < 1) {
|
||||
error();
|
||||
}
|
||||
|
||||
if (size == -1) {
|
||||
size = contentLength;
|
||||
stateChanged();
|
||||
}
|
||||
|
||||
System.out.println("Trying to create file " + Settings.SAVE_DIR + Settings.SAVE_NAME);
|
||||
if(!new File(Settings.SAVE_DIR).exists()){
|
||||
new File(Settings.SAVE_DIR).mkdir();
|
||||
}
|
||||
if (new File(Settings.SAVE_DIR + Settings.SAVE_NAME).exists()) {
|
||||
new File(Settings.SAVE_DIR + Settings.SAVE_NAME).delete();
|
||||
}
|
||||
new File(Settings.SAVE_DIR + Settings.SAVE_NAME).createNewFile();
|
||||
file = new RandomAccessFile(Settings.SAVE_DIR + Settings.SAVE_NAME, "rw");
|
||||
file.seek(downloaded);
|
||||
|
||||
stream = connection.getInputStream();
|
||||
|
||||
int lastNum = 0;
|
||||
|
||||
while (status == DOWNLOADING) {
|
||||
byte buffer[];
|
||||
|
||||
if (size - downloaded > MAX_BUFFER_SIZE) {
|
||||
buffer = new byte[MAX_BUFFER_SIZE];
|
||||
} else {
|
||||
buffer = new byte[size - downloaded];
|
||||
}
|
||||
|
||||
int read = stream.read(buffer);
|
||||
|
||||
if (read == -1)
|
||||
break;
|
||||
|
||||
int progress = (int) getProgress();
|
||||
|
||||
if (progress > lastNum) {
|
||||
AppFrame.pbar.setValue(progress);
|
||||
lastNum = progress;
|
||||
AppFrame.pbar.setString("Downloading Update: "+progress+"%");
|
||||
}
|
||||
|
||||
file.write(buffer, 0, read);
|
||||
downloaded += read;
|
||||
if(downloaded == contentLength){
|
||||
if(ButtonListener.checkRun()){
|
||||
AppFrame.playButton.setEnabled(true);
|
||||
AppFrame.playButton2.setEnabled(true);
|
||||
AppFrame.pbar.setValue(0);
|
||||
AppFrame.pbar.setString("Click Launch to play "+Settings.SERVER_NAME+"!");
|
||||
stateChanged();
|
||||
}
|
||||
status = COMPLETE;
|
||||
}
|
||||
}
|
||||
|
||||
if (status == COMPLETE) {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
error();
|
||||
} finally {
|
||||
if (file != null)
|
||||
try { file.close(); } catch (Exception e) { }
|
||||
if (stream != null)
|
||||
try { stream.close(); } catch (Exception e) { }
|
||||
}
|
||||
}
|
||||
|
||||
private void stateChanged() {
|
||||
setChanged();
|
||||
notifyObservers();
|
||||
}
|
||||
|
||||
}
|
||||
46
src/main/java/rs09/net/Update.java
Normal file
46
src/main/java/rs09/net/Update.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package rs09.net;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import rs09.Settings;
|
||||
|
||||
public class Update {
|
||||
|
||||
public static byte updateExists(int type, String filename) {
|
||||
if(type == 0) {
|
||||
File file = new File(Settings.SAVE_DIR + Settings.SAVE_NAME);
|
||||
if (!file.exists())
|
||||
return 1;
|
||||
|
||||
String localCheck = Checksum.getLocalChecksum();
|
||||
String remoteCheck = Checksum.getRemoteChecksum();
|
||||
|
||||
if (remoteCheck == null || localCheck == null)
|
||||
return 2;
|
||||
|
||||
if (!remoteCheck.equalsIgnoreCase(localCheck))
|
||||
return 3;
|
||||
|
||||
return 0;
|
||||
} else if (type == 1){
|
||||
System.out.println("Type 1 detected, filename " + filename);
|
||||
File file = new File(Settings.CACHE_DIR + filename);
|
||||
System.out.println("Checking in " + Settings.CACHE_DIR);
|
||||
if (!file.exists())
|
||||
return 1;
|
||||
|
||||
String localCheck = Checksum.getLocalChecksum(Settings.CACHE_DIR + filename);
|
||||
String remoteCheck = Checksum.getRemoteChecksum(Settings.CACHE_URL + filename);
|
||||
|
||||
if (remoteCheck == null || localCheck == null)
|
||||
return 2;
|
||||
|
||||
if (!remoteCheck.equalsIgnoreCase(localCheck))
|
||||
return 3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
37
src/main/java/rs09/threads/PlayersOnline.java
Normal file
37
src/main/java/rs09/threads/PlayersOnline.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package rs09.threads;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.Scanner;
|
||||
|
||||
import rs09.components.AppFrame;
|
||||
|
||||
public class PlayersOnline implements Runnable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while(true) {
|
||||
try {
|
||||
readPlayersOnline();
|
||||
System.gc();
|
||||
Thread.sleep(30000L);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void readPlayersOnline() {
|
||||
try (Scanner scanner = new Scanner(new URL("http://as-pk.net/players.txt").openStream())) {
|
||||
scanner.useDelimiter("/r/n");
|
||||
if (!scanner.hasNextInt()) {
|
||||
AppFrame.playerCount.setText("Error fetching Players Online");
|
||||
return;
|
||||
}
|
||||
int count = scanner.nextInt();
|
||||
AppFrame.playerCount.setText("There are " + count + " player(s) Online!");
|
||||
} catch (Exception e) {
|
||||
AppFrame.playerCount.setText("Error fetching Players Online");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
23
src/main/java/rs09/threads/ServerTime.java
Normal file
23
src/main/java/rs09/threads/ServerTime.java
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
//package fox.threads;
|
||||
//
|
||||
//import fox.components.AppFrame;
|
||||
//import fox.utils.Utils;
|
||||
//
|
||||
//public class ServerTime implements Runnable {
|
||||
//
|
||||
// @Override
|
||||
// public void run() {
|
||||
//
|
||||
// while (true) {
|
||||
// AppFrame.serverTime.setText("Server Time: "+Utils.getServerTime());
|
||||
// try {
|
||||
// Thread.sleep(1000L);
|
||||
// } catch (InterruptedException e) {
|
||||
// // TODO Auto-generated catch block
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
//}
|
||||
36
src/main/java/rs09/utils/ProcessTest.java
Normal file
36
src/main/java/rs09/utils/ProcessTest.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package rs09.utils;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
|
||||
public class ProcessTest {
|
||||
|
||||
private Process proc;
|
||||
|
||||
public ProcessTest(Process proc) {
|
||||
this.proc = proc;
|
||||
}
|
||||
|
||||
public void startTesting() {
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
while(true) {
|
||||
try {
|
||||
proc.exitValue();
|
||||
AppFrame.pbar.setString("Click Launch to play "+Settings.SERVER_NAME+"!");
|
||||
AppFrame.playButton.setEnabled(true);
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
AppFrame.pbar.setString(""+Settings.SERVER_NAME+" is currently running.");
|
||||
Thread.sleep(600L);
|
||||
} catch (InterruptedException ex) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
}
|
||||
116
src/main/java/rs09/utils/Utils.java
Normal file
116
src/main/java/rs09/utils/Utils.java
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
package rs09.utils;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.Font;
|
||||
import java.awt.FontFormatException;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.net.URL;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
import rs09.Settings;
|
||||
import rs09.components.AppFrame;
|
||||
|
||||
public class Utils {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(getServerTime());
|
||||
}
|
||||
|
||||
public static DateFormat df;
|
||||
|
||||
public static String getServerTime() {
|
||||
if (df == null) {
|
||||
df = new SimpleDateFormat("h:mm:ss a");
|
||||
df.setTimeZone(TimeZone.getTimeZone("Australia/Brisbane"));
|
||||
}
|
||||
return df.format(new Date());
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses the ProcessBuilder class to launch the client.jar from the specified
|
||||
* folder
|
||||
*/
|
||||
public static void launchClient(int which) {
|
||||
AppFrame.playButton.setEnabled(true);
|
||||
try {
|
||||
Runtime.getRuntime().exec("java -jar " + Settings.SAVE_DIR + Settings.SAVE_NAME + (which == 1 ? " world=2" : ""),null, new File(System.getProperty("user.home")));
|
||||
System.exit(0);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Failed to launch client! " + e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the server is online or offline by attempting to make a TCP
|
||||
* connection
|
||||
*
|
||||
* @return true if it connects (ie. it is online)
|
||||
*/
|
||||
public static boolean hostAvailabilityCheck() {
|
||||
try (Socket s = new Socket(Settings.SERVER_IP, Settings.SERVER_PORT)) {
|
||||
s.setTcpNoDelay(true);
|
||||
return true;
|
||||
} catch (IOException ex) {
|
||||
/* ignore */
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a custom font from the data/font folder. Font must be either otf or
|
||||
* ttf.
|
||||
*
|
||||
* @param fontName
|
||||
* @param size
|
||||
*/
|
||||
public static void setFont(Component c, String fontName, float size) {
|
||||
try {
|
||||
Font font = Font.createFont(0, Utils.class.getResource("/data/fonts/" + fontName).openStream());
|
||||
GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
genv.registerFont(font);
|
||||
font = font.deriveFont(size);
|
||||
c.setFont(font);
|
||||
} catch (FontFormatException | IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the users browser and goes to the specified URL
|
||||
* @param url
|
||||
*/
|
||||
public static void openWebpage(String url) {
|
||||
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
|
||||
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
|
||||
try {
|
||||
desktop.browse(new URL(url).toURI());
|
||||
} catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static long timeCorrection;
|
||||
private static long lastTimeUpdate;
|
||||
|
||||
public static synchronized long currentTimeMillis() {
|
||||
long l = System.currentTimeMillis();
|
||||
if (l < lastTimeUpdate)
|
||||
timeCorrection += lastTimeUpdate - l;
|
||||
lastTimeUpdate = l;
|
||||
return l + timeCorrection;
|
||||
}
|
||||
|
||||
public static ImageIcon getImage(String name) {
|
||||
return new ImageIcon(Utils.class.getResource("/data/img/" + name));
|
||||
}
|
||||
}
|
||||
34
src/main/java/rs09/utils/encrypt/MD5.java
Normal file
34
src/main/java/rs09/utils/encrypt/MD5.java
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package rs09.utils.encrypt;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
public class MD5 {
|
||||
|
||||
private static String convertToHex(byte[] data) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
int halfbyte = (data[i] >>> 4) & 0x0F;
|
||||
int two_halfs = 0;
|
||||
do {
|
||||
if ((0 <= halfbyte) && (halfbyte <= 9))
|
||||
buf.append((char) ('0' + halfbyte));
|
||||
else
|
||||
buf.append((char) ('a' + (halfbyte - 10)));
|
||||
halfbyte = data[i] & 0x0F;
|
||||
} while (two_halfs++ < 1);
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public static String encrypt(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
|
||||
MessageDigest md;
|
||||
md = MessageDigest.getInstance("MD5");
|
||||
byte[] md5hash = new byte[32];
|
||||
md.update(text.getBytes("iso-8859-1"), 0, text.length());
|
||||
md5hash = md.digest();
|
||||
return convertToHex(md5hash);
|
||||
}
|
||||
|
||||
}
|
||||
BIN
src/main/resources/data/audio/welcomehome.mid
Normal file
BIN
src/main/resources/data/audio/welcomehome.mid
Normal file
Binary file not shown.
BIN
src/main/resources/data/fonts/FontAwesome.ttf
Normal file
BIN
src/main/resources/data/fonts/FontAwesome.ttf
Normal file
Binary file not shown.
BIN
src/main/resources/data/fonts/OpenSans-Light.ttf
Normal file
BIN
src/main/resources/data/fonts/OpenSans-Light.ttf
Normal file
Binary file not shown.
BIN
src/main/resources/data/fonts/OpenSans-Regular.ttf
Normal file
BIN
src/main/resources/data/fonts/OpenSans-Regular.ttf
Normal file
Binary file not shown.
BIN
src/main/resources/data/img/favicon.png
Normal file
BIN
src/main/resources/data/img/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
BIN
src/main/resources/data/img/favicon_large.png
Normal file
BIN
src/main/resources/data/img/favicon_large.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
src/main/resources/data/img/logo.png
Normal file
BIN
src/main/resources/data/img/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
Loading…
Add table
Add a link
Reference in a new issue