mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-16 06:12:52 -04:00
Merged projectswg/holocore into quality_assurance
This commit is contained in:
Binary file not shown.
@@ -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,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
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user