def checkanvilandforge(char):
	if char.gm:
		return True
	
	# Check dynamic items.
	forge = 0
	anvil = 0
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 5)
	for item in items:
		if item.id == 0xFAF or item.id == 0xFB0:
			anvil = True
		elif item.id == 0xFB1 or (item.id >= 0x197A and item.id <= 0x19A9):
			forge = True

		if anvil and forge:
			return True
			
	# Check for static items
	for x in range(-2, 3):
		for y in range(-2, 3):
			statics = wolfpack.statics(char.pos.x + x, char.pos.y + y, char.pos.map, True)
			
			for tile in statics:
				dispid = tile[0]
				if dispid == 0xFAF or dispid == 0xFB0:
					anvil = True
				elif dispid == 0xFB1 or (dispid >= 0x197A and dispid <= 0x19A9):
					forge = True

				if anvil and forge:
					return True

	return False
Example #2
0
def check_spot(char):
    x = char.pos.x
    y = char.pos.y
    z = char.pos.z
    map = char.pos.map

    # We can build on floor
    # Check for dynamic items
    tile = wolfpack.items(x, y, map)
    if tile:
        dynamic_floor = wolfpack.tiledata(tile[0].id)["floor"]
        if len(tile) and not dynamic_floor:
            return False

    # Check for dynamic items
    tile = wolfpack.statics(x, y, map, True)
    if tile:
        for i in tile:
            height = i[3] > z and i[3] < (
                z + 20)  # something is between the ground and +20?
            static_floor = wolfpack.tiledata(i[0])["floor"]
            static_roof = wolfpack.tiledata(i[0])["flag1"] & 0x10
            if len(
                    tile
            ) and height:  #and and not static_floor and not static_roof: # seems that the floor flag is not used for all
                return False
    return True
Example #3
0
def onDamage(char, type, amount, source):
	# Find the spiderweb
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

	spiderweb = None

	for item in items:
		if item.hasscript( 'spiderweb' ):
			spiderweb = item
			break

	if spiderweb:
		if type == DAMAGE_MAGICAL:
			spiderweb.health = max(0, spiderweb.health - amount * 2)
		elif type == DAMAGE_PHYSICAL:
			spiderweb.health = max(0, spiderweb.health - amount * 4)

		if spiderweb.health == 0:
			spiderweb.delete()

			targets = wolfpack.chars(char.pos.x, char.pos.y, char.pos.map, 0)

			for target in targets:
				target.removescript( 'spiderweb' )

	return amount
Example #4
0
	def target(self, char, mode, targettype, target, args, item):
		if not self.consumerequirements(char, mode, args, target, item):
			return

		char.turnto(target)

		# Enumerate chars
		chars = wolfpack.chars(target.x, target.y, char.pos.map, 8)
		items = wolfpack.items(target.x, target.y, char.pos.map, 8)
		for target in chars:
			if char == target or not target.npc or target.summontimer == 0:
				continue

			if not mayAreaHarm(char, target):
				continue

			dispelChance = 50.0 + (100 * ((char.magery / 10.0 - (target.getintproperty('dispeldifficulty', 1) / 10)) / ((target.getintproperty('dispelfocus', 1) / 10) * 2))) / 100.0

			if dispelChance > random.random():
				target.effect(0x3779, 10, 20)
				target.fight(char)
			else:
				wolfpack.effect(0x3728, target.pos, 8, 20)
				target.soundeffect(0x201)
				target.delete()

		# Field spells
		for item in items:
			if item.hastag('dispellable_field'):
				wolfpack.effect(0x376a, item.pos, 9, 20)
				item.soundeffect(0x201)
				item.delete()
Example #5
0
def onWalk(char, dir, sequence):
	# Find the spiderweb
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

	spiderweb = None

	for item in items:
		if item.hasscript( 'spiderweb' ):
			spiderweb = item
			break

	if spiderweb:
		# Damage the web until it disappears
		spiderweb.health = max(0, spiderweb.health - ceil(char.strength / 2.0))

		if spiderweb.health == 0:
			spiderweb.delete()
		else:
			if char.socket:
				if random.random() <= 0.25:
					char.socket.sysmessage( tr('You damage the spiderweb.') )
				packet = wolfpack.packet(0x21, 8)
				packet.setbyte(1, sequence)
				packet.setshort(2, char.pos.x)
				packet.setshort(4, char.pos.y)
				packet.setbyte(6, char.direction)
				packet.setbyte(7, char.pos.z)
				packet.send(char.socket)
				char.socket.walksequence = 0
			return True

	char.removescript( 'spiderweb' )
	if char.socket:
		char.socket.sysmessage( tr('You manage to break free of the spiderweb.') )
	return False
Example #6
0
def dropitem(item, char, container):
    item.decay = True  # Make SURE the item decays
    item.movable = 1  # Also make sure the item is movable

    console.log(
        LOG_MESSAGE, "Dropped item 0x%x (%s, %u) for npc 0x%x.\n" %
        (item.serial, item.baseid, item.amount, char.serial))

    if container:
        if not utilities.tocontainer(item, container):
            item.update()
    else:
        items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)
        for stackable in items:
            if stackable.pos.z == item.pos.z:
                if item.canstack(stackable):
                    # We can completely stack the item
                    if stackable.amount + item.amount <= 65535:
                        stackable.amount += item.amount
                        stackable.update()
                        item.delete()
                        return

        item.moveto(char.pos)
        item.update()
