from direct.directnotify import DirectNotifyGlobal from direct.fsm import ClassicFSM from direct.fsm import State from direct.interval.IntervalGlobal import * from panda3d.core import * import random from otp.avatar import Emote from toontown.battle import DistributedBattle from toontown.battle import SuitBattleGlobals from toontown.battle.BattleBase import * from otp.nametag.NametagConstants import * from otp.nametag import NametagGlobals from toontown.suit import SuitDNA from toontown.toon import TTEmote from toontown.toonbase import ToontownGlobals class DistributedLevelBattle(DistributedBattle.DistributedBattle): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedLevelBattle') def __init__(self, cr): DistributedBattle.DistributedBattle.__init__(self, cr) self.levelRequest = None self.levelBattle = 1 return def setLevelDoId(self, levelDoId): self.levelDoId = levelDoId def setBattleCellId(self, battleCellId): self.battleCellId = battleCellId def doPlacement(levelList, self = self): self.levelRequest = None self.level = levelList[0] spec = self.level.getBattleCellSpec(self.battleCellId) self.level.requestReparent(self, spec['parentEntId']) self.setPos(spec['pos']) print 'spec = %s' % spec print 'h = %s' % spec.get('h') self.wrtReparentTo(render) return level = base.cr.doId2do.get(self.levelDoId) if level is None: self.notify.warning('level %s not in doId2do yet, battle %s will be mispositioned.' % self.levelDoId, self.doId) self.levelRequest = self.cr.relatedObjectMgr.requestObjects([self.levelDoId], doPlacement) else: doPlacement([level]) return def setPosition(self, *args): pass def setInitialSuitPos(self, x, y, z): self.initialSuitPos = Point3(x, y, z) def disable(self): if self.hasLocalToon(): self.unlockLevelViz() if self.levelRequest is not None: self.cr.relatedObjectMgr.abortRequest(self.levelRequest) self.levelRequest = None DistributedBattle.DistributedBattle.disable(self) return def delete(self): self.ignoreAll() DistributedBattle.DistributedBattle.delete(self) def handleBattleBlockerCollision(self): messenger.send(self.getCollisionName(), [None]) return def lockLevelViz(self): level = base.cr.doId2do.get(self.levelDoId) if level: level.lockVisibility(zoneId=self.zoneId) else: self.notify.warning("lockLevelViz: couldn't find level %s" % self.levelDoId) def unlockLevelViz(self): level = base.cr.doId2do.get(self.levelDoId) if level: level.unlockVisibility() else: self.notify.warning("unlockLevelViz: couldn't find level %s" % self.levelDoId) def onWaitingForJoin(self): self.lockLevelViz() def announceCrateReward(self): track = Sequence() for i, message in enumerate(TTLocalizer.CrateRewardMessages): track.append(Func(base.localAvatar.setSystemMessage, 0, message)) track.append(Wait(1.5)) track.start() def __faceOff(self, ts, name, callback): if len(self.suits) == 0: self.notify.warning('__faceOff(): no suits.') return if len(self.toons) == 0: self.notify.warning('__faceOff(): no toons.') return toon = self.toons[0] point = self.toonPoints[0][0] toonPos = point[0] toonHpr = VBase3(point[1], 0.0, 0.0) p = toon.getPos(self) toon.setPos(self, p[0], p[1], 0.0) toon.setShadowHeight(0) if len(self.suits) == 1: leaderIndex = 0 elif self.bossBattle == 1: for suit in self.suits: if suit.boss: leaderIndex = self.suits.index(suit) break else: maxTypeNum = -1 for suit in self.suits: suitTypeNum = SuitDNA.getSuitType(suit.dna.name) if maxTypeNum < suitTypeNum: maxTypeNum = suitTypeNum leaderIndex = self.suits.index(suit) delay = FACEOFF_TAUNT_T suitTrack = Parallel() suitLeader = None for suit in self.suits: suit.setState('Battle') suitIsLeader = 0 oneSuitTrack = Sequence() oneSuitTrack.append(Func(suit.loop, 'neutral')) oneSuitTrack.append(Func(suit.headsUp, toonPos)) if self.suits.index(suit) == leaderIndex: suitLeader = suit suitIsLeader = 1 if self.bossBattle == 1 and self.levelDoId in base.cr.doId2do: level = base.cr.doId2do[self.levelDoId] if suit.boss: taunt = level.getBossTaunt() else: taunt = level.getBossBattleTaunt() else: taunt = SuitBattleGlobals.getFaceoffTaunt(suit.getStyleName(), suit.doId) oneSuitTrack.append(Func(suit.setChatAbsolute, taunt, CFSpeech | CFTimeout)) destPos, destHpr = self.getActorPosHpr(suit, self.suits) oneSuitTrack.append(Wait(delay)) if suitIsLeader == 1: oneSuitTrack.append(Func(suit.clearChat)) oneSuitTrack.append(self.createAdjustInterval(suit, destPos, destHpr)) suitTrack.append(oneSuitTrack) suitHeight = suitLeader.getHeight() suitOffsetPnt = Point3(0, 0, suitHeight) toonTrack = Parallel() for toon in self.toons: oneToonTrack = Sequence() destPos, destHpr = self.getActorPosHpr(toon, self.toons) oneToonTrack.append(Wait(delay)) oneToonTrack.append(self.createAdjustInterval(toon, destPos, destHpr, toon=1, run=1)) toonTrack.append(oneToonTrack) if self.hasLocalToon(): MidTauntCamHeight = suitHeight * 0.66 MidTauntCamHeightLim = suitHeight - 1.8 if MidTauntCamHeight < MidTauntCamHeightLim: MidTauntCamHeight = MidTauntCamHeightLim TauntCamY = 18 TauntCamX = 0 TauntCamHeight = random.choice((MidTauntCamHeight, 1, 11)) camTrack = Sequence() camTrack.append(Func(camera.reparentTo, suitLeader)) camTrack.append(Func(base.camLens.setMinFov, self.camFOFov/(4./3.))) camTrack.append(Func(camera.setPos, TauntCamX, TauntCamY, TauntCamHeight)) camTrack.append(Func(camera.lookAt, suitLeader, suitOffsetPnt)) camTrack.append(Wait(delay)) camTrack.append(Func(base.camLens.setMinFov, self.camFov/(4./3.))) camTrack.append(Func(camera.wrtReparentTo, self)) camTrack.append(Func(camera.setPos, self.camFOPos)) camTrack.append(Func(camera.lookAt, suit)) mtrack = Parallel(suitTrack, toonTrack) if self.hasLocalToon(): NametagGlobals.setMasterArrowsOn(0) mtrack = Parallel(mtrack, camTrack) done = Func(callback) track = Sequence(mtrack, done, name=name) track.start(ts) self.storeInterval(track, name) return def enterFaceOff(self, ts): if len(self.toons) > 0 and base.localAvatar == self.toons[0]: Emote.globalEmote.disableAll(self.toons[0], 'dbattlebldg, enterFaceOff') self.delayDeleteMembers() self.__faceOff(ts, self.faceOffName, self.__handleFaceOffDone) def __handleFaceOffDone(self): self.notify.debug('FaceOff done') self.d_faceOffDone(base.localAvatar.doId) def exitFaceOff(self): self.notify.debug('exitFaceOff()') if len(self.toons) > 0 and base.localAvatar == self.toons[0]: Emote.globalEmote.releaseAll(self.toons[0], 'dbattlebldg exitFaceOff') self.clearInterval(self.faceOffName) self._removeMembersKeep() def __playReward(self, ts, callback): toonTracks = Parallel() for toon in self.toons: toonTracks.append(Sequence(Func(toon.loop, 'victory'), Wait(FLOOR_REWARD_TIMEOUT), Func(toon.loop, 'neutral'))) name = self.uniqueName('floorReward') track = Sequence(toonTracks, Func(callback), name=name) camera.setPos(0, 0, 1) camera.setHpr(180, 10, 0) self.storeInterval(track, name) track.start(ts) def enterReward(self, ts): self.notify.info('enterReward()') self.disableCollision() self.delayDeleteMembers() self.__playReward(ts, self.__handleFloorRewardDone) def __handleFloorRewardDone(self): pass def exitReward(self): self.notify.info('exitReward()') self.clearInterval(self.uniqueName('floorReward')) self._removeMembersKeep() NametagGlobals.setMasterArrowsOn(1) for toon in self.toons: toon.startSmooth()