This commit is contained in:
Daniel 2015-03-13 17:02:23 +02:00
commit 528817b1d3
8 changed files with 80 additions and 294 deletions

View file

@ -47,14 +47,15 @@ class CatalogRentalItem(CatalogItem.CatalogItem):
return TTLocalizer.RentalTypeName
def recordPurchase(self, avatar, optional):
self.notify.debug('rental -- record purchase')
if avatar:
self.notify.debug('rental -- has avatar')
estate = simbase.air.estateManager._lookupEstate(avatar)
self.notify.debug('rental -- has avater')
estate = simbase.air.estateManager._lookupEstate(avatar.doId)
if estate:
self.notify.debug('rental -- has estate')
estate.rentItem(self.typeIndex, self.duration)
else:
self.notify.warning('rental -- something not there')
self.notify.debug('rental -- something not there')
return ToontownGlobals.P_ItemAvailable
def getPicture(self, avatar):
@ -105,9 +106,6 @@ class CatalogRentalItem(CatalogItem.CatalogItem):
dg.addUint16(self.duration)
dg.addUint16(self.typeIndex)
def getDeliveryTime(self):
return 1
def isRental(self):
return 1
@ -132,4 +130,3 @@ def getAllRentalItems():
list.append(CatalogRentalItem(rentalType, 2880, 1000))
return list

View file

@ -1,102 +1,57 @@
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.ClockDelta import *
from toontown.minigame import CannonGameGlobals
from toontown.toonbase import ToontownGlobals
import CannonGlobals
class DistributedCannonAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedCannonAI")
def __init__(self, air):
DistributedObjectAI.__init__(self, air)
self.estateId = 0
self.targetId = 0
self.posHpr = (0, 0, 0, 0, 0, 0)
self.bumperPos = ToontownGlobals.PinballCannonBumperInitialPos
self.active = 0
self.avId = 0
def setEstateId(self, estateId):
self.estateId = estateId
def getEstateId(self):
return self.estateId
def setEstateId(self, todo0):
pass
def setTargetId(self, targetId):
self.targetId = targetId
def getTargetId(self):
return self.targetId
def setTargetId(self, todo0):
pass
def setPosHpr(self, x, y, z, h, p, r):
self.posHpr = (x, y, z, h, p, r)
def getPosHpr(self):
return self.posHpr
def setPosHpr(self, todo0, todo1, todo2, todo3, todo4, todo5):
pass
def setActive(self, active):
self.active = active
self.sendUpdate("setActiveState", [active])
def setActive(self, todo0):
pass
def setActiveState(self, todo0):
pass
def requestEnter(self):
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if not av:
return
if not self.avId:
self.avId = avId
self.d_setMovie(CannonGlobals.CANNON_MOVIE_LOAD)
self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId])
else:
self.air.writeServerEvent('suspicious', avId, 'DistributedCannonAI.requestEnter cannon already occupied')
self.notify.warning('requestEnter() - cannon already occupied')
def setMovie(self, mode, avId, extraInfo):
self.avId = avId
self.sendUpdate('setMovie', [mode, avId, extraInfo])
def __handleUnexpectedExit(self, avId):
self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly')
self.__doExit()
def __doExit(self, movie=CannonGlobals.CANNON_MOVIE_FORCE_EXIT):
self.ignore(self.air.getAvatarExitEvent(self.avId))
self.d_setMovie(movie)
self.avId = 0
pass
def requestExit(self):
pass
def d_setMovie(self, movie):
self.sendUpdate("setMovie", [movie, self.avId])
def setMovie(self, todo0, todo1):
pass
def setCannonPosition(self, zRot, angle):
self.sendUpdate("updateCannonPosition", [self.avId, zRot, angle])
def setCannonPosition(self, todo0, todo1):
pass
def setCannonLit(self, zRot, angle):
avId = self.air.getAvatarIdFromSender()
if avId != self.avId:
return
def setCannonLit(self, todo0, todo1):
pass
fireTime = CannonGameGlobals.FUSE_TIME
self.sendUpdate('setCannonWillFire', [avId, fireTime, zRot, angle, globalClockDelta.getRealNetworkTime()])
def setFired(self):
pass
def setLanded(self):
self.__doExit(CannonGlobals.CANNON_MOVIE_CLEAR)
self.sendUpdate('setCannonExit', [self.avId])
pass
def updateCannonPosition(self, todo0, todo1, todo2):
pass
def setCannonWillFire(self, todo0, todo1, todo2, todo3, todo4):
pass
def setCannonExit(self, todo0):
pass
def requestBumperMove(self, x, y, z):
self.bumperPos = (x, y, z)
self.sendUpdate('setCannonBumperPos', self.getCannonBumperPos())
def requestBumperMove(self, todo0, todo1, todo2):
pass
def setCannonBumperPos(self, todo0, todo1, todo2):
pass
def getCannonBumperPos(self):
return self.bumperPos

