historical/toontown-classic.git/toontown/toon/DistributedNPCToon.py

246 lines
10 KiB
Python
Raw Normal View History

2024-01-16 11:20:27 -06:00
from panda3d.core import *
from DistributedNPCToonBase import *
from toontown.quest import QuestParser
from toontown.quest import QuestChoiceGui
from toontown.quest import TrackChoiceGui
from toontown.toonbase import TTLocalizer
from toontown.hood import ZoneUtil
from toontown.toontowngui import TeaserPanel
ChoiceTimeout = 20
class DistributedNPCToon(DistributedNPCToonBase):
def __init__(self, cr):
DistributedNPCToonBase.__init__(self, cr)
self.curQuestMovie = None
self.questChoiceGui = None
self.trackChoiceGui = None
self.cameraLerp = None
return
def delayDelete(self):
DistributedNPCToonBase.delayDelete(self)
if self.curQuestMovie:
curQuestMovie = self.curQuestMovie
self.curQuestMovie = None
curQuestMovie.timeout(fFinish=1)
curQuestMovie.cleanup()
return
def disable(self):
self.cleanupMovie()
DistributedNPCToonBase.disable(self)
def cleanupMovie(self):
self.clearChat()
self.ignore('chooseQuest')
if self.questChoiceGui:
self.questChoiceGui.destroy()
self.questChoiceGui = None
self.ignore(self.uniqueName('doneChatPage'))
if self.curQuestMovie:
self.curQuestMovie.timeout(fFinish=1)
self.curQuestMovie.cleanup()
self.curQuestMovie = None
if self.trackChoiceGui:
self.trackChoiceGui.destroy()
self.trackChoiceGui = None
return
def allowedToTalk(self):
if base.cr.isPaid():
return True
place = base.cr.playGame.getPlace()
myHoodId = ZoneUtil.getCanonicalHoodId(place.zoneId)
if hasattr(place, 'id'):
myHoodId = place.id
if myHoodId in (ToontownGlobals.ToontownCentral,
ToontownGlobals.MyEstate,
ToontownGlobals.GoofySpeedway,
ToontownGlobals.Tutorial):
return True
return False
def handleCollisionSphereEnter(self, collEntry):
if self.allowedToTalk():
base.cr.playGame.getPlace().fsm.request('quest', [self])
self.sendUpdate('avatarEnter', [])
self.nametag3d.setDepthTest(0)
self.nametag3d.setBin('fixed', 0)
else:
place = base.cr.playGame.getPlace()
if place:
place.fsm.request('stopped')
self.dialog = TeaserPanel.TeaserPanel(pageName='quests', doneFunc=self.handleOkTeaser)
def handleOkTeaser(self):
self.dialog.destroy()
del self.dialog
place = base.cr.playGame.getPlace()
if place:
place.fsm.request('walk')
def finishMovie(self, av, isLocalToon, elapsedTime):
self.cleanupMovie()
av.startLookAround()
self.startLookAround()
self.detectAvatars()
self.initPos()
if isLocalToon:
if self.cameraLerp:
self.cameraLerp.finish()
self.cameraLerp = None
base.localAvatar.posCamera(0, 0)
base.cr.playGame.getPlace().setState('walk')
self.sendUpdate('setMovieDone', [])
self.nametag3d.clearDepthTest()
self.nametag3d.clearBin()
def setupCamera(self, mode):
camera.wrtReparentTo(render)
if mode == NPCToons.QUEST_MOVIE_QUEST_CHOICE or mode == NPCToons.QUEST_MOVIE_TRACK_CHOICE:
quat = Quat()
quat.setHpr((155, -2, 0))
self.cameraLerp = camera.posQuatInterval(1, Point3(5, 9, self.getHeight() - 0.5), quat, other=self, blendType='easeOut', name=self.uniqueName('lerpCamera'))
self.cameraLerp.start()
else:
quat = Quat()
quat.setHpr((-150, -2, 0))
self.cameraLerp = camera.posQuatInterval(1, Point3(-5, 9, self.getHeight() - 0.5), quat, other=self, blendType='easeOut', name=self.uniqueName('lerpCamera'))
self.cameraLerp.start()
def setMovie(self, mode, npcId, avId, quests, timestamp):
timeStamp = ClockDelta.globalClockDelta.localElapsedTime(timestamp)
isLocalToon = avId == base.localAvatar.doId
if mode == NPCToons.QUEST_MOVIE_CLEAR:
self.cleanupMovie()
return
if mode == NPCToons.QUEST_MOVIE_TIMEOUT:
self.cleanupMovie()
if isLocalToon:
self.freeAvatar()
self.setPageNumber(0, -1)
self.clearChat()
self.startLookAround()
self.detectAvatars()
return
av = base.cr.doId2do.get(avId)
if av is None:
self.notify.warning('Avatar %d not found in doId' % avId)
return
if mode == NPCToons.QUEST_MOVIE_REJECT:
rejectString = Quests.chooseQuestDialogReject()
rejectString = Quests.fillInQuestNames(rejectString, avName=av._name)
self.setChatAbsolute(rejectString, CFSpeech | CFTimeout)
if isLocalToon:
base.localAvatar.posCamera(0, 0)
base.cr.playGame.getPlace().setState('walk')
return
if mode == NPCToons.QUEST_MOVIE_TIER_NOT_DONE:
rejectString = Quests.chooseQuestDialogTierNotDone()
rejectString = Quests.fillInQuestNames(rejectString, avName=av._name)
self.setChatAbsolute(rejectString, CFSpeech | CFTimeout)
if isLocalToon:
base.localAvatar.posCamera(0, 0)
base.cr.playGame.getPlace().setState('walk')
return
self.setupAvatars(av)
fullString = ''
toNpcId = None
if mode == NPCToons.QUEST_MOVIE_COMPLETE:
questId, rewardId, toNpcId = quests
scriptId = 'quest_complete_' + str(questId)
if QuestParser.questDefined(scriptId):
self.curQuestMovie = QuestParser.NPCMoviePlayer(scriptId, av, self)
self.curQuestMovie.play()
return
if isLocalToon:
self.setupCamera(mode)
greetingString = Quests.chooseQuestDialog(questId, Quests.GREETING)
if greetingString:
fullString += greetingString + '\x07'
fullString += Quests.chooseQuestDialog(questId, Quests.COMPLETE) + '\x07'
if rewardId:
fullString += Quests.getReward(rewardId).getString()
leavingString = Quests.chooseQuestDialog(questId, Quests.LEAVING)
if leavingString:
fullString += '\x07' + leavingString
elif mode == NPCToons.QUEST_MOVIE_QUEST_CHOICE_CANCEL:
fullString = TTLocalizer.QuestMovieQuestChoiceCancel
elif mode == NPCToons.QUEST_MOVIE_TRACK_CHOICE_CANCEL:
fullString = TTLocalizer.QuestMovieTrackChoiceCancel
elif mode == NPCToons.QUEST_MOVIE_INCOMPLETE:
questId, completeStatus, toNpcId = quests
scriptId = 'quest_incomplete_' + str(questId)
if QuestParser.questDefined(scriptId):
if self.curQuestMovie:
self.curQuestMovie.timeout()
self.curQuestMovie.cleanup()
self.curQuestMovie = None
self.curQuestMovie = QuestParser.NPCMoviePlayer(scriptId, av, self)
self.curQuestMovie.play()
return
if isLocalToon:
self.setupCamera(mode)
greetingString = Quests.chooseQuestDialog(questId, Quests.GREETING)
if greetingString:
fullString += greetingString + '\x07'
fullString += Quests.chooseQuestDialog(questId, completeStatus)
leavingString = Quests.chooseQuestDialog(questId, Quests.LEAVING)
if leavingString:
fullString += '\x07' + leavingString
elif mode == NPCToons.QUEST_MOVIE_ASSIGN:
questId, rewardId, toNpcId = quests
scriptId = 'quest_assign_' + str(questId)
if QuestParser.questDefined(scriptId):
if self.curQuestMovie:
self.curQuestMovie.timeout()
self.curQuestMovie.cleanup()
self.curQuestMovie = None
self.curQuestMovie = QuestParser.NPCMoviePlayer(scriptId, av, self)
self.curQuestMovie.play()
return
if isLocalToon:
self.setupCamera(mode)
fullString += Quests.chooseQuestDialog(questId, Quests.QUEST)
leavingString = Quests.chooseQuestDialog(questId, Quests.LEAVING)
if leavingString:
fullString += '\x07' + leavingString
elif mode == NPCToons.QUEST_MOVIE_QUEST_CHOICE:
if isLocalToon:
self.setupCamera(mode)
self.setChatAbsolute(TTLocalizer.QuestMovieQuestChoice, CFSpeech)
if isLocalToon:
self.acceptOnce('chooseQuest', self.sendChooseQuest)
self.questChoiceGui = QuestChoiceGui.QuestChoiceGui()
self.questChoiceGui.setQuests(quests, npcId, ChoiceTimeout)
return
elif mode == NPCToons.QUEST_MOVIE_TRACK_CHOICE:
if isLocalToon:
self.setupCamera(mode)
tracks = quests
self.setChatAbsolute(TTLocalizer.QuestMovieTrackChoice, CFSpeech)
if isLocalToon:
self.acceptOnce('chooseTrack', self.sendChooseTrack)
self.trackChoiceGui = TrackChoiceGui.TrackChoiceGui(tracks, ChoiceTimeout)
return
fullString = Quests.fillInQuestNames(fullString, avName=av._name, fromNpcId=npcId, toNpcId=toNpcId)
self.acceptOnce(self.uniqueName('doneChatPage'), self.finishMovie, extraArgs=[av, isLocalToon])
self.clearChat()
self.setPageChat(avId, 0, fullString, 1)
return
def sendChooseQuest(self, questId):
if self.questChoiceGui:
self.questChoiceGui.destroy()
self.questChoiceGui = None
self.sendUpdate('chooseQuest', [questId])
return
def sendChooseTrack(self, trackId):
if self.trackChoiceGui:
self.trackChoiceGui.destroy()
self.trackChoiceGui = None
self.sendUpdate('chooseTrack', [trackId])
return