def ismortallywounded(char, args = None): if args and args[0]: char.deltag('mortalstrike') # Delete the mortal strike tag if char.socket: char.socket.clilocmessage(1060208) return False if not char.hastag('mortalstrike'): return False expire = int(char.gettag('mortalstrike')) if expire < wolfpack.currenttime(): char.deltag('mortalstrike') if char.socket: char.socket.clilocmessage(1060208) return False # Wont it expire within 20 seconds? > Server Restart occured if expire + 20000 < wolfpack.currenttime(): char.deltag('mortalstrike') if char.socket: char.socket.clilocmessage(1060208) return False return True # Character is affected
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return self.use(attacker) attacker.effect(0x3728, 10, 15) attacker.soundeffect(0x2a1) # Compile a list of targets targets = [] center = attacker.pos chariter = wolfpack.charregion(center.x - 1, center.y - 1, center.x + 1, center.y + 1, center.map) char = chariter.first while char: if char != attacker and char != defender: targets.append(char) char = chariter.next # Our own party party = attacker.party guild = attacker.guild weapon = attacker.getweapon() for target in targets: if not attacker.canreach(target, 1): continue if not target.dead and not target.invulnerable and (not party or party != target.party) and (not guild or target.guild != guild): if attacker.socket: attacker.socket.clilocmessage(1060161) # The whirling attack strikes a target! if defender.socket: defender.socket.clilocmessage(1060162) # You are struck by the whirling attack and take damage! combat.aos.hit(attacker, target, weapon, wolfpack.currenttime())
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return # Clear Ability, then check if it really can be used clearability(attacker) if not defender.socket or not defender.itemonlayer(LAYER_MOUNT): if attacker.socket: attacker.socket.clilocmessage(1060848) return self.use(attacker) # Use Mana if attacker.socket: attacker.socket.clilocmessage(1060082) mounted = attacker.itemonlayer(LAYER_MOUNT) if mounted: defender.socket.clilocmessage(1062315) else: defender.socket.clilocmessage(1060083) defender.soundeffect(0x140) defender.effect(0x3728, 10, 15) defender.unmount() # Make it impossible to mount a horse for 10 seconds defender.socket.settag('block_mount', wolfpack.currenttime() + 10000) if not mounted: energydamage(defender, attacker, random.randint(15, 25), physical=100, damagetype=DAMAGE_PHYSICAL)
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return self.use(attacker) if attacker.socket: attacker.socket.clilocmessage(1060086) # You deliver a mortal wound! if defender.socket: defender.socket.clilocmessage(1060087) # You have been mortally wounded! defender.soundeffect(0x1e1) defender.effect(0x37b9, 244, 25) defender.dispel(None, True, 'MORTALSTRIKE_CHECK') if defender.npc: defender.settag('mortalstrike', wolfpack.currenttime() + 12000) defender.addtimer(12000, 'combat.specialmoves.ismortallywounded', [True], False, False, 'MORTALSTRIKE_CHECK') else: defender.settag('mortalstrike', wolfpack.currenttime() + 6000) defender.addtimer(6000, 'combat.specialmoves.ismortallywounded', [True], False, False, 'MORTALSTRIKE_CHECK')
def checkUse(player): if player.gm: return True if player.socket and player.socket.hastag('greenthorn_delay'): delay = int(player.socket.gettag('greenthorn_delay')) if wolfpack.currenttime() < delay: return False return True
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return self.use(attacker) if defender.dead or defender.pos.map == 0xFF: return # Out of reach if attacker.socket: attacker.socket.clilocmessage(1060086) # You deliver a mortal wound! if defender.socket: defender.socket.clilocmessage(1060087) # You have been mortally wounded! defender.soundeffect(0x1E1) defender.effect(0x37B9, 244, 25) defender.dispel(None, True, "MORTALSTRIKE_CHECK") if defender.npc: defender.settag("mortalstrike", wolfpack.currenttime() + 12000) defender.addtimer(12000, ismortallywounded, [True], False, False, "MORTALSTRIKE_CHECK") else: defender.settag("mortalstrike", wolfpack.currenttime() + 6000) defender.addtimer(6000, ismortallywounded, [True], False, False, "MORTALSTRIKE_CHECK")
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return # Clear Ability, then check if it really can be used clearability(attacker) if defender.dead or defender.pos.map == 0xFF: return # Out of reach weapon = defender.getweapon() # Doesnt have a weapon to disarm if not weapon: if attacker.socket: attacker.socket.clilocmessage(1060849) # Already unarmed ... # The weapon is immovable elif weapon.lockeddown or weapon.movable > 1: if attacker.socket: attacker.socket.clilocmessage(1004001) # You cannot disarm ... else: self.use(attacker) if attacker.socket: attacker.socket.clilocmessage(1060092) # You disarm their weapon! if defender.socket: defender.socket.clilocmessage(1060093) # Your weapon has been disarmed! defender.soundeffect(0x3B9) defender.effect(0x37BE, 232, 25) layer = weapon.layer # Save the weapon layer if not tobackpack(weapon, defender): # Unequip the weapon weapon.update() # Players cannot equip another weapon for 5000 ms if defender.socket: defender.socket.settag("block_equip", wolfpack.currenttime() + 5000) elif defender.npc: defender.addtimer(random.randint(5000, 7500), reequip_weapon, [weapon.serial, layer], True)
def hit(self, attacker, defender, damage): if not self.checkuse(attacker): return self.use(attacker) if attacker.socket: attacker.socket.clilocmessage(1060084) # You attack with lightning speed! if defender.socket: defender.socket.clilocmessage(1060085) # Your attacker strikes with lightning speed! if defender.dead or attacker.dead: return defender.soundeffect(0x3bb) defender.effect(0x37b9, 244, 25) # Make sure that the next swing has only 90% of the damage if attacker.socket: attacker.socket.settag('weaponability', 1000) attacker.callevent(EVENT_SWING, (attacker, defender, wolfpack.currenttime())) # Swing again
def checkmana(self, player, weapon, use=False): mana = self.getmana(player, weapon) if mana == 0: return True # This ability does not require mana if player.socket and player.socket.hastag("last_special_ability"): if player.socket.gettag("last_special_ability") + 3000 > wolfpack.currenttime(): mana *= 2 else: player.socket.deltag("last_special_ability") # Check if there is enough mana if player.mana < mana: if player.socket: player.socket.clilocmessage(1060181, str(mana)) # You need xxx mana. return False # Consume the mana if use: player.mana -= mana player.updatemana() return True
def onWearItem(player, wearer, item, layer): if wearer.socket and wearer.socket.hastag('block_equip'): expire = int(wearer.socket.gettag('block_equip')) if expire < wolfpack.currenttime(): wearer.socket.deltag('block_equip') else: if player == wearer: player.socket.sysmessage(tr('You cannot equip another so soon after being disarmed.')) else: player.socket.sysmessage(tr('They cannot equip another so soon after being disarmed.')) return True lower = properties.fromitem(item, LOWERREQS) / 100.0 req_str = item.getintproperty( 'req_strength', 0 ) if item.hastag( 'req_strength' ): req_str = int( item.gettag( 'req_strength' ) ) if lower: req_str = int(ceil(req_str) * (1.0 - lower)) req_dex = item.getintproperty( 'req_dexterity', 0 ) if item.hastag( 'req_dexterity' ): req_dex = int( item.gettag( 'req_dexterity' ) ) if lower: req_dex = int(ceil(req_dex) * (1.0 - lower)) req_int = item.getintproperty( 'req_intelligence', 0 ) if item.hastag( 'req_intelligence' ): req_int = int( item.gettag( 'req_intelligence' ) ) if lower: req_int = int(ceil(req_int) * (1.0 - lower)) if wearer.strength < req_str: if player != wearer: player.socket.sysmessage('This person can\'t wear that item, seems not strong enough.') else: player.socket.clilocmessage(500213) return True if wearer.dexterity < req_dex: if player != wearer: player.socket.sysmessage('This person can\'t wear that item, seems not agile enough.') else: player.socket.clilocmessage(502077) return True if wearer.intelligence < req_int: if player != wearer: player.socket.sysmessage('This person can\'t wear that item, seems not smart enough.') else: player.socket.sysmessage('You are not intelligent enough to equip this item.') return True # Reject equipping an item with durability 1 or less # if it's an armor, shield or weapon armor = properties.itemcheck(item, ITEM_ARMOR) weapon = properties.itemcheck(item, ITEM_WEAPON) shield = properties.itemcheck(item, ITEM_SHIELD) if (armor or weapon or shield) and item.health < 1: player.socket.sysmessage('You need to repair this before using it again.') return True return False
def use(self, player): weapon = player.getweapon() # Get the used weapon self.checkmana(player, weapon, True) # Consume the mana clearability(player) # Clear the ability if player.socket: player.socket.settag("last_special_ability", wolfpack.currenttime())
def target(player, arguments, target): # Check the green thorn first item = wolfpack.finditem(arguments[0]) # Check if we have the item in our backpack if not item or item.getoutmostitem() != player.getbackpack(): player.socket.clilocmessage(1042038) # You must have the object in your backpack to use it. return # Check the green thorn delay if not checkUse(player): player.message(1061908) # * You must wait a while before planting another thorn. * return # This check should only happen for solen hives if player.pos.map not in [0, 1]: player.message(tr("No solen lairs exist on this facet. Try again in Trammel or Felucca."), 0x2b2) return # Can we reach the target location? if not player.canreach(target.pos, 3): player.message(502825) # That location is too far away return # Get the land-tile id at the given location landid = wolfpack.map(target.pos.x, target.pos.y, player.pos.map)['id'] callback = None # Callback for the green thorns effect # Check which effect should be used for the landtile type if landid in DIRT_TILES: callback = dirtCallback elif landid in FURROWS_TILES: callback = furrowsCallback elif landid in SWAMP_TILES: callback = swampCallback elif landid in SNOW_TILES: callback = snowCallback elif landid in SAND_TILES: callback = sandCallback if not callback: player.message(1061913) else: if item.amount <= 1: item.delete() else: item.amount -= 1 item.update() # Show a message that we're planting a thorn player.socket.clilocmessage(1061914, "", 0x961, 3, player, "", False, True) # * You push the strange green thorn into the ground * listeners = wolfpack.chars(player.pos.x, player.pos.y, player.pos.map, 18) for listener in listeners: if listener != player and listener.socket: listener.socket.clilocmessage(1061915, player.name, 0x961, 3, player, "", False, True) # * ~1_PLAYER_NAME~ pushes a strange green thorn into the ground. * # Set the next use delay for this kind of item player.socket.settag('greenthorn_delay', wolfpack.currenttime() + GREENTHORN_DELAY) # Start the effect player.addtimer(2500, callback, [target.pos, 0])
def serverinfo(socket, command, arguments): char = socket.player version = wolfpack.serverversion() uptime = wolfpack.currenttime() / 1000 upseconds = uptime upminutes = uptime / 60 upseconds -= upminutes * 60 if upseconds <= 9: upseconds = "0%s" % (upseconds) uphours = upminutes / 60 upminutes -= uphours * 60 if upminutes <= 9: upminutes = "0%s" % (upminutes) if uphours <= 9: uphours = "0%s" % (uphours) timestring = "%s:%s:%s" % (uphours, upminutes, upseconds) onlinecount = wolfpack.sockets.count() accountcount = 0 admincount = 0 gmcount = 0 seercount = 0 counselorcount = 0 playercount = 0 acclist = wolfpack.accounts.list for i in acclist(): record = wolfpack.accounts.find(i) accountcount += 1 if record.acl == "admin": admincount += 1 if record.acl == "gm": gmcount += 1 if record.acl == "seer": seercount += 1 if record.acl == "counselor": counselorcount += 1 if record.acl == "player": playercount += 1 gump = cGump(x=30, y=30) gump.addBackground(id=0x2436, width=280, height=400) # Basic Info text = '<basefont color="#FFFF00"><center><h3>%s Shard Status</h3></center><br />' % (shardname) text += '<basefont color="#FEFEFE">' text += " Version: %s<br />" % (version) text += " Uptime: %s<br />" % (timestring) # Account Info text += '<basefont color="#FFFF00"><center><h3>Account Information</h3></center><br />' text += '<basefont color="#FEFEFE">' text += ( ' Online Accounts: <basefont color="#00FFFF">%i <basefont color="#FEFEFE">/ <basefont color="#00FFFF">%i<br />' % (onlinecount, accountcount) ) text += '<basefont color="#FEFEFE">' text += ' Total Admins: <basefont color="#00FF00">%i<br />' % (admincount) text += '<basefont color="#FEFEFE">' text += ' Total Seers: <basefont color="#00FF00">%i<br />' % (seercount) text += '<basefont color="#FEFEFE">' text += ' Total Counselors: <basefont color="#00FF00">%i<br />' % (counselorcount) text += '<basefont color="#FEFEFE">' text += ' Total Players: <basefont color="#00FF00">%i<br />' % (playercount) text += '<basefont color="#FEFEFE">' text += ' Total Characters: <basefont color="#00FF00">%i<br />' % (wolfpack.charcount()) text += '<basefont color="#FEFEFE">' text += ' Total Items: <basefont color="#00FF00">%i<br />' % (wolfpack.itemcount()) # Hardware Info text += '<basefont color="#FFFF00"><center><h3>Server Information</h3></center><br />' text += '<basefont color="#FEFEFE">' text += " OS: %s<br />" % (operatingsystem) text += " Processor: %s<br />" % (processor) text += " Memory: %s<br />" % (memory) gump.addHtmlGump(x=20, y=20, width=240, height=360, html=text) gump.send(char) return