diff --git a/HIRUNNER/hirunner.fla b/HIRUNNER/hirunner.fla
deleted file mode 100644
index 7047c63..0000000
Binary files a/HIRUNNER/hirunner.fla and /dev/null differ
diff --git a/HIRUNNER/hirunner_noswf.exe b/HIRUNNER/hirunner_noswf.exe
deleted file mode 100644
index 25f6728..0000000
Binary files a/HIRUNNER/hirunner_noswf.exe and /dev/null differ
diff --git a/HIRUNNER/server.bat b/HIRUNNER/server.bat
deleted file mode 100644
index bf00ae9..0000000
--- a/HIRUNNER/server.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-start hirunner.exe "http://127.0.0.1/horseisle_projector.swf?SERVER=127.0.0.1&PORT=12321"
\ No newline at end of file
diff --git a/HIRUNNER/hirunner.exe b/Horse Isle Launcher/hirunner.exe
similarity index 99%
rename from HIRUNNER/hirunner.exe
rename to Horse Isle Launcher/hirunner.exe
index c39bf99..b6f043e 100644
Binary files a/HIRUNNER/hirunner.exe and b/Horse Isle Launcher/hirunner.exe differ
diff --git a/Horse Isle Launcher/hirunner.fla b/Horse Isle Launcher/hirunner.fla
new file mode 100644
index 0000000..e0813c7
Binary files /dev/null and b/Horse Isle Launcher/hirunner.fla differ
diff --git a/Horse Isle Launcher/resources/app/favicon.ico b/Horse Isle Launcher/resources/app/favicon.ico
new file mode 100644
index 0000000..b16425a
Binary files /dev/null and b/Horse Isle Launcher/resources/app/favicon.ico differ
diff --git a/Horse Isle Launcher/resources/app/main.js b/Horse Isle Launcher/resources/app/main.js
new file mode 100644
index 0000000..f6bafef
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/main.js
@@ -0,0 +1,18 @@
+const { app, BrowserWindow } = require('electron')
+
+function createWindow () {
+ const win = new BrowserWindow({
+ width: 790,
+ height: 500,
+ webPreferences: {
+ nodeIntegration: true
+ }
+ })
+
+ win.loadFile('src/index.html')
+ win.setMenu(null)
+ win.setTitle("Horse Isle - Secret Land of Horses")
+ win.setIcon("favicon.ico")
+ }
+
+ app.whenReady().then(createWindow)
\ No newline at end of file
diff --git a/Horse Isle Launcher/resources/app/package.json b/Horse Isle Launcher/resources/app/package.json
new file mode 100644
index 0000000..4859cd0
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "h1-launcher",
+ "version": "1.0.0",
+ "description": "",
+ "main": "main.js",
+ "scripts": {
+ "start": "electron .",
+ "build": "electron-packager . \"H1 Launcher\" --icon=favicon.ico --platform=win32 --arch=ia32"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "devDependencies": {
+ "electron": "^11.1.1",
+ "electron-packager": "^15.2.0"
+ },
+ "dependencies": {}
+}
diff --git a/Horse Isle Launcher/resources/app/src/index.html b/Horse Isle Launcher/resources/app/src/index.html
new file mode 100644
index 0000000..5fe11bf
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/index.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+

