Jump to content

FSEconomy


Toby Rice

Recommended Posts

As most of you know, I own BlueHawk Virtual Airways. I'm big into ACARS systems, flight logging, and programs/addons of that kind.

 

So I find FSEconomy. I knew about it before, but never got into it until a few weeks ago. Boy, am I bummed I never got into it earlier!! :P

 

It's the coolest way to fly ever! If you use it, you know what I mean.

 

www.fseconomy.com

 

Clipped from their site:

 

FSEconomy is a multi-player "persistent world" add-on for flight simulators, with an economical focus. It is "persistent" in that the aspects of the game - the aircraft location and fuel levels, etc. - are controlled by the players. Other players see changes in these items within the "game world".

 

FSEconomy is not a Virtual Airline. There is no schedule; there are no "levels"; there are no requirements to start from the bottom and work your way up. However, many VAs do use the FSEconomy system to operate their VA.

 

FSEconomy strives to be a framework within which players can decide what FSE is to them... their "style of play" is the phrase frequently used. It is an open-ended platform, allowing each member to tailor their experience to their individual liking. Some members choose to use FSEconomy completely on their own; others choose to work with a few other players; and still others choose to join one or more communities of made up of dozens of other players.

 

The basic concept of FSEconomy is that players use aircraft to move virtual passengers or cargo. Players can own their own aircraft, or rent them from other players or from "the system". Players must be aware of their aircraft's capabilities and fuel levels so that they can carry the cargo selected, or to not become stranded at an airport without fuel. There are many expenses associated with every flight - rental charges, fuel costs, etc.; as well as income from the virtual passengers or cargo. The goal is to make more income than associated operating expenses.

 

 

Just from reading that, you can understand how cool FSEconomy (FSE) is!

 

I started a group for my Virtual Airline, and have now made it so we use FSE instead of our former ACARS system!

 

If you'd like to join my FSE group, PM me your FSE username and I'll invite you manually.

 

Anyway, I opened an FBO at 6TN9 (SCENERY HERE) and it's running fine. Fly in sometime!

 

I think you would all like FSEconomy. Read the manual, and it will be very cool!

 

 

I thought I'd share FSE with those that don't have it :)  Use this thread to talk all about FSE if you wish.

 

Toby

Link to comment
Share on other sites

It is plugin based, for X-Plane at least, so any platform can use it.  Just download python (for your operating system), python interface, and the X-Economy plugin, and you are up and running.

 

Well, other than signing up for a forum account, and then requesting a game account...

Link to comment
Share on other sites

Python 2.7.6 with Python Interface.

 

It's all in the manual. Very detailed!

If you have any problems with installing it, the FSE Forums are a great place to start!

 

NOTE:  The file I have included is the replacement for the PI_xfse.py file. Use mine instead of the other one! The other would not work for me, and a guy gave me this one.

 

