Python Toontown 在扔馅饼时出现错误

142 阅读2分钟

在开发一个现在已经关闭的迪士尼服务器的私服时,每当客户端扔馅饼时,就会崩溃并给出以下错误:

File "toontown\toon\Toon.py", line 3029, in getTossPieInterval
    endPos=Point3(0, dist, 0), duration=time)
TypeError: __init__() got an unexpected keyword argument 'startPos'
Press any key to continue . . .

以下是可以复现该错误的代码:

def getTossPieInterval(self, x, y, z, h, power, throwType, beginFlyIval = Sequence()):
    from toontown.toonbase import ToontownBattleGlobals
    from toontown.battle import BattleProps
    pie = self.getPieModel()
    flyPie = pie.copyTo(NodePath('a'))
    pieName = ToontownBattleGlobals.pieNames[self.pieType]
    pieType = BattleProps.globalPropPool.getPropType(pieName)
    animPie = Sequence()
    if pieType == 'actor':
        animPie = ActorInterval(pie, pieName, startFrame=48)
    sound = loader.loadSfx('phase_3.5/audio/sfx/AA_pie_throw_only.ogg')
    if throwType == ToontownGlobals.PieThrowArc:
        t = power / 100.0
        dist = 100 - 70 * t
        time = 1 + 0.5 * t
        proj = ProjectileInterval(None, startPos=Point3(0, 0, 0),
                                  endPos=Point3(0, dist, 0), duration=time)
        relVel = proj.startVel
    elif throwType == ToontownGlobals.PieThrowLinear:
        magnitude = power / 2. + 25

        relVel = Vec3(0, 1, 0.25)
        relVel.normalize()
        relVel *= magnitude

    def getVelocity(toon = self, relVel = relVel):
        return render.getRelativeVector(toon, relVel)

    toss = Track((0, Sequence(Func(self.setPosHpr, x, y, z, h, 0, 0), Func(pie.reparentTo, self.rightHand), Func(pie.setPosHpr, 0, 0, 0, 0, 0, 0), Parallel(ActorInterval(self, 'throw', startFrame=48), animPie), Func(self.loop, 'neutral'))), (16.0 / 24.0, Func(pie.detachNode)))
    fly = Track((14.0 / 24.0, SoundInterval(sound, node=self)), (16.0 / 24.0, Sequence(Func(flyPie.reparentTo, render), Func(flyPie.setScale, self.pieScale), Func(flyPie.setPosHpr, self, 0.52, 0.97, 2.24, 89.42, -10.56, 87.94), beginFlyIval, ProjectileInterval(flyPie, startVel=getVelocity, duration=3), Func(flyPie.detachNode))))
    return (toss, fly, flyPie)

2、解决方案

从错误信息可以看出,错误发生在 ProjectileInterval 的实例化上。检查该类的文档发现,它确实没有 startPos 参数。因此,解决方法是删除 startPos 参数。

proj = ProjectileInterval(None, endPos=Point3(0, dist, 0), duration=time)

修改后的代码如下:

def getTossPieInterval(self, x, y, z, h, power, throwType, beginFlyIval = Sequence()):
    from toontown.toonbase import ToontownBattleGlobals
    from toontown.battle import BattleProps
    pie = self.getPieModel()
    flyPie = pie.copyTo(NodePath('a'))
    pieName = ToontownBattleGlobals.pieNames[self.pieType]
    pieType = BattleProps.globalPropPool.getPropType(pieName)
    animPie = Sequence()
    if pieType == 'actor':
        animPie = ActorInterval(pie, pieName, startFrame=48)
    sound = loader.loadSfx('phase_3.5/audio/sfx/AA_pie_throw_only.ogg')
    if throwType == ToontownGlobals.PieThrowArc:
        t = power / 100.0
        dist = 100 - 70 * t
        time = 1 + 0.5 * t
        proj = ProjectileInterval(None, endPos=Point3(0, dist, 0), duration=time)
        relVel = proj.startVel
    elif throwType == ToontownGlobals.PieThrowLinear:
        magnitude = power / 2. + 25

        relVel = Vec3(0, 1, 0.25)
        relVel.normalize()
        relVel *= magnitude

    def getVelocity(toon = self, relVel = relVel):
        return render.getRelativeVector(toon, relVel)

    toss = Track((0, Sequence(Func(self.setPosHpr, x, y, z, h, 0, 0), Func(pie.reparentTo, self.rightHand), Func(pie.setPosHpr, 0, 0, 0, 0, 0, 0), Parallel(ActorInterval(self, 'throw', startFrame=48), animPie), Func(self.loop, 'neutral'))), (16.0 / 24.0, Func(pie.detachNode)))
    fly = Track((14.0 / 24.0, SoundInterval(sound, node=self)), (16.0 / 24.0, Sequence(Func(flyPie.reparentTo, render), Func(flyPie.setScale, self.pieScale), Func(flyPie.setPosHpr, self, 0.52, 0.97, 2.24, 89.42, -10.56, 87.94), beginFlyIval, ProjectileInterval(flyPie, startVel=getVelocity, duration=3), Func(flyPie.detachNode))))
    return (toss, fly, flyPie)

应用此更改后,该错误将得以解决。