-
Posts
1157 -
Joined
-
Last visited
-
Days Won
2
Content Type
Profiles
Forums
Events
Everything posted by Moa
-
Actually you can auto-kick people in FC2 pretty easily if they don't have a callsign or UCID (that is, people with cracked versions of the game). Turns out these hackers appear to have legitimate versions (that is, they have a UCID - many thanks for the info Case). It is just as easy to then ban by UCID, which is what the 104th have done. For the hackers to get connected again they would either have to go to a cracked game (and get auto-kicked for no UCID) or buy a new license (which I guarantee they will tire of well before the server admins do, provided we keep sharing data to make such bans easy) In FC2 you can find out when new objects appear in game using the export functionality (on the server, even if global exports are disabled - but this requires a customized export script to run the check code). You can then detect when a large number of objects are created in-game and then choose to log/kick. There might be a small performance penalty when you compare the old list of objects to the new list of objects each time, but it shouldn't be too bad. Not volunteering to do this though - besides my pathological hate of Lua (I do it only because sometimes there is no alternative) I also have too much to do at the moment.
-
Kinect PC is coming. Bye bye TrackIR?
Moa replied to WynnTTr's topic in PC Hardware and Related Software
Nice thing about current version of Kinect is that it also works on Linux and Mac. Unlike TrackIR with their draconian licensing policies and deliberate obfuscating of the data stream to prevent third-party integration libraries from working with it. I hope TrackIR dies and is replaced by Kinect - since the latter is more liberal in how *we* might like to use it. That will be justice for Naturalpoint. -
Hook in UDP of export.lua with own c# program
Moa replied to Gremlin77's topic in PC Hardware and Related Software
1) Use Java instead of C#, it means you can run your program on any device you have (plus the tools are free - which means if you give your software to anyone else they won't have to pay for [or steal] the tools). 2) The TCP(!) sockets work fine on localhost:8079 here is the Java-code I used to read position data from a custom export.lua. This is for an un-released mod (in testing by the 104th) that shows the player's aircraft on a moving map (the excellent TC-1 by igormk), similar to the Ka-50 ABRIS or A-10C TAD, but for the aircraft of Flaming Cliffs 2: package jacmi.simclient; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.ConnectException; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * A class that can be run to read simulation data from a LockOn game instance. * * @author Mike. */ public class SimClient implements Runnable { private String host; private int port; private boolean started; private boolean shouldStop; private int serialNumber; private Socket socket; private InputStream inputStream; private InputStreamReader inputReader; private LineNumberReader reader; private List<SimDataListener> simDataListeners = new ArrayList<SimDataListener>(); public static void main(String args[]) { SimClient client = new SimClient(); client.setHost("localhost"); client.setPort(8079); client.run(); } public SimClient() { } public void connect(String host, int port) { if (host == null || host.trim().isEmpty()) { throw new IllegalArgumentException("Cannot connect as the specified host had an invalid value of '" + host + "'"); } if (port < 1 || port > 65535) { throw new IllegalArgumentException("Cannot connect to host '" + host + "' as the specified port " + port + " is invalid"); } // If we are already connect to the requested host and port then we // don't have to do anything. boolean socketAvailable = isSocketAvailable(); if (socketAvailable && this.host.equals(host.trim()) && (port == this.port)) { return; // The socket is already connected to the specified host and port, and is still open. } if (socket != null) { disconnect(); } try { socket = new Socket(host, port); this.host = host; this.port = port; System.out.println("Connected to simulator at host '" + host + "', port " + port); socket.setReuseAddress(true); socket.setKeepAlive(true); inputStream = socket.getInputStream(); BufferedInputStream bufferedStream = new BufferedInputStream(inputStream); inputReader = new InputStreamReader(bufferedStream); reader = new LineNumberReader(inputReader); } catch (UnknownHostException th) { System.err.println("Cannot connect as the host '" + host + "' is not known (port " + port + ")"); } catch (ConnectException ex) { // Ignore connection problems since there is the possibility that // the simulation is not yet running. } catch (Throwable th) { System.err.println("A problem occured when trying to connect to host '" + host + "', port " + port); th.printStackTrace(System.err); } } public void disconnect() { if (socket != null) { System.err.println("Disconnecting ..."); try { reader.close(); } catch (Throwable th) { // Ignore problems closing the stream. th.printStackTrace(System.err); } try { inputReader.close(); } catch (Throwable th) { // Ignore problems closing the stream. th.printStackTrace(System.err); } try { inputStream.close(); } catch (Throwable th) { // Ignore problems closing the stream. th.printStackTrace(System.err); } try { socket.close(); } catch (Throwable th) { th.printStackTrace(System.err); } finally { reader = null; inputReader = null; inputStream = null; socket = null; } } } public void run() { System.out.println("Started running ..."); int readCycle = 0; int lastReportedSerialNumber = 0; long startTime = System.currentTimeMillis(); long lastNonNullDataRead = 0; while (!shouldStop) { // Wait until we've established a connection. waitUntilConnected(); ++readCycle; if (shouldStop) { break; } // Read data from socket. boolean socketAvailable = isSocketAvailable(); if (!shouldStop && socketAvailable) { try { long startReadTimestamp = System.currentTimeMillis(); SimData latestReading = readData(); long endReadTimestamp = System.currentTimeMillis(); if (latestReading != null) { latestReading.setLocalTime(new Date()); latestReading.setSerialNumber(serialNumber); latestReading.setStartReadTimestamp(startReadTimestamp); latestReading.setEndReadTimestamp(endReadTimestamp); latestReading.setReadDurationMillis(endReadTimestamp - startReadTimestamp); ++serialNumber; // Tell any listeners that we have new data. notifySimDataListeners(latestReading); //System.out.println("Read data at T+" + (endReadTimestamp - startTime) + "ms, read duration = " + latestReading.getReadDurationMillis() + " ms"); socketAvailable = isSocketAvailable(); lastNonNullDataRead = endReadTimestamp; } else { socketAvailable = isSocketAvailable(); if ( (lastNonNullDataRead + 1000) < System.currentTimeMillis()) { lastNonNullDataRead = System.currentTimeMillis(); //System.out.println("readData() was called but returned null for the last 1s, socketAvailable = " + socketAvailable); if (socketAvailable && socket.getInputStream().available() < 0) { System.out.println("Bytes available " + socket.getInputStream().available()); } } } // Sleep for a little time before looking to read data again. try { Thread.sleep(40); } catch (InterruptedException ex) { // Ignore interruptions. } } catch (Throwable th) { th.printStackTrace(System.err); } } else { System.out.println("Socket not available for reading!"); } if (serialNumber > lastReportedSerialNumber) { //System.out.println("Read data count = " + serialNumber); //lastReportedSerialNumber = serialNumber; } } } public synchronized void stop() { shouldStop = true; } public SimData readData() throws Throwable { // If there are no bytes available to be read then we return nothing. boolean socketAvailable = isSocketAvailable(); if (!socketAvailable) { System.out.println("readData() socketAvailable = " + socketAvailable); return null; } String endDataMessage = "!!End of Sim Data!!"; List<String> lines = new ArrayList<String>(); boolean done = false; boolean reachedEndOfStream = false; boolean connectionReset = false; try { while (!done) { String line = reader.readLine(); if (line != null) { lines.add(line); if (line.trim().equals(endDataMessage)) { done = true; } } else { done = true; reachedEndOfStream = true; } } } catch (Throwable th) { if (th.getMessage().contains("Connection reset")) { connectionReset = true; } else { th.printStackTrace(System.err); } done = true; throw th; } if (reachedEndOfStream || connectionReset) { disconnect(); // Disconnect so we can re-establish a connection later. } // Convert lines into SimData object. SimData data = null; if (!lines.isEmpty()) { SimDataCodec codec = new SimDataCodec(); data = codec.parseSimData(lines); } return data; } public void waitUntilConnected() { boolean socketAvailable = isSocketAvailable(); while(!shouldStop && !socketAvailable) { try { if (socket != null) { disconnect(); } connect(host, port); socketAvailable = isSocketAvailable(); if (socketAvailable) { return; // We've got a connection, finish waiting. } } catch (Throwable th) { // Don't do anything, perhaps the simulation has not yet started. th.printStackTrace(); } // We don't have a connection. Wait a bit before trying again. final long waitTimeMillis = 500; final long waitFinishTime = System.currentTimeMillis() + waitTimeMillis; while (System.currentTimeMillis() < waitFinishTime) { try { if (shouldStop) { return; // We're stopping the program, so finish waiting. } Thread.sleep(10); // Sleep for a little bit to allow other programs to run. } catch (InterruptedException ex) { // Ignore interuptions. } } } } /** * @return the host */ public String getHost() { return host; } /** * @param host the host to set */ public void setHost(String host) { this.host = host; } /** * @return the port */ public int getPort() { return port; } /** * @param port the port to set */ public void setPort(int port) { this.port = port; } /** * @return the started */ public boolean isStarted() { return started; } public boolean isSocketAvailable() { if (socket == null) { return false; } if (socket.isClosed()) { return false; } if (!socket.isConnected()) { return false; } if (socket.isInputShutdown()) { return false; } try { if (inputStream == null) { return false; } } catch (Throwable th) { return false; } return true; } public void addSimDataListener(SimDataListener listener) { if (listener == null) { throw new IllegalArgumentException("Cannot add SimDataListener as the listener given was null"); } if (!simDataListeners.contains(listener)) { simDataListeners.add(listener); } } public void removeSimDataListener(SimDataListener listener) { if (listener == null) { throw new IllegalArgumentException("Cannot remove SimDataListener as the listener given was null"); } if (simDataListeners.contains(listener)) { simDataListeners.remove(listener); } } public void notifySimDataListeners(SimData data) { if (data == null) { throw new IllegalArgumentException("Cannot notify SimDataListener as the data given was null"); } for (SimDataListener listener : simDataListeners) { listener.dataReceived(data); } } } -
Well, we do. Check this thread for discussion (and the content) of the TFC/ED news letter: http://forums.eagle.ru/showthread.php?t=83320 If you mean we don't know what modern jet ED are working on in parallel to these other things then you are correct. However, these other things will probably get released before (given any modern jet is a sh!tload of work).
-
You mean the Free Software ("free" as in freedom) project called FlightGear at http://www.flightgear.org? or, the commercial X-Plane (v10) just released at http://www.x-plane.com ? Now some may argue that FSX is better than these in certain ways (eg. they prefer the ground graphics, or there is some mod they like only for FSX yada yada). To this I would say, "get real, the world has changed" for the following reasons: * FlightGear may be behind on graphics but it is still ongoing (FSX is now an unsupported product, no longer sold or maintained by Microsoft - you now have to buy a version/get support Lockheed-Martin for a slightly different code-base: http://www.prepar3d.com/products/prepar3d-client/). A still viable product such as FlightGear (being improved very slowly but surely) will always beat a cancelled product (FSX), long-term. * X-Plane has better flight modelling than FSX, and is far more open to modding. It also works on Macs (where it is developed) and Linux, for those that run those systems (although it used to be prettty flaky for device input on Linux). X-Plane also always ran a lot better (could turn more graphics options up) than FSX for me. So, have a look at these products in addition to checking out Microsoft Flight when it finally arrives. ps. Don't bother with Take On Helicopters - it feels, looks and runs pretty awful even on an i7 with Radeon 5970 (dual) GPU. The helicopters in Armed Assault 2 are more fun (despite Take On Helicopters being an extension of the Arma2 codebase). Perhaps this may change over time, but for now you are better spending your money on x-plane. pps. There is an airline going to Big Island (the island actually called Hawai'i, but every one calls it Big Island to differentiate it from the name of the State). That airline is Hawaiin Airlines flying 717s. I know, just had some flights several weeks ago - including going to Big Island to see the volcanoes. Note: compared to the island of O'ahu (where Honolulu is) there is not that much large-scale human development on Big Island. The 'city' of Hilo always seems to get a lot of rain/clouds due to the trade winds, so it will be interesting to see whether MS Flight! models this correctly.
-
Jet engines run better in cold environments?
Moa replied to Megagoth1702's topic in DCS: A-10C Warthog
While the qualitative 'rules of thumb' are good you can get a good quantative understanding (how great is each effect?) using the NASA engine model applet: http://www.grc.nasa.gov/WWW/k-12/airplane/ngnsim.html ps: Of course you have the Java Runtime Environment (JRE) already installed for applets, as you need this for the 104th pilot statistics system :) -
Jet engines run better in cold environments?
Moa replied to Megagoth1702's topic in DCS: A-10C Warthog
Yeah, especially with that latest incident losing a stealth UAV over Iran I would say whatever manned-fighter factions are at the Pentagon will be milking it for what it is worth. There will probably always be manned combat aircraft until Artificial Integillence *and* sensors exceed human capabilities *and* are a lot cheaper than training some young, keen fellow. The most dangerous and predictable tasks will probably become more and more UAV based (eg. taking out fixed air defences). -
With the trend for most people moving to phones/tablets/lightweight laptops for work and routine tasks that leaves bigger PCs only for gamers. Many gamers have a PC and a console but an increasing number have a console instead of a PC, since they only play console games (ugh!). That means that as time goes on the high-end PC will only be used for gaming and general computing. Even unrestricted general purpose computing may decrease in the future (become more of a niche). There is an interesting article on Slashdot about a talk by a guy called Cory Doctorow about how the "Coming War on General Purpose Computing". An interesting read for sure: https://github.com/jwise/28c3-doctorow/blob/master/transcript.md transcript http://boingboing.net/2011/12/27/the-coming-war-on-general-purp.html Here's the Slashdot link (if you are interested in the comments): http://yro.slashdot.org/story/11/12/30/2159200/doctorow-the-coming-war-on-general-purpose-computing As much as I like open systems it appears it'll be an uphill battle to keep them - our governments and large corporates want to lock them down. This makes will make software portability even more important in the future, IMHO. The openness battle has not yet been lost, but it is a threat that is coming, and portability gives the ability to adapt.
-
You can't. Other people can. The economics will select the platform the masses choose. People are chosing tablets in addition to the PC for the moment. Soon the majority will not need a PC (or laptop). Disclaimer: I've been using and developing on Linux since kernel version 0.20 (not a typo), now use a Mac Book Pro (and Java) as my main development system, and have multiple Windows 7 machines as well (Windows is getting better these days) including the stallturn VNAO (FC2) and stallturn DCS servers (currently hosting another 'FlyIn' event). However, I understand that I, like most simmers, are in a niche. We will always buy whatever ED puts out, we will spend a lot of money on TrackIR, and TM Warthog, and TM MFDS, and pedals, and great hardware etc etc. But we are a tiny minority of gamers and it makes sense to target the many and then worry about also targetting the minority too if you can (which I believe you can), but targetting only the niche (Linux servers) is not the way you *start*. Even as a Linux guy demanding a Linux-only dedicated server doesn't make sense to me - a portable server does.
-
Ah, cracked soldering. Same problem affects game consoles too. I bought a heat gun to repair the PS3 I gave my nephews and have now ended up repairing a few for friends too. Heat is the enemy! Got a link to your band? I'm sure a lot of us would enjoy your live music. Back on topic: LockOn on WINE I contributed to the test information for LockOn 1.12 in WINE and used to periodically update the information and post fixes/workarounds to run it on Linux when I found them. Unfortunately ever since the (undesirable but understandable IMHO) decision was made to use StarForce it wouldn't word under WINE anymore. Portability matters I don't believe a Linux-specific server should be made. This is incorrect thinking. What should be made is a *portable* server. It should work on Windows and MacOSX and Linux. Why? Because if you are going to put effort into making server software then you should make it portable. That way you can deploy to 100% of customer server systems (which is around half Linux on servers, around half Windows, and a smattering of other systems). IMHO this would be best done with Java rather than C++ since the former has great support for multithreading (multi-core performance!), networking, and cross-platform GUI out of the box, which means the development time (that is, cost) is considerably smaller than for C++ (if you know what you are doing; Windows C++ programmers writing Java in a Windows C++ style produce awful and broken code in my experience until they properly re-train to lose all the Windows legacy cruft [that even C# programmers still do]). I think the effort and expense to change a Windows client is too much if the Windows-specific code has not been isolated. You are stuck on Windows. Incidentally the creation of Windows specific APIs including the DirectX stack was done deliberately and intentionally by Microsoft to keep you locked into their platform. There is a great saying, "In order for Microsoft to win the customer must lose". Unfortunately many, many developers did and still do choose to limit themselves to Windows and now they are stuck. Some developers saw this early and tried to tell the Windows-only guys early, but "you can only lead a horse to water but can't make it drink" (the Windows-only devs refused to listen then, which is why they are fubar now that platforms are changing). Read on to hear case studies of developments that did keep portability as a design goal ... Portability case studies My favourite counter-example (to developing Windows-only software) is the creator of X-Plane and how he chose to use portable code and tech (OpenGL) and personally reaped a $3.5 US million dollar reward with the advent of the iPhone as he could quickly and easily move X-Plane to new platforms as they came out. It is hard as a developer to argue for portability vs the accountants (who only see Windows on the desktop, and ignore the server, and have only just woken up to the billions of other devices out there like powerful phones etc). Here's a link to the interview with Austin Meyer: http://techhaze.com/2010/03/interview-with-x-plane-creator-austin-meyer/ Another example was that IL-2 Sturmovik was written in Java with a smattering of C++ in the performace critical bits (was written before the JVM was faster than C++, as it is now; and RAM was much more constrained than now, 16 GB anyone?). They also isolated the graphics so either OpenGL or DirectX could be used (intererstingly, I personally used to get better performance from the OpenGL path). This meant the code could be adapted to work on consoles and formed the basic for Wings of Prey - bringing in extra revenue. Portability is good for your strategic financial situation, although it can be slightly more expensive up-front to develop (although not really, if you do careful design and use automated testing to catch differences between platforms). Here's another non-game example. For years Apple quietly beavered in the background to make MacOS X work on Intel chips as well as the PowerPC. People speculated but no one knew. When the time was right and IBM couldn't deliver enough PowerPC chips for Apple's liking then Apple announced that their Intel based Macs would be available. Making their *operating system* portable has paid off handsomely for Apple, and also meant IBM couldn't dictate terms to them [this is an abridged version of what went on, and is meant to be illustrative only]. A process to get portability The economics are against making the DCS client portable to Linux. The economics are for porting it to MacOSX (after all, there is a MacOSX port of Falcon 4:Allied Force) and there are a large and increasing number of Macs out there. The two 'tricks' are: 1) it is an expensive and extensive effort to make old code portable. This can't be done quickly, so has to be done gradually. Ensure all *new* code is written to portable, or has platform dependencies isolated in a platform abstraction layer. Then assign one guy to slowly bring old code up to the new portable standard. 2) Choose portable technologies from now on. From this point-of-view: Lua good; Microsoft C++ bad; Standard C++ (eg. g++) good; OpenGL & GLSL good; DirectX & HLSL bad; Java good; C# bad. That way when the market shifts to the post-PC era (eg to larger markets with even more powerful phones and tablets) then ED's assets (it's software built up over more than a decade, and all the models and files that go with it) can be adapted quickly to the new opportunity and sold to those new customers. It makes strategic financial sense to be portable.
-
For me this mod is most useful for the game events it writes out, which allows me to build pilot statistics for DCS (in the same way that is done for Flaming Cliffs 2 at http://stallturn.com/104th/) Have tested this mod on stallturn running A-10C v1.1.1.1 with 6-10 players for around 10 hours per mission and it has no noticeable impact on the mission's performance. Excellent work Speed. Have also written a little Java program that runs in the background and stitches the 5 second interval files into a single file for the mission (essentially re-creating the a log file in real-time that A-10C used to produce). Besides storing the original log content I also convert the log entries into another XML file (which is much easier to parse in languages other than LUA, since there are a lot of XML parsing libraries out there). Am still testing this program but will release when testing finished. There are some log entries that were present in FC2/early A-10C that are not written in the new logs. I'm going to try and modify the logging produced by this mod so that some of this extra information is logged - and will submit my modified scripts back for examination (in case you'd like to integrate my version with the main 'trunk' version).
-
No direct way. Since both the lom and edm are proprietary wrappers over 3DS models if you have the 'source' 3DS model you can go to edm or lom as needed. So try and get your hands on the 3DS model, or create one.
-
... not until recent integration work of Link-16 in USAF aircraft, helos, and vehicles. Obviously it is not in all the fleet, but the capability is there and hs been tested.
-
with 128% of the vote, too! Nice one Yo-Yo, if this was Slashdot I'd mod you: +1 Inisghtful.
-
F4U Corsair for me. It is the analogue to the F/A-18. Carrier and land based, it did air-to-air and air-to-surface (land and ship strike) missions.
-
Thanks ED. While there are always detractors, the more information about what is going on the better, IMHO. Hope you all have a restful break.
-
Hope you are having a good time EtherealN. I think it might actually be: C:\Users\XXXXXXXX\Saved Games\Black Shark 2\Logs
-
stallturn (disclaimer: my server) does not use Servman, you can make videos there (although on missions with Ka-50 I had to turn external views off, since A-10C pilots would cheat with F5 view to sluaghter the defenceless choppers).
-
> Unless one jumps into an unpaused server (which I dont think is possible) Huh? pausing a multiplayer game with no occupants is a feature of ServMan, not of DCS multiplayer. Not all servers use ServMan, which means they run continuously (although the have the disadvantage that they might not always restart automatically etc).
-
Speed, you are dead right. Never seen someone come back full-time to a squad once they have drifted off. They're always welcomed back, but I guess once a player as 'left' a sim it never holds as much interest or appeal as it did the first time around (same as hooking up with girlfriends, eh? :) ) For the "all your base meme", it comes from a mistranslation of Zero Wing: http://en.wikipedia.org/wiki/All_your_base_are_belong_to_us You may think it is trivia now but just wait until you are on your last question to "To Wants to be A Millionaire" and they ask where this phrase comes from :) Could also try changing NATO brevity code from "Pickle" to ... Someone set us up the bomb! For great justice!
-
Even smudging the glass with fingerprints was considered a no, no in our Air Force (no matter who did it, pilot or ground crew). Our ground crews were always vigilant to keep the canopy clean. You might get a crack as the result of battle damage (and I think most canopys are designed to withstand birdstrike, so you get a mess but not a crack).
-
nb. report released about the F-15E crash in Libya was due to departure partially caused by maneuvering with asymmetric loadout. Didn't know that could be a problem but apparently it is. Check the report out.
-
Hiya Case. Here's the debrief log (customized with extra data for our stats - so you might want to strip that out if you are going to put it in your own stats system - please feel free to ask about any of the customized values there): http://www.mediafire.com/download.php?g1g95laudv53yh2 [839 kB] A big thanks to the 51st for participating.
-
IIRC you can get an height map by carefully looking at the scripts that come with TacView. When TacView installs it extracts terrain elevation data from the game and writes it to a file so it can render it. You could do the same thing and render the terrain contours, although you'd then have some extra work adding in names for airbases etc. Obviously this is a lot of work, but it is possible to do.
-
I don't know about this mission, but landing in real life involves the following: 1) When you are near the airfield you need to be at the correct approach altitude. Around 1000 - 1500 feet is pattern altitude. You can be higher further away but do not be much higher close (within 5 nm) to the airfield. 2) Landing 'reverses controls'. In ordinary flight you point your nose up or down to climb or dive and use throttle for speed. In landing this is 'reversed'. In landing you adjust your nose pitch (aka 'attitude') to control your speed (around 150 knots on approach, slow to 140 knots before crossing the threshold, and flare to get even slower for landing - perfect landing speed is if the stall warning goes off just before you touch down, be happy when you achieve this). Once you have your pitch set use throttle to change your aimpoint (the flight path marker should be on the runway end closest to you). If you are diving at 8-10 degrees nose down it means you have made a mistake and have started your approach too high - never do this. 3) You can work out whether you need to turn left or right using the following simple technique: * imagine there is an arrow that runs along the centerline of the runway from the far end and the tip of the arrow is at the close end of the runway. If the arrow points left then you need to turn left, if the arrow points right then turn right. If the arrow is pointing right at you then you are lined up and only have to worry about speed and descent rate at the moment. If you drift and the arrow doesn't point toward you anymore then turn according to the arrow so it does. 4) Your decent rate should be somewhere between 1000 feet per minute (fpm) to 2000 fpm - you can descend more quickly if you are more experienced. At an approach speed of 150 knots that means you are travelling at 2.5 nm per minute. You can easily do the math in your head, such as: * for 1000 fpm descent rate you must be at 1000 feet above airport altitude at 2.5 nm, and 2000 feet at 5 nm. * for 2000 fpm descent rate you must be at 2000 feet above airport altitude at 2.5 nm, and 4000 feet at 5 nm. You can also work it out the other way. If you are at 8000 feet and descend at at 2000 fpm you'll have 4 minutes to descend, which means you need to be 4 mins * 2.5 nm/min = 10 nm away if you approach at 150 knots. To summarise: * get slow early to your approach speed of 150 knots. Approach too quickly and everything happens so fast it is hard to keep up, plus you won't descend at the correct glideslope angle if you are too fast (or slow). * keep your nose pitch above the horizon (around 5-7 degrees as needed). * use your throttle to adjust aimpoint (flight path marker). * use the centerline of the runway to determine whether to turn left or right. * descend at 1000 fpm or 2000 fpm (depending on how experienced you are). * work out whether you are at the correct altitude for the distance you are at (assuming 150 knots approach speed). One thing I didn't mention is flying the Angle-of-Approach bracket. I would worry about getting the other things right first: approach speed, line-up, start altitude, nose pitch (trim this!), and descent rate by adjusting throttle. When you get good you'll automatically set line-up, speed, and start altitude without much effort and will only have to vary your throttle with lots of small adjustments (just like real pilots do). Learning do do nice landings consistently in the A-10C is one of the great pleasures of this simulation - and lots to explore mastering one-engine and dead-stick (no engine) landings. IMHO, there is no point in being able to frag endless hordes of enemy armored formations until you have mastered landing your mount. Enjoy :)