from direct.distributed import DistributedObject from direct.directnotify import DirectNotifyGlobal from toontown.toonbase import ToontownGlobals from panda3d.core import * from math import * import math from direct.fsm.FSM import FSM from toontown.minigame import ArrowKeys from direct.showbase import PythonUtil from direct.showutil import Rope from direct.task import Task from direct.distributed.ClockDelta import * from . import BuildGeometry from toontown.golf import GolfGlobals from toontown.golf import PhysicsWorldBase import random, time from direct.interval.SoundInterval import SoundInterval def scalp(vec, scal): vec0 = vec[0] * scal vec1 = vec[1] * scal vec2 = vec[2] * scal vec = Vec3(vec0, vec1, vec2) def length(vec): return sqrt(vec[0] ** 2 + vec[1] ** 2 + vec[2] ** 2) class DistributedPhysicsWorld(DistributedObject.DistributedObject, PhysicsWorldBase.PhysicsWorldBase): notify = DirectNotifyGlobal.directNotify.newCategory('DistributedPhysicsWorld') def __init__(self, cr): DistributedObject.DistributedObject.__init__(self, cr) PhysicsWorldBase.PhysicsWorldBase.__init__(self, 1) self.accept('ode toggle contacts', self.__handleToggleContacts) self.physicsSfxDict = {} def generate(self): DistributedObject.DistributedObject.generate(self) self.setupSimulation() self.startSim() def delete(self): DistributedObject.DistributedObject.delete(self) PhysicsWorldBase.PhysicsWorldBase.delete(self) taskMgr.remove('simulation task') self.ignoreAll() for index in self.physicsSfxDict: sfxPair = self.physicsSfxDict[index] sfxPair[0].stop() sfxPair[1].finish() self.physicsSfxDict = None return def clientCommonObject(self, type, commonId, pos, hpr, sizeX, sizeY, moveDistance): data = self.createCommonObject(type, commonId, pos, hpr, sizeX, sizeY, moveDistance) index = data[1] if type == 3: cross = self.commonObjectDict[commonId][2] for pair in self.odePandaRelationList: pandaNodePathGeom = pair[0] odeBody = pair[1] if odeBody == cross: base.sfxPlayer.setCutoffDistance(240) self.notify.debug('nodePath = %s' % pandaNodePathGeom) windmillSfx = loader.loadSfx('phase_6/audio/sfx/Golf_Windmill_Loop.ogg') windMillSoundInterval = SoundInterval(windmillSfx, node=pandaNodePathGeom, listenerNode=base.camera, seamlessLoop=True, volume=0.5) windMillSoundInterval.loop() self.physicsSfxDict[index] = (windmillSfx, windMillSoundInterval) break elif type == 4: box = self.commonObjectDict[commonId][2] for pair in self.odePandaRelationList: pandaNodePathGeom = pair[0] odeBody = pair[1] if odeBody == box: self.notify.debug('nodePath = %s' % pandaNodePathGeom) moverSfx = loader.loadSfx('phase_6/audio/sfx/Golf_Moving_Barrier.ogg') moverSoundInterval = SoundInterval(moverSfx, node=pandaNodePathGeom, listenerNode=base.camera, seamlessLoop=True, volume=0.5) moverSoundInterval.start() self.physicsSfxDict[index] = (moverSfx, moverSoundInterval, index) break def commonObjectEvent(self, key, model, type, force, event): self.notify.debug('commonObjectForceEvent key %s model %s type %s force %s event %s' % (key, model, type, force, event)) if type == 4: if event > 0: self.physicsSfxDict[key][1].start() def setCommonObjects(self, objectData): self.useCommonObjectData(objectData) def upSendCommonObjects(self): self.sendUpdate('upSetCommonObjects', [self.getCommonObjectData()]) def __handleToggleContacts(self, message = None): if self.showContacts: self.showContacts = 0 else: self.showContacts = 1