Example #7
0
def effect(char, args):
    # Delete the spiritspeaking flag and set the
    # skill delay for this client.
    socket = char.socket
    socket.deltag('spiritspeaking')
    socket.settag('skill_delay',
                  int(wolfpack.time.currenttime() + SPSPEAK_DELAY))

    # Check for skill usage success
    if not char.checkskill(SPIRITSPEAK, 0, 1000):
        char.socket.clilocmessage(
            502443)  # You fail your attempt at contacting the netherworld.
        return

    # Find corpses around the user of this skill
    # 3 tiles range.
    pos = char.pos
    items = wolfpack.items(pos.x, pos.y, pos.map, 3)
    corpses = []
    for item in items:
        if item.baseid == '2006' and not item.hastag(
                'drained') and item.id == 0x2006:
            corpses.append(item)

    # There was an undrained corpse near the player using
    # the skill.
    if len(corpses) > 0:
        # Select a random corpse.
        corpse = random.choice(corpses)

        # Change the color of the corpse and set the "drained" flag for it.
        corpse.color = 0x835
        corpse.settag('drained', 1)
        corpse.update()

        char.socket.clilocmessage(
            1061287
        )  # You channel energy from a nearby corpse to heal your wounds.
    else:
        if char.mana < 10:
            char.socket.clilocmessage(
                1061285)  # You lack the mana required to use this skill.
            return

        char.mana -= 10
        char.updatemana()

        char.socket.clilocmessage(
            1061286
        )  # You channel your own spiritual energy to heal your wounds.

    # Show a nice effect.
    char.effect(0x375a, 1, 15)

    # The amount of damage healed is based on the spirit speaking value.
    minval = 1 + floor(char.skill[SPIRITSPEAK] * 0.025)
    maxval = minval + 4
    char.health = min(char.maxhitpoints,
                      char.health + random.randint(minval, maxval))
    char.updatehealth()
Example #8
0
    def target(self, char, mode, targettype, target, args, item):
        if not self.consumerequirements(char, mode, args, target, item):
            return

        char.turnto(target)

        # Enumerate chars
        chars = wolfpack.chars(target.x, target.y, char.pos.map, 8)
        items = wolfpack.items(target.x, target.y, char.pos.map, 8)
        for target in chars:
            if char == target or not target.npc or target.summontimer == 0:
                continue

            if not mayAreaHarm(char, target):
                continue

            dispelChance = 50.0 + (100 * (
                (char.magery / 10.0 -
                 (target.getintproperty('dispeldifficulty', 1) / 10)) /
                ((target.getintproperty('dispelfocus', 1) / 10) * 2))) / 100.0

            if dispelChance > random.random():
                target.effect(0x3779, 10, 20)
                target.fight(char)
            else:
                wolfpack.effect(0x3728, target.pos, 8, 20)
                target.soundeffect(0x201)
                target.delete()

        # Field spells
        for item in items:
            if item.hastag('dispellable_field'):
                wolfpack.effect(0x376a, item.pos, 9, 20)
                item.soundeffect(0x201)
                item.delete()
Example #9
0
def checkanvilandforge(char):
	if char.gm:
		return True

	# Check dynamic items.
	forge = False
	anvil = False
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 5)
	for item in items:
		if item.id in ANVILS:
			anvil = True
		elif item.id in FORGES:
			forge = True

		if anvil and forge:
			return True

	# Check for static items
	for x in range(-2, 3):
		for y in range(-2, 3):
			statics = wolfpack.statics(char.pos.x + x, char.pos.y + y, char.pos.map, True)

			for tile in statics:
				dispid = tile[0]
				if dispid in ANVILS:
					anvil = True
				elif dispid in FORGES:
					forge = True

				if anvil and forge:
					return True

	return False
def openDoor( socket, packet ):
	if packet.size == 5 and packet.getshort(3) == int( 0x5800 ):
		if not socket.player:
			return False
		char = socket.player
		dir = char.direction
		doors = wolfpack.items(char.pos.x + dirs[dir][0], char.pos.y + dirs[dir][1], char.pos.map, 0)

		if not doors:
			return False

		opendoor = 0
		reach = 0
		for door in doors:
			if char.pos.z == door.pos.z:
				reach = 1
			elif char.pos.z < door.pos.z and char.pos.z >= ( door.pos.z - 5):
				reach = 1
			elif char.pos.z > door.pos.z and char.pos.z <= ( door.pos.z + 5):
				reach = 1
			if reach == 1:
				for event in door.scripts:
					if event == 'door':
						opendoor = 1
						break
			if opendoor == 1:
				wolfpack.callevent( event, EVENT_USE, (char, door) )
				break
		return True
	else:
		return False
def openDoor( socket ):
	char = socket.player
	dir = char.direction
	doors = wolfpack.items(char.pos.x + dirs[dir][0], char.pos.y + dirs[dir][1], char.pos.map, 0)

	if not doors:
		return False

	opendoor = 0
	reach = 0
	for door in doors:
		if char.pos.z == door.pos.z:
			reach = 1
		elif char.pos.z < door.pos.z and char.pos.z >= ( door.pos.z - 5):
			reach = 1
		elif char.pos.z > door.pos.z and char.pos.z <= ( door.pos.z + 5):
			reach = 1
		if reach == 1:
			for event in door.scripts:
				if event == 'door':
					opendoor = 1
					break

		if opendoor == 1:
			scripts = door.scripts + door.basescripts.split(',')
			args = (char, door)
			for script in scripts:
				if wolfpack.hasevent(script, EVENT_USE):
					if wolfpack.callevent(script, EVENT_USE, args):
						break
			break
	return True
