historical/toontown-classic.git/toontown/pets/PetManagerAI.py
2024-01-16 11:20:27 -06:00

96 lines
3.2 KiB
Python

import json
import os
import random
import time
from direct.directnotify import DirectNotifyGlobal
from toontown.pets import PetDNA
from toontown.pets import PetUtil
from toontown.pets.PetNameGenerator import PetNameGenerator
MINUTE = 60
HOUR = 60 * MINUTE
DAY = 24 * HOUR
def getDayId():
return int(time.time() // DAY)
class PetManagerAI:
notify = DirectNotifyGlobal.directNotify.newCategory('PetManagerAI')
cachePath = config.GetString('air-pet-cache', 'backups/pets/')
def __init__(self, air):
self.air = air
self.cacheFile = '%spets_%d.json' % (self.cachePath, self.air.districtId)
if not os.path.exists(self.cachePath):
os.makedirs(self.cachePath)
if os.path.isfile(self.cacheFile):
with open(self.cacheFile, 'rb') as f:
data = f.read()
try:
self.seeds = json.loads(data)
except ValueError:
self.seeds = {}
if self.seeds.get('day', -1) != getDayId():
self.seeds = {}
else:
self.seeds = {}
self.nameGenerator = PetNameGenerator()
def getAvailablePets(self, firstNumPets, secondNumPets):
numPets = firstNumPets + secondNumPets
if not self.seeds.get(str(numPets), []) or self.seeds.get('day', -1) != getDayId():
self.seeds[str(numPets)] = random.sample(xrange(256), numPets)
self.updatePetSeedCache()
return self.seeds.get(str(numPets), [numPets])[0:numPets]
def updatePetSeedCache(self):
self.seeds['day'] = getDayId()
with open(self.cacheFile, 'wb') as f:
f.write(json.dumps(self.seeds))
def createNewPetFromSeed(self, avId, seed, nameIndex, gender, safeZoneId):
av = self.air.doId2do.get(avId)
if not av:
return
petName = self.nameGenerator.getName(nameIndex)
_, dna, traitSeed = PetUtil.getPetInfoFromSeed(seed, safeZoneId)
head, ears, nose, tail, bodyTexture, color, colorScale, eyeColor, _ = dna
numGenders = len(PetDNA.PetGenders)
gender %= numGenders
fields = {'setOwnerId': avId, 'setPetName': petName, 'setTraitSeed': traitSeed, 'setSafeZone': safeZoneId,
'setHead': head, 'setEars': ears, 'setNose': nose, 'setTail': tail, 'setBodyTexture': bodyTexture,
'setColor': color, 'setColorScale': colorScale, 'setEyeColor': eyeColor, 'setGender': gender}
def response(doId):
if not doId:
self.notify.warning('Cannot create pet for %s!' % avId)
return
self.air.writeServerEvent('bought-pet', avId=avId, petId=doId)
av.b_setPetId(doId)
self.air.dbInterface.createObject(self.air.dbId, self.air.dclassesByName['DistributedPetAI'],
{key: (value,) for key, value in fields.items()}, response)
def deleteToonsPet(self, avId):
av = self.air.doId2do.get(avId)
if not av:
return
petId = av.getPetId()
pet = self.air.doId2do.get(petId)
if pet:
pet.requestDelete()
av.b_setPetId(0)
self.air.writeServerEvent('returned-pet', avId=avId, petId=petId)