From dfbd69f64e511cf25308376cb4ebd688dcddcad0 Mon Sep 17 00:00:00 2001 From: fescen9 Date: Fri, 10 Dec 2010 06:48:09 +0000 Subject: [PATCH] - Renamed markers.csv to markers.txt - Changed format of markers.txt to colon delimited instead of comma (no need to change anything, plugin will read both types and save in the new format) - Added support for warps/homes/spawn from data source (either flatfile or mysql) - Renamed images to be more specific to what they represent (marker = marker.png) for you customizers. - Added fix to mapUpdate to keep marker/player names from conflicting --- DMFlatFileSource.java | 13 ++++ DMMySQLSource.java | 13 ++++ MapManager.java | 139 +++++++++++++++++++++--------------- WebServerRequest.java | 33 ++++++--- build.bat | 23 ++++-- clean.bat | 8 ++- web/home.png | Bin 0 -> 428 bytes web/index.html | 10 ++- web/map.js | 29 +++++--- web/marker.png | Bin 620 -> 681 bytes web/player.png | Bin 0 -> 620 bytes web/sign.png | Bin 681 -> 0 bytes web/spawn.png | Bin 0 -> 943 bytes web/{watch.png => warp.png} | Bin 14 files changed, 183 insertions(+), 85 deletions(-) create mode 100644 DMFlatFileSource.java create mode 100644 DMMySQLSource.java create mode 100644 web/home.png create mode 100644 web/player.png delete mode 100644 web/sign.png create mode 100644 web/spawn.png rename web/{watch.png => warp.png} (100%) diff --git a/DMFlatFileSource.java b/DMFlatFileSource.java new file mode 100644 index 00000000..9eb96eea --- /dev/null +++ b/DMFlatFileSource.java @@ -0,0 +1,13 @@ +/* FlatFileSource class wrapper to expose protected properties */ + +import java.util.List; + +public class DMFlatFileSource extends FlatFileSource { + public List getAllWarps() { + return this.warps; + } + + public List getAllHomes() { + return this.homes; + } +} diff --git a/DMMySQLSource.java b/DMMySQLSource.java new file mode 100644 index 00000000..86b9780f --- /dev/null +++ b/DMMySQLSource.java @@ -0,0 +1,13 @@ +/* MySQLSource class wrapper to expose protected properties */ + +import java.util.List; + +public class DMMySQLSource extends MySQLSource { + public List getAllWarps() { + return this.warps; + } + + public List getAllHomes() { + return this.homes; + } +} diff --git a/MapManager.java b/MapManager.java index a310f729..ebaeb411 100644 --- a/MapManager.java +++ b/MapManager.java @@ -1,11 +1,19 @@ +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.List; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; -import java.util.ArrayList; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -14,17 +22,9 @@ import java.util.ListIterator; import java.util.NoSuchElementException; import java.util.Scanner; import java.util.Vector; -import java.util.Comparator; import java.util.logging.Level; import java.util.logging.Logger; -import java.awt.image.BufferedImage; - -import java.io.File; -import java.io.IOException; - -import java.awt.*; -import java.awt.image.*; import javax.imageio.ImageIO; public class MapManager extends Thread { @@ -66,7 +66,7 @@ public class MapManager extends Thread { public String tilepath = "tiles/"; /* path to markers file */ - public String markerpath = "markers.csv"; + public String markerpath = "markers.txt"; /* port to run web server on */ public int serverport = 8123; @@ -110,7 +110,7 @@ public class MapManager extends Thread { try { tilepath = properties.getString("map-tilepath", "tiles/"); colorsetpath = properties.getString("map-colorsetpath", "colors.txt"); - markerpath = properties.getString("map-markerpath", "markers.csv"); + markerpath = properties.getString("map-markerpath", "markers.txt"); serverport = Integer.parseInt(properties.getString("map-serverport", "8123")); } catch(Exception ex) { log.log(Level.SEVERE, "Exception while reading properties for dynamic map", ex); @@ -590,7 +590,7 @@ public class MapManager extends Thread { } catch(IOException e) { - log.log(Level.SEVERE, "Failed to save markers.csv", e); + log.log(Level.SEVERE, "Failed to save markers.txt", e); } return false; @@ -613,7 +613,7 @@ public class MapManager extends Thread { } catch(IOException e) { - log.log(Level.SEVERE, "Failed to save markers.csv", e); + log.log(Level.SEVERE, "Failed to save markers.txt", e); } } else @@ -656,14 +656,27 @@ public class MapManager extends Thread { while (scanner.hasNextLine()) { String line = scanner.nextLine(); - String[] values = line.split(","); - MapMarker marker = new MapMarker(); - marker.name = values[0]; - marker.owner = values[1]; - marker.px = Double.parseDouble(values[2]); - marker.py = Double.parseDouble(values[3]); - marker.pz = Double.parseDouble(values[4]); - markers.put(marker.name, marker); + String[] values = line.split(":"); + // If user has old style of file (CSV) + if (values.length != 5) + { + values = line.split(","); + } + + if (values.length == 5) + { + MapMarker marker = new MapMarker(); + marker.name = values[0]; + marker.owner = values[1]; + marker.px = Double.parseDouble(values[2]); + marker.py = Double.parseDouble(values[3]); + marker.pz = Double.parseDouble(values[4]); + markers.put(marker.name, marker); + } + else + { + log.log(Level.INFO, "Failed to load marker: " + values[0]); + } } } catch(FileNotFoundException e) @@ -688,7 +701,7 @@ public class MapManager extends Thread { while(it.hasNext()) { MapMarker marker = it.next(); - String line = marker.name + "," + marker.owner + "," + marker.px + "," + marker.py + "," + marker.pz + "\r\n"; + String line = marker.name + ":" + marker.owner + ":" + marker.px + ":" + marker.py + ":" + marker.pz + "\n"; out.write(line); } } @@ -698,7 +711,7 @@ public class MapManager extends Thread { } catch(FileNotFoundException e) { - log.log(Level.SEVERE, "markers.csv not found", e); + log.log(Level.SEVERE, "markers.txt not found", e); } finally { @@ -706,41 +719,53 @@ public class MapManager extends Thread { } } - /* load the warps file (doesn't work with SQL data source) */ - /* find a way to load this from the server itself, loading the file each time isn't good */ - public ArrayList loadWarps() + /* TODO: Is there a cleaner way to get warps/homes than using custom DataSource classes to expose the protected properties? */ + + protected List loadWarps() { - ArrayList warps = new ArrayList(); - Scanner scanner = null; - - try - { - scanner = new Scanner(new FileInputStream("warps.txt"), "UTF-8"); - while (scanner.hasNextLine()) - { - String line = scanner.nextLine(); - String[] values = line.split(":"); - Warp warp = new Warp(); - warp.Name = values[0]; - warp.Location = new Location( - Double.parseDouble(values[1]), - Double.parseDouble(values[2]), - Double.parseDouble(values[3]), - Float.parseFloat(values[4]), - Float.parseFloat(values[5]) - ); - warps.add(warp); - } - } - catch(FileNotFoundException e) - { + PropertiesFile props = new PropertiesFile("server.properties"); - } - finally - { - if (scanner != null) scanner.close(); - } - - return warps; + List warps = null; + + if (props.getString("data-source").equals("flatfile")) { + DMFlatFileSource dataSource = new DMFlatFileSource(); + dataSource.initialize(); + dataSource.loadWarps(); + dataSource.loadHomes(); + warps = dataSource.getAllWarps(); + } + else if (props.getString("data-source").equals("mysql")) { + DMMySQLSource dataSource = new DMMySQLSource(); + dataSource.initialize(); + dataSource.loadWarps(); + dataSource.loadHomes(); + warps = dataSource.getAllWarps(); + } + + return warps; + } + + protected List loadHomes() + { + PropertiesFile props = new PropertiesFile("server.properties"); + + List homes = null; + + if (props.getString("data-source").equals("flatfile")) { + DMFlatFileSource dataSource = new DMFlatFileSource(); + dataSource.initialize(); + dataSource.loadWarps(); + dataSource.loadHomes(); + homes = dataSource.getAllHomes(); + } + else if (props.getString("data-source").equals("mysql")) { + DMMySQLSource dataSource = new DMMySQLSource(); + dataSource.initialize(); + dataSource.loadWarps(); + dataSource.loadHomes(); + homes = dataSource.getAllHomes(); + } + + return homes; } } diff --git a/WebServerRequest.java b/WebServerRequest.java index fe52fd0c..464ad0b0 100644 --- a/WebServerRequest.java +++ b/WebServerRequest.java @@ -1,7 +1,11 @@ -import java.io.*; -import java.net.*; -import java.util.*; - +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.Socket; +import java.util.Date; +import java.util.List; import java.util.logging.Logger; public class WebServerRequest extends Thread { @@ -77,14 +81,25 @@ public class WebServerRequest extends Thread { sb.append(marker.name + " marker " + marker.owner + " " + marker.px + " " + marker.py + " " + marker.pz + "\n"); } - // TODO: Find a way to load the warps from the server. Currently loading the from the flatfile over and over... - ArrayList warps = mgr.loadWarps(); + List warps = mgr.loadWarps(); + List homes = mgr.loadHomes(); - for(Warp warp : warps) - { - sb.append(warp.Name + " warp unknown " + warp.Location.x + " " + warp.Location.y + " " + warp.Location.z + "\n"); + Location spawnLocation = etc.getServer().getSpawnLocation(); + + if (warps != null) { + for(Warp warp : warps) { + sb.append(warp.Name + " warp unknown " + warp.Location.x + " " + warp.Location.y + " " + warp.Location.z + "\n"); + } } + if (homes != null) { + for(Warp warp : homes) { + sb.append(warp.Name + " home " + warp.Name + " " + warp.Location.x + " " + warp.Location.y + " " + warp.Location.z + "\n"); + } + } + + sb.append("Spawn spawn none " + spawnLocation.x + " " + spawnLocation.y + " " + spawnLocation.z + "\n"); + synchronized(mgr.lock) { for(TileUpdate tu : mgr.tileUpdates) { if(tu.at >= cutoff) { diff --git a/build.bat b/build.bat index 2046edbf..2d1b70b3 100644 --- a/build.bat +++ b/build.bat @@ -1,9 +1,24 @@ @ECHO OFF -CD E:\Users\Fescen9\workspace\DynamicMap\branches\fescen9 -del *.class -del ..\..\..\map.jar +CD E:\Projects\DynamicMap\branches\fescen9 + +CALL clean.bat + +MKDIR plugins +MKDIR plugins\web +MKDIR plugins\web\tiles +MKDIR plugins\web\up + javac *.java -cp ..\..\..\Minecraft_Mod.jar;..\..\..\minecraft_server.jar -jar cvf ..\..\..\map.jar *.class +jar cvf plugins\map.jar *.class + + +COPY colors.txt .\plugins +COPY readme.txt .\plugins +COPY .\web\*.* .\plugins\web +COPY .\web\tiles\*.* .\plugins\web\tiles +COPY .\web\up\*.* .\plugins\web\up + +CALL "C:\Program Files\WinRAR\Rar.exe" a -m5 -ed -r DynamicMap.rar .\plugins\*.* PAUSE \ No newline at end of file diff --git a/clean.bat b/clean.bat index 02c0434b..b9d0d0bc 100644 --- a/clean.bat +++ b/clean.bat @@ -1,5 +1,7 @@ @ECHO OFF -CD E:\Users\Fescen9\workspace\DynamicMap\branches\fescen9 -del *.class -del ..\..\..\map.jar \ No newline at end of file +CD E:\Projects\DynamicMap\branches\fescen9 + +DEL /Q *.rar +DEL /Q *.class +RMDIR /S /Q .\plugins \ No newline at end of file diff --git a/web/home.png b/web/home.png new file mode 100644 index 0000000000000000000000000000000000000000..5b15f03d91972545039ccf87464053d071b81127 GIT binary patch literal 428 zcmV;d0aN~oP)P000>X1^@s6#OZ}&0004VNkl6WQ8AUp{_yYF`;#)}FoSa&UZ%}XQpfBJo4t5h9L?K8t z0Ym&lpq&Z{-XV#mgWv7GpW{CK?zjg;QmfTyr_=dF%4{|p%w{tT27~r+IBfm(5^wW% zyLDXGT}L}vmY)iR0^u@C{qx=y;??iY^%0Ap-l{Cos@-P2;cW{I-O$uO&>m=&!b+iqf{!zdhR5us^$nGKI2U#p66jQnZUN~>?DW70k&&rsi0UaW+#y(35udX zmgVduqTG)p_T%^aJ(kO5>cfH{xGV{R;3|nIXOpZ}tE&&)?RH{G7=~vX(&TtN#@4?< W{-EnTc7+oF0000
- warps + Warps
- marker - + Markers +
+ Homes +
+ Spawn +
diff --git a/web/map.js b/web/map.js index f13651b4..5d014da4 100644 --- a/web/map.js +++ b/web/map.js @@ -1,6 +1,6 @@ var setup = { tileUrl: 'http://www.yourdomain.com/minecraft/tiles/', - updateUrl: 'http://www.yourdomain.com/minecraft/up/', + updateUrl: 'http://www.yourdomain.com/minecraft/up/', // Or if using ASP.NET: http://www.yourdomain.com/minecraft/up/default.aspx?lasttimestamp= updateRate: 2000 //Seconds the map should poll for updates. (Seconds) * 1000. The default is 2000 (every 2 seconds). }; @@ -566,6 +566,8 @@ function makeRequest(url, func, type, fail, post, contenttype) var loggedin = new Array(); var showWarps = document.getElementById('showWarps').checked; var showMarkers = document.getElementById('showMarkers').checked; + var showHomes = document.getElementById('showHomes').checked; + var showSpawn = document.getElementById('showSpawn').checked; lasttimestamp = rows[0]; delete rows[0]; @@ -574,6 +576,12 @@ function makeRequest(url, func, type, fail, post, contenttype) for(var line in rows) { var p = rows[line].split(' '); + + // Hack to keep duplicate markers/warps/players from conflicting with eachother + if(p.length == 6) { + p[0] = p[0] + '' + p[1] + ''; + } + loggedin[p[0]] = 1; if(p[0] == '') continue; @@ -599,22 +607,25 @@ function makeRequest(url, func, type, fail, post, contenttype) labelClass: "labels", clickable: false, flat: true, - icon: new google.maps.MarkerImage('marker.png', new google.maps.Size(28, 28), new google.maps.Point(0, 0), new google.maps.Point(14, 14)) + icon: new google.maps.MarkerImage('player.png', new google.maps.Size(28, 28), new google.maps.Point(0, 0), new google.maps.Point(14, 14)) }); markers[p[0]] = marker; } } else if(p.length == 6) { - var image = 'sign.png'; - if (p[1] == 'warp') - { - image = 'watch.png'; - } + var image = p[1] + '.png'; + + var hideMarker = ( + (p[1] == 'warp' && showWarps == false) || + (p[1] == 'marker' && showMarkers == false) || + (p[1] == 'home' && showHomes == false) || + (p[1] == 'spawn' && showSpawn == false) + ); if(p[0] in markers) { var m = markers[p[0]]; - if ((p[1] == 'warp' && showWarps == false) || (p[1] == 'marker' && showMarkers == false)) { + if (hideMarker) { m.setMap(null); continue; } @@ -625,7 +636,7 @@ function makeRequest(url, func, type, fail, post, contenttype) var converted = fromWorldToLatLng(p[3], p[4], p[5]); m.setPosition(converted); } else { - if ((p[1] == 'warp' && showWarps == false) || (p[1] == 'marker' && showMarkers == false)) { + if (hideMarker) { continue; } diff --git a/web/marker.png b/web/marker.png index 1fd60c712766431227366cbb3bc35d39fd22a054..8d8573ceffab5aef9d2417b6e5aeab7ce89b7604 100644 GIT binary patch literal 681 zcmV;a0#^NrP)P000>X1^@s6#OZ}&0007TNkl1we^xo3arX@&0OVAC0L=#|POdxJ_V`7Z|#J}KwaOqN)E)5ALMiwdfHOESfh%;UxP)BaA; zG%e(&N+94T77g`XU|(&cs5+t#d;$!_BLF?~E<|psJbAiGek{wv)yck))wLqeSH6%L z@DU9O+`c&j&@=BsEE^Qfrd(_BVPluk;RK0zn8MZ`TH7QV5{O1Z3}q5-Sks+T-rlJK zPQFt+6k=LXku556osXM!?%tSU@?x09e@@?%+sGTmLuEgQLI^YTpraPmWH zA4oJ3V19PooyewR0L)D1P*j~{RA4aa)Gp)(nWyWGhXnwdE!)i<3W-I6%+HN`471at zo?1SaBA-in>b>Ouy-?h#vhuFL?Bxk^=h7^_SVwNE0E`T$nY%LKdSAaS@V!*!`n4$l zo-MC?JcmMb!=x@L=!OY6x2`TJ0Pb;hq^KHoNx`x#0P2$B@%#cQSND1F=v8+C&1v9H z&7xd$fEDQno7-g?ibX@|HduG2*{YbtlU8qtC<}BPthCPzVp_J-_-HsV zb(Hze!lkv&SW< P00000NkvXXu0mjfdR0DT literal 620 zcmV-y0+aoTP)Px#24YJ`L;(K)0000pCw%h&000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ z3JWIA-{K4a000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0005UNklEa8>rr2iL^kGP` z5Q`9t5J3pW-{M@|3r=Fx*#!2$g#-8Uf1EpW&iw;PtTRfiIlioPDhR5;A2`-)Tx0~n51_LYEGd6M zENCfBdz#JWdMjqLxze;JXbIv)x{F}PilVl%Y~)FHB%MjByK`GEKXZE)SvFD>wFSqk z0U=ftwKX2!If>trnhS5@?`pcU(s+F5pz(4bR0S=svW}$f6=2V6`=#0}8@cPPE(4w` zO?zHt?}7PHtJJ>fc|H)T3d2k92Wfr)=3lS~S zTrQC$b=SkMCQXAluDQHjz)&#_(`@7ct*I@3763F2)2!tIciG$9arvJDfTm%ZyBizc zK5)upa_{nQ1!$XwX-@NiLk5Femwzt+Xd0$D%meo6cAqy+3jmsiY4%^g7Hew!4UV>r z4DYo+PaAoF|FOjgmip57ny8zbH%(Nqk`XS@CIPx#24YJ`L;(K)0000pCw%h&000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ z3JWIA-{K4a000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0005UNklEa8>rr2iL^kGP` z5Q`9t5J3pW-{M@|3r=Fx*#!2$g#-8Uf1EpW&iw;PtTRfiIlioPDhR5;A2`-)Tx0~n51_LYEGd6M zENCfBdz#JWdMjqLxze;JXbIv)x{F}PilVl%Y~)FHB%MjByK`GEKXZE)SvFD>wFSqk z0U=ftwKX2!If>trnhS5@?`pcU(s+F5pz(4bR0S=svW}$f6=2V6`=#0}8@cPPE(4w` zO?zHt?}7PHtJJ>fc|H)T3d2k92Wfr)=3lS~S zTrQC$b=SkMCQXAluDQHjz)&#_(`@7ct*I@3763F2)2!tIciG$9arvJDfTm%ZyBizc zK5)upa_{nQ1!$XwX-@NiLk5Femwzt+Xd0$D%meo6cAqy+3jmsiY4%^g7Hew!4UV>r z4DYo+PaAoF|FOjgmip57ny8zbH%(Nqk`XS@CIP000>X1^@s6#OZ}&0007TNkl1we^xo3arX@&0OVAC0L=#|POdxJ_V`7Z|#J}KwaOqN)E)5ALMiwdfHOESfh%;UxP)BaA; zG%e(&N+94T77g`XU|(&cs5+t#d;$!_BLF?~E<|psJbAiGek{wv)yck))wLqeSH6%L z@DU9O+`c&j&@=BsEE^Qfrd(_BVPluk;RK0zn8MZ`TH7QV5{O1Z3}q5-Sks+T-rlJK zPQFt+6k=LXku556osXM!?%tSU@?x09e@@?%+sGTmLuEgQLI^YTpraPmWH zA4oJ3V19PooyewR0L)D1P*j~{RA4aa)Gp)(nWyWGhXnwdE!)i<3W-I6%+HN`471at zo?1SaBA-in>b>Ouy-?h#vhuFL?Bxk^=h7^_SVwNE0E`T$nY%LKdSAaS@V!*!`n4$l zo-MC?JcmMb!=x@L=!OY6x2`TJ0Pb;hq^KHoNx`x#0P2$B@%#cQSND1F=v8+C&1v9H z&7xd$fEDQno7-g?ibX@|HduG2*{YbtlU8qtC<}BPthCPzVp_J-_-HsV zb(Hze!lkv&SW< P00000NkvXXu0mjfdR0DT diff --git a/web/spawn.png b/web/spawn.png new file mode 100644 index 0000000000000000000000000000000000000000..177650bbb1dcdc9ee41f1a293e575afc0cd6c6d1 GIT binary patch literal 943 zcmV;g15o^lP)P000>X1^@s6#OZ}&000AaNkl&7|w62mAgf%Q_7QP$+T4RYJ1W5mY>?=naZ?P=-3 z=Y_ID*==hUTFBVg4(^t?vOAoa64lUVjau1_99fojNTk^{mNnR(i@x`LzxRE<=ljv? z&~+XEH%P1C_V)IYog#j}U&`fj-wlg9td!((Ia@O0@i@P^xp{F|yiZA~RC=#eD$N=; z$8i7vmSrtTd_EsnEEWrfoy}$+WV6|a!$@X}#o`Uao|>8h07RovOOjTrHQt-Iyu6HF z5{Itq5CkEyva<3mK@gn7;TSi9wOS1T;BvVvNhpfK^z<|$kq9D@2r8AzU)5^$#rpdC z2hnJ>MgoAMDBgO#p5{2t+#&#Ix7&SRE6_BJv9U3PLLuz#?vB^%^>IZ}ya3>snVHc& z9uJbqBpQtd8jZ%tg1z|d*)wx|n_+O9WsypykV>U+@9Pb`5)V($MAJ0LvW!lrW4m~$ z+l61#000Vr1CqoMK>z?wPEH_661rL!rV>rlpeV|}Qm}S(gv+uF0N5u9H1%z6F% z2{iS@`Z4yx<#K_hX@r|igqux-x~HqWPf>X8bXw-xCZTB>i9`bP)hZUAJ~jRMKwxAp z2>{)07osS_>-B=7D9eN`io(u_!m=!%-pDhxBmn5Tj&{2Zk{m5;pCr*3u@F^N(Qdcl z)^!j#J9vtskjZ4g^E@h*ia9wL44PwtAmDbpp{goWRUIfQilS-9Vll*GG5r3^_mJO6 zr%IeoCjx;0JRZ+L0Rx(*4SkfluJ`4UBngILK%8CazWrHTTtq&fN4Z?a;o%`RHa0A` z#Q;syn4g~?8Yk!G=I*K;g{{~4%jZ}>5RaR|iHV7k1jon61DB;GiFng|g?BH_-gl8s z$)W2y{-{2ldjC>p@9NS=xVrSQsl*NhK^XAuS0CZeCy%hTvzIxax>zOwfMHna%EGm~ zKA%7R>rW5U2L}guElG$c(zb}yj)Ipj{`rT6!(slyu?3b)n^W?%T^ z(;FBCK@iZAMEv~Vp6R>3viikm`PEg!?mPG^3)j9mKbd}P*lS-F?u;Ul