Example #12
0
    def target(self, char, mode, targettype, target, args, item):
        if not self.consumerequirements(char, mode, args, target, item):
            return

        char.turnto(target)

        if char.player:
            party = char.party
            guild = char.guild
        else:
            party = None
            guild = None

            # Enumerate chars
        chars = wolfpack.chars(target.x, target.y, char.pos.map, 8)
        items = wolfpack.items(target.x, target.y, char.pos.map, 8)
        for target in chars:
            if char == target or not target.npc or target.summontimer == 0:
                continue

            if self.checkresist(char, target):
                target.effect(0x3779, 10, 20)
            else:
                wolfpack.effect(0x3728, target.pos, 8, 20)
                target.soundeffect(0x201)
                target.delete()

                # Field spells
        for item in items:
            if item.hastag("dispellable_field"):
                wolfpack.effect(0x376A, item.pos, 9, 20)
                item.soundeffect(0x201)
                item.delete()
Example #13
0
def openDoor(socket):
    char = socket.player
    dir = char.direction
    doors = wolfpack.items(char.pos.x + dirs[dir][0],
                           char.pos.y + dirs[dir][1], char.pos.map, 0)

    if not doors:
        return False

    opendoor = 0
    reach = 0
    for door in doors:
        if char.pos.z == door.pos.z:
            reach = 1
        elif char.pos.z < door.pos.z and char.pos.z >= (door.pos.z - 5):
            reach = 1
        elif char.pos.z > door.pos.z and char.pos.z <= (door.pos.z + 5):
            reach = 1
        if reach == 1:
            for event in door.scripts:
                if event == 'door':
                    opendoor = 1
                    break

        if opendoor == 1:
            scripts = list(door.scripts) + door.basescripts.split(',')
            args = (char, door)
            for script in scripts:
                if script and wolfpack.hasevent(script, EVENT_USE):
                    if wolfpack.callevent(script, EVENT_USE, args):
                        break
            break
    return True
Example #14
0
def checkfire( pos ):
	found_fire = 0
	items = wolfpack.items( pos.x + i, pos.y + j, pos.map, FIRE_RANGE )
	for item in items:
		if item.id in fires:
			found_fire = 1
			break
	return found_fire
Example #15
0
def checkmill( pos ):
	found = 0
	items = wolfpack.items( pos.x + i, pos.y + j, pos.map, MILL_RANGE )
	for item in items:
		if item.id in flour_mill:
			found = 1
			break
	return found
def getvein( socket, pos, target ):
	#Check if we have wood_gems near ( range = 4)
	gems = wolfpack.items( pos.x, pos.y, pos.map, 0 )
	for gem in gems:
		if gem.hastag('resource') and gem.gettag('resource') == 'wood' and gem.hastag('resname') and gem.id == 0x1ea7:
			return gem
			break
	if not gems:
		gem = createwoodgem(target, pos)
		return gem
Example #17
0
def findResourceGem( pos ):
	xBlock = int( floor( pos.x / 8 ) ) * 8
	yBlock = int( floor( pos.y / 8 ) ) * 8

	items = wolfpack.items( xBlock, yBlock, pos.map, 1 ) # 1: Exact

	for item in items:
		if item.id == 0x1ea7 and item.hastag( 'resourcecount' ) and item.hastag( 'resource' ) and item.gettag( 'resource' ) == 'fish':
			return item

	return None
Example #18
0
def findResourceGem( pos ):
	xBlock = int( floor( pos.x / 8 ) ) * 8
	yBlock = int( floor( pos.y / 8 ) ) * 8

	items = wolfpack.items( xBlock, yBlock, pos.map, 1 ) # 1: Exact

	for item in items:
		if item.id == 0x1ea7 and item.hastag( 'resourcecount' ) and item.hastag( 'resource' ) and item.gettag( 'resource' ) == 'fish':
			return item

	return None
Example #19
0
def check_room( item, pos ):
	# check valid item
	if not item.hastag( 'carpentry_type' ):
		return False
	name = item.gettag( 'carpentry_type' )
	if not name in deeds:
		return False
	dir = deeds[ name ][ DIRECTION ]
	items = deeds[ name ][ DEED_ITEMS ]
	if not items:
		return False
	num_item = len( items )
	if not num_item:
		return False

	# check the spots
	ret0 = 0
	ret1 = 0
	ret2 = 0
	if num_item == 1:
		return check_spot( pos.x, pos.y, pos.map )
	elif num_item == 2:
		ret0 = check_spot( pos.x, pos.y, pos.map )
		if dir == 1:
			ret1 = check_spot( pos.x, pos.y + 1, pos.map )
		else:
			ret1 = check_spot( pos.x + 1, pos.y, pos.map )
		return ret0 & ret1
	elif num_item == 3:
		ret0 = check_spot( pos.x, pos.y, pos.map )
		if dir == 1:
			ret1 = check_spot( pos.x, pos.y + 1, pos.map )
			ret2 = check_spot( pos.x, pos.y - 1, pos.map )
		else:
			ret1 = check_spot( pos.x + 1, pos.y, pos.map )
			ret2 = check_spot( pos.x -1, pos.y, pos.map )
		return ret0 & ret1 & ret2
	elif num_item == 4:
		ret0 = 1
		for x in range( pos.x, pos.x + 2 ):
			for y in range( pos.y, pos.y + 2 ):
				ret0 = check_spot( x, y, pos.map )
				if not ret0:
					return False
		return True
	# pentagram
	elif num_item == 9:
		ret0 = wolfpack.items( pos.x, pos.y, pos.map, 2 )
		if ret0:
			return False
		return True
	# no other case : error
	return False