YOU MUST RIGHT CLICK THE FILE, THEN SELECT "SAVE TARGET AS" THEN SAVE OR ELSE IT WILL GO TO THIS:

 from XPLMMenus import * from XPLMNavigation import * from XPWidgetDefs import * from XPWidgets import * from XPStandardWidgets import * from XPLMProcessing import * from XPLMDataAccess import * from XPLMUtilities import * from XPLMPlanes import * from httplib import * from xml.dom import minidom from re import * from math import * import urllib2 import hashlib import os import sys from urllib import urlopen from XPLMDisplay import * from XPLMGraphics import * class engine: def __init__(self,cht,runtime,chtDamage,mixDamage,engineNumber): self.defaultcht=cht self.runtime=runtime self.chtDamage=chtDamage self.engineNumber=engineNumber self.mixtureDamage=mixDamage self.numberOfEngines=XPLMGetDatai(XPLMFindDataRef("sim/aircraft/engine/acf_num_engines")) print "Engine created #"+str(engineNumber) def clearEng(self): print "Clearing engine" self.runtime=0 self.chtDamage=0 self.mixtureDamage=0 def engineType(self): _engineType=[] XPLMGetDatavi(XPLMFindDataRef("sim/aircraft/prop/acf_prop_type"), _engineType, 0, self.numberOfEngines) return _engineType[self.engineNumber] def currentRPM(self): _currentRPM=[] XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_N2_"), _currentRPM, 0, self.numberOfEngines) return _currentRPM[self.engineNumber] def currentCHT(self): _currentCHT=[] XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_CHT_c"), _currentCHT, 0, self.numberOfEngines) return _currentCHT[self.engineNumber] def currentMIX(self): _currentMIX=[] XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_mixt"), _currentMIX, 0, self.numberOfEngines) return _currentMIX[self.engineNumber]*100 def planeALT(self): _planeALT=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/position/y_agl")) return _planeALT*float(3.33) def feed(self,sec,rpm,mix,cht,altitude): if rpm>0: self.runtime+=sec if self.defaultcht>0: _diff=abs(cht-self.defaultcht)/float(sec) if _diff>0: self.chtDamage+=_diff self.defaultcht=cht if (mix > 95 and altitude > 1000): self.mixtureDamage += sec def getData(self): return "&mixture"+str(self.engineNumber+1)+"="+str(self.mixtureDamage)+"&heat"+str(self.engineNumber+1)+"="+str(self.chtDamage)+"&time"+str(self.engineNumber+1)+"="+str(self.runtime) def isEngRun(self): _engrun = [] XPLMGetDatavi(XPLMFindDataRef("sim/flightmodel/engine/ENGN_running"), _engrun, 0, self.numberOfEngines) return _engrun[self.engineNumber] class PythonInterface: def XPluginStart(self): self.Name = "X-Economy" self.Sig = "ksgy.Python.XFSEconomy" self.Desc = "X-Economy - plugin for FSEconomy (www.fseconomy.net)" self.VERSION="1.7.1" self.MenuItem1 = 0 self.MenuItem2 = 0 self.flying = 0 self.flightTime = 0 self.rentalTick = 0 self.leaseTime = 0 self.errormessage = 10 self.CurrentTimeCaption="" self.LeaseCaption = 0 self.Arrived = 0 self.CurrentAircraft="" self.isTacho = 0 self.FuelTanks=[] self.stPayload=0 self.stEq=0 self.gsCheat=0 self.globalX=0 self.globalY=0 self.checkfuel=0 self.err1="" self.err2="" self.ACEngine=[] Item = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "X-Economy", 0, 1) self.XFSEMenuHandlerCB = self.XFSEMenuHandler self.Id = XPLMCreateMenu(self, "X-Economy" , XPLMFindPluginsMenu(), Item, self.XFSEMenuHandlerCB, 0) XPLMAppendMenuItem(self.Id, "Open X-Economy", 1, 1) XPLMAppendMenuItem(self.Id, "-", 3, 1) XPLMAppendMenuItem(self.Id, "Set aircraft alias", 2, 1) self.checkACStateCB = self.checkACState XPLMRegisterFlightLoopCallback(self, self.checkACStateCB, 1.0, 0) self.DrawWindowCB = self.DrawWindowCallback self.KeyCB = self.KeyCallback self.MouseClickCB = self.MouseClickCallback self.WindowId = XPLMCreateWindow(self, 50, 600, 300, 400, 1, self.DrawWindowCB, self.KeyCB, self.MouseClickCB, 0) return self.Name, self.Sig, self.Desc def MouseClickCallback(self, inWindowID, x, y, inMouse, inRefcon): return 0 def KeyCallback(self, inWindowID, inKey, inFlags, inVirtualKey, inRefcon, losingFocus): pass def DrawWindowCallback(self, inWindowID, inRefcon): if(self.err1 != "" and self.errormessage > 0): lLeft = []; lTop = []; lRight = []; lBottom = [] XPLMGetWindowGeometry(inWindowID, lLeft, lTop, lRight, lBottom) left = int(lLeft[0]); top = int(lTop[0]); right = int(lRight[0]); bottom = int(lBottom[0]) gResult = XPLMDrawTranslucentDarkBox(left,top+150,right+200,bottom+300) color = 1.0, 1.0, 1.0 gResult = XPLMDrawString(color, left+5, top+132, self.err1, 0, xplmFont_Basic) gResult2 = XPLMDrawString(color, left+5, top+117, self.err2, 0, xplmFont_Basic) def XPluginStop(self): if (self.MenuItem1 == 1): XPDestroyWidget(self, self.XFSEWidget, 1) self.MenuItem1 = 0 XPLMDestroyMenu(self, self.Id) XPLMUnregisterFlightLoopCallback(self, self.checkACStateCB, 0) XPLMDestroyWindow(self, self.WindowId) pass def XPluginEnable(self): return 1 def XPluginDisable(self): pass def XPluginReceiveMessage(self, inFromWho, inMessage, inParam): pass def XFSEMenuHandler(self, inMenuRef, inItemRef): # If menu selected create our widget dialog if (inItemRef == 1): if (self.MenuItem1 == 0): self.CreateXFSEWidget(221, 640, 480, 490) self.MenuItem1 = 1 else: if(not XPIsWidgetVisible(self.XFSEWidget)): XPShowWidget(self.XFSEWidget) elif (inItemRef == 2): if (self.MenuItem2 == 0): self.CreateACAliasWidget(128, 480, 272, 87) self.MenuItem2 = 1 else: if (not XPIsWidgetVisible(self.ACAliasWidget)): XPShowWidget(self.ACAliasWidget) def XFSEpost(self, query): f1 = open(os.path.join('Resources','plugins','PythonScripts','PI_xfse.py'), 'rb') filemd5sum = hashlib.md5(f1.read()).hexdigest() f1.close() stuff = urlopen('http://www.fseconomy.net/fsagentx?md5sum='+filemd5sum+'&'+query).read() stuff = stuff.replace('&',' and ') dom = minidom.parseString(stuff) return dom def isAllEngineStopped(self): _allenginestopped = True try: for ienga in range(self.NumberOfEngines): if self.ACEngine[ienga].isEngRun() > 0: _allenginestopped = False except Exception: _allenginestopped = True return _allenginestopped def chkBrk(self,h,: if h == 1: return True if h == 0 and b < float(1.0): return True return False def checkACState(self, elapsedMe, elapsedSim, counter, refcon): self.errormessage = self.errormessage - 1 _timecompression=XPLMGetDatai(XPLMFindDataRef("sim/time/sim_speed")) if _timecompression==0: _timecompression=1 _groundcompression=XPLMGetDatai(XPLMFindDataRef("sim/time/ground_speed")) XPLMSetDatai(XPLMFindDataRef("sim/time/ground_speed"),1) _totalcompression=1/float(_timecompression) if self.flying==1: if _groundcompression>1: self.gsCheat+=1 if self.gsCheat>10: self.cancelFlight("Excessive time compression used. Your flight has been cancelled") isBrake=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/controls/parkbrake")) airspeed=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/position/groundspeed")) if self.ACEngine[0].engineType() == 3 or self.ACEngine[0].engineType() == 5: isHeli = 1 else: isHeli = 0 if _timecompression > 0: #fuel change check _fueltotal=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel_total")) # converting values to integer for comparison. values after decimal were unrelaiable for this purpose. if((int(_fueltotal) * 0.95) > int(self.checkfuel)): self.cancelFlight("Airborn refueling not allowed. Flight cancelled","") self.checkfuel=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel_total")) if XPLMGetDataf(XPLMFindDataRef("sim/time/total_flight_time_sec"))0: self.leaseTime=int(self.leaseTime)-1 if self.LeaseCaption: _leasehours=self.leaseTime/3600 _leasemins=(self.leaseTime-_leasehours*3600)/60 XPSetWidgetDescriptor(self.LeaseCaption, "Lease time left: "+str(_leasehours)+" hours "+str(_leasemins)+" mins" ) if(self.chkBrk(isHeli,isBrake) and self.ACEngine[0].currentRPM()>float(10.0) and airspeed>float(5) and self.ACEngine[0].planeALT()>10): self.flightTime=int(self.flightTime)+1 if self.CurrentTimeCaption: _currhours=self.flightTime/3600 _currmins=(self.flightTime-_currhours*3600)/60 XPSetWidgetDescriptor(self.CurrentTimeCaption, "Current flight time: "+str(_currhours)+" hours "+str(_currmins)+" mins") # engine feed only when flying: pre-heat recommended on ground for iengfeed in range(self.NumberOfEngines): #sec,rpm,mix,cht,altitude): self.ACEngine[iengfeed].feed(1,self.ACEngine[iengfeed].currentRPM(),self.ACEngine[iengfeed].currentMIX(),self.ACEngine[iengfeed].currentCHT(),self.ACEngine[iengfeed].planeALT()) # arrive else: if isHeli == 1: if(self.flightTime>60 and self.isAllEngineStopped() and self.ACEngine[0].planeALT()<50 and airspeed60 and self.isAllEngineStopped() and self.ACEngine[0].planeALT()<50 and isBrake==1.0 and airspeed

