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
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
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
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()
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
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()
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()
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()
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
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()
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
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
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
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 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
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 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)
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()
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
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
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
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
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)
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' )
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)
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')
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
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
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
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
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
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')
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()
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
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
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.