oldschool-toontown/toontown/ai/ToontownMagicWordManager.py

841 lines
34 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
from direct.interval.IntervalGlobal import *
from direct.distributed import PyDatagram
from direct.distributed.MsgTypes import MsgName2Id
from pandac.PandaModules import *
from direct.distributed import DistributedObject
from toontown.toon import DistributedToon
from direct.directnotify import DirectNotifyGlobal
from toontown.town import TownBattleAttackPanel
from toontown.suit import RoguesGallery
from otp.avatar import Avatar
from otp.chat import ChatManager
from toontown.toonbase import ToontownGlobals
from toontown.toonbase import ToontownBattleGlobals
import string
from toontown.toon import Toon
from direct.showbase import PythonUtil
from toontown.suit import DistributedSuitPlanner
from toontown.suit import DistributedBossCog
from otp.otpbase import OTPGlobals
from direct.distributed.ClockDelta import *
from otp.ai import MagicWordManager
from toontown.hood import ZoneUtil
from toontown.battle import Fanfare
from toontown.golf import GolfGlobals
from toontown.distributed import ToontownDistrictStats
from toontown.coderedemption import TTCodeRedemptionConsts
from toontown.rpc import AwardManagerConsts
if base.wantKarts:
from toontown.racing.KartDNA import *
from toontown.racing.KartShopGui import *
if (__debug__):
import pdb
class ToontownMagicWordManager(MagicWordManager.MagicWordManager):
notify = DirectNotifyGlobal.directNotify.newCategory('ToontownMagicWordManager')
neverDisable = 1
GameAvatarClass = DistributedToon.DistributedToon
def __init__(self, cr):
MagicWordManager.MagicWordManager.__init__(self, cr)
self.rogues = None
self.ruler = None
self.dbg_running_fast = 0
return
def generate(self):
MagicWordManager.MagicWordManager.generate(self)
self.accept('magicWord', self.b_setMagicWord)
def doLoginMagicWords(self):
MagicWordManager.MagicWordManager.doLoginMagicWords(self)
if base.config.GetBool('want-chat', 0):
self.d_setMagicWord('~chat', base.localAvatar.doId, 0)
if base.config.GetBool('want-run', 0) or base.config.GetBool('want-toontown-run', 0):
self.toggleRun()
if base.config.GetBool('immortal-mode', 0):
self.d_setMagicWord('~immortal', base.localAvatar.doId, 0)
mintFloor = base.config.GetInt('mint-floor', -1)
if mintFloor != -1:
self.d_setMagicWord('~mintFloor %s' % mintFloor, base.localAvatar.doId, 0)
mintId = base.config.GetInt('mint-id', -1)
if mintId != -1:
self.d_setMagicWord('~mint %s' % mintId, base.localAvatar.doId, 0)
autoRestock = base.config.GetInt('auto-restock', -1)
if autoRestock != -1:
self.d_setMagicWord('~autoRestock %s' % autoRestock, base.localAvatar.doId, 0)
autoRich = base.config.GetInt('auto-rich', -1)
if autoRich != -1:
self.d_setMagicWord('~autoRich %s' % autoRich, base.localAvatar.doId, 0)
autoResistanceRestock = base.config.GetInt('auto-resistance-restock', -1)
if autoResistanceRestock != -1:
self.d_setMagicWord('~autoResistanceRestock %s' % autoResistanceRestock, base.localAvatar.doId, 0)
autoRestockSOS = base.config.GetInt('auto-restock-sos', -1)
if autoRestockSOS != -1:
self.d_setMagicWord('~autoRestockSOS %s' % autoRestockSOS, base.localAvatar.doId, 0)
autoRestockPinkSlips = base.config.GetInt('auto-restock-pink-slips', -1)
if autoRestockPinkSlips != -1:
self.d_setMagicWord('~autoRestockPinkSlips %s' % autoRestockPinkSlips, base.localAvatar.doId, 0)
autoRestockSummons = base.config.GetInt('auto-restock-summons', -1)
if autoRestockSummons != -1:
self.d_setMagicWord('~autoRestockSummons %s' % autoRestockSummons, base.localAvatar.doId, 0)
paidStatus = base.config.GetString('force-paid-status', 'none')
if paidStatus != 'none':
self.d_setMagicWord('~setPaid %s' % choice(paidStatus == 'paid', 1, 0), localAvatar.doId, 0)
self.doConfigMagicWords()
def doConfigMagicWords(self):
autoMagicWords = base.config.GetString('auto-magic-words', '').split('|')
for command in autoMagicWords:
if command:
self.d_setMagicWord(command.strip(), base.localAvatar.doId, 0)
def disable(self):
self.ignore('magicWord')
if self.dbg_running_fast:
self.toggleRun()
MagicWordManager.MagicWordManager.disable(self)
def doMagicWord(self, word, avId, zoneId):
wordIs = Functor(self.wordIs, word)
if MagicWordManager.MagicWordManager.doMagicWord(self, word, avId, zoneId) == 1:
pass
elif wordIs('~fanfare'):
go = Fanfare.makeFanfareWithMessageImage(0, base.localAvatar, 1, "You just did a ~fanfare. Here's a rake.", Vec2(0, 0.2), 0.08, base.localAvatar.inventory.buttonLookup(1, 1), Vec3(0, 0, 0), 4)
Sequence(go[0], Func(go[1].show), LerpColorScaleInterval(go[1], duration=0.5, startColorScale=Vec4(1, 1, 1, 0), colorScale=Vec4(1, 1, 1, 1)), Wait(2), LerpColorScaleInterval(go[1], duration=0.5, startColorScale=Vec4(1, 1, 1, 1), colorScale=Vec4(1, 1, 1, 0)), Func(go[1].remove)).start()
elif wordIs('~endgame'):
print 'Requesting minigame abort...'
messenger.send('minigameAbort')
elif wordIs('~wingame'):
print 'Requesting minigame victory...'
messenger.send('minigameVictory')
elif wordIs('~walk'):
try:
fsm = base.cr.playGame.getPlace().fsm
fsm.forceTransition('walk')
except:
pass
elif wordIs('~movie'):
try:
fsm = base.cr.playGame.getPlace().fsm
fsm.forceTransition('movie')
except:
pass
elif wordIs('~sit'):
try:
base.cr.playGame.getPlace().fsm.request('sit')
except:
pass
elif wordIs('~rogues'):
suitname = None
if len(word) > 7:
suitname = word[7:].split(' ')[1]
self.rogues = RoguesGallery.RoguesGallery(suitname)
self.rogues.enter()
if suitname != None:
self.rogues.animate()
self.acceptOnce('mouse1', self.exit_rogues)
elif wordIs('~showPaths'):
for obj in self.cr.doId2do.values():
if isinstance(obj, DistributedSuitPlanner.DistributedSuitPlanner):
obj.showPaths()
place = base.cr.playGame.getPlace()
if hasattr(place, 'showPaths'):
place.showPaths()
elif wordIs('~hidePaths'):
for obj in self.cr.doId2do.values():
if isinstance(obj, DistributedSuitPlanner.DistributedSuitPlanner):
obj.hidePaths()
place = base.cr.playGame.getPlace()
if hasattr(place, 'hidePaths'):
place.hidePaths()
elif wordIs('~raceForever'):
base.raceForever = True
elif wordIs('~listen'):
base.localAvatar.garbleChat = 0
elif wordIs('~nochat') or wordIs('~chat') or wordIs('~superchat'):
base.localAvatar.garbleChat = 1
elif wordIs('~exec'):
ChatManager.ChatManager.execChat = 1
elif wordIs('~photoshoot'):
base.cr.playGame.hood.sky.hide()
base.cr.playGame.getPlace().loader.geom.hide()
base.win.setClearColor(VBase4(1, 1, 1, 1))
base.localAvatar.stopLookAroundNow()
base.localAvatar.stopBlink()
base.localAvatar.setNameVisible(0)
elif wordIs('~hideAttack'):
TownBattleAttackPanel.hideAttackPanel(1)
elif wordIs('~showAttack'):
TownBattleAttackPanel.hideAttackPanel(0)
elif wordIs('~collisions_on'):
base.localAvatar.collisionsOn()
elif wordIs('~collisions_off'):
base.localAvatar.collisionsOff()
elif wordIs('~battle_detect_off'):
from toontown.suit import DistributedSuit
DistributedSuit.ALLOW_BATTLE_DETECT = 0
elif wordIs('~battle_detect_on'):
from toontown.suit import DistributedSuit
DistributedSuit.ALLOW_BATTLE_DETECT = 1
elif wordIs('~battles'):
base.localAvatar.setWantBattles(not base.localAvatar.wantBattles)
if base.localAvatar.wantBattles:
response = 'battles ON'
else:
response = 'battles OFF'
self.setMagicWordResponse(response)
elif wordIs('~skipBattleMovie') or wordIs('~sbm'):
ToontownBattleGlobals.SkipMovie = not ToontownBattleGlobals.SkipMovie
if ToontownBattleGlobals.SkipMovie:
response = 'battle movies will be skipped'
else:
response = 'battle movies will be played'
self.setMagicWordResponse(response)
elif wordIs('~addCameraPosition'):
base.localAvatar.addCameraPosition()
elif wordIs('~removeCameraPosition'):
base.localAvatar.removeCameraPosition()
elif wordIs('~printCameraPosition'):
base.localAvatar.printCameraPosition(base.localAvatar.cameraIndex)
elif wordIs('~printCameraPositions'):
base.localAvatar.printCameraPositions()
elif wordIs('~worldCam') or wordIs('~wc'):
myCam = render.find('**/camera')
if not myCam.isEmpty():
camParent = myCam.getParent()
myCam.wrtReparentTo(render)
pos = myCam.getPos()
hpr = myCam.getHpr()
response = '(%.2f, %.2f, %.2f,) (%.2f, %.2f, %.2f)' % (pos[0],
pos[1],
pos[2],
hpr[0],
hpr[1],
hpr[2])
if not camParent.isEmpty():
myCam.wrtReparentTo(camParent)
self.setMagicWordResponse(response)
print response
elif wordIs('~sync'):
tm = base.cr.timeManager
if tm == None:
response = 'No TimeManager.'
self.setMagicWordResponse(response)
else:
tm.extraSkew = 0.0
skew = string.strip(word[5:])
if skew != '':
tm.extraSkew = float(skew)
globalClockDelta.clear()
tm.handleHotkey()
elif wordIs('~period'):
timeout = string.strip(word[7:])
if timeout != '':
seconds = int(timeout)
base.cr.stopPeriodTimer()
base.cr.resetPeriodTimer(seconds)
base.cr.startPeriodTimer()
if base.cr.periodTimerExpired:
response = 'Period timer has expired.'
elif base.cr.periodTimerStarted:
elapsed = globalClock.getFrameTime() - base.cr.periodTimerStarted
secondsRemaining = base.cr.periodTimerSecondsRemaining - elapsed
response = 'Period timer expires in %s seconds.' % int(secondsRemaining)
else:
response = 'Period timer not set.'
self.setMagicWordResponse(response)
elif wordIs('~net'):
if base.cr.networkPlugPulled():
base.cr.restoreNetworkPlug()
base.cr.startHeartbeat()
response = 'Network restored.'
else:
base.cr.pullNetworkPlug()
base.cr.stopHeartbeat()
response = 'Network disconnected.'
self.setMagicWordResponse(response)
elif wordIs('~lag'):
if not hasattr(base.cr, 'magicLag'):
base.cr.startDelay(0.1, 0.35)
base.cr.magicLag = None
response = 'Simulated Lag On'
else:
base.cr.stopDelay()
del base.cr.magicLag
response = 'Simulated Lag Off'
self.setMagicWordResponse(response)
elif wordIs('~endlessquietzone'):
base.endlessQuietZone = not base.endlessQuietZone
response = 'endless quiet zone %s' % choice(base.endlessQuietZone, 'ON', 'OFF')
self.setMagicWordResponse(response)
elif wordIs('~cogPageFull'):
base.localAvatar.suitPage.updateAllCogs(3)
elif wordIs('~mintId'):
args = word.split()
postName = 'mintIdOverride'
if len(args) < 2:
if bboard.has(postName):
bboard.remove(postName)
else:
try:
id = int(args[1])
foo = ToontownGlobals.MintNumRooms[id]
except:
pass
else:
bboard.post(postName, id)
elif wordIs('~mintRoom'):
args = word.split()
postName = 'mintRoom'
if len(args) < 2:
if bboard.has(postName):
bboard.remove(postName)
else:
try:
id = int(args[1])
except:
pass
else:
bboard.post(postName, id)
elif wordIs('~mintWarp'):
args = word.split()
if len(args) < 2:
self.setMagicWordResponse('Usage: ~mintWarp roomId')
return
try:
roomNum = int(args[1])
except:
self.setMagicWordResponse('roomId not found: %s' % args[1])
return
if not bboard.has('mint'):
self.setMagicWordResponse('not in a mint')
return
mint = bboard.get('mint')
if not mint.warpToRoom(roomNum):
self.setMagicWordResponse('invalid roomId or roomId not in this mint: %s' % args[1])
return
elif wordIs('~mintLayouts'):
from toontown.coghq import MintLayout
MintLayout.printAllCashbotInfo()
self.setMagicWordResponse('logged mint layouts')
elif wordIs('~edit'):
if not __dev__:
self.setMagicWordResponse('client not running in dev mode')
return
from otp.level import EditorGlobals
level = bboard.get(EditorGlobals.EditTargetPostName)
if level == None:
self.setMagicWordResponse('no level available for editing')
return
from toontown.coghq import DistributedInGameEditor
EditorGlobals.assertReadyToEdit()
editUsername = EditorGlobals.getEditUsername()
editors = base.cr.doFindAll('DistributedInGameEditor')
for e in editors:
if isinstance(e, DistributedInGameEditor.DistributedInGameEditor):
if e.getLevelDoId() == level.doId:
if e.editorIsLocalToon() or e.getEditUsername() == editUsername:
self.setMagicWordResponse("you ('%s') are already editing this level" % editUsername)
return
cmd = '~inGameEdit %s %s' % (level.doId, editUsername)
self.b_setMagicWord(cmd)
elif wordIs('~fshow'):
from toontown.coghq import DistributedFactory
factories = base.cr.doFindAll('DistributedFactory')
factory = None
for f in factories:
if isinstance(f, DistributedFactory.DistributedFactory):
factory = f
break
if factory is None:
self.setMagicWordResponse('factory not found')
return
factory.setColorZones(not factory.fColorZones)
elif wordIs('~fzone'):
args = word.split()
if len(args) < 2:
self.setMagicWordResponse('Usage: ~fzone <zoneNum>')
return
zoneId = int(args[1])
from toontown.coghq import DistributedFactory
factories = base.cr.doFindAll('DistributedFactory')
factory = None
for f in factories:
if isinstance(f, DistributedFactory.DistributedFactory):
factory = f
break
if factory is None:
self.setMagicWordResponse('factory not found')
return
factory.warpToZone(zoneId)
elif wordIs('~undead'):
try:
goons = base.cr.doFindAll('Goon')
for goon in goons:
goon.undead()
except:
self.notify.warning('Error in undead')
elif wordIs('~resyncGoons'):
try:
goons = base.cr.doFindAll('Goon')
for goon in goons:
goon.resync()
except:
self.notify.warning('Error in resyncing')
elif wordIs('~catalog'):
self.doCatalog(word)
elif wordIs('~petCam') and base.wantPets:
if hasattr(base, 'petCamPrevParent'):
base.cam.reparentTo(base.petCamPrevParent)
del base.petCamPrevParent
else:
petId = base.localAvatar.getPetId()
pet = self.cr.doId2do.get(petId)
if pet:
if not hasattr(pet, 'camNode'):
pet.camNode = pet.attachNewNode('camNode')
pet.camNode.setPos(0, 0, 2.5)
base.petCamPrevParent = base.cam.getParent()
base.cam.reparentTo(pet.camNode)
elif wordIs('~lockPet') and base.wantPets:
petId = base.localAvatar.getPetId()
pet = self.cr.doId2do.get(petId)
if pet:
if not pet.isLockedDown():
pet.lockPet()
elif wordIs('~unlockPet') and base.wantPets:
petId = base.localAvatar.getPetId()
pet = self.cr.doId2do.get(petId)
if pet:
if pet.isLockedDown():
pet.unlockPet()
elif wordIs('~resetPetTutorial') and base.wantPets:
base.localAvatar.setPetTutorialDone(False)
response = 'Pet Tutorial flag reset'
self.setMagicWordResponse(response)
elif wordIs('~bossBattle'):
self.doBossBattle(word)
elif wordIs('~RaceChat'):
base.localAvatar.chatMgr.chatInputSpeedChat.addKartRacingMenu()
elif wordIs('~BuyKart'):
if base.wantKarts:
def doShtikerLater(task):
base.localAvatar.addKartPage()
return 0
if base.localAvatar.hasKart():
response = 'Returning Kart %s' % base.localAvatar.getKartBodyType()
base.localAvatar.requestKartDNAFieldUpdate(KartDNA.bodyType, InvalidEntry)
self.setMagicWordResponse(response)
else:
base.localAvatar.requestKartDNAFieldUpdate(KartDNA.rimsType, getDefaultRim())
taskMgr.doMethodLater(1.0, doShtikerLater, 'doShtikerLater')
response = 'Kart %s has been purchased with body and accessory color %s.' % (word[9], getDefaultColor())
base.localAvatar.requestKartDNAFieldUpdate(KartDNA.bodyType, int(word[9]))
self.setMagicWordResponse(response)
else:
self.setMagicWordResponse('Enable wantKarts in Config.prc')
elif wordIs('~leaveRace'):
messenger.send('leaveRace')
elif wordIs('~kartParticles'):
b = ConfigVariableBool('want-kart-particles', 0)
b.setValue(not b)
elif wordIs('~gardenGame'):
messenger.send('gardenGame')
response = 'You must be on your estate'
self.setMagicWordResponse(response)
elif wordIs('~verboseState'):
base.localAvatar.verboseState()
elif wordIs('~golf'):
self.doGolf(word)
elif wordIs('~whiteList'):
base.localAvatar.chatMgr.chatInputSpeedChat.addWhiteList()
elif wordIs('~updateWhiteList'):
self.notify.info('Updating WhiteList')
base.whiteList.redownloadWhitelist()
elif wordIs('~noWhiteList'):
base.localAvatar.chatMgr.chatInputSpeedChat.removeWhiteList()
elif wordIs('~setPaid'):
args = word.split()
if len(args) > 1:
paid = int(args[1])
statusString = base.config.GetString('force-paid-status', 'none')
if paid:
paid = 1
if statusString != 'none':
if statusString == 'VELVET':
ConfigVariableString('force-paid-status').setValue('FULL')
elif statusString == 'unpaid':
ConfigVariableString('force-paid-status').setValue('paid')
base.cr.setIsPaid(1)
else:
paid = 0
if statusString != 'none':
if statusString == 'FULL':
ConfigVariableString('force-paid-status').setValue('VELVET')
elif statusString == 'paid':
ConfigVariableString('force-paid-status').setValue('unpaid')
base.cr.setIsPaid(0)
else:
return
elif wordIs('~party'):
self.doParty(word, avId, zoneId)
elif wordIs('~news'):
self.doNews(word, avId, zoneId)
elif wordIs('~bgui'):
if not hasattr(self, 'groupPanel'):
from toontown.toon import GroupPanel
self.groupPanel = GroupPanel.GroupPanel(base.localAvatar.boardingParty)
self.groupPanel.frame.show()
else:
self.groupPanel.frame.hide()
self.groupPanel.cleanup()
del self.groupPanel
elif wordIs('~generateOrder'):
args = word.split()
if len(args) > 1:
newOrder = int(args[1])
if newOrder >= 0 and newOrder <= 2:
datagram = PyDatagram.PyDatagram()
datagram.addUint16(MsgName2Id['CLIENT_CHANGE_GENERATE_ORDER'])
datagram.addUint32(newOrder)
base.cr.send(datagram)
response = 'changing generate order to %s' % newOrder
self.setMagicWordResponse(response)
else:
response = 'args: 0 default, 1 reversed, 2 shuffled'
self.setMagicWordResponse(response)
elif wordIs('~ruler'):
response = 'Each unit is equal to one foot'
self.setMagicWordResponse(response)
if self.ruler:
self.ruler.detachNode()
del self.ruler
self.ruler = loader.loadModel('phase_3/models/props/xyzAxis')
self.ruler.reparentTo(render)
self.ruler.setPos(base.localAvatar.getPos())
self.ruler.place()
elif wordIs('~toonIdTags'):
otherToons = base.cr.doFindAllOfType('DistributedToon')
if otherToons:
for toon in otherToons[0]:
toon.setNametagStyle(0)
messenger.send('nameTagShowAvId', [])
base.idTags = 1
elif wordIs('~code'):
args = word.split()
if len(args) > 1:
code = word[len(args[0]) + 1:]
base.codeRedemptionMgr.redeemCode(code, self._handleCodeRedemptionResponse)
response = 'sending code %s to server...' % code
else:
response = '~code <code>'
self.setMagicWordResponse(response)
return
def _handleCodeRedemptionResponse(self, result, awardMgrResult):
if not result:
msg = 'code redeemed'
else:
if result != TTCodeRedemptionConsts.RedeemErrors.AwardCouldntBeGiven:
errMsg = TTCodeRedemptionConsts.RedeemErrorStrings[result]
else:
errMsg = AwardManagerConsts.GiveAwardErrorStrings[awardMgrResult]
msg = 'code NOT redeemed (%s)' % (errMsg,)
base.localAvatar.setChatAbsolute(msg, CFSpeech | CFTimeout)
def doParty(self, word, av, zoneId):
args = word.split()
response = None
action = None
if len(args) == 1:
return
action = args[1]
if action == 'plan':
base.localAvatar.aboutToPlanParty = True
base.localAvatar.creatingNewPartyWithMagicWord = False
elif action == 'new':
base.localAvatar.aboutToPlanParty = False
base.localAvatar.creatingNewPartyWithMagicWord = True
elif action == 'start':
base.localAvatar.creatingNewPartyWithMagicWord = False
base.localAvatar.aboutToPlanParty = False
hoodId = ToontownGlobals.PartyHood
ToontownDistrictStats.refresh('shardInfoUpdated')
curShardTuples = base.cr.listActiveShards()
lowestPop = 100000000000000000L
shardId = None
for shardInfo in curShardTuples:
pop = shardInfo[2]
if pop < lowestPop:
lowestPop = pop
shardId = shardInfo[0]
if shardId == base.localAvatar.defaultShard:
shardId = None
base.cr.playGame.getPlace().requestLeave({'loader': 'safeZoneLoader',
'where': 'party',
'how': 'teleportIn',
'hoodId': hoodId,
'zoneId': -1,
'shardId': shardId,
'avId': -1})
elif action == 'unreleasedClient':
newVal = base.cr.partyManager.toggleAllowUnreleasedClient()
response = 'Allow Unreleased Client = %s' % newVal
elif action == 'showdoid':
newVal = base.cr.partyManager.toggleShowDoid()
response = 'show doid = %s' % newVal
elif action == 'debugGrid':
newVal = not ConfigVariableBool('show-debug-party-grid')
ConfigVariableBool('show-debug-party-grid').setValue(newVal)
response = 'Grid: %s; re-enter party to see changes.' % newVal
if response is not None:
self.setMagicWordResponse(response)
return
def doCatalog(self, word):
args = word.split()
if len(args) == 1:
return
elif args[1] == 'reload':
phone = base.cr.doFind('phone')
if phone and phone.phoneGui:
phone.phoneGui.reload()
response = 'Reloaded catalog screen'
else:
response = 'Phone is not active.'
elif args[1] == 'dump':
if len(args) <= 2:
response = 'Specify output filename.'
else:
from toontown.catalog import CatalogGenerator
cg = CatalogGenerator.CatalogGenerator()
cg.outputSchedule(args[2])
response = 'Catalog schedule written to file %s.' % args[2]
else:
return
self.setMagicWordResponse(response)
def toggleRun(self):
if self.dbg_running_fast:
self.dbg_running_fast = 0
OTPGlobals.ToonForwardSpeed = self.save_fwdspeed
OTPGlobals.ToonReverseSpeed = self.save_revspeed
OTPGlobals.ToonRotateSpeed = self.save_rotspeed
base.localAvatar.setWalkSpeedNormal()
else:
self.dbg_running_fast = 1
self.save_fwdspeed = OTPGlobals.ToonForwardSpeed
self.save_revspeed = OTPGlobals.ToonReverseSpeed
self.save_rotspeed = OTPGlobals.ToonRotateSpeed
OTPGlobals.ToonForwardSpeed = 60
OTPGlobals.ToonReverseSpeed = 30
OTPGlobals.ToonRotateSpeed = 100
base.localAvatar.setWalkSpeedNormal()
def requestTeleport(self, loaderId, whereId, hoodId, zoneId, avId):
place = base.cr.playGame.getPlace()
if loaderId == '':
loaderId = ZoneUtil.getBranchLoaderName(zoneId)
if whereId == '':
whereId = ZoneUtil.getToonWhereName(zoneId)
if hoodId == 0:
hoodId = place.loader.hood.id
if avId == 0:
avId = -1
place.fsm.forceTransition('teleportOut', [{'loader': loaderId,
'where': whereId,
'how': 'teleportIn',
'hoodId': hoodId,
'zoneId': zoneId,
'shardId': None,
'avId': avId}])
return
def exit_rogues(self):
self.rogues.exit()
del self.rogues
self.rogues = None
return
def identifyDistributedObjects(self, name):
result = []
lowerName = string.lower(name)
for obj in base.cr.doId2do.values():
className = obj.__class__.__name__
try:
name = obj.getName()
except:
name = className
if string.lower(name) == lowerName or string.lower(className) == lowerName or string.lower(className) == 'distributed' + lowerName:
result.append((name, obj))
return result
def getCSBitmask(self, str):
words = string.lower(str).split()
if len(words) == 0:
return None
invalid = ''
bitmask = BitMask32.allOff()
for w in words:
if w == 'wall':
bitmask |= ToontownGlobals.WallBitmask
elif w == 'floor':
bitmask |= ToontownGlobals.FloorBitmask
elif w == 'cam':
bitmask |= ToontownGlobals.CameraBitmask
elif w == 'catch':
bitmask |= ToontownGlobals.CatchBitmask
elif w == 'ghost':
bitmask |= ToontownGlobals.GhostBitmask
elif w == 'furniture':
bitmask |= ToontownGlobals.FurnitureSideBitmask | ToontownGlobals.FurnitureTopBitmask | ToontownGlobals.FurnitureDragBitmask
elif w == 'furnitureside':
bitmask |= ToontownGlobals.FurnitureSideBitmask
elif w == 'furnituretop':
bitmask |= ToontownGlobals.FurnitureTopBitmask
elif w == 'furnituredrag':
bitmask |= ToontownGlobals.FurnitureDragBitmask
elif w == 'pie':
bitmask |= ToontownGlobals.PieBitmask
else:
invalid += ' ' + w
if invalid:
self.setMagicWordResponse('Unknown CS keyword(s): %s' % invalid)
return bitmask
def getFontByName(self, fontname):
if fontname == 'toon':
return ToontownGlobals.getToonFont()
elif fontname == 'building':
return ToontownGlobals.getBuildingNametagFont()
elif fontname == 'minnie':
return ToontownGlobals.getMinnieFont()
elif fontname == 'suit':
return ToontownGlobals.getSuitFont()
else:
return MagicWordManager.MagicWordManager.getFontByName(self, fontname)
def doBossBattle(self, word):
args = word.split()
bossCog = None
for distObj in self.cr.doId2do.values():
if isinstance(distObj, DistributedBossCog.DistributedBossCog):
bossCog = distObj
break
response = None
if len(args) == 1:
pass
elif args[1] == 'safe':
if len(args) <= 2:
flag = not bossCog.localToonIsSafe
else:
flag = int(args[2])
bossCog.localToonIsSafe = flag
if flag:
response = 'LocalToon is now safe from boss attacks'
else:
response = 'LocalToon is now vulnerable to boss attacks'
elif args[1] == 'stun':
bossCog.stunAllGoons()
elif args[1] == 'destroy':
bossCog.destroyAllGoons()
elif args[1] == 'avatarEnter':
bossCog.d_avatarEnter()
response = 'called d_avatarEnter'
if response:
self.setMagicWordResponse(response)
return
def doGolf(self, word):
args = word.split()
response = None
if len(args) == 1:
pass
elif args[1] == 'debugBarrier':
golfHole = base.cr.doFind('DistributedGolfHole')
if golfHole:
if hasattr(golfHole, 'golfBarrier') and not golfHole.golfBarrier.isEmpty():
if golfHole.golfBarrier.isHidden():
golfHole.golfBarrier.show()
response = 'showing golf barrier'
else:
golfHole.golfBarrier.hide()
response = 'hiding golf barrier'
else:
response = 'no golf hole'
elif args[1] == 'contact':
messenger.send('ode toggle contacts')
elif args[1] == 'power':
if len(args) > 2:
base.golfPower = args[2]
response = 'setting power to %s' % args[2]
else:
base.golfPower = None
response = 'unsetting power'
elif args[1] == 'heading':
if len(args) > 2:
golfHole = base.cr.doFind('DistributedGolfHole')
if golfHole:
golfHole.doMagicWordHeading(args[2])
response = 'setting heading to %s' % args[2]
else:
response = 'need heading parameter'
elif args[1] == 'list':
response = ''
for holeId in GolfGlobals.HoleInfo:
if holeId < 18:
response += '%d: %s\n' % (holeId, GolfGlobals.getHoleName(holeId))
elif args[1] == 'list2':
response = ''
for holeId in GolfGlobals.HoleInfo:
if holeId >= 18:
response += '%d: %s\n' % (holeId, GolfGlobals.getHoleName(holeId))
if response:
self.setMagicWordResponse(response)
return
def doNews(self, word, av, zoneId):
args = word.split()
response = None
action = None
if len(args) == 1:
return
action = args[1]
if action == 'frame':
NametagGlobals.setMasterArrowsOn(0)
from toontown.shtiker import InGameNewsFrame
base.newsFrame = InGameNewsFrame.InGameNewsFrame()
base.newsFrame.activate()
response = 'putting in game news direct frame up'
elif action == 'snapshot':
response = localAvatar.newsPage.doSnapshot()
if response is not None:
self.setMagicWordResponse(response)
return