+
+
+
+
+
\ No newline at end of file
diff --git a/Horse Isle Launcher/resources/app/src/inputHandler.js b/Horse Isle Launcher/resources/app/src/inputHandler.js
new file mode 100644
index 0000000..7ccba81
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/inputHandler.js
@@ -0,0 +1,65 @@
+const util = require('util');
+ const exec = util.promisify(require('child_process').exec)
+
+const urlInput = document.getElementById("urlInput")
+const ipInput = document.getElementById("ipInput")
+const portInput = document.getElementById("portInput")
+const enterButton = document.getElementById("enterButton")
+const settingsButton = document.getElementById("settingsButton")
+
+let showServerList = false;
+
+const lastDetails = JSON.parse(localStorage.getItem("lastDetails"));
+
+if (lastDetails) {
+ urlInput.value = lastDetails.url;
+ ipInput.value = lastDetails.ip;
+ portInput.value = lastDetails.port;
+}
+
+enterButton.addEventListener("click", async () => {
+ const url = urlInput.value;
+ const ip = ipInput.value;
+ const port = portInput.value;
+
+ localStorage.setItem("lastDetails", JSON.stringify({
+ url,
+ ip,
+ port
+ }))
+
+ runCommand(`hirunner.exe "${url}?SERVER=${ip}&PORT=${port}"`)
+ setTimeout(() => {
+ window.close()
+ }, 500);
+})
+
+
+async function runCommand(command) {
+ const { stdout, stderr } = await exec(command);
+ if(DEBUG_MODE)
+ {
+ console.log('stdout:', stdout);
+ console.log('stderr:', stderr);
+ }
+ }
+
+
+serversList.addEventListener("click", (event) => {
+ if (!event.target.closest(".item")) return;
+ const name = event.target.innerText;
+ const fullUrl = new URL(officialServers[name].url);
+ const url = fullUrl.protocol + "//" + fullUrl.host + fullUrl.pathname;
+ const ip = fullUrl.searchParams.get("SERVER");
+ const port = fullUrl.searchParams.get("PORT");
+
+
+ urlInput.value = url;
+ ipInput.value = ip;
+ portInput.value = port;
+})
+
+settingsButton.addEventListener("click", () => {
+ serversList.style.display = showServerList ? "none" : "block";
+ showServerList = !showServerList;
+})
\ No newline at end of file
diff --git a/Horse Isle Launcher/resources/app/src/media/background.webm b/Horse Isle Launcher/resources/app/src/media/background.webm
new file mode 100644
index 0000000..e30b270
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/background.webm differ
diff --git a/Horse Isle Launcher/resources/app/src/media/bg-music.mp3 b/Horse Isle Launcher/resources/app/src/media/bg-music.mp3
new file mode 100644
index 0000000..8fe7dd9
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/bg-music.mp3 differ
diff --git a/Horse Isle Launcher/resources/app/src/media/enter-button.png b/Horse Isle Launcher/resources/app/src/media/enter-button.png
new file mode 100644
index 0000000..7c400a3
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/enter-button.png differ
diff --git a/Horse Isle Launcher/resources/app/src/media/logo.png b/Horse Isle Launcher/resources/app/src/media/logo.png
new file mode 100644
index 0000000..37444b0
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/logo.png differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/bay.gif b/Horse Isle Launcher/resources/app/src/media/servericons/bay.gif
new file mode 100644
index 0000000..6c105d2
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/bay.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/beta.gif b/Horse Isle Launcher/resources/app/src/media/servericons/beta.gif
new file mode 100644
index 0000000..6ea643b
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/beta.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/black.gif b/Horse Isle Launcher/resources/app/src/media/servericons/black.gif
new file mode 100644
index 0000000..366066c
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/black.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/brown.gif b/Horse Isle Launcher/resources/app/src/media/servericons/brown.gif
new file mode 100644
index 0000000..fa19338
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/brown.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/chestnut.gif b/Horse Isle Launcher/resources/app/src/media/servericons/chestnut.gif
new file mode 100644
index 0000000..36434db
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/chestnut.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/cremello.gif b/Horse Isle Launcher/resources/app/src/media/servericons/cremello.gif
new file mode 100644
index 0000000..bb398cb
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/cremello.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/dun.gif b/Horse Isle Launcher/resources/app/src/media/servericons/dun.gif
new file mode 100644
index 0000000..7e05a57
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/dun.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/grey.gif b/Horse Isle Launcher/resources/app/src/media/servericons/grey.gif
new file mode 100644
index 0000000..2e4ebeb
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/grey.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/palomino.gif b/Horse Isle Launcher/resources/app/src/media/servericons/palomino.gif
new file mode 100644
index 0000000..dcb7854
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/palomino.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/pinto.gif b/Horse Isle Launcher/resources/app/src/media/servericons/pinto.gif
new file mode 100644
index 0000000..e9255fb
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/pinto.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/roan.gif b/Horse Isle Launcher/resources/app/src/media/servericons/roan.gif
new file mode 100644
index 0000000..2392615
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/roan.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/servericons/white.gif b/Horse Isle Launcher/resources/app/src/media/servericons/white.gif
new file mode 100644
index 0000000..bb398cb
Binary files /dev/null and b/Horse Isle Launcher/resources/app/src/media/servericons/white.gif differ
diff --git a/Horse Isle Launcher/resources/app/src/media/settings-button.svg b/Horse Isle Launcher/resources/app/src/media/settings-button.svg
new file mode 100644
index 0000000..a216049
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/media/settings-button.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/Horse Isle Launcher/resources/app/src/official-servers.json b/Horse Isle Launcher/resources/app/src/official-servers.json
new file mode 100644
index 0000000..df2c011
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/official-servers.json
@@ -0,0 +1,46 @@
+{
+ "Pinto": {
+ "url": "http://pinto.horseisle.com/horseisle.swf?SERVER=pintoip&PORT=443",
+ "icon": "pinto.gif"
+ },
+ "Roan": {
+ "url": "http://roan.horseisle.com/horseisle.swf?SERVER=roanip&PORT=443",
+ "icon": "roan.gif"
+ },
+ "Palomino": {
+ "url": "http://palomino.horseisle.com/horseisle.swf?SERVER=palominoip&PORT=443",
+ "icon": "palomino.gif"
+ },
+ "Bay": {
+ "url": "http://bay.horseisle.com/horseisle.swf?SERVER=bayip&PORT=443",
+ "icon": "bay.gif"
+ },
+ "Dun": {
+ "url": "http://dun.horseisle.com/horseisle.swf?SERVER=dunip&PORT=443",
+ "icon": "dun.gif"
+ },
+ "Grey": {
+ "url": "http://grey.horseisle.com/horseisle.swf?SERVER=greyip&PORT=443",
+ "icon": "grey.gif"
+ },
+ "White": {
+ "url": "http://white.horseisle.com/horseisle.swf?SERVER=whiteip&PORT=443",
+ "icon": "white.gif"
+ },
+ "Chestnut": {
+ "url": "http://chestnut.horseisle.com/horseisle.swf?SERVER=chestnutip&PORT=443",
+ "icon": "chestnut.gif"
+ },
+ "Cremello": {
+ "url": "http://cremello.horseisle.com/horseisle.swf?SERVER=cremelloip&PORT=443",
+ "icon": "cremello.gif"
+ },
+ "Brown": {
+ "url": "http://brown.horseisle.com/horseisle.swf?SERVER=brownip&PORT=443",
+ "icon": "brown.gif"
+ },
+ "Black": {
+ "url": "http://black.horseisle.com/horseisle.swf?SERVER=blackip&PORT=443",
+ "icon": "black.gif"
+ }
+}
\ No newline at end of file
diff --git a/Horse Isle Launcher/resources/app/src/populateServersList.js b/Horse Isle Launcher/resources/app/src/populateServersList.js
new file mode 100644
index 0000000..3ba8ff2
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/populateServersList.js
@@ -0,0 +1,10 @@
+const officialServers = require("./official-servers.json");
+
+const serversList = document.getElementById("serversList")
+
+
+for (let i = 0; i < Object.keys(officialServers).length; i++) {
+ const name = Object.keys(officialServers)[i];
+ const icon = officialServers[name].icon
+ serversList.innerHTML+= `
${name}
`
+}
\ No newline at end of file
diff --git a/Horse Isle Launcher/resources/app/src/style.css b/Horse Isle Launcher/resources/app/src/style.css
new file mode 100644
index 0000000..9009479
--- /dev/null
+++ b/Horse Isle Launcher/resources/app/src/style.css
@@ -0,0 +1,106 @@
+body, html {
+ margin: 0;
+ height: 100%;
+ font-family: Arial, Helvetica, sans-serif;
+}
+
+.background {
+ object-fit: cover;
+ position: absolute;
+ z-index: -1;
+}
+.content {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ width: 100%;
+ align-items: center;
+
+}
+.logo {
+ background-image: url("./media/logo.png");
+ image-rendering: -webkit-optimize-contrast;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ height: 220px;
+ width: 220px;
+ margin-top: 30px;
+ margin-bottom: 50px;
+}
+.center-content {
+ display: flex;
+ flex-direction: column;
+ margin: auto;
+ align-items: center;
+}
+.input {
+ display: flex;
+ color: white;
+ text-shadow: 2px 2px 2px black;
+ font-size: 20px;
+ font-weight: bold;
+ margin-top: 10px;
+}
+.input .name {
+ width: 70px;
+}
+.input input {
+ border: solid 1px black;
+ outline: none;
+ font-size: 18px;
+ width: 150px;
+ padding-bottom: 2px;
+ padding-top: 2px;
+ box-shadow: 2px 2px 2px 0 black;
+}
+.button {
+ height: 25px;
+ width: 127.95px;
+ margin-top: 15px;
+ cursor: pointer;
+ width: auto;
+}
+.settings-button {
+ height: 18px;
+ width: auto;
+ position: absolute;
+ cursor: pointer;
+ bottom: 15px;
+ right: 10px;
+}
+.servers-list {
+ position: absolute;
+ background-color: #a797a7;
+ bottom: 60px;
+ right: 15px;
+ border: solid 1px black;
+ display: none;
+ flex-shrink: 0;
+ max-height: 300px;
+ overflow-y: auto;
+}
+.servers-list .item {
+ background: #cccccc;
+ border: solid 3px white;
+ margin: 5px;
+ font-weight: bold;
+ padding: 5px;
+ cursor: pointer;
+ color: #333333;
+ padding-right: 20px;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ box-shadow: 2px 2px 2px 0 black;
+}
+.servers-list .item .name {
+ margin-left: auto;
+}
+.servers-list .item img {
+ width: 20px;
+ height: auto;
+ margin-right: 10px;
+ flex-shrink: 0;
+}
\ No newline at end of file
diff --git a/Horse Isle Server/Horse Isle Server/Game/DroppedItems.cs b/Horse Isle Server/Horse Isle Server/Game/DroppedItems.cs
index 761abe6..716ad93 100644
--- a/Horse Isle Server/Horse Isle Server/Game/DroppedItems.cs
+++ b/Horse Isle Server/Horse Isle Server/Game/DroppedItems.cs
@@ -22,6 +22,12 @@ namespace HISP.Game
int count = 0;
foreach(DroppedItem droppedItem in dropedItems)
{
+ if (droppedItem.instance == null)
+ {
+ continue;
+ RemoveDroppedItem(droppedItem);
+ }
+
if(droppedItem.instance.ItemId == item.Id)
{
count++;
diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs
index 252e759..5c9142c 100644
--- a/Horse Isle Server/Horse Isle Server/Server/Database.cs
+++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs
@@ -1444,7 +1444,7 @@ namespace HISP.Server
throw new Exception("Userid " + id + " Allready in userext.");
MySqlCommand sqlCommand = db.CreateCommand();
- sqlCommand.CommandText = "INSERT INTO UserExt VALUES(@id,@x,@y,@timestamp,0,0,0,'','',0,0,'NO',0,0,1000,1000,1000, 360)";
+ sqlCommand.CommandText = "INSERT INTO UserExt VALUES(@id,@x,@y,@timestamp,0,0,0,'','',0,0,'NO',0,0,1000,1000,1000, 180)";
sqlCommand.Parameters.AddWithValue("@id", id);
sqlCommand.Parameters.AddWithValue("@timestamp", Convert.ToInt32(new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()));
sqlCommand.Parameters.AddWithValue("@x", Map.NewUserStartX);
diff --git a/WebInterface/game-site/horseisle_projector.swf b/WebInterface/game-site/horseisle_projector.swf
index 784919a..b847a31 100644
Binary files a/WebInterface/game-site/horseisle_projector.swf and b/WebInterface/game-site/horseisle_projector.swf differ