Add clerks to Cog HQs, change their appearences, clerk rewrite, add ~dna showrandom m/f magic word.

This commit is contained in:
John 2015-07-25 12:15:08 +03:00
parent 9494a47466
commit 9a059f3893
12 changed files with 154 additions and 266 deletions

View file

@ -1770,8 +1770,8 @@ dclass DistributedNPCScientist : DistributedNPCToonBase {
};
dclass DistributedNPCClerk : DistributedNPCToonBase {
setMovie(uint8, uint32, uint32, int16) broadcast ram;
setInventory(blob, int16, uint8) airecv clsend;
setState(uint32, uint8) broadcast airecv clsend;
setInventory(blob, int16) airecv clsend;
};
dclass DistributedNPCTailor : DistributedNPCToonBase {
@ -3174,11 +3174,11 @@ dclass TTCodeRedemptionMgr : DistributedObject {
struct Friend
{
uint32 doId;
string name;
blob dna;
uint16 adminAccess;
uint32 petId;
uint32 doId;
string name;
blob dna;
uint16 adminAccess;
uint32 petId;
};
dclass TTSFriendsManager : DistributedObjectGlobal {

View file

@ -123,7 +123,7 @@ class ToonHood(Hood):
self.purchase.unload()
del self.purchase
def handlePurchaseDone(self):
def handlePurchaseDone(self, playAgain):
doneStatus = self.purchase.getDoneStatus()
if doneStatus['where'] == 'playground':
self.fsm.request('quietZone', [{'loader': 'safeZoneLoader',

View file

@ -22,7 +22,6 @@ class ClerkPurchase(PurchaseBase):
self.timer.reparentTo(self.frame)
self.timer.posInTopRightCorner()
purchaseModels.removeNode()
return
def unload(self):
PurchaseBase.unload(self)
@ -36,7 +35,7 @@ class ClerkPurchase(PurchaseBase):
self.handleDone(0)
def __timerExpired(self):
self.handleDone(0)
self.handleDone(1)
def enterPurchase(self):
PurchaseBase.enterPurchase(self)

View file

@ -100,7 +100,7 @@ class PurchaseBase(StateData.StateData):
return Task.done
def handleDone(self, playAgain):
messenger.send(self.doneEvent)
messenger.send(self.doneEvent, [playAgain])
def enter(self):
self.fsm.request('purchase')

View file

@ -1,120 +1,100 @@
from direct.interval.IntervalGlobal import Sequence
from direct.task.Task import Task
from panda3d.core import *
from DistributedNPCToonBase import *
import NPCToons
from toontown.hood import ZoneUtil
from otp.nametag.NametagConstants import CFSpeech, CFTimeout
from toontown.minigame import ClerkPurchase
from toontown.shtiker.PurchaseManagerConstants import *
from toontown.toonbase import TTLocalizer
from otp.nametag.NametagConstants import *
from toontown.toonbase import TTLocalizer, ToontownGlobals
from toontown.toon import NPCToons
from DistributedNPCToonBase import DistributedNPCToonBase
import time
class DistributedNPCClerk(DistributedNPCToonBase):
def __init__(self, cr):
DistributedNPCToonBase.__init__(self, cr)
self.purchase = None
self.isLocalToon = 0
self.av = None
self.purchaseDoneEvent = 'purchaseDone'
self.lastCollision = 0
self.purchaseGui = None
def disable(self):
self.ignoreAll()
taskMgr.remove(self.uniqueName('popupPurchaseGUI'))
taskMgr.remove(self.uniqueName('lerpCamera'))
if self.purchase:
self.purchase.exit()
self.purchase.unload()
self.purchase = None
self.av = None
base.localAvatar.posCamera(0, 0)
self.destroyDialog()
DistributedNPCToonBase.disable(self)
def handleCollisionSphereEnter(self, collEntry):
base.cr.playGame.getPlace().fsm.request('purchase')
self.sendUpdate('avatarEnter', [])
def __handleUnexpectedExit(self):
self.notify.warning('unexpected exit')
self.av = None
def resetClerk(self):
def destroyDialog(self):
self.ignoreAll()
self.clearChat()
taskMgr.remove(self.uniqueName('popupPurchaseGUI'))
taskMgr.remove(self.uniqueName('lerpCamera'))
if self.purchase:
self.purchase.exit()
self.purchase.unload()
self.purchase = None
self.clearMat()
self.startLookAround()
self.detectAvatars()
if self.isLocalToon:
self.showNametag2d()
self.freeAvatar()
return Task.done
def setMovie(self, mode, npcId, avId, timestamp):
timeStamp = ClockDelta.globalClockDelta.localElapsedTime(timestamp)
self.remain = NPCToons.CLERK_COUNTDOWN_TIME - timeStamp
self.isLocalToon = avId == base.localAvatar.doId
if mode == NPCToons.PURCHASE_MOVIE_CLEAR:
if self.purchaseGui:
self.purchaseGui.exit()
self.purchaseGui.unload()
self.purchaseGui = None
def initToonState(self):
if self.name in NPCToons.ClerkPositions:
self.putOnSuit(ToontownGlobals.cogHQZoneId2deptIndex(self.zoneId), rental=True)
self.setAnimState('neutral', 0.9, None, None)
self.updatePosition()
def updatePosition(self):
if self.name in NPCToons.ClerkPositions:
pos = NPCToons.ClerkPositions[self.name]
self.setPos(*pos[0])
self.setH(pos[1])
else:
DistributedNPCToonBase.initToonState(self)
def freeAvatar(self):
base.localAvatar.posCamera(0, 0)
base.cr.playGame.getPlace().fsm.request('walk')
def handleCollisionSphereEnter(self, collEntry):
if self.lastCollision > time.time():
return
if mode == NPCToons.PURCHASE_MOVIE_TIMEOUT:
taskMgr.remove(self.uniqueName('popupPurchaseGUI'))
taskMgr.remove(self.uniqueName('lerpCamera'))
if self.isLocalToon:
self.ignore(self.purchaseDoneEvent)
if self.purchase:
self.__handlePurchaseDone()
self.setChatAbsolute(TTLocalizer.STOREOWNER_TOOKTOOLONG, CFSpeech | CFTimeout)
self.resetClerk()
elif mode == NPCToons.PURCHASE_MOVIE_START:
if self.isLocalToon:
self.hideNametag2d()
self.av = base.cr.doId2do.get(avId)
if self.av is None:
self.notify.warning('Avatar %d not found in doId' % avId)
return
else:
self.accept(self.av.uniqueName('disable'), self.__handleUnexpectedExit)
self.setupAvatars(self.av)
if self.isLocalToon:
camera.wrtReparentTo(render)
seq = Sequence((camera.posQuatInterval(1, Vec3(-5, 9, self.getHeight() - 0.5), Vec3(-150, -2, 0), other=self, blendType='easeOut', name=self.uniqueName('lerpCamera'))))
seq.start()
self.setChatAbsolute(TTLocalizer.STOREOWNER_GREETING, CFSpeech | CFTimeout)
if self.isLocalToon:
taskMgr.doMethodLater(1.0, self.popupPurchaseGUI, self.uniqueName('popupPurchaseGUI'))
elif mode == NPCToons.PURCHASE_MOVIE_COMPLETE:
self.setChatAbsolute(TTLocalizer.STOREOWNER_GOODBYE, CFSpeech | CFTimeout)
self.resetClerk()
elif mode == NPCToons.PURCHASE_MOVIE_NO_MONEY:
self.lastCollision = time.time() + ToontownGlobals.NPCCollisionDelay
if not base.localAvatar.getMoney():
self.setChatAbsolute(TTLocalizer.STOREOWNER_NEEDJELLYBEANS, CFSpeech | CFTimeout)
self.resetClerk()
return
return
self.d_setState(ToontownGlobals.CLERK_GREETING)
base.cr.playGame.getPlace().fsm.request('purchase')
camera.wrtReparentTo(render)
camera.posQuatInterval(1, Vec3(-5, 9, self.getHeight() - 0.5), Vec3(-150, -2, 0), other=self, blendType='easeOut', name=self.uniqueName('lerpCamera')).start()
taskMgr.doMethodLater(1.0, self.popupPurchaseGUI, self.uniqueName('popupPurchaseGUI'))
def d_setInventory(self, inventory, money):
self.sendUpdate('setInventory', [inventory, money])
def d_setState(self, state):
self.sendUpdate('setState', [0, state])
def setState(self, avId, state):
av = base.cr.doId2do.get(avId)
if not av:
return
if state == ToontownGlobals.CLERK_GOODBYE:
self.setChatAbsolute(TTLocalizer.STOREOWNER_GOODBYE, CFSpeech | CFTimeout)
elif state == ToontownGlobals.CLERK_GREETING:
self.lookAtAvatar(av)
self.setChatAbsolute(TTLocalizer.STOREOWNER_GREETING, CFSpeech | CFTimeout)
return
elif state == ToontownGlobals.CLERK_TOOKTOOLONG:
self.setChatAbsolute(TTLocalizer.STOREOWNER_TOOKTOOLONG, CFSpeech | CFTimeout)
self.updatePosition()
def popupPurchaseGUI(self, task):
self.setChatAbsolute('', CFSpeech)
self.acceptOnce(self.purchaseDoneEvent, self.__handlePurchaseDone)
self.accept('boughtGag', self.__handleBoughtGag)
self.purchase = ClerkPurchase.ClerkPurchase(base.localAvatar, self.remain, self.purchaseDoneEvent)
self.purchase.load()
self.purchase.enter()
return Task.done
self.clearChat()
self.acceptOnce('purchaseClerkDone', self.__handlePurchaseDone)
self.purchaseGui = ClerkPurchase.ClerkPurchase(base.localAvatar, NPCToons.CLERK_COUNTDOWN_TIME, 'purchaseClerkDone')
self.purchaseGui.load()
self.purchaseGui.enter()
def __handleBoughtGag(self):
self.d_setInventory(base.localAvatar.inventory.makeNetString(), base.localAvatar.getMoney(), 0)
def __handlePurchaseDone(self):
self.ignore('boughtGag')
self.d_setInventory(base.localAvatar.inventory.makeNetString(), base.localAvatar.getMoney(), 1)
self.purchase.exit()
self.purchase.unload()
self.purchase = None
def d_setInventory(self, invString, money, done):
self.sendUpdate('setInventory', [invString, money, done])
def __handlePurchaseDone(self, state):
self.d_setInventory(base.localAvatar.inventory.makeNetString(), base.localAvatar.getMoney())
self.destroyDialog()
self.freeAvatar()
self.detectAvatars()
self.d_setState(state)

View file

@ -1,108 +1,15 @@
from otp.ai.AIBaseGlobal import *
from direct.task.Task import Task
from panda3d.core import *
from DistributedNPCToonBaseAI import *
from DistributedNPCToonBaseAI import DistributedNPCToonBaseAI
class DistributedNPCClerkAI(DistributedNPCToonBaseAI):
def __init__(self, air, npcId):
DistributedNPCToonBaseAI.__init__(self, air, npcId)
self.timedOut = 0
def setInventory(self, inventory, money):
av = self.air.doId2do.get(self.air.getAvatarIdFromSender())
def delete(self):
taskMgr.remove(self.uniqueName('clearMovie'))
self.ignoreAll()
DistributedNPCToonBaseAI.delete(self)
def avatarEnter(self):
avId = self.air.getAvatarIdFromSender()
DistributedNPCToonBaseAI.avatarEnter(self)
av = self.air.doId2do.get(avId)
if av is None:
self.notify.warning('toon isnt there! toon: %s' % avId)
if not av:
return
self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId])
if self.isBusy():
self.freeAvatar(avId)
return
if av.getMoney():
self.sendStartMovie(avId)
else:
self.sendNoMoneyMovie(avId)
def sendStartMovie(self, avId):
self.busy = avId
self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_START,
self.npcId,
avId,
ClockDelta.globalClockDelta.getRealNetworkTime()])
taskMgr.doMethodLater(NPCToons.CLERK_COUNTDOWN_TIME, self.sendTimeoutMovie, self.uniqueName('clearMovie'))
def sendNoMoneyMovie(self, avId):
self.busy = avId
self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_NO_MONEY,
self.npcId,
avId,
ClockDelta.globalClockDelta.getRealNetworkTime()])
self.sendClearMovie(None)
return
def sendTimeoutMovie(self, task):
self.timedOut = 1
self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_TIMEOUT,
self.npcId,
self.busy,
ClockDelta.globalClockDelta.getRealNetworkTime()])
self.sendClearMovie(None)
return Task.done
def sendClearMovie(self, task):
self.ignore(self.air.getAvatarExitEvent(self.busy))
self.busy = 0
self.timedOut = 0
self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_CLEAR,
self.npcId,
0,
ClockDelta.globalClockDelta.getRealNetworkTime()])
return Task.done
def completePurchase(self, avId):
self.busy = avId
self.sendUpdate('setMovie', [NPCToons.PURCHASE_MOVIE_COMPLETE,
self.npcId,
avId,
ClockDelta.globalClockDelta.getRealNetworkTime()])
self.sendClearMovie(None)
return
def setInventory(self, blob, newMoney, done):
avId = self.air.getAvatarIdFromSender()
if self.busy != avId:
if self.busy != 0:
self.air.writeServerEvent('suspicious', avId, 'DistributedNPCClerkAI.setInventory busy with %s' % self.busy)
self.notify.warning('setInventory from unknown avId: %s busy: %s' % (avId, self.busy))
return
if avId in self.air.doId2do:
av = self.air.doId2do[avId]
newInventory = av.inventory.makeFromNetString(blob)
currentMoney = av.getMoney()
if av.inventory.validatePurchase(newInventory, currentMoney, newMoney):
av.setMoney(newMoney)
if done:
av.d_setInventory(av.inventory.makeNetString())
av.d_setMoney(newMoney)
else:
self.air.writeServerEvent('suspicious', avId, 'DistributedNPCClerkAI.setInventory invalid purchase')
self.notify.warning('Avatar ' + str(avId) + ' attempted an invalid purchase.')
av.d_setInventory(av.inventory.makeNetString())
av.d_setMoney(av.getMoney())
if self.timedOut:
return
if done:
taskMgr.remove(self.uniqueName('clearMovie'))
self.completePurchase(avId)
def __handleUnexpectedExit(self, avId):
self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly')
self.sendTimeoutMovie(None)
return
av.b_setMoney(money if av.inventory.validatePurchase(av.inventory.makeFromNetString(inventory), av.getMoney(), money) else av.getMoney())
av.d_setInventory(av.inventory.makeNetString())
def setState(self, avId, state):
self.sendUpdate('setState', [self.air.getAvatarIdFromSender(), state])

