Beispiel #1
0
    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
Beispiel #2
0
    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