def check_room( item, pos ):
	# check valid item
	if not item.hastag( 'carpentry_type' ):
		return 0
	name = item.gettag( 'carpentry_type' )
	if not deeds.haskey( name ):
		return 0
	dir = deeds[ name ][ 1 ]
	items = deeds[ name ][ 2: ]
	if not items:
		return 0
	num_item = len( items )
	if not num_item:
		return 0

	# check the spots
	ret0 = 0
	ret1 = 0
	ret2 = 0
	if num_item == 1:
		return check_spot( pos )
	elif num_item == 2:
		ret0 = check_spot( pos )
		if dir == 1:
			ret1 = check_spot( pos.x, pos.y + 1, pos.map )
		else:
			ret1 = check_spot( pos.x + 1, pos.y, pos.map )
		return ret0 & ret1
	elif num_item == 3:
		ret0 = check_spot( pos )
		if dir == 1:
			ret1 = check_spot( pos.x, pos.y + 1, pos.map )
			ret2 = check_spot( pos.x, pos.y - 1, pos.map )
		else:
			ret1 = check_spot( pos.x + 1, pos.y, pos.map )
			ret2 = check_spot( pos.x -1, pos.y, pos.map )
		return ret0 & ret1 & ret2
	elif num_item == 4:
		ret0 = 1
		for x in range( pos.x, pos.x + 2 ):
			for y in range( pos.y, pos.y + 2 ):
				ret0 = check_spot( x, y, pos.map )
				if not ret0:
					return 0
		return 1
	# pentagram
	elif num_item == 9:
		ret0 = wolfpack.items( pos.x, pos.y, pos.map, 2 )
		if not ret0:
			return 0
		return 1
	# no other case : error
	return 0
Example #21
0
def getsandvein(socket, pos):
    # 8x8 resource grid
    gem_x = (pos.x / 8) * 8
    gem_y = (pos.y / 8) * 8

    gems = wolfpack.items(gem_x, gem_y, pos.map, 0)
    for gem in gems:
        if gem.hastag('resource') and gem.gettag('resource') == 'sand':
            return gem

    pos.x = gem_x
    pos.y = gem_y
    return createsandgem(pos)
Example #22
0
def getvein(socket, pos):
    # 4x4 resource grid
    gem_x = (pos.x / 4) * 4
    gem_y = (pos.y / 4) * 4

    gems = wolfpack.items(gem_x, gem_y, pos.map, 0)
    for gem in gems:
        if gem.hastag("resource") and gem.gettag("resource") == "ore" and gem.hastag("resname"):
            return gem

    pos.x = gem_x
    pos.y = gem_y
    return createoregem(pos)
Example #23
0
def getsandvein(socket, pos):
	# 8x8 resource grid
	gem_x = (pos.x / 8) * 8
	gem_y = (pos.y / 8) * 8

	gems = wolfpack.items(gem_x, gem_y, pos.map, 0)
	for gem in gems:
		if gem.hastag('resource') and gem.gettag('resource') == 'sand':
			return gem

	pos.x = gem_x
	pos.y = gem_y
	return createsandgem(pos)
def effect(char, args):
    # Delete the spiritspeaking flag and set the
    # skill delay for this client.
    socket = char.socket
    socket.deltag("spiritspeaking")
    socket.settag("skill_delay", int(wolfpack.time.currenttime() + SPSPEAK_DELAY))

    # Check for skill usage success
    if not char.checkskill(SPIRITSPEAK, 0, 1000):
        char.socket.clilocmessage(502443)
        return

        # Find corpses around the user of this skill
        # 3 tiles range.
    pos = char.pos
    items = wolfpack.items(pos.x, pos.y, pos.map, 3)
    corpses = []
    for item in items:
        if item.baseid == "2006" and not item.hastag("drained"):
            corpses.append(item)

            # There was an undrained corpse near the player using
            # the skill.
    if len(corpses) > 0:
        # Select a random corpse.
        corpse = random.choice(corpses)

        # Change the color of the corpse and set the "drained" flag for it.
        corpse.color = 0x835
        corpse.settag("drained", 1)
        corpse.update()

        char.socket.clilocmessage(1061287)
    else:
        if char.mana < 10:
            char.socket.clilocmessage(1061285)
            return

        char.mana -= 10
        char.updatemana()

        char.socket.clilocmessage(1061286)

        # Show a nice effect.
    char.effect(0x375A, 1, 15)

    # The amount of damage healed is based on the spirit speaking value.
    minval = 1 + floor(char.skill[SPIRITSPEAK] * 0.025)
    maxval = minval + 4
    char.health = min(char.maxhitpoints, char.health + random.randint(minval, maxval))
    char.updatehealth()
def effect(char, args):
	# Delete the spiritspeaking flag and set the
	# skill delay for this client.
	socket = char.socket
	socket.deltag('spiritspeaking')
	socket.settag('skill_delay', int( wolfpack.time.currenttime() + SPSPEAK_DELAY ) )

	# Check for skill usage success
	if not char.checkskill( SPIRITSPEAK, 0, 1000 ):
		char.socket.clilocmessage(502443) # You fail your attempt at contacting the netherworld.
		return

	# Find corpses around the user of this skill
	# 3 tiles range.
	pos = char.pos
	items = wolfpack.items(pos.x, pos.y, pos.map, 3)
	corpses = []
	for item in items:
		if item.baseid == '2006' and not item.hastag('drained') and item.id == 0x2006:
			corpses.append(item)

	# There was an undrained corpse near the player using
	# the skill.
	if len(corpses) > 0:
		# Select a random corpse.
		corpse = random.choice(corpses)

		# Change the color of the corpse and set the "drained" flag for it.
		corpse.color = 0x835
		corpse.settag('drained', 1)
		corpse.update()

		char.socket.clilocmessage(1061287) # You channel energy from a nearby corpse to heal your wounds.
	else:
		if char.mana < 10:
			char.socket.clilocmessage(1061285) # You lack the mana required to use this skill.
			return

		char.mana -= 10
		char.updatemana()

		char.socket.clilocmessage(1061286) # You channel your own spiritual energy to heal your wounds.

	# Show a nice effect.
	char.effect(0x375a, 1, 15)

	# The amount of damage healed is based on the spirit speaking value.
	minval = 1 + floor(char.skill[SPIRITSPEAK] * 0.025)
	maxval = minval + 4
	char.health = min(char.maxhitpoints, char.health + random.randint(minval, maxval))
	char.updatehealth()
