text: from otp.ai.AIBaseGlobal import *
  from panda3d.core import *
  from DistributedNPCToonBaseAI import *
  from toontown.toonbase import TTLocalizer
  from direct.task import Task
  from toontown.racing.KartShopGlobals import *
  from toontown.racing.KartDNA import *
  
  class DistributedNPCKartClerkAI(DistributedNPCToonBaseAI):
  
      def __init__(self, air, npcId):
          DistributedNPCToonBaseAI.__init__(self, air, npcId)
          self.givesQuests = 0
          self.busy = 0
  
      def delete(self):
          taskMgr.remove(self.uniqueName('clearMovie'))
          self.ignoreAll()
          DistributedNPCToonBaseAI.delete(self)
  
      def avatarEnter(self):
          avId = self.air.getAvatarIdFromSender()
          if avId not in self.air.doId2do:
              self.notify.warning('Avatar: %s not found' % avId)
              return
          if self.isBusy():
              self.freeAvatar(avId)
              return
          self.transactionType = ''
          av = self.air.doId2do[avId]
          self.busy = avId
          self.acceptOnce(self.air.getAvatarExitEvent(avId), self.__handleUnexpectedExit, extraArgs=[avId])
          flag = NPCToons.SELL_MOVIE_START
          self.d_setMovie(avId, flag)
          taskMgr.doMethodLater(KartShopGlobals.KARTCLERK_TIMER, self.sendTimeoutMovie, self.uniqueName('clearMovie'))
          DistributedNPCToonBaseAI.avatarEnter(self)
  
      def rejectAvatar(self, avId):
          self.notify.warning('rejectAvatar: should not be called by a kart clerk!')
  
      def d_setMovie(self, avId, flag, extraArgs = []):
          self.sendUpdate('setMovie', [flag,
           self.npcId,
           avId,
           extraArgs,
           ClockDelta.globalClockDelta.getRealNetworkTime()])
  
      def sendTimeoutMovie(self, task):
          self.d_setMovie(self.busy, NPCToons.SELL_MOVIE_TIMEOUT)
          self.sendClearMovie(None)
          return Task.done
  
      def sendClearMovie(self, task):
          self.ignore(self.air.getAvatarExitEvent(self.busy))
          taskMgr.remove(self.uniqueName('clearMovie'))
          self.busy = 0
          self.d_setMovie(0, NPCToons.SELL_MOVIE_CLEAR)
          return Task.done
  
      def buyKart(self, whichKart):
          avId = self.air.getAvatarIdFromSender()
          if self.busy != avId:
              self.air.writeServerEvent('suspicious', avId, 'DistributedNPCKartClerkAI.buyKart busy with %s' % self.busy)
              self.notify.warning('somebody called buyKart that I was not busy with! avId: %s' % avId)
              return
          av = simbase.air.doId2do.get(avId)
          if av:
              movieType = NPCToons.SELL_MOVIE_COMPLETE
              extraArgs = []
              cost = getKartCost(whichKart)
              if cost == 'key error':
                  self.air.writeServerEvent('suspicious', avId, 'Player trying to buy non-existent kart %s' % whichKart)
                  self.notify.warning('somebody is trying to buy non-existent kart%s! avId: %s' % (whichKart, avId))
                  return
              elif cost > av.getTickets():
                  self.air.writeServerEvent('suspicious', avId, "DistributedNPCKartClerkAI.buyKart and toon doesn't have enough tickets!")
                  self.notify.warning("somebody called buyKart and didn't have enough tickets to purchase! avId: %s" % avId)
                  return
              av.b_setTickets(av.getTickets() - cost)
              self.air.writeServerEvent('kartingTicketsSpent', avId, '%s' % cost)
              av.b_setKartBodyType(whichKart)
              self.air.writeServerEvent('kartingKartPurchased', avId, '%s' % whichKart)
  
      def buyAccessory(self, whichAcc):
          avId = self.air.getAvatarIdFromSender()
          av = simbase.air.doId2do.get(avId)
          if self.busy != avId:
              self.air.writeServerEvent('suspicious', avId, 'DistributedNPCKartClerkAI.buyAccessory busy with %s' % self.busy)
              self.notify.warning('somebody called buyAccessory that I was not busy with! avId: %s' % avId)
              return
          if len(av.getKartAccessoriesOwned()) >= KartShopGlobals.MAX_KART_ACC:
              self.air.writeServerEvent('suspicious', avId, 'DistributedNPCKartClerkAI.buyAcc and toon already has max number of accessories!')
              self.notify.warning('somebody called buyAcc and already has maximum allowed accessories! avId: %s' % avId)
              return
          av = simbase.air.doId2do.get(avId)
          if av:
              movieType = NPCToons.SELL_MOVIE_COMPLETE
              extraArgs = []
              cost = getAccCost(whichAcc)
              if cost > av.getTickets():
                  self.air.writeServerEvent('suspicious', avId, "DistributedNPCKartClerkAI.buyAcc and toon doesn't have enough tickets!")
                  self.notify.warning("somebody called buyAcc and didn't have enough tickets to purchase! avId: %s" % avId)
                  return
              av.b_setTickets(av.getTickets() - cost)
              self.air.writeServerEvent('kartingTicketsSpent', avId, '%s' % cost)
              av.addOwnedAccessory(whichAcc)
              self.air.writeServerEvent('kartingAccessoryPurchased', avId, '%s' % whichAcc)
              av.updateKartDNAField(getAccessoryType(whichAcc), whichAcc)
  
      def transactionDone(self):
          avId = self.air.getAvatarIdFromSender()
          if self.busy != avId:
              self.air.writeServerEvent('suspicious', avId, 'DistributedNPCKartClerkAI.transactionDone busy with %s' % self.busy)
              self.notify.warning('somebody called transactionDone that I was not busy with! avId: %s' % avId)
              return
          av = simbase.air.doId2do.get(avId)
          if av:
              movieType = NPCToons.SELL_MOVIE_COMPLETE
              extraArgs = []
              self.d_setMovie(avId, movieType, extraArgs)
          self.sendClearMovie(None)
          return
  
      def __handleUnexpectedExit(self, avId):
          self.notify.warning('avatar:' + str(avId) + ' has exited unexpectedly')
          self.notify.warning('not busy with avId: %s, busy: %s ' % (avId, self.busy))
          taskMgr.remove(self.uniqueName('clearMovie'))
          self.sendClearMovie(None)
          return
  