View file

@ -1,5 +1,7 @@
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.PyDatagramIterator import *
from direct.distributed.PyDatagram import *
from toontown.toonbase import ToontownGlobals
import HouseGlobals
import time
@ -147,82 +149,6 @@ class GardenManager:
return packGardenData(NULL_FLOWERS + NULL_TREES, NULL_STATUARY, False)
return packGardenData(g.flowersData + g.treesData, g.statuaryIndex)
class Rental:
def __init__(self, estate):
self.estate = estate
self.objects = set()
def destroy(self):
del self.estate
for object in self.objects:
if not object.isDeleted():
object.requestDelete()
taskMgr.remove(object.uniqueName('delete'))
self.objects = set()
class CannonRental(Rental):
def generateObjects(self):
target = DistributedTargetAI(self.estate.air)
target.generateWithRequired(self.estate.zoneId)
for drop in CannonGlobals.cannonDrops:
cannon = DistributedCannonAI(self.estate.air)
cannon.setEstateId(self.estate.doId)
cannon.setTargetId(target.doId)
cannon.setPosHpr(*drop)
cannon.generateWithRequired(self.estate.zoneId)
self.objects.add(cannon)
self.generateTreasures()
self.estate.b_setClouds(1)
def destroy(self):
self.estate.b_setClouds(0)
Rental.destroy(self)
def generateTreasures(self):
doIds = []
z = 35
for i in xrange(20):
x = random.randint(100, 300) - 200
y = random.randint(100, 300) - 200
treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 9, x, y, z)
treasure.generateWithRequired(self.estate.zoneId)
self.objects.add(treasure)
doIds.append(treasure.doId)
self.estate.sendUpdate("setTreasureIds", [doIds])
def grabAttempt(self, avId, treasureId):
av = self.estate.air.doId2do.get(avId)
if av == None:
self.estate.air.writeServerEvent('suspicious', avId, 'TreasurePlannerAI.grabAttempt unknown avatar')
self.estate.notify.warning('avid: %s does not exist' % avId)
return
treasure = self.estate.air.doId2do.get(treasureId)
if self.validAvatar(av):
treasure.d_setGrab(avId)
self.deleteTreasureSoon(treasure)
else:
treasure.d_setReject()
def deleteTreasureSoon(self, treasure):
taskName = treasure.uniqueName('delete')
taskMgr.doMethodLater(5, self.__deleteTreasureNow, taskName, extraArgs=(treasure, taskName))
def __deleteTreasureNow(self, treasure, taskName):
treasure.requestDelete()
def validAvatar(self, av):
if av.getMaxHp() == av.getHp():
return 0
av.toonUp(3)
return 1
class DistributedEstateAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedEstateAI")
def __init__(self, air):
@ -235,7 +161,7 @@ class DistributedEstateAI(DistributedObjectAI):
self.dawnTime = 0
self.lastEpochTimestamp = 0
self.rentalTimestamp = 0
self.houses = [None] * 6
self.houses = [None, None, None, None, None, None]
self.rentalType = 0
self.rentalHandle = None
self.pond = None
@ -259,7 +185,6 @@ class DistributedEstateAI(DistributedObjectAI):
target.generateWithRequired(self.zoneId)
self.targets.append(target)
spot = DistributedFishingSpotAI(self.air)
spot.setPondDoId(self.pond.getDoId())
spot.setPosHpr(49.1029, -124.805, 0.344704, 90, 0, 0)
@ -290,10 +215,9 @@ class DistributedEstateAI(DistributedObjectAI):
DistributedObjectAI.announceGenerate(self)
for index, garden in self.__pendingGardens.items():
started = garden[0]
if started:
self.gardenManager.handleSingleGarden(self.toons[index], garden[1:])
self.gardenManager.handleSingleGarden(self.toons[index], garden[1:])
self.placeStarterGarden(self.toons[index])
self.__pendingGardens = {}
self.placeStarterGarden(100000001) #temporary
def destroy(self):
for house in self.houses:
@ -377,7 +301,7 @@ class DistributedEstateAI(DistributedObjectAI):
def getDecorData(self):
return self.decorData
def setLastEpochTimeStamp(self, last): #how do I do this
def setLastEpochTimeStamp(self, last):
self.lastEpochTimestamp = last
def d_setLastEpochTimeStamp(self, last):
@ -397,56 +321,17 @@ class DistributedEstateAI(DistributedObjectAI):
self.sendUpdate('setRentalTimeStamp', [rental])
def b_setRentalTimeStamp(self, rental):
self.b_setRentalTimeStamp(rental)
self.setRentalTimeStamp(self, rental)
self.b_setRentalTimeStamp(self, rental)
def getRentalTimeStamp(self):
return self.rentalTimestamp
def b_setRentalType(self, type):
self.d_setRentalType(type)
self.setRentalType(type)
def d_setRentalType(self, type):
self.sendUpdate("setRentalType", [type])
def setRentalType(self, type):
expirestamp = self.getRentalTimeStamp()
if expirestamp == 0:
expire = 0
else:
expire = int(expirestamp - time.time())
if expire < 0:
self.rentalType = 0
self.d_setRentalType(0)
self.b_setRentalTimeStamp(0)
else:
if self.rentalType == type:
return
self.rentalType = type
if self.rentalHandle:
self.rentalHandle.destroy()
self.rentalHandle = None
if self.rentalType == ToontownGlobals.RentalCannon:
self.rentalHandle = CannonRental(self)
else:
self.notify.warning('Unknown rental %s' % self.rentalType)
return
self.rentalHandle.generateObjects()
def setRentalType(self, todo0):
pass
def getRentalType(self):
return self.rentalType
def rentItem(self, rentType, duration):
self.rentalType = rentType
self.b_setRentalTimeStamp(time.time() + duration * 60)
self.b_setRentalType(rentType)
return 0
def setSlot0ToonId(self, id):
self.toons[0] = id
@ -696,7 +581,6 @@ class DistributedEstateAI(DistributedObjectAI):
av = self.air.doId2do.get(avId)
if not av:
return
av.b_setGardenStarted(1)
self.notify.info('placeStarterGarden %d' % avId)
self.gardenManager.placeGarden(avId)
self.d_updateGarden()

