mcblocky 0.1.0 → 0.2.0
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.
- 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
|