mcblocky 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/examples/hello/hello.rb +26 -1
- data/lib/mcblocky/context.rb +5 -4
- data/lib/mcblocky/dsl.rb +35 -6
- data/lib/mcblocky/dsl/command_block.rb +2 -2
- data/lib/mcblocky/dsl/commands.rb +26 -3
- data/lib/mcblocky/dsl/impulse_chain.rb +9 -0
- data/lib/mcblocky/dsl/repeat_chain.rb +2 -2
- data/lib/mcblocky/executor.rb +64 -20
- data/lib/mcblocky/listener.rb +1 -0
- data/lib/mcblocky/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NDNlNzBiMzQ4NDE0NDE3ODcwYjg4ZjRkM2ZmNjMyYzQ0ODE5ZjZiZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWRmY2NlYzI1YjE5YzM5ZDFiMmY4NTAzNDNkZjlhN2EzZmEzN2VkZA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NGNmN2JiMjZmZDQ2YzQ0MzI2MTU5ZWU3OGZkNzIxNGQyMTJlNjQ0NTE1NjRh
|
10
|
+
ODAyNDg3MzAyMmY1NjA0ZDI1NmJlODQ5OTk3Y2Y0MzRiNGJlMDJkMTg3NWM3
|
11
|
+
ZjU1NjEyMDkyODExYjc4M2M1ZjM4OTIxODc3MjhlOWFlYTJkNjA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MGQ1N2VhNDg1YjZiM2RiZTIyOWY1Y2FiYjllNmI0YjY4MTYwYjNlYjc2MWIz
|
14
|
+
ODg4OTQxZjY5ZjZkYjk4NTgwZTFkZmZmNjQ5MTJiOGM0Y2E1MDFjMjc4M2I2
|
15
|
+
M2FmZDQxODQ4N2UxMjU1MGQ1OTBlODU5ZWNhNzFmMWNmNDk5MTA=
|
data/examples/hello/hello.rb
CHANGED
@@ -31,7 +31,7 @@ initial do
|
|
31
31
|
tellraw @a[team: 'Red'], {text: "Hello world", color: "red"}
|
32
32
|
end
|
33
33
|
|
34
|
-
repeat 171, 82, 242, 175, 84,
|
34
|
+
repeat :teams, 171, 82, 242, 175, 84, 242 do
|
35
35
|
scoreboard :players, :set, @a[x: 172, y: 81, z: 236, r: 1, team: '!Red'], 'SwitchingTeam', 1
|
36
36
|
scoreboard :players, :set, @a[x: 170, y: 81, z: 236, r: 1, team: '!Blue'], 'SwitchingTeam', 1
|
37
37
|
execute @a[x: 170, y: 81, z: 236, r: 1, score_SwitchingTeam_min: 1], '~ ~ ~', 'scoreboard teams join Blue @p'
|
@@ -74,6 +74,31 @@ furnace 176, 79, 248 do
|
|
74
74
|
item 'minecraft:gold_ingot'
|
75
75
|
end
|
76
76
|
|
77
|
+
at 172, 79, 244 do
|
78
|
+
disable :teams
|
79
|
+
end
|
80
|
+
|
81
|
+
at 174, 79, 244 do
|
82
|
+
enable :teams
|
83
|
+
end
|
84
|
+
|
85
|
+
setblock 172, 80, 244, 'minecraft:standing_sign', 0, 'replace', {'Text1'=>'{"text":"Disable team"}', 'Text2'=>'{"text":"switcher"}'}
|
86
|
+
setblock 174, 80, 244, 'minecraft:standing_sign', 0, 'replace', {'Text1'=>'{"text":"Enable team"}', 'Text2'=>'{"text":"switcher"}'}
|
87
|
+
setblock 172, 79, 245, 'minecraft:stone_button', 3
|
88
|
+
setblock 174, 79, 245, 'minecraft:stone_button', 3
|
89
|
+
|
90
|
+
chain :hello, 171, 82, 243, 175, 84, 243 do
|
91
|
+
say 'Hello'
|
92
|
+
say 'World'
|
93
|
+
end
|
94
|
+
|
95
|
+
at 176, 79, 244 do
|
96
|
+
activate :hello
|
97
|
+
end
|
98
|
+
|
99
|
+
setblock 176, 80, 244, 'minecraft:standing_sign', 0, 'replace', {'Text1'=>'{"text":"Activate hello"}'}
|
100
|
+
setblock 176, 79, 245, 'minecraft:stone_button', 3
|
101
|
+
|
77
102
|
after do
|
78
103
|
# setblock 175, 79, 248, 'minecraft:standing_sign', 0, 'replace'
|
79
104
|
# blockdata 175, 79, 248, {'Text1'=>'{"text":"hola mundo"}'}
|
data/lib/mcblocky/context.rb
CHANGED
@@ -3,6 +3,7 @@ require 'mcblocky/dsl'
|
|
3
3
|
module McBlocky
|
4
4
|
class Context
|
5
5
|
attr_accessor :server
|
6
|
+
attr_accessor :last_area
|
6
7
|
|
7
8
|
def self.run_file(file, dir=nil)
|
8
9
|
dir = File.dirname(file) unless dir
|
@@ -36,6 +37,10 @@ module McBlocky
|
|
36
37
|
@chains ||= []
|
37
38
|
end
|
38
39
|
|
40
|
+
def named_chains
|
41
|
+
@named_chains ||= {}
|
42
|
+
end
|
43
|
+
|
39
44
|
def blocks
|
40
45
|
@blocks ||= {}
|
41
46
|
end
|
@@ -44,10 +49,6 @@ module McBlocky
|
|
44
49
|
@rects ||= {}
|
45
50
|
end
|
46
51
|
|
47
|
-
def areas
|
48
|
-
@areas ||= []
|
49
|
-
end
|
50
|
-
|
51
52
|
def context
|
52
53
|
self
|
53
54
|
end
|
data/lib/mcblocky/dsl.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
load File.expand_path('dsl/selector.rb', File.dirname(__FILE__))
|
2
2
|
load File.expand_path('dsl/commands.rb', File.dirname(__FILE__))
|
3
3
|
load File.expand_path('dsl/repeat_chain.rb', File.dirname(__FILE__))
|
4
|
+
load File.expand_path('dsl/impulse_chain.rb', File.dirname(__FILE__))
|
4
5
|
load File.expand_path('dsl/command_block.rb', File.dirname(__FILE__))
|
5
6
|
load File.expand_path('dsl/block.rb', File.dirname(__FILE__))
|
6
7
|
load File.expand_path('dsl/container.rb', File.dirname(__FILE__))
|
@@ -13,27 +14,51 @@ module McBlocky
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def initial(&block)
|
16
|
-
chain = Commands.new(:initial)
|
17
|
+
chain = Commands.new(context, :initial)
|
17
18
|
chain.instance_exec(&block)
|
18
19
|
chains << chain
|
19
20
|
end
|
20
21
|
|
21
22
|
def cleanup(&block)
|
22
|
-
chain = Commands.new(:cleanup)
|
23
|
+
chain = Commands.new(context, :cleanup)
|
23
24
|
chain.instance_exec(&block)
|
24
25
|
chains << chain
|
25
26
|
end
|
26
27
|
|
27
28
|
def after(&block)
|
28
|
-
chain = Commands.new(:after)
|
29
|
+
chain = Commands.new(context, :after)
|
29
30
|
chain.instance_exec(&block)
|
30
31
|
chains << chain
|
31
32
|
end
|
32
33
|
|
33
|
-
def repeat(
|
34
|
-
|
34
|
+
def repeat(*args, &block)
|
35
|
+
if Symbol === args[0]
|
36
|
+
name = args.delete_at(0)
|
37
|
+
raise NameError, 'Name already exists' if named_chains.has_key? name
|
38
|
+
end
|
39
|
+
if args.empty?
|
40
|
+
rect = context.last_area
|
41
|
+
args = [rect.x1, rect.y1, rect.z1, rect.x2, rect.y2, rect.z2]
|
42
|
+
end
|
43
|
+
chain = RepeatChain.new(context, *args)
|
44
|
+
chain.instance_exec(&block)
|
45
|
+
chains << chain
|
46
|
+
named_chains[name] = chain if name
|
47
|
+
end
|
48
|
+
|
49
|
+
def chain(*args, &block)
|
50
|
+
if Symbol === args[0]
|
51
|
+
name = args.delete_at(0)
|
52
|
+
raise NameError, 'Name already exists' if named_chains.has_key? name
|
53
|
+
end
|
54
|
+
if args.empty?
|
55
|
+
rect = context.last_area
|
56
|
+
args = [rect.x1, rect.y1, rect.z1, rect.x2, rect.y2, rect.z2]
|
57
|
+
end
|
58
|
+
chain = ImpulseChain.new(context, *args)
|
35
59
|
chain.instance_exec(&block)
|
36
60
|
chains << chain
|
61
|
+
named_chains[name] = chain if name
|
37
62
|
end
|
38
63
|
|
39
64
|
def at(x, y, z, data=0, kind=:normal, nbt={}, &block)
|
@@ -51,11 +76,15 @@ module McBlocky
|
|
51
76
|
else
|
52
77
|
raise ArgumentError, 'Unknown command block type'
|
53
78
|
end
|
54
|
-
cblock = CommandBlock.new(x, y, z, data, block_kind, nbt)
|
79
|
+
cblock = CommandBlock.new(context, x, y, z, data, block_kind, nbt)
|
55
80
|
cblock.instance_exec(&block)
|
56
81
|
blocks[Location.new(x, y, z)] = cblock
|
57
82
|
end
|
58
83
|
|
84
|
+
def area(x1, y1, z1, x2, y2, z2)
|
85
|
+
context.last_area = Rect.new(x1, y1, z1, x2, y2, z2)
|
86
|
+
end
|
87
|
+
|
59
88
|
def setblock(x, y, z, kind, data=0, replacemode='replace', nbt={})
|
60
89
|
block = Block.new(x, y, z, kind, data, nbt)
|
61
90
|
blocks[Location.new(x, y, z)] = block
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module McBlocky::DSL
|
2
2
|
class CommandBlock < Commands
|
3
3
|
attr_reader :x, :y, :z, :block_data, :block_kind
|
4
|
-
def initialize(x, y, z, facing, kind, nbt={})
|
5
|
-
super(:at)
|
4
|
+
def initialize(context, x, y, z, facing, kind, nbt={})
|
5
|
+
super(context, :at)
|
6
6
|
@x = x
|
7
7
|
@y = y
|
8
8
|
@z = z
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module McBlocky::DSL
|
2
2
|
class Commands
|
3
|
+
attr_accessor :context
|
3
4
|
attr_reader :kind
|
4
5
|
attr_accessor :commands
|
5
6
|
|
6
|
-
def initialize(kind, *args)
|
7
|
+
def initialize(context, kind, *args)
|
8
|
+
@context = context
|
7
9
|
@kind = kind
|
8
10
|
@args = args
|
9
11
|
@commands = []
|
@@ -21,6 +23,27 @@ module McBlocky::DSL
|
|
21
23
|
McBlocky::DSL.to_nbt(obj)
|
22
24
|
end
|
23
25
|
|
26
|
+
def activate(name)
|
27
|
+
raise NameError, "No chain named #{name}" unless context.named_chains.has_key? name
|
28
|
+
raise ArgumentError, "#{name} is not an activateable chain" unless context.named_chains[name].kind == :impulse_chain
|
29
|
+
chain = context.named_chains[name]
|
30
|
+
command :blockdata, chain.rect.x1, chain.rect.y1, chain.rect.z1, '{auto:1}'
|
31
|
+
end
|
32
|
+
|
33
|
+
def enable(name)
|
34
|
+
raise NameError, "No chain named #{name}" unless context.named_chains.has_key? name
|
35
|
+
raise ArgumentError, "#{name} is not a repeat chain" unless context.named_chains[name].kind == :repeat
|
36
|
+
chain = context.named_chains[name]
|
37
|
+
command :blockdata, chain.rect.x1, chain.rect.y1, chain.rect.z1, '{auto:1}'
|
38
|
+
end
|
39
|
+
|
40
|
+
def disable(name)
|
41
|
+
raise NameError, "No chain named #{name}" unless context.named_chains.has_key? name
|
42
|
+
raise ArgumentError, "#{name} is not a repeat chain" unless context.named_chains[name].kind == :repeat
|
43
|
+
chain = context.named_chains[name]
|
44
|
+
command :blockdata, chain.rect.x1, chain.rect.y1, chain.rect.z1, '{auto:0}'
|
45
|
+
end
|
46
|
+
|
24
47
|
COMMANDS = [:achievement, :ban, :ban_ip, :banlist, :blockdata, :clear, :clone, :debug, :defaultgamemode, :deop, :difficulty, :effect, :enchant, :entitydata, :execute, :fill, :gamemode, :gamerule, :give, :help, :kick, :kill, :list, :me, :op, :pardon, :pardon_ip, :particle, :playsound, :replaceitem, :save_all, :save_off, :save_on, :say, :scoreboard, :seed, :setblock, :setidletimeout, :setworldspawn, :spawnpoint, :spreadplayers, :stats, :stop, :summon, :tell, :tellraw, :testfor, :testforblock, :testforblocks, :time, :title, :toggledownfall, :tp, :trigger, :weather, :whitelist, :worldborder, :xp]
|
25
48
|
|
26
49
|
def blockdata(*args)
|
@@ -30,7 +53,7 @@ module McBlocky::DSL
|
|
30
53
|
|
31
54
|
def detect(selector, *args, &block)
|
32
55
|
if block
|
33
|
-
chain = Commands.new(:detect)
|
56
|
+
chain = Commands.new(context, :detect)
|
34
57
|
chain.instance_exec &block
|
35
58
|
chain.commands.each do |c|
|
36
59
|
command :execute, selector, '~ ~ ~', :detect, *args, c
|
@@ -45,7 +68,7 @@ module McBlocky::DSL
|
|
45
68
|
args = ['~ ~ ~']
|
46
69
|
end
|
47
70
|
if block
|
48
|
-
chain = Commands.new(:execute)
|
71
|
+
chain = Commands.new(context, :execute)
|
49
72
|
chain.instance_exec &block
|
50
73
|
chain.commands.each do |c|
|
51
74
|
command :execute, selector, *args, c
|
data/lib/mcblocky/executor.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module McBlocky
|
2
2
|
class Executor < DSL::Commands
|
3
3
|
def self.to_commands(context, old_context=nil)
|
4
|
-
executor = Executor.new(:final)
|
4
|
+
executor = Executor.new(nil, :final)
|
5
5
|
executor.do_context(context, old_context)
|
6
6
|
executor.commands
|
7
7
|
end
|
@@ -36,20 +36,6 @@ module McBlocky
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
if old_context
|
40
|
-
old_context.areas.each do |x1, y1, z1, x2, y2, z2|
|
41
|
-
fill x1, y1, z1, x2, y2, z2, 'minecraft:air'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
context.areas.each do |x1, y1, z1, x2, y2, z2|
|
45
|
-
fill x1, y1, z1, x2, y1, z2, 'minecraft:stained_glass', '7'
|
46
|
-
fill x1, y2, z1, x2, y2, z2, 'minecraft:stained_glass', '7'
|
47
|
-
fill x1, y1, z1, x1, y2, z2, 'minecraft:stained_glass', '7'
|
48
|
-
fill x2, y1, z1, x2, y2, z2, 'minecraft:stained_glass', '7'
|
49
|
-
fill x1, y1, z1, x2, y2, z1, 'minecraft:stained_glass', '7'
|
50
|
-
fill x1, y1, z2, x2, y2, z2, 'minecraft:stained_glass', '7'
|
51
|
-
end
|
52
|
-
|
53
39
|
rects = (old_context ? old_context.rects.keys : []) + context.rects.keys
|
54
40
|
rects.uniq.each do |rect|
|
55
41
|
old_block = old_context ? old_context.rects[rect] : nil
|
@@ -63,8 +49,13 @@ module McBlocky
|
|
63
49
|
end
|
64
50
|
end
|
65
51
|
|
66
|
-
context.chains.select{|x|x.kind
|
67
|
-
|
52
|
+
context.chains.select{|x|[:repeat, :impulse_chain].include? x.kind}.each do |c|
|
53
|
+
case c.kind
|
54
|
+
when :repeat
|
55
|
+
do_repeat context, c
|
56
|
+
when :impulse_chain
|
57
|
+
do_impulse context, c
|
58
|
+
end
|
68
59
|
end
|
69
60
|
|
70
61
|
locations = (old_context ? old_context.blocks.keys : []) + context.blocks.keys
|
@@ -96,13 +87,17 @@ module McBlocky
|
|
96
87
|
end
|
97
88
|
|
98
89
|
def do_repeat(context, chain)
|
90
|
+
if chain.rect != @last_area
|
91
|
+
@last_area = chain.rect
|
92
|
+
@offset = 0
|
93
|
+
end
|
99
94
|
sequence = fill_space(chain.rect)
|
100
|
-
if chain.commands.length > sequence.length
|
95
|
+
if chain.commands.length + @offset > sequence.length
|
101
96
|
raise ArgumentError, "Chain is too long for the provided space"
|
102
97
|
end
|
103
98
|
kind = 'minecraft:repeating_command_block'
|
104
99
|
chain.commands.each_with_index do |c,i|
|
105
|
-
cursor = sequence[i]
|
100
|
+
cursor = sequence[i+@offset]
|
106
101
|
next_cursor = if i+1 < sequence.length
|
107
102
|
sequence[i+1]
|
108
103
|
else
|
@@ -121,10 +116,51 @@ module McBlocky
|
|
121
116
|
elsif next_cursor.z - cursor.z == -1
|
122
117
|
DSL::Facing::NORTH
|
123
118
|
end
|
124
|
-
context.blocks[cursor] = DSL::CommandBlock.new(cursor.x, cursor.y, cursor.z, facing, kind, {'auto'=>1})
|
119
|
+
context.blocks[cursor] = DSL::CommandBlock.new(context, cursor.x, cursor.y, cursor.z, facing, kind, {'auto'=>1})
|
125
120
|
context.blocks[cursor].command c
|
126
121
|
kind = 'minecraft:chain_command_block'
|
127
122
|
end
|
123
|
+
@offset += self.next_power_of_two(chain.commands.length)
|
124
|
+
end
|
125
|
+
|
126
|
+
def do_impulse(context, chain)
|
127
|
+
if chain.rect != @last_area
|
128
|
+
@last_area = chain.rect
|
129
|
+
@offset = 0
|
130
|
+
end
|
131
|
+
sequence = fill_space(chain.rect)
|
132
|
+
chain.commands << "blockdata #{sequence[@offset].x} #{sequence[@offset].y} #{sequence[@offset].z} {auto:0}"
|
133
|
+
if chain.commands.length + @offset > sequence.length
|
134
|
+
raise ArgumentError, "Chain is too long for the provided space"
|
135
|
+
end
|
136
|
+
kind = 'minecraft:command_block'
|
137
|
+
nbt = {auto: 0}
|
138
|
+
chain.commands.each_with_index do |c,i|
|
139
|
+
cursor = sequence[i+@offset]
|
140
|
+
next_cursor = if i+1 < sequence.length
|
141
|
+
sequence[i+1]
|
142
|
+
else
|
143
|
+
Location.new(cursor.x, cursor.y+1, cursor.z)
|
144
|
+
end
|
145
|
+
facing = if next_cursor.x - cursor.x == 1
|
146
|
+
DSL::Facing::EAST
|
147
|
+
elsif next_cursor.x - cursor.x == -1
|
148
|
+
DSL::Facing::WEST
|
149
|
+
elsif next_cursor.y - cursor.y == 1
|
150
|
+
DSL::Facing::UP
|
151
|
+
elsif next_cursor.y - cursor.y == -1
|
152
|
+
DSL::Facing::DOWN
|
153
|
+
elsif next_cursor.z - cursor.z == 1
|
154
|
+
DSL::Facing::SOUTH
|
155
|
+
elsif next_cursor.z - cursor.z == -1
|
156
|
+
DSL::Facing::NORTH
|
157
|
+
end
|
158
|
+
context.blocks[cursor] = DSL::CommandBlock.new(context, cursor.x, cursor.y, cursor.z, facing, kind, nbt)
|
159
|
+
context.blocks[cursor].command c
|
160
|
+
kind = 'minecraft:chain_command_block'
|
161
|
+
nbt = {auto: 1}
|
162
|
+
end
|
163
|
+
@offset += self.next_power_of_two(chain.commands.length)
|
128
164
|
end
|
129
165
|
|
130
166
|
def fill_space(rect)
|
@@ -145,5 +181,13 @@ module McBlocky
|
|
145
181
|
end
|
146
182
|
path
|
147
183
|
end
|
184
|
+
|
185
|
+
protected
|
186
|
+
def next_power_of_two(n)
|
187
|
+
l = Math.log(n, 2)
|
188
|
+
# ceiling
|
189
|
+
l = l.to_i + 1 if l != l.to_i
|
190
|
+
return (2**l).to_i
|
191
|
+
end
|
148
192
|
end
|
149
193
|
end
|
data/lib/mcblocky/listener.rb
CHANGED
@@ -18,6 +18,7 @@ module McBlocky
|
|
18
18
|
File.expand_path('../dsl.rb', __FILE__),
|
19
19
|
File.expand_path('../dsl/commands.rb', __FILE__),
|
20
20
|
File.expand_path('../dsl/repeat_chain.rb', __FILE__),
|
21
|
+
File.expand_path('../dsl/impulse_chain.rb', __FILE__),
|
21
22
|
File.expand_path('../dsl/selector.rb', __FILE__),
|
22
23
|
File.expand_path('../dsl/command_block.rb', __FILE__),
|
23
24
|
File.expand_path('../dsl/block.rb', __FILE__),
|
data/lib/mcblocky/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mcblocky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Limiero
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/mcblocky/dsl/command_block.rb
|
121
121
|
- lib/mcblocky/dsl/commands.rb
|
122
122
|
- lib/mcblocky/dsl/container.rb
|
123
|
+
- lib/mcblocky/dsl/impulse_chain.rb
|
123
124
|
- lib/mcblocky/dsl/repeat_chain.rb
|
124
125
|
- lib/mcblocky/dsl/selector.rb
|
125
126
|
- lib/mcblocky/executor.rb
|