Example #26
0
def tileResponsez(player, arguments, target):
    if len(arguments) < 3:
        player.socket.sysmessage('Please select the second corner.')
        player.socket.attachtarget("commands.tilecolor.tileResponsez",
                                   list(arguments) + [target.pos])
        return

    x1 = min(arguments[2].x, target.pos.x)
    x2 = max(arguments[2].x, target.pos.x)
    y1 = min(arguments[2].y, target.pos.y)
    y2 = max(arguments[2].y, target.pos.y)
    z = int(arguments[0])
    colors = arguments[1]

    unlimited = player.account.authorized('Misc', 'Unlimited Tilecolor')
    count = ((x2 - x1) + 1) * ((y2 - y1) + 1)

    # Cap at 500 items if not an admin is using it
    if not unlimited and count > 250:
        player.socket.sysmessage(
            'You are not allowed to tile more than 250 items at once.')
        return

    player.log(
        LOG_MESSAGE, "Dying items (%s) from %u,%u,%u to %u,%u,%u.\n" %
        (", ".join(colors), x1, y1, z, x2, y2, z))
    player.socket.sysmessage('Dying items from %u,%u,%u to %u,%u,%u.' %
                             (x1, y1, z, x2, y2, z))

    try:
        colors = map(hex2dec, colors)
    except:
        player.socket.sysmessage(
            'You have to pass a comma separated list of numbers.')
        player.socket.sysmessage(
            'Hexadecimal numbers have to be in the 0x123 format.')
        raise

    mapid = player.pos.map
    for x in range(x1, x2 + 1):
        for y in range(y1, y2 + 1):
            items = wolfpack.items(x, y, mapid, 0)
            for item in items:
                if (item.pos.z == z):
                    color = random.choice(colors)
                    # This should be a trace log
                    #player.log(LOG_MESSAGE, "Dying item 0x%x (%s) from color 0x%x to 0x%x.\n" % (item.serial, item.baseid, item.color, color))
                    item.color = color
                    item.update()

    return
def getvein( socket, pos, target ):
	#Check if we have wood_gems on this spot
	gems = wolfpack.items( pos.x, pos.y, pos.map )
	for gem in gems:
		if gem.hastag('resource') and gem.gettag('resource') == 'wood' and gem.hastag('resname') and gem.baseid == 'wood_gem':
			if gem.gettag('resname') in LOGS:		
				return gem
				break
			else:
				# delete invalid gems
				gem.delete()

	gem = createwoodgem(target, pos)
	return gem
Example #28
0
def getvein(socket, pos, target):
    #Check if we have wood_gems on this spot
    gems = wolfpack.items(pos.x, pos.y, pos.map)
    for gem in gems:
        if gem.hastag('resource') and gem.gettag(
                'resource') == 'wood' and gem.hastag(
                    'resname') and gem.baseid == 'wood_gem':
            if gem.gettag('resname') in LOGS:
                return gem
                break
            else:
                # delete invalid gems
                gem.delete()

    gem = createwoodgem(target, pos)
    return gem
def checkanvilandforge(char):
	# Check dynamic items.
	# We should later check for statics too
	forge = 0
	anvil = 0
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 5)
	for item in items:
		if item.id == 0xFAF or item.id == 0xFB0:
			anvil = 1
		elif item.id == 0xFB1 or (item.id >= 0x197A and item.id <= 0x19A9):
			forge = 1

		if anvil and forge:
			return True

	return False
def getvein(socket, pos, target):
    # Check if we have wood_gems near ( range = 4)
    gems = wolfpack.items(pos.x, pos.y, pos.map, 4)
    for gem in gems:
        if wolfpack.finditem(gem.serial):
            if (
                gem.hastag("resource")
                and gem.gettag("resource") == "wood"
                and gem.hastag("resname")
                and gem.id == hex2dec(0x1EA7)
            ):
                return gem
                break
    if not gems:
        gem = createwoodgem(target, pos)
        return gem
Example #31
0
def findResourceGem(pos):
    xBlock = int(floor(pos.x / 8)) * 8
    yBlock = int(floor(pos.y / 8)) * 8

    items = wolfpack.items(xBlock, yBlock, pos.map, 1)  # 1: Exact

    for item in items:
        if (
            item.id == 0x1EA7
            and item.hastag("resourcecount")
            and item.hastag("resource")
            and item.gettag("resource") == "fish"
        ):
            return item

    return None
def onWalk( char, dir, sequence ):
	food = None
	for item in wolfpack.items( char.pos.x, char.pos.y, char.pos.map, 0 ):
		if item.hasscript( 'shardscripts.npcs.rabbit' ):
			food = item
			break
	if food:
		food.delete()
		char.sound( random.choice( [ 0x03a, 0x03b, 0x03c ] ) )
		char.emote( "munch" )
		if char.hitpoints < char.maxhitpoints:
			char.hitpoints += 1
			char.updatehealth()
	if char.hasscript( 'shardscripts.npcs.rabbit' ):
		char.removescript( 'shardscripts.npcs.rabbit' )
	return True
