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