From ebdae1b2ad819c63e4737eb049359200617c9b86 Mon Sep 17 00:00:00 2001 From: Toontown Super <108632596+ToontownSuperForeverMVP@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:08:48 -0400 Subject: [PATCH] automation: add bot scripts, quest task autoers, and custom autoer shtiker page --- autoers/AutoerGui.py | 262 ++ autoers/BuildingAutoer.py | 464 ++ autoers/BuildingAutoerToontask.py | 411 ++ autoers/CEOMaxer.py | 839 ++++ autoers/CEOMaxerToontask.py | 759 ++++ autoers/CFOMaxer.py | 768 ++++ autoers/CFOMaxerToontask.py | 748 ++++ autoers/CJMaxer.py | 786 ++++ autoers/CJMaxerToontask.py | 785 ++++ autoers/GagTrainer15.py | 838 ++++ autoers/GagTrainer15Toontask.py | 776 ++++ autoers/GolfAutoer.py | 232 + autoers/RaceAutoer.py | 253 ++ autoers/Scripts/Building Autoer.txt | 109 + autoers/Scripts/CEO maxer.txt | 51 + autoers/Scripts/CFO maxer.txt | 43 + autoers/Scripts/CJ Maxer.txt | 40 + autoers/Scripts/Fish Autoer.txt | 39 + autoers/Scripts/Gag Trainer.txt | 179 + autoers/Scripts/Golf Autoer.txt | 60 + autoers/Scripts/Minigame Spammer.txt | 31 + autoers/Scripts/Race Autoer.txt | 79 + autoers/Scripts/VP maxer.txt | 60 + autoers/Task Autoer Sound Drop.py | 803 ++++ autoers/TaskAutoer full source.py | 3823 +++++++++++++++++ autoers/ToonBot.py | 602 +++ autoers/VPMaxer.py | 901 ++++ autoers/VPMaxerToontask.py | 783 ++++ tools/create_test_account.py | 131 + toontown/quest/AutoerManager.py | 263 ++ toontown/quest/TaskAutoer.py | 1203 ++++++ toontown/quest/task_autoer_globals.py | 11 + .../safezone/DistributedTTCCraneSandbox.py | 94 + .../safezone/DistributedTTCCraneSandboxAI.py | 66 + toontown/shtiker/AutoerPage.py | 131 + 35 files changed, 17423 insertions(+) create mode 100644 autoers/AutoerGui.py create mode 100644 autoers/BuildingAutoer.py create mode 100644 autoers/BuildingAutoerToontask.py create mode 100644 autoers/CEOMaxer.py create mode 100644 autoers/CEOMaxerToontask.py create mode 100644 autoers/CFOMaxer.py create mode 100644 autoers/CFOMaxerToontask.py create mode 100644 autoers/CJMaxer.py create mode 100644 autoers/CJMaxerToontask.py create mode 100644 autoers/GagTrainer15.py create mode 100644 autoers/GagTrainer15Toontask.py create mode 100644 autoers/GolfAutoer.py create mode 100644 autoers/RaceAutoer.py create mode 100644 autoers/Scripts/Building Autoer.txt create mode 100644 autoers/Scripts/CEO maxer.txt create mode 100644 autoers/Scripts/CFO maxer.txt create mode 100644 autoers/Scripts/CJ Maxer.txt create mode 100644 autoers/Scripts/Fish Autoer.txt create mode 100644 autoers/Scripts/Gag Trainer.txt create mode 100644 autoers/Scripts/Golf Autoer.txt create mode 100644 autoers/Scripts/Minigame Spammer.txt create mode 100644 autoers/Scripts/Race Autoer.txt create mode 100644 autoers/Scripts/VP maxer.txt create mode 100644 autoers/Task Autoer Sound Drop.py create mode 100644 autoers/TaskAutoer full source.py create mode 100644 autoers/ToonBot.py create mode 100644 autoers/VPMaxer.py create mode 100644 autoers/VPMaxerToontask.py create mode 100644 tools/create_test_account.py create mode 100644 toontown/quest/AutoerManager.py create mode 100644 toontown/quest/TaskAutoer.py create mode 100644 toontown/quest/task_autoer_globals.py create mode 100644 toontown/safezone/DistributedTTCCraneSandbox.py create mode 100644 toontown/safezone/DistributedTTCCraneSandboxAI.py create mode 100644 toontown/shtiker/AutoerPage.py diff --git a/autoers/AutoerGui.py b/autoers/AutoerGui.py new file mode 100644 index 0000000..ec356d3 --- /dev/null +++ b/autoers/AutoerGui.py @@ -0,0 +1,262 @@ +import time as timeModule +import datetime + +class Ticker: + def __init__(self,logName): + self.line=[] + self.display=[] + self.lineNum=0 + self.lastMessages=['',''] + self.bottemDisplayNum=0 + self.isScrolled=False + self.logName=logName + for i in range(9): + self.display.append("") + self.lines=[] + for i in range(11,20,1): + self.lines.append(OnscreenText(text='', style=1, fg=(1,1,1,1), pos=(-.81,i/20.0,0), scale=.04, align=TextNode.ALeft)) + + def newLine(self,text): + runTime=[] + for item in timeModule.localtime(): + runTime.append(item) + for i in range(3,6,1): + if len(str(runTime[i]))==1: + runTime[i]='0'+str(runTime[i]) + else: + runTime[i]=str(runTime[i]) + text='::'+runTime[3]+':'+runTime[4]+':'+runTime[5]+' - '+self.logName+': '+text + self.line.append(text) + self.lineNum+=1 + + if not self.isScrolled: + self.bottemDisplayNum=self.lineNum + self.tick() + self.printDisplay() + + else: + self.scrollDown() + + def showLines(self): + for line in self.lines: + line.show() + + def hideLines(self): + for line in self.lines: + line.hide() + + def tick(self): + for i in range(8,0,-1): + self.display[i]=self.display[i-1] + self.display[0]=self.line[-1] + + def printDisplay(self): + i=8 + for line in reversed(self.display): + self.lines[i].setText(line) + i-=1 + + def scrollUp(self): + original=self.bottemDisplayNum + if self.isScrolled: + option=1 + self.bottemDisplayNum-=1 + else: + option=2 + self.bottemDisplayNum=self.lineNum-1 + self.isScrolled=True + + if self.bottemDisplayNum-9>-1: + for i in range(1,9): + self.display[i-1]=self.display[i] + self.display[8]=self.line[self.bottemDisplayNum-9] + else: + self.bottemDisplayNum=original + if option==2: + self.isScrolled=False + self.printDisplay() + + def scrollDown(self): + if self.isScrolled: + if self.bottemDisplayNum+1==self.lineNum: + self.isScrolled=False + + self.bottemDisplayNum+=1 + for i in range(8,0,-1): + self.display[i]=self.display[i-1] + self.display[0]=self.line[self.bottemDisplayNum-1] + self.printDisplay() + + def checkLine(self,line): + letterInLine=False + for letter in line: + if letter!=" ": + letterInLine=True + break + return letterInLine + + def destroy(self): + for line in self.lines: + line.destroy() + del self.line + +class AutoerGui: + def __init__(self,logName,catagories,statsMethods,title,icon): + self.startTime=None + self.catagories=catagories[:] + self.statsMethods=statsMethods[:] + self.panel=[] + self.formattedTime=str(datetime.timedelta(seconds=0)) + for i in range(3): + self.panel.append(guiTools.loadImageAsPlane('phase_12/maps/WallBricksBig2.jpg',170,170)) + self.panel[i].reparentTo(aspect2d) + self.panel[0].setPos(0,0,.77) + self.panel[1].setPos(.566,0,.77) + self.panel[2].setPos(-.566,0,.77) + + self.overLay=guiTools.loadImageAsPlane('phase_11/maps/lawbotHQ_palette_2tmla_1.jpg',510,170) + self.overLay.reparentTo(aspect2d) + self.overLay.setPos(0,0,.77) + self.overLay.setTransparency(TransparencyAttrib.MAlpha) + self.overLay.setAlphaScale(0.6) + + self.sides=[] + self.corner=[] + for i in range(2): + self.corner.append(guiTools.loadImageAsPlane("phase_9/maps/CeilingMetalPlate2.jpg",20,20)) + self.corner[i].reparentTo(aspect2d) + self.corner[0].setPos(-.85,0,.504) + self.corner[1].setPos(.147,0,.504) + for i in range(4): + self.sides.append(guiTools.loadImageAsPlane("phase_7/maps/screwsBar.jpg",140,20)) + self.sides[i].reparentTo(aspect2d) + self.sides[0].setHpr(0,0,90) + self.sides[0].setPos(.147,0,.77) + self.sides[1].setHpr(0,0,270) + self.sides[1].setPos(-.85,0,.77) + self.sides[2].setPos(-.586,0,.504) + self.sides[3].setPos(-.119,0,.504) + + self.frame=guiTools.loadImageAsPlane('phase_5/maps/tt_t_gui_cmg_miniMap_frame.jpg',220,159) + self.frame.reparentTo(aspect2d) + self.frame.setTransparency(TransparencyAttrib.MBinary, 1) + self.frame.setPos(.547,0,.735) + if icon!=None: + if icon.lower()=='boss': + icon='CorpIcon' + elif icon.lower()=='sell': + icon='SalesIcon' + elif icon.lower()=='law': + icon='LegalIcon' + elif icon.lower()=='cash': + icon='MoneyIcon' + cogLogoModel=loader.loadModel('phase_3/models/gui/cog_icons.bam') + self.cogLogo=cogLogoModel.find('**/'+icon) + self.cogLogo.reparentTo(aspect2d) + self.cogLogo.setScale(0.15) + self.cogLogo.setPos(.76,0,.88) + + self.display=Ticker(logName) + + textList=[catagories[0]+': N/A',catagories[1]+': N/A',catagories[2]+': N/A', catagories[3]+': N/A', catagories[4]+': N/A'] + + posList=[.77,.72,.67,.62,.57] + self.text=[] + for i in range(5): + self.text.append(OnscreenText(text=textList[i], style=1, fg=(1,1,1,1), pos=(.27,posList[i],0), scale=.05, align=TextNode.ALeft)) + self.title=OnscreenText(text='\x01shadow\x01'+title+'\x02', style=1, fg=(1,1,1,1), pos=(.26,.85,0), scale=.1, align=TextNode.ALeft) + self.buttons=[] + self.buttons.append(guiTools.createButton(self.display.scrollUp,(.15,0,.85),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr'])) + self.buttons.append(guiTools.createButton(self.display.scrollDown,(.15,0,.68),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr'])) + + self.buttons[0].setHpr(0,0,270) + self.buttons[1].setHpr(0,0,90) + base.accept('wheel_up',self.display.scrollUp) + base.accept('wheel_down',self.display.scrollDown) + + def startTimer(self): + self.formattedTime=str(datetime.timedelta(seconds=0)) + self.startTime=time.time() + self.display.newLine('Started') + taskMgr.add(self.updateAllText,'Autogui Clock') + + def stopTimer(self): + taskMgr.remove('Autogui Clock') + + def updateAllText(self,task): + if self.startTime: + self.formattedTime=str(datetime.timedelta(seconds=round(time.time()-self.startTime))) + + self.text[0].setText(self.catagories[0]+': '+eval(self.statsMethods[0])) + self.text[1].setText(self.catagories[1]+': '+eval(self.statsMethods[1])) + self.text[2].setText(self.catagories[2]+': '+eval(self.statsMethods[2])) + self.text[3].setText(self.catagories[3]+': '+eval(self.statsMethods[3])) + self.text[4].setText(self.catagories[4]+': '+eval(self.statsMethods[4])) + return task.cont + + def workOutNumberAnHour(self,number): + if round(time.time()-self.startTime)==0: + return 0 + else: + return int((number/(time.time()-self.startTime))*3600) + + def hideAll(self): + for panel in self.panel: + panel.hide() + for side in self.sides: + side.hide() + for corner in self.corner: + corner.hide() + for text in self.text: + text.hide() + for button in self.buttons: + button.hide() + self.title.hide() + self.frame.hide() + self.overLay.hide() + try:self.cogLogo.hide() + except:pass + self.display.hideLines() + base.ignore('wheel_up') + base.ignore('wheel_down') + + def showAll(self): + for panel in self.panel: + panel.show() + for side in self.sides: + side.show() + for corner in self.corner: + corner.show() + for text in self.text: + text.show() + for button in self.buttons: + button.show() + self.title.show() + self.frame.show() + self.overLay.show() + try:self.cogLogo.show() + except:pass + self.display.showLines() + base.accept('wheel_up',self.display.scrollUp) + base.accept('wheel_down',self.display.scrollDown) + + def destroy(self): + for panel in self.panel: + panel.removeNode() + for side in self.sides: + side.removeNode() + for corner in self.corner: + corner.removeNode() + for text in self.text: + text.removeNode() + for button in self.buttons: + button.removeNode() + self.title.removeNode() + self.frame.removeNode() + self.overLay.removeNode() + try:self.cogLogo.removeNode() + except:pass + self.display.destroy() + base.ignore('wheel_up') + base.ignore('wheel_down') + del self.display \ No newline at end of file diff --git a/autoers/BuildingAutoer.py b/autoers/BuildingAutoer.py new file mode 100644 index 0000000..2c4b7b3 --- /dev/null +++ b/autoers/BuildingAutoer.py @@ -0,0 +1,464 @@ +from toontown.town import Street +from toontown.toon import HealthForceAcknowledge +from toontown.safezone import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.battle import DistributedBattleBldg +from toontown.building import SuitInterior +from toontown.building import DistributedBuilding +from toontown.building import DistributedElevatorExt +from toontown.building import DistributedSuitInterior +from direct.interval.IntervalGlobal import * + +ToontownBattleGlobals.SkipMovie=1 + +faceOffHook = lambda self, ts, name, callback:self._DistributedBattleBldg__handleFaceOffDone() +DistributedBattleBldg.DistributedBattleBldg._DistributedBattleBldg__faceOff = faceOffHook + +class BuildingAutoer: + oldTeleportInPlayground=Playground.Playground.exitTeleportIn + oldTeleportInStreet=Street.Street.exitTeleportIn + + oldExitBecomingToon=DistributedBuilding.DistributedBuilding.exitBecomingToon + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldEnterElevator=DistributedSuitInterior.DistributedSuitInterior.enterElevator + oldEnterFloorReward=DistributedBattleBldg.DistributedBattleBldg.enterReward + oldEnterBuildingReward=DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward + + def __init__(self): + Street.Street.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInStreet(newSelf,*args,**kwds) + Playground.Playground.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInPlayground(newSelf,*args,**kwds) + + DistributedBuilding.DistributedBuilding.exitBecomingToon=lambda newSelf: self.newExitBecomingToon(newSelf) + DistributedSuitInterior.DistributedSuitInterior.enterElevator=lambda newSelf,*args: self.newEnterElevator(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterReward=lambda newSelf,*args: self.newEnterFloorReward(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=lambda newSelf,*args: self.newEnterBuildingReward(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + self.attackSeq=Sequence(Func(self.attack),Wait(1),Func(self.restock),Wait(1)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + self.shouldChangeDistrict=False + self.shouldChangeStreet=True + self.shouldChangeHood=True + self.shouldContinue=False + self.shouldStop=False + self.findDistrictIds() + self.buildingLevel=1 + self.buildingType='' + self.foundElevator=False + self.bldgCount=0 + self.hoods=['1','3','4','5','9'] + self.lastElevators=None + self.killElevators=[] + + self.firstTrack=0 + self.secondTrack=4 + self.thirdTrack=2 + + desiredInv="" + desiredLevel1=5 + desiredLevel2=5 + desiredLevel3=4 + + self.gagshop_zoneId = 4503 + self.autoerGui=AutoerGui('Bldg Autoer',['Run Time',"Number of Bldgs","Bldg's/Hour",'Type','Story'],\ + ['self.formattedTime',\ + 'str(buildingAutoer.bldgCount)',\ + 'str(self.workOutNumberAnHour(buildingAutoer.bldgCount))'\ + ,'buildingAutoer.getBuildingType()'\ + ,'str(buildingAutoer.getBuildingLevel())+"+"'],\ + 'BLDG AUTOER',None) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + self.autoerGui.display.newLine('Tp failed, trying again') + if self.shouldContinue: + Sequence(Wait(2),Func(self.teleportBackToStreet)).start() + except: + pass + + def createInventory(self): + desiredInv="" + for i in range(7*7): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + desiredInv+="\x02" + elif self.desiredLevel1>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + desiredInv+="\x02" + elif self.desiredLevel2>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3) and base.localAvatar.getTrackAccess()[self.thirdTrack]: + if self.thirdTrack==1: + desiredInv+="\x02" + elif self.desiredLevel3>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + else: + desiredInv+="\x00" + self.desiredInv=desiredInv + + def teleportBackToStreet(self): + self.foundElevator=False + self.walk() + for treasure in base.cr.doFindAll('Treasure'): + treasure.sendUpdate('requestGrab') + base.cr.playGame.getPlace().requestTeleport(round(self.startId,-3),self.startId,None,None) + + def findBuilding(self): + self.checkStop() + + if self.shouldContinue: + for elevator in base.cr.doFindAllInstances(DistributedElevatorExt.DistributedElevatorExt): + if 'sbfo' not in str(elevator.getElevatorModel()) and 'waitEmpty' in str(elevator.fsm) and elevator.bldg.numFloors>=self.buildingLevel and self.buildingType in str(elevator.getElevatorModel()) and elevator.doId not in self.killElevators: + self.walk() + elevator.sendUpdate('requestBoard') + self.lastElevator=elevator.doId + self.autoerGui.display.newLine('Entering Building') + self.foundElevator=True + return + self.nextZone() + + def newTeleportInStreet(self,newSelf,*args,**kwds): + self.oldTeleportInStreet(newSelf,*args,**kwds) + self.checkStop() + + if self.shouldContinue: + self.autoerGui.display.newLine('Searching for building') + Sequence(Wait(2),Func(self.findBuilding)).start() + + def newTeleportInPlayground(self,newSelf,*args,**kwds): + self.oldTeleportInPlayground(newSelf,*args,**kwds) + self.checkStop() + + if self.shouldContinue: + self.autoerGui.display.newLine('Died - Tping back') + self.killElevators.append(self.lastElevator) + Sequence(Wait(2),Func(self.teleportBackToStreet)).start() + + def newExitBecomingToon(self,newSelf): + self.oldExitBecomingToon(newSelf) + self.checkStop() + + if self.shouldContinue and not self.foundElevator: + self.autoerGui.display.newLine('Searching for building') + self.findBuilding() + + def newEnterFloorReward(self,newSelf,*args): + self.oldEnterFloorReward(newSelf,*args) + if self.shouldContinue: + self.autoerGui.display.newLine('Finished Battle') + Sequence(Wait(7),Func(self.boardElevator)).start() + + def boardElevator(self): + if self.shouldContinue and base.cr.doFind('Elevator'): + base.cr.doFind('Elevator').sendUpdate('requestBoard') + self.autoerGui.display.newLine('Next Floor...') + Sequence(Wait(2),Func(base.cr.doFind('Elevator').sendUpdate,'requestExit'),Wait(0.5),Func(base.cr.doFind('Elevator').sendUpdate,'requestBoard')).start() + + def newEnterBuildingReward(self,newSelf,*args): + self.oldEnterBuildingReward(newSelf,*args) + if self.shouldContinue: + newSelf._DistributedBattleBldg__handleBuildingRewardDone() + self.autoerGui.display.newLine('Finished Building') + self.foundElevator=False + self.bldgCount+=1 + + def newEnterElevator(self,newSelf,*args): + self.oldEnterElevator(newSelf,*args) + if self.shouldContinue: + newSelf.sendUpdate('elevatorDone', []) + for x in base.cr.doFindAll('DistributedCogdoInterior'): + x.sendUpdate('elevatorDone', []) + self.autoerGui.display.newLine('Skipping Elevator') + + def checkStop(self): + if self.shouldStop: + self.shouldContinue=False + self.shouldStop=False + self.attackSeq.finish() + self.invisibleSeq.finish() + self.autoerGui.display.newLine('Stopped') + + def findDistrictIds(self): + self.shardIds=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + self.shardIds.append(shard) + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + except KeyError: + if self.shouldChangeStreet: + self.newStreet() + else: + base.cr.playGame.getPlace().enterZone(self.startId) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + + def checkWhatToDo(self): + if hasattr(base.cr.playGame.getPlace(),'enterZone'): + self.workOutStreetId() + self.findBuilding() + else: + base.localAvatar.setSystemMessage(0,'The building auto needs to be started on a street') + + def newDistrict(self): + if self.shardIds[0] == base.localAvatar.defaultShard: + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(),-3),self.startId,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + self.autoerGui.display.newLine('Tping to new district') + + def newStreet(self): + todo='street' + if self.startId<9000: + if int(str(self.startId)[1:])>300: + if self.shouldChangeDistrict: + self.startId-=200 + todo='district' + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=200 + else: + self.startId+=100 + elif int(str(self.startId)[1:])>200: + if self.shouldChangeDistrict: + self.startId-=100 + todo='district' + + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=100 + else: + self.startId+=100 + + if todo=='district': + self.newDistrict() + elif todo=='hood': + self.newHood() + else: + self.teleportBackToStreet() + self.autoerGui.display.newLine('TPing to a new Street') + + def newHood(self): + self.startId=int(self.hoods[0]+'101') + self.hoods.append(self.hoods[0]) + del self.hoods[0] + self.autoerGui.display.newLine('Changing hood') + self.teleportBackToStreet() + + def workOutStreetId(self): + zoneId=base.localAvatar.getZoneId() + self.startId=int(str(zoneId)[:2]+'01') + self.autoerGui.display.newLine('Street Zone: '+str(self.startId)) + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + for clerk in base.cr.doFindAll('Clerk'): + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + self.desiredLevel1=base.localAvatar.experience.getExpLevel(self.firstTrack) + if self.desiredLevel1 in [1,3,5]: + self.desiredLevel1-=1 + self.desiredLevel2=base.localAvatar.experience.getExpLevel(self.secondTrack) + self.desiredLevel3=base.localAvatar.experience.getExpLevel(self.thirdTrack) + if self.desiredLevel1>5: + self.desiredLevel1=4 + if self.desiredLevel2>5: + self.desiredLevel2=5 + if self.desiredLevel3>5: + self.desiredLevel3=5 + self.createInventory() + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or (base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2 and base.localAvatar.getTrackAccess()[self.thirdTrack]): + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.getTrackAccess()[2]: + if base.localAvatar.inventory.inventory[2][self.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [2, self.desiredLevel3, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9): + + if base.localAvatar.inventory.inventory[0][self.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [0, self.desiredLevel1, base.localAvatar.doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + else: + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + except: + pass + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def setLawbot(self): + self.buildingType='legal' + + def setSellbot(self): + self.buildingType='sales' + + def setCashbot(self): + self.buildingType='money' + + def setBossbot(self): + self.buildingType='corp' + + def setLevel1(self): + self.buildingLevel=1 + + def setLevel2(self): + self.buildingLevel=2 + + def setLevel3(self): + self.buildingLevel=3 + + def setLevel4(self): + self.buildingLevel=4 + + def setLevel5(self): + self.buildingLevel=5 + + def setAll(self): + self.buildingType='' + + def changeDistrict(self): + self.shouldChangeDistrict=True + base.localAvatar.setSystemMessage(0,'Building Autoer set to change district if no buildings are found') + + def noChangeDistrict(self): + self.shouldChangeDistrict=False + base.localAvatar.setSystemMessage(0,'Building Autoer set not to change district if no buildings are found') + + def changeStreet(self): + self.shouldChangeStreet=True + base.localAvatar.setSystemMessage(0,'Building Autoer set to change street if no buildings are found') + + def noChangeStreet(self): + self.shouldChangeStreet=False + base.localAvatar.setSystemMessage(0,'Building Autoer set not to change street if no buildings are found') + + def changeHood(self): + self.shouldChangeHood=True + base.localAvatar.setSystemMessage(0,'Building Autoer set to change hood if no buildings are found') + + def noChangeHood(self): + self.shouldChangeHood=False + base.localAvatar.setSystemMessage(0,'Building Autoer set not to change street if no buildings are found') + + def getBuildingType(self): + if self.buildingType=='legal': + return 'Lawbot' + elif self.buildingType=='sales': + return 'Sellbot' + elif self.buildingType=='money': + return 'Cashbot' + elif self.buildingType=='corp': + return 'Bossbot' + else: + return 'All' + + def getBuildingLevel(self): + return self.buildingLevel + + def start(self): + self.shouldContinue=True + self.bldgCount=0 + self.shouldStop=False + self.autoerGui.startTimer() + self.attackSeq.loop() + self.invisibleSeq.loop() + self.checkWhatToDo() + + def stop(self): + self.shouldStop=True + self.autoerGui.stopTimer() + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + + def revert(self): + Playground.Playground.exitTeleportIn=self.oldTeleportInPlayground + Street.Street.exitTeleportIn=self.oldTeleportInStreet + + DistributedBuilding.DistributedBuilding.exitBecomingToon=self.oldExitBecomingToon + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedSuitInterior.DistributedSuitInterior.enterElevator=self.oldEnterElevator + DistributedBattleBldg.DistributedBattleBldg.enterReward=self.oldEnterFloorReward + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=self.oldEnterBuildingReward + self.autoerGui.destroy() + ToontownBattleGlobals.SkipMovie=0 + self.attackSeq.finish() + +buildingAutoer=BuildingAutoer() \ No newline at end of file diff --git a/autoers/BuildingAutoerToontask.py b/autoers/BuildingAutoerToontask.py new file mode 100644 index 0000000..64f06ad --- /dev/null +++ b/autoers/BuildingAutoerToontask.py @@ -0,0 +1,411 @@ +from toontown.town import Street +from toontown.toon import HealthForceAcknowledge +from toontown.safezone import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.battle import DistributedBattleBldg +from toontown.building import SuitInterior +from toontown.building import DistributedBuilding +from toontown.building import DistributedElevatorExt +from toontown.building import DistributedSuitInterior +from direct.interval.IntervalGlobal import * + +ToontownBattleGlobals.SkipMovie=1 + +faceOffHook = lambda self, ts, name, callback:self._DistributedBattleBldg__handleFaceOffDone() +DistributedBattleBldg.DistributedBattleBldg._DistributedBattleBldg__faceOff = faceOffHook + +class BuildingAutoer: + oldTeleportInStreet=Street.Street.exitTeleportIn + + oldExitBecomingToon=DistributedBuilding.DistributedBuilding.exitBecomingToon + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldEnterElevator=DistributedSuitInterior.DistributedSuitInterior.enterElevator + oldEnterFloorReward=DistributedBattleBldg.DistributedBattleBldg.enterReward + oldEnterBuildingReward=DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward + + def __init__(self): + Street.Street.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInStreet(newSelf,*args,**kwds) + + DistributedBuilding.DistributedBuilding.exitBecomingToon=lambda newSelf: self.newExitBecomingToon(newSelf) + DistributedSuitInterior.DistributedSuitInterior.enterElevator=lambda newSelf,*args: self.newEnterElevator(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterReward=lambda newSelf,*args: self.newEnterFloorReward(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=lambda newSelf,*args: self.newEnterBuildingReward(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + self.attackSeq=Sequence(Func(self.attack),Wait(1),Func(self.restock),Wait(1)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + self.shouldChangeDistrict=True + self.shouldChangeStreet=True + self.shouldChangeHood=False + self.shouldContinue=False + self.shouldStop=False + self.findDistrictIds() + self.buildingLevel=1 + self.buildingType='' + self.foundElevator=False + self.bldgCount=0 + self.hoods=['1','3','4','5','9'] + self.lastElevator=None + self.killElevators=[] + self.gagshop_zoneId = 4503 + self.firstTrack=0 + self.secondTrack=4 + self.thirdTrack=2 + + self.desiredLevel1=4 + self.desiredLevel2=5 + self.desiredLevel3=5 + + + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.teleportBackToStreet)).start() + except: + pass + + def createInventory(self): + desiredInv="" + for i in range(7*7): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + desiredInv+="\x02" + elif self.desiredLevel1>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + desiredInv+="\x02" + elif self.desiredLevel2>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3) and base.localAvatar.getTrackAccess()[self.thirdTrack]: + if self.thirdTrack==1: + desiredInv+="\x02" + elif self.desiredLevel3>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + else: + desiredInv+="\x00" + self.desiredInv=desiredInv + + def clearSettings(self): + self.buildingType='' + self.numFloors=1 + + def teleportBackToStreet(self): + print('Teleporting back') + self.foundElevator=False + self.walk() + for treasure in base.cr.doFindAll('Treasure'): + treasure.sendUpdate('requestGrab') + base.cr.playGame.getPlace().requestTeleport(round(self.startId,-3),self.startId,None,None) + + def findBuilding(self): + self.checkStop() + + if self.shouldContinue: + for elevator in base.cr.doFindAllInstances(DistributedElevatorExt.DistributedElevatorExt): + if 'sbfo' not in str(elevator.getElevatorModel()) and 'waitEmpty' in str(elevator.fsm) and elevator.bldg.numFloors>=self.numFloors and self.buildingType in str(elevator.getElevatorModel()) and elevator.doId not in self.killElevators: + self.walk() + elevator.sendUpdate('requestBoard') + self.lastElevator=elevator.doId + self.foundElevator=True + return + self.nextZone() + + def newTeleportInStreet(self,newSelf,*args,**kwds): + self.oldTeleportInStreet(newSelf,*args,**kwds) + self.checkStop() + + if self.shouldContinue: + Sequence(Wait(2),Func(self.findBuilding)).start() + + def newExitBecomingToon(self,newSelf): + self.oldExitBecomingToon(newSelf) + self.checkStop() + + if self.shouldContinue and not self.foundElevator: + if not taskAutoer.isQuestComplete(): + Sequence(Wait(1),Func(self.findBuilding)).start() + else: + self.stop() + taskAutoer.checkWhatToDo() + + def newEnterFloorReward(self,newSelf,*args): + self.oldEnterFloorReward(newSelf,*args) + if self.shouldContinue: + Sequence(Wait(7),Func(self.boardElevator)).start() + + def boardElevator(self): + if self.shouldContinue and base.cr.doFind('Elevator'): + base.cr.doFind('Elevator').sendUpdate('requestBoard') + Sequence(Wait(2),Func(base.cr.doFind('Elevator').sendUpdate,'requestExit'),Wait(0.5),Func(base.cr.doFind('Elevator').sendUpdate,'requestBoard')).start() + + def newEnterBuildingReward(self,newSelf,*args): + self.oldEnterBuildingReward(newSelf,*args) + if self.shouldContinue: + newSelf._DistributedBattleBldg__handleBuildingRewardDone() + self.foundElevator=False + self.bldgCount+=1 + + def newEnterElevator(self,newSelf,*args): + self.oldEnterElevator(newSelf,*args) + if self.shouldContinue: + newSelf.sendUpdate('elevatorDone', []) + for x in base.cr.doFindAll('DistributedCogdoInterior'): + x.sendUpdate('elevatorDone', []) + + def checkStop(self): + if self.shouldStop: + self.shouldContinue=False + self.shouldStop=False + self.attackSeq.finish() + self.invisibleSeq.finish() + + def findDistrictIds(self): + self.shardIds=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<50: + self.shardIds.append(shard) + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + except KeyError: + if self.shouldChangeStreet: + self.newStreet() + else: + base.cr.playGame.getPlace().enterZone(self.startId) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + + def checkWhatToDo(self): + if hasattr(base.cr.playGame.getPlace(),'enterZone') and round(base.localAvatar.getZoneId(),-2)==round(self.startId,-2): + self.findBuilding() + + else: + if self.startId!=0: + self.teleportBackToStreet() + else: + base.localAvatar.setSystemMessage(0,'The building auto needs to be started on a street') + + def newDistrict(self): + if self.shardIds[0] == base.localAvatar.defaultShard: + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(),-3),self.startId,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def newStreet(self): + todo='street' + + if self.startId<9000: + if int(str(self.startId)[1:])>300: + if self.shouldChangeDistrict: + self.startId-=200 + todo='district' + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=200 + else: + self.startId+=100 + + elif int(str(self.startId)[1:])>200: + if self.shouldChangeDistrict: + self.startId-=100 + todo='district' + + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=100 + else: + self.startId+=100 + + if todo=='district': + self.newDistrict() + elif todo=='hood': + Sequence(Wait(3),Func(self.newHood)).start() + else: + self.teleportBackToStreet() + + def newHood(self): + if self.hoods[0] == str(base.localAvatar.getZoneId())[0]: + self.hoods.append(self.hoods[0]) + del self.hoods[0] + + self.startId=int(self.hoods[0]+'102') + self.teleportBackToStreet() + + def setLocation(self,zoneId): + self.startId=int(str(zoneId)[0]+'102') + + def setNumFloors(self,numFloors): + self.numFloors=numFloors + + def setBuildingType(self,type): + if type=='l': + type='legal' + elif type=='s': + type='sales' + elif type=='m': + type='money' + elif type=='c': + type='corp' + self.buildingType=type + + def workOutStreetId(self): + zoneId=base.localAvatar.getZoneId() + self.startId=int(str(zoneId)[:2]+'01') + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + for clerk in base.cr.doFindAll('Clerk'): + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + try: + base.cr.bankManager.d_transferMoney(money - maxMoney) + except AttributeError: + pass + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + self.desiredLevel1=base.localAvatar.experience.getExpLevel(self.firstTrack) + if self.desiredLevel1 in [1,3,5]: + self.desiredLevel1-=1 + self.desiredLevel2=base.localAvatar.experience.getExpLevel(self.secondTrack) + self.desiredLevel3=base.localAvatar.experience.getExpLevel(self.thirdTrack) + if self.desiredLevel1>5: + self.desiredLevel1=4 + if self.desiredLevel2>5: + self.desiredLevel2=5 + if self.desiredLevel3>5: + self.desiredLevel3=5 + self.createInventory() + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or (base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2 and base.localAvatar.getTrackAccess()[self.thirdTrack]): + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.getTrackAccess()[2]: + if base.localAvatar.inventory.inventory[2][self.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [2, self.desiredLevel3, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9): + + if base.localAvatar.inventory.inventory[0][self.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [0, self.desiredLevel1, base.localAvatar.doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + else: + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + except: + pass + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def getBuildingType(self): + if self.buildingType=='legal': + return 'Lawbot' + elif self.buildingType=='sales': + return 'Sellbot' + elif self.buildingType=='money': + return 'Cashbot' + elif self.buildingType=='corp': + return 'Bossbot' + else: + return 'All' + + def getBuildingLevel(self): + return self.buildingLevel + + def start(self): + print('starting') + self.shouldContinue=True + self.shouldStop=False + self.createInventory() + self.attackSeq.loop() + self.invisibleSeq.loop() + self.checkWhatToDo() + + def stop(self): + self.shouldContinue=False + self.shouldStop=False + self.attackSeq.finish() + self.invisibleSeq.finish() + + def revert(self): + Street.Street.exitTeleportIn=self.oldTeleportInStreet + + DistributedBuilding.DistributedBuilding.exitBecomingToon=self.oldExitBecomingToon + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedSuitInterior.DistributedSuitInterior.enterElevator=self.oldEnterElevator + DistributedBattleBldg.DistributedBattleBldg.enterReward=self.oldEnterFloorReward + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=self.oldEnterBuildingReward + ToontownBattleGlobals.SkipMovie=0 + self.attackSeq.finish() \ No newline at end of file diff --git a/autoers/CEOMaxer.py b/autoers/CEOMaxer.py new file mode 100644 index 0000000..f7dfd10 --- /dev/null +++ b/autoers/CEOMaxer.py @@ -0,0 +1,839 @@ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.battle import DistributedBattle +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.coghq import DistributedCountryClubBattle +from toontown.coghq import DistributedCountryClub +from toontown.coghq import DistributedGolfGreenGame +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import BossbotHQExterior +from toontown.coghq import CashbotHQExterior +from toontown.coghq import CountryClubInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit.DistributedSuit import DistributedSuit +from toontown.suit import DistributedBossbotBoss +from toontown.safezone import DDPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=lambda self: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedCountryClubBattle.DistributedCountryClubBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldTrolleyInit = DistributedTrolley.DistributedTrolley.__init__ +oldPartyInit = DistributedPartyGate.DistributedPartyGate.__init__ +oldDoorInit = DistributedDoor.DistributedDoor.__init__ + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + ceoMaxer.countryClubAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, 5, None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, 5, None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + ceoMaxer.countryClubAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, 4, event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDockEnterTeleportIn=DDPlayground.DDPlayground.enterTeleportIn + oldBossEnterWalk=BossbotHQExterior.BossbotHQExterior.enterWalk + oldCashEnterWalk=CashbotHQExterior.CashbotHQExterior.enterWalk + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + oldNpcFreeAvatar=DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.limit10=True + self.onlyClub=False + self.isHealing=False + self.canSetParentAgain=True + self.numberToSuit={0:'Flunky',1:'Pencil Pusher',2:'Yesman',3:'Micromanager', + 4:'Downsizer',5:'Head Hunter',6:'Corporate Raider',7:'The Big Cheese'} + DDPlayground.DDPlayground.enterTeleportIn=lambda newSelf,*args:self.newDockEnterTeleportIn(newSelf,*args) + BossbotHQExterior.BossbotHQExterior.enterWalk=lambda newSelf,*args: self.newBossEnterWalk(newSelf,*args) + CashbotHQExterior.CashbotHQExterior.enterWalk=lambda newSelf,*args: self.newCashEnterWalk(newSelf,*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=lambda *args: None + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.inventory.inventory[ceoMaxer.restock.firstTrack][ceoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.firstTrack, ceoMaxer.restock.desiredLevel1, battle.suits[0].doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.secondTrack][ceoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.secondTrack, ceoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDockEnterTeleportIn(self,newSelf,*args): + self.oldDockEnterTeleportIn(newSelf,*args) + if self.shouldContinue: + ceoMaxer.countryClubAutoer.gainLaffSeq.finish() + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.checkStocks)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkStocks)).start() + except: + pass + + def newCashEnterWalk(self,newSelf,*args): + self.oldCashEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + ceoMaxer.countryClubAutoer.attackSeq.loop() + self.enterRandomBattle() + + def newBossEnterWalk(self,newSelf,*args): + self.oldBossEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + self.checkStocks() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>105: + self.isHealing=False + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + self.enterRandomBattle() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and self.lastCogId==args[0].doId: + self.enterRandomBattle() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(1),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def checkStocks(self): + if self.onlyClub: + base.localAvatar.cogMerits[0]=-4000 + if self.limit10 and self.bossCount>9: + self.shouldContinue=False + if self.shouldEnd: + self.shouldContinue=False + if self.haveJb(): + if self.shouldContinue: + if self.getStocksLeft()==0 and not self.onlyClub: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + ceoMaxer.ceoAutoer.start() + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + ceoMaxer.autoerGui.display.newLine('Teleporting to bossbot hq') + self.teleBack() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + if base.localAvatar.getHp()>105: + ceoMaxer.countryClubAutoer.start() + else: + self.isHealing=True + ceoMaxer.autoerGui.display.newLine('Gaining laff back') + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + if base.localAvatar.getHp()>105: + ceoMaxer.autoerGui.display.newLine('Teleporting to bossbot hq') + self.walk() + self.teleBack() + else: + self.isHealing=True + ceoMaxer.autoerGui.display.newLine('Gaining laff back') + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(ceoMaxer.restock.interest1) + base.cr.removeInterest(ceoMaxer.restock.interest2) + ceoMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's ceo maxer") + ceoMaxer.autoerGui.display.newLine('Stopped') + else: + ceoMaxer.autoerGui.display.newLine('Out of jellybeans') + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getStocksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,0)-base.localAvatar.cogMerits[0] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=10000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoClub(self): + self.onlyClub=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to only do the Country Club') + + def doBoth(self): + self.onlyClub=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to do both the Country Club and the CEO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.lastCogId=battle.doId + else: + pass + + def limiterOn(self): + self.limit10=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to be limited to only 10 CEOs') + + def limiterOff(self): + self.limit10=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to unlimited number of CEOs') + + def setStop(self): + self.shouldEnd=True + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + ceoMaxer.autoerGui.stopTimer() + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + ceoMaxer.autoerGui.startTimer() + emptyShardList=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + emptyShardList.append(shard) + if emptyShardList==[]: + emptyShardList=[650000000, 754000000, 608000000, 756000000, 658000000, 712000000, 360000000, 410000000, 620000000, 454000000, 726000000, 362000000, 688000000, 316000000] + if base.localAvatar.defaultShard not in emptyShardList: + ceoMaxer.autoerGui.display.newLine('TPing to an empty district') + base.cr.playGame.getPlace().requestTeleport(10000,10000,random.choice(emptyShardList),None) + else: + self.checkStocks() + ceoMaxer.restock.noToons.loop() + + def revertFunctions(self): + DDPlayground.DDPlayground.enterTeleportIn=self.oldDockEnterTeleportIn + BossbotHQExterior.BossbotHQExterior.enterWalk=self.oldBossEnterWalk + CashbotHQExterior.CashbotHQExterior.enterWalk=self.oldCashEnterWalk + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=self.oldNpcFreeAvatar + +class CeoAutoer: + oldBossEnterElevator=DistributedBossbotBoss.DistributedBossbotBoss.enterElevator + oldEnterBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo + oldEnterBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour + oldEnterPrepareBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree + oldEnterPrepareBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour + oldEnterEpilogue=DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=lambda newSelf: self.newEnterBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=lambda newSelf: self.newEnterBattleTwo(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=lambda newSelf: self.newEnterPrepareBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.walk() + ceoMaxer.autoerGui.display.newLine('Heading to CEO') + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + ceoMaxer.autoerGui.display.newLine('Skipping CEO introduction') + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitPrepareBattleTwo() + ceoMaxer.autoerGui.display.newLine('Skipping cutscene') + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.bossCount+=1 + ceoMaxer.otherFunctions.teleBack() + ceoMaxer.autoerGui.display.newLine('Finished CEO') + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + ceoMaxer.autoerGui.display.newLine('Skipping cutscene') + + def newEnterPrepareBattleFour(self,newSelf): + self.oldEnterPrepareBattleFour(newSelf) + newSelf.exitPrepareBattleFour() + ceoMaxer.autoerGui.display.newLine('Skipping cutscene') + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(ceoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if ceoMaxer.otherFunctions.shouldContinue: + self.exploit() + ceoMaxer.autoerGui.display.newLine('Skipping Battle') + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleTwo(self,newSelf): + self.oldEnterBattleTwo(newSelf) + ceoMaxer.autoerGui.display.newLine('Waiting for timer') + + def newEnterBattleFour(self,newSelf): + self.oldEnterBattleFour(newSelf) + self.endBattle(newSelf) + + def start(self): + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + ceoMaxer.autoerGui.display.newLine('Starting the CEO') + ceoMaxer.autoerGui.display.newLine('Entering Lobby') + + def endBattle(self,newSelf): + newSelf.sendUpdate('hitBoss', [250]) + ceoMaxer.autoerGui.display.newLine('Killing CEO') + newSelf.exitBattleFour() + + def revertFunctions(self): + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=self.oldBossEnterElevator + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=self.oldEnterBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=self.oldEnterBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=self.oldEnterPrepareBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class CountryClubAutoer: + oldCountryClubInit=DistributedCountryClub.DistributedCountryClub.__init__ + oldEnterReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward + oldGolfGameToonEnter=DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter + oldEnterCountryClubReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward + + def __init__(self,ceoMaxer): + self.attackSeq=Sequence(Func(ceoMaxer.restock.restock),Wait(1.0),Func(ceoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(ceoMaxer.restock.gainLaff),Wait(3.0)) + self.battleNum=1 + DistributedCountryClub.DistributedCountryClub.__init__=lambda *args:self.newCountryClubInit(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=lambda *args:self.newGolfGameToonEnter(*args) + base.localAvatar.died=lambda *args: self.newSafeZone(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=lambda *args:self.newEnterCountryClubReward(*args) + + def setFrontThree(self): + self.floorNumToKartRoomNum={0:17,1:17,2:18} + self.battles=[1,3,5] + self.greenRoom=9 + self.countryClubName='The Front Three' + + def setMiddleSix(self): + self.greenRoom=29 + self.battles=[1,3,5,7,9,11] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:18} + self.countryClubName='The Middle Six' + + def setBackNine(self): + self.greenRoom=39 + self.battles=[1,3,5,7,9,11,13,15,17] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:17,6:17,7:17,8:18} + self.countryClubName='The Back Nine' + + def preTele(self): + DistributedTrolley.DistributedTrolley.__init__ = newInit + DistributedPartyGate.DistributedPartyGate.__init__ = newInit + DistributedDoor.DistributedDoor.__init__ = newInit + base.localAvatar.stopLookAroundNow() + + def generateAgain(self): + DistributedTrolley.DistributedTrolley.__init__ = oldTrolleyInit + DistributedPartyGate.DistributedPartyGate.__init__ = oldPartyInit + DistributedDoor.DistributedDoor.__init__ = oldDoorInit + base.localAvatar.findSomethingToLookAt = ceoMaxer.restock.oldFindSomethingToLookAt + ToonHead.ToonHead._ToonHead__lookAround = ceoMaxer.restock.oldLookAround + + def enterBattle(self): + if base.localAvatar.getHp()>0: + ceoMaxer.restock.wasInBattle=False + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if self.battleNum in self.battles: + if x.doId not in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + else: + if x.doId in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + ceoMaxer.otherFunctions.walk() + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + ceoMaxer.autoerGui.display.newLine('Entering Battle '+str(self.battleNum)) + return True + else: + return False + else: + return True + + def doMoles(self): + moleSeq=Sequence() + ceoMaxer.autoerGui.display.newLine('Entering Floor '+str(base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum+1)) + ceoMaxer.autoerGui.display.newLine('Completing Mole Field') + for moleField in base.cr.doFindAll('MoleField'): + for i in range(moleField.numMoles): + moleSeq.append(Func(moleField.sendUpdate,'whackedMole', [0, i])) + moleSeq.append(Wait(0.05)) + moleSeq.append(Wait(0.5)) + moleSeq.append(Func(self.enterBattle)) + moleSeq.start() + + def doGolf(self): + gameSeq=Sequence() + ceoMaxer.autoerGui.display.newLine('Completing Golf') + for greenGame in base.cr.doFindAll('GolfGreenGame'): + for i in range(greenGame.boardsLeft): + gameSeq.append(Func(greenGame.sendUpdate,'requestBoard', [1])) + gameSeq.append(Wait(2)) + gameSeq.append(Func(self.endFloor)) + gameSeq.start() + + def enterCountryClub(self): + for kart in base.cr.doFindAll('DistributedCogKart'): + if kart.getDestName()==self.countryClubName: + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[kart.doId]) + break + + def boardKart(self): + ceoMaxer.otherFunctions.walk() + self.attackSeq.finish() + self.gainLaffSeq.finish() + for kart in base.cr.doFindAll('DistributedClubElevator'): + kart.handleEnterSphere(base.localAvatar.doId) + ceoMaxer.autoerGui.display.newLine('Boarding Kart') + return + ceoMaxer.otherFunctions.walk() + ceoMaxer.autoerGui.display.newLine('Finishing Country Club') + ceoMaxer.otherFunctions.teleBack() + self.generateAgain() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedCountryClub.DistributedCountryClub'): + base.cr.doFind('DistributedCountryClub.DistributedCountryClub').warpToRoom(room) + + def newCountryClubInit(self,*args): + self.oldCountryClubInit(*args) + self.attackSeq.loop() + self.gainLaffSeq.loop() + Sequence(Wait(3),Func(self.doMoles)).start() + + def newGolfGameToonEnter(self,*args): + self.oldGolfGameToonEnter(*args) + if ceoMaxer.otherFunctions.shouldContinue: + Sequence(Wait(3),Func(self.doGolf)).start() + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.autoerGui.display.newLine('Finished Battle '+str(self.battleNum)) + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + ceoMaxer.otherFunctions.walk() + if not self.enterBattle(): + self.warpToRoom(self.greenRoom) + ceoMaxer.otherFunctions.walk() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(ceoMaxer.otherFunctions.walk)).start() + ceoMaxer.restock.wasInBattle=True + ceoMaxer.autoerGui.display.newLine('Died, recovering') + + def newEnterCountryClubReward(self,*args): + self.oldEnterCountryClubReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.autoerGui.display.newLine('Finished Predident') + Sequence(Wait(1.5),Func(self.boardKart)).start() + + def endFloor(self): + ceoMaxer.otherFunctions.walk() + self.warpToRoom(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum]) + Sequence(Wait(1),Func(self.boardKart)).start() + + def start(self): + self.battleNum=1 + if ceoMaxer.otherFunctions.getStocksLeft()>953 and base.localAvatar.getCogParts()[0]!=0: + ceoMaxer.autoerGui.display.newLine('Entering The Back Nine') + self.setBackNine() + elif ceoMaxer.otherFunctions.getStocksLeft()>386 and base.localAvatar.getCogParts()[0]!=0: + ceoMaxer.autoerGui.display.newLine('Entering The Middle Six') + self.setMiddleSix() + else: + ceoMaxer.autoerGui.display.newLine('Entering The Front Three') + self.setFrontThree() + Sequence(Wait(1),Func(self.enterCountryClub)).start() + + def revertFunctions(self): + DistributedCountryClub.DistributedCountryClub.__init__=self.oldCountryClubInit + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=self.oldEnterReward + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=self.oldGolfGameToonEnter + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=self.oldEnterCountryClubReward + base.localAvatar.died=lambda *args: None + self.generateAgain() + +class CEOMaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.ceoAutoer=CeoAutoer() + self.countryClubAutoer=CountryClubAutoer(self) + self.autoerGui=AutoerGui('CEO Maxer',['Run Time',"Number of ceo's","Ceo's/Hour",'Suit','Stocks needed'],\ + ['self.hours+":"+self.minutes+":"+self.seconds','str(ceoMaxer.otherFunctions.bossCount)','str(self.workOutNumberAnHour(ceoMaxer.otherFunctions.bossCount))'\ + ,'str(ceoMaxer.otherFunctions.numberToSuit[base.localAvatar.cogTypes[0]])+" Lvl "+str(base.localAvatar.cogLevels[0]+1)','str(ceoMaxer.otherFunctions.getStocksLeft())'],\ + 'CEO MXR','boss') + + def revert(self): + self.restock.revertFunctions() + self.countryClubAutoer.revertFunctions() + self.ceoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +ceoMaxer=CEOMaxer() diff --git a/autoers/CEOMaxerToontask.py b/autoers/CEOMaxerToontask.py new file mode 100644 index 0000000..1a04c42 --- /dev/null +++ b/autoers/CEOMaxerToontask.py @@ -0,0 +1,759 @@ +import __main__ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.battle import DistributedBattle +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.coghq import DistributedCountryClubBattle +from toontown.coghq import DistributedCountryClub +from toontown.coghq import DistributedGolfGreenGame +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import BossbotHQExterior +from toontown.coghq import CashbotHQExterior +from toontown.coghq import CountryClubInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedBossbotBoss +from toontown.safezone import DDPlayground + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedCountryClubBattle.DistributedCountryClubBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + ceoMaxer.countryClubAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, description='5', event=None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, description='5', event=None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + ceoMaxer.countryClubAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDockEnterTeleportIn=DDPlayground.DDPlayground.enterTeleportIn + oldBossEnterWalk=BossbotHQExterior.BossbotHQExterior.enterWalk + oldCashEnterWalk=CashbotHQExterior.CashbotHQExterior.enterWalk + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + oldNpcFreeAvatar=DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.limit10=True + self.onlyClub=False + self.isHealing=False + self.canSetParentAgain=True + self.numberToSuit={0:'Flunky',1:'Pencil Pusher',2:'Yesman',3:'Micromanager', + 4:'Downsizer',5:'Head Hunter',6:'Corporate Raider',7:'The Big Cheese'} + DDPlayground.DDPlayground.enterTeleportIn=lambda newSelf,*args:self.newDockEnterTeleportIn(newSelf,*args) + BossbotHQExterior.BossbotHQExterior.enterWalk=lambda newSelf,*args: self.newBossEnterWalk(newSelf,*args) + CashbotHQExterior.CashbotHQExterior.enterWalk=lambda newSelf,*args: self.newCashEnterWalk(newSelf,*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=lambda *args: None + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.inventory.inventory[ceoMaxer.restock.firstTrack][ceoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.firstTrack, ceoMaxer.restock.desiredLevel1, battle.suits[0].doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.secondTrack][ceoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.secondTrack, ceoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDockEnterTeleportIn(self,newSelf,*args): + self.oldDockEnterTeleportIn(newSelf,*args) + if self.shouldContinue: + ceoMaxer.countryClubAutoer.gainLaffSeq.finish() + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.checkStocks)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkStocks)).start() + except: + pass + + def newCashEnterWalk(self,newSelf,*args): + self.oldCashEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + ceoMaxer.countryClubAutoer.attackSeq.loop() + self.enterRandomBattle() + + def newBossEnterWalk(self,newSelf,*args): + self.oldBossEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + self.checkStocks() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>20: + self.isHealing=False + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + self.enterRandomBattle() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and self.lastCogId==args[0].doId: + self.enterRandomBattle() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(1),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def checkStocks(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyClub: + base.localAvatar.cogMerits[0]=-4000 + if self.limit10 and self.bossCount>9: + self.shouldContinue=False + if self.shouldEnd: + self.shouldContinue=False + if self.shouldContinue: + if self.getStocksLeft()==0 and not self.onlyClub: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + ceoMaxer.ceoAutoer.start() + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + self.teleBack() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + if base.localAvatar.getHp()>20: + ceoMaxer.countryClubAutoer.start() + else: + self.isHealing=True + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + if base.localAvatar.getHp()>20: + self.walk() + self.teleBack() + else: + self.isHealing=True + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(ceoMaxer.restock.interest1) + base.cr.removeInterest(ceoMaxer.restock.interest2) + ceoMaxer.restock.unloaded=True + except: + pass + + def getStocksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,0)-base.localAvatar.cogMerits[0] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=10000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoClub(self): + self.onlyClub=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to only do the Country Club') + + def doBoth(self): + self.onlyClub=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to do both the Country Club and the CEO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.lastCogId=battle.doId + else: + pass + + def limiterOn(self): + self.limit10=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to be limited to only 10 CEOs') + + def limiterOff(self): + self.limit10=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to unlimited number of CEOs') + + def stop(self): + base.localAvatar.died=lambda *args: None + self.shouldContinue=True + self.shouldEnd=True + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: ceoMaxer.countryClubAutoer.newSafeZone(*args) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + ceoMaxer.restock.noToons.loop() + self.checkStocks() + + + def revertFunctions(self): + DDPlayground.DDPlayground.enterTeleportIn=self.oldDockEnterTeleportIn + BossbotHQExterior.BossbotHQExterior.enterWalk=self.oldBossEnterWalk + CashbotHQExterior.CashbotHQExterior.enterWalk=self.oldCashEnterWalk + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=self.oldNpcFreeAvatar + +class CeoAutoer: + oldBossEnterElevator=DistributedBossbotBoss.DistributedBossbotBoss.enterElevator + oldEnterBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo + oldEnterBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour + oldEnterPrepareBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree + oldEnterPrepareBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour + oldEnterEpilogue=DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=lambda newSelf: self.newEnterBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=lambda newSelf: self.newEnterBattleTwo(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=lambda newSelf: self.newEnterPrepareBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.walk() + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitPrepareBattleTwo() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.bossCount+=1 + ceoMaxer.otherFunctions.teleBack() + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + + def newEnterPrepareBattleFour(self,newSelf): + self.oldEnterPrepareBattleFour(newSelf) + newSelf.exitPrepareBattleFour() + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(ceoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if ceoMaxer.otherFunctions.shouldContinue: + self.exploit() + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleTwo(self,newSelf): + self.oldEnterBattleTwo(newSelf) + + def newEnterBattleFour(self,newSelf): + self.oldEnterBattleFour(newSelf) + self.endBattle(newSelf) + + def start(self): + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + + def endBattle(self,newSelf): + newSelf.sendUpdate('hitBoss', [250]) + newSelf.exitBattleFour() + + def revertFunctions(self): + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=self.oldBossEnterElevator + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=self.oldEnterBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=self.oldEnterBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=self.oldEnterPrepareBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class CountryClubAutoer: + oldCountryClubInit=DistributedCountryClub.DistributedCountryClub.__init__ + oldEnterReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward + oldGolfGameToonEnter=DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter + oldEnterCountryClubReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward + + def __init__(self,ceoMaxer): + self.attackSeq=Sequence(Func(ceoMaxer.restock.restock),Wait(1.0),Func(ceoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(ceoMaxer.restock.gainLaff),Wait(3.0)) + self.battleNum=1 + DistributedCountryClub.DistributedCountryClub.__init__=lambda *args:self.newCountryClubInit(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=lambda *args:self.newGolfGameToonEnter(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=lambda *args:self.newEnterCountryClubReward(*args) + + def setFrontThree(self): + self.floorNumToKartRoomNum={0:17,1:17,2:18} + self.battles=[1,3,5] + self.greenRoom=9 + self.countryClubName='The Front Three' + + def setMiddleSix(self): + self.greenRoom=29 + self.battles=[1,3,5,7,9,11] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:18} + self.countryClubName='The Middle Six' + + def setBackNine(self): + self.greenRoom=39 + self.battles=[1,3,5,7,9,11,13,15,17] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:17,6:17,7:17,8:18} + self.countryClubName='The Back Nine' + + def preTele(self): + exec(hooks, __main__.__dict__) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def enterBattle(self): + if base.localAvatar.getHp()>0: + ceoMaxer.restock.wasInBattle=False + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if self.battleNum in self.battles: + if x.doId not in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + else: + if x.doId in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + ceoMaxer.otherFunctions.walk() + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + return True + else: + return False + else: + return True + + def doMoles(self): + moleSeq=Sequence() + for moleField in base.cr.doFindAll('MoleField'): + for i in range(moleField.numMoles): + moleSeq.append(Func(moleField.sendUpdate,'whackedMole', [0, i])) + moleSeq.append(Wait(0.05)) + moleSeq.append(Wait(0.5)) + moleSeq.append(Func(self.enterBattle)) + moleSeq.start() + + def doGolf(self): + gameSeq=Sequence() + for greenGame in base.cr.doFindAll('GolfGreenGame'): + for i in range(greenGame.boardsLeft): + gameSeq.append(Func(greenGame.sendUpdate,'requestBoard', [1])) + gameSeq.append(Wait(2)) + gameSeq.append(Func(self.endFloor)) + gameSeq.start() + + def enterCountryClub(self): + for kart in base.cr.doFindAll('DistributedCogKart'): + if kart.getDestName()==self.countryClubName: + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[kart.doId]) + break + + def boardKart(self): + ceoMaxer.otherFunctions.walk() + self.attackSeq.finish() + self.gainLaffSeq.finish() + for kart in base.cr.doFindAll('DistributedClubElevator'): + kart.handleEnterSphere(base.localAvatar.doId) + return + ceoMaxer.otherFunctions.walk() + ceoMaxer.otherFunctions.teleBack() + self.generateAgain() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedCountryClub.DistributedCountryClub'): + base.cr.doFind('DistributedCountryClub.DistributedCountryClub').warpToRoom(room) + + def newCountryClubInit(self,*args): + self.oldCountryClubInit(*args) + self.attackSeq.loop() + self.gainLaffSeq.loop() + Sequence(Wait(3),Func(self.doMoles)).start() + + def newGolfGameToonEnter(self,*args): + self.oldGolfGameToonEnter(*args) + if ceoMaxer.otherFunctions.shouldContinue: + Sequence(Wait(3),Func(self.doGolf)).start() + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + ceoMaxer.otherFunctions.walk() + if not self.enterBattle(): + self.warpToRoom(self.greenRoom) + ceoMaxer.otherFunctions.walk() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(ceoMaxer.otherFunctions.walk)).start() + ceoMaxer.restock.wasInBattle=True + + def newEnterCountryClubReward(self,*args): + self.oldEnterCountryClubReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + Sequence(Wait(1.5),Func(self.boardKart)).start() + + def endFloor(self): + ceoMaxer.otherFunctions.walk() + self.warpToRoom(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum]) + Sequence(Wait(1),Func(self.boardKart)).start() + + def start(self): + self.battleNum=1 + if ceoMaxer.otherFunctions.getStocksLeft()>953 and base.localAvatar.getCogParts()[0]!=0: + self.setBackNine() + elif ceoMaxer.otherFunctions.getStocksLeft()>386 and base.localAvatar.getCogParts()[0]!=0: + self.setMiddleSix() + else: + self.setFrontThree() + Sequence(Wait(1),Func(self.enterCountryClub)).start() + + def revertFunctions(self): + DistributedCountryClub.DistributedCountryClub.__init__=self.oldCountryClubInit + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=self.oldEnterReward + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=self.oldGolfGameToonEnter + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=self.oldEnterCountryClubReward + base.localAvatar.died=lambda *args: None + self.generateAgain() + +class CEOMaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.ceoAutoer=CeoAutoer() + self.countryClubAutoer=CountryClubAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.countryClubAutoer.revertFunctions() + self.ceoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate diff --git a/autoers/CFOMaxer.py b/autoers/CFOMaxer.py new file mode 100644 index 0000000..1ddb2e8 --- /dev/null +++ b/autoers/CFOMaxer.py @@ -0,0 +1,768 @@ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.battle import DistributedBattle +from toontown.coghq import DistributedMintBattle +from toontown.coghq import DistributedMint +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import MintInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit.DistributedSuit import DistributedSuit +from toontown.suit import DistributedCashbotBoss +from toontown.safezone import DLPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=lambda self: None +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedMintBattle.DistributedMintBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldTrolleyInit = DistributedTrolley.DistributedTrolley.__init__ +oldPartyInit = DistributedPartyGate.DistributedPartyGate.__init__ +oldDoorInit = DistributedDoor.DistributedDoor.__init__ + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + cfoMaxer.mintAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, 5, None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, 5, None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + cfoMaxer.mintAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, 4, event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDreamlandInit=DLPlayground.DLPlayground.__init__ + oldHqDoorInit=DistributedCogHQDoor.DistributedCogHQDoor.__init__ + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.onlyMint=False + self.isHealing=False + self.attackCogId=0 + self.canSetParentAgain=True + self.numberToSuit={0:'Short Change',1:'Penny Pusher',2:'Tightwad',3:'Bean Counter', + 4:'Number Cruncher',5:'Money Bags',6:'Loan Shark',7:'Robber Baron'} + DLPlayground.DLPlayground.__init__=lambda *args:self.newDreamlandInit(*args) + DistributedCogHQDoor.DistributedCogHQDoor.__init__=lambda *args: self.newHqDoorInit(*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if cfoMaxer.mintAutoer.finalDone: + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getActualLevel()!=12: + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.firstTrack][cfoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.firstTrack, cfoMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.secondTrack][cfoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.secondTrack, cfoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDreamlandInit(self,*args): + self.oldDreamlandInit(*args) + if self.shouldContinue: + cfoMaxer.mintAutoer.gainLaffSeq.finish() + cfoMaxer.mintAutoer.attackSeq.finish() + cfoMaxer.restock.wasInBattle=False + self.checkCogbucks() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + cfoMaxer.autoerGui.display.newLine('TPing failed, trying again') + if self.shouldContinue: + Sequence(Wait(3),Func(self.checkCogbucks)).start() + except: + pass + + def newHqDoorInit(self,*args): + self.oldHqDoorInit(*args) + if self.shouldContinue and base.localAvatar.getZoneId()==12000: + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkCogbucks)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>70: + cfoMaxer.mintAutoer.attackSeq.finish() + self.isHealing=False + self.checkCogbucks() + else: + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and args[0].doId==self.attackCogId: + self.enterRandomBattle() + + def checkCogbucks(self): + if self.onlyMint: + base.localAvatar.cogMerits[2]=-4000 + if self.shouldEnd: + self.shouldContinue=False + base.localAvatar.setWantBattles(True) + if self.haveJb(): + if self.shouldContinue: + if self.getCogbucksLeft()==0 and not self.onlyMint: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.cfoAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + cfoMaxer.autoerGui.display.newLine('Teleporting to cashbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.mintAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + cfoMaxer.autoerGui.display.newLine('Teleporting to cashbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + cfoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(cfoMaxer.restock.interest1) + base.cr.removeInterest(cfoMaxer.restock.interest2) + cfoMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's cfo maxer") + cfoMaxer.autoerGui.display.newLine('Stopped') + else: + cfoMaxer.autoerGui.display.newLine('Out of jellybeans') + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getCogbucksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,2)-base.localAvatar.cogMerits[2] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=12000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoMint(self): + self.onlyMint=True + base.localAvatar.setSystemMessage(0,'CFO maxer set to only do the Mint') + + def doBoth(self): + self.onlyMint=False + base.localAvatar.setSystemMessage(0,'CFO maxer set to do both the Mint and the CFO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.attackCogId=battle.doId + else: + pass + + def setStop(self): + self.shouldEnd=True + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + cfoMaxer.autoerGui.stopTimer() + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + cfoMaxer.autoerGui.startTimer() + emptyShardList=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + emptyShardList.append(shard) + if emptyShardList==[]: + emptyShardList=[650000000, 754000000, 608000000, 756000000, 658000000, 712000000, 360000000, 410000000, 620000000, 454000000, 726000000, 362000000, 688000000, 316000000] + if base.localAvatar.defaultShard not in emptyShardList: + cfoMaxer.autoerGui.display.newLine('TPing to an empty district') + base.cr.playGame.getPlace().requestTeleport(12000,12000,random.choice(emptyShardList),None) + else: + self.checkCogbucks() + cfoMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DLPlayground.DLPlayground.__init__=self.oldDreamlandInit + DistributedCogHQDoor.DistributedCogHQDoor.__init__=self.oldHqDoorInit + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class CfoAutoer: + oldBossEnterElevator=DistributedCashbotBoss.DistributedCashbotBoss.enterElevator + oldEnterBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree + oldEnterPrepareBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.newState=DistributedCashbotBoss.DistributedCashbotBoss.setState + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + cfoMaxer.autoerGui.display.newLine('Heading to the CFO') + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + cfoMaxer.autoerGui.display.newLine('Skipping CFO introduction') + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + for i in range(5): + newSelf._DistributedCashbotBoss__epilogueChatNext(i,1) + cfoMaxer.otherFunctions.teleBack() + cfoMaxer.otherFunctions.bossCount+=1 + cfoMaxer.autoerGui.display.newLine('Finished CFO') + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + cfoMaxer.autoerGui.display.newLine('Skipping cutscene') + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(cfoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if cfoMaxer.otherFunctions.shouldContinue: + self.exploit() + cfoMaxer.autoerGui.display.newLine('Skipping Battle') + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + self.endBattle(newSelf) + + def start(self): + base.localAvatar.collisionsOff() + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + base.localAvatar.setWantBattles(True) + cfoMaxer.autoerGui.display.newLine('Starting the CFO') + cfoMaxer.autoerGui.display.newLine('Entering Lobby') + + def endBattle(self,newSelf): + newSelf.cranes[0].sendUpdate('requestControl', []) + for goon in base.cr.doFindAll('goon'): + goon.sendUpdate('requestGrab', []) + goon.sendUpdate('clearSmoothing', [0]) + goon.sendUpdate('hitBoss', [20.0]) + Sequence(Wait(1),Func(newSelf.exitBattleFour)).start() + + def revertFunctions(self): + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=self.oldBossEnterElevator + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class MintAutoer: + oldMintEnterWalk=MintInterior.MintInterior.enterWalk + oldEnterReward=DistributedMintBattle.DistributedMintBattle.enterReward + oldEnterMintReward=DistributedMintBattle.DistributedMintBattle.enterMintReward + + def __init__(self,cfoMaxer): + self.floorNumToLastRoomNum=[17,23,21,19,17,23,21,19,17,23,21,19,17,24,21,19,17,24,21,19] + self.attackSeq=Sequence(Func(cfoMaxer.restock.restock),Wait(1.0),Func(cfoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(cfoMaxer.restock.gainLaff),Wait(3.0)) + MintInterior.MintInterior.enterWalk=lambda newSelf,*args:self.newMintEnterWalk(newSelf,*args) + DistributedMintBattle.DistributedMintBattle.enterReward=lambda *args:self.newEnterReward(*args) + base.localAvatar.died=lambda *args: self.newSafeZone(*args) + DistributedMintBattle.DistributedMintBattle.enterMintReward=lambda *args:self.newEnterMintReward(*args) + + def preTele(self): + DistributedTrolley.DistributedTrolley.__init__ = newInit + DistributedPartyGate.DistributedPartyGate.__init__ = newInit + DistributedDoor.DistributedDoor.__init__ = newInit + base.localAvatar.stopLookAroundNow() + + def generateAgain(self): + DistributedTrolley.DistributedTrolley.__init__ = oldTrolleyInit + DistributedPartyGate.DistributedPartyGate.__init__ = oldPartyInit + DistributedDoor.DistributedDoor.__init__ = oldDoorInit + base.localAvatar.findSomethingToLookAt = cfoMaxer.restock.oldFindSomethingToLookAt + ToonHead.ToonHead._ToonHead__lookAround = cfoMaxer.restock.oldLookAround + + def enterBattle(self): + if base.localAvatar.getHp()>0: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if x.doId not in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds and not self.finalDone: + battles.append(x) + elif self.finalDone and x.doId in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + cfoMaxer.restock.wasInBattle=False + cfoMaxer.autoerGui.display.newLine('Entering Battle '+str(self.battleNum)) + return True + else: + return False + else: + return True + + def boardElevator(self): + if base.localAvatar.getHp()>70: + for elevator in base.cr.doFindAll("Elevator"): + if "Bullion" in elevator.getDestName(): + cfoMaxer.autoerGui.display.newLine('Entering the Bullion Mint') + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + break + else: + self.attackSeq.loop() + cfoMaxer.otherFunctions.isHealing=True + cfoMaxer.autoerGui.display.newLine('Healing') + cfoMaxer.otherFunctions.enterRandomBattle() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedMint.DistributedMint'): + base.cr.doFind('DistributedMint.DistributedMint').warpToRoom(room) + + def newMintEnterWalk(self,newSelf,*args): + self.oldMintEnterWalk(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue and len(args)>0: + if args[0]: + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.workOutRoomsNeeded() + self.enterBattle() + + def workOutRoomsNeeded(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + battles.append(x) + self.battlesNeeded=0 + numBattles=(len(battles)/4)-1 + cogbucksNeeded=cfoMaxer.otherFunctions.getCogbucksLeft() + cogbucksNeeded-=68 + for i in range(numBattles): + if cogbucksNeeded>0: + self.battlesNeeded+=1 + cogbucksNeeded-=68 + else: + break + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.autoerGui.display.newLine('Finished Battle '+str(self.battleNum)) + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + cfoMaxer.otherFunctions.walk() + if self.battleNum>self.battlesNeeded and not self.finalDone: + cfoMaxer.autoerGui.display.newLine('Warping to final room') + self.warpToRoom(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum]) + self.finalDone=True + Sequence(Wait(0.5),Func(self.enterBattle)).start() + elif self.enterBattle(): + pass + else: + cfoMaxer.otherFunctions.walk() + cfoMaxer.autoerGui.display.newLine('Error no cogbucks recieved') + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + cfoMaxer.restock.wasInBattle=True + cfoMaxer.autoerGui.display.newLine('Died, recovering') + + def newEnterMintReward(self,*args): + self.oldEnterMintReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + cfoMaxer.autoerGui.display.newLine('Finished Final Battle') + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def start(self): + self.battleNum=1 + self.finalDone=False + base.localAvatar.setWantBattles(True) + Sequence(Wait(1),Func(self.boardElevator)).start() + + def revertFunctions(self): + MintInterior.MintInterior.enterWalk=self.oldMintEnterWalk + DistributedMintBattle.DistributedMintBattle.enterReward=self.oldEnterReward + DistributedMintBattle.DistributedMintBattle.enterCountryClubReward=self.oldEnterMintReward + base.localAvatar.died=lambda *args: None + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + +class CFOmaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.cfoAutoer=CfoAutoer() + self.mintAutoer=MintAutoer(self) + self.autoerGui=AutoerGui('CFO Maxer',['Run Time',"Number of cfo's","Cfo's/Hour",'Suit','Cogbucks needed'],\ + ['self.hours+":"+self.minutes+":"+self.seconds','str(cfoMaxer.otherFunctions.bossCount)','str(self.workOutNumberAnHour(cfoMaxer.otherFunctions.bossCount))'\ + ,'str(cfoMaxer.otherFunctions.numberToSuit[base.localAvatar.cogTypes[2]])+" Lvl "+str(base.localAvatar.cogLevels[2]+1)','str(cfoMaxer.otherFunctions.getCogbucksLeft())'],\ + 'CFO MXR','cash') + + def revert(self): + self.restock.revertFunctions() + self.mintAutoer.revertFunctions() + self.cfoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +global cfoMaxer +cfoMaxer=CFOmaxer() \ No newline at end of file diff --git a/autoers/CFOMaxerToontask.py b/autoers/CFOMaxerToontask.py new file mode 100644 index 0000000..68b6946 --- /dev/null +++ b/autoers/CFOMaxerToontask.py @@ -0,0 +1,748 @@ +import __main__ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.battle import DistributedBattle +from toontown.coghq import DistributedMintBattle +from toontown.coghq import DistributedMint +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import MintInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedCashbotBoss +from toontown.safezone import DLPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedMintBattle.DistributedMintBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +oldFishermanInitToonState = DistributedNPCFisherman.DistributedNPCFisherman.initToonState +def newFishermanInitToonState(self): + try: + oldFishermanInitToonState(self) + except: + return None + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + DistributedNPCFisherman.DistributedNPCFisherman.initToonState = newFishermanInitToonState + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + cfoMaxer.mintAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, description='5', event=None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, description='5', event=None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + cfoMaxer.mintAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDreamlandInit=DLPlayground.DLPlayground.__init__ + oldHqDoorInit=DistributedCogHQDoor.DistributedCogHQDoor.__init__ + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.onlyMint=False + self.onlyLast=False + self.isHealing=False + self.attackCogId=0 + self.canSetParentAgain=True + self.numberToSuit={0:'Short Change',1:'Penny Pusher',2:'Tightwad',3:'Bean Counter', + 4:'Number Cruncher',5:'Money Bags',6:'Loan Shark',7:'Robber Baron'} + DLPlayground.DLPlayground.__init__=lambda *args:self.newDreamlandInit(*args) + DistributedCogHQDoor.DistributedCogHQDoor.__init__=lambda *args: self.newHqDoorInit(*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if cfoMaxer.mintAutoer.finalDone: + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getActualLevel()!=12: + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.firstTrack][cfoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.firstTrack, cfoMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.secondTrack][cfoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.secondTrack, cfoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDreamlandInit(self,*args): + self.oldDreamlandInit(*args) + if self.shouldContinue: + cfoMaxer.mintAutoer.gainLaffSeq.finish() + cfoMaxer.mintAutoer.attackSeq.finish() + cfoMaxer.restock.wasInBattle=False + self.checkCogbucks() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(3),Func(self.checkCogbucks)).start() + except: + pass + + def newHqDoorInit(self,*args): + self.oldHqDoorInit(*args) + if self.shouldContinue and base.localAvatar.getZoneId()==12000: + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkCogbucks)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>70: + cfoMaxer.mintAutoer.attackSeq.finish() + self.isHealing=False + self.checkCogbucks() + else: + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and args[0].doId==self.attackCogId: + self.enterRandomBattle() + + def checkCogbucks(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyMint: + if self.onlyLast: + base.localAvatar.cogMerits[2]+=self.getCogbucksLeft()-1 + else: + base.localAvatar.cogMerits[2]=-4000 + if self.shouldEnd: + self.shouldContinue=False + if self.haveJb(): + if self.shouldContinue: + if self.getCogbucksLeft()==0 and not self.onlyMint: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.cfoAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.mintAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + cfoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(cfoMaxer.restock.interest1) + base.cr.removeInterest(cfoMaxer.restock.interest2) + cfoMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's cfo maxer") + else: + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getCogbucksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,2)-base.localAvatar.cogMerits[2] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=12000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoMint(self): + self.onlyMint=True + base.localAvatar.setSystemMessage(0,'CFO maxer set to only do the Mint') + + def doBoth(self): + self.onlyMint=False + base.localAvatar.setSystemMessage(0,'CFO maxer set to do both the Mint and the CFO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.attackCogId=battle.doId + else: + pass + + def stop(self): + self.shouldEnd=True + base.localAvatar.died=lambda *args: None + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: cfoMaxer.mintAutoer.newSafeZone(*args) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + self.checkCogbucks() + cfoMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DLPlayground.DLPlayground.__init__=self.oldDreamlandInit + DistributedCogHQDoor.DistributedCogHQDoor.__init__=self.oldHqDoorInit + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class CfoAutoer: + oldBossEnterElevator=DistributedCashbotBoss.DistributedCashbotBoss.enterElevator + oldEnterBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree + oldEnterPrepareBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.newState=DistributedCashbotBoss.DistributedCashbotBoss.setState + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + for i in range(5): + newSelf._DistributedCashbotBoss__epilogueChatNext(i,1) + cfoMaxer.otherFunctions.teleBack() + cfoMaxer.otherFunctions.bossCount+=1 + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(cfoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if cfoMaxer.otherFunctions.shouldContinue: + self.exploit() + cfoMaxer.autoerGui.display.newLine('Skipping Battle') + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + self.endBattle(newSelf) + + def start(self): + base.localAvatar.collisionsOff() + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + base.localAvatar.setWantBattles(True) + cfoMaxer.autoerGui.display.newLine('Starting the CFO') + cfoMaxer.autoerGui.display.newLine('Entering Lobby') + + def endBattle(self,newSelf): + newSelf.cranes[0].sendUpdate('requestControl', []) + for goon in base.cr.doFindAll('goon'): + goon.sendUpdate('requestGrab', []) + goon.sendUpdate('clearSmoothing', [0]) + goon.sendUpdate('hitBoss', [20.0]) + Sequence(Wait(1),Func(newSelf.exitBattleFour)).start() + + def revertFunctions(self): + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=self.oldBossEnterElevator + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class MintAutoer: + oldMintEnterWalk=MintInterior.MintInterior.enterWalk + oldEnterReward=DistributedMintBattle.DistributedMintBattle.enterReward + oldEnterMintReward=DistributedMintBattle.DistributedMintBattle.enterMintReward + + def __init__(self,cfoMaxer): + self.attackSeq=Sequence(Func(cfoMaxer.restock.restock),Wait(1.0),Func(cfoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(cfoMaxer.restock.gainLaff),Wait(3.0)) + MintInterior.MintInterior.enterWalk=lambda newSelf,*args:self.newMintEnterWalk(newSelf,*args) + DistributedMintBattle.DistributedMintBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedMintBattle.DistributedMintBattle.enterMintReward=lambda *args:self.newEnterMintReward(*args) + + def setType(self,zoneId): + if zoneId==12500: + self.floorNumToLastRoomNum=[17,22,19,24,21,18,23,20,25,22,19,24,21,17,23,20,25,22,18,24] + self.elevatorName='Coin' + self.laffNeeded=0 + elif zoneId==12600: + self.floorNumToLastRoomNum=[17,18,20,22,23,25,18,19,21,23,24,17,19,20,22,24,25,18,20,21] + self.elevatorName='Dollar' + self.laffNeeded=66 + else: + self.floorNumToLastRoomNum=[17,23,21,19,17,23,21,19,17,23,21,19,17,24,21,19,17,24,21,19] + self.elevatorName='Bullion' + self.laffNeeded=71 + + def preTele(self): + exec(hooks, __main__.__dict__) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def enterBattle(self): + if base.localAvatar.getHp()>0: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if x.doId not in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds and not self.finalDone: + battles.append(x) + elif self.finalDone and x.doId in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + cfoMaxer.restock.wasInBattle=False + return True + else: + return False + else: + return True + + def boardElevator(self): + if base.localAvatar.getHp()>self.laffNeeded: + for elevator in base.cr.doFindAll("Elevator"): + if self.elevatorName in elevator.getDestName(): + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + break + else: + self.attackSeq.loop() + cfoMaxer.otherFunctions.isHealing=True + cfoMaxer.otherFunctions.enterRandomBattle() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedMint.DistributedMint'): + base.cr.doFind('DistributedMint.DistributedMint').warpToRoom(room) + + def newMintEnterWalk(self,newSelf,*args): + self.oldMintEnterWalk(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue and len(args)>0: + if args[0]: + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.workOutRoomsNeeded() + self.enterBattle() + + def workOutRoomsNeeded(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + battles.append(x) + self.battlesNeeded=0 + numBattles=(len(battles)/4)-1 + cogbucksNeeded=cfoMaxer.otherFunctions.getCogbucksLeft() + cogbucksNeeded-=68 + for i in range(numBattles): + if cogbucksNeeded>0: + self.battlesNeeded+=1 + cogbucksNeeded-=68 + else: + break + if not self.battlesNeeded: + self.finalDone=True + self.warpToRoom(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum]) + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + cfoMaxer.otherFunctions.walk() + if self.battleNum>self.battlesNeeded and not self.finalDone: + self.warpToRoom(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum]) + self.finalDone=True + Sequence(Wait(0.5),Func(self.enterBattle)).start() + elif self.enterBattle(): + pass + else: + cfoMaxer.otherFunctions.walk() + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + cfoMaxer.restock.wasInBattle=True + + def newEnterMintReward(self,*args): + self.oldEnterMintReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def start(self): + self.battleNum=1 + self.finalDone=False + Sequence(Wait(1),Func(self.boardElevator)).start() + + def revertFunctions(self): + MintInterior.MintInterior.enterWalk=self.oldMintEnterWalk + DistributedMintBattle.DistributedMintBattle.enterReward=self.oldEnterReward + DistributedMintBattle.DistributedMintBattle.enterCountryClubReward=self.oldEnterMintReward + base.localAvatar.died=lambda *args: None + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + +class CFOmaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.cfoAutoer=CfoAutoer() + self.mintAutoer=MintAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.mintAutoer.revertFunctions() + self.cfoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate \ No newline at end of file diff --git a/autoers/CJMaxer.py b/autoers/CJMaxer.py new file mode 100644 index 0000000..8a4e2e2 --- /dev/null +++ b/autoers/CJMaxer.py @@ -0,0 +1,786 @@ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.battle import DistributedBattle +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import DistributedStage +from toontown.coghq import DistributedStageBattle +from toontown.coghq import DistributedLawOfficeElevatorExt +from toontown.coghq import LawbotHQExterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit.DistributedSuit import DistributedSuit +from toontown.suit import DistributedLawbotBoss +from toontown.safezone import BRPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=lambda self: None +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedStageBattle.DistributedStageBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldTrolleyInit = DistributedTrolley.DistributedTrolley.__init__ +oldPartyInit = DistributedPartyGate.DistributedPartyGate.__init__ +oldDoorInit = DistributedDoor.DistributedDoor.__init__ + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + cjMaxer.daAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, 5, None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, 5, None) + self.unloaded=False + Sequence(Wait(3),Func(cjMaxer.daAutoer.generateAgain)).start() + self.collectLaff() + if self.wasInBattle: + cjMaxer.daAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, 4, event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldBrrInit=BRPlayground.BRPlayground.__init__ + oldEnterWalk=LawbotHQExterior.LawbotHQExterior.enterWalk + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + + def __init__(self): + self.shouldContinue=False + self.lastCogId=0 + self.bossCount=0 + self.onlyDA=False + self.canSetParentAgain=True + self.isHealing=False + self.isGlitched=False + self.numberToSuit={0:'Bottom Feeder',1:'Bloodsucker',2:'Double Talker',3:'Ambulance Chaser', + 4:'Back Stabber',5:'Spin Doctor',6:'Legal Eagle',7:'Big Wig'} + self.oldSetAnim = LocalToon.LocalToon.setAnimState + BRPlayground.BRPlayground.__init__=lambda *args:self.newBrrInit(*args) + LawbotHQExterior.LawbotHQExterior.enterWalk=lambda newSelf,*args: self.newEnterWalk(newSelf,*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getName()!='Skelecog': + attackSuit=suit + else: + attackSuit=battle.suits[0] + + if base.localAvatar.inventory.inventory[cjMaxer.restock.firstTrack][cjMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.firstTrack, cjMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[cjMaxer.restock.secondTrack][cjMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.secondTrack, cjMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[cjMaxer.restock.thirdTrack][cjMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.thirdTrack, cjMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[cjMaxer.restock.thirdTrack][cjMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.thirdTrack, cjMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newBrrInit(self,*args): + self.oldBrrInit(*args) + if self.shouldContinue: + cjMaxer.daAutoer.gainLaffSeq.finish() + cjMaxer.daAutoer.generateAgain() + cjMaxer.daAutoer.attackSeq.finish() + cjMaxer.restock.wasInBattle=False + self.checkNotices() + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkNotices)).start() + except: + pass + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def newEnterWalk(self,newSelf,*args): + self.oldEnterWalk(newSelf,args) + if self.shouldContinue and len(args)>0: + base.localAvatar.setWantBattles(False) + self.checkNotices() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>96: + cjMaxer.daAutoer.attackSeq.finish() + self.isHealing=False + Sequence(Wait(1),Func(self.checkNotices)).start() + else: + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and self.lastCogId==args[0].doId: + self.enterRandomBattle() + + def newSetAnimState(self,*args,**kwds): + a = args if len(args) <= 7 else args[:7] + self.oldSetAnim(*a, **kwds) + if self.canSetParentAgain: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def checkNotices(self): + if self.shouldEnd: + self.shouldContinue=False + base.localAvatar.setWantBattles(True) + if self.haveJb(): + if self.shouldContinue: + if self.getNoticesLeft()==0 and not self.onlyDA: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=13000 and base.localAvatar.getZoneId()<13100: + cjMaxer.cjAutoer.start() + else: + cjMaxer.restock.restock() + cjMaxer.restock.collectLaff() + self.walk() + cjMaxer.autoerGui.display.newLine('Teleporting to lawbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=13000 and base.localAvatar.getZoneId()<13100: + if (base.localAvatar.getHp()>96 and self.getNoticesLeft()>10) or self.isGlitched: + cjMaxer.daAutoer.start() + else: + cjMaxer.daAutoer.attackSeq.loop() + self.isHealing=True + self.enterRandomBattle() + else: + cjMaxer.restock.restock() + cjMaxer.restock.collectLaff() + self.walk() + cjMaxer.autoerGui.display.newLine('Teleporting to lawbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + cjMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(cjMaxer.restock.interest1) + base.cr.removeInterest(cjMaxer.restock.interest2) + cjMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's cj maxer") + cjMaxer.autoerGui.display.newLine('Stopped') + else: + cjMaxer.autoerGui.display.newLine('Out of jellybeans') + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getNoticesLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,1)-base.localAvatar.cogMerits[1] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=13000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoDA(self): + self.onlyDA=True + base.localAvatar.setSystemMessage(0,'CJ maxer set to only do the DA Office') + + def doBoth(self): + self.onlyDA=False + base.localAvatar.setSystemMessage(0,'CJ maxer set to do both the DA Office and the CJ') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.lastCogId=battle.doId + else: + pass + + def setStop(self): + self.shouldEnd=True + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + cjMaxer.autoerGui.stopTimer() + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + cjMaxer.autoerGui.startTimer() + emptyShardList=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + emptyShardList.append(shard) + if emptyShardList==[]: + emptyShardList=[650000000, 754000000, 608000000, 756000000, 658000000, 712000000, 360000000, 410000000, 620000000, 454000000, 726000000, 362000000, 688000000, 316000000] + if base.localAvatar.defaultShard not in emptyShardList: + cjMaxer.autoerGui.display.newLine('TPing to an empty district') + base.cr.playGame.getPlace().requestTeleport(13000,13000,random.choice(emptyShardList),None) + else: + self.checkNotices() + cjMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + BRPlayground.BRPlayground.__init__=self.oldBrrInit + LawbotHQExterior.LawbotHQExterior.enterWalk=self.oldEnterWalk + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class CjAutoer: + oldBossEnterElevator=DistributedLawbotBoss.DistributedLawbotBoss.enterElevator + oldEnterBattleThree=DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree + oldEnterPrepareBattleTwo=DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue + oldEnterRollToBattleTwo=DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedLawbotBoss.DistributedLawbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo=lambda newSelf: self.newEnterRollToBattleTwo(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + cjMaxer.autoerGui.display.newLine('Skipping CJ introduction') + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.otherFunctions.bossCount+=1 + newSelf._DistributedLawbotBoss__doneEpilogue() + cjMaxer.otherFunctions.walk() + cjMaxer.otherFunctions.teleBack() + cjMaxer.autoerGui.display.newLine('Finished CJ') + + def newEnterRollToBattleTwo(self,newSelf): + self.oldEnterRollToBattleTwo(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf.exitRollToBattleTwo() + cjMaxer.autoerGui.display.newLine('Skipping cutscene') + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLawbotBoss__onToBattleTwo(33) + cjMaxer.autoerGui.display.newLine('Skipping dialogue 1') + cjMaxer.autoerGui.display.newLine('Waiting for cannon round...') + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLawbotBoss__onToBattleThree(33) + cjMaxer.autoerGui.display.newLine('Skipping dialogue 2') + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + self.endBattle() + cjMaxer.autoerGui.display.newLine('Completing evidence round') + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if cjMaxer.otherFunctions.shouldContinue: + self.exploit() + cjMaxer.autoerGui.display.newLine('Skipping Battle') + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and cjMaxer.otherFunctions.shouldContinue and base.localAvatar.getZoneId()==13100: + cjMaxer.otherFunctions.walk() + cjMaxer.autoerGui.display.newLine('Heading to CJ') + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(cjMaxer.otherFunctions.walk)).start() + + def endBattle(self): + CJ = base.cr.doFind('Chief Justice') + killSeq=Sequence() + for i in range(20): + killSeq.append(Func(CJ.sendUpdate,'hitBoss', [100])) + killSeq.append(Wait(0.05)) + killSeq.start() + + def start(self): + cjMaxer.autoerGui.display.newLine('Starting Chief Justice') + cjMaxer.autoerGui.display.newLine('Entering Lobby') + base.localAvatar.setWantBattles(True) + firstId=base.cr.doFindAll('CogHQDoor')[0].doId + if isinstance(base.cr.doId2do.get(firstId-2),DistributedCogHQDoor.DistributedCogHQDoor): + base.cr.doId2do.get(firstId-2).sendUpdate('requestEnter') + else: + base.cr.doId2do.get(firstId).sendUpdate('requestEnter') + + + def revertFunctions(self): + DistributedLawbotBoss.DistributedLawbotBoss.enterElevator=self.oldBossEnterElevator + DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo=self.oldEnterRollToBattleTwo + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class DAautoer: + oldElevatorAnnounceGenerate=DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate + oldEnterStageReward=DistributedStageBattle.DistributedStageBattle.enterStageReward + oldEnterReward=DistributedStageBattle.DistributedStageBattle.enterReward + oldStageGenerate=DistributedStage.DistributedStage.announceGenerate + + def __init__(self,cjMaxer): + self.gainLaffSeq=Sequence(Func(cjMaxer.restock.gainLaff),Wait(3.0)) + self.attackSeq=Sequence(Func(cjMaxer.restock.restock),Wait(1.0),Func(cjMaxer.otherFunctions.attack),Wait(1.0)) + DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate=lambda *args:self.newElevatorAnnounceGenerate(*args) + DistributedStageBattle.DistributedStageBattle.enterStageReward=lambda *args:self.newEnterStageReward(*args) + DistributedStageBattle.DistributedStageBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedStage.DistributedStage.announceGenerate=lambda newSelf,*args:self.newStageGenerate(newSelf,*args) + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: self.newSafeZone(*args) + base.localAvatar.died=lambda *args: self.newSafeZone(*args) + DistributedStageBattle.DistributedStageBattle.d_toonDied=lambda *args: self.newSafeZone(*args) + + def newStageAnnounceGenerate(self,newSelf,*args): + self.oldStageAnnounceGenerate(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + self.floorNum+=1 + cjMaxer.autoerGui.display.newLine('Entering Floor '+str(self.floorNum)) + Sequence(Wait(3),Func(self.doFloor,newSelf)).start() + + def newElevatorAnnounceGenerate(self,*args): + self.oldElevatorAnnounceGenerate(*args) + if cjMaxer.otherFunctions.shouldContinue and 'Office A' in args[0].getDestName(): + self.workOutOfficeNeeded() + Sequence(Wait(2),Func(self.boardElevator)).start() + + def newEnterStageReward(self,*args): + self.oldEnterStageReward(*args) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Completed Final Battle') + self.gainLaffSeq.finish() + self.attackSeq.finish() + self.generateAgain() + cjMaxer.otherFunctions.isGlitched=False + Sequence(Wait(2),Func(cjMaxer.otherFunctions.teleBack)).start() + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Error no notices received') + self.gainLaffSeq.finish() + self.attackSeq.finish() + self.generateAgain() + cjMaxer.otherFunctions.teleBack() + cjMaxer.otherFunctions.isGlitched=True + + def newStageGenerate(self,newSelf,*args): + self.oldStageGenerate(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + self.floorNum+=1 + cjMaxer.autoerGui.display.newLine('Entering Floor '+str(self.floorNum)) + Sequence(Wait(3),Func(self.doFloor,newSelf)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(cjMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + cjMaxer.restock.wasInBattle=True + cjMaxer.autoerGui.display.newLine('Died, recovering') + + def enterBattle(self): + if base.localAvatar.getHp()>0: + try: + base.cr.doFind('DistributedStage.DistributedStage').warpToRoom(2) + except: + pass + base.localAvatar.collisionsOn() + cjMaxer.restock.wasInBattle=False + + def workOutOfficeNeeded(self): + noticesNeeded=cjMaxer.otherFunctions.getNoticesLeft() + if noticesNeeded<98 or base.localAvatar.getHp()<81: + self.office='Office A' + elif noticesNeeded<190 or base.localAvatar.getHp()<86: + self.office='Office B' + elif noticesNeeded<324 or base.localAvatar.getHp()<96: + self.office='Office C' + else: + self.office='Office D' + + def doFloor(self,floor): + if base.cr.doFind('DistributedElevatorFloor'): + base.cr.doFind('DistributedElevatorFloor').handleEnterSphere(base.localAvatar.doId) + cjMaxer.autoerGui.display.newLine('Boarding Floor '+str(self.floorNum)+' elevator') + else: + floor.warpToRoom(2) + cjMaxer.autoerGui.display.newLine('Entering Final Battle') + + def boardElevator(self): + for elevator in base.cr.doFindAll('Elevator'): + if self.office in elevator.getDestName(): + if cjMaxer.otherFunctions.isGlitched: + cjMaxer.autoerGui.display.newLine('Fixing a glitch') + elevator.sendUpdate('requestBoard') + else: + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + cjMaxer.autoerGui.display.newLine('Heading to Office: '+self.office.split()[-1]) + self.gainLaffSeq.loop() + self.attackSeq.loop() + self.floorNum=0 + return + + def goToElevators(self): + firstId=base.cr.doFindAll('CogHQDoor')[0].doId + if isinstance(base.cr.doId2do.get(firstId+2),DistributedCogHQDoor.DistributedCogHQDoor): + base.cr.doId2do.get(firstId+2).sendUpdate('requestEnter') + else: + base.cr.doId2do.get(firstId).sendUpdate('requestEnter') + + def start(self): + base.localAvatar.setWantBattles(True) + self.goToElevators() + + def preTele(self): + DistributedTrolley.DistributedTrolley.__init__ = newInit + DistributedPartyGate.DistributedPartyGate.__init__ = newInit + DistributedDoor.DistributedDoor.__init__ = newInit + base.localAvatar.stopLookAroundNow() + + def generateAgain(self): + DistributedTrolley.DistributedTrolley.__init__ = oldTrolleyInit + DistributedPartyGate.DistributedPartyGate.__init__ = oldPartyInit + DistributedDoor.DistributedDoor.__init__ = oldDoorInit + base.localAvatar.findSomethingToLookAt = cjMaxer.restock.oldFindSomethingToLookAt + ToonHead.ToonHead._ToonHead__lookAround = cjMaxer.restock.oldLookAround + + def revertFunctions(self): + DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate=self.oldElevatorAnnounceGenerate + DistributedStageBattle.DistributedStageBattle.enterStageReward=self.oldEnterStageReward + DistributedStageBattle.DistributedStageBattle.enterReward=self.oldEnterReward + DistributedStage.DistributedStage.announceGenerate=self.oldStageGenerate + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: None + base.localAvatar.died=lambda *args: None + DistributedStageBattle.DistributedStageBattle.d_toonDied=lambda *args: None + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + +class CJMaxer: + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.cjAutoer=CjAutoer() + self.daAutoer=DAautoer(self) + self.autoerGui=AutoerGui('CJ Maxer',['Run Time',"Number of CJ's","CJ's/Hour",'Suit','Notices needed'],\ + ['self.hours+":"+self.minutes+":"+self.seconds','str(cjMaxer.otherFunctions.bossCount)',\ + 'str(self.workOutNumberAnHour(cjMaxer.otherFunctions.bossCount))',\ + 'str(cjMaxer.otherFunctions.numberToSuit[base.localAvatar.cogTypes[1]])+" lvl "+str(base.localAvatar.cogLevels[1]+1)','str(cjMaxer.otherFunctions.getNoticesLeft())'],\ + 'CJ MXR','law') + + def revert(self): + self.restock.revertFunctions() + self.daAutoer.revertFunctions() + self.cjAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +global cjMaxer +cjMaxer=CJMaxer() diff --git a/autoers/CJMaxerToontask.py b/autoers/CJMaxerToontask.py new file mode 100644 index 0000000..ec2fe16 --- /dev/null +++ b/autoers/CJMaxerToontask.py @@ -0,0 +1,785 @@ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.battle import DistributedBattle +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import DistributedStage +from toontown.coghq import DistributedStageBattle +from toontown.coghq import DistributedLawOfficeElevatorExt +from toontown.coghq import LawbotHQExterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit.DistributedSuit import DistributedSuit +from toontown.suit import DistributedLawbotBoss +from toontown.safezone import BRPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=lambda self: None +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedStageBattle.DistributedStageBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldTrolleyInit = DistributedTrolley.DistributedTrolley.__init__ +oldPartyInit = DistributedPartyGate.DistributedPartyGate.__init__ +oldDoorInit = DistributedDoor.DistributedDoor.__init__ + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + cjMaxer.daAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, description='5', event=None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, description='5', event=None) + self.unloaded=False + Sequence(Wait(3),Func(cjMaxer.daAutoer.generateAgain)).start() + self.collectLaff() + if self.wasInBattle: + cjMaxer.daAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldBrrInit=BRPlayground.BRPlayground.__init__ + oldEnterWalk=LawbotHQExterior.LawbotHQExterior.enterWalk + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + + def __init__(self): + self.shouldContinue=False + self.lastCogId=0 + self.bossCount=0 + self.onlyDA=False + self.canSetParentAgain=True + self.isHealing=False + self.isGlitched=False + self.numberToSuit={0:'Bottom Feeder',1:'Bloodsucker',2:'Double Talker',3:'Ambulance Chaser', + 4:'Back Stabber',5:'Spin Doctor',6:'Legal Eagle',7:'Big Wig'} + BRPlayground.BRPlayground.__init__=lambda *args:self.newBrrInit(*args) + LawbotHQExterior.LawbotHQExterior.enterWalk=lambda newSelf,*args: self.newEnterWalk(newSelf,*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getName()!='Skelecog': + attackSuit=suit + else: + attackSuit=battle.suits[0] + + if base.localAvatar.inventory.inventory[cjMaxer.restock.firstTrack][cjMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.firstTrack, cjMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[cjMaxer.restock.secondTrack][cjMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.secondTrack, cjMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[cjMaxer.restock.thirdTrack][cjMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.thirdTrack, cjMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[cjMaxer.restock.thirdTrack][cjMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cjMaxer.restock.thirdTrack, cjMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newBrrInit(self,*args): + self.oldBrrInit(*args) + if self.shouldContinue: + cjMaxer.daAutoer.gainLaffSeq.finish() + cjMaxer.daAutoer.generateAgain() + cjMaxer.daAutoer.attackSeq.finish() + cjMaxer.restock.wasInBattle=False + self.checkNotices() + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkNotices)).start() + except: + pass + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def newEnterWalk(self,newSelf,*args): + self.oldEnterWalk(newSelf,args) + if self.shouldContinue and len(args)>0: + base.localAvatar.setWantBattles(False) + self.checkNotices() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>96: + cjMaxer.daAutoer.attackSeq.finish() + self.isHealing=False + Sequence(Wait(1),Func(self.checkNotices)).start() + else: + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and self.lastCogId==args[0].doId: + self.enterRandomBattle() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def checkNotices(self): + if self.shouldEnd: + self.shouldContinue=False + base.localAvatar.setWantBattles(True) + if self.haveJb(): + if self.shouldContinue: + if self.getNoticesLeft()==0 and not self.onlyDA: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=13000 and base.localAvatar.getZoneId()<13100: + cjMaxer.cjAutoer.start() + else: + cjMaxer.restock.restock() + cjMaxer.restock.collectLaff() + self.walk() + cjMaxer.autoerGui.display.newLine('Teleporting to lawbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=13000 and base.localAvatar.getZoneId()<13100: + if (base.localAvatar.getHp()>96 and self.getNoticesLeft()>10) or self.isGlitched: + cjMaxer.daAutoer.start() + else: + cjMaxer.daAutoer.attackSeq.loop() + self.isHealing=True + self.enterRandomBattle() + else: + cjMaxer.restock.restock() + cjMaxer.restock.collectLaff() + self.walk() + cjMaxer.autoerGui.display.newLine('Teleporting to lawbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + cjMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(cjMaxer.restock.interest1) + base.cr.removeInterest(cjMaxer.restock.interest2) + cjMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's cj maxer") + cjMaxer.autoerGui.display.newLine('Stopped') + else: + cjMaxer.autoerGui.display.newLine('Out of jellybeans') + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getNoticesLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,1)-base.localAvatar.cogMerits[1] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=13000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoDA(self): + self.onlyDA=True + base.localAvatar.setSystemMessage(0,'CJ maxer set to only do the DA Office') + + def doBoth(self): + self.onlyDA=False + base.localAvatar.setSystemMessage(0,'CJ maxer set to do both the DA Office and the CJ') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.lastCogId=battle.doId + else: + pass + + def setStop(self): + self.shouldEnd=True + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + cjMaxer.autoerGui.stopTimer() + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + cjMaxer.autoerGui.startTimer() + emptyShardList=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + emptyShardList.append(shard) + if emptyShardList==[]: + emptyShardList=[650000000, 754000000, 608000000, 756000000, 658000000, 712000000, 360000000, 410000000, 620000000, 454000000, 726000000, 362000000, 688000000, 316000000] + if base.localAvatar.defaultShard not in emptyShardList: + cjMaxer.autoerGui.display.newLine('TPing to an empty district') + base.cr.playGame.getPlace().requestTeleport(13000,13000,random.choice(emptyShardList),None) + else: + self.checkNotices() + cjMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + BRPlayground.BRPlayground.__init__=self.oldBrrInit + LawbotHQExterior.LawbotHQExterior.enterWalk=self.oldEnterWalk + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class CjAutoer: + oldBossEnterElevator=DistributedLawbotBoss.DistributedLawbotBoss.enterElevator + oldEnterBattleThree=DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree + oldEnterPrepareBattleTwo=DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue + oldEnterRollToBattleTwo=DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedLawbotBoss.DistributedLawbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo=lambda newSelf: self.newEnterRollToBattleTwo(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + cjMaxer.autoerGui.display.newLine('Skipping CJ introduction') + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.otherFunctions.bossCount+=1 + newSelf._DistributedLawbotBoss__doneEpilogue() + cjMaxer.otherFunctions.walk() + cjMaxer.otherFunctions.teleBack() + cjMaxer.autoerGui.display.newLine('Finished CJ') + + def newEnterRollToBattleTwo(self,newSelf): + self.oldEnterRollToBattleTwo(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf.exitRollToBattleTwo() + cjMaxer.autoerGui.display.newLine('Skipping cutscene') + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLawbotBoss__onToBattleTwo(33) + cjMaxer.autoerGui.display.newLine('Skipping dialogue 1') + cjMaxer.autoerGui.display.newLine('Waiting for cannon round...') + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLawbotBoss__onToBattleThree(33) + cjMaxer.autoerGui.display.newLine('Skipping dialogue 2') + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + if cjMaxer.otherFunctions.shouldContinue: + self.endBattle() + cjMaxer.autoerGui.display.newLine('Completing evidence round') + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if cjMaxer.otherFunctions.shouldContinue: + self.exploit() + cjMaxer.autoerGui.display.newLine('Skipping Battle') + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and cjMaxer.otherFunctions.shouldContinue and base.localAvatar.getZoneId()==13100: + cjMaxer.otherFunctions.walk() + cjMaxer.autoerGui.display.newLine('Heading to CJ') + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(cjMaxer.otherFunctions.walk)).start() + + def endBattle(self): + CJ = base.cr.doFind('Chief Justice') + killSeq=Sequence() + for i in range(20): + killSeq.append(Func(CJ.sendUpdate,'hitBoss', [100])) + killSeq.append(Wait(0.05)) + killSeq.start() + + def start(self): + cjMaxer.autoerGui.display.newLine('Starting Chief Justice') + cjMaxer.autoerGui.display.newLine('Entering Lobby') + base.localAvatar.setWantBattles(True) + firstId=base.cr.doFindAll('CogHQDoor')[0].doId + if isinstance(base.cr.doId2do.get(firstId-2),DistributedCogHQDoor.DistributedCogHQDoor): + base.cr.doId2do.get(firstId-2).sendUpdate('requestEnter') + else: + base.cr.doId2do.get(firstId).sendUpdate('requestEnter') + + + def revertFunctions(self): + DistributedLawbotBoss.DistributedLawbotBoss.enterElevator=self.oldBossEnterElevator + DistributedLawbotBoss.DistributedLawbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedLawbotBoss.DistributedLawbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedLawbotBoss.DistributedLawbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedLawbotBoss.DistributedLawbotBoss.enterRollToBattleTwo=self.oldEnterRollToBattleTwo + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedLawbotBoss.DistributedLawbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class DAautoer: + oldElevatorAnnounceGenerate=DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate + oldEnterStageReward=DistributedStageBattle.DistributedStageBattle.enterStageReward + oldEnterReward=DistributedStageBattle.DistributedStageBattle.enterReward + oldStageGenerate=DistributedStage.DistributedStage.announceGenerate + + def __init__(self,cjMaxer): + self.gainLaffSeq=Sequence(Func(cjMaxer.restock.gainLaff),Wait(3.0)) + self.attackSeq=Sequence(Func(cjMaxer.restock.restock),Wait(1.0),Func(cjMaxer.otherFunctions.attack),Wait(1.0)) + DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate=lambda *args:self.newElevatorAnnounceGenerate(*args) + DistributedStageBattle.DistributedStageBattle.enterStageReward=lambda *args:self.newEnterStageReward(*args) + DistributedStageBattle.DistributedStageBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedStage.DistributedStage.announceGenerate=lambda newSelf,*args:self.newStageGenerate(newSelf,*args) + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: self.newSafeZone(*args) + base.localAvatar.died=lambda *args: self.newSafeZone(*args) + DistributedStageBattle.DistributedStageBattle.d_toonDied=lambda *args: self.newSafeZone(*args) + + def newStageAnnounceGenerate(self,newSelf,*args): + self.oldStageAnnounceGenerate(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + self.floorNum+=1 + cjMaxer.autoerGui.display.newLine('Entering Floor '+str(self.floorNum)) + Sequence(Wait(3),Func(self.doFloor,newSelf)).start() + + def newElevatorAnnounceGenerate(self,*args): + self.oldElevatorAnnounceGenerate(*args) + if cjMaxer.otherFunctions.shouldContinue and 'Office A' in args[0].getDestName(): + self.workOutOfficeNeeded() + Sequence(Wait(2),Func(self.boardElevator)).start() + + def newEnterStageReward(self,*args): + self.oldEnterStageReward(*args) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Completed Final Battle') + self.gainLaffSeq.finish() + self.attackSeq.finish() + self.generateAgain() + cjMaxer.otherFunctions.isGlitched=False + Sequence(Wait(2),Func(cjMaxer.otherFunctions.teleBack)).start() + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if cjMaxer.otherFunctions.shouldContinue: + cjMaxer.autoerGui.display.newLine('Error no notices received') + self.gainLaffSeq.finish() + self.attackSeq.finish() + self.generateAgain() + cjMaxer.otherFunctions.teleBack() + cjMaxer.otherFunctions.isGlitched=True + + def newStageGenerate(self,newSelf,*args): + self.oldStageGenerate(newSelf,*args) + if cjMaxer.otherFunctions.shouldContinue: + self.floorNum+=1 + cjMaxer.autoerGui.display.newLine('Entering Floor '+str(self.floorNum)) + Sequence(Wait(3),Func(self.doFloor,newSelf)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(cjMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + cjMaxer.restock.wasInBattle=True + cjMaxer.autoerGui.display.newLine('Died, recovering') + + def enterBattle(self): + if base.localAvatar.getHp()>0: + try: + base.cr.doFind('DistributedStage.DistributedStage').warpToRoom(2) + except: + pass + base.localAvatar.collisionsOn() + cjMaxer.restock.wasInBattle=False + + def workOutOfficeNeeded(self): + noticesNeeded=cjMaxer.otherFunctions.getNoticesLeft() + if noticesNeeded<98 or base.localAvatar.getHp()<81: + self.office='Office A' + elif noticesNeeded<190 or base.localAvatar.getHp()<86: + self.office='Office B' + elif noticesNeeded<324 or base.localAvatar.getHp()<96: + self.office='Office C' + else: + self.office='Office D' + + def doFloor(self,floor): + if base.cr.doFind('DistributedElevatorFloor'): + base.cr.doFind('DistributedElevatorFloor').handleEnterSphere(base.localAvatar.doId) + cjMaxer.autoerGui.display.newLine('Boarding Floor '+str(self.floorNum)+' elevator') + else: + floor.warpToRoom(2) + cjMaxer.autoerGui.display.newLine('Entering Final Battle') + + def boardElevator(self): + for elevator in base.cr.doFindAll('Elevator'): + if self.office in elevator.getDestName(): + if cjMaxer.otherFunctions.isGlitched: + cjMaxer.autoerGui.display.newLine('Fixing a glitch') + elevator.sendUpdate('requestBoard') + else: + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + cjMaxer.autoerGui.display.newLine('Heading to Office: '+self.office.split()[-1]) + self.gainLaffSeq.loop() + self.attackSeq.loop() + self.floorNum=0 + return + + def goToElevators(self): + firstId=base.cr.doFindAll('CogHQDoor')[0].doId + if isinstance(base.cr.doId2do.get(firstId+2),DistributedCogHQDoor.DistributedCogHQDoor): + base.cr.doId2do.get(firstId+2).sendUpdate('requestEnter') + else: + base.cr.doId2do.get(firstId).sendUpdate('requestEnter') + + def start(self): + base.localAvatar.setWantBattles(True) + self.goToElevators() + + def preTele(self): + DistributedTrolley.DistributedTrolley.__init__ = newInit + DistributedPartyGate.DistributedPartyGate.__init__ = newInit + DistributedDoor.DistributedDoor.__init__ = newInit + base.localAvatar.stopLookAroundNow() + + def generateAgain(self): + DistributedTrolley.DistributedTrolley.__init__ = oldTrolleyInit + DistributedPartyGate.DistributedPartyGate.__init__ = oldPartyInit + DistributedDoor.DistributedDoor.__init__ = oldDoorInit + base.localAvatar.findSomethingToLookAt = cjMaxer.restock.oldFindSomethingToLookAt + ToonHead.ToonHead._ToonHead__lookAround = cjMaxer.restock.oldLookAround + + def revertFunctions(self): + DistributedLawOfficeElevatorExt.DistributedLawOfficeElevatorExt.announceGenerate=self.oldElevatorAnnounceGenerate + DistributedStageBattle.DistributedStageBattle.enterStageReward=self.oldEnterStageReward + DistributedStageBattle.DistributedStageBattle.enterReward=self.oldEnterReward + DistributedStage.DistributedStage.announceGenerate=self.oldStageGenerate + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: None + base.localAvatar.died=lambda *args: None + DistributedStageBattle.DistributedStageBattle.d_toonDied=lambda *args: None + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + +class CJMaxer: + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.cjAutoer=CjAutoer() + self.daAutoer=DAautoer(self) + self.autoerGui=AutoerGui('CJ Maxer',['Run Time',"Number of CJ's","CJ's/Hour",'Suit','Notices needed'],\ + ['self.hours+":"+self.minutes+":"+self.seconds','str(cjMaxer.otherFunctions.bossCount)',\ + 'str(self.workOutNumberAnHour(cjMaxer.otherFunctions.bossCount))',\ + 'str(cjMaxer.otherFunctions.numberToSuit[base.localAvatar.cogTypes[1]])+" lvl "+str(base.localAvatar.cogLevels[1]+1)','str(cjMaxer.otherFunctions.getNoticesLeft())'],\ + 'CJ MXR','law') + + def revert(self): + self.restock.revertFunctions() + self.daAutoer.revertFunctions() + self.cjAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +global cjMaxer +cjMaxer=CJMaxer() diff --git a/autoers/GagTrainer15.py b/autoers/GagTrainer15.py new file mode 100644 index 0000000..e89c002 --- /dev/null +++ b/autoers/GagTrainer15.py @@ -0,0 +1,838 @@ +import random +import __main__ +import time +from toontown.battle import BattlePlace +from direct.interval.IntervalGlobal import * +from toontown.safezone import * +from toontown.toon import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.suit import DistributedSuit +from toontown.suit import SuitDNA +from toontown.battle import DistributedBattle +from toontown.building import DistributedDoor +from toontown.distributed import ToontownClientRepository +from toontown.effects import DistributedFireworkShow +for attribute in dir(DistributedFireworkShow.DistributedFireworkShow): + exec('DistributedFireworkShow.DistributedFireworkShow.'+attribute+'=lambda *args,**kwds: None') + +HOODZONES=range(1000,9001,1000) +HQZONES=[10000,11000,12000,13000] +base.localAvatar.setTeleportAccess([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000]) +base.localAvatar.setHoodsVisited([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000]) + +ToontownBattleGlobals.SkipMovie=1 +oldDumpShards=ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects +def newDumpShards(self): + try: + oldDumpShards(self) + except: + pass +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=newDumpShards + +suitToDamage={1:4,2:6,3:9,4:13,5:15,6:19,7:22,8:25,9:27,10:29,11:30,12:40} + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +hooks=''' +try: + _announceGenerate1 +except: + _announceGenerate1 = DistributedDoor.DistributedDoor.announceGenerate +def announceGenerate(self): + try: + _announceGenerate1(self) + except: + return None +DistributedDoor.DistributedDoor.announceGenerate = announceGenerate +try: + _announceGenerate2 +except: + _announceGenerate2 = DistributedPartyGate.DistributedPartyGate.announceGenerate +def announceGenerate(self): + try: + _announceGenerate2(self) + except: + return None +DistributedPartyGate.DistributedPartyGate.announceGenerate = announceGenerate +try: + old__init__ +except: + old__init__ = DistributedTrolley.DistributedTrolley.__init__ +def new__init__(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedTrolley.DistributedTrolley.__init__ = new__init__ +try: + old__init__2 +except: + old__init__2 = DistributedPartyGate.DistributedPartyGate.__init__ +def new__init__2(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPartyGate.DistributedPartyGate.__init__ = new__init__2 +try: + old__init__3 +except: + old__init__3 = DistributedDoor.DistributedDoor.__init__ +def new__init__3(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedDoor.DistributedDoor.__init__ = new__init__3 +try: + old__init__4 +except: + old__init__4 = DistributedPicnicBasket.DistributedPicnicBasket.__init__ +def new__init__4(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPicnicBasket.DistributedPicnicBasket.__init__ = new__init__4 +base.localAvatar.stopLookAroundNow() +base.localAvatar.findSomethingToLookAt = lambda *x:None +ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None +''' + + +class Inventory: + + def __init__(self): + self.firstTrack=4 + self.secondTrack=5 + self.track1StartXp=0 + self.track2StartXp=0 + self.useOwnLevels=False + self.firstTrackLevel=0 + self.secondTrackLevel=0 + self.noTrolley=False + self.inBattle=False + self.shouldResetClock=False + self.numberToName=['ToonUp','Trap','Lure','Sound','Throw','Squirt','Drop'] + + def getInv(self,command): + if command=="get1": + try: + return self.firstTrack + except: + return 4 + elif command=="get2": + try: + return self.secondTrack + except: + return 5 + elif command=="getLevel1": + try: + return self.firstTrackLevel + except: + return 0 + elif command=="getLevel2": + try: + return self.secondTrackLevel + except: + return 0 + elif command=="useOwnLevels": + try: + return self.useOwnLevels + except: + return False + + def setThrow1(self): + self.firstTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setThrow2(self): + self.secondTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setSquirt1(self): + self.firstTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setSquirt2(self): + self.secondTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setLure1(self): + self.firstTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setLure2(self): + self.secondTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setTrap1(self): + self.firstTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setTrap2(self): + self.secondTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setSound1(self): + self.firstTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setSound2(self): + self.secondTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setDrop1(self): + self.firstTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setDrop2(self): + self.secondTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as second gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setToonUp1(self): + self.secondTrack=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use toonup as first gag',5) + self.resetTrack1XpGained() + self.resetTrack2XpGained() + + def setToonUp2(self): + self.secondTrack=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use toonup as second gag',5) + + def track1Set1(self): + self.firstTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on first track',4) + + def track2Set1(self): + self.secondTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on second track',4) + + def track1Set2(self): + self.firstTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on first track',4) + + def track2Set2(self): + self.secondTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on second track',4) + + def track1Set3(self): + self.firstTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on first track',4) + + def track2Set3(self): + self.secondTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on second track',4) + + def track1Set4(self): + self.firstTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on first track',4) + + def track2Set4(self): + self.secondTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on second track',4) + + def track1Set5(self): + self.firstTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on first track',4) + + def track2Set5(self): + self.secondTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on second track',4) + + def track1Set6(self): + self.firstTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on first track',4) + + def track2Set6(self): + self.secondTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on second track',4) + + def useLevelsTrue(self): + self.useOwnLevels=True + base.localAvatar.setSystemMessage(0,'Gag trainer set to use levels') + + def useLevelsFalse(self): + self.useOwnLevels=False + base.localAvatar.setSystemMessage(0,'Gag trainer set to not use levels') + + def resetTrack1XpGained(self): + self.shouldResetClock=True + self.track1StartXp=base.localAvatar.experience.getExp(self.firstTrack) + + def resetTrack2XpGained(self): + self.shouldResetClock=True + self.track2StartXp=base.localAvatar.experience.getExp(self.secondTrack) + + def getTrack1XpGained(self): + return base.localAvatar.experience.getExp(self.firstTrack)-self.track1StartXp + + def getTrack2XpGained(self): + return base.localAvatar.experience.getExp(self.secondTrack)-self.track2StartXp + +class Restock: + + def __init__(self): + self.inventory=Inventory() + self.tryNum=1 + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.numToZone={1:2000,2:3000,3:9000,4:4000,5:6000,6:5000} + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(3)) + base.localAvatar.stopLookAroundNow() + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + try: + base.cr.bankManager.d_transferMoney(money - maxMoney) + except AttributeError: + pass + except: + pass + + def unloadGagshop(self): + base.cr.removeInterest(self.contextId) + + def restockGags(self): + self.gagShopRetZone = 4503 + self.firstTrack=self.inventory.getInv("get1") + self.secondTrack=self.inventory.getInv("get2") + + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + + desiredLevel1=self.executeGags("return1") + desiredLevel2=self.executeGags("return2") + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + + self.desiredInv="" + + for i in range(7*7): + if i==((self.firstTrack*7)+desiredLevel1): + if desiredLevel1>3: + if self.firstTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.firstTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + elif i==((self.secondTrack*7)+desiredLevel2): + if desiredLevel2>3: + if self.secondTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.secondTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + else: + self.desiredInv+="\x00" + + if base.localAvatar.inventory.inventory[self.firstTrack][self.executeGags("return1")]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.executeGags("return2")]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def gainLaff(self): + if self.tryNum>5: + self.tryNum=0 + self.tryNum+=1 + + zone=self.numToZone[self.tryNum] + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + self.toonUp=base.cr.addInterest(base.localAvatar.defaultShard, zone, description='5', event=None) + Sequence(Wait(1.0),Func(self.collectLaff),Func(base.cr.removeInterest, self.toonUp)).start() + + def gag(self,battle,track,level,toAttack): + battle.sendUpdate('requestAttack', [track, level, toAttack]) + battle.sendUpdate('movieDone') + + def executeGags(self,command): + badGags=[1,3,5] + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + firstTrack=self.inventory.getInv("get1") + secondTrack=self.inventory.getInv("get2") + + if useOwnLevel: + desiredLevel1=firstTrackLevel + desiredLevel2=secondTrackLevel + else: + desiredLevel1=base.localAvatar.experience.getExpLevel(firstTrack) + desiredLevel2=base.localAvatar.experience.getExpLevel(secondTrack) + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + + if firstTrack==0 and desiredLevel1 in badGags: + desiredLevel1-=1 + + if secondTrack==0 and desiredLevel2 in badGags: + desiredLevel2-=1 + + if command=="return1": + return desiredLevel1 + elif command=="return2": + return desiredLevel2 + + for battle in base.cr.doFindAll('battle'): + if base.localAvatar in battle.toons: + try: + if firstTrack==0: + toAttack1=base.localAvatar.doId + else: + toAttack1=battle.suits[0].doId + + if secondTrack==0: + toAttack2=base.localAvatar.doId + else: + toAttack2=battle.suits[0].doId + + if base.localAvatar.inventory.inventory[firstTrack][desiredLevel1]>0: + self.gag(battle,firstTrack,desiredLevel1,toAttack1) + + if base.localAvatar.inventory.inventory[secondTrack][desiredLevel2]>0: + self.gag(battle,secondTrack,desiredLevel2,toAttack2) + + except: + pass + + +class GagTrainer: + oldBattlePlaceTeleportIn=BattlePlace.BattlePlace.exitTeleportIn + oldTeleportInPlayground=Playground.Playground.exitTeleportIn + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldEnterFaceOff=DistributedBattle.DistributedBattle.enterFaceOff + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + + def __init__(self): + self.restock=Restock() + self.clearSettings() + self.shouldContinue=False + self.shouldChangeHood=False + self.shouldChangeDistrict=False + self.shouldChangeStreet=False + self.checkCogWalked=None + self.streetId=None + self.numBattles=0 + self.shardIds=[] + base.localAvatar.setWantBattles(False) + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<100: + self.shardIds.append(shard) + self.hoods=['1','3','4','5','9'] + self.lastCogId=0 + self.buyGags=Sequence(Func(self.restock.restockGags),Wait(3.0)) + self.gainLaff=Sequence(Func(self.restock.gainLaff),Wait(3.0)) + self.battleLoop=Sequence(Wait(1.5),Func(self.restock.executeGags,None)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda newSelf,*args: self.newDenyBattle(newSelf,*args) + DistributedBattle.DistributedBattle.enterFaceOff=lambda newSelf,*args: self.newEnterFaceOff(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + BattlePlace.BattlePlace.exitTeleportIn=lambda newSelf,*args: self.newBattlePlaceTeleportIn(newSelf,*args) + Playground.Playground.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInPlayground(newSelf,*args,**kwds) + self.autoerGui=AutoerGui('Gag Trainer',['Run Time',"Xp/Hour","Xp/Hour",'Cogs Killed','Cogs/Hour'],\ + ['self.formattedTime',\ + "('%s %s' %(gagTrainer.getTrack1Name(),self.workOutNumberAnHour(gagTrainer.getTrack1XpGained())))",\ + "('%s %s' %(gagTrainer.getTrack2Name(),self.workOutNumberAnHour(gagTrainer.getTrack2XpGained())))"\ + ,'str(gagTrainer.getNumBattles())'\ + ,'str(self.workOutNumberAnHour(gagTrainer.getNumBattles()))'],\ + 'GAG TRAINER',None) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + self.autoerGui.display.newLine('TP failed re-trying') + Sequence(Wait(3),Func(self.teleportBackToStreet)).start() + except: + pass + + def newEnterFaceOff(self,newSelf,*args): + self.oldEnterFaceOff(newSelf,*args) + if self.checkCogWalked: + self.checkCogWalked.pause() + + def newDenyBattle(self,newSelf,*args): + self.oldDenyBattle(newSelf,*args) + if self.lastCogId==newSelf.doId and self.shouldContinue: + if self.checkCogWalked: + self.checkCogWalked.pause() + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if base.localAvatar in newSelf.toons and self.shouldContinue: + newSelf.d_rewardDone(base.localAvatar.doId) + self.numBattles+=1 + Sequence(Wait(3),Func(self.enterRandomBattle)).start() + + def newBattlePlaceTeleportIn(self,newSelf,*args): + self.oldBattlePlaceTeleportIn(newSelf,*args) + if self.shouldContinue: + self.startLoops() + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newTeleportInPlayground(self,newSelf,*args,**kwds): + self.oldTeleportInPlayground(newSelf,*args,**kwds) + if self.shouldContinue: + self.autoerGui.display.newLine('Died, teleporting back') + Sequence(Wait(1),Func(self.checkWhatToDo)).start() + + def clearSettings(self): + self.hasSettings=False + self.cogName=None + self.cogType=None + self.cogLevel=None + + def getNumBattles(self): + return self.numBattles + + def getTrack1XpGained(self): + return self.restock.inventory.getTrack1XpGained() + + def getTrack2XpGained(self): + return self.restock.inventory.getTrack2XpGained() + + def getTrack1Name(self): + if self.restock.inventory.shouldResetClock: + self.autoerGui.startTime=time.time() + self.numBattles=0 + self.restock.inventory.shouldResetClock=False + return self.restock.inventory.numberToName[self.restock.inventory.firstTrack] + + def getTrack2Name(self): + return self.restock.inventory.numberToName[self.restock.inventory.secondTrack] + + def setCogName(self,name): + self.hasSettings=True + self.cogName=name + + def setCogType(self,type): + self.hasSettings=True + if type=='l': + type='Lawbot' + elif type=='s': + type='Sellbot' + elif type=='m': + type='Cashbot' + elif type=='c': + type='Bossbot' + self.cogType=type + + def setCogLevel(self,level): + self.hasSettings=True + self.cogLevel=level + + def newDistrict(self): + self.autoerGui.display.newLine('TPing to a new district') + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(),-3),self.streetId,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + except KeyError: + base.cr.playGame.getPlace().enterZone(self.streetId) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + + def enterRandomBattle(self): + if self.checkCogWalked: + self.checkCogWalked.pause() + firstTrack=self.restock.inventory.getInv("get1") + secondTrack=self.restock.inventory.getInv("get2") + battles = [] + battles2 = [] + for x in base.cr.doFindAllInstances(DistributedSuit.DistributedSuit): + if x.activeState == 6: + if x.getCurrentAnim() in ['walk','landing']: + if self.hasSettings and x.getActualLevel()>=self.cogLevel and (x.getName()==self.cogName or x.getStyleDept()==self.cogType or (not self.cogType and not self.cogName)): + battles.append(x) + battles2.append(True) + elif not self.hasSettings and x.getActualLevel()>self.restock.executeGags("return2") and x.getActualLevel()>self.restock.executeGags("return2"): + if base.localAvatar.getMaxHp()>suitToDamage[x.getActualLevel()] or self.restock.executeGags("return1")>3 or self.restock.executeGags("return2")>3: + battles.append(x) + battles2.append(True) + elif self.streetId>=11200 and self.streetId<=11300 and self.restock.executeGags("return1")>2 and self.restock.executeGags("return2")>2: + battles.append(x) + battles2.append(True) + else: + battles2.append(False) + else: + battles2.append(False) + if self.shouldContinue: + try: + if battles and base.localAvatar.getHp()>0: + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos,hpr) + self.checkCogWalked=Sequence(Wait(20),Func(self.enterRandomBattle)) + self.checkCogWalked.start() + self.lastCogId=battle.doId + else: + if hasattr(base.cr.playGame.getPlace(),'enterZone') and base.localAvatar.getZoneId() not in range(HQZONES[0],HQZONES[-1]+1000): + self.nextZone() + elif self.shouldChangeDistrict: + self.newDistrict() + else: + self.autoerGui.display.newLine('No cogs found') + Sequence(Wait(5),Func(self.enterRandomBattle)).start() + except: + pass + + def setLocation(self,zoneId): + if zoneId in range(10000,13999): + self.streetId=int(round(zoneId,-3)) + elif round(zoneId,-3)!=zoneId: + self.streetId=zoneId+2 + else: + self.streetId=zoneId+102 + self.autoerGui.display.newLine('Training zone: %s' %self.streetId) + + def teleportBackToStreet(self): + self.autoerGui.display.newLine('Tping back to training area') + self.walk() + self.restock.collectLaff() + base.cr.playGame.getPlace().requestTeleport(round(self.streetId,-3),self.streetId,None,None) + + def checkWhatToDo(self): + if not self.shouldContinue: + pass + elif not self.streetId: + base.localAvatar.setSystemMessage(0,'The gag trainer need to be started on a street') + self.stop() + elif base.localAvatar.defaultShard not in self.shardIds: + self.newDistrict() + elif base.localAvatar.getZoneId() not in range(self.streetId,self.streetId+90): + self.teleportBackToStreet() + else: + self.startLoops() + self.enterRandomBattle() + + def startLoops(self): + self.buyGags.loop() + self.gainLaff.loop() + self.battleLoop.loop() + self.invisibleSeq.loop() + + def stopLoops(self): + self.buyGags.pause() + self.gainLaff.pause() + self.battleLoop.pause() + self.invisibleSeq.pause() + + def start(self): + self.autoerGui.startTimer() + self.restock.inventory.resetTrack1XpGained() + self.restock.inventory.resetTrack2XpGained() + self.numBattles=0 + self.shouldContinue=True + exec(hooks, __main__.__dict__) + zone=int(round(base.localAvatar.getZoneId(),-2)) + if zone==11200: + zone=11000 + if zone!=base.localAvatar.getZoneId() or base.localAvatar.getZoneId() not in HOODZONES: + self.setLocation(zone) + self.checkWhatToDo() + + def stop(self): + self.stopLoops() + self.autoerGui.stopTimer() + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + DistributedPicnicBasket.DistributedPicnicBasket.__init__=old__init__4 + self.shouldContinue=False + self.autoerGui.display.newLine('Stopped') + + def walk(self): + base.cr.playGame.getPlace().fsm.forceTransition('walk') + + def revert(self): + BattlePlace.BattlePlace.exitTeleportIn=self.oldBattlePlaceTeleportIn + Playground.Playground.exitTeleportIn=self.oldTeleportInPlayground + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedBattle.DistributedBattle.enterFaceOff=self.oldEnterFaceOff + DistributedSuit.DistributedSuit.denyBattle=self.oldDenyBattle + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + base.localAvatar.setWantBattles(True) + self.autoerGui.destroy() + +gagTrainer=GagTrainer() \ No newline at end of file diff --git a/autoers/GagTrainer15Toontask.py b/autoers/GagTrainer15Toontask.py new file mode 100644 index 0000000..82e6266 --- /dev/null +++ b/autoers/GagTrainer15Toontask.py @@ -0,0 +1,776 @@ +import random +import __main__ +from toontown.battle import BattlePlace +from toontown.safezone import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.safezone import Playground +from toontown.suit import DistributedSuit +from toontown.suit import SuitDNA +from toontown.toon import HealthForceAcknowledge +from toontown.battle import DistributedBattle +from toontown.distributed import ToontownClientRepository +from toontown.effects import DistributedFireworkShow +for attribute in dir(DistributedFireworkShow.DistributedFireworkShow): + exec('DistributedFireworkShow.DistributedFireworkShow.'+attribute+'=lambda *args,**kwds: None') + +ToontownBattleGlobals.SkipMovie=1 +oldDumpShards=ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects +def newDumpShards(self): + try: + oldDumpShards(self) + except: + pass +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=newDumpShards + +suitToDamage={1:4,2:6,3:9,4:13,5:15,6:19,7:22,8:25,9:27,10:29,11:30,12:40} + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +hooks=''' +try: + _announceGenerate1 +except: + _announceGenerate1 = DistributedDoor.DistributedDoor.announceGenerate +def announceGenerate(self): + try: + _announceGenerate1(self) + except: + return None +DistributedDoor.DistributedDoor.announceGenerate = announceGenerate +try: + _announceGenerate2 +except: + _announceGenerate2 = DistributedPartyGate.DistributedPartyGate.announceGenerate +def announceGenerate(self): + try: + _announceGenerate2(self) + except: + return None +DistributedPartyGate.DistributedPartyGate.announceGenerate = announceGenerate +try: + old__init__ +except: + old__init__ = DistributedTrolley.DistributedTrolley.__init__ +def new__init__(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedTrolley.DistributedTrolley.__init__ = new__init__ +try: + old__init__2 +except: + old__init__2 = DistributedPartyGate.DistributedPartyGate.__init__ +def new__init__2(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPartyGate.DistributedPartyGate.__init__ = new__init__2 +try: + old__init__3 +except: + old__init__3 = DistributedDoor.DistributedDoor.__init__ +def new__init__3(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedDoor.DistributedDoor.__init__ = new__init__3 +try: + old__init__4 +except: + old__init__4 = DistributedPicnicBasket.DistributedPicnicBasket.__init__ +def new__init__4(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPicnicBasket.DistributedPicnicBasket.__init__ = new__init__4 +base.localAvatar.stopLookAroundNow() +base.localAvatar.findSomethingToLookAt = lambda *x:None +ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None +''' + + +class Inventory: + + def __init__(self): + self.firstTrack=4 + self.secondTrack=5 + self.useOwnLevels=False + self.firstTrackLevel=0 + self.secondTrackLevel=0 + self.noTrolley=False + self.inBattle=False + + def getInv(self,command): + if command=="get1": + try: + return self.firstTrack + except: + return 4 + elif command=="get2": + try: + return self.secondTrack + except: + return 5 + elif command=="getLevel1": + try: + return self.firstTrackLevel + except: + return 0 + elif command=="getLevel2": + try: + return self.secondTrackLevel + except: + return 0 + elif command=="useOwnLevels": + try: + return self.useOwnLevels + except: + return False + + def setThrow1(self): + self.firstTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as first gag',5) + def setThrow2(self): + self.secondTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as second gag',5) + + def setSquirt1(self): + self.firstTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as first gag',5) + + def setSquirt2(self): + self.secondTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as second gag',5) + + def setLure1(self): + self.firstTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as first gag',5) + + def setLure2(self): + self.secondTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as second gag',5) + + def setTrap1(self): + self.firstTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as first gag',5) + + def setTrap2(self): + self.secondTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as second gag',5) + + def setSound1(self): + self.firstTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as first gag',5) + + def setSound2(self): + self.secondTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as second gag',5) + + def setDrop1(self): + self.firstTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as first gag',5) + + def setDrop2(self): + self.secondTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as second gag',5) + + def setToonUp1(self): + self.secondTrack=0 + + def setToonUp2(self): + self.secondTrack=0 + + def track1Set1(self): + self.firstTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on first track',4) + + def track2Set1(self): + self.secondTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on second track',4) + + def track1Set2(self): + self.firstTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on first track',4) + + def track2Set2(self): + self.secondTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on second track',4) + + def track1Set3(self): + self.firstTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on first track',4) + + def track2Set3(self): + self.secondTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on second track',4) + + def track1Set4(self): + self.firstTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on first track',4) + + def track2Set4(self): + self.secondTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on second track',4) + + def track1Set5(self): + self.firstTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on first track',4) + + def track2Set5(self): + self.secondTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on second track',4) + + def track1Set6(self): + self.firstTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on first track',4) + + def track2Set6(self): + self.secondTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on second track',4) + + def useLevelsTrue(self): + self.useOwnLevels=True + levelsTrueFalse.setText("Using custom levels") + base.localAvatar.setSystemMessage(0,'Gag trainer set to use levels') + + def useLevelsFalse(self): + self.useOwnLevels=False + levelsTrueFalse.setText("Not Using custom levels") + base.localAvatar.setSystemMessage(0,'Gag trainer set to not use levels') + + def setNoTrolley(self,value): + self.noTrolley=value + + def getNoTrolley(self): + return self.noTrolley + +class Restock: + + def __init__(self): + self.inventory=Inventory() + self.tryNum=1 + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.numToZone={1:2000,2:3000,3:9000,4:4000,5:6000,6:5000} + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(3)) # Something is broken with this in new toontown + base.localAvatar.stopLookAroundNow() + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + try: + base.cr.bankManager.d_transferMoney(money - maxMoney) + except AttributeError: + pass + except: + pass + + def unloadGagshop(self): + base.cr.removeInterest(self.contextId) + + def restockGags(self,specificGag=[]): + if not specificGag: + self.gagShopRetZone = 4503 + self.firstTrack=self.inventory.getInv("get1") + self.secondTrack=self.inventory.getInv("get2") + + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + + desiredLevel1=self.executeGags("return1") + desiredLevel2=self.executeGags("return2") + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + else: + self.firstTrack=specificGag[0] + desiredLevel1=specificGag[1] + self.secondTrack=5 + desiredLevel2=0 + + self.desiredInv="" + + for i in range(7*7): + if i==((self.firstTrack*7)+desiredLevel1): + if desiredLevel1>3: + if self.firstTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.firstTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + elif i==((self.secondTrack*7)+desiredLevel2): + if desiredLevel2>3: + if self.secondTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.secondTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + else: + self.desiredInv+="\x00" + + if base.localAvatar.inventory.inventory[self.firstTrack][self.executeGags("return1")]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.executeGags("return2")]<2 or specificGag: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def gainLaff(self): + if self.tryNum>5: + self.tryNum=0 + self.tryNum+=1 + + zone=self.numToZone[self.tryNum] + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + self.toonUp=base.cr.addInterest(base.localAvatar.defaultShard, zone, description='5', event=None) + Sequence(Wait(1.0),Func(self.collectLaff),Func(base.cr.removeInterest, self.toonUp)).start() + + def gag(self,battle,track,level,toAttack): + battle.sendUpdate('requestAttack', [track, level, toAttack]) + battle.sendUpdate('movieDone') + + def executeGags(self,command): + badGags=[1,3,5] + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + firstTrack=self.inventory.getInv("get1") + secondTrack=self.inventory.getInv("get2") + + if useOwnLevel: + desiredLevel1=firstTrackLevel + desiredLevel2=secondTrackLevel + else: + desiredLevel1=base.localAvatar.experience.getExpLevel(firstTrack) + desiredLevel2=base.localAvatar.experience.getExpLevel(secondTrack) + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + + if firstTrack==0 and desiredLevel1 in badGags: + desiredLevel1-=1 + + if secondTrack==0 and desiredLevel2 in badGags: + desiredLevel2-=1 + + if command=="return1": + return desiredLevel1 + elif command=="return2": + return desiredLevel2 + + for battle in base.cr.doFindAll('battle'): + if base.localAvatar in battle.toons: + try: + if firstTrack==0: + toAttack1=base.localAvatar.doId + else: + toAttack1=battle.suits[0].doId + + if secondTrack==0: + toAttack2=base.localAvatar.doId + else: + toAttack2=battle.suits[0].doId + + if base.localAvatar.inventory.inventory[firstTrack][desiredLevel1]>0: + self.gag(battle,firstTrack,desiredLevel1,toAttack1) + + if base.localAvatar.inventory.inventory[secondTrack][desiredLevel2]>0: + self.gag(battle,secondTrack,desiredLevel2,toAttack2) + + except: + pass + + +class GagTrainer: + oldBattlePlaceTeleportIn=BattlePlace.BattlePlace.exitTeleportIn + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldEnterFaceOff=DistributedBattle.DistributedBattle.enterFaceOff + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + + def __init__(self): + self.restock=Restock() + self.clearSettings() + self.shouldContinue=False + self.shouldChangeHood=False + self.shouldChangeDistrict=True + self.shouldChangeStreet=True + self.checkCogWalked=None + self.shardIds=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<50: + self.shardIds.append(shard) + self.lastCogId=0 + self.buyGags=Sequence(Func(self.restock.restockGags),Wait(3.0)) + self.gainLaff=Sequence(Func(self.restock.gainLaff),Wait(3.0)) + self.battleLoop=Sequence(Wait(1.5),Func(self.restock.executeGags,None)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda newSelf,*args: self.newDenyBattle(newSelf,*args) + DistributedBattle.DistributedBattle.enterFaceOff=lambda newSelf,*args: self.newEnterFaceOff(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + BattlePlace.BattlePlace.exitTeleportIn=lambda newSelf,*args: self.newBattlePlaceTeleportIn(newSelf,*args) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(3),Func(self.teleportBackToStreet)).start() + except: + pass + + def newEnterFaceOff(self,newSelf,*args): + self.oldEnterFaceOff(newSelf,*args) + if self.checkCogWalked: + self.checkCogWalked.pause() + + def newDenyBattle(self,newSelf,*args): + self.oldDenyBattle(newSelf,*args) + if self.lastCogId==newSelf.doId and self.shouldContinue: + if self.checkCogWalked: + self.checkCogWalked.pause() + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if base.localAvatar in newSelf.toons and self.shouldContinue: + newSelf.d_rewardDone(base.localAvatar.doId) + + if not taskAutoer.isQuestComplete(): + Sequence(Wait(3),Func(self.enterRandomBattle)).start() + else: + self.stop() + base.localAvatar.collisionsOff() + Sequence(Wait(3),Func(taskAutoer.checkWhatToDo)).start() + + def newBattlePlaceTeleportIn(self,newSelf,*args): + self.oldBattlePlaceTeleportIn(newSelf,*args) + if self.shouldContinue: + self.startLoops() + Sequence(Wait(2),Func(self.enterRandomBattle)).start() + + def clearSettings(self): + self.hasSettings=False + self.shouldChangeHood = False + self.cogName=None + self.cogType=None + self.cogLevel=None + + def setCogName(self,name): + self.hasSettings=True + self.cogName=name + + def setCogType(self,type): + self.hasSettings=True + if type=='l': + type='Lawbot' + elif type=='s': + type='Sellbot' + elif type=='m': + type='Cashbot' + elif type=='c': + type='Bossbot' + self.cogType=type + + def setCogLevel(self,level): + self.hasSettings=True + self.cogLevel=level + + def newDistrict(self): + if self.shardIds[0] == base.localAvatar.defaultShard: + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(),-3),self.streetId,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def newStreet(self): + todo='street' + if self.streetId<9000: + if int(str(self.streetId)[1:])>300: + if self.shouldChangeDistrict: + self.streetId-=200 + todo='district' + elif self.shouldChangeHood: + todo='hood' + else: + self.streetId-=200 + else: + self.streetId+=100 + elif int(str(self.streetId)[1:])>200: + if self.shouldChangeDistrict: + self.streetId-=100 + todo='district' + + elif self.shouldChangeHood: + todo='hood' + else: + self.streetId-=100 + else: + self.streetId+=100 + + if todo=='district': + Sequence(Wait(2),Func(self.newDistrict)).start() + elif todo=='hood': + self.newHood() + else: + self.teleportBackToStreet() + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + except KeyError: + if self.shouldChangeStreet: + self.newStreet() + elif self.shouldChangeDistrict: + self.newDistrict() + else: + base.cr.playGame.getPlace().enterZone(self.streetId) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + + def enterRandomBattle(self): + if self.checkCogWalked: + self.checkCogWalked.pause() + firstTrack=self.restock.inventory.getInv("get1") + secondTrack=self.restock.inventory.getInv("get2") + battles = [] + battles2 = [] + for x in base.cr.doFindAllInstances(DistributedSuit.DistributedSuit): + if x.activeState == 6: + if x.getCurrentAnim() in ['walk','landing']: + if self.hasSettings and x.getActualLevel()>=self.cogLevel and (x.getName()==self.cogName or x.getStyleDept()==self.cogType or (not self.cogType and not self.cogName)): + battles.append(x) + battles2.append(True) + elif not self.hasSettings and x.getActualLevel()>self.restock.executeGags("return2") and x.getActualLevel()>self.restock.executeGags("return2"): + if base.localAvatar.getMaxHp()>suitToDamage[x.getActualLevel()] or self.restock.executeGags("return1")>3 or self.restock.executeGags("return2")>3: + battles.append(x) + battles2.append(True) + elif self.getPlace()>=11200 and self.getPlace()<=11300 and self.restock.executeGags("return1")>2 and self.restock.executeGags("return2")>2: + battles.append(x) + battles2.append(True) + else: + battles2.append(False) + else: + battles2.append(False) + if not taskAutoer.isQuestComplete(): + try: + if battles and base.localAvatar.getHp()>0: + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos,hpr) + self.checkCogWalked=Sequence(Wait(20),Func(self.enterRandomBattle)) + self.checkCogWalked.start() + self.lastCogId=battle.doId + else: + if hasattr(base.cr.playGame.getPlace(),'enterZone') and base.localAvatar.getZoneId() not in range(HQZONES[0],HQZONES[-1]+1000): + self.nextZone() + else: + self.newDistrict() + except: + pass + else: + self.stop() + base.localAvatar.collisionsOff() + Sequence(Wait(2),Func(taskAutoer.checkWhatToDo)).start() + + def setLocation(self,zoneId): + if zoneId in range(10000,13999): + self.streetId=zoneId + self.shouldChangeStreet=True + elif round(zoneId,-3)!=zoneId: + self.streetId=zoneId+2 + self.shouldChangeStreet=False + else: + self.shouldChangeStreet=True + self.streetId=zoneId+102 + + def teleportBackToStreet(self): + self.walk() + self.restock.collectLaff() + base.cr.playGame.getPlace().requestTeleport(round(self.streetId,-3),self.streetId,None,None) + + def startLoops(self): + self.buyGags.loop() + self.gainLaff.loop() + self.battleLoop.loop() + self.invisibleSeq.loop() + + def stopLoops(self): + self.buyGags.finish() + self.gainLaff.finish() + self.battleLoop.finish() + self.invisibleSeq.finish() + + def start(self): + if base.localAvatar.getTrackAccess()[0]: + self.restock.inventory.setToonUp2() + self.shouldContinue=True + exec(hooks, __main__.__dict__) + if base.localAvatar.getZoneId() not in range(self.streetId,self.streetId+90): + self.teleportBackToStreet() + else: + self.startLoops() + self.enterRandomBattle() + + def stop(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + DistributedPicnicBasket.DistributedPicnicBasket.__init__=old__init__4 + self.shouldContinue=False + self.stopLoops() + + def walk(self): + base.cr.playGame.getPlace().fsm.forceTransition('walk') \ No newline at end of file diff --git a/autoers/GolfAutoer.py b/autoers/GolfAutoer.py new file mode 100644 index 0000000..7b43647 --- /dev/null +++ b/autoers/GolfAutoer.py @@ -0,0 +1,232 @@ +from toontown.golf import DistributedGolfHole +from toontown.safezone import GZPlayground +from toontown.toon import LocalToon +from otp.otpbase import OTPGlobals +from direct.interval.IntervalGlobal import * + +class GolfAutoer: + + oldEnterChooseTee = DistributedGolfHole.DistributedGolfHole.enterChooseTee + oldGolferChooseTee = DistributedGolfHole.DistributedGolfHole.golferChooseTee + oldBallMovie2Client = DistributedGolfHole.DistributedGolfHole.ballMovie2Client + oldSetCourseBest = LocalToon.LocalToon.setGolfCourseBest + oldGotGolfCourse = DistributedGolfHole.DistributedGolfHole._DistributedGolfHole__gotGolfCourse + oldEnterWalk = GZPlayground.GZPlayground.enterWalk + oldSetAnim=LocalToon.LocalToon.setAnimState + + def __init__(self): + self.shouldContinue=False + self.shouldStop=False + self.shouldMember=False + self.automatic=True + self.course=2 + self.courseNum=0 + self.accountNum=0 + self.trophieStartNum=0 + self.canSetParentAgain=True + + DistributedGolfHole.DistributedGolfHole.enterChooseTee = lambda newSelf: self.newEnterChooseTee(newSelf) + DistributedGolfHole.DistributedGolfHole.golferChooseTee = lambda newSelf, avId: self.newGolferChooseTee(newSelf,avId) + DistributedGolfHole.DistributedGolfHole.ballMovie2Client = lambda newSelf, *args: self.newBallMovie2Client(newSelf,*args) + DistributedGolfHole.DistributedGolfHole._DistributedGolfHole__gotGolfCourse = lambda newSelf, golfCourse: self.new_DistributedGolfHole__gotGolfCourse(newSelf,golfCourse) + LocalToon.LocalToon.setGolfCourseBest = lambda newSelf, courseBest: self.setGolfCourseBest(newSelf,courseBest) + GZPlayground.GZPlayground.enterWalk = lambda newSelf,*args,**kwds: self.newEnterWalk(newSelf,*args,**kwds) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + + self.autoerGui=AutoerGui('Golf Autoer', + + ['Run Time','NO. Courses',\ + 'Courses/Hour','Number of Trophies','Trophies Gained'],\ + + ['self.hours+":"+self.minutes+":"+self.seconds','str(golfAutoer.courseNum)',\ + 'str(self.workOutNumberAnHour(golfAutoer.courseNum))',\ + 'str(golfAutoer.getNumTrophies())','str(golfAutoer.getNumTrophies()-golfAutoer.trophieStartNum)'],\ + + 'AUTO GOLF' + + ,None) + + def newBallMovie2Client(self, newSelf, *args): + self.oldBallMovie2Client(newSelf,*args) + if self.shouldContinue: + newSelf.sendUpdate('ballInHole') + self.autoerGui.display.newLine('Completing Hole %s'%(self.holeNum)) + self.holeNum+=1 + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterChooseTee(self,newSelf): + self.oldEnterChooseTee(newSelf) + if self.shouldContinue: + newSelf.sendUpdate('setAvatarTee', [0]) + + def newGolferChooseTee(self, newSelf, avId): + self.oldGolferChooseTee(newSelf,avId) + if self.shouldContinue: + if avId != base.localAvatar.doId: + return None + newSelf.sendUpdate('postSwingState', [ + 0.0, 0, 1.0, -2.5, 0.7, 1.0, 1.8, 0.6, + [ + ( + 0, 0, 4.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ), + ( + 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ) + ] + ] + ) + + def new_DistributedGolfHole__gotGolfCourse(self,newSelf,golfCourse): + self.oldGotGolfCourse(newSelf,golfCourse) + if self.shouldContinue: + newSelf.sendUpdate('setAvatarTee', [0]) + + def setGolfCourseBest(self, newSelf, courseBest): + self.oldSetCourseBest(newSelf,courseBest) + if self.shouldContinue: + newSelf.courseBest = courseBest + self.courseNum+=1 + self.autoerGui.display.newLine('Finished Course') + base.cr.doFind('DistributedGolfCourse').sendUpdate('setDoneReward', []) + + def newEnterWalk(self,newSelf,*args,**kwds): + self.oldEnterWalk(newSelf,**kwds) + if self.shouldStop: + self.shouldContinue=False + try: + self.autoerGui.display.newLine('Stopped') + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's golf autoer!") + if self.shouldContinue and len(args)>0: + self.goKart() + + def goKart(self): + if self.shouldStop: + self.shouldContinue=False + try: + self.autoerGui.display.newLine('Stopped') + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's golf autoer!") + if self.shouldContinue: + self.autoerGui.display.newLine('Attempting to board kart') + self.workOutCourse() + self.walk() + for golfKart in base.cr.doFindAll('DistributedGolfKart'): + if golfKart.golfCourse==self.course: + self.holeNum=1 + Sequence(Wait(self.accountNum),Func(golfKart.handleEnterGolfKartSphere,0),Wait(4),Func(self.checkInKart)).start() + return + + def checkInKart(self): + if base.localAvatar.getCurrentAnim()!='sit': + Sequence(Func(self.goKart)).start() + else: + pass + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def getNumTrophies(self): + numTrophies=0 + for trophie in base.localAvatar.getGolfTrophies(): + if trophie: + numTrophies+=1 + return numTrophies + + def makeMember(self): + base.cr._OTPClientRepository__isPaid = True + OTPGlobals.AccessVelvetRope = 2 + OTPGlobals.AccessFull = 2 + LocalToon.LocalToon.gameAccess = 2 + base.launcher.setValue(base.launcher.PaidUserLoggedInKey, '1') + LocalToon.LocalToon.getGameAccess = lambda *args: 2 + base.cr.allowSecretChat = lambda *args,**kwds: True + base.cr.isParentPasswordSet = lambda *args,**kwds: True + + def setMember(self): + self.shouldMember=True + base.localAvatar.setSystemMessage(0,"Golf Autoer: Toon will become a pretend member.") + + def unsetMember(self): + self.shouldMember=False + base.localAvatar.setSystemMessage(0,"Golf Autoer: Toon set not to be a member.") + + def setAutomatic(self): + self.automatic=True + base.localAvatar.setSystemMessage(0,"Golf Autoer: Set to be automatic (Works out what courses you need).") + + def setPar(self): + self.automatic=False + self.course=0 + base.localAvatar.setSystemMessage(0,"Golf Autoer: Set to do the course 'Walk in the par'") + + def setFun(self): + self.automatic=False + self.course=1 + base.localAvatar.setSystemMessage(0,"Golf Autoer: Set to do the course 'Holesome fun'") + + def setHoleKit(self): + self.automatic=False + self.course=2 + base.localAvatar.setSystemMessage(0,"Golf Autoer: Set to do the course 'The hole kit and caboodle'") + + def setFirst(self): + self.accountNum=0 + + def setSecond(self): + self.accountNum=5 + + def workOutCourse(self): + if self.automatic: + if self.getNumTrophies()>=22 and not base.localAvatar.getGolfTrophies()[23]: + self.course=0 + elif self.getNumTrophies()>=25 and not base.localAvatar.getGolfTrophies()[26]: + self.course=1 + else: + self.course=2 + + def start(self): + self.trophieStartNum=self.getNumTrophies() + self.courseNum=0 + self.shouldContinue=True + self.shouldStop=False + self.autoerGui.startTimer() + self.workOutCourse() + if self.shouldMember: + self.makeMember() + if base.localAvatar.getZoneId()==17000: + self.goKart() + else: + base.cr.playGame.getPlace().handleBookCloseTeleport(17000, 17000) + + def setStop(self): + self.shouldStop=True + base.localAvatar.setSystemMessage(0,"The Autoer will stop at the end of this run") + self.autoerGui.stopTimer() + + def revertFunctions(self): + DistributedGolfHole.DistributedGolfHole.enterChooseTee = self.oldEnterChooseTee + DistributedGolfHole.DistributedGolfHole.golferChooseTee = self.oldGolferChooseTee + DistributedGolfHole.DistributedGolfHole.ballMovie2Client = self.oldBallMovie2Client + LocalToon.LocalToon.setGolfCourseBest = self.oldSetCourseBest + DistributedGolfHole.DistributedGolfHole._DistributedGolfHole__gotGolfCourse = self.oldGotGolfCourse + GZPlayground.GZPlayground.enterWalk = self.oldEnterWalk + self.autoerGui.destroy() + +global golfAutoer +golfAutoer=GolfAutoer() \ No newline at end of file diff --git a/autoers/RaceAutoer.py b/autoers/RaceAutoer.py new file mode 100644 index 0000000..e6c604d --- /dev/null +++ b/autoers/RaceAutoer.py @@ -0,0 +1,253 @@ +from direct.interval.IntervalGlobal import * +from toontown.safezone import GSPlayground +from toontown.racing import DistributedRace +from toontown.racing import DistributedStartingBlock +from toontown.toon import LocalToon +from otp.otpbase import OTPGlobals + +class RaceAutoer: + + oldTeleportIn=GSPlayground.GSPlayground.exitTeleportIn + oldRaceAnnounceGenerate=DistributedRace.DistributedRace.announceGenerate + oldStartCountdownClock=DistributedRace.DistributedRace.startCountdownClock + oldRejectEnter=DistributedStartingBlock.DistributedStartingBlock.rejectEnter + oldSetAnim=LocalToon.LocalToon.setAnimState + + def __init__(self): + self.accountNum=0 + self.setSpeedway() + self.trackType=0 + self.raceNum=0 + self.shouldStop=False + self.shouldContinue=False + self.shouldMember=False + self.canSetParentAgain=True + self.autoerGui=AutoerGui('Race Autoer', + + ['Run Time','NO. Races Completed',\ + 'Races/hour','Number of tickets','NO. Trophies'],\ + + ['self.hours+":"+self.minutes+":"+self.seconds','str(raceAutoer.raceNum)',\ + 'str(self.workOutNumberAnHour(raceAutoer.raceNum))',\ + 'str(base.localAvatar.getTickets())','str(raceAutoer.getNumTrophies())'],\ + + 'AUTO RACE' + + ,None) + + GSPlayground.GSPlayground.exitTeleportIn=lambda *args: self.newTeleportIn(*args) + DistributedRace.DistributedRace.announceGenerate=lambda newSelf,*args: self.newRaceAnnounceGenerate(newSelf,*args) + DistributedRace.DistributedRace.startCountdownClock=lambda newSelf,*args: self.newStartCountdownClock(newSelf,*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedStartingBlock.DistributedStartingBlock.rejectEnter=lambda newSelf,errCode: self.newRejectEnter(newSelf,errCode) + + def newRaceAnnounceGenerate(self,newSelf,*args): + self.oldRaceAnnounceGenerate(newSelf,*args) + Sequence(Wait(3),Func(self.doRules,newSelf)).start() + + def doRules(self,newSelf): + if self.shouldContinue: + self.autoerGui.display.newLine('Accepting rules') + newSelf.handleRulesDone() + + def newStartCountdownClock(self,newSelf,*args): + if self.shouldContinue: + self.raceNum+=1 + self.autoerGui.display.newLine('Completing race place '+str(self.accountNum+1)) + Sequence(Wait(self.accountNum),Func(newSelf.enterRacing),Wait(0.5),Func(newSelf.sendUpdate,'heresMyT',[base.localAvatar.doId, 3, 1.0, 1]),Wait(0.5),Func(newSelf.leaveRace)).start() + + def newTeleportIn(self,*args): + self.oldTeleportIn(*args) + if self.shouldContinue: + Sequence(Wait(1),Func(self.goToBlock)).start() + + def newRejectEnter(self,newSelf,errCode): + if self.shouldContinue: + Sequence(Wait(2),Func(self.goToBlock)).start() + else: + self.oldRejectEnter(newSelf,errCode) + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def goToBlock(self): + if self.shouldStop: + self.shouldContinue=False + + if self.shouldContinue: + self.walk() + self.workOutTrack() + base.localAvatar.collisionsOff() + padList,trackIds=[],[] + + for x in base.cr.doFindAll("RacePad"): + if x.trackType==self.trackType and x.trackNameNode.getText() in self.tracks: + if self.tracks[0] not in trackIds or self.tracks[1] not in trackIds: + trackIds.append(x.trackNameNode.getText()) + padList.append(x) + else: + for y in range(len(padList)): + if padList[y].trackNameNode.getText==x.trackNameNode.getText() and padList[y].doId>x.doId: + del padList[y] + del trackIds[y] + + padList.sort() + if len(padList)>0: + for race in padList: + numBlocksEmpty=0 + for block in race.startingBlocks: + if block.state=='Off': + numBlocksEmpty+=1 + startingBlock=block + + if numBlocksEmpty>1: + self.autoerGui.display.newLine('Going to block '+str(self.accountNum+1)) + startingBlock.sendUpdate("requestEnter",[True]) + break + else: + base.localAvatar.setSystemMessage(0,'Race Autoer: The track type was not found, or there were no free spots, trying again') + Sequence(Wait(2),Func(self.goToBlock)).start() + + + def setAccountNum1(self): + self.accountNum=0 + base.localAvatar.setSystemMessage(0,'Race Autoer: Toon number set to 1') + + def setAccountNum2(self): + self.accountNum=1 + base.localAvatar.setSystemMessage(0,'Race Autoer: Toon number set to 2') + + def setAccountNum3(self): + self.accountNum=2 + base.localAvatar.setSystemMessage(0,'Race Autoer: Toon number set to 3') + + def setAccountNum4(self): + self.accountNum=3 + base.localAvatar.setSystemMessage(0,'Race Autoer: Toon number set to 4') + + def setSpeedway(self): + self.tracks=('Screwball Stadium', 'Corkscrew Coliseum') + self.automatic=False + base.localAvatar.setSystemMessage(0,'Race Autoer: Set to do stadium tracks') + + def setUrban(self): + self.tracks=('Airborne Acres', 'Rustic Raceway') + self.automatic=False + base.localAvatar.setSystemMessage(0,'Race Autoer: Set to do urban tracks') + + def setRural(self): + self.tracks=('City Circuit', 'Blizzard Boulevard') + self.automatic=False + base.localAvatar.setSystemMessage(0,'Race Autoer: Set to do rural tracks') + + def setTournament(self): + self.trackType=2 + self.automatic=False + base.localAvatar.setSystemMessage(0,'Race Autoer: This may not work properly unless all account have more than 1000 tickets') + + def setToonbattle(self): + self.trackType=1 + self.automatic=False + base.localAvatar.setSystemMessage(0,'Race Autoer: This may not work properly unless all account have more than 500 tickets') + + def setPractice(self): + self.trackType=0 + self.automatic=False + base.localAvatar.setSystemMessage(0,"Race Auoter: To Gain any trohpies more than 1 account needs to be used") + + def setMember(self): + self.shouldMember=True + base.localAvatar.setSystemMessage(0,"Race Auoter: Toon will become a pretend member (so it can do toonbattle and Grand Prix) when started") + + def setAutomatic(self): + self.automatic=True + base.localAvatar.setSystemMessage(0,"Race Auoter: The autoer will work out what track and track type to do based on your trophies needed") + + def unsetMember(self): + self.shouldMember=False + base.localAvatar.setSystemMessage(0,"Race Auoter: Toon set not to be a member") + + def getNumTrophies(self): + numTrophies=0 + for trophie in base.localAvatar.getKartingTrophies(): + if trophie: + numTrophies+=1 + return numTrophies + + def workOutTrack(self): + if self.automatic: + override=False + tracks=[] + for x in base.cr.doFindAll("RacePad"): + tracks.append(x.trackType) + + if not base.localAvatar.getKartingTrophies()[2]: + self.tracks=('Screwball Stadium', 'Corkscrew Coliseum') + + elif not base.localAvatar.getKartingTrophies()[5]: + self.tracks=('Airborne Acres', 'Rustic Raceway') + + elif not base.localAvatar.getKartingTrophies()[8]: + self.tracks=('City Circuit', 'Blizzard Boulevard') + + else: + override=True + self.trackType=2 + + if not override: + if base.localAvatar.getTickets()>400 and 1 in tracks: + self.trackType=1 + elif base.localAvatar.getTickets()>1000 and 2 in tracks: + self.trackType=2 + else: + self.trackType=0 + + def makeMember(self): + base.cr._OTPClientRepository__isPaid = True + OTPGlobals.AccessVelvetRope = 2 + OTPGlobals.AccessFull = 2 + LocalToon.LocalToon.gameAccess = 2 + base.launcher.setValue(base.launcher.PaidUserLoggedInKey, '1') + LocalToon.LocalToon.getGameAccess = lambda *args: 2 + base.cr.allowSecretChat = lambda *args,**kwds: True + base.cr.isParentPasswordSet = lambda *args,**kwds: True + + def revertFunctions(self): + GSPlayground.GSPlayground.exitTeleportIn=self.oldTeleportIn + DistributedRace.DistributedRace.announceGenerate=self.oldRaceAnnounceGenerate + DistributedRace.DistributedRace.startCountdownClock=self.oldStartCountdownClock + DistributedStartingBlock.DistributedStartingBlock.rejectEnter=self.oldRejectEnter + LocalToon.LocalToon.setAnimState=self.oldSetAnim + self.autoerGui.destroy() + + def start(self): + self.raceNum=0 + self.startingTickets=base.localAvatar.getTickets() + self.shouldContinue=True + self.shouldStop=False + self.autoerGui.startTimer() + if self.shouldMember: + self.makeMember() + if base.localAvatar.getZoneId()==8000: + self.goToBlock() + else: + base.cr.playGame.getPlace().handleBookCloseTeleport(8000, 8000) + + def setStop(self): + self.shouldStop=True + self.autoerGui.stopTimer() + +raceAutoer=RaceAutoer() \ No newline at end of file diff --git a/autoers/Scripts/Building Autoer.txt b/autoers/Scripts/Building Autoer.txt new file mode 100644 index 0000000..16bd5ea --- /dev/null +++ b/autoers/Scripts/Building Autoer.txt @@ -0,0 +1,109 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'BLDG Autoer',\ + + 'description':"Building Autoer designed to do building tasks quickly or get as many\ +floors as possible in 1 day. The autoer will not change district if no buildings are found\ +on that street, but can be set to in the settings.",\ + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'buildingAutoer.revert()',\ + + 'start':'buildingAutoer.start()',\ + + 'stop':'buildingAutoer.stop()',\ + + 'close':'buildingAutoer.autoerGui.hideAll()',\ + + 'open':'buildingAutoer.autoerGui.showAll()',\ + + 'options':{ + 'Only Sellbot':{ + 'command':'buildingAutoer.setSellbot',\ + 'pos':(0,0)\ + }, + + 'Only Cashbot':{ + 'command':'buildingAutoer.setCashbot',\ + 'pos':(1,0) + }, + + 'Only Lawbot':{ + 'command':'buildingAutoer.setLawbot',\ + 'pos':(2,0)\ + }, + + 'Only Bossbot':{ + 'command':'buildingAutoer.setBossbot',\ + 'pos':(3,0) + }, + + 'Any Type':{ + 'command':'buildingAutoer.setAll',\ + 'pos':(4,0) + }, + + '1+ Story':{ + 'command':'buildingAutoer.setLevel1',\ + 'pos':(0,1) + }, + + '2+ Story':{ + 'command':'buildingAutoer.setLevel2',\ + 'pos':(1,1) + }, + + '3+ Story':{ + 'command':'buildingAutoer.setLevel3',\ + 'pos':(2,1) + }, + + '4+ Story':{ + 'command':'buildingAutoer.setLevel4',\ + 'pos':(3,1) + }, + + '5+ Story':{ + 'command':'buildingAutoer.setLevel5',\ + 'pos':(4,1) + }, + + 'Allow Change Dis':{ + 'command':'buildingAutoer.changeDistrict',\ + 'pos':(5,1) + }, + + 'No Change Dis':{ + 'command':'buildingAutoer.noChangeDistrict',\ + 'pos':(5,0) + }, + + 'Allow Change Str':{ + 'command':'buildingAutoer.changeStreet',\ + 'pos':(6,1) + }, + + 'No Change Str':{ + 'command':'buildingAutoer.noChangeStreet',\ + 'pos':(6,0) + }, + + 'Allow Change Hood':{ + 'command':'buildingAutoer.changeHood',\ + 'pos':(7,1) + }, + + 'No Change Hood':{ + 'command':'buildingAutoer.noChangeHood',\ + 'pos':(7,0) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/BuildingAutoer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/CEO maxer.txt b/autoers/Scripts/CEO maxer.txt new file mode 100644 index 0000000..8fc0d52 --- /dev/null +++ b/autoers/Scripts/CEO maxer.txt @@ -0,0 +1,51 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'CEO Maxer',\ + + 'description':"WARNING: This script has been considered highly banable \ +which is why there is a limiter in the options. \ +The CEO maxer is a script designed to max your Bossbot suit. It does a Country Club \ +(Back Nine, Middle Six, Front Three) depending on how many stocks you need \ +and it does the CEO when it is ready.",\ + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'ceoMaxer.revert()',\ + + 'start':'ceoMaxer.otherFunctions.start()',\ + + 'stop':'ceoMaxer.otherFunctions.setStop()',\ + + 'close':'ceoMaxer.autoerGui.hideAll()',\ + + 'open':'ceoMaxer.autoerGui.showAll()',\ + + 'options':{ + 'Run Limiter On':{ + 'command':'ceoMaxer.otherFunctions.limiterOn',\ + 'pos':(0,0)\ + }, + + 'Run Limiter Off':{ + 'command':'ceoMaxer.otherFunctions.limiterOff',\ + 'pos':(0,1) + }, + + 'Only Do Club':{ + 'command':'ceoMaxer.otherFunctions.onlyDoClub',\ + 'pos':(1,0)\ + }, + + 'Do Both':{ + 'command':'ceoMaxer.otherFunctions.doBoth',\ + 'pos':(1,1) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/CEOMaxer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/CFO maxer.txt b/autoers/Scripts/CFO maxer.txt new file mode 100644 index 0000000..de0d9c5 --- /dev/null +++ b/autoers/Scripts/CFO maxer.txt @@ -0,0 +1,43 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'CFO Maxer',\ + + 'description':"The CFO maxer is a script designed to max your Cashbot suit. It does the Mint \ +when you need merits and does a CFO when you have the cogbucks you need. When you are maxed \ +it will continue to do the cfo gaining you Unites. A full credit to the functions used \ +can be found of my channel (ToontownInjecting).", + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'cfoMaxer.revert()',\ + + 'start':'cfoMaxer.otherFunctions.start()',\ + + 'stop':'cfoMaxer.otherFunctions.setStop()',\ + + 'close':'cfoMaxer.autoerGui.hideAll()',\ + + 'open':'cfoMaxer.autoerGui.showAll()',\ + + 'options':{ + 'Only Do Mint':{ + 'command':'cfoMaxer.otherFunctions.onlyDoMint',\ + 'pos':(0,0)\ + }, + + 'Do Both':{ + 'command':'cfoMaxer.otherFunctions.doBoth',\ + 'pos':(0,1) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/CFOMaxer.py'} + +try: + toonBot.addScript(script) +except: + base.localAvatar.setSystemMessage(0,'You did not follow instructions, this script needs to be added to Toon-Bot which can be found on my channel (youtube.com/toontowninjecting)') \ No newline at end of file diff --git a/autoers/Scripts/CJ Maxer.txt b/autoers/Scripts/CJ Maxer.txt new file mode 100644 index 0000000..d83ca08 --- /dev/null +++ b/autoers/Scripts/CJ Maxer.txt @@ -0,0 +1,40 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'CJ Maxer',\ + + 'description':"The CJ maxer is a script used to max your Lawbot suit. It does a DA office \ +(A different one depending on notices needed) when it needs notices and does a CJ when it has all \ +the notices it needs. Full credit to all the functions used in the script can be found on my \ +channel (ToontownInjecting).", + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'cjMaxer.revert()',\ + + 'start':'cjMaxer.otherFunctions.start()',\ + + 'stop':'cjMaxer.otherFunctions.setStop()',\ + + 'close':'cjMaxer.autoerGui.hideAll()',\ + + 'open':'cjMaxer.autoerGui.showAll()',\ + + 'options':{ + 'Only Do DA':{ + 'command':'cjMaxer.otherFunctions.onlyDoDA',\ + 'pos':(0,0)\ + }, + + 'Do Both':{ + 'command':'cjMaxer.otherFunctions.doBoth',\ + 'pos':(0,1) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/CJMaxer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/Fish Autoer.txt b/autoers/Scripts/Fish Autoer.txt new file mode 100644 index 0000000..3b833da --- /dev/null +++ b/autoers/Scripts/Fish Autoer.txt @@ -0,0 +1,39 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'Fish Autoer',\ + + 'description':"The Fishing autoer is a script designed to either get you max jelly beans \ +or max your fishing trophies (Depending on what is set up in the options). Fill credit to the \ +functions used can be found on my channel (ToontownInjecting).", + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'fishingAutoer.revertFunctions()',\ + + 'start':'fishingAutoer.start()',\ + + 'stop':'fishingAutoer.setStop()',\ + + 'close':'fishingAutoer.autoerGui.hideAll()',\ + + 'open':'fishingAutoer.autoerGui.showAll()',\ + + 'options':{ + 'Stop At Max Jbs':{ + 'command':'fishingAutoer.stopOnMax',\ + 'pos':(0,0)\ + }, + + 'Continue To Fish':{ + 'command':'fishingAutoer.continueFishing',\ + 'pos':(0,1) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/FishAutoer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/Gag Trainer.txt b/autoers/Scripts/Gag Trainer.txt new file mode 100644 index 0000000..491059b --- /dev/null +++ b/autoers/Scripts/Gag Trainer.txt @@ -0,0 +1,179 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'Gag Trainer',\ + + 'description':"Gag trainer has been a script that has been a\ +progressively improved script I have been working on for 7 months\ +on and off now. This is the final version I will be producing of the\ +script to make it tidier and integrate it with toonbot.",\ + + 'author': 'Freshollie',\ + + 'version': '1.5',\ + + 'unload':'gagTrainer.revert()',\ + + 'start':'gagTrainer.start()',\ + + 'stop':'gagTrainer.stop()',\ + + 'close':'gagTrainer.autoerGui.hideAll()',\ + + 'open':'gagTrainer.autoerGui.showAll()',\ + + 'text':{ + 'First Gag':(0,0), + 'Second Gag':(0,1) + }, + + 'options':{ + 'Toonup ':{ + 'command':'gagTrainer.restock.inventory.setToonUp1',\ + 'pos':(1,0)\ + }, + + 'Toonup':{ + 'command':'gagTrainer.restock.inventory.setToonUp2',\ + 'pos':(1,1)\ + }, + + 'Trap ':{ + 'command':'gagTrainer.restock.inventory.setTrap1',\ + 'pos':(2,0)\ + }, + + 'Trap':{ + 'command':'gagTrainer.restock.inventory.setTrap2',\ + 'pos':(2,1)\ + }, + + 'Lure ':{ + 'command':'gagTrainer.restock.inventory.setLure1',\ + 'pos':(3,0)\ + }, + + 'Lure':{ + 'command':'gagTrainer.restock.inventory.setLure2',\ + 'pos':(3,1)\ + }, + + 'Sound ':{ + 'command':'gagTrainer.restock.inventory.setSound1',\ + 'pos':(4,0)\ + }, + + 'Sound':{ + 'command':'gagTrainer.restock.inventory.setSound2',\ + 'pos':(4,1)\ + }, + + 'Throw ':{ + 'command':'gagTrainer.restock.inventory.setThrow1',\ + 'pos':(5,0)\ + }, + + 'Throw':{ + 'command':'gagTrainer.restock.inventory.setThrow2',\ + 'pos':(5,1)\ + }, + + 'Squirt ':{ + 'command':'gagTrainer.restock.inventory.setSquirt1',\ + 'pos':(6,0)\ + }, + + 'Squirt':{ + 'command':'gagTrainer.restock.inventory.setSquirt2',\ + 'pos':(6,1)\ + }, + + 'Drop ':{ + 'command':'gagTrainer.restock.inventory.setDrop1',\ + 'pos':(7,0)\ + }, + + 'Drop':{ + 'command':'gagTrainer.restock.inventory.setDrop2',\ + 'pos':(7,1)\ + }, + + 'Custom Levels':{ + 'command':'gagTrainer.restock.inventory.useLevelsTrue',\ + 'pos':(8,0)\ + }, + + 'No Custom':{ + 'command':'gagTrainer.restock.inventory.useLevelsFalse',\ + 'pos':(8,1)\ + }, + + 'Level 1 ':{ + 'command':'gagTrainer.restock.inventory.track1Set1',\ + 'pos':(9,0)\ + }, + + 'Level 1':{ + 'command':'gagTrainer.restock.inventory.track2Set1',\ + 'pos':(9,1)\ + }, + + 'Level 2 ':{ + 'command':'gagTrainer.restock.inventory.track1Set2',\ + 'pos':(10,0)\ + }, + + 'Level 2':{ + 'command':'gagTrainer.restock.inventory.track2Set2',\ + 'pos':(10,1)\ + }, + + 'Level 3 ':{ + 'command':'gagTrainer.restock.inventory.track1Set3',\ + 'pos':(11,0)\ + }, + + 'Level 3':{ + 'command':'gagTrainer.restock.inventory.track2Set3',\ + 'pos':(11,1)\ + }, + + 'Level 4 ':{ + 'command':'gagTrainer.restock.inventory.track1Set4',\ + 'pos':(12,0)\ + }, + + 'Level 4':{ + 'command':'gagTrainer.restock.inventory.track2Set4',\ + 'pos':(12,1)\ + }, + + 'Level 5 ':{ + 'command':'gagTrainer.restock.inventory.track1Set5',\ + 'pos':(13,0)\ + }, + + 'Level 5':{ + 'command':'gagTrainer.restock.inventory.track2Set5',\ + 'pos':(13,1)\ + }, + + 'Level 6 ':{ + 'command':'gagTrainer.restock.inventory.track1Set6',\ + 'pos':(14,0)\ + }, + + 'Level 6':{ + 'command':'gagTrainer.restock.inventory.track2Set6',\ + 'pos':(14,1)\ + } + + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/GagTrainer15.py'} + +try: + toonBot.addScript(script) +except: + base.localAvatar.setSystemMessage(0,'You did not follow instructions, you need to inject toonbot before injecting this script') \ No newline at end of file diff --git a/autoers/Scripts/Golf Autoer.txt b/autoers/Scripts/Golf Autoer.txt new file mode 100644 index 0000000..bbbcab6 --- /dev/null +++ b/autoers/Scripts/Golf Autoer.txt @@ -0,0 +1,60 @@ +script={ + + 'name':'Golf Autoer',\ + + 'description':"This is a golf autoer designed to get your golfing trophies maxed.\ + It is based off the golf skipper found in multihack so most of the functions I take\ + no credit for. A list of the functions I do take credit for can be found on my channel\ + youtube.com/toontowninjecting.", + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'golfAutoer.revertFunctions()',\ + + 'start':'golfAutoer.start()',\ + + 'stop':'golfAutoer.setStop()',\ + + 'close':'golfAutoer.autoerGui.hideAll()',\ + + 'open':'golfAutoer.autoerGui.showAll()',\ + + 'options':{ + 'Make Member':{ + 'command':'golfAutoer.setMember',\ + 'pos':(0,0) + }, + "No Member":{ + 'command':'golfAutoer.unsetMember',\ + 'pos':(0,1) + }, + 'Automatic':{ + 'command':'golfAutoer.setAutomatic',\ + 'pos':(1,1) + }, + 'Do Easy':{ + 'command':'golfAutoer.setPar',\ + 'pos':(1,0) + }, + 'Do Medium':{ + 'command':'golfAutoer.setFun',\ + 'pos':(2,0) + }, + 'Do Hard':{ + 'command':'golfAutoer.setHoleKit',\ + 'pos':(3,0) + }, + 'Lose Account':{ + 'command':'golfAutoer.setSecond',\ + 'pos':(2,1) + }, + 'Win Account':{ + 'command':'golfAutoer.setFirst',\ + 'pos':(3,1) + }, + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/GolfAutoer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/Minigame Spammer.txt b/autoers/Scripts/Minigame Spammer.txt new file mode 100644 index 0000000..bf0ba91 --- /dev/null +++ b/autoers/Scripts/Minigame Spammer.txt @@ -0,0 +1,31 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'Mini Spam',\ + + 'description':"Spams minigames to get on top toons.",\ + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'minigameSpammer.revert()',\ + + 'start':'minigameSpammer.start()',\ + + 'stop':'minigameSpammer.stop()',\ + + 'close':'minigameSpammer.autoerGui.hideAll()',\ + + 'open':'minigameSpammer.autoerGui.showAll()',\ + + 'options':{ + },\ + 'location':'http://goo.gl/dlExaZ'} + +try: + toonBot.addScript(script) +except: + base.localAvatar.setSystemMessage(0,'You did not follow instructions, this script needs to be added to Toon-Bot which can be found on my channel (youtube.com/toontowninjecting)') \ No newline at end of file diff --git a/autoers/Scripts/Race Autoer.txt b/autoers/Scripts/Race Autoer.txt new file mode 100644 index 0000000..f2ae172 --- /dev/null +++ b/autoers/Scripts/Race Autoer.txt @@ -0,0 +1,79 @@ +script={ + + 'name':'Race Autoer',\ + + 'description':"The Race autoer is designed for you to gain tickets and trophies from toontown racing. \ +All races have to be run with another player running the same script but with their toon number set as a different \ +value to the other toon(s). If you do not do this no trophies will be gained.", + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'raceAutoer.revertFunctions()',\ + + 'start':'raceAutoer.start()',\ + + 'stop':'raceAutoer.setStop()',\ + + 'close':'raceAutoer.autoerGui.hideAll()',\ + + 'open':'raceAutoer.autoerGui.showAll()',\ + + 'options':{ + 'Toon Number 1':{ + 'command':'raceAutoer.setAccountNum1',\ + 'pos':(0,0)\ + }, + 'Toon Number 2':{ + 'command':'raceAutoer.setAccountNum2',\ + 'pos':(0,1) + }, + 'Toon Number 3':{ + 'command':'raceAutoer.setAccountNum3',\ + 'pos':(1,0)\ + }, + 'Toon Number 4':{ + 'command':'raceAutoer.setAccountNum4',\ + 'pos':(1,1) + } , + 'Do speedway':{ + 'command':'raceAutoer.setSpeedway',\ + 'pos':(2,0)\ + }, + 'Do urban':{ + 'command':'raceAutoer.setUrban',\ + 'pos':(3,0) + }, + 'Do rural':{ + 'command':'raceAutoer.setRural',\ + 'pos':(4,0) + }, + 'Set Practice':{ + 'command':'raceAutoer.setPractice',\ + 'pos':(2,1)\ + }, + 'Set ToonBattle':{ + 'command':'raceAutoer.setToonbattle',\ + 'pos':(3,1) + }, + 'Set Tournament':{ + 'command':'raceAutoer.setTournament',\ + 'pos':(4,1) + }, + 'Make Member':{ + 'command':'raceAutoer.setMember',\ + 'pos':(6,0) + }, + "No Member":{ + 'command':'raceAutoer.unsetMember',\ + 'pos':(6,1) + }, + "Automatic":{ + 'command':'raceAutoer.setAutomatic',\ + 'pos':(5,1) + } + },\ + 'location':'http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/RaceAutoer.py'} + +toonBot.addScript(script) \ No newline at end of file diff --git a/autoers/Scripts/VP maxer.txt b/autoers/Scripts/VP maxer.txt new file mode 100644 index 0000000..fe40044 --- /dev/null +++ b/autoers/Scripts/VP maxer.txt @@ -0,0 +1,60 @@ +#This will not work unless you have Toon Bot running on your toontown +#If you do not have Toon Bot you can download it at youtube.com/toontowninjecting + +script={ + + 'name':'VP Maxer',\ + + 'description':"The VP maxer is a script used to max the VP. \ +It does the factory when you need merits and does the \ +vp when you are ready to do the vp. The card filter can be \ +turned on and off in the options. Full credit to the functions \ +that were not created by me can be found on my channel: \ +toontowninjecting.",\ + + 'author': 'Freshollie',\ + + 'version': '1',\ + + 'unload':'vpMaxer.revert()',\ + + 'start':'vpMaxer.otherFunctions.start()',\ + + 'stop':'vpMaxer.otherFunctions.setStop()',\ + + 'close':'vpMaxer.autoerGui.hideAll()',\ + + 'open':'vpMaxer.autoerGui.showAll()',\ + + 'options':{ + 'Card Filter 8':{ + 'command':'vpMaxer.vpAutoer.filterOn',\ + 'pos':(0,0)\ + }, + + 'Card Filter 16':{ + 'command':'vpMaxer.vpAutoer.filterOn16',\ + 'pos':(0,1) + }, + + 'Card Filter Off':{ + 'command':'vpMaxer.vpAutoer.filterOff',\ + 'pos':(1,0) + }, + + 'Only Do Factory':{ + 'command':'vpMaxer.otherFunctions.onlyDoFactory',\ + 'pos':(2,0)\ + }, + + 'Do Both':{ + 'command':'vpMaxer.otherFunctions.doBoth',\ + 'pos':(2,1) + } + },\ + 'location':'http://goo.gl/fNjs7x'} + +try: + toonBot.addScript(script) +except: + base.localAvatar.setSystemMessage(0,'You did not follow instructions, this script needs to be added to Toon-Bot which can be found on my channel (youtube.com/toontowninjecting)') \ No newline at end of file diff --git a/autoers/Task Autoer Sound Drop.py b/autoers/Task Autoer Sound Drop.py new file mode 100644 index 0000000..f118009 --- /dev/null +++ b/autoers/Task Autoer Sound Drop.py @@ -0,0 +1,803 @@ +import urllib +import random +from direct.interval.IntervalGlobal import * +from direct.gui.DirectLabel import DirectLabel +from toontown.toon import DistributedNPCToon +from toontown.safezone import Playground +from toontown.battle import SuitBattleGlobals +from toontown.building import DistributedBuilding +from toontown.battle import DistributedBattleBldg +from toontown.suit import SuitDNA +from toontown.quest import Quests +from toontown.quest import QuestBookPoster +from toontown.toon import ToonHead +from toontown.building import DistributedDoor +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.toon import DistributedNPCFisherman +from toontown.toon import DistributedNPCPartyPerson +from toontown.shtiker import PurchaseManager +from toontown.minigame import DistributedMinigame +from toontown.estate import Estate +from toontown.estate import House + +HQZONES=[10000, 11000, 12000, 13000] + +class TaskAutoer: + oldTeleportInPlayground=Playground.Playground.exitTeleportIn + #oldBattleBldg=DistributedBattleBldg.DistributedBattleBldg.__init__ + #oldBuildingGenerate=DistributedBuilding.DistributedBuilding.generate + #oldEnterToon=DistributedBuilding.DistributedBuilding.enterToon + oldMiniGameAnnounceGenerate=DistributedMinigame.DistributedMinigame.announceGenerate + oldPurchangeManagerAnnouncGenerate=PurchaseManager.PurchaseManager.announceGenerate + oldEstateTeleportIn=Estate.Estate.exitTeleportIn + oldHouseDoorIn=House.House.exitDoorIn + + def __init__(self): + DistributedMinigame.DistributedMinigame.announceGenerate=lambda newSelf: self.newMiniGameAnnounceGenerate(newSelf) + PurchaseManager.PurchaseManager.announceGenerate=lambda newSelf: self.newPurchangeManagerAnnouncGenerate(newSelf) + Playground.Playground.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInPlayground(newSelf,*args,**kwds) + Estate.Estate.exitTeleportIn=lambda newSelf,*args,**kwds: self.newEstateTeleportIn(newSelf,*args,**kwds) + House.House.exitDoorIn=lambda newSelf,*args,**kwds: self.newHouseDoorIn(newSelf,*args,**kwds) + #DistributedBuilding.DistributedBuilding.generate=lambda newSelf,*args: self.newBuildingGenerate(newSelf,*args) + #DistributedBuilding.DistributedBuilding.enterToon=lambda newSelf,*args: self.newEnterToon(newSelf,*args) + base.localAvatar.setWantBattles(False) + self.shardIds=[] + self.isMember=True + self.jellybeansNeeded=500 + + posterNumToPos = [(-0.6, 1, 0.5), + (-0.6, 1, 0.2), + (-0.2, 1, 0.5), + (-0.2, 1, 0.2) + ] + + self.questsGui = [] + for i in range(4): + self.questsGui.append(QuestBookPoster.QuestBookPoster(pos = posterNumToPos[i], scale = 0.5)) + self.questsGui[-1].reparentTo(base.a2dRightCenter) + self.questsGui[-1].mouseEnterPoster(0) + self.questsGui[-1].mouseExitPoster=self.questsGui[-1].mouseEnterPoster + + self.oldNPCmovie=None + + self.updateQuestGuiLoop=Sequence() + for i in range(4): + self.updateQuestGuiLoop.append(Func(self.updateQuestGui, i)) + self.updateQuestGuiLoop.append(Wait(0.125)) + self.updateQuestGuiLoop.loop() + + Sequence(Func(self.collisionsOff),Wait(0.5)).loop() + + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<50: + self.shardIds.append(shard) + self.wantedTracks=[3,6] #Anyone looking into choosing your tracks this is all you need to change lol + self.status=None + self.buildingLevelToZoneDict={1:1000,2:5000,3:4000,4:3000,5:9000} + DirectLabel(parent=aspect2d,relief=None,text='\x01shadow\x01Freshollies Toontask Autoer\x02',text_scale=0.17, pos=(0, 0, 0.87), text_fg=(1, 1, 1, 1)) + DirectLabel(parent=aspect2d,relief=None,text='\x01shadow\x01Freshollies Toontask Autoer\x02',text_scale=0.17, pos=(0, 0, 0.87), text_fg=(0, 0, 0, 0)) + self.questsAtNoneLeft = 5 + + def collisionsOff(self): + try: + base.localAvatar.collisionsOff() + except: + pass + + def newMiniGameAnnounceGenerate(self, newSelf): + self.oldMiniGameAnnounceGenerate(newSelf) + messenger.send('minigameAbort') + + def newPurchangeManagerAnnouncGenerate(self, newSelf): + self.oldPurchangeManagerAnnouncGenerate(newSelf) + Sequence(Wait(10),Func(self.skipTrolley)).start() + + def skipTrolley(self): + for i in range(5): + messenger.send('doneChatPage') + Sequence(Wait(4),Func(messenger.send,'purchaseBackToToontown')).start() + + def newNPCmovie(self, mode, npcId, avId, quests, timestamp): + self.oldNPCmovie(mode, npcId, avId, quests, timestamp) + print("Npc movie started") + realMovie = False + if avId == base.localAvatar.doId: + if not quests: + self.questsAtNoneLeft = len(base.localAvatar.quests) + self.officer.setMovie = self.oldNPCmovie + return + realMovie = True + for i in range(3): + questId = quests[i] + print('iterating quest') + try: + if not Quests.isQuestJustForFun(questId, Quests.findFinalRewardId(questId)[0]): + print('attemping to pick quest') + print(Quests.findFinalRewardId(questId)[0]) + print(questId) + self.officer.sendChooseQuest(questId) + self.officer.sendUpdate('setMovieDone') + self.officer.setMovie=self.oldNPCmovie + base.cr.playGame.getPlace().fsm.forceTransition('walk') + return + except Exception as e: + e.printStackTrace() + if realMovie: + self.questsAtNoneLeft = len(base.localAvatar.quests) + + self.officer.sendChooseQuest(0) + self.officer.setMovie = self.oldNPCmovie + + def newBuildingGenerate(self,newSelf,*args): + try: + oldBuildingGenerate(newSelf,*args) + except: + pass + + def newEnterToon(self,newSelf,*args): + try: + oldEnterToon(newSelf,*args) + except: + pass + + def newTeleportInPlayground(self,newSelf,*args,**kwds): + self.oldTeleportInPlayground(newSelf,*args,**kwds) + print("Teleported into the playground") + if buildingAutoer.shouldContinue: + + buildingAutoer.checkStop() + + if buildingAutoer.shouldContinue and not self.isQuestComplete(): + buildingAutoer.killElevators.append(buildingAutoer.lastElevator) + Sequence(Wait(2),Func(buildingAutoer.teleportBackToStreet)).start() + + else: + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + + elif gagTrainer.shouldContinue: + Sequence(Wait(2),Func(gagTrainer.teleportBackToStreet)).start() + + else: + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + + def newEstateTeleportIn(self,newSelf,*args,**kwds): + self.oldEstateTeleportIn(newSelf,*args,**kwds) + for door in base.cr.doFindAll('Door'): + if 'esHouse_1' in str(door.getBuilding()): + door.sendUpdate('requestEnter') + + def newHouseDoorIn(self,newSelf,*args,**kwds): + self.oldHouseDoorIn(newSelf,*args,**kwds) + base.cr.doFind('phone').sendUpdate('avatarEnter') + base.cr.doFind('phone').sendUpdate('avatarExit') + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + + def checkWhatToDo(self): + print("Checking what to do:") + print("We have %s Tasks" %(len(base.localAvatar.quests))) + print("We are going to try and collect %s Tasks from HQ" %(self.questsAtNoneLeft)) + + if base.localAvatar.getTotalMoney()>self.jellybeansNeeded: + print("We have all the money we need") + self.jellybeansNeeded=500 + + if base.localAvatar.defaultShard not in self.shardIds: + print("We need to teleport to an empty district") + base.cr.playGame.getPlace().requestTeleport(2000,2000, random.choice(self.shardIds),None) + + elif self.status=='Fishing': + print("We are completing a fishing task") + if not self.isQuestComplete(): + self.fishOnce() + else: + print("Fishing task is done") + for dock in base.cr.doFindAll('DistributedFishingSpot'): + dock.sendUpdate('requestExit') + + self.status=None + self.doTask() + + elif self.jellybeansNeeded == 12000: + print("We are continuing to fish for money") + self.fishOnce() + + elif base.localAvatar.getTotalMoney()= self.questsAtNoneLeft: + print('Doing task') + self.doTask() + else: + print("We have nothing to do so collect a task") + if len(base.localAvatar.quests) <= self.questsAtNoneLeft: + self.collectNewTask() + + def updateQuestGui(self, i): + if len(base.localAvatar.quests) >= i+1: + self.questsGui[i].update(base.localAvatar.quests[i]) + else: + self.questsGui[i].clear() + + def getCurrentQuest(self): + return Quests.getQuest(base.localAvatar.quests[0][0]) + + def getBestZoneForCogLevel(self,level): + if self.isMember: + if level<3: + return 2000 + elif level<4: + return 1000 + elif level<5: + return 5000 + elif level<6: + return 4000 + elif level<7: + return 3000 + elif level<8: + return 9000 + elif level<9: + return 12000 + else: + return 13000 + else: + return 2000 + + def getBestZoneForBuildingLevel(self,level): + return self.buildingLevelToZoneDict.get(level) + + def getSuitName(self,suitType): + try: + return SuitBattleGlobals.SuitAttributes[suitType].get('name') + except: + return suitType + + def getCogLevelFromCog(self,suitType): + try: + return SuitBattleGlobals.SuitAttributes[suitType].get('level')+1 + except: + return 1 + + + def getSuitDepartment(self,suitType): + return SuitDNA.getSuitDept(suitType) + + def getCorrectChoice(self,choices): + if 0 in choices: + return 0 + elif 2 in choices: + return 2 + elif self.wantedTracks[0] in choices: + return self.wantedTracks[0] + else: + return self.wantedTracks[1] + + def newTask(self): + print('collecting new task') + for officer in base.cr.doFindAll('HQ Officer'): + if officer.allowedToTalk(): + if officer.setMovie != self.oldNPCmovie: + self.oldNPCmovie = officer.setMovie + print('setting old movie function') + self.officer=officer + officer.setMovie=self.newNPCmovie + officer.sendUpdate('avatarEnter') + break + + def collectNewTask(self): + interest=base.cr.addInterest(base.localAvatar.defaultShard, 2742, description='5', event=None) + Sequence(Wait(1),Func(self.newTask),Wait(2),Func(base.cr.removeInterest,interest),Func(self.checkWhatToDo)).start() + + def nextShard(self): + if self.shardIds[0] == base.localAvatar.defaultShard: + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + base.cr.playGame.getPlace().fsm.forceTransition('walk') + base.cr.playGame.getPlace().requestTeleport(2000,2000,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def getFishSpot(self): + for spot in base.cr.doFindAllInstances(DistributedFishingSpot.DistributedFishingSpot): + if spot.avId==base.localAvatar.doId: + return spot + + base.localAvatar.setSystemMessage(0,'Not at a spot') + return False + + def catchFish(self): + try: + fish = base.cr.doFindAll("FishingTarget")[0] + for fp in base.cr.doFindAll("FishingPond"): + spot=self.getFishSpot() + if spot: + spot.sendUpdate('doCast',[1,1]) + fp.sendUpdate('hitTarget',[fish.doId]) + except: + pass + + def fishOnce(self): + entered=False + for spot in reversed(base.cr.doFindAll('DistributedFishingSpot')): + if spot.allowedToEnter(): + entered=True + spot.sendUpdate('requestEnter') + usedSpot=spot + break + if entered: + catchFishSeq=Sequence() + catchFishSeq.append(Wait(1)) + for i in range(23): + catchFishSeq.append(Func(self.catchFish)) + catchFishSeq.append(Wait(0.05)) + catchFishSeq.append(Wait(1)) + catchFishSeq.append(Func(self.sellFish)) + catchFishSeq.append(Wait(0.5)) + catchFishSeq.append(Func(self.checkWhatToDo)) + catchFishSeq.start() + else: + Sequence(Wait(2),Func(self.fishOnce)).start() + + def sellFish(self): + base.cr.doFind('Fisherman').sendUpdate('avatarEnter') + base.cr.doFind('Fisherman').sendUpdate('completeSale',[1]) + + def speakToNpc(self,name): + if base.cr.doFind(name): + for npc in base.cr.doFindAllInstances(DistributedNPCToon.DistributedNPCToon): + if npc.getName()==name: + if npc.allowedToTalk(): + npc.sendUpdate('avatarEnter') + npc.sendUpdate('setMovieDone') + base.cr.removeInterest(self.interest) + Sequence(Wait(1),Func(self.checkWhatToDo)).start() + found=True + foundNPC=True + break + else: + found=False + foundNPC=True + else: + foundNPC=False + if not foundNPC: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + elif not found: + Sequence(Wait(5),Func(self.speakToNpc,name)).start() + else: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + + def chooseTrack(self,name): + if base.cr.doFind(name): + for npc in base.cr.doFindAllInstances(DistributedNPCToon.DistributedNPCToon): + if npc.getName()==name: + if npc.allowedToTalk(): + npc.sendUpdate('avatarEnter') + try: + npc.sendChooseTrack(self.getCorrectChoice(self.getCurrentQuest().getChoices())) + npc.sendUpdate('setMovieDone') + except: + pass + base.cr.removeInterest(self.interest) + Sequence(Wait(0.5),Func(self.checkWhatToDo)).start() + found=True + foundNPC=True + break + else: + found=False + foundNPC=True + else: + foundNPC=False + if not foundNPC: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + elif not found: + Sequence(Wait(5),Func(self.chooseTrack)).start() + else: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + + def doFriendTask(self): + print("Sending invite to self") + def acceptInvite(inviterId, inviterName, inviterDna, context): + print("Adding self") + if (inviterId == base.localAvatar.doId): + base.cr.friendManager.sendUpdate("inviteeFriendResponse", [1, context]) + base.ignore("friendInvitation") + print("Completed friend task") + messenger.send("cancelFriendInvitation") + Sequence(Wait(2), Func(self.checkWhatToDo)).start() + + base.accept("friendInvitation", acceptInvite) + base.cr.friendManager.sendUpdate('friendQuery', [base.localAvatar.doId]) + + def doTrolleyTask(self): + if base.localAvatar.getZoneId() == 2000: + if base.cr.doFind('Trolley').allowedToEnter(): + base.localAvatar.setPos(-133.548, -71.1069, 0.525) + base.cr.playGame.getPlace().fsm.forceTransition('walk') + else: + Sequence(Wait(2),Func(self.doTrolleyTask)).start() + else: + base.cr.playGame.getPlace().requestTeleport(2000, 2000, None, None) + + + def doNPCTask(self, isTrackTask=False): + try: + if not self.isQuestComplete(): + questNum = 0 + else: + questNum = self.isQuestComplete()[0] + questList=base.localAvatar.quests + zoneId=Quests.NPCToons.getNPCZone(questList[questNum][2]) + listedDict=list(Quests.NPCToons.NPCToonDict) + try: + npcName=Quests.getNpcInfo(questList[questNum][2])[0] + except: + npcName='HQ Officer' + self.questsAtNoneLeft = 5 + if listedDict.count(questList[questNum][2])==1: + if zoneId == -1: + zoneId = 2742 + self.interest=base.cr.addInterest(base.localAvatar.defaultShard, zoneId, description='5', event=None) + if not isTrackTask: + Sequence(Wait(2),Func(self.speakToNpc,npcName)).start() + else: + Sequence(Wait(2),Func(self.chooseTrack,npcName)).start() + except: + print('Error in completing task') + Sequence(Wait(2), Func(self.checkWhatToDo)).start() + + def doTask(self): + + if not base.localAvatar.quests: + self.collectNewTask() + return + + quest = Quests.getQuest(base.localAvatar.quests[0][0]) + + if self.isQuestComplete() or quest.getType() == Quests.VisitQuest: + self.doNPCTask() + + elif quest.getType()==Quests.DeliverItemQuest: + self.doNPCTask() + + elif quest.getType() in (Quests.CogQuest,Quests.CogLevelQuest,Quests.CogTrackQuest): + buildingAutoer.clearSettings() + gagTrainer.clearSettings() + + if quest.getLocation()==11500: + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + + elif quest.getType()==Quests.CogTrackQuest: + if quest.getLocation()==1: + if quest.getCogType()=='c' or base.localAvatar.getMaxHp()<30: + location=2000 + elif quest.getCogType()=='s': + location=11200 + elif quest.getCogType()=='m': + location=12000 + else: + location=13000 + gagTrainer.setLocation(location) + else: + gagTrainer.setLocation(quest.getLocation()) + gagTrainer.setCogType(quest.getCogType()) + gagTrainer.start() + + elif quest.getType()==Quests.CogLevelQuest: + if not base.localAvatar.getTrackAccess()[2] or quest.getLocation() in HQZONES or quest.getCogLevel()<11 or quest.getLocation() in (12500,12600,12700): + if quest.getLocation()==1: + gagTrainer.setLocation(self.getBestZoneForCogLevel(quest.getCogLevel()+1)) + nonGag=False + else: + if quest.getLocation() in (12500,12600,12700): + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.mintAutoer.setType(quest.getLocation()) + cfoMaxer.otherFunctions.start() + nonGag=True + elif quest.getLocation()==11500: + vpMaxer.otherFunctions.onlyLast=False + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + nonGag=True + else: + gagTrainer.setLocation(quest.getLocation()) + nonGag=False + + if quest.getCogType()==1: + gagTrainer.setCogLevel(quest.getCogLevel()) + else: + gagTrainer.setCogName(self.getSuitName(quest.getCogType())) + #gagTrainer.setLocation(self.getBestZoneForCogType(quest.getCogType) + if not nonGag: + gagTrainer.start() + else: + if quest.getCogType()==1: + buildingAutoer.setBuildingType('') + buildingAutoer.setNumFloors(4) + else: + buildingAutoer.setBuildingType(self.getSuitDepartment(self.getCogType())) + buildingAutoer.setNumFloors(4) + + if quest.getLocation()!=1: + buildingAutoer.setLocation(quest.getLocation()) + else: + if base.localAvatar.getMaxHp()>70: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(5)) + else: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + buildingAutoer.start() + else: + if not base.localAvatar.getTrackAccess()[2] or quest.getLocation() in HQZONES or self.getCogLevelFromCog(quest.getCogType())+4<11: + + if quest.getLocation()==1: + if base.localAvatar.getMaxHp()>30 and quest.getCogType()==1: + gagTrainer.setLocation(11200) + elif base.localAvatar.getMaxHp()>30 and (quest.getCogType()=='gh' or quest.getCogType()=='tf' or quest.getCogType()=='cc' or quest.getCogType()=='tm' or quest.getCogType()=='nd'): + gagTrainer.setLocation(11200) + elif quest.getCogType() == 'ym': # Exceptions to the rule + gagTrainer.setLocation(1000) + elif quest.getCogType() == 'tw': # Exceptions to the rule + gagTrainer.setLocation(4000) + elif quest.getCogType() == 'mm': # Exceptions to the rule + gagTrainer.setLocation(1000) + elif quest.getCogType() == 'nc': # Exceptions to the rule + gagTrainer.setLocation(9000) + else: + gagTrainer.setLocation(self.getBestZoneForCogLevel(self.getCogLevelFromCog(quest.getCogType())+1)) + else: + gagTrainer.setLocation(quest.getLocation()) + + if quest.getCogType()==1: + gagTrainer.setCogName(None) + else: + gagTrainer.setCogName(self.getSuitName(quest.getCogType())) + gagTrainer.start() + else: + if quest.getCogType()==1: + buildingAutoer.setBuildingType('') + buildingAutoer.setNumFloors(4) + else: + buildingAutoer.setBuildingType(self.getSuitDepartment(quest.getCogType())) + buildingAutoer.setNumFloors(4) + + if quest.getLocation()!=1: + buildingAutoer.setLocation(quest.getLocation()) + else: + if base.localAvatar.getMaxHp()>70: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(5)) + else: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + buildingAutoer.start() + + elif quest.getType()==Quests.BuildingQuest: + print('Doing building quest') + buildingAutoer.clearSettings() + if quest.getLocation()==1: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(quest.getNumFloors())) + buildingAutoer.shouldChangeHood=True + else: + buildingAutoer.setLocation(quest.getLocation()) + + buildingAutoer.setNumFloors(quest.getNumFloors()) + + if quest.getBuildingTrack()==1: + buildingAutoer.setBuildingType('') + else: + buildingAutoer.setBuildingType(quest.getBuildingTrack()) + + buildingAutoer.start() + + elif quest.getType()==Quests.RecoverItemQuest: + if quest.getHolder()==4: + if quest.getLocation()==1: + if base.localAvatar.getZoneId()!=2000: + base.cr.playGame.getPlace().requestTeleport(2000,2000,None,None) + self.status='Fishing' + else: + self.status='Fishing' + self.checkWhatToDo() + + else: + if base.localAvatar.getZoneId()!=quest.getLocation(): + base.cr.playGame.getPlace().requestTeleport(quest.getLocation(),quest.getLocation(),None,None) + self.status='Fishing' + else: + self.status='Fishing' + self.checkWhatToDo() + else: + buildingAutoer.clearSettings() + gagTrainer.clearSettings() + if not self.isSuitOnlyBldg(quest.getHolder()) or quest.getHolderType()=='track': + if quest.getLocation()==1: + if type(quest.getHolder())==int: + gagTrainer.setLocation(self.getBestZoneForCogLevel(quest.getHolder()+1)) + elif quest.getHolderType()=='track': + gagTrainer.setLocation(2000) + else: + gagTrainer.setLocation(self.getBestZoneForCogLevel(self.getCogLevelFromCog(quest.getHolder())+1)) + else: + gagTrainer.setLocation(quest.getLocation()) + + if type(quest.getHolder())==int: + gagTrainer.setCogLevel(quest.getHolder()) + elif quest.getHolderType()=='track': + gagTrainer.setCogType(quest.getHolder()) + else: + gagTrainer.setCogName(self.getSuitName(quest.getHolder())) + gagTrainer.start() + + elif quest.getLocation()==12000: + cfoMaxer.otherFunctions.onlyLast=True + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.mintAutoer.setType(12500) + cfoMaxer.otherFunctions.start() + + elif quest.getLocation()==11000: + vpMaxer.otherFunctions.onlyLast=True + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + + else: + if quest.getLocation()==1: + buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + else: + buildingAutoer.setLocation(quest.getLocation()) + if quest.getHolder()==1: + buildingAutoer.setBuildingType('') + else: + buildingAutoer.setBuildingType(self.getSuitDepartment(quest.getHolder())) + buildingAutoer.start() + + elif quest.getType()==Quests.DeliverGagQuest: + Sequence(Func(gagTrainer.restock.restockGags,quest.getGagType()),Wait(2),Func(self.doNPCTask)).start() + + elif quest.getType()==Quests.SkelecogLevelQuest: + if quest.getLocation()==11000: + vpMaxer.otherFunctions.onlyLast=False + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + elif quest.getLocation()==12000: + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.mintAutoer.setType(12500) + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.otherFunctions.start() + elif quest.getLocation()==13000: + cjMaxer.otherFunctions.onlyDoDa() + cjMaxer.otherFunctions.start() + elif quest.getLocation()==1: + if quest.getCogLevel()<9: + vpMaxer.otherFunctions.onlyLast=False + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + else: + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.mintAutoer.setType(12500) + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.otherFunctions.start() + + elif quest.getType()==Quests.SkelecogQuest: + if quest.getLocation()==11000: + vpMaxer.otherFunctions.onlyLast=False + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + elif quest.getLocation()==12000: + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.mintAutoer.setType(12500) + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.otherFunctions.start() + elif quest.getLocation() in (12500,12600,12700): + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.mintAutoer.setType(quest.getLocation()) + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.otherFunctions.start() + elif quest.getLocation()==13000: + cjMaxer.otherFunctions.onlyDoDa() + cjMaxer.otherFunctions.start() + elif quest.getLocation()==1: + if quest.getCogLevel()<9: + vpMaxer.otherFunctions.onlyLast=False + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + else: + cfoMaxer.otherFunctions.onlyLast=False + cfoMaxer.mintAutoer.setType(12500) + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.otherFunctions.start() + + elif quest.getType() in (Quests.FactoryQuest,Quests.ForemanQuest): + vpMaxer.otherFunctions.onlyLast=True + vpMaxer.otherFunctions.onlyDoFactory() + vpMaxer.otherFunctions.start() + + elif quest.getType() in (Quests.SupervisorQuest,Quests.MintQuest): + cfoMaxer.otherFunctions.onlyLast=True + cfoMaxer.otherFunctions.onlyDoMint() + cfoMaxer.mintAutoer.setType(quest.getLocation()) + cfoMaxer.otherFunctions.start() + + elif quest.getType()==Quests.SkeleReviveQuest: + ceoMaxer.otherFunctions.start() + + elif quest.getType()==Quests.TrackChoiceQuest: + self.doNPCTask(isTrackTask=True) + + elif quest.getType()==Quests.TrolleyQuest: + self.doTrolleyTask() + + elif quest.getType() == Quests.PhoneQuest: + base.localAvatar._LocalToon__handleClarabelleButton() + + elif quest.getType() == Quests.FriendQuest: + self.doFriendTask() + + else: + base.localAvatar.setSystemMessage(0, 'Unknown task') + + + def isQuestComplete(self): + completeList = [] + + for i in range(len(base.localAvatar.quests)): + questDesc = base.localAvatar.quests[i] + + quest = Quests.getQuest(base.localAvatar.quests[i][0]) + + if quest.getCompletionStatus(base.localAvatar, questDesc) == Quests.COMPLETE: + completeList.append(i) + + return completeList + + def isSuitOnlyBldg(self,suitType): + try: + if SuitBattleGlobals.SuitAttributes[suitType]['level']+1>6: + return True + else: + return False + except KeyError: + return False + +taskAutoer=TaskAutoer() + +myFile=open('Toon Bot/Building Autoer Toontask.txt','w') +myFile.write(urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/Task%20Autoer%20versions/BuildingAutoerToontask.py').read()) +myFile.close() +execfile('Building Autoer Toontask.txt',globals()) +buildingAutoer=BuildingAutoer() + +myFile=open('Toon Bot/Gag Trainer Toontask.txt','w') +myFile.write(urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/Task%20Autoer%20versions/GagTrainer15Toontask.py').read()) +myFile.close() +execfile('Gag Trainer Toontask.txt',globals()) +gagTrainer=GagTrainer() + +myFile=open('Toon Bot/Vp Maxer Toontask.txt','w') +myFile.write(urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/Task%20Autoer%20versions/VPMaxerToontask.py').read()) +myFile.close() +execfile('Vp Maxer Toontask.txt',globals()) +vpMaxer=VPMaxer() + +myFile=open('Toon Bot/Cfo Maxer Toontask.txt','w') +myFile.write(urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToontownAutoers/master/Task%20Autoer%20versions/CFOMaxerToontask.py').read()) +myFile.close() +execfile('Cfo Maxer Toontask.txt',globals()) +cfoMaxer=CFOmaxer() + +myFile=open('Toon BotCeo Maxer Toontask.txt','w') +myFile.write(urllib.urlopen('https://raw.githubusercontent.com/freshollie/ToontownAutoers/master/Task%20Autoer%20versions/CEOMaxerToontask.py').read()) +myFile.close() +execfile('Ceo Maxer Toontask.txt',globals()) +ceoMaxer=CEOMaxer() + +taskAutoer.checkWhatToDo() diff --git a/autoers/TaskAutoer full source.py b/autoers/TaskAutoer full source.py new file mode 100644 index 0000000..ee52b09 --- /dev/null +++ b/autoers/TaskAutoer full source.py @@ -0,0 +1,3823 @@ +import time + +from direct.task.Task import Task +from direct.task.TaskManagerGlobal import taskMgr +from direct.showbase.MessengerGlobal import messenger + +from toontown.quest import task_autoer_globals as TAG +from toontown.quest.TaskAutoer import HQZONES, bootstrap_task_autoer + +taskAutoer = bootstrap_task_autoer() + + +from toontown.town import Street +from toontown.toon import HealthForceAcknowledge +from toontown.safezone import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.battle import DistributedBattleBldg +from toontown.building import SuitInterior +from toontown.building import DistributedBuilding +from toontown.building import DistributedElevatorExt +from toontown.building import DistributedSuitInterior +from direct.interval.IntervalGlobal import * + +ToontownBattleGlobals.SkipMovie=1 + +faceOffHook = lambda self, ts, name, callback:self._DistributedBattleBldg__handleFaceOffDone() +DistributedBattleBldg.DistributedBattleBldg._DistributedBattleBldg__faceOff = faceOffHook + +class BuildingAutoer: + oldTeleportInStreet=Street.Street.exitTeleportIn + + oldExitBecomingToon=DistributedBuilding.DistributedBuilding.exitBecomingToon + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldEnterElevator=DistributedSuitInterior.DistributedSuitInterior.enterElevator + oldEnterFloorReward=DistributedBattleBldg.DistributedBattleBldg.enterReward + oldEnterBuildingReward=DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward + + def __init__(self): + Street.Street.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInStreet(newSelf,*args,**kwds) + + DistributedBuilding.DistributedBuilding.exitBecomingToon=lambda newSelf: self.newExitBecomingToon(newSelf) + DistributedSuitInterior.DistributedSuitInterior.enterElevator=lambda newSelf,*args: self.newEnterElevator(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterReward=lambda newSelf,*args: self.newEnterFloorReward(newSelf,*args) + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=lambda newSelf,*args: self.newEnterBuildingReward(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + self.attackSeq=Sequence(Func(self.attack),Wait(1),Func(self.restock),Wait(1)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + self.shouldChangeDistrict=True + self.shouldChangeStreet=True + self.shouldChangeHood=False + self.shouldContinue=False + self.shouldStop=False + self.findDistrictIds() + self.buildingLevel=1 + self.buildingType='' + self.foundElevator=False + self.bldgCount=0 + self.hoods=['1','3','4','5','9'] + self.lastElevators=None + self.killElevators=[] + self.gagshop_zoneId = 4503 + self.firstTrack=0 + self.secondTrack=4 + self.thirdTrack=2 + + self.desiredLevel1=4 + self.desiredLevel2=5 + self.desiredLevel3=5 + + + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.teleportBackToStreet)).start() + except: + pass + + def createInventory(self): + desiredInv="" + for i in range(7*7): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + desiredInv+="\x02" + elif self.desiredLevel1>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + desiredInv+="\x02" + elif self.desiredLevel2>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3) and base.localAvatar.getTrackAccess()[self.thirdTrack]: + if self.thirdTrack==1: + desiredInv+="\x02" + elif self.desiredLevel3>3: + desiredInv+="\x02" + else: + desiredInv+="\x04" + else: + desiredInv+="\x00" + self.desiredInv=desiredInv + + def clearSettings(self): + self.buildingType='' + self.numFloors=1 + + def teleportBackToStreet(self): + self.foundElevator=False + self.walk() + for treasure in base.cr.doFindAll('Treasure'): + treasure.sendUpdate('requestGrab') + base.cr.playGame.getPlace().requestTeleport(round(self.startId, -3), self.startId, None, None) + + def findBuilding(self): + self.checkStop() + + if self.shouldContinue: + for elevator in base.cr.doFindAllInstances(DistributedElevatorExt.DistributedElevatorExt): + if 'sbfo' not in str(elevator.getElevatorModel()) and 'waitEmpty' in str(elevator.fsm) and elevator.bldg.numFloors>=self.numFloors and self.buildingType in str(elevator.getElevatorModel()) and elevator.doId not in self.killElevators: + self.walk() + elevator.sendUpdate('requestBoard') + self.lastElevator=elevator.doId + self.foundElevator=True + return + self.nextZone() + + def newTeleportInStreet(self,newSelf,*args,**kwds): + self.oldTeleportInStreet(newSelf,*args,**kwds) + self.checkStop() + + if self.shouldContinue: + Sequence(Wait(2),Func(self.findBuilding)).start() + + def newExitBecomingToon(self,newSelf): + self.oldExitBecomingToon(newSelf) + self.checkStop() + + if self.shouldContinue and not self.foundElevator: + if not taskAutoer.isQuestComplete(): + Sequence(Wait(1),Func(self.findBuilding)).start() + else: + self.stop() + taskAutoer.checkWhatToDo() + + def newEnterFloorReward(self,newSelf,*args): + self.oldEnterFloorReward(newSelf,*args) + if self.shouldContinue: + Sequence(Wait(7),Func(self.boardElevator)).start() + + def boardElevator(self): + if self.shouldContinue and base.cr.doFind('Elevator'): + base.cr.doFind('Elevator').sendUpdate('requestBoard') + Sequence(Wait(2),Func(base.cr.doFind('Elevator').sendUpdate,'requestExit'),Wait(0.5),Func(base.cr.doFind('Elevator').sendUpdate,'requestBoard')).start() + + def newEnterBuildingReward(self,newSelf,*args): + self.oldEnterBuildingReward(newSelf,*args) + if self.shouldContinue: + newSelf.d_rewardDone(base.localAvatar.doId) + self.foundElevator=False + self.bldgCount+=1 + + def newEnterElevator(self,newSelf,*args): + self.oldEnterElevator(newSelf,*args) + if self.shouldContinue: + newSelf.sendUpdate('elevatorDone', []) + for x in base.cr.doFindAll('DistributedCogdoInterior'): + x.sendUpdate('elevatorDone', []) + + def checkStop(self): + if self.shouldStop: + self.shouldContinue=False + self.shouldStop=False + self.attackSeq.finish() + self.invisibleSeq.finish() + + def findDistrictIds(self): + self.shardIds=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<50: + self.shardIds.append(shard) + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + except KeyError: + if self.shouldChangeStreet: + self.newStreet() + else: + base.cr.playGame.getPlace().enterZone(self.startId) + Sequence(Wait(0.5),Func(self.findBuilding)).start() + + def checkWhatToDo(self): + if hasattr(base.cr.playGame.getPlace(),'enterZone') and round(base.localAvatar.getZoneId(),-3)==round(self.startId,-3): + self.findBuilding() + else: + if self.startId!=0: + self.teleportBackToStreet() + else: + base.localAvatar.setSystemMessage(0,'The building auto needs to be started on a street') + + def newDistrict(self): + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(), -3), self.startId, self.shardIds[0], None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def newStreet(self): + todo='street' + if self.startId<9000: + if int(str(self.startId)[1:])>300: + if self.shouldChangeDistrict: + self.startId-=200 + todo='district' + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=200 + else: + self.startId+=100 + elif int(str(self.startId)[1:])>200: + if self.shouldChangeDistrict: + self.startId-=100 + todo='district' + + elif self.shouldChangeHood: + todo='hood' + else: + self.startId-=100 + else: + self.startId+=100 + + if todo=='district': + self.newDistrict() + elif todo=='hood': + Sequence(Wait(3),Func(self.newHood)).start() + else: + self.teleportBackToStreet() + + def newHood(self): + self.startId=int(self.hoods[0]+'102') + self.hoods.append(self.hoods[0]) + del self.hoods[0] + self.teleportBackToStreet() + + def setLocation(self,zoneId): + self.startId=int(str(zoneId)[0]+'102') + + def setNumFloors(self,numFloors): + self.numFloors=numFloors + + def setBuildingType(self,type): + if type=='l': + type='legal' + elif type=='s': + type='sales' + elif type=='m': + type='money' + elif type=='c': + type='corp' + self.buildingType=type + + def workOutStreetId(self): + zoneId=base.localAvatar.getZoneId() + self.startId=int(str(zoneId)[:2]+'01') + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + for clerk in base.cr.doFindAll('Clerk'): + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + try: + base.cr.bankManager.d_transferMoney(money - maxMoney) + except AttributeError: + pass + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + self.desiredLevel1=base.localAvatar.experience.getExpLevel(self.firstTrack) + if self.desiredLevel1 in [1,3,5]: + self.desiredLevel1-=1 + self.desiredLevel2=base.localAvatar.experience.getExpLevel(self.secondTrack) + self.desiredLevel3=base.localAvatar.experience.getExpLevel(self.thirdTrack) + if self.desiredLevel1>5: + self.desiredLevel1=4 + if self.desiredLevel2>5: + self.desiredLevel2=5 + if self.desiredLevel3>5: + self.desiredLevel3=5 + self.createInventory() + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or (base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2 and base.localAvatar.getTrackAccess()[self.thirdTrack]): + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.getTrackAccess()[2]: + if base.localAvatar.inventory.inventory[2][self.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [2, self.desiredLevel3, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9): + + if base.localAvatar.inventory.inventory[0][self.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [0, self.desiredLevel1, base.localAvatar.doId]) + battle.sendUpdate('movieDone') + else: + break + + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + + else: + if base.localAvatar.inventory.inventory[4][self.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [4, self.desiredLevel2, battle.suits[0].doId]) + battle.sendUpdate('movieDone') + else: + break + except: + pass + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def getBuildingType(self): + if self.buildingType=='legal': + return 'Lawbot' + elif self.buildingType=='sales': + return 'Sellbot' + elif self.buildingType=='money': + return 'Cashbot' + elif self.buildingType=='corp': + return 'Bossbot' + else: + return 'All' + + def getBuildingLevel(self): + return self.buildingLevel + + def start(self): + self.shouldContinue=True + self.shouldStop=False + self.createInventory() + self.attackSeq.loop() + self.invisibleSeq.loop() + self.checkWhatToDo() + + def stop(self): + self.shouldContinue=False + self.shouldStop=False + self.attackSeq.finish() + self.invisibleSeq.finish() + + def revert(self): + Street.Street.exitTeleportIn=self.oldTeleportInStreet + DistributedBuilding.DistributedBuilding.exitBecomingToon=self.oldExitBecomingToon + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedSuitInterior.DistributedSuitInterior.enterElevator=self.oldEnterElevator + DistributedBattleBldg.DistributedBattleBldg.enterReward=self.oldEnterFloorReward + DistributedBattleBldg.DistributedBattleBldg.enterBuildingReward=self.oldEnterBuildingReward + ToontownBattleGlobals.SkipMovie=0 + self.attackSeq.finish() + +buildingAutoer=BuildingAutoer() + +import random +from toontown.battle import BattlePlace +from toontown.safezone import * +from toontown.toonbase import ToontownBattleGlobals +from toontown.safezone import Playground +from toontown.suit import DistributedSuit +from toontown.suit import SuitDNA +from toontown.toon import HealthForceAcknowledge +from toontown.toon import DistributedNPCPartyPerson +from toontown.toon import DistributedNPCFisherman +from toontown.toon import ToonHead +from toontown.battle import DistributedBattle +from toontown.distributed import ToontownClientRepository +from toontown.effects import DistributedFireworkShow +for attribute in dir(DistributedFireworkShow.DistributedFireworkShow): + try: + exec('DistributedFireworkShow.DistributedFireworkShow.' + attribute + '=lambda *args,**kwds: None') + except (TypeError, AttributeError): + pass + +ToontownBattleGlobals.SkipMovie=1 +oldDumpShards=ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects +def newDumpShards(self): + try: + oldDumpShards(self) + except: + pass +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=newDumpShards + +suitToDamage={1:4,2:6,3:9,4:13,5:15,6:19,7:22,8:25,9:27,10:29,11:30,12:40} + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +hooks=''' +try: + _announceGenerate1 +except: + _announceGenerate1 = DistributedDoor.DistributedDoor.announceGenerate +def announceGenerate(self): + try: + _announceGenerate1(self) + except: + return None +DistributedDoor.DistributedDoor.announceGenerate = announceGenerate +try: + _announceGenerate2 +except: + _announceGenerate2 = DistributedPartyGate.DistributedPartyGate.announceGenerate +def announceGenerate(self): + try: + _announceGenerate2(self) + except: + return None +DistributedPartyGate.DistributedPartyGate.announceGenerate = announceGenerate +try: + old__init__ +except: + old__init__ = DistributedTrolley.DistributedTrolley.__init__ +def new__init__(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedTrolley.DistributedTrolley.__init__ = new__init__ +try: + old__init__2 +except: + old__init__2 = DistributedPartyGate.DistributedPartyGate.__init__ +def new__init__2(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPartyGate.DistributedPartyGate.__init__ = new__init__2 +try: + old__init__3 +except: + old__init__3 = DistributedDoor.DistributedDoor.__init__ +def new__init__3(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedDoor.DistributedDoor.__init__ = new__init__3 +try: + old__init__4 +except: + old__init__4 = DistributedPicnicBasket.DistributedPicnicBasket.__init__ +def new__init__4(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None +DistributedPicnicBasket.DistributedPicnicBasket.__init__ = new__init__4 +base.localAvatar.stopLookAroundNow() +base.localAvatar.findSomethingToLookAt = lambda *x:None +ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None +''' + + +class Inventory: + + def __init__(self): + self.firstTrack=4 + self.secondTrack=5 + self.useOwnLevels=False + self.firstTrackLevel=0 + self.secondTrackLevel=0 + self.noTrolley=False + self.inBattle=False + + def getInv(self,command): + if command=="get1": + try: + return self.firstTrack + except: + return 4 + elif command=="get2": + try: + return self.secondTrack + except: + return 5 + elif command=="getLevel1": + try: + return self.firstTrackLevel + except: + return 0 + elif command=="getLevel2": + try: + return self.secondTrackLevel + except: + return 0 + elif command=="useOwnLevels": + try: + return self.useOwnLevels + except: + return False + + def setThrow1(self): + self.firstTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as first gag',5) + def setThrow2(self): + self.secondTrack=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use throw as second gag',5) + + def setSquirt1(self): + self.firstTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as first gag',5) + + def setSquirt2(self): + self.secondTrack=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use squirt as second gag',5) + + def setLure1(self): + self.firstTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as first gag',5) + + def setLure2(self): + self.secondTrack=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use lure as second gag',5) + + def setTrap1(self): + self.firstTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as first gag',5) + + def setTrap2(self): + self.secondTrack=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use trap as second gag',5) + + def setSound1(self): + self.firstTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as first gag',5) + + def setSound2(self): + self.secondTrack=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use sound as second gag',5) + + def setDrop1(self): + self.firstTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as first gag',5) + + def setDrop2(self): + self.secondTrack=6 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use drop as second gag',5) + + def setToonUp1(self): + self.secondTrack=0 + + def setToonUp2(self): + self.secondTrack=0 + + def track1Set1(self): + self.firstTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on first track',4) + + def track2Set1(self): + self.secondTrackLevel=0 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 1 on second track',4) + + def track1Set2(self): + self.firstTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on first track',4) + + def track2Set2(self): + self.secondTrackLevel=1 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 2 on second track',4) + + def track1Set3(self): + self.firstTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on first track',4) + + def track2Set3(self): + self.secondTrackLevel=2 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 3 on second track',4) + + def track1Set4(self): + self.firstTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on first track',4) + + def track2Set4(self): + self.secondTrackLevel=3 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 4 on second track',4) + + def track1Set5(self): + self.firstTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on first track',4) + + def track2Set5(self): + self.secondTrackLevel=4 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 5 on second track',4) + + def track1Set6(self): + self.firstTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on first track',4) + + def track2Set6(self): + self.secondTrackLevel=5 + base.localAvatar.setSystemMessage(0,'Gag trainer set to use level 6 on second track',4) + + def useLevelsTrue(self): + self.useOwnLevels=True + levelsTrueFalse.setText("Using custom levels") + base.localAvatar.setSystemMessage(0,'Gag trainer set to use levels') + + def useLevelsFalse(self): + self.useOwnLevels=False + levelsTrueFalse.setText("Not Using custom levels") + base.localAvatar.setSystemMessage(0,'Gag trainer set to not use levels') + + def setNoTrolley(self,value): + self.noTrolley=value + + def getNoTrolley(self): + return self.noTrolley + +class Restock: + + def __init__(self): + self.inventory=Inventory() + self.tryNum=1 + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.numToZone={1:2000,2:3000,3:9000,4:4000,5:6000,6:5000} + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(3)) + base.localAvatar.stopLookAroundNow() + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def revertFunctions(self): + try: + self.lookAroundHookSeq.finish() + except Exception: + pass + try: + self.noToons.finish() + except Exception: + pass + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + # Do not remove butterflyNode — DistributedButterfly still receives AI updates; empty NodePath crashes. + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + try: + base.cr.bankManager.d_transferMoney(money - maxMoney) + except AttributeError: + pass + except: + pass + + def unloadGagshop(self): + base.cr.removeInterest(self.contextId) + + def restockGags(self,specificGag=[]): + if not specificGag: + self.gagShopRetZone = 4503 + self.firstTrack=self.inventory.getInv("get1") + self.secondTrack=self.inventory.getInv("get2") + + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + + desiredLevel1=self.executeGags("return1") + desiredLevel2=self.executeGags("return2") + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + else: + self.firstTrack=specificGag[0] + desiredLevel1=specificGag[1] + self.secondTrack=5 + desiredLevel2=0 + + self.desiredInv="" + + for i in range(7*7): + if i==((self.firstTrack*7)+desiredLevel1): + if desiredLevel1>3: + if self.firstTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.firstTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + elif i==((self.secondTrack*7)+desiredLevel2): + if desiredLevel2>3: + if self.secondTrack==1: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x03" + + elif self.secondTrack==1: + self.desiredInv+="\x03" + + else: + self.desiredInv+="\x04" + + else: + self.desiredInv+="\x00" + + if base.localAvatar.inventory.inventory[self.firstTrack][self.executeGags("return1")]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.executeGags("return2")]<2 or specificGag: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + def gainLaff(self): + if self.tryNum>5: + self.tryNum=0 + self.tryNum+=1 + + zone=self.numToZone[self.tryNum] + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + self.toonUp=base.cr.addInterest(base.localAvatar.defaultShard, zone, '5', None) + Sequence(Wait(1.0),Func(self.collectLaff),Func(base.cr.removeInterest, self.toonUp)).start() + + def gag(self,battle,track,level,toAttack): + battle.sendUpdate('requestAttack', [track, level, toAttack]) + battle.sendUpdate('movieDone') + + def executeGags(self,command): + badGags=[1,3,5] + firstTrackLevel=self.inventory.getInv("getLevel1") + secondTrackLevel=self.inventory.getInv("getLevel2") + useOwnLevel=self.inventory.getInv("useOwnLevels") + firstTrack=self.inventory.getInv("get1") + secondTrack=self.inventory.getInv("get2") + + if useOwnLevel: + desiredLevel1=firstTrackLevel + desiredLevel2=secondTrackLevel + else: + desiredLevel1=base.localAvatar.experience.getExpLevel(firstTrack) + desiredLevel2=base.localAvatar.experience.getExpLevel(secondTrack) + + if desiredLevel1==6: + desiredLevel1=5 + + if desiredLevel2==6: + desiredLevel2=5 + + if firstTrack==0 and desiredLevel1 in badGags: + desiredLevel1-=1 + + if secondTrack==0 and desiredLevel2 in badGags: + desiredLevel2-=1 + + if command=="return1": + return desiredLevel1 + elif command=="return2": + return desiredLevel2 + + for battle in base.cr.doFindAll('battle'): + if base.localAvatar in battle.toons: + try: + if firstTrack==0: + toAttack1=base.localAvatar.doId + else: + toAttack1=battle.suits[0].doId + + if secondTrack==0: + toAttack2=base.localAvatar.doId + else: + toAttack2=battle.suits[0].doId + + if base.localAvatar.inventory.inventory[firstTrack][desiredLevel1]>0: + self.gag(battle,firstTrack,desiredLevel1,toAttack1) + + if base.localAvatar.inventory.inventory[secondTrack][desiredLevel2]>0: + self.gag(battle,secondTrack,desiredLevel2,toAttack2) + + except: + pass + + +class GagTrainer: + oldBattlePlaceTeleportIn=BattlePlace.BattlePlace.exitTeleportIn + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldEnterFaceOff=DistributedBattle.DistributedBattle.enterFaceOff + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + + def __init__(self): + self.restock=Restock() + self.clearSettings() + self.shouldContinue=False + self.shouldChangeHood=False + self.shouldChangeDistrict=True + self.shouldChangeStreet=True + self.checkCogWalked=None + self.shardIds=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<50: + self.shardIds.append(shard) + self.lastCogId=0 + self.buyGags=Sequence(Func(self.restock.restockGags),Wait(3.0)) + self.gainLaff=Sequence(Func(self.restock.gainLaff),Wait(3.0)) + self.battleLoop=Sequence(Wait(1.5),Func(self.restock.executeGags,None)) + self.invisibleSeq=Sequence(Func(base.localAvatar.d_setParent,1),Wait(1)) + self._arrivalPollTaskName = 'gagTrainerArrivalPoll' + self._gtArrivalResumeDone = False + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda newSelf,*args: self.newDenyBattle(newSelf,*args) + DistributedBattle.DistributedBattle.enterFaceOff=lambda newSelf,*args: self.newEnterFaceOff(newSelf,*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + BattlePlace.BattlePlace.exitTeleportIn=lambda newSelf,*args: self.newBattlePlaceTeleportIn(newSelf,*args) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + if getattr(newSelf, 'dialog', None) is not None: + newSelf.handleOk(0) + try: + newSelf.exit() + except Exception: + pass + if self.shouldContinue: + Sequence(Wait(3),Func(self.teleportBackToStreet)).start() + except Exception: + pass + + def newEnterFaceOff(self,newSelf,*args): + self.oldEnterFaceOff(newSelf,*args) + if self.checkCogWalked: + self.checkCogWalked.pause() + + def newDenyBattle(self,newSelf,*args): + self.oldDenyBattle(newSelf,*args) + if self.lastCogId==newSelf.doId and self.shouldContinue: + if self.checkCogWalked: + self.checkCogWalked.pause() + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if base.localAvatar in newSelf.toons and self.shouldContinue: + newSelf.d_rewardDone(base.localAvatar.doId) + + if not taskAutoer.isQuestComplete(): + Sequence(Wait(3),Func(self.enterRandomBattle)).start() + else: + self.stop() + base.localAvatar.collisionsOff() + Sequence(Wait(3),Func(taskAutoer.checkWhatToDo)).start() + + def _stopArrivalPoll(self): + try: + taskMgr.remove(self._arrivalPollTaskName) + except Exception: + pass + + def _startArrivalPoll(self): + """While teleporting to streetId, poll until zone matches (exitTeleportIn sometimes never runs).""" + self._stopArrivalPoll() + self._arrivalPollTicks = 0 + + def _poll(task): + if not self.shouldContinue: + return Task.done + self._arrivalPollTicks = getattr(self, '_arrivalPollTicks', 0) + 1 + try: + p = base.cr.playGame.getPlace() + pst = p.fsm.getCurrentState().getName() if p and hasattr(p, 'fsm') else '?' + if pst == 'HFA' and p is not None: + try: + ev = getattr(p, 'hfaDoneEvent', 'hfaDoneEvent') + messenger.send(ev, [{'mode': 'complete'}]) + if self._arrivalPollTicks <= 5 or self._arrivalPollTicks % 10 == 0: + taskAutoer.debug_line( + 'GT arrival poll: HFA unblock send %r tick=%s' + % (ev, self._arrivalPollTicks) + ) + except Exception as e: + try: + taskAutoer.debug_line('GT arrival poll: HFA unblock failed: %s' % e) + except Exception: + pass + if self._arrivalPollTicks <= 3 or self._arrivalPollTicks % 20 == 0: + taskAutoer.debug_line( + 'GT arrival poll tick=%s zone=%s placeFSM=%s' + % (self._arrivalPollTicks, base.localAvatar.getZoneId(), pst) + ) + except Exception: + pass + if self._arrivalPollTicks > 240: + try: + taskAutoer.debug_line( + 'GT arrival poll: timeout waiting for zone band streetId=%s cur=%s' + % (getattr(self, 'streetId', None), base.localAvatar.getZoneId()) + ) + except Exception: + pass + return Task.done + self._maybeResumeIfInTargetZone('arrivalPoll') + if getattr(self, '_gtArrivalResumeDone', False): + return Task.done + return Task.again + + try: + taskMgr.doMethodLater(0.5, _poll, self._arrivalPollTaskName) + try: + taskAutoer.debug_line('GT arrival poll: task scheduled (0.5s interval, max ~120s)') + except Exception: + pass + except Exception as e: + try: + taskAutoer.debug_line('GT _startArrivalPoll failed: %s' % e) + except Exception: + pass + + def _resumeTrainingAfterLanding(self, source): + if not self.shouldContinue: + return + try: + taskAutoer.debug_line( + 'GT resume via %s zone=%s streetId=%s' + % (source, base.localAvatar.getZoneId(), getattr(self, 'streetId', None)) + ) + except Exception: + pass + self._stopArrivalPoll() + self._gtArrivalResumeDone = True + self.startLoops() + Sequence(Wait(2), Func(self.enterRandomBattle)).start() + + def _maybeResumeIfInTargetZone(self, source): + if not self.shouldContinue: + return + if getattr(self, '_gtArrivalResumeDone', False): + return + try: + sid = int(self.streetId) + z = base.localAvatar.getZoneId() + if z not in range(sid, sid + 90): + return + except Exception: + return + if source == 'arrivalPoll': + try: + st = base.cr.playGame.getPlace().fsm.getCurrentState().getName() + if st != 'walk': + return + except Exception: + return + self._resumeTrainingAfterLanding(source) + + def newBattlePlaceTeleportIn(self,newSelf,*args): + try: + taskAutoer.debug_line('GT exitTeleportIn ENTER cls=%s' % newSelf.__class__.__name__) + except Exception: + pass + try: + self.oldBattlePlaceTeleportIn(newSelf,*args) + except Exception as e: + try: + taskAutoer.debug_line('GT exitTeleportIn original Place hook failed: %s' % e) + except Exception: + pass + try: + zn = base.localAvatar.getZoneId() + cn = newSelf.__class__.__name__ + except Exception: + zn, cn = None, '?' + try: + taskAutoer.debug_line( + 'GT exitTeleportIn after old cls=%s zone=%s shouldContinue=%s streetId=%s resumeDone=%s' + % (cn, zn, self.shouldContinue, getattr(self, 'streetId', None), self._gtArrivalResumeDone) + ) + except Exception: + pass + self._maybeResumeIfInTargetZone('BattlePlace.exitTeleportIn') + + def clearSettings(self): + self.hasSettings=False + self.cogName=None + self.cogType=None + self.cogLevel=None + + def setCogName(self,name): + self.hasSettings=True + self.cogName=name + + def setCogType(self,type): + self.hasSettings=True + if type=='l': + type='Lawbot' + elif type=='s': + type='Sellbot' + elif type=='m': + type='Cashbot' + elif type=='c': + type='Bossbot' + self.cogType=type + + def setCogLevel(self,level): + self.hasSettings=True + self.cogLevel=level + + def newDistrict(self): + if not getattr(self, 'shardIds', None): + try: + taskAutoer.debug_line('GT newDistrict: shardIds empty — refill from districts') + except Exception: + pass + self.shardIds = [] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount < 50: + self.shardIds.append(shard) + if not self.shardIds: + try: + taskAutoer.debug_line('GT newDistrict: no shards — retry enterRandomBattle') + except Exception: + pass + Sequence(Wait(3), Func(self.enterRandomBattle)).start() + return + try: + taskAutoer.debug_line( + 'GT newDistrict: teleport hood=%s zone=%s shard=%s' + % (round(base.localAvatar.getZoneId(), -3), self.streetId, self.shardIds[0]) + ) + except Exception: + pass + base.cr.playGame.getPlace().requestTeleport(round(base.localAvatar.getZoneId(), -3), self.streetId, self.shardIds[0], None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def newStreet(self): + todo='street' + if self.streetId<9000: + if int(str(self.streetId)[1:])>300: + if self.shouldChangeDistrict: + self.streetId-=200 + todo='district' + elif self.shouldChangeHood: + todo='hood' + else: + self.streetId-=200 + else: + self.streetId+=100 + elif int(str(self.streetId)[1:])>200: + if self.shouldChangeDistrict: + self.streetId-=100 + todo='district' + + elif self.shouldChangeHood: + todo='hood' + else: + self.streetId-=100 + else: + self.streetId+=100 + + if todo=='district': + Sequence(Wait(2),Func(self.newDistrict)).start() + elif todo=='hood': + self.newHood() + else: + self.teleportBackToStreet() + + def nextZone(self): + try: + base.cr.playGame.getPlace().enterZone(base.localAvatar.getZoneId()+1) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + except KeyError: + if self.shouldChangeStreet: + self.newStreet() + else: + base.cr.playGame.getPlace().enterZone(self.streetId) + Sequence(Wait(0.5),Func(self.enterRandomBattle)).start() + + def enterRandomBattle(self): + if self.checkCogWalked: + self.checkCogWalked.pause() + firstTrack=self.restock.inventory.getInv("get1") + secondTrack=self.restock.inventory.getInv("get2") + battles = [] + battles2 = [] + for x in base.cr.doFindAllInstances(DistributedSuit.DistributedSuit): + if x.activeState == 6: + if x.getCurrentAnim() in ['walk','landing']: + if self.hasSettings and x.getActualLevel()>=self.cogLevel and (x.getName()==self.cogName or x.getStyleDept()==self.cogType or (not self.cogType and not self.cogName)): + battles.append(x) + battles2.append(True) + elif not self.hasSettings and x.getActualLevel()>self.restock.executeGags("return2") and x.getActualLevel()>self.restock.executeGags("return2"): + if base.localAvatar.getMaxHp()>suitToDamage[x.getActualLevel()] or self.restock.executeGags("return1")>3 or self.restock.executeGags("return2")>3: + battles.append(x) + battles2.append(True) + elif self.getPlace()>=11200 and self.getPlace()<=11300 and self.restock.executeGags("return1")>2 and self.restock.executeGags("return2")>2: + battles.append(x) + battles2.append(True) + else: + battles2.append(False) + else: + battles2.append(False) + if not taskAutoer.isQuestComplete(): + try: + if battles and base.localAvatar.getHp()>0: + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos,hpr) + self.checkCogWalked=Sequence(Wait(20),Func(self.enterRandomBattle)) + self.checkCogWalked.start() + self.lastCogId=battle.doId + else: + zid = base.localAvatar.getZoneId() + hqBand = range(HQZONES[0], HQZONES[-1] + 1000) + onHqCogExterior = zid in hqBand + if hasattr(base.cr.playGame.getPlace(), 'enterZone') and not onHqCogExterior: + try: + taskAutoer.debug_line('GT enterRandomBattle: no suits — nextZone (zone=%s)' % zid) + except Exception: + pass + self.nextZone() + else: + try: + taskAutoer.debug_line( + 'GT enterRandomBattle: no suits — newDistrict (zone=%s inHQBand=%s)' + % (zid, onHqCogExterior) + ) + except Exception: + pass + self.newDistrict() + except Exception as e: + try: + taskAutoer.debug_line('GT enterRandomBattle exception: %s' % e) + except Exception: + pass + else: + self.stop() + base.localAvatar.collisionsOff() + Sequence(Wait(2),Func(taskAutoer.checkWhatToDo)).start() + + def setLocation(self,zoneId): + if zoneId in range(10000,13999): + self.streetId=zoneId + elif round(zoneId,-3)!=zoneId: + self.streetId=zoneId+2 + else: + self.streetId=zoneId+102 + + def _unblockPlaceFsmForTeleport(self): + """Playground can sit in HFA/NPCFA during map teleport (tutorial gating); clear so requestTeleport can proceed.""" + try: + p = base.cr.playGame.getPlace() + if not p or not hasattr(p, 'fsm'): + return + st = p.fsm.getCurrentState().getName() + if st == 'HFA': + messenger.send(getattr(p, 'hfaDoneEvent', 'hfaDoneEvent'), [{'mode': 'complete'}]) + try: + taskAutoer.debug_line('GT: sent HFA complete before teleport chain') + except Exception: + pass + elif st == 'NPCFA': + messenger.send(getattr(p, 'npcfaDoneEvent', 'npcfaDoneEvent'), [{'mode': 'complete'}]) + try: + taskAutoer.debug_line('GT: sent NPCFA complete before teleport chain') + except Exception: + pass + except Exception: + pass + + def teleportBackToStreet(self): + try: + taskAutoer.debug_line( + 'GT teleportBackToStreet: streetId=%s zone=%s' + % (getattr(self, 'streetId', None), base.localAvatar.getZoneId()) + ) + except Exception: + pass + self._unblockPlaceFsmForTeleport() + self.walk() + self.restock.collectLaff() + try: + sid = int(self.streetId) + z = base.localAvatar.getZoneId() + if z in range(sid, sid + 90): + try: + taskAutoer.debug_line('GT teleportBackToStreet: already on target street — startLoops') + except Exception: + pass + self.startLoops() + self.enterRandomBattle() + return + except Exception as e: + try: + taskAutoer.debug_line('GT teleportBackToStreet: range check err %s' % e) + except Exception: + pass + try: + hood = round(self.streetId, -3) + taskAutoer.debug_line('GT teleportBackToStreet: requestTeleport(hood=%s, zone=%s)' % (hood, self.streetId)) + except Exception: + pass + self._gtArrivalResumeDone = False + self._startArrivalPoll() + base.cr.playGame.getPlace().requestTeleport(round(self.streetId, -3), self.streetId, None, None) + + def startLoops(self): + if self.buyGags.isPlaying(): + return + self.buyGags.loop() + self.gainLaff.loop() + self.battleLoop.loop() + self.invisibleSeq.loop() + + def stopLoops(self): + self.buyGags.finish() + self.gainLaff.finish() + self.battleLoop.finish() + self.invisibleSeq.finish() + + def start(self): + t0 = time.time() + try: + z0 = base.localAvatar.getZoneId() + sid = int(self.streetId) + taskAutoer.debug_line( + 'GT start: zone=%s streetId=%s inRange=%s' + % (z0, self.streetId, z0 in range(sid, sid + 90)) + ) + except Exception as e: + try: + taskAutoer.debug_line('GT start: probe failed %s' % e) + except Exception: + pass + if base.localAvatar.getTrackAccess()[0]: + self.restock.inventory.setToonUp2() + self.shouldContinue=True + try: + exec(hooks, globals()) + except Exception as e: + try: + taskAutoer.debug_line('GT start: exec(hooks) failed: %s' % e) + except Exception: + pass + raise + try: + taskAutoer.debug_line('GT start: exec(hooks) done in %.2fs' % (time.time() - t0)) + except Exception: + pass + try: + z = base.localAvatar.getZoneId() + sid = int(self.streetId) + in_band = z in range(sid, sid + 90) + except Exception as e: + try: + taskAutoer.debug_line('GT start: zone check err %s — teleport' % e) + except Exception: + pass + in_band = False + if not in_band: + try: + taskAutoer.debug_line('GT start: not on target street — teleportBackToStreet') + except Exception: + pass + self.teleportBackToStreet() + else: + try: + taskAutoer.debug_line('GT start: on target street — startLoops + enterRandomBattle') + except Exception: + pass + self.startLoops() + self.enterRandomBattle() + + def stop(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + DistributedPicnicBasket.DistributedPicnicBasket.__init__=old__init__4 + self.shouldContinue=False + self._stopArrivalPoll() + self.stopLoops() + + def walk(self): + try: + p = base.cr.playGame.getPlace() + st = p.fsm.getCurrentState().getName() if p and hasattr(p, 'fsm') else '?' + taskAutoer.debug_line('GT walk: forceTransition(walk) from state=%s' % st) + except Exception as e: + try: + taskAutoer.debug_line('GT walk: state probe err %s' % e) + except Exception: + pass + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except Exception as e: + try: + taskAutoer.debug_line('GT walk: forceTransition failed: %s' % e) + except Exception: + pass + +gagTrainer=GagTrainer() + +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.coghq import * +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattle +from toontown.battle import DistributedBattleFinal +from toontown.suit.DistributedFactorySuit import DistributedFactorySuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedSellbotBoss +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +from toontown.toon import DistributedToon +_ORIGINAL_LOCALTOON_SET_ANIM_STATE = DistributedToon.DistributedToon.setAnimState + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattleFactory.DistributedBattleFactory._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +class restock: + + def __init__(self): + if not base.localAvatar.getTrackAccess()[0] or base.localAvatar.experience.getExpLevel(0)<4: + self.noToonUp=True + self.secondTrack=4 + self.desiredLevel2=5 + else: + self.noToonUp=False + self.secondTrack=0 + self.desiredLevel2=4 + + if not base.localAvatar.getTrackAccess()[2] or base.localAvatar.experience.getExpLevel(2)<5: + self.noLure=True + self.firstTrack=4 + self.desiredLevel1=5 + else: + self.noLure=False + self.firstTrack=2 + self.desiredLevel1=5 + + if base.localAvatar.experience.getExpLevel(4)<5: + base.localAvatar.setSystemMessage(0,'You do not have the required throw level to run this.') + + self.thirdTrack=4 + self.desiredLevel3=5 + self.createInventory() + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def createInventory(self): + self.desiredInv="" + if self.desiredLevel1==6: + self.desiredLevel1=5 + + if self.desiredLevel2==6: + self.desiredLevel2=5 + + for i in range(49): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel1>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel2>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3): + if self.thirdTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel3>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + else: + self.desiredInv+="\x00" + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + vpMaxer.factoryAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, '5', None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, '5', None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + vpMaxer.factoryAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + + oldGardensInit=DGPlayground.DGPlayground.__init__ + oldSellbotInit=SellbotHQExterior.SellbotHQExterior.__init__ + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.shouldEnd=False + self.onlyLast=True + self.onlyFactory=False + self.canSetParentAgain=True + self.isMember=True + self.numberToSuit={0:'Cold Caller',1:'Telemarketer',2:'Name Dropper',3:'Glad Hander', + 4:'Mover & Shaker',5:'Two-Face',6:'The Mingler',7:'Mr. Hollywood'} + self.oldSetAnim = _ORIGINAL_LOCALTOON_SET_ANIM_STATE + + DGPlayground.DGPlayground.__init__=lambda *args:self.newGardensInit(*args) + SellbotHQExterior.SellbotHQExterior.__init__=lambda *args: self.newSellbotInit(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if vpMaxer.factoryAutoer.roomNum==len(vpMaxer.factoryAutoer.roomsNeeded): + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getName()!='Skelecog': + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if vpMaxer.restock.noToonUp and not vpMaxer.restock.noLure: + if vpMaxer.restock.firstTrack==2 and base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + elif vpMaxer.restock.noLure: + if vpMaxer.restock.secondTrack==0 and base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.firstTrack][vpMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.5): + + if base.localAvatar.inventory.inventory[vpMaxer.restock.secondTrack][vpMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newGardensInit(self,*args): + self.oldGardensInit(*args) + if self.shouldContinue: + vpMaxer.factoryAutoer.gainLaffSeq.finish() + vpMaxer.factoryAutoer.attackSeq.finish() + vpMaxer.restock.wasInBattle=False + self.checkMerits() + + def newSetAnimState(self,*args,**kwds): + a = args if len(args) <= 7 else args[:7] + self.oldSetAnim(*a, **kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkMerits)).start() + except: + pass + + def newSellbotInit(self,*args): + self.oldSellbotInit(*args) + if self.shouldContinue: + self.walk() + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkMerits)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def checkMerits(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyFactory: + if self.onlyLast: + base.localAvatar.cogMerits[3]+=self.getMeritsLeft()-1 + else: + base.localAvatar.cogMerits[3]=-4000 + if self.shouldEnd: + self.shouldContinue=False + if self.shouldContinue: + if self.getMeritsLeft()==0 and not self.onlyFactory: + if base.cr.doFind('DistributedSellbotHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + vpMaxer.vpAutoer.start() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedSellbotHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + vpMaxer.factoryAutoer.goFactory() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + vpMaxer.restock.noToons.finish() + base.cr.removeInterest(vpMaxer.restock.interest1) + base.cr.removeInterest(vpMaxer.restock.interest2) + vpMaxer.restock.unloaded=True + vpMaxer.factoryAutoer.attackSeq.finish() + vpMaxer.factoryAutoer.generateAgain() + + def getMeritsLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,3)-base.localAvatar.cogMerits[3] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=11000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoFactory(self): + self.onlyFactory=True + base.localAvatar.setSystemMessage(0,'The VP Maxer will do only factory runs') + + def doBoth(self): + self.onlyFactory=False + base.localAvatar.setSystemMessage(0,'The VP Maxer will do both factories and VPs') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def stop(self): + base.localAvatar.died=lambda *args: None + self.shouldContinue=True + self.shouldEnd=True + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: vpMaxer.factoryAutoer.newSafeZone(*args) + self.shouldEnd=False + self.shouldContinue=True + self.bossCount=0 + vpMaxer.restock.noToons.loop() + self.checkMerits() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DGPlayground.DGPlayground.__init__=self.oldGardensInit + SellbotHQExterior.SellbotHQExterior.__init__=self.oldSellbotInit + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class VpAutoer: + oldBossEnterElevator=DistributedSellbotBoss.DistributedSellbotBoss.enterElevator + oldEnterBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree + oldEnterPrepareBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue + oldEnterRollToBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + oldEnterWalk=CogHQLobby.CogHQLobby.enterWalk + + def __init__(self): + self.filter=False + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=lambda newSelf: self.newEnterRollToBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + CogHQLobby.CogHQLobby.enterWalk=lambda newSelf,*args,**kwds: self.newEnterWalk(newSelf,*args,**kwds) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBossCog__doneElevator() + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + if self.cardFilter(): + newSelf.exitIntroduction() + else: + Sequence(Wait(2),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.bossCount+=1 + vpMaxer.otherFunctions.teleBack() + + def newEnterRollToBattleTwo(self,newSelf): + self.oldEnterRollToBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf.exitRollToBattleTwo() + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleTwo(33) + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleThree(33) + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + self.endBattle() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if vpMaxer.otherFunctions.shouldContinue: + self.exploit() + + def newEnterWalk(self,newSelf,*args,**kwds): + self.oldEnterWalk(newSelf,*args,**kwds) + if len(args)>0: + if vpMaxer.otherFunctions.shouldContinue and args[0]: + self.goVpBattle() + + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and vpMaxer.otherFunctions.shouldContinue: + self.goVpBattle() + + def goVpBattle(self): + vpMaxer.otherFunctions.walk() + base.localAvatar.setWantBattles(True) + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def filterOn(self): + self.filter=True + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter bad cards') + + def filterOn16(self): + self.filter=True + self.cardsWanted=['Flippy', 'Daffy Don', 'Clerk Clara', 'Clerk Penny', 'Lil Oldman', 'Stinky Ned', 'Moe Zart', 'Sid Sonata', 'Barnacle Bessie',\ + 'Franz Neckvein', 'Madam Chuckle', 'Clerk Will', 'Nancy Gas', 'Mr. Freeze', 'Professor Pete', 'Soggy Nell'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter for 16 cards') + + def filterOff(self): + self.filter=False + base.localAvatar.setSystemMessage(0,'The VP Maxer will not filter bad cards') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(vpMaxer.otherFunctions.walk)).start() + + def endBattle(self): + if base.cr.doFind('V. P'): + base.cr.doFind('V. P').sendUpdate('hitBossInsides') + base.cr.doFind('V. P').sendUpdate('hitBoss', [100]) + base.cr.doFind('V. P').sendUpdate('finalPieSplat') + + def start(self): + if vpMaxer.otherFunctions.isMember: + base.localAvatar.collisionsOff() + base.cr.doFind('DistributedSellbotHQDoor').sendUpdate('requestEnter') + else: + vpMaxer.otherFunctions.walk() + base.cr.playGame.getPlace().requestTeleport(11000,11100,None,None) + + def cardFilter(self): + if base.cr.doFind('V. P').cagedToon.getName() in self.cardsWanted or not self.filter: + return True + else: + return False + + def revertFunctions(self): + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=self.oldBossEnterElevator + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=self.oldEnterRollToBattleTwo + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + CogHQLobby.CogHQLobby.enterWalk=self.oldEnterWalk + +class FactoryAutoer: + oldFactoryInit=FactoryExterior.FactoryExterior.__init__ + oldDistributedFactoryInit=DistributedFactory.DistributedFactory.__init__ + oldEnterReward=DistributedBattleFactory.DistributedBattleFactory.enterReward + oldEnterFactoryReward=DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward + + def __init__(self,vpMaxer): + self.roomNum=0 + self.zones=[4,7,8,13,22,24,34,32] + self.roomValues=[28,36,32,56,32,40,80,56] + self.gainLaffSeq=Sequence(Func(vpMaxer.restock.gainLaff),Wait(3.0)) + self.attackSeq=Sequence(Func(vpMaxer.restock.restock),Wait(1.0),Func(vpMaxer.otherFunctions.attack),Wait(1.0)) + self._safeZoneTaskName = 'factoryAutoerSafeZone-%s' % id(self) + + FactoryExterior.FactoryExterior.__init__=lambda *args: self.newFactoryInit(*args) + DistributedFactory.DistributedFactory.__init__=lambda *args: self.newDistributedFactoryInit(*args) + DistributedBattleFactory.DistributedBattleFactory.enterReward=lambda newSelf,*args:self.newEnterReward(newSelf,*args) + taskMgr.add(self._patchSafeZoneEnterHook, self._safeZoneTaskName) + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: self.newSafeZone(*args) + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=lambda newSelf,*args:self.newEnterFactoryReward(newSelf,*args) + + def _patchSafeZoneEnterHook(self, task): + sz = base.cr.doFind('SafeZone') + if sz is not None: + sz.d_enterSafeZone = lambda *args: self.newSafeZone(*args) + return task.done + return task.cont + + def enterBattle(self): + if base.localAvatar.getHp()>0: + if base.cr.doFindAll('battle')==[]: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedFactorySuit) or isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + try: + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + vpMaxer.otherFunctions.walk() + vpMaxer.restock.wasInBattle=False + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + return True + else: + self.warpToZone(self.roomsNeeded[self.roomNum]) + return False + except: + return False + else: + return False + else: + return False + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + newSelf.d_rewardDone(base.localAvatar.doId) + vpMaxer.otherFunctions.walk() + if self.roomNum>=len(self.roomsNeeded): + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + else: + Sequence(Wait(5),Func(self.enterBattle)).start() + + def newEnterFactoryReward(self,newSelf,*args): + self.oldEnterFactoryReward(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newFactoryInit(self,*args): + self.oldFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + Sequence(Wait(2),Func(self.enterElevator)).start() + + def newDistributedFactoryInit(self,*args): + self.oldDistributedFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.walk() + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.roomNum=0 + self.workOutRoomsNeeded() + Sequence(Wait(2),Func(self.warpToZone,self.roomsNeeded[self.roomNum])).start() + + def workOutRoomsNeeded(self): + self.roomsNeeded=[] + meritsNeeded=vpMaxer.otherFunctions.getMeritsLeft() + meritsNeeded-=self.roomValues[-1] + for i in range(7): + if meritsNeeded>0: + self.roomsNeeded.append(self.zones[i]) + meritsNeeded-=self.roomValues[i] + else: + break + self.roomsNeeded.append(self.zones[-1]) + + def warpToZone(self,zone): + for factory in base.cr.doFindAll('Factory'): + if hasattr(factory, 'warpToZone'): + factory.warpToZone(zone) + self.roomNum+=1 + break + Sequence(Wait(1),Func(self.enterBattle)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + vpMaxer.restock.wasInBattle=True + + def preTele(self): + exec(hooks, globals()) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def goFactory(self): + vpMaxer.otherFunctions.walk() + base.localAvatar.setWantBattles(True) + base.localAvatar.setPos(167.151, -157.024, -0.64781) + + def enterElevator(self): + for elevator in base.cr.doFindAll("Elevator"): + if elevator.getDestName()=='Front Entrance': + vpMaxer.otherFunctions.walk() + base.localAvatar.collisionsOff() + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + return + + def revertFunctions(self): + try: + taskMgr.remove(self._safeZoneTaskName) + except Exception: + pass + FactoryExterior.FactoryExterior.__init__=self.oldFactoryInit + DistributedFactory.DistributedFactory.__init__=self.oldDistributedFactoryInit + DistributedBattleFactory.DistributedBattleFactory.enterReward=self.oldEnterReward + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=self.oldEnterFactoryReward + sz = base.cr.doFind('SafeZone') + if sz is not None: + sz.d_enterSafeZone = lambda *args: None + base.localAvatar.died=lambda *args: None + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: None + self.generateAgain() + +class VPMaxer: + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.vpAutoer=VpAutoer() + self.factoryAutoer=FactoryAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.factoryAutoer.revertFunctions() + self.vpAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate +vpMaxer=VPMaxer() + +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.battle import DistributedBattle +from toontown.coghq import DistributedMintBattle +from toontown.coghq import DistributedMint +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import MintInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedCashbotBoss +from toontown.safezone import DLPlayground +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedMintBattle.DistributedMintBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + cfoMaxer.mintAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, '5', None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, '5', None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + cfoMaxer.mintAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDreamlandInit=DLPlayground.DLPlayground.__init__ + oldHqDoorInit=DistributedCogHQDoor.DistributedCogHQDoor.__init__ + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.onlyMint=False + self.onlyLast=False + self.isHealing=False + self.attackCogId=0 + self.canSetParentAgain=True + self.numberToSuit={0:'Short Change',1:'Penny Pusher',2:'Tightwad',3:'Bean Counter', + 4:'Number Cruncher',5:'Money Bags',6:'Loan Shark',7:'Robber Baron'} + self.oldSetAnim = LocalToon.LocalToon.setAnimState + DLPlayground.DLPlayground.__init__=lambda *args:self.newDreamlandInit(*args) + DistributedCogHQDoor.DistributedCogHQDoor.__init__=lambda *args: self.newHqDoorInit(*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if cfoMaxer.mintAutoer.finalDone: + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getActualLevel()!=12: + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.firstTrack][cfoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.firstTrack, cfoMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.secondTrack][cfoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.secondTrack, cfoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[cfoMaxer.restock.thirdTrack][cfoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [cfoMaxer.restock.thirdTrack, cfoMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDreamlandInit(self,*args): + self.oldDreamlandInit(*args) + if self.shouldContinue: + cfoMaxer.mintAutoer.gainLaffSeq.finish() + cfoMaxer.mintAutoer.attackSeq.finish() + cfoMaxer.restock.wasInBattle=False + self.checkCogbucks() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(3),Func(self.checkCogbucks)).start() + except: + pass + + def newHqDoorInit(self,*args): + # Original __init__(self, cr) only accepts (door, cr); some code paths may pass extra args. + if len(args) >= 2: + self.oldHqDoorInit(args[0], args[1]) + else: + self.oldHqDoorInit(*args) + if self.shouldContinue and base.localAvatar.getZoneId()==12000: + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkCogbucks)).start() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>70: + cfoMaxer.mintAutoer.attackSeq.finish() + self.isHealing=False + self.checkCogbucks() + else: + Sequence(Wait(1),Func(self.enterRandomBattle)).start() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and args[0].doId==self.attackCogId: + self.enterRandomBattle() + + def checkCogbucks(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyMint: + if self.onlyLast: + base.localAvatar.cogMerits[2]+=self.getCogbucksLeft()-1 + else: + base.localAvatar.cogMerits[2]=-4000 + if self.shouldEnd: + self.shouldContinue=False + if self.haveJb(): + if self.shouldContinue: + if self.getCogbucksLeft()==0 and not self.onlyMint: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.cfoAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=12000 and base.localAvatar.getZoneId()<12100: + cfoMaxer.mintAutoer.start() + else: + cfoMaxer.restock.restock() + cfoMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + cfoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(cfoMaxer.restock.interest1) + base.cr.removeInterest(cfoMaxer.restock.interest2) + cfoMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(0,"Thanks for using freshollie's cfo maxer") + else: + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getCogbucksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,2)-base.localAvatar.cogMerits[2] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=12000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoMint(self): + self.onlyMint=True + base.localAvatar.setSystemMessage(0,'CFO maxer set to only do the Mint') + + def doBoth(self): + self.onlyMint=False + base.localAvatar.setSystemMessage(0,'CFO maxer set to do both the Mint and the CFO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.attackCogId=battle.doId + else: + pass + + def stop(self): + self.shouldEnd=True + base.localAvatar.died=lambda *args: None + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: cfoMaxer.mintAutoer.newSafeZone(*args) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + self.checkCogbucks() + cfoMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DLPlayground.DLPlayground.__init__=self.oldDreamlandInit + DistributedCogHQDoor.DistributedCogHQDoor.__init__=self.oldHqDoorInit + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class CfoAutoer: + oldBossEnterElevator=DistributedCashbotBoss.DistributedCashbotBoss.enterElevator + oldEnterBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree + oldEnterPrepareBattleThree=DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + DistributedCashbotBoss.DistributedCashbotBoss.newState=DistributedCashbotBoss.DistributedCashbotBoss.setState + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + for i in range(5): + newSelf._DistributedCashbotBoss__epilogueChatNext(i,1) + cfoMaxer.otherFunctions.teleBack() + cfoMaxer.otherFunctions.bossCount+=1 + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(cfoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if cfoMaxer.otherFunctions.shouldContinue: + self.exploit() + cfoMaxer.autoerGui.display.newLine('Skipping Battle') + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + self.endBattle(newSelf) + + def start(self): + base.localAvatar.collisionsOff() + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + base.localAvatar.setWantBattles(True) + cfoMaxer.autoerGui.display.newLine('Starting the CFO') + cfoMaxer.autoerGui.display.newLine('Entering Lobby') + + def endBattle(self,newSelf): + newSelf.cranes[0].sendUpdate('requestControl', []) + for goon in base.cr.doFindAll('goon'): + goon.sendUpdate('requestGrab', []) + goon.sendUpdate('clearSmoothing', [0]) + goon.sendUpdate('hitBoss', [20.0]) + Sequence(Wait(1),Func(newSelf.exitBattleFour)).start() + + def revertFunctions(self): + DistributedCashbotBoss.DistributedCashbotBoss.enterElevator=self.oldBossEnterElevator + DistributedCashbotBoss.DistributedCashbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedCashbotBoss.DistributedCashbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedCashbotBoss.DistributedCashbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class MintAutoer: + oldMintEnterWalk=MintInterior.MintInterior.enterWalk + oldEnterReward=DistributedMintBattle.DistributedMintBattle.enterReward + oldEnterMintReward=DistributedMintBattle.DistributedMintBattle.enterMintReward + + def __init__(self,cfoMaxer): + self.attackSeq=Sequence(Func(cfoMaxer.restock.restock),Wait(1.0),Func(cfoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(cfoMaxer.restock.gainLaff),Wait(3.0)) + MintInterior.MintInterior.enterWalk=lambda newSelf,*args:self.newMintEnterWalk(newSelf,*args) + DistributedMintBattle.DistributedMintBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedMintBattle.DistributedMintBattle.enterMintReward=lambda *args:self.newEnterMintReward(*args) + + def setType(self,zoneId): + if zoneId==12500: + self.floorNumToLastRoomNum=[17,22,19,24,21,18,23,20,25,22,19,24,21,17,23,20,25,22,18,24] + self.elevatorName='Coin' + self.laffNeeded=0 + elif zoneId==12600: + self.floorNumToLastRoomNum=[17,18,20,22,23,25,18,19,21,23,24,17,19,20,22,24,25,18,20,21] + self.elevatorName='Dollar' + self.laffNeeded=66 + else: + self.floorNumToLastRoomNum=[17,23,21,19,17,23,21,19,17,23,21,19,17,24,21,19,17,24,21,19] + self.elevatorName='Bullion' + self.laffNeeded=71 + + def preTele(self): + exec(hooks, globals()) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def enterBattle(self): + if base.localAvatar.getHp()>0: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if x.doId not in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds and not self.finalDone: + battles.append(x) + elif self.finalDone and x.doId in base.cr.doFind('DistributedMintRoom '+str(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + cfoMaxer.restock.wasInBattle=False + return True + else: + return False + else: + return True + + def boardElevator(self): + if base.localAvatar.getHp()>self.laffNeeded: + for elevator in base.cr.doFindAll("Elevator"): + if self.elevatorName in elevator.getDestName(): + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + break + else: + self.attackSeq.loop() + cfoMaxer.otherFunctions.isHealing=True + cfoMaxer.otherFunctions.enterRandomBattle() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedMint.DistributedMint'): + base.cr.doFind('DistributedMint.DistributedMint').warpToRoom(room) + + def newMintEnterWalk(self,newSelf,*args): + self.oldMintEnterWalk(newSelf,*args) + if cfoMaxer.otherFunctions.shouldContinue and len(args)>0: + if args[0]: + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.workOutRoomsNeeded() + self.enterBattle() + + def workOutRoomsNeeded(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + battles.append(x) + self.battlesNeeded=0 + numBattles=(len(battles)/4)-1 + cogbucksNeeded=cfoMaxer.otherFunctions.getCogbucksLeft() + cogbucksNeeded-=68 + for i in range(numBattles): + if cogbucksNeeded>0: + self.battlesNeeded+=1 + cogbucksNeeded-=68 + else: + break + if not self.battlesNeeded: + self.finalDone=True + self.warpToRoom(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum]) + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + cfoMaxer.otherFunctions.walk() + if self.battleNum>self.battlesNeeded and not self.finalDone: + self.warpToRoom(self.floorNumToLastRoomNum[base.cr.doFind('DistributedMint.DistributedMint').floorNum]) + self.finalDone=True + Sequence(Wait(0.5),Func(self.enterBattle)).start() + elif self.enterBattle(): + pass + else: + cfoMaxer.otherFunctions.walk() + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + cfoMaxer.restock.wasInBattle=True + + def newEnterMintReward(self,*args): + self.oldEnterMintReward(*args) + if cfoMaxer.otherFunctions.shouldContinue: + cfoMaxer.otherFunctions.walk() + self.generateAgain() + self.attackSeq.finish() + self.gainLaffSeq.finish() + Sequence(Wait(1),Func(cfoMaxer.otherFunctions.teleBack)).start() + + def start(self): + self.battleNum=1 + self.finalDone=False + Sequence(Wait(1),Func(self.boardElevator)).start() + + def revertFunctions(self): + MintInterior.MintInterior.enterWalk=self.oldMintEnterWalk + DistributedMintBattle.DistributedMintBattle.enterReward=self.oldEnterReward + DistributedMintBattle.DistributedMintBattle.enterCountryClubReward=self.oldEnterMintReward + base.localAvatar.died=lambda *args: None + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + +class CFOmaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.cfoAutoer=CfoAutoer() + self.mintAutoer=MintAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.mintAutoer.revertFunctions() + self.cfoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + ag = getattr(self, 'autoerGui', None) + if ag is not None: + try: + ag.destroy() + except Exception: + pass + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate +cfoMaxer=CFOmaxer() + +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattleFinal +from toontown.battle import DistributedBattle +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.coghq import DistributedCountryClubBattle +from toontown.coghq import DistributedCountryClub +from toontown.coghq import DistributedGolfGreenGame +from toontown.coghq import DistributedCogHQDoor +from toontown.coghq import CogDisguiseGlobals +from toontown.coghq import BossbotHQExterior +from toontown.coghq import CashbotHQExterior +from toontown.coghq import CountryClubInterior +from toontown.suit.DistributedMintSuit import DistributedMintSuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedBossbotBoss +from toontown.safezone import DDPlayground + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedCountryClubBattle.DistributedCountryClubBattle._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + + +class restock: + + def __init__(self): + self.firstTrack=2 + self.secondTrack=0 + self.thirdTrack=4 + self.fourthTrack=3 + self.desiredLevel1=5 + self.desiredLevel2=4 + self.desiredLevel3=5 + self.desiredLevel4=5 + self.desiredInv='\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + ceoMaxer.countryClubAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, '5', None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, '5', None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + ceoMaxer.countryClubAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + oldDockEnterTeleportIn=DDPlayground.DDPlayground.enterTeleportIn + oldBossEnterWalk=BossbotHQExterior.BossbotHQExterior.enterWalk + oldCashEnterWalk=CashbotHQExterior.CashbotHQExterior.enterWalk + oldEnterReward=DistributedBattle.DistributedBattle.enterReward + oldDenyBattle=DistributedSuit.DistributedSuit.denyBattle + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + oldNpcFreeAvatar=DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.limit10=True + self.onlyClub=False + self.isHealing=False + self.canSetParentAgain=True + self.numberToSuit={0:'Flunky',1:'Pencil Pusher',2:'Yesman',3:'Micromanager', + 4:'Downsizer',5:'Head Hunter',6:'Corporate Raider',7:'The Big Cheese'} + self.oldSetAnim = LocalToon.LocalToon.setAnimState + DDPlayground.DDPlayground.enterTeleportIn=lambda newSelf,*args:self.newDockEnterTeleportIn(newSelf,*args) + BossbotHQExterior.BossbotHQExterior.enterWalk=lambda newSelf,*args: self.newBossEnterWalk(newSelf,*args) + CashbotHQExterior.CashbotHQExterior.enterWalk=lambda newSelf,*args: self.newCashEnterWalk(newSelf,*args) + DistributedBattle.DistributedBattle.enterReward=lambda newSelf,*args: self.newEnterReward(newSelf,*args) + DistributedSuit.DistributedSuit.denyBattle=lambda *args: self.newDenyBattle(*args) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=lambda *args: None + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if base.localAvatar.inventory.inventory[ceoMaxer.restock.firstTrack][ceoMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.firstTrack, ceoMaxer.restock.desiredLevel1, battle.suits[0].doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.9) or self.isHealing: + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.secondTrack][ceoMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.secondTrack, ceoMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[ceoMaxer.restock.thirdTrack][ceoMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [ceoMaxer.restock.thirdTrack, ceoMaxer.restock.desiredLevel3, battle.suits[0].doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + newself.d_rewardDone(base.localAvatar.doId) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newDockEnterTeleportIn(self,newSelf,*args): + self.oldDockEnterTeleportIn(newSelf,*args) + if self.shouldContinue: + ceoMaxer.countryClubAutoer.gainLaffSeq.finish() + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.checkStocks)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkStocks)).start() + except: + pass + + def newCashEnterWalk(self,newSelf,*args): + self.oldCashEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + ceoMaxer.countryClubAutoer.attackSeq.loop() + self.enterRandomBattle() + + def newBossEnterWalk(self,newSelf,*args): + self.oldBossEnterWalk(newSelf,*args) + if len(args)>0: + if self.shouldContinue and args[0]: + self.checkStocks() + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if self.shouldContinue and self.isHealing: + if base.localAvatar.getHp()>20: + self.isHealing=False + ceoMaxer.countryClubAutoer.attackSeq.finish() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + self.enterRandomBattle() + + def newDenyBattle(self,*args): + self.oldDenyBattle(*args) + if self.shouldContinue and self.isHealing and self.lastCogId==args[0].doId: + self.enterRandomBattle() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(1),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def checkStocks(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyClub: + base.localAvatar.cogMerits[0]=-4000 + if self.limit10 and self.bossCount>9: + self.shouldContinue=False + if self.shouldEnd: + self.shouldContinue=False + if self.shouldContinue: + if self.getStocksLeft()==0 and not self.onlyClub: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + ceoMaxer.ceoAutoer.start() + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + self.teleBack() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=10000 and base.localAvatar.getZoneId()<10100: + if base.localAvatar.getHp()>20: + ceoMaxer.countryClubAutoer.start() + else: + self.isHealing=True + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.restock() + ceoMaxer.restock.collectLaff() + self.walk() + if base.localAvatar.getHp()>20: + self.walk() + self.teleBack() + else: + self.isHealing=True + self.walk() + self.teleBack(12000) + else: + ceoMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(ceoMaxer.restock.interest1) + base.cr.removeInterest(ceoMaxer.restock.interest2) + ceoMaxer.restock.unloaded=True + except: + pass + + def getStocksLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,0)-base.localAvatar.cogMerits[0] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=10000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoClub(self): + self.onlyClub=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to only do the Country Club') + + def doBoth(self): + self.onlyClub=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to do both the Country Club and the CEO') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def enterRandomBattle(self): + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + if battles != []: + self.walk() + battle = random.choice(battles) + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + self.lastCogId=battle.doId + else: + pass + + def limiterOn(self): + self.limit10=True + base.localAvatar.setSystemMessage(0,'CEO maxer set to be limited to only 10 CEOs') + + def limiterOff(self): + self.limit10=False + base.localAvatar.setSystemMessage(0,'CEO maxer set to unlimited number of CEOs') + + def stop(self): + base.localAvatar.died=lambda *args: None + self.shouldContinue=True + self.shouldEnd=True + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: ceoMaxer.countryClubAutoer.newSafeZone(*args) + self.bossCount=0 + self.shouldContinue=True + self.shouldEnd=False + ceoMaxer.restock.noToons.loop() + self.checkStocks() + + + def revertFunctions(self): + DDPlayground.DDPlayground.enterTeleportIn=self.oldDockEnterTeleportIn + BossbotHQExterior.BossbotHQExterior.enterWalk=self.oldBossEnterWalk + CashbotHQExterior.CashbotHQExterior.enterWalk=self.oldCashEnterWalk + DistributedBattle.DistributedBattle.enterReward=self.oldEnterReward + DistributedSuit.DistributedSuit.denyBattle=self.oldDenyBattle + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DistributedNPCToonBase.DistributedNPCToonBase.freeAvatar=self.oldNpcFreeAvatar + +class CeoAutoer: + oldBossEnterElevator=DistributedBossbotBoss.DistributedBossbotBoss.enterElevator + oldEnterBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo + oldEnterBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour + oldEnterPrepareBattleTwo=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree + oldEnterPrepareBattleFour=DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour + oldEnterEpilogue=DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + + def __init__(self): + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=lambda newSelf: self.newEnterBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=lambda newSelf: self.newEnterBattleTwo(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=lambda newSelf: self.newEnterPrepareBattleFour(newSelf) + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.walk() + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitIntroduction() + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf.exitPrepareBattleTwo() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + ceoMaxer.otherFunctions.bossCount+=1 + ceoMaxer.otherFunctions.teleBack() + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + newSelf.exitPrepareBattleThree() + + def newEnterPrepareBattleFour(self,newSelf): + self.oldEnterPrepareBattleFour(newSelf) + newSelf.exitPrepareBattleFour() + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(ceoMaxer.otherFunctions.walk)).start() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if ceoMaxer.otherFunctions.shouldContinue: + self.exploit() + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if ceoMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBossCog__doneElevator() + + def newEnterBattleTwo(self,newSelf): + self.oldEnterBattleTwo(newSelf) + + def newEnterBattleFour(self,newSelf): + self.oldEnterBattleFour(newSelf) + self.endBattle(newSelf) + + def start(self): + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + + def endBattle(self,newSelf): + newSelf.sendUpdate('hitBoss', [250]) + newSelf.exitBattleFour() + + def revertFunctions(self): + DistributedBossbotBoss.DistributedBossbotBoss.enterElevator=self.oldBossEnterElevator + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleTwo=self.oldEnterBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterBattleFour=self.oldEnterBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedBossbotBoss.DistributedBossbotBoss.enterPrepareBattleFour=self.oldEnterPrepareBattleFour + DistributedBossbotBoss.DistributedBossbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedBossbotBoss.DistributedBossbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + +class CountryClubAutoer: + oldCountryClubInit=DistributedCountryClub.DistributedCountryClub.__init__ + oldEnterReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward + oldGolfGameToonEnter=DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter + oldEnterCountryClubReward=DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward + + def __init__(self,ceoMaxer): + self.attackSeq=Sequence(Func(ceoMaxer.restock.restock),Wait(1.0),Func(ceoMaxer.otherFunctions.attack),Wait(1.0)) + self.gainLaffSeq=Sequence(Func(ceoMaxer.restock.gainLaff),Wait(3.0)) + self.battleNum=1 + DistributedCountryClub.DistributedCountryClub.__init__=lambda *args:self.newCountryClubInit(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=lambda *args:self.newEnterReward(*args) + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=lambda *args:self.newGolfGameToonEnter(*args) + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=lambda *args:self.newEnterCountryClubReward(*args) + + def setFrontThree(self): + self.floorNumToKartRoomNum={0:17,1:17,2:18} + self.battles=[1,3,5] + self.greenRoom=9 + self.countryClubName='The Front Three' + + def setMiddleSix(self): + self.greenRoom=29 + self.battles=[1,3,5,7,9,11] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:18} + self.countryClubName='The Middle Six' + + def setBackNine(self): + self.greenRoom=39 + self.battles=[1,3,5,7,9,11,13,15,17] + self.floorNumToKartRoomNum={0:17,1:17,2:17,3:17,4:17,5:17,6:17,7:17,8:18} + self.countryClubName='The Back Nine' + + def preTele(self): + exec(hooks, globals()) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def enterBattle(self): + if base.localAvatar.getHp()>0: + ceoMaxer.restock.wasInBattle=False + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedMintSuit): + if x.activeState == 6: + if self.battleNum in self.battles: + if x.doId not in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + else: + if x.doId in base.cr.doFind('DistributedCountryClubRoom '+str(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum])).suitIds: + battles.append(x) + + if battles != []: + battle=battles[0] + ceoMaxer.otherFunctions.walk() + pos, hpr = battle.getPos(), battle.getHpr() + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + return True + else: + return False + else: + return True + + def doMoles(self): + moleSeq=Sequence() + for moleField in base.cr.doFindAll('MoleField'): + for i in range(moleField.numMoles): + moleSeq.append(Func(moleField.sendUpdate,'whackedMole', [0, i])) + moleSeq.append(Wait(0.05)) + moleSeq.append(Wait(0.5)) + moleSeq.append(Func(self.enterBattle)) + moleSeq.start() + + def doGolf(self): + gameSeq=Sequence() + for greenGame in base.cr.doFindAll('GolfGreenGame'): + for i in range(greenGame.boardsLeft): + gameSeq.append(Func(greenGame.sendUpdate,'requestBoard', [1])) + gameSeq.append(Wait(2)) + gameSeq.append(Func(self.endFloor)) + gameSeq.start() + + def enterCountryClub(self): + for kart in base.cr.doFindAll('DistributedCogKart'): + if kart.getDestName()==self.countryClubName: + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[kart.doId]) + break + + def boardKart(self): + ceoMaxer.otherFunctions.walk() + self.attackSeq.finish() + self.gainLaffSeq.finish() + for kart in base.cr.doFindAll('DistributedClubElevator'): + kart.handleEnterSphere(base.localAvatar.doId) + return + ceoMaxer.otherFunctions.walk() + ceoMaxer.otherFunctions.teleBack() + self.generateAgain() + + def warpToRoom(self,room): + if base.cr.doFind('DistributedCountryClub.DistributedCountryClub'): + base.cr.doFind('DistributedCountryClub.DistributedCountryClub').warpToRoom(room) + + def newCountryClubInit(self,*args): + self.oldCountryClubInit(*args) + self.attackSeq.loop() + self.gainLaffSeq.loop() + Sequence(Wait(3),Func(self.doMoles)).start() + + def newGolfGameToonEnter(self,*args): + self.oldGolfGameToonEnter(*args) + if ceoMaxer.otherFunctions.shouldContinue: + Sequence(Wait(3),Func(self.doGolf)).start() + + def newEnterReward(self,*args): + self.oldEnterReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + base.cr.doFind('battle').d_rewardDone(base.localAvatar.doId) + self.battleNum+=1 + ceoMaxer.otherFunctions.walk() + if not self.enterBattle(): + self.warpToRoom(self.greenRoom) + ceoMaxer.otherFunctions.walk() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(ceoMaxer.otherFunctions.walk)).start() + ceoMaxer.restock.wasInBattle=True + + def newEnterCountryClubReward(self,*args): + self.oldEnterCountryClubReward(*args) + if ceoMaxer.otherFunctions.shouldContinue: + Sequence(Wait(1.5),Func(self.boardKart)).start() + + def endFloor(self): + ceoMaxer.otherFunctions.walk() + self.warpToRoom(self.floorNumToKartRoomNum[base.cr.doFind('DistributedCountryClub.DistributedCountryClub').floorNum]) + Sequence(Wait(1),Func(self.boardKart)).start() + + def start(self): + self.battleNum=1 + if ceoMaxer.otherFunctions.getStocksLeft()>953 and base.localAvatar.getCogParts()[0]!=0: + self.setBackNine() + elif ceoMaxer.otherFunctions.getStocksLeft()>386 and base.localAvatar.getCogParts()[0]!=0: + self.setMiddleSix() + else: + self.setFrontThree() + Sequence(Wait(1),Func(self.enterCountryClub)).start() + + def revertFunctions(self): + DistributedCountryClub.DistributedCountryClub.__init__=self.oldCountryClubInit + DistributedCountryClubBattle.DistributedCountryClubBattle.enterReward=self.oldEnterReward + DistributedGolfGreenGame.DistributedGolfGreenGame._DistributedGolfGreenGame__handleToonEnter=self.oldGolfGameToonEnter + DistributedCountryClubBattle.DistributedCountryClubBattle.enterCountryClubReward=self.oldEnterCountryClubReward + base.localAvatar.died=lambda *args: None + self.generateAgain() + +class CEOMaxer: + + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.ceoAutoer=CeoAutoer() + self.countryClubAutoer=CountryClubAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.countryClubAutoer.revertFunctions() + self.ceoAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + ag = getattr(self, 'autoerGui', None) + if ag is not None: + try: + ag.destroy() + except Exception: + pass + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +ceoMaxer=CEOMaxer() + +TAG.buildingAutoer = buildingAutoer +TAG.gagTrainer = gagTrainer +TAG.vpMaxer = vpMaxer +TAG.cfoMaxer = cfoMaxer +TAG.ceoMaxer = ceoMaxer +TAG.cjMaxer = None +try: + import importlib.util + import os + try: + _autoersDir = os.path.dirname(os.path.abspath(__file__)) + except NameError: + _autoersDir = os.path.join(os.getcwd(), 'autoers') + _cjPath = os.path.join(_autoersDir, 'CJMaxer.py') + if os.path.isfile(_cjPath): + _spec = importlib.util.spec_from_file_location('autoers_cjmaxer', _cjPath) + _cjMod = importlib.util.module_from_spec(_spec) + _spec.loader.exec_module(_cjMod) + TAG.cjMaxer = getattr(_cjMod, 'cjMaxer', None) +except Exception: + pass + +try: + taskAutoer.debug_line( + 'Bundle: companions ready (BA/GT/VP/CFO/CEO/CJ=%s)' + % ('yes' if TAG.cjMaxer is not None else 'no') + ) +except Exception: + pass + +if base.config.GetBool('want-task-autoer-autostart', False): + taskAutoer.checkWhatToDo() \ No newline at end of file diff --git a/autoers/ToonBot.py b/autoers/ToonBot.py new file mode 100644 index 0000000..56acc07 --- /dev/null +++ b/autoers/ToonBot.py @@ -0,0 +1,602 @@ +import urllib +import os +import __main__ +from pandac.PandaModules import * +from direct.gui.DirectGui import * +from direct.interval.IntervalGlobal import * +from toontown.effects import DistributedFireworkShow +for attribute in dir(DistributedFireworkShow.DistributedFireworkShow): + exec('DistributedFireworkShow.DistributedFireworkShow.'+attribute+'=lambda *args,**kwds: None') + +class GuiTools: + + def __init__(self): + pass + + def loadImageAsPlane(self,filepath,resX=None,resY=None): + yresolution=600 + tex = loader.loadTexture(filepath) + tex.setBorderColor(Vec4(0,0,0,0)) + tex.setWrapU(Texture.WMRepeat) + tex.setWrapV(Texture.WMRepeat) + cm = CardMaker(filepath + ' card') + if resX==None: + resX=tex.getOrigFileXSize() + if resY==None: + resY=tex.getOrigFileYSize() + cm.setFrame(-resX, resX, -resY, resY) + card = NodePath(cm.generate()) + card.setTexture(tex) + card.flattenLight() + card.setScale(card.getScale()/ yresolution) + return card + + def createButton(self, cmd, position, model, buttonImgs, colour=(1,1,1,1),text=''): + ButtonImage = loader.loadModel(model) + ButtonImageUp = ButtonImage.find("**/"+buttonImgs[0]); + ButtonImageDown = ButtonImage.find("**/"+buttonImgs[1]); + ButtonImageRollover = ButtonImage.find("**/"+buttonImgs[-1]); + return DirectButton(frameSize=None, image=(ButtonImageUp, \ + ButtonImageDown, ButtonImageRollover), relief=None, command=cmd, \ + geom=None, pad=(0.01, 0.01), text=text, suppressKeys=0, pos=position, text_fg=(1,1,1,1), color=colour ,text_scale=0.059, borderWidth=(0.13, 0.01), scale=.7) + + def createBox(self): + background=[] + for i in range(2): + background.append(guiTools.loadImageAsPlane('phase_12/maps/WallBricksBig2.jpg',175,175)) + background[i].reparentTo(aspect2d) + background[0].setPos(-.585,0,0.235) + background[1].setPos(-.585,0,-.22) + + overlay=guiTools.loadImageAsPlane('phase_11/maps/lawbotHQ_palette_2tmla_1.jpg',175,315) + overlay.reparentTo(aspect2d) + overlay.setTransparency(TransparencyAttrib.MAlpha) + overlay.setAlphaScale(0.6) + overlay.setPos(-.585,0,0) + + sides=[] + for i in range(6): + sides.append(guiTools.loadImageAsPlane("phase_7/maps/screwsBar.jpg",140,20)) + sides[i].reparentTo(aspect2d) + + sides[0].setHpr(0,0,270) + sides[0].setPos(-.85,0,.237) + + sides[1].setPos(-.586,0,.504) + + sides[2].setHpr(0,0,90) + sides[2].setPos(-.32,0,.237) + + sides[3].setHpr(0,0,90) + sides[3].setPos(-.32,0,-.23) + + sides[4].setHpr(0,0,270) + sides[4].setPos(-.85,0,-.23) + + sides[5].setHpr(0,0,180) + sides[5].setPos(-.585,0,-.4955) + + corners=[] + for i in range(4): + corners.append(guiTools.loadImageAsPlane("phase_9/maps/CeilingMetalPlate2.jpg",20,20)) + corners[i].reparentTo(aspect2d) + corners[0].setPos(-.85,0,.504) + corners[1].setPos(-.85,0,-.4955) + corners[2].setPos(-.32,0,.504) + corners[3].setPos(-.32,0,-.4955) + + title=OnscreenText(text='',style=1, fg=(1,1,1,1), pos=(-.585,.42), scale=0.06) + return background,overlay,sides,corners,title + +guiTools=GuiTools() + +class About: + def __init__(self): + self.background,self.overlay,self.sides,self.corners,self.title=guiTools.createBox() + self.closeButton=guiTools.createButton(self.close,(-0.917,0,.45),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.openButton=guiTools.createButton(self.open,(-0.917,0,.45),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.closeButton.setHpr(0,0,180) + self.text=[] + for i in range(3): + self.text.append(OnscreenText(text='', style=1, fg=(1,1,1,1), pos=(0,0,0), scale=.05, align=TextNode.ALeft)) + self.text[0].setPos(-0.26,.33) + self.text[1].setPos(-0.26,.25) + self.text[2].setPos(-0.26,.17) + for i in range(21): + self.text.append(OnscreenText(text='', style=1, fg=(1,1,1,1), pos=(0,0,0), scale=.04, align=TextNode.ALeft)) + num=0.14 + for i in range(3,24): + num-=0.04 + self.text[i].setPos(-0.26,num) + self.closeButton.hide() + self.title.setText('About Script') + self.offsetEverything() + self.close() + + def offsetEverything(self): + for side in self.sides: + x=side.getPos()[0]+0.53 + y=side.getPos()[2] + side.setPos(x,0,y) + for background in self.background: + x=background.getPos()[0]+0.53 + y=background.getPos()[2] + background.setPos(x,0,y) + for corner in self.corners: + x=corner.getPos()[0]+0.53 + y=corner.getPos()[2] + corner.setPos(x,0,y) + + x=self.overlay.getPos()[0]+0.53 + y=self.overlay.getPos()[2] + self.overlay.setPos(x,0,y) + x=self.title.getPos()[0]+0.53 + y=self.title.getPos()[1] + self.title.setPos(x,y) + + def open(self): + for side in self.sides: + side.show() + for background in self.background: + background.show() + for corner in self.corners: + corner.show() + for text in self.text: + text.show() + self.overlay.show() + self.closeButton.show() + self.title.show() + self.openButton.hide() + + def close(self): + for side in self.sides: + side.hide() + for background in self.background: + background.hide() + for corner in self.corners: + corner.hide() + for text in self.text: + text.hide() + self.overlay.hide() + self.closeButton.hide() + self.title.hide() + self.openButton.show() + + def wrapText(self,line): + for i in range(3,24): + if len(line)>25: + if line[24]==" ": + self.text[i].setText(line[:24]) + line=line[24:] + + else: + for x in range(25,0,-1): + if line[x-1]==" ": + self.text[i].setText(line[:x-1]) + line=line[x-1:] + break + else: + self.text[i].setText(line) + break + + def update(self,currentScript): + for text in self.text: + text.setText('') + self.text[0].setText('Name: '+currentScript['name']) + self.text[1].setText('Author: '+currentScript['author']) + self.text[2].setText('Version: '+currentScript['version']) + self.wrapText(' '+currentScript['description']) + + +class Options: + + def __init__(self): + self.background,self.overlay,self.sides,self.corners,self.title=guiTools.createBox() + self.title.setText('Options') + self.optionButtons=[] + self.optionText=[] + self.closeButton=guiTools.createButton(self.close,(-0.917,0,.323),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.openButton=guiTools.createButton(self.open,(-0.917,0,.323),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.closeButton.setHpr(0,0,180) + self.closeButton.hide() + self.close() + + def open(self): + for side in self.sides: + side.show() + for background in self.background: + background.show() + for corner in self.corners: + corner.show() + for button in self.optionButtons: + button.show() + for text in self.optionText: + text.show() + self.overlay.show() + self.closeButton.show() + self.title.show() + self.openButton.hide() + + def close(self): + for side in self.sides: + side.hide() + for background in self.background: + background.hide() + for corner in self.corners: + corner.hide() + for button in self.optionButtons: + button.hide() + for text in self.optionText: + text.hide() + self.overlay.hide() + self.closeButton.hide() + self.title.hide() + self.openButton.show() + + def update(self,currentScript): + for i in range(len(self.optionButtons)): + self.optionButtons[i].destroy() + del self.optionButtons[i] + self.removeButtons() + model='phase_3/models/gui/quit_button.bam' + buttonImgs=['QuitBtn_UP','QuitBtn_DN','QuitBtn_RLVR'] + for key in currentScript['options']: + self.optionButtons.append(guiTools.createButton(eval(currentScript['options'][key]['command']), self.getButtonPos(currentScript['options'][key]['pos']), model, buttonImgs, colour=(0.5,0.1,0.5,1),text=key)) + self.updateText(currentScript) + + def updateText(self,currentScript): + self.title.setText(currentScript['name']+' Options') + for i in range(len(self.optionText)): + self.optionText[i].destroy() + del self.optionText[i] + if 'text' in currentScript: + for key in currentScript['text']: + self.optionText.append(OnscreenText(text=key, style=1, fg=(1,1,1,1), pos=(self.getButtonPos(currentScript['text'][key])[0],self.getButtonPos(currentScript['text'][key])[2]), scale=.04)) + + def removeText(self): + for text in self.optionText: + text.destroy() + del self.optionText + self.optionText=[] + + def removeButtons(self): + for button in self.optionButtons: + button.destroy() + del self.optionButtons + self.optionButtons=[] + self.removeText() + self.title.setText('Options') + + def getButtonPos(self,pos): + columnNum=pos[1] + rowNum=pos[0] + if columnNum==0: + x=-0.73 + else: + x=-0.44 + y=0.35-(0.07*rowNum) + return (x,0,y) + +class Scroller: + def __init__(self,itemList,textNode,aboutClass): + self.list=itemList[:] + self.listPos=0 + self.textNode=textNode + self.about=aboutClass + self.shownItem=self.list[self.listPos] + + self.upArrow=guiTools.createButton(self.scrollUp,(-1.11,0,0.44),'phase_3.5/models/gui/friendslist_gui.bam',['FndsLst_ScrollUp','FndsLst_ScrollDN','FndsLst_ScrollUp_Rllvr']) + self.upArrow.setScale(1.1) + + self.downArrow=guiTools.createButton(self.scrollDown,(-1.11,0,0.335),'phase_3.5/models/gui/friendslist_gui.bam',['FndsLst_ScrollUp','FndsLst_ScrollDN','FndsLst_ScrollUp_Rllvr']) + self.downArrow.setHpr(0,0,180) + self.downArrow.setScale(1.1) + self.updateShownItem() + + + def scrollUp(self): + if self.listPos-1<0: + return + else: + self.listPos-=1 + self.shownItem=self.list[self.listPos] + self.updateShownItem() + + def updateList(self,newList): + self.list=newList[:] + self.shownItem=self.list[self.listPos] + self.updateShownItem() + + def scrollDown(self): + if self.listPos+1>=len(self.list): + return + else: + self.listPos+=1 + self.shownItem=self.list[self.listPos] + self.updateShownItem() + + def updateShownItem(self): + self.textNode.setText(self.shownItem['name']) + self.about.update(self.shownItem) + + def hideAll(self): + self.upArrow.hide() + self.downArrow.hide() + self.textNode.hide() + + def showAll(self): + self.upArrow.show() + self.downArrow.show() + self.textNode.show() + + def destroy(self): + self.upArrow.destroy() + self.downArrow.destroy() + self.textNode.destroy() + +class ToonBot: + TOONBOT_DIRECTORY = "toonbot/" + SCRIPTS_DIRECTORY = TOONBOT_DIRECTORY + "scripts/" + LIBS_DIRECTORY = TOONBOT_DIRECTORY + "libs/" + + TOONBOT_STRING = "ToonBot: " + + def __init__(self): + self.scriptCurrentlyLoaded=False + self.scriptLoaded=None + self.scriptOn=False + self.defaultScript=\ + {'name':'No Scripts',\ + 'description':'You appear to have installed \n\ + no scripts to Toon-Bot go to \n\ + youtube.com/toontowninjecting \n\ + where you will find some scripts',\ + 'author': 'None',\ + 'version': 'None',\ + 'load':'no scripts.txt',\ + 'unload':None,\ + 'start':'pass',\ + 'stop':'pass',\ + 'options':'None',\ + 'location':'None', + 'description':'None'} + self.scripts=[self.defaultScript] + + if not os.path.exists(ToonBot.SCRIPTS_DIRECTORY): + os.makedirs(ToonBot.SCRIPTS_DIRECTORY) + os.makedirs(ToonBot.LIBS_DIRECTORY) + self.createGui() + self.importScripts() + + def addScript(self,script): + if 'https://' not in script['location']: + scriptLib=open(ToonBot.LIBS_DIRECTORY + script['name']+'.txt','w') + scriptLib.write(str(script)) + scriptLib.close() + self.importScripts() + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING+script['name']+' Added to Toon-Bot, you will never need to inject it again!') + else: + base.localAvatar.setSystemMessage(0,'ToonBot: The script you tried to add contained a url with https, it needs to be http to work.') + + def downloadScript(self,script): + myfile=open(ToonBot.SCRIPTS_DIRECTORY + script['name']+'.txt','w') + try: + downloadedScript=urllib.urlopen(script['location']).read() + except: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'Script location doesnt exist') + myfile.close() + return False + myfile.write(downloadedScript) + myfile.close() + return True + + def loadScript(self): + if not self.scriptCurrentlyLoaded: + script=self.scripts[self.scroller.listPos] + if script['location'] == 'None': + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'Cannot load a script with no location') + return + if not self.downloadScript(script): + return + myfile=open(ToonBot.SCRIPTS_DIRECTORY + script['name'] + '.txt','r') + for line in myfile: + if '#outdated' in line: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'The Script you loaded appears to be outdated, go to the authors youtube to download the latest version') + break + myfile.close() + execfile(ToonBot.SCRIPTS_DIRECTORY + script['name'] + '.txt',globals()) + self.scriptCurrentlyLoaded=True + self.scriptLoaded=script + self.options.open() + self.options.update(self.scriptLoaded) + self.closeAutoerGuiButton.show() + self.openAutoerGuiButton.hide() + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'You already have a script loaded. Unload that script before reloading a new one') + + def unloadScript(self): + if self.scriptCurrentlyLoaded: + if not self.scriptOn: + eval(self.scriptLoaded['unload']) + self.scriptCurrentlyLoaded=False + self.scriptLoaded=None + self.options.close() + self.options.removeButtons() + self.closeAutoerGuiButton.hide() + self.openAutoerGuiButton.show() + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'You cannot unload a script while the script is running') + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'You currently do not have a loaded script') + + def startScript(self): + if not self.scriptOn: + if self.scriptCurrentlyLoaded: + self.scriptOn=True + eval(self.scriptLoaded['start']) + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'You cannot start a script that has not been loaded') + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'The script is already running') + + def stopScript(self): + if self.scriptOn: + self.scriptOn=False + eval(self.scriptLoaded['stop']) + else: + base.localAvatar.setSystemMessage(0, ToonBot.TOONBOT_STRING + 'The script is already stopped') + + + def importScripts(self): + self.scripts=[] + for script in os.listdir(ToonBot.LIBS_DIRECTORY): + try: + self.scripts.append(eval(open(ToonBot.LIBS_DIRECTORY + script,'r').read())) + except: + os.remove(ToonBot.LIBS_DIRECTORY + script) + + if self.scripts==[]: + self.scripts=[self.defaultScript] + + self.reloadScroller() + + def createGui(self): + self.background=[] + for i in range(2): + self.background.append(guiTools.loadImageAsPlane('phase_12/maps/WallBricksBig2.jpg',170,170)) + self.background[i].reparentTo(aspect2d) + self.background[0].setPos(-1.11,-0.5,0.65) + self.background[0].setScale(0.0013) + self.background[1].setPos(-1.11,-0.5,0.51) + self.background[1].setScale(0.0013) + + self.overLay=guiTools.loadImageAsPlane('phase_11/maps/lawbotHQ_palette_2tmla_1.jpg',130,175) + self.overLay.reparentTo(aspect2d) + self.overLay.setTransparency(TransparencyAttrib.MAlpha) + self.overLay.setAlphaScale(0.6) + self.overLay.setPos(-1.1,0,.59) + + self.sides=[] + for i in range(5): + self.sides.append(guiTools.loadImageAsPlane("phase_7/maps/screwsBar.jpg",140,20)) + self.sides[i].reparentTo(aspect2d) + self.sides[0].setHpr(0,0,90) + self.sides[0].setPos(-0.917,0.6,0.59) + self.sides[1].setHpr(0,0,270) + self.sides[1].setPos(-1.3,0.6,0.59) + self.sides[2].setPos(-1.117,0.6,0.85) + self.sides[3].setPos(-1.117,0.6,0.323) + self.sides[4].setPos(-1.117,0.6,0.45) + + self.corners=[] + for i in range(6): + self.corners.append(guiTools.loadImageAsPlane("phase_9/maps/CeilingMetalPlate2.jpg",20,20)) + self.corners[i].reparentTo(aspect2d) + self.corners[0].setPos(-0.917,0,0.85) + self.corners[1].setPos(-1.3,0,0.85) + self.corners[2].setPos(-0.917,0,.323) + self.corners[3].setPos(-1.3,0,.323) + self.corners[4].setPos(-0.917,0,.45) + self.corners[5].setPos(-1.3,0,.45) + model='phase_3/models/gui/quit_button.bam' + + buttonImgs=['QuitBtn_UP','QuitBtn_DN','QuitBtn_RLVR'] + + self.options=Options() + self.about=About() + self.scroller=Scroller(self.scripts,OnscreenText(text='',style=1, fg=(1,1,1,1), pos=(-1.11,.37), scale=0.06),self.about) + + self.closeButton=guiTools.createButton(self.hideGui,(-1.3,0,.323),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.closeButton.setHpr(0,0,180) + self.openButton=guiTools.createButton(self.showGui,(-1.3,0,.323),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.openButton.hide() + + self.closeAutoerGuiButton=guiTools.createButton(self.closeAutoerGui,(-0.917,0,0.85),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.closeAutoerGuiButton.setHpr(0,0,180) + self.openAutoerGuiButton=guiTools.createButton(self.openAutoerGui,(-0.917,0,0.85),'phase_3.5/models/gui/friendslist_gui.bam',['Horiz_Arrow_UP','Horiz_Arrow_DN','Horiz_Arrow_Rllvr']) + self.closeAutoerGuiButton.hide() + + self.buttons=[] + self.buttons.append(guiTools.createButton(self.loadScript,(-1.11,0,.77), model, buttonImgs, colour=(0.5,0.1,0.5,1),text='Load Script')) + self.buttons.append(guiTools.createButton(self.startScript,(-1.11,0,.697), model, buttonImgs, colour=(0.5,0.1,0.5,1),text='Start Script')) + self.buttons.append(guiTools.createButton(self.stopScript,(-1.11,0,.624), model, buttonImgs, colour=(0.5,0.1,0.5,1),text='Stop Script')) + self.buttons.append(guiTools.createButton(self.unloadScript,(-1.11,0,.551), model, buttonImgs, colour=(0.5,0.1,0.5,1),text='Unload Script')) + + + def reloadScroller(self): + self.scroller.updateList(self.scripts) + + def closeAutoerGui(self): + if self.scriptCurrentlyLoaded: + eval(self.scriptLoaded['close']) + self.closeAutoerGuiButton.hide() + self.openAutoerGuiButton.show() + + def openAutoerGui(self): + if self.scriptCurrentlyLoaded: + eval(self.scriptLoaded['open']) + self.closeAutoerGuiButton.show() + self.openAutoerGuiButton.hide() + + def hideGui(self): + for background in self.background: + background.hide() + for side in self.sides: + side.hide() + for corner in self.corners: + corner.hide() + for button in self.buttons: + button.hide() + self.scroller.hideAll() + self.overLay.hide() + self.closeButton.hide() + self.closeAutoerGui() + self.options.close() + self.options.openButton.hide() + self.about.close() + self.about.openButton.hide() + self.openButton.show() + self.closeAutoerGuiButton.hide() + self.openAutoerGuiButton.hide() + + def showGui(self): + for background in self.background: + background.show() + for side in self.sides: + side.show() + for corner in self.corners: + corner.show() + for button in self.buttons: + button.show() + self.options.openButton.show() + self.about.openButton.show() + self.scroller.showAll() + self.overLay.show() + self.closeButton.show() + self.openButton.hide() + self.openAutoerGuiButton.show() + +define=''' +toonBot=executeToonbot('return') +myfile=open(ToonBot.SCRIPTS_DIRECTORY + 'AutoerGui.txt','w') +script=urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToonBot/master/AutoerGui.py').read() +myfile.write(script) +myfile.close() +execfile('Toon Bot/Scripts/AutoerGui.txt',globals()) +''' + +def executeToonbot(type): + global toonBot + if type=='define': + toonBot=ToonBot() + exec(define, __main__.__dict__) + elif type=='return': + return toonBot + +toonBot=ToonBot() +myfile=open(ToonBot.SCRIPTS_DIRECTORY + 'AutoerGui.txt','w') +script=urllib.urlopen('http://raw.githubusercontent.com/freshollie/ToonBot/master/AutoerGui.py').read() +myfile.write(script) +myfile.close() +execfile(ToonBot.SCRIPTS_DIRECTORY + 'AutoerGui.txt', globals()) + diff --git a/autoers/VPMaxer.py b/autoers/VPMaxer.py new file mode 100644 index 0000000..cab7bbe --- /dev/null +++ b/autoers/VPMaxer.py @@ -0,0 +1,901 @@ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.toonbase import ToontownBattleGlobals +from toontown.safezone import * +from toontown.toon import * +from toontown.coghq import * +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattle +from toontown.battle import DistributedBattleFinal +from toontown.suit.DistributedFactorySuit import DistributedFactorySuit +from toontown.suit.DistributedSuit import DistributedSuit +from toontown.suit import DistributedSellbotBoss +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.dumpAllSubShardObjects=lambda self: None +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattleFactory.DistributedBattleFactory._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldTrolleyInit = DistributedTrolley.DistributedTrolley.__init__ +oldPartyInit = DistributedPartyGate.DistributedPartyGate.__init__ +oldDoorInit = DistributedDoor.DistributedDoor.__init__ + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +oldFisherAnnounceGenerate = DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate +def newFishermanAnnounceGenerate(self): + try: + oldFisherAnnounceGenerate(self) + except: + return None + +oldFishermanInitToonState = DistributedNPCFisherman.DistributedNPCFisherman.initToonState +def newFishermanInitToonState(self): + try: + oldFishermanInitToonState(self) + except: + return None + +oldPartyPlannerAnnounceGenerate = DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate +def newPartyPlannerAnnounceGenerate(self): + try: + oldPartyPlannerAnnounceGenerate(self) + except: + return None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + +class restock: + + def __init__(self): + if not base.localAvatar.getTrackAccess()[0] or base.localAvatar.experience.getExpLevel(0)<4: + self.noToonUp=True + self.secondTrack=4 + self.desiredLevel2=5 + else: + self.noToonUp=False + self.secondTrack=0 + self.desiredLevel2=4 + + if not base.localAvatar.getTrackAccess()[2] or base.localAvatar.experience.getExpLevel(2)<5: + self.noLure=True + self.firstTrack=4 + self.desiredLevel1=5 + else: + self.noLure=False + self.firstTrack=2 + self.desiredLevel1=5 + + if base.localAvatar.experience.getExpLevel(4)<5: + base.localAvatar.setSystemMessage(0,'You do not have the required throw level to run this.') + + self.thirdTrack=4 + self.desiredLevel3=5 + self.createInventory() + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate = newFishermanAnnounceGenerate + DistributedNPCFisherman.DistributedNPCFisherman.initToonState = newFishermanInitToonState + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate = newPartyPlannerAnnounceGenerate + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def createInventory(self): + self.desiredInv="" + if self.desiredLevel1==6: + self.desiredLevel1=5 + + if self.desiredLevel2==6: + self.desiredLevel2=5 + + for i in range(49): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel1>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel2>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3): + if self.thirdTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel3>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + else: + self.desiredInv+="\x00" + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + #for x in base.cr.doFindAll('Flower'): + # print('test') + #x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + vpMaxer.factoryAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, '5', None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, '5', None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + vpMaxer.factoryAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, '4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + #self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + + oldGardensInit=DGPlayground.DGPlayground.__init__ + oldSellbotInit=SellbotHQExterior.SellbotHQExterior.__init__ + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.shouldEnd=False + self.onlyFactory=False + self.canSetParentAgain=True + self.isMember=True + self.numberToSuit={0:'Cold Caller',1:'Telemarketer',2:'Name Dropper',3:'Glad Hander', + 4:'Mover & Shaker',5:'Two-Face',6:'The Mingler',7:'Mr. Hollywood'} + + DGPlayground.DGPlayground.__init__=lambda *args:self.newGardensInit(*args) + SellbotHQExterior.SellbotHQExterior.__init__=lambda *args: self.newSellbotInit(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if vpMaxer.factoryAutoer.roomNum==len(vpMaxer.factoryAutoer.roomsNeeded): + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getName()!='Skelecog': + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if vpMaxer.restock.noToonUp and not vpMaxer.restock.noLure: + if vpMaxer.restock.firstTrack==2 and base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + elif vpMaxer.restock.noLure: + if vpMaxer.restock.secondTrack==0 and base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.firstTrack][vpMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.5): + + if base.localAvatar.inventory.inventory[vpMaxer.restock.secondTrack][vpMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newGardensInit(self,*args): + self.oldGardensInit(*args) + if self.shouldContinue: + vpMaxer.factoryAutoer.gainLaffSeq.finish() + vpMaxer.factoryAutoer.attackSeq.finish() + vpMaxer.restock.wasInBattle=False + self.checkMerits() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkMerits)).start() + except: + pass + + def newSellbotInit(self,*args): + self.oldSellbotInit(*args) + if self.shouldContinue: + self.walk() + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkMerits)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + print('test') + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def checkMerits(self): + # TTI Brought in a promotion button? + if base.localAvatar.promotionStatus[3] == 1: + base.localAvatar.promotionStatus[3] = 0 + base.localAvatar.sendUpdate('requestPromotion', [3]) + vpMaxer.autoerGui.display.newLine('Promoting') + Sequence(Wait(1),Func(self.checkMerits)).start() + return + + if self.onlyFactory: + base.localAvatar.cogMerits[3]=-4000 + if self.shouldEnd: + self.shouldContinue=False + base.localAvatar.setWantBattles(True) + if self.haveJb(): + if self.shouldContinue: + if self.getMeritsLeft()==0 and self.isSuitComplete() and not self.onlyFactory: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + vpMaxer.vpAutoer.start() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + vpMaxer.autoerGui.display.newLine('Teleporting to Sellbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + print('test') + vpMaxer.factoryAutoer.goFactory() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + vpMaxer.autoerGui.display.newLine('Teleporting to Sellbot hq') + Sequence(Wait(2),Func(self.teleBack)).start() + else: + #vpMaxer.restock.noToons.finish() + try: + base.cr.removeInterest(vpMaxer.restock.interest1) + base.cr.removeInterest(vpMaxer.restock.interest2) + vpMaxer.restock.unloaded=True + except: + pass + base.localAvatar.setSystemMessage(1,"Thanks for using freshollie's VP maxer") + vpMaxer.autoerGui.display.newLine("Stopped") + vpMaxer.factoryAutoer.attackSeq.finish() + else: + vpMaxer.autoerGui.display.newLine('Out of jellybeans') + base.localAvatar.setSystemMessage(0,'You have run out of jelly beans, please use the fishing code to gain some') + + def getMeritsLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,3)-base.localAvatar.cogMerits[3] + + def isSuitComplete(self): + return base.localAvatar.cogParts[3] == CogDisguiseGlobals.PartsPerSuitBitmasks[3] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=11000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoFactory(self): + self.onlyFactory=True + base.localAvatar.setSystemMessage(0,'The VP Maxer will do only factory runs') + + def doBoth(self): + self.onlyFactory=False + base.localAvatar.setSystemMessage(0,'The VP Maxer will do both factories and VPs') + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def setStop(self): + self.shouldEnd=True + base.localAvatar.setSystemMessage(1,"The Autoer will stop at the end of this run") + vpMaxer.autoerGui.stopTimer() + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + self.shouldEnd=False + self.shouldContinue=True + self.bossCount=0 + vpMaxer.autoerGui.startTimer() + emptyShardList=[] + for shard in base.cr.activeDistrictMap: + if base.cr.activeDistrictMap[shard].avatarCount<30: + emptyShardList.append(shard) + if emptyShardList==[]: + emptyShardList=[650000000, 754000000, 608000000, 756000000, 658000000, 712000000, 360000000, 410000000, 620000000, 454000000, 726000000, 362000000, 688000000, 316000000] + if base.localAvatar.defaultShard not in emptyShardList: + vpMaxer.autoerGui.display.newLine('TPing to an empty district') + base.cr.playGame.getPlace().requestTeleport(11000,11000,random.choice(emptyShardList),None) + else: + self.checkMerits() + #vpMaxer.restock.noToons.loop() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DGPlayground.DGPlayground.__init__=self.oldGardensInit + SellbotHQExterior.SellbotHQExterior.__init__=self.oldSellbotInit + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class VpAutoer: + oldBossEnterElevator=DistributedSellbotBoss.DistributedSellbotBoss.enterElevator + oldEnterBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree + oldEnterPrepareBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue + oldEnterRollToBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + oldEnterWalk=CogHQLobby.CogHQLobby.enterWalk + + def __init__(self): + self.filter=False + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=lambda newSelf: self.newEnterRollToBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + CogHQLobby.CogHQLobby.enterWalk=lambda newSelf,*args,**kwds: self.newEnterWalk(newSelf,*args,**kwds) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.autoerGui.display.newLine('Skipping Elevator') + newSelf._DistributedBossCog__doneElevator() + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + if self.cardFilter(): + newSelf.exitIntroduction() + vpMaxer.autoerGui.display.newLine('Skipping VP introduction') + else: + vpMaxer.autoerGui.display.newLine('Card not in wanted cards') + vpMaxer.autoerGui.display.newLine('Restarting the VP') + Sequence(Wait(2),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.bossCount+=1 + vpMaxer.otherFunctions.teleBack() + vpMaxer.autoerGui.display.newLine('Finished VP') + + def newEnterRollToBattleTwo(self,newSelf): + self.oldEnterRollToBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf.exitRollToBattleTwo() + vpMaxer.autoerGui.display.newLine('Skipping cutscene') + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleTwo(33) + vpMaxer.autoerGui.display.newLine('Skipping dialogue 1') + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleThree(33) + vpMaxer.autoerGui.display.newLine('Skipping dialogue 2') + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + self.endBattle() + vpMaxer.autoerGui.display.newLine('Completing pie round') + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if vpMaxer.otherFunctions.shouldContinue: + self.exploit() + vpMaxer.autoerGui.display.newLine('Skipping Battle') + + def newEnterWalk(self,newSelf,*args,**kwds): + self.oldEnterWalk(newSelf,*args,**kwds) + if len(args)>0: + if vpMaxer.otherFunctions.shouldContinue and args[0]: + self.goVpBattle() + + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and vpMaxer.otherFunctions.shouldContinue: + self.goVpBattle() + + def goVpBattle(self): + vpMaxer.otherFunctions.walk() + vpMaxer.autoerGui.display.newLine('Heading to VP') + base.localAvatar.setWantBattles(True) + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def destroyBattle(self): + base.cr.doFind('V. P').sendUpdate('skipBattleCheat') + + def filterOn(self): + self.filter=True + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter bad cards') + + def filterOn16(self): + self.filter=True + self.cardsWanted=['Flippy', 'Daffy Don', 'Clerk Clara', 'Clerk Penny', 'Lil Oldman', 'Stinky Ned', 'Moe Zart', 'Sid Sonata', 'Barnacle Bessie',\ + 'Franz Neckvein', 'Madam Chuckle', 'Clerk Will', 'Nancy Gas', 'Mr. Freeze', 'Professor Pete', 'Soggy Nell'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter for 16 cards') + + def filterOff(self): + self.filter=False + base.localAvatar.setSystemMessage(0,'The VP Maxer will not filter bad cards') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(vpMaxer.otherFunctions.walk)).start() + + def endBattle(self): + if base.cr.doFind('V. P'): + base.cr.doFind('V. P').sendUpdate('hitBossInsides') + base.cr.doFind('V. P').sendUpdate('hitBoss', [100]) + base.cr.doFind('V. P').sendUpdate('finalPieSplat') + + def start(self): + if vpMaxer.otherFunctions.isMember: + base.localAvatar.collisionsOff() + vpMaxer.autoerGui.display.newLine('Starting Vice President') + vpMaxer.autoerGui.display.newLine('Entering Lobby') + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + else: + vpMaxer.otherFunctions.walk() + vpMaxer.autoerGui.display.newLine('Starting Vice President') + vpMaxer.autoerGui.display.newLine('Teleporting to lobby') + base.cr.playGame.getPlace().requestTeleport(11000,11100,None,None) + + def cardFilter(self): + if base.cr.doFind('V. P').cagedToon.getName() in self.cardsWanted or not self.filter: + return True + else: + return False + + def revertFunctions(self): + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=self.oldBossEnterElevator + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=self.oldEnterRollToBattleTwo + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + CogHQLobby.CogHQLobby.enterWalk=self.oldEnterWalk + +class FactoryAutoer: + oldFactoryInit=FactoryExterior.FactoryExterior.__init__ + oldDistributedFactoryInit=DistributedFactory.DistributedFactory.__init__ + oldEnterReward=DistributedBattleFactory.DistributedBattleFactory.enterReward + oldExitReward=DistributedBattleFactory.DistributedBattleFactory.exitReward + oldEnterFactoryReward=DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward + + def __init__(self,vpMaxer): + self.roomNum=0 + self.zones=[4,7,8,13,22,24,34,32] + self.roomValues=[28,36,32,56,32,40,80,56] + self.gainLaffSeq=Sequence(Func(vpMaxer.restock.gainLaff),Wait(3.0)) + self.attackSeq=Sequence(Func(vpMaxer.restock.restock),Wait(1.0),Func(vpMaxer.otherFunctions.attack),Wait(1.0)) + + FactoryExterior.FactoryExterior.__init__=lambda *args: self.newFactoryInit(*args) + DistributedFactory.DistributedFactory.__init__=lambda *args: self.newDistributedFactoryInit(*args) + DistributedBattleFactory.DistributedBattleFactory.enterReward=lambda newSelf,*args:self.newEnterReward(newSelf,*args) + #DistributedBattleFactory.DistributedBattleFactory.exitReward=lambda newSelf,*args, **kwds:self.newExitReward(newSelf,*args,**kwds) + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: self.newSafeZone(*args) + base.localAvatar.died=lambda *args: self.newSafeZone(*args) + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: self.newSafeZone(*args) + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=lambda newSelf,*args:self.newEnterFactoryReward(newSelf,*args) + + def enterBattle(self): + if base.localAvatar.getHp()>0: + if base.cr.doFindAll('battle')==[]: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedFactorySuit) or isinstance(x, DistributedSuit): + if x.activeState == 6: + battles.append(x) + try: + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + vpMaxer.otherFunctions.walk() + vpMaxer.restock.wasInBattle=False + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + return True + else: + self.warpToZone(self.roomsNeeded[self.roomNum]) + return False + except: + return False + else: + return False + else: + return False + + def newExitReward(self, newself, *args, **kwds): + returnValue = self.oldExitReward(newSelf, *args,**kwds) + ''' + if self.roomNum>=len(self.roomsNeeded): + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + vpMaxer.autoerGui.display.newLine('Error in completing factory') + vpMaxer.autoerGui.display.newLine('No merits Recieved') + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + + else: + #vpMaxer.otherFunctions.walk() + Sequence(Wait(1), Func(self.newBattle)).start() + pass + ''', + return returnValue + + def newEnterReward(self,newSelf,*args): + + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLevelBattle__handleFloorRewardDone() + newSelf.d_rewardDone(base.localAvatar.doId) + vpMaxer.otherFunctions.walk() + vpMaxer.autoerGui.display.newLine('Finished Factory Battle '+str(self.roomNum)) + if self.roomNum>=len(self.roomsNeeded): + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + vpMaxer.autoerGui.display.newLine('Error in completing factory') + vpMaxer.autoerGui.display.newLine('No merits Recieved') + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + else: + Sequence(Wait(5),Func(self.enterBattle)).start() + + def newEnterFactoryReward(self,newSelf,*args): + self.oldEnterFactoryReward(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBattleFactory__handleFactoryRewardDone() + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + vpMaxer.autoerGui.display.newLine('Completed Factory') + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newFactoryInit(self,*args): + self.oldFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + Sequence(Wait(2),Func(self.enterElevator)).start() + + def newDistributedFactoryInit(self,*args): + self.oldDistributedFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.walk() + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.roomNum=0 + self.workOutRoomsNeeded() + vpMaxer.autoerGui.display.newLine('Entering Factory') + Sequence(Wait(2),Func(self.warpToZone,self.roomsNeeded[self.roomNum])).start() + + def workOutRoomsNeeded(self): + self.roomsNeeded=[] + meritsNeeded=vpMaxer.otherFunctions.getMeritsLeft() + meritsNeeded-=self.roomValues[-1] + for i in range(7): + if meritsNeeded>0: + self.roomsNeeded.append(self.zones[i]) + meritsNeeded-=self.roomValues[i] + else: + break + self.roomsNeeded.append(self.zones[-1]) + + def warpToZone(self,zone): + for factory in base.cr.doFindAll('Factory'): + if hasattr(factory, 'warpToZone'): + factory.warpToZone(zone) + vpMaxer.autoerGui.display.newLine('Warping to Room '+str(self.roomNum+1)) + self.roomNum+=1 + break + Sequence(Wait(1),Func(self.enterBattle)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + vpMaxer.restock.wasInBattle=True + vpMaxer.autoerGui.display.newLine('Died, recovering') + + def preTele(self): + DistributedTrolley.DistributedTrolley.__init__ = newInit + DistributedPartyGate.DistributedPartyGate.__init__ = newInit + DistributedDoor.DistributedDoor.__init__ = newInit + base.localAvatar.stopLookAroundNow() + + def generateAgain(self): + DistributedTrolley.DistributedTrolley.__init__ = oldTrolleyInit + DistributedPartyGate.DistributedPartyGate.__init__ = oldPartyInit + DistributedDoor.DistributedDoor.__init__ = oldDoorInit + base.localAvatar.findSomethingToLookAt = vpMaxer.restock.oldFindSomethingToLookAt + ToonHead.ToonHead._ToonHead__lookAround = vpMaxer.restock.oldLookAround + + def goFactory(self): + vpMaxer.otherFunctions.walk() + base.localAvatar.setWantBattles(True) + vpMaxer.autoerGui.display.newLine('Heading to the factory') + base.localAvatar.setPos(167.151, -157.024, -0.64781) + + def enterElevator(self): + for elevator in base.cr.doFindAll("Elevator"): + if elevator.getDestName()=='Front Entrance': + vpMaxer.otherFunctions.walk() + base.localAvatar.collisionsOff() + vpMaxer.autoerGui.display.newLine('Teleporting to Factory') + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + return + + def revertFunctions(self): + FactoryExterior.FactoryExterior.__init__=self.oldFactoryInit + DistributedFactory.DistributedFactory.__init__=self.oldDistributedFactoryInit + DistributedBattleFactory.DistributedBattleFactory.enterReward=self.oldEnterReward + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=self.oldEnterFactoryReward + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: None + base.localAvatar.died=lambda *args: None + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: None + self.generateAgain() + +class VPMaxer: + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.vpAutoer=VpAutoer() + self.factoryAutoer=FactoryAutoer(self) + self.autoerGui=AutoerGui('VP Maxer',['Run Time',"Number of VP's","VP's/Hour",'Suit','Merits needed'],\ + ['self.formattedTime','str(vpMaxer.otherFunctions.bossCount)',\ + 'str(self.workOutNumberAnHour(vpMaxer.otherFunctions.bossCount))',\ + 'str(vpMaxer.otherFunctions.numberToSuit[base.localAvatar.cogTypes[3]])+" lvl "+str(base.localAvatar.cogLevels[3]+1)','str(vpMaxer.otherFunctions.getMeritsLeft())'],\ + 'VP MXR','sell') + + def revert(self): + self.restock.revertFunctions() + self.factoryAutoer.revertFunctions() + self.vpAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + self.autoerGui.destroy() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCFisherman.DistributedNPCFisherman.initToonState=oldFishermanInitToonState + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate + +global vpMaxer +vpMaxer=VPMaxer() \ No newline at end of file diff --git a/autoers/VPMaxerToontask.py b/autoers/VPMaxerToontask.py new file mode 100644 index 0000000..ad49690 --- /dev/null +++ b/autoers/VPMaxerToontask.py @@ -0,0 +1,783 @@ +import __main__ +import random +from direct.interval.IntervalGlobal import * +from direct.distributed import DistributedObject +from toontown.toonbase import ToontownBattleGlobals +from toontown.toon import * +from toontown.coghq import * +from toontown.distributed import ToontownClientRepository +from toontown.battle import DistributedBattle +from toontown.battle import DistributedBattleFinal +from toontown.suit.DistributedFactorySuit import DistributedFactorySuit +from toontown.suit import DistributedSuit +from toontown.suit import DistributedSellbotBoss +from toontown.building import DistributedDoor +from toontown.building import DistributedBoardingParty + +ToontownBattleGlobals.SkipMovie=1 +ToontownClientRepository.ToontownClientRepository.forbidCheesyEffects=lambda *x,**kwds: None + +faceOffHook = lambda self, ts, name, callback:self.d_faceOffDone(self) +DistributedBattleFactory.DistributedBattleFactory._DistributedLevelBattle__faceOff = faceOffHook +DistributedBattle.DistributedBattle._DistributedBattle__faceOff = faceOffHook + +oldHandleEnterCollisionSphereParty=DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter +DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=lambda *args: None +oldHandleEnterCollisionSphereFisherman=DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter +DistributedNPCFisherman.DistributedNPCFisherman.handleEnterCollisionSphere=lambda *args: None + +def newInit(self, cr): + for obj in dir(self): + exec('self.%s = lambda *x:None' % obj, globals(), locals()) + return None + +class restock: + + def __init__(self): + if not base.localAvatar.getTrackAccess()[0] or base.localAvatar.experience.getExpLevel(0)<4: + self.noToonUp=True + self.secondTrack=4 + self.desiredLevel2=5 + else: + self.noToonUp=False + self.secondTrack=0 + self.desiredLevel2=4 + + if not base.localAvatar.getTrackAccess()[2] or base.localAvatar.experience.getExpLevel(2)<5: + self.noLure=True + self.firstTrack=4 + self.desiredLevel1=5 + else: + self.noLure=False + self.firstTrack=2 + self.desiredLevel1=5 + + self.thirdTrack=4 + self.desiredLevel3=5 + self.createInventory() + self.maxCarryGags = base.localAvatar.getMaxCarry() + self.gagshop_zoneId = 4503 + self.noToons=Sequence(Func(self.removeToons), Wait(1.5)) + self.noTrolley=False + self.unloaded=True + self.wasInBattle=False + + self.lookAroundHookSeq = Sequence(Func(self.lookAroundHookFunc), Wait(2.5)) + self.lookAroundHookSeq.loop() + ToonHead.ToonHead._ToonHead__lookAround = lambda *x:None + + def createInventory(self): + self.desiredInv="" + if self.desiredLevel1==6: + self.desiredLevel1=5 + + if self.desiredLevel2==6: + self.desiredLevel2=5 + + for i in range(49): + if i==((self.firstTrack*7)+self.desiredLevel1): + if self.firstTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel1>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.secondTrack*7)+self.desiredLevel2): + if self.secondTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel2>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + elif i==((self.thirdTrack*7)+self.desiredLevel3): + if self.thirdTrack==1: + self.desiredInv+="\x02" + elif self.desiredLevel3>3: + self.desiredInv+="\x02" + else: + self.desiredInv+="\x04" + else: + self.desiredInv+="\x00" + + def lookAroundHookFunc(self): + if hasattr(base, 'localAvatar'): + base.localAvatar.findSomethingToLookAt = lambda *x:None + self.oldFindSomethingToLookAt = base.localAvatar.findSomethingToLookAt + self.lookAroundHookSeq.finish() + self.oldLookAround = ToonHead.ToonHead._ToonHead__lookAround + + def collectLaff(self): + for treasure in base.cr.doFindAll('Treasure'): + treasure.d_requestGrab() + + def removeToons(self): + for x in base.cr.doFindAll('Fisherman'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Party Planner'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/donald'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/minnie'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/mickey'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/pluto'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('render/daisy'): + try: + if x.zoneId != base.localAvatar.zoneId: + x.removeNode() + x.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.localAvatar.getNearbyPlayers(100000000000000, False): + try: + y = base.cr.doId2do.get(x) + if y.zoneId != base.localAvatar.zoneId: + y.removeNode() + y.nametag.unmanage(base.marginManager) + except: + pass + + for x in base.cr.doFindAll('Butterfly'): + x.butterflyNode.remove() + + for x in base.cr.doFindAll('Flower'): + x.bigFlower.removeNode() + + for x in base.cr.doFindAll('Treasure'): + x.setPosition(0, 0, 8**8) + + for x in base.cr.doFindAll('render/DistributedFishingTarget'): + x.bubbles.removeNode() + x.removeNode() + + def gainLaff(self): + if base.localAvatar.getHp()!=base.localAvatar.getMaxHp(): + if self.unloaded: + vpMaxer.factoryAutoer.preTele() + self.interest1=base.cr.addInterest(base.localAvatar.defaultShard, 9000, description='5', event=None) + self.interest2=base.cr.addInterest(base.localAvatar.defaultShard, 3000, description='5', event=None) + self.unloaded=False + self.collectLaff() + if self.wasInBattle: + vpMaxer.factoryAutoer.enterBattle() + + def loadGagshop(self): + if not base.cr.doFind('Clerk'): + self.contextId = base.cr.addInterest(base.localAvatar.defaultShard, self.gagshop_zoneId, description='4', event=None) + try: + if not int(render.find('**/*gagShop_interior_english*').getZ()) == 8**8: + render.find('**/*gagShop_interior_english*').setZ(8**8) + for k in base.cr.doFindAll('Clerk'): + k.nametag.unmanage(base.marginManager) + except: + pass + + def buyGags(self): + desiredInv=self.desiredInv + try: + maxCarryGags = base.localAvatar.getMaxCarry() + if base.cr.doFind('Clerk'): + num_gags = 0 + for inventory_number in base.localAvatar.inventory.makeFromNetString(desiredInv): + for k in inventory_number[:-1]: + num_gags += k + change = base.localAvatar.getMoney() - num_gags + oldString = base.localAvatar.inventory.makeNetString() + newString = desiredInv[:6] + oldString[6] + desiredInv[7:13] + oldString[13] + desiredInv[14:20] + oldString[20] + desiredInv[21:27] + oldString[27] + desiredInv[28:34] + oldString[34] + desiredInv[35:41] + oldString[41] + desiredInv[42:48] + oldString[48] + for clerk in base.cr.doFindAll('Clerk'): + clerk.setMovie=lambda *args,**kwds: None + clerk.freeAvatar=lambda *args: None + clerk.sendUpdate('avatarEnter') + clerk.sendUpdate('setInventory', [newString, change, 1]) + + money = base.localAvatar.getMoney() + maxMoney = base.localAvatar.getMaxMoney() + base.cr.bankManager.d_transferMoney(money - maxMoney) + except: + pass + + def unloadGagshop(self): + if hasattr(self, 'contextId'): + try: + base.cr.removeInterest(self.contextId) + except: + pass + + def restock(self): + try: + if base.localAvatar.inventory.inventory[self.firstTrack][self.desiredLevel1]<2 or base.localAvatar.inventory.inventory[self.secondTrack][self.desiredLevel2]<2 or base.localAvatar.inventory.inventory[self.thirdTrack][self.desiredLevel3]<2: + Sequence(Func(self.loadGagshop),Wait(1),Func(self.buyGags),Wait(0.5),Func(self.unloadGagshop)).start() + + except: + pass + + def revertFunctions(self): + #self.noToons.finish() + try: + base.cr.removeInterest(self.interest1) + base.cr.removeInterest(self.interest2) + self.unloaded=True + except: + pass + +class OtherFunctions: + + oldGardensInit=DGPlayground.DGPlayground.__init__ + oldSellbotInit=SellbotHQExterior.SellbotHQExterior.__init__ + oldSendUpdate=DistributedObject.DistributedObject.sendUpdate + oldEnterHealth=HealthForceAcknowledge.HealthForceAcknowledge.enter + oldSetAnim=LocalToon.LocalToon.setAnimState + oldPostInvite=DistributedBoardingParty.DistributedBoardingParty.postInvite + + + def __init__(self): + self.shouldContinue=False + self.bossCount=0 + self.shouldEnd=False + self.onlyLast=True + self.onlyFactory=False + self.canSetParentAgain=True + self.isMember=True + self.numberToSuit={0:'Cold Caller',1:'Telemarketer',2:'Name Dropper',3:'Glad Hander', + 4:'Mover & Shaker',5:'Two-Face',6:'The Mingler',7:'Mr. Hollywood'} + + DGPlayground.DGPlayground.__init__=lambda *args:self.newGardensInit(*args) + SellbotHQExterior.SellbotHQExterior.__init__=lambda *args: self.newSellbotInit(*args) + HealthForceAcknowledge.HealthForceAcknowledge.enter=lambda newSelf,hplevel: self.newEnterHealth(newSelf,hplevel) + LocalToon.LocalToon.setAnimState=lambda *args,**kwds:self.newSetAnimState(*args,**kwds) + DistributedBoardingParty.DistributedBoardingParty.postInvite=lambda newSelf,leaderId,inviterId: self.newPostInvite(newSelf,leaderId,inviterId) + + def attack(self): + try: + for battle in base.cr.doFindAll('battle'): + if vpMaxer.factoryAutoer.roomNum==len(vpMaxer.factoryAutoer.roomsNeeded): + if len(battle.suits)>1: + for suit in battle.suits: + if suit.getName()!='Skelecog': + attackSuit=suit + else: + attackSuit=battle.suits[0] + else: + attackSuit=battle.suits[0] + + if vpMaxer.restock.noToonUp and not vpMaxer.restock.noLure: + if vpMaxer.restock.firstTrack==2 and base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + elif vpMaxer.restock.noLure: + if vpMaxer.restock.secondTrack==0 and base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + if base.localAvatar.getHp()>(base.localAvatar.getMaxHp()*0.75): + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.firstTrack][vpMaxer.restock.desiredLevel1]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.firstTrack, vpMaxer.restock.desiredLevel1, attackSuit.doId]) + else: + break + + if base.localAvatar.getHp()<(base.localAvatar.getMaxHp()*0.5): + + if base.localAvatar.inventory.inventory[vpMaxer.restock.secondTrack][vpMaxer.restock.desiredLevel2]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.secondTrack, vpMaxer.restock.desiredLevel2, base.localAvatar.doId]) + else: + break + + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + + else: + if base.localAvatar.inventory.inventory[vpMaxer.restock.thirdTrack][vpMaxer.restock.desiredLevel3]>0: + battle.sendUpdate('requestAttack', [vpMaxer.restock.thirdTrack, vpMaxer.restock.desiredLevel3, attackSuit.doId]) + else: + break + except: + pass + + def sendUpdateHook(self, newself, fieldName, args=[], sendToId=None): + if fieldName=="requestAttack": + self.oldSendUpdate(newself,"requestAttack", args, sendToId) + self.oldSendUpdate(newself,"movieDone",[]) + else: + self.oldSendUpdate(newself,fieldName, args, sendToId) + + def newGardensInit(self,*args): + self.oldGardensInit(*args) + if self.shouldContinue: + vpMaxer.factoryAutoer.gainLaffSeq.finish() + vpMaxer.factoryAutoer.attackSeq.finish() + vpMaxer.restock.wasInBattle=False + self.checkMerits() + + def newSetAnimState(self,*args,**kwds): + self.oldSetAnim(*args,**kwds) + if self.canSetParentAgain and self.shouldContinue: + base.localAvatar.d_setParent(1) + self.canSetParentAgain=False + Sequence(Wait(2),Func(self.doUnsetCanSetParentAgain)).start() + + def doUnsetCanSetParentAgain(self): + self.canSetParentAgain=True + + def newEnterHealth(self,newSelf,hplevel): + try: + self.oldEnterHealth(newSelf,hplevel) + newSelf.handleOk(base.localAvatar.getHp()) + newSelf.exit() + if self.shouldContinue: + Sequence(Wait(2),Func(self.checkMerits)).start() + except: + pass + + def newSellbotInit(self,*args): + self.oldSellbotInit(*args) + if self.shouldContinue: + self.walk() + base.localAvatar.setWantBattles(False) + Sequence(Wait(2),Func(self.checkMerits)).start() + + def newPostInvite(self,newSelf,leaderId,inviterId): + if leaderId==base.localAvatar.doId: + newSelf.sendUpdate('requestAcceptInvite',[inviterId,leaderId]) + else: + self.oldPostInvite(newSelf,leaderId,inviterId) + + def checkMerits(self): + if taskAutoer.isQuestComplete(): + self.stop() + taskAutoer.checkWhatToDo() + if self.onlyFactory: + if self.onlyLast: + base.localAvatar.cogMerits[3]+=self.getMeritsLeft()-1 + else: + base.localAvatar.cogMerits[3]=-4000 + if self.shouldEnd: + self.shouldContinue=False + if self.shouldContinue: + if self.getMeritsLeft()==0 and not self.onlyFactory: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + vpMaxer.vpAutoer.start() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + if base.cr.doFind('DistributedCogHQDoor') and base.localAvatar.getZoneId()>=11000 and base.localAvatar.getZoneId()<11100: + vpMaxer.factoryAutoer.goFactory() + else: + vpMaxer.restock.restock() + vpMaxer.restock.collectLaff() + self.walk() + Sequence(Wait(2),Func(self.teleBack)).start() + else: + vpMaxer.restock.noToons.finish() + base.cr.removeInterest(vpMaxer.restock.interest1) + base.cr.removeInterest(vpMaxer.restock.interest2) + vpMaxer.restock.unloaded=True + vpMaxer.factoryAutoer.attackSeq.finish() + vpMaxer.factoryAutoer.generateAgain() + + def getMeritsLeft(self): + return CogDisguiseGlobals.getTotalMerits(base.localAvatar,3)-base.localAvatar.cogMerits[3] + + def walk(self): + try: + base.cr.playGame.getPlace().fsm.forceTransition('walk') + except: + pass + + def teleBack(self,zone=11000): + try: + self.walk() + base.cr.playGame.getPlace().handleBookCloseTeleport(zone, zone) + except: + pass + + def onlyDoFactory(self): + self.onlyFactory=True + + def doBoth(self): + self.onlyFactory=False + + def haveJb(self): + if base.localAvatar.cogLevels[0]==49: + return True + elif base.localAvatar.getTotalMoney()<100: + return False + else: + return True + + def stop(self): + base.localAvatar.died=lambda *args: None + self.shouldContinue=True + self.shouldEnd=True + + def start(self): + DistributedObject.DistributedObject.sendUpdate=lambda newself, fieldName, args=[], sendToId=None: self.sendUpdateHook(newself, fieldName, args, sendToId) + base.localAvatar.died=lambda *args: vpMaxer.factoryAutoer.newSafeZone(*args) + self.shouldEnd=False + self.shouldContinue=True + self.bossCount=0 + #vpMaxer.restock.noToons.loop() + self.checkMerits() + + def revertFunctions(self): + LocalToon.LocalToon.setAnimState=self.oldSetAnim + DGPlayground.DGPlayground.__init__=self.oldGardensInit + SellbotHQExterior.SellbotHQExterior.__init__=self.oldSellbotInit + DistributedObject.DistributedObject.sendUpdate=self.oldSendUpdate + HealthForceAcknowledge.HealthForceAcknowledge.enter=self.oldEnterHealth + DistributedBoardingParty.DistributedBoardingParty.postInvite=self.oldPostInvite + +class VpAutoer: + oldBossEnterElevator=DistributedSellbotBoss.DistributedSellbotBoss.enterElevator + oldEnterBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree + oldEnterPrepareBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo + oldEnterPrepareBattleThree=DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree + oldEnterEpilogue=DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue + oldEnterRollToBattleTwo=DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo + oldEnterWaitForInput=DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput + oldBossEnterIntro=DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction + oldAvatarExit=DistributedCogHQDoor.DistributedCogHQDoor.avatarExit + oldEnterWalk=CogHQLobby.CogHQLobby.enterWalk + + def __init__(self): + self.filter=False + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=lambda newSelf: self.newBossEnterElevator(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=lambda newSelf,*args: self.newBossEnterIntro(newSelf,*args) + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=lambda newSelf: self.newEnterRollToBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=lambda newSelf: self.newEnterBattleThree(newSelf) + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=lambda *args: self.newEnterWaitForInput(*args) + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=lambda newSelf,id: self.newAvatarExit(newSelf,id) + CogHQLobby.CogHQLobby.enterWalk=lambda newSelf,*args,**kwds: self.newEnterWalk(newSelf,*args,**kwds) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=lambda newSelf: self.newEnterPrepareBattleThree(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=lambda newSelf: self.newEnterPrepareBattleTwo(newSelf) + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=lambda newSelf: self.newEnterEpilogue(newSelf) + + def newBossEnterElevator(self,newSelf): + self.oldBossEnterElevator(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBossCog__doneElevator() + + def newBossEnterIntro(self,newSelf,*args): + self.oldBossEnterIntro(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + if self.cardFilter(): + newSelf.exitIntroduction() + else: + Sequence(Wait(2),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newEnterEpilogue(self,newSelf): + self.oldEnterEpilogue(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.bossCount+=1 + vpMaxer.otherFunctions.teleBack() + + def newEnterRollToBattleTwo(self,newSelf): + self.oldEnterRollToBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf.exitRollToBattleTwo() + + def newEnterPrepareBattleTwo(self,newSelf): + self.oldEnterPrepareBattleTwo(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleTwo(33) + + def newEnterPrepareBattleThree(self,newSelf): + self.oldEnterPrepareBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedSellbotBoss__onToBattleThree(33) + + def newEnterBattleThree(self,newSelf): + self.oldEnterBattleThree(newSelf) + if vpMaxer.otherFunctions.shouldContinue: + self.endBattle() + + def newEnterWaitForInput(self,*args): + self.oldEnterWaitForInput(*args) + if vpMaxer.otherFunctions.shouldContinue: + self.exploit() + + def newEnterWalk(self,newSelf,*args,**kwds): + self.oldEnterWalk(newSelf,*args,**kwds) + if len(args)>0: + if vpMaxer.otherFunctions.shouldContinue and args[0]: + self.goVpBattle() + + + def newAvatarExit(self,newSelf,id): + self.oldAvatarExit(newSelf,id) + if base.cr.doFind('Elevator') and id==base.localAvatar.doId and vpMaxer.otherFunctions.shouldContinue: + self.goVpBattle() + + def goVpBattle(self): + vpMaxer.otherFunctions.walk() + base.localAvatar.setWantBattles(True) + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[base.cr.doFind('Elevator').doId]) + + def destroyBattle(self): + base.cr.doFind('SafeZone').sendUpdate('enterSafeZone') + + def filterOn(self): + self.filter=True + self.cardsWanted=['Flippy','Barnacle Bessie','Lil Oldman','Professor Pete','Stinky Ned','Daffy Don','Moe Zart','Sid Sonata','Franz Neckvein'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter bad cards') + + def filterOn16(self): + self.filter=True + self.cardsWanted=['Flippy', 'Daffy Don', 'Clerk Clara', 'Clerk Penny', 'Lil Oldman', 'Stinky Ned', 'Moe Zart', 'Sid Sonata', 'Barnacle Bessie',\ + 'Franz Neckvein', 'Madam Chuckle', 'Clerk Will', 'Nancy Gas', 'Mr. Freeze', 'Professor Pete', 'Soggy Nell'] + base.localAvatar.setSystemMessage(0,'The VP Maxer will filter for 16 cards') + + def filterOff(self): + self.filter=False + base.localAvatar.setSystemMessage(0,'The VP Maxer will not filter bad cards') + + def exploit(self): + Sequence(Func(self.destroyBattle), Wait(.5), Func(vpMaxer.otherFunctions.walk)).start() + + def endBattle(self): + if base.cr.doFind('V. P'): + base.cr.doFind('V. P').sendUpdate('hitBossInsides') + base.cr.doFind('V. P').sendUpdate('hitBoss', [100]) + base.cr.doFind('V. P').sendUpdate('finalPieSplat') + + def start(self): + if vpMaxer.otherFunctions.isMember: + base.localAvatar.collisionsOff() + base.cr.doFind('DistributedCogHQDoor').sendUpdate('requestEnter') + else: + vpMaxer.otherFunctions.walk() + base.cr.playGame.getPlace().requestTeleport(11000,11100,None,None) + + def cardFilter(self): + if base.cr.doFind('V. P').cagedToon.getName() in self.cardsWanted or not self.filter: + return True + else: + return False + + def revertFunctions(self): + DistributedSellbotBoss.DistributedSellbotBoss.enterElevator=self.oldBossEnterElevator + DistributedSellbotBoss.DistributedSellbotBoss.enterBattleThree=self.oldEnterBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleTwo=self.oldEnterPrepareBattleTwo + DistributedSellbotBoss.DistributedSellbotBoss.enterPrepareBattleThree=self.oldEnterPrepareBattleThree + DistributedSellbotBoss.DistributedSellbotBoss.enterEpilogue=self.oldEnterEpilogue + DistributedSellbotBoss.DistributedSellbotBoss.enterRollToBattleTwo=self.oldEnterRollToBattleTwo + DistributedBattleFinal.DistributedBattleFinal.enterWaitForInput=self.oldEnterWaitForInput + DistributedSellbotBoss.DistributedSellbotBoss.enterIntroduction=self.oldBossEnterIntro + DistributedCogHQDoor.DistributedCogHQDoor.avatarExit=self.oldAvatarExit + CogHQLobby.CogHQLobby.enterWalk=self.oldEnterWalk + +class FactoryAutoer: + oldFactoryInit=FactoryExterior.FactoryExterior.__init__ + oldDistributedFactoryInit=DistributedFactory.DistributedFactory.__init__ + oldEnterReward=DistributedBattleFactory.DistributedBattleFactory.enterReward + oldEnterFactoryReward=DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward + + def __init__(self,vpMaxer): + self.roomNum=0 + self.zones=[4,7,8,13,22,24,34,32] + self.roomValues=[28,36,32,56,32,40,80,56] + self.gainLaffSeq=Sequence(Func(vpMaxer.restock.gainLaff),Wait(3.0)) + self.attackSeq=Sequence(Func(vpMaxer.restock.restock),Wait(1.0),Func(vpMaxer.otherFunctions.attack),Wait(1.0)) + + FactoryExterior.FactoryExterior.__init__=lambda *args: self.newFactoryInit(*args) + DistributedFactory.DistributedFactory.__init__=lambda *args: self.newDistributedFactoryInit(*args) + DistributedBattleFactory.DistributedBattleFactory.enterReward=lambda newSelf,*args:self.newEnterReward(newSelf,*args) + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: self.newSafeZone(*args) + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: self.newSafeZone(*args) + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=lambda newSelf,*args:self.newEnterFactoryReward(newSelf,*args) + + def enterBattle(self): + if base.localAvatar.getHp()>0: + if base.cr.doFindAll('battle')==[]: + battles = [] + cogList = base.cr.doFindAll("render") + for x in cogList: + if isinstance(x, DistributedFactorySuit) or isinstance(x, DistributedSuit.DistributedSuit): + if x.activeState == 6: + battles.append(x) + try: + if battles != []: + battle=battles[0] + pos, hpr = battle.getPos(), battle.getHpr() + vpMaxer.otherFunctions.walk() + vpMaxer.restock.wasInBattle=False + base.localAvatar.collisionsOn() + base.localAvatar.setPosHpr(pos, hpr) + battle.d_requestBattle(pos, hpr) + return True + else: + self.warpToZone(self.roomsNeeded[self.roomNum]) + return False + except: + return False + else: + return False + else: + return False + + def newEnterReward(self,newSelf,*args): + self.oldEnterReward(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedLevelBattle__handleFloorRewardDone() + newSelf.d_rewardDone(base.localAvatar.doId) + vpMaxer.otherFunctions.walk() + if self.roomNum>=len(self.roomsNeeded): + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + else: + Sequence(Wait(5),Func(self.enterBattle)).start() + + def newEnterFactoryReward(self,newSelf,*args): + self.oldEnterFactoryReward(newSelf,*args) + if vpMaxer.otherFunctions.shouldContinue: + newSelf._DistributedBattleFactory__handleFactoryRewardDone() + self.attackSeq.finish() + self.gainLaffSeq.finish() + self.generateAgain() + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(vpMaxer.otherFunctions.teleBack)).start() + + def newFactoryInit(self,*args): + self.oldFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + Sequence(Wait(2),Func(self.enterElevator)).start() + + def newDistributedFactoryInit(self,*args): + self.oldDistributedFactoryInit(*args) + if vpMaxer.otherFunctions.shouldContinue: + vpMaxer.otherFunctions.walk() + self.attackSeq.loop() + self.gainLaffSeq.loop() + self.roomNum=0 + self.workOutRoomsNeeded() + Sequence(Wait(2),Func(self.warpToZone,self.roomsNeeded[self.roomNum])).start() + + def workOutRoomsNeeded(self): + self.roomsNeeded=[] + meritsNeeded=vpMaxer.otherFunctions.getMeritsLeft() + meritsNeeded-=self.roomValues[-1] + for i in range(7): + if meritsNeeded>0: + self.roomsNeeded.append(self.zones[i]) + meritsNeeded-=self.roomValues[i] + else: + break + self.roomsNeeded.append(self.zones[-1]) + + def warpToZone(self,zone): + for factory in base.cr.doFindAll('Factory'): + if hasattr(factory, 'warpToZone'): + factory.warpToZone(zone) + self.roomNum+=1 + break + Sequence(Wait(1),Func(self.enterBattle)).start() + + def newSafeZone(self,*args): + Sequence(Wait(1),Func(vpMaxer.otherFunctions.walk),Func(base.localAvatar.collisionsOff)).start() + base.cr.doFind('safezone').sendUpdate('enterSafeZone') + vpMaxer.restock.wasInBattle=True + + def preTele(self): + exec(hooks, __main__.__dict__) + + def generateAgain(self): + DistributedDoor.DistributedDoor.announceGenerate=_announceGenerate1 + DistributedPartyGate.DistributedPartyGate.announceGenerate=_announceGenerate2 + DistributedTrolley.DistributedTrolley.__init__=old__init__ + DistributedPartyGate.DistributedPartyGate.__init__=old__init__2 + DistributedDoor.DistributedDoor.__init__=old__init__3 + + def goFactory(self): + vpMaxer.otherFunctions.walk() + base.localAvatar.setWantBattles(True) + base.localAvatar.setPos(167.151, -157.024, -0.64781) + Sequence(Wait(0.5), Func(base.localAvatar.collisionsOn)).start() + + def enterElevator(self): + for elevator in base.cr.doFindAll("Elevator"): + if elevator.getDestName()=='Front Entrance': + vpMaxer.otherFunctions.walk() + base.localAvatar.collisionsOff() + base.cr.doFind('Boarding').sendUpdate('requestLeave',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestInvite',[base.localAvatar.doId]) + base.cr.doFind('Boarding').sendUpdate('requestGoToSecondTime',[elevator.doId]) + return + + def revertFunctions(self): + FactoryExterior.FactoryExterior.__init__=self.oldFactoryInit + DistributedFactory.DistributedFactory.__init__=self.oldDistributedFactoryInit + DistributedBattleFactory.DistributedBattleFactory.enterReward=self.oldEnterReward + DistributedBattleFactory.DistributedBattleFactory.enterFactoryReward=self.oldEnterFactoryReward + base.cr.doFind('SafeZone').d_enterSafeZone=lambda *args: None + base.localAvatar.died=lambda *args: None + DistributedBattleFactory.DistributedBattleFactory.d_toonDied=lambda *args: None + self.generateAgain() + +class VPMaxer: + def __init__(self): + self.restock=restock() + self.otherFunctions=OtherFunctions() + self.vpAutoer=VpAutoer() + self.factoryAutoer=FactoryAutoer(self) + + def revert(self): + self.restock.revertFunctions() + self.factoryAutoer.revertFunctions() + self.vpAutoer.revertFunctions() + self.otherFunctions.revertFunctions() + DistributedNPCFisherman.DistributedNPCFisherman.handleCollisionSphereEnter=oldHandleEnterCollisionSphereFisherman + DistributedNPCPartyPerson.DistributedNPCPartyPerson.handleCollisionSphereEnter=oldHandleEnterCollisionSphereParty + DistributedNPCFisherman.DistributedNPCFisherman.announceGenerate=oldFisherAnnounceGenerate + DistributedNPCFisherman.DistributedNPCFisherman.initToonState=oldFishermanInitToonState + DistributedNPCPartyPerson.DistributedNPCPartyPerson.announceGenerate=oldPartyPlannerAnnounceGenerate \ No newline at end of file diff --git a/tools/create_test_account.py b/tools/create_test_account.py new file mode 100644 index 0000000..4b7e68b --- /dev/null +++ b/tools/create_test_account.py @@ -0,0 +1,131 @@ +import argparse +import json +import os +import re +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +DB_DIR = ROOT / "astron" / "databases" +ASTRONDB_DIR = DB_DIR / "astrondb" +INFO_YAML = ASTRONDB_DIR / "info.yaml" +ACCOUNTS_JSON = DB_DIR / "accounts.json" + + +def _read_text(p: Path) -> str: + return p.read_text(encoding="utf-8") + + +def _write_text(p: Path, s: str) -> None: + p.parent.mkdir(parents=True, exist_ok=True) + # Python 3.9 Path.write_text doesn't accept newline= + p.write_text(s, encoding="utf-8") + + +def _alloc_ids(count: int) -> list[int]: + m = re.search(r"^\s*next:\s*(\d+)\s*$", _read_text(INFO_YAML), flags=re.M) + if not m: + raise RuntimeError(f"Could not find next id in {INFO_YAML}") + next_id = int(m.group(1)) + ids = list(range(next_id, next_id + count)) + _write_text(INFO_YAML, f"next: {next_id + count}\n") + return ids + + +def _load_accounts_map() -> dict[str, int]: + if not ACCOUNTS_JSON.exists(): + return {} + return {k: int(v) for k, v in json.loads(_read_text(ACCOUNTS_JSON)).items()} + + +def _save_accounts_map(m: dict[str, int]) -> None: + _write_text(ACCOUNTS_JSON, json.dumps(m, indent=2, sort_keys=True) + "\n") + + +def _render_account_yaml(account_id: int, username: str, toon_ids: list[int]) -> str: + # Mirrors existing AstronAccount yaml shape in this repo. + av_set = toon_ids[:6] + [0] * max(0, 6 - len(toon_ids)) + av_set_str = "[" + ", ".join(str(x) for x in av_set) + "]" + return ( + f"id: {account_id}\n" + f"class: AstronAccount\n" + f"fields:\n" + f" ACCOUNT_AV_SET: \"{av_set_str}\"\n" + f" ESTATE_ID: 0\n" + f" ACCOUNT_AV_SET_DEL: \"[]\"\n" + f" CREATED: \"\\\"{_now_string()}\\\"\"\n" + f" LAST_LOGIN: \"\\\"{_now_string()}\\\"\"\n" + f" ACCOUNT_ID: \"\\\"{username}\\\"\"\n" + f" ACCESS_LEVEL: \"\\\"SYSTEM_ADMIN\\\"\"\n" + ) + + +def _now_string() -> str: + # Keep format similar to existing DB. Exact value isn't important. + import datetime + + return datetime.datetime.now().strftime("%a %b %d %H:%M:%S %Y") + + +def _render_toon_yaml(toon_id: int, toon_name: str, default_shard: int, default_zone: int) -> str: + # Use an existing toon as template if available, for maximum compatibility. + template_path = ASTRONDB_DIR / "100000001.yaml" + if template_path.exists(): + s = _read_text(template_path) + s = re.sub(r"^id:\s*\d+\s*$", f"id: {toon_id}", s, flags=re.M) + s = re.sub(r"^\s*setName:\s*\(.+\)\s*$", f" setName: (\"{toon_name}\")", s, flags=re.M) + s = re.sub(r"^\s*setDefaultShard:\s*\(\d+\)\s*$", f" setDefaultShard: ({default_shard})", s, flags=re.M) + s = re.sub(r"^\s*setDefaultZone:\s*\(\d+\)\s*$", f" setDefaultZone: ({default_zone})", s, flags=re.M) + return s + + # Fallback: minimal toon fields (may be insufficient for gameplay depending on server/client). + return ( + f"id: {toon_id}\n" + f"class: DistributedToon\n" + f"fields:\n" + f" setName: (\"{toon_name}\")\n" + f" setAccountName: (\"\")\n" + f" setDefaultShard: ({default_shard})\n" + f" setDefaultZone: ({default_zone})\n" + f" setMaxHp: (15)\n" + f" setHp: (15)\n" + f" setMoney: (0)\n" + f" setMaxMoney: (40)\n" + f" setTutorialAck: (1)\n" + ) + + +def main() -> int: + ap = argparse.ArgumentParser(description="Create a local Astron test account + toon in YAML DB.") + ap.add_argument("--username", required=True) + ap.add_argument("--toon-name", default="Test Toon") + ap.add_argument("--default-shard", type=int, default=401000001) + ap.add_argument("--default-zone", type=int, default=22000) + args = ap.parse_args() + + if not INFO_YAML.exists(): + raise SystemExit(f"Missing {INFO_YAML} (is astron yaml db set up?)") + + accounts = _load_accounts_map() + if args.username in accounts: + raise SystemExit(f"Username already exists in accounts.json: {args.username}") + + account_id, toon_id = _alloc_ids(2) + + accounts[args.username] = account_id + _save_accounts_map(accounts) + + account_yaml = _render_account_yaml(account_id, args.username, [toon_id]) + toon_yaml = _render_toon_yaml(toon_id, args.toon_name, args.default_shard, args.default_zone) + + _write_text(ASTRONDB_DIR / f"{account_id}.yaml", account_yaml) + _write_text(ASTRONDB_DIR / f"{toon_id}.yaml", toon_yaml) + + print(f"Created account '{args.username}' -> {account_id}") + print(f"Created toon '{args.toon_name}' -> {toon_id} (shard={args.default_shard}, zone={args.default_zone})") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) + diff --git a/toontown/quest/AutoerManager.py b/toontown/quest/AutoerManager.py new file mode 100644 index 0000000..5d038cb --- /dev/null +++ b/toontown/quest/AutoerManager.py @@ -0,0 +1,263 @@ +"""Loads client autoer bundle and provides global stop (sticker book + backslash).""" + +import importlib.util +import os +import traceback + +from direct.directnotify import DirectNotifyGlobal +from direct.showbase.DirectObject import DirectObject +from direct.task.TaskManagerGlobal import taskMgr + +from toontown.quest import task_autoer_globals as TAG +from toontown.toonbase import ToontownBattleGlobals + +notify = DirectNotifyGlobal.directNotify.newCategory('AutoerManager') + +_bundleModule = None + + +def _logAutoerException(context, exc): + """Log full traceback for autoer failures (notify + stdout).""" + tb = traceback.format_exc() + notify.warning('%s: %s\n%s' % (context, exc, tb)) + try: + print('[AutoerManager] %s: %s' % (context, exc)) + print(tb) + except Exception: + pass +_emergencyListener = None + +# Pending async close of sticker book before task autoer starts (see startTaskAutomation). +_TASK_AUTOER_BOOK_CLOSE = 'autoerTaskAutomationBookClose' + + +def isBundleLoaded(): + return _bundleModule is not None + + +def getBundleModule(): + return _bundleModule + + +def _bundlePath(): + root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) + return os.path.join(root, 'autoers', 'TaskAutoer full source.py') + + +def loadAutoerBundle(): + global _bundleModule + if _bundleModule is not None: + notify.info('Autoer bundle already loaded.') + return _bundleModule + path = _bundlePath() + if not os.path.isfile(path): + notify.warning('Autoer bundle not found at %s' % path) + return None + name = 'ttbtn_autoer_bundle_%s' % hash(path) + spec = importlib.util.spec_from_file_location(name, path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + _bundleModule = mod + notify.info('Loaded autoer bundle from %s' % path) + return mod + + +def stopAllAutoers(): + m = _bundleModule + from toontown.quest.TaskAutoer import revert_task_autoer + + if m is not None: + try: + if getattr(m, 'buildingAutoer', None): + m.buildingAutoer.stop() + m.buildingAutoer.revert() + except Exception as e: + notify.warning('buildingAutoer stop: %s' % e) + + try: + if getattr(m, 'gagTrainer', None): + m.gagTrainer.stop() + from toontown.battle import BattlePlace + from toontown.battle import DistributedBattle + from toontown.suit import DistributedSuit + from toontown.toon import HealthForceAcknowledge + DistributedBattle.DistributedBattle.enterReward = m.GagTrainer.oldEnterReward + DistributedBattle.DistributedBattle.enterFaceOff = m.GagTrainer.oldEnterFaceOff + DistributedSuit.DistributedSuit.denyBattle = m.GagTrainer.oldDenyBattle + HealthForceAcknowledge.HealthForceAcknowledge.enter = m.GagTrainer.oldEnterHealth + BattlePlace.BattlePlace.exitTeleportIn = m.GagTrainer.oldBattlePlaceTeleportIn + try: + rs = m.gagTrainer.restock + rf = getattr(rs, 'revertFunctions', None) + if callable(rf): + rf() + except Exception as e: + notify.warning('gagTrainer restock.revertFunctions: %s' % e) + except Exception as e: + notify.warning('gagTrainer stop: %s' % e) + + for name in ('vpMaxer', 'cfoMaxer', 'ceoMaxer'): + try: + mx = getattr(m, name, None) + if mx is not None and hasattr(mx, 'revert'): + mx.revert() + except Exception as e: + notify.warning('%s revert: %s' % (name, e)) + + try: + cj = TAG.cjMaxer + if cj is not None and hasattr(cj, 'revert'): + cj.revert() + except Exception as e: + notify.warning('cjMaxer revert: %s' % e) + + try: + revert_task_autoer() + except Exception as e: + notify.warning('taskAutoer revert: %s' % e) + + for name in ('buildingAutoer', 'gagTrainer', 'vpMaxer', 'cfoMaxer', 'cjMaxer', 'ceoMaxer'): + try: + setattr(TAG, name, None) + except Exception: + pass + + ToontownBattleGlobals.SkipMovie = 0 + + if m is not None: + try: + m.taskAutoer = None + except Exception: + pass + + try: + base.localAvatar.setSystemMessage(0, 'All autoers stopped.') + except Exception: + pass + + try: + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + except Exception: + pass + + return True + + +def _runStartTaskAutomationCore(): + """Load bundle, bootstrap, and run first check (call when safe to run logic).""" + if not loadAutoerBundle(): + try: + base.localAvatar.setSystemMessage(0, 'Autoer bundle missing. Add autoers/TaskAutoer full source.py') + except Exception: + pass + return False + m = _bundleModule + try: + from toontown.quest.TaskAutoer import bootstrap_task_autoer + ta = bootstrap_task_autoer() + m.taskAutoer = ta + ta.checkWhatToDo() + except Exception as e: + _logAutoerException('startTaskAutomation', e) + try: + detail = traceback.format_exc() + msg = 'Could not start task autoer: %s\n%s' % (e, detail) + if len(msg) > 2000: + msg = msg[:2000] + '\n... (truncated)' + base.localAvatar.setSystemMessage(0, msg) + except Exception: + pass + return False + return True + + +def _taskAutoerBookCloseSequence(task): + """ + Close the sticker book the same way the player would (closeBook -> bookDone -> + CloseBook anim -> walk). Do not fsm.request('walk') synchronously: if OpenBook's + callback has not run yet, enterStickerBookGUI can fire after we leave stickerBook + and reopen the book (render hidden, mouse off) while in walk — total control loss. + """ + try: + place = base.cr.playGame.getPlace() + if place is None or place.getState() != 'stickerBook': + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + _runStartTaskAutomationCore() + return task.done + book = base.localAvatar.book + if not getattr(book, 'entered', 0): + task.waitEnter = getattr(task, 'waitEnter', 0) + 1 + if task.waitEnter > 300: + notify.warning('AutoerManager: book GUI never became active; starting task autoer') + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + _runStartTaskAutomationCore() + return task.done + return task.cont + if not getattr(task, 'issuedClose', 0): + book.closeBook() + task.issuedClose = 1 + if place.getState() != 'stickerBook': + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + _runStartTaskAutomationCore() + return task.done + task.waitLeave = getattr(task, 'waitLeave', 0) + 1 + if task.waitLeave > 600: + notify.warning('AutoerManager: timeout leaving stickerBook; starting task autoer') + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + _runStartTaskAutomationCore() + return task.done + return task.cont + except Exception as e: + notify.warning('_taskAutoerBookCloseSequence: %s' % e) + try: + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + except Exception: + pass + _runStartTaskAutomationCore() + return task.done + + +def startTaskAutomation(): + try: + place = base.cr.playGame.getPlace() + if place is not None and getattr(place, 'fsm', None) is not None: + if place.getState() == 'stickerBook': + taskMgr.remove(_TASK_AUTOER_BOOK_CLOSE) + taskMgr.add(_taskAutoerBookCloseSequence, _TASK_AUTOER_BOOK_CLOSE) + return True + except Exception as e: + notify.warning('startTaskAutomation (defer sticker book): %s' % e) + return _runStartTaskAutomationCore() + + +class _EmergencyStopListener(DirectObject): + + def __init__(self): + DirectObject.__init__(self) + for ev in ('backslash', 'raw-backslash'): + self.accept(ev, self._onStop) + try: + self.accept('\\', self._onStop) + except Exception: + pass + + def _onStop(self): + stopAllAutoers() + + def destroy(self): + self.ignoreAll() + + +def attachEmergencyStopListener(): + global _emergencyListener + if _emergencyListener is not None: + return + _emergencyListener = _EmergencyStopListener() + + +def detachEmergencyStopListener(): + global _emergencyListener + if _emergencyListener is None: + return + _emergencyListener.destroy() + _emergencyListener = None diff --git a/toontown/quest/TaskAutoer.py b/toontown/quest/TaskAutoer.py new file mode 100644 index 0000000..85afdbb --- /dev/null +++ b/toontown/quest/TaskAutoer.py @@ -0,0 +1,1203 @@ +"""Client-side task automation (optional dev tooling). + +Registers companion autoers via task_autoer_globals. The full autoer bundle sets +those references after instantiating building/gag/boss helpers. + +Quest choice UI sends a flat [questId, rewardId, toNpcId, ...] list; this module +auto-picks a non-optional task when possible (compatible with want-random-task-system). +""" +import traceback +import types +from collections import deque + +from direct.directnotify import DirectNotifyGlobal +from direct.gui.DirectGui import DGG, DirectFrame, DirectLabel +from panda3d.core import TextNode + +from toontown.quest import task_autoer_globals as TAG + +notify = DirectNotifyGlobal.directNotify.newCategory('TaskAutoer') + +from direct.interval.IntervalGlobal import * +from toontown.toon import DistributedNPCToon +from toontown.safezone import Playground +from toontown.battle import SuitBattleGlobals +from toontown.building import DistributedBuilding +from toontown.battle import DistributedBattleBldg +from toontown.suit import SuitDNA +from toontown.quest import Quests +from toontown.quest import QuestBookPoster +from toontown.toonbase import TTLocalizer +from toontown.toonbase import ToontownGlobals +from toontown.hood import ZoneUtil +from toontown.toon import ToonHead +from toontown.building import DistributedDoor +from toontown.safezone import DistributedPartyGate +from toontown.safezone import DistributedTrolley +from toontown.toon import DistributedNPCFisherman +from toontown.toon import DistributedNPCPartyPerson +from toontown.shtiker import PurchaseManager +from toontown.minigame import DistributedMinigame +from toontown.estate import Estate +from toontown.estate import House + +HQZONES=[10000,11000,12000,13000] + +class TaskAutoer: + oldTeleportInPlayground=Playground.Playground.exitTeleportIn + #oldBattleBldg=DistributedBattleBldg.DistributedBattleBldg.__init__ + #oldBuildingGenerate=DistributedBuilding.DistributedBuilding.generate + #oldEnterToon=DistributedBuilding.DistributedBuilding.enterToon + oldAnnounceGenerate1=DistributedMinigame.DistributedMinigame.announceGenerate + oldAnnounceGenerate2=PurchaseManager.PurchaseManager.announceGenerate + oldEstateTeleportIn=Estate.Estate.exitTeleportIn + oldHouseDoorIn=House.House.exitDoorIn + + def __init__(self): + DistributedMinigame.DistributedMinigame.announceGenerate=lambda newSelf: self.newAnnounceGenerate1(newSelf) + PurchaseManager.PurchaseManager.announceGenerate=lambda newSelf: self.newAnnounceGenerate2(newSelf) + Playground.Playground.exitTeleportIn=lambda newSelf,*args,**kwds: self.newTeleportInPlayground(newSelf,*args,**kwds) + Estate.Estate.exitTeleportIn=lambda newSelf,*args,**kwds: self.newEstateTeleportIn(newSelf,*args,**kwds) + House.House.exitDoorIn=lambda newSelf,*args,**kwds: self.newHouseDoorIn(newSelf,*args,**kwds) + #DistributedBuilding.DistributedBuilding.generate=lambda newSelf,*args: self.newBuildingGenerate(newSelf,*args) + #DistributedBuilding.DistributedBuilding.enterToon=lambda newSelf,*args: self.newEnterToon(newSelf,*args) + base.localAvatar.setWantBattles(False) + self.shardIds=[] + self.isMember=True + self.jellybeansNeeded=500 + self.questGui=QuestBookPoster.QuestBookPoster(pos=(0.95,1,0.5)) + self.questGui.mouseEnterPoster(0) + self.questGui.mouseExitPoster=self.questGui.mouseEnterPoster + self.oldNPCmovie=None + self.updateQuestGuiLoop=Sequence(Func(self.updateQuestGui),Wait(0.5)) + self.updateQuestGuiLoop.loop() + for shard in base.cr.activeDistrictMap: + try: + ac = base.cr.activeDistrictMap[shard].avatarCount + except Exception: + ac = None + if (ac if ac is not None else 0) < 50: + self.shardIds.append(shard) + self.wantedTracks=[1,3] + self.status=None + self.buildingLevelToZoneDict={1:1000,2:5000,3:4000,4:3000,5:9000} + self._debug_lines = deque(maxlen=18) + self._hudRoot = None + self._hudStatus = None + self._hudIntent = None + self._hudDebug = None + self._build_task_autoer_hud() + self.officer = None + + def _yolo_retry_seconds(self): + try: + return max(0.5, float(base.config.GetFloat('want-task-autoer-yolo-retry', 2.5))) + except Exception: + return 2.5 + + def _yolo_enabled(self): + try: + return base.config.GetBool('want-task-autoer-yolo', True) + except Exception: + return True + + def set_hud_status(self, text): + try: + if self._hudStatus: + self._hudStatus['text'] = 'STATUS: %s' % text + except Exception: + pass + + def set_hud_intent(self, text): + try: + if self._hudIntent: + self._hudIntent['text'] = 'NEXT: %s' % text + except Exception: + pass + + def _safe_gag_trainer_start(self): + """Run gagTrainer.start(); log completion or schedule planner retry on failure.""" + try: + TAG.gagTrainer.start() + self.debug_line('gagTrainer.start() returned (sync part done)') + except Exception as e: + self.debug_line('gagTrainer.start() failed: %s' % e) + self._retry_check_what_to_do(2.0) + + def debug_line(self, msg): + try: + line = msg if len(msg) <= 160 else (msg[:157] + '...') + self._debug_lines.append(line) + if self._hudDebug is not None: + self._hudDebug['text'] = '\n'.join(self._debug_lines) + except Exception: + pass + try: + notify.debug(msg) + except Exception: + pass + try: + print('[TaskAutoer] %s' % msg) + except Exception: + pass + + def _retry_check_what_to_do(self, delay=None): + d = self._yolo_retry_seconds() if delay is None else max(0.3, float(delay)) + self.set_hud_intent('Planner retry in %.1fs' % d) + self.debug_line('YOLO: scheduling checkWhatToDo in %.1fs' % d) + Sequence(Wait(d), Func(self.checkWhatToDo)).start() + + def _is_ttc_playground_zone(self): + """Fishing docks live on the TTC playground (canonical 2000), not on streets (2100–2300).""" + try: + z = base.localAvatar.getZoneId() + return ZoneUtil.getCanonicalZoneId(z) == ToontownGlobals.ToontownCentral + except Exception: + return False + + def _request_safe_teleport_ttc(self): + """Teleport to Toontown Central playground; no-op safely if place/teleport unavailable.""" + place = None + try: + place = base.cr.playGame.getPlace() + except Exception: + pass + if place is None: + self.debug_line('Teleport TTC: no Place — retry soon') + self._retry_check_what_to_do(1.0) + return + try: + if base.localAvatar.hasActiveBoardingGroup(): + self.debug_line('Teleport TTC: blocked (boarding group) — retry') + self._retry_check_what_to_do(2.0) + return + except Exception: + pass + try: + st = place.getState() + if st == 'stickerBook': + self.debug_line('Teleport TTC: close sticker book first — retry') + self._retry_check_what_to_do(2.0) + return + except Exception: + pass + hood = ToontownGlobals.ToontownCentral + try: + place.requestTeleport(hood, hood, None, None) + self.debug_line('Teleport TTC: issued requestTeleport(%s,%s)' % (hood, hood)) + except Exception as e: + self.debug_line('Teleport TTC failed: %s — retry' % e) + self._retry_check_what_to_do(2.0) + + def _ensure_ttc_playground_then_fish(self): + """Jellybean farming uses TTC pond; streets in the same hood have no dock entry.""" + if not self._is_ttc_playground_zone(): + self.set_hud_intent('Enter TTC playground for pond') + self.debug_line('Jellybeans: not on TTC playground (zone=%s) — teleport' % base.localAvatar.getZoneId()) + self._request_safe_teleport_ttc() + return + self.fishOnce() + + def _build_task_autoer_hud(self): + self._hudRoot = DirectFrame( + parent=aspect2d, + frameColor=(0.05, 0.07, 0.12, 0.91), + frameSize=(-0.55, 0.55, -0.66, 0.1), + pos=(-0.85, 0, 0.33), + relief=DGG.FLAT, + sortOrder=100, + ) + DirectFrame( + parent=self._hudRoot, + frameColor=(0.12, 0.78, 0.92, 1), + frameSize=(-0.55, 0.55, 0.04, 0.08), + pos=(0, 0, 0.088), + relief=DGG.FLAT, + ) + DirectLabel( + parent=self._hudRoot, + relief=None, + text='\x01shadow\x01TASK AUTOER\x02', + text_scale=0.048, + text_align=TextNode.ALeft, + pos=(-0.51, 0, 0.032), + text_fg=(0.98, 1, 1, 1), + ) + DirectLabel( + parent=self._hudRoot, + relief=None, + text='YOLO', + text_scale=0.036, + text_align=TextNode.ARight, + pos=(0.51, 0, 0.038), + text_fg=(0.25, 0.95, 0.82, 1), + ) + self._hudStatus = DirectLabel( + parent=self._hudRoot, + relief=None, + text='STATUS: starting', + text_scale=0.031, + text_align=TextNode.ALeft, + pos=(-0.51, 0, -0.06), + text_fg=(0.78, 0.84, 0.96, 1), + textMayChange=1, + ) + self._hudIntent = DirectLabel( + parent=self._hudRoot, + relief=None, + text='NEXT: —', + text_scale=0.029, + text_align=TextNode.ALeft, + pos=(-0.51, 0, -0.12), + text_fg=(0.55, 0.92, 0.72, 1), + textMayChange=1, + ) + self._hudDebug = DirectLabel( + parent=self._hudRoot, + relief=None, + text='', + text_scale=0.023, + text_align=TextNode.ALeft, + pos=(-0.51, 0, -0.2), + text_fg=(0.42, 0.88, 0.52, 1), + textMayChange=1, + text_wordwrap=29, + ) + self.debug_line('HUD online — debug feed active') + + def _clear_ba_gt_safe(self): + ba = TAG.buildingAutoer + gt = TAG.gagTrainer + if ba is not None: + try: + ba.clearSettings() + except Exception as e: + self.debug_line('clearSettings buildingAutoer: %s' % e) + if gt is not None: + try: + gt.clearSettings() + except Exception as e: + self.debug_line('clearSettings gagTrainer: %s' % e) + + def _maxer_vp_factory(self, only_last, set_only_last=True): + m = TAG.vpMaxer + if m is None: + self.debug_line('vpMaxer not available (load bundle)') + self._retry_check_what_to_do() + return False + try: + if set_only_last: + m.otherFunctions.onlyLast = only_last + m.otherFunctions.onlyDoFactory() + m.otherFunctions.start() + self.debug_line('vpMaxer: factory start onlyLast=%s' % only_last) + return True + except Exception as e: + self.debug_line('vpMaxer factory failed: %s' % e) + notify.warning(traceback.format_exc()) + self._retry_check_what_to_do() + return False + + def _maxer_cfo_mint(self, only_last, mint_type, set_mint_type_first=False): + """Start CFO mint autoer. Order of onlyDoMint vs setType matches legacy scripts (two variants).""" + m = TAG.cfoMaxer + if m is None: + self.debug_line('cfoMaxer not available (load bundle)') + self._retry_check_what_to_do() + return False + try: + m.otherFunctions.onlyLast = only_last + if set_mint_type_first: + m.mintAutoer.setType(mint_type) + m.otherFunctions.onlyDoMint() + else: + m.otherFunctions.onlyDoMint() + m.mintAutoer.setType(mint_type) + m.otherFunctions.start() + self.debug_line('cfoMaxer: mint start onlyLast=%s type=%s (typeFirst=%s)' % (only_last, mint_type, set_mint_type_first)) + return True + except Exception as e: + self.debug_line('cfoMaxer mint failed: %s' % e) + notify.warning(traceback.format_exc()) + self._retry_check_what_to_do() + return False + + def _maxer_ceo(self): + m = TAG.ceoMaxer + if m is None: + self.debug_line('ceoMaxer not available (load bundle)') + self._retry_check_what_to_do() + return False + try: + m.otherFunctions.start() + self.debug_line('ceoMaxer: started') + return True + except Exception as e: + self.debug_line('ceoMaxer failed: %s' % e) + notify.warning(traceback.format_exc()) + self._retry_check_what_to_do() + return False + + def _require_gt(self): + if TAG.gagTrainer is None: + self.debug_line('gagTrainer not loaded (autoer bundle?)') + self._retry_check_what_to_do() + return False + return True + + def _require_ba(self): + if TAG.buildingAutoer is None: + self.debug_line('buildingAutoer not loaded (autoer bundle?)') + self._retry_check_what_to_do() + return False + return True + + def _safeMoney(self): + try: + m = base.localAvatar.getTotalMoney() + except Exception: + return 0 + if m is None: + return 0 + try: + return int(m) + except (TypeError, ValueError): + return 0 + + def _safeJellybeansNeeded(self): + try: + j = self.jellybeansNeeded + except Exception: + return 500 + if j is None: + return 500 + try: + return int(j) + except (TypeError, ValueError): + return 500 + + def _safeMaxHp(self): + try: + h = base.localAvatar.getMaxHp() + except Exception: + return 0 + if h is None: + return 0 + try: + return int(h) + except (TypeError, ValueError): + return 0 + + def _safeQuestCogLevel(self, quest): + try: + c = quest.getCogLevel() + except Exception: + return 0 + if c is None: + return 0 + try: + return int(c) + except (TypeError, ValueError): + return 0 + + def newAnnounceGenerate1(self,newSelf): + self.oldAnnounceGenerate1(newSelf) + messenger.send('minigameAbort') + + def newAnnounceGenerate2(self,newSelf): + self.oldAnnounceGenerate2(newSelf) + Sequence(Wait(10),Func(self.skipTrolley)).start() + + def skipTrolley(self): + for i in range(5): + messenger.send('doneChatPage') + Sequence(Wait(4),Func(messenger.send,'purchaseBackToToontown')).start() + + def newNPCmovie(self, mode, npcId, avId, quests, timestamp): + self.oldNPCmovie(mode, npcId, avId, quests, timestamp) + if avId != base.localAvatar.doId: + return + from toontown.toon import NPCToons + if mode != NPCToons.QUEST_MOVIE_QUEST_CHOICE: + return + if not quests or len(quests) % 3 != 0: + return + chosenId = None + for i in range(0, len(quests), 3): + qid = quests[i] + rid = quests[i + 1] + if not Quests.isQuestJustForFun(qid, rid): + chosenId = qid + break + if chosenId is None: + chosenId = quests[0] + self.officer.sendChooseQuest(chosenId) + self.officer.sendUpdate('setMovieDone') + self.officer.setMovie = self.oldNPCmovie + base.cr.playGame.getPlace().fsm.forceTransition('walk') + + def newBuildingGenerate(self,newSelf,*args): + try: + oldBuildingGenerate(newSelf,*args) + except: + pass + + def newEnterToon(self,newSelf,*args): + try: + oldEnterToon(newSelf,*args) + except: + pass + + def newTeleportInPlayground(self,newSelf,*args,**kwds): + self.oldTeleportInPlayground(newSelf,*args,**kwds) + ba = TAG.buildingAutoer + gt = TAG.gagTrainer + try: + z = base.localAvatar.getZoneId() + except Exception: + z = None + if ba and ba.shouldContinue: + self.debug_line('Playground teleportIn: buildingAutoer (zone=%s)' % z) + ba.checkStop() + + if ba.shouldContinue and not self.isQuestComplete(): + ba.killElevators.append(ba.lastElevator) + Sequence(Wait(2),Func(ba.teleportBackToStreet)).start() + else: + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + elif gt and gt.shouldContinue: + self.debug_line('Playground teleportIn: gagTrainer resume (zone=%s)' % z) + Sequence(Wait(2),Func(gt.teleportBackToStreet)).start() + else: + self.debug_line('Playground teleportIn: planner checkWhatToDo (zone=%s)' % z) + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + + def newEstateTeleportIn(self,newSelf,*args,**kwds): + self.oldEstateTeleportIn(newSelf,*args,**kwds) + for door in base.cr.doFindAll('Door'): + if 'esHouse_1' in str(door.getBuilding()): + door.sendUpdate('requestEnter') + + def newHouseDoorIn(self,newSelf,*args,**kwds): + self.oldHouseDoorIn(newSelf,*args,**kwds) + base.cr.doFind('phone').sendUpdate('avatarEnter') + base.cr.doFind('phone').sendUpdate('avatarExit') + Sequence(Wait(2),Func(self.checkWhatToDo)).start() + + def checkWhatToDo(self): + try: + self._checkWhatToDoImpl() + except Exception as e: + self.debug_line('checkWhatToDo exception: %s' % e) + notify.warning(traceback.format_exc()) + if self._yolo_enabled(): + self._retry_check_what_to_do() + else: + try: + base.localAvatar.setSystemMessage(0, 'Task autoer: %s' % e) + except Exception: + pass + + def _checkWhatToDoImpl(self): + self.set_hud_status('Planning') + self.set_hud_intent('Evaluating money, district, quests') + self.debug_line( + 'checkWhatToDo: money=%s jellyTarget=%s status=%s shard=%s quests=%s' + % ( + self._safeMoney(), + self._safeJellybeansNeeded(), + self.status, + getattr(base.localAvatar, 'defaultShard', None), + len(base.localAvatar.quests) if base.localAvatar.quests else 0, + ) + ) + + if self._safeMoney() > self._safeJellybeansNeeded(): + self.jellybeansNeeded = 500 + + if self.shardIds and base.localAvatar.defaultShard not in self.shardIds: + self.set_hud_intent('Switching to quieter district') + self.debug_line('Relocating to alternate shard (population cap)') + try: + base.cr.playGame.getPlace().requestTeleport( + ToontownGlobals.ToontownCentral, + ToontownGlobals.ToontownCentral, + random.choice(self.shardIds), + None, + ) + except Exception as e: + self.debug_line('Shard switch teleport failed: %s' % e) + self._retry_check_what_to_do(2.0) + + elif self.status == 'Fishing': + if not self.isQuestComplete(): + self.set_hud_status('Fishing') + self.set_hud_intent('Casting / selling fish') + self.debug_line('Fishing loop: quest not complete') + if not self._is_ttc_playground_zone(): + self.debug_line('Fishing: move to TTC playground first') + self._request_safe_teleport_ttc() + else: + self.fishOnce() + else: + self.set_hud_intent('Leaving docks after fish task') + self.debug_line('Fishing done: exiting spots') + for dock in base.cr.doFindAll('DistributedFishingSpot'): + dock.sendUpdate('requestExit') + self.status = None + self.doTask() + + elif base.localAvatar.quests: + self.set_hud_intent('Delegate to quest runner') + self.debug_line('Active quest(s): running doTask (quests beat idle jellybean farming)') + self.doTask() + + elif self.jellybeansNeeded == 12000: + self.set_hud_status('Farming jellybeans') + self.set_hud_intent('Fish for jellybeans') + self.debug_line('Low jellybeans: fishing for cash (no active quests)') + self._ensure_ttc_playground_then_fish() + + elif self._safeMoney() < self._safeJellybeansNeeded(): + self.jellybeansNeeded = 12000 + self.set_hud_intent('Teleport Toontown Central for fishing') + self.debug_line('Need jellybeans: heading to TTC pond (no quests)') + self._request_safe_teleport_ttc() + else: + self.set_hud_intent('Pick up new task from HQ') + self.debug_line('No quests: collecting new task') + self.collectNewTask() + + def updateQuestGui(self): + if base.localAvatar.quests: + self.questGui.update(base.localAvatar.quests[0]) + else: + self.questGui.clear() + + def getCurrentQuest(self): + return Quests.getQuest(base.localAvatar.quests[0][0]) + + def getBestZoneForCogLevel(self,level): + try: + level = int(level) + except (TypeError, ValueError): + level = 1 + if self.isMember: + if level<3: + return 2000 + elif level<4: + return 1000 + elif level<5: + return 5000 + elif level<6: + return 4000 + elif level<7: + return 3000 + elif level<8: + return 9000 + elif level<9: + return 12000 + else: + return 13000 + else: + return 2000 + + def getBestZoneForBuildingLevel(self,level): + try: + level = int(level) + except (TypeError, ValueError): + level = 1 + return self.buildingLevelToZoneDict.get(level) + + def getSuitName(self,suitType): + try: + return SuitBattleGlobals.SuitAttributes[suitType].get('name') + except: + return suitType + + def getCogLevelFromCog(self,suitType): + try: + lv = SuitBattleGlobals.SuitAttributes[suitType].get('level') + return (lv if lv is not None else 0) + 1 + except Exception: + return 1 + + + def getSuitDepartment(self,suitType): + return SuitDNA.getSuitDept(suitType) + + def getCorrectChoice(self,choices): + if 0 in choices: + return 0 + elif 2 in choices: + return 2 + elif self.wantedTracks[0] in choices: + return self.wantedTracks[0] + else: + return self.wantedTracks[1] + + def newTask(self): + for officer in base.cr.doFindAll('HQ Officer'): + if officer.allowedToTalk(): + if officer.setMovie!=self.oldNPCmovie: + self.oldNPCmovie=officer.setMovie + self.officer=officer + officer.setMovie=self.newNPCmovie + officer.sendUpdate('avatarEnter') + break + + def collectNewTask(self): + interest = base.cr.addInterest(base.localAvatar.defaultShard, 2742, '5', None) + Sequence(Wait(1),Func(self.newTask),Wait(2),Func(base.cr.removeInterest,interest),Func(self.checkWhatToDo)).start() + + def nextShard(self): + base.cr.playGame.getPlace().fsm.forceTransition('walk') + base.cr.playGame.getPlace().requestTeleport(2000,2000,self.shardIds[0],None) + self.shardIds.append(self.shardIds[0]) + del self.shardIds[0] + + def catchFish(self): + try: + fish = base.cr.doFindAll("FishingTarget")[0] + for fp in base.cr.doFindAll("FishingPond"): + fp.d_hitTarget(fish) + except: + pass + + def fishOnce(self): + entered=False + for spot in reversed(base.cr.doFindAll('DistributedFishingSpot')): + if spot.allowedToEnter(): + entered=True + spot.sendUpdate('requestEnter') + usedSpot=spot + break + if entered: + catchFishSeq=Sequence() + catchFishSeq.append(Wait(1)) + for i in range(23): + catchFishSeq.append(Func(self.catchFish)) + catchFishSeq.append(Wait(0.05)) + catchFishSeq.append(Wait(1)) + catchFishSeq.append(Func(self.sellFish)) + catchFishSeq.append(Wait(0.5)) + catchFishSeq.append(Func(self.checkWhatToDo)) + catchFishSeq.start() + else: + Sequence(Wait(2),Func(self.fishOnce)).start() + + def sellFish(self): + base.cr.doFind('Fisherman').sendUpdate('avatarEnter') + base.cr.doFind('Fisherman').sendUpdate('completeSale',[1]) + + def speakToNpc(self,name): + if base.cr.doFind(name): + for npc in base.cr.doFindAllInstances(DistributedNPCToon.DistributedNPCToon): + if npc.getName()==name: + if npc.allowedToTalk(): + npc.sendUpdate('avatarEnter') + npc.sendUpdate('setMovieDone') + base.cr.removeInterest(self.interest) + Sequence(Wait(1),Func(self.checkWhatToDo)).start() + found=True + foundNPC=True + break + else: + found=False + foundNPC=True + else: + foundNPC=False + if not foundNPC: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + elif not found: + Sequence(Wait(5),Func(self.speakToNpc,name)).start() + else: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + + def chooseTrack(self,name): + if base.cr.doFind(name): + for npc in base.cr.doFindAllInstances(DistributedNPCToon.DistributedNPCToon): + if npc.getName()==name: + if npc.allowedToTalk(): + npc.sendUpdate('avatarEnter') + try: + npc.sendChooseTrack(self.getCorrectChoice(self.getCurrentQuest().getChoices())) + npc.sendUpdate('setMovieDone') + except: + pass + base.cr.removeInterest(self.interest) + Sequence(Wait(0.5),Func(self.checkWhatToDo)).start() + found=True + foundNPC=True + break + else: + found=False + foundNPC=True + else: + foundNPC=False + if not foundNPC: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + elif not found: + Sequence(Wait(5),Func(self.chooseTrack,name)).start() + else: + Sequence(Func(base.cr.removeInterest,self.interest),Wait(0.5),Func(self.nextShard)).start() + + def doTrolleyTask(self): + if base.localAvatar.getZoneId()==2000: + if base.cr.doFind('Trolley').allowedToEnter(): + base.cr.playGame.getPlace().fsm.forceTransition('walk') + base.localAvatar.setPos(-133.548, -71.1069, 0.525) + else: + Sequence(Wait(2),Func(self.doTrolleyTask)).start() + else: + base.cr.playGame.getPlace().requestTeleport(2000,2000,None,None) + + + def doNPCTask(self, isTrackTask=False): + """Resolve target NPC from the 5-field quest row: [questId, fromNpc, toNpc, reward, progress].""" + try: + quests = base.localAvatar.quests + if not quests: + self.debug_line('doNPCTask: no quests') + self._retry_check_what_to_do(1.0) + return + row = quests[0] + if not isinstance(row, (list, tuple)): + self.debug_line('doNPCTask: bad quest row type %s' % type(row).__name__) + self._retry_check_what_to_do(1.0) + return + if len(row) < 5: + self.debug_line('doNPCTask: quest row len=%s (need 5: id,from,to,reward,progress)' % len(row)) + self._retry_check_what_to_do(1.0) + return + toNpcId = row[2] + zoneId = Quests.NPCToons.getNPCZone(toNpcId) + if zoneId in (None, -1): + if toNpcId in (Quests.ToonHQ, Quests.Any): + zoneId = 2742 + else: + qe = Quests.QuestDict.get(row[0]) + if qe: + alt = Quests.NPCToons.getNPCZone(qe[Quests.QuestDictToNpcIndex]) + if alt not in (None, -1): + zoneId = alt + if zoneId in (None, -1): + zoneId = 2742 + self.debug_line('doNPCTask: fallback zone 2742 for npcId=%s' % toNpcId) + npcName = Quests.NPCToons.getNPCName(toNpcId) + if not npcName: + npcName = 'HQ Officer' + self.debug_line('doNPCTask: npcId=%s name=%s zoneId=%s' % (toNpcId, npcName, zoneId)) + self.interest = base.cr.addInterest(base.localAvatar.defaultShard, zoneId, '5', None) + if not isTrackTask: + Sequence(Wait(2), Func(self.speakToNpc, npcName)).start() + else: + Sequence(Wait(2), Func(self.chooseTrack, npcName)).start() + except Exception as e: + self.debug_line('doNPCTask failed: %s' % e) + try: + notify.warning(''.join(traceback.format_exception_only(type(e), e))) + except Exception: + notify.warning('doNPCTask error: %s' % e) + self._retry_check_what_to_do(0.75) + + def doTask(self): + try: + self._doTaskImpl() + except Exception as e: + self.debug_line('doTask exception: %s' % e) + try: + notify.warning('doTask: %s' % (e,)) + if e.__traceback__: + notify.warning(''.join(traceback.format_tb(e.__traceback__)[-12:])) + except Exception: + pass + if self._yolo_enabled(): + self._retry_check_what_to_do() + else: + try: + base.localAvatar.setSystemMessage(0, 'Task autoer: %s' % e) + except Exception: + pass + + def _doTaskImpl(self): + self.set_hud_status('Quest runner') + if not base.localAvatar.quests: + self.debug_line('doTask: no quests on avatar') + self._retry_check_what_to_do() + return + try: + quest = Quests.getQuest(base.localAvatar.quests[0][0]) + except Exception as e: + self.debug_line('doTask: getQuest failed: %s' % e) + self._retry_check_what_to_do() + return + try: + qt = quest.getType() + except Exception as e: + self.debug_line('doTask: getType failed: %s' % e) + self._retry_check_what_to_do() + return + + self.debug_line('doTask: questId=%s type=%s' % (base.localAvatar.quests[0][0], qt)) + + if self.isQuestComplete() or qt == Quests.VisitQuest: + self.set_hud_intent('Visit / turn in to NPC') + self.debug_line('Route: VisitQuest or complete') + self.doNPCTask() + + elif qt == Quests.DeliverItemQuest: + self.set_hud_intent('Deliver item') + self.debug_line('Route: DeliverItemQuest') + self.doNPCTask() + + elif isinstance(quest, Quests.CogQuest): + self.set_hud_intent('Cog combat / HQ / building') + self.debug_line( + 'Route: Cog quest class=%s loc=%s' + % (quest.__class__.__name__, quest.getLocation()) + ) + self._clear_ba_gt_safe() + if quest.getLocation() == 11500: + if not self._maxer_vp_factory(False, set_only_last=False): + return + elif isinstance(quest, Quests.CogTrackQuest): + if not self._require_gt(): + return + loc = quest.getLocation() + if loc == Quests.Anywhere or loc == 1: + track = quest.getCogTrack() + if track == 'c' or self._safeMaxHp() < 30: + location = 2000 + elif track == 's': + location = 11200 + elif track == 'm': + location = 12000 + else: + location = 13000 + self.debug_line('CogTrack: target HQ/street zone %s (track=%s)' % (location, track)) + TAG.gagTrainer.setLocation(location) + else: + self.debug_line('CogTrack: fixed zone %s' % loc) + TAG.gagTrainer.setLocation(loc) + TAG.gagTrainer.setCogType(quest.getCogTrack()) + self.debug_line('Starting gagTrainer (CogTrack)') + self._safe_gag_trainer_start() + + elif isinstance(quest, Quests.CogLevelQuest): + if not base.localAvatar.getTrackAccess()[2] or quest.getLocation() in HQZONES or self._safeQuestCogLevel(quest) < 11: + if not self._require_gt(): + return + if quest.getLocation() == 1: + TAG.gagTrainer.setLocation(self.getBestZoneForCogLevel(self._safeQuestCogLevel(quest) + 1)) + else: + if quest.getLocation() in range(12500, 12701, 1000): + if not self._maxer_cfo_mint(False, quest.getLocation()): + return + elif quest.getLocation() == 11500: + if not self._maxer_vp_factory(False, set_only_last=True): + return + else: + TAG.gagTrainer.setLocation(quest.getLocation()) + + if quest.getCogType() == 1: + TAG.gagTrainer.setCogLevel(self._safeQuestCogLevel(quest)) + else: + TAG.gagTrainer.setCogName(self.getSuitName(quest.getCogType())) + self._safe_gag_trainer_start() + else: + if not self._require_ba(): + return + if quest.getCogType() == 1: + TAG.buildingAutoer.setBuildingType('') + TAG.buildingAutoer.setNumFloors(4) + else: + TAG.buildingAutoer.setBuildingType(self.getSuitDepartment(self.getCogType())) + TAG.buildingAutoer.setNumFloors(4) + + if quest.getLocation() != 1: + TAG.buildingAutoer.setLocation(quest.getLocation()) + else: + if self._safeMaxHp() > 70: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(5)) + else: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + TAG.buildingAutoer.start() + else: + if not base.localAvatar.getTrackAccess()[2] or quest.getLocation() in HQZONES or self.getCogLevelFromCog(quest.getCogType()) + 4 < 11: + + if not self._require_gt(): + return + if quest.getLocation() == 1: + if self._safeMaxHp() > 30 and quest.getCogType() == 1: + TAG.gagTrainer.setLocation(11200) + else: + TAG.gagTrainer.setLocation(self.getBestZoneForCogLevel(self.getCogLevelFromCog(quest.getCogType()) + 1)) + else: + TAG.gagTrainer.setLocation(quest.getLocation()) + + if quest.getCogType() == 1: + TAG.gagTrainer.setCogName(None) + else: + TAG.gagTrainer.setCogName(self.getSuitName(quest.getCogType())) + self._safe_gag_trainer_start() + else: + if not self._require_ba(): + return + if quest.getCogType() == 1: + TAG.buildingAutoer.setBuildingType('') + TAG.buildingAutoer.setNumFloors(4) + else: + TAG.buildingAutoer.setBuildingType(self.getSuitDepartment(quest.getCogType())) + TAG.buildingAutoer.setNumFloors(4) + + if quest.getLocation() != 1: + TAG.buildingAutoer.setLocation(quest.getLocation()) + else: + if self._safeMaxHp() > 70: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(5)) + else: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + TAG.buildingAutoer.start() + + elif qt == Quests.BuildingQuest: + self.set_hud_intent('Building takeover') + self.debug_line('Route: BuildingQuest') + if not self._require_ba(): + return + TAG.buildingAutoer.clearSettings() + if quest.getLocation() == 1: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(quest.getNumFloors())) + else: + TAG.buildingAutoer.setLocation(quest.getLocation()) + TAG.buildingAutoer.setNumFloors(quest.getNumFloors()) + if quest.getBuildingTrack() == 1: + TAG.buildingAutoer.setBuildingType('') + else: + TAG.buildingAutoer.setBuildingType(quest.getBuildingTrack()) + + TAG.buildingAutoer.start() + + elif qt == Quests.RecoverItemQuest: + self.set_hud_intent('Recover / fish / route combat') + self.debug_line('Route: RecoverItemQuest holder=%s loc=%s' % (quest.getHolder(), quest.getLocation())) + if quest.getHolder() == 4: + self.set_hud_status('Fishing (recover item)') + if quest.getLocation() == 1: + if base.localAvatar.getZoneId() != 2000: + self.debug_line('Recover fish: teleport TTC') + base.cr.playGame.getPlace().requestTeleport(2000, 2000, None, None) + self.status = 'Fishing' + else: + self.status = 'Fishing' + self.checkWhatToDo() + + else: + if base.localAvatar.getZoneId() != quest.getLocation(): + self.debug_line('Recover fish: teleport zone %s' % quest.getLocation()) + base.cr.playGame.getPlace().requestTeleport(quest.getLocation(), quest.getLocation(), None, None) + self.status = 'Fishing' + else: + self.status = 'Fishing' + self.checkWhatToDo() + else: + self._clear_ba_gt_safe() + if not self.isSuitOnlyBldg(quest.getHolder()) or quest.getHolderType() == 'track': + if not self._require_gt(): + return + if quest.getLocation() == 1: + if type(quest.getHolder()) == int: + TAG.gagTrainer.setLocation(self.getBestZoneForCogLevel(quest.getHolder() + 1)) + elif quest.getHolderType() == 'track': + TAG.gagTrainer.setLocation(2000) + else: + TAG.gagTrainer.setLocation(self.getBestZoneForCogLevel(self.getCogLevelFromCog(quest.getHolder()) + 1)) + else: + TAG.gagTrainer.setLocation(quest.getLocation()) + + if type(quest.getHolder()) == int: + TAG.gagTrainer.setCogLevel(quest.getHolder()) + elif quest.getHolderType() == 'track': + TAG.gagTrainer.setCogType(quest.getHolder()) + else: + TAG.gagTrainer.setCogName(self.getSuitName(quest.getHolder())) + self._safe_gag_trainer_start() + + elif quest.getLocation() == 12000: + if not self._maxer_cfo_mint(True, 12500): + return + + elif quest.getLocation() == 11000: + if not self._maxer_vp_factory(True, set_only_last=True): + return + + else: + if not self._require_ba(): + return + if quest.getLocation() == 1: + TAG.buildingAutoer.setLocation(self.getBestZoneForBuildingLevel(4)) + else: + TAG.buildingAutoer.setLocation(quest.getLocation()) + if quest.getHolder() == 1: + TAG.buildingAutoer.setBuildingType('') + else: + TAG.buildingAutoer.setBuildingType(self.getSuitDepartment(quest.getHolder())) + TAG.buildingAutoer.start() + + elif qt == Quests.DeliverGagQuest: + self.set_hud_intent('Restock gag then NPC') + self.debug_line('Route: DeliverGagQuest') + gt = TAG.gagTrainer + if gt is None: + self.debug_line('DeliverGag: gagTrainer missing') + self._retry_check_what_to_do() + return + Sequence(Func(gt.restock.restockGags, quest.getGagType()), Wait(2), Func(self.doNPCTask)).start() + + elif qt == Quests.SkelecogLevelQuest: + self.set_hud_intent('Skelecog HQ task') + self.debug_line('Route: SkelecogLevelQuest loc=%s' % quest.getLocation()) + if quest.getLocation() == 11000: + if not self._maxer_vp_factory(False, set_only_last=True): + return + elif quest.getLocation() == 12000: + if not self._maxer_cfo_mint(False, 12500, set_mint_type_first=True): + return + elif quest.getLocation() == 13000: + cj = TAG.cjMaxer + if cj is None: + self.debug_line('Skelecog: CJ maxer not loaded — add CJMaxer.py or retry') + try: + base.localAvatar.setSystemMessage(0, 'Task autoer: load CJ maxer for this task.') + except Exception: + pass + self._retry_check_what_to_do(5.0) + return + try: + cj.otherFunctions.onlyDoDa() + cj.otherFunctions.start() + self.debug_line('CJ DA maxer started') + except Exception as e: + self.debug_line('CJ maxer start failed: %s' % e) + self._retry_check_what_to_do() + elif quest.getLocation() == 1: + if self._safeQuestCogLevel(quest) < 9: + if not self._maxer_vp_factory(False, set_only_last=True): + return + else: + if not self._maxer_cfo_mint(False, 12500, set_mint_type_first=True): + return + + elif qt in (Quests.FactoryQuest, Quests.ForemanQuest): + self.set_hud_intent('VP factory') + self.debug_line('Route: Factory/Foreman') + if not self._maxer_vp_factory(True, set_only_last=True): + return + + elif qt == Quests.SupervisorQuest: + self.set_hud_intent('CFO supervisor') + self.debug_line('Route: SupervisorQuest') + if not self._maxer_cfo_mint(True, quest.getLocation()): + return + + elif qt == Quests.SkeleReviveQuest: + self.set_hud_intent('CEO revive') + self.debug_line('Route: SkeleReviveQuest') + if not self._maxer_ceo(): + return + + elif qt == Quests.TrackChoiceQuest: + self.set_hud_intent('Choose track (NPC)') + self.debug_line('Route: TrackChoiceQuest') + self.doNPCTask(isTrackTask=True) + + elif qt == Quests.TrolleyQuest: + self.set_hud_intent('Trolley minigame') + self.debug_line('Route: TrolleyQuest') + self.doTrolleyTask() + + elif qt == Quests.PhoneQuest: + self.set_hud_intent('Clarabelle / phone') + self.debug_line('Route: PhoneQuest') + base.localAvatar._LocalToon__handleClarabelleButton() + + else: + self.debug_line('Unknown quest type %s — YOLO reschedule' % qt) + try: + base.localAvatar.setSystemMessage(0, 'Task autoer: unknown quest type (will retry)') + except Exception: + pass + if self._yolo_enabled(): + self._retry_check_what_to_do(4.0) + + + def isQuestComplete(self): + try: + base.localAvatar.book.pages[4].updatePage() + return base.localAvatar.book.pages[4].questFrames[0].headline['text'] == TTLocalizer.QuestPosterComplete + except Exception: + return False + + def isSuitOnlyBldg(self,suitType): + try: + lv = SuitBattleGlobals.SuitAttributes[suitType].get('level') + if (lv if lv is not None else 0) + 1 > 6: + return True + else: + return False + except KeyError: + return False + + def revert(self): + try: + self.updateQuestGuiLoop.finish() + except Exception: + pass + try: + if getattr(self, 'questGui', None): + self.questGui.destroy() + self.questGui = None + except Exception: + pass + try: + if getattr(self, '_hudRoot', None): + self._hudRoot.destroy() + except Exception: + pass + self._hudRoot = None + self._hudStatus = None + self._hudIntent = None + self._hudDebug = None + DistributedMinigame.DistributedMinigame.announceGenerate = TaskAutoer.oldAnnounceGenerate1 + PurchaseManager.PurchaseManager.announceGenerate = TaskAutoer.oldAnnounceGenerate2 + Playground.Playground.exitTeleportIn = TaskAutoer.oldTeleportInPlayground + Estate.Estate.exitTeleportIn = TaskAutoer.oldEstateTeleportIn + House.House.exitDoorIn = TaskAutoer.oldHouseDoorIn + try: + for npc in base.cr.doFindAllInstances(DistributedNPCToon.DistributedNPCToon): + if 'Officer' in npc.getName(): + npc.setMovie = types.MethodType(DistributedNPCToon.DistributedNPCToon.setMovie, npc) + except Exception: + pass + self.officer = None + if base.localAvatar: + base.localAvatar.setWantBattles(True) + + +taskAutoer = None + + +def bootstrap_task_autoer(): + global taskAutoer + if taskAutoer is not None: + return taskAutoer + taskAutoer = TaskAutoer() + return taskAutoer + + +def revert_task_autoer(): + global taskAutoer + if taskAutoer is None: + return + taskAutoer.revert() + taskAutoer = None diff --git a/toontown/quest/task_autoer_globals.py b/toontown/quest/task_autoer_globals.py new file mode 100644 index 0000000..09ecf7e --- /dev/null +++ b/toontown/quest/task_autoer_globals.py @@ -0,0 +1,11 @@ +"""Shared handles for companion autoers used by TaskAutoer (building/gag/boss maxers). + +Populate these from your loader after each companion module is instantiated. +""" + +buildingAutoer = None +gagTrainer = None +vpMaxer = None +cfoMaxer = None +cjMaxer = None +ceoMaxer = None diff --git a/toontown/safezone/DistributedTTCCraneSandbox.py b/toontown/safezone/DistributedTTCCraneSandbox.py new file mode 100644 index 0000000..5213b1e --- /dev/null +++ b/toontown/safezone/DistributedTTCCraneSandbox.py @@ -0,0 +1,94 @@ +from panda3d.core import * +from panda3d.physics import * +from direct.directnotify import DirectNotifyGlobal +from direct.distributed import DistributedObject +from direct.task import Task +from direct.task.TaskManagerGlobal import taskMgr +from direct.showbase.ShowBaseGlobal import globalClock +from toontown.toonbase import ToontownGlobals + + +class DistributedTTCCraneSandbox(DistributedObject.DistributedObject): + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTTCCraneSandbox') + + def __init__(self, cr): + DistributedObject.DistributedObject.__init__(self, cr) + self.ttcCraneSandbox = True + self.cranes = {} + self.safes = {} + self.heldObject = None + self.physicsMgr = None + self.geom = None + self.magnet = None + self.craneArm = None + self.controls = None + self.stick = None + self.safe = None + self.cableTex = None + self.lightning = None + return + + def announceGenerate(self): + DistributedObject.DistributedObject.announceGenerate(self) + self.cr.ttcCraneSandboxBossId = self.doId + self.startLoad() + + def startLoad(self): + self.magnet = loader.loadModel('phase_10/models/cogHQ/CBMagnet.bam') + self.craneArm = loader.loadModel('phase_10/models/cogHQ/CBCraneArm.bam') + self.controls = loader.loadModel('phase_10/models/cogHQ/CBCraneControls.bam') + self.stick = loader.loadModel('phase_10/models/cogHQ/CBCraneStick.bam') + self.safe = loader.loadModel('phase_10/models/cogHQ/CBSafe.bam') + self.lightning = loader.loadModel('phase_10/models/cogHQ/CBLightning.bam') + self.cableTex = self.craneArm.findTexture('MagnetControl') + self.geom = NodePath('ttc-crane-sandbox-geom') + plane = CollisionPlane(Plane(Vec3(0, 0, 1), Point3(0, 0, -120))) + planeNode = CollisionNode('dropPlane') + planeNode.addSolid(plane) + planeNode.setCollideMask(ToontownGlobals.PieBitmask) + self.geom.attachNewNode(planeNode) + self.geom.reparentTo(render) + self.physicsMgr = PhysicsManager() + integrator = LinearEulerIntegrator() + self.physicsMgr.attachLinearIntegrator(integrator) + fn = ForceNode('gravity') + self.fnp = self.geom.attachNewNode(fn) + gravity = LinearVectorForce(0, 0, -32) + fn.addForce(gravity) + self.physicsMgr.addLinearForce(gravity) + taskMgr.add(self.__doPhysics, self.uniqueName('physics'), priority=25) + + def __doPhysics(self, task): + dt = globalClock.getDt() + self.physicsMgr.doPhysics(dt) + return Task.cont + + def disable(self): + taskMgr.remove(self.uniqueName('physics')) + self.ttcCraneSandbox = False + if getattr(self.cr, 'ttcCraneSandboxBossId', None) == self.doId: + self.cr.ttcCraneSandboxBossId = None + if self.physicsMgr: + self.physicsMgr.clearLinearForces() + if getattr(self, 'fnp', None): + self.fnp.removeNode() + self.fnp = None + if self.geom: + self.geom.removeNode() + self.geom = None + self.magnet = None + self.craneArm = None + self.controls = None + self.stick = None + self.safe = None + self.cableTex = None + self.lightning = None + DistributedObject.DistributedObject.disable(self) + + def toCraneMode(self): + place = self.cr.playGame.getPlace() + if place and hasattr(place, 'fsm'): + place.setState('crane') + + def toFinalBattleMode(self): + pass diff --git a/toontown/safezone/DistributedTTCCraneSandboxAI.py b/toontown/safezone/DistributedTTCCraneSandboxAI.py new file mode 100644 index 0000000..53f407c --- /dev/null +++ b/toontown/safezone/DistributedTTCCraneSandboxAI.py @@ -0,0 +1,66 @@ +from panda3d.core import NodePath +from direct.distributed import DistributedObjectAI +from direct.directnotify import DirectNotifyGlobal +from toontown.toonbase import ToontownGlobals +from toontown.coghq import DistributedCashbotBossCraneAI +from toontown.coghq import DistributedCashbotBossSafeAI + + +class DistributedTTCCraneSandboxAI(DistributedObjectAI.DistributedObjectAI): + notify = DirectNotifyGlobal.directNotify.newCategory('DistributedTTCCraneSandboxAI') + + craneSandbox = True + + def __init__(self, air): + DistributedObjectAI.DistributedObjectAI.__init__(self, air) + self.scene = NodePath('scene') + self.cranes = None + self.safes = None + self.heldObject = None + self.attackCode = 0 + self.involvedToons = [] + + def spawnCranesAndSafes(self): + if self.cranes is not None: + return + self.cranes = [] + for index in range(len(ToontownGlobals.TTCCraneSandboxCranePosHprs)): + crane = DistributedCashbotBossCraneAI.DistributedCashbotBossCraneAI(self.air, self, index) + crane.generateWithRequired(self.zoneId) + self.cranes.append(crane) + + self.safes = [] + for index in range(len(ToontownGlobals.TTCCraneSandboxSafePosHprs)): + safe = DistributedCashbotBossSafeAI.DistributedCashbotBossSafeAI(self.air, self, index) + safe.generateWithRequired(self.zoneId) + self.safes.append(safe) + + for crane in self.cranes: + crane.request('Free') + + for safe in self.safes: + safe.request('Initial') + + def __deleteBattleObjects(self): + if self.cranes is not None: + for crane in self.cranes: + try: + crane.request('Off') + except Exception: + pass + crane.requestDelete() + + self.cranes = None + if self.safes is not None: + for safe in self.safes: + try: + safe.request('Off') + except Exception: + pass + safe.requestDelete() + + self.safes = None + + def delete(self): + self.__deleteBattleObjects() + DistributedObjectAI.DistributedObjectAI.delete(self) diff --git a/toontown/shtiker/AutoerPage.py b/toontown/shtiker/AutoerPage.py new file mode 100644 index 0000000..8e71388 --- /dev/null +++ b/toontown/shtiker/AutoerPage.py @@ -0,0 +1,131 @@ +from direct.gui.DirectGui import * +from panda3d.core import * + +from toontown.shtiker import ShtikerPage +from toontown.toonbase import ToontownGlobals +from toontown.toonbase import TTLocalizer +from toontown.quest import AutoerManager + + +class AutoerPage(ShtikerPage.ShtikerPage): + + def __init__(self): + ShtikerPage.ShtikerPage.__init__(self) + return + + def load(self): + ShtikerPage.ShtikerPage.load(self) + self.title = DirectLabel( + parent=self, + relief=None, + text=TTLocalizer.AutoerPageTitle, + text_scale=0.12, + pos=(0, 0, 0.62), + ) + helpText = TTLocalizer.AutoerPageHelp + self.helpLabel = DirectLabel( + parent=self, + relief=None, + text=helpText, + text_scale=0.045, + text_align=TextNode.ACenter, + text_wordwrap=28, + pos=(0, 0, 0.38), + ) + self.statusLabel = DirectLabel( + parent=self, + relief=None, + text=TTLocalizer.AutoerPageStatusIdle, + text_scale=0.045, + text_align=TextNode.ACenter, + pos=(0, 0, 0.06), + textMayChange=1, + ) + # frameSize in aspect2d units: keep width ~1.0–1.2 (same ballpark as InventoryPage restock, etc.) + btnFrame = (-1.05, 1.05, -0.1, 0.1) + btnTextScale = 0.042 + self.loadBtn = DirectButton( + parent=self, + relief=DGG.RAISED, + text=TTLocalizer.AutoerPageLoad, + text_scale=btnTextScale, + frameSize=btnFrame, + borderWidth=(0.01, 0.01), + pos=(0, 0, -0.14), + command=self.__loadBundle, + ) + self.startBtn = DirectButton( + parent=self, + relief=DGG.RAISED, + text=TTLocalizer.AutoerPageStartTasks, + text_scale=btnTextScale, + frameSize=btnFrame, + borderWidth=(0.01, 0.01), + pos=(0, 0, -0.3), + command=self.__startTasks, + ) + self.stopBtn = DirectButton( + parent=self, + relief=DGG.RAISED, + text=TTLocalizer.AutoerPageStopAll, + text_scale=btnTextScale, + frameSize=btnFrame, + borderWidth=(0.01, 0.01), + pos=(0, 0, -0.46), + command=self.__stopAll, + text_fg=(0.9, 0.2, 0.2, 1), + ) + return + + def unload(self): + del self.title + del self.helpLabel + del self.statusLabel + self.loadBtn.destroy() + del self.loadBtn + self.startBtn.destroy() + del self.startBtn + self.stopBtn.destroy() + del self.stopBtn + ShtikerPage.ShtikerPage.unload(self) + + def __refreshStatus(self): + if AutoerManager.isBundleLoaded(): + self.statusLabel['text'] = TTLocalizer.AutoerPageStatusLoaded + else: + self.statusLabel['text'] = TTLocalizer.AutoerPageStatusIdle + + def __loadBundle(self): + messenger.send('wakeup') + if AutoerManager.loadAutoerBundle(): + self.__refreshStatus() + try: + base.localAvatar.setSystemMessage(0, TTLocalizer.AutoerPageMsgLoaded) + except Exception: + pass + else: + try: + base.localAvatar.setSystemMessage(0, TTLocalizer.AutoerPageMsgLoadFail) + except Exception: + pass + + def __startTasks(self): + messenger.send('wakeup') + if AutoerManager.startTaskAutomation(): + self.__refreshStatus() + try: + base.localAvatar.setSystemMessage(0, TTLocalizer.AutoerPageMsgStarted) + except Exception: + pass + + def __stopAll(self): + messenger.send('wakeup') + AutoerManager.stopAllAutoers() + self.__refreshStatus() + + def enter(self): + ShtikerPage.ShtikerPage.enter(self) + self.__refreshStatus() + + def exit(self): + ShtikerPage.ShtikerPage.exit(self)