def select(self, srcSimObject, tgtSimObject, charIndex, doubleClick, modifier_shift): # modifier_shift reserved for mob/character info window mob = self.mobLookup[srcSimObject] player = mob.player if not player: traceback.print_stack() print "AssertionError: mob is no player mob!" return mob = player.party.members[charIndex].mob if mob.detached: player.sendGameText( RPG_MSG_GAME_DENIED, r"%s is no longer of this world and cannot interact with it.\n" % mob.name ) target = self.mobLookup[tgtSimObject] if modifier_shift: player.avatar.sendTgtDesc(mob, target) return if target.detached and not target.player: try: if target.kingKiller and target.kingTimer > 0: cmobs = [m.mob for m in target.kingKiller.player.party.members] for a in target.kingKiller.player.alliance.members: for m in a.party.members: cmobs.append(m.mob) if mob not in cmobs: player.sendGameText(RPG_MSG_GAME_LOOT, r"You cannot loot this corpse at this time.\n") return except: traceback.print_exc() # monsters get flesh and blood, bad place for this if target.genLoot and target.loot: target.genLoot = False if not target.loot.generateCorpseLoot(): target.loot = None if player.realm == RPG_REALM_MONSTER and target.spawn.race not in ("Undead", "Golem"): if target.loot and not target.loot.fleshDone and len(target.loot.items) < 16: from item import ItemProto fproto = ItemProto.byName("Flesh and Blood") flesh = fproto.createInstance() flesh.slot = -1 target.loot.items.append(flesh) target.loot.fleshDone = True # currently the only reason mobs get detached is due to death if not target.loot or not len(target.loot.items): if target.loot: target.loot.giveMoney(player) player.sendGameText(RPG_MSG_GAME_LOOT, r"The corpse crumbles to dust!\n") self.removeMob(target) return if target.master and target.master.player: player.sendGameText(RPG_MSG_GAME_LOOT, r"You cannot loot player pets.\n") return if target.looter and target.looter != mob.player: player.sendGameText( RPG_MSG_GAME_LOOT, r"%s is already looting the corpse.\n" % target.looter.curChar.name ) return elif target.looter == player: return # no reloot # end current looting if player.looting: player.looting.looter = None player.looting = None # loot! target.looter = player player.looting = target loot = dict((x, item.itemInfo) for x, item in enumerate(target.loot.items)) target.loot.giveMoney(player) player.mind.callRemote("setLoot", loot) return False if target.player: # find first attached party member for c in target.player.party.members: if not c.dead: target = c.mob break self.setTarget(mob, target, checkVisibility=True) if doubleClick: # holy cow player.avatar.perspective_doCommand("INTERACT", [mob.player.curChar.mob.charIndex]) # send player mob's id for mouse link player.mind.callRemote("mouseSelect", charIndex, target.id) return True
def select(self, srcSimObject, tgtSimObject, charIndex, doubleClick, modifier_shift): # modifier_shift reserved for mob/character info window mob = self.mobLookup[srcSimObject] player = mob.player if not player: traceback.print_stack() print "AssertionError: mob is no player mob!" return mob = player.party.members[charIndex].mob if mob.detached: player.sendGameText( RPG_MSG_GAME_DENIED, r'%s is no longer of this world and cannot interact with it.\n' % mob.name) target = self.mobLookup[tgtSimObject] if modifier_shift: player.avatar.sendTgtDesc(mob, target) return if target.detached and not target.player: try: if target.kingKiller and target.kingTimer > 0: cmobs = [ m.mob for m in target.kingKiller.player.party.members ] for a in target.kingKiller.player.alliance.members: for m in a.party.members: cmobs.append(m.mob) if mob not in cmobs: player.sendGameText( RPG_MSG_GAME_LOOT, r'You cannot loot this corpse at this time.\n') return except: traceback.print_exc() #monsters get flesh and blood, bad place for this if target.genLoot and target.loot: target.genLoot = False if not target.loot.generateCorpseLoot(): target.loot = None if player.realm == RPG_REALM_MONSTER and \ target.spawn.race not in ("Undead","Golem"): if target.loot and not target.loot.fleshDone and \ len(target.loot.items) < 16: from item import ItemProto fproto = ItemProto.byName("Flesh and Blood") flesh = fproto.createInstance() flesh.slot = -1 target.loot.items.append(flesh) target.loot.fleshDone = True #currently the only reason mobs get detached is due to death if not target.loot or not len(target.loot.items): if target.loot: target.loot.giveMoney(player) player.sendGameText(RPG_MSG_GAME_LOOT, r'The corpse crumbles to dust!\n') self.removeMob(target) return if target.master and target.master.player: player.sendGameText(RPG_MSG_GAME_LOOT, r'You cannot loot player pets.\n') return if target.looter and target.looter != mob.player: player.sendGameText( RPG_MSG_GAME_LOOT, r'%s is already looting the corpse.\n' % target.looter.curChar.name) return elif target.looter == player: return #no reloot #end current looting if player.looting: player.looting.looter = None player.looting = None #loot! target.looter = player player.looting = target loot = dict( (x, item.itemInfo) for x, item in enumerate(target.loot.items)) target.loot.giveMoney(player) player.mind.callRemote("setLoot", loot) return False if target.player: #find first attached party member for c in target.player.party.members: if not c.dead: target = c.mob break self.setTarget(mob, target, checkVisibility=True) if doubleClick: #holy cow player.avatar.perspective_doCommand( "INTERACT", [mob.player.curChar.mob.charIndex]) #send player mob's id for mouse link player.mind.callRemote("mouseSelect", charIndex, target.id) return True