minecraft 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +59 -0
- data/bin/minecraft +39 -2
- data/lib/minecraft.rb +1 -0
- data/lib/minecraft/data.rb +247 -247
- data/lib/minecraft/extensions.rb +151 -70
- data/lib/minecraft/server.rb +16 -16
- data/lib/minecraft/tools.rb +32 -0
- data/lib/minecraft/version.rb +1 -1
- data/minecraft.gemspec +3 -1
- metadata +15 -3
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
Overview
|
2
|
+
--------
|
3
|
+
|
4
|
+
This is a deployment and console wrapper for Minecraft which allows for more
|
5
|
+
convenient administration of a Minecraft server.
|
6
|
+
|
7
|
+
Installation
|
8
|
+
------------
|
9
|
+
|
10
|
+
gem install minecraft
|
11
|
+
|
12
|
+
This will install the Minecraft extension library and binary, the Minecraft
|
13
|
+
server jarfile will be downloaded from http://minecraft.net when the binary is
|
14
|
+
ran for the first time.
|
15
|
+
|
16
|
+
Usage
|
17
|
+
-----
|
18
|
+
|
19
|
+
mkdir ~/MinecraftServer
|
20
|
+
cd ~/MinecraftServer
|
21
|
+
minecraft
|
22
|
+
|
23
|
+
minecraft -h
|
24
|
+
|
25
|
+
Current Features
|
26
|
+
----------------
|
27
|
+
|
28
|
+
- !give <item> <quantity>
|
29
|
+
- Give the user an item with a quantity of up to 2560 (by default Minecraft
|
30
|
+
will cap at 64).
|
31
|
+
- Use the item ID or item name. http://minecraftwiki.net/wiki/Data_values
|
32
|
+
- !tp <target_user>
|
33
|
+
- !nom
|
34
|
+
- !kit
|
35
|
+
- Diamond
|
36
|
+
- Gold armour
|
37
|
+
- Armour
|
38
|
+
- Ranged
|
39
|
+
- Nether
|
40
|
+
- Portal
|
41
|
+
|
42
|
+
TODO
|
43
|
+
----
|
44
|
+
|
45
|
+
- Improved error handling.
|
46
|
+
- Log time users have spent on the server.
|
47
|
+
- !give timers (give user A an item every X seconds).
|
48
|
+
|
49
|
+
Contributors
|
50
|
+
------------
|
51
|
+
|
52
|
+
Forks are welcomed, pull requests will be prompty reviewed!
|
53
|
+
|
54
|
+
- Ian Horsman
|
55
|
+
|
56
|
+
Notice
|
57
|
+
------
|
58
|
+
|
59
|
+
Minecraft is copyright of Mojang AB and developed by Markus Persson (@notch).
|
data/bin/minecraft
CHANGED
@@ -1,6 +1,43 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require "slop"
|
4
|
+
require "net/http"
|
3
5
|
require "minecraft"
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
+
def minecraft_exit
|
8
|
+
if $opts.tempmobs?
|
9
|
+
puts "[+] Restoring previous mob state."
|
10
|
+
Minecraft::Tools.toggle_mobs
|
11
|
+
end
|
12
|
+
exit!
|
13
|
+
end
|
14
|
+
|
15
|
+
trap("SIGINT") { minecraft_exit }
|
16
|
+
|
17
|
+
$opts = Slop.parse :help => true do
|
18
|
+
banner "Usage: minecraft [options]"
|
19
|
+
|
20
|
+
on :n, :no_run, "Don't run the Minecraft server instance."
|
21
|
+
on :u, :update, "Download the latest version of the Minecraft server jarfile."
|
22
|
+
on :s, :min_memory, "Specify the minimum amount of memory to allocate.", :optional => true
|
23
|
+
on :x, :max_memory, "Specify the maximum amount of memory to allocate.", :optional => true
|
24
|
+
on :no_auto_save, "Disable auto save."
|
25
|
+
on :m, :tempmobs, "Temporarily toggles mobs."
|
26
|
+
end
|
27
|
+
|
28
|
+
if $opts.update?
|
29
|
+
Minecraft::Tools.download_minecraft
|
30
|
+
end
|
31
|
+
|
32
|
+
if $opts.tempmobs?
|
33
|
+
puts "[+] Temporarily toggling mobs."
|
34
|
+
Minecraft::Tools.toggle_mobs
|
35
|
+
end
|
36
|
+
|
37
|
+
unless $opts.no_run?
|
38
|
+
Minecraft::Tools.check_jarfile
|
39
|
+
command = Minecraft::Tools.command($opts)
|
40
|
+
puts "[+] #{command}"
|
41
|
+
server = Minecraft::Server.new(command)
|
42
|
+
server.sin.puts("save-on") unless $opts.no_auto_save?
|
43
|
+
end
|
data/lib/minecraft.rb
CHANGED
data/lib/minecraft/data.rb
CHANGED
@@ -1,250 +1,250 @@
|
|
1
1
|
module Minecraft
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
2
|
+
module Data
|
3
|
+
KITS = {
|
4
|
+
:diamond => [276, 277, 278, 279, 293],
|
5
|
+
:garmour => [314, 315, 316, 317],
|
6
|
+
:armour => [310, 311, 312, 313],
|
7
|
+
:ranged => [261, [262, 640]],
|
8
|
+
:nether => [261, [262, 320], [348, 128], 278, 276],
|
9
|
+
:portal => [[49, 10], 259]
|
10
|
+
}
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
12
|
+
DATA_VALUE_HASH = {
|
13
|
+
"glass" => "20",
|
14
|
+
"purple wool" => "35",
|
15
|
+
"obsidian" => "49",
|
16
|
+
"redstone ore" => "73",
|
17
|
+
"stone" => "1",
|
18
|
+
"lapis lazuli ore" => "21",
|
19
|
+
"blue wool" => "35",
|
20
|
+
"torch" => "50",
|
21
|
+
"glowing redstone ore" => "74",
|
22
|
+
"grass" => "2",
|
23
|
+
"lapis lazuli block" => "22",
|
24
|
+
"brown wool" => "35",
|
25
|
+
"fire" => "51",
|
26
|
+
"dirt" => "3",
|
27
|
+
"dispenser" => "23",
|
28
|
+
"dark green wool" => "35",
|
29
|
+
"monster spawner" => "52",
|
30
|
+
"cobblestone" => "4",
|
31
|
+
"sandstone" => "24",
|
32
|
+
"red wool" => "35",
|
33
|
+
"wooden stairs" => "53",
|
34
|
+
"stone button" => "77",
|
35
|
+
"wooden plank" => "5",
|
36
|
+
"note block" => "25",
|
37
|
+
"black wool" => "35",
|
38
|
+
"chest" => "54",
|
39
|
+
"snow" => "78",
|
40
|
+
"sapling" => "6",
|
41
|
+
"bed" => "355",
|
42
|
+
"yellow flower" => "37",
|
43
|
+
"redstone wire" => "55",
|
44
|
+
"ice" => "79",
|
45
|
+
"spruce sapling" => "6",
|
46
|
+
"powered rail" => "27",
|
47
|
+
"red rose" => "38",
|
48
|
+
"diamond ore" => "56",
|
49
|
+
"snow block" => "80",
|
50
|
+
"birch sapling" => "6",
|
51
|
+
"detector rail" => "28",
|
52
|
+
"brown mushroom" => "39",
|
53
|
+
"diamond block" => "57",
|
54
|
+
"cactus" => "81",
|
55
|
+
"bedrock" => "7",
|
56
|
+
"sticky piston" => "29",
|
57
|
+
"red mushroom" => "40",
|
58
|
+
"crafting table" => "58",
|
59
|
+
"clay block" => "82",
|
60
|
+
"water" => "8",
|
61
|
+
"cobweb" => "30",
|
62
|
+
"gold block" => "41",
|
63
|
+
"crops " => "59",
|
64
|
+
"sugar cane" => "338",
|
65
|
+
"stationary water" => "9",
|
66
|
+
"tall grass" => "31",
|
67
|
+
"iron block" => "42",
|
68
|
+
"farmland " => "60",
|
69
|
+
"jukebox" => "84",
|
70
|
+
"lava" => "10",
|
71
|
+
"dead shrubs" => "32",
|
72
|
+
"double stone slab" => "43",
|
73
|
+
"furnace " => "61",
|
74
|
+
"fence" => "85",
|
75
|
+
"stationary lava " => "11",
|
76
|
+
"piston" => "33",
|
77
|
+
"double sandstone slab" => "43",
|
78
|
+
"burning furnace" => "62",
|
79
|
+
"pumpkin" => "86",
|
80
|
+
"sand" => "12",
|
81
|
+
"white wool" => "35",
|
82
|
+
"double wooden slab" => "43",
|
83
|
+
"sign post" => "63",
|
84
|
+
"netherrack" => "87",
|
85
|
+
"gravel" => "13",
|
86
|
+
"orange wool" => "35",
|
87
|
+
"double cobblestone slab" => "43",
|
88
|
+
"wooden door" => "324",
|
89
|
+
"soul sand" => "88",
|
90
|
+
"gold ore" => "14",
|
91
|
+
"magenta wool" => "35",
|
92
|
+
"stone slab" => "44",
|
93
|
+
"ladder" => "65",
|
94
|
+
"glowstone" => "89",
|
95
|
+
"glowstone block" => "89",
|
96
|
+
"iron ore" => "15",
|
97
|
+
"light blue wool" => "35",
|
98
|
+
"sandstone slab" => "44",
|
99
|
+
"rails" => "66",
|
100
|
+
"portal" => "90",
|
101
|
+
"coal ore" => "16",
|
102
|
+
"yellow wool" => "35",
|
103
|
+
"wooden slab" => "44",
|
104
|
+
"cobblestone stairs" => "67",
|
105
|
+
"jack-o-lantern" => "91",
|
106
|
+
"jack o lantern" => "91",
|
107
|
+
"oak wood" => "17",
|
108
|
+
"light green wool" => "35",
|
109
|
+
"cobblestone slab" => "44",
|
110
|
+
"wall sign" => "68",
|
111
|
+
"cake block" => "92",
|
112
|
+
"pine wood" => "17",
|
113
|
+
"pink wool" => "35",
|
114
|
+
"brick block" => "45",
|
115
|
+
"lever" => "69",
|
116
|
+
"birch wood" => "17",
|
117
|
+
"gray wool" => "35",
|
118
|
+
"tnt" => "46",
|
119
|
+
"stone pressure plate" => "70",
|
120
|
+
"leaves" => "18",
|
121
|
+
"light gray wool" => "35",
|
122
|
+
"bookshelf" => "47",
|
123
|
+
"iron door" => "330",
|
124
|
+
"locked chest" => "95",
|
125
|
+
"sponge" => "19",
|
126
|
+
"cyan wool" => "35",
|
127
|
+
"moss stone" => "48",
|
128
|
+
"wooden pressure plate" => "72",
|
129
|
+
"trapdoor" => "96",
|
130
|
+
"iron shovel" => "256",
|
131
|
+
"stick" => "280",
|
132
|
+
"chainmail boots" => "305",
|
133
|
+
"lapis lazuli" => "351",
|
134
|
+
"iron pickaxe" => "257",
|
135
|
+
"bowl" => "281",
|
136
|
+
"iron helmet" => "306",
|
137
|
+
"redstone" => "331",
|
138
|
+
"purple dye" => "351",
|
139
|
+
"iron axe" => "258",
|
140
|
+
"mushroom soup" => "282",
|
141
|
+
"iron chestplate" => "307",
|
142
|
+
"snowball" => "332",
|
143
|
+
"cyan dye" => "351",
|
144
|
+
"flint and steel" => "259",
|
145
|
+
"gold sword" => "283",
|
146
|
+
"iron leggings" => "308",
|
147
|
+
"boat" => "333",
|
148
|
+
"light gray dye" => "351",
|
149
|
+
"apple" => "260",
|
150
|
+
"gold shovel" => "284",
|
151
|
+
"iron boots" => "309",
|
152
|
+
"leather" => "334",
|
153
|
+
"gray dye" => "351",
|
154
|
+
"bow" => "261",
|
155
|
+
"gold pickaxe" => "285",
|
156
|
+
"diamond helmet" => "310",
|
157
|
+
"milk" => "335",
|
158
|
+
"pink dye" => "351",
|
159
|
+
"arrow" => "262",
|
160
|
+
"gold axe" => "286",
|
161
|
+
"diamond chestplate" => "311",
|
162
|
+
"clay brick" => "336",
|
163
|
+
"lime dye" => "351",
|
164
|
+
"coal" => "263",
|
165
|
+
"string" => "287",
|
166
|
+
"diamond leggings" => "312",
|
167
|
+
"clay balls" => "337",
|
168
|
+
"dandelion yellow" => "351",
|
169
|
+
"charcoal" => "263",
|
170
|
+
"feather" => "288",
|
171
|
+
"diamond boots" => "313",
|
172
|
+
"light blue dye" => "351",
|
173
|
+
"diamond" => "264",
|
174
|
+
"gunpowder" => "289",
|
175
|
+
"gold helmet" => "314",
|
176
|
+
"paper" => "339",
|
177
|
+
"magenta dye" => "351",
|
178
|
+
"iron ingot" => "265",
|
179
|
+
"wooden hoe" => "290",
|
180
|
+
"gold chestplate" => "315",
|
181
|
+
"book" => "340",
|
182
|
+
"orange dye" => "351",
|
183
|
+
"gold ingot" => "266",
|
184
|
+
"stone hoe" => "291",
|
185
|
+
"gold leggings" => "316",
|
186
|
+
"slimeball" => "341",
|
187
|
+
"bone meal" => "351",
|
188
|
+
"iron sword" => "267",
|
189
|
+
"iron hoe" => "292",
|
190
|
+
"gold boots" => "317",
|
191
|
+
"storage minecart" => "342",
|
192
|
+
"bone" => "352",
|
193
|
+
"wooden sword" => "268",
|
194
|
+
"diamond hoe" => "293",
|
195
|
+
"flint" => "318",
|
196
|
+
"powered minecart" => "343",
|
197
|
+
"sugar" => "353",
|
198
|
+
"wooden shovel" => "269",
|
199
|
+
"gold hoe" => "294",
|
200
|
+
"raw porkchop" => "319",
|
201
|
+
"egg" => "344",
|
202
|
+
"cake" => "354",
|
203
|
+
"wooden pickaxe" => "270",
|
204
|
+
"seeds" => "295",
|
205
|
+
"cooked porkchop" => "320",
|
206
|
+
"compass" => "345",
|
207
|
+
"wooden axe" => "271",
|
208
|
+
"wheat" => "296",
|
209
|
+
"paintings" => "321",
|
210
|
+
"fishing rod" => "346",
|
211
|
+
"redstone repeater" => "356",
|
212
|
+
"stone sword" => "272",
|
213
|
+
"bread" => "297",
|
214
|
+
"golden apple" => "322",
|
215
|
+
"clock" => "347",
|
216
|
+
"cookie" => "357",
|
217
|
+
"stone shovel" => "273",
|
218
|
+
"leather helmet" => "298",
|
219
|
+
"sign" => "323",
|
220
|
+
"glowstone dust" => "348",
|
221
|
+
"map" => "358",
|
222
|
+
"stone pickaxe" => "274",
|
223
|
+
"leather chestplate" => "299",
|
224
|
+
"raw fish" => "349",
|
225
|
+
"shears" => "359",
|
226
|
+
"stone axe" => "275",
|
227
|
+
"leather leggings" => "300",
|
228
|
+
"bucket" => "325",
|
229
|
+
"cooked fish" => "350",
|
230
|
+
"gold music disc" => "2256",
|
231
|
+
"diamond sword" => "276",
|
232
|
+
"leather boots" => "301",
|
233
|
+
"water bucket" => "326",
|
234
|
+
"ink sac" => "351",
|
235
|
+
"green music disc" => "2257",
|
236
|
+
"diamond shovel" => "277",
|
237
|
+
"chainmail helmet" => "302",
|
238
|
+
"lava bucket" => "327",
|
239
|
+
"rose red" => "351",
|
240
|
+
"diamond pickaxe" => "278",
|
241
|
+
"chainmail chestplate" => "303",
|
242
|
+
"minecart" => "328",
|
243
|
+
"cactus green" => "351",
|
244
|
+
"diamond axe" => "279",
|
245
|
+
"chainmail leggings" => "304",
|
246
|
+
"saddle" => "329",
|
247
|
+
"cocoa beans" => "351"
|
248
|
+
}
|
249
|
+
end
|
250
250
|
end
|
data/lib/minecraft/extensions.rb
CHANGED
@@ -1,72 +1,153 @@
|
|
1
1
|
module Minecraft
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
2
|
+
class Extensions
|
3
|
+
include Data
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@ops = File.readlines("ops.txt").map { |s| s.chop }
|
7
|
+
@users = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def process(line)
|
11
|
+
puts line
|
12
|
+
return info_command(line) if line.index "INFO"
|
13
|
+
end
|
14
|
+
|
15
|
+
def info_command(line)
|
16
|
+
line.gsub! /^.*?\[INFO\]\s+/, ''
|
17
|
+
meta_check(line)
|
18
|
+
match_data = line.match /^\<(.*?)\>\s+!(.*?)$/
|
19
|
+
return if match_data.nil?
|
20
|
+
|
21
|
+
user = match_data[1]
|
22
|
+
args = match_data[2].split(" ")
|
23
|
+
return send(args.slice!(0), user, *args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def meta_check(line)
|
27
|
+
return if check_ops(line)
|
28
|
+
return if check_join_part(line)
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_ops(line)
|
32
|
+
user = line.split(" ").last
|
33
|
+
if line.index "De-opping"
|
34
|
+
@ops.reject! { |u| u == user }
|
35
|
+
return true
|
36
|
+
elsif line.index "Opping"
|
37
|
+
@ops << user
|
38
|
+
return true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def check_join_part(line)
|
43
|
+
user = line.split(" ").first
|
44
|
+
if line.index "lost connection"
|
45
|
+
@users.reject! { |u| u == user }
|
46
|
+
return true
|
47
|
+
elsif line.index "logged in"
|
48
|
+
@users << user
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def method_missing(sym, *args)
|
54
|
+
if DATA_VALUE_HASH.has_key? sym.downcase
|
55
|
+
give(args.first, sym, args.last)
|
56
|
+
else
|
57
|
+
puts "Invalid command given."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def giveall(user, *args)
|
62
|
+
return privilege_error(user, "giveall") unless is_op? user
|
63
|
+
ret = "say #{user} is putting out!\n"
|
64
|
+
@users.each do |u|
|
65
|
+
ret += mc_give(u, *args)
|
66
|
+
end
|
67
|
+
|
68
|
+
return ret
|
69
|
+
end
|
70
|
+
|
71
|
+
def give(user, *args)
|
72
|
+
return privilege_error(user, "give") unless is_op? user
|
73
|
+
return mc_give(user, *args)
|
74
|
+
end
|
75
|
+
|
76
|
+
def mc_give(user, *args)
|
77
|
+
if args.length == 1
|
78
|
+
quantity = 1
|
79
|
+
item = args.first
|
80
|
+
else
|
81
|
+
quantity = args.last.to_i || 1
|
82
|
+
item = args[0..-2].join(" ")
|
83
|
+
end
|
84
|
+
item = (item.to_i.to_s == item) ? item.to_i : DATA_VALUE_HASH[item.downcase]
|
85
|
+
|
86
|
+
return quantify(user, item, quantity)
|
87
|
+
end
|
88
|
+
|
89
|
+
def kit(user, group)
|
90
|
+
return privilege_error(user, "kit") unless is_op? user
|
91
|
+
return "say #{group} is not a valid kit." unless KITS.has_key? group.to_sym
|
92
|
+
ret = ""
|
93
|
+
|
94
|
+
KITS[group.to_sym].each do |item|
|
95
|
+
if item.is_a? Array
|
96
|
+
ret += quantify(user, item.first, item.last)
|
97
|
+
else
|
98
|
+
ret += "give #{user} #{item} 1\n"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
return ret.chop
|
102
|
+
end
|
103
|
+
|
104
|
+
def tp(user, target)
|
105
|
+
"tp #{user} #{target}"
|
106
|
+
end
|
107
|
+
|
108
|
+
def tpall(user)
|
109
|
+
return privilege_error(user, "tpall", "Wow, #{user} actually tried to pull that...") unless is_op? user
|
110
|
+
ret = "say #{user} is teleporting all users to their location.\n"
|
111
|
+
@users.each do |u|
|
112
|
+
ret += tp(u, user)
|
113
|
+
end
|
114
|
+
return ret
|
115
|
+
end
|
116
|
+
|
117
|
+
def nom(user)
|
118
|
+
return privilege_error(user, "nom", "No noms for you!") unless is_op? user
|
119
|
+
"give #{user} 322 1"
|
120
|
+
end
|
121
|
+
|
122
|
+
def help(*args)
|
123
|
+
<<-eof
|
124
|
+
say !tp target_user
|
125
|
+
say !tpall
|
126
|
+
say !kit kit_name
|
127
|
+
say !give item quantity
|
128
|
+
say !giveall item quantity
|
129
|
+
say !nom
|
130
|
+
say /help
|
131
|
+
eof
|
132
|
+
end
|
133
|
+
|
134
|
+
def quantify(user, item, quantity)
|
135
|
+
return "give #{user} #{item} #{quantity}" if quantity <= 64
|
136
|
+
|
137
|
+
quantity = 2560 if quantity > 2560
|
138
|
+
full_quantity = (quantity / 64.0).floor
|
139
|
+
sub_quantity = quantity % 64
|
140
|
+
ret = "give #{user} #{item} 64\n" * full_quantity
|
141
|
+
ret += "give #{user} #{item} #{sub_quantity}"
|
142
|
+
return ret
|
143
|
+
end
|
144
|
+
|
145
|
+
def is_op?(user)
|
146
|
+
@ops.include? user
|
147
|
+
end
|
148
|
+
|
149
|
+
def privilege_error(user, command, suffix = "S/he must be humiliated!")
|
150
|
+
"say #{user} is not an op, cannot use !#{command}. #{suffix}"
|
151
|
+
end
|
152
|
+
end
|
72
153
|
end
|
data/lib/minecraft/server.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
require "open3"
|
2
2
|
|
3
3
|
module Minecraft
|
4
|
-
|
5
|
-
|
4
|
+
class Server
|
5
|
+
attr_accessor :sin
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
def initialize(command)
|
8
|
+
@extensions = Extensions.new
|
9
|
+
@sin, @sout, @serr = Open3.popen3(command)
|
10
|
+
threads = []
|
11
|
+
threads << Thread.new { loop { process(@sout.gets) } }
|
12
|
+
threads << Thread.new { loop { process(@serr.gets) } }
|
13
|
+
threads << Thread.new { loop { @sin.puts gets } }
|
14
|
+
threads.each(&:join)
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
17
|
+
def process(line)
|
18
|
+
result = @extensions.process(line)
|
19
|
+
@sin.puts(result) unless result.nil?
|
20
|
+
end
|
21
|
+
end
|
22
22
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Minecraft
|
2
|
+
module Tools
|
3
|
+
def self.check_jarfile
|
4
|
+
download_minecraft unless File.exists? "minecraft_server.jar"
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.download_minecraft
|
8
|
+
url = get_minecraft_page
|
9
|
+
puts "[+] Downloading Minecraft server..."
|
10
|
+
`wget http://minecraft.net/#{url} -O minecraft_server.jar -q`
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get_minecraft_page
|
14
|
+
page = Net::HTTP.get("www.minecraft.net", "/download.jsp")
|
15
|
+
data = page.match /\"([0-9a-zA-Z_\/]*minecraft_server\.jar\?v=[0-9]+)/
|
16
|
+
data[1]
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.command(opts)
|
20
|
+
"java -Xmx#{opts[:max_memory] || "1024M"} -Xms#{opts[:min_memory] || "1024M"} -jar minecraft_server.jar nogui"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.toggle_mobs
|
24
|
+
content = File.read("server.properties")
|
25
|
+
state = content.match(/spawn\-monsters=(true|false)/)[1]
|
26
|
+
new_state = state == "true" ? "false" : "true"
|
27
|
+
content.gsub! "spawn-monsters=#{state}", "spawn-monsters=#{new_state}"
|
28
|
+
|
29
|
+
File.open("server.properties", "w") { |f| f.print content }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/minecraft/version.rb
CHANGED
data/minecraft.gemspec
CHANGED
@@ -11,9 +11,11 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.summary = "Minecraft server wrapper and deployment."
|
12
12
|
s.description = "A server console wrapper and other Minecraft deployment tools."
|
13
13
|
|
14
|
-
|
14
|
+
s.homepage = "http://github.com/basicxman/minecraft"
|
15
15
|
|
16
16
|
s.files = `git ls-files`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_dependency 'slop'
|
19
21
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: minecraft
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andrew Horsman
|
@@ -12,8 +12,18 @@ cert_chain: []
|
|
12
12
|
|
13
13
|
date: 2011-08-13 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: slop
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
17
27
|
description: A server console wrapper and other Minecraft deployment tools.
|
18
28
|
email:
|
19
29
|
- self@andrewhorsman.net
|
@@ -26,12 +36,14 @@ extra_rdoc_files: []
|
|
26
36
|
files:
|
27
37
|
- .gitignore
|
28
38
|
- Gemfile
|
39
|
+
- README.md
|
29
40
|
- Rakefile
|
30
41
|
- bin/minecraft
|
31
42
|
- lib/minecraft.rb
|
32
43
|
- lib/minecraft/data.rb
|
33
44
|
- lib/minecraft/extensions.rb
|
34
45
|
- lib/minecraft/server.rb
|
46
|
+
- lib/minecraft/tools.rb
|
35
47
|
- lib/minecraft/version.rb
|
36
48
|
- minecraft.gemspec
|
37
49
|
has_rdoc: true
|