class WarpZoneListener(BaseListener): default_config = { 'warpzones': [ { 'area': { 'min': [0, 0, 0], 'max': [1, 1, 1], 'world': 'world' }, 'to': { 'location': [2, 2, 2], 'world': 'world' } } ] } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'warpzones.yml'), default=self.default_config) self.config_manager.load_config() self.register_event(self.onPlayerMoveEvent, PlayerMoveEvent) def onDisable(self): self.config_manager.save_config() def onPlayerMoveEvent(self, event): if event.getFrom().getBlock() == event.getTo().getBlock(): return to = event.getTo() to_arr = [to.getBlockX(), to.getBlockY(), to.getBlockZ()] for warp in self.config_manager.config['warpzones']: if warp['area']['world'] == event.getPlayer().getLocation().getWorld().getName(): if self.is_in_range(to_arr, warp['area']['min'], warp['area']['max']): #Should probably do a rtree or something to_loc = warp['to']['location'] event.getPlayer().teleport(Location(self.plugin.getServer().getWorld(warp['to']['world']), to_loc[0], to_loc[1], to_loc[2])) def is_in_range(self, loc, mini, maxi): return self.arr_gt(loc, mini) and self.arr_lt(loc, maxi) def arr_gt(self, arr1, arr2): for index in range(0, len(arr1)): if not arr1[index] >= arr2[index]: return False return True def arr_lt(self, arr1, arr2): for index in range(0, len(arr1)): if not arr1[index] <= (arr2[index]): return False return True
class ActionSignListener(BaseListener): default_config = { 'signs': [ { 'coordinates': [0, 0, 0], 'type': 'teleport', 'destination': [0, 0, 0] } ] } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'signs.yml'), default=self.default_config) self.config_manager.load_config() self.register_event(self.onPlayerInteract, PlayerInteractEvent) register_command(self.reload_command, 'reload-sign-config', permission="omneity.actionsigns.reload") def onDisable(self): self.config_manager.save_config() def onPlayerInteract(self, event): block = event.getClickedBlock() if block is None: return block_state = block.getState() if not isinstance(block_state, Sign): return sign = block_state sign_coords = [block.getX(), block.getY(), block.getZ()] for sign_instance in self.config_manager.config['signs']: if sign_instance['coordinates'] == sign_coords: type_handler = sign_types[sign_instance['type']] if event.getAction() == Action.LEFT_CLICK_BLOCK: type_handler.onLeftClick(sign_instance, self.plugin, event, sign) elif event.getAction() == Action.RIGHT_CLICK_BLOCK: type_handler.onRightClick(sign_instance, self.plugin, event, sign) else: return #Something is f****d, should raise a exception event.setCancelled(True) return def reload_command(self, sender, label, args): self.config_manager.reload_config() sender.sendMessage("Reloaded sign config")
class XpListener(BaseListener): default_config = { 'xp_buff': 5 } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'xp.yml'), default=self.default_config) self.config_manager.load_config() self.register_event(self.onPlayerExpChangeEvent, PlayerExpChangeEvent) def onDisable(self): self.config_manager.save_config() def onPlayerExpChangeEvent(self, event): event.setAmount(event.getAmount()*self.config_manager.config['xp_buff'])
class Omneity(PythonPlugin): default_config = { 'modules': [ 'aliases', 'actionsigns' ] } def onEnable(self): # Config stuffs self.getDataFolder().mkdirs() self.config_manager = ConfigManager(path.join(self.getDataFolder().getAbsolutePath(), 'config.yml'), default=self.default_config) self.config_manager.load_config() # Register listeners self.listeners = list() for module_name in self.config_manager.config['modules']: listener = __import__(module_name).listener(self) self.listeners.append(listener) listener.onEnable() self.getServer().getPluginManager().registerEvents(listener, self); print "Omneity Enabled" def onDisable(self): for listener in self.listeners: listener.onDisable() self.config_manager.save_config() print "Omneity Disabled"
class NetherListener(BaseListener): default_config = { } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'nether.yml'), default=self.default_config) self.config_manager.load_config() self.register_event(self.onPlayerPortalEvent, PlayerPortalEvent) self.register_event(self.onPortalCreateEvent, PortalCreateEvent) self.travelagent = OtOTravelAgent(self.plugin.getServer()) def onDisable(self): self.config_manager.save_config() def onPortalCreateEvent(self, event): pass def onPlayerPortalEvent(self, event): if event.getCause() != PlayerTeleportEvent.TeleportCause.NETHER_PORTAL: print "not a nether portal" return fr = event.getFrom() to = event.getTo() to_new = self.find_portal_data(fr) to_new.setWorld(to.getWorld()) event.setTo(to_new) event.setPortalTravelAgent(self.travelagent) def find_portal_data(self, location): world = location.getWorld() #Coordinates are not always accurate, sometimes they are a block next to it. Check nearby blocks for portal. corner = find_portal_block(location, 2) if not corner: raise PortalException("Unable to find from portal") #Find the bottom of the portal. while world.getBlockAt(corner).getType() == Material.PORTAL: corner.subtract(0, 1, 0) if world.getBlockAt(corner).getType() != Material.OBSIDIAN: raise PortalException("Portal wasn't really a portal") #Find which way the portal is placed, and do final adjustments to the corner. if world.getBlockAt(corner.getBlockX()+1, corner.getBlockY()+1, corner.getBlockZ()).getType() == Material.PORTAL: direction = 0 corner.subtract(1, 0, 0) elif world.getBlockAt(corner.getBlockX(), corner.getBlockY()+1, corner.getBlockZ()+1).getType() == Material.PORTAL: direction = 1 corner.subtract(0, 0, 1) elif world.getBlockAt(corner.getBlockX()-1, corner.getBlockY()+1, corner.getBlockZ()).getType() == Material.PORTAL: direction = 0 corner.subtract(2, 0, 0) elif world.getBlockAt(corner.getBlockX(), corner.getBlockY()+1, corner.getBlockZ()-1).getType() == Material.PORTAL: direction = 1 corner.subtract(0, 0, 2) else: raise PortalException("Unable to find portal direction") return PortalCoordinates(world, location.getBlockX(), location.getBlockY(), location.getBlockZ(), location.getYaw(), location.getPitch(), corner, direction)
class WarpZoneListener(BaseListener): default_config = { "warpzones": [ { "area": {"min": [0, 0, 0], "max": [1, 1, 1], "world": "world"}, "to": {"location": [2, 2, 2], "orientation": [0, 0], "world": "world"}, } ] } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager( path.join(self.plugin.getDataFolder().getAbsolutePath(), "warpzones.yml"), default=self.default_config ) self.config_manager.load_config() self.register_event(self.onPlayerMoveEvent, PlayerMoveEvent) def onDisable(self): self.config_manager.save_config() def onPlayerMoveEvent(self, event): if event.getFrom().getBlock() == event.getTo().getBlock(): return to = event.getTo() to_arr = [to.getBlockX(), to.getBlockY(), to.getBlockZ()] for warp in self.config_manager.config["warpzones"]: if warp["area"]["world"] == event.getPlayer().getLocation().getWorld().getName(): if self.is_in_range( to_arr, warp["area"]["min"], warp["area"]["max"] ): # Should probably do a rtree or something to_loc = warp["to"]["location"] to_py = warp["to"]["orientation"] event.getPlayer().teleport( Location( self.plugin.getServer().getWorld(warp["to"]["world"]), to_loc[0], to_loc[1], to_loc[2], to_py[0], to_py[1], ) ) def is_in_range(self, loc, mini, maxi): return self.arr_gt(loc, mini) and self.arr_lt(loc, maxi) def arr_gt(self, arr1, arr2): for index in range(0, len(arr1)): if not arr1[index] >= arr2[index]: return False return True def arr_lt(self, arr1, arr2): for index in range(0, len(arr1)): if not arr1[index] <= (arr2[index]): return False return True
class SpawnListener(BaseListener): default_config = { 'spawn': { 'location': [0, 0, 0], 'orientation': [0, 0], 'world': 'world' }, 'first-join-message': { 'show': True, 'message': "%(GOLD)sWelcome %(name)s to the server!" }, 'allow-bed-spawn': True } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'spawn.yml'), default=self.default_config) self.config_manager.load_config() self.register_event(self.onPlayerJoinEvent, PlayerJoinEvent) self.register_event(self.onPlayerPortalEvent, PlayerPortalEvent) self.register_event(self.onPlayerRespawnEvent, PlayerRespawnEvent) register_command(self.spawnCommand, "spawn", permission="omneity.spawn.tp") def onDisable(self): self.config_manager.save_config() def getSpawnLocation(self): spawn_info = self.config_manager.config['spawn'] return Location( self.plugin.getServer().getWorld(spawn_info['world']), spawn_info['location'][0], spawn_info['location'][1], spawn_info['location'][2], spawn_info['orientation'][0], spawn_info['orientation'][1] ) def onPlayerJoinEvent(self, event): player = event.getPlayer() if not player.hasPlayedBefore(): player.teleport(self.getSpawnLocation()) first_join_message_info = self.config_manager.config['first-join-message'] if first_join_message_info['show']: message = first_join_message_info['message'] % dict({'name': event.getPlayer().getName()}.items() + chatcolor.colors.items()) self.plugin.getServer().broadcastMessage(message) def onPlayerPortalEvent(self, event): if event.getFrom().getWorld().getEnvironment() == Environment.THE_END and not self.config_manager.config['allow-bed-spawn']: event.setTo(self.getSpawnLocation()) def onPlayerRespawnEvent(self, event): if not event.isBedSpawn() or not self.config_manager.config['allow-bed-spawn']: event.setRespawnLocation(self.getSpawnLocation()) def spawnCommand(self, sender, alias, args): if isinstance(sender, Player): sender.teleport(self.getSpawnLocation()) sender.sendMessage("Whoosh!")
class WarpListener(BaseListener): permission_error = chatcolor.RED + "I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is in error." default_config = { 'warps':{ 'test': { 'location': [0, 0, 0], 'orientation': [0, 0], 'world': 'world' } } } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'warps.yml'), default=self.default_config) self.config_manager.load_config() register_command(self.command_warp, 'warp', description="Warp to places", usage="/<command> <warp> | set <warp> | del <warp> | list", permission="omneity.warp") def onDisable(self): self.config_manager.save_config() def command_warp(self, sender, label, args): if len(args) < 1: return False if args[0] == "set": if not sender.hasPermission("omneity.warp.set"): sender.sendMessage(self.permission_error) return if len(args) != 2: return False location = sender.getLocation() self.config_manager.config['warps'][args[1]] = {'location': [location.getX(), location.getY(), location.getZ()], 'orientation': [location.getYaw(), location.getPitch()], 'world': location.getWorld().getName()} self.config_manager.mark_dirty() sender.sendMessage(chatcolor.GOLD + "Warp set.") return True if args[0] == "del": if not sender.hasPermission("omneity.warp.del"): sender.sendMessage(self.permission_error) return if len(args) != 2: return False del(self.config_manager.config['warps'][args[1]]) self.config_manager.mark_dirty() sender.sendMessage(chatcolor.GOLD + "Warp deleted.") return if args[0] == "list": sender.sendMessage(chatcolor.GOLD + ', '.join(self.config_manager.config['warps'].keys())) return if len(args) != 1: return False try: warp_data = self.config_manager.config['warps'][args[0]] except KeyError: sender.sendMessage(chatcolor.GOLD + "Warp doesn't exist.") return location = Location( self.plugin.getServer().getWorld(warp_data['world']), warp_data['location'][0], warp_data['location'][1], warp_data['location'][2], warp_data['orientation'][0], warp_data['orientation'][1]) sender.teleport(location) sender.sendMessage(chatcolor.GOLD + "Warped.")
class RecipeListener(BaseListener): default_config = { 'furnace': [ { 'result': { 'id': 1, 'amount': 1, #default: 1 'data': -1 #default: -1 }, 'source': { 'id': 1, 'data': -1 #default: -1 } } ], 'shape': [ { 'result': { 'id': 1, 'amount': 1, #default: 1 'data': -1 #default: -1 }, 'shape': [ "ABA", "BAB", "ABA" ], 'ingredients': { 'A': { 'id': 2, 'data': -1 #default: -1 }, 'B': { 'id': 3, 'data': -1 #default: -1 } } } ], 'shapeless': [ { 'result': { 'id': 1, 'amount': 1, #default: 1 'data': -1 #default: -1 }, 'ingredients': [ { 'id': 1, 'amount': 1, #default: 1 max: 9 'data': -1 #default: 1- } ] } ] } def __init__(self, plugin): self.plugin = plugin def onEnable(self): self.config_manager = ConfigManager(path.join(self.plugin.getDataFolder().getAbsolutePath(), 'recipes.yml'), default=self.default_config) self.config_manager.load_config() server = self.plugin.getServer() for recipe_data in self.config_manager.config['furnace']: recipe = FurnaceRecipe(self.parse_itemstack(recipe_data['result']), self.parse_materialdata(recipe_data['source'])) server.addRecipe(recipe) for recipe_data in self.config_manager.config['shape']: recipe = ShapedRecipe(self.parse_itemstack(recipe_data['result'])) recipe.shape(recipe_data['shape']) for key, ingredient in recipe_data['ingredients'].iteritems(): recipe.setIngredient(key, self.parse_materialdata(ingredient)) server.addRecipe(recipe) for recipe_data in self.config_manager.config['shapeless']: recipe = ShapelessRecipe(self.parse_itemstack(recipe_data['result'])) for ingredient in recipe_data['ingredients']: recipe.addIngredient(ingredient.get('amount', 1), self.parse_materialdata(ingredient)) server.addRecipe(recipe) def parse_itemstack(self, data): return ItemStack(data['id'], data.get('amount', 1), data.get('data', -1)) def parse_materialdata(self, data): return MaterialData(data['id'], data.get('data', -1)) def onDisable(self): self.config_manager.save_config()