96 lines
3.2 KiB
Python
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)
|