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

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