Example #33
0
def find(char, object=None):
    # check for dynamic items
    items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 2)
    for item in items:
        if item.id in object:
            return True

            # Check for static items
    for x in range(-2, 3):
        for y in range(-2, 3):
            statics = wolfpack.statics(char.pos.x + x, char.pos.y + y, char.pos.map, True)
            for tile in statics:
                dispid = tile[0]
                if dispid in object:
                    return True

    return False
Example #34
0
def getvein(Oretable, pos, char):
	# 8x8 resource grid
	gem_x = (pos.x / 8) * 8
	gem_y = (pos.y / 8) * 8

	gems = wolfpack.items(gem_x, gem_y, pos.map, 0)
	for gem in gems:
		if gem.hastag('resource') and gem.gettag('resource') == 'ore' and gem.hastag('resname') and gem.hastag('resname2'):
			if (gem.gettag('resname'), gem.gettag('resname2')) in Oretable:
				return gem
			else:
				gem.delete()

	pos.x = gem_x
	pos.y = gem_y

	return createoregem(Oretable, pos, char)
Example #35
0
def find(char, object=None):
    # check for dynamic items
    items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 2)
    for item in items:
        if item.id in object:
            return True

    # Check for static items
    for x in range(-2, 3):
        for y in range(-2, 3):
            statics = wolfpack.statics(char.pos.x + x, char.pos.y + y,
                                       char.pos.map, True)
            for tile in statics:
                dispid = tile[0]
                if dispid in object:
                    return True

    return False
Example #36
0
def dropitem(item, char, container):
	if container:
		if not utilities.tocontainer(item, container):
			item.update()
	else:
		items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)
		for stackable in items:
			if stackable.pos.z == item.pos.z:
				if item.canstack(stackable):
					# We can completely stack the item
					if stackable.amount + item.amount <= 65535:
						stackable.amount += item.amount
						stackable.update()
						item.delete()
						return

		item.moveto(char.pos)
		item.update()
def tileResponsez(player, arguments, target):
	if len(arguments) < 3:
		player.socket.sysmessage('Please select the second corner.')
		player.socket.attachtarget("commands.tilecolor.tileResponsez", list(arguments) + [target.pos])
		return

	x1 = min(arguments[2].x, target.pos.x)
	x2 = max(arguments[2].x, target.pos.x)
	y1 = min(arguments[2].y, target.pos.y)
	y2 = max(arguments[2].y, target.pos.y)
	z = int( arguments[0] )
	colors = arguments[1]

	unlimited = player.account.authorized('Misc', 'Unlimited Tilecolor')
	count = ((x2 - x1) + 1) * ((y2 - y1) + 1)

	# Cap at 500 items if not an admin is using it
	if not unlimited and count > 250:
		player.socket.sysmessage('You are not allowed to tile more than 250 items at once.')
		return

	player.log(LOG_MESSAGE, "Dying items (%s) from %u,%u,%u to %u,%u,%u.\n" % (", ".join(colors), x1, y1, z, x2, y2, z))
	player.socket.sysmessage('Dying items from %u,%u,%u to %u,%u,%u.' % (x1, y1, z, x2, y2, z))

	try:
		colors = map(hex2dec, colors)
	except:
		player.socket.sysmessage('You have to pass a comma separated list of numbers.')
		player.socket.sysmessage('Hexadecimal numbers have to be in the 0x123 format.')
		raise

	mapid = player.pos.map
	for x in range(x1, x2 + 1):
		for y in range(y1, y2 + 1):
			items = wolfpack.items(x, y, mapid, 0)
			for item in items:
				if( item.pos.z == z ):
					color = random.choice(colors)
					# This should be a trace log
					#player.log(LOG_MESSAGE, "Dying item 0x%x (%s) from color 0x%x to 0x%x.\n" % (item.serial, item.baseid, item.color, color))
					item.color = color
					item.update()

	return
def expire(char, arguments):
	if char.dead :
		char.deltag( 'in_firefield' )
		return

	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

	for item in items:
		if item.hasscript( 'magic.firefield' ):
			source = None
			if item.hastag('source'):
				source = wolfpack.findchar( int( item.gettag('source') ) )

			energydamage(char, source, 2, fire=100)
			char.addtimer(350, expire, [])
			char.soundeffect(0x208)
			return

	char.deltag( 'in_firefield' )
Example #39
0
def getvein(Oretable, pos, char):
    # 8x8 resource grid
    gem_x = (pos.x / 8) * 8
    gem_y = (pos.y / 8) * 8

    gems = wolfpack.items(gem_x, gem_y, pos.map, 0)
    for gem in gems:
        if gem.hastag('resource') and gem.gettag(
                'resource') == 'ore' and gem.hastag('resname') and gem.hastag(
                    'resname2'):
            if (gem.gettag('resname'), gem.gettag('resname2')) in Oretable:
                return gem
            else:
                gem.delete()

    pos.x = gem_x
    pos.y = gem_y

    return createoregem(Oretable, pos, char)
Example #40
0
def expire(char, arguments):
    if char.dead:
        char.deltag('in_firefield')
        return

    items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

    for item in items:
        if item.hasscript('magic.firefield'):
            source = None
            if item.hastag('source'):
                source = wolfpack.findchar(int(item.gettag('source')))

            energydamage(char, source, 2, fire=100)
            char.addtimer(350, expire, [])
            char.soundeffect(0x208)
            return

    char.deltag('in_firefield')
