Advertisement
Guest User

RubySpellBooks.rb

a guest
Aug 17th, 2015
1,126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 7.98 KB | None | 0 0
  1. Plugin.is {
  2.         name "RubySpellBooks"
  3.         version "0.8"
  4.         author "RainbowReich"
  5.         description "Allows Ruby code to be run from Written Books."
  6.         commands :listbooks => {
  7.             :description => "Lists all existing Ruby Spell Books.",
  8.             :usage => "/listbooks"
  9.         },
  10.                         :binditem => {
  11.             :description => "Binds an item to a Ruby Spell Book.",
  12.             :usage => "/binditem"
  13.         },
  14.                         :reloadbook => {
  15.             :description => "Reloads a Written Book as a Ruby Spell Book.",
  16.             :usage => "/reloadbook"
  17.         },
  18.                         :editbook => {
  19.             :description => "Opens a Written Book for editing.",
  20.             :usage => "/editbook"
  21.         },
  22.                         :bindblock => {
  23.             :description => "Binds the selected block to a Ruby Spell Book.",
  24.             :usage => "/bindblock"
  25.         }
  26. }
  27.  
  28. import 'org.bukkit.Server'
  29. import 'org.bukkit.event.player.PlayerInteractEvent'
  30. import 'org.bukkit.Material'
  31. import 'org.bukkit.event.entity.EntityDamageEvent'
  32. import 'org.bukkit.event.entity.EntityDamageByEntityEvent'
  33. import 'org.bukkit.event.entity.PlayerDeathEvent'
  34. import 'org.bukkit.entity.HumanEntity'
  35. import 'org.bukkit.Sound'
  36. import 'org.bukkit.Effect'
  37. import 'org.bukkit.ChatColor'
  38. import 'org.bukkit.inventory.ItemStack'
  39. import 'org.bukkit.entity.EntityType'
  40. import 'org.bukkit.event.player.PlayerEditBookEvent'
  41. import 'org.bukkit.event.player.PlayerPickupItemEvent'
  42. import 'org.bukkit.event.entity.ItemDespawnEvent'
  43. import 'org.bukkit.metadata.FixedMetadataValue'
  44. import 'org.bukkit.event.player.PlayerMoveEvent'
  45.  
  46. require 'java'
  47. require 'digest'
  48.  
  49.  
  50.  
  51. class SpellBook
  52.     attr_accessor :code, :name, :author, :hash_code
  53.    
  54.     def initialize(name, author)
  55.         @name = name
  56.         @author = author
  57.         @hash_code = ("#{@name} #{@author} #{@code}").hash
  58.     end
  59.    
  60.     def run(context)
  61.         eval(@code, context)
  62.     end
  63.    
  64.     def ==(y)
  65.         @hash_code.to_s == y[y.length-1] if y.class == Array
  66.         self == y if y.class == SpellBook
  67.     end
  68.    
  69. end
  70.  
  71. def spell_init &block
  72.     yield unless $spell_init == false
  73. end
  74.  
  75. def spell_run &block
  76.     yield unless $spell_init == true
  77. end
  78.  
  79. def spell_interact &block
  80.     yield unless $spell_interact == false
  81. end
  82.  
  83. def spell_pickup &block
  84.     yield unless $spell_pickup == false
  85. end
  86.  
  87. def spell_despawn &block
  88.     yield unless $spell_despawn == false
  89. end
  90.  
  91. def spell_move &block
  92.     yield unless $spell_move == false
  93. end
  94.  
  95. def set_player_variable(player) #Set Global Player Variable
  96.     $player = player
  97. end
  98.  
  99. def set_event_variable(event)
  100.     $event = event
  101. end
  102.  
  103. def reset_globals
  104.     $spell_init = false
  105.     $spell_interact = false
  106.     $spell_pickup = false
  107.     $spell_despawn = false
  108.     $spell_move = false
  109. end
  110.  
  111. def is_bound_item?(item)
  112.     item.getItemMeta.hasLore && item.getItemMeta.getLore[0] == "Ruby Spell Bound"
  113. end
  114.  
  115. def is_bound_block?(block)
  116.     block.hasMetadata("reich") == true && block.getMetadata("reich")[0].value != nil
  117. end
  118.  
  119. class RubySpellBooks < RubyPlugin
  120.    
  121.     attr_accessor :spell_books, :selected_block
  122.    
  123.     def create_spell_book(new_book, player) #Add Ruby Spell Book to internal list
  124.         if new_book.getPages[0] == "Ruby Spell Book" then
  125.             if @spell_books[new_book.getTitle] == nil then
  126.                 new_spell = SpellBook.new(new_book.getTitle, new_book.getAuthor)
  127.                 new_spell.code = new_book.getPages[1..new_book.getPages.length-1].join
  128.                 @spell_books[new_book.getTitle] = new_spell
  129.                 reset_globals
  130.                 $spell_init = true
  131.                 set_player_variable(player)
  132.                 new_spell.run(binding)
  133.                 return true
  134.             else
  135.                 return false
  136.             end
  137.         end
  138.     end
  139.    
  140.     def spawn_spell_item(world, loc, material, spell)
  141.         spell_item = ItemStack.new(material)
  142.         new_meta = spell_item.getItemMeta
  143.         new_meta.setLore(["Ruby Spell Bound",spell])
  144.         spell_item.setItemMeta new_meta
  145.         world.dropItemNaturally(loc, spell_item)
  146.     end
  147.    
  148.     def valid_spell? (s)
  149.         !(@spell_books[s] == nil)
  150.     end
  151.    
  152.     def onEnable #Enabled Plugin
  153.         @spell_books = {}
  154.         server.broadcastMessage "[" + description.name + "] " + description.fullName + " enabled."
  155.        
  156.         registerEvent(PlayerEditBookEvent, :Normal) do |event| #Ruby Spell Book Create Event
  157.             new_book = event.getNewBookMeta
  158.             set_event_variable(event)
  159.             if event.isSigning == true && create_spell_book(new_book, event.getPlayer) == false then
  160.                 event.getPlayer.sendMessage("Could not create Ruby Spell Book.")
  161.                 event.setCancelled(true)
  162.             end
  163.         end
  164.        
  165.         registerEvent(PlayerInteractEvent, :Normal) do |event| #Use Bound Wand Event
  166.             item = event.getPlayer.getInventory.getItemInHand
  167.             if is_bound_item? item then
  168.                 set_event_variable(event)
  169.                 set_player_variable(event.getPlayer)
  170.                 reset_globals
  171.                 $spell_interact = true
  172.                 @spell_books[item.getItemMeta.getLore[1]].run(binding) if valid_spell? item.getItemMeta.getLore[1]
  173.             end
  174.             if item.getType == Material::STICK then #Select Block
  175.                 new_loc = event.getClickedBlock.getLocation
  176.                 new_loc.setY(new_loc.getY + 1)
  177.                 @selected_block = event.getClickedBlock.getWorld.getBlockAt(new_loc)
  178.                 event.getPlayer.sendMessage "Selected block at (#{@selected_block.getLocation.getX}, #{@selected_block.getLocation.getY}, #{@selected_block.getLocation.getZ})"
  179.             end
  180.         end
  181.        
  182.         registerEvent(PlayerPickupItemEvent, :Normal) do |event| #Pick up Bound Wand Event
  183.             if is_bound_item? event.getItem.getItemStack then
  184.                 set_event_variable(event)
  185.                 set_player_variable(event.getPlayer)
  186.                 reset_globals
  187.                 $spell_pickup = true
  188.                 @spell_books[event.getItem.getItemStack.getItemMeta.getLore[1]].run(binding) #if valid_spell? event.getItem.getItemStack.getItemMeta.getLore[1]
  189.             end
  190.         end
  191.        
  192.         registerEvent(ItemDespawnEvent, :Normal) do |event| #Bound Wand Item despawn event
  193.             if is_bound_item? event.getEntity.getItemStack then
  194.                 set_event_variable(event)
  195.                 set_player_variable(nil)
  196.                 reset_globals
  197.                 $spell_despawn = true
  198.                 @spell_books[event.getEntity.getItemStack.getItemMeta.getLore[1]].run(binding) if valid_spell? event.getEntity.getItemStack.getItemMeta.getLore[1]
  199.             end
  200.         end
  201.        
  202.         registerEvent(PlayerMoveEvent, :Normal) do |event| #Player Move over Bound Block Event
  203.             cur_block = event.getPlayer.getWorld.getBlockAt(event.getTo)
  204.             if is_bound_block?(cur_block)==true && valid_spell?(cur_block.getMetadata("reich")[0].value)==true then
  205.                 set_event_variable(event)
  206.                 set_player_variable(event.getPlayer)
  207.                 reset_globals
  208.                 $spell_move = true
  209.                 $block = cur_block
  210.                 @spell_books[cur_block.getMetadata("reich")[0].value].run(binding)
  211.             end
  212.         end
  213.        
  214.     end
  215.    
  216.     def onCommand(sender, command, label, args)
  217.         if label == "listbooks" then #List Books Command
  218.             @spell_books.length > 0 ? sender.sendMessage("Ruby Spell Books (#{@spell_books.length}):") : sender.sendMessage("No Ruby Spell Books exist.")
  219.             @spell_books.each_value { |book| sender.sendMessage "#{book.name} by #{book.author}" }
  220.             return true
  221.         elsif label == "binditem" then #Bind Wand Command
  222.             if @spell_books.has_key? args[0].to_s then
  223.               new_meta = sender.getInventory.getItemInHand.getItemMeta
  224.                 new_meta.setLore(["Ruby Spell Bound", args[0].to_s])
  225.                 sender.getInventory.getItemInHand.setItemMeta new_meta
  226.             else
  227.                 sender.sendMessage "#{args[0]} is not a valid Ruby Spell Book."
  228.             end
  229.             return true
  230.         elsif label == "reloadbook" then #Reload Ruby Spell Book Command
  231.             item = sender.getInventory.getItemInHand
  232.             if item.getType == Material::WRITTEN_BOOK then
  233.                 if create_spell_book(item.getItemMeta, sender) == false then
  234.                     sender.sendMessage("Could not create Ruby Spell Book.")
  235.                 end
  236.             end
  237.             return true
  238.         elsif label == "editbook" then #Edit Book Command
  239.             item = sender.getInventory.getItemInHand
  240.             if item.getType == Material::WRITTEN_BOOK && item.getItemMeta.getAuthor == sender.getPlayerListName then
  241.                 item.setType(Material::BOOK_AND_QUILL)
  242.                 @spell_books.delete(item.getItemMeta.getTitle)
  243.                 return true
  244.             end
  245.         elsif label == "bindblock" then
  246.             cur_block = @selected_block
  247.             cur_block.setMetadata("reich", FixedMetadataValue.new(RubySpellBooks, args[0]))
  248.             return true
  249.         end
  250.     end
  251.    
  252.     def onDisable #Disable Plugin
  253.         server.broadcastMessage "[" + description.name + "] " + description.fullName + " disabled."
  254.     end
  255.    
  256. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement