Add basic glove NPC, we need a GUI though.

This commit is contained in:
Daniel 2015-03-07 17:01:47 +02:00
parent b6a44f49b6
commit 31f80a48a0
11 changed files with 163 additions and 3 deletions

View file

@ -112,6 +112,7 @@ from toontown.toon import DistributedNPCFisherman/AI
from toontown.toon import DistributedNPCPartyPerson/AI from toontown.toon import DistributedNPCPartyPerson/AI
from toontown.toon import DistributedNPCPetclerk/AI from toontown.toon import DistributedNPCPetclerk/AI
from toontown.toon import DistributedNPCKartClerk/AI from toontown.toon import DistributedNPCKartClerk/AI
from toontown.toon import DistributedNPCGlove/AI
from toontown.building import DistributedKnockKnockDoor/AI from toontown.building import DistributedKnockKnockDoor/AI
from toontown.building import DistributedElevator/AI from toontown.building import DistributedElevator/AI
from toontown.building import DistributedElevatorFSM/AI from toontown.building import DistributedElevatorFSM/AI
@ -1846,6 +1847,11 @@ dclass DistributedNPCKartClerk : DistributedNPCToonBase {
transactionDone() airecv clsend; transactionDone() airecv clsend;
}; };
dclass DistributedNPCGlove : DistributedNPCToonBase {
doTransformation(uint32 avId, uint32) broadcast;
requestTransformation(uint32) airecv clsend;
};
dclass DistributedKnockKnockDoor : DistributedAnimatedProp { dclass DistributedKnockKnockDoor : DistributedAnimatedProp {
}; };

View file

@ -33,6 +33,9 @@ want-resistance-toonup #t
want-resistance-restock #t want-resistance-restock #t
want-resistance-dance #t want-resistance-dance #t
# Optional:
want-glove-npc #t
# Developer options: # Developer options:
show-population #t show-population #t
force-skip-tutorial #t force-skip-tutorial #t

View file

@ -2,7 +2,7 @@
from pandac.PandaModules import * from pandac.PandaModules import *
hashVal = 2077607028 hashVal = 959103491
from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot from toontown.coghq import DistributedCashbotBossSafe, DistributedCashbotBossCrane, DistributedBattleFactory, DistributedCashbotBossTreasure, DistributedCogHQDoor, DistributedSellbotHQDoor, DistributedFactoryElevatorExt, DistributedMintElevatorExt, DistributedLawOfficeElevatorExt, DistributedLawOfficeElevatorInt, LobbyManager, DistributedMegaCorp, DistributedFactory, DistributedLawOffice, DistributedLawOfficeFloor, DistributedLift, DistributedDoorEntity, DistributedSwitch, DistributedButton, DistributedTrigger, DistributedCrushableEntity, DistributedCrusherEntity, DistributedStomper, DistributedStomperPair, DistributedLaserField, DistributedGolfGreenGame, DistributedSecurityCamera, DistributedMover, DistributedElevatorMarker, DistributedBarrelBase, DistributedGagBarrel, DistributedBeanBarrel, DistributedHealBarrel, DistributedGrid, ActiveCell, DirectionalCell, CrusherCell, DistributedCrate, DistributedSinkingPlatform, BattleBlocker, DistributedMint, DistributedMintRoom, DistributedMintBattle, DistributedStage, DistributedStageRoom, DistributedStageBattle, DistributedLawbotBossGavel, DistributedLawbotCannon, DistributedLawbotChair, DistributedCogKart, DistributedCountryClub, DistributedCountryClubRoom, DistributedMoleField, DistributedCountryClubBattle, DistributedMaze, DistributedFoodBelt, DistributedBanquetTable, DistributedGolfSpot
@ -43,7 +43,7 @@ from toontown.friends import TTPlayerFriendsManager, TTUFriendsManager
from toontown.cogdominium import DistributedCogdoInterior, DistributedCogdoBattleBldg, DistributedCogdoElevatorExt, DistributedCogdoElevatorInt, DistributedCogdoBarrel, DistCogdoGame, DistCogdoLevelGame, DistCogdoBoardroomGame, DistCogdoCraneGame, DistCogdoMazeGame, DistCogdoFlyingGame, DistCogdoCrane, DistCogdoCraneMoneyBag, DistCogdoCraneCog from toontown.cogdominium import DistributedCogdoInterior, DistributedCogdoBattleBldg, DistributedCogdoElevatorExt, DistributedCogdoElevatorInt, DistributedCogdoBarrel, DistCogdoGame, DistCogdoLevelGame, DistCogdoBoardroomGame, DistCogdoCraneGame, DistCogdoMazeGame, DistCogdoFlyingGame, DistCogdoCrane, DistCogdoCraneMoneyBag, DistCogdoCraneCog
from otp.distributed import Account, ObjectServer, DistributedDistrict, DistributedDirectory, DistributedTestObject, CentralLogger from otp.distributed import Account, ObjectServer, DistributedDistrict, DistributedDirectory, DistributedTestObject, CentralLogger
from toontown.estate import DistributedCannon, DistributedTarget, EstateManager, DistributedEstate, DistributedHouse, DistributedHouseInterior, DistributedGarden, DistributedHouseDoor, DistributedBankMgr, DistributedMailbox, DistributedFurnitureManager, DistributedFurnitureItem, DistributedBank, DistributedCloset, DistributedTrunk, DistributedPhone, DistributedFireworksCannon, DistributedLawnDecor, DistributedGardenPlot, DistributedGardenBox, DistributedFlower, DistributedGagTree, DistributedStatuary, DistributedToonStatuary, DistributedChangingStatuary, DistributedAnimatedStatuary, DistributedPlantBase, DistributedLawnDecor from toontown.estate import DistributedCannon, DistributedTarget, EstateManager, DistributedEstate, DistributedHouse, DistributedHouseInterior, DistributedGarden, DistributedHouseDoor, DistributedBankMgr, DistributedMailbox, DistributedFurnitureManager, DistributedFurnitureItem, DistributedBank, DistributedCloset, DistributedTrunk, DistributedPhone, DistributedFireworksCannon, DistributedLawnDecor, DistributedGardenPlot, DistributedGardenBox, DistributedFlower, DistributedGagTree, DistributedStatuary, DistributedToonStatuary, DistributedChangingStatuary, DistributedAnimatedStatuary, DistributedPlantBase, DistributedLawnDecor
from toontown.toon import DistributedToon, DistributedNPCToonBase, DistributedNPCToon, DistributedSmartNPC, DistributedSmartNPC, DistributedNPCSpecialQuestGiver, DistributedNPCFlippyInToonHall, DistributedNPCScientist, DistributedNPCClerk, DistributedNPCTailor, DistributedNPCBlocker, DistributedNPCFisherman, DistributedNPCPartyPerson, DistributedNPCPetclerk, DistributedNPCKartClerk, DistributedNPCBanker from toontown.toon import DistributedToon, DistributedNPCToonBase, DistributedNPCToon, DistributedSmartNPC, DistributedSmartNPC, DistributedNPCSpecialQuestGiver, DistributedNPCFlippyInToonHall, DistributedNPCScientist, DistributedNPCClerk, DistributedNPCTailor, DistributedNPCBlocker, DistributedNPCFisherman, DistributedNPCPartyPerson, DistributedNPCPetclerk, DistributedNPCKartClerk, DistributedNPCGlove, DistributedNPCBanker
from toontown.tutorial import DistributedBattleTutorial, TutorialManager from toontown.tutorial import DistributedBattleTutorial, TutorialManager
from toontown.coderedemption.TTCodeRedemptionMgr import TTCodeRedemptionMgr from toontown.coderedemption.TTCodeRedemptionMgr import TTCodeRedemptionMgr
from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI from toontown.distributed.NonRepeatableRandomSourceAI import NonRepeatableRandomSourceAI

View file

@ -87,6 +87,7 @@ class ToontownAIRepository(ToontownInternalRepository):
self.doLiveUpdates = self.config.GetBool('want-live-updates', False) self.doLiveUpdates = self.config.GetBool('want-live-updates', False)
self.wantTrackClsends = self.config.GetBool('want-track-clsends', False) self.wantTrackClsends = self.config.GetBool('want-track-clsends', False)
self.wantAchievements = self.config.GetBool('want-achievements', True) self.wantAchievements = self.config.GetBool('want-achievements', True)
self.wantGloveNpc = self.config.GetBool('want-glove-npc', True)
self.baseXpMultiplier = self.config.GetFloat('base-xp-multiplier', 1.0) self.baseXpMultiplier = self.config.GetFloat('base-xp-multiplier', 1.0)
self.wantHalloween = self.config.GetBool('want-halloween', False) self.wantHalloween = self.config.GetBool('want-halloween', False)
self.wantChristmas = self.config.GetBool('want-christmas', False) self.wantChristmas = self.config.GetBool('want-christmas', False)

View file

@ -31,7 +31,13 @@ class TTHoodAI(HoodAI.HoodAI):
self.createClassicChar() self.createClassicChar()
if simbase.config.GetBool('want-butterflies', True): if simbase.config.GetBool('want-butterflies', True):
self.createButterflies() self.createButterflies()
if simbase.air.wantGloveNpc:
NPCToons.createNPC(
simbase.air, 2021,
(ToontownGlobals.ToontownCentral, TTLocalizer.NPCToonNames[2021], ('dss', 'ls', 's', 'm', 13, 41, 13, 13, 1, 6, 1, 6, 0, 18), 'm', 1, NPCToons.NPC_GLOVE),
ToontownGlobals.ToontownCentral, posIndex=0)
if simbase.air.wantHalloween: if simbase.air.wantHalloween:
self.TrickOrTreatTargetManager = DistributedTrickOrTreatTargetAI.DistributedTrickOrTreatTargetAI(self.air) self.TrickOrTreatTargetManager = DistributedTrickOrTreatTargetAI.DistributedTrickOrTreatTargetAI(self.air)
self.TrickOrTreatTargetManager.generateWithRequired(2649) self.TrickOrTreatTargetManager.generateWithRequired(2649)

View file

@ -0,0 +1,106 @@
from direct.fsm import ClassicFSM, State
from direct.gui.DirectGui import *
from direct.task.Task import Task
from pandac.PandaModules import *
import time
from DistributedNPCToonBase import *
from toontown.chat.ChatGlobals import *
from toontown.effects import DustCloud
from toontown.nametag.NametagGlobals import *
from toontown.toonbase import TTLocalizer
def getDustCloud(toon):
dustCloud = DustCloud.DustCloud(fBillboard=0)
dustCloud.setBillboardAxis(2.0)
dustCloud.setZ(3)
dustCloud.setScale(0.4)
dustCloud.createTrack()
return Sequence(Wait(0.5), Func(dustCloud.reparentTo, toon), dustCloud.track, Func(dustCloud.destroy))
class DistributedNPCGlove(DistributedNPCToonBase):
def __init__(self, cr):
DistributedNPCToonBase.__init__(self, cr)
self.nextCollision = 0
self.fsm = ClassicFSM.ClassicFSM(
'NPCGlove',
[
State.State('off', self.enterOff, self.exitOff, ['pickColor']),
State.State('pickColor', self.enterPickColor, self.exitPickColor, ['off'])
], 'off', 'off')
self.fsm.enterInitialState()
def disable(self):
self.ignoreAll()
self.nextCollision = 0
DistributedNPCToonBase.disable(self)
def initToonState(self):
self.setAnimState('neutral', 1.05, None, None)
self.setPosHpr(101, -14, 4, -305, 0, 0)
def getCollSphereRadius(self):
return 1.0
def handleCollisionSphereEnter(self, collEntry):
self.currentTime = time.time()
if self.nextCollision <= self.currentTime:
self.fsm.request('pickColor')
self.nextCollision = self.currentTime + 2
def enterOff(self):
pass
def exitOff(self):
pass
def enterPickColor(self):
base.cr.playGame.getPlace().setState('stopped')
taskMgr.doMethodLater(15, self.reset, 'npcSleepTask-%s' % self.doId)
self.popupPickColorGUI()
def exitPickColor(self, task=None):
taskMgr.remove('npcSleepTask-%s' % self.doId)
if task is not None:
return task.done
def popupPickColorGUI(self):
self.setChatAbsolute('', CFSpeech)
self.setChatAbsolute("Hi fucker", CFSpeech)
base.setCellsActive(base.bottomCells, 0)
self.d_requestTransformation(8)
def getMessageById(self, response):
if response == 1:
return TTLocalizer.GloveSameColorMessage
elif response == 2:
return TTLocalizer.GloveNoMoneyMessage
else:
return TTLocalizer.GloveSuccessMessage
def doTransformation(self, avId, response):
av = self.cr.doId2do.get(avId)
if not av:
return
if response == 3:
getDustCloud(av).start()
self.setChatAbsolute('', CFSpeech)
self.setChatAbsolute(self.getMessageById(response), CFSpeech|CFTimeout)
def d_requestTransformation(self, color):
self.sendUpdate('requestTransformation', [color])
self.reset()
def reset(self, task=None):
self.fsm.request('off')
base.cr.playGame.getPlace().setState('walk')
base.setCellsActive(base.bottomCells, 1)
if task is not None:
return task.done

View file

@ -0,0 +1,27 @@
from DistributedNPCToonBaseAI import DistributedNPCToonBaseAI
from ToonDNA import ToonDNA
from toontown.toonbase import ToontownGlobals
class DistributedNPCGloveAI(DistributedNPCToonBaseAI):
def requestTransformation(self, color):
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if av is None or not hasattr(av, 'dna'):
return
if av.dna.gloveColor == color:
self.sendUpdate('doTransformation', [avId, 1])
return
if av.getMoney() < ToontownGlobals.GloveCost:
self.sendUpdate('doTransformation', [avId, 2])
return
av.takeMoney(ToontownGlobals.GloveCost)
newDNA = ToonDNA()
newDNA.makeFromNetString(av.getDNAString())
newDNA.gloveColor = color
taskMgr.doMethodLater(1.0, lambda task: av.b_setDNAString(newDNA.makeNetString()), 'transform-%d' % avId)
self.sendUpdate('doTransformation', [avId, 3])

