Last active
December 15, 2015 21:37
-
-
Save pnlybubbles/5b1853f3fc36277fa327 to your computer and use it in GitHub Desktop.
死体を数回クリックすることで仲間を蘇生できるようにするBukkitプラグイン。Puruginを利用。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # encoding: utf-8 | |
| $glowstone_marker = true | |
| $delete_dead_items = true | |
| $indestructible_skull = true | |
| class RevivePlugin | |
| include Purugin::Plugin | |
| description 'Revive', 0.2 | |
| def set_exp(player, exp) | |
| player.set_level(0) | |
| player.set_exp(0) | |
| player.set_total_experience(0) | |
| player.give_exp(exp) | |
| end | |
| def calc_exp(lvl, tmp_exp) | |
| del = 0.to_f | |
| [*(0..lvl)].each_with_index { |v, i| | |
| de = v >= 30 ? 62 + (v - 30) * 7 : (v >= 15 ? 17 + (v - 15) * 3 : 17) | |
| if i == lvl | |
| de *= tmp_exp | |
| end | |
| del += de | |
| } | |
| return del | |
| end | |
| def on_enable | |
| material = org::bukkit::Material | |
| action = org::bukkit::event::block::Action | |
| chatcolor = org::bukkit::ChatColor | |
| dead_player = [] | |
| public_command('restore', 'Restore Inventory', '/restore') do |player, *args| | |
| target = player | |
| if target | |
| index = dead_player.map { |v| v["player"].name }.index(target.name) | |
| if index | |
| unless dead_player[index]["collected"] | |
| target.inventory.set_contents(dead_player[index]["inventory_cont"]) | |
| target.inventory.set_armor_contents(dead_player[index]["armor_cont"]) | |
| target.update_inventory | |
| dead_player_exp = dead_player[index]["total_experience"] | |
| set_exp(target, dead_player_exp) | |
| blk = dead_player[index]["block"] | |
| blk.type = material::AIR | |
| if $glowstone_marker | |
| torch_loc = blk.location | |
| torch_loc.set_y(torch_loc.get_y - 1) | |
| torch_loc.block.type = material::AIR | |
| end | |
| dead_player[index]["collected"] = true | |
| # dead_player.delete_at(index) | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}のインベントリを復元しました") | |
| target.msg("#{chatcolor::LIGHT_PURPLE}インベントリが復元されました") | |
| else | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}のインベントリは既に復元されています^^") | |
| end | |
| else | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}の死亡データは存在しません") | |
| end | |
| else | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}は存在しません") | |
| end | |
| end | |
| player_command('restore_target', 'Restore Player\'s Inventory', '/restore_target {name}') do |player, *args| | |
| target = nil | |
| player.server.worlds.map(&:players).flatten.each { |p| | |
| target = p if p.name == args[0] | |
| } | |
| if target | |
| index = dead_player.map { |v| v["player"].name }.index(target.name) | |
| if index | |
| target.inventory.set_contents(dead_player[index]["inventory_cont"]) | |
| target.inventory.set_armor_contents(dead_player[index]["armor_cont"]) | |
| target.update_inventory | |
| dead_player_exp = dead_player[index]["total_experience"] | |
| set_exp(target, dead_player_exp) | |
| blk = dead_player[index]["block"] | |
| blk.type = material::AIR | |
| if $glowstone_marker | |
| torch_loc = blk.location | |
| torch_loc.set_y(torch_loc.get_y - 1) | |
| torch_loc.block.type = material::AIR | |
| end | |
| dead_player[index]["collected"] = true | |
| # dead_player.delete_at(index) | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}のインベントリを復元しました") | |
| target.msg("#{chatcolor::LIGHT_PURPLE}インベントリが復元されました") | |
| else | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}の死亡データは存在しません") | |
| end | |
| else | |
| player.msg("#{chatcolor::GOLD}#{target.display_name}#{chatcolor::RESET}は存在しません") | |
| end | |
| end | |
| event(:player_death) { |e| | |
| exist_index = $delete_dead_items && dead_player.map { |v| v["player"].name }.index(e.entity.player.name) | |
| p exist_index | |
| p exist_index && !dead_player[exist_index]["collected"] | |
| if exist_index && !dead_player[exist_index]["collected"] | |
| exist_blk = dead_player[exist_index]["block"] | |
| exist_blk.type = material::AIR | |
| if $glowstone_marker | |
| exist_torch_loc = exist_blk.location | |
| exist_torch_loc.set_y(exist_torch_loc.get_y - 1) | |
| exist_torch_loc.block.type = material::AIR | |
| end | |
| dead_player[exist_index]["player"].msg("#{chatcolor::LIGHT_PURPLE}かつて遺品は消失しました") | |
| dead_player.delete_at(exist_index) | |
| end | |
| if exist_index | |
| dead_player.delete_at(exist_index) | |
| end | |
| e.get_drops.clear | |
| e.set_dropped_exp(0) | |
| torch_loc = e.entity.location | |
| [*torch_loc.get_y.to_i..253].each { |y| | |
| torch_loc.set_y(y) | |
| if torch_loc.block.get_type == material::AIR | |
| break | |
| end | |
| } | |
| if $glowstone_marker | |
| torch_loc.block.type = material::GLOWSTONE | |
| end | |
| loc = torch_loc | |
| loc.set_y(loc.get_y + 1) | |
| loc.block.type = material::SKULL | |
| blk_state = loc.block.state | |
| blk_state.set_owner(e.entity.player.name) | |
| blk_state.update | |
| dead_player_hash = {} | |
| dead_player_hash["location"] = loc | |
| dead_player_hash["block"] = loc.block | |
| dead_player_hash["total_experience"] = e.entity.player.total_experience | |
| dead_player_hash["revive_state"] = 0 | |
| dead_player_hash["inventory_cont"] = e.entity.player.inventory.contents | |
| dead_player_hash["armor_cont"] = e.entity.player.inventory.armor_contents | |
| dead_player_hash["player"] = e.entity.player | |
| dead_player_hash["revived"] = false | |
| dead_player_hash["respawned"] = false | |
| dead_player_hash["collected"] = false | |
| dead_player_hash["try_revive"] = [] | |
| dead_player << dead_player_hash | |
| e.entity.player.world.players.each { |p| | |
| if e.entity.player.total_experience < 50 | |
| p.msg("#{chatcolor::GOLD}#{e.entity.player.display_name}#{chatcolor::LIGHT_PURPLE}は蘇生が必要です(経験値不足)") | |
| else | |
| p.msg("#{chatcolor::GOLD}#{e.entity.player.display_name}#{chatcolor::LIGHT_PURPLE}に蘇生が必要です") | |
| end | |
| p.msg("#{chatcolor::GOLD}#{e.entity.player.display_name}#{chatcolor::RESET}: #{e.entity.player.location.x.round} #{e.entity.player.location.y.round} #{e.entity.player.location.z.round}") | |
| } | |
| } | |
| event(:player_interact) { |e| | |
| if e.action == action::RIGHT_CLICK_BLOCK || e.action == action::LEFT_CLICK_BLOCK | |
| index = dead_player.map { |v| v["block"] }.index(e.clicked_block) | |
| if index | |
| if dead_player[index]["collected"] | |
| elsif dead_player[index]["player"].name == e.player.name | |
| puts "#{e.player.display_name} collected items" | |
| blk = e.clicked_block | |
| blk.type = material::AIR | |
| if $glowstone_marker | |
| torch_loc = blk.location | |
| torch_loc.set_y(torch_loc.get_y - 1) | |
| torch_loc.block.type = material::AIR | |
| end | |
| all_item = (dead_player[index]["armor_cont"].to_a + dead_player[index]["inventory_cont"].to_a).compact.map { |i| i.type == material::AIR ? nil : i }.compact | |
| (all_item[(35 - e.player.inventory.to_a.compact.length + 1)..-1] || []).each { |item| | |
| e.player.world.drop_item(e.player.location, item) | |
| } | |
| all_item[0..(35 - e.player.inventory.to_a.compact.length)].each { |item| | |
| e.player.inventory.add_item(item) | |
| } | |
| e.player.update_inventory | |
| e.player.give_exp(dead_player[index]["total_experience"]) | |
| e.player.msg("#{chatcolor::LIGHT_PURPLE}遺品回収成功") | |
| e.player.world.players.each { |p| | |
| p.msg("#{chatcolor::GOLD}#{e.player.display_name}#{chatcolor::RESET}が遺品回収を行った") if p != e.player | |
| } | |
| dead_player[index]["collected"] = true | |
| # dead_player.delete_at(index) | |
| else | |
| if dead_player[index]["respawned"] | |
| puts "#{e.player.display_name} could not revive #{dead_player[index]['player'].name} because the player spawned" | |
| e.player.msg("#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::RESET}は既にリスポーンしています") | |
| else | |
| if dead_player[index]["total_experience"] < 50 | |
| if e.action == action::LEFT_CLICK_BLOCK | |
| if e.player.total_experience >= 10 | |
| dead_player[index]["total_experience"] += 10 | |
| set_exp(e.player, e.player.total_experience - 10) | |
| e.player.msg("#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::RESET}に蘇生に必要な経験値を10与えた(@#{50 - dead_player[index]["total_experience"]})") | |
| else | |
| e.player.msg("与えられる最低限の経験値(>=10)を持っていません") | |
| end | |
| else | |
| e.player.msg("#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::RESET}は蘇生に必要な経験値(@#{50 - dead_player[index]["total_experience"]})が不足しています(左クリックで自分から経験値を与える)") | |
| end | |
| else | |
| dead_player[index]["revive_state"] += 1 | |
| e.player.msg("#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::RESET}を蘇生中: #{dead_player[index]['revive_state']}/10") | |
| if !dead_player[index]["try_revive"].index(e.player) | |
| puts "#{e.player.display_name} try to revive #{dead_player[index]["player"].name}" | |
| dead_player[index]["player"].msg("#{chatcolor::GOLD}#{e.player.display_name}#{chatcolor::LIGHT_PURPLE}が蘇生を試みています") | |
| dead_player[index]["try_revive"] << e.player | |
| end | |
| if dead_player[index]["revive_state"] == 10 | |
| puts "#{e.player.display_name} revived #{dead_player[index]['name']}" | |
| blk = e.clicked_block | |
| blk.type = material::AIR | |
| if $glowstone_marker | |
| torch_loc = blk.location | |
| torch_loc.set_y(torch_loc.get_y - 1) | |
| torch_loc.block.type = material::AIR | |
| end | |
| dead_player[index]["revived"] = true | |
| e.player.msg("#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::AQUA}を蘇生しました!") | |
| dead_player[index]["player"].msg("#{chatcolor::GOLD}#{e.player.display_name}#{chatcolor::AQUA}に蘇生されました!") | |
| dead_player[index]["player"].msg("#{chatcolor::BOLD}\"リスポーン\"をクリックで生還") | |
| e.player.world.players.each { |p| | |
| p.msg("#{chatcolor::GOLD}#{e.player.display_name}#{chatcolor::RESET}が#{chatcolor::GOLD}#{dead_player[index]['player'].name}#{chatcolor::RESET}を蘇生しました") if p != e.player | |
| } | |
| end | |
| end | |
| end | |
| end | |
| end | |
| end | |
| } | |
| event(:player_respawn) { |e| | |
| index = dead_player.map { |v| v["player"].name }.index(e.player.name) | |
| if index | |
| if dead_player[index]["revived"] | |
| puts "#{e.player.display_name} spawned by revival" | |
| e.set_respawn_location(dead_player[index]["location"]) | |
| e.player.inventory.set_contents(dead_player[index]["inventory_cont"]) | |
| e.player.inventory.set_armor_contents(dead_player[index]["armor_cont"]) | |
| e.player.update_inventory | |
| dead_player_exp = dead_player[index]["total_experience"] - 50 | |
| server.scheduler.schedule_sync_delayed_task(self) { | |
| set_exp(e.player, dead_player_exp) | |
| } | |
| dead_player[index]["collected"] = true | |
| # dead_player.delete_at(index) | |
| else | |
| e.player.world.players.each { |p| | |
| p.msg("#{chatcolor::GOLD}#{e.player.display_name}#{chatcolor::RESET}はリスポーンしました") if p != e.player | |
| } | |
| dead_player[index]["respawned"] = true | |
| end | |
| end | |
| } | |
| event(:block_break) { |e| | |
| index = dead_player.map { |v| v["block"] }.index(e.block) | |
| if $indestructible_skull && index && !dead_player[index]["collected"] | |
| e.set_cancelled(true) | |
| end | |
| } | |
| event(:entity_explode) { |e| | |
| break_blocks = [] | |
| is_cancelled = false | |
| e.block_list.each { |b| | |
| if dead_player.map { |v| v["block"] }.index(b) | |
| is_cancelled = true | |
| e.set_cancelled(true) | |
| else | |
| break_blocks << b | |
| end | |
| } | |
| if is_cancelled | |
| break_blocks.each { |b| | |
| b.break_naturally | |
| } | |
| end | |
| } | |
| event(:enchant_item) { |e| | |
| exp = calc_exp(e.enchanter.level - e.exp_level_cost, e.enchanter.exp) | |
| e.exp_level_cost = 0 | |
| set_exp(e.enchanter, exp.round) | |
| } | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment