Merged projectswg/holocore into quality_assurance

This commit is contained in:
Tacef Ine
2016-01-10 10:45:47 +01:00
38 changed files with 7535 additions and 7004 deletions
BIN
View File
Binary file not shown.
+4
View File
@@ -56,6 +56,10 @@ from the Sonatype site.
- test - Does all that 'compile' does, plus runs the unit tests
- package - Does all that 'test' does but generates all of the artifacts
### Forwarder ###
Holocore uses TCP for network communications, whereas SWG was programmed for UDP. This adds numerous efficiencies with long distance communications, but requires that a little more work is done on the client side. If you are using the launcher, you do not have to worry about this. If you are not using the launcher, follow the guide [here](https://bitbucket.org/projectswg/forwarder).
### Running Holocore ###
In order to successfully build and run Holocore, you must:
+1 -1
View File
@@ -1,4 +1,4 @@
var execute = function(galManager, player, target, args) {
function executeCommand(galacticManager, player, target, args) {
var creature = player.getCreatureObject();
var PvpFaction = Java.type("resources.PvpFaction");
var FactionIntent = Java.type("intents.FactionIntent");
@@ -0,0 +1,191 @@
command player csr qa dev
TEXT TEXT TEXT TEXT TEXT
activateInstance FALSE TRUE TRUE TRUE
activateQuest FALSE TRUE TRUE TRUE
addAllowedPlayer FALSE TRUE TRUE TRUE
addBannedPlayer FALSE TRUE TRUE TRUE
adjustLotCount FALSE TRUE TRUE TRUE
aiIgnore FALSE TRUE TRUE TRUE
broadcast FALSE TRUE TRUE TRUE
broadcastArea FALSE TRUE TRUE TRUE
broadcastGalaxy FALSE TRUE TRUE TRUE
broadcastPlanet FALSE TRUE TRUE TRUE
cityInfo FALSE TRUE TRUE TRUE
clearCompletedQuest FALSE TRUE TRUE TRUE
clearVeteranReward FALSE TRUE TRUE TRUE
combatDataClear FALSE TRUE TRUE TRUE
combatDataRecord FALSE TRUE TRUE TRUE
combatDataReport FALSE TRUE TRUE TRUE
combatDataStop FALSE TRUE TRUE TRUE
completeRestussStageOne FALSE TRUE TRUE TRUE
craft FALSE TRUE TRUE TRUE
createCreature FALSE TRUE TRUE TRUE
createMissionElement FALSE TRUE TRUE TRUE
createNPC FALSE TRUE TRUE TRUE
createSpawningElement FALSE TRUE TRUE TRUE
createSpawningElementWithDifficulty FALSE TRUE TRUE TRUE
createStaticItem FALSE TRUE TRUE TRUE
credits FALSE TRUE TRUE TRUE
csDumpTarget FALSE TRUE TRUE TRUE
csStorytellerDestroyAllObjects FALSE TRUE TRUE TRUE
csStorytellerDestroyNpcs FALSE TRUE TRUE TRUE
csStorytellerDestroyParticles FALSE TRUE TRUE TRUE
csStorytellerDestroyProps FALSE TRUE TRUE TRUE
database FALSE TRUE TRUE TRUE
deactivateQuest FALSE TRUE TRUE TRUE
destroy FALSE TRUE TRUE TRUE
dumpObjectInformation FALSE TRUE TRUE TRUE
dumpTargetInformation FALSE TRUE TRUE TRUE
dumpZoneInformation FALSE TRUE TRUE TRUE
editAppearance FALSE TRUE TRUE TRUE
editBank FALSE TRUE TRUE TRUE
editBankAccount FALSE TRUE TRUE TRUE
editStats FALSE TRUE TRUE TRUE
emptyMailTarget FALSE TRUE TRUE TRUE
eventBuff FALSE TRUE TRUE TRUE
eventBuffArea FALSE TRUE TRUE TRUE
eventBuffTarget FALSE TRUE TRUE TRUE
eventClearStates FALSE TRUE TRUE TRUE
eventDamage FALSE TRUE TRUE TRUE
eventMoveToMe FALSE TRUE TRUE TRUE
eventShuttleDrop FALSE TRUE TRUE TRUE
eventStartRaid FALSE TRUE TRUE TRUE
eventStorePet FALSE TRUE TRUE TRUE
eventTefArea FALSE TRUE TRUE TRUE
eventTefClear FALSE TRUE TRUE TRUE
eventTefTarget FALSE TRUE TRUE TRUE
eventUndoMoveToMe FALSE TRUE TRUE TRUE
eventVaderChoke FALSE TRUE TRUE TRUE
eventWeapon FALSE TRUE TRUE TRUE
findCreature FALSE TRUE TRUE TRUE
findObject FALSE TRUE TRUE TRUE
findObjectByTemplate FALSE TRUE TRUE TRUE
findPlayer FALSE TRUE TRUE TRUE
findWarden FALSE TRUE TRUE TRUE
forceCommand FALSE TRUE TRUE TRUE
freezePlayer FALSE TRUE TRUE TRUE
generateCraftedItem FALSE TRUE TRUE TRUE
getAccountInfo FALSE TRUE TRUE TRUE
getGameTime FALSE TRUE TRUE TRUE
getObjVars FALSE TRUE TRUE TRUE
getPlayerId FALSE TRUE TRUE TRUE
getRank FALSE TRUE TRUE TRUE
getSpawnDelays FALSE TRUE TRUE TRUE
getStationName FALSE TRUE TRUE TRUE
getVeteranRewardTimeCs FALSE TRUE TRUE TRUE
gmClearQuest FALSE TRUE TRUE TRUE
gmCreateClassResource FALSE TRUE TRUE TRUE
gmCreateSpecificResource FALSE TRUE TRUE TRUE
gmForceCommand FALSE TRUE TRUE TRUE
gmForceRank FALSE TRUE TRUE TRUE
gmFsVillage FALSE TRUE TRUE TRUE
gmGrantQuest FALSE TRUE TRUE TRUE
gmJediState FALSE TRUE TRUE TRUE
gmr FALSE TRUE TRUE TRUE
gmregrantQuest FALSE TRUE TRUE TRUE
gmRevive FALSE TRUE TRUE TRUE
gmShowQuest FALSE TRUE TRUE TRUE
gmSpawnShip FALSE TRUE TRUE TRUE
gmWeapon FALSE TRUE TRUE TRUE
goto FALSE TRUE TRUE TRUE
grantBadge FALSE TRUE TRUE TRUE
grantBadgeArea FALSE TRUE TRUE TRUE
grantPadawanTrialsEligibility FALSE TRUE TRUE TRUE
grantSkill FALSE TRUE TRUE TRUE
grantTitle FALSE TRUE TRUE TRUE
grantWarden FALSE TRUE TRUE TRUE
harmful FALSE TRUE TRUE TRUE
harmless FALSE TRUE TRUE TRUE
hasVeteranReward FALSE TRUE TRUE TRUE
initializeComponent FALSE TRUE TRUE TRUE
invulnerable FALSE TRUE TRUE TRUE
kick FALSE TRUE TRUE TRUE
kill FALSE TRUE TRUE TRUE
killPlayer FALSE TRUE TRUE TRUE
lag FALSE TRUE TRUE TRUE
listActiveQuests FALSE TRUE TRUE TRUE
listCompletedQuests FALSE TRUE TRUE TRUE
listGuilds FALSE TRUE TRUE TRUE
manufacture FALSE TRUE TRUE TRUE
maxCombatAbility FALSE TRUE TRUE TRUE
maxForcePower FALSE TRUE TRUE TRUE
maxStats FALSE TRUE TRUE TRUE
money FALSE TRUE TRUE TRUE
npc FALSE TRUE TRUE TRUE
npeGotoMedicalBay FALSE TRUE TRUE TRUE
npeGotoMilleniumFalcon FALSE TRUE TRUE TRUE
npeGotoStationGamma FALSE TRUE TRUE TRUE
npeGotoTansariiStation FALSE TRUE TRUE TRUE
object FALSE TRUE TRUE TRUE
objvar FALSE TRUE TRUE TRUE
overrideActiveMonths FALSE TRUE TRUE TRUE
overridePadawanTrialsEligibility FALSE TRUE TRUE TRUE
planetwarp FALSE TRUE TRUE TRUE
planetwarpTarget FALSE TRUE TRUE TRUE
qatool FALSE TRUE TRUE TRUE
qatool FALSE TRUE TRUE TRUE
reconnectToTransferServer FALSE TRUE TRUE TRUE
remote FALSE TRUE TRUE TRUE
removeAllowedPlayer FALSE TRUE TRUE TRUE
removeBannedPlayer FALSE TRUE TRUE TRUE
resendLoginMessageToAll FALSE TRUE TRUE TRUE
resetCooldowns FALSE TRUE TRUE TRUE
resetJedi FALSE TRUE TRUE TRUE
resource FALSE TRUE TRUE TRUE
resourceSetName FALSE TRUE TRUE TRUE
revertPlayerAppearance FALSE TRUE TRUE TRUE
revokeBadge FALSE TRUE TRUE TRUE
revokeSkill FALSE TRUE TRUE TRUE
revokeWarden FALSE TRUE TRUE TRUE
script FALSE TRUE TRUE TRUE
searchCorpse FALSE TRUE TRUE TRUE
secretSpawnSpam FALSE TRUE TRUE TRUE
server FALSE TRUE TRUE TRUE
setExperience FALSE TRUE TRUE TRUE
setFaction FALSE TRUE TRUE TRUE
setFactionStanding FALSE TRUE TRUE TRUE
setFirstName FALSE TRUE TRUE TRUE
setGrievousAuthorized FALSE TRUE TRUE TRUE
setGroupXPBonus FALSE TRUE TRUE TRUE
setHue FALSE TRUE TRUE TRUE
setInstanceAuthorized FALSE TRUE TRUE TRUE
setLastName FALSE TRUE TRUE TRUE
setLoginMessage FALSE TRUE TRUE TRUE
setLoginTitle FALSE TRUE TRUE TRUE
setMaximumSpawnTime FALSE TRUE TRUE TRUE
setMinimumSpawnTime FALSE TRUE TRUE TRUE
setName FALSE TRUE TRUE TRUE
setOwner FALSE TRUE TRUE TRUE
setPlanetLimit FALSE TRUE TRUE TRUE
setPlayerAppearance FALSE TRUE TRUE TRUE
setPlayerState FALSE TRUE TRUE TRUE
setPublicState FALSE TRUE TRUE TRUE
setRank FALSE TRUE TRUE TRUE
setSpeed FALSE TRUE TRUE TRUE
setTEF FALSE TRUE TRUE TRUE
setVeteranReward FALSE TRUE TRUE TRUE
setWardenLoginMessage FALSE TRUE TRUE TRUE
showFactionInformation FALSE TRUE TRUE TRUE
showSpawnRegion FALSE TRUE TRUE TRUE
skill FALSE TRUE TRUE TRUE
snoop FALSE TRUE TRUE TRUE
spawnStatus FALSE TRUE TRUE TRUE
spewCommandQueue FALSE TRUE TRUE TRUE
squelch FALSE TRUE TRUE TRUE
startCitySpawner FALSE TRUE TRUE TRUE
startRestussStageTwo FALSE TRUE TRUE TRUE
startSpawner FALSE TRUE TRUE TRUE
startTargetSpawner FALSE TRUE TRUE TRUE
startTraceLogging FALSE TRUE TRUE TRUE
stopCitySpawner FALSE TRUE TRUE TRUE
stopSpawner FALSE TRUE TRUE TRUE
stopTargetSpawner FALSE TRUE TRUE TRUE
stopTraceLogging FALSE TRUE TRUE TRUE
teleport FALSE TRUE TRUE TRUE
teleportTarget FALSE TRUE TRUE TRUE
teleportTo FALSE TRUE TRUE TRUE
unCityBan FALSE TRUE TRUE TRUE
unfreezePlayer FALSE TRUE TRUE TRUE
unsnoop FALSE TRUE TRUE TRUE
unsquelch FALSE TRUE TRUE TRUE
wipeItems FALSE TRUE TRUE TRUE
@@ -0,0 +1,110 @@
factionName playerAllowed isAggro isPvP pvpFaction enemies allies combatFactor
TEXT TEXT TEXT TEXT TEXT TEXT TEXT FLOAT
Imperial TRUE TRUE TRUE imperial Rebel - 1
Rebel TRUE TRUE TRUE rebel Imperial - 1
Hutt TRUE TRUE FALSE - naboo_security_force,nym,Imperial,corsec,narmle jabba,borvo 1
ImperialCitizen FALSE FALSE FALSE - - - 1
RebelCitizen FALSE FALSE FALSE - - - 1
Neutral FALSE FALSE FALSE - - - 1
Unattackable FALSE FALSE FALSE unattackable - - 1
clone_relics_claw FALSE FALSE FALSE - - - 1
clone_relics_droid FALSE TRUE FALSE - clone_relics_scientist - 1
clone_relics_scientist FALSE FALSE FALSE - clone_relics_droid Hutt,Imperial,Rebel 1
afarathu TRUE TRUE FALSE - corsec,survivor - 1
beldonnas_league TRUE TRUE FALSE - followers_of_lord_nyax,lost_aqualish corsec 1
corsec TRUE TRUE FALSE - afarathu,followers_of_lord_nyax,monumenter,rogue_corsec,lost_aqualish beldonnas_league 1
followers_of_lord_nyax TRUE TRUE FALSE - corsec,beldonnas_league - 1
hidden_daggers TRUE TRUE FALSE - corsec,beldonnas_league,flail rogue_corsec 1
meatlump TRUE TRUE FALSE - corsec,rogue_corsec,beldonnas_league - 1
monumenter TRUE TRUE FALSE - corsec,beldonnas_league - 1
olag_greck TRUE TRUE FALSE - corsec,beldonnas_league - 1
rogue_corsec TRUE TRUE FALSE - corsec hidden_daggers 1
smashball TRUE TRUE FALSE - corsec,cor_swoop - 1
dantari_raiders TRUE TRUE FALSE - kunga_tribe,mokk_tribe,janta_tribe - 1
janta_tribe TRUE TRUE FALSE - kunga_tribe,dantari_raiders - 1
kunga_tribe TRUE TRUE FALSE - mokk_tribe,dantari_raiders - 1
mokk_tribe TRUE TRUE FALSE - janta_tribe,dantari_raiders - 1
nightsister TRUE TRUE FALSE - mtn_clan,Imperial - 1
mtn_clan TRUE TRUE FALSE - nightsister - 1
donkuwah_tribe TRUE TRUE FALSE - gondula_tribe,panshee_tribe - 1
gorax FALSE TRUE FALSE - gondula_tribe,panshee_tribe - 1
gondula_tribe TRUE TRUE FALSE - donkuwah_tribe,korga_tribe,pubam,endor_marauder panshee_tribe 1
korga_tribe TRUE TRUE FALSE - gondula_tribe,panshee_tribe - 1
endor_marauder TRUE TRUE FALSE - gondula_tribe,panshee_tribe - 1
panshee_tribe TRUE TRUE FALSE - donkuwah_tribe,korga_tribe,pubam,endor_marauder gondula_tribe 1
pubam TRUE TRUE FALSE - gondula_tribe,panshee_tribe - 1
bandit TRUE TRUE FALSE - townsperson - 1
pirate TRUE TRUE FALSE - - - 1
thug TRUE TRUE FALSE - townsperson - 1
townsperson TRUE FALSE FALSE - thug,bandit Rebel,Imperial 1
gungan TRUE TRUE FALSE - plasma_thief,swamp_rat,borvo - 1
naboo TRUE TRUE FALSE - borvo - 1
plasma_thief TRUE TRUE FALSE - gungan - 1
swamp_rat TRUE TRUE FALSE - gungan - 1
naboo_security_force TRUE TRUE FALSE - borvo,naboo_pirate,plasma_thief,swamp_rat,trade_federation - 1
naboo_pirate TRUE TRUE FALSE - naboo_security_force - 1
trade_federation TRUE TRUE FALSE - borvo,naboo_security_force - 1
aakuans TRUE TRUE FALSE - fed_dub,binayre,liberation_party - 1
fed_dub TRUE TRUE FALSE - liberation_party,binayre,lost_aqualish,drall - 1
binayre TRUE TRUE FALSE - fed_dub,aakuans,corsec - 1
liberation_party TRUE TRUE FALSE - fed_dub,corsec - 1
jabba TRUE TRUE FALSE - valarian,borvo Hutt 1
alkhara TRUE TRUE FALSE - tusken_raider - 1
desert_demon TRUE TRUE FALSE - swoop - 1
jawa TRUE TRUE FALSE - tusken_raider - 1
swoop TRUE TRUE FALSE - desert_demon - 1
tusken_raider TRUE TRUE FALSE - jawa,alkhara - 1
valarian TRUE TRUE FALSE - jabba - 1
drall TRUE TRUE FALSE - corsec,fed_dub - 1
borvo TRUE TRUE FALSE - gungan,trade_federation,jabba - 1
sif TRUE TRUE FALSE - Rebel,Imperial Hutt 1
flail TRUE TRUE FALSE - hidden_daggers - 1
cor_swoop TRUE TRUE FALSE - smashball - 1
restuss TRUE TRUE FALSE - garyn,cobral narmle 1
narmle TRUE TRUE FALSE - spice_collective,kobola restuss 1
rorgungan TRUE TRUE FALSE - spice_collective - 1
garyn TRUE TRUE FALSE - restuss - 1
cobral TRUE TRUE FALSE - restuss - 1
spice_collective TRUE TRUE FALSE - narmle,rorgungan,kobola - 1
kobola TRUE TRUE FALSE - narmle,spice_collective - 1
lost_aqualish TRUE TRUE FALSE - beldonnas_league,fed_dub,corsec - 1
spider_nightsister TRUE TRUE FALSE - mtn_clan - 1
bloodrazor TRUE TRUE FALSE - canyon_corsair,nym - 1
canyon_corsair TRUE TRUE FALSE - bloodrazor,nym - 1
lok_mercenaries TRUE TRUE FALSE - bloodrazor,canyon_corsair - 1
nym TRUE TRUE FALSE - bloodrazor,canyon_corsair,sulfur_lake_pirate - 1
warren_imperial FALSE TRUE FALSE - warren_huurton,warren_teraud,warren_cyborg warren_imperial_worker 1
warren_imperial_worker FALSE TRUE FALSE - warren_huurton,warren_teraud,warren_cyborg warren_imperial 1
warren_teraud FALSE TRUE FALSE - warren_huurton,warren_imperial,warren_imperial_worker,warren_cyborg,warren_scientist - 1
warren_huurton FALSE TRUE FALSE - warren_imperial,warren_imperial_worker,warren_cyborg,warren_teraud - 1
warren_cyborg FALSE TRUE FALSE - warren_imperial,warren_imperial_worker,warren_huurton,warren_teraud,warren_scientist - 1
warren_scientist FALSE TRUE FALSE - warren_teraud,warren_cyborg - 1
geonosian_mad_bunker FALSE TRUE FALSE - - geonosian_crazed_monster 1
geonosian_crazed_monster FALSE TRUE FALSE - - geonosian_mad_bunker 1
geonosian_crazy FALSE TRUE FALSE - geonosian_mad_bunker,geonosian_crazed_monster - 1
aggro_corsec FALSE TRUE FALSE - afarathu,followers_of_lord_nyax,monumenter,rogue_corsec,lost_aqualish corsec 1
death_watch FALSE TRUE FALSE - death_watch_special - 1
death_watch_special FALSE FALSE FALSE - - - 1
sith_shadow TRUE TRUE FALSE - fs_villager Rebel,Imperial 0
fs_villager TRUE TRUE FALSE - sith_shadow - 0
sith_shadow_nonaggro TRUE FALSE FALSE - fs_villager Rebel,Imperial 0
forest_outcast TRUE TRUE FALSE - forest_kerritamba - 1
forest_kerritamba TRUE TRUE FALSE - forest_outcast - 1
avatar_kashyyyk FALSE TRUE FALSE - avatar_blackscale - 1
avatar_blackscale FALSE TRUE FALSE - avatar_kashyyyk - 1
hsskor FALSE TRUE TRUE - kashyyyk_resistance - 1
kashyyyk_resistance FALSE TRUE TRUE - hsskor - 1
faction_sayormi FALSE TRUE FALSE - - - 1
yavin_scavenger TRUE TRUE FALSE - Hutt, jabba - 1
droid_army FALSE TRUE FALSE - mustafar_miners - 1
mustafar_miners FALSE TRUE FALSE - droid_army - 1
dark_jedi_kenobi FALSE TRUE FALSE - - - 1
underworld TRUE FALSE FALSE - - - 1
azure_cabal TRUE FALSE FALSE - - - 1
heroic_tusken FALSE TRUE FALSE - espa,expa_guard - 1
espa FALSE FALSE FALSE - - espa_guard 1
espa_guard FALSE TRUE FALSE - heroic_tusken espa 1
survivor FALSE FALSE FALSE - - - 1
afflicted FALSE TRUE FALSE - survivor,survivor_guard - 1
survivor_guard FALSE FALSE FALSE - afflicted - 1
sulfur_lake_pirate FALSE TRUE FALSE - nym - 1
@@ -0,0 +1,201 @@
STRUCTURE TEMP_STRUCTURE FOOTPRINT_TEMPLATE NO_LOT_REQUIREMENT LOT_REDUCTION EJECT_RANGE CIVIC CITY_RANK CITY_COST SHUTTLEPORT CLONE_FACILITY GARAGE CAN_RECLAIM MAINT_RATE DECAY_RATE CONDITION REDEED_COST HAS_SIGN POWER_RATE SKILLMOD SKILLMODVALUE SKILLMOD_MESSAGE OBJECT_1 X_1 Y_1 Z_1 CELL_1 HEADING_1 OBJECT_2 X_2 Y_2 Z_2 CELL_2 HEADING_2 OBJECT_3 X_3 Y_3 Z_3 CELL_3 HEADING_3 OBJECT_4 X_4 Y_4 Z_4 CELL_4 HEADING_4 OBJECT_5 X_5 Y_5 Z_5 CELL_5 HEADING_5 COMMENTS
TEXT TEXT TEXT TEXT INTEGER INTEGER TEXT INTEGER INTEGER TEXT TEXT TEXT TEXT INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER TEXT INTEGER TEXT TEXT FLOAT FLOAT FLOAT TEXT INTEGER TEXT FLOAT FLOAT FLOAT TEXT INTEGER TEXT FLOAT FLOAT FLOAT TEXT INTEGER TEXT FLOAT FLOAT FLOAT TEXT INTEGER TEXT FLOAT FLOAT FLOAT TEXT INTEGER TEXT
object/building/player/player_house_tcg_relaxation_pool.iff object/building/player/construction/construction_player_tcg_relaxation_pool.iff none FALSE 4 32 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff 7.25 4 0 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_jedi_meditation_room.iff object/building/player/construction/construction_player_jedi_meditation_room.iff none FALSE 2 32 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff 8.2 4 -1.1 entry -91 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_sith_meditation_room.iff object/building/player/construction/construction_player_sith_meditation_room.iff none FALSE 2 32 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff 4 4 1.85 entry 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_small_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -5 0.74 -2.76 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_small_style_01_floorplan_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -5 0.74 -1.81 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_small_style_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.5 0.63 3.77 entry 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_small_style_02_floorplan_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.7 0.62 3.55 entry 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_medium_style_01.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3 0.62 06.04.2015 public 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_medium_style_02.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.5 1.76 -2.87 lobby -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_large_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.17 4.59 -4.4 mainhall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_corellia_large_style_02.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.22 4.71 -3.85 hallway 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -5 0.74 -2.76 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_style_01_floorplan_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -5 0.74 -1.81 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_style_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.5 0.63 3.77 entry 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_style_02_floorplan_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.69 0.62 3.55 entry 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_medium_style_01.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3 0.62 06.04.2015 public 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_medium_style_02.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -7.15 0.88 5.59 middleroom 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_large_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.17 4.59 -4.4 mainhall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_large_style_02.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.22 4.71 -3.85 hallway 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_small_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.1 0.7 5.31 foyer -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_small_style_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 0.6 0.7 6.15 hall 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_medium_style_01.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 9.89 1.1 -10.75 foyerdown 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_medium_style_02.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 5.62 1.06 7.98 foyer 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_large_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 14.85 4.7 -1.76 hall1 -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tatooine_small_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.79 1.06 06.02.2015 foyer 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tatooine_small_style_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.79 1.06 06.02.2015 foyer 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tatooine_medium_style_01.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 6.94 1.06 7.98 foyer 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tatooine_large_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 8.16 1.06 11.24 public 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/manufacture/clothing_factory.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 6 1000 2500 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/manufacture/food_factory.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 6 1000 2500 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/manufacture/weapon_factory.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 6 1000 2500 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/manufacture/structure_factory.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 6 1000 2500 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/generators/power_generator_fusion_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/generators/power_generator_photo_bio_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/generators/power_generator_solar_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/generators/power_generator_geothermal_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/generators/power_generator_wind_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_gas/mining_gas_harvester_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 8 6 1000 1500 0 25 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_gas/mining_gas_harvester_style_2.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_gas/mining_gas_harvester_style_3.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 23 6 1000 4500 0 75 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_gas/mining_gas_harvester_style_4.iff object/installation/base/construction_installation_base.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 63 6 1000 12375 0 206 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_harvester_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 8 6 1000 1500 0 25 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_harvester_style_2.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_harvester_style_3.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 23 6 1000 4500 0 75 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_harvester_style_4.iff object/installation/base/construction_installation_base.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 63 6 1000 12375 0 206 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_moisture_harvester.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 8 6 1000 1500 0 25 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_moisture_harvester_medium.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_moisture_harvester_heavy.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 23 6 1000 4500 0 75 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_liquid/mining_liquid_moisture_harvester_elite.iff object/installation/base/construction_installation_base.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 63 6 1000 12375 0 206 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_ore/mining_ore_harvester_style_1.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 8 6 1000 1500 0 25 - 20 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_ore/mining_ore_harvester_style_2.iff object/installation/mining_ore/construction/construction_mining_ore_harvester_style_2.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_ore/mining_ore_harvester_heavy.iff object/installation/mining_ore/construction/construction_mining_ore_harvester_style_heavy.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 23 6 1000 4500 0 75 - 10 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_ore/mining_ore_harvester_elite.iff object/installation/mining_ore/construction/construction_mining_ore_harvester_style_heavy.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 63 6 1000 12375 0 206 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_organic/mining_organic_creature_farm.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 6 1000 2500 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_organic/mining_organic_flora_farm.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 8 6 1000 1500 0 25 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_organic/mining_organic_flora_farm_medium.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 15 6 1000 3000 0 50 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_organic/mining_organic_flora_farm_heavy.iff object/installation/base/construction_installation_base.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 23 6 1000 4500 0 75 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/mining_organic/mining_organic_flora_farm_elite.iff object/installation/base/construction_installation_base.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 63 6 1000 12375 0 206 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_guildhall_corellia_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 25 5 7200 5000 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 17.88 2.25 10.45 closeta 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_guildhall_generic_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 25 5 7200 5000 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 17.88 2.25 10.45 closeta 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_guildhall_naboo_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 25 5 7200 5000 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 17.88 2.25 10.45 closeta 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_guildhall_tatooine_style_01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 25 5 7200 5000 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 8.16 1.06 11.24 public 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_guildhall_tatooine_style_02.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 25 5 7200 5000 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 9.13 1 6.36 lobby 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/turret/turret_block_large.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 15 6 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/turret/turret_block_med.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 10 6 2000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/turret/turret_block_sm.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 5 6 1000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/covert_detector/detector_32m.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 8 6 10000 1500 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/block_lg.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 15 6 300000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/block_med.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 10 6 200000 2000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/block_sm.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 5 6 75000 1000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/dish_sm.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 5 6 75000 1000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/dish_lg.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 15 6 300000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/tower_lg.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 15 6 300000 3000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/tower_med.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 10 6 200000 2000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/turret/tower_sm.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 5 6 75000 1000 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/installation/faction_perk/minefield/field_1x1.iff object/installation/base/construction_installation_base.iff none FALSE 0 0 FALSE 0 0 FALSE FALSE FALSE FALSE 0 0 1000 0 0 0 - 0 - - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s01_rebel.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s01_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0 -6 mainhall 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s01_imp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s01_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0 -6 mainhall 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s02_rebel.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s02_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s02_imp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s02_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s03_rebel.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s03_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s03_imp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s03_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s04_rebel.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s04_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s04_imp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s04_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s05_rebel.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s05_fp.iff TRUE 0 32 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 1 12.05.2015 mainhall 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s05_imp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s05_fp.iff TRUE 0 32 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 1 12.05.2015 mainhall 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_merchant_tent_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 3 3 4320 600 1 0 private_place_merchant_tent 100 place_merchant_tent object/tangible/terminal/terminal_player_structure.iff -0.15 0.27 -2.76 r1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_merchant_tent_style_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 3 3 4320 600 1 0 private_place_merchant_tent 100 place_merchant_tent object/tangible/terminal/terminal_player_structure.iff -0.15 0.27 -2.76 r1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_merchant_tent_style_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 3 3 4320 600 1 0 private_place_merchant_tent 100 place_merchant_tent object/tangible/terminal/terminal_player_structure.iff -0.15 0.27 -2.76 r1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cityhall_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 0 1 FALSE FALSE FALSE FALSE 0 0 1000 0 1 0 private_place_cityhall 100 place_cityhall object/tangible/terminal/terminal_player_structure.iff -16.78 2 07.09.2015 mayoroffice 180 object/tangible/terminal/terminal_city_vote.iff 0.25 2 -9.65 grandhall 0 object/tangible/terminal/terminal_city.iff 17.07 2 -8.7 library 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cityhall_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 0 1 FALSE FALSE FALSE FALSE 0 0 1000 0 1 0 private_place_cityhall 100 place_cityhall object/tangible/terminal/terminal_player_structure.iff -16.78 2 07.09.2015 mayoroffice 180 object/tangible/terminal/terminal_city_vote.iff 0.25 2 -9.65 grandhall 0 object/tangible/terminal/terminal_city.iff 17.07 2 -8.7 library 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cityhall_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 0 1 FALSE FALSE FALSE FALSE 0 0 1000 0 1 0 private_place_cityhall 100 place_cityhall object/tangible/terminal/terminal_player_structure.iff -16.78 2 07.09.2015 mayoroffice 180 object/tangible/terminal/terminal_city_vote.iff 0.25 2 -9.65 grandhall 0 object/tangible/terminal/terminal_city.iff 17.07 2 -8.7 library 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/bank_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 2 4 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_bank 100 place_bank object/tangible/terminal/terminal_bank.iff -1 -0.25 0 world 90 object/tangible/terminal/terminal_bank.iff 1 -0.25 0 world -90 object/tangible/terminal/terminal_bank.iff 0 -0.25 -1 world 0 object/tangible/terminal/terminal_player_structure_nosnap.iff 0 -0.25 1 world 180 - 0 0 0 - 0 -
object/building/player/city/bank_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 2 4 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_bank 100 place_bank object/tangible/terminal/terminal_bank.iff -1 -0.25 0 world 90 object/tangible/terminal/terminal_bank.iff 1 -0.25 0 world -90 object/tangible/terminal/terminal_bank.iff 0 -0.25 -1 world 0 object/tangible/terminal/terminal_player_structure_nosnap.iff 0 -0.25 1 world 180 - 0 0 0 - 0 -
object/building/player/city/bank_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 2 4 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_bank 100 place_bank object/tangible/terminal/terminal_bank.iff -1 -0.25 0 world 90 object/tangible/terminal/terminal_bank.iff 1 -0.25 0 world -90 object/tangible/terminal/terminal_bank.iff 0 -0.25 -1 world 0 object/tangible/terminal/terminal_player_structure_nosnap.iff 0 -0.25 1 world 180 - 0 0 0 - 0 -
object/building/player/city/barn_no_planet_restriction.iff object/building/player/construction/construction_player_barn.iff none FALSE 1 32 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff 3 1.8 3 entry 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cantina_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 2 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_cantina 100 place_cantina object/tangible/terminal/terminal_player_structure.iff -4.1 2 6.19 cantina 157 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cantina_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 2 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_cantina 100 place_cantina object/tangible/terminal/terminal_player_structure.iff -4.1 2 6.19 cantina 157 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cantina_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 2 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_cantina 100 place_cantina object/tangible/terminal/terminal_player_structure.iff -4.1 2 6.19 cantina 157 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cloning_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 3 3 FALSE TRUE FALSE TRUE 0 0 1000 0 1 0 private_place_cloning 100 place_cloning object/tangible/terminal/terminal_player_structure.iff -13.5 1 -6.4 cloninglab 90 object/tangible/terminal/terminal_cloning.iff -14 1 03.01.2015 cloninglab 90 object/tangible/terminal/terminal_insurance.iff 6.3 1 -6.69 cloninglab -90 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cloning_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 3 3 FALSE TRUE FALSE TRUE 0 0 1000 0 1 0 private_place_cloning 100 place_cloning object/tangible/terminal/terminal_player_structure.iff -13.5 1 -6.4 cloninglab 90 object/tangible/terminal/terminal_cloning.iff -14 1 03.01.2015 cloninglab 90 object/tangible/terminal/terminal_insurance.iff 6.3 1 -6.69 cloninglab -90 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/cloning_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 3 3 FALSE TRUE FALSE TRUE 0 0 1000 0 1 0 private_place_cloning 100 place_cloning object/tangible/terminal/terminal_player_structure.iff -13.5 1 -6.4 cloninglab 90 object/tangible/terminal/terminal_cloning.iff -14 1 03.01.2015 cloninglab 90 object/tangible/terminal/terminal_insurance.iff 6.3 1 -6.69 cloninglab -90 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/diner_no_planet_restriction.iff object/building/player/construction/construction_player_diner.iff none FALSE 1 32 FALSE 3 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff 8.8 1.1 1.73 entry -91 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/hospital_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 3 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_hospital 100 place_hospital object/tangible/terminal/terminal_player_structure.iff 7.48 2 01.05.2015 mainroom -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/hospital_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 3 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_hospital 100 place_hospital object/tangible/terminal/terminal_player_structure.iff 7.48 2 01.05.2015 mainroom -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/hospital_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 3 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_hospital 100 place_hospital object/tangible/terminal/terminal_player_structure.iff 7.48 2 01.05.2015 mainroom -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/theater_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 4 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_theater 100 place_theater object/tangible/terminal/terminal_player_structure.iff -7 2 -14.2 backstage 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/theater_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 4 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_theater 100 place_theater object/tangible/terminal/terminal_player_structure.iff -7 2 -14.2 backstage 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/theater_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 4 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 private_place_theater 100 place_theater object/tangible/terminal/terminal_player_structure.iff -7 2 -14.2 backstage 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/shuttleport_tatooine.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 4 2 TRUE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_shuttleport 100 place_shuttleport object/tangible/terminal/terminal_player_structure_nosnap.iff 8.4 -1 -14.5 world 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/shuttleport_naboo.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 4 2 TRUE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_shuttleport 100 place_shuttleport object/tangible/terminal/terminal_player_structure_nosnap.iff 8.4 -1 -14.5 world 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/shuttleport_corellia.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none TRUE 0 0 TRUE 4 2 TRUE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_shuttleport 100 place_shuttleport object/tangible/terminal/terminal_player_structure_nosnap.iff 8.4 -1 -14.5 world 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_lrg_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_lrg_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_lrg_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_lrg_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_med_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_med_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_med_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_med_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_sml_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_sml_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_sml_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_corellia_sml_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_lrg_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_lrg_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_lrg_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_lrg_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_med_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_med_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_med_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_med_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_sml_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_sml_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_sml_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_naboo_sml_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_lrg_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_lrg_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_lrg_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_lrg_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_large_garden 100 place_large_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_med_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_med_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_med_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_med_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_medium_garden 100 place_medium_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_sml_02.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_sml_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_sml_04.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_tatooine_sml_05.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dantooine_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dantooine_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dantooine_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dathomir_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dathomir_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_dathomir_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_endor_lrg_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 3 6 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 12 -1 -12 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_endor_med_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 8 -1 -8 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_endor_sml_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_exotic_garden 100 place_exotic_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 4.5 -1 -4.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_garage_tatooine_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE TRUE TRUE 0 0 1000 0 0 0 private_place_garage 100 place_garage object/tangible/terminal/terminal_player_structure_nosnap_mini.iff -3 -1 -3 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_garage_naboo_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE TRUE TRUE 0 0 1000 0 0 0 private_place_garage 100 place_garage object/tangible/terminal/terminal_player_structure_nosnap_mini.iff -3 -1 -3 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_garage_corellia_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 2 3 FALSE FALSE TRUE TRUE 0 0 1000 0 0 0 private_place_garage 100 place_garage object/tangible/terminal/terminal_player_structure_nosnap_mini.iff -3 -1 -3 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s01_rebel_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s01_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0 -6 mainhall 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s01_imp_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s01_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0 -6 mainhall 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s02_rebel_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s02_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s02_imp_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s02_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s03_rebel_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s03_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s03_imp_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s03_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s04_rebel_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s04_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s04_imp_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s04_fp.iff TRUE 0 8 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 0.25 1.86 hall1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s05_rebel_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s05_fp.iff TRUE 0 32 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_rebel.iff 0 1 12.05.2015 mainhall 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/faction_perk/hq/hq_s05_imp_pvp.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff object/building/faction_perk/hq/hq_s05_fp.iff TRUE 0 32 FALSE 0 0 FALSE FALSE FALSE FALSE 0 200 100000 0 1 0 - 0 - object/tangible/terminal/terminal_hq_imperial.iff 0 1 12.05.2015 mainhall 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_mustafar_lg.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 8 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 0 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -4.5 0.46 6.33 entrance 90 object/tangible/terminal/terminal_elevator_up.iff -1.19 -33 1.61 elevator 160 object/tangible/terminal/terminal_elevator_down.iff 1.18 -26 1.65 elevator -166 object/tangible/terminal/terminal_elevator_down.iff 1.18 0.47 1.65 elevator -166 - 0 0 0 - 0 -
object/building/player/city/garden_imperial_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 1.5 -0.9 -3.5 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/city/garden_rebel_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none TRUE 0 0 TRUE 1 5 FALSE FALSE FALSE TRUE 0 0 1000 0 1 0 private_place_small_garden 100 place_small_garden object/tangible/terminal/terminal_player_structure_nosnap_mini.iff 2.85 -0.9 -4 world 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tatooine_small_window_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.79 1.06 06.02.2015 foyer 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_naboo_small_window_style_01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.1 0.7 5.31 foyer -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_windowed.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -5 0.74 -1.81 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_medium_windowed.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 5 0.62 06.04.2015 public -180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_small_window_style_03.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -1.8 3 04.03.2015 entry -180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_medium_windowed_s02.iff object/building/player/construction/construction_player_house_tatooine_medium_style_01.iff none FALSE 2 0 FALSE 0 0 FALSE FALSE FALSE TRUE 9 4 5760 1700 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 5 -2 6 entryway -180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_generic_large_window_s01.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -6.22 4.71 -3.85 hallway 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 Z = FORWARD/BACK /// Y = UP/DOWN
object/building/player/player_house_generic_large_window_s02.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 5 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 8 0 -8.5 entry 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 X = right/left /// Y = UP/DOWN
object/building/player/player_house_hangar.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 0 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 8.9 0 -6.5 entry -90 object/tangible/terminal/terminal_player_hangar_structure.iff 8.9 0 -12.6 entry -90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 X = right/left
object/building/player/player_house_atat.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.8 1.06 10.05.2015 body 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tcg_emperors_spire.iff object/building/player/construction/construction_player_tcg_emperors_spire.iff none FALSE 2 32 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff -2.6 25.6 0 tower -91 object/tangible/terminal/terminal_elevator_up.iff -0.76 1.69 -1.1 elevator 0 object/tangible/terminal/terminal_elevator_down.iff 0.74 26.7 -1.1 elevator 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tcg_rebel_spire.iff object/building/player/construction/construction_player_tcg_rebel_spire.iff none FALSE 2 32 FALSE 0 0 FALSE FALSE FALSE TRUE 4 3 4320 800 1 0 - 0 - object/tangible/terminal/terminal_player_structure_nosnap.iff -1.24 25.4 -1.59 tower 180 object/tangible/terminal/terminal_elevator_up.iff -0.75 1.59 -1.1 elevator 0 object/tangible/terminal/terminal_elevator_down.iff 0.74 25.1 -1.1 elevator 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_sandcrawler.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 3 0 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 2500 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -4.46 8.81 -13.52 foyer 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_pgc_merchant_tent_s01.iff object/building/player/construction/construction_player_house_tatooine_small_style_01.iff none FALSE 1 0 FALSE 0 0 FALSE FALSE FALSE TRUE 3 3 4320 600 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -0.15 0.27 -2.76 r1 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tcg_commando_bunker.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 2 8 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 0 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 3.2 0.4 3.16 entry 180 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tcg_vehicle_garage.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 2 8 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 0 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff 14.56 0.53 12.79 entry 180 object/tangible/terminal/terminal_player_vehicle_garage.iff -1.1 0.84 -9.95 entry 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
object/building/player/player_house_tcg_vip_bunker.iff object/building/player/construction/construction_player_house_tatooine_large_style_01.iff none FALSE 2 8 FALSE 0 0 FALSE FALSE FALSE TRUE 13 5 7200 0 1 0 - 0 - object/tangible/terminal/terminal_player_structure.iff -4.5 0.46 6.33 entrance 90 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 - 0 0 0 - 0 -
+6289 -6289
View File
File diff suppressed because it is too large Load Diff
-11
View File
@@ -27,7 +27,6 @@
***********************************************************************************/
package intents;
import resources.Galaxy;
import resources.control.Intent;
import services.galaxy.GalacticManager;
import services.objects.ObjectManager;
@@ -36,7 +35,6 @@ import services.player.PlayerManager;
public abstract class GalacticIntent extends Intent {
private GalacticManager galacticManager;
private Galaxy galaxy;
protected GalacticIntent(String type) {
super(type);
@@ -45,17 +43,12 @@ public abstract class GalacticIntent extends Intent {
protected GalacticIntent(GalacticIntent i) {
super(i.getType());
setGalacticManager(i.getGalacticManager());
setGalaxy(i.getGalaxy());
}
public void setGalacticManager(GalacticManager galacticManager) {
this.galacticManager = galacticManager;
}
public void setGalaxy(Galaxy galaxy) {
this.galaxy = galaxy;
}
public ObjectManager getObjectManager() {
return galacticManager.getObjectManager();
}
@@ -68,8 +61,4 @@ public abstract class GalacticIntent extends Intent {
return galacticManager;
}
public Galaxy getGalaxy() {
return galaxy;
}
}
-9
View File
@@ -37,7 +37,6 @@ public class PlayerEventIntent extends Intent {
private Player player;
private PlayerEvent event;
private String galaxy;
public PlayerEventIntent(Player p, PlayerEvent event) {
super(TYPE);
@@ -45,11 +44,6 @@ public class PlayerEventIntent extends Intent {
setEvent(event);
}
public PlayerEventIntent(Player p, String galaxy, PlayerEvent event) {
this(p, event);
this.galaxy = galaxy;
}
public void setPlayer(Player p) {
this.player = p;
}
@@ -66,7 +60,4 @@ public class PlayerEventIntent extends Intent {
return event;
}
public String getGalaxy() {
return galaxy;
}
}
+7 -7
View File
@@ -37,13 +37,13 @@ public class RequestZoneInIntent extends Intent {
private Player player;
private CreatureObject creature;
private String galaxy;
private boolean firstZone;
public RequestZoneInIntent(Player player, CreatureObject creature, String galaxy) {
public RequestZoneInIntent(Player player, CreatureObject creature, boolean firstZone) {
super(TYPE);
setPlayer(player);
setCreature(creature);
setGalaxy(galaxy);
setFirstZone(firstZone);
}
public void setPlayer(Player player) {
@@ -54,8 +54,8 @@ public class RequestZoneInIntent extends Intent {
this.creature = creature;
}
public void setGalaxy(String galaxy) {
this.galaxy = galaxy;
public void setFirstZone(boolean firstZone) {
this.firstZone = firstZone;
}
public Player getPlayer() {
@@ -66,8 +66,8 @@ public class RequestZoneInIntent extends Intent {
return creature;
}
public String getGalaxy() {
return galaxy;
public boolean isFirstZone() {
return firstZone;
}
}
-10
View File
@@ -69,16 +69,6 @@ public class ProjectSWG {
return (long) server.manager.getCoreTime();
}
/**
* Returns the server's galaxy ID. This may be
* deprecated in the future if multiple servers are run
* at once.
* @return the server's galaxy ID
*/
public static final int getGalaxyId() {
return CoreManager.getGalaxyId();
}
/**
* Returns the server's galactic time. This is the official time sent to
* the client and should be used for any official client-time purposes.
+109 -41
View File
@@ -27,12 +27,14 @@
***********************************************************************************/
package network;
import intents.network.ConnectionOpenedIntent;
import intents.network.InboundPacketIntent;
import java.io.EOFException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import resources.control.Intent;
@@ -43,17 +45,24 @@ import network.packets.swg.zone.object_controller.ObjectController;
public class NetworkClient {
private static final int DEFAULT_BUFFER = 128;
private final Object prevPacketIntentMutex = new Object();
private final Object outboundMutex = new Object();
private final Object bufferMutex = new Object();
private final InetSocketAddress address;
private final long networkId;
private final PacketSender packetSender;
private Intent prevPacketIntent;
private ByteBuffer buffer;
private long lastBufferSizeModification;
public NetworkClient(InetSocketAddress address, long networkId, PacketSender packetSender) {
this.address = address;
this.networkId = networkId;
this.packetSender = packetSender;
this.buffer = ByteBuffer.allocate(DEFAULT_BUFFER);
lastBufferSizeModification = System.nanoTime();
prevPacketIntent = null;
}
@@ -65,6 +74,13 @@ public class NetworkClient {
return networkId;
}
public void onConnected() {
synchronized (prevPacketIntentMutex) {
prevPacketIntent = new ConnectionOpenedIntent(networkId);
prevPacketIntent.broadcast();
}
}
public void sendPacket(Packet p) {
byte [] encoded = p.encode().array();
int decompressedLength = encoded.length;
@@ -89,12 +105,37 @@ public class NetworkClient {
}
}
public boolean process(byte [] data) {
List <Packet> packets = processPackets(ByteBuffer.wrap(data));
for (Packet p : packets) {
p.setAddress(address.getAddress());
p.setPort(address.getPort());
synchronized (prevPacketIntentMutex) {
public void addToBuffer(byte [] data) {
synchronized (bufferMutex) {
if (data.length > buffer.remaining()) { // Increase size
int nCapacity = buffer.capacity() * 2;
while (nCapacity < buffer.position()+data.length)
nCapacity *= 2;
ByteBuffer bb = ByteBuffer.allocate(nCapacity);
buffer.flip();
bb.put(buffer);
bb.put(data);
this.buffer = bb;
lastBufferSizeModification = System.nanoTime();
} else {
buffer.put(data);
if (buffer.position() < buffer.capacity()/4 && (System.nanoTime()-lastBufferSizeModification) >= 1E9)
shrinkBuffer();
}
}
}
public boolean process() {
List <Packet> packets;
synchronized (bufferMutex) {
buffer.flip();
packets = processPackets();
buffer.compact();
}
synchronized (prevPacketIntentMutex) {
for (Packet p : packets) {
p.setAddress(address.getAddress());
p.setPort(address.getPort());
InboundPacketIntent i = new InboundPacketIntent(p, networkId);
i.broadcastAfterIntent(prevPacketIntent);
prevPacketIntent = i;
@@ -103,52 +144,79 @@ public class NetworkClient {
return packets.size() > 0;
}
private List<Packet> processPackets(ByteBuffer data) {
List <Packet> packets = new ArrayList<>();
boolean added = true;
while (added && data.remaining() > 0) {
added = processPacket(packets, data);
private void shrinkBuffer() {
synchronized (bufferMutex) {
int nCapacity = DEFAULT_BUFFER;
while (nCapacity < buffer.position())
nCapacity *= 2;
if (nCapacity >= buffer.capacity())
return;
ByteBuffer bb = ByteBuffer.allocate(nCapacity).order(ByteOrder.LITTLE_ENDIAN);
buffer.flip();
bb.put(buffer);
buffer = bb;
lastBufferSizeModification = System.nanoTime();
}
}
private List<Packet> processPackets() {
List <Packet> packets = new LinkedList<>();
Packet p = null;
try {
while (buffer.hasRemaining()) {
p = processPacket();
if (p != null)
packets.add(p);
}
} catch (EOFException e) {
System.err.println(e.getMessage());
}
return packets;
}
private boolean processPacket(List<Packet> packets, ByteBuffer data) {
if (data.remaining() < 5) {
System.err.println("Not enough remaining data for header! Remaining: " + data.remaining());
return false;
}
data.order(ByteOrder.LITTLE_ENDIAN);
byte bitfield = data.get();
private Packet processPacket() throws EOFException {
if (buffer.remaining() < 5)
throw new EOFException("Not enough remaining data for header! Remaining: " + buffer.remaining());
buffer.order(ByteOrder.LITTLE_ENDIAN);
byte bitfield = buffer.get();
boolean compressed = (bitfield & (1<<0)) != 0;
boolean swg = (bitfield & (1<<1)) != 0;
int length = data.getShort();
int decompressedLength = data.getShort();
if (data.remaining() < length) {
System.err.println("Not enough remaining data! Remaining: " + data.remaining() + " Length: " + length);
return false;
int length = buffer.getShort();
int decompressedLength = buffer.getShort();
if (buffer.remaining() < length) {
buffer.position(buffer.position() - 5);
throw new EOFException("Not enough remaining data! Remaining: " + buffer.remaining() + " Length: " + length);
}
byte [] pData = new byte[length];
data.get(pData);
buffer.get(pData);
if (compressed) {
pData = Compression.decompress(pData, decompressedLength);
length = pData.length;
}
if (swg) {
if (length < 6) {
System.err.println("Length too small: " + length);
return false;
}
ByteBuffer pBuffer = ByteBuffer.wrap(pData).order(ByteOrder.LITTLE_ENDIAN);
int crc = pBuffer.getInt(2);
if (crc == 0x80CE5E46)
packets.add(ObjectController.decodeController(pBuffer));
else {
SWGPacket packet = PacketType.getForCrc(crc);
packet.decode(pBuffer);
packets.add(packet);
}
if (swg)
return processSWG(pData);
else
return processProtocol(pData);
}
private Packet processProtocol(byte [] data) {
return null;
}
private SWGPacket processSWG(byte [] data) {
if (data.length < 6) {
System.err.println("Length too small: " + data.length);
return null;
}
ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
int crc = buffer.getInt(2);
if (crc == 0x80CE5E46)
return ObjectController.decodeController(buffer);
else {
SWGPacket packet = PacketType.getForCrc(crc);
if (packet != null)
packet.decode(buffer);
return packet;
}
return true;
}
public String toString() {
@@ -56,7 +56,6 @@ public class LoginClusterStatus extends SWGPacket {
g.setZonePort(getShort(data));
g.setPingPort(getShort(data));
g.setPopulation(getInt(data));
g.setPopulationStatus(getInt(data));
g.setMaxCharacters(getInt(data));
g.setTimeZone(getInt(data));
g.setStatus(getInt(data));
+51 -28
View File
@@ -30,13 +30,20 @@ package resources;
public class Galaxy {
// Population status values. Values are in percent.
private static final double VERY_LIGHT = 10;
private static final double LIGHT = 20;
private static final double MEDIUM = 30;
private static final double HEAVY = 40;
private static final double VERY_HEAVY = 50;
private static final double EXTREMELY_HEAVY = 100;
private int id = 0;
private String name = "";
private String address = "";
private int zonePort = 44463;
private int pingPort = 44462;
private int population = 0;
private int popStatus = 0;
private GalaxyStatus status = GalaxyStatus.DOWN;
private int timeZone = 0;
private int maxCharacters = 0;
@@ -48,37 +55,53 @@ public class Galaxy {
}
public int getId() { return id; }
public String getName() { return name; }
public String getAddress() { return address; }
public int getZonePort() { return zonePort; }
public int getPingPort() { return pingPort; }
public int getPopulation() { return population; }
public int getPopulationStatus() { return popStatus; }
public GalaxyStatus getStatus() { return status; }
public int getTimeZone() { return timeZone; }
public int getMaxCharacters() { return maxCharacters; }
public int getOnlinePlayerLimit() { return onlinePlayerLimit; }
public int getOnlineFreeTrialLimit() { return onlineFreeTrialLimit; }
public boolean isRecommended() { return recommended; }
public synchronized int getId() { return id; }
public synchronized String getName() { return name; }
public synchronized String getAddress() { return address; }
public synchronized int getZonePort() { return zonePort; }
public synchronized int getPingPort() { return pingPort; }
public synchronized int getPopulation() { return population; }
public synchronized GalaxyStatus getStatus() { return status; }
public synchronized int getTimeZone() { return timeZone; }
public synchronized int getMaxCharacters() { return maxCharacters; }
public synchronized int getOnlinePlayerLimit() { return onlinePlayerLimit; }
public synchronized int getOnlineFreeTrialLimit() { return onlineFreeTrialLimit; }
public synchronized boolean isRecommended() { return recommended; }
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setAddress(String addr) { this.address = addr; }
public void setZonePort(int port) { this.zonePort = port; }
public void setPingPort(int port) { this.pingPort = port; }
public void setPopulation(int population) { this.population = population; }
public void setPopulationStatus(int status) { this.popStatus = status; }
public void setStatus(GalaxyStatus status) { this.status = status; }
public void setTimeZone(int timeZone) { this.timeZone = timeZone; }
public void setMaxCharacters(int max) { this.maxCharacters = max; }
public void setOnlinePlayerLimit(int max) { this.onlinePlayerLimit = max; }
public void setOnlineFreeTrialLimit(int max) { this.onlineFreeTrialLimit = max; }
public void setRecommended(boolean r) { this.recommended = r; }
public synchronized int getPopulationStatus() {
if (population < VERY_LIGHT)
return 0;
else if(population < LIGHT)
return 1;
else if(population < MEDIUM)
return 2;
else if(population < HEAVY)
return 3;
else if(population < VERY_HEAVY)
return 4;
else if(population < EXTREMELY_HEAVY)
return 5;
return 6;
}
public synchronized void setId(int id) { this.id = id; }
public synchronized void setName(String name) { this.name = name; }
public synchronized void setAddress(String addr) { this.address = addr; }
public synchronized void setZonePort(int port) { this.zonePort = port; }
public synchronized void setPingPort(int port) { this.pingPort = port; }
public synchronized void setPopulation(int population) { this.population = population; }
public synchronized void setStatus(GalaxyStatus status) { this.status = status; }
public synchronized void setTimeZone(int timeZone) { this.timeZone = timeZone; }
public synchronized void setMaxCharacters(int max) { this.maxCharacters = max; }
public synchronized void setOnlinePlayerLimit(int max) { this.onlinePlayerLimit = max; }
public synchronized void setOnlineFreeTrialLimit(int max) { this.onlineFreeTrialLimit = max; }
public synchronized void setRecommended(boolean r) { this.recommended = r; }
public synchronized void incrementPopulationCount() { population++; }
public synchronized void decrementPopulationCount() { population--; }
public String toString() {
return String.format("Galaxy[ID=%d Name=%s Address=%s Zone=%d Ping=%d Pop=%d PopStat=%d Status=%s Time=%d Max=%d Rec=%b]",
id, name, address, zonePort, pingPort, population, popStatus, status, timeZone, maxCharacters, recommended);
id, name, address, zonePort, pingPort, population, getPopulationStatus(), status, timeZone, maxCharacters, recommended);
}
public void setStatus(int status) {
+73 -56
View File
@@ -33,12 +33,15 @@ import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -53,6 +56,10 @@ public class TCPServer {
private TCPCallback callback;
private TCPListener listener;
public TCPServer(int port, int bufferSize) {
this(null, port, bufferSize);
}
public TCPServer(InetAddress addr, int port, int bufferSize) {
this.sockets = new HashMap<>();
this.addr = addr;
@@ -141,41 +148,6 @@ public class TCPServer {
this.callback = callback;
}
private void accept() {
try {
SocketChannel sc = channel.accept();
if (sc == null)
return;
sc.configureBlocking(false);
sockets.put(sc.getRemoteAddress(), sc);
if (callback != null)
callback.onIncomingConnection(sc.socket());
} catch (IOException e) {
e.printStackTrace();
}
}
private void read(SocketChannel s) {
ByteBuffer data = ByteBuffer.allocate(bufferSize);
try {
int n = s.read(data);
if (n == -1) {
disconnect(s);
return;
}
if (n == 0)
return;
data.flip();
ByteBuffer smaller = ByteBuffer.allocate(n);
smaller.put(data.array(), 0, n);
if (callback != null)
callback.onIncomingData(s.socket(), smaller.array());
} catch (IOException e) {
e.printStackTrace();
disconnect(s);
}
}
public interface TCPCallback {
void onIncomingConnection(Socket s);
void onConnectionDisconnect(Socket s);
@@ -184,10 +156,12 @@ public class TCPServer {
private class TCPListener implements Runnable {
private final ByteBuffer buffer;
private Thread thread;
private boolean running;
public TCPListener() {
buffer = ByteBuffer.allocateDirect(bufferSize);
running = false;
thread = null;
}
@@ -206,42 +180,85 @@ public class TCPServer {
}
public void run() {
while (running) {
try (Selector selector = setupSelector()) {
if (selector.select() > 0)
processSelectionKeys(selector.selectedKeys());
} catch (IOException e) {
e.printStackTrace();
try (Selector selector = setupSelector()) {
while (running) {
try {
selector.select();
processSelectionKeys(selector);
} catch (Exception e) {
e.printStackTrace();
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private Selector setupSelector() throws IOException {
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_ACCEPT);
synchronized (sockets) {
for (SocketChannel sc : sockets.values()) {
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT);
}
}
return selector;
}
private void processSelectionKeys(Set<SelectionKey> keys) {
for (SelectionKey key : keys) {
private void processSelectionKeys(Selector selector) throws ClosedChannelException {
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> it = keys.iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
if (key.isAcceptable()) {
accept();
accept(selector);
} else if (key.isReadable()) {
SelectableChannel selectable = key.channel();
if (selectable instanceof SocketChannel)
read((SocketChannel) selectable);
} else if (key.isConnectable()) {
SelectableChannel selectable = key.channel();
if (!selectable.isOpen() && selectable instanceof SocketChannel) {
disconnect((SocketChannel) selectable);
}
read(key, (SocketChannel) selectable);
}
it.remove();
}
}
private void accept(Selector selector) {
try {
SocketChannel sc = channel.accept();
if (sc == null)
return;
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
sockets.put(sc.getRemoteAddress(), sc);
if (callback != null)
callback.onIncomingConnection(sc.socket());
} catch (IOException e) {
e.printStackTrace();
}
}
private void read(SelectionKey key, SocketChannel s) {
try {
buffer.position(0);
buffer.limit(bufferSize);
int n = s.read(buffer);
buffer.flip();
if (n < 0) {
key.cancel();
disconnect(s);
} else if (n > 0) {
ByteBuffer smaller = ByteBuffer.allocate(n);
smaller.put(buffer);
if (callback != null)
callback.onIncomingData(s.socket(), smaller.array());
}
} catch (IOException e) {
if (e.getMessage().toLowerCase(Locale.US).contains("connection reset"))
System.err.println("Connection Reset");
else
e.printStackTrace();
System.err.flush();
key.cancel();
disconnect(s);
}
}
}
+69 -63
View File
@@ -52,6 +52,7 @@ import resources.objects.creature.CreatureObject;
import resources.player.Player;
import resources.player.PlayerState;
import resources.server_info.Log;
import services.CoreManager;
import utilities.Encoder.StringType;
import java.io.IOException;
@@ -191,7 +192,7 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
// Get a pre-parent-removal list of the observers so we can send create/destroy/update messages
Set<SWGObject> oldObservers = getObservers();
oldObservers.add(this);
Player prevOwner = getOwner();
// Remove this object from the old parent if one exists
SWGObject oldParent = null;
@@ -204,8 +205,14 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
System.err.println("Failed adding " + this + " to " + container);
// Observer notification
Set<SWGObject> containerObservers = container.getObservers();
containerObservers.add(this);
Player newOwner = getOwner();
Set<SWGObject> containerObservers = getObservers();
if (prevOwner != newOwner) {
if (prevOwner != null)
oldObservers.add(prevOwner.getCreatureObject());
if (newOwner != null)
containerObservers.add(newOwner.getCreatureObject());
}
sendUpdatedContainment(oldObservers, containerObservers);
Log.i("Container", "Moved %s from %s to %s", this, oldParent, container);
@@ -318,15 +325,9 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
* Gets the object that occupies the specified slot
* @param slotName
* @return The {@link SWGObject} occupying the slot. Returns null if there is nothing in the slot or it doesn't exist.
* <p>If the slot doesn't exist, then an error is printed as well.</p>
*/
public SWGObject getSlottedObject(String slotName) {
if (hasSlot(slotName))
return slots.get(slotName);
else {
System.err.println(this + " does not contain " + slotName);
return null;
}
return slots.get(slotName);
}
/**
@@ -635,13 +636,17 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
}
public void clearAware() {
clearAware(true);
}
public void clearAware(boolean updateSelf) {
List<SWGObject> objects;
synchronized (objectsAware) {
objects = new ArrayList<>(objectsAware);
}
for (SWGObject o : objects) {
o.awarenessOutOfRange(this);
awarenessOutOfRange(o);
o.awarenessOutOfRange(this, updateSelf);
awarenessOutOfRange(o, true);
}
}
@@ -656,16 +661,16 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
}
private Set<SWGObject> getObservers(SWGObject childObject) {
return getObserversFromSet(objectsAware, childObject);
return getObserversFromSet(new HashSet<SWGObject>(), childObject);
}
private Set<SWGObject> getObserversFromSet(Set<SWGObject> aware, SWGObject childObject) {
Set<SWGObject> awareExtra;
synchronized (aware) {
synchronized (objectsAware) {
awareExtra = new HashSet<>(aware);
awareExtra.addAll(objectsAware);
}
awareExtra = new HashSet<>(aware);
}
synchronized (objectsAware) {
awareExtra.addAll(objectsAware);
}
if (getParent() == null) {
Set<SWGObject> observers = new HashSet<>();
@@ -759,72 +764,73 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
return;
Set<SWGObject> same = new HashSet<>(oldObservers);
same.retainAll(newObservers);
Set<SWGObject> added = new HashSet<>(newObservers);
added.removeAll(oldObservers);
Set<SWGObject> removed = new HashSet<>(oldObservers);
removed.removeAll(newObservers);
for (SWGObject swgObject : same) {
swgObject.sendSelf(new UpdateContainmentMessage(objectId, parent.getObjectId(), slotArrangement));
swgObject.getOwner().sendPacket(new UpdateContainmentMessage(objectId, parent.getObjectId(), slotArrangement));
}
for (SWGObject swgObject : added) {
if (swgObject.getOwner() != null) {
createObject(swgObject.getOwner());
}
createObject(swgObject.getOwner());
}
for (SWGObject swgObject : removed) {
if (swgObject.getOwner() != null) {
destroyObject(swgObject.getOwner());
}
destroyObject(swgObject.getOwner());
}
}
public void updateObjectAwareness(Set <SWGObject> withinRange) {
Set <SWGObject> outOfRange;
synchronized (objectsAware) {
Set<SWGObject> observers = getObserversFromSet(withinRange, this);
Set <SWGObject> outOfRange = new HashSet<>(objectsAware);
outOfRange.removeAll(withinRange);
outOfRange.removeAll(observers);
for (SWGObject o : outOfRange) {
awarenessOutOfRange(o);
o.awarenessOutOfRange(this);
}
for (SWGObject o : withinRange) {
awarenessInRange(o);
o.awarenessInRange(this);
}
for (SWGObject o : observers) {
awarenessInRange(o);
o.awarenessInRange(this);
}
outOfRange = new HashSet<>(objectsAware);
}
Set<SWGObject> observers = getObserversFromSet(withinRange, this);
outOfRange.removeAll(withinRange);
outOfRange.removeAll(observers);
for (SWGObject o : outOfRange) {
awarenessOutOfRange(o, true);
o.awarenessOutOfRange(this, true);
}
for (SWGObject o : withinRange) {
awarenessInRange(o, true);
o.awarenessInRange(this, true);
}
for (SWGObject o : observers) {
awarenessInRange(o, true);
o.awarenessInRange(this, true);
}
}
protected void awarenessOutOfRange(SWGObject o) {
protected void awarenessOutOfRange(SWGObject o, boolean sendDestroy) {
boolean success = false;
synchronized (objectsAware) {
if (objectsAware.remove(o)) {
Player owner = o.getOwner();
if (owner != null)
destroyObject(owner);
else
destroyObjectObservers(o);
}
success = objectsAware.remove(o);
}
if (success && sendDestroy) {
Player owner = o.getOwner();
if (owner != null)
destroyObject(owner);
else
destroyObjectObservers(o);
}
}
protected void awarenessInRange(SWGObject o) {
protected void awarenessInRange(SWGObject o, boolean sendCreate) {
boolean success = false;
synchronized (objectsAware) {
if (objectsAware.add(o)) {
Player owner = o.getOwner();
if (owner != null)
createObject(owner);
else
createObjectObservers(o);
}
success = objectsAware.add(o);
}
if (success && sendCreate) {
Player owner = o.getOwner();
if (owner != null)
createObject(owner);
else
createObjectObservers(o);
}
}
@@ -897,7 +903,7 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
// Now create the contained objects
for (SWGObject containedObject : containedObjects.values()) {
if (containedObject != null && !sentObjects.contains(containedObject)) {
if (containedObject instanceof CreatureObject && containedObject.hasSlot("ghost") && containedObject.getOwner() == null)
if (containedObject instanceof CreatureObject && ((CreatureObject) containedObject).isLoggedOutPlayer())
continue; // If it's a player, but that's logged out
containedObject.createObject(target);
}
@@ -956,7 +962,7 @@ public abstract class SWGObject implements Serializable, Comparable<SWGObject> {
}
public void createBaseline6(Player target, BaselineBuilder bb) {
bb.addInt(target.getGalaxyId()); // 0
bb.addInt(CoreManager.getGalaxyId()); // 0
bb.addObject(detailStringId); // 1
bb.incrementOperandCount(2);
@@ -101,6 +101,7 @@ public class CreatureObject extends TangibleObject {
private int battleFatigue = 0;
private long statesBitmask = 0;
private String currentCity = "";
private long lastTransform = 0;
private HologramColour hologramColour = HologramColour.DEFAULT;
private SWGList<Integer> baseAttributes = new SWGList<Integer>(BaselineType.CREO, 1, 2);
@@ -277,8 +278,24 @@ public class CreatureObject extends TangibleObject {
return currentCity;
}
public double getTimeSinceLastTransform() {
return (System.nanoTime()-lastTransform)/1E6;
}
public PlayerObject getPlayerObject() {
return (PlayerObject) (hasSlot("ghost") ? getSlottedObject("ghost") : null);
return (PlayerObject) getSlottedObject("ghost");
}
public boolean isPlayer() {
return getSlottedObject("ghost") != null;
}
public boolean isLoggedInPlayer() {
return getOwner() != null && isPlayer();
}
public boolean isLoggedOutPlayer() {
return getOwner() == null && isPlayer();
}
public void setPosture(Posture posture) {
@@ -442,6 +459,10 @@ public class CreatureObject extends TangibleObject {
this.currentCity = currentCity;
}
public void updateLastTransformTime() {
lastTransform = System.nanoTime();
}
public String getMoodAnimation() {
return moodAnimation;
}
+4 -4
View File
@@ -95,7 +95,7 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO?
groupMembers.sendDeltaMessage(this);
awarenessInRange(object);
awarenessInRange(object, true);
object.setGroupId(getObjectId());
if (object.getLevel() > level)
@@ -107,7 +107,7 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO?
groupMembers.remove(new GroupMember(object.getObjectId(), object.getName()));
object.setGroupId(0);
awarenessOutOfRange(object);
awarenessOutOfRange(object, true);
groupMembers.sendDeltaMessage(this);
}
@@ -115,8 +115,8 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO?
public void updateMember(CreatureObject object) {
if (groupMembers.contains(new GroupMember(object.getObjectId(), object.getName())))
awarenessInRange(object);
else awarenessOutOfRange(object);
awarenessInRange(object, true);
else awarenessOutOfRange(object, true);
}
public long getLeader() {
+4 -10
View File
@@ -34,7 +34,6 @@ import resources.control.Service;
import resources.objects.SWGObject;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import services.CoreManager;
import services.player.PlayerManager;
public class Player implements Serializable, Comparable<Player> {
@@ -52,7 +51,6 @@ public class Player implements Serializable, Comparable<Player> {
private int connectionId = 0;
private AccessLevel accessLevel = AccessLevel.PLAYER;
private int galaxyId = CoreManager.getGalaxyId();
private String galaxyName = "";
private CreatureObject creatureObject= null;
private long lastInboundMessage = 0;
@@ -102,10 +100,6 @@ public class Player implements Serializable, Comparable<Player> {
this.accessLevel = accessLevel;
}
public void setGalaxyId(int galaxyId) {
this.galaxyId = galaxyId;
}
public void setGalaxyName(String galaxyName) {
this.galaxyName = galaxyName;
}
@@ -152,10 +146,6 @@ public class Player implements Serializable, Comparable<Player> {
return accessLevel;
}
public int getGalaxyId() {
return galaxyId;
}
public String getGalaxyName() {
return galaxyName;
}
@@ -195,6 +185,10 @@ public class Player implements Serializable, Comparable<Player> {
@Override
public int compareTo(Player p) {
if (creatureObject == null)
return p.getCreatureObject() == null ? 0 : -1;
else if (p.getCreatureObject() == null)
return 1;
return creatureObject.compareTo(p.getCreatureObject());
}
+58 -12
View File
@@ -41,14 +41,16 @@ import resources.control.Service;
public class Log {
private static final DateFormat LOG_FORMAT = new SimpleDateFormat("dd-mm-yy HH:mm:ss.SSS");
private static final Log LOG = new Log("log.txt");
private static final Log LOG = new Log("log.txt", LogLevel.VERBOSE);
private final File file;
private BufferedWriter writer;
private LogLevel level;
private boolean open;
private Log(String filename) {
private Log(String filename, LogLevel level) {
this.file = new File(filename);
this.level = level;
open = false;
}
@@ -72,6 +74,14 @@ public class Log {
}
}
private synchronized void setLevel(LogLevel level) {
this.level = level;
}
private synchronized LogLevel getLevel() {
return level;
}
protected static final void start() {
try {
LOG.open();
@@ -88,15 +98,30 @@ public class Log {
}
}
/**
* Sets the minimum level for logs to be reported. This is according to the
* following order: VERBOSE, DEBUG, INFO, WARNING, ERROR, then ASSERT.
* @param level the minimum log level, inclusively. Default is VERBOSE
*/
public static final void setLogLevel(LogLevel level) {
synchronized (LOG) {
LOG.setLevel(level);
}
}
/**
* Logs the string to the server log file, formatted to display the log
* severity, time, tag and message.
* @param level the log level of this message between INFO and ASSERT
* @param level the log level of this message between VERBOSE and ASSERT
* @param tag the tag to use for the log
* @param str the format string for the log
* @param args the string format arguments, if specified
*/
public static final void log(LogLevel level, String tag, String str, Object ... args) {
synchronized (LOG) {
if (LOG.getLevel().compareTo(level) > 0)
return;
}
String date;
synchronized (LOG_FORMAT) {
date = LOG_FORMAT.format(System.currentTimeMillis());
@@ -114,26 +139,24 @@ public class Log {
/**
* Logs the string to the server log file, formatted to display the log
* severity as INFO, as well as the time, tag and message.
* @param level the log level of this message between INFO and ASSERT
* severity as VERBOSE, as well as the time, tag and message.
* @param tag the tag to use for the log
* @param message the format string for the log
* @param args the string format arguments, if specified
*/
public static final void i(String tag, String message, Object ... args) {
log(LogLevel.INFO, tag, message, args);
public static final void v(String tag, String message, Object ... args) {
log(LogLevel.VERBOSE, tag, message, args);
}
/**
* Logs the string to the server log file, formatted to display the log
* severity as INFO, as well as the time, service name and message.
* @param level the log level of this message between INFO and ASSERT
* severity as VERBOSE, as well as the time, service name and message.
* @param service the service outputting this log info
* @param message the format string for the log
* @param args the string format arguments, if specified
*/
public static final void i(Service service, String message, Object ... args) {
log(LogLevel.INFO, service.getClass().getSimpleName(), message, args);
public static final void v(Service service, String message, Object ... args) {
log(LogLevel.VERBOSE, service.getClass().getSimpleName(), message, args);
}
/**
@@ -158,6 +181,28 @@ public class Log {
log(LogLevel.DEBUG, service.getClass().getSimpleName(), message, args);
}
/**
* Logs the string to the server log file, formatted to display the log
* severity as INFO, as well as the time, tag and message.
* @param tag the tag to use for the log
* @param message the format string for the log
* @param args the string format arguments, if specified
*/
public static final void i(String tag, String message, Object ... args) {
log(LogLevel.INFO, tag, message, args);
}
/**
* Logs the string to the server log file, formatted to display the log
* severity as INFO, as well as the time, service name and message.
* @param service the service outputting this log info
* @param message the format string for the log
* @param args the string format arguments, if specified
*/
public static final void i(Service service, String message, Object ... args) {
log(LogLevel.INFO, service.getClass().getSimpleName(), message, args);
}
/**
* Logs the string to the server log file, formatted to display the log
* severity as WARN, as well as the time, tag and message.
@@ -225,8 +270,9 @@ public class Log {
}
public static enum LogLevel {
INFO ('I'),
VERBOSE ('V'),
DEBUG ('D'),
INFO ('I'),
WARN ('W'),
ERROR ('E'),
ASSERT ('A');
@@ -100,11 +100,12 @@ public class RelationalServerData extends RelationalDatabase {
}
}
final String sql = String.format("INSERT INTO %s (%s) VALUES (%s)", table, columnStr, valuesStr);
PreparedStatement statement = prepareStatement(sql);
if (statement == null || params.length < getSqlParameterCount(sql))
return false;
assignParameters(statement, params);
return statement.executeUpdate() > 0;
try (PreparedStatement statement = prepareStatement(sql)) {
if (statement == null || params.length < getSqlParameterCount(sql))
return false;
assignParameters(statement, params);
return statement.executeUpdate() > 0;
}
}
/**
+44 -79
View File
@@ -27,18 +27,10 @@
***********************************************************************************/
package services;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import intents.network.InboundPacketIntent;
import intents.network.OutboundPacketIntent;
import intents.server.ServerManagementIntent;
import intents.server.ServerStatusIntent;
@@ -49,39 +41,39 @@ import resources.control.Intent;
import resources.control.Manager;
import resources.control.ServerStatus;
import resources.server_info.Config;
import resources.server_info.Log;
import resources.server_info.Log.LogLevel;
import services.admin.OnlineInterfaceService;
import services.galaxy.GalacticManager;
import utilities.ThreadUtilities;
public class CoreManager extends Manager {
private static final int galaxyId = 1;
private static final Galaxy GALAXY = new Galaxy();
private static final int GALAXY_ID = 1;
private final ScheduledExecutorService shutdownService;
private OnlineInterfaceService onlineInterfaceService;
private EngineManager engineManager;
private GalacticManager galacticManager;
private PrintStream packetOutput;
private Galaxy galaxy;
private long startTime;
private boolean shutdownRequested;
private boolean packetDebug;
public CoreManager() {
Config c = getConfig(ConfigFile.PRIMARY);
Log.setLogLevel(LogLevel.valueOf(c.getString("LOG-LEVEL", LogLevel.DEBUG.name())));
setupGalaxy(c);
shutdownService = Executors.newSingleThreadScheduledExecutor(ThreadUtilities.newThreadFactory("core-shutdown-service"));
shutdownRequested = false;
galaxy = getGalaxy();
if (galaxy != null) {
onlineInterfaceService = new OnlineInterfaceService();
engineManager = new EngineManager(galaxy);
galacticManager = new GalacticManager(galaxy);
addChildService(onlineInterfaceService);
addChildService(engineManager);
addChildService(galacticManager);
}
registerForIntent(InboundPacketIntent.TYPE);
onlineInterfaceService = new OnlineInterfaceService();
engineManager = new EngineManager();
galacticManager = new GalacticManager();
addChildService(onlineInterfaceService);
addChildService(engineManager);
addChildService(galacticManager);
registerForIntent(OutboundPacketIntent.TYPE);
registerForIntent(ServerManagementIntent.TYPE);
}
@@ -101,14 +93,19 @@ public class CoreManager extends Manager {
@Override
public boolean initialize() {
startTime = System.nanoTime();
packetDebug = getConfig(ConfigFile.PRIMARY).getBoolean("PACKET-DEBUG", false);
initializePacketOutput();
return galaxy != null && super.initialize();
GALAXY.setStatus(GalaxyStatus.LOADING);
return super.initialize();
}
@Override
public boolean start() {
GALAXY.setStatus(GalaxyStatus.UP);
return super.start();
}
@Override
public boolean stop() {
galaxy.setStatus(GalaxyStatus.LOCKED);
GALAXY.setStatus(GalaxyStatus.LOCKED);
return super.stop();
}
@@ -120,22 +117,10 @@ public class CoreManager extends Manager {
@Override
public void onIntentReceived(Intent i) {
if (packetDebug) {
}
if (i instanceof ServerManagementIntent)
handleServerManagementIntent((ServerManagementIntent) i);
}
private void initializePacketOutput() {
try {
packetOutput = new PrintStream(new FileOutputStream("packets.txt", false), true, "UTF-8");
} catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
packetOutput = System.out;
}
}
private void handleServerManagementIntent(ServerManagementIntent i) {
switch(i.getEvent()) {
case SHUTDOWN: initiateShutdownSequence(i); break;
@@ -163,7 +148,7 @@ public class CoreManager extends Manager {
}
public GalaxyStatus getGalaxyStatus() {
return galaxy.getStatus();
return GALAXY.getStatus();
}
/**
@@ -174,47 +159,27 @@ public class CoreManager extends Manager {
return (System.nanoTime()-startTime)/1E6;
}
private Galaxy getGalaxy() {
PreparedStatement getGalaxy = getLocalDatabase().prepareStatement("SELECT * FROM galaxies WHERE id = ?");
Config c = getConfig(ConfigFile.PRIMARY);
ResultSet set = null;
try {
getGalaxy.setInt(1, galaxyId);
set = getGalaxy.executeQuery();
if (!set.next()) {
System.err.println("CoreManager: No such galaxy exists with ID " + galaxyId + "!");
return null;
}
Galaxy g = new Galaxy();
g.setId(set.getInt("id"));
g.setName(set.getString("name"));
g.setAddress(set.getString("address"));
g.setPopulation(set.getInt("population"));
g.setTimeZone(set.getInt("timezone"));
g.setZonePort(set.getInt("zone_port"));
g.setPingPort(set.getInt("ping_port"));
g.setStatus(set.getInt("status"));
g.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2));
g.setOnlinePlayerLimit(c.getInt("GALAXY-MAX-ONLINE", 3000));
g.setOnlineFreeTrialLimit(c.getInt("GALAXY-MAX-ONLINE", 3000));
g.setRecommended(true);
return g;
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (set != null) {
try {
set.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
public static Galaxy getGalaxy() {
return GALAXY;
}
public static final int getGalaxyId() {
return galaxyId;
public static int getGalaxyId() {
return GALAXY_ID;
}
private static void setupGalaxy(Config c) {
GALAXY.setId(GALAXY_ID);
GALAXY.setName(c.getString("GALAXY-NAME", "Holocore"));
GALAXY.setAddress("");
GALAXY.setPopulation(0);
GALAXY.setTimeZone(c.getInt("GALAXY-TIMEZONE", -6));
GALAXY.setZonePort(0);
GALAXY.setPingPort(0);
GALAXY.setStatus(GalaxyStatus.DOWN);
GALAXY.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2));
GALAXY.setOnlinePlayerLimit(c.getInt("GALAXY-MAX-ONLINE", 3000));
GALAXY.setOnlineFreeTrialLimit(c.getInt("GALAXY-MAX-ONLINE", 3000));
GALAXY.setRecommended(true);
}
}
+2 -3
View File
@@ -30,7 +30,6 @@ package services;
import java.io.File;
import java.io.IOException;
import resources.Galaxy;
import resources.client_info.ServerFactory;
import resources.config.ConfigFile;
import resources.control.Manager;
@@ -43,8 +42,8 @@ public class EngineManager extends Manager {
private ShutdownService shutdownService;
private NetworkManager networkManager;
public EngineManager(Galaxy galaxy) {
networkManager = new NetworkManager(galaxy);
public EngineManager() {
networkManager = new NetworkManager();
shutdownService = new ShutdownService();
addChildService(networkManager);
+23 -7
View File
@@ -4,6 +4,7 @@ import intents.PlayerEventIntent;
import intents.chat.PersistentMessageIntent;
import intents.network.GalacticPacketIntent;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
@@ -28,19 +29,22 @@ import resources.server_info.CachedObjectDatabase;
import resources.server_info.ObjectDatabase;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
import services.CoreManager;
import services.chat.ChatManager.ChatRange;
import services.chat.ChatManager.ChatType;
import services.player.PlayerManager;
public class ChatMailService extends Service {
private final ObjectDatabase<Mail> mails;
private final RelationalServerData chatLogs;
private final PreparedStatement insertChatLog;
private int maxMailId;
public ChatMailService() {
mails = new CachedObjectDatabase<>("odb/mails.db");
chatLogs = RelationalServerFactory.getServerDatabase("chat/chat_log.db");
insertChatLog = chatLogs.prepareStatement("INSERT INTO chat_log VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
maxMailId = 1;
registerForIntent(GalacticPacketIntent.TYPE);
@@ -89,7 +93,7 @@ public class ChatMailService extends Service {
switch (intent.getEvent()) {
case PE_FIRST_ZONE:
sendPersistentMessageHeaders(player, intent.getGalaxy());
sendPersistentMessageHeaders(player);
break;
default:
break;
@@ -104,7 +108,7 @@ public class ChatMailService extends Service {
if (!(p instanceof SWGPacket))
return;
SWGPacket swg = (SWGPacket) p;
String galaxyName = intent.getGalaxy().getName();
String galaxyName = CoreManager.getGalaxy().getName();
switch (swg.getPacketType()) {
/* Mails */
case CHAT_PERSISTENT_MESSAGE_TO_SERVER:
@@ -144,7 +148,7 @@ public class ChatMailService extends Service {
if (result != ChatResult.SUCCESS)
return;
Mail mail = new Mail(sender.getCharacterName().split(" ")[0].toLowerCase(), request.getSubject(), request.getMessage(), recId);
Mail mail = new Mail(sender.getCharacterName().split(" ")[0].toLowerCase(Locale.US), request.getSubject(), request.getMessage(), recId);
mail.setId(maxMailId++);
mail.setTimestamp((int) (new Date().getTime() / 1000));
mail.setOutOfBandPackage(request.getOutOfBandPackage());
@@ -190,7 +194,7 @@ public class ChatMailService extends Service {
sendPersistentMessage(player, mail, MailFlagType.FULL_MESSAGE, galaxy);
}
private void sendPersistentMessageHeaders(Player player, String galaxy) {
private void sendPersistentMessageHeaders(Player player) {
if (player == null || player.getCreatureObject() == null)
return;
@@ -202,6 +206,7 @@ public class ChatMailService extends Service {
playersMail.add(element);
});
String galaxy = CoreManager.getGalaxy().getName();
for (Mail mail : playersMail)
sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy);
}
@@ -236,8 +241,19 @@ public class ChatMailService extends Service {
private void logChat(long sendId, String sendName, long recvId, String recvName, String subject, String message) {
try {
long time = System.currentTimeMillis();
chatLogs.insert("chat_log", null, time, sendId, sendName, recvId, recvName, ChatType.MAIL.name(), ChatRange.PERSONAL.name(), "", subject, message);
synchronized (insertChatLog) {
insertChatLog.setLong(1, System.currentTimeMillis());
insertChatLog.setLong(2, sendId);
insertChatLog.setString(3, sendName);
insertChatLog.setLong(4, recvId);
insertChatLog.setString(5, recvName);
insertChatLog.setString(6, ChatType.MAIL.name());
insertChatLog.setString(7, ChatRange.PERSONAL.name());
insertChatLog.setString(8, "");
insertChatLog.setString(9, subject);
insertChatLog.setString(10, message);
insertChatLog.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
+18 -5
View File
@@ -41,7 +41,6 @@ import network.packets.swg.SWGPacket;
import network.packets.swg.zone.chat.*;
import network.packets.swg.zone.chat.ChatSystemMessage.SystemChatType;
import network.packets.swg.zone.object_controller.SpatialChat;
import resources.Galaxy;
import resources.Terrain;
import resources.chat.ChatAvatar;
import resources.chat.ChatResult;
@@ -58,6 +57,7 @@ import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
import services.player.PlayerManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Locale;
@@ -66,11 +66,13 @@ public class ChatManager extends Manager {
private final ChatRoomService roomService;
private final ChatMailService mailService;
private final RelationalServerData chatLogs;
private final PreparedStatement insertChatLog;
public ChatManager(Galaxy g) {
roomService = new ChatRoomService(g);
public ChatManager() {
roomService = new ChatRoomService();
mailService = new ChatMailService();
chatLogs = RelationalServerFactory.getServerDatabase("chat/chat_log.db");
insertChatLog = chatLogs.prepareStatement("INSERT INTO chat_log VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
addChildService(roomService);
addChildService(mailService);
@@ -451,8 +453,19 @@ public class ChatManager extends Manager {
if (message == null)
return;
try {
long time = System.currentTimeMillis();
chatLogs.insert("chat_log", null, time, sendId, sendName, recvId, recvName, type, range, room, subject, message);
synchronized (insertChatLog) {
insertChatLog.setLong(1, System.currentTimeMillis());
insertChatLog.setLong(2, sendId);
insertChatLog.setString(3, sendName);
insertChatLog.setLong(4, recvId);
insertChatLog.setString(5, recvName);
insertChatLog.setString(6, type);
insertChatLog.setString(7, range);
insertChatLog.setString(8, room);
insertChatLog.setString(9, subject);
insertChatLog.setString(10, message);
insertChatLog.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
+24 -10
View File
@@ -62,7 +62,6 @@ import network.packets.swg.zone.chat.ChatSendToRoom;
import network.packets.swg.zone.chat.ChatUnbanAvatarFromRoom;
import network.packets.swg.zone.chat.ChatUninviteFromRoom;
import network.packets.swg.zone.insertion.ChatRoomList;
import resources.Galaxy;
import resources.Terrain;
import resources.chat.ChatAvatar;
import resources.chat.ChatResult;
@@ -78,10 +77,12 @@ import resources.server_info.CachedObjectDatabase;
import resources.server_info.ObjectDatabase;
import resources.server_info.RelationalServerData;
import resources.server_info.RelationalServerFactory;
import services.CoreManager;
import services.chat.ChatManager.ChatRange;
import services.chat.ChatManager.ChatType;
import services.player.PlayerManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -98,15 +99,15 @@ public class ChatRoomService extends Service {
private final ObjectDatabase<ChatRoom> database;
private final Map<Integer, ChatRoom> roomMap;
private final RelationalServerData chatLogs;
private final Galaxy galaxy;
private final PreparedStatement insertChatLog;
private int maxChatRoomId;
public ChatRoomService(Galaxy g) {
galaxy = g;
public ChatRoomService() {
database = new CachedObjectDatabase<>("odb/chat_rooms.db");
roomMap = new ConcurrentHashMap<>();
messages = new ConcurrentHashMap<>();
chatLogs = RelationalServerFactory.getServerDatabase("chat/chat_log.db");
insertChatLog = chatLogs.prepareStatement("INSERT INTO chat_log VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
maxChatRoomId = 1;
registerForIntent(ChatRoomUpdateIntent.TYPE);
@@ -123,7 +124,7 @@ public class ChatRoomService extends Service {
roomMap.put(room.getId(), room);
});
createSystemChannels(galaxy.getName());
createSystemChannels(CoreManager.getGalaxy().getName());
return super.initialize();
}
@@ -131,10 +132,12 @@ public class ChatRoomService extends Service {
public void onIntentReceived(Intent i) {
switch(i.getType()) {
case ChatRoomUpdateIntent.TYPE:
processChatRoomUpdateIntent((ChatRoomUpdateIntent) i);
if (i instanceof ChatRoomUpdateIntent)
processChatRoomUpdateIntent((ChatRoomUpdateIntent) i);
break;
case GalacticPacketIntent.TYPE:
processPacket((GalacticPacketIntent) i);
if (i instanceof GalacticPacketIntent)
processPacket((GalacticPacketIntent) i);
break;
case PlayerEventIntent.TYPE:
if (i instanceof PlayerEventIntent)
@@ -704,7 +707,7 @@ public class ChatRoomService extends Service {
return getRoom(path);
// All paths should have parents, lets validate to make sure they exist first. Create them if they don't.
int lastIndex = path.lastIndexOf(".");
int lastIndex = path.lastIndexOf('.');
if (lastIndex != -1) {
String parentPath = path.substring(0, lastIndex);
if (getRoom(parentPath) == null) {
@@ -835,8 +838,19 @@ public class ChatRoomService extends Service {
private void logChat(long sendId, String sendName, String room, String message) {
try {
long time = System.currentTimeMillis();
chatLogs.insert("chat_log", null, time, sendId, sendName, 0, "", ChatType.CHAT.name(), ChatRange.ROOM.name(), room, "", message);
synchronized (insertChatLog) {
insertChatLog.setLong(1, System.currentTimeMillis());
insertChatLog.setLong(2, sendId);
insertChatLog.setString(3, sendName);
insertChatLog.setLong(4, 0);
insertChatLog.setString(5, "");
insertChatLog.setString(6, ChatType.CHAT.name());
insertChatLog.setString(7, ChatRange.ROOM.name());
insertChatLog.setString(8, room);
insertChatLog.setString(9, "");
insertChatLog.setString(10, message);
insertChatLog.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
+9 -37
View File
@@ -33,8 +33,6 @@ import intents.network.ForceDisconnectIntent;
import intents.network.GalacticPacketIntent;
import intents.player.ZonePlayerSwapIntent;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
@@ -43,7 +41,6 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import main.ProjectSWG;
import network.packets.swg.zone.HeartBeat;
import resources.control.Intent;
import resources.control.Service;
@@ -55,23 +52,19 @@ import resources.player.PlayerEvent;
import resources.player.PlayerFlags;
import resources.player.PlayerState;
import resources.server_info.Log;
import services.CoreManager;
import utilities.DebugUtilities;
import utilities.ThreadUtilities;
public class ConnectionService extends Service {
private static final double DISAPPEAR_THRESHOLD = TimeUnit.MINUTES.toMillis(3); // Time after the LD
private static final String INCREMENT_POPULATION_SQL = "UPDATE galaxies SET population = population + 1 WHERE id = ?";
private static final String DECREMENT_POPULATION_SQL = "UPDATE galaxies SET population = population - 1 WHERE id = ?";
private final ScheduledExecutorService updateService;
private final Runnable disappearRunnable;
private final Set <DisappearPlayer> disappearPlayers;
private final Set <Player> zonedInPlayers;
private PreparedStatement incrementPopulation;
private PreparedStatement decrementPopulation;
public ConnectionService() {
updateService = Executors.newSingleThreadScheduledExecutor(ThreadUtilities.newThreadFactory("conn-update-service"));
zonedInPlayers = new LinkedHashSet<Player>();
@@ -98,13 +91,6 @@ public class ConnectionService extends Service {
registerForIntent(ZonePlayerSwapIntent.TYPE);
}
@Override
public boolean initialize() {
incrementPopulation = getLocalDatabase().prepareStatement(INCREMENT_POPULATION_SQL);
decrementPopulation = getLocalDatabase().prepareStatement(DECREMENT_POPULATION_SQL);
return super.initialize();
}
@Override
public boolean start() {
return super.start();
@@ -138,15 +124,8 @@ public class ConnectionService extends Service {
switch (pei.getEvent()) {
case PE_FIRST_ZONE: {
Player p = pei.getPlayer();
try {
synchronized (incrementPopulation) {
incrementPopulation.setInt(1, ProjectSWG.getGalaxyId());
incrementPopulation.executeUpdate();
}
} catch (SQLException e) {
Log.e("ConnectionService", "SQLException occured when trying to increase population value.");
e.printStackTrace();
}
CoreManager.getGalaxy().incrementPopulationCount();
removeFromLists(p);
synchronized (zonedInPlayers) {
zonedInPlayers.add(p);
}
@@ -156,15 +135,7 @@ public class ConnectionService extends Service {
clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD);
break;
case PE_LOGGED_OUT:
try {
synchronized (decrementPopulation) {
decrementPopulation.setInt(1, ProjectSWG.getGalaxyId());
decrementPopulation.executeUpdate();
}
} catch (SQLException e) {
Log.e("ConnectionService", "SQLException occured when trying to decrease population value.");
e.printStackTrace();
}
CoreManager.getGalaxy().decrementPopulationCount();
setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD);
logOut(pei.getPlayer(), true);
break;
@@ -174,9 +145,10 @@ public class ConnectionService extends Service {
}
private void onGalacticPacketIntent(GalacticPacketIntent gpi) {
if (gpi.getPacket() instanceof HeartBeat) {
Player p = gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId());
if (p != null)
Player p = gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId());
if (p != null) {
p.updateLastPacketTimestamp();
if (gpi.getPacket() instanceof HeartBeat)
p.sendPacket(gpi.getPacket());
}
}
@@ -195,7 +167,7 @@ public class ConnectionService extends Service {
removeFromLists(before);
updatePlayTime(before);
Log.i("ConnectionService", "Logged out %s with character %s", before.getUsername(), before.getCharacterName());
new PlayerEventIntent(before, before.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast();
new PlayerEventIntent(before, PlayerEvent.PE_LOGGED_OUT).broadcast();
Log.i("ConnectionService", "Disconnected %s with character %s and reason: %s", before.getUsername(), before.getCharacterName(), DisconnectReason.NEW_CONNECTION_ATTEMPT);
new CloseConnectionIntent(before.getNetworkId(), DisconnectReason.NEW_CONNECTION_ATTEMPT).broadcast();
before.setPlayerState(PlayerState.DISCONNECTED);
+26 -57
View File
@@ -27,43 +27,36 @@
***********************************************************************************/
package services.galaxy;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Hashtable;
import java.util.Map;
import intents.GalacticIntent;
import intents.network.ConnectionClosedIntent;
import intents.network.ConnectionOpenedIntent;
import intents.network.GalacticPacketIntent;
import intents.network.InboundPacketIntent;
import resources.Galaxy;
import resources.control.Intent;
import resources.control.Manager;
import resources.server_info.DataManager;
import resources.server_info.Log;
import resources.server_info.RelationalDatabase;
import services.CoreManager;
import services.chat.ChatManager;
import services.objects.ObjectManager;
import services.player.PlayerManager;
public class GalacticManager extends Manager {
private final Object prevPacketIntentMutex = new Object();
private final static String resetPopulationSQL = "UPDATE galaxies SET population = 0 WHERE id = ?";
private ObjectManager objectManager;
private PlayerManager playerManager;
private GameManager gameManager;
private ChatManager chatManager;
private final ObjectManager objectManager;
private final PlayerManager playerManager;
private final GameManager gameManager;
private final ChatManager chatManager;
private final TravelService travelService;
private Intent prevPacketIntent;
private Galaxy galaxy;
private final Map<Long, Intent> prevIntentMap;
public GalacticManager(Galaxy g) {
this.galaxy = g;
public GalacticManager() {
objectManager = new ObjectManager();
playerManager = new PlayerManager();
gameManager = new GameManager();
chatManager = new ChatManager(g);
chatManager = new ChatManager();
travelService = new TravelService(objectManager);
prevPacketIntent = null;
prevIntentMap = new Hashtable<>();
addChildService(objectManager);
addChildService(playerManager);
@@ -72,6 +65,8 @@ public class GalacticManager extends Manager {
addChildService(travelService);
registerForIntent(InboundPacketIntent.TYPE);
registerForIntent(ConnectionOpenedIntent.TYPE);
registerForIntent(ConnectionClosedIntent.TYPE);
}
@Override
@@ -83,32 +78,17 @@ public class GalacticManager extends Manager {
@Override
public void onIntentReceived(Intent i) {
if (i instanceof InboundPacketIntent) {
synchronized (prevPacketIntentMutex) {
GalacticPacketIntent g = new GalacticPacketIntent((InboundPacketIntent) i);
if (prevPacketIntent == null)
broadcastGalacticIntent(g);
else
broadcastGalacticIntentAfterIntent(g, i);
prevPacketIntent = g;
long networkId = ((InboundPacketIntent) i).getNetworkId();
GalacticPacketIntent g = new GalacticPacketIntent((InboundPacketIntent) i);
g.setGalacticManager(this);
synchronized (prevIntentMap) {
g.broadcastAfterIntent(prevIntentMap.get(networkId));
prevIntentMap.put(networkId, g);
}
} else if (i instanceof ConnectionClosedIntent) {
synchronized (prevIntentMap) {
prevIntentMap.remove(((ConnectionClosedIntent) i).getNetworkId());
}
}
}
public void broadcastGalacticIntent(GalacticIntent i) {
synchronized (i) {
if (i.isBroadcasted())
return;
prepareGalacticIntent(i);
i.broadcast();
}
}
public void broadcastGalacticIntentAfterIntent(GalacticIntent g, Intent i) {
synchronized (g) {
if (g.isBroadcasted())
return;
prepareGalacticIntent(g);
g.broadcastAfterIntent(i);
}
}
@@ -120,19 +100,8 @@ public class GalacticManager extends Manager {
return playerManager;
}
private void prepareGalacticIntent(GalacticIntent i) {
i.setGalacticManager(this);
i.setGalaxy(galaxy);
}
private void resetPopulationCount() {
RelationalDatabase db = DataManager.getInstance().getLocalDatabase();
try(PreparedStatement resetPopulation = db.prepareStatement(GalacticManager.resetPopulationSQL)) {
resetPopulation.setInt(1, galaxy.getId());
resetPopulation.executeUpdate();
} catch (SQLException e) {
Log.e("ProjectSWG", "SQLException occured when trying to reset population value.");
e.printStackTrace();
}
CoreManager.getGalaxy().setPopulation(0);
}
}
+1 -1
View File
@@ -418,7 +418,7 @@ public class TravelService extends Service {
ticket.addAttribute("@obj_attr_n:travel_arrival_planet", "@planet_n:" + destination.getLocation().getTerrain().getName());
ticket.addAttribute("@obj_attr_n:travel_arrival_point", destination.getName());
receiver.getSlottedObject("inventory").addObject(ticket);
ticket.moveToContainer(receiver.getSlottedObject("inventory"));
}
private void handleTicketUse(TicketUseIntent i) {
+42 -69
View File
@@ -29,15 +29,12 @@ package services.network;
import intents.network.CloseConnectionIntent;
import intents.network.ConnectionClosedIntent;
import intents.network.ConnectionOpenedIntent;
import intents.network.OutboundPacketIntent;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedList;
@@ -57,7 +54,6 @@ import resources.control.Manager;
import resources.network.DisconnectReason;
import resources.network.TCPServer;
import resources.network.TCPServer.TCPCallback;
import resources.server_info.Config;
import resources.server_info.Log;
import utilities.ThreadUtilities;
@@ -65,29 +61,34 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
private final Map <InetSocketAddress, Long> sockets;
private final Map <Long, NetworkClient> clients;
private final Queue<ReceivedPacket> receivedPackets;
private final ExecutorService packetProcessor;
private final Runnable processPacketRunnable;
private final Queue<NetworkClient> processQueue;
private final ExecutorService clientProcessor;
private final Runnable processBufferRunnable;
private final AtomicLong networkIdCounter;
private final TCPServer tcpServer;
public NetworkClientManager() {
sockets = new HashMap<InetSocketAddress, Long>();
clients = new Hashtable<Long, NetworkClient>();
receivedPackets = new LinkedList<>();
processQueue = new LinkedList<>();
networkIdCounter = new AtomicLong(1);
packetProcessor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), ThreadUtilities.newThreadFactory("packet-processor-%d"));
processPacketRunnable = new Runnable() {
clientProcessor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), ThreadUtilities.newThreadFactory("packet-processor-%d"));
processBufferRunnable = new Runnable() {
public void run() {
synchronized (receivedPackets) {
ReceivedPacket recv = receivedPackets.poll();
if (recv == null)
return;
handlePacket(recv);
try {
NetworkClient client;
synchronized (processQueue) {
client = processQueue.poll();
if (client == null)
return;
}
client.process();
} catch (Exception e) {
e.printStackTrace();
}
}
};
tcpServer = new TCPServer(getBindAddr(), getBindPort(), getBufferSize());
tcpServer = new TCPServer(getBindPort(), getBufferSize());
registerForIntent(OutboundPacketIntent.TYPE);
registerForIntent(CloseConnectionIntent.TYPE);
@@ -113,10 +114,10 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
@Override
public boolean terminate() {
packetProcessor.shutdownNow();
clientProcessor.shutdownNow();
boolean success = true;
try {
success = packetProcessor.awaitTermination(5, TimeUnit.SECONDS);
success = clientProcessor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -140,7 +141,7 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
SocketAddress addr = s.getRemoteSocketAddress();
if (addr instanceof InetSocketAddress)
createSession(networkIdCounter.incrementAndGet(), (InetSocketAddress) addr);
else
else if (addr != null)
Log.e(this, "Incoming connection has socket address of instance: %s", addr.getClass().getSimpleName());
}
@@ -149,20 +150,17 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
SocketAddress addr = s.getRemoteSocketAddress();
if (addr instanceof InetSocketAddress)
onSessionDisconnect((InetSocketAddress) addr);
else
else if (addr != null)
Log.e(this, "Connection Disconnected. Has socket address of instance: %s", addr.getClass().getSimpleName());
}
@Override
public void onIncomingData(Socket s, byte [] data) {
synchronized (receivedPackets) {
SocketAddress addr = s.getRemoteSocketAddress();
if (addr instanceof InetSocketAddress)
receivedPackets.add(new ReceivedPacket((InetSocketAddress) addr, data));
else
Log.e(this, "Incoming data has socket address of instance: %s", addr.getClass().getSimpleName());
packetProcessor.submit(processPacketRunnable);
}
SocketAddress addr = s.getRemoteSocketAddress();
if (addr instanceof InetSocketAddress)
handleIncomingData((InetSocketAddress) addr, data);
else if (addr != null)
Log.e(this, "Incoming data has socket address of instance: %s", addr.getClass().getSimpleName());
}
@Override
@@ -170,31 +168,21 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
tcpServer.send(sock, data);
}
private InetAddress getBindAddr() {
Config c = getConfig(ConfigFile.NETWORK);
String ip = c.getString("BIND-ADDR", "::1");
try {
return InetAddress.getByName(ip);
} catch (UnknownHostException e) {
System.err.println("NetworkListenerService: Unknown host for IP: " + ip);
}
return null;
}
private int getBindPort() {
return getConfig(ConfigFile.NETWORK).getInt("BIND-PORT", 44463);
}
private int getBufferSize() {
return getConfig(ConfigFile.NETWORK).getInt("BUFFER-SIZE", 1024);
return getConfig(ConfigFile.NETWORK).getInt("BUFFER-SIZE", 4096);
}
private void createSession(long networkId, InetSocketAddress address) {
NetworkClient client = new NetworkClient(address, networkId, this);
synchronized (clients) {
sockets.put(address, networkId);
clients.put(networkId, new NetworkClient(address, networkId, this));
new ConnectionOpenedIntent(networkId).broadcast();
clients.put(networkId, client);
}
client.onConnected();
}
private void onSessionDisconnect(InetSocketAddress address) {
@@ -211,12 +199,11 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
private void deleteSession(long networkId) {
synchronized (clients) {
NetworkClient client = clients.get(networkId);
NetworkClient client = clients.remove(networkId);
if (client == null) {
System.err.println("No NetworkClient found for network id: " + networkId);
return;
}
clients.remove(networkId);
sockets.remove(client.getAddress());
}
}
@@ -231,36 +218,22 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet
}
}
private void handlePacket(ReceivedPacket packet) {
private void handleIncomingData(InetSocketAddress addr, byte [] data) {
synchronized (clients) {
Long netId = sockets.get(packet.getAddress());
Long netId = sockets.get(addr);
if (netId == null) {
Log.w(this, "Unknown socket address! Address: %s", packet.getAddress());
Log.w(this, "Unknown socket address! Address: %s", addr);
return;
}
NetworkClient client = clients.get(netId);
if (client != null)
client.process(packet.getData());
else
Log.w(this, "Unknown connection! Network ID: %d Address: %s", netId, packet.getAddress());
}
}
private static class ReceivedPacket {
private final InetSocketAddress address;
private final byte [] data;
public ReceivedPacket(InetSocketAddress address, byte [] data) {
this.address = address;
this.data = data;
}
public InetSocketAddress getAddress() {
return address;
}
public byte [] getData() {
return data;
if (client != null) {
client.addToBuffer(data);
synchronized (processQueue) {
processQueue.add(client);
}
clientProcessor.execute(processBufferRunnable);
} else
Log.w(this, "Unknown connection! Network ID: %d Address: %s", netId, addr);
}
}
+1 -2
View File
@@ -27,14 +27,13 @@
***********************************************************************************/
package services.network;
import resources.Galaxy;
import resources.control.Manager;
public class NetworkManager extends Manager {
private final NetworkClientManager netClientManager;
public NetworkManager(Galaxy galaxy) {
public NetworkManager() {
netClientManager = new NetworkClientManager();
addChildService(netClientManager);
+92 -65
View File
@@ -28,6 +28,7 @@
package services.objects;
import intents.PlayerEventIntent;
import intents.RequestZoneInIntent;
import intents.network.GalacticPacketIntent;
import intents.object.ObjectCreateIntent;
import intents.object.ObjectCreatedIntent;
@@ -40,14 +41,11 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import main.ProjectSWG;
import network.packets.Packet;
import network.packets.swg.zone.UpdateContainmentMessage;
import network.packets.swg.zone.insertion.CmdStartScene;
import network.packets.swg.zone.object_controller.DataTransform;
import network.packets.swg.zone.object_controller.DataTransformWithParent;
import resources.Location;
import resources.Race;
import resources.Terrain;
import resources.buildout.BuildoutArea;
import resources.control.Intent;
@@ -57,9 +55,7 @@ import resources.objects.creature.CreatureObject;
import resources.objects.quadtree.QuadTree;
import resources.objects.staticobject.StaticObject;
import resources.player.Player;
import resources.player.PlayerEvent;
import resources.server_info.Log;
import utilities.DebugUtilities;
public class ObjectAwareness extends Service {
@@ -112,23 +108,18 @@ public class ObjectAwareness extends Service {
if (creature == null)
return;
switch (pei.getEvent()) {
case PE_LOGGED_OUT:
creature.setOwner(null);
p.setCreatureObject(null);
break;
case PE_DISAPPEAR:
DebugUtilities.printPlayerCharacterDebug(this, (CreatureObject) creature, "Disappearing");
remove(creature);
for (SWGObject obj : creature.getObservers())
creature.destroyObject(obj.getOwner());
creature.clearAware();
creature.setOwner(null);
p.setCreatureObject(null);
break;
case PE_FIRST_ZONE:
DebugUtilities.printPlayerCharacterDebug(this, (CreatureObject) creature, "FirstZone");
if (creature.getParent() == null)
creature.createObject(p);
break;
case PE_ZONE_IN:
DebugUtilities.printPlayerCharacterDebug(this, (CreatureObject) creature, "Zone");
creature.clearAware();
creature.clearAware(false);
update(creature);
break;
default:
@@ -137,31 +128,33 @@ public class ObjectAwareness extends Service {
}
private void handleObjectCreateIntent(ObjectCreateIntent oci) {
SWGObject obj = oci.getObject();
if (isInAwareness(obj))
add(obj);
SWGObject object = oci.getObject();
if (isInAwareness(object)) {
add(object);
update(object);
}
}
private void handleObjectCreatedIntent(ObjectCreatedIntent oci) {
SWGObject obj = oci.getObject();
if (isInAwareness(obj))
add(obj);
SWGObject object = oci.getObject();
if (isInAwareness(object)) {
add(object);
update(object);
}
}
private void processObjectTeleportIntent(ObjectTeleportIntent oti) {
SWGObject object = oti.getObject();
Player owner = object.getOwner();
boolean creature = object instanceof CreatureObject && owner != null;
Location old = object.getLocation();
object.setLocation(oti.getNewLocation());
if (oti.getParent() != null) {
if (creature)
startScene((CreatureObject) object, oti.getNewLocation());
move(object, oti.getParent(), oti.getNewLocation());
move(object, oti.getParent(), oti.getNewLocation(), false);
} else {
if (creature)
startScene((CreatureObject) object, oti.getNewLocation());
object.createObject(owner);
move(object, oti.getNewLocation());
moveFromOld(object, old, false);
}
if (object instanceof CreatureObject && ((CreatureObject) object).isLoggedInPlayer())
new RequestZoneInIntent(owner, (CreatureObject) object, false).broadcast();
}
private void processGalacticPacketIntent(GalacticPacketIntent i) {
@@ -169,39 +162,41 @@ public class ObjectAwareness extends Service {
if (packet instanceof DataTransform) {
DataTransform trans = (DataTransform) packet;
SWGObject obj = i.getObjectManager().getObjectById(trans.getObjectId());
moveObject(obj, trans);
if (obj instanceof CreatureObject)
moveObject((CreatureObject) obj, trans);
} else if (packet instanceof DataTransformWithParent) {
DataTransformWithParent transformWithParent = (DataTransformWithParent) packet;
SWGObject object = i.getObjectManager().getObjectById(transformWithParent.getObjectId());
SWGObject parent = i.getObjectManager().getObjectById(transformWithParent.getCellId());
moveObject(object, parent, transformWithParent);
if (object instanceof CreatureObject)
moveObject((CreatureObject) object, parent, transformWithParent);
}
}
private void startScene(CreatureObject object, Location newLocation) {
long time = (long) (ProjectSWG.getCoreTime() / 1E3);
Race race = ((CreatureObject)object).getRace();
sendPacket(object.getOwner(), new CmdStartScene(false, object.getObjectId(), race, newLocation, time, (int)(System.currentTimeMillis()/1E3)));
new PlayerEventIntent(object.getOwner(), PlayerEvent.PE_ZONE_IN).broadcast();
}
private void moveObject(SWGObject obj, DataTransform transform) {
private void moveObject(CreatureObject obj, DataTransform transform) {
Location newLocation = transform.getLocation();
newLocation.setTerrain(obj.getTerrain());
double time = ((CreatureObject) obj).getTimeSinceLastTransform() / 1000;
obj.updateLastTransformTime();
Location l = obj.getWorldLocation();
double speed = Math.sqrt(square(l.getX()-newLocation.getX()) + square(l.getZ()-newLocation.getZ())) / time;
if (speed > obj.getMovementScale()*7.3) {
double angle = (newLocation.getX() == l.getX() ? 0 : Math.atan2(newLocation.getZ()-l.getZ(), newLocation.getX()-l.getX()));
newLocation.setX(l.getX()+obj.getMovementScale()*7.3*time*Math.cos(angle));
newLocation.setZ(l.getZ()+obj.getMovementScale()*7.3*time*Math.sin(angle));
transform.setSpeed((float) (obj.getMovementScale()*7.3));
}
BuildoutArea area = obj.getBuildoutArea();
if (area != null && area.isAdjustCoordinates())
newLocation.translatePosition(area.getX1(), 0, area.getZ1());
if (obj instanceof CreatureObject)
new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), null, obj.getLocation(), newLocation).broadcast();
move(obj, newLocation);
new PlayerTransformedIntent(obj, obj.getParent(), null, obj.getLocation(), newLocation).broadcast();
move(obj, newLocation, true);
if (area != null && area.isAdjustCoordinates())
newLocation.translatePosition(-area.getX1(), 0, -area.getZ1());
obj.sendDataTransforms(transform);
// TODO: State checks before sending a data transform message to ensure the move is valid
}
private void moveObject(SWGObject obj, SWGObject parent, DataTransformWithParent transformWithParent) {
private void moveObject(CreatureObject obj, SWGObject parent, DataTransformWithParent transformWithParent) {
Location newLocation = transformWithParent.getLocation();
newLocation.setTerrain(obj.getTerrain());
if (parent == null) {
@@ -209,9 +204,20 @@ public class ObjectAwareness extends Service {
Log.e("ObjectManager", "Could not find parent for transform! Cell: %d Object: %s", transformWithParent.getCellId(), obj);
return;
}
if (obj instanceof CreatureObject)
new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast();
move(obj, parent, newLocation);
double time = ((CreatureObject) obj).getTimeSinceLastTransform() / 1000;
obj.updateLastTransformTime();
Location l = obj.getWorldLocation();
Location nWorld = new Location(newLocation.getX(), 0, newLocation.getZ(), parent.getTerrain());
nWorld.translateLocation(parent.getWorldLocation());
double speed = Math.sqrt(square(l.getX()-nWorld.getX()) + square(l.getZ()-nWorld.getZ())) / time;
if (speed > obj.getMovementScale()*7.3) {
double angle = (nWorld.getX() == l.getX() ? 0 : Math.atan2(nWorld.getZ()-l.getZ(), nWorld.getX()-l.getX())) + Math.PI;
newLocation.setX(newLocation.getX()+obj.getMovementScale()*7.3*time*invertNormalizedValue(Math.cos(angle)));
newLocation.setZ(newLocation.getZ()+obj.getMovementScale()*7.3*time*invertNormalizedValue(Math.sin(angle)));
transformWithParent.setSpeed((float) (obj.getMovementScale()*7.3));
}
new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast();
move(obj, parent, newLocation, true);
obj.sendParentDataTransforms(transformWithParent);
}
@@ -225,14 +231,17 @@ public class ObjectAwareness extends Service {
return object.getParent() == null && !(object instanceof StaticObject);
}
private double invertNormalizedValue(double x) {
if (x < 0)
return -1 - x;
return 1-x;
}
/**
* Adds the specified object to the awareness quadtree
* @param object the object to add
*/
public void add(SWGObject object) {
if (object instanceof CreatureObject)
DebugUtilities.printPlayerCharacterDebug(this, (CreatureObject) object, "Adding");
update(object);
Location l = object.getLocation();
if (invalidLocation(l))
return;
@@ -247,15 +256,7 @@ public class ObjectAwareness extends Service {
* @param object the object to remove
*/
public void remove(SWGObject object) {
if (object instanceof CreatureObject)
DebugUtilities.printPlayerCharacterDebug(this, (CreatureObject) object, "Removing");
Location l = object.getLocation();
if (invalidLocation(l))
return;
QuadTree <SWGObject> tree = getTree(l);
synchronized (tree) {
tree.remove(l.getX(), l.getZ(), object);
}
removeFromLocation(object, object.getLocation());
}
/**
@@ -263,8 +264,9 @@ public class ObjectAwareness extends Service {
* includes moving from a cell to the world.
* @param object the object to move
* @param nLocation the new location
* @param update boolean on whether or not to update the object's awareness
*/
public void move(SWGObject object, Location nLocation) {
private void move(SWGObject object, Location nLocation, boolean update) {
if (object.getParent() != null) {
object.getParent().removeObject(object); // Moving from cell to world
object.sendObserversAndSelf(new UpdateContainmentMessage(object.getObjectId(), 0, object.getSlotArrangement()));
@@ -273,6 +275,8 @@ public class ObjectAwareness extends Service {
}
object.setLocation(nLocation);
add(object);
if (update)
update(object);
}
/**
@@ -282,8 +286,9 @@ public class ObjectAwareness extends Service {
* @param object the object to move
* @param nParent the new parent the object will be in
* @param nLocation the new location relative to the parent
* @param update boolean on whether or not to update the object's awareness
*/
public void move(SWGObject object, SWGObject nParent, Location nLocation) {
private void move(SWGObject object, SWGObject nParent, Location nLocation, boolean update) {
SWGObject parent = object.getParent();
if (parent != null && nParent != parent) {
parent.removeObject(object); // Moving from cell to cell, for instance
@@ -295,7 +300,8 @@ public class ObjectAwareness extends Service {
object.sendObserversAndSelf(new UpdateContainmentMessage(object.getObjectId(), nParent.getObjectId(), object.getSlotArrangement()));
}
object.setLocation(nLocation);
update(object);
if (update)
update(object);
}
/**
@@ -303,7 +309,7 @@ public class ObjectAwareness extends Service {
* the awareness is up to date
* @param obj the object to update
*/
public void update(SWGObject obj) {
private void update(SWGObject obj) {
if (obj.isBuildout())
return;
Location l = obj.getWorldLocation();
@@ -321,6 +327,27 @@ public class ObjectAwareness extends Service {
obj.updateObjectAwareness(objectAware);
}
private void moveFromOld(SWGObject object, Location oldLocation, boolean update) {
if (object.getParent() != null) {
object.getParent().removeObject(object); // Moving from cell to world
object.sendObserversAndSelf(new UpdateContainmentMessage(object.getObjectId(), 0, object.getSlotArrangement()));
} else {
removeFromLocation(object, oldLocation); // World to World
}
add(object);
if (update)
update(object);
}
private void removeFromLocation(SWGObject object, Location l) {
if (invalidLocation(l))
return;
QuadTree <SWGObject> tree = getTree(l);
synchronized (tree) {
tree.remove(l.getX(), l.getZ(), object);
}
}
private QuadTree <SWGObject> getTree(Location l) {
return quadTree.get(l.getTerrain());
}
@@ -332,7 +359,7 @@ public class ObjectAwareness extends Service {
private boolean isValidInRange(SWGObject obj, SWGObject inRange, Location objLoc) {
if (inRange.getObjectId() == obj.getObjectId())
return false;
if (obj.hasSlot("ghost") && obj.getOwner() == null)
if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedOutPlayer())
return false;
int distSquared = distanceSquared(objLoc, inRange.getWorldLocation());
int loadSquared = (int) (square(inRange.getLoadRange()) + 0.5);
+2 -2
View File
@@ -57,7 +57,7 @@ public final class ObjectCreator {
return null;
if (!template.endsWith(".iff"))
return null;
SWGObject obj = createObjectFromType(objectId, getFirstTemplatePart(template.substring(7, template.length()-7-4)));
SWGObject obj = createObjectFromType(objectId, getFirstTemplatePart(template.substring(7, template.length())));
if (obj == null)
return null;
obj.setTemplate(template);
@@ -84,7 +84,7 @@ public final class ObjectCreator {
case "tangible": return new TangibleObject(objectId);
case "waypoint": return new WaypointObject(objectId);
case "weapon": return new WeaponObject(objectId);
default: return null;
default: System.err.println("Unknown type: " + type); return null;
}
}
+7 -16
View File
@@ -143,8 +143,8 @@ public class ObjectManager extends Manager {
private void loadObject(SWGObject obj) {
obj.setOwner(null);
// if player is not a player
if (!(obj instanceof CreatureObject && ((CreatureObject) obj).hasSlot("ghost")))
// if creature is not a player
if (!(obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedOutPlayer()))
objectAwareness.add(obj);
if (obj instanceof CreatureObject && ((CreatureObject) obj).getPlayerObject() != null) {
if (!obj.hasSlot("bank")) {
@@ -230,9 +230,8 @@ public class ObjectManager extends Manager {
Packet packet = gpi.getPacket();
if (packet instanceof SelectCharacter) {
PlayerManager pm = gpi.getPlayerManager();
String galaxy = gpi.getGalaxy().getName();
long characterId = ((SelectCharacter) packet).getCharacterId();
zoneInCharacter(pm, galaxy, gpi.getNetworkId(), characterId);
zoneInCharacter(pm, gpi.getNetworkId(), characterId);
}
}
@@ -250,7 +249,7 @@ public class ObjectManager extends Manager {
return null;
obj.clearAware();
objectAwareness.remove(obj);
Log.i("ObjectManager", "Deleted object %d [%s]", obj.getObjectId(), obj.getTemplate());
Log.v("ObjectManager", "Deleted object %d [%s]", obj.getObjectId(), obj.getTemplate());
return obj;
}
}
@@ -336,13 +335,13 @@ public class ObjectManager extends Manager {
if (addToDatabase) {
database.put(objectId, obj);
}
Log.i("ObjectManager", "Created object %d [%s]", obj.getObjectId(), obj.getTemplate());
Log.v("ObjectManager", "Created object %d [%s]", obj.getObjectId(), obj.getTemplate());
new ObjectCreatedIntent(obj).broadcast();
return obj;
}
}
private void zoneInCharacter(PlayerManager playerManager, String galaxy, long netId, long characterId) {
private void zoneInCharacter(PlayerManager playerManager, long netId, long characterId) {
Player player = playerManager.getPlayerFromNetworkId(netId);
if (player == null) {
Log.e("ObjectManager", "Unable to zone in null player '%d'", netId);
@@ -367,15 +366,7 @@ public class ObjectManager extends Manager {
sendClientFatal(player, "Failed to zone", "There has been an internal server error: Null Ghost.\nPlease delete your character and create a new one", 10, TimeUnit.SECONDS);
return;
}
if (creatureObj.getParent() != null) {
objectAwareness.update(creatureObj);
Log.d("ObjectManager", "Zoning in to %s/%s - %s", creatureObj.getParent(), creatureObj.getTerrain(), creatureObj.getLocation().getPosition());
}else {
objectAwareness.remove(creatureObj);
objectAwareness.add(creatureObj);
Log.d("ObjectManager", "Zoning in to %s - %s", creatureObj.getTerrain(), creatureObj.getLocation().getPosition());
}
new RequestZoneInIntent(player, (CreatureObject) creatureObj, galaxy).broadcast();
new RequestZoneInIntent(player, (CreatureObject) creatureObj, true).broadcast();
}
private void sendClientFatal(Player player, String title, String message, long timeToRead, TimeUnit time) {
@@ -75,7 +75,7 @@ import utilities.namegen.SWGNameGenerator;
public class CharacterCreationService extends Service {
private static final String CREATE_CHARACTER_SQL = "INSERT INTO characters (id, name, race, userId, galaxyId) VALUES (?, ?, ?, ?, ?)";
private static final String CREATE_CHARACTER_SQL = "INSERT INTO characters (id, name, race, userId) VALUES (?, ?, ?, ?)";
private static final String GET_CHARACTER_SQL = "SELECT * FROM characters WHERE name == ?";
private static final String GET_LIKE_CHARACTER_SQL = "SELECT name FROM characters WHERE name ilike ?"; // NOTE: ilike is not SQL standard. It is an extension for postgres only.
private static final String GET_CHARACTER_COUNT_SQL = "SELECT count(*) FROM characters WHERE userId = ?";
@@ -254,7 +254,6 @@ public class CharacterCreationService extends Service {
createCharacter.setString(2, name);
createCharacter.setString(3, player.getCreatureObject().getRace().getFilename());
createCharacter.setInt(4, player.getUserId());
createCharacter.setInt(5, player.getGalaxyId());
return createCharacter.executeUpdate() == 1;
} catch (SQLException e) {
e.printStackTrace();
+14 -77
View File
@@ -38,7 +38,6 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import main.ProjectSWG;
@@ -59,7 +58,6 @@ import network.packets.swg.login.OfflineServersMessage;
import network.packets.swg.login.StationIdHasJediSlot;
import resources.Galaxy;
import resources.Race;
import resources.Galaxy.GalaxyStatus;
import resources.common.BCrypt;
import resources.config.ConfigFile;
import resources.control.Intent;
@@ -72,22 +70,15 @@ import resources.player.PlayerState;
import resources.server_info.Config;
import resources.server_info.Log;
import resources.server_info.RelationalDatabase;
import services.CoreManager;
public class LoginService extends Service {
private static final String REQUIRED_VERSION = "20111130-15:46";
// Population status values. Values are in percent.
private static final double VERYLIGHT = 10;
private static final double LIGHT = 20;
private static final double MEDIUM = 30;
private static final double HEAVY = 40;
private static final double VERYHEAVY = 50;
private static final double EXTREMELYHEAVY = 100;
private Random random;
private PreparedStatement getUser;
private PreparedStatement getGalaxies;
private PreparedStatement getCharacter;
private PreparedStatement getCharacters;
private PreparedStatement deleteCharacter;
private boolean autoLogin;
@@ -103,10 +94,10 @@ public class LoginService extends Service {
public boolean initialize() {
RelationalDatabase local = getLocalDatabase();
getUser = local.prepareStatement("SELECT * FROM users WHERE LOWER(username) = LOWER(?)");
getGalaxies = local.prepareStatement("SELECT * FROM galaxies");
getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ? AND galaxyid = ?");
getCharacter = local.prepareStatement("SELECT * FROM characters WHERE LOWER(name) = LOWER(?)");
getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ?");
deleteCharacter = local.prepareStatement("DELETE FROM characters WHERE id = ?");
autoLogin = (getConfig(ConfigFile.NETWORK).getInt("AUTO-LOGIN", 0) == 1 ? true : false);
autoLogin = getConfig(ConfigFile.NETWORK).getInt("AUTO-LOGIN", 0) == 1;
return super.initialize();
}
@@ -299,62 +290,29 @@ public class LoginService extends Service {
}
public ResultSet getCharacter(String character) throws SQLException {
PreparedStatement statement = getLocalDatabase().prepareStatement("SELECT * FROM characters WHERE lower(name) = ?");
statement.setString(1, character.toLowerCase(Locale.ENGLISH));
return statement.executeQuery();
synchronized (getCharacter) {
getCharacter.setString(1, character);
return getCharacter.executeQuery();
}
}
private List <Galaxy> getGalaxies(Player p) throws SQLException {
Config c = getConfig(ConfigFile.PRIMARY);
ResultSet set = getGalaxies.executeQuery();
List <Galaxy> galaxies = new ArrayList<Galaxy>();
int maxPopulation = c.getInt("GALAXY-MAX-ONLINE", 3000);
double consumed;
int population;
try {
while (set.next()) {
Galaxy g = new Galaxy();
population = set.getInt("population");
consumed = ((double) population / maxPopulation) * 100;
g.setId(set.getInt("id"));
g.setName(set.getString("name"));
g.setAddress(set.getString("address"));
g.setPopulation(population);
g.setTimeZone(set.getInt("timezone") * 3600);
g.setZonePort(set.getInt("zone_port"));
g.setPingPort(set.getInt("ping_port"));
g.setStatus(set.getInt("status"));
g.setMaxCharacters(c.getInt("GALAXY-MAX-CHARACTERS", 2));
g.setOnlinePlayerLimit(maxPopulation);
g.setOnlineFreeTrialLimit(maxPopulation);
g.setRecommended(true);
g.setPopulationStatus(populationStatus(consumed));
// If locked, restricted, or full
if (p.getAccessLevel().getValue() >= AccessLevel.CSR.getValue() && g.getStatus() != GalaxyStatus.UP)
g.setStatus(GalaxyStatus.UP);
galaxies.add(g);
}
set.close();
return galaxies;
} finally {
set.close();
}
List<Galaxy> galaxies = new ArrayList<>();
galaxies.add(CoreManager.getGalaxy());
return galaxies;
}
private SWGCharacter [] getCharacters(int userId) throws SQLException {
getCharacters.setInt(1, userId);
getCharacters.setInt(2, ProjectSWG.getGalaxyId());
ResultSet set = getCharacters.executeQuery();
List <SWGCharacter> characters = new ArrayList<SWGCharacter>();
List <SWGCharacter> characters = new ArrayList<>();
try {
while (set.next()) {
SWGCharacter c = new SWGCharacter();
c.setId(set.getInt("id"));
c.setName(set.getString("name"));
c.setGalaxyId(CoreManager.getGalaxyId());
c.setRaceCrc(Race.getRaceByFile(set.getString("race")).getCrc());
c.setGalaxyId(set.getInt("galaxyid"));
c.setType(1); // 1 = Normal (2 = Jedi, 3 = Spectral)
characters.add(c);
}
@@ -376,25 +334,4 @@ public class LoginService extends Service {
}
}
private int populationStatus(final double consumed) {
final int popStatus;
if(consumed < VERYLIGHT)
popStatus = 0;
else if(consumed < LIGHT)
popStatus = 1;
else if(consumed < MEDIUM)
popStatus = 2;
else if(consumed < HEAVY)
popStatus = 3;
else if(consumed < VERYHEAVY)
popStatus = 4;
else if(consumed < EXTREMELYHEAVY)
popStatus = 5;
else
popStatus = 6;
return popStatus;
}
}
+2 -12
View File
@@ -40,7 +40,6 @@ import intents.PlayerEventIntent;
import intents.network.ConnectionClosedIntent;
import intents.network.ConnectionOpenedIntent;
import intents.network.GalacticPacketIntent;
import intents.network.InboundPacketIntent;
import resources.Terrain;
import resources.control.Intent;
import resources.control.Manager;
@@ -63,7 +62,6 @@ public class PlayerManager extends Manager {
addChildService(loginService);
addChildService(zoneService);
registerForIntent(InboundPacketIntent.TYPE);
registerForIntent(GalacticPacketIntent.TYPE);
registerForIntent(PlayerEventIntent.TYPE);
registerForIntent(NotifyPlayersPacketIntent.TYPE);
@@ -78,9 +76,7 @@ public class PlayerManager extends Manager {
@Override
public void onIntentReceived(Intent i) {
if (i instanceof InboundPacketIntent)
onInboundPacketIntent((InboundPacketIntent) i);
else if (i instanceof PlayerEventIntent)
if (i instanceof PlayerEventIntent)
onPlayerEventIntent((PlayerEventIntent) i);
else if (i instanceof NotifyPlayersPacketIntent)
onNotifyPlayersPacketIntent((NotifyPlayersPacketIntent) i);
@@ -251,12 +247,6 @@ public class PlayerManager extends Manager {
}
}
private void onInboundPacketIntent(InboundPacketIntent ipi) {
Player player = getPlayerFromNetworkId(ipi.getNetworkId());
if (player != null)
player.updateLastPacketTimestamp();
}
private void onNotifyPlayersPacketIntent(NotifyPlayersPacketIntent nppi) {
if (nppi.getNetworkIds() != null) {
if (nppi.getTerrain() != null) notifyPlayersAtPlanet(nppi.getNetworkIds(), nppi.getCondition(), nppi.getTerrain(), nppi.getPacket());
@@ -279,7 +269,7 @@ public class PlayerManager extends Manager {
private void onConnectionClosedIntent(ConnectionClosedIntent cci) {
Player p;
synchronized (players) {
p = players.get(cci.getNetworkId());
p = players.remove(cci.getNetworkId());
}
if (p != null) {
p.setPlayerState(PlayerState.DISCONNECTED);
+28 -12
View File
@@ -62,6 +62,7 @@ import resources.Race;
import resources.config.ConfigFile;
import resources.control.Intent;
import resources.control.Manager;
import resources.objects.SWGObject;
import resources.objects.creature.CreatureMood;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
@@ -102,7 +103,7 @@ public class ZoneManager extends Manager {
public void onIntentReceived(Intent i) {
if (i instanceof RequestZoneInIntent) {
RequestZoneInIntent zii = (RequestZoneInIntent) i;
zoneInPlayer(zii.getPlayer(), zii.getCreature(), zii.getGalaxy());
zoneInPlayer(zii.getPlayer(), zii.getCreature(), zii.isFirstZone());
} else if (i instanceof GalacticPacketIntent) {
GalacticPacketIntent gpi = (GalacticPacketIntent) i;
handlePacket(gpi, gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()), gpi.getNetworkId(), gpi.getPacket());
@@ -129,20 +130,40 @@ public class ZoneManager extends Manager {
return characterCreationService.characterExistsForName(name);
}
private void zoneInPlayer(Player player, CreatureObject creature, String galaxy) {
private void zoneInPlayer(Player player, CreatureObject creature, boolean firstZone) {
PlayerObject playerObj = creature.getPlayerObject();
player.setPlayerState(PlayerState.ZONING_IN);
player.setCreatureObject(creature);
creature.setOwner(player);
sendZonePackets(player, creature);
if (firstZone)
sendZonePackets(player, creature);
startScene(creature, creature.getLocation());
if (firstZone)
playerObj.setStartPlayTime((int) System.currentTimeMillis());
initPlayerBeforeZoneIn(player, creature, playerObj);
System.out.printf("[%s] %s is zoning in%n", player.getUsername(), player.getCharacterName());
Log.i("ObjectManager", "Zoning in %s with character %s", player.getUsername(), player.getCharacterName());
new PlayerEventIntent(player, galaxy, PlayerEvent.PE_FIRST_ZONE).broadcast();
new PlayerEventIntent(player, galaxy, PlayerEvent.PE_ZONE_IN).broadcast();
sendCommitHistory(player);
sendMessageOfTheDay(player);
if (firstZone) {
new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast();
sendCommitHistory(player);
sendMessageOfTheDay(player);
}
new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN).broadcast();
}
private void startScene(CreatureObject object, Location newLocation) {
long time = (long) (ProjectSWG.getCoreTime() / 1E3);
Race race = ((CreatureObject)object).getRace();
sendPacket(object.getOwner(), new CmdStartScene(false, object.getObjectId(), race, newLocation, time, (int)(System.currentTimeMillis()/1E3)));
recursiveCreateObject(object, object.getOwner());
}
private void recursiveCreateObject(SWGObject obj, Player p) {
SWGObject parent = obj.getParent();
if (parent != null)
recursiveCreateObject(parent, p);
obj.createObject(p);
}
private void loadCommitHistory() {
@@ -185,19 +206,14 @@ public class ZoneManager extends Manager {
}
private void sendZonePackets(Player player, CreatureObject creature) {
long objId = creature.getObjectId();
Race race = creature.getRace();
Location l = creature.getLocation();
sendPacket(player, new HeartBeat());
sendPacket(player, new ChatServerStatus(true));
sendPacket(player, new VoiceChatStatus());
sendPacket(player, new ParametersMessage());
sendPacket(player, new ChatOnConnectAvatar());
sendPacket(player, new CmdStartScene(false, objId, race, l, ProjectSWG.getGalacticTime(), (int)(System.currentTimeMillis()/1E3)));
}
private void initPlayerBeforeZoneIn(Player player, CreatureObject creatureObj, PlayerObject playerObj) {
playerObj.setStartPlayTime((int) System.currentTimeMillis());
creatureObj.setMoodId(CreatureMood.NONE.getMood());
playerObj.clearFlagBitmask(PlayerFlags.LD); // Ziggy: Clear the LD flag in case it wasn't already.
}