View file

@ -4999,6 +4999,8 @@ def dna(part, value):
invoker.b_setDNAString(backup['dna'][value]) invoker.b_setDNAString(backup['dna'][value])
return 'Restored a DNA backup for %s under the name: %s' % (invoker.getName(), value) return 'Restored a DNA backup for %s under the name: %s' % (invoker.getName(), value)
if part == 'show':
return dna.asTuple()
return 'Invalid part: ' + part return 'Invalid part: ' + part
@magicWord(category=CATEGORY_ADMINISTRATOR, types=[int]) @magicWord(category=CATEGORY_ADMINISTRATOR, types=[int])

View file

@ -70,6 +70,7 @@ NPC_FLIPPYTOONHALL = 10
NPC_SCIENTIST = 11 NPC_SCIENTIST = 11
NPC_SMART = 13 NPC_SMART = 13
NPC_BANKER = 14 NPC_BANKER = 14
NPC_GLOVE = 15
CLERK_COUNTDOWN_TIME = 120 CLERK_COUNTDOWN_TIME = 120
TAILOR_COUNTDOWN_TIME = 300 TAILOR_COUNTDOWN_TIME = 300
RTDNAFile = '/RTDNAFile.txt' RTDNAFile = '/RTDNAFile.txt'
@ -95,6 +96,7 @@ def createNPC(air, npcId, desc, zoneId, posIndex = 0, questCallback = None):
import DistributedNPCScientistAI import DistributedNPCScientistAI
import DistributedSmartNPCAI import DistributedSmartNPCAI
import DistributedNPCBankerAI import DistributedNPCBankerAI
import DistributedNPCGloveAI
canonicalZoneId, name, dnaType, gender, protected, type = desc canonicalZoneId, name, dnaType, gender, protected, type = desc
if type == NPC_REGULAR: if type == NPC_REGULAR:
npc = DistributedNPCToonAI.DistributedNPCToonAI(air, npcId, questCallback=questCallback) npc = DistributedNPCToonAI.DistributedNPCToonAI(air, npcId, questCallback=questCallback)
@ -124,6 +126,8 @@ def createNPC(air, npcId, desc, zoneId, posIndex = 0, questCallback = None):
npc = DistributedSmartNPCAI.DistributedSmartNPCAI(air, npcId) npc = DistributedSmartNPCAI.DistributedSmartNPCAI(air, npcId)
elif type == NPC_BANKER: elif type == NPC_BANKER:
npc = DistributedNPCBankerAI.DistributedNPCBankerAI(air, npcId) npc = DistributedNPCBankerAI.DistributedNPCBankerAI(air, npcId)
elif type == NPC_GLOVE and simbase.air.wantGloveNpc:
npc = DistributedNPCGloveAI.DistributedNPCGloveAI(air, npcId)
else: else:
print 'createNPC() error!!!' print 'createNPC() error!!!'
npc.setName(name) npc.setName(name)

View file

@ -7007,6 +7007,7 @@ NPCToonNames = {20000: 'Tutorial Tom',
2018: 'Doctor Surlee', 2018: 'Doctor Surlee',
2019: 'Doctor Dimm', 2019: 'Doctor Dimm',
2020: 'Professor Prepostera', 2020: 'Professor Prepostera',
2021: 'Painter Joey',
2101: 'Dentist Daniel', 2101: 'Dentist Daniel',
2102: 'Sheriff Sherry', 2102: 'Sheriff Sherry',
2103: 'Sneezy Kitty', 2103: 'Sneezy Kitty',
@ -9785,6 +9786,9 @@ InteractivePropTrackBonusTerms = {0: 'Super Toon-Up!',
5: 'Super Squirt!', 5: 'Super Squirt!',
6: ''} 6: ''}
PlayingCardUnknown = 'Card Name is unknown' PlayingCardUnknown = 'Card Name is unknown'
GloveSameColorMessage = 'You already have that glove!'
GloveNoMoneyMessage = "You don't have enough jellybeans!"
GloveSuccessMessage = 'Have fun with your new glove!'
# Buffs # Buffs

View file

@ -1676,6 +1676,7 @@ AV_TOUCH_CHECK_DIST_Z = 5.0
AV_TOUCH_CHECK_TIMELIMIT_CL = 0.002 AV_TOUCH_CHECK_TIMELIMIT_CL = 0.002
AV_TOUCH_COUNT_LIMIT = 5 AV_TOUCH_COUNT_LIMIT = 5
AV_TOUCH_COUNT_TIME = 300 AV_TOUCH_COUNT_TIME = 300
GloveCost = 2000
# Buffs... # Buffs...