View file

@ -7,15 +7,27 @@ class DistributedLawnDecorAI(DistributedNodeAI):
def setPlot(self, todo0):
pass
def getPlot(self, todo0):
pass
def setHeading(self, todo0):
pass
def getHeading(self, todo0):
pass
def setPosition(self, todo0, todo1, todo2):
pass
def getPosition(self, todo0, todo1, todo2):
pass
def setOwnerIndex(self, todo0):
pass
def getOwnerIndex(self, todo1):
pass
def plotEntered(self):
pass

View file

@ -1,88 +1,30 @@
from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
import CannonGlobals
class DistributedTargetAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedTargetAI")
def __init__(self, air):
DistributedObjectAI.__init__(self, air)
self.enabled = 0
self.highscore = 0
self.scoreDict = {}
self.__newGame()
def announceGenerate(self):
DistributedObjectAI.announceGenerate(self)
taskMgr.doMethodLater(10, self.__startNewGame, self.taskName('newGame'))
def __newGame(self):
self.power = 1
self.time = CannonGlobals.CANNON_TIMEOUT
def getPosition(self):
return (0, 0, 40)
def getState(self):
return self.enabled, 2**self.power, self.time
def d_updateState(self):
self.sendUpdate("setState", self.getState())
def d_setReward(self, reward):
self.sendUpdate("setReward", [reward])
def setResult(self, avId):
if avId and self.enabled:
self.power += 1
self.time = int(CannonGlobals.CANNON_TIMEOUT / self.power)
taskMgr.remove(self.taskName('gameover'))
taskMgr.doMethodLater(self.time, self.__gameOver, self.taskName('gameover'))
self.d_updateState()
def __gameOver(self, task):
self.enabled = 0
self.time = 0
self.d_updateState()
taskMgr.doMethodLater(10, self.__startNewGame, self.taskName('newGame'))
for avId in self.scoreDict:
av = self.air.doId2do.get(avId)
if av:
if av.zoneId == self.zoneId:
av.toonUp(2 ** self.power)
return task.done
def __startNewGame(self, task):
self.enabled = 1
self.__newGame()
self.d_updateState()
taskMgr.doMethodLater(self.time, self.__gameOver, self.taskName('gameover'))
return task.done
def setBonus(self, bonus):
def setPosition(self, todo0, todo1, todo2):
pass
def setCurPinballScore(self, avId, score, bonus):
av = self.air.doId2do.get(avId)
if not av:
return
S = score * bonus
self.scoreDict[avId] = S
if S > self.highscore:
self.highscore = S
self.d_updateHighscore(av, S)
def setState(self, todo0, todo1, todo2):
pass
def d_updateHighscore(self, av, score):
self.sendUpdate("setPinballHiScorer", [av.getName()])
self.sendUpdate("setPinballHiScore", [score])
def setReward(self, todo0):
pass
def delete(self):
taskMgr.remove(self.taskName('newGame'))
taskMgr.remove(self.taskName('gameover'))
def setResult(self, todo0):
pass
def setBonus(self, todo0):
pass
def setCurPinballScore(self, todo0, todo1, todo2):
pass
def setPinballHiScorer(self, todo0):
pass
def setPinballHiScore(self, todo0):
pass