That is for v9. For v10, do as the manual says.

PI_xfse.py

Link to comment
Share on other sites

A few years ago I was involved with FSE and the only thing I did not like is that the routes primarily went to small airports. Has that changed?

There are assignments to tiny airports, and huge airports. I think if it's on a sectional chart, its on FSE :lol:

 

I have assignments from 6TN9 to KMEM, and there are others from GGOV to KFST (Sorry, I got it! lol)

 

It's not just little airports anymore.

Link to comment
Share on other sites

There are assignments to tiny airports, and huge airports. I think if it's on a sectional chart, its on FSE :lol:

 

I have assignments from 6TN9 to KMEM, and there are others from GGOV to KFST (Sorry, I got it! lol)

 

It's not just little airports anymore.

 

I believe the airport data is based on FS9/FSX. If it's in MSFS, it's in FSE. Airport sizes are based on runway lengths, IIRC. I'm coming up on 9 years in FSE at the end of this month. Crazy.

Link to comment
Share on other sites

How to install FSEconomy in X-Plane 9

 

1.    Sign up the on FSE Forums

2.    Go to the thread where it says "New User Request" (or something like that)

3.     Request an account by saying "I'd like a game account for FSEconomy please"

4.    Within a few hours, an admin will send you a PM and reply to your post giving you your info.

