oldschool-toontown/toontown/coghq/DistributedMazeAI.py

88 lines
3.3 KiB
Python
Raw Normal View History

2019-11-02 17:27:54 -05:00
from otp.level import DistributedEntityAI
from . import DistributedBarrelBaseAI
2019-11-02 17:27:54 -05:00
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.ClockDelta import globalClockDelta
from direct.task import Task
class DistributedMazeAI(DistributedEntityAI.DistributedEntityAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedMazeAI')
def __init__(self, level, entId):
DistributedEntityAI.DistributedEntityAI.__init__(self, level, entId)
self.roomDoId = level.doId
self.GameDuration = 60.0
self.DamageOnFailure = 20
self.finishedList = []
def delete(self):
self.removeAllTasks()
DistributedEntityAI.DistributedEntityAI.delete(self)
def announceGenerate(self):
DistributedEntityAI.DistributedEntityAI.announceGenerate(self)
self.mazeEndTimeTaskName = self.uniqueName('mazeEndTime')
def getRoomDoId(self):
return self.roomDoId
def setClientTriggered(self):
if not hasattr(self, 'gameStartTime'):
self.gameStartTime = globalClock.getRealTime()
self.b_setGameStart(globalClockDelta.localToNetworkTime(self.gameStartTime))
def b_setGameStart(self, timestamp):
self.d_setGameStart(timestamp)
self.setGameStart(timestamp)
def d_setGameStart(self, timestamp):
self.notify.debug('BASE: Sending setGameStart')
self.sendUpdate('setGameStart', [timestamp])
def setGameStart(self, timestamp):
self.notify.debug('BASE: setGameStart')
self.GameDuration = 35.0 + self.numSections * 15.0
self.prepareForGameStartOrRestart()
def prepareForGameStartOrRestart(self):
self.doMethodLater(self.GameDuration, self.gameEndingTimeHit, self.mazeEndTimeTaskName)
def setFinishedMaze(self):
senderId = self.air.getAvatarIdFromSender()
if senderId not in self.finishedList:
toon = simbase.air.doId2do.get(senderId)
if toon:
if len(self.finishedList) < 1:
toon.toonUp(200.0)
else:
toon.toonUp(20.0)
lastToon = 0
if hasattr(self, 'level'):
numToons = len(self.level.presentAvIds)
if numToons == len(self.finishedList) + 1:
lastToon = 1
self.sendUpdate('toonFinished', [senderId, len(self.finishedList), lastToon])
self.finishedList.append(senderId)
def gameEndingTimeHit(self, task):
roomId = self.getLevelDoId()
room = simbase.air.doId2do.get(roomId)
if room:
playerIds = room.presentAvIds
for avId in playerIds:
av = simbase.air.doId2do.get(avId)
if av and avId not in self.finishedList:
self.finishedList.append(avId)
self.sendUpdate('setGameOver', [])
def damageMe(self):
senderId = self.air.getAvatarIdFromSender()
av = simbase.air.doId2do.get(senderId)
roomId = self.getLevelDoId()
room = simbase.air.doId2do.get(roomId)
if room:
playerIds = room.presentAvIds
if av and senderId in playerIds:
av.takeDamage(self.DamageOnFailure, quietly=0)
room.sendUpdate('forceOuch', [self.DamageOnFailure])