View file

@ -74,10 +74,6 @@ class LoadHouseFSM(FSM):
self.demand('LoadHouse')
def enterLoadHouse(self):
# Load the garden if they have one.
if self.toon['setGardenStarted'][0]:
self.estate.spawnGarden(self.houseIndex)
# Activate the house:
self.mgr.air.sendActivate(self.houseId, self.mgr.air.districtId, self.estate.zoneId,
self.mgr.air.dclassesByName['DistributedHouseAI'],

View file

@ -121,7 +121,7 @@ class PhotoAlbumPage(ShtikerPage.ShtikerPage):
oldName = self.selectedFileName
numUnders = oldName.count(separator)
if numUnders == 0:
newName = oldName[0:18] + separator + str + separator + oldName[17:]
newName = oldName[0:21] + separator + str + separator + oldName[20:]
elif numUnders == 2:
sp = oldName.split(separator)
newName = sp[0] + separator + str + separator + sp[2]
@ -232,7 +232,7 @@ class PhotoAlbumPage(ShtikerPage.ShtikerPage):
files = os.listdir(self.photoPath)
photos = []
for fileName in files:
if fileName[0:17] == 'united-screenshot' and fileName[-4:] == '.jpg':
if fileName[0:20] == 'united-screenshot' and fileName[-4:] == '.jpg':
photos.append(fileName)
return photos

View file

@ -5446,9 +5446,9 @@ NumToColor = ['White',
'Gray',
'Neon Orange',
'Sapphire',
'Hacker Red',
'Hacker Blue',
'Hacker Green',
'Pure Red',
'Pure Blue',
'Pure Green',
'Crimson',
'Emerald',
'Bronze']