NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

egoChangeSmoother.py (2997B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\util\egoChangeSmoother.py
      2 import blue
      3 import geo2
      4 import trinity
      5 
      6 class EgoChangeSmoother(object):
      7     __notifyevents__ = ['ProcessSessionChange', 'OnBallAdded']
      8 
      9     def __init__(self, timelimit = 10.0):
     10         self.timelimit = timelimit
     11         self._missingBalls = None
     12         self._offsets = {}
     13         self._easeCurve = trinity.Tr2CurveScalar()
     14         self._easeCurve.AddKey(0, 1, trinity.Tr2CurveInterpolation.HERMITE, 0, 0)
     15         self._easeCurve.AddKey(1, 0, trinity.Tr2CurveInterpolation.HERMITE, 0, 0)
     16         self._lastEgo = session.structureid or session.shipid
     17         sm.RegisterNotify(self)
     18 
     19     def ProcessSessionChange(self, isRemote, sess, change):
     20         if 'shipid' in change:
     21             self._UpdateEgoOffset(change['shipid'][1])
     22         if 'structureid' in change:
     23             self._UpdateEgoOffset(change['structureid'][1])
     24 
     25     def OnBallAdded(self, slimItem):
     26         if self._missingBalls is not None and slimItem.itemID in self._missingBalls:
     27             self._UpdateOffset(*self._missingBalls)
     28 
     29     def _UpdateOffset(self, oldEgo, newEgo):
     30         ballpark = sm.GetService('michelle').GetBallpark()
     31         if ballpark is not None:
     32             old = ballpark.GetBall(oldEgo)
     33             new = ballpark.GetBall(newEgo)
     34             if old and new:
     35                 timestamp = blue.os.GetSimTime()
     36                 offset = (old.x - new.x, old.y - new.y, old.z - new.z)
     37                 self._offsets[self._lastEgo] = (timestamp, offset)
     38                 self._missingBalls = None
     39             else:
     40                 self._missingBalls = (oldEgo, newEgo)
     41 
     42     def _UpdateEgoOffset(self, newEgo):
     43         if self._lastEgo != newEgo:
     44             if self._lastEgo:
     45                 self._UpdateOffset(self._lastEgo, newEgo)
     46             self._lastEgo = newEgo
     47 
     48     def _GetScaledOffset(self, easeTime, currTime, timestamp, offset):
     49         timeSinceOffset = blue.os.TimeDiffInMs(timestamp, currTime) / 1000.0
     50         return geo2.Vec3Scale(offset, self._easeCurve.GetValueAt(timeSinceOffset / easeTime))
     51 
     52     def GetTotalOffset(self, easeTime):
     53         if easeTime <= 0:
     54             raise RuntimeError('The easeTime must be more than 0. {} given.'.format(easeTime))
     55         if easeTime > self.timelimit:
     56             raise RuntimeError('The easeTime ({}) supplied must be less than the timelimit ({}).'.format(easeTime, self.timelimit))
     57         total = (0, 0, 0)
     58         if not self._offsets:
     59             return total
     60         currTime = blue.os.GetSimTime()
     61         updatedOffsets = {}
     62         for key, (timestamp, offset) in self._offsets.iteritems():
     63             scaledOffset = self._GetScaledOffset(easeTime, currTime, timestamp, offset)
     64             total = geo2.Vec3Add(total, scaledOffset)
     65             if any((abs(x) > 0.001 for x in scaledOffset)):
     66                 updatedOffsets[key] = (timestamp, offset)
     67 
     68         self._offsets = updatedOffsets
     69         return total