5.    Next, we will install the program. I'm guessing you will use XP9.70 32bit, so this will be easy.

6.    Download and install Python 2.7.6 here: https://www.python.org/ftp/python/2.7.6/python-2.7.6.msi  INSTALL IT In your main C: drive folder, not the XP folder.

7.    Download Python Interface HERE and put the folder in your X-Plane>Resources>plugins folder.

8.    In the X-Plane Plugins folder, create a new folder called "PythonScripts"

9.    Next, right click the file I have included here and click "Save as". It should save it to your PC something called "PI_xfse".

10.  Drag that file to the "PythonScripts" folder.

 

Done! Now start X-Plane, go to the "X-Economy" plugin, log in, and do as the manual says for your first flight.

Please take a look at the manual! I know it looks long, but trust my experience and others. It works!

 

Also note this:

Modifying your airplanes so that FSE recognizes it...

You will need to edit your planes in XPlane to match the FSE specifications.

A. Using Plane-Maker

1. It is recommended that you make a copy of the plane you will be modifying, just in case something goes wrong. (copy the entire Aircraft folder as a backup) 

2. In FSeconomy.com, find the plane you want to fly in the Home -> List of Aircraft page and make a note of the type of plane you want. 

3. Open Plane-Maker then File -> Open. Go to the folder that has the plane you want to fly in FSE (acf file) Then Open.

4. Now... Go to the Standard Menu, then ViewPoint. In the descr box, change the field to match what FSE reads.
Close the Viewpoint screen with the X, then save your plane as whatever name you want. Close Plane-Maker.

5. Start X-Plane, and prepare your flight as you normally do and go fly.

B. Quick way without using Plane-maker.

From the "Plugins" menu choose "X-Economy"->"Set aircraft alias" You may change the "Modelname" there for every single airplane without   worrying for the acf.file

The "trade-off" for this method is that you will need to change "Modelname" every time you change the aircraft you are going to fly.

 

 

 

 

 

If you have any problems, see the user manual.

 

PI_xfse.py

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...