minecraft_api 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/README.md +4 -0
- data/lib/block_type.rb +91 -0
- data/lib/minecraft_api.rb +79 -0
- data/minecraft_api.gemspec +12 -0
- data/spec/block_type_spec.rb +10 -0
- data/spec/minecraft_api_spec.rb +92 -0
- metadata +52 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/README.md
ADDED
data/lib/block_type.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
class BlockType
|
2
|
+
|
3
|
+
@@all_block_types = {}
|
4
|
+
|
5
|
+
attr_reader :id
|
6
|
+
|
7
|
+
def initialize(id)
|
8
|
+
@id = id
|
9
|
+
@@all_block_types[id] = self
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.find(id)
|
13
|
+
@@all_block_types[id]
|
14
|
+
end
|
15
|
+
|
16
|
+
AIR = BlockType.new(0)
|
17
|
+
STONE = BlockType.new(1)
|
18
|
+
GRASS = BlockType.new(2)
|
19
|
+
DIRT = BlockType.new(3)
|
20
|
+
COBBLESTONE = BlockType.new(4)
|
21
|
+
WOOD_PLANKS = BlockType.new(5)
|
22
|
+
SAPLING = BlockType.new(6)
|
23
|
+
BEDROCK = BlockType.new(7)
|
24
|
+
WATER_FLOWING = BlockType.new(8)
|
25
|
+
WATER_STATIONARY = BlockType.new(9)
|
26
|
+
LAVA_FLOWING = BlockType.new(10)
|
27
|
+
LAVA_STATIONARY = BlockType.new(11)
|
28
|
+
SAND = BlockType.new(12)
|
29
|
+
GRAVEL = BlockType.new(13)
|
30
|
+
GOLD_ORE = BlockType.new(14)
|
31
|
+
IRON_ORE = BlockType.new(15)
|
32
|
+
COAL_ORE = BlockType.new(16)
|
33
|
+
WOOD = BlockType.new(17)
|
34
|
+
LEAVES = BlockType.new(18)
|
35
|
+
GLASS = BlockType.new(20)
|
36
|
+
LAPIS_LAZULI_ORE = BlockType.new(21)
|
37
|
+
LAPIS_LAZULI_BLOCK = BlockType.new(22)
|
38
|
+
SANDSTONE = BlockType.new(24)
|
39
|
+
BED = BlockType.new(26)
|
40
|
+
COBWEB = BlockType.new(30)
|
41
|
+
GRASS_TALL = BlockType.new(31)
|
42
|
+
WOOL = BlockType.new(35)
|
43
|
+
FLOWER_YELLOW = BlockType.new(37)
|
44
|
+
FLOWER_CYAN = BlockType.new(38)
|
45
|
+
MUSHROOM_BROWN = BlockType.new(39)
|
46
|
+
MUSHROOM_RED = BlockType.new(40)
|
47
|
+
GOLD_BLOCK = BlockType.new(41)
|
48
|
+
IRON_BLOCK = BlockType.new(42)
|
49
|
+
STONE_SLAB_DOUBLE = BlockType.new(43)
|
50
|
+
STONE_SLAB = BlockType.new(44)
|
51
|
+
BRICK_BLOCK = BlockType.new(45)
|
52
|
+
TNT = BlockType.new(46)
|
53
|
+
BOOKSHELF = BlockType.new(47)
|
54
|
+
MOSS_STONE = BlockType.new(48)
|
55
|
+
OBSIDIAN = BlockType.new(49)
|
56
|
+
TORCH = BlockType.new(50)
|
57
|
+
FIRE = BlockType.new(51)
|
58
|
+
STAIRS_WOOD = BlockType.new(53)
|
59
|
+
CHEST = BlockType.new(54)
|
60
|
+
DIAMOND_ORE = BlockType.new(56)
|
61
|
+
DIAMOND_BLOCK = BlockType.new(57)
|
62
|
+
CRAFTING_TABLE = BlockType.new(58)
|
63
|
+
FARMLAND = BlockType.new(60)
|
64
|
+
FURNACE_INACTIVE = BlockType.new(61)
|
65
|
+
FURNACE_ACTIVE = BlockType.new(62)
|
66
|
+
DOOR_WOOD = BlockType.new(64)
|
67
|
+
LADDER = BlockType.new(65)
|
68
|
+
STAIRS_COBBLESTONE = BlockType.new(67)
|
69
|
+
DOOR_IRON = BlockType.new(71)
|
70
|
+
REDSTONE_ORE = BlockType.new(73)
|
71
|
+
SNOW = BlockType.new(78)
|
72
|
+
ICE = BlockType.new(79)
|
73
|
+
SNOW_BLOCK = BlockType.new(80)
|
74
|
+
CACTUS = BlockType.new(81)
|
75
|
+
CLAY = BlockType.new(82)
|
76
|
+
SUGAR_CANE = BlockType.new(83)
|
77
|
+
FENCE = BlockType.new(85)
|
78
|
+
GLOWSTONE_BLOCK = BlockType.new(89)
|
79
|
+
BEDROCK_INVISIBLE = BlockType.new(95)
|
80
|
+
STONE_BRICK = BlockType.new(98)
|
81
|
+
GLASS_PANE = BlockType.new(102)
|
82
|
+
MELON = BlockType.new(103)
|
83
|
+
FENCE_GATE = BlockType.new(107)
|
84
|
+
GLOWING_OBSIDIAN = BlockType.new(246)
|
85
|
+
NETHER_REACTOR_CORE = BlockType.new(247)
|
86
|
+
|
87
|
+
def ==(another_block_type)
|
88
|
+
@id == another_block_type.id
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'io/wait'
|
3
|
+
|
4
|
+
class MinecraftApi
|
5
|
+
|
6
|
+
def initialize(host = 'localhost', port = 4711)
|
7
|
+
@socket = TCPSocket.new host, port
|
8
|
+
end
|
9
|
+
|
10
|
+
# The other api's have a method like this
|
11
|
+
# I haven't seen it be invoked yet. Perhaps it is not needed
|
12
|
+
def drain()
|
13
|
+
while @socket.ready?
|
14
|
+
puts "**** READ A CHARACTER [#{@socket.gets}]"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def send(data)
|
19
|
+
drain()
|
20
|
+
@socket.puts "#{data}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def send_and_receive(data)
|
24
|
+
send(data)
|
25
|
+
@socket.gets.chomp
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_block_type(x,y,z)
|
29
|
+
response = send_and_receive("world.getBlock(#{x},#{y},#{z})")
|
30
|
+
BlockType.find(response.to_i)
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_block(x,y,z,block_type)
|
34
|
+
send("world.setBlock(#{x},#{y},#{z},#{block_type.id})")
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_blocks(x1,y1,z1,x2,y2,z2,block_type)
|
38
|
+
send("world.setBlocks(#{x1},#{y1},#{z1},#{x2},#{y2},#{z2},#{block_type.id})")
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_height(x,z)
|
42
|
+
send_and_receive("world.getHeight(#{x},#{z})").to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def checkpoint_save
|
46
|
+
send("word.checkpoint.save()")
|
47
|
+
end
|
48
|
+
|
49
|
+
def checkpoint_restore
|
50
|
+
send("word.checkpoint.restore()")
|
51
|
+
end
|
52
|
+
|
53
|
+
def chat_post(message)
|
54
|
+
send("chat.post(#{message})")
|
55
|
+
end
|
56
|
+
|
57
|
+
def camera_mode(mode,x=nil,y=nil,z=nil)
|
58
|
+
case mode
|
59
|
+
when :normal then send("camera.mode.setNormal()")
|
60
|
+
when :third_person then send("camera.mode.setThirdPerson()")
|
61
|
+
when :fixed then send("camera.mode.setFixed()")
|
62
|
+
when :position then send("camera.mode.setPos(#{x},#{y},#{z})")
|
63
|
+
else raise RuntimeError.new("valid camera settings are: :normal, :third_person, :fixed, and :position")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def player_set_tile(x,y,z)
|
68
|
+
send("player.setTile(#{x},#{y},#{z})")
|
69
|
+
end
|
70
|
+
|
71
|
+
def player_get_tile
|
72
|
+
response = send_and_receive("player.getTile()")
|
73
|
+
response.split(',').map { |s| s.to_i }
|
74
|
+
end
|
75
|
+
|
76
|
+
def close
|
77
|
+
@socket.close
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = 'minecraft_api'
|
4
|
+
s.description = 'An API for the Raspberry Pi version of Minecraft'
|
5
|
+
s.version = '0.0.1'
|
6
|
+
s.date = '2013-01-25'
|
7
|
+
s.summary = 'Minecraft API'
|
8
|
+
s.homepage = 'https://github.com/nhajratw/minecraft_api'
|
9
|
+
s.authors = ["Nayan Hajratwala"]
|
10
|
+
s.email = ["nayan@chikli.com"]
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'minecraft_api'
|
2
|
+
|
3
|
+
describe "Minecraft server" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@mcapi = MinecraftApi.new('10.0.1.129', 4711)
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:each) do
|
10
|
+
@mcapi.close
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns a 'Fail' when a bad command is sent" do
|
14
|
+
response = @mcapi.send_and_receive 'junk'
|
15
|
+
response.should eq('Fail')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "can create a block" do
|
19
|
+
@mcapi.set_block(0,0,0,BlockType::WOOD)
|
20
|
+
block_type = @mcapi.get_block_type(0,0,0)
|
21
|
+
block_type.should eq(BlockType::WOOD)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "can create a block of a different type" do
|
25
|
+
@mcapi.set_block(0,0,0,BlockType::SAND)
|
26
|
+
block_type = @mcapi.get_block_type(0,0,0)
|
27
|
+
block_type.should eq(BlockType::SAND)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "can create multiple blocks" do
|
31
|
+
@mcapi.set_blocks(0,0,0,2,2,2,BlockType::SAND)
|
32
|
+
# need to figure out assertion here.
|
33
|
+
# The assertions on each vector come too fast and end up returning
|
34
|
+
# types of 0.
|
35
|
+
end
|
36
|
+
|
37
|
+
it "can get the height of the world" do
|
38
|
+
y = @mcapi.get_height(5,5)
|
39
|
+
y.should eq(2)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "can checkpoint save" do
|
43
|
+
@mcapi.checkpoint_save
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can checkpoint restore" do
|
47
|
+
@mcapi.checkpoint_restore
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can send chats" do
|
51
|
+
@mcapi.chat_post("hello")
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "Camera API" do
|
55
|
+
it "can be set to normal" do
|
56
|
+
@mcapi.camera_mode(:normal)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "can be set to third person" do
|
60
|
+
@mcapi.camera_mode(:third_person)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "can be set to fixed" do
|
64
|
+
@mcapi.camera_mode(:fixed)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "can be set to a certain position" do
|
68
|
+
@mcapi.camera_mode(:position,10,20,30)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "throws an error when an invalid mode is specified" do
|
72
|
+
expect {
|
73
|
+
@mcapi.camera_mode(:fake)
|
74
|
+
}.to raise_error(RuntimeError, "valid camera settings are: :normal, :third_person, :fixed, and :position")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "Player API" do
|
79
|
+
it "can put the player on a particular tile" do
|
80
|
+
@mcapi.player_set_tile(20,40,60)
|
81
|
+
vector = @mcapi.player_get_tile
|
82
|
+
vector.should eq([20,40,60])
|
83
|
+
end
|
84
|
+
|
85
|
+
it "can put the player somewhere else" do
|
86
|
+
@mcapi.player_set_tile(-5,10,15)
|
87
|
+
vector = @mcapi.player_get_tile
|
88
|
+
vector.should eq([-5,10,15])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: minecraft_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nayan Hajratwala
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-25 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: An API for the Raspberry Pi version of Minecraft
|
15
|
+
email:
|
16
|
+
- nayan@chikli.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- README.md
|
23
|
+
- lib/block_type.rb
|
24
|
+
- lib/minecraft_api.rb
|
25
|
+
- minecraft_api.gemspec
|
26
|
+
- spec/block_type_spec.rb
|
27
|
+
- spec/minecraft_api_spec.rb
|
28
|
+
homepage: https://github.com/nhajratw/minecraft_api
|
29
|
+
licenses: []
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 1.8.23
|
49
|
+
signing_key:
|
50
|
+
specification_version: 3
|
51
|
+
summary: Minecraft API
|
52
|
+
test_files: []
|