View file

@ -112,6 +112,9 @@ class DistributedNPCToonBase(DistributedToon.DistributedToon):
def setupAvatars(self, av):
self.ignoreAvatars()
self.lookAtAvatar(av)
def lookAtAvatar(self, av):
av.headsUp(self, 0, 0, 0)
self.headsUp(av, 0, 0, 0)
av.stopLookAround()

View file

@ -4753,6 +4753,8 @@ def dna(part, value):
if part == 'show':
return dna.asTuple()
if part == 'showrandom':
return NPCToons.getRandomDNA(time.time(), value)
return 'Invalid part: ' + part
@magicWord(category=CATEGORY_ADMINISTRATOR, types=[int])

View file

@ -214,7 +214,7 @@ class InventoryBase(DirectObject.DirectObject):
return self.countPropsInList(newInventory) - self.totalProps
def validatePurchase(self, newInventory, currentMoney, newMoney):
if newMoney > currentMoney:
if newMoney > currentMoney or newMoney < 0:
self.notify.warning('Somebody lied about their money! Rejecting purchase.')
return 0
newItemTotal = self.countPropsInList(newInventory)

View file

@ -11576,6 +11576,12 @@ NPCToonDict = {20000: (-1,
NPC_REGULAR),
10001: (10000,
lnames[10001],
'r',
'f',
0,
NPC_LAFF_RESTOCK),
10002: (10000,
lnames[10002],
('fss',
'md',
'l',
@ -11593,67 +11599,43 @@ NPCToonDict = {20000: (-1,
0),
'f',
0,
NPC_LAFF_RESTOCK),
NPC_CLERK),
11001: (11000,
lnames[11001],
('dll',
'ls',
's',
'm',
6,
0,
6,
6,
9,
3,
9,
3,
2,
4,
0),
'r',
'm',
0,
NPC_LAFF_RESTOCK),
11002: (11000,
lnames[11002],
'r',
'm',
0,
NPC_CLERK),
12001: (12000,
lnames[12001],
('mss',
'ls',
's',
'm',
8,
0,
8,
8,
5,
12,
5,
12,
7,
16,
0),
'r',
'm',
0,
NPC_LAFF_RESTOCK),
12002: (12000,
lnames[12002],
'r',
'm',
0,
NPC_CLERK),
13001: (13000,
lnames[13001],
('dss',
'ld',
's',
'f',
17,
0,
17,
17,
1,
24,
1,
24,
0,
9,
0),
'r',
'f',
0,
NPC_LAFF_RESTOCK)}
NPC_LAFF_RESTOCK),
13002: (13000,
lnames[13002],
'r',
'f',
0,
NPC_CLERK)}
if config.GetBool('want-new-toonhall', 1):
NPCToonDict[2001] = (2513,
@ -11697,9 +11679,13 @@ else:
NPC_REGULAR)
BlockerPositions = {TTLocalizer.Flippy: (Point3(207.4, 18.81, -0.475), 90.0)}
LaffRestockPositions = {lnames[11001]: ((-27.0, -170.0, -19.6), 215.0),
lnames[12001]: ((361.9, -394.4, -23.5), 113.5),
lnames[12001]: ((361.9, -394.4, -23.5), 120.0),
lnames[13001]: ((143.7, -381.4, -68.4), 0.0),
lnames[10001]: ((135.0, 128.8, 0.025), -212.8)}
ClerkPositions = {lnames[11002]: ((37.3, -167.5, -19.6), 130.0),
lnames[12002]: ((361.9, -460.4, -23.5), 60.0),
lnames[13002]: ((38.3, -389.5, -68.4), 0.0),
lnames[10002]: ((84, 127.8, 0.025), -180.0)}
GlovePositions = {lnames[2021]: ((101, -14, 4), -305)}
del lnames
zone2NpcDict = {}

View file

@ -6245,9 +6245,13 @@ NPCToonNames = {20000: 'Tutorial Tom',
7010: 'Jaymo',
7011: 'Donald',
10001: 'Healer Sara',
10002: 'Clerk Barbra',
11001: 'Healer Gabriel',
11002: 'Clerk Brendan',
12001: 'Healer Bill',
13001: 'Healer Clover'}
12002: 'Clerk John',
13001: 'Healer Clover',
13002: 'Clerk Audrey'}
zone2TitleDict = {2513: ('Toon Hall', ''),
2514: ('Toontown Bank', ''),
2516: ('Toontown School House', ''),

View file

@ -1621,9 +1621,16 @@ BMovementSpeed = 0
BMovementSpeedMultiplier = 1.3
BugReportSite = 'https://bugs.launchpad.net/toontown-united/+filebug'
NPCCollisionDelay = 2.5
CostPerLaffRestock = 3
FISHSALE_COMPLETE = 0
FISHSALE_TROPHY = 1
NPCCollisionDelay = 2.5
CLERK_GOODBYE = 0
CLERK_GREETING = 1
CLERK_TOOKTOOLONG = 2
KnockKnockHeal = 12
KnockKnockCooldown = 600