Example #41
0
def fireweapon(attacker, defender, weapon):
	ammo = properties.fromitem(weapon, AMMUNITION)

	# Only consume ammo if this weapon requires it
	if len(ammo) != 0:
		if not consumeresources(attacker.getbackpack(), ammo, 1):
			if attacker.socket:
				attacker.socket.sysmessage('You are out of ammo.')
			if attacker.npc:
				tobackpack(weapon, attacker)
			return False

		if random.random() >= 0.50:
			if defender.player:
				item = wolfpack.additem(ammo)
				if not tobackpack(item, defender):
					item.update()
			else:
				# Search for items at the same position
				items = wolfpack.items(defender.pos.x, defender.pos.y, defender.pos.map)
				handled = 0

				for item in items:
					if item.baseid == ammo:
						item.amount += 1
						item.update()
						handled = 1
						break

				if not handled:
					item = wolfpack.additem(ammo)
					item.moveto(defender.pos)
					item.update()

	projectile = properties.fromitem(weapon, PROJECTILE)

	# Fire a projectile if applicable.
	if projectile:
		hue = properties.fromitem(weapon, PROJECTILEHUE)
		attacker.movingeffect(projectile, defender, 0, 0, 14, hue)

	return True
Example #42
0
def onWalk(char, dir, sequence):
	if char.baseid in farm_eaters:
		items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

		food = None
		for item in items:
			if item.hasscript( 'food' ) and item.baseid in farm_food:
				food = item
				break

		if food:
			food.delete()
			char.soundeffect( random.choice( [ 0x03a, 0x03b, 0x03c ] ), 1 )
			char.say( "*munch*" )
			if char.hitpoints < char.maxhitpoints:
				char.hitpoints += 1
				char.update()

	char.removescript('food')
	return True
Example #43
0
def onWalk(char, dir, sequence):
	if char.baseid in farm_eaters:
		items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

		food = None
		for item in items:
			if item.hasscript( 'food' ) and item.baseid in farm_food:
				food = item
				break

		if food:
			food.delete()
			char.soundeffect( random.choice( [ 0x03a, 0x03b, 0x03c ] ), 1 )
			char.say( tr("*munch*") )
			if char.hitpoints < char.maxhitpoints:
				char.hitpoints += 1
				char.update()

	char.removescript('food')
	return True
Example #44
0
def checkforge(char):
	if char.gm:
		return True

	# Check dynamic items.
	items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 5)
	for item in items:
		if item.id == 0xFB1 or (item.id >= 0x197A and item.id <= 0x19A9):
			return True

	# Check for static items
	for x in range(-2, 3):
		for y in range(-2, 3):
			statics = wolfpack.statics(char.pos.x + x, char.pos.y + y, char.pos.map, True)

			for tile in statics:
				dispid = tile[0]
				if dispid == 0xFB1 or (dispid >= 0x197A and dispid <= 0x19A9):
					return True

	return False
Example #45
0
def checkmill( pos ):
	found = 0
	# Dynamic items
	items = wolfpack.items( pos.x, pos.y, pos.map, MILL_RANGE )
	for item in items:
		if item.id in flour_mill:
			found = 1
			break
	# static items
	if not found:
		# Check for static items
		for x in range(-2, 3):
			for y in range(-2, 3):
				statics = wolfpack.statics(pos.x + x, pos.y + y, pos.map, True)
	
				for tile in statics:
					dispid = tile[0]
					if dispid in flour_mill:
						found = 1
						break
	return found
Example #46
0
def expire(char, arguments):
    if char.dead:
        char.deltag('in_poisonfield')
        return

    items = wolfpack.items(char.pos.x, char.pos.y, char.pos.map, 0)

    for item in items:
        if item.hasscript('magic.poisonfield'):
            level = 0
            if item.hastag('level'):
                level = int(item.gettag('level'))

            if char.poison < level:
                char.soundeffect(0x474)
                poison.poison(char, level)

            char.addtimer(350, expire, [])
            return

    char.deltag('in_poisonfield')
Example #47
0
def createammo(defender, ammo):
    if random.random() >= 0.50:
        if defender.player:
            item = wolfpack.additem(ammo)
            if not tobackpack(item, defender):
                item.update()
        else:
            # Search for items at the same position
            items = wolfpack.items(defender.pos.x, defender.pos.y,
                                   defender.pos.map)
            handled = 0

            for item in items:
                if item.baseid == ammo:
                    item.amount += 1
                    item.update()
                    handled = 1
                    break

            if not handled:
                item = wolfpack.additem(ammo)
                item.moveto(defender.pos)
                item.update()
Example #48
0
def check_spot( x, y, map ):
	#TODO: needs check for z value too, Check for static items
	# Check for dynamic items
	if len( wolfpack.items( x, y, map ) ):
		return False
	return True
