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

posAnchorSvc.py (6731B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\parklife\posAnchorSvc.py
      2 import blue
      3 import evetypes
      4 import geo2
      5 import telemetry
      6 import trinity
      7 from carbon.common.script.sys.service import Service
      8 from carbon.common.script.util import timerstuff
      9 from carbonui import uiconst
     10 from eveexceptions import UE_TYPEID
     11 from inventorycommon.const import groupControlTower
     12 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     13 
     14 class PosAnchorSvc(Service):
     15     __guid__ = 'svc.posAnchor'
     16     __exportedcalls__ = {}
     17     __notifyevents__ = ['DoBallRemove', 'ProcessSessionChange', 'DoBallsRemove']
     18     __dependencies__ = ['michelle']
     19 
     20     def __init__(self):
     21         Service.__init__(self)
     22         self.updateTimer = None
     23         self.cube = None
     24         self.cursor = None
     25         self.selection = None
     26         self.cursorSize = 2500.0
     27         self.active = 0
     28         self.posID = None
     29 
     30     def Run(self, memStream = None):
     31         Service.Run(self, memStream)
     32 
     33     def Stop(self, stream):
     34         self.KillTimer()
     35         self.HideCursor()
     36         Service.Stop(self)
     37 
     38     def ProcessSessionChange(self, isremote, session, change):
     39         self.KillTimer()
     40         self.HideCursor()
     41 
     42     def StartMovingCursor(self):
     43         pass
     44 
     45     def StopMovingCursor(self):
     46         pass
     47 
     48     @telemetry.ZONE_METHOD
     49     def DoBallsRemove(self, pythonBalls, isRelease):
     50         for ball, slimItem, terminal in pythonBalls:
     51             if ball and slimItem and slimItem.itemID is not None and slimItem.itemID >= 0 and slimItem.itemID == self.posID:
     52                 self.CancelAchorPosSelect()
     53 
     54     def DoBallRemove(self, ball, slimItem, terminal):
     55         if ball is None:
     56             return
     57         self.LogInfo('DoBallRemove::posAnchorSvc', ball.id)
     58         if slimItem is None:
     59             return
     60         if slimItem.itemID is None or slimItem.itemID < 0:
     61             return
     62         if slimItem.itemID == self.posID:
     63             self.CancelAchorPosSelect()
     64 
     65     def ShowCursor(self):
     66         scene = sm.GetService('sceneManager').GetRegisteredScene('default')
     67         if scene is None:
     68             return
     69         self.cursor = trinity.Load('res:/Model/UI/posCursor.red')
     70         self.cube = trinity.Load('res:/Model/UI/posGlassCube.red')
     71         blue.pyos.synchro.SleepWallclock(1)
     72         self.yCursor = [self.cursor.children[0], self.cursor.children[1]]
     73         self.xCursor = [self.cursor.children[4], self.cursor.children[5]]
     74         self.zCursor = [self.cursor.children[2], self.cursor.children[3]]
     75         self.cube.scaling = (self.boxWidth, self.boxWidth, self.boxWidth)
     76         self.cursor.scaling = (50, 50, 50)
     77         self.cursor.useDistanceBasedScale = True
     78         self.cursor.distanceBasedScaleArg1 = 0.00015
     79         self.cursor.distanceBasedScaleArg2 = 0
     80         bp = sm.GetService('michelle').GetBallpark()
     81         ball = bp.GetBall(self.posID)
     82         pos = ball.GetVectorAt(blue.os.GetSimTime())
     83         self.cursor.translation = (pos.x, pos.y, pos.z)
     84         scene.objects.append(self.cursor)
     85         scene.objects.append(self.cube)
     86         self.Update()
     87         self.active = 1
     88 
     89     def RefreshCursorSize(self):
     90         if self.cursor:
     91             self.cursor.scaling.SetXYZ(self.cursorSize, self.cursorSize, self.cursorSize)
     92 
     93     def ScaleCursorUp(self):
     94         self.cursorSize = self.cursorSize * 1.1
     95         self.RefreshCursorSize()
     96 
     97     def ScaleCursorDown(self):
     98         self.cursorSize = max(self.cursorSize / 1.1, 5.0)
     99         self.RefreshCursorSize()
    100 
    101     def IsActive(self):
    102         return self.active
    103 
    104     def HideCursor(self):
    105         self.active = 0
    106         if not sm.IsServiceRunning('gameui'):
    107             return
    108         scene = sm.StartService('sceneManager').GetRegisteredScene('default')
    109         if self.cursor and self.cursor in scene.objects:
    110             scene.objects.remove(self.cursor)
    111         if self.cube and self.cube in scene.objects:
    112             scene.objects.remove(self.cube)
    113         self.cursor = None
    114         self.cube = None
    115 
    116     def MoveCursor(self, tf, dx, dy, camera):
    117         dev = trinity.device
    118         X = float(dx) / float(dev.width)
    119         Y = float(dy) / float(dev.height) * -1
    120         upVec = geo2.Vec3Scale(camera.GetYAxis(), Y)
    121         rightVec = geo2.Vec3Scale(camera.GetXAxis(), X)
    122         pos = geo2.Vec3Add(rightVec, upVec)
    123         cameraDistance = geo2.Vec3Length(geo2.Vec3Subtract(camera.eyePosition, self.cursor.translation))
    124         pos = geo2.Vec3Scale(pos, cameraDistance * 3.0)
    125         if tf in self.yCursor:
    126             pos = (0.0, pos[1], 0.0)
    127         elif tf in self.xCursor:
    128             pos = (pos[0], 0.0, 0.0)
    129         elif tf in self.zCursor:
    130             pos = (0.0, 0.0, pos[2])
    131         self.cursor.translation = geo2.Vec3Add(self.cursor.translation, pos)
    132 
    133     def StartAnchorPosSelect(self, posID):
    134         if self.IsActive():
    135             if posID == self.posID:
    136                 return
    137             self.CancelAchorPosSelect()
    138         bp = sm.GetService('michelle').GetBallpark()
    139         slimItem = bp.GetInvItem(posID)
    140         if slimItem is None:
    141             return
    142         self.posID = posID
    143         typeID = slimItem.typeID
    144         self.boxWidth = evetypes.GetRadius(typeID)
    145         item = sm.StartService('michelle').GetItem(posID)
    146         if item.groupID == groupControlTower:
    147             if prompt_player_fsd_dialog('ConfirmStructureAnchor', {'item': (UE_TYPEID, item.typeID)}, uiconst.YESNO, suppress=uiconst.ID_YES) != uiconst.ID_YES:
    148                 return
    149             self.SubmitAnchorPosSelect()
    150         else:
    151             self.ShowCursor()
    152             self.StartTimer()
    153 
    154     def CancelAchorPosSelect(self):
    155         self.KillTimer()
    156         self.HideCursor()
    157         self.posID = None
    158 
    159     def SubmitAnchorPosSelect(self):
    160         typeID = sm.GetService('michelle').GetItem(self.posID).typeID
    161         anchoringDelay = sm.GetService('godma').GetType(typeID).anchoringDelay
    162         bp = sm.GetService('michelle').GetBallpark()
    163         ship = bp.GetBall(session.shipid)
    164         x = y = z = 0
    165         if sm.StartService('michelle').GetItem(self.posID).groupID != groupControlTower:
    166             x, y, z = self.cube.translation[0] + ship.x, self.cube.translation[1] + ship.y, self.cube.translation[2] + ship.z
    167         sm.GetService('pwn').Anchor(self.posID, (x, y, z))
    168         self.CancelAchorPosSelect()
    169         prompt_player_fsd_dialog('AnchoringObject', {'delay': anchoringDelay / 1000.0})
    170 
    171     def StartTimer(self):
    172         if self.updateTimer:
    173             return
    174         self.timerCount = 0
    175         self.updateTimer = timerstuff.AutoTimer(25, self.Update)
    176 
    177     def KillTimer(self):
    178         self.updateTimer = None
    179 
    180     def Update(self):
    181         self.cube.translation = self.cursor.translation