dropboxController.py (4726B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\structure\dropbox\dropboxController.py 2 from player_messaging.client.ui_message import prompt_player_fsd_dialog 3 from signals import Signal 4 from eve.common.script.sys.idCheckers import IsDockableStructure 5 from eveexceptions.const import UE_TYPEIDL 6 from structures.types import GetAllowedFuelTypeIDs 7 8 class DropBoxController(object): 9 __notifyevents__ = ['OnItemChange'] 10 11 def __init__(self, structureID, shipID): 12 self.structureID = structureID 13 self.forShipID = shipID 14 self.on_items_added = Signal(signalName='on_items_added') 15 self.on_items_removed = Signal(signalName='on_items_removed') 16 self.on_items_updated = Signal(signalName='on_items_updated') 17 self.typeID = sm.GetService('structureDirectory').GetStructureInfo(self.structureID).typeID 18 self._SetItemFilter() 19 self.itemsToBeTransferred = {} 20 sm.RegisterNotify(self) 21 22 def _SetItemFilter(self): 23 if self.IsDockableStructure(): 24 self.itemFilter = lambda x: True 25 else: 26 allowedTypes = GetAllowedFuelTypeIDs(self.typeID) 27 self.itemFilter = lambda x: x.typeID in allowedTypes 28 29 def IsDockableStructure(self): 30 return IsDockableStructure(self.typeID) 31 32 def GetNumToBeTransferred(self): 33 return len(self.itemsToBeTransferred) 34 35 def IsItemAllowed(self, item): 36 return self.itemFilter(item) 37 38 def AddManyItems(self, items): 39 if self.forShipID != session.shipid: 40 raise RuntimeError("Try to add items to controller you shouldn't have") 41 invalidItemIDs = set() 42 invalidTypeIDs = set() 43 for each in items: 44 if each.locationID != self.forShipID: 45 invalidItemIDs.add(each.itemID) 46 elif each.flagID not in const.cargoHoldsValidForDeliveryService: 47 invalidItemIDs.add(each.itemID) 48 elif not self.IsItemAllowed(each): 49 invalidItemIDs.add(each.itemID) 50 if each.itemID in invalidItemIDs: 51 invalidTypeIDs.add(each.typeID) 52 continue 53 self.itemsToBeTransferred[each.itemID] = each 54 55 self.on_items_added({x.itemID for x in items} - invalidItemIDs) 56 if invalidItemIDs: 57 prompt_player_fsd_dialog('FailedToAddToDropbox', {'itemList': (UE_TYPEIDL, list(invalidTypeIDs))}) 58 59 def GetItem(self, itemID): 60 return self.itemsToBeTransferred.get(itemID) 61 62 def GetItems(self): 63 return self.itemsToBeTransferred.values() 64 65 def ResetItems(self, itemIDs): 66 for itemID in itemIDs: 67 self.itemsToBeTransferred.pop(itemID, None) 68 69 self.on_items_removed(itemIDs) 70 71 def RemoveItems(self, itemIDs): 72 for each in itemIDs: 73 self.itemsToBeTransferred.pop(each, None) 74 75 self.on_items_removed(itemIDs) 76 77 def OnItemChange(self, item, change, location): 78 itemIDsUpdated = set() 79 toRemove = set() 80 if item.itemID in self.itemsToBeTransferred: 81 if self._ShouldItemBeForcefullyRemoved(item): 82 toRemove.add(item.itemID) 83 else: 84 myItem = self.itemsToBeTransferred[item.itemID] 85 if myItem.stacksize != item.stacksize or myItem.quantity != item.quantity: 86 self.itemsToBeTransferred[item.itemID] = item 87 itemIDsUpdated.add(item.itemID) 88 if toRemove: 89 self.RemoveItems(toRemove) 90 self.on_items_updated(itemIDsUpdated) 91 92 def _ShouldItemBeForcefullyRemoved(self, item): 93 if item.stacksize == 0 and item.quantity == 0: 94 return True 95 if item.locationID != self.forShipID: 96 return True 97 if item.flagID not in const.cargoHoldsValidForDeliveryService: 98 return True 99 return False 100 101 def GetStructureID(self): 102 return self.structureID 103 104 def TransferItems(self): 105 allItems = self.itemsToBeTransferred.copy() 106 movedItemIDs = sm.RemoteSvc('structureCargoDelivery').DropOffItems(allItems.keys(), session.shipid, self.structureID) 107 itemRecsMoved = [ x for x in allItems.itervalues() if x.itemID in movedItemIDs ] 108 if movedItemIDs: 109 structureName = cfg.evelocations.Get(self.structureID).name 110 if self.IsDockableStructure(): 111 msg = 'ItemsTransferredtoHangar' 112 else: 113 msg = 'ItemsTransferredtoFuelBay' 114 prompt_player_fsd_dialog(msg, {'numItems': len(movedItemIDs), 115 'structureName': structureName}, modal=False) 116 self.ResetItems(movedItemIDs) 117 return itemRecsMoved