diff --git a/accesslevels/cs.txt b/accesslevels/cs.txt new file mode 100644 index 00000000..dfa80f53 --- /dev/null +++ b/accesslevels/cs.txt @@ -0,0 +1,95 @@ +goto +findobject +teleport +teleportto +invulnerable +kill +setspeed +planetwarp +harmfull +harmless +object +searchcorpse +giveitem +sethue +editbank +editbankaccount +editappearance +editstats +snoop +wipeitems +findplayer +findobject +findobjectbytemplate +findcreature +getgametime +getplayerid +getstationname +grantbadge +grantbadgearea +granttitle +revokebadge +revoketitle +gmrevive +getrank +setfaction +settef +setfactionstanding +setrank +killplayer +teleporttarget +planetwarptarget +freezeplayer +unfreezeplayer +squelch +unsquelch +adjustlotcount +credits +editappearance +kick +maxcombatability +maxstats +money +setfirstname +setlastname +setname +setplayerstate +uncityban +setbiographyadmin +activtequest +activateinstance +clearcompletedquest +completequest +listactivequests +listcompletedquests +grantskill +revokeskill +setexperience +listguildes +cityinfo +broadcast +broadcastarea +broadcastplanet +broadcastgalaxy +addbannedplayer +emptymailtarget +getaccountinfo +removebannedplayer +createcreature +createnpc +createmissionelement +createspawningelement +createspawningelementwithdifficulty +createstaticitem +getspawndelays +setmaximumspawntime +setminimumspawntime +showspawnregion +startspawner +starttargetspawner +stopspawner +stoptargetspawner +clearveteranreward +hasveteranreward +setveteranrewardtimecs +setveteranreward \ No newline at end of file diff --git a/accesslevels/dev.txt b/accesslevels/dev.txt new file mode 100644 index 00000000..a16093fa --- /dev/null +++ b/accesslevels/dev.txt @@ -0,0 +1,102 @@ +gmforcecommand +goto +findobject +teleport +teleportto +invulnerable +kill +setspeed +planetwarp +harmfull +harmless +object +searchcorpse +giveitem +sethue +editbank +editbankaccount +editappearance +editstats +snoop +wipeitems +findplayer +findobject +findobjectbytemplate +findcreature +getgametime +getplayerid +getstationname +gmrevive +getrank +setfaction +settef +setfactionstanding +setrank +killplayer +teleporttarget +planetwarptarget +adjustlotcount +editappearance +kick +maxcombatability +maxstats +setfirstname +setlastname +setname +setplayerstate +activtequest +activateinstance +clearcompletedquest +completequest +listactivequests +listcompletedquests +grantskill +revokeskill +setexperience +listguildes +cityinfo +createcreature +createnpc +createmissionelement +createspawningelement +createspawningelementwithdifficulty +createstaticitem +getspawndelays +setmaximumspawntime +setminimumspawntime +showspawnregion +startspawner +starttargetspawner +stopspawner +stoptargetspawner +clearveteranreward +hasveteranreward +setveteranrewardtimecs +setveteranreward +aiignore +combat +craft +forcecommand +generatecrafteditem +getobjvars +gmcreateclassresource +gmcreatespecificresource +manufacture +showfactioninformation +qatool +startrestussstagetwo +completerestusstageone +spewcommandqueue +combatdatarecord +combatdataclear +combatdatareport +combatdatastop +combatmodecheck +database +destroy +dumptargetinformation +dumpzoneinformation +initializecomponent +script +lag +csdumptarget \ No newline at end of file diff --git a/accesslevels/ec.txt b/accesslevels/ec.txt new file mode 100644 index 00000000..7c2236a2 --- /dev/null +++ b/accesslevels/ec.txt @@ -0,0 +1,98 @@ +goto +findobject +teleport +teleportto +invulnerable +kill +setspeed +planetwarp +harmfull +harmless +object +searchcorpse +giveitem +sethue +findplayer +findobject +findobjectbytemplate +findcreature +getgametime +getplayerid +getstationname +grantbadge +grantbadgearea +granttitle +revokebadge +revoketitle +gmrevive +getrank +setfaction +settef +setfactionstanding +setrank +killplayer +teleporttarget +planetwarptarget +freezeplayer +unfreezeplayer +squelch +unsquelch +adjustlotcount +credits +editappearance +kick +maxcombatability +maxstats +money +setfirstname +setlastname +setname +setplayerstate +activtequest +activateinstance +clearcompletedquest +completequest +listactivequests +listcompletedquests +grantskill +revokeskill +setexperience +broadcast +broadcastarea +broadcastplanet +broadcastgalaxy +createcreature +createnpc +createmissionelement +createspawningelement +createspawningelementwithdifficulty +createstaticitem +getspawndelays +setmaximumspawntime +setminimumspawntime +showspawnregion +startspawner +starttargetspawner +stopspawner +stoptargetspawner +eventbuff +eventbuffarea +eventbufftarget +eventclearstates +eventdamage +eventmovetome +eventstorepet +eventtefarea +eventtefclear +eventteftarget +eventundomovetome +eventvaderchoke +eventweapon +setplayerappearance +revokeplayerappearance +csstorytellerdestroynpcs +csstorytellerdestroyprops +csstorytellerdestroyparticles +csstorytellerdestroyallobjects +startrestussstagetwo +completerestusstageone \ No newline at end of file diff --git a/accesslevels/lead.txt b/accesslevels/lead.txt new file mode 100644 index 00000000..5d1056bf --- /dev/null +++ b/accesslevels/lead.txt @@ -0,0 +1,163 @@ +gmforcecommand +goto +findobject +teleport +teleportto +invulnerable +kill +setspeed +planetwarp +harmfull +harmless +object +searchcorpse +giveitem +sethue +editbank +editbankaccount +editappearance +editstats +snoop +wipeitems +findplayer +findobject +findobjectbytemplate +findcreature +getgametime +getplayerid +getstationname +grantbadge +grantbadgearea +granttitle +revokebadge +revoketitle +gmrevive +getrank +setfaction +settef +setfactionstanding +setrank +killplayer +teleporttarget +planetwarptarget +freezeplayer +unfreezeplayer +squelch +unsquelch +adjustlotcount +credits +editappearance +kick +maxcombatability +maxstats +money +setfirstname +setlastname +setname +setplayerstate +uncityban +setbiographyadmin +activtequest +activateinstance +clearcompletedquest +completequest +listactivequests +listcompletedquests +grantskill +revokeskill +setexperience +listguildes +cityinfo +broadcast +broadcastarea +broadcastplanet +broadcastgalaxy +addbannedplayer +emptymailtarget +getaccountinfo +removebannedplayer +createcreature +createnpc +createmissionelement +createspawningelement +createspawningelementwithdifficulty +createstaticitem +getspawndelays +setmaximumspawntime +setminimumspawntime +showspawnregion +startspawner +starttargetspawner +stopspawner +stoptargetspawner +clearveteranreward +hasveteranreward +setveteranrewardtimecs +setveteranreward +aiignore +combat +craft +forcecommand +generatecrafteditem +getobjvars +gmcreateclassresource +gmcreatespecificresource +manufacture +showfactioninformation +qatool +startrestussstagetwo +completerestusstageone +spewcommandqueue +combatdatarecord +combatdataclear +combatdatareport +combatdatastop +combatmodecheck +database +destroy +dumptargetinformation +dumpzoneinformation +initializecomponent +script +lag +csdumptarget +eventbuff +eventbuffarea +eventbufftarget +eventclearstates +eventdamage +eventmovetome +eventstorepet +eventtefarea +eventtefclear +eventteftarget +eventundomovetome +eventvaderchoke +eventweapon +setplayerappearance +revokeplayerappearance +csstorytellerdestroynpcs +csstorytellerdestroyprops +csstorytellerdestroyparticles +csstorytellerdestroyallobjects +startrestussstagetwo +completerestusstageone +setgodmode +server +addallowedplayer +removeallowedplayer +setlogintitle +setloginmessage +setplanetlimit +resendloginmessagetoall +gmforcerank +gmfsvillage +gmjedistate +grantpadawantrialseligibility +overridepadawantrialseligibility +resetjedi +setwardenloginmessage +findwarden +activatequest +grantwarden +revokewarden diff --git a/accesslevels/qa.txt b/accesslevels/qa.txt new file mode 100644 index 00000000..c971f3c7 --- /dev/null +++ b/accesslevels/qa.txt @@ -0,0 +1,82 @@ +goto +findobject +teleport +teleportto +invulnerable +kill +setspeed +planetwarp +harmfull +harmless +object +searchcorpse +giveitem +sethue +findplayer +findobject +findobjectbytemplate +findcreature +getgametime +getplayerid +getstationname +gmrevive +getrank +setfaction +settef +setfactionstanding +setrank +killplayer +teleporttarget +planetwarptarget +setfirstname +setlastname +setname +setplayerstate +activtequest +activateinstance +clearcompletedquest +completequest +listactivequests +listcompletedquests +grantskill +revokeskill +setexperience +listguildes +cityinfo +createcreature +createnpc +createmissionelement +createspawningelement +createspawningelementwithdifficulty +createstaticitem +getspawndelays +setmaximumspawntime +setminimumspawntime +showspawnregion +startspawner +starttargetspawner +stopspawner +stoptargetspawner +aiignore +combat +craft +forcecommand +generatecrafteditem +getobjvars +gmcreateclassresource +gmcreatespecificresource +manufacture +showfactioninformation +qatool +startrestussstagetwo +completerestusstageone +spewcommandqueue +combatdatarecord +combatdataclear +combatdatareport +combatdatastop +combatmodecheck +dumptargetinformation +dumpzoneinformation +csdumptarget +destroy diff --git a/accesslevels/staff.txt b/accesslevels/staff.txt new file mode 100644 index 00000000..9aadf55a --- /dev/null +++ b/accesslevels/staff.txt @@ -0,0 +1,12 @@ +gmforcecommand +goto +findobject +teleport +teleportto +invulnerable +kill +gmrevive +setspeed +planetwarp +harmfull +harmless \ No newline at end of file diff --git a/nge.backup b/nge.backup index 1a761380..3091c7ff 100644 Binary files a/nge.backup and b/nge.backup differ diff --git a/options.cfg b/options.cfg index 3e5d1c26..9a4da26a 100644 --- a/options.cfg +++ b/options.cfg @@ -14,10 +14,14 @@ LOAD.BUILDOUT_OBJECTS=0 # 1 = On, 0 = Off. LOAD.RESOURCE.SYSTEM=1 -# Toggles full wipe of Server Database (Characters, Items, etc.) +# Toggles full wipe of Object Database (Characters, Items, etc.) # 1 = Enabled, 0 = Disabled. CLEAN.ODB.FOLDERS=0 +# Toggles wipe of characters in Datatable +# 1 = Enabled, 0 = Disabled +CLEAN.CHARACTERS.TABLE=0 + # Toggles Isolation System Spawning at Tatooine 0 0 0 around no NPC's. # 1 = On, 0 = Off. DO.ISOLATION.TESTS=0 diff --git a/scripts/commands/activatequest.py b/scripts/commands/activatequest.py new file mode 100644 index 00000000..9c784fdb --- /dev/null +++ b/scripts/commands/activatequest.py @@ -0,0 +1,11 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + + # WARNING: Quest may not show up if you haven't completed a prior quest if it's a chain - this is clientside, no way to circumvent atm + core.questService.adminActivateQuest(actor, commandString) + actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF ActivateQuest: Command completed successfully.', 0) + return \ No newline at end of file diff --git a/scripts/commands/giveitem.py b/scripts/commands/giveitem.py index 65791788..0b9d2642 100644 --- a/scripts/commands/giveitem.py +++ b/scripts/commands/giveitem.py @@ -9,10 +9,7 @@ def run(core, actor, target, commandString): arg1 = commandArgs[0] if len(commandArgs) > 1: arg2 = commandArgs[1] - - if actor.getClient() and actor.getClient().isGM() == False: - return - + if not commandString.startswith('object/tangible') and not commandString.startswith('object/weapon'): return diff --git a/scripts/commands/gmforcecommand.py b/scripts/commands/gmforcecommand.py new file mode 100644 index 00000000..6940458c --- /dev/null +++ b/scripts/commands/gmforcecommand.py @@ -0,0 +1,250 @@ +import sys +from engine.resources.scene import Point3D +from protocol.swg import ObjControllerMessage +from protocol.swg import UnknownAbilityPacket +from protocol.swg import PlayClientEffectLocMessage +from engine.resources.objects import SWGObject +from java.awt.datatransfer import StringSelection +from java.awt.datatransfer import Clipboard +from java.awt import Toolkit +from resources.datatables import GcwRank +from services.gcw import GCWService + + +def setup(): + return + +def run(core, actor, target, commandString): + + playerObject = actor.getSlottedObject('ghost') + + global str + + if not playerObject: + return + + commandArgs = commandString.split(' ') + command = commandArgs[0] + if len(commandArgs) > 1: + arg1 = commandArgs[1] + if len(commandArgs) > 2: + arg2 = commandArgs[2] + if len(commandArgs) > 3: + arg3 = commandArgs[3] + if len(commandArgs) > 4: + arg4 = commandArgs[4] + if len(commandArgs) > 5: + arg5 = commandArgs[5] + + if command == 'giveExperience' and arg1: + core.playerService.giveExperience(actor, int(arg1)) + + if command == 'level' and arg1: + core.playerService.grantLevel(actor, int(arg1)) + + elif command == 'addability' and arg1: + actor.addAbility(str(arg1)) + actor.sendSystemMessage('You have learned ' + arg1 + '.', 0) + + elif command == 'anim' and arg1: + actor.doSkillAnimation(arg1) + actor.sendSystemMessage('Performed ' + arg1 ,0) + + elif command == 'changeBio' and arg1: + actor.getSlottedObject('ghost').setBiography(arg1) + + elif command == 'spawn' and arg1 and arg2: + pos = actor.getWorldPosition() + core.spawnService.spawnCreature(arg1, actor.getPlanet().getName(), 0, pos.x, pos.y, pos.z, 1, 0, 1, 0, int(arg2)) + + elif command == 'instance' and arg1: + core.instanceService.queue(arg1, actor) + + elif command == 'action' and arg1: + actor.setAction(int(arg1)) + + elif command == 'health' and arg1: + actor.setHealth(int(arg1)) + + elif command == 'cust' and arg1 and arg2 and arg3: + obj = core.objectService.getObject(long(arg1)) + obj.setCustomizationVariable(str(arg2), int(arg3)) + + elif command == 'buff' and arg1: + core.buffService.addBuffToCreature(actor, str(arg1), actor) + + elif command == 'holoEmote' and arg1: + playerObject.setHoloEmote('holoemote_' + arg1) + playerObject.setHoloEmoteUses(20) + actor.sendSystemMessage('Holo-Emote Generator set to ' + 'holoemote_' + arg1, 0) + + elif command == 'off': + if playerObject.getGodLevel > 0: + actor.removeAbility("admin") + playerObject.setGodLevel(0) + + elif command == 'setBounty': + if actor.getFaction() == "": + actor.sendSystemMessage('You must be aligned in order to place a bounty on yourself.', 0) + return + core.playerService.sendSetBountyWindow(actor, actor) + return + + elif command == 'genloot': + object = core.lootService.generateLootItem(actor, arg1) + + inventory = actor.getSlottedObject('inventory') + + if inventory: + inventory.add(object) + + elif command == 'spawnobj': + pos = actor.getPosition() + core.staticService.spawnObject(arg1, actor.getPlanet().getName(), 0, pos.x, pos.y, pos.z, 0, 0) + + elif command == 'showpos': + pos = actor.getPosition() + ori = actor.getOrientation() + cellid = 0 + planetName = actor.getPlanet().getName() + + actor.sendSystemMessage('Position.x : %s' % pos.x, 0) + print ('Position.x : %s' % pos.x, 0) + actor.sendSystemMessage('Position.y : %s' % pos.y, 0) + print ('Position.y : %s' % pos.y, 0) + actor.sendSystemMessage('Position.z : %s' % pos.z, 0) + print ('Position.z : %s' % pos.z, 0) + actor.sendSystemMessage('Orientation.w : %s' % ori.w, 0) + print ('Orientation.x : %s' % ori.w, 0) + actor.sendSystemMessage('Orientation.x : %s' % ori.x, 0) + print ('Orientation.w : %s' % ori.x, 0) + actor.sendSystemMessage('Orientation.y : %s' % ori.y, 0) + print ('Orientation.y : %s' % ori.y, 0) + actor.sendSystemMessage('Orientation.z : %s' % ori.z, 0) + print ('Orientation.z : %s' % ori.z, 0) + if (actor.getContainer()): + building_id = actor.getGrandparent().getObjectID() + cid = actor.getContainer().getCellNumber() + cellid = cid + actor.sendSystemMessage('Cell ID : %s' % cid, 0) + actor.sendSystemMessage('Building ID : %s' % building_id, 0) + print('Cell ID : %s' % cid, 0) + print('Building ID : %s' % building_id, 0) + if cellid == 0: + str = " = stcSvc.spawnObject('', '" + planetName + "', long(%s" % cellid + "), float(%.4f" % pos.x + "), float(%.4f" % pos.y + "), float(%.4f" % pos.z + "), float(%.4f" % ori.w + "), float(%.4f" % ori.x + "), float(%.4f" % ori.y + "), float(%.4f" % ori.z + "))" + elif cellid != 0: + str = "\tbuilding = core.objectService.getObject(long(%s" % building_id + "))\n\t = stcSvc.spawnObject('', '" + planetName + "', building.getCellByCellNumber(long(%s" % cellid + ")), float(%.4f" % pos.x + "), float(%.4f" % pos.y + "), float(%.4f" % pos.z + "), float(%.4f" % ori.w + "), float(%.4f" % ori.x + "), float(%.4f" % ori.y + "), float(%.4f" % ori.z + "))" + toolkit = Toolkit.getDefaultToolkit() + clipboard = toolkit.getSystemClipboard() + clipboard.setContents(StringSelection(str), None) + + elif command == 'patrolpoint': + pos = actor.getPosition() + str = "patrolpoints.add(Point3D(float(%.2f" % pos.x + "), float(%.2f" % pos.y + "), float(%.2f" % pos.z + ")))" + toolkit = Toolkit.getDefaultToolkit() + clipboard = toolkit.getSystemClipboard() + clipboard.setContents(StringSelection(str), None) + actor.sendSystemMessage('Patrolpoint copied to clipboard', 0) + + elif command == 'checkai': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + actor.sendSystemMessage('Checking AI handling for unit ' + latarget.getCustomName(), 0) + core.aiService.setCheckAI(latarget) + + elif command == 'checkaitarget': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getFollowObject(): + actor.sendSystemMessage('Checking AI target ' + latarget.getAttachment('AI').getFollowObject().getTemplate(), 0) + + elif command == 'checkaistate': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getCurrentState(): + actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getCurrentState().getClass().getName(), 0) + + elif command == 'checkairepos': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getRepositionStartTime()(): + actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getRepositionStartTime(), 0) + + elif command == 'checkaiprog': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + actor.sendSystemMessage('Checking AI progression %s' % latarget.getAttachment('AI').getProgressionMarker(), 0) + + elif command == 'checkwithdrawn': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('isWithdrawn'): + actor.sendSystemMessage('Checking AIisWithdrawn %s' % latarget.getAttachment('isWithdrawn'), 0) + + elif command == 'showbitmask': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + actor.sendSystemMessage('Optionsbitmask for unit ' + latarget.getCustomName() + ' is %s' % latarget.getOptionsBitmask(), 0) + + elif command == 'spawninst': + + #String campTemplate = "object/building/poi/shared_gcw_rebel_clone_tent_small.iff"; // LOL why doesn't this spawn?!?!?! + inst = core.objectService.createObject(arg1, 0, actor.getPlanet(), actor.getWorldPosition(), actor.getOrientation()) + if inst: + #TangibleObject inst = (TangibleObject) core.objectService.createObject(campTemplate, 0, core.terrainService.getPlanetByName("talus"), new Point3D(-890,9, -2994), quaternion) + core.simulationService.add(inst, inst.getPosition().x, inst.getPosition().z, True) + positionY = core.terrainService.getHeight(inst.getPlanetId(), inst.getPosition().x, inst.getPosition().z) + instpos = Point3D(inst.getPosition().x,positionY+2, inst.getPosition().z) + inst.setPosition(instpos) + + elif command == 'los': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + los = core.simulationService.checkLineOfSight(actor, latarget) + if los: + actor.sendSystemMessage('Line of sight between player and target', 0) + else: + actor.sendSystemMessage('NO Line of sight between player and target', 0) + + elif command == 'playfx': + effectFile = arg1 + cEffMsg = PlayClientEffectLocMessage(effectFile, actor.getPlanet().getName(), actor.getPosition()) + actor.getClient().getSession().write(cEffMsg.serialize()) + + elif command == 'toinvasion': + invasionplanet = core.invasionService.getInvasionPlanetName() + position = Point3D(float(1366), float(13), float(2747)) + if invasionplanet == 'talus': + position = Point3D(float(264), float(4), float(-2950)) + if invasionplanet == 'tatooine': + position = Point3D(float(-1385), float(12), float(-3597)) + + core.simulationService.transferToPlanet(actor, core.terrainService.getPlanetByName(invasionplanet), position, actor.getOrientation(), None) + + elif command == 'unknownAbilityPacket' and arg1: + packet = UnknownAbilityPacket(arg1) + actor.getClient().getSession().write(packet.serialize()) + actor.sendSystemMessage('Sent UnknownAbilityPacket for ability ' + arg1, 0) + return + + elif command == 'rank' and arg1: + playerObject.setCurrentRank(int(arg1)) + print (playerObject.getCurrentRank()) + return + + elif command == 'addToFrogAdminList': + frogBuilding = core.objectService.getObject(core.devService.getFrogBuildingId()) + + if frogBuilding is None: + return + + frogBuilding.addPlayerToAdminList(None, actor.getObjectID(), actor.getCustomName().split(' ')[0]) + actor.sendSystemMessage('You were added to the Admin list for the Frog Building.', 0) + return + return + + \ No newline at end of file diff --git a/scripts/commands/setgodmode.py b/scripts/commands/setgodmode.py index 49f3cf40..aeff3947 100644 --- a/scripts/commands/setgodmode.py +++ b/scripts/commands/setgodmode.py @@ -1,297 +1,12 @@ +# This file will be updated at a later date with a new command. + import sys -from engine.resources.scene import Point3D -from protocol.swg import ObjControllerMessage -from protocol.swg import UnknownAbilityPacket -from protocol.swg import PlayClientEffectLocMessage -from engine.resources.objects import SWGObject -from java.awt.datatransfer import StringSelection -from java.awt.datatransfer import Clipboard -from java.awt import Toolkit -from resources.datatables import GcwRank -from services.gcw import GCWService - - +from resources.common import ProsePackage +from resources.common import OutOfBand +from protocol.swg import CreateClientPathMessage def setup(): - return - -def run(core, actor, target, commandString): - - playerObject = actor.getSlottedObject('ghost') - - global str - - if not playerObject: - return - - commandArgs = commandString.split(' ') - command = commandArgs[0] - if len(commandArgs) > 1: - arg1 = commandArgs[1] - if len(commandArgs) > 2: - arg2 = commandArgs[2] - if len(commandArgs) > 3: - arg3 = commandArgs[3] - if len(commandArgs) > 4: - arg4 = commandArgs[4] - if len(commandArgs) > 5: - arg5 = commandArgs[5] - - if not command: - return - - if actor.getClient().isGM() is False: - return - - if playerObject.getGodLevel() == 0: - actor.addAbility("admin") - playerObject.setGodLevel(50) - - if command == 'giveExperience' and arg1: - core.playerService.giveExperience(actor, int(arg1)) - - if command == 'level' and arg1: - core.playerService.grantLevel(actor, int(arg1)) - - elif command == 'setSpeed' and arg1: - #actor.sendSystemMessage("Your speed was " + str(actor.getSpeedMultiplierBase()) + ". Don\'t forget to set this back or it\'ll permanently imbalance your speed. Default without buffs or mods is 1.", 2) - actor.setSpeedMultiplierBase(float(arg1)) - actor.sendSystemMessage('Your new speed is ' + arg1 + '.', 2) - - elif command == 'teleport' and arg2 and arg3 and arg4: - position = Point3D(float(arg2), float(arg3), float(arg4)) - core.simulationService.transferToPlanet(actor, core.terrainService.getPlanetByName(arg1), position, actor.getOrientation(), None) - - elif command == 'teleportplayer' and arg1 and arg2 and arg3 and arg4 and arg5: - player = core.chatService.getObjectByFirstName(arg1) - if player: - position = Point3D(float(arg3), float(arg4), float(arg5)) - core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName(arg2), position, player.getOrientation(), None) - - elif command == 'credits' and arg1: - actor.setCashCredits(actor.getCashCredits() + int(arg1)) - actor.sendSystemMessage('The Galactic Empire has transferred ' + arg1 + ' credits to you for your service.', 0) - - elif command == 'addability' and arg1: - actor.addAbility(str(arg1)) - actor.sendSystemMessage('You have learned ' + arg1 + '.', 0) - - elif command == 'anim' and arg1: - actor.doSkillAnimation(arg1) - actor.sendSystemMessage('Performed ' + arg1 ,0) - - elif command == 'changeBio' and arg1: - actor.getSlottedObject('ghost').setBiography(arg1) - - elif command == 'spawn' and arg1 and arg2: - pos = actor.getWorldPosition() - core.spawnService.spawnCreature(arg1, actor.getPlanet().getName(), 0, pos.x, pos.y, pos.z, 1, 0, 1, 0, int(arg2)) - - elif command == 'instance' and arg1: - core.instanceService.queue(arg1, actor) - - elif command == 'action' and arg1: - actor.setAction(int(arg1)) - - elif command == 'health' and arg1: - actor.setHealth(int(arg1)) - - elif command == 'id': - actor.sendSystemMessage('Your id is: ' + str(actor.getObjectId()), 0) - - elif command == 'cust' and arg1 and arg2 and arg3: - obj = core.objectService.getObject(long(arg1)) - obj.setCustomizationVariable(str(arg2), int(arg3)) - - elif command == 'buff' and arg1: - core.buffService.addBuffToCreature(actor, str(arg1), actor) - - elif command == 'stealth': - if (actor.isInStealth()): - actor.setInStealth(False) - actor.setRadarVisible(True) - else: - actor.setInStealth(True) - actor.setRadarVisible(False) - - elif command == 'holoEmote' and arg1: - playerObject.setHoloEmote('holoemote_' + arg1) - playerObject.setHoloEmoteUses(20) - actor.sendSystemMessage('Holo-Emote Generator set to ' + 'holoemote_' + arg1, 0) - - elif command == 'off': - if playerObject.getGodLevel > 0: - actor.removeAbility("admin") - playerObject.setGodLevel(0) - - elif command == 'setBounty': - if actor.getFaction() == "": - actor.sendSystemMessage('You must be aligned in order to place a bounty on yourself.', 0) - return - core.playerService.sendSetBountyWindow(actor, actor) - return - - elif command == 'genloot': - object = core.lootService.generateLootItem(actor, arg1) - - inventory = actor.getSlottedObject('inventory') - - if inventory: - inventory.add(object) - - elif command == 'spawnobj': - pos = actor.getPosition() - core.staticService.spawnObject(arg1, actor.getPlanet().getName(), 0, pos.x, pos.y, pos.z, 0, 0) - - elif command == 'showpos': - pos = actor.getPosition() - ori = actor.getOrientation() - cellid = 0 - planetName = actor.getPlanet().getName() - - actor.sendSystemMessage('Position.x : %s' % pos.x, 0) - print ('Position.x : %s' % pos.x, 0) - actor.sendSystemMessage('Position.y : %s' % pos.y, 0) - print ('Position.y : %s' % pos.y, 0) - actor.sendSystemMessage('Position.z : %s' % pos.z, 0) - print ('Position.z : %s' % pos.z, 0) - actor.sendSystemMessage('Orientation.w : %s' % ori.w, 0) - print ('Orientation.x : %s' % ori.w, 0) - actor.sendSystemMessage('Orientation.x : %s' % ori.x, 0) - print ('Orientation.w : %s' % ori.x, 0) - actor.sendSystemMessage('Orientation.y : %s' % ori.y, 0) - print ('Orientation.y : %s' % ori.y, 0) - actor.sendSystemMessage('Orientation.z : %s' % ori.z, 0) - print ('Orientation.z : %s' % ori.z, 0) - if (actor.getContainer()): - building_id = actor.getGrandparent().getObjectID() - cid = actor.getContainer().getCellNumber() - cellid = cid - actor.sendSystemMessage('Cell ID : %s' % cid, 0) - actor.sendSystemMessage('Building ID : %s' % building_id, 0) - print('Cell ID : %s' % cid, 0) - print('Building ID : %s' % building_id, 0) - if cellid == 0: - str = " = stcSvc.spawnObject('', '" + planetName + "', long(%s" % cellid + "), float(%.4f" % pos.x + "), float(%.4f" % pos.y + "), float(%.4f" % pos.z + "), float(%.4f" % ori.w + "), float(%.4f" % ori.x + "), float(%.4f" % ori.y + "), float(%.4f" % ori.z + "))" - elif cellid != 0: - str = "\tbuilding = core.objectService.getObject(long(%s" % building_id + "))\n\t = stcSvc.spawnObject('', '" + planetName + "', building.getCellByCellNumber(long(%s" % cellid + ")), float(%.4f" % pos.x + "), float(%.4f" % pos.y + "), float(%.4f" % pos.z + "), float(%.4f" % ori.w + "), float(%.4f" % ori.x + "), float(%.4f" % ori.y + "), float(%.4f" % ori.z + "))" - toolkit = Toolkit.getDefaultToolkit() - clipboard = toolkit.getSystemClipboard() - clipboard.setContents(StringSelection(str), None) - - elif command == 'patrolpoint': - pos = actor.getPosition() - str = "patrolpoints.add(Point3D(float(%.2f" % pos.x + "), float(%.2f" % pos.y + "), float(%.2f" % pos.z + ")))" - toolkit = Toolkit.getDefaultToolkit() - clipboard = toolkit.getSystemClipboard() - clipboard.setContents(StringSelection(str), None) - actor.sendSystemMessage('Patrolpoint copied to clipboard', 0) - - elif command == 'jesus': - actor.setHealth(actor.getMaxHealth()) - actor.setAction(actor.getMaxAction()) - actor.setPosture(0) - actor.setSpeedMultiplierBase(1) - actor.setTurnRadius(1) - - elif command == 'checkai': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - actor.sendSystemMessage('Checking AI handling for unit ' + latarget.getCustomName(), 0) - core.aiService.setCheckAI(latarget) - - elif command == 'checkaitarget': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - if latarget.getAttachment('AI'): - if latarget.getAttachment('AI').getFollowObject(): - actor.sendSystemMessage('Checking AI target ' + latarget.getAttachment('AI').getFollowObject().getTemplate(), 0) - - elif command == 'checkaistate': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - if latarget.getAttachment('AI'): - if latarget.getAttachment('AI').getCurrentState(): - actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getCurrentState().getClass().getName(), 0) - - elif command == 'checkairepos': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - if latarget.getAttachment('AI'): - if latarget.getAttachment('AI').getRepositionStartTime()(): - actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getRepositionStartTime(), 0) - - elif command == 'checkaiprog': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - if latarget.getAttachment('AI'): - actor.sendSystemMessage('Checking AI progression %s' % latarget.getAttachment('AI').getProgressionMarker(), 0) - - elif command == 'checkwithdrawn': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - if latarget.getAttachment('isWithdrawn'): - actor.sendSystemMessage('Checking AIisWithdrawn %s' % latarget.getAttachment('isWithdrawn'), 0) - - elif command == 'showbitmask': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - actor.sendSystemMessage('Optionsbitmask for unit ' + latarget.getCustomName() + ' is %s' % latarget.getOptionsBitmask(), 0) - - elif command == 'spawninst': - - #String campTemplate = "object/building/poi/shared_gcw_rebel_clone_tent_small.iff"; // LOL why doesn't this spawn?!?!?! - inst = core.objectService.createObject(arg1, 0, actor.getPlanet(), actor.getWorldPosition(), actor.getOrientation()) - if inst: - #TangibleObject inst = (TangibleObject) core.objectService.createObject(campTemplate, 0, core.terrainService.getPlanetByName("talus"), new Point3D(-890,9, -2994), quaternion) - core.simulationService.add(inst, inst.getPosition().x, inst.getPosition().z, True) - positionY = core.terrainService.getHeight(inst.getPlanetId(), inst.getPosition().x, inst.getPosition().z) - instpos = Point3D(inst.getPosition().x,positionY+2, inst.getPosition().z) - inst.setPosition(instpos) - - elif command == 'los': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - los = core.simulationService.checkLineOfSight(actor, latarget) - if los: - actor.sendSystemMessage('Line of sight between player and target', 0) - else: - actor.sendSystemMessage('NO Line of sight between player and target', 0) - - elif command == 'playfx': - effectFile = arg1 - cEffMsg = PlayClientEffectLocMessage(effectFile, actor.getPlanet().getName(), actor.getPosition()) - actor.getClient().getSession().write(cEffMsg.serialize()) - - elif command == 'toinvasion': - invasionplanet = core.invasionService.getInvasionPlanetName() - position = Point3D(float(1366), float(13), float(2747)) - if invasionplanet == 'talus': - position = Point3D(float(264), float(4), float(-2950)) - if invasionplanet == 'tatooine': - position = Point3D(float(-1385), float(12), float(-3597)) - - core.simulationService.transferToPlanet(actor, core.terrainService.getPlanetByName(invasionplanet), position, actor.getOrientation(), None) - - elif command == 'unknownAbilityPacket' and arg1: - packet = UnknownAbilityPacket(arg1) - actor.getClient().getSession().write(packet.serialize()) - actor.sendSystemMessage('Sent UnknownAbilityPacket for ability ' + arg1, 0) - return - - elif command == 'rank' and arg1: - playerObject.setCurrentRank(int(arg1)) - print (playerObject.getCurrentRank()) - return - - elif command == 'addToFrogAdminList': - frogBuilding = core.objectService.getObject(core.devService.getFrogBuildingId()) - - if frogBuilding is None: - return - - frogBuilding.addPlayerToAdminList(None, actor.getObjectID(), actor.getCustomName().split(' ')[0]) - actor.sendSystemMessage('You were added to the Admin list for the Frog Building.', 0) - return return - - \ No newline at end of file + +def run(core, actor, target, commandString): + core.questService.giveBasicQuest(actor) + return \ No newline at end of file diff --git a/scripts/commands/teleporttarget.py b/scripts/commands/teleporttarget.py index 9a9fde95..f3fbf450 100644 --- a/scripts/commands/teleporttarget.py +++ b/scripts/commands/teleporttarget.py @@ -11,12 +11,15 @@ def run(core, actor, target, commandString): if not playerObject: return + if target is None: + target = core.objectService.getObjectByFirstName(commandString) + if target and target.getSlottedObject('ghost') is not None: actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF teleportTarget: Command completed successfully.', 0) core.simulationService.teleport(target, actor.getPosition(), actor.getOrientation(), 0) return else: - actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF teleportTarget: Invalid Syntax. Syntax is: /teleportTarget ', 0) + actor.sendSystemMessage(' \\#FE2EF7 [GM] \\#FFFFFF teleportTarget: Invalid Syntax. Syntax is: /teleportTarget or /teleportTarget ', 0) return return diff --git a/scripts/radial/terminal/city_maintenance_terminal.py b/scripts/radial/terminal/city_maintenance_terminal.py index 50259cfa..b16bb4be 100644 --- a/scripts/radial/terminal/city_maintenance_terminal.py +++ b/scripts/radial/terminal/city_maintenance_terminal.py @@ -34,7 +34,7 @@ def createRadial(core, owner, target, radials): if owner.getPlayerObject().getCitizenship() != 3 and core.playerCityService.getPlayerCity(owner) == city: radials.add(RadialOptions(2, 230, 0, '@city/city:revoke_citizenship')) - if owner.getClient().isGM(): + if core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()) is not None: radials.add(RadialOptions(2, 231, 0, 'Add 10 citizens')) radials.add(RadialOptions(2, 232, 0, 'Deduct 10 citizens')) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 990371b9..d68e1493 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -23,20 +23,15 @@ package main; import java.io.BufferedReader; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -44,19 +39,13 @@ import java.util.concurrent.TimeUnit; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.session.IoSession; -import com.sleepycat.je.Transaction; -import com.sleepycat.persist.EntityCursor; - -import protocol.swg.chat.ChatSystemMessage; import net.engio.mbassy.bus.config.BusConfiguration; import resources.common.BountyListItem; -import resources.common.RadialOptions; import resources.common.ThreadMonitor; import resources.datatables.GalaxyStatus; import resources.objects.creature.CreatureObject; import resources.objects.guild.GuildObject; import resources.objects.resource.GalacticResource; -import resources.objects.resource.ResourceRoot; import services.AttributeService; import services.BuffService; import services.CharacterService; @@ -65,6 +54,7 @@ import services.ConversationService; import services.EntertainmentService; import services.GroupService; import services.housing.HousingService; +import services.AdminService; import services.BrowserService; import services.InstanceService; import services.LoginService; @@ -104,6 +94,7 @@ import services.pet.MountService; import services.pet.PetService; import services.playercities.PlayerCity; import services.playercities.PlayerCityService; +import services.quest.QuestService; import services.resources.HarvesterService; import services.resources.ResourceService; import services.retro.RetroService; @@ -143,11 +134,11 @@ import engine.servers.InteractiveJythonServer; import engine.servers.MINAServer; import engine.servers.PingServer; -@SuppressWarnings("unused") +@SuppressWarnings("unused") public class NGECore { - private static boolean logUnhandledExceptions = false; + private static boolean logUnhandledExceptions = true; public static boolean didServerCrash = false; @@ -201,6 +192,7 @@ public class NGECore { public SpawnService spawnService; public AIService aiService; public MissionService missionService; + public QuestService questService; public InstanceService instanceService; public SurveyService surveyService; public ResourceService resourceService; @@ -216,6 +208,7 @@ public class NGECore { public BrowserService browserService; //public BattlefieldService battlefieldService; public InvasionService invasionService; + public AdminService adminService; // Login Server public NetworkDispatch loginDispatch; @@ -280,7 +273,6 @@ public class NGECore { options = DefaultConfig.getConfig(); } - //if (optionsConfigLoaded && options.getInt("CLEAN.ODB.FOLDERS") > 0 || getExcludedDevelopers().contains(System.getProperty("user.name"))){ if (options.getInt("CLEAN.ODB.FOLDERS") > 0){ File baseFolder = new File("./odb"); @@ -293,6 +285,8 @@ public class NGECore { } } } + + System.out.println("Cleaned ODB Folders."); } @@ -315,6 +309,13 @@ public class NGECore { } setGalaxyStatus(GalaxyStatus.Loading); + + if (options.getInt("CLEAN.CHARACTERS.TABLE") > 0) { + try { databaseConnection.preparedStatement("DELETE FROM characters").execute(); } + catch (SQLException e) {e.printStackTrace(); } + System.out.println("Cleared characters table."); + } + swgObjectODB = new ObjectDatabase("swgobjects", true, true, true, SWGObject.class); mailODB = new ObjectDatabase("mails", true, true, true, Mail.class); guildODB = new ObjectDatabase("guild", true, true, true, GuildObject.class); @@ -381,6 +382,7 @@ public class NGECore { spawnService = new SpawnService(this); aiService = new AIService(this); missionService = new MissionService(this); + questService = new QuestService(this); invasionService = new InvasionService(this); // Ping Server @@ -428,6 +430,7 @@ public class NGECore { zoneDispatch.addService(buffService); zoneDispatch.addService(entertainmentService); zoneDispatch.addService(missionService); + zoneDispatch.addService(questService); zoneDispatch.addService(bazaarService); zoneDispatch.addService(lootService); zoneDispatch.addService(mountService); @@ -468,14 +471,18 @@ public class NGECore { terrainService.addPlanet(12, "kashyyyk_main", "terrain/kashyyyk_main.trn", true); //Dungeon Terrains // TODO: Fix BufferUnderFlow Errors on loaded of dungeon instances. - terrainService.addPlanet(13, "kashyyyk_dead_forest", "terrain/kashyyyk_dead_forest.trn", true); - terrainService.addPlanet(14, "kashyyyk_hunting", "terrain/kashyyyk_hunting.trn", true); - terrainService.addPlanet(15, "kashyyyk_north_dungeons", "terrain/kashyyyk_north_dungeons.trn", true); - terrainService.addPlanet(16, "kashyyyk_rryatt_trail", "terrain/kashyyyk_rryatt_trail.trn", true); - terrainService.addPlanet(17, "kashyyyk_south_dungeons", "terrain/kashyyyk_south_dungeons.trn", true); - terrainService.addPlanet(18, "adventure1", "terrain/adventure1.trn", true); - terrainService.addPlanet(19, "adventure2", "terrain/adventure2.trn", true); + terrainService.addPlanet(13, "kashyyyk_dead_forest", "terrain/kashyyyk_dead_forest.trn", false); + terrainService.addPlanet(14, "kashyyyk_hunting", "terrain/kashyyyk_hunting.trn", false); + terrainService.addPlanet(15, "kashyyyk_north_dungeons", "terrain/kashyyyk_north_dungeons.trn", false); + terrainService.addPlanet(16, "kashyyyk_rryatt_trail", "terrain/kashyyyk_rryatt_trail.trn", false); + terrainService.addPlanet(17, "kashyyyk_south_dungeons", "terrain/kashyyyk_south_dungeons.trn", false); + terrainService.addPlanet(18, "adventure1", "terrain/adventure1.trn", false); + terrainService.addPlanet(19, "adventure2", "terrain/adventure2.trn", false); + // Tutorial Terrains terrainService.addPlanet(20, "dungeon1", "terrain/dungeon1.trn", true); + terrainService.addPlanet(21, "tutorial", "terrain/tutorial.trn", false); // 21B droid scene + //terrainService.addPlanet(22, "space_npe_falcon_3", "terrain/space_npe_falcon_3.trn", false); + //Space Zones // NOTE: Commented out for now until space is implemented. No need to be loaded into memory when space is not implemented. /*terrainService.addPlanet(21, "space_corellia", "terrain/space_corellia.trn", true); @@ -492,8 +499,8 @@ public class NGECore { terrainService.addPlanet(32, "space_naboo", "terrain/space_naboo.trn", true); terrainService.addPlanet(33, "space_naboo_2", "terrain/space_naboo_2.trn", true); terrainService.addPlanet(34, "space_nova_orion", "terrain/space_nova_orion.trn", true); - terrainService.addPlanet(35, "space_npe_falcon", "terrain/space_npe_falcon.trn", true); // TODO: New Player Tutorial - terrainService.addPlanet(36, "space_npe_falcon_2", "terrain/space_npe_falcon_2.trn", true); // TODO: New Player Tutorial + terrainService.addPlanet(35, "space_npe_falcon", "terrain/space_npe_falcon.trn", true); // Only space_npe_falce_3 is used + terrainService.addPlanet(36, "space_npe_falcon_2", "terrain/space_npe_falcon_2.trn", true); // Only space_npe_falce_3 is used terrainService.addPlanet(37, "space_ord_mantell", "terrain/space_ord_mantell.trn", true); terrainService.addPlanet(38, "space_ord_mantell_2", "terrain/space_ord_mantell_2.trn", true); terrainService.addPlanet(39, "space_ord_mantell_3", "terrain/space_ord_mantell_3.trn", true); @@ -503,10 +510,7 @@ public class NGECore { terrainService.addPlanet(43, "space_tatooine", "terrain/space_tatooine.trn", true); terrainService.addPlanet(44, "space_tatooine_2", "terrain/space_tatooine_2.trn", true); terrainService.addPlanet(45, "space_yavin4", "terrain/space_yavin4.trn", true);*/ - //PSWG New Content Terrains (WARNING Keep commented out unless you have the current build of kaas!) - - //terrainService.addPlanet(46, "kaas", "terrain/kaas.trn", true); - + //end terrainList if (options.getInt("LOAD.RESOURCE.SYSTEM") > 0) { @@ -567,6 +571,7 @@ public class NGECore { browserService = new BrowserService(this); //battlefieldService = new BattlefieldService(this); + adminService = new AdminService(this); DevLogQueuer devLogQueuer = new DevLogQueuer(); diff --git a/src/protocol/swg/UnknownAbilityPacket.java b/src/protocol/swg/GrantCommand.java similarity index 82% rename from src/protocol/swg/UnknownAbilityPacket.java rename to src/protocol/swg/GrantCommand.java index 6c8047a8..1011f162 100644 --- a/src/protocol/swg/UnknownAbilityPacket.java +++ b/src/protocol/swg/GrantCommand.java @@ -25,12 +25,12 @@ import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; -public class UnknownAbilityPacket extends SWGMessage { +public class GrantCommand extends SWGMessage { - private String ability; + private String command; - public UnknownAbilityPacket(String ability) { - this.ability = ability; + public GrantCommand(String command) { + this.command = command; } @Override @@ -40,10 +40,10 @@ public class UnknownAbilityPacket extends SWGMessage { @Override public IoBuffer serialize() { - IoBuffer buffer = IoBuffer.allocate(8 + ability.length()).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = IoBuffer.allocate(8 + command.length()).order(ByteOrder.LITTLE_ENDIAN); buffer.putShort((short) 2); buffer.putInt(0xE67E3875); - buffer.put(getAsciiString(ability)); + buffer.put(getAsciiString(command)); return buffer.flip(); } diff --git a/src/protocol/swg/LoginClusterStatus.java b/src/protocol/swg/LoginClusterStatus.java index 725a8c8b..05e0a0c0 100644 --- a/src/protocol/swg/LoginClusterStatus.java +++ b/src/protocol/swg/LoginClusterStatus.java @@ -22,8 +22,13 @@ package protocol.swg; import java.nio.ByteOrder; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.TimeZone; +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import engine.clients.Client; @@ -50,8 +55,8 @@ public class LoginClusterStatus extends SWGMessage { } public void addServer(int galaxyID, String serverIP, int serverPort, int pingPort, int maxCharacters, int status, int recommended, int population, Client client) { IoBuffer result = IoBuffer.allocate(39 + serverIP.length()).order(ByteOrder.LITTLE_ENDIAN); - int populationStatus = 0; + result.putInt(galaxyID); result.put(getAsciiString(serverIP)); result.putShort((short)serverPort); @@ -66,11 +71,10 @@ public class LoginClusterStatus extends SWGMessage { populationStatus = 6; status = 3; } - if(status == 3 && client.isGM()) + if(status == 3 && !(NGECore.getInstance().adminService.getAccessLevelFromDB(client.getAccountId()) == null) ) // Ziggy - admins can enter Locked galaxies status = 2; result.putInt(populationStatus); // 0 = very light, 1 = light, 2 = medium , 3 = heavy, 4 = very heavy, 5 = extremely heavy, 6 = full result.putInt(maxCharacters); - //result.putInt(0xFFFF8F80); // Distance? result.putInt(timeZone.getRawOffset() / 3600000); result.putInt(status); result.put((byte)recommended); diff --git a/src/resources/common/Forager.java b/src/resources/common/Forager.java index 48a26ca5..5f693253 100644 --- a/src/resources/common/Forager.java +++ b/src/resources/common/Forager.java @@ -180,7 +180,7 @@ public class Forager { } // chosenObject = 5; // To test TMs - if(forager.getClient().isGM()) // Always yield a TM for testing + if(!(NGECore.getInstance().adminService.getAccessLevelFromDB(forager.getClient().getAccountId()) == null)) // Always yield a TM for testing chosenObject = 5; //forager.sendSystemMessage("chosenObject " + chosenObject,(byte) 0); diff --git a/src/resources/datatables/AdminTag.java b/src/resources/datatables/AdminTag.java new file mode 100644 index 00000000..a583a653 --- /dev/null +++ b/src/resources/datatables/AdminTag.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package resources.datatables; + +public class AdminTag { + public static final byte NONE = 0; // Default + public static final byte CSR = 1; // (CSR) + public static final byte DEVELOPER = 2; // (Developer) + public static final byte WARDEN = 3; // (Warden) + public static final byte QA = 4; // (QA) + +} diff --git a/src/resources/datatables/DisplayType.java b/src/resources/datatables/DisplayType.java index 437a0df4..8003e36c 100644 --- a/src/resources/datatables/DisplayType.java +++ b/src/resources/datatables/DisplayType.java @@ -28,7 +28,7 @@ public class DisplayType { public static byte Screen = 1; // Screen? XP gain public static byte Chat = 2; //public static byte Overhead = 3; // Flytext? Seen on ent duration - //public static byte Combat = 4; // CombatSpam? + public static byte Quest = 4; //public static byte Combat = 5; // Seen in combat flytext //public static byte Combat = 11; // Seen when blocking diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index fa44577f..c0b27ccf 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -403,7 +403,7 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria } public boolean canEnter(SWGObject object) { - return (getPrivacy() == PRIVATE && (entryList.contains(object.getObjectID()) || adminList.contains(object.getObjectID()))) || !banList.contains(object.getObjectID()) || object.getClient().isGM(); + return (getPrivacy() == PRIVATE && (entryList.contains(object.getObjectID()) || adminList.contains(object.getObjectID()))) || !banList.contains(object.getObjectID()) || !(NGECore.getInstance().adminService.getAccessLevelFromDB(object.getClient().getAccountId()) == null); } public void updateCellPermissions(SWGObject obj) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index d2f45288..6ac855d1 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -33,6 +33,7 @@ import java.util.concurrent.TimeUnit; import org.apache.mina.core.buffer.IoBuffer; import resources.craft.DraftSchematic; +import resources.datatables.AdminTag; import resources.datatables.Citizenship; import resources.datatables.Professions; import resources.gcw.RegionDefender; @@ -45,6 +46,8 @@ import resources.objects.resource.ResourceContainerObject; import resources.objects.waypoint.WaypointObject; import resources.quest.Quest; import engine.clients.Client; +import engine.resources.common.CRC; +import engine.resources.common.StringUtilities; import engine.resources.objects.Baseline; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -130,7 +133,7 @@ public class PlayerObject extends IntangibleObject implements Serializable { @Override public Baseline getBaseline6() { Baseline baseline = super.getBaseline6(); - baseline.put("godLevel", (byte) 0); + baseline.put("adminTag", (byte) AdminTag.NONE); baseline.put("currentRank", 0); baseline.put("rankProgress", (float) 0); baseline.put("highestRebelRank", 0); @@ -157,8 +160,8 @@ public class PlayerObject extends IntangibleObject implements Serializable { baseline.put("maxForcePower", 100); baseline.put("currentFSQuestList", new SWGList(this, 8, 4, false)); baseline.put("completedFSQuestList", new SWGList(this, 8, 5, false)); - baseline.put("questJournal", new SWGList(this, 8, 6, false)); - baseline.put("7", 0); + baseline.put("activeQuest", 0); + baseline.put("questJournal", new SWGList(this, 8, 7, false)); baseline.put("professionWheelPosition", ""); return baseline; } @@ -435,12 +438,12 @@ public class PlayerObject extends IntangibleObject implements Serializable { notifyClients(getBaseline(3).set("showBackpack", showBackpack), true); } - public byte getGodLevel() { - return (byte) getBaseline(6).get("godLevel"); + public byte getAdminTagValue() { + return (byte) getBaseline(6).get("adminTag"); } - public void setGodLevel(int godLevel) { - notifyClients(getBaseline(6).set("godLevel", (byte) godLevel), true); + public void setAdminTagValue(byte adminTag) { + notifyClients(getBaseline(6).set("adminTag", (byte) adminTag), true); } public int getCurrentRank() { @@ -592,6 +595,13 @@ public class PlayerObject extends IntangibleObject implements Serializable { return (SWGList) getBaseline(8).get("questJournal"); } + public int getActiveQuest() { + return (int) getBaseline(8).get("activeQuest"); + } + + public void setActiveQuest(String quest) { + getBaseline(8).set("activeQuest", CRC.StringtoCRC("quest/"+quest)); + } public String getProfessionWheelPosition() { return (String) getBaseline(8).get("professionWheelPosition"); } @@ -1019,6 +1029,7 @@ public class PlayerObject extends IntangibleObject implements Serializable { @Override public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { + switch (viewType) { case 3: case 6: diff --git a/src/resources/quest/Quest.java b/src/resources/quest/Quest.java index 80348605..f2f205ea 100644 --- a/src/resources/quest/Quest.java +++ b/src/resources/quest/Quest.java @@ -23,18 +23,95 @@ package resources.quest; import java.io.Serializable; +import org.apache.mina.core.buffer.IoBuffer; + +import engine.resources.common.CRC; import engine.resources.objects.Delta; public class Quest extends Delta implements Serializable { private static final long serialVersionUID = 1L; - public Quest() { + private long ownerId; + private short activeStep = 1; + private short completedStep; + private boolean isCompleted = false; + private String name; + private int crc; + + public Quest() {} + + public Quest(String name, long ownerId) { + this.ownerId = ownerId; + this.name = name; + this.crc = CRC.StringtoCRC("quest/"+name); } + public long getOwnerId() { + return ownerId; + } + + public void setOwnerId(long ownerId) { + this.ownerId = ownerId; + } + + public short getActiveStep() { + return activeStep; + } + + public void setActiveStep(short activeStep) { + this.activeStep = activeStep; + } + + public short getCompletedStep() { + return completedStep; + } + + public void setCompletedStep(short completedStep) { + this.completedStep = completedStep; + } + + public boolean isCompleted() { + return isCompleted; + } + + public void setCompleted(boolean isCompleted) { + this.isCompleted = isCompleted; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + this.crc = CRC.StringtoCRC(name); + } + + public int getCrc() { + return crc; + } + public byte[] getBytes() { - return new byte[] { }; + IoBuffer buffer = createBuffer(23); + + buffer.put((byte) 0); + + buffer.putInt(crc); + + buffer.putLong(ownerId); + + buffer.putShort(activeStep); + buffer.putShort(completedStep); + + buffer.put((byte) ((isCompleted) ? 1 : 0)); // isCompleted + buffer.putInt(21); // questCounter + //buffer.put((byte) 0); // ? + + buffer.flip(); + + return buffer.array(); } } diff --git a/src/services/AdminService.java b/src/services/AdminService.java new file mode 100644 index 00000000..3763a874 --- /dev/null +++ b/src/services/AdminService.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; +import java.sql.PreparedStatement; + +import main.NGECore; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; + +public class AdminService implements INetworkDispatch { + + private NGECore core; + + public AdminService(NGECore core) { + this.core = core; + + } + + public String getAccessLevelFromDB(long id) { + String accessLevel = null; + PreparedStatement preparedStatement; + + try { + preparedStatement = NGECore.getInstance().getDatabase1().preparedStatement("SELECT * FROM accounts WHERE id=" + id + ""); + ResultSet resultSet = preparedStatement.executeQuery(); + if(resultSet.next()) + accessLevel = resultSet.getString("accessLevel"); + } catch (SQLException e) { + e.printStackTrace(); + } + + return accessLevel; + } + + @Override + public void insertOpcodes(Map arg0, Map arg1) { + + } + + @Override + public void shutdown() { + + } + +} diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 7488e77c..a1fff102 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -366,7 +366,7 @@ public class CharacterService implements INetworkDispatch { System.out.println("Saving character with name: " + object.getCustomName()); core.getSWGObjectODB().put(object.getObjectID(), object); - PreparedStatement ps = databaseConnection.preparedStatement("INSERT INTO characters (id, \"firstName\", \"lastName\", \"accountId\", \"galaxyId\", \"statusId\", appearance, gmflag) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + PreparedStatement ps = databaseConnection.preparedStatement("INSERT INTO characters (id, \"firstName\", \"lastName\", \"accountId\", \"galaxyId\", \"statusId\", appearance) VALUES (?, ?, ?, ?, ?, ?, ?)"); ps.setLong(1, object.getObjectID()); ps.setString(2, clientCreateCharacter.getFirstName()); ps.setString(3, clientCreateCharacter.getLastName()); @@ -374,7 +374,6 @@ public class CharacterService implements INetworkDispatch { ps.setInt(5, galaxyId); ps.setInt(6, 1); ps.setInt(7, CRC.StringtoCRC(raceTemplate)); - ps.setBoolean(8, false); ps.executeUpdate(); ps.close(); CreateCharacterSuccess success = new CreateCharacterSuccess(object.getObjectID()); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index 4e8ce362..246501fd 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -137,7 +137,6 @@ public class ConnectionService implements INetworkDispatch { if (resultSet.next()) { client.setAccountId(resultSet.getLong("accountId")); client.setSessionKey(clientIdMsg.getSessionKey()); - client.setGM(core.loginService.checkForGmPermission((int) resultSet.getLong("accountId"))); AccountFeatureBits accountFeatureBits = new AccountFeatureBits(); ClientPermissionsMessage clientPermissionsMessage = new ClientPermissionsMessage(maxNumberOfCharacters - core.characterService.getNumberOfCharacters((int) resultSet.getLong("accountId"))); session.write(new HeartBeatMessage().serialize()); @@ -340,7 +339,6 @@ public class ConnectionService implements INetworkDispatch { } ghost.toggleFlag(PlayerFlags.LD); - object.setPerformanceListenee(null); object.setPerformanceWatchee(null); object.setAttachment("disconnectTask", null); diff --git a/src/services/LoginService.java b/src/services/LoginService.java index cdd65984..6e54624c 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -105,8 +105,9 @@ public class LoginService implements INetworkDispatch{ String user = clientID.getAccountName(); String pass = clientID.getPassword(); + String version = clientID.getVersion(); int id = LoginProvider.getAccountId(user, pass, session.getRemoteAddress().toString()); - System.out.println("LOGIN: " + user + " login attempt "+session.getRemoteAddress().toString()+" returned " + id); + System.out.println("LOGIN: " + user + " login attempt " + session.getRemoteAddress().toString() + " returned " + id); if (id < 0) { @@ -135,14 +136,21 @@ public class LoginService implements INetworkDispatch{ return; } + if(!version.equals("20111130-15:46")) { + ErrorMessage clientErr = new ErrorMessage("Invalid Client", "The version of your client is invalid."); + session.write(clientErr.serialize()); + + Disconnect disconnect = new Disconnect((Integer)session.getAttribute("connectionId"), 6); + session.write(disconnect); + return; + } + Client client = new Client(session.getRemoteAddress()); client.setAccountName(user); client.setPassword(pass); client.setSessionKey(generateSessionKey()); client.setAccountId(id); - //client.setAccountEmail(email); client.setSession(session); - client.setGM(checkForGmPermission(id)); core.addClient(session, client); @@ -156,9 +164,6 @@ public class LoginService implements INetworkDispatch{ System.out.println(client.getAccountName() + " was not added to active connections map."); return; } - /*if(!checkIfAccountExistInGameDB(id)) { - createAccountForGameDB(id, user, email, encryptPass); - }*/ persistSession(client); @@ -269,29 +274,6 @@ public class LoginService implements INetworkDispatch{ } - public boolean checkForGmPermission(int id) { - try { - if (core.getConfig().getInt("ADMIN") > 0) { - return true; - } - } catch (Exception e) { - - } - - PreparedStatement preparedStatement; - - try { - preparedStatement = databaseConnection1.preparedStatement("SELECT * FROM accounts WHERE id=" + id + ""); - ResultSet resultSet = preparedStatement.executeQuery(); - if(resultSet.next()) - return resultSet.getBoolean("gmflag"); - } catch (SQLException e) { - e.printStackTrace(); - } - - return false; - } - /** * Saves session data to DB so Zone Server can link sessions to accounts. * @param client Client that needs a session save. @@ -398,14 +380,5 @@ public class LoginService implements INetworkDispatch{ return clusterStatus; } - /** - * Checks if User has correct client version. - * @param version Client Version String - */ - private boolean checkVersion(String version) { - System.out.println("Version Received: " + version); - return true; - } - } diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index fb2ef276..bef5e89d 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -75,6 +75,7 @@ import resources.datatables.GcwRank; import resources.datatables.Options; import resources.datatables.PlayerFlags; import resources.datatables.Professions; +import resources.datatables.AdminTag; import resources.guild.Guild; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; @@ -190,7 +191,7 @@ public class PlayerService implements INetworkDispatch { scheduleList.add(scheduler.scheduleAtFixedRate(() -> { try { - if (creature.isInStealth() && !creature.getOption(Options.INVULNERABLE) && ((PlayerObject) creature.getSlottedObject("ghost")).getGodLevel() == 0) { + if (creature.isInStealth() && !creature.getOption(Options.INVULNERABLE) && core.adminService.getAccessLevelFromDB(creature.getClient().getAccountId()) == null) { List objects = core.simulationService.get(creature.getPlanet(), creature.getPosition().x, creature.getPosition().z, 64); for (SWGObject object : objects) { @@ -204,7 +205,7 @@ public class PlayerService implements INetworkDispatch { CreatureObject observer = (CreatureObject) object; - int camoflauge = creature.getSkillModBase("camoflauge") - observer.getSkillModBase("detectcamo"); + int camoflauge = creature.getSkillModBase("camouflage") - observer.getSkillModBase("detectcamo"); camoflauge -= (64 - creature.getPosition().getDistance(observer.getPosition())); if (new Random(camoflauge).nextInt() == camoflauge) { diff --git a/src/services/TerrainService.java b/src/services/TerrainService.java index 9266b84a..32a71dbf 100644 --- a/src/services/TerrainService.java +++ b/src/services/TerrainService.java @@ -223,15 +223,19 @@ public class TerrainService { if (options != null && options.getInt("LOAD.BUILDOUT_OBJECTS") > 0) { if (!core.getExcludedDevelopers().contains(System.getProperty("user.name"))){ if (! options.keyExists("LOAD.BUILDOUT_ONLY_FOR")){ - try { + try { + System.out.println("Loading buildout objects for: " + planet.getName()); core.objectService.loadBuildoutObjects(planet); + System.out.println("Finished loading buildout objects for: " + planet.getName()); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } - } else { + } else { if (planet.getName().trim().equals(options.getString("LOAD.BUILDOUT_ONLY_FOR").trim())){ try { + System.out.println("Loading buildout objects for: " + planet.getName()); core.objectService.loadBuildoutObjects(planet); + System.out.println("Finished loading buildout objects for " + planet.getName()); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } diff --git a/src/services/command/BaseSWGCommand.java b/src/services/command/BaseSWGCommand.java index 5025939d..87dff513 100644 --- a/src/services/command/BaseSWGCommand.java +++ b/src/services/command/BaseSWGCommand.java @@ -76,7 +76,10 @@ public class BaseSWGCommand implements Cloneable { if (((String) visitor2.getObject(i, 0)).equalsIgnoreCase(commandName)) { int sub = 0; // Subtract due to command table structures being different - characterAbility = (String) visitor2.getObject(i, 7); + if(((String) visitor2.getObject(i, 7)).equals("admin")) + characterAbility = ""; + else + characterAbility = (String) visitor2.getObject(i, 7); for (int l = (8 - sub); l <= (29 - sub); l++) { if (!((Boolean) visitor2.getObject(i, l))) { diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 7ae337d2..2f9962cd 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -21,9 +21,14 @@ ******************************************************************************/ package services.command; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.ByteOrder; import java.util.Map; +import java.util.Scanner; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -31,6 +36,7 @@ import java.util.concurrent.ScheduledExecutorService; import main.NGECore; +import org.apache.commons.io.FileUtils; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; @@ -71,29 +77,23 @@ public class CommandService implements INetworkDispatch { public boolean callCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { - if (actor == null) { + if (actor == null) return false; - } - if (command == null) { + if (actor.getClient() == null) return false; - } - if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility()) && actor.getClient() != null) { + if (command == null) return false; - } - if (command.isDisabled()) { + if (command.getCharacterAbility().length() > 0 && !actor.hasAbility(command.getCharacterAbility())) return false; - } - if (actor.getClient() != null && command.getGodLevel() > actor.getPlayerObject().getGodLevel()) { + if (command.isDisabled()) return false; - } - if (actor.hasCooldown(command.getCooldownGroup()) || actor.hasCooldown(command.getCommandName())) { + if (actor.hasCooldown(command.getCooldownGroup()) || actor.hasCooldown(command.getCommandName())) return false; - } // Causes this service method to return with false after equipping a rifle, not allowing to unequip it anymore // because the client seems to consider rifles invalidweapons for an unkown reason @@ -687,19 +687,50 @@ public class CommandService implements INetworkDispatch { } public void processCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { + + if (command.getGodLevel() > 0 || command.getCommandName().equals("setgodmode")) { // TODO: When loading commands, simply don't put the "admin" characterAbility into the commands + String accessLevel = core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()); + + if(accessLevel != null) { + Scanner scanner; + try { + scanner = new Scanner(new File("accesslevels/" + accessLevel + ".txt")); + boolean levelHasCommand = false; + + while(scanner.hasNextLine()) { + String commandName = scanner.nextLine(); + if(command.getCommandName().equals(commandName)) { + levelHasCommand = true; + break; + } + } + + if (!levelHasCommand) { + actor.sendSystemMessage(" \\#FE2EF7 [GM] \\#FFFFFF " + command.getCommandName() + ": You do not have permission to use this command.", (byte) 0); + return; + } + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + if (command.getCooldown() > 0f) { actor.addCooldown(command.getCooldownGroup(), command.getCooldown()); } if (command instanceof CombatCommand) { processCombatCommand(actor, target, (CombatCommand) command, actionCounter, commandArgs); - } else { + } else if (FileUtilities.doesFileExist("scripts/commands/" + command.getCommandName().toLowerCase() + ".py")) { core.scriptService.callScript("scripts/commands/", command.getCommandName().toLowerCase(), "run", core, actor, target, commandArgs); } else if (FileUtilities.doesFileExist("scripts/commands/combat/" + command.getCommandName().toLowerCase() + ".py")) { core.scriptService.callScript("scripts/commands/combat/", command.getCommandName().toLowerCase(), "run", core, actor, target, commandArgs); } - } + + } public void processCommandForInstallation(InstallationObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) { diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 3d897d43..89fbf577 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -92,7 +92,7 @@ public class HousingService implements INetworkDispatch { public void enterStructureMode(CreatureObject actor, TangibleObject deed) { PlayerCity city = core.playerCityService.getCityObjectIsIn(actor); - if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor, actor.getWorldPosition().x, actor.getWorldPosition().z)) { + if (core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()) == null && !core.terrainService.canBuildAtPosition(actor, actor.getWorldPosition().x, actor.getWorldPosition().z)) { actor.sendSystemMessage("You may not place a structure here.", (byte) 0); // should probably load this from an stf return; } @@ -122,7 +122,7 @@ public class HousingService implements INetworkDispatch { return null; } - if(!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor, positionX, positionZ)) { + if(core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()) == (null) && !core.terrainService.canBuildAtPosition(actor, positionX, positionZ)) { actor.sendSystemMessage("You may not place a structure here.", (byte) 0); // should probably load this from an stf return null; } diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java new file mode 100644 index 00000000..018b2105 --- /dev/null +++ b/src/services/quest/QuestService.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services.quest; + +import java.util.Map; + +import protocol.swg.PlayMusicMessage; +import resources.common.OutOfBand; +import resources.common.ProsePackage; +import resources.datatables.DisplayType; +import resources.objects.creature.CreatureObject; +import resources.objects.player.PlayerObject; +import resources.quest.Quest; +import main.NGECore; +import engine.resources.service.INetworkDispatch; +import engine.resources.service.INetworkRemoteEvent; + +public class QuestService implements INetworkDispatch { + + @SuppressWarnings("unused") + private NGECore core; + + public QuestService(NGECore core) { + this.core = core; + } + + @Override + public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { + + } + + @Override + public void shutdown() { } + + public void beginQuest(String questName, CreatureObject questReciever) { + + } + + public void adminActivateQuest(CreatureObject creo, String questName) { + + PlayerObject ghost = creo.getPlayerObject(); + + if (ghost == null) + return; + + if (questName.endsWith(".qst")) + questName = questName.split(".qst")[0]; + + Quest quest = new Quest(questName, creo.getObjectID()); + + ProsePackage prose = new ProsePackage("@quest/ground/system_message:quest_received"); + + // Format for stf string if quest resides in multiple folders beyond base one + if (questName.contains("/")) { + String[] split = questName.split("/"); + questName = split[split.length - 1]; + } + + prose.setToCustomString("@quest/ground/" + questName + ":journal_entry_title"); + creo.sendSystemMessage(new OutOfBand(prose), DisplayType.Quest); + + PlayMusicMessage music = new PlayMusicMessage("sound/ui_npe2_quest_received.snd", creo.getObjectID(), 0, true); + creo.getClient().getSession().write(music.serialize()); + + ghost.getQuestJournal().add(quest); + ghost.setActiveQuest(quest.getName()); + + } +} diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 63622849..7b729f64 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -1111,7 +1111,7 @@ public class HarvesterService implements INetworkDispatch { public void enterStructurePlacementMode(CreatureObject actor, SWGObject object){ - if (!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ + if (core.adminService.getAccessLevelFromDB(actor.getClient().getAccountId()) == null && !core.terrainService.canBuildAtPosition(actor,actor.getPosition().x,actor.getPosition().z)){ actor.sendSystemMessage("@player_structure:not_permitted", (byte) 0); return; }