Example #49
0
def response( char, args, target ):
	socket = char.socket
	pos = target.pos

	if skills.skilltable[ FISHING ][ skills.UNHIDE ] and char.hidden:
		char.reveal()

	# Check Map/Static/Dynamic Water and eventual blocking stuff above it
	validspot   = 0
	blockedspot = 0
	deepwater   = 0

	mapTile = wolfpack.map( pos.x, pos.y, pos.map )

	# Simple check for saving CPU time (trusted-check)
	if not target.model in staticWater and not mapTile[ "id" ] in mapWater:
		socket.clilocmessage( 0x7a4f2, "", 0x3b2, 3, char ) # You need water to fish in!
		return

	# Check Distance
	if char.pos.map != pos.map or char.pos.distance( pos ) > FISHING_MAX_DISTANCE:
		socket.clilocmessage( 0x7a4f0, "", 0x3b2, 3, char ) # You need to be closer to the water to fish!
		return

	# Check dynamics first ( And check if any objects start at z -> z + 13 )
	items = wolfpack.items( pos.x, pos.y, pos.map, 1 ) # 1: Exact

	for item in items:
		if item.id in staticWater and item.pos.z == pos.z and item.visible:
			validspot = 1
			deepwater = 0
			break

	# Then check statics ( And check if any objects start at z -> z + 13 )
	staticitems = wolfpack.statics( pos.x, pos.y, pos.map, 1 ) # Don't put this in any conditional we need it later

	if not validspot:
		for item in staticitems:
			if item[0] in staticWater and item[3] == pos.z:
				validspot = 1
				deepwater = 0
				break

	# Last resort check (Map)
	if not validspot and ( mapTile[ "id" ] in mapWater and mapTile[ "z" ] == pos.z ):
		validspot = 1
		deepwater = 0

	if not validspot:
		socket.clilocmessage( 0x7a4f2, "", 0x3b2, 3, char ) # You need water to fish in!
		return

	# Check if there is *anything* above that spot
	for item in items:
		if ( not item.id in staticWater ) and ( item.pos.z >= pos.z ) and ( item.pos.z <= pos.z + FISHING_BLOCK_RANGE ):
			# Check if the tiledata defines this as "impassable" or "surface"
			tile = wolfpack.tiledata( item.id )

			if tile[ "blocking" ] or tile[ "floor" ]:
				blockedspot = 1
				break

	# only check if we're not blocked already
	if not blockedspot:
		for item in staticitems:
			if ( not item[ 0 ] in staticWater ) and ( item[ 3 ] >= pos.z ) and ( item[ 3 ] <= pos.z + FISHING_BLOCK_RANGE ):
				tile = wolfpack.tiledata( item[0] )

				if tile[ "blocking" ] or tile[ "floor" ]:
					blockedspot = 1
					break

	# If the targetted tile is below map height check that as well
	mapZ = mapTile[ "z" ]
	if not blockedspot and pos.z < mapZ:
		if pos.z > ( mapZ - FISHING_BLOCK_RANGE ):
			blockedspot = 1

	if blockedspot:
		socket.clilocmessage( 0x7a4f5, "", 0x3b2, 3, char ) # You can't reach the water there.
		return

	# Turn to the position we're fishing at
	char.turnto( pos )

	# Show the Fishing animation
	char.action( 0x0c )

	socket.settag( 'is_fishing', int( wolfpack.time.currenttime() + 5000 ) ) # Times out after 5000ms
	char.addtimer( 2500, effecttimer, [ pos, deepwater ] )
	char.addtimer( 5000, itemtimer, [ pos, deepwater, args[0] ] )

	pass
Example #50
0
def response(char, args, target):
    if not char:
        return

    if skills.skilltable[DETECTINGHIDDEN][skills.UNHIDE] and char.hidden:
        char.reveal()

    # if we are in our house : reveal all hidden chars in this house
    # w/o checking skill
    house = wolfpack.findmulti(char.pos)
    # it's our house
    if house and house.owner == char.serial:
        # get all chars in this house
        chars = house.chars()
        # set visible to the chars
        for echar in chars:
            if echar.hidden and echar.serial != char.serial:
                echar.hidden = 0
                echar.update()
        # do we need to checkskill ?
        return

    char.socket.settag('skill_delay',
                       int(wolfpack.time.currenttime() + DETECTHIDDEN_DELAY))

    skill = char.skill[DETECTINGHIDDEN]
    reveal_range = int(skill / 100)

    success = char.checkskill(DETECTINGHIDDEN, 0, 1000)
    if not success:
        reveal_range /= 2

    pos = None
    item = None
    found = False
    if target.pos:
        pos = target.pos
    if target.item:
        item = target.item
    # when we target at a position : hidden people, dungeon trap, faction trap
    if pos:
        x = pos.x
        y = pos.y
        map = pos.map
        # first, we test hidden chars
        chars = wolfpack.chars(x, y, map, reveal_range)
        for tchar in chars:
            if not tchar.gm:
                # hidden using hiding skill
                if tchar.hidden:
                    ss = skill + random.randint(0, 21) - 10
                    ts = tchar.skill[HIDING] + random.randint(0, 21) - 10
                    if ss >= ts:
                        reveal_char(tchar)
                        found = True
                # hidden using invisibility spell
                #elif tchar.hasscript('skills.stealth'):
                #	# FIXME : only hidden with lower skill will be revealed
                #	if tchar.skill[ MAGERY ] <= skill:
                #		reveal_char( tchar )
        # next, dungeon / faction traps
        items = wolfpack.items(x, y, map, reveal_range)
        for titem in items:
            if titem.id in dungeon_traps:
                if not titem.visible:
                    if titem.hastag('level'):
                        level = item.gettag('level')
                    else:
                        level = 1
                    # level from 1 to 5
                    if skill / 2 >= level:
                        titem.addtimer(DUNGEON_TRAP_REVEAL_DURATION, hide_trap,
                                       [titem.visible])
                        titem.visible = 1
                        titem.update()
                        found = True
            # faction trap : no idea yet
    # now, we deal with the trap boxes - show trap items as color
    if item:
        char.socket.sysmessage("detecting trap box is not implemented yet.")
    elif not found:
        char.socket.clilocmessage(500817)  # You can see nothing hidden there.